Deno v2.3.0stable Released Apr 30, 2025
Impact Score: 5/10

Deno v2.3.0 โ€” Release Notes & Engineering Impact

Source available โ€” automated, not human-reviewed

Component: deno ยท Channel: stable. Automated analysis, not a compatibility certification. How this works.

Analysis updated: 2026-11-01.

Compatibility not verified โ€” check source notes
๐Ÿ“„ .MD
โšก Executive Summary (TL;DR)

Deno v2.3.0. Source highlight: **Due to an error during the release process, Deno v2.3.0 shows and incorrect version.**

Who Does This Impact? (Role-Based Analysis)

๐Ÿ’ป Software Engineers & Devs

Check the source notes against the package and APIs you use before upgrading.

๐Ÿ“Š Product & Engineering Leads

Use the documented changes to assess relevance to your product; release frequency alone is not a quality measure.

โš™๏ธ DevOps & Security

Verify the target version, runtime requirements and rollback procedure in the official documentation.

โœจ New Features & Capabilities (6)

  • feat(add/install): --npm and --jsr flags for deno add/install (#28666)
  • feat(cache): add `DENO_EMIT_CACHE_MODE` (#29025)
  • feat(check): detect tsconfig.json at workspace root (#29092)
  • feat(check): support erasableSyntaxOnly for type checking (#29097)
  • feat(clean): `deno clean --except <paths>`, remove all cache data except
  • feat(cli): `deno check` maps to `deno check .` (#28655)

โšก Performance & Enhancements (6)

  • perf(ext/node): improve node:http createServer performance (#29069)
  • perf(ext/node): lazily listen to the abort signal of request object (#29071)
  • perf(fs): don't canonicalize path when opening file if `--allow-all` is passed
  • perf(http): instantiate generic functions in `deno_http`, increase opt-level
  • perf(install): keep parsed npm package info in memory cache (#28636)
  • perf(install): only read initialized file if we care about the tags (#28242)

๐Ÿ”ง Bug Fixes & Patches (6)

  • fix(add): better help text for --dev arg (#28304)
  • fix(bench): lower bench time budget when `n` is specified (#28454)
  • fix(build): upgrade libffi to 4.0.0 (#28816)
  • fix(check): regression - implicit jsxImportSource was not resolving (#28228)
  • fix(check): support `types@` export conditions (#28450)
  • fix(check): support `typesVersions` in npm dependencies (#28468)
๐Ÿ“„ View Raw Release Notes (Original Developer Log)
### 2.3.0 / 2025.04.30 **Due to an error during the release process, Deno v2.3.0 shows and incorrect version.** **Please upgrade to Deno v2.3.1:** ``` deno upgrade 2.3.1 ``` --- - feat(add/install): --npm and --jsr flags for deno add/install (#28666) - feat(cache): add `DENO_EMIT_CACHE_MODE` (#29025) - feat(check): detect tsconfig.json at workspace root (#29092) - feat(check): support erasableSyntaxOnly for type checking (#29097) - feat(clean): `deno clean --except <paths>`, remove all cache data except what's needed to run `paths` (#28424) - feat(cli): `deno check` maps to `deno check .` (#28655) - feat(cli): support `--single-threaded` v8 flag (#29066) - feat(compile): ability to exclude embedded files (#28805) - feat(compile): support for ffi and node native addons (#28934) - feat(coverage): add coverage ignore comments (#26590) - feat(doc): add darkmode for HTML output (#28989) - feat(ext/fetch): support `localAddress` option in custom HTTP client (#28781) - feat(ext/http): Show that is also listening on localhost (#28171) - feat(ext/net): add signal option to `Deno.connect()` (#27113) - feat(fmt): add fmt options (#28946) - feat(fmt): support formatting of embedded css, html, and sql (#29014) - feat(fmt/lint): add `--permit-no-files` (#28753) - feat(info): include deno version (#29080) - feat(lockfile): default to lockfile v5 (#28950) - feat(lsp): jupyter cell continuity using classic scripts (#28769) - feat(otel): basic event recording (#28552) - feat(otel): span context propagators (#28460) - feat(runtime): add `Deno.build.standalone` for telling if running in self-contained executable (#28750) - feat(serve): env var DENO_SERVE_ADDRESS for configuring default listen address (#28877) - feat(test): create coverage reports when --coverage specified in deno test (#28260) - feat(test): support DENO_COVERAGE_DIR env var (#28291) - feat(unstable): lint plugins support field selectors (#28324) - feat(unstable): support using a local copy of npm packages (#28512) - feat(unstable/otel): add otel tracing to node:http.request (#28463) - feat(unstable/run): ability to lazily load statically analyzable dynamic imports (#28593) - feat(unstable/webgpu): add `deviceStartCapture` and `deviceStopCapture` (#28192) - feat: Allow access to NO_COLOR env var without --allow-env (#29090) - feat: Codegen feature flags (#28920) - feat: TypeScript 5.8 (#29041) - feat: add `--open` to `deno serve` to open server in browser (#25340) - feat: allow forcing in-memory SQLite dbs (#29026) - feat: code sign deno.exe (#28963) - feat: deno_core 0.344.0 (#29089) - feat: enable explicit resource management for JavaScript (#28119) - feat: support FORCE_COLOR (#28490) - feat: support linux vsock (#28725) - feat: upgrade deno_core and V8 (#28562) - feat: use new feature checker (#29091) - feat: v8js metrics (#28592) - fix(add): better help text for --dev arg (#28304) - fix(bench): lower bench time budget when `n` is specified (#28454) - fix(build): upgrade libffi to 4.0.0 (#28816) - fix(check): regression - implicit jsxImportSource was not resolving (#28228) - fix(check): support `types@` export conditions (#28450) - fix(check): support `typesVersions` in npm dependencies (#28468) - fix(check/npm): move not found errors inside npm packages to tsc diagnostics (#28337) - fix(ci): missing release symcache (#28774) - fix(cli): Display error on invalid OTEL_EXPORTER_OTLP_PROTOCOL value (#28796) - fix(cli): add `compilerOptions.lib` examples to config-file.v1.json (#28226) - fix(cli): warn when an otel env var has an invalid value (#28394) - fix(compile): do not panic including node_modules directory (#28782) - fix(compile): don't rebuild resource table on Windows (#29010) - fix(compile): downgrade editpe to 0.1.0 (#29011) - fix(compile): ensure atime/birthtime/mtime/ctime is set in vfs (#28731) - fix(compile): error when cannot extract binary section (#28986) - fix(compile): multi icon ordering on windows (#28771) - fix(compile): panic when compiled with --no-terminal flag (#28823) - fix(compile): pass default v8 args during compile (#29084) - fix(compile): read resource name in executable as uppercase on Windows (#29005) - fix(compile): revert multi-icon support in compile (#28997) - fix(compile): temporarily fallback to reading resource data from file on windows (#29024) - fix(compile): use a memory mapped file for fallback (#29039) - fix(config): allow specifying absolute path for patch and fix panic with exports in package.json (#28279) - fix(coverage): improve responsiveness of HTML reporter on small screens (#28993) - fix(deno_os): allow running WebWorker without snapshots (#28975) - fix(doc): do not stack overflow for namespace that exports self or ancestor (#28533) - fix(ext/canvas): handle integer overflow in `createImageBitmap` (#28764) - fix(ext/crypto): support cross-curve ECDSA sign and verify (#28574) - fix(ext/ffi): unexport brand from dts (#28503) - fix(ext/node): Fix `Writable.toWeb()` (#28914) - fix(ext/node): SQLite reset guards to prevent database locks (#28298) - fix(ext/node): `mkdir()` parse file mode (#28609) - fix(ext/node): add `assert` property to test context object (#28904) - fix(ext/node): add basic support of suite/describe in node:test (#28847) - fix(ext/node): add createReadStream & createWriteStream methods to the FileHandle class (#28700) - fix(ext/node): add support for --no- prefix (allowNegative option) in parseArgs() (#28811) - fix(ext/node): add util.getCallSites (#28546) - fix(ext/node): alias `shake-128` and `shake-256` hash algorithms (#28451) - fix(ext/node): better dns.lookup compatibility (#27936) - fix(ext/node): correct `STATUS_CODES` strings (#28489) - fix(ext/node): decipherIv() range error on invalid final block length (#28215) - fix(ext/node): descriptive sqlite error messages (#28272) - fix(ext/node): emit 'close' event on ServerResponse object when client aborted the request (#28601) - fix(ext/node): export test as property of default export (#28881) - fix(ext/node): fix deepStrictEqual(-0, 0) (#29060) - fix(ext/node): fix handling of abort signal in readFile (#29028) - fix(ext/node): handle "ttl" option in "dns" module (#27676) - fix(ext/node): honor flags with respect to reuseAddress when binding to a UDP socket (#28156) - fix(ext/node): implement DatabaseSync#loadExtension (#29050) - fix(ext/node): implement `Buffer.copyBytesFrom` (#28829) - fix(ext/node): implement `process.loadEnvFile` (#28824) - fix(ext/node): implement finished() for web streams (#28600) - fix(ext/node): node compatibility issue missing fd in createServer callback socket object (#27789) - fix(ext/node): propagate 'close' event of IncomingMessage to Socket (#28582) - fix(ext/node): querystring fallback to default decoder (#28838) - fix(ext/node): reset statement immidiately in run() (#28506) - fix(ext/node): restrict ATTACH DATABASE statement (#28513) - fix(ext/node): return `Buffer` from crypto cipher APIs (#28826) - fix(ext/node): sqlite error details (#28431) - fix(ext/node): sqlite handle empty blob being NULL (#28674) - fix(ext/node): support input option in spawnSync (#28792) - fix(ext/node): support the optional `previousValue` parameter for process.cpuUsage() (#28550) - fix(ext/node): throw NotCapable on process.env accessor (#28280) - fix(ext/node): update node version in process object (#27044) - fix(ext/node): upgrade `node:stream` (#28855) - fix(ext/node): use primordials in `ext/node/polyfills/_fs/_fs_lstat.ts` (#28644) - fix(ext/node): use primordials in `ext/node/polyfills/_fs/_fs_readv.ts` (#28645) - fix(ext/node): use primordials in `ext/node/polyfills/_fs/_fs_realpath.ts` (#28652) - fix(ext/node): use primordials in `ext/node/polyfills/internal/hide_stack_frames.ts` (#29067) - fix(ext/node): use primordials in `ext/node/polyfills/internal/http.ts` (#29082) - fix(ext/node): use primordials in `ext/node/polyfills/path/_posix.ts` (#28665) - fix(ext/node): use primordials in `ext/node/polyfills/path/_util.ts` (#28432) - fix(ext/node): use primordials in `ext/node/polyfills/path/_win32.ts` (#28668) - fix(ext/node): use primordials in `ext/node/polyfills/path/separator.ts` (#28669) - fix(ext/node): use primordials in ext/node/polyfills/_fs/_fs_opendir.ts (#29063) - fix(ext/node): verbose zlib error messages (#28831) - fix(ext/node): work correctly with wrapper Response objects, use correct `rawHeaders` structure (#29056) - fix(ext/os): explicitly enable `sysinfoapi` feature on `winapi` dependency (#28568) - fix(ext/webgpu): fix incorrect description of UnsafeWindowSurface (#28976) - fix(ext/webgpu): release current texture of surface after present (#28691) - fix(ext/websocket): cancel in-flight handshake on close() (#28598) - fix(fmt): support "--ext vto" and "--ext njk" (#28262) - fix(fmt): upgrade malva to 0.11.2 (#28871) - fix(fmt): use non-zero exit code when formatting fails (#28523) - fix(fmt/md): handle callout followed by non-text (#28333) - fix(http): generate `OtelInfo` only when otel metrics are enabled (#28286) - fix(install): don't error on unknown media types in install (#28234) - fix(install): error gracefully if user passes `--no-config` to `deno install <package>` (#28965) - fix(install): exclude npm workspace packages from graph roots in `install` (#28401) - fix(install): handle when bin entry info isn't present in package.json but is in registry (#28822) - fix(install): read extra package info from node_modules and fallback to registry (#28893) - fix(install): regression where Deno not used when postinstall script ran script without file extension (#28786) - fix(install): remove duplicate deprecated messages (#28738) - fix(install): support "file:" dependencies in local package.json (#28396) - fix(install/global): do not append `bin` to `DENO_INSTALL_ROOT` when ends with `bin` (#26446) - fix(lint): don't recurse infinitely for large ASTs (#28265) - fix(lint): give access to SourceCode in 'deno test' (#28278) - fix(lint): plugins ignored when no rust rule active (#28269) - fix(lint): resolve plugin paths from proper config specifier (#28752) - fix(lint): run with --no-prompt (#28305) - fix(lint): update deno_lint (#28271) - fix(lockfile): handling of peer deps when migrating to lockfile v5 (#28844) - fix(lockfile): omit tarball url from lockfile if it's the default (#28842) - fix(lockfile): re-fetch packuments if version not found, properly pass patch packages (#28964) - fix(lsp): add npm reqs to installer on resolution (#29061) - fix(lsp): auto-import from npm package exports with manual node_modules (#28414) - fix(lsp): close server on exit notification (#28232) - fix(lsp): create cacheable `ExportInfoMap` per language service (#28240) - fix(lsp): discard completions from non-exported npm files (#28962) - fix(lsp): do not show import-map-remap diagnostic when referrer and target are within the entry base (#28560) - fix(lsp): exclude unmapped npm cache paths from auto-imports (#28841) - fix(lsp): filter scheme in semantic tokens registration options (#28756) - fix(lsp): format vscode-userdata schemed documents (#28706) - fix(lsp): include prefix and suffix for rename edits (#28327) - fix(lsp): limit languages in semantic tokens provider (#28310) - fix(lsp): normalize all uris originating from client (#29019) - fix(lsp): prefer relative auto-import specifier against import map (#29098) - fix(lsp): preserve notification order after init flag is raised (#28733) - fix(lsp): remove redirect diagnostic (#28988) - fix(lsp): show a diagnostic for managed npm non-existent subpaths (#28981) - fix(lsp): silence errors from "codeAction/resolve" (#28400) - fix(lsp): url_to_uri() encoding on windows (#28737) - fix(lsp): use markup content variant for hover response (#28987) - fix(node): add reset method to event loop delay histogram (#28788) - fix(node): require esm should prefer `module.exports` export (#28376) - fix(node): support re-exported esm modules in cjs export analysis (#28379) - fix(npm): further reduce duplicates with optional peers (#28705) - fix(npm): improve optional peer dep handling (#28651) - fix(npm): only print deprecation warnings on first install (#28990) - fix(npm): panic when using tag with patched package (#28900) - fix(npm): reduce duplicate peers by preferring existing nv if nv anywhere in ancestor peers (#28663) - fix(npm): reduce occurrences of duplicate packages due to peer dep resolution (#28586) - fix(npm): resolve non-version matching peer deps and warn instead (#28616) - fix(npm): set up bin entries for package even if it's already downloaded (#28626) - fix(npm): support registries that have no shasums or integrity (#29093) - fix(npm): use Deno instead of Node in more cases for lifecycle scripts (#28715) - fix(otel): don't print otel warning when variable is not set (#28475) - fix(otel): don't throw when calling setActiveSpan at root (#28323) - fix(otel): only start deno_telemetry thread when needed (#29065) - fix(otel): recording metrics with more than 3 attributes (#28898) - fix(otel): replace `ArrayPrototypeSplit` with `StringPrototypeSplit` (#28538) - fix(otel): support attributes on links and events (#28584) - fix(otel/unstable): trace error cases of fetch (#28480) - fix(publish): support `virtual:` and `cloudflare:` schemes (#28922) - fix(repl): panic when user `delete globalThis.globalThis` (#28960) - fix(run): skip the cjs suggestion for mjs/mts modules (#26698) - fix(runtime): fix duplicate unstable ids for no-legacy-abort (#28740) - fix(task): document source of tasks, fix punctuation (#28413) - fix(task): filter empty elements in `xargs` (#28714) - fix(task): support backticks and basic tilde expansion (#28832) - fix(test): ignore write errors in reporter (#28722) - fix(types): add `Error.isError` type (#28679) - fix(unstable): Missing `PrivateIdentifier` type for `PropertyDefinition` key (#28358) - fix(unstable): add missing decorators nodes in lint ast (#28834) - fix(unstable): add parent types to lint ast nodes (#28802) - fix(unstable): lint `.parent` property not traversing over groups (#28803) - fix(unstable): lint plugin `!==` wrongly parsed as `!=` (#28403) - fix(unstable): lint plugin `:exit` called at wrong time (#28229) - fix(unstable): lint plugin `ObjectPattern` inconsistencies (#28359) - fix(unstable): lint plugin child combinator not working with groups (#28360) - fix(unstable): lint plugin fix `:has()`, `:is/where/matches` and `:not()` selectors (#28348) - fix(unstable): lint plugin regex attribute selector not working (#28340) - fix(unstable): lint plugin swapped exported and source for ExportAllDeclaration (#28357) - fix(unstable): wrong node with shorthand ObjectPattern + AssignPattern (#28402) - fix(unstable/lint): remove duplicated `Fix` vs `FixData` interface (#28344) - fix(webgpu): move `isFallbackAdapter` from `GPUAdapter` to `GPUAdapterInfo` (#28650) - fix: add "module.exports" export to ESM CJS wrapper module (#28373) - fix: add info suggestion for `unsafely-ignore-certificate-errors` and add `--help=full` (#28203) - fix: add stackTraceLimit to ErrorConstructor interface and removed ErrorWithStackTraceLimit interface (#28539) - fix: better cjs vs esm module detection and upgrade swc (#28810) - fix: better error message for bare run in file-like case (#29055) - fix: break unstable lockfile v5 to remove "has" from property names (#29095) - fix: correct reported typescript version (#29053) - fix: correctly style rust logs with colors (#29040) - fix: deno_ast 0.46 (#28331) - fix: don't show panic traces for non-official builds (#28931) - fix: dont strip n-api symbols in `denort` on mac (#28800) - fix: fix bugs with rendering of authority in serve urls (#29009) - fix: make --allow-env stronger that --deny-env (#29079) - fix: move otel logic into otel (#29073) - fix: only strip local and debug symbols from macOS binary (#28758) - fix: remove unnecessary whitespace in prompt function (#28868) - fix: remove warnings for bare node builtins (#29000) - fix: resolve shebang parse error in deno doc --test (#26079) - fix: respect lockfile for multiple available jsr versions (#28375) - fix: show referrer for Wasm module dependency errors (#28653) - fix: support vsock in DENO_SERVE_ADDRESS (#28941) - fix: unhandled rejection from quic (#28448) - fix: use full SHA for canary panic URLs (#28819) - fix: use proper version for v2.3.0-rc.0 (#28967) - fix: vsock nits (#28851) - perf(ext/node): improve node:http createServer performance (#29069) - perf(ext/node): lazily listen to the abort signal of request object (#29071) - perf(fs): don't canonicalize path when opening file if `--allow-all` is passed (#28716) - perf(http): instantiate generic functions in `deno_http`, increase opt-level for some more hyper deps (#28317) - perf(install): keep parsed npm package info in memory cache (#28636) - perf(install): only read initialized file if we care about the tags (#28242) - perf(lockfile): slightly terser lockfile formatting, remove old lockfile code (#28992) - perf(lsp): don't set resolver npm reqs if unchanged (#28302) - perf(lsp): lazily start the ts server (#28392) - perf(lsp): register semantic tokens provider upon opening enabled doc (#28384) - perf(npm): don't try to cache npm packages we've already cached (#28938) - perf(npm): load npm resolution snapshot directly from lockfile (#28647) - perf: remote symbolicate stack traces (#28470)