From cd4f111228d32e3b98e07e959a12e6168b20697c Mon Sep 17 00:00:00 2001 From: christophe dervieux Date: Mon, 11 May 2026 16:24:14 +0200 Subject: [PATCH 1/6] chore: bump deno to v2.7.14 --- configuration | 2 +- src/command/check/check.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/configuration b/configuration index 713050cc65c..e70824da128 100644 --- a/configuration +++ b/configuration @@ -10,7 +10,7 @@ # IMPORTANT: When these are updated, you must also update the versions # in src/command/check/check.ts # Binary dependencies -export DENO=v2.4.5 +export DENO=v2.7.14 # TODO figure out where 0.1.41 apple silicon libs are available export DENO_DOM=v0.1.41-alpha-artifacts export PANDOC=3.8.3 diff --git a/src/command/check/check.ts b/src/command/check/check.ts index 9fd47ba9f59..dce5c9c8bbb 100644 --- a/src/command/check/check.ts +++ b/src/command/check/check.ts @@ -246,7 +246,7 @@ async function checkVersions(conf: CheckConfiguration) { const versionConstraints: [string | undefined, string, string][] = [ [pandocVersion, "3.8.3", "Pandoc"], [sassVersion, "1.87.0", "Dart Sass"], - [denoVersion, "2.4.5", "Deno"], + [denoVersion, "2.7.14", "Deno"], [typstVersion, "0.14.2", "Typst"], ]; const checkData: [string | undefined, string, string][] = versionConstraints From 3ed1a842bad5a744ba3ae4dafc1043f96338e53e Mon Sep 17 00:00:00 2001 From: christophe dervieux Date: Mon, 11 May 2026 17:26:52 +0200 Subject: [PATCH 2/6] fix(types): adjust for deno 2.7.14 TS stricter typing Deno 2.7.14 bundles TypeScript 5.9.2 with tightened generics (Uint8Array vs ) and resolves the bare 'path' specifier's types via node:path compat instead of the import-map target. Add a non-colliding '@std/path' alias for named imports of SEPARATOR/fromFileUrl/etc., and cast Uint8Array at Response/digest call sites where the new BufferSource/BodyInit signatures require an ArrayBuffer-backed view. --- src/core/deno-dom.ts | 8 ++++++-- src/core/hash.ts | 2 +- src/core/http.ts | 4 ++-- src/core/path.ts | 2 +- src/deno_ral/path.ts | 19 +++++++++++++------ src/import_map.json | 1 + 6 files changed, 24 insertions(+), 12 deletions(-) diff --git a/src/core/deno-dom.ts b/src/core/deno-dom.ts index 2e5952e38f0..890acab1a78 100644 --- a/src/core/deno-dom.ts +++ b/src/core/deno-dom.ts @@ -151,11 +151,15 @@ export async function initDenoDom() { }; const parse = (html: string): string => { - return genericParse(dylibParseSync, html); + return genericParse(dylibParseSync as DocumentParser, html); }; const parseFrag = (html: string, contextLocalName?: string): string => { - return genericParse(dylibParseFragSync, html, contextLocalName); + return genericParse( + dylibParseFragSync as FragmentParser, + html, + contextLocalName, + ); }; debug("Loaded deno-dom-native"); diff --git a/src/core/hash.ts b/src/core/hash.ts index 41078f267c4..976faabe625 100644 --- a/src/core/hash.ts +++ b/src/core/hash.ts @@ -19,7 +19,7 @@ export async function md5HashAsync(content: string) { export async function md5HashBytes(content: Uint8Array) { const buffer = await crypto.subtle.digest( "MD5", - content, + content as BufferSource, ); return Array.from(new Uint8Array(buffer)) .map((b) => b.toString(16).padStart(2, "0")) diff --git a/src/core/http.ts b/src/core/http.ts index d90f47793be..a4b04ff6f2a 100644 --- a/src/core/http.ts +++ b/src/core/http.ts @@ -87,7 +87,7 @@ export function httpFileRequestHandler( printUrl(url, false); } return Promise.resolve( - new Response(handle404.response.body, { + new Response(handle404.response.body as BodyInit, { status: 404, headers: { "Content-Type": kTextHtml, @@ -180,7 +180,7 @@ export function httpContentResponse( headers.set("Content-Type", contentType); } headers.set("Cache-Control", "no-store, max-age=0"); - return new Response(content, { + return new Response(content as BodyInit, { status: 200, headers, }); diff --git a/src/core/path.ts b/src/core/path.ts index a2132b0fc90..fab741516cc 100644 --- a/src/core/path.ts +++ b/src/core/path.ts @@ -324,7 +324,7 @@ export function normalizePath(path: string | URL): string { file = normalize(file); // some runtimes (e.g. nodejs) create paths w/ lowercase drive // letters, make those uppercase - return file.replace(/^\w:\\/, (m) => m[0].toUpperCase() + ":\\"); + return file.replace(/^\w:\\/, (m: string) => m[0].toUpperCase() + ":\\"); } // Moved here from env.ts to avoid circular dependency diff --git a/src/deno_ral/path.ts b/src/deno_ral/path.ts index 994c0b4071d..1b57b0dc785 100644 --- a/src/deno_ral/path.ts +++ b/src/deno_ral/path.ts @@ -7,19 +7,26 @@ import * as path from "path"; import { normalize as posixNormalize } from "path/posix"; -export const SEP = path.SEPARATOR; -export const SEP_PATTERN = path.SEPARATOR_PATTERN; +// Re-export named members from @std/path. The bare "path" specifier resolves +// at runtime via the import map but Deno's TS checker resolves its types via +// node:path compat, which lacks SEPARATOR, fromFileUrl, etc. Importing from +// "@std/path" (a non-colliding alias) preserves correct typings. +export { + fromFileUrl, + globToRegExp, + isGlob, + SEPARATOR as SEP, + SEPARATOR_PATTERN as SEP_PATTERN, + toFileUrl, +} from "@std/path"; + export const basename = path.basename; export const extname = path.extname; export const dirname = path.dirname; -export const fromFileUrl = path.fromFileUrl; -export const globToRegExp = path.globToRegExp; export const isAbsolute = path.isAbsolute; export const join = path.join; export const relative = path.relative; export const resolve = path.resolve; export const normalize = path.normalize; -export const toFileUrl = path.toFileUrl; -export const isGlob = path.isGlob; export const posix = { normalize: posixNormalize }; diff --git a/src/import_map.json b/src/import_map.json index 684472eb319..db814becd85 100644 --- a/src/import_map.json +++ b/src/import_map.json @@ -9,6 +9,7 @@ "http/": "jsr:/@std/http@1.0.14/", "path": "jsr:@std/path@1.0.8", "path/posix": "jsr:@std/path@1.0.8/posix", + "@std/path": "jsr:@std/path@1.0.8", "streams/": "jsr:/@std/streams@1.0.9/", "tar": "jsr:/@std/tar@0.1.6", "tar/": "jsr:/@std/tar@0.1.6/", From 18799084cc4a9f07594c3d596f7287189c8f4323 Mon Sep 17 00:00:00 2001 From: christophe dervieux Date: Mon, 11 May 2026 17:39:41 +0200 Subject: [PATCH 3/6] chore: update conda-forge deno hash for 2.7.14 --- .github/workflows/create-release.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 12ec4f5a757..04ebc42003e 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -224,10 +224,10 @@ jobs: source ./configuration - echo Placing custom Deno ${DENO:1}. See available versions at https://anaconda.org/conda-forge/deno/files hbf66b88_0 - curl -L https://anaconda.org/conda-forge/deno/${DENO:1}/download/linux-64/deno-${DENO:1}-hbf66b88_0.conda --output deno.conda + echo Placing custom Deno ${DENO:1}. See available versions at https://anaconda.org/conda-forge/deno/files h6046fbb_0 + curl -L https://anaconda.org/conda-forge/deno/${DENO:1}/download/linux-64/deno-${DENO:1}-h6046fbb_0.conda --output deno.conda unzip deno.conda - tar --use-compress-program=unzstd -xvf pkg-deno-${DENO:1}-hbf66b88_0.tar.zst + tar --use-compress-program=unzstd -xvf pkg-deno-${DENO:1}-h6046fbb_0.tar.zst cp bin/deno package/pkg-working/bin/tools/x86_64/deno - name: Make Tarball From 51580b7bfc316c8656e6ef9cc65f31794f08d071 Mon Sep 17 00:00:00 2001 From: christophe dervieux Date: Mon, 11 May 2026 17:40:50 +0200 Subject: [PATCH 4/6] docs(dev): fix stale deno upgrade instructions --- dev-docs/upgrade-dependencies.md | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/dev-docs/upgrade-dependencies.md b/dev-docs/upgrade-dependencies.md index 6c888c15c87..bd660c73c2d 100644 --- a/dev-docs/upgrade-dependencies.md +++ b/dev-docs/upgrade-dependencies.md @@ -1,16 +1,16 @@ Change version numbers in `./configuration` to correspond to new versions. -Contact Carlos so he uploads the binaries to the S3 bucket. +Update hardcoded version strings in `src/command/check/check.ts` (`versionConstraints` array, ~line 249) so that they match the new versions in `configuration`. The `configuration` file warns about this in a comment. ## Upgrade deno ### Upgrade standard library -- run `./configure.sh` to locally install all dependencies. +- run `./configure.sh` (Linux/macOS) or `./configure.cmd` (Windows) to locally install all dependencies against the new Deno binary. -- In `src/import_map.json`, change the version number of the imports like `https://deno.land/std@0.204.0/archive` to the new version number (e.g. `0.205.0`). +- `src/import_map.json` has migrated to JSR (`jsr:/@std/@` entries). If `configure` errors with `Module not found: jsr:/@std/...`, bump only the specific `@std` package(s) named in the error to a compatible version on . Otherwise, leave `src/import_map.json` alone — historical pattern is reactive (no pre-emptive bumps). -- run `./configure.sh`. +- run `./configure.sh` / `./configure.cmd` again. Bumping a version in `src/import_map.json` (or any of the other keyed files) automatically invalidates the CI Deno cache on next run. See [ci-deno-caching.md](ci-deno-caching.md) for the key composition and how to force invalidation manually. @@ -19,11 +19,14 @@ Bumping a version in `src/import_map.json` (or any of the other keyed files) aut - Go to and find the version of Deno required. - BTW those versions are built at - Take the hash part of the download link for linux-64 (e.g. `hcab8b69_0` for `linux-64/deno-1.46.3-hcab8b69_0.conda`) -- Use it in the build release action: `.github\workflows\create-release.yml` at the step `- name: Move Custom Deno` +- Use it in the build release action: `.github\workflows\create-release.yml` at the step `- name: Move Custom Deno`. The hash appears in **three places** inside that step (echo line, curl line, tar line). All three must be updated. ``` echo Placing custom Deno ${DENO:1}. See available versions at https://anaconda.org/conda-forge/deno/files curl -L https://anaconda.org/conda-forge/deno/${DENO:1}/download/linux-64/deno-${DENO:1}-hcab8b69_0.conda --output deno.conda + unzip deno.conda + tar --use-compress-program=unzstd -xvf pkg-deno-${DENO:1}-hcab8b69_0.tar.zst ``` +- The `make-tarball-rhel` job that wraps these steps may carry `if: false` for unrelated reasons; the hash is updated for forward consistency even while the job is disabled. - Commit the `create-release.yml` ## Upgrade mermaidjs From 7710811412060c2785a155687bd7caabbf26aae1 Mon Sep 17 00:00:00 2001 From: christophe dervieux Date: Mon, 11 May 2026 17:41:20 +0200 Subject: [PATCH 5/6] docs(changelog): note deno 2.7.14 upgrade --- news/changelog-1.10.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/news/changelog-1.10.md b/news/changelog-1.10.md index fb34c2e35bc..42db147961f 100644 --- a/news/changelog-1.10.md +++ b/news/changelog-1.10.md @@ -8,6 +8,10 @@ All changes included in 1.10: - ([#14489](https://github.com/quarto-dev/quarto-cli/issues/14489)): Restore `--output-dir` support for `quarto preview` of single files when no `_quarto.yml` is present (e.g. R-package workspaces). Regression introduced in v1.9.18. - ([rstudio/rstudio#17333](https://github.com/rstudio/rstudio/issues/17333)): Fix `quarto inspect` on standalone files emitting project metadata that breaks RStudio's publishing wizard. +## Dependencies + +- ([#14291](https://github.com/quarto-dev/quarto-cli/issues/14291)): Update `deno` to v2.7.14 (fixes silent crash on Windows builds older than 16299). + ## Accessibility - ([#14468](https://github.com/quarto-dev/quarto-cli/issues/14468)): The `axe` accessibility report UI (HTML overlay, revealjs report slide, dashboard offcanvas) now uses its own theme-independent colors instead of inheriting from `brand` or theme. Keeps the report readable regardless of page styling, and stops `axe` from clobbering brand colors set via `_brand.yml`. From 52dff2eb01398b988b5e599316770f63e0c1cafc Mon Sep 17 00:00:00 2001 From: christophe dervieux Date: Mon, 11 May 2026 17:50:47 +0200 Subject: [PATCH 6/6] docs(dev): show hash in all three example lines Prose said the hash appears in three places (echo, curl, tar) but the example block only showed it on curl + tar, contradicting the prose. --- dev-docs/upgrade-dependencies.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/upgrade-dependencies.md b/dev-docs/upgrade-dependencies.md index bd660c73c2d..ad8567ee6ba 100644 --- a/dev-docs/upgrade-dependencies.md +++ b/dev-docs/upgrade-dependencies.md @@ -21,7 +21,7 @@ Bumping a version in `src/import_map.json` (or any of the other keyed files) aut - Take the hash part of the download link for linux-64 (e.g. `hcab8b69_0` for `linux-64/deno-1.46.3-hcab8b69_0.conda`) - Use it in the build release action: `.github\workflows\create-release.yml` at the step `- name: Move Custom Deno`. The hash appears in **three places** inside that step (echo line, curl line, tar line). All three must be updated. ``` - echo Placing custom Deno ${DENO:1}. See available versions at https://anaconda.org/conda-forge/deno/files + echo Placing custom Deno ${DENO:1}. See available versions at https://anaconda.org/conda-forge/deno/files hcab8b69_0 curl -L https://anaconda.org/conda-forge/deno/${DENO:1}/download/linux-64/deno-${DENO:1}-hcab8b69_0.conda --output deno.conda unzip deno.conda tar --use-compress-program=unzstd -xvf pkg-deno-${DENO:1}-hcab8b69_0.tar.zst