Change8

v2.9.0

📦 denoView on GitHub →
58 features🐛 51 fixes1 deprecations🔧 7 symbols

Summary

Deno 2.9.0 introduces significant CLI enhancements with new subcommands like `deno watch` and improved package manager integration for lockfile seeding. This release also stabilizes several features, including bare node built-in resolution and the "links" field in deno.json, alongside numerous fixes across crypto, fetch, and Node.js compatibility layers.

✨ New Features

  • Added --declaration flag to bundle to generate rolled-up .d.ts files.
  • Added `deno link` and `deno unlink` subcommands.
  • Added `deno watch` subcommand.
  • Added deno list subcommand to list declared dependencies.
  • 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 compile.
  • Add configurable coverage thresholds.
  • Added --compress flag for self-extracting app bundles in desktop.
  • Added Linux .deb and .rpm installer output formats for desktop.
  • Added Windows .msi installer output format for desktop.
  • Autodetect Vite framework in desktop.
  • Default UI backend to webview in desktop.
  • Support remaining modern WebCrypto algorithms in ext/crypto.
  • Implement Happy Eyeballs for `Deno.connect` and `Deno.connectTls` in ext/net.
  • Implement node:test mock.module in ext/node.
  • Implement node:test mock.timers in ext/node.
  • Implement web locks api in ext/web.
  • Add sortNamedImports and sortNamedExports options to fmt.
  • Infer fmt config from .editorconfig.
  • 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.
  • Allow disabling serve compression in http.
  • Disable Deno.serve automatic compression by default.
  • Create node_modules for workspace members during install.
  • Seed deno.lock from bun.lock during install.
  • Seed deno.lock from package-lock.json during install.
  • Seed deno.lock from pnpm-lock.yaml during install.
  • Seed deno.lock from yarn.lock during install.
  • Warn on package.json engines mismatch during install.
  • Auto-resolve git merge conflicts in deno.lock.
  • Add inferred type request to lsp.
  • Implement Node-API version 10 in napi.
  • Bump reported process.version to v26.3.0 in node.
  • Install jsr deps into node_modules via npm-compat registry.
  • Implement publishing-trust ranking and no-downgrade trust policy for npm.
  • Add request_builder_hook for fetch token and cdn-loop headers in runtime.
  • Add --if-present flag to deno task.
  • Add --jobs/--concurrency flag to deno task.
  • Input-based caching (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.
  • Built-in snapshot testing via t.assertSnapshot.
  • Show sub-millisecond test durations in test output.
  • Support CSS module imports (with { type: "css" }) in unstable.
  • Added `deno desktop` subcommand.
  • Added `deno remove --global` as alias for `deno uninstall --global`.
  • Add "preferPackageJson" deno.json setting.
  • Add stable --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.

🐛 Bug Fixes

  • Treat npm .d.ts as CJS based on package.json in check.
  • Always register isolate to prevent silent foreground task drop in core.
  • Don't cache WebIDL sequence keys in thread-local v8::Eternal in core.
  • Handle async op promise id wraparound in core.
  • Make uv_compat ready queues thread-safe in core.
  • Preserve custom .stack getters in error/test formatter in core.
  • Unwrap global exports in Wasm ESM integration in core.
  • Don't panic in summary reporter without a common root in coverage.
  • Merge coverage for modules loaded with different hash/search params.
  • Use JSR latest for deploy CLI.
  • Wayland support for CEF and webview backends in desktop.
  • Add Bluetooth usage descriptions to macOS Info.plist in desktop.
  • Add macOS desktop Info.plist keys in desktop.
  • Correct libdenort unpack path with non-executable extension in desktop.
  • Hide bundled libc++ symbols so the desktop runtime can be dlopen'd on Linux.
  • Use native Wayland instead of XWayland on Wayland systems in desktop.
  • Allow deriving AES-OCB keys in ext/crypto.
  • Clamp X448 scalar per RFC 7748 in ext/crypto.
  • Pad JWK to multiple of 8 bytes for AES-KW wrap in ext/crypto.
  • Keep content-encoding and content-length on decompressed responses in ext/fetch.
  • Require --allow-net for Unix proxy in createHttpClient in ext/fetch.
  • Truncate should not follow a terminal symlink in ext/fs.
  • Apply automatic compression for zero-arg serve handlers in ext/http.
  • Close active WebSockets on Deno.serve shutdown in ext/http.
  • Validate remote KV URL when opening the connection in ext/kv.
  • Restore Explicit microtask policy in napi_resolve_deferred in ext/napi.
  • Cancel in-flight reads when closing TCP/Unix/Vsock streams in ext/net.
  • Set transport on address for TlsListener in ext/net.
  • Allow registerHooks with no resolve or load hook in ext/node.
  • Avoid panic deserializing empty buffers over child_process IPC in ext/node.
  • Avoid panic when vm.SourceTextModule uses import.meta in ext/node.
  • Check --allow-net for proxied request target in node:http(s) in ext/node.
  • Don't apply requestTimeout to active streaming responses in ext/node.
  • Fail node:test on unhandled rejection and enforce timeout in ext/node.
  • Fix `node:test` hook ordering and error handling in ext/node.
  • Forward permissions when spawning deno with subcommand args in ext/node.
  • Implement process.resourceUsage() in ext/node.
  • Implement t.assert.fileSnapshot for node:test in ext/node.
  • Implement test.TestContext.runOnly in ext/node.
  • Implement worker_threads.isInternalThread in ext/node.
  • Import attributes and custom module types in registerHooks ESM hooks in ext/node.
  • Initialize named stdio exports lazily in ext/node.
  • Keep dns.lookup permission token internal in ext/node.
  • Make registerHooks resolve hook work for nested imports in ext/node.
  • Preserve AsyncLocalStorage context across node:net callbacks in ext/node.
  • Restore Node binding signature for zlib write/writeSync in ext/node.
  • Single source of truth for emulated Node version in ext/node.
  • Stop coloring non-TTY streams in `util.styleText` in ext/node.
  • Support AbortSignal.timeout in node:test mock.timers in ext/node.
  • Support HTTP/2 on the DENO_SERVE_ADDRESS override listener in ext/node.
  • Trace v8 serializer delegate in ext/node.

Affected Symbols

⚡ Deprecations

  • Deprecation warning added for legacy request abort in ext/http.