What’s New

Deno

Languages & Runtimes

A modern, secure runtime for JavaScript and TypeScript.

Latest v2.9.4 · by DenoWebsitedenoland/deno

Changelog

v2.9.4

Added
  • Enable --hmr flag for React Router in desktop
  • Add byteLength/length parameter to Buffer.indexOf/lastIndexOf/includes in ext/node
  • Support raw chacha20 cipher in crypto.createCipheriv
Changed
  • Upgrade V8 to 150.2.0
Fixed
  • Support --minimum-dependency-age flag in deno add/remove
  • Store Web Cache under origin data
  • Require FFI permission for native window handles in canvas
  • Reject symlinked node_modules cleanup roots
  • Bump libsui to 0.16.4 to fix Windows resource SizeOfImage
  • Allow dynamic imports during cached module evaluation in core
  • Bound error graph conversion in core
  • Enforce JSON requests in FsModuleLoader
  • Handle malformed error constructors in core
  • Stop rejected dynamic imports before loading in core
  • Make BrowserWindow bindings typeable in desktop
  • Preserve binding wrappers after lazy op upgrade in desktop
  • Strip runtime extension from app name in desktop
  • Cancel async sends after close in ext/napi
  • Scope callback info per invocation in ext/napi
  • Apply backpressure to http2 stream writes
