{"slug": "deno-2-7-temporal-api-windows-arm-and-npm-overrides", "title": "Deno 2.7: Temporal API, Windows ARM, and npm overrides", "summary": "Deno 2.7 has been released, introducing a stabilized Temporal API for date/time handling, official builds for Windows on ARM (aarch64), and support for the `overrides` field in `package.json` to control dependency versions. The update also includes new unstable subprocess APIs (`Deno.spawn()`, `Deno.spawnAndWait()`, `Deno.spawnAndWaitSync()`) and numerous Node.js compatibility fixes across modules like `node:worker_threads` and `node:child_process`.", "body_md": "We are happy to announce the release of version 2.7 of the Deno runtime, which brings a number of improvements and additions.\n\nTo upgrade to Deno 2.7, run the following in your terminal:\n\n```\ndeno upgrade\n```\n\nIf Deno is not yet installed, run one of the following commands to install or\n[learn how to install it here](https://docs.deno.com/runtime/manual/getting_started/installation).\n\n```\n# Using Shell (macOS and Linux):\ncurl -fsSL https://deno.land/install.sh | sh\n\n# Using PowerShell (Windows):\niwr https://deno.land/install.ps1 -useb | iex\n```\n\nWhat’s new in Deno 2.7\n\n`Temporal`\n\nAPI stabilized[Windows on ARM support](#windows-on-arm-support)`package.json`\n\noverrides support`Deno.spawn()`\n\nand friends (unstable)[Node.js compatibility](#nodejs-compatibility)[API changes](#api-changes)[Quality of life improvements](#quality-of-life-improvements)[V8 14.5](#v8-14-5)[Acknowledgments](#acknowledgments)\n\n`Temporal`\n\nAPI stabilized\n\nThe [ Temporal API](https://tc39.es/proposal-temporal/docs/) is now stable in\nDeno. The\n\n`--unstable-temporal`\n\nflag is no longer required. Chrome 144 shipped\n`Temporal`\n\nin January 2026, and Deno now follows suit as part of the\n[V8 14.5 upgrade](#v8-14-5).\n\n``` js\nconst today = Temporal.Now.plainDateISO();\nconst nextMonth = today.add({ months: 1 }); // immutable - today unchanged\n\nconst meeting = Temporal.ZonedDateTime.from(\n  \"2026-03-15T14:30[America/New_York]\",\n);\nconst inTokyo = meeting.withTimeZone(\"Asia/Tokyo\"); // same instant\n```\n\nFor a deeper dive, see\n[Mat’s fantastic post](https://piccalil.li/blog/date-is-out-and-temporal-is-in/).\n\nWindows on ARM support\n\nDeno now provides official builds for Windows on ARM\n(`aarch64-pc-windows-msvc`\n\n). This means native performance on ARM-based Windows\ndevices like Surface Pro X, Lenovo ThinkPad X13s, and other Snapdragon-powered\nlaptops, with no x86 emulation overhead.\n\n```\n# Install Deno on Windows ARM\niwr https://deno.land/install.ps1 -useb | iex\n```\n\nThis has been a\n[long](https://github.com/denoland/deno/issues/8422)-[requested](https://github.com/denoland/deno/issues/13331)\nfeature and closes the gap for developers working on ARM hardware across all\nmajor platforms.\n\n`package.json`\n\noverrides support\n\nDeno has\n[first-class package.json support](https://docs.deno.com/runtime/fundamentals/node/#first-class-package.json-support).\nOur goal is that Node projects run in Deno with little to no changes. This\nrelease adds support for the\n\n[field, giving you control over the versions of packages deep in your dependency tree.](https://docs.npmjs.com/cli/v9/configuring-npm/package-json#overrides)\n\n`overrides`\n\nThis is useful when you need to pin a transitive dependency to fix a security vulnerability, force compatibility with a specific version, or replace a package entirely.\n\n```\n{\n  \"dependencies\": {\n    \"express\": \"^4.18.0\"\n  },\n  \"overrides\": {\n    \"cookie\": \"0.7.0\",\n    \"express\": {\n      \"qs\": \"6.13.0\"\n    }\n  }\n}\n```\n\nIn this example, `cookie`\n\nis pinned to `0.7.0`\n\neverywhere in the dependency\ngraph, while `qs`\n\nis only overridden when required by `express`\n\n.\n\nNew APIs for subprocesses\n\nDeno 2.7 introduces a simpler way to run subprocesses. The new `Deno.spawn()`\n\n,\n`Deno.spawnAndWait()`\n\n, and `Deno.spawnAndWaitSync()`\n\nfunctions are convenient\nshorthands for the existing `Deno.Command`\n\nAPI:\n\n``` js\n// Before: two steps\nconst child = new Deno.Command(\"echo\", { args: [\"hello\"] }).spawn();\n\n// After: one step\nconst child = Deno.spawn(\"echo\", [\"hello\"]);\n```\n\nAll three functions support a 3-argument overload where args are passed separately from options:\n\n``` js\n// Spawn a child process (returns ChildProcess)\nconst child = Deno.spawn(\"deno\", [\"fmt\", \"--check\"], {\n  stdout: \"inherit\",\n});\n\n// Wait for completion (returns CommandOutput)\nconst output = await Deno.spawnAndWait(\"git\", [\"status\"]);\nconsole.log(output.stdout);\n\n// Synchronous variant\nconst result = Deno.spawnAndWaitSync(\"echo\", [\"done\"]);\n```\n\nThese new APIs are currently marked as unstable, meaning that they may evolve over time until formally stabilised in the runtime.\n\nNode.js compatibility\n\nDozens of fixes across `node:worker_threads`\n\n, `node:child_process`\n\n, `node:zlib`\n\n,\n`node:sqlite`\n\n, and more.\n\n`node:worker_threads`\n\n- Worker stdout is now forwarded to the parent process\n(\n[#32160](https://github.com/denoland/deno/pull/32160)) - Worker stdin support (\n[#32165](https://github.com/denoland/deno/pull/32165)) `worker.terminate()`\n\nnow returns the correct exit code ([#32168](https://github.com/denoland/deno/pull/32168))`process.exit()`\n\nin a worker immediately halts execution ([#32169](https://github.com/denoland/deno/pull/32169))- Exit code propagation fixed\n(\n[#32124](https://github.com/denoland/deno/pull/32124)) `ref()`\n\n/`unref()`\n\nis now idempotent like Node.js ([#32161](https://github.com/denoland/deno/pull/32161))`execArgv`\n\nvalidation instead of rejecting all flags ([#32145](https://github.com/denoland/deno/pull/32145))- Error events emitted for terminal errors\n(\n[#32052](https://github.com/denoland/deno/pull/32052)) `threadName`\n\nproperty added ([#32072](https://github.com/denoland/deno/pull/32072))`worker.cpuUsage()`\n\nimplemented ([#32050](https://github.com/denoland/deno/pull/32050))`BroadcastChannel`\n\nref/unref support ([#32036](https://github.com/denoland/deno/pull/32036))\n\n`node:child_process`\n\n- stdio streams are now proper\n`Socket`\n\ninstances ([#31975](https://github.com/denoland/deno/pull/31975)) - stdio streams unrefed by default to match Node.js behavior\n(\n[#32071](https://github.com/denoland/deno/pull/32071)) - Shell redirections handled in\n`exec`\n\n([#32087](https://github.com/denoland/deno/pull/32087)) `fork()`\n\nnow accepts`URL`\n\nas modulePath ([#32268](https://github.com/denoland/deno/pull/32268))`timeout`\n\nand`killSignal`\n\nsupport for`spawn()`\n\n([#32283](https://github.com/denoland/deno/pull/32283))`NODE_OPTIONS`\n\nrespected for`--require`\n\nand`--inspect-publish-uid`\n\n([#31949](https://github.com/denoland/deno/pull/31949))\n\n`node:zlib`\n\n- Zstd compression support added\n(\n[#32025](https://github.com/denoland/deno/pull/32025)) - Multiple compatibility fixes\n(\n[#32039](https://github.com/denoland/deno/pull/32039)) - Write callback is now async to match Node.js behavior\n(\n[#32130](https://github.com/denoland/deno/pull/32130))\n\n`node:sqlite`\n\n`DatabaseSync.setAuthorizer()`\n\nimplemented ([#32009](https://github.com/denoland/deno/pull/32009))- Defensive option enabled on\n`DatabaseSync`\n\n([#32004](https://github.com/denoland/deno/pull/32004)) `SQLTagStore`\n\nimplemented ([#31945](https://github.com/denoland/deno/pull/31945))`StatementSync`\n\ncompatibility improvements ([#31941](https://github.com/denoland/deno/pull/31941))- Garbage collection no longer invalidates associated resources\n(\n[#31737](https://github.com/denoland/deno/pull/31737))\n\nOther changes\n\n`PerformanceObserver`\n\nimplemented ([#31875](https://github.com/denoland/deno/pull/31875))`process.constrainedMemory()`\n\nadded ([#32209](https://github.com/denoland/deno/pull/32209))`process.features`\n\nproperly implemented ([#31864](https://github.com/denoland/deno/pull/31864))`hasColors()`\n\nadded to`process.stdout`\n\nand`process.stderr`\n\n([#31985](https://github.com/denoland/deno/pull/31985))`util.parseEnv`\n\nand`process.loadEnvFile`\n\ncompatibility ([#32183](https://github.com/denoland/deno/pull/32183))`tls.setDefaultCACertificates`\n\nsupport ([#31522](https://github.com/denoland/deno/pull/31522))`inspector.open()`\n\n,`inspector.close()`\n\n, and`inspector.url()`\n\nsupport ([#31898](https://github.com/denoland/deno/pull/31898),[#31705](https://github.com/denoland/deno/pull/31705))`fs.writeFile`\n\nand`FileHandle.writeFile`\n\ncompatibility ([#32077](https://github.com/denoland/deno/pull/32077))`fs.rmdir`\n\ncompatibility ([#32144](https://github.com/denoland/deno/pull/32144))`fs.rm`\n\nno longer dereferences symlinks ([#31886](https://github.com/denoland/deno/pull/31886))`openAsBlob`\n\nexport added to`node:fs`\n\n([#32261](https://github.com/denoland/deno/pull/32261))- IPv6 host support in\n`node:http`\n\n([#32258](https://github.com/denoland/deno/pull/32258)) `AsyncLocalStorage`\n\ncontext preserved in`unhandledRejection`\n\nhandlers ([#32264](https://github.com/denoland/deno/pull/32264))- Error formatting compatibility\n(\n[#31970](https://github.com/denoland/deno/pull/31970)) `assert.ok`\n\ncompatibility ([#32173](https://github.com/denoland/deno/pull/32173))`performance.clearResourceTimings()`\n\nand`setResourceTimingBufferSize()`\n\nimplemented ([#31603](https://github.com/denoland/deno/pull/31603))`FileHandle.readableWebStream()`\n\nimplemented ([#31745](https://github.com/denoland/deno/pull/31745))`FileHandle.readv()`\n\nmethod added ([#31943](https://github.com/denoland/deno/pull/31943))- HTTP keepAlive connection reuse is now enabled for\n`node:http`\n\nAgent, reducing latency for repeated requests to the same host ([#31709](https://github.com/denoland/deno/pull/31709)) `node:test`\n\nmock API implemented ([#31954](https://github.com/denoland/deno/pull/31954))- Named pipe listen, connect, and open support\n(\n[#31624](https://github.com/denoland/deno/pull/31624))\n\nAPI changes\n\n`navigator.platform`\n\nThe `navigator.platform`\n\nproperty is now available in Deno, returning the\noperating system platform the runtime is running on. This improves compatibility\nwith web code and libraries that check `navigator.platform`\n\nfor\nplatform-specific behavior:\n\n```\nconsole.log(navigator.platform);\n// \"MacIntel\", \"Win32\", \"Linux x86_64\", etc.\n```\n\nBrotli support in `CompressionStream`\n\nand `DecompressionStream`\n\nThe web standard `CompressionStream`\n\nand `DecompressionStream`\n\nAPIs now support\nthe `\"brotli\"`\n\nformat alongside the existing `\"gzip\"`\n\nand `\"deflate\"`\n\n:\n\n``` js\nconst stream = new CompressionStream(\"brotli\");\nconst response = new Response(body.pipeThrough(stream));\n```\n\nBrotli typically achieves better compression ratios than gzip for text content.\n\n`FsFile.tryLock()`\n\nA new non-blocking file lock method. Unlike `lock()`\n\nwhich blocks until the lock\nis acquired, `tryLock()`\n\nreturns immediately with a boolean indicating whether\nthe lock was obtained:\n\n``` js\nconst file = await Deno.open(\"data.db\", { read: true, write: true });\n\nif (await file.tryLock(true)) {\n  // Exclusive lock acquired, safe to write\n  await file.write(data);\n  await file.unlock();\n} else {\n  console.log(\"File is locked by another process\");\n}\n```\n\nSHA3 support in `crypto.subtle`\n\nThe Web Crypto API now supports SHA3 hash algorithms (`SHA3-256`\n\n, `SHA3-384`\n\n,\n`SHA3-512`\n\n) for `generateKey`\n\n, `encrypt`\n\n, and `decrypt`\n\noperations with\nRSA-OAEP:\n\n``` js\nconst keyPair = await crypto.subtle.generateKey(\n  {\n    name: \"RSA-OAEP\",\n    modulusLength: 2048,\n    publicExponent: new Uint8Array([1, 0, 1]),\n    hash: \"SHA3-256\",\n  },\n  true,\n  [\"encrypt\", \"decrypt\"],\n);\n\nconst data = new TextEncoder().encode(\"Hello, Deno!\");\nconst encrypted = await crypto.subtle.encrypt(\n  { name: \"RSA-OAEP\" },\n  keyPair.publicKey,\n  data,\n);\nconst decrypted = await crypto.subtle.decrypt(\n  { name: \"RSA-OAEP\" },\n  keyPair.privateKey,\n  encrypted,\n);\n```\n\nGIF and WebP support for `createImageBitmap`\n\n`createImageBitmap`\n\nnow supports GIF and WebP image formats in addition to the\npreviously supported PNG, JPEG, and BMP:\n\n``` js\nconst res = await fetch(\"https://example.com/animation.webp\");\nconst blob = await res.blob();\nconst bitmap = await createImageBitmap(blob);\nconsole.log(`${bitmap.width}x${bitmap.height}`);\n```\n\nPackage manager improvements\n\n`deno create`\n\nDeno supported scaffolding projects from templates using `deno init`\n\nsubcommand.\nThis release adds a familiar `deno create`\n\nalias users might be familiar from\nother package managers.\n\n``` bash\n# From npm (resolves to create-vite)\n$ deno create npm:vite -- my-project\n```\n\nIt works with JSR packages as well - as long as the JSR package exports a\n`./create`\n\nentry point, you can use it as a template source:\n\n``` bash\n# From JSR (uses the ./create export)\n$ deno create jsr:@std/http\n```\n\n`deno install --compile`\n\nYou can now compile npm packages into standalone executables during global installation. Compiled executables are faster to start and don’t depend on a Deno installation:\n\n``` bash\n$ deno install --global --compile -A npm:@anthropic-ai/claude-code\n```\n\nThis produces a native binary that can be distributed and run without Deno .\n\n`--save-exact`\n\nfor `deno add`\n\nBy default, `deno add`\n\nsaves dependencies with a caret range (`^`\n\n), allowing\ncompatible updates. The new `--save-exact`\n\n(or `--exact`\n\n) flag pins to the exact\nversion instead. Useful when you need to pin a specific version or are working\nin environments where even minor version bumps need to be deliberate:\n\n``` bash\n$ deno add --save-exact npm:express\n# Adds \"express\": \"4.21.0\" instead of \"express\": \"^4.21.0\"\n```\n\nThis also works with `deno install`\n\n.\n\n`jsr:`\n\nscheme support in `package.json`\n\nYou can now use `jsr:`\n\nspecifiers directly in your `package.json`\n\ndependencies.\nThis means projects using `package.json`\n\ncan depend on JSR packages without\nneeding a `deno.json`\n\n:\n\n```\n{\n  \"dependencies\": {\n    \"@std/path\": \"jsr:^1.0.9\"\n  }\n}\n```\n\nThis works with `deno install`\n\nand brings JSR packages to any project that uses\n`package.json`\n\nfor dependency management.\n\n`deno audit --ignore`\n\nYou can now filter out known advisories by CVE ID when running `deno audit`\n\n.\nThis is useful for suppressing false positives or accepted risks in CI:\n\n``` bash\n$ deno audit --ignore=CVE-2024-12345,CVE-2024-67890\n```\n\nQuality of life improvements\n\n`deno compile --self-extracting`\n\n`deno compile`\n\ngains a `--self-extracting`\n\nflag. Instead of serving files from\nan in-memory virtual file system, the compiled binary extracts all embedded\nfiles to disk on first run and uses real file system operations at runtime.\n\nThis unlocks full Node API support for compiled binaries, including native\naddons that need real files on disk. The extraction directory is chosen\nautomatically: next to the binary if writable, otherwise in the platform’s data\ndirectory (`~/.local/share/`\n\non Linux, `~/Library/Application Support/`\n\non\nmacOS, `%LOCALAPPDATA%`\n\non Windows):\n\n``` bash\n$ deno compile --self-extracting -A main.ts -o my-app\n$ ./my-app  # Extracts embedded files on first run, then executes\n```\n\n`deno task`\n\nimprovements\n\nDeno’s built-in task runner shell becomes more configurable in this release. You\ncan now turn on `pipefail`\n\n:\n\n```\n{\n  \"tasks\": {\n    \"lint\": \"set -o pipefail && deno lint **/*.ts | tee lint-output.txt\"\n  }\n}\n```\n\nYou can also control glob behavior with `shopt`\n\n: `nullglob`\n\n, `failglob`\n\n, and\n`globstar`\n\nare all configurable.\n\nAdditionally, we turned off `failglob`\n\nby default in order to match bash’s\ndefaults. `failglob`\n\ncaused too many issues. For example, urls with query\nparameters would cause an error due to `?`\n\nnot matching a file on the file\nsystem.\n\n`deno check --check-js`\n\nIf you have a JavaScript-only project and want to type-check it with Deno, you\npreviously had to either add `// @ts-check`\n\nto every file or set\n`compilerOptions.checkJs`\n\nin your `deno.json`\n\n. The new `--check-js`\n\nflag lets\nyou do it in a single command with no config changes:\n\n``` bash\n$ deno check --check-js main.js\n```\n\nFail fast for `deno fmt`\n\nStop on the first unformatted file instead of reporting all of them. Useful in large codebases in CI where you just need to know if something is off.\n\n``` bash\n$ deno fmt --check --fail-fast\n```\n\nChrome DevTools and VSCode debugging improvements\n\nDeno 2.7 brings significant improvements to the debugging experience. You can\nnow debug Web Workers through both Chrome DevTools and VSCode. Previously only\nthe main thread was debuggable. The implementation supports Chrome’s `Target.*`\n\ndomain and VSCode’s `NodeWorker.*`\n\ndomain, so workers appear automatically in\nwhichever debugger you use.\n\nThe `--inspect`\n\nflag now accepts bare hosts and bare ports, matching Node.js\nbehavior:\n\n``` bash\n$ deno run --inspect=9229 main.ts         # 127.0.0.1:9229\n$ deno run --inspect=192.168.0.1 main.ts  # 192.168.0.1:9229\n$ deno run --inspect=:0 main.ts           # OS-assigned port\n```\n\nA new `--inspect-publish-uid`\n\nflag has also been added to support VSCode’s\ndebugging infrastructure, allowing VSCode to use the same debugging setup for\nboth Node.js and Deno projects.\n\n`deno upgrade`\n\ncache\n\nDownloaded Deno binaries are now cached under `$DENO_DIR/dl/`\n\nduring\n`deno upgrade`\n\n. If you upgrade to the same version again (e.g. on a different\nmachine profile or after a rollback), the cached archive is reused instead of\nre-downloading. For canary builds, old cache entries are automatically pruned,\nkeeping only the 10 most recent.\n\nIf the cache grows too large, `deno clean`\n\nwill remove it along with other\ncached data.\n\nOpenTelemetry for Deno Cron\n\n`Deno.cron`\n\njobs are now automatically instrumented with OpenTelemetry. Each\ncron invocation emits spans with the job name and execution status, so you get\nobservability out of the box when using an OTEL-compatible backend.\n\n`deno upgrade`\n\nchecksum verification\n\nYou can now verify a `deno upgrade`\n\ndownload against a known checksum using the\nnew `--checksum`\n\nflag. This is useful for CI pipelines and security-conscious\nenvironments where you want to ensure the binary hasn’t been tampered with:\n\n``` bash\n$ deno upgrade --checksum=<sha256-hash> 2.7.0\n```\n\nSHA-256 checksums for each platform are published as `.sha256sum`\n\nfiles\nalongside the release archives on the\n[GitHub releases page](https://github.com/denoland/deno/releases). You can fetch\nthe checksum for your platform like this:\n\n``` bash\n# Fetch the SHA-256 checksum for Linux x86_64\n$ curl -sL https://github.com/denoland/deno/releases/download/v2.7.0/deno-x86_64-unknown-linux-gnu.zip.sha256sum\n```\n\n`SSLKEYLOGFILE`\n\nsupport\n\nSet the `SSLKEYLOGFILE`\n\nenvironment variable to log TLS session keys to a file,\nenabling traffic inspection with tools like Wireshark for debugging encrypted\nconnections:\n\n``` bash\n$ SSLKEYLOGFILE=./keys.log deno run --allow-net main.ts\n# Now open keys.log in Wireshark to decrypt captured TLS traffic\n```\n\nV8 14.5\n\nDeno 2.7 upgrades the V8 engine to version 14.5, bringing the latest performance improvements, bug fixes, and new JavaScript features from the V8 team.\n\nAcknowledgments\n\nWe couldn’t build Deno without the help of our community! Whether by answering\nquestions in our community [Discord server](https://discord.gg/deno) or\n[reporting bugs](https://github.com/denoland/deno/issues), we are incredibly\ngrateful for your support. In particular, we’d like to thank the following\npeople for their contributions to Deno 2.7: Amol Yadav, Andy Bodnar, AprilNEA,\nAsher Gomez, Ayu, Bedis Nbiba, Chase Knowlden, Christian Svensson, cui,\nddmoney420, Florian Schwalm, Gitoffthelawn, Hajime-san, Haruto, intelliking,\niownbey, it-education-md, James Bronder, Jeff Wilson, John Downey, Jose\nFernandez, kantrolv, Kenta Moriuchi, kookyleo, Kyle Tse, Lee Dogeon, lif, Mahesh\nThakur, Mert Can Altin, MkDev11, Padraic Slattery, Pietro Marchini, Ramnivas\nLaddad, Ryan Lahman, scarf, Takuro Kitahara, TarikSogukpinar, Tu Shaokun, ud2,\nand Varun Chawla.\n\nWould you like to join the ranks of Deno contributors?\n[Check out our contribution docs here](https://docs.deno.com/runtime/manual/references/contributing),\nand we’ll see you on the list next time.\n\nBelieve it or not, the changes listed above still don’t tell you everything that\ngot better in 2.7. You can view the\n[full list of pull requests merged in Deno 2.7 on GitHub](https://github.com/denoland/deno/releases/tag/v2.7.0).\n\nThank you for catching up with our 2.7 release, and we hope you love building with Deno!", "url": "https://wpnews.pro/news/deno-2-7-temporal-api-windows-arm-and-npm-overrides", "canonical_source": "https://deno.com/blog/v2.7", "published_at": "2026-02-25 09:00:00+00:00", "updated_at": "2026-05-22 12:18:44.529526+00:00", "lang": "en", "topics": ["developer-tools", "open-source", "products"], "entities": ["Deno", "V8", "Chrome", "Windows", "ARM", "Surface Pro X", "Lenovo ThinkPad X13s", "Snapdragon"], "alternates": {"html": "https://wpnews.pro/news/deno-2-7-temporal-api-windows-arm-and-npm-overrides", "markdown": "https://wpnews.pro/news/deno-2-7-temporal-api-windows-arm-and-npm-overrides.md", "text": "https://wpnews.pro/news/deno-2-7-temporal-api-windows-arm-and-npm-overrides.txt", "jsonld": "https://wpnews.pro/news/deno-2-7-temporal-api-windows-arm-and-npm-overrides.jsonld"}}