v2.9.0
📦 denoView on GitHub →
✨ 58 features🐛 51 fixes⚡ 1 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.