2.9.4 / 2026.07.23
  • feat(desktop): enable --hmr for React Router (#35900)
  • feat(ext/node): add a byteLength/length parameter to Buffer.indexOf/lastIndexOf/includes (#35872)
  • feat(ext/node): support raw chacha20 cipher in crypto.createCipheriv (#36016)
  • feat: upgrade V8 to 150.2.0 (#36098)
  • fix(add): support --minimum-dependency-age flag in deno add/remove (#36099)
  • fix(cache): store Web Cache under origin data (#36145)
  • fix(canvas): require FFI permission for native window handles (#36080)
  • fix(clean): reject symlinked node_modules cleanup roots (#36190)
  • fix(compile): bump libsui to 0.16.4 to fix Windows resource SizeOfImage (#36242)
  • fix(core): allow dynamic imports during cached module evaluation (#36258)
  • fix(core): bound error graph conversion (#36070)
  • fix(core): enforce JSON requests in FsModuleLoader (#36137)
  • fix(core): handle malformed error constructors (#36071)
  • fix(core): stop rejected dynamic imports before loading (#36136)
  • fix(desktop): make BrowserWindow bindings typeable (#35907)
  • fix(desktop): preserve binding wrappers after lazy op upgrade (#36065)
  • fix(desktop): strip runtime extension from app name (#36060)
  • fix(ext/napi): cancel async sends after close (#36077)
  • fix(ext/napi): scope callback info per invocation (#36076)
  • fix(ext/node): apply backpressure to http2 stream writes (#36044)
  • fix(ext/node): don't leave 0-byte .heapsnapshot files near the heap limit (#36113)
  • fix(ext/node): implement worker_threads.locks via Web Locks (#35963)
  • fix(ext/node): node:sqlite backup() and deserialize() argument validation (#36127)
  • fix(ext/node): retry DNS query when its per-attempt timeout fires (#35955)
  • fix(ext/node): stop http2 file reads on stream close (#36061)
  • fix(ext/web): handle failed webtransport datagram setup (#36067)
  • fix(ext/webidl): implement async_sequence for ReadableStream.from (#35976)
  • fix(fetch): bound multipart part headers (#36096)
  • fix(fmt): keep embedded CSS custom property indentation stable (#35949)
  • fix(fs): require sys permission for umask (#36222)
  • fix(http): preserve trust proxy environment setting (#36073)
  • fix(init): validate temporary node_modules parent (#36142)
  • fix(jupyter): report codemirror_mode as a string (#36241)
  • fix(loader): reject non-JSON modules for JSON imports (#36135)
  • fix(napi): synchronize external string finalizers (#36078)
  • fix(net): clean up cancellation resources on early errors (#36229)
  • fix(net): limit WebTransport handshake frame buffering (#36068)
  • fix(node_http2): clean up destroyed sessions (#36043)
  • fix(node_resolver): handle CJS filesystem path edge cases (#36112)
  • fix(node_stream): handle Web Stream adapter errors (#36193)
  • fix(npm): avoid following lock poll symlinks (#36192)
  • fix(npm): download tarballs from the configured registry instead of registry.npmjs.org (#36187)
  • fix(npm): reject symlinked package materialization dirs (#36191)
  • fix(outdated): keep type-only dependencies in the lockfile (#36140)
  • fix(pack): support file paths longer than the tar name field (#36105)
  • fix(permissions): escape bidi controls in prompts (#36195)
  • fix(process): avoid collisions in Windows stdio pipe names (#36081)
  • fix(publish): constrain generated source rewrites (#36109)
  • fix(release): insert into versions.json in semver order (#36097)
  • fix(rt): isolate extracted native addons (#36144)
  • fix(runtime): bridge console to the inspector regardless of --inspect flag (#35795)
  • fix(runtime): give worker isolate threads the stack size we report (#36114)
  • fix(test): escape control characters in test names (#36196)
  • fix(tests): make npm test registry tolerate a bad advisories request body (#36138)
  • fix(tls): resolve sni requests concurrently (#36062)
  • fix(update): don't downgrade lockfile when npm cache is stale (#35904)
  • fix(webtransport): avoid url parse panic (#36066)
  • fix(webtransport): validate certificate dates (#36069)
  • fix(x): honor --minimum-dependency-age and deno.json minimumDependencyAge (#36025)
  • fix: discover config file for jsr: entrypoints (#35838)
  • fix: handle UTF-16 diagnostic columns (#36028)
  • perf(core): avoid duplicating lazy ESM snapshot sources (#36262)
  • perf(snapshot): mangle internal source identifiers (#36263)
  • perf: compress bundled AppImage runtimes (#36261)
  • perf: use FxHash for hot internal hash maps (#36100)

v2.9.3

Added
  • Add `deno add --no-save` and `--save-optional` options
  • Add `--min-dep-age` alias
  • Support aarch64-pc-windows-msvc target for deno compile
  • Add `http2MaxHeaderListSize` option to `Deno.createHttpClient`
Fixed
  • Preserve raw imports in watch mode during bundling
  • Don't hold SurfaceData mutable borrow over window resize in canvas
  • Reject out-of-range minimum dependency ages in config
  • Block user ext imports after resolution
  • Deactivate idle TTY write handles
  • Restrict extension loaders to internal modules
  • Root slow op string coercions
  • Don't let op_desktop_send_error_report target caller-supplied URLs
  • Don't panic recycling cancelled record on native response in ext/http
  • Don't free threadsafe function on abort while refs remain in ext/napi
  • Don't resurrect a released threadsafe function in acquire in ext/napi
  • Guard sqlite deserialize during callbacks in ext/node
  • Handle UTF-16 assert source positions in ext/node
  • Handle sqlite conversion failures in ext/node
Deprecated
  • Add deprecation warning for Duplex.toWeb({ type }) DEP0201
2.9.3 / 2026.07.15
  • feat(cli): deno add --no-save and --save-optional (#36039)
  • feat(cli): add --min-dep-age alias (#35914)
  • feat(compile): support aarch64-pc-windows-msvc target (#36004)
  • feat(ext/fetch): add http2MaxHeaderListSize option to Deno.createHttpClient (#33194)
  • fix(bundle): preserve raw imports in watch mode (#36040)
  • fix(canvas): don't hold SurfaceData mut borrow over window resize (#35993)
  • fix(config): reject out-of-range minimum dependency ages (#36051)
  • fix(core): block user ext imports after resolution (#36012)
  • fix(core): deactivate idle TTY write handles (#35886)
  • fix(core): restrict extension loaders to internal modules (#36013)
  • fix(core): root slow op string coercions (#36018)
  • fix(desktop): don't let op_desktop_send_error_report target caller-supplied URLs (#35940)
  • fix(ext/http): don't panic recycling cancelled record on native response (#36053)
  • fix(ext/napi): don't free threadsafe function on abort while refs remain (#36032)
  • fix(ext/napi): don't resurrect a released threadsafe function in acquire (#36054)
  • fix(ext/node): add deprecation warning for Duplex.toWeb({ type }) DEP0201 (#35972)
  • fix(ext/node): guard sqlite deserialize during callbacks (#36023)
  • fix(ext/node): handle UTF-16 assert source positions (#36029)
  • fix(ext/node): handle sqlite conversion failures (#36024)
  • fix(ext/node): respect base64 buffer ranges (#36030)
  • fix(ext/process): don't double-close extra stdio pipe handles on Windows (#36005)
  • fix(lsp): respect lint rule exclusion for no-slow-types diagnostics (#35924)
  • fix(node): stop active read on stream close to avoid leaking Socket/TCPWrap (#35898)
  • fix(node_http2): keep header validation enabled (#36042)
  • fix(node_http2): validate serialized headers (#36041)
  • fix(npm): don't fetch registry info for deprecated packages under --cached-only (#35903)
  • fix(npm): normalize path in BYONM read permission check (#35882)
  • fix(pm): hint about minimumDependencyAge when no version is old enough (#35890)
  • fix(release): only strip Mach-O signature for x86_64-apple-darwin (#35902)
  • fix(release): strip Mach-O signature before patchver on apple targets (#35897)
  • fix(runtime): guard usage op output buffers (#36020)
  • fix(serde_v8): handle deserialization exceptions (#36021)
  • fix(web): guard encodeInto fallback result buffer (#36019)
  • fix(web): support Event subclasses with readonly toStringTag (#35920)
  • fix(worker): remove imported ops during bootstrap (#36014)
  • fix: don't print duplicate parse diagnostics (#35933)
  • perf(ext/crypto): batch randomUUID generation (#35953)
  • perf(ext/fetch): remove quadratic line buffering in EventSource (#35881)
  • perf(ext/node): cache compiled glob matchers + bump bundled minimatch to 10.2.5 (#35873)
  • perf(ext/node): fast path fs cp (#35856)
  • perf(ext/node): right-size small socket reads instead of pinning the 64KB slab (#35779)
  • perf(ext/node): speed up sqlite.StatementSync.all() and run() (#35863)
  • perf(ext/web): avoid copy-back in op_base64_atob large path (#35862)

v2.9.2

Added
  • Autodetect React Router framework in desktop
  • Enable --hmr for Vite and Nuxt in desktop
  • Run HMR by framework dev server in desktop
  • Window opacity and transparency APIs in desktop
  • Wire --exclude-unused-npm through to compile in desktop
  • Implement v8.setHeapSnapshotNearHeapLimit in ext/node
  • Honor OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT in ext/telemetry
  • Start inspector server on SIGUSR1
  • Implement getTestContext() in node:test
  • Support wildcard patterns in minimumDependencyAge.exclude
Fixed
  • Don't interleave errors with Check lines in a workspace
  • Bump libsui to 0.16.1 to survive eu-strip in flatpak
  • Bump libsui to 0.16.3 to fix segfault under gVisor/Cloud Run
  • Don't drain microtasks in mod_evaluate_sync mid-evaluation
  • Count a branch-junction line as covered when either arm runs
  • Don't count V8 block-boundary gaps as branches
  • Don't let a trailing comment change a line's hit count
  • Disable config discovery and refresh the cached CLI version in deploy
  • Attribute bind calls to the registering window id in desktop
  • Honor desktop.backend from deno.json in desktop
2.9.2 / 2026.07.08
  • feat(desktop): autodetect React Router framework (#35557)
  • feat(desktop): enable --hmr for Vite and Nuxt (#35851)
  • feat(desktop): run HMR by framework dev server (#35722)
  • feat(desktop): window opacity and transparency APIs (#35646)
  • feat(desktop): wire --exclude-unused-npm through to compile (#35740)
  • feat(ext/node): implement v8.setHeapSnapshotNearHeapLimit (#35694)
  • feat(ext/telemetry): honor OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT (#35068)
  • feat(inspector): start inspector server on SIGUSR1 (#35738)
  • feat(node): implement getTestContext() in node:test (#35678)
  • feat: support wildcard patterns in minimumDependencyAge.exclude (#35746)
  • fix(check): don't interleave errors with "Check" lines in a workspace (#35687)
  • fix(compile): bump libsui to 0.16.1 to survive eu-strip in flatpak (#35699)
  • fix(compile): bump libsui to 0.16.3 to fix segfault under gVisor/Cloud Run (#35701)
  • fix(core): don't drain microtasks in mod_evaluate_sync mid-evaluation (#35707)
  • fix(coverage): count a branch-junction line as covered when either arm runs (#35858)
  • fix(coverage): don't count V8 block-boundary gaps as branches (#35767)
  • fix(coverage): don't let a trailing comment change a line's hit count (#35741)
  • fix(deploy): disable config discovery and refresh the cached CLI version (#35754)
  • fix(desktop): attribute bind calls to the registering window id (#35654)
  • fix(desktop): honor desktop.backend from deno.json (#35815
  • fix(desktop): pin @std/http in generated Vite SPA entrypoint + add hermetic compile test (#35676)
  • fix(desktop): rename launcher to so it self-loads the runtime (#35709)
  • fix(desktop): run framework build step before bundling output (#35603)
  • fix(desktop): surface compiled-app startup errors instead of exiting silently (#35567)
  • fix(dprint): exclude tools/lzld submodule (#35778)
  • fix(ext): throw DataCloneError when posting non-serializable values (#35604)
  • fix(ext/cache): implement Cache.keys() (#35455)
  • fix(ext/fetch): reject transport failures with Node's "fetch failed" shape (#35618)
  • fix(ext/http): error non-Uint8Array response streams (#35783)
  • fix(ext/http): honor explicit content-length header on HEAD responses (#35728)
  • fix(ext/http): point legacy abort warning at docs.deno.com/go link (#35713)
  • fix(ext/napi): add uv_cond_* polyfills for native addons (#35536)
  • fix(ext/net): abort pending Deno.connect during DNS resolution (#35729)
  • fix(ext/node): allow adopting inherited extra stdio TCP fds (#35805)
  • fix(ext/node): don't panic when main module path has invalid percent-encoding (#35534)
  • fix(ext/node): don't schedule a pause in inspector.waitForDebugger() (#35796)
  • fix(ext/node): flush StringDecoder in cipher final() for stream ciphers (#35800)
  • fix(ext/node): mark TLSWrap dead on teardown before tls_conn check (#35706)
  • fix(ext/node): report all active resources from process.getActiveResourcesInfo (#35532)
  • fix(ext/node): require --allow-net=unix for node:net unix sockets (#35835)
  • fix(ext/node): support fd 3 pipes in spawned Deno children (#34133)
  • fix(ext/signals): unregister handler when SignalStream is dropped (#35832)
  • fix(ext/web): resolve pending BYOB read when teeing a byte stream that closes (#35828)
  • fix(fmt): format Astro inline scripts as TypeScript (#35852)
  • fix(fs): support pre-1970 (negative) timestamps in FsStat (#35517)
  • fix(inspector): close WebSocket connections when the runtime is torn down (#35791)
  • fix(install): don't panic on jsr specifier with a tag like @latest (#35605)
  • fix(install): don't write through hardlinks when copying package files (#35735)
  • fix(install): make setup cache packages hash deterministic (#35825)
  • fix(install): resolve lifecycle script dependency bins against the hoisted layout (#35762)
  • fix(install): support uninstalling multiple global packages (#29352)
  • fix(lint): don't error on non-analyzable package exports like CSS files (#35732)
  • fix(lint): include config file in workspace member invalid version error (#35759)
  • fix(lsp): fix CPU busy loop by creating tokio runtime before JsRuntime in TSC thread (#35595)
  • fix(node/fs): implement followSymlinks option for fs.glob() (#35524)
  • fix(npm): don't re-fetch packuments on every run when registry has no time data (#35834)
  • fix(npm): don't retain full npm exports value + fix --watch memory leak (#35677)
  • fix(npm): widen node_modules lock staleness margin to avoid false preemption (#35806)
  • fix(permissions): split comma-separated paths in --ignore-read (#35661)
  • fix(test): run Node-API finalizers at test worker shutdown (#35695)
  • fix(watch): accept watch paths in fmt/lint/bench --watch (#35720)
  • fix(watch): execute preload modules under --watch (#35792)
  • fix(watch): terminate on Ctrl+C while blocked in synchronous code (#35826)
  • fix: enable rusqlite "fallible_uint" feature in workspace deps (#35681)
  • perf(config): literal-suffix reject and prune irrelevant globs per base (#35688)
  • perf(core): defer residual lazy source registration (#35731)
  • perf(ext/fetch): stream wasm bytes to the compiler from Rust (#35704)
  • perf(ext/node): remove per-chunk copying on TLSWrap data paths (#35705)
  • perf(ext/node): zero-copy async Buffer writes on the stream_wrap path (#35780)
  • perf(ext/web): identity pipeThrough writable bypass (#35799)
  • perf(ext/web): persistent pump for the generic pipeTo loop (#35813)
  • perf(ext/web): pump readableStreamCollectIntoUint8Array with a persistent read request (#35790)
  • perf(ext/web): reduce per-chunk allocations on stream read and tee paths (#35786)
  • perf(ext/web): reduce per-chunk overhead in Web Streams (#35773)
  • perf(ext/web): run synchronous pull completion without a microtask hop (#35788)
  • perf(ext/web): shared underlying-source algorithms, hoist resource-bridge read request (#35810)
  • perf(ext/web): sync fast path for ReadableStream async iterator next() (#35842)
  • perf(ext/web): synchronous transform fast path for TransformStream (#35844)
  • perf(npm): index packuments with SIMD JSON scanner (#35698)
  • perf(streams): offload resource-backed pipeTo to Rust via op_pipe (#35689)
  • perf(workers): optimize message passing (#35110)
  • perf(workers): return raw buffer from receive ops for no-transferable messages (#35756)
  • perf: use V8 native queueMicrotask instead of op (#35787)

v2.9.1

Added
  • Add --desktop flag to type-check for deno desktop
  • Register deep-link URL schemes at bundle time
Changed
  • Update laufey to 0.5.0
Fixed
  • Emit CSSStyleSheet for CSS raw imports
  • Skip checksums for cached 404 entries
  • Don't strip workspace-member includes from deploy config
  • Apply deferred fast-call op upgrade to the captured bootstrap clone
  • Prevent shared-buffer timer expiry race from losing timers
  • Default window title to app name instead of laufey_webview
  • Detect SvelteKit adapter-node and error on unsupported adapters
  • Discover deno.json in the project dir for deno desktop .
  • Don't delete user directories that collide with app name
  • Repair webview and raw backends on Windows
  • Resolve launcher symlink so .deb/.rpm apps find the backend
  • Set LAUFEY_RUNTIME_PATH in Linux app launcher
  • Show macOS tray icon in bundled .app launched via Finder
  • Use zstd for appimage squashfs
  • Strip blockquote > prefixes from JSDoc code blocks
  • Include path and reason when fetching a file:// URL fails
2.9.1 / 2026.07.01
  • feat(check): add --desktop flag to type-check for deno desktop (#35644)
  • feat(desktop): register deep-link URL schemes at bundle time (#35466)
  • feat: update laufey to 0.5.0 (#35663)
  • fix(bundle): emit CSSStyleSheet for CSS raw imports (#35598)
  • fix(cache): skip checksums for cached 404 entries (#35526)
  • fix(config): don't strip workspace-member includes from deploy config (#34788)
  • fix(core): apply deferred fast-call op upgrade to the captured bootstrap clone (#35630)
  • fix(core): prevent shared-buffer timer expiry race from losing timers (#35312)
  • fix(desktop): default window title to app name instead of laufey_webview (#35541)
  • fix(desktop): detect SvelteKit adapter-node and error on unsupported adapters (#35533)
  • fix(desktop): discover deno.json in the project dir for deno desktop . (#35660)
  • fix(desktop): don't delete user directories that collide with app name (#35513)
  • fix(desktop): repair webview and raw backends on Windows (laufey v0.4.1) (#35566)
  • fix(desktop): resolve launcher symlink so .deb/.rpm apps find the backend (#35632)
  • fix(desktop): set LAUFEY_RUNTIME_PATH in Linux app launcher (#35580)
  • fix(desktop): show macOS tray icon in bundled .app launched via Finder (#35626)
  • fix(desktop): use zstd for appimage squashfs (#35506)
  • fix(doc): strip blockquote > prefixes from JSDoc code blocks (#34866)
  • fix(ext/fetch): include path and reason when fetching a file:// URL fails (#35606)
  • fix(ext/node): check permissions when binding node:net unix sockets (#35564)
  • fix(ext/node): export report as named export from node:process (#35400)
  • fix(ext/node): mock.reset() should also reset MockTimers (#35588)
  • fix(ext/node): pass Deno subcommands through child_process spawn (#35599)
  • fix(ext/node): send TLS close_notify on JS stream-backed socket shutdown (#35582)
  • fix(ext/node_sqlite): keep attach limit capped under scoped permissions (#35232)
  • fix(ext/web): make URL and URLSearchParams non-serializable (#35423)
  • fix(fmt): stable formatting of multi-line html/svg tagged templates (#35540)
  • fix(inspector): support Chrome worker debugging (#35629)
  • fix(install): pin pre-release npm versions added via dist-tag (#35586)
  • fix(jupyter): register stdin peer only after ZMTP handshake completes (#35585)
  • fix(lib): add PerformanceObserver and PerformanceObserverEntryList types (#35640)
  • fix(libs/http): add missing write_flushed in poll_start_fixed_response_with (#35649)
  • fix(lsp): watch .wasm files for changes (#35560)
  • fix(node): load graph-backed TypeScript modules synchronously (#35527)
  • fix(npm): decode percent-encoded subpath of npm specifiers (#35505)
  • fix(npm): fall back for age-filtered npm dist-tags (#35561)
  • fix(npm): normalize bin names with path separators (#35555)
  • fix(npm): realpath npm bin main module (#35554)
  • fix(npm): show scoped-registry auth hint on tarball 404 (#35514)
  • fix(npm): use case-insensitive match for trust-policy-exclude (#35520)
  • fix(rt_desktop): reveal initial window on first paint (startup black flash) (#35620)
  • fix: correct property name for JSX new line configuration in schema file (#35565)
  • fix: resolve LAUFEY_VERSION from crate-local Cargo.lock during publish (#35507)
  • fix: show clear error when V8 fails to create worker threads (#32856)
  • perf(core/webidl): check next method outside of iterator loop (#35480)
  • perf(ext/fetch): fast-path Response reconstruction (#35495)
  • perf(ext/http): coalesce chunked response writes into a single write (#35523)

v2.9.0

Added
  • Add --declaration flag to bundle subcommand to generate rolled-up .d.ts files
  • Add deno link and deno unlink subcommands
  • Add deno watch subcommand
  • Add deno list subcommand to list declared dependencies
  • Add deno desktop subcommand
  • Auto-migrate pnpm-workspace.yaml on resolution failure
  • Provide a node on PATH when Node.js is not installed
  • Persist Web Storage/KV in a per-app data directory for compiled applications
  • Add configurable coverage thresholds
  • Add --compress flag for self-extracting app bundles in desktop
  • Add Linux .deb and .rpm installer output formats for desktop
  • Add Windows .msi installer output format for desktop
  • Autodetect Vite framework in desktop
  • Support remaining modern WebCrypto algorithms
  • Implement Happy Eyeballs for Deno.connect and Deno.connectTls
  • Implement node:test mock.module
  • Implement node:test mock.timers
  • Implement Web Locks API
  • Add sortNamedImports and sortNamedExports options to formatter
  • Infer formatter config from .editorconfig
  • Allow disabling serve compression
  • Create node_modules for workspace members
  • Seed deno.lock from bun.lock, package-lock.json, pnpm-lock.yaml, and yarn.lock
  • Warn on package.json engines mismatch
  • Auto-resolve git merge conflicts in deno.lock
  • Add inferred type request to LSP
  • Implement Node-API version 10
  • Install JSR dependencies into node_modules via npm-compat registry
  • Add publishing-trust ranking and no-downgrade trust policy for npm
  • Add request_builder_hook for fetch token and cdn-loop headers
  • Add --if-present flag to deno task
  • Add --jobs/--concurrency flag to deno task
  • Add input-based caching with files/output/env for tasks
  • Set npm_execpath, npm_node_execpath and npm_command for package.json scripts
  • Add --changed and --related flags to deno test
  • Add --shard flag to split a test run across machines
  • Add Deno.test.each for parameterized tests
  • Add retry and repeats options to Deno.test
  • Add built-in snapshot testing via t.assertSnapshot
  • Show sub-millisecond test durations
  • Support CSS module imports with { type: "css" }
  • Add deno remove --global as alias for deno uninstall --global
  • Add preferPackageJson deno.json setting
  • Stabilize --unsafe-proto flag
  • Enable default minimum dependency age
  • Stabilize links field in deno.json
  • Stabilize bare node built-in resolution
  • Support ignore option in Deno.watchFs
  • Support navigator.userAgentData
Changed
  • Use lax-css for CSS, SCSS, and Less formatting
  • Use lax-markup for HTML, XML, SVG, and components formatting
  • Use lax-sql for SQL formatting
  • Default UI backend to webview in desktop
  • Disable Deno.serve automatic compression by default
  • Bump reported process.version to v26.3.0
Fixed
  • Treat npm .d.ts as CommonJS based on package.json
  • Always register isolate to prevent silent foreground task drop
  • Handle async op promise id wraparound
  • Make uv_compat ready queues thread-safe
  • Preserve custom .stack getters in error/test formatter
  • Unwrap global exports in Wasm ESM integration
  • Don't panic in coverage summary reporter without a common root
  • Merge coverage for modules loaded with different hash/search params
  • Use JSR latest for deploy CLI
  • Add Wayland support for CEF and webview backends in desktop
  • Add Bluetooth usage descriptions to macOS Info.plist
  • Add macOS desktop Info.plist keys
  • Correct libdenort unpack path with non-executable extension
  • Hide bundled libc++ symbols so the desktop runtime can be dlopen'd on Linux
  • Use native Wayland instead of XWayland on Wayland systems
  • Allow deriving AES-OCB keys
  • Clamp X448 scalar per RFC 7748
  • Pad JWK to multiple of 8 bytes for AES-KW wrap
  • Keep content-encoding and content-length on decompressed responses
  • Require --allow-net for Unix proxy in createHttpClient
  • Truncate should not follow a terminal symlink
  • Apply automatic compression for zero-arg serve handlers
  • Close active WebSockets on Deno.serve shutdown
  • Validate remote KV URL when opening the connection
2.9.0 / 2026.06.25

Read more: http://deno.com/blog/v2.9

  • feat(bundle): add --declaration flag to generate rolled-up .d.ts files (#33838)
  • feat(cli): add deno link and deno unlink subcommands (#34359)
  • feat(cli): add deno watch subcommand (#35301)
  • feat(cli): add deno list subcommand to list declared dependencies (#34972)
  • feat(cli): auto-migrate pnpm-workspace.yaml on resolution failure (#34993)
  • feat(cli): provide a node on PATH when Node.js is not installed (#34969)
  • feat(compile): persist Web Storage/KV in a per-app data directory (#34618)
  • feat(coverage): add configurable coverage thresholds (#35056)
  • feat(desktop): --compress for self-extracting app bundles (#35420)
  • feat(desktop): add Linux .deb and .rpm installer output formats (#35296)
  • feat(desktop): add Windows .msi installer output format (#35378)
  • feat(desktop): autodetect Vite framework (#35470)
  • feat(desktop): default UI backend to webview (#35442)
  • feat(ext/crypto): support remaining modern WebCrypto algorithms (#35223)
  • feat(ext/http): deprecation warning for legacy request abort (#34397)
  • feat(ext/net): implement Happy Eyeballs for Deno.connect and Deno.connectTls (#31726)
  • feat(ext/node): implement node:test mock.module (#35329)
  • feat(ext/node): implement node:test mock.timers (#33946)
  • feat(ext/web): web locks api (#31166)
  • feat(fmt): add sortNamedImports and sortNamedExports options (#33313)
  • feat(fmt): infer config from .editorconfig (#34071)
  • feat(fmt): use lax-css for CSS, SCSS, and Less (#35160)
  • feat(fmt): use lax-markup for HTML, XML, SVG, and components (#35174)
  • feat(fmt): use lax-sql for SQL formatting (#35161)
  • feat(http): allow disabling serve compression (#35253)
  • feat(http): disable Deno.serve automatic compression by default (#35486)
  • feat(install): create node_modules for workspace members (#34970)
  • feat(install): seed deno.lock from bun.lock (#35394)
  • feat(install): seed deno.lock from package-lock.json (#35330)
  • feat(install): seed deno.lock from pnpm-lock.yaml (#35346)
  • feat(install): seed deno.lock from yarn.lock (#35350)
  • feat(install): warn on package.json engines mismatch (#34225)
  • feat(lockfile): auto-resolve git merge conflicts in deno.lock (#34726)
  • feat(lsp): add inferred type request (#35099)
  • feat(napi): implement Node-API version 10 (#35270)
  • feat(node): bump reported process.version to v26.3.0 (#34747)
  • feat(npm): install jsr deps into node_modules via npm-compat registry (#35029)
  • feat(npm): publishing-trust ranking and no-downgrade trust policy (#34927)
  • feat(runtime): add request_builder_hook for fetch token and cdn-loop headers (#35088)
  • feat(task): add --if-present flag to deno task (#35315)
  • feat(task): add --jobs/--concurrency flag to deno task (#35318)
  • feat(task): input-based caching with files/output/env (#34509)
  • feat(task): set npm_execpath, npm_node_execpath and npm_command for package.json scripts (#35317)
  • feat(test): add --changed and --related flags to deno test (#35199)
  • feat(test): add --shard flag to split a test run across machines (#35057)
  • feat(test): add Deno.test.each for parameterized tests (#34938)
  • feat(test): add retry and repeats options to Deno.test (#35053)
  • feat(test): built-in snapshot testing via t.assertSnapshot (#35139)
  • feat(test): show sub-millisecond test durations (#35200)
  • feat(unstable): CSS module imports (with { type: "css" }) (#35093)
  • feat: deno desktop subcommand (#33441)
  • feat: deno remove --global as alias for deno uninstall --global (#35327)
  • feat: add "preferPackageJson" deno.json setting (#35392)
  • feat: add stable --unsafe-proto flag (#34738)
  • feat: enable default minimum dependency age (#35458)
  • feat: stabilize "links" field in deno.json (#34996)
  • feat: stabilize bare node built-in resolution (#33316)
  • feat: support ignore option in Deno.watchFs (#31582)
  • feat: support navigator.userAgentData (#34743)
  • fix(check): treat npm .d.ts as CJS based on package.json (#35166)
  • fix(core): always register isolate to prevent silent foreground task drop (#35408)
  • fix(core): don't cache WebIDL sequence keys in thread-local v8::Eternal (#35462)
  • fix(core): handle async op promise id wraparound (#35126)
  • fix(core): make uv_compat ready queues thread-safe (#35175)
  • fix(core): preserve custom .stack getters in error/test formatter (#35246)
  • fix(core): unwrap global exports in Wasm ESM integration (#34912)
  • fix(coverage): don't panic in summary reporter without a common root (#35211)
  • fix(coverage): merge coverage for modules loaded with different hash/search params (#35354)
  • fix(deploy): use JSR latest for deploy CLI (#35493)
  • fix(desktop): Wayland support for CEF and webview backends (#35425)
  • fix(desktop): add Bluetooth usage descriptions to macOS Info.plist (#35472)
  • fix(desktop): add macOS desktop Info.plist keys (#35484)
  • fix(desktop): correct libdenort unpack path with non-executable extension (#35267)
  • fix(desktop): hide bundled libc++ symbols so the desktop runtime can be dlopen'd on Linux (#35424)
  • fix(desktop): use native Wayland instead of XWayland on Wayland systems (#35485)
  • fix(ext/crypto): allow deriving AES-OCB keys (#35426)
  • fix(ext/crypto): clamp X448 scalar per RFC 7748 (#35157)
  • fix(ext/crypto): pad JWK to multiple of 8 bytes for AES-KW wrap (#35475)
  • fix(ext/fetch): keep content-encoding and content-length on decompressed responses (#35124)
  • fix(ext/fetch): require --allow-net for Unix proxy in createHttpClient (#35231)
  • fix(ext/fs): truncate should not follow a terminal symlink (#35239)
  • fix(ext/http): apply automatic compression for zero-arg serve handlers (#35490)
  • fix(ext/http): close active WebSockets on Deno.serve shutdown (#35105)
  • fix(ext/kv): validate remote KV URL when opening the connection (#35106)
  • fix(ext/napi): restore Explicit microtask policy in napi_resolve_deferred (#35212)
  • fix(ext/net): cancel in-flight reads when closing TCP/Unix/Vsock streams (#35294)
  • fix(ext/net): set transport on address for TlsListener (#35258)
  • fix(ext/node): allow registerHooks with no resolve or load hook (#35235)
  • fix(ext/node): avoid panic deserializing empty buffers over child_process IPC (#35340)
  • fix(ext/node): avoid panic when vm.SourceTextModule uses import.meta (#35375)
  • fix(ext/node): check --allow-net for proxied request target in node:http(s) (#35241)
  • fix(ext/node): don't apply requestTimeout to active streaming responses (#35291)
  • fix(ext/node): fail node:test on unhandled rejection and enforce timeout (#35297)
  • fix(ext/node): fix node:test hook ordering and error handling (#35393)
  • fix(ext/node): forward permissions when spawning deno with subcommand args (#35443)
  • fix(ext/node): implement process.resourceUsage() (#35468)
  • fix(ext/node): implement t.assert.fileSnapshot for node:test (#35478)
  • fix(ext/node): implement test.TestContext.runOnly (#35158)
  • fix(ext/node): implement worker_threads.isInternalThread (#35234)
  • fix(ext/node): import attributes and custom module types in registerHooks ESM hooks (#35028)
  • fix(ext/node): initialize named stdio exports lazily (#35428)
  • fix(ext/node): keep dns.lookup permission token internal (#35224)
  • fix(ext/node): make registerHooks resolve hook work for nested imports (#35169)
  • fix(ext/node): preserve AsyncLocalStorage context across node:net callbacks (#35237)
  • fix(ext/node): restore Node binding signature for zlib write/writeSync (#35238)
  • fix(ext/node): single source of truth for emulated Node version (#35273)
  • fix(ext/node): stop coloring non-TTY streams in util.styleText (#35236)
  • fix(ext/node): support AbortSignal.timeout in node:test mock.timers (#35474)
  • fix(ext/node): support HTTP/2 on the DENO_SERVE_ADDRESS override listener (#35089)
  • fix(ext/node): trace v8 serializer delegate (#35132)
  • fix(ext/signals): build windows-sys only on Windows (#35283)
  • fix(install): remove stale root node_modules symlink on deno remove (#35137)
  • fix(install): resolve package.json dependencies in global install (#35135)
  • fix(install): seed pnpm workspace members and catalog deps (#35376)
  • fix(jupyter): report cell errors instead of failing silently (#35328)
  • fix(lsp): honor --env-file from deno.json test task in test runner (#34905)
  • fix(lsp): include tsconfig roots in script names (#34136)
  • fix(lsp): make requests work for files opened from node_modules (#35176)
  • fix(lsp): report TS2307 for unresolved imports in .d.ts entrypoints (#35469)
  • fix(node): expose lazy console stdio streams (console._stdout/_stderr) (#35488)
  • fix(node): propagate source thread id to process workerMessage event (#35374)
  • fix(node/test): route nested top-level test() to a subtest (#35406)
  • fix(npm): avoid spurious npm re-resolution that fails under --cached-only (#35051)
  • fix(npm): don't apply import map to npm bin main module (#35097)
  • fix(npm): make peer dependency warning actionable and show importers (#35242)
  • fix(npm): slim cached full packument when minimumDependencyAge is set (#35285)
  • fix(npm): support catalog: protocol in deno.json imports (#35168)
  • fix(npm): symlink workspace npm members into root node_modules by name (#35383)
  • fix(pack): include assets matched by publish.include in the tarball (#35331)
  • fix(pack): surface slow type diagnostics (#35379)
  • fix(permissions): don't require --allow-run for process.kill on self (#34382)
  • fix(permissions): require --allow-net for Unix domain socket ops (#34395)
  • fix(permissions): treat Windows \\?\ verbatim paths as equivalent (#35096)
  • fix(publish): continue publishing workspace after a package fails (#35133)
  • fix(publish): skip already-published versions before type checking (#35134)
  • fix(repl): highlight regex literals correctly (#35103)
  • fix(resolver): better hint when importing a linked package by the wrong name (#35319)
  • fix(resolver): resolve linked packages by bare specifier (#35228)
  • fix(runtime): capture blob worker roots before revocation (#35128)
  • fix(runtime): don't silently lose Deno.watchFs events (#35122)
  • fix(runtime): make Deno.test.* sub-methods no-op under deno run (#35344)
  • fix(runtime): suggest --unstable-unsafe-proto after proto access (#35192)
  • fix(serve): exit cleanly on SIGTERM/SIGINT in deno serve (#32862)
  • fix(serve): shut down old workers on watcher restart (#35136)
  • fix(serve): update request_signal_streaming spec for legacy abort warning (#35193)
  • fix(task): set npm lifecycle env vars when running package.json scripts (#35252)
  • fix(test): ignorelist leaks from sanitizer-ignoring tests (#35005)
  • fix(test): skip invalid doctest import bindings (#35382)
  • fix(test/node): mark test-worker-fshandles-open-close-on-termination as flaky (#35387)
  • fix(tests): skip npm/playwright_compat on windows-aarch64 (#35358)
  • fix(update): refetch npm metadata so stale cache doesn't hide newer versions (#35380)
  • fix(upgrade): stream zstd delta patch to avoid 2GiB OOM (#35284)
  • fix: Headers inspect for duplicate Set-Cookie values (#35461)
  • fix: accept U+30FB KATAKANA MIDDLE DOT in identifiers (#35147)
  • fix: cache 404 responses for remote modules (#35138)
  • perf(core): reduce snapshotted cppgc op member templates (#35298)
  • perf(core): skip source ASCII checks in release runtime setup (#35186)
  • perf(ext/crypto): port WebCrypto from JS to Rust (#34966)
  • perf(ext/web): port console/inspect to Rust (cppgc object wrap) (#35087)
  • perf(macos): enable chained fixups to cut pre-main startup (~0.8ms) (#35409)
  • perf(runtime): lazy-load node:buffer and node:timers globals (#35373)
  • perf(snapshot): guard against lazy modules leaking into eager snapshot (#35332)
  • perf(snapshot): minify snapshot sources (#35183)
  • perf(workers): incremental message-passing cleanups (#35108)
  • perf: V8 code cache for residual lazy-loaded ESM modules (#35338)
  • perf: gate eager node bootstrap to node workers (#35337)
  • perf: lazy-load OSX frameworks with lzld (#35341)
  • perf: startup profiling instrumentation + clap fast-path (#35263)
  • perf: startup time (22ms -> 15ms) (#34450)

v2.8.3

Added
  • Suggest DENO_TLS_CA_STORE when encountering untrusted TLS certificates
  • Support --env-file in dependency and registry subcommands
  • Support watch mode in deno compile
  • Support globs in links configuration
  • Implement SubtleCrypto.supports() static method
  • Support ML-DSA JWK import/export
  • Support priority in RequestInit for fetch
  • Auto-instrument node:http2 with OpenTelemetry
  • Notify control socket when node:http server starts serving
  • Honor OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT in telemetry
  • Honor OTEL_SPAN_EVENT_COUNT_LIMIT in telemetry
  • Support OTEL_TRACES_SAMPLER in telemetry
  • Add JSON trailing comma config to formatter
  • Add localPath to npm packages in deno info --json
  • Support --minimum-dependency-age flag in deno info
  • Add Debug code lens for test steps in LSP
  • Add Deno.test ignore and only code actions in LSP
  • Add deno x --ignore-scripts flag
  • Add bump-version -c to handle deno.json and package.json in same directory
Fixed
  • Accept npm version ranges on the command line in deno add
2.8.3 / 2026.06.11
  • feat(cli): suggest DENO_TLS_CA_STORE on untrusted TLS certificate (#34756)
  • feat(cli): support --env-file in dependency and registry subcommands (#34843)
  • feat(compile): support watch mode (#34860)
  • feat(config): support globs in links (#34849)
  • feat(ext/crypto): implement SubtleCrypto.supports() static method (#34903)
  • feat(ext/crypto): support ML-DSA JWK import/export (#34914)
  • feat(ext/fetch): support priority in RequestInit (#34716)
  • feat(ext/node): auto-instrument node:http2 with OpenTelemetry (#34510)
  • feat(ext/node): notify control socket when node:http server starts serving (#34949)
  • feat(ext/telemetry): honor OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT (#34787)
  • feat(ext/telemetry): honor OTEL_SPAN_EVENT_COUNT_LIMIT (#34795)
  • feat(ext/telemetry): support OTEL_TRACES_SAMPLER (#34764)
  • feat(fmt): add JSON trailing comma config (#33383)
  • feat(info): add localPath to npm packages in deno info --json (#34806)
  • feat(info): support --minimum-dependency-age flag (#34762)
  • feat(lsp): add "Debug" code lens for test steps (#34742)
  • feat(lsp): add Deno.test ignore and only code actions (#34861)
  • feat(lsp): diagnose import map files (#34864)
  • feat(lsp): provide hover info for import map resolutions (#34854)
  • feat(lsp): report deno doc --lint diagnostics (#34733)
  • feat(lsp): show no-slow-types diagnostics for JSR packages (#34740)
  • feat(outdated): warn about packages skipped due to registry errors (#34974)
  • feat(test): forward shebang permissions into deno test --doc (#35052)
  • feat(workspace): auto-discover external deno.json import maps (#34803)
  • feat(x): add deno x --ignore-scripts (#34952)
  • feat: bump-version -c to handle deno.json + package.json in same dir (#34770)
  • fix(add): accept npm version ranges on the command line (#34799)
  • fix(bundle): apply node-style CJS interop on all platforms (#34939)
  • fix(bundle): don't panic when esbuild binary is busy or unavailable (#34845)
  • fix(bundle): instantiate .wasm imports instead of emitting raw bytes (#34923)
  • fix(bundle): rename sourcemap for HTML entrypoints (#34901)
  • fix(bundle): respect --check and run the type checker (#33514)
  • fix(cache): retry locked cache database instead of deleting it (#34873)
  • fix(check): honor ts suppressions for unresolved imports (#34163)
  • fix(check): ignore doc comment dynamic imports (#34888)
  • fix(check): surface unresolved imports in .d.ts entrypoints (#34168)
  • fix(check): treat .d.ts in ESM-supporting npm packages as ESM (#34613)
  • fix(clean): keep cleaning when cache files are locked and report holders (#34946)
  • fix(clean): support deno clean --dry-run without --except (#34846)
  • fix(cli): accept allow-import for deno add (#35019)
  • fix(cli): check worker's own permissions for dynamic asset imports (#34707)
  • fix(cli): collect re-exported names for deno test --doc injection (#33511)
  • fix(cli): don't let --env-file set Deno's own runtime control vars (#35032)
  • fix(cli): don't suggest non-existent subcommand-flag combinations (#34810)
  • fix(cli): generate type-only doc-test imports under verbatimModuleSyntax (#33508)
  • fix(cli): include the typed name in unrecognized subcommand error (#34882)
  • fix(cli): strip trailing CR from args so CRLF shebangs work (#34968)
  • fix(compile): prune managed npm snapshot to graph-reachable packages (#34741)
  • fix(compile): resolve bare npm imports in --bundle worker sources (#34967)
  • fix(compile): run forked child's module instead of entrypoint (#34687)
  • fix(compile): support fs.fstatSync on vfs (#34892)
  • fix(console): %c colors with same red component as previous color (#34784)
  • fix(core): don't set ERR_MODULE_NOT_FOUND code on module linking errors (#34800)
  • fix(core): externalize lazy loaded sources (#34936)
  • fix(core): silence too_many_arguments on Callable trait method (#33475)
  • fix(core): use isolate_unchecked accessors for fast &v8::Isolate args (#33474)
  • fix(coverage): exclude linked/patched packages from coverage report (#34834)
  • fix(coverage): improve HTML report PageSpeed score (#34980)
  • fix(dotenv): include underscore in unbraced variable names (#34797)
  • fix(ext/crypto): ChaCha20-Poly1305 uses raw-secret format and iv param (#34915)
  • fix(ext/crypto): ML-KEM raw-seed, seed-form PKCS#8, and JWK (#34924)
  • fix(ext/crypto): align WebCrypto modern algorithms with the spec (#34941)
  • fix(ext/crypto): move getPublicKey to SubtleCrypto and validate usages (#34913)
  • fix(ext/crypto): support raw-public format for existing asymmetric keys (#34920)
  • fix(ext/crypto): use outputLength for SHAKE/cSHAKE/TurboSHAKE digests (#34911)
  • fix(ext/fetch): block requests to bad ports per Fetch Standard (#34863)
  • fix(ext/fetch): don't decompress empty body advertised as gzip/br (#34880)
  • fix(ext/fetch): only match multipart delimiter lines (#34587)
  • fix(ext/fetch): preserve empty multipart filenames (#35009)
  • fix(ext/ffi): accept Uint8Array in FFI buffer types (#34999)
  • fix(ext/fs): clarify that Deno.symlink() needs unscoped permissions (#34991)
  • fix(ext/fs): report broken symlink read as NotFound, not FilesystemLoop (#34833)
  • fix(ext/fs): stream Deno.readDir entries (#35130)
  • fix(ext/http): don't crash server on dead streaming-body resource (#34933)
  • fix(ext/http): include buffered request bytes in size hint (#34831)
  • fix(ext/http): join split request headers consistently (#35081)
  • fix(ext/http): prefer brotli for equal compression q-values (#35011)
  • fix(ext/http): surface errors thrown while streaming a Deno.serve body (#35104)
  • fix(ext/io): cancel pending readable stream reads (#34986)
  • fix(ext/kv): update access_token error message to new deno deploy console (#34918)
  • fix(ext/kv): validate batchSize and expireIn inputs (#34782)
  • fix(ext/net): handle missing port and path in listen and listenDatagram (#31681)
  • fix(ext/node): accept non-canonical RSA SPKI keys (#34134)
  • fix(ext/node): accept scoped IPv6 interface in dgram addMembership (#34899)
  • fix(ext/node): bump emulated Node version to v24.15.0 (#34804)
  • fix(ext/node): clear nonblocking fd stdio for child pipes (#34962)
  • fix(ext/node): count forked child process sockets (#34096)
  • fix(ext/node): don't cache a pointer to the zlib result buffer (#35043)
  • fix(ext/node): don't expose Module.register stub (#34894)
  • fix(ext/node): enforce maxBuffer in child_process.spawnSync (#34053)
  • fix(ext/node): export runMain from node:module (#35065)
  • fix(ext/node): fix asciiSlice & ucs2Slice & hexSlice being too slow (#34525)
  • fix(ext/node): fix broken encoding validation in indexOfBuffer (#33393)
  • fix(ext/node): guard TCPWrap.open against adopting tracked fds (#35045)
  • fix(ext/node): guard sqlite authorizer reentrant replacement (#34983)
  • fix(ext/node): handle EMFILE in child_process.spawn and compound shell commands (#33544)
  • fix(ext/node): implement mock.property() in node:test (#34959)
  • fix(ext/node): implement setKeepAlive on native TCPWrap (#34865)
  • fix(ext/node): implement url.fileURLToPathBuffer (#34883)
  • fix(ext/node): keep node:vm ContextifyContext wrapper alive with its context (#35090)
  • fix(ext/node): keep sqlite iterator callbacks alive (#34982)
  • fix(ext/node): keep v8.serialize output readable by Node.js (#35118)
  • fix(ext/node): keep worker alive while holding a refed MessagePort (#34877)
  • fix(ext/node): match Node's UTF-8 replacement for invalid bytes in Buffer decode (#34947)
  • fix(ext/node): match Node.js when dns.lookup hostname is falsy (#34887)
  • fix(ext/node): propagate nextLoad(newUrl) redirect to default loader (#35027)
  • fix(ext/node): read proxy env vars without --allow-env (#34807)
  • fix(ext/node): replay direct writes on stale http retry (#34992)
  • fix(ext/node): support ChildProcess.send with net.Server handles (#34948)
  • fix(ext/node): throw ERR_UNKNOWN_BUILTIN_MODULE for unknown node: builtins (#34766)
  • fix(ext/node): trace v8 deserializer delegate (#34981)
  • fix(ext/node): transfer TCP handle ownership in http2 consumeStream (#35047)
  • fix(ext/node): unblock static module loads when registerHooks is active (#35026)
  • fix(ext/node): wire ConnectionsList hooks so headersTimeout doesn't spuriously fire (#34356)
  • fix(ext/node_crypto): support PBES2/AES-CBC bags in tls.createSecureContext pfx (#34438)
  • fix(ext/os): don't expose invalid env var keys from Deno.env.toObject() (#34711)
  • fix(ext/process): run shebang-less scripts via /bin/sh on ENOEXEC (#34945)
  • fix(ext/process): treat Windows kill on exited process as NotFound (#34889)
  • fix(ext/web): URL.createObjectURL throws ERR_INVALID_ARG_TYPE for non-Blob args (#34878)
  • fix(ext/web): clearer error when a resource-backed stream is consumed after close (#34964)
  • fix(ext/web): don't trip debugger on handled stream writer-release rejection (#35100)
  • fix(ext/web): fire FileReader progress events as tasks (#34763)
  • fix(ext/web): friendlier URLPattern construction errors (#35102)
  • fix(ext/web): repair text_decoder_stream bench after BlobStoreTrait change (#35044)
  • fix(ext/web): show state and supportsBYOB in ReadableStream inspect (#34932)
  • fix(ext/web): support SharedArrayBuffer over BroadcastChannel (#34961)
  • fix(ext/web): writableStreamForRid accepts any ArrayBufferView/ArrayBuffer (#35020)
  • fix(ext/webgpu): bounds-check + view-aware setBindGroup Uint32Array fast path (#33980)
  • fix(ext/webgpu): update published crate repository url (#33916)
  • fix(ext/websocket): send URL userinfo as Basic auth header (#34708)
  • fix(fmt): align singleBodyPosition schema values (#34304)
  • fix(fmt): pass newlineKind option to JSON and Markdown formatters (#32579)
  • fix(http): handle raw h1 serve regressions (#35049)
  • fix(info): normalize trailing spaces in file path args on Windows (#35008)
  • fix(inspector): attribute idle event-loop wait to (idle) in CPU profiles (#35034)
  • fix(install): handle ETXTBSY when setting up node_modules (#33311)
  • fix(install): preserve workspace member resolution in global install (#34989)
  • fix(install): suppress peer dependency warnings for overridden packages (#34935)
  • fix(jupyter): handle completion cursor_pos as Unicode codepoints (#35098)
  • fix(jupyter): verify HMAC signatures on incoming kernel messages (#34825)
  • fix(lint): helpful error for Deno.lint.runPlugin outside deno test (#35018)
  • fix(lint): name the offending plugin in lint plugin load errors (#35067)
  • fix(lockfile): write through deno.lock symlink instead of replacing it (#34826)
  • fix(lsp): cache JSR type roots (#34886)
  • fix(lsp): evict on-disk documents from cache when deleted or changed (#34858)
  • fix(lsp): ignore relative import map remaps (#34856)
  • fix(lsp): prefer exact import map remaps (#34855)
  • fix(lsp): start rename after extract refactors (#34832)
  • fix(lsp): suggest import map aliases for remaps (#34857)
  • fix(lsp): update cache after workspace folder changes (#32823)
  • fix(net): preserve unix abstract socket paths (#34874)
  • fix(npm): resolve workspace members with prerelease versions (#34928)
  • fix(npm): run workspace package lifecycle scripts (#34615)
  • fix(npm): support workspace: dependencies with an alias in package.json (#34990)
  • fix(ops): build fast-call errors without re-entering JS (#35042)
  • fix(outdated): include catalog dependencies in deno outdated/update (#34977)
  • fix(outdated): send npm Accept header when fetching package metadata (#35012)
  • fix(permissions): allow non-recursive reads/writes on ancestors of deny (#34504)
  • fix(permissions): correct -A wording in raw-mode prompt message (#35070)
  • fix(permissions): don't hang prompt when stdin is in raw mode (#34457)
  • fix(permissions): run special-file guard for no-follow ops (#34393)
  • fix(publish): allow stable text imports (#34692)
  • fix(publish): catch banned triple slash directives anywhere in file during dry-run (#35010)
  • fix(publish): detect circular workspace dependencies before authorization (#34823)
  • fix(publish): ignore unused type parameter diagnostics from fast check (#35017)
  • fix(publish): improve error reporting for JSR manifest verification (#34690)
  • fix(publish): preserve default export of export * re-exported module (#34709)
  • fix(repl): print uncaught exceptions from timers at the prompt (#35002)
  • fix(repl): report descriptive syntax error instead of "Unexpected token '<'" (#35016)
  • fix(repl): show tab completions for navigator.gpu (#35006)
  • fix(repl): treat trailing . as incomplete input (#35101)
  • fix(resolver): collapse redundant slashes in file specifiers (#34713)
  • fix(resolver): don't treat a linked deno.json package as an npm link (#34841)
  • fix(resolver): prefer deno jsx options over tsconfig (#34141)
  • fix(run): error instead of panicking when watch flags are used with stdin (#34785)
  • fix(runtime): cancel prompt on esc (#35004)
  • fix(runtime): don't panic on missing SnapshotOptions when no snapshot (#34929)
  • fix(runtime): keep lazy Deno namespace APIs writable (#35050)
  • fix(runtime): serialize terminal permission prompts (#34821)
  • fix(runtime): show import location for unsupported import attributes (#34824)
  • fix(runtime): source map maybe cjs modules (#35013)
  • fix(serde_v8): add recursion depth limit to deserializer (#34984)
  • fix(serve): apply import map to main module in deno serve --watch (#34893)
  • fix(test): do not report "only" notice when a test fails on its own (#35063)
  • fix(test): handle escaped markdown code fences (#35125)
  • fix(test): skip markdown roots when building watcher graph (#35003)
  • fix(test): support blockquoted markdown doc tests (#34871)
  • fix(test): wait for worker termination before pending promise failures (#35127)
  • fix(update): show version requirement in interactive picker (#34671)
  • fix(watch): detect newly created files in fmt/lint/test/bench --watch (#34828)
  • fix(watch): keep watcher alive when script calls Deno.exit() (#35021)
  • fix(watch): respect --watch-exclude in deno serve (#34847)
  • fix: ignore 0 value for OTEL_METRIC_EXPORT_INTERVAL (#35054)
  • fix: resolve global install import maps from original cwd (#34165)
  • fix: support --inspect family in NODE_OPTIONS (#34717)
  • fix: throw ERR_DIR_CLOSED on use-after-close in Dir (#34910)
  • perf(config): match glob paths relative to base (#35039)
  • perf(core): reduce native callback snapshot overhead (#35121)
  • perf(ext/fs): use file identity instead of canonicalize in copyFile same-path guard (#34750)
  • perf(ext/http): add Deno-owned HTTP/1.1 serve path (#34446)
  • perf(ext/web): ASCII fast path for streaming TextDecoder.decode (#34299)
  • perf(ext/web): convert geometry.js from lazy_loaded_esm to lazy_loaded_js (#34997)
  • perf(lsp): cache lint and doc diagnostics per document module (#34875)
  • perf(lsp): cache shared workspace data across members (#32476)

v2.8.2

Added
  • Add ChaCha20-Poly1305, SHAKE, cSHAKE, TurboSHAKE, and SHA-3 HMAC cryptographic algorithms
  • Add ML-DSA (FIPS 204) post-quantum signatures
  • Implement ML-KEM (FIPS 203) post-quantum KEM
  • Add environment and global proxy support for node:http and node:https
  • Support DENO_SERVE_ADDRESS override in node:http servers
  • Add autocomplete for jsr:, npm:, and node: in deno.json(c) imports in LSP
  • Add --env-file flag support to deno task
  • Support exclusion groups in task name wildcards
  • Add --bundle flag to deno compile
Changed
  • Rewrite Jupyter kernel in JS and drop zeromq and runtimelib dependencies
  • Improve --bundle dependency resolution in deno compile
  • Scope --bundle npm embed to packages actually reached
  • Bump deno_task_shell to 0.33.0
  • Unfurl import specifiers in Wasm modules during publish
Fixed
  • Handle version tags like @latest in deno add for JSR packages
  • Replace panic with error when deno.json discovery fails
  • Skip decorator pass when module has no decorators in bundle
  • Use node-style CJS interop for the Deno platform in bundle
  • Skip WAL journal mode on WSL-1 in cache
  • Make node:stream/web types alias the globals
2.8.2 / 2026.06.03
  • feat(compile): improve --bundle dependency resolution and add --minify (#34536)
  • feat(compile): scope --bundle npm embed to packages actually reached (#34532)
  • feat(ext/crypto): add ChaCha20-Poly1305, SHAKE, cSHAKE, TurboSHAKE, SHA-3 HMAC (#34417)
  • feat(ext/crypto): add ML-DSA (FIPS 204) post-quantum signatures (#34448)
  • feat(ext/crypto): implement ML-KEM (FIPS 203) post-quantum KEM (#34447)
  • feat(ext/node): env/global proxy support for node:http and node:https (#34257)
  • feat(ext/node): support DENO_SERVE_ADDRESS override in node:http servers (#34662)
  • feat(jupyter): rewrite kernel in JS, drop zeromq/runtimelib deps (#34083)
  • feat(lsp): autocomplete jsr:/npm:/node: in deno.json(c) imports (#34724)
  • feat(publish): unfurl import specifiers in Wasm modules (#34549)
  • feat(task): support --env-file flag (#34508)
  • feat(task): support exclusion groups in task name wildcards (#34506)
  • feat(unstable): add --bundle flag to deno compile (#34527)
  • feat: bump deno_task_shell to 0.33.0 (#34642)
  • fix(add): handle version tags like @latest in deno add for JSR packages (#32859)
  • fix(add): replace panic with error when deno.json discovery fails (#34517)
  • fix(bundle): skip decorator pass when module has no decorators (#34489)
  • fix(bundle): use node-style CJS interop for the Deno platform (#34533)
  • fix(cache): skip WAL journal mode on WSL-1 (#34499)
  • fix(cache_dir): EnsureCachedStrategy must surface cached redirects (#34563)
  • fix(check): make node:stream/web types alias the globals (#34606)
  • fix(check): resolve npm packages without types when type checking (#34551)
  • fix(cli): suppress bug-report banner on broken pipe print panics (#34552)
  • fix(cli/task): run recursive workspace tasks in parallel (#34512)
  • fix(compile): allow process.chdir() into the VFS (#34610)
  • fix(compile): bundle workers separately under --bundle (#34531)
  • fix(compile): cover CJS-deep imports under --bundle (#34534)
  • fix(compile): create code cache when importing JSON or Wasm modules (#34614)
  • fix(compile): detect svelte-adapter-deno build output (#34535)
  • fix(compile): don't surface graph errors for --include files (#34568)
  • fix(compile): embed workspace package.json files in the VFS (#34530)
  • fix(compile): enable ANSI colors on Windows in compiled binaries (#34701)
  • fix(compile): handle CJS and native addons in --bundle (#34529)
  • fix(compile): respect npm registry sub-paths when flattening node_modules (#34575)
  • fix(compile): support workers loaded from blob URLs (#34574)
  • fix(compile): transpile TypeScript imported at runtime (#34616)
  • fix(config): hook up verbatimModuleSyntax for the emit pipeline (#34495)
  • fix(config): make config auto-discovery skip the same errors on every platform (#34558)
  • fix(config): surface invalid "exports" map in linked/workspace packages (#34473)
  • fix(config): warn instead of erroring when start dir is not a workspace member (#34458)
  • fix(config): warn instead of erroring when workspace member dir is missing (#34511)
  • fix(core): TLA hang on dyn import when async dep triggers lazy ESM load (#34469)
  • fix(core): preserve WebAssembly streaming callback across new contexts (#34679)
  • fix(crypto): correct X448 PKCS#8 handling (#34578)
  • fix(doc): don't lint private-type-ref for cross-package types (#34339)
  • fix(doc): handle non-ASCII doc lint diagnostics (#34626)
  • fix(ext/console): degrade gracefully when getKeys throws (#24980) (#34464)
  • fix(ext/fetch): implement missing Request properties (#34607)
  • fix(ext/fetch): preserve static request body length (#34546)
  • fix(ext/ffi): match V8 stack-arg layout in turbocall trampoline on Apple silicon (#34561)
  • fix(ext/fs): error when copyFile source and destination are the same file (#34718)
  • fix(ext/fs): retry without FILE_FLAG_BACKUP_SEMANTICS on Windows when driver rejects it (#34686)
  • fix(ext/fs): surface non-UTF-8 file names from read_dir (#34623)
  • fix(ext/http): reject Response-like return from respondWith (#34589)
  • fix(ext/http): reject Response-like return from serve handler (#34416)
  • fix(ext/io): cancel pending FileResource reads on close (#34544)
  • fix(ext/napi): clear error for Windows addons that link against node.exe (#34696)
  • fix(ext/napi): disallow JS execution during napi_new_instance (#34496)
  • fix(ext/napi): polyfill libuv thread + semaphore primitives (#34571)
  • fix(ext/napi): polyfill more libuv symbols from compat layer (#34488)
  • fix(ext/net): re-enable 0-RTT support in QUIC (#34520)
  • fix(ext/node): add module findPackageJSON export (#34597)
  • fix(ext/node): add node:test/reporters builtin (#34595)
  • fix(ext/node): add stripTypeScriptTypes export (#34594)
  • fix(ext/node): capture IPC handle eagerly to fix cluster send deadlock (#34661)
  • fix(ext/node): cover node:module SourceMap export (#34591)
  • fix(ext/node): disable repl preview when a custom eval is supplied (#34498)
  • fix(ext/node): drop bogus Buffer.prototype._isBuffer marker (#34502)
  • fix(ext/node): export syncBuiltinESMExports from node:module (#34593)
  • fix(ext/node): expose gc from v8 setFlagsFromString (#34604)
  • fix(ext/node): fix latin1Slice being too slow (#34503)
  • fix(ext/node): honor windowsHide in child_process spawn (#34627)
  • fix(ext/node): prevent buffer decode detach race (#34632)
  • fix(ext/node): re-export inner spec for module.exports = require(X).Y (#34363)
  • fix(ext/node): refuse sqlite close() while a user callback is running (#34515)
  • fix(ext/node): report real error code for failed dns.lookup (#34697)
  • fix(ext/node): resolve global cache packages when require referrer is outside DENODIR (#34497)
  • fix(ext/node): route node:fs.statfs through FileSystem trait (#34444)
  • fix(ext/node): support cyclic imports in vm.Module.prototype.link() (#34472)
  • fix(ext/node): support vm dynamic import callback (#34572)
  • fix(ext/node): tolerate unreadable cwd in require._nodeModulePaths (#34542)
  • fix(ext/node): vm dynamic import without callback throws ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING (#34427)
  • fix(ext/web): forward console.group label to inspector log (#34341)
  • fix(ext/web): honor PerformanceObserver buffered flag (#34748)
  • fix(ext/web): make MessageEvent.ports a frozen array (#34773)
  • fix(fmt): update markup_fmt to fix quadratic inline CSS formatting (#34663)
  • fix(install): allow "minimumDependencyAge" object without "age" (#34523)
  • fix(install): handle pre-existing node_modules symlink on Windows (#34659)
  • fix(install): rewrite relative imports/scopes in copied deno.json (#34562)
  • fix(install): run workspace member dependency lifecycle scripts with member INIT_CWD (#34700)
  • fix(install): vendor type-only imports during deno ci (#34459)
  • fix(jupyter): exit kernel process after sending shutdown reply (#34554)
  • fix(jupyter): keep kernel alive across transient peer disconnects (#34550)
  • fix(jupyter): make kernel ZMTP handshake compatible with libzmq (#34755)
  • fix(jupyter): send transient: {} in execute_result so nbclient doesn't crash (#34483)
  • fix(jupyter): use stable PATH entry for kernel binary path (#34492)
  • fix(lsp): avoid empty import specifier completions (#34647)
  • fix(lsp): complete npm package exports (#34675)
  • fix(lsp): complete string union literals containing dots (#34664)
  • fix(lsp): discover all tests when names are duplicated (#34624)
  • fix(lsp): handle empty jsx completion ranges (#34651)
  • fix(lsp): handle parser panics while parsing documents (#34640)
  • fix(lsp): honor moduleResolution: "bundler" for npm dir imports (#34643)
  • fix(lsp): include configured deps in auto-imports (#34650)
  • fix(lsp): limit node_modules auto-import aliasing (#34674)
  • fix(lsp): merge duplicate completion imports (#34658)
  • fix(lsp): preserve URL extensions in typeof import(...) hovers (#34565)
  • fix(lsp): recover from TSC isolate OOM instead of crashing the language server (#34693)
  • fix(lsp): release idle memory back to the OS (#34727)
  • fix(lsp): skip parent process check when PID isn't visible (#34744)
  • fix(lsp): spurious diagnostics in Jupyter notebook cells (#34734)
  • fix(lsp): support test steps from imported helpers (#34648)
  • fix(lsp): surface CSS imports as .js to TypeScript (#34419)
  • fix(lsp): surface module-level uncaught errors in test runs (#34641)
  • fix(lsp): use cached registry config when offline (#34723)
  • fix(lsp): use file uris for neovim virtual definitions (#34653)
  • fix(lsp): walk to enabled nested workspaces (#34654)
  • fix(napi): report a clear error for legacy V8/nan native addons (#34683)
  • fix(napi): support ZeroMQ libuv addon symbols (#34657)
  • fix(node): avoid spurious ERR_MULTIPLE_CALLBACK on process.stdout/stderr (#34728)
  • fix(node): classify required js files as commonjs by default (#34673)
  • fix(node): full re-export fallback for unresolvable member re-exports (#34689)
  • fix(node): resolve CJS requires with multi-level relative specifiers on Windows (#34655)
  • fix(node): support module-sync export condition (#34599)
  • fix(node/repl): gate preview through V8 inspector throwOnSideEffect (#34566)
  • fix(npm): apply scoped registry auth to same-origin tarballs (#34698)
  • fix(npm): clean node_modules after deno remove (#34110)
  • fix(npm): downgrade latest tag for release age (#34581)
  • fix(npm): execute native binaries from npm package bin entries (#34375)
  • fix(npm): hoist direct deps over higher transitive versions (#34470)
  • fix(npm): share copy-package variants via symlink for class identity (#34691)
  • fix(resolver): don't resolve linked packages via bare specifier (#34519)
  • fix(rt): support host-FS CJS files in the standalone runtime (#34560)
  • fix(runtime): better error message when Deno.consoleSize() has no tty (#34538)
  • fix(runtime): suggest --allow-scripts for bindings native addon error (#34666)
  • fix(runtime): suggest N-API alternatives for legacy V8/nan addons (#34695)
  • fix(runtime): suggest Worker/node:vm alternatives for npm:isolated-vm (#34702)
  • fix(runtime/ops): unwatch shared RecommendedWatcher on FsWatcher close (#34467)
  • fix(task): preserve trailing backslashes in task arguments (#34505)
  • fix(task): restore terminal mode after task exits on Windows (#34685)
  • fix(test): abort with a message when a test exits with sanitizeExit disabled (#34491)
  • fix(test): don't kill the deno process on top-level Deno.exit() (#34564)
  • fix(test): wait for inspector to disconnect before exiting (#34559)
  • fix(tsc): resolve Web globals to Deno's versions in npm packages (#34634)
  • fix(watch): register dynamic raw imports with file watcher (#34463)
  • fix(watch): restore original cwd between watcher restarts (#34465)
  • fix: absolute links should be processed using directory functions (#34218)
  • fix: link to docs in JSON import error message (#34611)
  • fix: load classic blob worker main script directly (#34592)
  • fix: opt-in mitigation for React RCE/DoS CVEs (#34676)
  • fix: reject empty package name in package.json dependencies (#34514)
  • fix: remove node_shim exec dependency (#34739)
  • fix: resolve local file when folder name matches import-mapped package (#32854)
  • fix: send BroadcastChannel messages before close (#34628)
  • perf(cli): drop unused deno_ast bundler feature (#34424)
  • perf(ext/fetch): cache lowercased header names per Headers instance (#33683)
  • perf(ext/node): bulk-build header array and trim header OWS in place (#34443)
  • perf(ext/node): cache member-export-props analysis (#34471)
  • perf(ext/node): gate node:http async resource entry (#34608)
  • perf(ext/node): optimize empty node:http response end (#34493)
  • perf(ext/node): optimize node:http header matching (#34484)
  • perf(ext/node): skip node:http perf timing without observers (#34409)
  • perf(ext/web): convert hot stream queues to O(1) Queue, cache _state reads (#34437)
  • perf(http): remove legacy hyper 0.14 from deno_http (#34557)
  • perf(node): lazy stdio + fix LazyEsmModuleLoader source consumption (#34440)
  • perf(node): lazy-load node:stream/web cluster out of the snapshot (#34548)
  • perf(node): skip require permission checks when read is fully granted (#34722)
  • perf(runtime): update notify watcher dependency (#34567)
  • perf(web): reduce Brotli CompressionStream binary size (#34432)
  • perf: enable safe ICF (identical code folding) when linking (#34478)
  • perf: replace ipnetwork with ipnet (#34580)

v2.8.1

Added
  • Support browser field map in package.json for bundle
  • Add missing node:util APIs getSystemErrorMap, transferableAbortSignal, and transferableAbortController
Changed
  • Reuse keep-alive timer in node:http server
Fixed
  • Read package.json sideEffects field in bundle
  • Provide clearer error when importing .node addon via ESM
  • Prevent panic when --config path cannot be converted to URL
  • Allow host objects to round-trip through core.deserialize
  • Keep lazy_loaded_esm sources across concurrent loads
  • Check resolved IPs against net deny list in fetch and websocket
  • Set TLSSocket.authorized to false when client presents no certificate
  • Accept array forms of cert/key/pfx in createSecureContext
  • Allow omitting arguments in base64Slice
  • Attach register as static on Module
  • Do not throw NotFound for fs.exists
  • Drop extra positional arguments in promisified fs.promises
  • Emit error event for fs.watch open failures
  • Enforce minimum Miller-Rabin rounds in checkPrime
  • Extract cert/key from pfx in tls SecureContext
  • Prevent panic on node:sqlite aggregate method
  • Require env permission for process.loadEnvFile
  • Reset req.reusedSocket on transparent retry
  • Support PKCS#12 MACs other than SHA-1
  • Tolerate non-AsyncWrap handles in _getNewAsyncId
  • Wake runtime after direct serve dispatch
  • Emit NodeWorker.attachedToWorker for late workers in inspector
  • Don't invoke Proxy traps in util.inspect
  • Lazy-loaded globals should shadow on inherited [[Set]]
  • Walk ancestor node_modules/.bin in BYONM mode for task
  • Preserve newlines after multi-line block comments in transpile
  • Restore brotli in CompressionFormat for dom/webworker libs
  • Use zstd-compress bsdiff delta patches in upgrade
  • Allow --inspect=localhost:0 to resolve hostnames
  • Fix panic in deno test --parallel
  • Support npm: specifiers in --preload and --import
Removed
  • Revert polyfill of module.enableCompileCache and companions
  • Remove automatic @deno/shim-deno injection in pack
2.8.1 / 2026.05.27
  • Revert "fix(ext/node): polyfill module.enableCompileCache and companions" (#34190) (#34348)
  • feat(bundle): support browser field map in package.json (#34407)
  • fix(bundle): read package.json sideEffects field (#34406)
  • fix(cli): clearer error when importing .node addon via ESM (#34361)
  • fix(config): don't panic when --config path can't be converted to URL (#34351)
  • fix(core): allow host objects to round-trip through core.deserialize (#34380)
  • fix(core): keep lazy_loaded_esm sources across concurrent loads (#34353)
  • fix(ext/fetch,ext/websocket): check resolved IPs against net deny list (#34236)
  • fix(ext/node): TLSSocket.authorized=false when client presents no cert (#34381)
  • fix(ext/node): accept array forms of cert/key/pfx in createSecureContext (#34379)
  • fix(ext/node): add missing node:util APIs getSystemErrorMap, transferableAbortSignal, transferableAbortController (#34372)
  • fix(ext/node): allow omitting arguments in base64Slice (#34318)
  • fix(ext/node): attach register as static on Module (#34305)
  • fix(ext/node): do not throw NotFound for fs.exists (#34244)
  • fix(ext/node): drop extra positional args in promisified fs.promises.* (#34347)
  • fix(ext/node): emit 'error' event for fs.watch open failures (#34398)
  • fix(ext/node): enforce minimum Miller-Rabin rounds in checkPrime (#34391)
  • fix(ext/node): extract cert/key from pfx in tls SecureContext (#34383)
  • fix(ext/node): prevent panic on node:sqlite aggregate method (#34385)
  • fix(ext/node): require env permission for process.loadEnvFile (#34350)
  • fix(ext/node): reset req.reusedSocket on transparent retry (#34376)
  • fix(ext/node): support PKCS#12 MACs other than SHA-1 (#34342)
  • fix(ext/node): tolerate non-AsyncWrap handles in _getNewAsyncId (#34413)
  • fix(http): wake runtime after direct serve dispatch (#34387)
  • fix(inspector): emit NodeWorker.attachedToWorker for late workers (#34377)
  • fix(node/util): don't invoke Proxy traps in util.inspect (#34373)
  • fix(pack): remove automatic @deno/shim-deno injection (#34411)
  • fix(runtime): lazy-loaded globals should shadow on inherited [[Set]] (#34405)
  • fix(task): walk ancestor node_modules/.bin in BYONM mode (#34364)
  • fix(transpile): preserve newlines after multi-line block comments (#34357)
  • fix(types): restore brotli in CompressionFormat for dom/webworker libs (#34349)
  • fix(upgrade): zstd-compress bsdiff delta patches (#34354)
  • fix: allow --inspect=localhost:0 to resolve hostnames (#34230)
  • fix: panic in deno test --parallel (#34378)
  • fix: support npm: specifiers in --preload and --import (#34346)
  • perf(ext/node): reuse keep-alive timer in node:http server (#34302)

v2.8.0

Added
  • Accept `deno audit fix` as alias for `deno audit --fix`
  • Add --watch flag to deno check
  • Add `deno bump-version` subcommand
  • Add `deno why` subcommand
  • Support workspaces in `deno bump-version`
  • Add progress bar for deno compile
  • Support module.registerHooks() in compiled binaries
  • Add `Deno.core.loadExtScript()` for lazy-loaded scripts
  • Add async module resolution support via ModuleResolveResponse
  • Support lazy_loaded_esm modules via import statements
  • Add synthetic_esm extension DSL and node:worker_threads canary
  • Emit Network.* inspector events for fetch()
  • Add ESM import() support for module.registerHooks()
  • Add createHistogram to node:perf_hooks
  • Implement node:wasi
  • Implement module.registerHooks() API for CommonJS
  • Implement node:module SourceMap API
  • Support NODE_EXTRA_CA_CERTS
  • Add gRPC protocol support for OTLP exporter
Changed
  • Default to npm registry for unprefixed packages in add/install
2.8.0 / 2026.05.22

Read more: http://deno.com/blog/v2.8

  • feat: accept deno audit fix as alias for deno audit --fix (#34273)
  • feat: add --watch flag to deno check (#34224)
  • feat: add deno bump-version subcommand (#30562)
  • feat: add deno why subcommand (#32908)
  • feat: support workspaces in deno bump-version (#33689)
  • feat(add/install): default to npm registry for unprefixed packages (#33246)
  • feat(compile): add progress bar for deno compile (#33874)
  • feat(compile): support module.registerHooks() in compiled binaries (#33853)
  • feat(core): add Deno.core.loadExtScript() for lazy-loaded scripts (#33739)
  • feat(core): add async module resolution support via ModuleResolveResponse (#32432)
  • feat(core): support lazy_loaded_esm modules via import statements (#33873)
  • feat(core): synthetic_esm extension DSL + node:worker_threads canary (#34038)
  • feat(ext/fetch): emit Network.* inspector events for fetch() (#34220)
  • feat(ext/node): ESM import() support for module.registerHooks() (#33763)
  • feat(ext/node): add createHistogram to node:perf_hooks (#34003)
  • feat(ext/node): buffer Network.* bodies for inspector body-fetch commands (#34201)
  • feat(ext/node): convert node:url/util/zlib to synthetic_esm (#34041)
  • feat(ext/node): emit Network.* inspector events for node:http (#34231)
  • feat(ext/node): expose inspector.isEnabled() via process.binding('inspector') (#34203)
  • feat(ext/node): implement Network CDP domain for inspector (#32707)
  • feat(ext/node): implement NodeRuntime.notifyWhenWaitingForDisconnect (#34204)
  • feat(ext/node): implement module.registerHooks() API for CommonJS (#33733)
  • feat(ext/node): implement node:module SourceMap API (#32890)
  • feat(ext/node): implement node:wasi (#34089)
  • feat(ext/node): implement postMessageToThread cross-thread messaging (#34015)
  • feat(ext/node): implement vm.SourceTextModule with microtaskMode afterEvaluate support (#33603)
  • feat(ext/node): make Network.* CDP events fire under plain --inspect (#34270)
  • feat(ext/node): restore module.registerHooks (#34081)
  • feat(ext/node): support KeyObject structured clone over MessagePort (#34229)
  • feat(ext/node): support NODE_EXTRA_CA_CERTS (#33148)
  • feat(ext/node): support sending dgram.Socket handles over IPC (#33863)
  • feat(ext/telemetry): add gRPC protocol support for OTLP exporter (#30365)
  • feat(ext/web): support structured clone for Blob and File (#33827)
  • feat(ext/websocket): emit Network.* inspector events for WebSocket (#34222)
  • feat(install): add --os and --arch flags for cross-platform npm installs (#32785)
  • feat(install): added --prod to skip dev deps and @types (#33248)
  • feat(install): default to npm for deno install -g unprefixed packages (#34290)
  • feat(npm): add catalog: protocol for centralized dependency versions in workspaces (#32947)
  • feat(npm): add hoisted node_modules linker mode (#32788)
  • feat(npmrc): support min-release-age (#33983)
  • feat(task): prefix output lines with task name when running in parallel (#33805)
  • feat(test): add timeout option to Deno.test() (#33815)
  • feat(types): add Math.sumPrecise and Intl.Locale.prototype.variants (#34287)
  • feat(unstable): Geometry Interfaces Module Level 1 (#27527)
  • feat(unstable): support TC39 import defer proposal (#32360)
  • feat(x): add --package/-p flag for specifying package separately from binary (#32855)
  • feat: OffscreenCanvas (#29357)
  • feat: add --package-json flag to deno add/install/remove/uninstall (#33199)
  • feat: add deno ci subcommand (#34235)
  • feat: add deno pack command to create npm tarballs (#32139)
  • feat: add deno transpile subcommand (#32691)
  • feat: disable "no-process-global", "no-node-globals" lint rules by default (#33247)
  • feat: disable ops and resources sanitizers by default in deno test (#33250)
  • feat: framework detection for deno compile (#33164)
  • feat: implement deno audit --fix (#32909)
  • feat: include node lib by default and use NodeJS.Timeout for timers (#33823)
  • feat: stabilize text imports (#34238)
  • feat: support Deno.upgradeWebSocket with node:http upgrade events (#33342)
  • feat: update TypeScript to 6.0.3 (#32944)
  • feat: use Node.js timers by default and remove global proxy (#33249)
  • feat: v8 14.9 (#34226)
  • fix(ci): disable test-child-process-send-returns-boolean.js on windows (#33883)
  • fix(cli): make deno why work with jsr deps (#34227)
  • fix(console): don't trigger proxy get trap for nodejs.util.inspect.custom (#33730)
  • fix(core): disable include_icu_data feature (#34279)
  • fix(core): evaluate pre-instantiated module in lazy_load_esm_module (#33973)
  • fix(core): prevent TLA hang when has_tick_scheduled is set during async module evaluation (#33278)
  • fix(core): short-circuit async-resolve when it returns an already-registered module (#34058)
  • fix(doc): resolve npm entrypoints without types (#34147)
  • fix(ext/crypto): add SHA3 support to crypto.subtle.digest (#32342)
  • fix(ext/crypto): normalize P-521 SPKI exports (#34087)
  • fix(ext/crypto): validate raw key length on X25519/X448/Ed25519 importKey (#33944)
  • fix(ext/fetch): close response_rid when abort races op_fetch_send completion (#33928)
  • fix(ext/fs): run open_async on the blocking pool so FIFO opens don't stall the runtime (#33667)
  • fix(ext/image): handle bitmaps in createImageBitmap correctly (#34285)
  • fix(ext/napi): run weak-callback finalizers synchronously in second-pass (#34023)
  • fix(ext/node): DSA keygen with arbitrary modulusLength (#34206)
  • fix(ext/node): MessagePort.on('message') should deduplicate listeners (#33991)
  • fix(ext/node): Node-compatible TAP reporter for node:test (#34255)
  • fix(ext/node): TLSSocket.setServername throws typed errors (#33744)
  • fix(ext/node): Worker rejects --heap-prof and --cpu-prof execArgv flags with wrong error (#34011)
  • fix(ext/node): accept ArrayBufferView in tls.setDefaultCACertificates (#33700)
  • fix(ext/node): accept CryptoKey input in createPublicKey/createPrivat… (#33750)
  • fix(ext/node): add ERR_REQUIRE_ASYNC_MODULE and ERR_REQUIRE_CYCLE_MODULE error codes (#33921)
  • fix(ext/node): add limits property on node:sqlite DatabaseSync (#33106)
  • fix(ext/node): add active process resources APIs (#34101)
  • fix(ext/node): add emitExperimentalWarning/pendingDeprecate to internal/util, support modifyPrototype option in util.deprecate (#33660)
  • fix(ext/node): add http2.performServerHandshake to polyfill (#33668)
  • fix(ext/node): add linkRequests/moduleRequests/instantiate to node:vm (#34131)
  • fix(ext/node): add post-resolution deny check in TCPWrap connect (#33880)
  • fix(ext/node): add process._debugEnd() / process._debugProcess() (#34194)
  • fix(ext/node): add test.expectFailure to node:test (#34130)
  • fix(ext/node): add tls.getCaCertificates() (#32032)
  • fix(ext/node): add util.setTraceSigInt stub (#34013)
  • fix(ext/node): add v8.GCProfiler (#34158)
  • fix(ext/node): add v8.queryObjects() and util.queryObjects() (#34159)
  • fix(ext/node): add v8.startupSnapshot API polyfill (#34189)
  • fix(ext/node): align crypto KeyObject PKCS#8 encryption, JWK input and PSS salt with Node (#33757)
  • fix(ext/node): align inspector WebSocket URL with Node.js format (ws://host:port/UUID) (#33592)
  • fix(ext/node): align nextTick ordering in ESM (#34085)
  • fix(ext/node): align node stream destroy named export (#33573)
  • fix(ext/node): align scrypt behavior and performance with Node (#33773)
  • fix(ext/node): allow explicit paramEncoding for EC key generation (#33807)
  • fix(ext/node): allow tls.Server SecureContext without cert/key for SNICallback (#33715)
  • fix(ext/node): apply Deno's resolver inside loader-hook defaultResolve (#33964)
  • fix(ext/node): apply encoding to Dirent name/parentPath in fs.readdir (#33972)
  • fix(ext/node): apply http1Options to HTTP/2 secure server fallback (#33678)
  • fix(ext/node): attach addAbortListener to EventEmitter, fix errorMonitor (#34262)
  • fix(ext/node): avoid panic in vm.createContext loop at isolate teardown (#34195)
  • fix(ext/node): bind setImmediate callback this to the Immediate instance (#33716)
  • fix(ext/node): bind to IPv6 wildcard for default Server.listen() to enable dual-stack (#33617)
  • fix(ext/node): cancel pending TLS writes when the socket closes (#33690)
  • fix(ext/node): close named-pipe handles after child_process.spawn on Windows (#33941)
  • fix(ext/node): complete TLS peer cert chains (#34098)
  • fix(ext/node): decrypt encrypted private keys in publicEncrypt/privateDecrypt and ignore passphrase (#33770)
  • fix(ext/node): decrypt legacy Proc-Type/DEK-Info encrypted PEM private keys (#33769)
  • fix(ext/node): defer http2 stream window replenishment while paused (#33640)
  • fix(ext/node): detect non-mtime stat changes in StatWatcher (#33950)
  • fix(ext/node): dns resolveAny with real ANY query, retry/maxTimeout support (#33577)
  • fix(ext/node): don't emit ServerResponse 'finish' after client abort (#34026)
  • fix(ext/node): drive TLSWrap cycle on JSStream writes to fix deadlock (#33914)
  • fix(ext/node): emit DEP0111/DEP0119 from process.binding under --pending-deprecation (#33594)
  • fix(ext/node): emit DEP0192 deprecation warning when _tls_common is required (#33819)
  • fix(ext/node): emit ERR_HTTP2_MAX_PENDING_SETTINGS_ACK via session error instead of throwing (#33679)
  • fix(ext/node): emit ERR_HTTP2_TOO_MANY_INVALID_FRAMES for empty DATA frames without END_STREAM (#33644)
  • fix(ext/node): emit Protocol error when http2 client connects to non-h2 server (#33740)
  • fix(ext/node): emit deprecation warnings for legacy stream/_tls_wrap requires and module.parent (#34086)
  • fix(ext/node): emit destroy for cleared immediates (#34084)
  • fix(ext/node): emit diagnostics_channel events for HTTP server (#33908)
  • fix(ext/node): emit drained server close on next tick for Node parity (#33672)
  • fix(ext/node): emit http PerformanceObserver entries for HttpClient and HttpRequest (#33826)
  • fix(ext/node): emit perf_hooks PerformanceEntry for http2 sessions and streams (#33618)
  • fix(ext/node): enable quic node compat tests by correcting .mjs file extensions in config (#33824)
  • fix(ext/node): enable test-crypto-keygen-async-explicit-elliptic-curve (#33812)
  • fix(ext/node): enable test-crypto-rsa-dsa node compat test with DSA encrypted keys (#33811)
  • fix(ext/node): enable test-crypto-sign-verify node compat test (#33810)
  • fix(ext/node): enable test-crypto.js node compat test (#33822)
  • fix(ext/node): enable test-http2-server-shutdown-redundant (#33793)
  • fix(ext/node): enforce OpenSSL SECLEVEL key-strength check in createSecureContext (#33686)
  • fix(ext/node): expand diagnostics_channel coverage (#34243)
  • fix(ext/node): export UV_EOF and fix Socket._final without connect (#34211)
  • fix(ext/node): expose Http2Session and nghttp2ErrorString on http2 internalBinding (#33732)
  • fix(ext/node): expose Http2Session and nghttp2ErrorString on http2 internalBinding (#33742)
  • fix(ext/node): expose Http2Stream and nghttp2ErrorString on http2 internalBinding (#33729)
  • fix(ext/node): expose TLS server name (SNI) on server-side TLSSocket via getServername op (#33725)
  • fix(ext/node): expose E and SystemError from internal/errors (#34080)
  • fix(ext/node): expose http2 internalBinding and add missing HTTP2_HEADER_* constants (#33726)
  • fix(ext/node): expose http2 session setNextStreamID with capital-ID method name (#33666)
  • fix(ext/node): expose http2 test bindings and route pushStream through pushPromise (#33741)
  • fix(ext/node): expose internal webstreams modules (#34107)
  • fix(ext/node): expose internal/async_hooks as requireable module (#34116)
  • fix(ext/node): expose internal/fs/promises with FileHandle (#34118)
  • fix(ext/node): expose internal/js_stream_socket and add default read path (#34088)
  • fix(ext/node): expose internal/net as requireable module (#34152)
  • fix(ext/node): expose internal/options as requireable module (#34117)
  • fix(ext/node): expose internal/tty as requireable module (#34105)
  • fix(ext/node): expose internal/url so require('internal/url') works (#34012)
  • fix(ext/node): expose internal/util/debuglog and add formatTime helper (#33665)
  • fix(ext/node): fire uncaughtExceptionMonitor with correct origin for sync top-level throws (#34048)
  • fix(ext/node): fix TLS crash with Happy Eyeballs address fallback (#33641)
  • fix(ext/node): fix TLS peer certificate multi-value fields, issuer chain, and EC curve names (#33782)
  • fix(ext/node): fix child_process.send() backpressure return value (#33869)
  • fix(ext/node): fix module resolution for nested package.json files (#33767)
  • fix(ext/node): flesh out node:trace_events polyfill (#34216)
  • fix(ext/node): forward http2 protocol errors from invalid frame callback to session error event (#33630)
  • fix(ext/node): handle HTTP/2 flow control (#33795)
  • fix(ext/node): handle connectionsCheckingInterval option and send 408 for request timeout (#33836)
  • fix(ext/node): handle unhandled rejections in node:test without crashing runner (#33749)
  • fix(ext/node): implement AES Key Wrap and Key Wrap with Padding ciphers (#33813)
  • fix(ext/node): implement ALPNCallback and SNICallback for TLS server (#33360)
  • fix(ext/node): implement ECDH validation and DH verifyError (#33751)
  • fix(ext/node): implement Module._stat (#34157)
  • fix(ext/node): implement SocketAddress class (#34020)
  • fix(ext/node): implement TCP/TLS socket useUserBuffer (#34164)
  • fix(ext/node): implement displayErrors for vm scripts (#33942)
  • fix(ext/node): implement h2 END_STREAM packing and Http2Session PerformanceObserver entries (#33796)
  • fix(ext/node): implement missing node:test APIs (#33764)
  • fix(ext/node): implement mock.getter, mock.setter, mockImplementation in node:test (#33755)
  • fix(ext/node): implement noDelay property on net.Server and apply TCP_NODELAY to accepted (#33828)
  • fix(ext/node): implement node:cluster on unix (#33752)
  • fix(ext/node): implement node:wasi preview1 compat (#34245)
  • fix(ext/node): implement vm.SyntheticModule constructor (#34014)
  • fix(ext/node): import/export PKCS#8 and legacy encrypted PEM private keys (#33762)
  • fix(ext/node): improve http server parser compat (#34094)
  • fix(ext/node): improve https agent compat (#34091)
  • fix(ext/node): improve module hooks support (#33877)
  • fix(ext/node): improve node:tls test compatibility (#34067)
  • fix(ext/node): improve worker_threads MessagePort compatibility (#34250)
  • fix(ext/node): isolate TLS client reject session resumption (#34097)
  • fix(ext/node): make hideStackFrames actually hide frames, expose internal/validators (#33673)
  • fix(ext/node): map rustls record-decode errors to OpenSSL-style "wrong version number" (#33711)
  • fix(ext/node): module hook fixes for ESM nextLoad, createRequire URL, and builtin redirects (#34219)
  • fix(ext/node): node:repl improvements (#33930)
  • fix(ext/node): node:test improvements (#33929)
  • fix(ext/node): node:test with watch-mode events (#34254)
  • fix(ext/node): normalize underscored V8 flags (#34129)
  • fix(ext/node): omit glibc version fields on musl/non-Linux (#33987)
  • fix(ext/node): pad DH shared secret and fix prime sign byte for stateless diffieHellman (#33761)
  • fix(ext/node): pass URL to kOnHeadersComplete when request has no headers (#33831)
  • fix(ext/node): per-request executionAsyncResource() for async_hooks (#34188)
  • fix(ext/node): polyfill module.enableCompileCache and companions (#34190)
  • fix(ext/node): port internal/priority_queue and expose it via require (#33696)
  • fix(ext/node): preserve AsyncLocalStorage context across HTTP/2 client streams (#33677)
  • fix(ext/node): preserve raw socket connect when wrapping TLS (#34093)
  • fix(ext/node): prevent panic when importing node builtins after module.register() (#33920)
  • fix(ext/node): prevent top-level await test(...) deadlock in node:test (#33947)
  • fix(ext/node): propagate highWaterMark option from http.createServer to req and res (#33825)
  • fix(ext/node): readFile of large file via fd returns scrambled content (#34258)
  • fix(ext/node): refresh async id for reused agent sockets (#34138)
  • fix(ext/node): register sigwinch listeners for stdout/stderr (#33890)
  • fix(ext/node): reject structuredClone for file-backed Blobs (#34075)
  • fix(ext/node): report directory imports with node error code (#34076)
  • fix(ext/node): restore llhttp parser.data after execute to handle re-entrant calls (#33832)
  • fix(ext/node): retry named-pipe connect on ERROR_PIPE_BUSY (Windows) (#33974)
  • fix(ext/node): route ServerHttp2Stream.respond through binding proto (#33736)
  • fix(ext/node): run load hook chain on every require() of a builtin (#34223)
  • fix(ext/node): run register() hooks in worker thread, add --experimental-loader flag (#33906)
  • fix(ext/node): satisfy agent-base node:https stack-trace check (#34264)
  • fix(ext/node): send http2 GOAWAY before stream RSTs so peer sees session destroy code (#33637)
  • fix(ext/node): set OSSL error codes and key-type checks in stateless diffieHellman (#33772)
  • fix(ext/node): share TLS session cache and ticketer for tls.TLSSocket session resumption (#33693)
  • fix(ext/node): skip ESM load hook bridge for CJS modules (#33861)
  • fix(ext/node): support CA certificate introspection and off-thread loading tests (#33708)
  • fix(ext/node): support PKCS#8 encrypted private key PEM export via PBES2 (#33758)
  • fix(ext/node): support TLS client resume compat tests (#34095)
  • fix(ext/node): support encoding option in fs.watch (#33634)
  • fix(ext/node): support signal option in fs.watch/fs.promises.watch (#33650)
  • fix(ext/node): support abstract Unix sockets in node:net pipe bind (#33872)
  • fix(ext/node): support encrypted PKCS#8 DER private key export and import (#33756)
  • fix(ext/node): support node:fs APIs on VFS files in deno compile (#33803)
  • fix(ext/node): support sending net.Socket and net.Server handles to child processes on unix (#33605)
  • fix(ext/node): support shouldUpgradeCallback in http server (#34092)
  • fix(ext/node): support undici dispatcher for allowHTTP1 websocket upgrades (#33731)
  • fix(ext/node): surface ERR_REQUIRE_ASYNC_MODULE/CYCLE_MODULE codes and fix TLA retry (#34060)
  • fix(ext/node): tagged template literal support for SQL (#34018)
  • fix(ext/node): throw ERR_CRYPTO_HASH_FINALIZED on subsequent Hash.digest() calls (#33774)
  • fix(ext/node): throw ERR_INVALID_ARG_VALUE for falsy dns.lookup hostname (#34234)
  • fix(ext/node): throw ERR_INVALID_ARG_VALUE for odd-length headers array in http.ServerResp (#33820)
  • fix(ext/node): throw OpenSSL-shaped error from tls.createSecureContext when clientCertEngine is set (#33691)
  • fix(ext/node): throw correct error for encrypted PEM key in privateDecrypt (#33808)
  • fix(ext/node): tls server error message, rejection capture, two compat tests (#34183)
  • fix(ext/node): unblock fs.open on FIFOs and read pipes correctly in http2 respondWithFile (#33792)
  • fix(ext/node): use ASCII byte-truncation in http2 writeAsciiString polyfill (#33645)
  • fix(ext/node): use core.loadExtScript for deno_web/deno_io polyfill deps (#33798)
  • fix(ext/node): use primordials in internal_binding/symbols.ts (#33865)
  • fix(ext/node): use proper error codes for tls.TLSSocket.setServername() (#33745)
  • fix(ext/node): use queueMicrotask in fs.close to avoid sanitizer false-positive (#33714)
  • fix(ext/node): validate data type in Cipheriv/Decipheriv update() (#33649)
  • fix(ext/node): validate fs.watch options.ignore (#33574)
  • fix(ext/node): wire HTTP/2 PING ack callbacks and emit payload buffer (#33794)
  • fix(ext/node): wire http2 maxSettings option to nghttp2_option_set_max_settings (#33790)
  • fix(ext/node): wire up http2 per-session maxOutstandingPings flag (#33791)
  • fix(ext/node): wrap process.chdir errors with path/dest/syscall (#33584)
  • fix(ext/process): respect AbortSignal in Deno.Command.output() (#34069)
  • fix(ext/process): tolerate unlinked cwd in spawn (#33587)
  • fix(ext/tls): upgrade rustls to fix SSL cert validation regression (#33912)
  • fix(ext/url): URLSearchParams Node-compat error messages on invalid this and missing args (#34017)
  • fix(ext/url): align URLSearchParams with Node for node:url compat (#34119)
  • fix(ext/web): convert MessageEvent ports via WebIDL sequence iteration (#33652)
  • fix(ext/web): respect cancelable and passive flags in Event.returnValue setter (#33651)
  • fix(ext/websocket): don't panic on H2 stream reset in poll_write (#33982)
  • fix(fmt): panic on tagged HTML template with multi-level indent (#34263)
  • fix(init): replace add(2,3) template with Deno.serve HTTP server (#33042)
  • fix(install): don't treat JS scripts with non-Node shebang as native binaries (#33971)
  • fix(install): regenerate lockfile with --force on global install (#33970)
  • fix(lsp): don't panic on unresolved dts import hover (#34112)
  • fix(node): fix registerHooks for custom file type loaders (#33899)
  • fix(node): weakly track util.aborted resources (#34142)
  • fix(node/fs): readSync with position argument returns EINVAL (#34021)
  • fix(node/sqlite): implement DatabaseSync.serialize() and deserialize() (#34010)
  • fix(node/tls): handle detached ArrayBuffer in TLSWrap write methods (#33737)
  • fix(node:http2): preserve timeout inspect links on proxied session sockets (#33721)
  • fix(npm): resolve catalog: overrides from workspaces object form (#33816)
  • fix(npm): support catalog: protocol in overrides (#33799)
  • fix(publish): don't panic on provenance generation in non-GitHub CI (#33802)
  • fix(repl): drain microtasks after inspector polling to avoid 'Promise was collected' (#33735)
  • fix(resolver): handle tag version req in byonm resolver (#33962)
  • fix(task): escape backticks in forwarded args (#34151)
  • fix(task): support recursive task completions in workspaces (#32422)
  • fix(test): include --watch= in watched paths (fixes #21704) (#32621)
  • fix(update): deno update --lockfile-only should not update config (#33746)
  • fix(watch): apply --watch-exclude filter to file change events (#33854)
  • fix(workspace): clamp CLI include paths to member folder (#33949)
  • fix: bump deno_graph to 0.108.2 for wasm multi-value return types (#34070)
  • fix: disable V8 external memory check to prevent panic on large TypedArrays (#33896)
  • fix: fix CJS re-export analysis for npm packages (#33263)
  • fix: handle native binary bin entries in global npm install (#33935)
  • fix: include node lib by default and use NodeJS.Timeout for timers (#33823)
  • fix: report eval scripts as [eval] URL for inspector (#34192)
  • perf(core): SIMD ASCII fast path for op_decode (#33720)
  • perf(core): cap V8 platform thread pool to 4 threads (#33697)
  • perf(ext): convert ext/cache, ext/canvas, ext/crypto JS sources to lazy-loaded scripts (#33778)
  • perf(ext): convert ext/fetch JS sources to lazy-loaded scripts (#33784)
  • perf(ext): convert ext/ffi JS source to lazy-loaded script (#33780)
  • perf(ext): convert ext/io, ext/os, ext/net JS sources to lazy-loaded scripts (#33779)
  • perf(ext): convert ext/kv and ext/webgpu JS sources to lazy-loaded scripts (#33818)
  • perf(ext): convert ext/process and ext/http JS sources to lazy-loaded scripts (#33817)
  • perf(ext): convert ext/telemetry and ext/cron JS sources to lazy-loaded scripts (#33801)
  • perf(ext/fetch): fast-path string in BodyInit_DOMString converter (#33676)
  • perf(ext/fetch): skip dict-converter walk on default init in Request/fetch/Response.json (#33999)
  • perf(ext/fs): convert ext/fs JS source to lazy-loaded script (#33800)
  • perf(ext/geometry): avoid heap allocation for the argument that requires a fixed length of sequence (#33688)
  • perf(ext/net): reduce Quinn TLS provider size (#34294)
  • perf(ext/node): convert 62 more polyfill files to lazy-loaded scripts (#33835)
  • perf(ext/node): convert stream* polyfills to lazy-loaded JS (#33988)
  • perf(ext/node): convert child_process, cluster, console to lazy-loaded JS (#33925)
  • perf(ext/node): convert child_process, fs, http, http2, https, inspector to lazy-loaded JS (#33967)
  • perf(ext/node): convert cluster, console, constants, crypto, dgram, dns to lazy-loaded JS (#33951)
  • perf(ext/node): convert errors.ts, util.mjs, and foundation layer to lazy-loaded scripts (#33830)
  • perf(ext/node): convert fs helpers, streams, dgram, dns/utils to lazy-loaded ESM (#33936)
  • perf(ext/node): convert fs internals, timers, tty, url, webstreams to lazy-loaded ESM (#33939)
  • perf(ext/node): convert http2, readline, stream_base_commons to lazy-loaded JS (#33932)
  • perf(ext/node): convert internal/crypto to lazy-loaded JS (#33919)
  • perf(ext/node): convert more polyfills to lazy-loaded JS (#33871)
  • perf(ext/node): convert more polyfills to lazy-loaded JS (#33882)
  • perf(ext/node): convert more polyfills to lazy-loaded JS (#33897)
  • perf(ext/node): convert more polyfills to lazy-loaded JS (#33900)
  • perf(ext/node): convert more polyfills to lazy-loaded JS (#33902)
  • perf(ext/node): convert more polyfills to lazy-loaded JS (#33909)
  • perf(ext/node): convert more polyfills to lazy-loaded JS (#33913)
  • perf(ext/node): convert net, _tls_common, _tls_wrap to lazy-loaded JS (#33997)
  • perf(ext/node): convert node:events and stream internals to lazy-loaded JS (#33881)
  • perf(ext/node): convert node:path to lazy-loaded JS (#33917)
  • perf(ext/node): convert node:util, node:assert to lazy-loaded (#33876)
  • perf(ext/node): convert timers, tls, tty, url, v8, worker_threads, zlib to lazy-loaded JS (#33960)
  • perf(ext/node): convert validators.mjs and dependencies to lazy-loaded scripts (#33821)
  • perf(ext/node): optimize direct ServerResponse string end (#34253)
  • perf(ext/node): replace node: imports with core.loadExtScript for buffer and nextTick (#33862)
  • perf(ext/node): true writev on tcp sockets for node:http (#33659)
  • perf(ext/web): add hyper-fast path for TextDecoder.decode (#33674)
  • perf(ext/web): convert all ext/web JS sources to lazy-loaded scripts (#33760)
  • perf(ext/web): fast path for TextEncoder.encodeInto (#33675)
  • perf(ext/web): lazy-init EventTarget listeners table (#33734)
  • perf(ext/web): linear-time set/delete on FormData, URLSearchParams, Headers (#33961)
  • perf(ext/web): optimize TextEncoder encodeInto result (#34055)
  • perf(ext/web): structuredClone primitive fast path (#33728)
  • perf(ext/webidl): fast path for createDictionaryConverter undefined input (#33692)
  • perf(ext/webidl): hoist EMPTY_OPTS for converter opts default (#34007)
  • perf(ext/websocket): lazy-load WebSocket and WebSocketStream JS (#33701)
  • perf(http): avoid ReadableStream when full body already buffered (#33844)
  • perf(http): directly dispatch into js request handler (#33845)
  • perf(http): don't add Vary header if response is not compressed (#33892)
  • perf(http): split clear-text HTTP autodetect connection task (#33887)
  • perf(libs/core): drop libuv-style partial-read break to fix node:http p99 (#33860)
  • perf(runtime): convert 8 runtime JS files to lazy-loaded scripts (#33864)
  • perf(snapshot): dedupe JS sources between binary and v8 snapshot (#33992)
  • perf: consolidate HTTP Brotli compressor setup (#34282)
  • perf: lazy-load more modules in the snapshot (#34061)
  • perf: monch 0.6 (#33643)
  • perf: use panic=abort in release builds (#34280)

v2.7.14

Added
  • Add fs.Utf8Stream to ext/node
  • Add delta updates via bsdiff patches to upgrade process
Fixed
  • Treat CSS same-document fragment URLs as external in bundle
  • Add missing CacheStorage.keys() and Cache.keys() methods
  • Don't exclude workspace members from deploy file patterns in config
  • Exclude transformer-injected helpers from coverage
  • Remove background from operators in dark mode code blocks in doc
  • Provide clearer error when Deno.bundle is called in compiled binary
  • Throw TypeMismatchError for non-TypedArray in getRand in ext/crypto
  • Don't mutate caller's options in Deno.createHttpClient
  • Use byte ReadableStream for Node Readable request bodies in ext/fetch
  • Normalize Deno.watchFs paths so events drop ./ segments
  • Implement napi_async_init and napi_async_destroy in ext/napi
  • Default Deno.listenDatagram hostname to 0.0.0.0 in ext/net
  • Accept X.509v1 server certs in tls.createServer in ext/node
  • Accept string mode in fs.mkdir and fs.mkdirSync in ext/node
  • Add Server BlockList, asyncDispose, and misc net improvements in ext/node
  • Add _idleStart and _idleTimeout to Timeout in ext/node
  • Align crypto random* validation with Node in ext/node
  • Align fs.truncate / ftruncate argument validation with Node in ext/node
2.7.14 / 2026.04.28
  • feat(ext/node): add fs.Utf8Stream
  • feat(upgrade): delta updates via bsdiff patches (#33274)
  • fix(bundle): treat CSS same-document fragment URLs as external (#33492)
  • fix(cache): add missing CacheStorage.keys() and Cache.keys() methods (#33275)
  • fix(config): don't exclude workspace members from deploy file patterns (#33562)
  • fix(coverage): exclude transformer-injected helpers from coverage (#33481)
  • fix(doc): remove background from operators in dark mode code blocks (#33267)
  • fix(ext/bundle): clearer error when Deno.bundle is called in compiled binary (#33503)
  • fix(ext/crypto): throw TypeMismatchError for non-TypedArray in getRand (#33470)
  • fix(ext/fetch): don't mutate caller's options in Deno.createHttpClient (#33497)
  • fix(ext/fetch): use byte ReadableStream for Node Readable request bodies (#33432)
  • fix(ext/fs): normalize Deno.watchFs paths so events drop ./ segments (#33490)
  • fix(ext/napi): implement napi_async_init and napi_async_destroy (#33282)
  • fix(ext/net): default Deno.listenDatagram hostname to 0.0.0.0 (#33496)
  • fix(ext/node): accept X.509v1 server certs in tls.createServer (#33505)
  • fix(ext/node): accept string mode in fs.mkdir and fs.mkdirSync (#33409)
  • fix(ext/node): add Server BlockList, asyncDispose, and misc net improvements (#33417)
  • fix(ext/node): add _idleStart and _idleTimeout to Timeout (#33604)
  • fix(ext/node): align crypto random* validation with Node (#33456)
  • fix(ext/node): align fs.truncate / ftruncate argument validation with Node (#33418)
  • fix(ext/node): align module.builtinModules / getBuiltinModule with Node (#33404)
  • fix(ext/node): align node:module behavior with Node (#33482)
  • fix(ext/node): align node:test it/describe with Node, enable passing compat tests (#33593)
  • fix(ext/node): align util.styleText with Node (#33547)
  • fix(ext/node): allow https.Agent() without new, enable passing compat tests (#33601)
  • fix(ext/node): async fs.stat/lstat throwIfNoEntry + deprecate fs.Stats (#33436)
  • fix(ext/node): attach input URL to ERR_INVALID_FILE_URL_PATH (#33398)
  • fix(ext/node): attach path/syscall to fs.lstat / realpath / link errors (#33446)
  • fix(ext/node): brand-check SecureContext._external accessor (#33569)
  • fix(ext/node): cache hash digest so it survives stream.pipeline (#33440)
  • fix(ext/node): cancelling Readable.toWeb(req) no longer destroys the socket (#33570)
  • fix(ext/node): close fd on error in http2 stream respondWithFile (#33614)
  • fix(ext/node): correct buffer-length check in Readable._fromList decoder branch (#33624)
  • fix(ext/node): defer drain in http2 shutdownWritable so pushStream after end() works (#33619)
  • fix(ext/node): drain pending TLS cleartext in enc_write_cb (#33378)
  • fix(ext/node): emit Buffer for http2 'goaway' opaqueData (#33502)
  • fix(ext/node): emit DEP0031 deprecation warning for ecdh.setPublicKey( (#33468)
  • fix(ext/node): emit DEP0182 deprecation for short AES-GCM auth tag (#33469)
  • fix(ext/node): emit HPE_INVALID_TRANSFER_ENCODING for CL+chunked respo (#33488)
  • fix(ext/node): emit StatWatcher 'stop' event asynchronously (#33448)
  • fix(ext/node): emit TimeoutNaNWarning for invalid timer durations (#33472)
  • fix(ext/node): emit http2 frameError on send failure with translated HTTP/2 error code (#33631)
  • fix(ext/node): emit stream-level PROTOCOL_ERROR in node:http2
  • fix(ext/node): emit tlsClientError instead of crashing on TLS init failure (#33429)
  • fix(ext/node): enable test-als-defaultvalue-original (AsyncLocalStorage default value) (#33464)
  • fix(ext/node): encode http2 headers as Latin-1 to fix response splitting (#33531)
  • fix(ext/node): encode more chars in url.pathToFileURL() (#33397)
  • fix(ext/node): enforce HTTP/2 server header list size limits (#33494)
  • fix(ext/node): enforce http2 maxSessionInvalidFrames limit (#33515)
  • fix(ext/node): expose http2 sensitive headers received with NV_FLAG_NO_INDEX flag (#33626)
  • fix(ext/node): fix EEXIST error and data loss in writeFileSync on Windows (#33413)
  • fix(ext/node): fix ERR_INVALID_CHAR message & OutgoingMessage.prototype.write (#33430)
  • fix(ext/node): fix TLS client certificate authentication verification (#33576)
  • fix(ext/node): fix TLS socket error ordering and app data leak before identity verification (#33585)
  • fix(ext/node): fix TLS socket lifecycle and readStop backpressure (#33524)
  • fix(ext/node): fix closeIdleConnections destroying active connections (#33596)
  • fix(ext/node): fix fs.glob skipping siblings with */../ patterns (#33372)
  • fix(ext/node): fix spawnSync internal API for monkey-patching and killSignal (#33545)
  • fix(ext/node): flush GOAWAY before destroying http2 socket and expose internal/http2/core (#33566)
  • fix(ext/node): flush HTTP/2 client preface after settings submission (#33387)
  • fix(ext/node): forward enableConnectProtocol setting to peer in HTTP/2 SETTINGS frame (#33616)
  • fix(ext/node): handle undefined http2 ping payload and cancel pending pings on destroy (#33561)
  • fix(ext/node): hide aggregateTwoErrors frame in AggregateError stack (#33402)
  • fix(ext/node): honor http2 strictFieldWhitespaceValidation option (#33506)
  • fix(ext/node): honor requestCert/ca on node:tls server, populate getPeerCertificate() (#33439)
  • fix(ext/node): honor weight option in http2 client.request and emit DEP0194 (#33622)
  • fix(ext/node): http2 createConnection support and per-frame socket writes (#33520)
  • fix(ext/node): implement BlockList.rules / isBlockList / toJSON / fromJSON (#33445)
  • fix(ext/node): implement Socket.resetAndDestroy with TCP RST in node:net (#33415)
  • fix(ext/node): implement StatWatcher.ref() / unref() (#33408)
  • fix(ext/node): implement dns Resolver cancel() and timeout support (#33580)
  • fix(ext/node): implement dns.reverse() and fix dns.lookup() family parameter (#33579)
  • fix(ext/node): implement fs.mkdtempDisposableSync / fsPromises.mkdtempDisposable (#33533)
  • fix(ext/node): implement node:cluster fork/Worker and worker-side detection (#33493)
  • fix(ext/node): implement process.debugPort with ToInt32 coercion (#33403)
  • fix(ext/node): import kIncomingMessage/kServerResponse in http2 allowHTTP1 fallback (#33435)
  • fix(ext/node): improve Node.js timer compatibility (#33479)
  • fix(ext/node): improve perf_hooks timerify and add missing exports (#33581)
  • fix(ext/node): include accepted values in Console colorMode error (#33424)
  • fix(ext/node): isolate parentPort from globalThis in worker_threads (#32596)
  • fix(ext/node): make Buffer.prototype methods generic-callable (#33466)
  • fix(ext/node): make http2 session.origin() round-trip origins and respect TLS servername (#33629)
  • fix(ext/node): make process.constructor a proper instanceof check (#33447)
  • fix(ext/node): name custom-promisified functions after their originals (#33407)
  • fix(ext/node): null-proto child_process options to block prototype pollution (#33555)
  • fix(ext/node): pass reusePort flags in Server.listen() without host (#33530)
  • fix(ext/node): pass signal name to process signal handlers (#33425)
  • fix(ext/node): pass stream fd to child process stdio instead of inheriting (#33525)
  • fix(ext/node): plumb llhttp error code, reason, and bytes parsed through HTTPParser (#33591)
  • fix(ext/node): prevent duplicate close emit when http2 client socket i (#33538)
  • fix(ext/node): re-arm Windows named pipe server after accept (#33369)
  • fix(ext/node): rebind http2 state buffers post-snapshot, enforce maxHeaderListPairs (#33495)
  • fix(ext/node): reject non-ArrayBufferView data in fs.writeFileSync (#33406)
  • fix(ext/node): rename _destroySsl to _destroySSL to match Node.js API (#33599)
  • fix(ext/node): replace unwrap with error propagation in parallel cp (#33396)
  • fix(ext/node): return relative path from fs.watch with recursive option (#33428)
  • fix(ext/node): strip trailing dot from SRV target in dns.resolveSrv() (#33578)
  • fix(ext/node): submit http2 RST_STREAM before flushing END_STREAM DATA frame on respondWithFD read (#33633)
  • fix(ext/node): support ALPNCallback in http2.createSecureServer (#33521)
  • fix(ext/node): support BlockList, AbortSignal, and constructor options in node:net Socket (#33414)
  • fix(ext/node): support ignore option in fs.watch and fs.promises.watch (#33610)
  • fix(ext/node): support encoding option in fs.readdir; don't double-call glob callback (#33501)
  • fix(ext/node): support http2 pushStream and client push events (#33516)
  • fix(ext/node): support reusePort option and fix bind/pipe handling in node:net (#33416)
  • fix(ext/node): support util.promisify on http2.connect (#33489)
  • fix(ext/node): support v1 X.509 certs and http2 ALPN fallback (#33510)
  • fix(ext/node): throw ERR_INVALID_ARG_VALUE when rmdir gets options.recursive (#33565)
  • fix(ext/node): throw ERR_INVALID_URL from http/https request string URL (#33427)
  • fix(ext/node): throw TypeError for Symbol keys/values in process.env (#33399)
  • fix(ext/node): timer _destroyed flag, Symbol.dispose, and setInterval abort (#33528)
  • fix(ext/node): track http2 custom settings and SETTINGS ACK callbacks (#33518)
  • fix(ext/node): treat unsolicited HTTP/2 PING ACK as connection-level protocol error (#33625)
  • fix(ext/node): use AbortSignal.addEventListener in addAbortListener (#33557)
  • fix(ext/node): use ERR_INVALID_ARG_TYPE for tls.createServer non-object options (#33589)
  • fix(ext/node): use ERR_INVALID_ARG_VALUE in module.createRequire (#33449)
  • fix(ext/node): use Node's address-type check in dgram Socket.send (#33420)
  • fix(ext/node): use node:timers for http server connection checks, expo (#33483)
  • fix(ext/node): use proper error codes for require() invalid arguments (#33609)
  • fix(ext/node): validate fs.watch boolean options (#33627)
  • fix(ext/node): validate boolean arg in process.setSourceMapsEnabled (#33473)
  • fix(ext/node): validate ciphers option in tls.createSecureContext() (#33597)
  • fix(ext/node): validate dgram options.recvBufferSize / sendBufferSize (#33444)
  • fix(ext/node): validate oaepHash in publicEncrypt/privateDecrypt (#33388)
  • fix(ext/node): validate options.type in Readable.toWeb (#33560)
  • fix(ext/node): validate process.chdir argument is a string (#33401)
  • fix(ext/node): walk sandbox prototype chain in vm property_query (#33463)
  • fix(ext/node): wire JSStreamSocket handle write/shutdown for http2 (#33526)
  • fix(ext/node): wire up captureRejection handler for http2 servers (#33542)
  • fix(ext/node): yield to I/O in http2 write path so stream pipeline finishes (#33541)
  • fix(ext/web): align AbortSignal.timeout error message with Node (#33460)
  • fix(ext/web): allow transferring non-serializable types in structuredClone (#33491)
  • fix(ext/web): handle late write racing with TransformStream cancel (#33478)
  • fix(ext/web): narrow ReadableStreamBYOBRequest.view to Uint8Array (#33477)
  • fix(ext/web): retain source from MessageEventInit (#33500)
  • fix(ext/web): route console.dirxml through the log printer (#33443)
  • fix(ext/web): set ERR_MISSING_ARGS code on URL.revokeObjectURL no-arg (#33471)
  • fix(ext/web): structuredClone of non-serializable Web types throws DataCloneError (#33465)
  • fix(ext/webidl): set ERR_ILLEGAL_CONSTRUCTOR code on illegal constructor calls (#33535)
  • fix(ext/webidl): set ERR_INVALID_THIS code on brand-check TypeError (#33467)
  • fix(node/buffer): fix panic in transcode with odd-length UTF-16LE input (#33390)
  • fix(node/compat): disable flaky test-child-process-exec-kill-throws on Windows (#33426)
  • fix(node/compat): disable flaky test-fs-read-stream-pos on Windows (#33421)
  • fix(node/compat): fix shard report merging and fetching in CI reporting (#33431)
  • fix(permissions): normalize paths for macOS filesystem comparison (#33451)
  • fix(task): match workspace directory name in --filter (#33499)
  • fix(task): use explicit workspace root check in directory-name fallback (#33540)
  • fix(x): forward --unstable-* flags to JSR and URL targets (#33450)
  • fix: bound fs.readFile on non-terminating sources (#33262)
  • fix: drop config-only unstable features from unstable_args() (#33452)
  • fix: match single-char wildcard segments in npm package imports (#33513)
  • perf(ext/node): pool 64KB read buffers to reduce allocation pressure (#33395)
  • perf: optimize worker and MessagePort message passing (#32657)
  • perf: upgrade rusty_v8 to 147.4.0 (#33422)