From 4dbd545304d1a8af903c8c97f237eb55c988c40b Mon Sep 17 00:00:00 2001 From: Juraj Kapsz Date: Mon, 15 Apr 2024 10:52:39 +0200 Subject: [PATCH 01/36] fix: picture fallback check (#10783) --- .changeset/modern-mugs-raise.md | 5 +++++ packages/astro/components/Picture.astro | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/modern-mugs-raise.md diff --git a/.changeset/modern-mugs-raise.md b/.changeset/modern-mugs-raise.md new file mode 100644 index 0000000000..0796acf9f8 --- /dev/null +++ b/.changeset/modern-mugs-raise.md @@ -0,0 +1,5 @@ +--- +"astro": patch +--- + +Fixes Picture component specialFormatsFallback fallback check diff --git a/packages/astro/components/Picture.astro b/packages/astro/components/Picture.astro index f23ab6ccce..6dcc50c8e1 100644 --- a/packages/astro/components/Picture.astro +++ b/packages/astro/components/Picture.astro @@ -45,7 +45,7 @@ let resultFallbackFormat = fallbackFormat ?? defaultFallbackFormat; if ( !fallbackFormat && isESMImportedImage(originalSrc) && - originalSrc.format in specialFormatsFallback + (specialFormatsFallback as ReadonlyArray).includes(originalSrc.format) ) { resultFallbackFormat = originalSrc.format; } From 1607face67051b16d4648555f1001b2a9308e377 Mon Sep 17 00:00:00 2001 From: Farzad Date: Mon, 15 Apr 2024 04:54:42 -0400 Subject: [PATCH 02/36] Fix @types/cookie dependency (#10776) Co-authored-by: Florian Lefebvre --- .changeset/brown-news-roll.md | 5 +++++ packages/astro/package.json | 2 +- pnpm-lock.yaml | 8 ++++---- 3 files changed, 10 insertions(+), 5 deletions(-) create mode 100644 .changeset/brown-news-roll.md diff --git a/.changeset/brown-news-roll.md b/.changeset/brown-news-roll.md new file mode 100644 index 0000000000..ff57e1bc40 --- /dev/null +++ b/.changeset/brown-news-roll.md @@ -0,0 +1,5 @@ +--- +"astro": patch +--- + +Fixes cookies type inference diff --git a/packages/astro/package.json b/packages/astro/package.json index 0c3935e3f9..b2c1ed99cb 100644 --- a/packages/astro/package.json +++ b/packages/astro/package.json @@ -125,6 +125,7 @@ "@babel/traverse": "^7.23.3", "@babel/types": "^7.23.3", "@types/babel__core": "^7.20.4", + "@types/cookie": "^0.5.4", "acorn": "^8.11.2", "aria-query": "^5.3.0", "axobject-query": "^4.0.0", @@ -189,7 +190,6 @@ "@types/chai": "^4.3.10", "@types/common-ancestor-path": "^1.0.2", "@types/connect": "^3.4.38", - "@types/cookie": "^0.5.4", "@types/cssesc": "^3.0.2", "@types/debug": "^4.1.12", "@types/diff": "^5.0.8", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d6c25470b4..93da521048 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -536,6 +536,9 @@ importers: '@types/babel__core': specifier: ^7.20.4 version: 7.20.5 + '@types/cookie': + specifier: ^0.5.4 + version: 0.5.4 acorn: specifier: ^8.11.2 version: 8.11.3 @@ -718,9 +721,6 @@ importers: '@types/connect': specifier: ^3.4.38 version: 3.4.38 - '@types/cookie': - specifier: ^0.5.4 - version: 0.5.4 '@types/cssesc': specifier: ^3.0.2 version: 3.0.2 @@ -8092,7 +8092,7 @@ packages: /@types/cookie@0.5.4: resolution: {integrity: sha512-7z/eR6O859gyWIAjuvBWFzNURmf2oPBmJlfVWkwehU5nzIyjwBsTh7WMmEEV4JFnHuQ3ex4oyTvfKzcyJVDBNA==} - dev: true + dev: false /@types/cssesc@3.0.2: resolution: {integrity: sha512-Qii6nTRktvtI380EloxH/V7MwgrYxkPgBI+NklUjQuhzgAd1AqT3QDJd+eD+0doRADgfwvtagLRo7JFa7aMHXg==} From 699f4559a279b374bddb3e5e48c72afe2709e8e7 Mon Sep 17 00:00:00 2001 From: Martin Trapp <94928215+martrapp@users.noreply.github.com> Date: Mon, 15 Apr 2024 10:58:40 +0200 Subject: [PATCH 03/36] Make viewTransition.finished wait for animations triggered by viewTransition.ready (#10787) --- .changeset/stupid-countries-warn.md | 5 +++++ packages/astro/src/transitions/router.ts | 4 +++- 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 .changeset/stupid-countries-warn.md diff --git a/.changeset/stupid-countries-warn.md b/.changeset/stupid-countries-warn.md new file mode 100644 index 0000000000..27eeea281d --- /dev/null +++ b/.changeset/stupid-countries-warn.md @@ -0,0 +1,5 @@ +--- +"astro": patch +--- + +Fixes a timing issue in the view transition simulation. diff --git a/packages/astro/src/transitions/router.ts b/packages/astro/src/transitions/router.ts index 0084a9d74e..e65b613c93 100644 --- a/packages/astro/src/transitions/router.ts +++ b/packages/astro/src/transitions/router.ts @@ -396,8 +396,10 @@ async function updateDOM( const style = window.getComputedStyle(effect.target, effect.pseudoElement); return style.animationIterationCount === 'infinite'; } - // Trigger the animations const currentAnimations = document.getAnimations(); + // allow animations triggered by viewTransition.ready to start + await new Promise((r)=>setTimeout(r)); + // Trigger view transition animations waiting for data-astro-transition-fallback document.documentElement.setAttribute(OLD_NEW_ATTR, phase); const nextAnimations = document.getAnimations(); const newAnimations = nextAnimations.filter( From 01cb41763e74d504c835d3f628ba51bce2b33756 Mon Sep 17 00:00:00 2001 From: Martin Trapp Date: Mon, 15 Apr 2024 08:59:52 +0000 Subject: [PATCH 04/36] [ci] format --- packages/astro/src/transitions/router.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/astro/src/transitions/router.ts b/packages/astro/src/transitions/router.ts index e65b613c93..e0ffb4d7ee 100644 --- a/packages/astro/src/transitions/router.ts +++ b/packages/astro/src/transitions/router.ts @@ -398,7 +398,7 @@ async function updateDOM( } const currentAnimations = document.getAnimations(); // allow animations triggered by viewTransition.ready to start - await new Promise((r)=>setTimeout(r)); + await new Promise((r) => setTimeout(r)); // Trigger view transition animations waiting for data-astro-transition-fallback document.documentElement.setAttribute(OLD_NEW_ATTR, phase); const nextAnimations = document.getAnimations(); From 06843121450899ecf0390ca4efaff6c9a6fe0f75 Mon Sep 17 00:00:00 2001 From: Erika <3019731+Princesseuh@users.noreply.github.com> Date: Mon, 15 Apr 2024 05:06:30 -0400 Subject: [PATCH 05/36] fix(assets): Forward headers from the original request to the internal request to the image (#10775) --- .changeset/rich-spoons-fold.md | 5 +++++ packages/astro/src/assets/endpoint/generic.ts | 14 +++++++++----- 2 files changed, 14 insertions(+), 5 deletions(-) create mode 100644 .changeset/rich-spoons-fold.md diff --git a/.changeset/rich-spoons-fold.md b/.changeset/rich-spoons-fold.md new file mode 100644 index 0000000000..217562a24c --- /dev/null +++ b/.changeset/rich-spoons-fold.md @@ -0,0 +1,5 @@ +--- +"astro": patch +--- + +Fixes assets endpoint in serverless returning 404 in certain situations where the website might be under a protected route diff --git a/packages/astro/src/assets/endpoint/generic.ts b/packages/astro/src/assets/endpoint/generic.ts index 22b15446da..5c51f65755 100644 --- a/packages/astro/src/assets/endpoint/generic.ts +++ b/packages/astro/src/assets/endpoint/generic.ts @@ -7,9 +7,12 @@ import { isRemoteAllowed } from '../utils/remotePattern.js'; // @ts-expect-error import { imageConfig } from 'astro:assets'; -async function loadRemoteImage(src: URL) { +async function loadRemoteImage(src: URL, headers: Headers) { try { - const res = await fetch(src); + const res = await fetch(src, { + // Forward all headers from the original request + headers, + }); if (!res.ok) { return undefined; @@ -41,15 +44,16 @@ export const GET: APIRoute = async ({ request }) => { let inputBuffer: ArrayBuffer | undefined = undefined; - const sourceUrl = isRemotePath(transform.src) + const isRemoteImage = isRemotePath(transform.src); + const sourceUrl = isRemoteImage ? new URL(transform.src) : new URL(transform.src, url.origin); - if (isRemotePath(transform.src) && isRemoteAllowed(transform.src, imageConfig) === false) { + if (isRemoteImage && isRemoteAllowed(transform.src, imageConfig) === false) { return new Response('Forbidden', { status: 403 }); } - inputBuffer = await loadRemoteImage(sourceUrl); + inputBuffer = await loadRemoteImage(sourceUrl, isRemoteImage ? new Headers() : request.headers); if (!inputBuffer) { return new Response('Not Found', { status: 404 }); From af1af9faeec967ff79009721b6bbe09350bc085b Mon Sep 17 00:00:00 2001 From: Erika Date: Mon, 15 Apr 2024 09:07:35 +0000 Subject: [PATCH 06/36] [ci] format --- packages/astro/src/assets/endpoint/generic.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/astro/src/assets/endpoint/generic.ts b/packages/astro/src/assets/endpoint/generic.ts index 5c51f65755..3dd5140cf1 100644 --- a/packages/astro/src/assets/endpoint/generic.ts +++ b/packages/astro/src/assets/endpoint/generic.ts @@ -45,9 +45,7 @@ export const GET: APIRoute = async ({ request }) => { let inputBuffer: ArrayBuffer | undefined = undefined; const isRemoteImage = isRemotePath(transform.src); - const sourceUrl = isRemoteImage - ? new URL(transform.src) - : new URL(transform.src, url.origin); + const sourceUrl = isRemoteImage ? new URL(transform.src) : new URL(transform.src, url.origin); if (isRemoteImage && isRemoteAllowed(transform.src, imageConfig) === false) { return new Response('Forbidden', { status: 403 }); From b0589d05538fcc77dd3c38198bf93f3548362cd8 Mon Sep 17 00:00:00 2001 From: Meghan Denny Date: Mon, 15 Apr 2024 02:12:07 -0700 Subject: [PATCH 07/36] astro/cli/install-package.ts: whichPm may return null if ran in an empty directory (#10782) --- .changeset/many-hairs-jump.md | 5 +++++ packages/astro/src/cli/install-package.ts | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/many-hairs-jump.md diff --git a/.changeset/many-hairs-jump.md b/.changeset/many-hairs-jump.md new file mode 100644 index 0000000000..2e855708fb --- /dev/null +++ b/.changeset/many-hairs-jump.md @@ -0,0 +1,5 @@ +--- +"astro": patch +--- + +Handles possible null value when calling `which-pm` during dynamic package installation diff --git a/packages/astro/src/cli/install-package.ts b/packages/astro/src/cli/install-package.ts index 02e8568464..7c8601e48a 100644 --- a/packages/astro/src/cli/install-package.ts +++ b/packages/astro/src/cli/install-package.ts @@ -101,7 +101,7 @@ async function installPackage( logger: Logger ): Promise { const cwd = options.cwd ?? process.cwd(); - const packageManager = (await whichPm(cwd)).name ?? 'npm'; + const packageManager = (await whichPm(cwd))?.name ?? 'npm'; const installCommand = getInstallCommand(packageNames, packageManager); if (!installCommand) { From b2ef6abfffbd56191115bc5788b8753d2bcdac28 Mon Sep 17 00:00:00 2001 From: "Houston (Bot)" <108291165+astrobot-houston@users.noreply.github.com> Date: Mon, 15 Apr 2024 06:13:11 -0700 Subject: [PATCH 08/36] [ci] update lockfile (#10791) Co-authored-by: matthewp --- pnpm-lock.yaml | 777 ++++++++++++++++++++++++------------------------- 1 file changed, 377 insertions(+), 400 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 93da521048..4c6f41b770 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -35,7 +35,7 @@ importers: version: 3.0.2 '@types/node': specifier: ^18.17.8 - version: 18.19.30 + version: 18.19.31 esbuild: specifier: ^0.19.6 version: 0.19.12 @@ -207,16 +207,16 @@ importers: version: link:../../packages/integrations/vue '@types/react': specifier: ^18.2.37 - version: 18.2.74 + version: 18.2.78 '@types/react-dom': specifier: ^18.2.15 - version: 18.2.24 + version: 18.2.25 astro: specifier: ^4.6.1 version: link:../../packages/astro preact: specifier: ^10.19.2 - version: 10.20.1 + version: 10.20.2 react: specifier: ^18.2.0 version: 18.2.0 @@ -228,7 +228,7 @@ importers: version: 1.8.16 svelte: specifier: ^4.2.5 - version: 4.2.12 + version: 4.2.14 vue: specifier: ^3.3.8 version: 3.4.21(typescript@5.2.2) @@ -240,13 +240,13 @@ importers: version: link:../../packages/integrations/preact '@preact/signals': specifier: ^1.2.1 - version: 1.2.1(preact@10.20.1) + version: 1.2.1(preact@10.20.2) astro: specifier: ^4.6.1 version: link:../../packages/astro preact: specifier: ^10.19.2 - version: 10.20.1 + version: 10.20.2 examples/framework-react: dependencies: @@ -255,10 +255,10 @@ importers: version: link:../../packages/integrations/react '@types/react': specifier: ^18.2.37 - version: 18.2.74 + version: 18.2.78 '@types/react-dom': specifier: ^18.2.15 - version: 18.2.24 + version: 18.2.25 astro: specifier: ^4.6.1 version: link:../../packages/astro @@ -291,7 +291,7 @@ importers: version: link:../../packages/astro svelte: specifier: ^4.2.5 - version: 4.2.12 + version: 4.2.14 examples/framework-vue: dependencies: @@ -367,7 +367,7 @@ importers: version: link:../../packages/astro svelte: specifier: ^4.2.5 - version: 4.2.12 + version: 4.2.14 examples/starlog: dependencies: @@ -376,7 +376,7 @@ importers: version: link:../../packages/astro sass: specifier: ^1.69.5 - version: 1.74.1 + version: 1.75.0 sharp: specifier: ^0.32.6 version: 0.32.6 @@ -445,7 +445,7 @@ importers: version: link:../../packages/astro preact: specifier: ^10.19.2 - version: 10.20.1 + version: 10.20.2 examples/with-nanostores: dependencies: @@ -454,7 +454,7 @@ importers: version: link:../../packages/integrations/preact '@nanostores/preact': specifier: ^0.5.0 - version: 0.5.1(nanostores@0.9.5)(preact@10.20.1) + version: 0.5.1(nanostores@0.9.5)(preact@10.20.2) astro: specifier: ^4.6.1 version: link:../../packages/astro @@ -463,7 +463,7 @@ importers: version: 0.9.5 preact: specifier: ^10.19.2 - version: 10.20.1 + version: 10.20.2 examples/with-tailwindcss: dependencies: @@ -499,7 +499,7 @@ importers: version: link:../../packages/astro vitest: specifier: ^1.3.1 - version: 1.4.0(@types/node@18.19.30) + version: 1.5.0(@types/node@18.19.31) packages/astro: dependencies: @@ -658,7 +658,7 @@ importers: version: 7.6.0 shiki: specifier: ^1.1.2 - version: 1.2.4 + version: 1.3.0 string-width: specifier: ^7.0.0 version: 7.1.0 @@ -676,7 +676,7 @@ importers: version: 6.0.1 vite: specifier: ^5.1.4 - version: 5.2.8(@types/node@18.19.30)(sass@1.74.1) + version: 5.2.8(@types/node@18.19.31)(sass@1.75.0) vitefu: specifier: ^0.2.5 version: 0.2.5(vite@5.2.8) @@ -786,7 +786,7 @@ importers: version: 0.9.1 memfs: specifier: ^4.6.0 - version: 4.8.1 + version: 4.8.2 node-mocks-http: specifier: ^1.13.0 version: 1.14.1 @@ -807,10 +807,10 @@ importers: version: 0.1.2 rollup: specifier: ^4.5.0 - version: 4.14.1 + version: 4.14.3 sass: specifier: ^1.69.5 - version: 1.74.1 + version: 1.75.0 srcset-parse: specifier: ^1.1.0 version: 1.1.0 @@ -872,7 +872,7 @@ importers: version: link:../../.. preact: specifier: ^10.19.2 - version: 10.20.1 + version: 10.20.2 packages/astro/e2e/fixtures/astro-envs: dependencies: @@ -890,7 +890,7 @@ importers: dependencies: preact: specifier: ^10.19.2 - version: 10.20.1 + version: 10.20.2 react: specifier: ^18.1.0 version: 18.2.0 @@ -902,7 +902,7 @@ importers: version: 1.8.16 svelte: specifier: ^4.2.5 - version: 4.2.12 + version: 4.2.14 vue: specifier: ^3.3.8 version: 3.4.21(typescript@5.2.2) @@ -966,7 +966,7 @@ importers: version: link:../../.. preact: specifier: ^10.19.2 - version: 10.20.1 + version: 10.20.2 packages/astro/e2e/fixtures/error-cyclic: dependencies: @@ -978,7 +978,7 @@ importers: version: link:../../.. preact: specifier: ^10.19.2 - version: 10.20.1 + version: 10.20.2 packages/astro/e2e/fixtures/error-sass: dependencies: @@ -987,7 +987,7 @@ importers: version: link:../../.. sass: specifier: ^1.69.5 - version: 1.74.1 + version: 1.75.0 packages/astro/e2e/fixtures/errors: dependencies: @@ -1011,7 +1011,7 @@ importers: version: link:../../.. preact: specifier: ^10.19.2 - version: 10.20.1 + version: 10.20.2 react: specifier: ^18.1.0 version: 18.2.0 @@ -1020,13 +1020,13 @@ importers: version: 18.2.0(react@18.2.0) sass: specifier: ^1.69.5 - version: 1.74.1 + version: 1.75.0 solid-js: specifier: ^1.8.5 version: 1.8.16 svelte: specifier: ^4.2.5 - version: 4.2.12 + version: 4.2.14 vue: specifier: ^3.3.8 version: 3.4.21(typescript@5.2.2) @@ -1038,7 +1038,7 @@ importers: version: link:../../.. sass: specifier: ^1.69.5 - version: 1.74.1 + version: 1.75.0 packages/astro/e2e/fixtures/hydration-race: dependencies: @@ -1050,7 +1050,7 @@ importers: version: link:../../.. preact: specifier: ^10.19.2 - version: 10.20.1 + version: 10.20.2 packages/astro/e2e/fixtures/i18n: dependencies: @@ -1083,7 +1083,7 @@ importers: version: 2.8.0 preact: specifier: ^10.19.2 - version: 10.20.1 + version: 10.20.2 react: specifier: ^18.1.0 version: 18.2.0 @@ -1095,7 +1095,7 @@ importers: version: 1.8.16 svelte: specifier: ^4.2.5 - version: 4.2.12 + version: 4.2.14 vue: specifier: ^3.3.8 version: 3.4.21(typescript@5.2.2) @@ -1126,7 +1126,7 @@ importers: dependencies: preact: specifier: ^10.19.2 - version: 10.20.1 + version: 10.20.2 devDependencies: '@astrojs/mdx': specifier: workspace:* @@ -1142,7 +1142,7 @@ importers: dependencies: preact: specifier: ^10.19.2 - version: 10.20.1 + version: 10.20.2 react: specifier: ^18.1.0 version: 18.2.0 @@ -1154,7 +1154,7 @@ importers: version: 1.8.16 svelte: specifier: ^4.2.5 - version: 4.2.12 + version: 4.2.14 vue: specifier: ^3.3.8 version: 3.4.21(typescript@5.2.2) @@ -1182,7 +1182,7 @@ importers: dependencies: preact: specifier: ^10.19.2 - version: 10.20.1 + version: 10.20.2 react: specifier: ^18.1.0 version: 18.2.0 @@ -1194,7 +1194,7 @@ importers: version: 1.8.16 svelte: specifier: ^4.2.5 - version: 4.2.12 + version: 4.2.14 vue: specifier: ^3.3.8 version: 3.4.21(typescript@5.2.2) @@ -1222,7 +1222,7 @@ importers: dependencies: preact: specifier: ^10.19.2 - version: 10.20.1 + version: 10.20.2 react: specifier: ^18.1.0 version: 18.2.0 @@ -1234,7 +1234,7 @@ importers: version: 1.8.16 svelte: specifier: ^4.2.5 - version: 4.2.12 + version: 4.2.14 vue: specifier: ^3.3.8 version: 3.4.21(typescript@5.2.2) @@ -1262,7 +1262,7 @@ importers: dependencies: preact: specifier: ^10.19.2 - version: 10.20.1 + version: 10.20.2 react: specifier: ^18.1.0 version: 18.2.0 @@ -1274,7 +1274,7 @@ importers: version: 1.8.16 svelte: specifier: ^4.2.5 - version: 4.2.12 + version: 4.2.14 vue: specifier: ^3.3.8 version: 3.4.21(typescript@5.2.2) @@ -1302,7 +1302,7 @@ importers: dependencies: preact: specifier: ^10.19.2 - version: 10.20.1 + version: 10.20.2 react: specifier: ^18.1.0 version: 18.2.0 @@ -1314,7 +1314,7 @@ importers: version: 1.8.16 svelte: specifier: ^4.2.5 - version: 4.2.12 + version: 4.2.14 vue: specifier: ^3.3.8 version: 3.4.21(typescript@5.2.2) @@ -1342,7 +1342,7 @@ importers: dependencies: preact: specifier: ^10.19.2 - version: 10.20.1 + version: 10.20.2 react: specifier: ^18.1.0 version: 18.2.0 @@ -1354,7 +1354,7 @@ importers: version: 1.8.16 svelte: specifier: ^4.2.5 - version: 4.2.12 + version: 4.2.14 vue: specifier: ^3.3.8 version: 3.4.21(typescript@5.2.2) @@ -1410,7 +1410,7 @@ importers: version: link:../../.. preact: specifier: ^10.19.2 - version: 10.20.1 + version: 10.20.2 packages/astro/e2e/fixtures/preact-component: dependencies: @@ -1425,7 +1425,7 @@ importers: version: link:../../.. preact: specifier: ^10.19.2 - version: 10.20.1 + version: 10.20.2 packages/astro/e2e/fixtures/preact-lazy-component: dependencies: @@ -1440,7 +1440,7 @@ importers: version: link:../../.. preact: specifier: ^10.15.1 - version: 10.20.1 + version: 10.20.2 packages/astro/e2e/fixtures/prefetch: dependencies: @@ -1520,7 +1520,7 @@ importers: version: link:../../.. svelte: specifier: ^4.2.5 - version: 4.2.12 + version: 4.2.14 packages/astro/e2e/fixtures/tailwindcss: dependencies: @@ -1580,7 +1580,7 @@ importers: version: 18.2.0(react@18.2.0) svelte: specifier: ^4.2.5 - version: 4.2.12 + version: 4.2.14 vue: specifier: ^3.3.8 version: 3.4.21(typescript@5.2.2) @@ -1628,10 +1628,10 @@ importers: version: link:../utils '@types/react': specifier: ^18.2.37 - version: 18.2.74 + version: 18.2.78 '@types/react-dom': specifier: ^18.2.15 - version: 18.2.24 + version: 18.2.25 astro: specifier: workspace:* version: link:../../.. @@ -1655,10 +1655,10 @@ importers: version: link:../utils '@types/react': specifier: ^18.2.37 - version: 18.2.74 + version: 18.2.78 '@types/react-dom': specifier: ^18.2.15 - version: 18.2.24 + version: 18.2.25 astro: specifier: workspace:* version: link:../../.. @@ -1682,10 +1682,10 @@ importers: version: link:../utils '@types/react': specifier: ^18.2.37 - version: 18.2.74 + version: 18.2.78 '@types/react-dom': specifier: ^18.2.15 - version: 18.2.24 + version: 18.2.25 astro: specifier: workspace:* version: link:../../.. @@ -1730,7 +1730,7 @@ importers: version: 18.2.0(react@18.2.0) svelte: specifier: ^4.2.5 - version: 4.2.12 + version: 4.2.14 vue: specifier: ^3.3.8 version: 3.4.21(typescript@5.2.2) @@ -1745,7 +1745,7 @@ importers: version: link:../../.. svelte: specifier: ^4.2.5 - version: 4.2.12 + version: 4.2.14 packages/astro/test/fixtures/alias-tsconfig: dependencies: @@ -1760,7 +1760,7 @@ importers: version: link:../../.. svelte: specifier: ^4.2.5 - version: 4.2.12 + version: 4.2.14 packages/astro/test/fixtures/alias-tsconfig-baseurl-only: dependencies: @@ -1772,7 +1772,7 @@ importers: version: link:../../.. svelte: specifier: ^4.2.5 - version: 4.2.12 + version: 4.2.14 packages/astro/test/fixtures/alias-tsconfig/deps/namespace-package: {} @@ -1843,7 +1843,7 @@ importers: version: link:../../.. preact: specifier: ^10.19.2 - version: 10.20.1 + version: 10.20.2 packages/astro/test/fixtures/astro-check-errors: dependencies: @@ -1879,10 +1879,10 @@ importers: version: link:../../.. preact: specifier: ^10.19.2 - version: 10.20.1 + version: 10.20.2 svelte: specifier: ^4.2.5 - version: 4.2.12 + version: 4.2.14 vue: specifier: ^3.3.8 version: 3.4.21(typescript@5.2.2) @@ -1915,7 +1915,7 @@ importers: version: 18.2.0(react@18.2.0) svelte: specifier: ^4.2.5 - version: 4.2.12 + version: 4.2.14 packages/astro/test/fixtures/astro-client-only/pkg: {} @@ -2001,7 +2001,7 @@ importers: version: 18.2.0(react@18.2.0) svelte: specifier: ^4.2.5 - version: 4.2.12 + version: 4.2.14 packages/astro/test/fixtures/astro-envs: dependencies: @@ -2025,7 +2025,7 @@ importers: version: link:../../.. preact: specifier: ^10.19.2 - version: 10.20.1 + version: 10.20.2 packages/astro/test/fixtures/astro-external-files: dependencies: @@ -2043,7 +2043,7 @@ importers: version: link:../../.. preact: specifier: ^10.19.2 - version: 10.20.1 + version: 10.20.2 packages/astro/test/fixtures/astro-generator: dependencies: @@ -2253,7 +2253,7 @@ importers: version: link:../../.. preact: specifier: ^10.19.2 - version: 10.20.1 + version: 10.20.2 packages/astro/test/fixtures/astro-slots: dependencies: @@ -2283,7 +2283,7 @@ importers: version: link:../../.. preact: specifier: ^10.19.2 - version: 10.20.1 + version: 10.20.2 react: specifier: ^18.2.0 version: 18.2.0 @@ -2295,7 +2295,7 @@ importers: version: 1.8.16 svelte: specifier: ^4.2.5 - version: 4.2.12 + version: 4.2.14 vue: specifier: ^3.3.8 version: 3.4.21(typescript@5.2.2) @@ -2310,7 +2310,7 @@ importers: version: link:../../.. preact: specifier: ^10.19.2 - version: 10.20.1 + version: 10.20.2 packages/astro/test/fixtures/build-assets: dependencies: @@ -2322,7 +2322,7 @@ importers: version: link:../../.. preact: specifier: ^10.19.2 - version: 10.20.1 + version: 10.20.2 packages/astro/test/fixtures/build-readonly-file: dependencies: @@ -2361,7 +2361,7 @@ importers: version: link:../../.. preact: specifier: ^10.19.2 - version: 10.20.1 + version: 10.20.2 react: specifier: ^18.1.0 version: 18.2.0 @@ -2370,13 +2370,13 @@ importers: version: 18.2.0(react@18.2.0) svelte: specifier: ^4.2.5 - version: 4.2.12 + version: 4.2.14 packages/astro/test/fixtures/component-library-shared: dependencies: preact: specifier: ^10.19.2 - version: 10.20.1 + version: 10.20.2 react: specifier: ^18.2.0 version: 18.2.0 @@ -2586,7 +2586,7 @@ importers: version: link:../../.. svelte: specifier: ^4.2.5 - version: 4.2.12 + version: 4.2.14 packages/astro/test/fixtures/css-import-as-inline: dependencies: @@ -2769,7 +2769,7 @@ importers: version: link:../../.. preact: specifier: ^10.19.2 - version: 10.20.1 + version: 10.20.2 packages/astro/test/fixtures/error-bad-js: dependencies: @@ -2805,10 +2805,10 @@ importers: version: link:../../.. preact: specifier: ^10.19.2 - version: 10.20.1 + version: 10.20.2 svelte: specifier: ^4.2.5 - version: 4.2.12 + version: 4.2.14 vue: specifier: ^3.3.8 version: 3.4.21(typescript@5.2.2) @@ -2895,7 +2895,7 @@ importers: version: link:../../.. preact: specifier: ^10.19.2 - version: 10.20.1 + version: 10.20.2 packages/astro/test/fixtures/i18n-routing: dependencies: @@ -2994,7 +2994,7 @@ importers: dependencies: preact: specifier: ^10.19.2 - version: 10.20.1 + version: 10.20.2 react: specifier: ^18.1.0 version: 18.2.0 @@ -3006,7 +3006,7 @@ importers: version: 1.8.16 svelte: specifier: ^4.2.5 - version: 4.2.12 + version: 4.2.14 vue: specifier: ^3.3.8 version: 3.4.21(typescript@5.2.2) @@ -3188,14 +3188,14 @@ importers: version: 1.8.16 svelte: specifier: ^4.2.5 - version: 4.2.12 + version: 4.2.14 vue: specifier: ^3.3.8 version: 3.4.21(typescript@5.2.2) devDependencies: postcss-preset-env: specifier: ^9.3.0 - version: 9.5.4(postcss@8.4.38) + version: 9.5.5(postcss@8.4.38) packages/astro/test/fixtures/preact-compat-component: dependencies: @@ -3210,7 +3210,7 @@ importers: version: link:../../.. preact: specifier: ^10.19.2 - version: 10.20.1 + version: 10.20.2 packages/astro/test/fixtures/preact-compat-component/packages/react-lib: dependencies: @@ -3225,13 +3225,13 @@ importers: version: link:../../../../integrations/preact '@preact/signals': specifier: 1.2.1 - version: 1.2.1(preact@10.20.1) + version: 1.2.1(preact@10.20.2) astro: specifier: workspace:* version: link:../../.. preact: specifier: ^10.19.2 - version: 10.20.1 + version: 10.20.2 packages/astro/test/fixtures/public-base-404: dependencies: @@ -3292,7 +3292,7 @@ importers: version: link:../../.. preact: specifier: ^10.19.2 - version: 10.20.1 + version: 10.20.2 packages/astro/test/fixtures/remote-css: dependencies: @@ -3343,7 +3343,7 @@ importers: version: link:../../.. preact: specifier: ^10.19.2 - version: 10.20.1 + version: 10.20.2 packages/astro/test/fixtures/slots-react: dependencies: @@ -3391,7 +3391,7 @@ importers: version: link:../../.. svelte: specifier: ^4.2.5 - version: 4.2.12 + version: 4.2.14 packages/astro/test/fixtures/slots-vue: dependencies: @@ -3502,7 +3502,7 @@ importers: version: link:../../.. preact: specifier: ^10.19.2 - version: 10.20.1 + version: 10.20.2 packages/astro/test/fixtures/ssr-error-pages: dependencies: @@ -3589,7 +3589,7 @@ importers: version: link:../../.. preact: specifier: ^10.19.2 - version: 10.20.1 + version: 10.20.2 packages/astro/test/fixtures/ssr-split-manifest: dependencies: @@ -3610,7 +3610,7 @@ importers: version: link:../../.. preact: specifier: ^10.19.2 - version: 10.20.1 + version: 10.20.2 packages/astro/test/fixtures/static-build-code-component: dependencies: @@ -3637,7 +3637,7 @@ importers: version: link:../../.. preact: specifier: ^10.19.2 - version: 10.20.1 + version: 10.20.2 react: specifier: ^18.1.0 version: 18.2.0 @@ -3690,7 +3690,7 @@ importers: version: link:../../.. svelte: specifier: ^4.2.5 - version: 4.2.12 + version: 4.2.14 packages/astro/test/fixtures/tailwindcss: dependencies: @@ -3813,7 +3813,7 @@ importers: version: link:../../.. svelte: specifier: ^4.2.5 - version: 4.2.12 + version: 4.2.14 vue: specifier: ^3.3.8 version: 3.4.21(typescript@5.2.2) @@ -3873,7 +3873,7 @@ importers: version: 1.0.2 drizzle-orm: specifier: ^0.30.4 - version: 0.30.7(@libsql/client@0.5.6) + version: 0.30.8(@libsql/client@0.5.6) github-slugger: specifier: ^2.0.0 version: 2.0.0 @@ -3937,10 +3937,10 @@ importers: version: 10.4.0 typescript: specifier: ^5.2.2 - version: 5.4.4 + version: 5.4.5 vite: specifier: ^5.1.4 - version: 5.2.8(@types/node@18.19.30)(sass@1.74.1) + version: 5.2.8(@types/node@18.19.31)(sass@1.75.0) packages/db/test/fixtures/basics: dependencies: @@ -4036,7 +4036,7 @@ importers: dependencies: '@astrojs/check': specifier: ^0.5.5 - version: 0.5.10(prettier-plugin-astro@0.12.3)(prettier@3.2.5)(typescript@5.4.4) + version: 0.5.10(prettier-plugin-astro@0.12.3)(prettier@3.2.5)(typescript@5.4.5) '@astrojs/db': specifier: workspace:* version: link:../../.. @@ -4048,10 +4048,10 @@ importers: version: link:../../../../integrations/react '@types/react': specifier: ^18.2.57 - version: 18.2.74 + version: 18.2.78 '@types/react-dom': specifier: ^18.2.19 - version: 18.2.24 + version: 18.2.25 astro: specifier: workspace:* version: link:../../../../astro @@ -4069,7 +4069,7 @@ importers: version: 0.1.12(astro@packages+astro)(zod@3.22.4) typescript: specifier: ^5.3.2 - version: 5.4.4 + version: 5.4.5 zod: specifier: ^3.22.4 version: 3.22.4 @@ -4087,7 +4087,7 @@ importers: version: link:../../../scripts vite: specifier: ^5.1.4 - version: 5.2.8(@types/node@18.19.30)(sass@1.74.1) + version: 5.2.8(@types/node@18.19.31)(sass@1.75.0) packages/integrations/alpinejs/test/fixtures/basics: dependencies: @@ -4165,7 +4165,7 @@ importers: version: 3.1.2 sass: specifier: ^1.69.5 - version: 1.74.1 + version: 1.75.0 packages/integrations/markdoc: dependencies: @@ -4220,7 +4220,7 @@ importers: version: 0.16.11 vite: specifier: ^5.1.4 - version: 5.2.8(@types/node@18.19.30)(sass@1.74.1) + version: 5.2.8(@types/node@18.19.31)(sass@1.75.0) packages/integrations/markdoc/test/fixtures/content-collections: dependencies: @@ -4325,7 +4325,7 @@ importers: version: link:../../../../../astro preact: specifier: ^10.20.1 - version: 10.20.1 + version: 10.20.2 packages/integrations/markdoc/test/fixtures/render-with-config: dependencies: @@ -4461,7 +4461,7 @@ importers: version: 11.0.4 vite: specifier: ^5.1.4 - version: 5.2.8(@types/node@18.19.30)(sass@1.74.1) + version: 5.2.8(@types/node@18.19.31)(sass@1.75.0) packages/integrations/mdx/test/fixtures/css-head-mdx: dependencies: @@ -4530,7 +4530,7 @@ importers: version: link:../../../../../astro preact: specifier: ^10.19.2 - version: 10.20.1 + version: 10.20.2 packages/integrations/mdx/test/fixtures/mdx-namespace: dependencies: @@ -4614,7 +4614,7 @@ importers: devDependencies: '@types/node': specifier: ^18.17.8 - version: 18.19.30 + version: 18.19.31 '@types/send': specifier: ^0.17.4 version: 0.17.4 @@ -4789,19 +4789,19 @@ importers: version: 7.22.5 '@preact/preset-vite': specifier: ^2.7.0 - version: 2.8.2(preact@10.20.1) + version: 2.8.2(preact@10.20.2) '@preact/signals': specifier: ^1.2.1 - version: 1.2.1(preact@10.20.1) + version: 1.2.1(preact@10.20.2) babel-plugin-transform-hook-names: specifier: ^1.0.2 version: 1.0.2 preact-render-to-string: specifier: ~6.3.1 - version: 6.3.1(preact@10.20.1) + version: 6.3.1(preact@10.20.2) preact-ssr-prepass: specifier: ^1.2.1 - version: 1.2.1(preact@10.20.1) + version: 1.2.1(preact@10.20.2) devDependencies: astro: specifier: workspace:* @@ -4811,7 +4811,7 @@ importers: version: link:../../../scripts preact: specifier: ^10.19.2 - version: 10.20.1 + version: 10.20.2 packages/integrations/react: dependencies: @@ -4824,10 +4824,10 @@ importers: devDependencies: '@types/react': specifier: ^18.2.37 - version: 18.2.74 + version: 18.2.78 '@types/react-dom': specifier: ^18.2.15 - version: 18.2.24 + version: 18.2.25 astro: specifier: workspace:* version: link:../../astro @@ -4845,7 +4845,7 @@ importers: version: 18.2.0(react@18.2.0) vite: specifier: ^5.1.4 - version: 5.2.8(@types/node@18.19.30)(sass@1.74.1) + version: 5.2.8(@types/node@18.19.31)(sass@1.75.0) packages/integrations/react/test/fixtures/react-component: dependencies: @@ -4946,10 +4946,10 @@ importers: dependencies: '@sveltejs/vite-plugin-svelte': specifier: ^3.0.0 - version: 3.0.2(svelte@4.2.12)(vite@5.2.8) + version: 3.1.0(svelte@4.2.14)(vite@5.2.8) svelte2tsx: specifier: ^0.6.27 - version: 0.6.27(svelte@4.2.12)(typescript@5.2.2) + version: 0.6.27(svelte@4.2.14)(typescript@5.2.2) devDependencies: astro: specifier: workspace:* @@ -4959,10 +4959,10 @@ importers: version: link:../../../scripts svelte: specifier: ^4.2.5 - version: 4.2.12 + version: 4.2.14 vite: specifier: ^5.1.4 - version: 5.2.8(@types/node@18.19.30)(sass@1.74.1) + version: 5.2.8(@types/node@18.19.31)(sass@1.75.0) packages/integrations/tailwind: dependencies: @@ -4987,7 +4987,7 @@ importers: version: 3.4.3 vite: specifier: ^5.1.4 - version: 5.2.8(@types/node@18.19.30)(sass@1.74.1) + version: 5.2.8(@types/node@18.19.31)(sass@1.75.0) packages/integrations/tailwind/test/fixtures/basic: dependencies: @@ -5247,7 +5247,7 @@ importers: version: 0.16.11 vite: specifier: ^5.1.4 - version: 5.2.8(@types/node@18.19.30)(sass@1.74.1) + version: 5.2.8(@types/node@18.19.31)(sass@1.75.0) vue: specifier: ^3.3.8 version: 3.4.21(typescript@5.2.2) @@ -5370,7 +5370,7 @@ importers: version: 2.1.0 shiki: specifier: ^1.1.2 - version: 1.2.4 + version: 1.3.0 unified: specifier: ^11.0.4 version: 11.0.4 @@ -5447,7 +5447,7 @@ importers: version: 1.1.4 '@types/node': specifier: ^18.17.8 - version: 18.19.30 + version: 18.19.31 '@types/which-pm-runs': specifier: ^1.0.2 version: 1.0.2 @@ -5514,7 +5514,7 @@ importers: version: 5.0.0 svelte: specifier: ^4.2.5 - version: 4.2.12 + version: 4.2.14 tar: specifier: ^6.1.15 version: 6.2.1 @@ -5563,8 +5563,8 @@ packages: astro: '*' dependencies: '@astro-community/astro-embed-twitter': 0.5.4(astro@packages+astro) - '@astro-community/astro-embed-vimeo': 0.3.6(astro@packages+astro) - '@astro-community/astro-embed-youtube': 0.5.1(astro@packages+astro) + '@astro-community/astro-embed-vimeo': 0.3.7(astro@packages+astro) + '@astro-community/astro-embed-youtube': 0.5.2(astro@packages+astro) '@types/unist': 2.0.10 astro: link:packages/astro astro-auto-import: 0.4.2(astro@packages+astro) @@ -5586,16 +5586,17 @@ packages: linkedom: 0.14.26 dev: false - /@astro-community/astro-embed-vimeo@0.3.6(astro@packages+astro): - resolution: {integrity: sha512-WBf1vjabXqEQ0n+F9wxuJt4kGXAe8TEvMb3mF7q3CU1KmRJrBGp9Wy6Mpl9LJIau4OiC3PZ58TmpSohELT26Ug==} + /@astro-community/astro-embed-vimeo@0.3.7(astro@packages+astro): + resolution: {integrity: sha512-0Y08IOudqSLC/RKiYZagaG/uvfblSt7of+hrIcRky7u+KZK3VrTbZ/Np+nIq81jXLGJQPXN8TNGsOUsY0mw9lw==} peerDependencies: astro: '*' dependencies: + '@astro-community/astro-embed-utils': 0.1.2 astro: link:packages/astro dev: false - /@astro-community/astro-embed-youtube@0.5.1(astro@packages+astro): - resolution: {integrity: sha512-IvjCCpaNZD7xrcgD/WZIRlpRphAUlwOZtR0IOI0pSNijegPOBghygYHeU81WvRnK2Fwuw2RTmGo8PbVZ15wp1w==} + /@astro-community/astro-embed-youtube@0.5.2(astro@packages+astro): + resolution: {integrity: sha512-cckWcq7mFCmI6uPpIlRolSafSQRYZBOaxIc8DaCUh8+JQAtPF7O4EdpRpZBUcvbARrWEEyHJCWrt0XOGppMniw==} peerDependencies: astro: '*' dependencies: @@ -5620,17 +5621,17 @@ packages: - prettier-plugin-astro dev: true - /@astrojs/check@0.5.10(prettier-plugin-astro@0.12.3)(prettier@3.2.5)(typescript@5.4.4): + /@astrojs/check@0.5.10(prettier-plugin-astro@0.12.3)(prettier@3.2.5)(typescript@5.4.5): resolution: {integrity: sha512-vliHXM9cu/viGeKiksUM4mXfO816ohWtawTl2ADPgTsd4nUMjFiyAl7xFZhF34yy4hq4qf7jvK1F2PlR3b5I5w==} hasBin: true peerDependencies: typescript: ^5.0.0 dependencies: - '@astrojs/language-server': 2.8.4(prettier-plugin-astro@0.12.3)(prettier@3.2.5)(typescript@5.4.4) + '@astrojs/language-server': 2.8.4(prettier-plugin-astro@0.12.3)(prettier@3.2.5)(typescript@5.4.5) chokidar: 3.6.0 fast-glob: 3.3.2 kleur: 4.1.5 - typescript: 5.4.4 + typescript: 5.4.5 yargs: 17.7.2 transitivePeerDependencies: - prettier @@ -5694,7 +5695,7 @@ packages: - typescript dev: true - /@astrojs/language-server@2.8.4(prettier-plugin-astro@0.12.3)(prettier@3.2.5)(typescript@5.4.4): + /@astrojs/language-server@2.8.4(prettier-plugin-astro@0.12.3)(prettier@3.2.5)(typescript@5.4.5): resolution: {integrity: sha512-sJH5vGTBkhgA8+hdhzX78UUp4cFz4Mt7xkEkevD188OS5bDMkaue6hK+dtXWM47mnrXFveXA2u38K7S+5+IRjA==} hasBin: true peerDependencies: @@ -5708,7 +5709,7 @@ packages: dependencies: '@astrojs/compiler': 2.7.1 '@jridgewell/sourcemap-codec': 1.4.15 - '@volar/kit': 2.1.6(typescript@5.4.4) + '@volar/kit': 2.1.6(typescript@5.4.5) '@volar/language-core': 2.1.6 '@volar/language-server': 2.1.6 '@volar/language-service': 2.1.6 @@ -7352,7 +7353,7 @@ packages: '@libsql/core': 0.5.6 '@libsql/hrana-client': 0.5.6 js-base64: 3.7.7 - libsql: 0.3.10 + libsql: 0.3.12 transitivePeerDependencies: - bufferutil - encoding @@ -7365,16 +7366,16 @@ packages: js-base64: 3.7.7 dev: false - /@libsql/darwin-arm64@0.3.10: - resolution: {integrity: sha512-RaexEFfPAFogd6dJlqkpCkTxdr6K14Z0286lodIJ8Ny77mWuWyBkWKxf70OYWXXAMxMJFUW+6al1F3/Osf/pTg==} + /@libsql/darwin-arm64@0.3.12: + resolution: {integrity: sha512-rBiMebxLgsShSEg73CibeuenlUMKXnaW/XoUk3tii1C1U7141w6k5VuF6/jnNl/cS7PMK/vy+2V5N/k++yvb9A==} cpu: [arm64] os: [darwin] requiresBuild: true dev: false optional: true - /@libsql/darwin-x64@0.3.10: - resolution: {integrity: sha512-SNVN6n4qNUdMW1fJMFmx4qn4n5RnXsxjFbczpkzG/V7m/5VeTFt1chhGcrahTHCr3+K6eRJWJUEQHRGqjBwPkw==} + /@libsql/darwin-x64@0.3.12: + resolution: {integrity: sha512-T1yXSG1WukLq41hEWTU3G1kuV9TVoc+90KFs1KGluLrGvpj5l1QIff35hQlWWi6c1tfPsdlydR6qIO6AZdUwNg==} cpu: [x64] os: [darwin] requiresBuild: true @@ -7413,40 +7414,40 @@ packages: - utf-8-validate dev: false - /@libsql/linux-arm64-gnu@0.3.10: - resolution: {integrity: sha512-2uXpi9d8qtyIOr7pyG4a88j6YXgemyIHEs2Wbp+PPletlCIPsFS+E7IQHbz8VwTohchOzcokGUm1Bc5QC+A7wg==} + /@libsql/linux-arm64-gnu@0.3.12: + resolution: {integrity: sha512-1tmLuj02vySklkadwYEjvXFhyipyNr7oufe55tJK0hqvjQEcqfzBqAD3AHvPo41ug0qlrB2GRpiBlJtcIu2dMQ==} cpu: [arm64] os: [linux] requiresBuild: true dev: false optional: true - /@libsql/linux-arm64-musl@0.3.10: - resolution: {integrity: sha512-72SN1FUavLvzHddCS861ynSpQndcW5oLGKA3U8CyMfgIZIwJAPc7+48Uj1plW00htXBx4GBpcntFp68KKIx3YQ==} + /@libsql/linux-arm64-musl@0.3.12: + resolution: {integrity: sha512-sM2NJTYe1FiixpJbebTllfV6uuSB1WIOfgQVHb7cJP0Jik5Kyq5F9n4reF6QKRivbPAn3kk6f5uRZKHBE6rvXw==} cpu: [arm64] os: [linux] requiresBuild: true dev: false optional: true - /@libsql/linux-x64-gnu@0.3.10: - resolution: {integrity: sha512-hXyNqVRi7ONuyWZ1SX6setxL0QaQ7InyS3bHLupsi9s7NpOGD5vcpTaYicJOqmIIm+6kt8vJfmo7ZxlarIHy7Q==} + /@libsql/linux-x64-gnu@0.3.12: + resolution: {integrity: sha512-x8+Qo09osyOWs0/+D48Ml+CMlU33yCXznv4PYfQJc1NWA0dcQkSK353raYebH+cJhNIv0RcEz3ltTT3ME+HwAQ==} cpu: [x64] os: [linux] requiresBuild: true dev: false optional: true - /@libsql/linux-x64-musl@0.3.10: - resolution: {integrity: sha512-kNmIRxomVwt9S+cLyYS497F/3gXFF4r8wW12YSBQgxG75JYft07AHVd8J7HINg+oqRkLzT0s+mVX5dM6nk68EQ==} + /@libsql/linux-x64-musl@0.3.12: + resolution: {integrity: sha512-wY5G8zx727wvg5n/qB4oK357u3HQlz84oNG0XTrKnJVCxqR91Yg6bU+fKsGrvyaGFEqLmZ/Ft0K0pi6Mn/k4vQ==} cpu: [x64] os: [linux] requiresBuild: true dev: false optional: true - /@libsql/win32-x64-msvc@0.3.10: - resolution: {integrity: sha512-c/6rjdtGULKrJkLgfLobFefObfOtxjXGmCfPxv6pr0epPCeUEssfDbDIeEH9fQUgzogIMWEHwT8so52UJ/iT1Q==} + /@libsql/win32-x64-msvc@0.3.12: + resolution: {integrity: sha512-ko9Ph0ssQk2rUiNXfbquZ4fXXKb/E47GE6+caA4gNt4+rgFc1ksaffekYwym24Zk4VDYsvAQNOpwgd9baIBzLA==} cpu: [x64] os: [win32] requiresBuild: true @@ -7472,7 +7473,7 @@ packages: '@lit-labs/ssr-dom-shim': 1.2.0 '@lit/reactive-element': 2.0.4 '@parse5/tools': 0.3.0 - '@types/node': 16.18.95 + '@types/node': 16.18.96 enhanced-resolve: 5.16.0 lit: 3.1.2 lit-element: 4.0.4 @@ -7551,7 +7552,7 @@ packages: '@types/estree': 1.0.5 '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.4 - '@types/mdx': 2.0.12 + '@types/mdx': 2.0.13 collapse-white-space: 2.1.0 devlop: 1.1.0 estree-util-build-jsx: 3.0.1 @@ -7575,7 +7576,7 @@ packages: - supports-color dev: false - /@nanostores/preact@0.5.1(nanostores@0.9.5)(preact@10.20.1): + /@nanostores/preact@0.5.1(nanostores@0.9.5)(preact@10.20.2): resolution: {integrity: sha512-kofyeDwzM3TrOd37ay+Xxgk3Cn6jih23dxELc7Mr9IJV55jmWATfNP9b7O/awwCL7CE5z5PfzFnNk/W+tMaWGw==} engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: @@ -7583,7 +7584,7 @@ packages: preact: '>=10.0.0' dependencies: nanostores: 0.9.5 - preact: 10.20.1 + preact: 10.20.2 dev: false /@neon-rs/load@0.0.4: @@ -7617,7 +7618,7 @@ packages: '@octokit/plugin-paginate-rest': 9.2.1(@octokit/core@5.2.0) '@octokit/plugin-rest-endpoint-methods': 10.4.1(@octokit/core@5.2.0) '@octokit/types': 12.6.0 - undici: 6.12.0 + undici: 6.13.0 dev: true /@octokit/auth-action@4.1.0: @@ -7625,7 +7626,7 @@ packages: engines: {node: '>= 18'} dependencies: '@octokit/auth-token': 4.0.0 - '@octokit/types': 13.1.0 + '@octokit/types': 13.4.0 dev: true /@octokit/auth-token@4.0.0: @@ -7639,9 +7640,9 @@ packages: dependencies: '@octokit/auth-token': 4.0.0 '@octokit/graphql': 7.1.0 - '@octokit/request': 8.3.1 + '@octokit/request': 8.4.0 '@octokit/request-error': 5.1.0 - '@octokit/types': 13.1.0 + '@octokit/types': 13.4.0 before-after-hook: 2.2.3 universal-user-agent: 6.0.1 dev: true @@ -7650,7 +7651,7 @@ packages: resolution: {integrity: sha512-ekqR4/+PCLkEBF6qgj8WqJfvDq65RH85OAgrtnVp1mSxaXF03u2xW/hUdweGS5654IlC0wkNYC18Z50tSYTAFw==} engines: {node: '>= 18'} dependencies: - '@octokit/types': 13.1.0 + '@octokit/types': 13.4.0 universal-user-agent: 6.0.1 dev: true @@ -7658,8 +7659,8 @@ packages: resolution: {integrity: sha512-r+oZUH7aMFui1ypZnAvZmn0KSqAUgE1/tUXIWaqUCa1758ts/Jio84GZuzsvUkme98kv0WFY8//n0J1Z+vsIsQ==} engines: {node: '>= 18'} dependencies: - '@octokit/request': 8.3.1 - '@octokit/types': 13.1.0 + '@octokit/request': 8.4.0 + '@octokit/types': 13.4.0 universal-user-agent: 6.0.1 dev: true @@ -7667,8 +7668,8 @@ packages: resolution: {integrity: sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==} dev: true - /@octokit/openapi-types@21.2.0: - resolution: {integrity: sha512-xx+Xd6I7rYvul/hgUDqv6TeGX0IOGnhSg9IOeYgd/uI7IAqUy6DE2B6Ipv2M4mWoxaMcWjIzgTIcv8pMO3F3vw==} + /@octokit/openapi-types@22.0.1: + resolution: {integrity: sha512-1yN5m1IMNXthoBDUXFF97N1gHop04B3H8ws7wtOr8GgRyDO1gKALjwMHARNBoMBiB/2vEe/vxstrApcJZzQbnQ==} dev: true /@octokit/plugin-paginate-rest@9.2.1(@octokit/core@5.2.0): @@ -7695,18 +7696,18 @@ packages: resolution: {integrity: sha512-GETXfE05J0+7H2STzekpKObFe765O5dlAKUTLNGeH+x47z7JjXHfsHKo5z21D/o/IOZTUEI6nyWyR+bZVP/n5Q==} engines: {node: '>= 18'} dependencies: - '@octokit/types': 13.1.0 + '@octokit/types': 13.4.0 deprecation: 2.3.1 once: 1.4.0 dev: true - /@octokit/request@8.3.1: - resolution: {integrity: sha512-fin4cl5eHN5Ybmb/gtn7YZ+ycyUlcyqqkg5lfxeSChqj7sUt6TNaJPehREi+0PABKLREYL8pfaUhH3TicEWNoA==} + /@octokit/request@8.4.0: + resolution: {integrity: sha512-9Bb014e+m2TgBeEJGEbdplMVWwPmL1FPtggHQRkV+WVsMggPtEkLKPlcVYm/o8xKLkpJ7B+6N8WfQMtDLX2Dpw==} engines: {node: '>= 18'} dependencies: '@octokit/endpoint': 9.0.5 '@octokit/request-error': 5.1.0 - '@octokit/types': 13.1.0 + '@octokit/types': 13.4.0 universal-user-agent: 6.0.1 dev: true @@ -7716,10 +7717,10 @@ packages: '@octokit/openapi-types': 20.0.0 dev: true - /@octokit/types@13.1.0: - resolution: {integrity: sha512-nBwAFOYqVUUJ2AZFK4ZzESQptaAVqdTDKk8gE0Xr0o99WuPDSrhUC38x0F40xD9OUxXhOOuZKWNNVVLPSHQDvQ==} + /@octokit/types@13.4.0: + resolution: {integrity: sha512-WlMegy3lPXYWASe3k9Jslc5a0anrYAYMWtsFrxBTdQjS70hvLH6C+PGvHbOsgy3RA3LouGJoU/vAt4KarecQLQ==} dependencies: - '@octokit/openapi-types': 21.2.0 + '@octokit/openapi-types': 22.0.1 dev: true /@parse5/tools@0.3.0: @@ -7747,7 +7748,7 @@ packages: playwright: 1.40.0 dev: true - /@preact/preset-vite@2.8.2(preact@10.20.1): + /@preact/preset-vite@2.8.2(preact@10.20.2): resolution: {integrity: sha512-m3tl+M8IO8jgiHnk+7LSTFl8axdPXloewi7iGVLdmCwf34XOzEUur0bZVewW4DUbUipFjTS2CXu27+5f/oexBA==} peerDependencies: '@babel/core': 7.x @@ -7760,7 +7761,7 @@ packages: dependencies: '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.4) '@babel/plugin-transform-react-jsx-development': 7.22.5 - '@prefresh/vite': 2.4.5(preact@10.20.1) + '@prefresh/vite': 2.4.5(preact@10.20.2) '@rollup/pluginutils': 4.2.1 babel-plugin-transform-hook-names: 1.0.2 debug: 4.3.4(supports-color@8.1.1) @@ -7779,32 +7780,32 @@ packages: resolution: {integrity: sha512-O/XGxwP85h1F7+ouqTMOIZ3+V1whfaV9ToIVcuyGriD4JkSD00cQo54BKdqjvBJxbenvp7ynfqRHEwI6e+NIhw==} dev: false - /@preact/signals@1.2.1(preact@10.20.1): + /@preact/signals@1.2.1(preact@10.20.2): resolution: {integrity: sha512-hRPvp1C2ooDzOHqfnhdpHgoIFDbYFAXLhoid3+jSItuPPD/J0r/UsiWKv/8ZO/oEhjRaP0M5niuRYsWqmY2GEA==} peerDependencies: preact: 10.x dependencies: '@preact/signals-core': 1.6.0 - preact: 10.20.1 + preact: 10.20.2 dev: false /@prefresh/babel-plugin@0.5.1: resolution: {integrity: sha512-uG3jGEAysxWoyG3XkYfjYHgaySFrSsaEb4GagLzYaxlydbuREtaX+FTxuIidp241RaLl85XoHg9Ej6E4+V1pcg==} dev: false - /@prefresh/core@1.5.2(preact@10.20.1): + /@prefresh/core@1.5.2(preact@10.20.2): resolution: {integrity: sha512-A/08vkaM1FogrCII5PZKCrygxSsc11obExBScm3JF1CryK2uDS3ZXeni7FeKCx1nYdUkj4UcJxzPzc1WliMzZA==} peerDependencies: preact: ^10.0.0 dependencies: - preact: 10.20.1 + preact: 10.20.2 dev: false /@prefresh/utils@1.2.0: resolution: {integrity: sha512-KtC/fZw+oqtwOLUFM9UtiitB0JsVX0zLKNyRTA332sqREqSALIIQQxdUCS1P3xR/jT1e2e8/5rwH6gdcMLEmsQ==} dev: false - /@prefresh/vite@2.4.5(preact@10.20.1): + /@prefresh/vite@2.4.5(preact@10.20.2): resolution: {integrity: sha512-iForDVJ2M8gQYnm5pHumvTEJjGGc7YNYC0GVKnHFL+GvFfKHfH9Rpq67nUAzNbjuLEpqEOUuQVQajMazWu2ZNQ==} peerDependencies: preact: ^10.4.0 @@ -7815,10 +7816,10 @@ packages: dependencies: '@babel/core': 7.24.4 '@prefresh/babel-plugin': 0.5.1 - '@prefresh/core': 1.5.2(preact@10.20.1) + '@prefresh/core': 1.5.2(preact@10.20.2) '@prefresh/utils': 1.2.0 '@rollup/pluginutils': 4.2.1 - preact: 10.20.1 + preact: 10.20.2 transitivePeerDependencies: - supports-color dev: false @@ -7831,113 +7832,120 @@ packages: picomatch: 2.3.1 dev: false - /@rollup/rollup-android-arm-eabi@4.14.1: - resolution: {integrity: sha512-fH8/o8nSUek8ceQnT7K4EQbSiV7jgkHq81m9lWZFIXjJ7lJzpWXbQFpT/Zh6OZYnpFykvzC3fbEvEAFZu03dPA==} + /@rollup/rollup-android-arm-eabi@4.14.3: + resolution: {integrity: sha512-X9alQ3XM6I9IlSlmC8ddAvMSyG1WuHk5oUnXGw+yUBs3BFoTizmG1La/Gr8fVJvDWAq+zlYTZ9DBgrlKRVY06g==} cpu: [arm] os: [android] requiresBuild: true optional: true - /@rollup/rollup-android-arm64@4.14.1: - resolution: {integrity: sha512-Y/9OHLjzkunF+KGEoJr3heiD5X9OLa8sbT1lm0NYeKyaM3oMhhQFvPB0bNZYJwlq93j8Z6wSxh9+cyKQaxS7PQ==} + /@rollup/rollup-android-arm64@4.14.3: + resolution: {integrity: sha512-eQK5JIi+POhFpzk+LnjKIy4Ks+pwJ+NXmPxOCSvOKSNRPONzKuUvWE+P9JxGZVxrtzm6BAYMaL50FFuPe0oWMQ==} cpu: [arm64] os: [android] requiresBuild: true optional: true - /@rollup/rollup-darwin-arm64@4.14.1: - resolution: {integrity: sha512-+kecg3FY84WadgcuSVm6llrABOdQAEbNdnpi5X3UwWiFVhZIZvKgGrF7kmLguvxHNQy+UuRV66cLVl3S+Rkt+Q==} + /@rollup/rollup-darwin-arm64@4.14.3: + resolution: {integrity: sha512-Od4vE6f6CTT53yM1jgcLqNfItTsLt5zE46fdPaEmeFHvPs5SjZYlLpHrSiHEKR1+HdRfxuzXHjDOIxQyC3ptBA==} cpu: [arm64] os: [darwin] requiresBuild: true optional: true - /@rollup/rollup-darwin-x64@4.14.1: - resolution: {integrity: sha512-2pYRzEjVqq2TB/UNv47BV/8vQiXkFGVmPFwJb+1E0IFFZbIX8/jo1olxqqMbo6xCXf8kabANhp5bzCij2tFLUA==} + /@rollup/rollup-darwin-x64@4.14.3: + resolution: {integrity: sha512-0IMAO21axJeNIrvS9lSe/PGthc8ZUS+zC53O0VhF5gMxfmcKAP4ESkKOCwEi6u2asUrt4mQv2rjY8QseIEb1aw==} cpu: [x64] os: [darwin] requiresBuild: true optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.14.1: - resolution: {integrity: sha512-mS6wQ6Do6/wmrF9aTFVpIJ3/IDXhg1EZcQFYHZLHqw6AzMBjTHWnCG35HxSqUNphh0EHqSM6wRTT8HsL1C0x5g==} + /@rollup/rollup-linux-arm-gnueabihf@4.14.3: + resolution: {integrity: sha512-ge2DC7tHRHa3caVEoSbPRJpq7azhG+xYsd6u2MEnJ6XzPSzQsTKyXvh6iWjXRf7Rt9ykIUWHtl0Uz3T6yXPpKw==} cpu: [arm] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-arm64-gnu@4.14.1: - resolution: {integrity: sha512-p9rGKYkHdFMzhckOTFubfxgyIO1vw//7IIjBBRVzyZebWlzRLeNhqxuSaZ7kCEKVkm/kuC9fVRW9HkC/zNRG2w==} + /@rollup/rollup-linux-arm-musleabihf@4.14.3: + resolution: {integrity: sha512-ljcuiDI4V3ySuc7eSk4lQ9wU8J8r8KrOUvB2U+TtK0TiW6OFDmJ+DdIjjwZHIw9CNxzbmXY39wwpzYuFDwNXuw==} + cpu: [arm] + os: [linux] + requiresBuild: true + optional: true + + /@rollup/rollup-linux-arm64-gnu@4.14.3: + resolution: {integrity: sha512-Eci2us9VTHm1eSyn5/eEpaC7eP/mp5n46gTRB3Aar3BgSvDQGJZuicyq6TsH4HngNBgVqC5sDYxOzTExSU+NjA==} cpu: [arm64] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-arm64-musl@4.14.1: - resolution: {integrity: sha512-nDY6Yz5xS/Y4M2i9JLQd3Rofh5OR8Bn8qe3Mv/qCVpHFlwtZSBYSPaU4mrGazWkXrdQ98GB//H0BirGR/SKFSw==} + /@rollup/rollup-linux-arm64-musl@4.14.3: + resolution: {integrity: sha512-UrBoMLCq4E92/LCqlh+blpqMz5h1tJttPIniwUgOFJyjWI1qrtrDhhpHPuFxULlUmjFHfloWdixtDhSxJt5iKw==} cpu: [arm64] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-powerpc64le-gnu@4.14.1: - resolution: {integrity: sha512-im7HE4VBL+aDswvcmfx88Mp1soqL9OBsdDBU8NqDEYtkri0qV0THhQsvZtZeNNlLeCUQ16PZyv7cqutjDF35qw==} - cpu: [ppc64le] + /@rollup/rollup-linux-powerpc64le-gnu@4.14.3: + resolution: {integrity: sha512-5aRjvsS8q1nWN8AoRfrq5+9IflC3P1leMoy4r2WjXyFqf3qcqsxRCfxtZIV58tCxd+Yv7WELPcO9mY9aeQyAmw==} + cpu: [ppc64] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-riscv64-gnu@4.14.1: - resolution: {integrity: sha512-RWdiHuAxWmzPJgaHJdpvUUlDz8sdQz4P2uv367T2JocdDa98iRw2UjIJ4QxSyt077mXZT2X6pKfT2iYtVEvOFw==} + /@rollup/rollup-linux-riscv64-gnu@4.14.3: + resolution: {integrity: sha512-sk/Qh1j2/RJSX7FhEpJn8n0ndxy/uf0kI/9Zc4b1ELhqULVdTfN6HL31CDaTChiBAOgLcsJ1sgVZjWv8XNEsAQ==} cpu: [riscv64] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-s390x-gnu@4.14.1: - resolution: {integrity: sha512-VMgaGQ5zRX6ZqV/fas65/sUGc9cPmsntq2FiGmayW9KMNfWVG/j0BAqImvU4KTeOOgYSf1F+k6at1UfNONuNjA==} + /@rollup/rollup-linux-s390x-gnu@4.14.3: + resolution: {integrity: sha512-jOO/PEaDitOmY9TgkxF/TQIjXySQe5KVYB57H/8LRP/ux0ZoO8cSHCX17asMSv3ruwslXW/TLBcxyaUzGRHcqg==} cpu: [s390x] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-x64-gnu@4.14.1: - resolution: {integrity: sha512-9Q7DGjZN+hTdJomaQ3Iub4m6VPu1r94bmK2z3UeWP3dGUecRC54tmVu9vKHTm1bOt3ASoYtEz6JSRLFzrysKlA==} + /@rollup/rollup-linux-x64-gnu@4.14.3: + resolution: {integrity: sha512-8ybV4Xjy59xLMyWo3GCfEGqtKV5M5gCSrZlxkPGvEPCGDLNla7v48S662HSGwRd6/2cSneMQWiv+QzcttLrrOA==} cpu: [x64] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-x64-musl@4.14.1: - resolution: {integrity: sha512-JNEG/Ti55413SsreTguSx0LOVKX902OfXIKVg+TCXO6Gjans/k9O6ww9q3oLGjNDaTLxM+IHFMeXy/0RXL5R/g==} + /@rollup/rollup-linux-x64-musl@4.14.3: + resolution: {integrity: sha512-s+xf1I46trOY10OqAtZ5Rm6lzHre/UiLA1J2uOhCFXWkbZrJRkYBPO6FhvGfHmdtQ3Bx793MNa7LvoWFAm93bg==} cpu: [x64] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-win32-arm64-msvc@4.14.1: - resolution: {integrity: sha512-ryS22I9y0mumlLNwDFYZRDFLwWh3aKaC72CWjFcFvxK0U6v/mOkM5Up1bTbCRAhv3kEIwW2ajROegCIQViUCeA==} + /@rollup/rollup-win32-arm64-msvc@4.14.3: + resolution: {integrity: sha512-+4h2WrGOYsOumDQ5S2sYNyhVfrue+9tc9XcLWLh+Kw3UOxAvrfOrSMFon60KspcDdytkNDh7K2Vs6eMaYImAZg==} cpu: [arm64] os: [win32] requiresBuild: true optional: true - /@rollup/rollup-win32-ia32-msvc@4.14.1: - resolution: {integrity: sha512-TdloItiGk+T0mTxKx7Hp279xy30LspMso+GzQvV2maYePMAWdmrzqSNZhUpPj3CGw12aGj57I026PgLCTu8CGg==} + /@rollup/rollup-win32-ia32-msvc@4.14.3: + resolution: {integrity: sha512-T1l7y/bCeL/kUwh9OD4PQT4aM7Bq43vX05htPJJ46RTI4r5KNt6qJRzAfNfM+OYMNEVBWQzR2Gyk+FXLZfogGw==} cpu: [ia32] os: [win32] requiresBuild: true optional: true - /@rollup/rollup-win32-x64-msvc@4.14.1: - resolution: {integrity: sha512-wQGI+LY/Py20zdUPq+XCem7JcPOyzIJBm3dli+56DJsQOHbnXZFEwgmnC6el1TPAfC8lBT3m+z69RmLykNUbew==} + /@rollup/rollup-win32-x64-msvc@4.14.3: + resolution: {integrity: sha512-/BypzV0H1y1HzgYpxqRaXGBRqfodgoBBCcsrujT6QRcakDQdfU+Lq9PENPh5jB4I44YWq+0C2eHsHya+nZY1sA==} cpu: [x64] os: [win32] requiresBuild: true optional: true - /@shikijs/core@1.2.4: - resolution: {integrity: sha512-ClaUWpt8oTzjcF0MM1P81AeWyzc1sNSJlAjMG80CbwqbFqXSNz+NpQVUC0icobt3sZn43Sn27M4pHD/Jmp3zHw==} + /@shikijs/core@1.3.0: + resolution: {integrity: sha512-7fedsBfuILDTBmrYZNFI8B6ATTxhQAasUHllHmjvSZPnoq4bULWoTpHwmuQvZ8Aq03/tAa2IGo6RXqWtHdWaCA==} dev: false /@sinclair/typebox@0.27.8: @@ -7956,8 +7964,8 @@ packages: solid-js: 1.8.16 dev: false - /@sveltejs/vite-plugin-svelte-inspector@2.0.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.12)(vite@5.2.8): - resolution: {integrity: sha512-gjr9ZFg1BSlIpfZ4PRewigrvYmHWbDrq2uvvPB1AmTWKuM+dI1JXQSUu2pIrYLb/QncyiIGkFDFKTwJ0XqQZZg==} + /@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.0)(svelte@4.2.14)(vite@5.2.8): + resolution: {integrity: sha512-9QX28IymvBlSCqsCll5t0kQVxipsfhFFL+L2t3nTWfXnddYwxBuAEtTtlaVQpRz9c37BhJjltSeY4AJSC03SSg==} engines: {node: ^18.0.0 || >=20} peerDependencies: '@sveltejs/vite-plugin-svelte': ^3.0.0 @@ -7967,16 +7975,16 @@ packages: vite: optional: true dependencies: - '@sveltejs/vite-plugin-svelte': 3.0.2(svelte@4.2.12)(vite@5.2.8) + '@sveltejs/vite-plugin-svelte': 3.1.0(svelte@4.2.14)(vite@5.2.8) debug: 4.3.4(supports-color@8.1.1) - svelte: 4.2.12 - vite: 5.2.8(@types/node@18.19.30)(sass@1.74.1) + svelte: 4.2.14 + vite: 5.2.8(@types/node@18.19.31)(sass@1.75.0) transitivePeerDependencies: - supports-color dev: false - /@sveltejs/vite-plugin-svelte@3.0.2(svelte@4.2.12)(vite@5.2.8): - resolution: {integrity: sha512-MpmF/cju2HqUls50WyTHQBZUV3ovV/Uk8k66AN2gwHogNAG8wnW8xtZDhzNBsFJJuvmq1qnzA5kE7YfMJNFv2Q==} + /@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.14)(vite@5.2.8): + resolution: {integrity: sha512-sY6ncCvg+O3njnzbZexcVtUqOBE3iYmQPJ9y+yXSkOwG576QI/xJrBnQSRXFLGwJNBa0T78JEKg5cIR0WOAuUw==} engines: {node: ^18.0.0 || >=20} peerDependencies: svelte: ^4.0.0 || ^5.0.0-next.0 @@ -7985,14 +7993,14 @@ packages: vite: optional: true dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 2.0.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.12)(vite@5.2.8) + '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.0)(svelte@4.2.14)(vite@5.2.8) debug: 4.3.4(supports-color@8.1.1) deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.9 - svelte: 4.2.12 - svelte-hmr: 0.15.3(svelte@4.2.12) - vite: 5.2.8(@types/node@18.19.30)(sass@1.74.1) + svelte: 4.2.14 + svelte-hmr: 0.16.0(svelte@4.2.14) + vite: 5.2.8(@types/node@18.19.31)(sass@1.75.0) vitefu: 0.2.5(vite@5.2.8) transitivePeerDependencies: - supports-color @@ -8062,7 +8070,7 @@ packages: resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} dependencies: '@types/connect': 3.4.38 - '@types/node': 18.19.30 + '@types/node': 18.19.31 dev: true /@types/canvas-confetti@1.6.4: @@ -8076,7 +8084,7 @@ packages: /@types/clean-css@4.2.11: resolution: {integrity: sha512-Y8n81lQVTAfP2TOdtJJEsCoYl1AnOkqDqMvXb9/7pfgZZ7r8YrEyurrAvAoAjHOGXKRybay+5CsExqIH6liccw==} dependencies: - '@types/node': 18.19.30 + '@types/node': 18.19.31 source-map: 0.6.1 dev: true @@ -8087,7 +8095,7 @@ packages: /@types/connect@3.4.38: resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} dependencies: - '@types/node': 18.19.30 + '@types/node': 18.19.31 dev: true /@types/cookie@0.5.4: @@ -8130,7 +8138,7 @@ packages: /@types/express-serve-static-core@4.19.0: resolution: {integrity: sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ==} dependencies: - '@types/node': 18.19.30 + '@types/node': 18.19.31 '@types/qs': 6.9.14 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 @@ -8217,8 +8225,8 @@ packages: /@types/mdurl@1.0.5: resolution: {integrity: sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==} - /@types/mdx@2.0.12: - resolution: {integrity: sha512-H9VZ9YqE+H28FQVchC83RCs5xQ2J7mAAv6qdDEaWmXEVl3OpdH+xfrSUzQ1lp7U7oSTRZ0RvW08ASPJsYBi7Cw==} + /@types/mdx@2.0.13: + resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} dev: false /@types/mime@1.3.5: @@ -8243,7 +8251,7 @@ packages: /@types/needle@3.3.0: resolution: {integrity: sha512-UFIuc1gdyzAqeVUYpSL+cliw2MmU/ZUhVZKE7Zo4wPbgc8hbljeKSnn6ls6iG8r5jpegPXLUIhJ+Wb2kLVs8cg==} dependencies: - '@types/node': 18.19.30 + '@types/node': 18.19.31 dev: true /@types/nlcst@1.0.4: @@ -8255,7 +8263,7 @@ packages: /@types/node-fetch@2.6.11: resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} dependencies: - '@types/node': 18.19.30 + '@types/node': 18.19.31 form-data: 4.0.0 dev: false @@ -8263,21 +8271,21 @@ packages: resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} dev: true - /@types/node@16.18.95: - resolution: {integrity: sha512-z9w+CcR7ahc7UhsKe+PGB25nmPmCERQBAdLdFHhoZ6+FfgSr7gUvdQI0eLH2t7ue8u5wKsLdde6cHKPjhC8vGg==} + /@types/node@16.18.96: + resolution: {integrity: sha512-84iSqGXoO+Ha16j8pRZ/L90vDMKX04QTYMTfYeE1WrjWaZXuchBehGUZEpNgx7JnmlrIHdnABmpjrQjhCnNldQ==} dev: false /@types/node@17.0.45: resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} dev: false - /@types/node@18.19.30: - resolution: {integrity: sha512-453z1zPuJLVDbyahaa1sSD5C2sht6ZpHp5rgJNs+H8YGqhluCXcuOUmBYsAo0Tos0cHySJ3lVUGbGgLlqIkpyg==} + /@types/node@18.19.31: + resolution: {integrity: sha512-ArgCD39YpyyrtFKIqMDvjz79jto5fcI/SVUs2HwB+f0dAzq68yqOdyaSivLiLugSziTpNXLQrVb7RZFmdZzbhA==} dependencies: undici-types: 5.26.5 - /@types/node@20.12.5: - resolution: {integrity: sha512-BD+BjQ9LS/D8ST9p5uqBxghlN+S42iuNxjsUGjeZobe/ciXzk2qb1B6IXc6AnRLS+yFJRpN2IPEHMzwspfDJNw==} + /@types/node@20.12.7: + resolution: {integrity: sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==} dependencies: undici-types: 5.26.5 dev: true @@ -8294,13 +8302,13 @@ packages: resolution: {integrity: sha512-HVqYj3L+D+S/6qpQRv5qMxrD/5pglzZuhP7ZIqgVSZ+Ck4z1TCFkNIRG8WesFueQTqWFTSgkkAl6f8lwxFPQSw==} dependencies: '@types/needle': 3.3.0 - '@types/node': 18.19.30 + '@types/node': 18.19.31 dev: true /@types/prompts@2.4.9: resolution: {integrity: sha512-qTxFi6Buiu8+50/+3DGIWLHM6QuWsEKugJnnP6iv2Mc4ncxE4A/OJkjuVOA+5X0X1S/nq5VJRa8Lu+nwcvbrKA==} dependencies: - '@types/node': 18.19.30 + '@types/node': 18.19.31 kleur: 3.0.3 dev: true @@ -8315,13 +8323,13 @@ packages: resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} dev: true - /@types/react-dom@18.2.24: - resolution: {integrity: sha512-cN6upcKd8zkGy4HU9F1+/s98Hrp6D4MOcippK4PoE8OZRngohHZpbJn1GsaDLz87MqvHNoT13nHvNqM9ocRHZg==} + /@types/react-dom@18.2.25: + resolution: {integrity: sha512-o/V48vf4MQh7juIKZU2QGDfli6p1+OOi5oXx36Hffpc9adsHeXjVp8rHuPkjd8VT8sOJ2Zp05HR7CdpGTIUFUA==} dependencies: - '@types/react': 18.2.74 + '@types/react': 18.2.78 - /@types/react@18.2.74: - resolution: {integrity: sha512-9AEqNZZyBx8OdZpxzQlaFEVCSFUM2YXJH46yPOiOpm078k6ZLOCcuAzGum/zK8YBwY+dbahVNbHrbgrAwIRlqw==} + /@types/react@18.2.78: + resolution: {integrity: sha512-qOwdPnnitQY4xKlKayt42q5W5UQrSHjgoXNVEtxeqdITJ99k4VXJOP3vt8Rkm9HmgJpH50UNU+rlqfkfWOqp0A==} dependencies: '@types/prop-types': 15.7.12 csstype: 3.1.3 @@ -8337,7 +8345,7 @@ packages: /@types/sax@1.2.7: resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} dependencies: - '@types/node': 18.19.30 + '@types/node': 18.19.31 dev: false /@types/semver@7.5.8: @@ -8348,27 +8356,27 @@ packages: resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} dependencies: '@types/mime': 1.3.5 - '@types/node': 18.19.30 + '@types/node': 18.19.31 dev: true /@types/serve-static@1.15.7: resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} dependencies: '@types/http-errors': 2.0.4 - '@types/node': 18.19.30 + '@types/node': 18.19.31 '@types/send': 0.17.4 dev: true /@types/server-destroy@1.0.3: resolution: {integrity: sha512-Qq0fn70C7TLDG1W9FCblKufNWW1OckQ41dVKV2Dku5KdZF7bexezG4e2WBaBKhdwL3HZ+cYCEIKwg2BRgzrWmA==} dependencies: - '@types/node': 18.19.30 + '@types/node': 18.19.31 dev: true /@types/set-cookie-parser@2.4.7: resolution: {integrity: sha512-+ge/loa0oTozxip6zmhRIk8Z/boU51wl9Q6QdLZcokIGMzY5lFXYy/x7Htj2HTC6/KZP1hUbZ1ekx8DYXICvWg==} dependencies: - '@types/node': 18.19.30 + '@types/node': 18.19.31 dev: true /@types/strip-bom@3.0.0: @@ -8405,13 +8413,13 @@ packages: /@types/ws@8.5.10: resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} dependencies: - '@types/node': 18.19.30 + '@types/node': 18.19.31 dev: false /@types/xml2js@0.4.14: resolution: {integrity: sha512-4YnrRemBShWRO2QjvUin8ESA41rH+9nQGLUGZV/1IDhi3SL9OhdpNC/MrulTWuptXKwhx/aDxE7toV0f/ypIXQ==} dependencies: - '@types/node': 18.19.30 + '@types/node': 18.19.31 dev: true /@types/yargs-parser@21.0.3: @@ -8633,7 +8641,7 @@ packages: '@babel/plugin-transform-react-jsx-source': 7.24.1(@babel/core@7.24.4) '@types/babel__core': 7.20.5 react-refresh: 0.14.0 - vite: 5.2.8(@types/node@18.19.30)(sass@1.74.1) + vite: 5.2.8(@types/node@18.19.31)(sass@1.75.0) transitivePeerDependencies: - supports-color dev: false @@ -8651,7 +8659,7 @@ packages: '@babel/core': 7.24.4 '@babel/plugin-transform-typescript': 7.24.4(@babel/core@7.24.4) '@vue/babel-plugin-jsx': 1.2.2(@babel/core@7.24.4) - vite: 5.2.8(@types/node@18.19.30)(sass@1.74.1) + vite: 5.2.8(@types/node@18.19.31)(sass@1.75.0) vue: 3.4.21(typescript@5.2.2) transitivePeerDependencies: - supports-color @@ -8667,42 +8675,42 @@ packages: vite: optional: true dependencies: - vite: 5.2.8(@types/node@18.19.30)(sass@1.74.1) + vite: 5.2.8(@types/node@18.19.31)(sass@1.75.0) vue: 3.4.21(typescript@5.2.2) dev: false - /@vitest/expect@1.4.0: - resolution: {integrity: sha512-Jths0sWCJZ8BxjKe+p+eKsoqev1/T8lYcrjavEaz8auEJ4jAVY0GwW3JKmdVU4mmNPLPHixh4GNXP7GFtAiDHA==} + /@vitest/expect@1.5.0: + resolution: {integrity: sha512-0pzuCI6KYi2SIC3LQezmxujU9RK/vwC1U9R0rLuGlNGcOuDWxqWKu6nUdFsX9tH1WU0SXtAxToOsEjeUn1s3hA==} dependencies: - '@vitest/spy': 1.4.0 - '@vitest/utils': 1.4.0 + '@vitest/spy': 1.5.0 + '@vitest/utils': 1.5.0 chai: 4.4.1 dev: false - /@vitest/runner@1.4.0: - resolution: {integrity: sha512-EDYVSmesqlQ4RD2VvWo3hQgTJ7ZrFQ2VSJdfiJiArkCerDAGeyF1i6dHkmySqk573jLp6d/cfqCN+7wUB5tLgg==} + /@vitest/runner@1.5.0: + resolution: {integrity: sha512-7HWwdxXP5yDoe7DTpbif9l6ZmDwCzcSIK38kTSIt6CFEpMjX4EpCgT6wUmS0xTXqMI6E/ONmfgRKmaujpabjZQ==} dependencies: - '@vitest/utils': 1.4.0 + '@vitest/utils': 1.5.0 p-limit: 5.0.0 pathe: 1.1.2 dev: false - /@vitest/snapshot@1.4.0: - resolution: {integrity: sha512-saAFnt5pPIA5qDGxOHxJ/XxhMFKkUSBJmVt5VgDsAqPTX6JP326r5C/c9UuCMPoXNzuudTPsYDZCoJ5ilpqG2A==} + /@vitest/snapshot@1.5.0: + resolution: {integrity: sha512-qpv3fSEuNrhAO3FpH6YYRdaECnnRjg9VxbhdtPwPRnzSfHVXnNzzrpX4cJxqiwgRMo7uRMWDFBlsBq4Cr+rO3A==} dependencies: magic-string: 0.30.9 pathe: 1.1.2 pretty-format: 29.7.0 dev: false - /@vitest/spy@1.4.0: - resolution: {integrity: sha512-Ywau/Qs1DzM/8Uc+yA77CwSegizMlcgTJuYGAi0jujOteJOUf1ujunHThYo243KG9nAyWT3L9ifPYZ5+As/+6Q==} + /@vitest/spy@1.5.0: + resolution: {integrity: sha512-vu6vi6ew5N5MMHJjD5PoakMRKYdmIrNJmyfkhRpQt5d9Ewhw9nZ5Aqynbi3N61bvk9UvZ5UysMT6ayIrZ8GA9w==} dependencies: tinyspy: 2.2.1 dev: false - /@vitest/utils@1.4.0: - resolution: {integrity: sha512-mx3Yd1/6e2Vt/PUC98DcqTirtfxUyAZ32uK82r8rZzbtBeBo+nqgnjx/LvqQdWsrvNtm14VmurNgcf4nqY5gJg==} + /@vitest/utils@1.5.0: + resolution: {integrity: sha512-BDU0GNL8MWkRkSRdNFvCUCAVOeHaUlVJ9Tx0TYBZyXaaOTmGtUFObzchCivIBrIwKzvZA7A9sCejVhXM2aY98A==} dependencies: diff-sequences: 29.6.3 estree-walker: 3.0.3 @@ -8723,7 +8731,7 @@ packages: vscode-uri: 3.0.8 dev: true - /@volar/kit@2.1.6(typescript@5.4.4): + /@volar/kit@2.1.6(typescript@5.4.5): resolution: {integrity: sha512-dSuXChDGM0nSG/0fxqlNfadjpAeeo1P1SJPBQ+pDf8H1XrqeJq5gIhxRTEbiS+dyNIG69ATq1CArkbCif+oxJw==} peerDependencies: typescript: '*' @@ -8731,7 +8739,7 @@ packages: '@volar/language-service': 2.1.6 '@volar/typescript': 2.1.6 typesafe-path: 0.2.2 - typescript: 5.4.4 + typescript: 5.4.5 vscode-languageserver-textdocument: 1.0.11 vscode-uri: 3.0.8 dev: false @@ -9154,7 +9162,7 @@ packages: peerDependencies: astro: '*' dependencies: - '@types/node': 18.19.30 + '@types/node': 18.19.31 acorn: 8.11.3 astro: link:packages/astro dev: false @@ -9166,8 +9174,8 @@ packages: dependencies: '@astro-community/astro-embed-integration': 0.6.2(astro@packages+astro) '@astro-community/astro-embed-twitter': 0.5.4(astro@packages+astro) - '@astro-community/astro-embed-vimeo': 0.3.6(astro@packages+astro) - '@astro-community/astro-embed-youtube': 0.5.1(astro@packages+astro) + '@astro-community/astro-embed-vimeo': 0.3.7(astro@packages+astro) + '@astro-community/astro-embed-youtube': 0.5.2(astro@packages+astro) astro: link:packages/astro dev: false @@ -9228,7 +9236,7 @@ packages: postcss: ^8.1.0 dependencies: browserslist: 4.23.0 - caniuse-lite: 1.0.30001607 + caniuse-lite: 1.0.30001610 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.0.0 @@ -9249,7 +9257,6 @@ packages: /b4a@1.6.6: resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} - requiresBuild: true dev: false /babel-plugin-jsx-dom-expressions@0.37.19(@babel/core@7.24.4): @@ -9360,7 +9367,6 @@ packages: /bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - requiresBuild: true dependencies: buffer: 5.7.1 inherits: 2.0.4 @@ -9444,8 +9450,8 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001607 - electron-to-chromium: 1.4.729 + caniuse-lite: 1.0.30001610 + electron-to-chromium: 1.4.736 node-releases: 2.0.14 update-browserslist-db: 1.0.13(browserslist@4.23.0) @@ -9530,8 +9536,8 @@ packages: engines: {node: '>=14.16'} dev: false - /caniuse-lite@1.0.30001607: - resolution: {integrity: sha512-WcvhVRjXLKFB/kmOFVwELtMxyhq3iM/MvmXcyCe2PNf166c39mptscOc/45TTS96n2gpNV2z7+NakArTWZCQ3w==} + /caniuse-lite@1.0.30001610: + resolution: {integrity: sha512-QFutAY4NgaelojVMjY63o6XlZyORPaLfyMnsl3HgnWdJUcX6K0oaJymHjH8PT5Gk7sTm8rvC/c5COUQKXqmOMA==} /canvas-confetti@1.9.2: resolution: {integrity: sha512-6Xi7aHHzKwxZsem4mCKoqP6YwUG3HamaHHAlz1hTNQPCqXhARFpSXnkC9TWlahHY5CG6hSL5XexNjxK8irVErg==} @@ -9652,7 +9658,6 @@ packages: /chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - requiresBuild: true dev: false /chownr@2.0.0: @@ -9777,11 +9782,9 @@ packages: /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - requiresBuild: true /color-string@1.9.1: resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} - requiresBuild: true dependencies: color-name: 1.1.4 simple-swizzle: 0.2.2 @@ -9795,7 +9798,6 @@ packages: /color@4.2.3: resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} engines: {node: '>=12.5.0'} - requiresBuild: true dependencies: color-convert: 2.0.1 color-string: 1.9.1 @@ -10130,7 +10132,6 @@ packages: /decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} - requiresBuild: true dependencies: mimic-response: 3.1.0 dev: false @@ -10152,7 +10153,6 @@ packages: /deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} - requiresBuild: true dev: false /deep-is@0.1.4: @@ -10352,8 +10352,8 @@ packages: engines: {node: '>=10'} dev: true - /drizzle-orm@0.30.7(@libsql/client@0.5.6): - resolution: {integrity: sha512-9qefSZQlu2fO2qv24piHyWFWcxcOY15//0v4j8qomMqaxzipNoG+fUBrQ7Ftk7PY7APRbRdn/nkEXWxiI4a8mw==} + /drizzle-orm@0.30.8(@libsql/client@0.5.6): + resolution: {integrity: sha512-9pBJA0IjnpPpzZ6s9jlS1CQAbKoBmbn2GJesPhXaVblAA/joOJ4AWWevYcqvLGj9SvThBAl7WscN8Zwgg5mnTw==} peerDependencies: '@aws-sdk/client-rds-data': '>=3' '@cloudflare/workers-types': '>=3' @@ -10456,8 +10456,8 @@ packages: /ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - /electron-to-chromium@1.4.729: - resolution: {integrity: sha512-bx7+5Saea/qu14kmPTDHQxkp2UnziG3iajUQu3BxFvCOnpAJdDbMV4rSl+EqFDkkpNNVUFlR1kDfpL59xfy1HA==} + /electron-to-chromium@1.4.736: + resolution: {integrity: sha512-Rer6wc3ynLelKNM4lOCg7/zPQj8tPOCB2hzD32PX9wd3hgRRi9MxEbmkFCokzcEhRVMiOVLjnL9ig9cefJ+6+Q==} /emmet@2.4.7: resolution: {integrity: sha512-O5O5QNqtdlnQM2bmKHtJgyChcrFMgQuulI+WdiOw2NArzprUqqxUW6bgYtKvzKgrsYpuLWalOkdhNP+1jluhCA==} @@ -10481,7 +10481,6 @@ packages: /end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - requiresBuild: true dependencies: once: 1.4.0 dev: false @@ -10929,7 +10928,6 @@ packages: /expand-template@2.0.3: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} - requiresBuild: true dev: false /express@4.19.2: @@ -11004,7 +11002,6 @@ packages: /fast-fifo@1.3.2: resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} - requiresBuild: true dev: false /fast-glob@3.3.2: @@ -11166,7 +11163,6 @@ packages: /fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - requiresBuild: true dev: false /fs-extra@10.1.0: @@ -11320,7 +11316,6 @@ packages: /github-from-package@0.0.0: resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} - requiresBuild: true dev: false /github-slugger@2.0.0: @@ -11903,7 +11898,6 @@ packages: /ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - requiresBuild: true dev: false /inline-style-parser@0.1.1: @@ -11951,7 +11945,6 @@ packages: /is-arrayish@0.3.2: resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - requiresBuild: true dev: false /is-bigint@1.0.4: @@ -12363,21 +12356,21 @@ packages: type-check: 0.4.0 dev: true - /libsql@0.3.10: - resolution: {integrity: sha512-/8YMTbwWFPmrDWY+YFK3kYqVPFkMgQre0DGmBaOmjogMdSe+7GHm1/q9AZ61AWkEub/vHmi+bA4tqIzVhKnqzg==} + /libsql@0.3.12: + resolution: {integrity: sha512-to30hj8O3DjS97wpbKN6ERZ8k66MN1IaOfFLR6oHqd25GMiPJ/ZX0VaZ7w+TsPmxcFS3p71qArj/hiedCyvXCg==} cpu: [x64, arm64, wasm32] os: [darwin, linux, win32] dependencies: '@neon-rs/load': 0.0.4 detect-libc: 2.0.2 optionalDependencies: - '@libsql/darwin-arm64': 0.3.10 - '@libsql/darwin-x64': 0.3.10 - '@libsql/linux-arm64-gnu': 0.3.10 - '@libsql/linux-arm64-musl': 0.3.10 - '@libsql/linux-x64-gnu': 0.3.10 - '@libsql/linux-x64-musl': 0.3.10 - '@libsql/win32-x64-msvc': 0.3.10 + '@libsql/darwin-arm64': 0.3.12 + '@libsql/darwin-x64': 0.3.12 + '@libsql/linux-arm64-gnu': 0.3.12 + '@libsql/linux-arm64-musl': 0.3.12 + '@libsql/linux-x64-gnu': 0.3.12 + '@libsql/linux-x64-musl': 0.3.12 + '@libsql/win32-x64-msvc': 0.3.12 dev: false /lilconfig@2.1.0: @@ -12887,8 +12880,8 @@ packages: engines: {node: '>= 0.6'} dev: true - /memfs@4.8.1: - resolution: {integrity: sha512-7q/AdPzf2WpwPlPL4v1kE2KsJsHl7EF4+hAeVzlyanr2+YnR21NVn9mDqo+7DEaKDRsQy8nvxPlKH4WqMtiO0w==} + /memfs@4.8.2: + resolution: {integrity: sha512-j4WKth315edViMBGkHW6NTF0QBjsTrcRDmYNcGsPq+ozMEyCCCIlX2d2mJ5wuh6iHvJ3FevUrr48v58YRqVdYg==} engines: {node: '>= 4.0.0'} dependencies: tslib: 2.6.2 @@ -13312,7 +13305,6 @@ packages: /mimic-response@3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} - requiresBuild: true dev: false /min-indent@1.0.1: @@ -13393,7 +13385,6 @@ packages: /mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - requiresBuild: true dev: false /mkdirp@1.0.4: @@ -13491,7 +13482,6 @@ packages: /napi-build-utils@1.0.2: resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} - requiresBuild: true dev: false /natural-compare@1.4.0: @@ -13529,14 +13519,12 @@ packages: /node-abi@3.57.0: resolution: {integrity: sha512-Dp+A9JWxRaKuHP35H77I4kCKesDy5HUDEmScia2FyncMTOXASMyg251F5PhFoDA5uqBrDDffiLpbqnrZmNXW+g==} engines: {node: '>=10'} - requiresBuild: true dependencies: semver: 7.6.0 dev: false /node-addon-api@6.1.0: resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} - requiresBuild: true dev: false /node-domexception@1.0.0: @@ -13585,7 +13573,7 @@ packages: engines: {node: '>=14'} dependencies: '@types/express': 4.17.21 - '@types/node': 20.12.5 + '@types/node': 20.12.7 accepts: 1.3.8 content-disposition: 0.5.4 depd: 1.1.2 @@ -14157,8 +14145,8 @@ packages: postcss: 8.4.38 dev: true - /postcss-custom-properties@13.3.6(postcss@8.4.38): - resolution: {integrity: sha512-vVVIwQbJiIz+PBLMIWA6XMi53Zg66/f474KolA7x0Das6EwkATc/9ZvM6zZx2gs7ZhcgVHjmWBbHkK9FlCgLeA==} + /postcss-custom-properties@13.3.7(postcss@8.4.38): + resolution: {integrity: sha512-0N9F/GUCr/D0IazjzHahyYW2bQVDT6qDtEudiGHAhMd3XqhfM3VmfYVlkc/40DOhsPtngSNb54/Ctu8msvFOvQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 @@ -14372,8 +14360,8 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-preset-env@9.5.4(postcss@8.4.38): - resolution: {integrity: sha512-o/jOlJjhm4f6rI5q1f+4Og3tz1cjaO50er9ndk7ZdcXHjWOH49kMAhqDC/nQifypQkOAiAmF46dPt3pZM+Cwbg==} + /postcss-preset-env@9.5.5(postcss@8.4.38): + resolution: {integrity: sha512-tg71KfEgTHMM+C4LpWtKfHFWEunfWj1JThq/Odsw60MOowcffBrMAcSBDE+imftW5/BD3mpOiiTL6c+KcnGaLQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 @@ -14420,7 +14408,7 @@ packages: postcss-color-hex-alpha: 9.0.4(postcss@8.4.38) postcss-color-rebeccapurple: 9.0.3(postcss@8.4.38) postcss-custom-media: 10.0.4(postcss@8.4.38) - postcss-custom-properties: 13.3.6(postcss@8.4.38) + postcss-custom-properties: 13.3.7(postcss@8.4.38) postcss-custom-selectors: 7.1.8(postcss@8.4.38) postcss-dir-pseudo-class: 8.0.1(postcss@8.4.38) postcss-double-position-gradients: 5.0.6(postcss@8.4.38) @@ -14487,31 +14475,30 @@ packages: picocolors: 1.0.0 source-map-js: 1.2.0 - /preact-render-to-string@6.3.1(preact@10.20.1): + /preact-render-to-string@6.3.1(preact@10.20.2): resolution: {integrity: sha512-NQ28WrjLtWY6lKDlTxnFpKHZdpjfF+oE6V4tZ0rTrunHrtZp6Dm0oFrcJalt/5PNeqJz4j1DuZDS0Y6rCBoqDA==} peerDependencies: preact: '>=10' dependencies: - preact: 10.20.1 + preact: 10.20.2 pretty-format: 3.8.0 dev: false - /preact-ssr-prepass@1.2.1(preact@10.20.1): + /preact-ssr-prepass@1.2.1(preact@10.20.2): resolution: {integrity: sha512-bLgbUfy8nL+PZghAPpyk9MF+cmXjdwEnxYPaJBmwbzFQqzIz8dQVBqjwB60RqZ9So/vIf6BRfHCiwFGuMCyfbQ==} peerDependencies: preact: '>=10 || ^10.0.0-beta.0 || ^10.0.0-alpha.0' dependencies: - preact: 10.20.1 + preact: 10.20.2 dev: false - /preact@10.20.1: - resolution: {integrity: sha512-JIFjgFg9B2qnOoGiYMVBtrcFxHqn+dNXbq76bVmcaHYJFYR4lW67AOcXgAYQQTDYXDOg/kTZrKPNCdRgJ2UJmw==} + /preact@10.20.2: + resolution: {integrity: sha512-S1d1ernz3KQ+Y2awUxKakpfOg2CEmJmwOP+6igPx6dgr6pgDvenqYviyokWso2rhHvGtTlWWnJDa7RaPbQerTg==} /prebuild-install@7.1.2: resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==} engines: {node: '>=10'} hasBin: true - requiresBuild: true dependencies: detect-libc: 2.0.3 expand-template: 2.0.3 @@ -14629,7 +14616,6 @@ packages: /pump@3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} - requiresBuild: true dependencies: end-of-stream: 1.4.4 once: 1.4.0 @@ -14687,7 +14673,6 @@ packages: /rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true - requiresBuild: true dependencies: deep-extend: 0.6.0 ini: 1.3.8 @@ -15115,28 +15100,29 @@ packages: dependencies: glob: 7.2.3 - /rollup@4.14.1: - resolution: {integrity: sha512-4LnHSdd3QK2pa1J6dFbfm1HN0D7vSK/ZuZTsdyUAlA6Rr1yTouUTL13HaDOGJVgby461AhrNGBS7sCGXXtT+SA==} + /rollup@4.14.3: + resolution: {integrity: sha512-ag5tTQKYsj1bhrFC9+OEWqb5O6VYgtQDO9hPDBMmIbePwhfSr+ExlcU741t8Dhw5DkPCQf6noz0jb36D6W9/hw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true dependencies: '@types/estree': 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.14.1 - '@rollup/rollup-android-arm64': 4.14.1 - '@rollup/rollup-darwin-arm64': 4.14.1 - '@rollup/rollup-darwin-x64': 4.14.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.14.1 - '@rollup/rollup-linux-arm64-gnu': 4.14.1 - '@rollup/rollup-linux-arm64-musl': 4.14.1 - '@rollup/rollup-linux-powerpc64le-gnu': 4.14.1 - '@rollup/rollup-linux-riscv64-gnu': 4.14.1 - '@rollup/rollup-linux-s390x-gnu': 4.14.1 - '@rollup/rollup-linux-x64-gnu': 4.14.1 - '@rollup/rollup-linux-x64-musl': 4.14.1 - '@rollup/rollup-win32-arm64-msvc': 4.14.1 - '@rollup/rollup-win32-ia32-msvc': 4.14.1 - '@rollup/rollup-win32-x64-msvc': 4.14.1 + '@rollup/rollup-android-arm-eabi': 4.14.3 + '@rollup/rollup-android-arm64': 4.14.3 + '@rollup/rollup-darwin-arm64': 4.14.3 + '@rollup/rollup-darwin-x64': 4.14.3 + '@rollup/rollup-linux-arm-gnueabihf': 4.14.3 + '@rollup/rollup-linux-arm-musleabihf': 4.14.3 + '@rollup/rollup-linux-arm64-gnu': 4.14.3 + '@rollup/rollup-linux-arm64-musl': 4.14.3 + '@rollup/rollup-linux-powerpc64le-gnu': 4.14.3 + '@rollup/rollup-linux-riscv64-gnu': 4.14.3 + '@rollup/rollup-linux-s390x-gnu': 4.14.3 + '@rollup/rollup-linux-x64-gnu': 4.14.3 + '@rollup/rollup-linux-x64-musl': 4.14.3 + '@rollup/rollup-win32-arm64-msvc': 4.14.3 + '@rollup/rollup-win32-ia32-msvc': 4.14.3 + '@rollup/rollup-win32-x64-msvc': 4.14.3 fsevents: 2.3.3 /rrweb-cssom@0.6.0: @@ -15187,8 +15173,8 @@ packages: dependencies: suf-log: 2.5.3 - /sass@1.74.1: - resolution: {integrity: sha512-w0Z9p/rWZWelb88ISOLyvqTWGmtmu2QJICqDBGyNnfG4OUnPX9BBjjYIXUpXCMOOg5MQWNpqzt876la1fsTvUA==} + /sass@1.75.0: + resolution: {integrity: sha512-ShMYi3WkrDWxExyxSZPst4/okE9ts46xZmJDSawJQrnte7M1V9fScVB+uNXOVKRBt0PggHOwoZcn8mYX4trnBw==} engines: {node: '>=14.0.0'} hasBin: true dependencies: @@ -15398,10 +15384,10 @@ packages: vscode-textmate: 5.2.0 dev: true - /shiki@1.2.4: - resolution: {integrity: sha512-Q9n9jKiOjJCRPztA9POn3/uZXNySHDNKAsPNpmtHDcFyi6ZQhx5vQKZW3Nhrwn8TWW3RudSRk66zqY603EZDeg==} + /shiki@1.3.0: + resolution: {integrity: sha512-9aNdQy/etMXctnPzsje1h1XIGm9YfRcSksKOGqZWXA/qP9G18/8fpz5Bjpma8bOgz3tqIpjERAd6/lLjFyzoww==} dependencies: - '@shikijs/core': 1.2.4 + '@shikijs/core': 1.3.0 dev: false /side-channel@1.0.6: @@ -15431,12 +15417,10 @@ packages: /simple-concat@1.0.1: resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} - requiresBuild: true dev: false /simple-get@4.0.1: resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} - requiresBuild: true dependencies: decompress-response: 6.0.0 once: 1.4.0 @@ -15460,7 +15444,6 @@ packages: /simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} - requiresBuild: true dependencies: is-arrayish: 0.3.2 dev: false @@ -15626,7 +15609,6 @@ packages: /streamx@2.16.1: resolution: {integrity: sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ==} - requiresBuild: true dependencies: fast-fifo: 1.3.2 queue-tick: 1.0.1 @@ -15844,16 +15826,16 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - /svelte-hmr@0.15.3(svelte@4.2.12): - resolution: {integrity: sha512-41snaPswvSf8TJUhlkoJBekRrABDXDMdpNpT2tfHIv4JuhgvHqLMhEPGtaQn0BmbNSTkuz2Ed20DF2eHw0SmBQ==} + /svelte-hmr@0.16.0(svelte@4.2.14): + resolution: {integrity: sha512-Gyc7cOS3VJzLlfj7wKS0ZnzDVdv3Pn2IuVeJPk9m2skfhcu5bq3wtIZyQGggr7/Iim5rH5cncyQft/kRLupcnA==} engines: {node: ^12.20 || ^14.13.1 || >= 16} peerDependencies: svelte: ^3.19.0 || ^4.0.0 dependencies: - svelte: 4.2.12 + svelte: 4.2.14 dev: false - /svelte2tsx@0.6.27(svelte@4.2.12)(typescript@5.2.2): + /svelte2tsx@0.6.27(svelte@4.2.14)(typescript@5.2.2): resolution: {integrity: sha512-E1uPW1o6VsbRz+nUk3fznZ2lSmCITAJoNu8AYefWSvIwE2pSB01i5sId4RMbWNzfcwCQl1DcgGShCPcldl4rvg==} peerDependencies: svelte: ^3.55 || ^4.0.0-next.0 || ^4.0 || ^5.0.0-next.0 @@ -15861,12 +15843,12 @@ packages: dependencies: dedent-js: 1.0.1 pascal-case: 3.1.2 - svelte: 4.2.12 + svelte: 4.2.14 typescript: 5.2.2 dev: false - /svelte@4.2.12: - resolution: {integrity: sha512-d8+wsh5TfPwqVzbm4/HCXC783/KPHV60NvwitJnyTA5lWn1elhXMNWhXGCJ7PwPa8qFUnyJNIyuIRt2mT0WMug==} + /svelte@4.2.14: + resolution: {integrity: sha512-ry3+YlWqZpHxLy45MW4MZIxNdvB+Wl7p2nnstWKbOAewaJyNJuOtivSbRChcfIej6wFBjWqyKmf/NgK1uW2JAA==} engines: {node: '>=16'} dependencies: '@ampproject/remapping': 2.3.0 @@ -15951,7 +15933,6 @@ packages: /tar-fs@2.1.1: resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} - requiresBuild: true dependencies: chownr: 1.1.4 mkdirp-classic: 0.5.3 @@ -15961,7 +15942,6 @@ packages: /tar-fs@3.0.5: resolution: {integrity: sha512-JOgGAmZyMgbqpLwct7ZV8VzkEB6pxXFBVErLtb+XCOqzc6w1xiWKI9GVd6bwk68EX7eJ4DWmfXVmq8K2ziZTGg==} - requiresBuild: true dependencies: pump: 3.0.0 tar-stream: 3.1.7 @@ -15973,7 +15953,6 @@ packages: /tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} engines: {node: '>=6'} - requiresBuild: true dependencies: bl: 4.1.0 end-of-stream: 1.4.4 @@ -15984,7 +15963,6 @@ packages: /tar-stream@3.1.7: resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} - requiresBuild: true dependencies: b4a: 1.6.6 fast-fifo: 1.3.2 @@ -16043,12 +16021,12 @@ packages: globrex: 0.1.2 dev: true - /tinybench@2.6.0: - resolution: {integrity: sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==} + /tinybench@2.7.0: + resolution: {integrity: sha512-Qgayeb106x2o4hNzNjsZEfFziw8IbKqtbXBjVh7VIZfBxfD5M4gWtpyx5+YTae2gJ6Y6Dz/KLepiv16RFeQWNA==} dev: false - /tinypool@0.8.3: - resolution: {integrity: sha512-Ud7uepAklqRH1bvwy22ynrliC7Dljz7Tm8M/0RBUW+YRa4YHhZ6e4PpgE+fu1zr/WqB1kbeuVrdfeuyIBpy4tw==} + /tinypool@0.8.4: + resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} engines: {node: '>=14.0.0'} dev: false @@ -16184,7 +16162,6 @@ packages: /tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - requiresBuild: true dependencies: safe-buffer: 5.2.1 dev: false @@ -16374,8 +16351,8 @@ packages: engines: {node: '>=14.17'} hasBin: true - /typescript@5.4.4: - resolution: {integrity: sha512-dGE2Vv8cpVvw28v8HCPqyb08EzbBURxDpuhJvTrusShUfGnhHBafDsLdS1EhhxyL6BJQE+2cT3dDPAv+MQ6oLw==} + /typescript@5.4.5: + resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} engines: {node: '>=14.17'} hasBin: true @@ -16412,8 +16389,8 @@ packages: /undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - /undici@6.12.0: - resolution: {integrity: sha512-d87yk8lqSFUYtR5fTFe2frpkMIrUEz+lgoJmhcL+J3StVl+8fj8ytE4lLnJOTPCE12YbumNGzf4LYsQyusdV5g==} + /undici@6.13.0: + resolution: {integrity: sha512-Q2rtqmZWrbP8nePMq7mOJIN98M0fYvSgV89vwl/BQRT4mDOeY2GXZngfGpcBBhtky3woM7G24wZV3Q304Bv6cw==} engines: {node: '>=18.0'} dev: true @@ -16693,8 +16670,8 @@ packages: unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 - /vite-node@1.4.0(@types/node@18.19.30): - resolution: {integrity: sha512-VZDAseqjrHgNd4Kh8icYHWzTKSCZMhia7GyHfhtzLW33fZlG9SwsB6CEhgyVOWkJfJ2pFLrp/Gj1FSfAiqH9Lw==} + /vite-node@1.5.0(@types/node@18.19.31): + resolution: {integrity: sha512-tV8h6gMj6vPzVCa7l+VGq9lwoJjW8Y79vst8QZZGiuRAfijU+EEWuc0kFpmndQrWhMMhet1jdSF+40KSZUqIIw==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true dependencies: @@ -16702,7 +16679,7 @@ packages: debug: 4.3.4(supports-color@8.1.1) pathe: 1.1.2 picocolors: 1.0.0 - vite: 5.2.8(@types/node@18.19.30)(sass@1.74.1) + vite: 5.2.8(@types/node@18.19.31)(sass@1.75.0) transitivePeerDependencies: - '@types/node' - less @@ -16760,7 +16737,7 @@ packages: svgo: 3.2.0 dev: false - /vite@5.2.8(@types/node@18.19.30)(sass@1.74.1): + /vite@5.2.8(@types/node@18.19.31)(sass@1.75.0): resolution: {integrity: sha512-OyZR+c1CE8yeHw5V5t59aXsUPPVTHMDjEZz8MgguLL/Q7NblxhZUlTu9xSPqlsUO/y+X7dlU05jdhvyycD55DA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -16788,11 +16765,11 @@ packages: terser: optional: true dependencies: - '@types/node': 18.19.30 + '@types/node': 18.19.31 esbuild: 0.20.2 postcss: 8.4.38 - rollup: 4.14.1 - sass: 1.74.1 + rollup: 4.14.3 + sass: 1.75.0 optionalDependencies: fsevents: 2.3.3 @@ -16804,18 +16781,18 @@ packages: vite: optional: true dependencies: - vite: 5.2.8(@types/node@18.19.30)(sass@1.74.1) + vite: 5.2.8(@types/node@18.19.31)(sass@1.75.0) dev: false - /vitest@1.4.0(@types/node@18.19.30): - resolution: {integrity: sha512-gujzn0g7fmwf83/WzrDTnncZt2UiXP41mHuFYFrdwaLRVQ6JYQEiME2IfEjU3vcFL3VKa75XhI3lFgn+hfVsQw==} + /vitest@1.5.0(@types/node@18.19.31): + resolution: {integrity: sha512-d8UKgR0m2kjdxDWX6911uwxout6GHS0XaGH1cksSIVVG8kRlE7G7aBw7myKQCvDI5dT4j7ZMa+l706BIORMDLw==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 1.4.0 - '@vitest/ui': 1.4.0 + '@vitest/browser': 1.5.0 + '@vitest/ui': 1.5.0 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -16832,12 +16809,12 @@ packages: jsdom: optional: true dependencies: - '@types/node': 18.19.30 - '@vitest/expect': 1.4.0 - '@vitest/runner': 1.4.0 - '@vitest/snapshot': 1.4.0 - '@vitest/spy': 1.4.0 - '@vitest/utils': 1.4.0 + '@types/node': 18.19.31 + '@vitest/expect': 1.5.0 + '@vitest/runner': 1.5.0 + '@vitest/snapshot': 1.5.0 + '@vitest/spy': 1.5.0 + '@vitest/utils': 1.5.0 acorn-walk: 8.3.2 chai: 4.4.1 debug: 4.3.4(supports-color@8.1.1) @@ -16848,10 +16825,10 @@ packages: picocolors: 1.0.0 std-env: 3.7.0 strip-literal: 2.1.0 - tinybench: 2.6.0 - tinypool: 0.8.3 - vite: 5.2.8(@types/node@18.19.30)(sass@1.74.1) - vite-node: 1.4.0(@types/node@18.19.30) + tinybench: 2.7.0 + tinypool: 0.8.4 + vite: 5.2.8(@types/node@18.19.31)(sass@1.75.0) + vite-node: 1.5.0(@types/node@18.19.31) why-is-node-running: 2.2.2 transitivePeerDependencies: - less From 1ce22881c657becf0397b83ac393fb5d2399104c Mon Sep 17 00:00:00 2001 From: Bjorn Lu Date: Tue, 16 Apr 2024 19:48:49 +0800 Subject: [PATCH 09/36] Improve sitemap generate performance (#10795) --- .changeset/famous-seals-camp.md | 5 + .../sitemap/src/generate-sitemap.ts | 100 +++++++----- .../sitemap/src/utils/parse-i18n-url.ts | 42 +++++ .../sitemap/src/utils/parse-url.ts | 39 ----- .../test/units/generate-sitemap.test.js | 147 ++++++++++++++++++ 5 files changed, 257 insertions(+), 76 deletions(-) create mode 100644 .changeset/famous-seals-camp.md create mode 100644 packages/integrations/sitemap/src/utils/parse-i18n-url.ts delete mode 100644 packages/integrations/sitemap/src/utils/parse-url.ts create mode 100644 packages/integrations/sitemap/test/units/generate-sitemap.test.js diff --git a/.changeset/famous-seals-camp.md b/.changeset/famous-seals-camp.md new file mode 100644 index 0000000000..b1703ee45e --- /dev/null +++ b/.changeset/famous-seals-camp.md @@ -0,0 +1,5 @@ +--- +"@astrojs/sitemap": patch +--- + +Improves performance when generating the sitemap data diff --git a/packages/integrations/sitemap/src/generate-sitemap.ts b/packages/integrations/sitemap/src/generate-sitemap.ts index b10771ce48..abd5d2c6ff 100644 --- a/packages/integrations/sitemap/src/generate-sitemap.ts +++ b/packages/integrations/sitemap/src/generate-sitemap.ts @@ -1,51 +1,77 @@ import type { EnumChangefreq } from 'sitemap'; import type { SitemapItem, SitemapOptions } from './index.js'; -import { parseUrl } from './utils/parse-url.js'; +import { parseI18nUrl } from './utils/parse-i18n-url.js'; /** Construct sitemap.xml given a set of URLs */ -export function generateSitemap(pages: string[], finalSiteUrl: string, opts: SitemapOptions) { - const { changefreq, priority, lastmod: lastmodSrc, i18n } = opts!; +export function generateSitemap(pages: string[], finalSiteUrl: string, opts?: SitemapOptions) { + const { changefreq, priority, lastmod: lastmodSrc, i18n } = opts ?? {}; // TODO: find way to respect URLs here const urls = [...pages]; urls.sort((a, b) => a.localeCompare(b, 'en', { numeric: true })); // sort alphabetically so sitemap is same each time const lastmod = lastmodSrc?.toISOString(); - const { locales, defaultLocale } = i18n || {}; - const localeCodes = Object.keys(locales || {}); + // Parse URLs for i18n matching later + const { defaultLocale, locales } = i18n ?? {}; + let getI18nLinks: GetI18nLinks | undefined; + if (defaultLocale && locales) { + getI18nLinks = createGetI18nLinks(urls, defaultLocale, locales, finalSiteUrl); + } - const getPath = (url: string) => { - const result = parseUrl(url, i18n?.defaultLocale || '', localeCodes, finalSiteUrl); - return result?.path; - }; - const getLocale = (url: string) => { - const result = parseUrl(url, i18n?.defaultLocale || '', localeCodes, finalSiteUrl); - return result?.locale; - }; - - const urlData: SitemapItem[] = urls.map((url) => { - let links; - if (defaultLocale && locales) { - const currentPath = getPath(url); - if (currentPath) { - const filtered = urls.filter((subUrl) => getPath(subUrl) === currentPath); - if (filtered.length > 1) { - links = filtered.map((subUrl) => ({ - url: subUrl, - lang: locales[getLocale(subUrl)!], - })); - } - } - } - - return { - url, - links, - lastmod, - priority, - changefreq: changefreq as EnumChangefreq, - }; - }); + const urlData: SitemapItem[] = urls.map((url, i) => ({ + url, + links: getI18nLinks?.(i), + lastmod, + priority, + changefreq: changefreq as EnumChangefreq, + })); return urlData; } + +type GetI18nLinks = (urlIndex: number) => SitemapItem['links'] | undefined; + +function createGetI18nLinks( + urls: string[], + defaultLocale: string, + locales: Record, + finalSiteUrl: string +): GetI18nLinks { + // `parsedI18nUrls` will have the same length as `urls`, matching correspondingly + const parsedI18nUrls = urls.map((url) => parseI18nUrl(url, defaultLocale, locales, finalSiteUrl)); + // Cache as multiple i18n URLs with the same path will have the same links + const i18nPathToLinksCache = new Map(); + + return (urlIndex) => { + const i18nUrl = parsedI18nUrls[urlIndex]; + if (!i18nUrl) { + return undefined; + } + + const cached = i18nPathToLinksCache.get(i18nUrl.path); + if (cached) { + return cached; + } + + // Find all URLs with the same path (without the locale part), e.g. /en/foo and /es/foo + const links: NonNullable = []; + for (let i = 0; i < parsedI18nUrls.length; i++) { + const parsed = parsedI18nUrls[i]; + if (parsed?.path === i18nUrl.path) { + links.push({ + url: urls[i], + lang: locales[parsed.locale], + }); + } + } + + // If 0 or 1 (which is itself), return undefined to not create any links. + // We also don't need to cache this as we know there's no other URLs that would've match this. + if (links.length <= 1) { + return undefined; + } + + i18nPathToLinksCache.set(i18nUrl.path, links); + return links; + }; +} diff --git a/packages/integrations/sitemap/src/utils/parse-i18n-url.ts b/packages/integrations/sitemap/src/utils/parse-i18n-url.ts new file mode 100644 index 0000000000..5b7ebf7855 --- /dev/null +++ b/packages/integrations/sitemap/src/utils/parse-i18n-url.ts @@ -0,0 +1,42 @@ +interface ParsedI18nUrl { + locale: string; + path: string; +} + +// NOTE: The parameters have been schema-validated with Zod +export function parseI18nUrl( + url: string, + defaultLocale: string, + locales: Record, + base: string +): ParsedI18nUrl | undefined { + if (!url.startsWith(base)) { + return undefined; + } + + let s = url.slice(base.length); + + // Handle root URL + if (!s || s === '/') { + return { locale: defaultLocale, path: '/' }; + } + + if (s[0] !== '/') { + s = '/' + s; + } + + // Get locale from path, e.g. + // "/en-US/" -> "en-US" + // "/en-US/foo" -> "en-US" + const locale = s.split('/')[1]; + if (locale in locales) { + // "/en-US/foo" -> "/foo" + let path = s.slice(1 + locale.length); + if (!path) { + path = '/'; + } + return { locale, path }; + } + + return { locale: defaultLocale, path: s }; +} diff --git a/packages/integrations/sitemap/src/utils/parse-url.ts b/packages/integrations/sitemap/src/utils/parse-url.ts deleted file mode 100644 index f9189cf7d6..0000000000 --- a/packages/integrations/sitemap/src/utils/parse-url.ts +++ /dev/null @@ -1,39 +0,0 @@ -export const parseUrl = ( - url: string, - defaultLocale: string, - localeCodes: string[], - base: string -) => { - if ( - !url || - !defaultLocale || - localeCodes.length === 0 || - localeCodes.some((key) => !key) || - !base - ) { - throw new Error('parseUrl: some parameters are empty'); - } - if (url.indexOf(base) !== 0) { - return undefined; - } - let s = url.replace(base, ''); - if (!s || s === '/') { - return { locale: defaultLocale, path: '/' }; - } - if (!s.startsWith('/')) { - s = '/' + s; - } - const a = s.split('/'); - const locale = a[1]; - if (localeCodes.some((key) => key === locale)) { - let path = a.slice(2).join('/'); - if (path === '//') { - path = '/'; - } - if (path !== '/' && !path.startsWith('/')) { - path = '/' + path; - } - return { locale, path }; - } - return { locale: defaultLocale, path: s }; -}; diff --git a/packages/integrations/sitemap/test/units/generate-sitemap.test.js b/packages/integrations/sitemap/test/units/generate-sitemap.test.js new file mode 100644 index 0000000000..2af0e42ab8 --- /dev/null +++ b/packages/integrations/sitemap/test/units/generate-sitemap.test.js @@ -0,0 +1,147 @@ +import assert from 'node:assert/strict'; +import { describe, it } from 'node:test'; +import { generateSitemap } from '../../dist/generate-sitemap.js'; + +const site = 'http://example.com'; + +describe('generateSitemap', () => { + describe('basic', () => { + it('works', () => { + const items = generateSitemap( + [ + // All pages + `${site}/a`, + `${site}/b`, + `${site}/c`, + ], + site + ); + assert.equal(items.length, 3); + assert.equal(items[0].url, `${site}/a`); + assert.equal(items[1].url, `${site}/b`); + assert.equal(items[2].url, `${site}/c`); + }); + + it('sorts the items', () => { + const items = generateSitemap( + [ + // All pages + `${site}/c`, + `${site}/a`, + `${site}/b`, + ], + site + ); + assert.equal(items.length, 3); + assert.equal(items[0].url, `${site}/a`); + assert.equal(items[1].url, `${site}/b`); + assert.equal(items[2].url, `${site}/c`); + }); + + it('sitemap props are passed to items', () => { + const now = new Date(); + const items = generateSitemap( + [ + // All pages + `${site}/a`, + `${site}/b`, + `${site}/c`, + ], + site, + { + changefreq: 'monthly', + lastmod: now, + priority: 0.5, + } + ); + + assert.equal(items.length, 3); + + assert.equal(items[0].url, `${site}/a`); + assert.equal(items[0].changefreq, 'monthly'); + assert.equal(items[0].lastmod, now.toISOString()); + assert.equal(items[0].priority, 0.5); + + assert.equal(items[1].url, `${site}/b`); + assert.equal(items[1].changefreq, 'monthly'); + assert.equal(items[1].lastmod, now.toISOString()); + assert.equal(items[1].priority, 0.5); + + assert.equal(items[2].url, `${site}/c`); + assert.equal(items[2].changefreq, 'monthly'); + assert.equal(items[2].lastmod, now.toISOString()); + assert.equal(items[2].priority, 0.5); + }); + }); + + describe('i18n', () => { + it('works', () => { + const items = generateSitemap( + [ + // All pages + `${site}/a`, + `${site}/b`, + `${site}/c`, + `${site}/es/a`, + `${site}/es/b`, + `${site}/es/c`, + `${site}/fr/a`, + `${site}/fr/b`, + // `${site}/fr-CA/c`, (intentionally missing for testing) + ], + site, + { + i18n: { + defaultLocale: 'en', + locales: { + en: 'en-US', + es: 'es-ES', + fr: 'fr-CA', + }, + }, + } + ); + + assert.equal(items.length, 8); + + const aLinks = [ + { url: `${site}/a`, lang: 'en-US' }, + { url: `${site}/es/a`, lang: 'es-ES' }, + { url: `${site}/fr/a`, lang: 'fr-CA' }, + ]; + const bLinks = [ + { url: `${site}/b`, lang: 'en-US' }, + { url: `${site}/es/b`, lang: 'es-ES' }, + { url: `${site}/fr/b`, lang: 'fr-CA' }, + ]; + const cLinks = [ + { url: `${site}/c`, lang: 'en-US' }, + { url: `${site}/es/c`, lang: 'es-ES' }, + ]; + + assert.equal(items[0].url, `${site}/a`); + assert.deepEqual(items[0].links, aLinks); + + assert.equal(items[1].url, `${site}/b`); + assert.deepEqual(items[1].links, bLinks); + + assert.equal(items[2].url, `${site}/c`); + assert.deepEqual(items[2].links, cLinks); + + assert.equal(items[3].url, `${site}/es/a`); + assert.deepEqual(items[3].links, aLinks); + + assert.equal(items[4].url, `${site}/es/b`); + assert.deepEqual(items[4].links, bLinks); + + assert.equal(items[5].url, `${site}/es/c`); + assert.deepEqual(items[5].links, cLinks); + + assert.equal(items[6].url, `${site}/fr/a`); + assert.deepEqual(items[6].links, aLinks); + + assert.equal(items[7].url, `${site}/fr/b`); + assert.deepEqual(items[7].links, bLinks); + }); + }); +}); From 90669472df3a05b33f0de46fd2d039e3eba7f7dd Mon Sep 17 00:00:00 2001 From: Bjorn Lu Date: Tue, 16 Apr 2024 21:21:19 +0800 Subject: [PATCH 10/36] Disable streaming for SSG (#10796) --- .changeset/eight-hotels-try.md | 5 +++++ packages/astro/src/core/build/pipeline.ts | 3 ++- packages/astro/src/runtime/server/render/astro/render.ts | 4 ++++ packages/astro/test/content-collections-render.test.js | 6 +----- 4 files changed, 12 insertions(+), 6 deletions(-) create mode 100644 .changeset/eight-hotels-try.md diff --git a/.changeset/eight-hotels-try.md b/.changeset/eight-hotels-try.md new file mode 100644 index 0000000000..f1fab2897d --- /dev/null +++ b/.changeset/eight-hotels-try.md @@ -0,0 +1,5 @@ +--- +"astro": patch +--- + +Disables streaming when rendering site with `output: "static"` diff --git a/packages/astro/src/core/build/pipeline.ts b/packages/astro/src/core/build/pipeline.ts index a89aa10f07..245904660c 100644 --- a/packages/astro/src/core/build/pipeline.ts +++ b/packages/astro/src/core/build/pipeline.ts @@ -53,7 +53,8 @@ export class BuildPipeline extends Pipeline { return assetLink; } const serverLike = isServerLikeOutput(config); - const streaming = true; + // We can skip streaming in SSG for performance as writing as strings are faster + const streaming = serverLike; super( options.logger, manifest, diff --git a/packages/astro/src/runtime/server/render/astro/render.ts b/packages/astro/src/runtime/server/render/astro/render.ts index 37a78725a0..f918f55c11 100644 --- a/packages/astro/src/runtime/server/render/astro/render.ts +++ b/packages/astro/src/runtime/server/render/astro/render.ts @@ -31,6 +31,10 @@ export async function renderToString( let str = ''; let renderedFirstPageChunk = false; + if (isPage) { + await bufferHeadContent(result); + } + const destination: RenderDestination = { write(chunk) { // Automatic doctype insertion for pages diff --git a/packages/astro/test/content-collections-render.test.js b/packages/astro/test/content-collections-render.test.js index 0e8e37fb17..277ef8c069 100644 --- a/packages/astro/test/content-collections-render.test.js +++ b/packages/astro/test/content-collections-render.test.js @@ -2,11 +2,7 @@ import * as assert from 'node:assert/strict'; import { after, before, describe, it } from 'node:test'; import * as cheerio from 'cheerio'; import testAdapter from './test-adapter.js'; -import { isWindows, loadFixture } from './test-utils.js'; - -if (!isWindows) { - describe(); -} +import { loadFixture } from './test-utils.js'; describe('Content Collections - render()', () => { describe('Build - SSG', () => { From a92e263beb6e0166f1f13c97803d1861793e2a99 Mon Sep 17 00:00:00 2001 From: Rishi Raj Jain Date: Tue, 16 Apr 2024 18:53:50 +0530 Subject: [PATCH 11/36] fix: use assetsDir in creating vite config (#10732) Co-authored-by: Emanuele Stoppa --- .changeset/afraid-laws-speak.md | 5 +++ packages/astro/src/core/create-vite.ts | 1 + packages/astro/test/astro-assets-dir.test.js | 36 ++++++++++++++++++ .../astro-assets-dir/astro.config.mjs | 7 ++++ .../fixtures/astro-assets-dir/package.json | 11 ++++++ .../astro-assets-dir/src/assets/penguin1.jpg | Bin 0 -> 11621 bytes .../astro-assets-dir/src/assets/ペンギン.jpg | Bin 0 -> 11621 bytes .../src/components/Counter.jsx | 11 ++++++ .../src/content/blog/my-post.md | 6 +++ .../astro-assets-dir/src/content/config.ts | 12 ++++++ .../astro-assets-dir/src/pages/blog.astro | 16 ++++++++ .../astro-assets-dir/src/pages/index.astro | 23 +++++++++++ .../astro-assets-dir/src/pages/markdown.md | 7 ++++ pnpm-lock.yaml | 15 ++++++++ 14 files changed, 150 insertions(+) create mode 100644 .changeset/afraid-laws-speak.md create mode 100644 packages/astro/test/astro-assets-dir.test.js create mode 100644 packages/astro/test/fixtures/astro-assets-dir/astro.config.mjs create mode 100644 packages/astro/test/fixtures/astro-assets-dir/package.json create mode 100644 packages/astro/test/fixtures/astro-assets-dir/src/assets/penguin1.jpg create mode 100644 packages/astro/test/fixtures/astro-assets-dir/src/assets/ペンギン.jpg create mode 100644 packages/astro/test/fixtures/astro-assets-dir/src/components/Counter.jsx create mode 100644 packages/astro/test/fixtures/astro-assets-dir/src/content/blog/my-post.md create mode 100644 packages/astro/test/fixtures/astro-assets-dir/src/content/config.ts create mode 100644 packages/astro/test/fixtures/astro-assets-dir/src/pages/blog.astro create mode 100644 packages/astro/test/fixtures/astro-assets-dir/src/pages/index.astro create mode 100644 packages/astro/test/fixtures/astro-assets-dir/src/pages/markdown.md diff --git a/.changeset/afraid-laws-speak.md b/.changeset/afraid-laws-speak.md new file mode 100644 index 0000000000..62e4a8bd6f --- /dev/null +++ b/.changeset/afraid-laws-speak.md @@ -0,0 +1,5 @@ +--- +"astro": patch +--- + +Correctly sets `build.assets` directory during `vite` config setup diff --git a/packages/astro/src/core/create-vite.ts b/packages/astro/src/core/create-vite.ts index cc32fb6f16..a1771ad8cb 100644 --- a/packages/astro/src/core/create-vite.ts +++ b/packages/astro/src/core/create-vite.ts @@ -208,6 +208,7 @@ export async function createVite( noExternal: [...ALWAYS_NOEXTERNAL, ...astroPkgsConfig.ssr.noExternal], external: [...(mode === 'dev' ? ONLY_DEV_EXTERNAL : []), ...astroPkgsConfig.ssr.external], }, + build: { assetsDir: settings.config.build.assets }, }; // If the user provides a custom assets prefix, make sure assets handled by Vite diff --git a/packages/astro/test/astro-assets-dir.test.js b/packages/astro/test/astro-assets-dir.test.js new file mode 100644 index 0000000000..453248987a --- /dev/null +++ b/packages/astro/test/astro-assets-dir.test.js @@ -0,0 +1,36 @@ +import assert from 'node:assert/strict'; +import { before, describe, it } from 'node:test'; +import { loadFixture } from './test-utils.js'; + +describe('assets dir takes the URL path inside the output directory', () => { + /** @type {URL} */ + let checkDir; + before(async () => { + const fixture = await loadFixture({ + root: './fixtures/astro-assets-dir/', + build: { + assets: 'custom_dir_1', + }, + integrations: [ + { + name: '@astrojs/dir', + hooks: { + 'astro:build:done': ({ dir }) => { + checkDir = dir; + }, + }, + }, + ], + }); + await fixture.build(); + }); + it('generates the assets directory as per build.assets configuration', async () => { + const removeTrailingSlash = (str) => str.replace(/\/$/, ''); + assert.equal( + removeTrailingSlash(new URL('./custom_dir_1', checkDir).toString()), + removeTrailingSlash( + new URL('./fixtures/astro-assets-dir/dist/custom_dir_1', import.meta.url).toString() + ) + ); + }); +}); diff --git a/packages/astro/test/fixtures/astro-assets-dir/astro.config.mjs b/packages/astro/test/fixtures/astro-assets-dir/astro.config.mjs new file mode 100644 index 0000000000..e7ce274c00 --- /dev/null +++ b/packages/astro/test/fixtures/astro-assets-dir/astro.config.mjs @@ -0,0 +1,7 @@ +import react from '@astrojs/react'; +import { defineConfig } from 'astro/config'; + +// https://astro.build/config +export default defineConfig({ + integrations: [react()], +}); diff --git a/packages/astro/test/fixtures/astro-assets-dir/package.json b/packages/astro/test/fixtures/astro-assets-dir/package.json new file mode 100644 index 0000000000..e4c2518a59 --- /dev/null +++ b/packages/astro/test/fixtures/astro-assets-dir/package.json @@ -0,0 +1,11 @@ +{ + "name": "@test/astro-assets-dir", + "version": "0.0.0", + "private": true, + "dependencies": { + "@astrojs/react": "workspace:*", + "astro": "workspace:*", + "react": "^18.2.0", + "react-dom": "^18.2.0" + } +} diff --git a/packages/astro/test/fixtures/astro-assets-dir/src/assets/penguin1.jpg b/packages/astro/test/fixtures/astro-assets-dir/src/assets/penguin1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1a8986ac50923dbb9b36ad43e1af1415928ea912 GIT binary patch literal 11621 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 +
Count: {count}
+ + + ); +} diff --git a/packages/astro/test/fixtures/astro-assets-dir/src/content/blog/my-post.md b/packages/astro/test/fixtures/astro-assets-dir/src/content/blog/my-post.md new file mode 100644 index 0000000000..82c1bbb862 --- /dev/null +++ b/packages/astro/test/fixtures/astro-assets-dir/src/content/blog/my-post.md @@ -0,0 +1,6 @@ +--- +title: My Post +cover: ../../assets/penguin1.jpg +--- + +Hello world diff --git a/packages/astro/test/fixtures/astro-assets-dir/src/content/config.ts b/packages/astro/test/fixtures/astro-assets-dir/src/content/config.ts new file mode 100644 index 0000000000..1850486655 --- /dev/null +++ b/packages/astro/test/fixtures/astro-assets-dir/src/content/config.ts @@ -0,0 +1,12 @@ +import { defineCollection, z } from "astro:content"; + +const blogCollection = defineCollection({ + schema: ({image}) => z.object({ + title: z.string(), + cover: image(), + }), +}); + +export const collections = { + blog: blogCollection, +}; diff --git a/packages/astro/test/fixtures/astro-assets-dir/src/pages/blog.astro b/packages/astro/test/fixtures/astro-assets-dir/src/pages/blog.astro new file mode 100644 index 0000000000..13729ec0ab --- /dev/null +++ b/packages/astro/test/fixtures/astro-assets-dir/src/pages/blog.astro @@ -0,0 +1,16 @@ +--- +import { Image } from "astro:assets"; +import { getCollection } from "astro:content"; +const allBlogPosts = await getCollection("blog"); +--- + +{ + allBlogPosts.map((post) => ( +
+ cover +

+ {post.data.title} +

+
+ )) +} diff --git a/packages/astro/test/fixtures/astro-assets-dir/src/pages/index.astro b/packages/astro/test/fixtures/astro-assets-dir/src/pages/index.astro new file mode 100644 index 0000000000..4158153205 --- /dev/null +++ b/packages/astro/test/fixtures/astro-assets-dir/src/pages/index.astro @@ -0,0 +1,23 @@ +--- +import { Image } from 'astro:assets' +import p1Image from '../assets/penguin1.jpg'; +import Counter from '../components/Counter.jsx'; +--- + + + + Assets Prefix + + +

I am red

+ penguin + penguin + +

{typeof import.meta.env.ASSETS_PREFIX === 'string' ? import.meta.env.ASSETS_PREFIX : JSON.stringify(import.meta.env.ASSETS_PREFIX)}

+ + + diff --git a/packages/astro/test/fixtures/astro-assets-dir/src/pages/markdown.md b/packages/astro/test/fixtures/astro-assets-dir/src/pages/markdown.md new file mode 100644 index 0000000000..06c4f7fcfd --- /dev/null +++ b/packages/astro/test/fixtures/astro-assets-dir/src/pages/markdown.md @@ -0,0 +1,7 @@ +# Assets Prefix + +Relative image has assetsPrefix + +![Relative image](../assets/penguin1.jpg) + +![non-UTF-8 file name image](../assets/ペンギン.jpg) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4c6f41b770..62000740d7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1800,6 +1800,21 @@ importers: specifier: workspace:* version: link:../../.. + packages/astro/test/fixtures/astro-assets-dir: + dependencies: + '@astrojs/react': + specifier: workspace:* + version: link:../../../../integrations/react + astro: + specifier: workspace:* + version: link:../../.. + react: + specifier: ^18.2.0 + version: 18.2.0 + react-dom: + specifier: ^18.2.0 + version: 18.2.0(react@18.2.0) + packages/astro/test/fixtures/astro-assets-prefix: dependencies: '@astrojs/react': From 3e7a12c8532411e580fcfdb8445cad8fc8499291 Mon Sep 17 00:00:00 2001 From: Rishi Raj Jain Date: Tue, 16 Apr 2024 19:43:52 +0530 Subject: [PATCH 12/36] fix: MDX cannot find relative image path without leading ./ (#10754) Co-authored-by: Oliver Speir <115520730+OliverSpeir@users.noreply.github.com> --- .changeset/curly-badgers-boil.md | 16 ++++++++++++++++ packages/integrations/mdx/src/index.ts | 7 +++++++ .../mdx/src/remark-images-to-component.ts | 7 +++++-- .../fixtures/mdx-images/src/pages/houston.png | Bin 0 -> 160915 bytes .../fixtures/mdx-images/src/pages/index.mdx | 6 ++++++ .../mdx-images/src/pages/relative/houston.png | Bin 0 -> 160915 bytes .../integrations/mdx/test/mdx-images.test.js | 6 +++++- 7 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 .changeset/curly-badgers-boil.md create mode 100644 packages/integrations/mdx/test/fixtures/mdx-images/src/pages/houston.png create mode 100644 packages/integrations/mdx/test/fixtures/mdx-images/src/pages/relative/houston.png diff --git a/.changeset/curly-badgers-boil.md b/.changeset/curly-badgers-boil.md new file mode 100644 index 0000000000..f7fc51ecb9 --- /dev/null +++ b/.changeset/curly-badgers-boil.md @@ -0,0 +1,16 @@ +--- +"@astrojs/mdx": patch +--- + +Fixes an issue where images in MDX required a relative specifier (e.g. `./`) + +Now, you can use the standard `![](img.png)` syntax in MDX files for images colocated in the same folder: no relative specifier required! + +There is no need to update your project; your existing images will still continue to work. However, you may wish to remove any relative specifiers from these MDX images as they are no longer necessary: + +```diff +- ![A cute dog](./dog.jpg) ++ ![A cute dog](dog.jpg) + +``` + diff --git a/packages/integrations/mdx/src/index.ts b/packages/integrations/mdx/src/index.ts index bdf1c90627..db7f641345 100644 --- a/packages/integrations/mdx/src/index.ts +++ b/packages/integrations/mdx/src/index.ts @@ -106,6 +106,13 @@ export default function mdx(partialMdxOptions: Partial = {}): AstroI } } }, + async resolveId(source, importer, options) { + if (importer?.endsWith('.mdx') && source[0] !== '/') { + let resolved = await this.resolve(source, importer, options); + if (!resolved) resolved = await this.resolve('./' + source, importer, options); + return resolved; + } + }, // Override transform to alter code before MDX compilation // ex. inject layouts async transform(_, id) { diff --git a/packages/integrations/mdx/src/remark-images-to-component.ts b/packages/integrations/mdx/src/remark-images-to-component.ts index 4ab6a0422e..46d04d4433 100644 --- a/packages/integrations/mdx/src/remark-images-to-component.ts +++ b/packages/integrations/mdx/src/remark-images-to-component.ts @@ -24,7 +24,6 @@ export function remarkImageToComponent() { // If we haven't already imported this image, add an import statement if (!importName) { importName = `__${importedImages.size}_${node.url.replace(/\W/g, '_')}__`; - importsStatements.push({ type: 'mdxjsEsm', value: '', @@ -35,7 +34,11 @@ export function remarkImageToComponent() { body: [ { type: 'ImportDeclaration', - source: { type: 'Literal', value: node.url, raw: JSON.stringify(node.url) }, + source: { + type: 'Literal', + value: node.url, + raw: JSON.stringify(node.url), + }, specifiers: [ { type: 'ImportDefaultSpecifier', diff --git a/packages/integrations/mdx/test/fixtures/mdx-images/src/pages/houston.png b/packages/integrations/mdx/test/fixtures/mdx-images/src/pages/houston.png new file mode 100644 index 0000000000000000000000000000000000000000..345ed0e9de1ee119bc74a70cd12d573dacbf89d8 GIT binary patch literal 160915 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 z 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�X3sZS$g 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 + +Image using a relative path with no slashes: +![Houston](houston.png) + +Image using a relative path with nested directory: +![Houston](relative/houston.png) diff --git a/packages/integrations/mdx/test/fixtures/mdx-images/src/pages/relative/houston.png b/packages/integrations/mdx/test/fixtures/mdx-images/src/pages/relative/houston.png new file mode 100644 index 0000000000000000000000000000000000000000..345ed0e9de1ee119bc74a70cd12d573dacbf89d8 GIT binary patch literal 160915 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 z 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�X3sZS$g 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 { const { document } = parseHTML(html); const imgs = document.getElementsByTagName('img'); - assert.equal(imgs.length, 4); + assert.equal(imgs.length, 6); // Image using a relative path assert.equal(imgs.item(0).src.startsWith('/_image'), true); // Image using an aliased path @@ -38,6 +38,10 @@ describe('MDX Page', () => { assert.equal(imgs.item(2).title, 'Houston title'); // Image with spaces in the path assert.equal(imgs.item(3).src.startsWith('/_image'), true); + // Image using a relative path with no slashes + assert.equal(imgs.item(4).src.startsWith('/_image'), true); + // Image using a relative path with nested directory + assert.equal(imgs.item(5).src.startsWith('/_image'), true); }); for (const route of imageTestRoutes) { From 668d97319c1b4ae60b64c9e8e14b3878f4d4cae2 Mon Sep 17 00:00:00 2001 From: "Houston (Bot)" <108291165+astrobot-houston@users.noreply.github.com> Date: Tue, 16 Apr 2024 09:07:50 -0700 Subject: [PATCH 13/36] [ci] release (#10777) Co-authored-by: github-actions[bot] --- .changeset/afraid-laws-speak.md | 5 -- .changeset/brown-news-roll.md | 5 -- .changeset/curly-badgers-boil.md | 16 ---- .changeset/eight-hotels-try.md | 5 -- .changeset/famous-seals-camp.md | 5 -- .changeset/many-hairs-jump.md | 5 -- .changeset/mean-candles-hammer.md | 5 -- .changeset/modern-mugs-raise.md | 5 -- .changeset/orange-ladybugs-nail.md | 5 -- .changeset/rich-spoons-fold.md | 5 -- .changeset/stupid-countries-warn.md | 5 -- examples/basics/package.json | 2 +- examples/blog/package.json | 6 +- examples/component/package.json | 2 +- examples/framework-alpine/package.json | 2 +- examples/framework-lit/package.json | 2 +- examples/framework-multiple/package.json | 2 +- examples/framework-preact/package.json | 2 +- examples/framework-react/package.json | 2 +- examples/framework-solid/package.json | 2 +- examples/framework-svelte/package.json | 2 +- examples/framework-vue/package.json | 2 +- examples/hackernews/package.json | 2 +- examples/integration/package.json | 2 +- examples/middleware/package.json | 2 +- examples/minimal/package.json | 2 +- examples/non-html-pages/package.json | 2 +- examples/portfolio/package.json | 2 +- examples/ssr/package.json | 2 +- examples/starlog/package.json | 2 +- examples/view-transitions/package.json | 2 +- examples/with-markdoc/package.json | 2 +- examples/with-markdown-plugins/package.json | 2 +- examples/with-markdown-shiki/package.json | 2 +- examples/with-mdx/package.json | 4 +- examples/with-nanostores/package.json | 2 +- examples/with-tailwindcss/package.json | 4 +- examples/with-vitest/package.json | 2 +- packages/astro/CHANGELOG.md | 20 +++++ packages/astro/package.json | 2 +- packages/integrations/mdx/CHANGELOG.md | 18 ++++ packages/integrations/mdx/package.json | 2 +- packages/integrations/sitemap/CHANGELOG.md | 6 ++ packages/integrations/sitemap/package.json | 2 +- pnpm-lock.yaml | 94 ++++++++++++++------- 45 files changed, 141 insertions(+), 131 deletions(-) delete mode 100644 .changeset/afraid-laws-speak.md delete mode 100644 .changeset/brown-news-roll.md delete mode 100644 .changeset/curly-badgers-boil.md delete mode 100644 .changeset/eight-hotels-try.md delete mode 100644 .changeset/famous-seals-camp.md delete mode 100644 .changeset/many-hairs-jump.md delete mode 100644 .changeset/mean-candles-hammer.md delete mode 100644 .changeset/modern-mugs-raise.md delete mode 100644 .changeset/orange-ladybugs-nail.md delete mode 100644 .changeset/rich-spoons-fold.md delete mode 100644 .changeset/stupid-countries-warn.md diff --git a/.changeset/afraid-laws-speak.md b/.changeset/afraid-laws-speak.md deleted file mode 100644 index 62e4a8bd6f..0000000000 --- a/.changeset/afraid-laws-speak.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"astro": patch ---- - -Correctly sets `build.assets` directory during `vite` config setup diff --git a/.changeset/brown-news-roll.md b/.changeset/brown-news-roll.md deleted file mode 100644 index ff57e1bc40..0000000000 --- a/.changeset/brown-news-roll.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"astro": patch ---- - -Fixes cookies type inference diff --git a/.changeset/curly-badgers-boil.md b/.changeset/curly-badgers-boil.md deleted file mode 100644 index f7fc51ecb9..0000000000 --- a/.changeset/curly-badgers-boil.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -"@astrojs/mdx": patch ---- - -Fixes an issue where images in MDX required a relative specifier (e.g. `./`) - -Now, you can use the standard `![](img.png)` syntax in MDX files for images colocated in the same folder: no relative specifier required! - -There is no need to update your project; your existing images will still continue to work. However, you may wish to remove any relative specifiers from these MDX images as they are no longer necessary: - -```diff -- ![A cute dog](./dog.jpg) -+ ![A cute dog](dog.jpg) - -``` - diff --git a/.changeset/eight-hotels-try.md b/.changeset/eight-hotels-try.md deleted file mode 100644 index f1fab2897d..0000000000 --- a/.changeset/eight-hotels-try.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"astro": patch ---- - -Disables streaming when rendering site with `output: "static"` diff --git a/.changeset/famous-seals-camp.md b/.changeset/famous-seals-camp.md deleted file mode 100644 index b1703ee45e..0000000000 --- a/.changeset/famous-seals-camp.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@astrojs/sitemap": patch ---- - -Improves performance when generating the sitemap data diff --git a/.changeset/many-hairs-jump.md b/.changeset/many-hairs-jump.md deleted file mode 100644 index 2e855708fb..0000000000 --- a/.changeset/many-hairs-jump.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"astro": patch ---- - -Handles possible null value when calling `which-pm` during dynamic package installation diff --git a/.changeset/mean-candles-hammer.md b/.changeset/mean-candles-hammer.md deleted file mode 100644 index cb825a493a..0000000000 --- a/.changeset/mean-candles-hammer.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"astro": patch ---- - -Fixes `astro add` sometimes modifying `baseUrl` unintentionally diff --git a/.changeset/modern-mugs-raise.md b/.changeset/modern-mugs-raise.md deleted file mode 100644 index 0796acf9f8..0000000000 --- a/.changeset/modern-mugs-raise.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"astro": patch ---- - -Fixes Picture component specialFormatsFallback fallback check diff --git a/.changeset/orange-ladybugs-nail.md b/.changeset/orange-ladybugs-nail.md deleted file mode 100644 index b1b1f25b75..0000000000 --- a/.changeset/orange-ladybugs-nail.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@astrojs/mdx": patch ---- - -Removes internal MDX processor on `buildEnd` to free up memory diff --git a/.changeset/rich-spoons-fold.md b/.changeset/rich-spoons-fold.md deleted file mode 100644 index 217562a24c..0000000000 --- a/.changeset/rich-spoons-fold.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"astro": patch ---- - -Fixes assets endpoint in serverless returning 404 in certain situations where the website might be under a protected route diff --git a/.changeset/stupid-countries-warn.md b/.changeset/stupid-countries-warn.md deleted file mode 100644 index 27eeea281d..0000000000 --- a/.changeset/stupid-countries-warn.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"astro": patch ---- - -Fixes a timing issue in the view transition simulation. diff --git a/examples/basics/package.json b/examples/basics/package.json index e32ef884cb..5c22341e65 100644 --- a/examples/basics/package.json +++ b/examples/basics/package.json @@ -11,6 +11,6 @@ "astro": "astro" }, "dependencies": { - "astro": "^4.6.1" + "astro": "^4.6.2" } } diff --git a/examples/blog/package.json b/examples/blog/package.json index f7e1d6b4b8..afadb4360f 100644 --- a/examples/blog/package.json +++ b/examples/blog/package.json @@ -11,9 +11,9 @@ "astro": "astro" }, "dependencies": { - "@astrojs/mdx": "^2.3.0", + "@astrojs/mdx": "^2.3.1", "@astrojs/rss": "^4.0.5", - "@astrojs/sitemap": "^3.1.2", - "astro": "^4.6.1" + "@astrojs/sitemap": "^3.1.3", + "astro": "^4.6.2" } } diff --git a/examples/component/package.json b/examples/component/package.json index e4bbfe2e94..352bccdfbf 100644 --- a/examples/component/package.json +++ b/examples/component/package.json @@ -15,7 +15,7 @@ ], "scripts": {}, "devDependencies": { - "astro": "^4.6.1" + "astro": "^4.6.2" }, "peerDependencies": { "astro": "^4.0.0" diff --git a/examples/framework-alpine/package.json b/examples/framework-alpine/package.json index f731ddf0ff..00708fe304 100644 --- a/examples/framework-alpine/package.json +++ b/examples/framework-alpine/package.json @@ -14,6 +14,6 @@ "@astrojs/alpinejs": "^0.4.0", "@types/alpinejs": "^3.13.5", "alpinejs": "^3.13.3", - "astro": "^4.6.1" + "astro": "^4.6.2" } } diff --git a/examples/framework-lit/package.json b/examples/framework-lit/package.json index 4cfbb0e057..6243b58fa8 100644 --- a/examples/framework-lit/package.json +++ b/examples/framework-lit/package.json @@ -13,7 +13,7 @@ "dependencies": { "@astrojs/lit": "^4.0.1", "@webcomponents/template-shadowroot": "^0.2.1", - "astro": "^4.6.1", + "astro": "^4.6.2", "lit": "^3.1.2" } } diff --git a/examples/framework-multiple/package.json b/examples/framework-multiple/package.json index 5f8d13af71..dabc84475a 100644 --- a/examples/framework-multiple/package.json +++ b/examples/framework-multiple/package.json @@ -18,7 +18,7 @@ "@astrojs/vue": "^4.1.0", "@types/react": "^18.2.37", "@types/react-dom": "^18.2.15", - "astro": "^4.6.1", + "astro": "^4.6.2", "preact": "^10.19.2", "react": "^18.2.0", "react-dom": "^18.2.0", diff --git a/examples/framework-preact/package.json b/examples/framework-preact/package.json index f36f406a5e..993a445a2b 100644 --- a/examples/framework-preact/package.json +++ b/examples/framework-preact/package.json @@ -13,7 +13,7 @@ "dependencies": { "@astrojs/preact": "^3.2.0", "@preact/signals": "^1.2.1", - "astro": "^4.6.1", + "astro": "^4.6.2", "preact": "^10.19.2" } } diff --git a/examples/framework-react/package.json b/examples/framework-react/package.json index 205b05d6a9..b0eb38cb6b 100644 --- a/examples/framework-react/package.json +++ b/examples/framework-react/package.json @@ -14,7 +14,7 @@ "@astrojs/react": "^3.3.0", "@types/react": "^18.2.37", "@types/react-dom": "^18.2.15", - "astro": "^4.6.1", + "astro": "^4.6.2", "react": "^18.2.0", "react-dom": "^18.2.0" } diff --git a/examples/framework-solid/package.json b/examples/framework-solid/package.json index bed80c53f2..e9709aec35 100644 --- a/examples/framework-solid/package.json +++ b/examples/framework-solid/package.json @@ -12,7 +12,7 @@ }, "dependencies": { "@astrojs/solid-js": "^4.1.0", - "astro": "^4.6.1", + "astro": "^4.6.2", "solid-js": "^1.8.5" } } diff --git a/examples/framework-svelte/package.json b/examples/framework-svelte/package.json index d41823b040..a3aef84631 100644 --- a/examples/framework-svelte/package.json +++ b/examples/framework-svelte/package.json @@ -12,7 +12,7 @@ }, "dependencies": { "@astrojs/svelte": "^5.4.0", - "astro": "^4.6.1", + "astro": "^4.6.2", "svelte": "^4.2.5" } } diff --git a/examples/framework-vue/package.json b/examples/framework-vue/package.json index 28bab6c81c..c4877b256e 100644 --- a/examples/framework-vue/package.json +++ b/examples/framework-vue/package.json @@ -12,7 +12,7 @@ }, "dependencies": { "@astrojs/vue": "^4.1.0", - "astro": "^4.6.1", + "astro": "^4.6.2", "vue": "^3.3.8" } } diff --git a/examples/hackernews/package.json b/examples/hackernews/package.json index 599a3a1c8e..5314b60259 100644 --- a/examples/hackernews/package.json +++ b/examples/hackernews/package.json @@ -12,6 +12,6 @@ }, "dependencies": { "@astrojs/node": "^8.2.5", - "astro": "^4.6.1" + "astro": "^4.6.2" } } diff --git a/examples/integration/package.json b/examples/integration/package.json index 91f5793991..db06164601 100644 --- a/examples/integration/package.json +++ b/examples/integration/package.json @@ -15,7 +15,7 @@ ], "scripts": {}, "devDependencies": { - "astro": "^4.6.1" + "astro": "^4.6.2" }, "peerDependencies": { "astro": "^4.0.0" diff --git a/examples/middleware/package.json b/examples/middleware/package.json index cb608654a3..6c43007318 100644 --- a/examples/middleware/package.json +++ b/examples/middleware/package.json @@ -13,7 +13,7 @@ }, "dependencies": { "@astrojs/node": "^8.2.5", - "astro": "^4.6.1", + "astro": "^4.6.2", "html-minifier": "^4.0.0" }, "devDependencies": { diff --git a/examples/minimal/package.json b/examples/minimal/package.json index 840a5ac7c6..031742f2c7 100644 --- a/examples/minimal/package.json +++ b/examples/minimal/package.json @@ -11,6 +11,6 @@ "astro": "astro" }, "dependencies": { - "astro": "^4.6.1" + "astro": "^4.6.2" } } diff --git a/examples/non-html-pages/package.json b/examples/non-html-pages/package.json index 260c84d09f..777c3a6da4 100644 --- a/examples/non-html-pages/package.json +++ b/examples/non-html-pages/package.json @@ -11,6 +11,6 @@ "astro": "astro" }, "dependencies": { - "astro": "^4.6.1" + "astro": "^4.6.2" } } diff --git a/examples/portfolio/package.json b/examples/portfolio/package.json index caec4c105f..3f03d77df4 100644 --- a/examples/portfolio/package.json +++ b/examples/portfolio/package.json @@ -11,6 +11,6 @@ "astro": "astro" }, "dependencies": { - "astro": "^4.6.1" + "astro": "^4.6.2" } } diff --git a/examples/ssr/package.json b/examples/ssr/package.json index 45210122da..ba0c478bc0 100644 --- a/examples/ssr/package.json +++ b/examples/ssr/package.json @@ -14,7 +14,7 @@ "dependencies": { "@astrojs/node": "^8.2.5", "@astrojs/svelte": "^5.4.0", - "astro": "^4.6.1", + "astro": "^4.6.2", "svelte": "^4.2.5" } } diff --git a/examples/starlog/package.json b/examples/starlog/package.json index bc4e0e23a2..d6500f4068 100644 --- a/examples/starlog/package.json +++ b/examples/starlog/package.json @@ -10,7 +10,7 @@ "astro": "astro" }, "dependencies": { - "astro": "^4.6.1", + "astro": "^4.6.2", "sass": "^1.69.5", "sharp": "^0.32.6" } diff --git a/examples/view-transitions/package.json b/examples/view-transitions/package.json index 512a2bcc80..2ef6379f89 100644 --- a/examples/view-transitions/package.json +++ b/examples/view-transitions/package.json @@ -12,6 +12,6 @@ "devDependencies": { "@astrojs/tailwind": "^5.1.0", "@astrojs/node": "^8.2.5", - "astro": "^4.6.1" + "astro": "^4.6.2" } } diff --git a/examples/with-markdoc/package.json b/examples/with-markdoc/package.json index f799e483f4..b398a7ce4a 100644 --- a/examples/with-markdoc/package.json +++ b/examples/with-markdoc/package.json @@ -12,6 +12,6 @@ }, "dependencies": { "@astrojs/markdoc": "^0.10.0", - "astro": "^4.6.1" + "astro": "^4.6.2" } } diff --git a/examples/with-markdown-plugins/package.json b/examples/with-markdown-plugins/package.json index 84b5ca0dcf..4c70d2970e 100644 --- a/examples/with-markdown-plugins/package.json +++ b/examples/with-markdown-plugins/package.json @@ -12,7 +12,7 @@ }, "dependencies": { "@astrojs/markdown-remark": "^5.1.0", - "astro": "^4.6.1", + "astro": "^4.6.2", "hast-util-select": "^6.0.2", "rehype-autolink-headings": "^7.1.0", "rehype-slug": "^6.0.0", diff --git a/examples/with-markdown-shiki/package.json b/examples/with-markdown-shiki/package.json index 580dd76819..5e09959585 100644 --- a/examples/with-markdown-shiki/package.json +++ b/examples/with-markdown-shiki/package.json @@ -11,6 +11,6 @@ "astro": "astro" }, "dependencies": { - "astro": "^4.6.1" + "astro": "^4.6.2" } } diff --git a/examples/with-mdx/package.json b/examples/with-mdx/package.json index c1b05389ac..68d15e5ff4 100644 --- a/examples/with-mdx/package.json +++ b/examples/with-mdx/package.json @@ -11,9 +11,9 @@ "astro": "astro" }, "dependencies": { - "@astrojs/mdx": "^2.3.0", + "@astrojs/mdx": "^2.3.1", "@astrojs/preact": "^3.2.0", - "astro": "^4.6.1", + "astro": "^4.6.2", "preact": "^10.19.2" } } diff --git a/examples/with-nanostores/package.json b/examples/with-nanostores/package.json index 122a12cfc7..c7194eef7a 100644 --- a/examples/with-nanostores/package.json +++ b/examples/with-nanostores/package.json @@ -13,7 +13,7 @@ "dependencies": { "@astrojs/preact": "^3.2.0", "@nanostores/preact": "^0.5.0", - "astro": "^4.6.1", + "astro": "^4.6.2", "nanostores": "^0.9.5", "preact": "^10.19.2" } diff --git a/examples/with-tailwindcss/package.json b/examples/with-tailwindcss/package.json index a6ff392886..e4bf87d312 100644 --- a/examples/with-tailwindcss/package.json +++ b/examples/with-tailwindcss/package.json @@ -11,10 +11,10 @@ "astro": "astro" }, "dependencies": { - "@astrojs/mdx": "^2.3.0", + "@astrojs/mdx": "^2.3.1", "@astrojs/tailwind": "^5.1.0", "@types/canvas-confetti": "^1.6.3", - "astro": "^4.6.1", + "astro": "^4.6.2", "autoprefixer": "^10.4.15", "canvas-confetti": "^1.9.1", "postcss": "^8.4.28", diff --git a/examples/with-vitest/package.json b/examples/with-vitest/package.json index 9f98c60e0e..75bc03d3be 100644 --- a/examples/with-vitest/package.json +++ b/examples/with-vitest/package.json @@ -12,7 +12,7 @@ "test": "vitest" }, "dependencies": { - "astro": "^4.6.1", + "astro": "^4.6.2", "vitest": "^1.3.1" } } diff --git a/packages/astro/CHANGELOG.md b/packages/astro/CHANGELOG.md index 5161ed864e..3156fd3b9d 100644 --- a/packages/astro/CHANGELOG.md +++ b/packages/astro/CHANGELOG.md @@ -1,5 +1,25 @@ # astro +## 4.6.2 + +### Patch Changes + +- [#10732](https://github.com/withastro/astro/pull/10732) [`a92e263beb6e0166f1f13c97803d1861793e2a99`](https://github.com/withastro/astro/commit/a92e263beb6e0166f1f13c97803d1861793e2a99) Thanks [@rishi-raj-jain](https://github.com/rishi-raj-jain)! - Correctly sets `build.assets` directory during `vite` config setup + +- [#10776](https://github.com/withastro/astro/pull/10776) [`1607face67051b16d4648555f1001b2a9308e377`](https://github.com/withastro/astro/commit/1607face67051b16d4648555f1001b2a9308e377) Thanks [@fshafiee](https://github.com/fshafiee)! - Fixes cookies type inference + +- [#10796](https://github.com/withastro/astro/pull/10796) [`90669472df3a05b33f0de46fd2d039e3eba7f7dd`](https://github.com/withastro/astro/commit/90669472df3a05b33f0de46fd2d039e3eba7f7dd) Thanks [@bluwy](https://github.com/bluwy)! - Disables streaming when rendering site with `output: "static"` + +- [#10782](https://github.com/withastro/astro/pull/10782) [`b0589d05538fcc77dd3c38198bf93f3548362cd8`](https://github.com/withastro/astro/commit/b0589d05538fcc77dd3c38198bf93f3548362cd8) Thanks [@nektro](https://github.com/nektro)! - Handles possible null value when calling `which-pm` during dynamic package installation + +- [#10774](https://github.com/withastro/astro/pull/10774) [`308b5d8c122f44e7724bb2f3ad3aa5c43a83e584`](https://github.com/withastro/astro/commit/308b5d8c122f44e7724bb2f3ad3aa5c43a83e584) Thanks [@Princesseuh](https://github.com/Princesseuh)! - Fixes `astro add` sometimes modifying `baseUrl` unintentionally + +- [#10783](https://github.com/withastro/astro/pull/10783) [`4dbd545304d1a8af903c8c97f237eb55c988c40b`](https://github.com/withastro/astro/commit/4dbd545304d1a8af903c8c97f237eb55c988c40b) Thanks [@jurajkapsz](https://github.com/jurajkapsz)! - Fixes Picture component specialFormatsFallback fallback check + +- [#10775](https://github.com/withastro/astro/pull/10775) [`06843121450899ecf0390ca4efaff6c9a6fe0f75`](https://github.com/withastro/astro/commit/06843121450899ecf0390ca4efaff6c9a6fe0f75) Thanks [@Princesseuh](https://github.com/Princesseuh)! - Fixes assets endpoint in serverless returning 404 in certain situations where the website might be under a protected route + +- [#10787](https://github.com/withastro/astro/pull/10787) [`699f4559a279b374bddb3e5e48c72afe2709e8e7`](https://github.com/withastro/astro/commit/699f4559a279b374bddb3e5e48c72afe2709e8e7) Thanks [@martrapp](https://github.com/martrapp)! - Fixes a timing issue in the view transition simulation. + ## 4.6.1 ### Patch Changes diff --git a/packages/astro/package.json b/packages/astro/package.json index b2c1ed99cb..f0532b1df2 100644 --- a/packages/astro/package.json +++ b/packages/astro/package.json @@ -1,6 +1,6 @@ { "name": "astro", - "version": "4.6.1", + "version": "4.6.2", "description": "Astro is a modern site builder with web best practices, performance, and DX front-of-mind.", "type": "module", "author": "withastro", diff --git a/packages/integrations/mdx/CHANGELOG.md b/packages/integrations/mdx/CHANGELOG.md index 105babf12f..b40ce2e000 100644 --- a/packages/integrations/mdx/CHANGELOG.md +++ b/packages/integrations/mdx/CHANGELOG.md @@ -1,5 +1,23 @@ # @astrojs/mdx +## 2.3.1 + +### Patch Changes + +- [#10754](https://github.com/withastro/astro/pull/10754) [`3e7a12c8532411e580fcfdb8445cad8fc8499291`](https://github.com/withastro/astro/commit/3e7a12c8532411e580fcfdb8445cad8fc8499291) Thanks [@rishi-raj-jain](https://github.com/rishi-raj-jain)! - Fixes an issue where images in MDX required a relative specifier (e.g. `./`) + + Now, you can use the standard `![](img.png)` syntax in MDX files for images colocated in the same folder: no relative specifier required! + + There is no need to update your project; your existing images will still continue to work. However, you may wish to remove any relative specifiers from these MDX images as they are no longer necessary: + + ```diff + - ![A cute dog](./dog.jpg) + + ![A cute dog](dog.jpg) + + ``` + +- [#10770](https://github.com/withastro/astro/pull/10770) [`88ee63a3ba4488c60348cb821034e6d4a057efd0`](https://github.com/withastro/astro/commit/88ee63a3ba4488c60348cb821034e6d4a057efd0) Thanks [@bluwy](https://github.com/bluwy)! - Removes internal MDX processor on `buildEnd` to free up memory + ## 2.3.0 ### Minor Changes diff --git a/packages/integrations/mdx/package.json b/packages/integrations/mdx/package.json index ac9e775a66..5dbc7dd952 100644 --- a/packages/integrations/mdx/package.json +++ b/packages/integrations/mdx/package.json @@ -1,7 +1,7 @@ { "name": "@astrojs/mdx", "description": "Add support for MDX pages in your Astro site", - "version": "2.3.0", + "version": "2.3.1", "type": "module", "types": "./dist/index.d.ts", "author": "withastro", diff --git a/packages/integrations/sitemap/CHANGELOG.md b/packages/integrations/sitemap/CHANGELOG.md index 24902965ae..9df35d31f5 100644 --- a/packages/integrations/sitemap/CHANGELOG.md +++ b/packages/integrations/sitemap/CHANGELOG.md @@ -1,5 +1,11 @@ # @astrojs/sitemap +## 3.1.3 + +### Patch Changes + +- [#10795](https://github.com/withastro/astro/pull/10795) [`1ce22881c657becf0397b83ac393fb5d2399104c`](https://github.com/withastro/astro/commit/1ce22881c657becf0397b83ac393fb5d2399104c) Thanks [@bluwy](https://github.com/bluwy)! - Improves performance when generating the sitemap data + ## 3.1.2 ### Patch Changes diff --git a/packages/integrations/sitemap/package.json b/packages/integrations/sitemap/package.json index abf9f263b8..9ccbf3d5be 100644 --- a/packages/integrations/sitemap/package.json +++ b/packages/integrations/sitemap/package.json @@ -1,7 +1,7 @@ { "name": "@astrojs/sitemap", "description": "Generate a sitemap for your Astro site", - "version": "3.1.2", + "version": "3.1.3", "type": "module", "types": "./dist/index.d.ts", "author": "withastro", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 62000740d7..1d2d89b5a8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -134,28 +134,28 @@ importers: examples/basics: dependencies: astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro examples/blog: dependencies: '@astrojs/mdx': - specifier: ^2.3.0 + specifier: ^2.3.1 version: link:../../packages/integrations/mdx '@astrojs/rss': specifier: ^4.0.5 version: link:../../packages/astro-rss '@astrojs/sitemap': - specifier: ^3.1.2 + specifier: ^3.1.3 version: link:../../packages/integrations/sitemap astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro examples/component: devDependencies: astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro examples/framework-alpine: @@ -170,7 +170,7 @@ importers: specifier: ^3.13.3 version: 3.13.8 astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro examples/framework-lit: @@ -182,7 +182,7 @@ importers: specifier: ^0.2.1 version: 0.2.1 astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro lit: specifier: ^3.1.2 @@ -212,7 +212,7 @@ importers: specifier: ^18.2.15 version: 18.2.25 astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro preact: specifier: ^10.19.2 @@ -242,7 +242,7 @@ importers: specifier: ^1.2.1 version: 1.2.1(preact@10.20.2) astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro preact: specifier: ^10.19.2 @@ -260,7 +260,7 @@ importers: specifier: ^18.2.15 version: 18.2.25 astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro react: specifier: ^18.2.0 @@ -275,7 +275,7 @@ importers: specifier: ^4.1.0 version: link:../../packages/integrations/solid astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro solid-js: specifier: ^1.8.5 @@ -287,7 +287,7 @@ importers: specifier: ^5.4.0 version: link:../../packages/integrations/svelte astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro svelte: specifier: ^4.2.5 @@ -299,7 +299,7 @@ importers: specifier: ^4.1.0 version: link:../../packages/integrations/vue astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro vue: specifier: ^3.3.8 @@ -311,13 +311,13 @@ importers: specifier: ^8.2.5 version: link:../../packages/integrations/node astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro examples/integration: devDependencies: astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro examples/middleware: @@ -326,7 +326,7 @@ importers: specifier: ^8.2.5 version: link:../../packages/integrations/node astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro html-minifier: specifier: ^4.0.0 @@ -339,19 +339,19 @@ importers: examples/minimal: dependencies: astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro examples/non-html-pages: dependencies: astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro examples/portfolio: dependencies: astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro examples/ssr: @@ -363,7 +363,7 @@ importers: specifier: ^5.4.0 version: link:../../packages/integrations/svelte astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro svelte: specifier: ^4.2.5 @@ -372,7 +372,7 @@ importers: examples/starlog: dependencies: astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro sass: specifier: ^1.69.5 @@ -390,7 +390,7 @@ importers: specifier: ^5.1.0 version: link:../../packages/integrations/tailwind astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro examples/with-markdoc: @@ -399,7 +399,7 @@ importers: specifier: ^0.10.0 version: link:../../packages/integrations/markdoc astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro examples/with-markdown-plugins: @@ -408,7 +408,7 @@ importers: specifier: ^5.1.0 version: link:../../packages/markdown/remark astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro hast-util-select: specifier: ^6.0.2 @@ -429,19 +429,19 @@ importers: examples/with-markdown-shiki: dependencies: astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro examples/with-mdx: dependencies: '@astrojs/mdx': - specifier: ^2.3.0 + specifier: ^2.3.1 version: link:../../packages/integrations/mdx '@astrojs/preact': specifier: ^3.2.0 version: link:../../packages/integrations/preact astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro preact: specifier: ^10.19.2 @@ -456,7 +456,7 @@ importers: specifier: ^0.5.0 version: 0.5.1(nanostores@0.9.5)(preact@10.20.2) astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro nanostores: specifier: ^0.9.5 @@ -468,7 +468,7 @@ importers: examples/with-tailwindcss: dependencies: '@astrojs/mdx': - specifier: ^2.3.0 + specifier: ^2.3.1 version: link:../../packages/integrations/mdx '@astrojs/tailwind': specifier: ^5.1.0 @@ -477,7 +477,7 @@ importers: specifier: ^1.6.3 version: 1.6.4 astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro autoprefixer: specifier: ^10.4.15 @@ -495,7 +495,7 @@ importers: examples/with-vitest: dependencies: astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro vitest: specifier: ^1.3.1 @@ -9272,6 +9272,7 @@ packages: /b4a@1.6.6: resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} + requiresBuild: true dev: false /babel-plugin-jsx-dom-expressions@0.37.19(@babel/core@7.24.4): @@ -9382,6 +9383,7 @@ packages: /bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + requiresBuild: true dependencies: buffer: 5.7.1 inherits: 2.0.4 @@ -9673,6 +9675,7 @@ packages: /chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + requiresBuild: true dev: false /chownr@2.0.0: @@ -9797,9 +9800,11 @@ packages: /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + requiresBuild: true /color-string@1.9.1: resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + requiresBuild: true dependencies: color-name: 1.1.4 simple-swizzle: 0.2.2 @@ -9813,6 +9818,7 @@ packages: /color@4.2.3: resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} engines: {node: '>=12.5.0'} + requiresBuild: true dependencies: color-convert: 2.0.1 color-string: 1.9.1 @@ -10147,6 +10153,7 @@ packages: /decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} + requiresBuild: true dependencies: mimic-response: 3.1.0 dev: false @@ -10168,6 +10175,7 @@ packages: /deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} + requiresBuild: true dev: false /deep-is@0.1.4: @@ -10496,6 +10504,7 @@ packages: /end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + requiresBuild: true dependencies: once: 1.4.0 dev: false @@ -10943,6 +10952,7 @@ packages: /expand-template@2.0.3: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} + requiresBuild: true dev: false /express@4.19.2: @@ -11017,6 +11027,7 @@ packages: /fast-fifo@1.3.2: resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + requiresBuild: true dev: false /fast-glob@3.3.2: @@ -11178,6 +11189,7 @@ packages: /fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + requiresBuild: true dev: false /fs-extra@10.1.0: @@ -11331,6 +11343,7 @@ packages: /github-from-package@0.0.0: resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + requiresBuild: true dev: false /github-slugger@2.0.0: @@ -11913,6 +11926,7 @@ packages: /ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + requiresBuild: true dev: false /inline-style-parser@0.1.1: @@ -11960,6 +11974,7 @@ packages: /is-arrayish@0.3.2: resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + requiresBuild: true dev: false /is-bigint@1.0.4: @@ -13320,6 +13335,7 @@ packages: /mimic-response@3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} + requiresBuild: true dev: false /min-indent@1.0.1: @@ -13400,6 +13416,7 @@ packages: /mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + requiresBuild: true dev: false /mkdirp@1.0.4: @@ -13497,6 +13514,7 @@ packages: /napi-build-utils@1.0.2: resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + requiresBuild: true dev: false /natural-compare@1.4.0: @@ -13534,12 +13552,14 @@ packages: /node-abi@3.57.0: resolution: {integrity: sha512-Dp+A9JWxRaKuHP35H77I4kCKesDy5HUDEmScia2FyncMTOXASMyg251F5PhFoDA5uqBrDDffiLpbqnrZmNXW+g==} engines: {node: '>=10'} + requiresBuild: true dependencies: semver: 7.6.0 dev: false /node-addon-api@6.1.0: resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} + requiresBuild: true dev: false /node-domexception@1.0.0: @@ -14514,6 +14534,7 @@ packages: resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==} engines: {node: '>=10'} hasBin: true + requiresBuild: true dependencies: detect-libc: 2.0.3 expand-template: 2.0.3 @@ -14631,6 +14652,7 @@ packages: /pump@3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + requiresBuild: true dependencies: end-of-stream: 1.4.4 once: 1.4.0 @@ -14688,6 +14710,7 @@ packages: /rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true + requiresBuild: true dependencies: deep-extend: 0.6.0 ini: 1.3.8 @@ -15432,10 +15455,12 @@ packages: /simple-concat@1.0.1: resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + requiresBuild: true dev: false /simple-get@4.0.1: resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + requiresBuild: true dependencies: decompress-response: 6.0.0 once: 1.4.0 @@ -15459,6 +15484,7 @@ packages: /simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + requiresBuild: true dependencies: is-arrayish: 0.3.2 dev: false @@ -15624,6 +15650,7 @@ packages: /streamx@2.16.1: resolution: {integrity: sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ==} + requiresBuild: true dependencies: fast-fifo: 1.3.2 queue-tick: 1.0.1 @@ -15948,6 +15975,7 @@ packages: /tar-fs@2.1.1: resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + requiresBuild: true dependencies: chownr: 1.1.4 mkdirp-classic: 0.5.3 @@ -15957,6 +15985,7 @@ packages: /tar-fs@3.0.5: resolution: {integrity: sha512-JOgGAmZyMgbqpLwct7ZV8VzkEB6pxXFBVErLtb+XCOqzc6w1xiWKI9GVd6bwk68EX7eJ4DWmfXVmq8K2ziZTGg==} + requiresBuild: true dependencies: pump: 3.0.0 tar-stream: 3.1.7 @@ -15968,6 +15997,7 @@ packages: /tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} engines: {node: '>=6'} + requiresBuild: true dependencies: bl: 4.1.0 end-of-stream: 1.4.4 @@ -15978,6 +16008,7 @@ packages: /tar-stream@3.1.7: resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + requiresBuild: true dependencies: b4a: 1.6.6 fast-fifo: 1.3.2 @@ -16177,6 +16208,7 @@ packages: /tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + requiresBuild: true dependencies: safe-buffer: 5.2.1 dev: false From d4c91cb10924a0627a9e9a80bc549b3c82d043e6 Mon Sep 17 00:00:00 2001 From: Nick Dubelman Date: Tue, 16 Apr 2024 14:28:20 -0700 Subject: [PATCH 14/36] db: export 'alias' from drizzle-orm/sqlite-core (#10789) * db: export 'alias' from drizzle-orm/sqlite-core * chore: changeset * fix: changeset target --------- Co-authored-by: Ben Holmes --- .changeset/few-pets-relax.md | 5 +++++ packages/db/src/runtime/virtual.ts | 2 ++ packages/db/virtual.d.ts | 1 + 3 files changed, 8 insertions(+) create mode 100644 .changeset/few-pets-relax.md diff --git a/.changeset/few-pets-relax.md b/.changeset/few-pets-relax.md new file mode 100644 index 0000000000..7e2682c274 --- /dev/null +++ b/.changeset/few-pets-relax.md @@ -0,0 +1,5 @@ +--- +"@astrojs/db": patch +--- + +Expose the Drizzle `alias` utility from `astro:db` to enable self-joins on a table. diff --git a/packages/db/src/runtime/virtual.ts b/packages/db/src/runtime/virtual.ts index ac118d6930..4159e74c1a 100644 --- a/packages/db/src/runtime/virtual.ts +++ b/packages/db/src/runtime/virtual.ts @@ -92,3 +92,5 @@ export { max, min, } from 'drizzle-orm'; + +export { alias } from 'drizzle-orm/sqlite-core'; diff --git a/packages/db/virtual.d.ts b/packages/db/virtual.d.ts index efe9e8387d..6c93137a20 100644 --- a/packages/db/virtual.d.ts +++ b/packages/db/virtual.d.ts @@ -42,4 +42,5 @@ declare module 'astro:db' { export const sumDistinct: RuntimeConfig['sumDistinct']; export const max: RuntimeConfig['max']; export const min: RuntimeConfig['min']; + export const alias: RuntimeConfig['alias']; } From 40e8450671f09856fe82abba04187f72e8e0ac89 Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Wed, 17 Apr 2024 09:37:22 +0100 Subject: [PATCH 15/36] chore: use Biome to format JS files (#10788) * chore: configuration * chore: update main commands * chore: revert formatting package.json * chore: rebase --- .prettierignore | 9 +++ biome.json | 48 ++++++++--- package.json | 6 +- packages/astro-rss/test/rss.test.js | 13 +-- packages/astro/astro-jsx.d.ts | 2 - packages/astro/src/@types/astro.ts | 81 +++++++++---------- .../astro/src/assets/vite-plugin-assets.ts | 4 +- packages/astro/src/cli/install-package.ts | 4 +- packages/astro/src/core/errors/dev/utils.ts | 4 +- packages/astro/src/core/errors/errors-data.ts | 4 +- .../client/dev-toolbar/apps/settings.ts | 5 +- .../src/runtime/client/dev-toolbar/toolbar.ts | 8 +- .../client/dev-toolbar/ui-library/tooltip.ts | 6 +- packages/astro/src/transitions/router.ts | 2 +- packages/astro/test/test-adapter.js | 6 +- packages/db/src/core/errors.ts | 3 +- packages/db/src/core/schemas.ts | 4 +- packages/upgrade/src/actions/context.ts | 6 +- pnpm-lock.yaml | 74 ++++++++--------- prettier.config.js | 2 +- 20 files changed, 174 insertions(+), 117 deletions(-) diff --git a/.prettierignore b/.prettierignore index 0703752ee5..64e94860fa 100644 --- a/.prettierignore +++ b/.prettierignore @@ -19,3 +19,12 @@ benchmark/results/ # Files pnpm-lock.yaml + +# Formatted by Biome +**/*.json +**/*.js +**/*.ts +**/*.tsx +**/*.jsx +**/*.mjs +**/*.cjs diff --git a/biome.json b/biome.json index e3cd21509b..aed74ad496 100644 --- a/biome.json +++ b/biome.json @@ -1,16 +1,44 @@ { - "$schema": "https://biomejs.dev/schemas/1.5.3/schema.json", + "$schema": "https://biomejs.dev/schemas/1.6.4/schema.json", "files": { - "include": ["test/**", "e2e/**", "packages/**"], - "ignore": ["vendor", "dist/**"] - }, - "organizeImports": { - "enabled": true - }, - "linter": { - "enabled": false + "ignore": ["vendor", "dist/**"], + "include": ["test/**", "e2e/**", "packages/**"] }, "formatter": { - "enabled": false + "indentStyle": "tab", + "indentWidth": 2, + "lineWidth": 100, + "ignore": [ + "benchmark/projects/", + "benchmark/results/", + "**/dist/**", + "**/smoke/**", + "**/fixtures/**", + "**/vendor/**", + "**/.vercel/**", + ".changeset", + "pnpm-lock.yaml", + "package.json", + "*.astro" + ] + }, + "organizeImports": { "enabled": true }, + "linter": { "enabled": false }, + "javascript": { + "formatter": { + "trailingComma": "es5", + "quoteStyle": "single", + "semicolons": "always" + } + }, + "json": { + "parser": { + "allowComments": true, + "allowTrailingCommas": true + }, + "formatter": { + "indentStyle": "space", + "trailingCommas": "none" + } } } diff --git a/package.json b/package.json index 2a2eadaa3f..3463e19c3e 100644 --- a/package.json +++ b/package.json @@ -16,8 +16,8 @@ "dev": "turbo run dev --concurrency=40 --parallel --filter=astro --filter=create-astro --filter=\"@astrojs/*\" --filter=\"@benchmark/*\"", "format": "pnpm run format:code && pnpm run format:imports", "format:ci": "pnpm run format:code:ci && pnpm run format:imports:ci", - "format:code": "prettier -w \"**/*\" --ignore-unknown --cache", - "format:code:ci": "prettier -w \"**/*\" --ignore-unknown --cache --check", + "format:code": "biome format ./ --write && prettier -w \"**/*\" --ignore-unknown --cache", + "format:code:ci": "biome format ./ && prettier -w \"**/*\" --ignore-unknown --cache --check", "format:imports": "biome check --apply .", "format:imports:ci": "biome ci .", "test": "turbo run test --concurrency=1 --filter=astro --filter=create-astro --filter=\"@astrojs/*\"", @@ -53,7 +53,7 @@ }, "devDependencies": { "@astrojs/check": "^0.5.8", - "@biomejs/biome": "1.5.3", + "@biomejs/biome": "1.6.4", "@changesets/changelog-github": "^0.4.8", "@changesets/cli": "^2.26.2", "@eslint/eslintrc": "^3.0.2", diff --git a/packages/astro-rss/test/rss.test.js b/packages/astro-rss/test/rss.test.js index 2d5a0f6c81..764cc1301b 100644 --- a/packages/astro-rss/test/rss.test.js +++ b/packages/astro-rss/test/rss.test.js @@ -19,17 +19,18 @@ import { // note: I spent 30 minutes looking for a nice node-based snapshot tool // ...and I gave up. Enjoy big strings! -// prettier-ignore + +// biome-ignore format: keep in one line const validXmlResult = `<![CDATA[${title}]]>${site}/<![CDATA[${phpFeedItem.title}]]>${site}${phpFeedItem.link}/${site}${phpFeedItem.link}/${new Date(phpFeedItem.pubDate).toUTCString()}<![CDATA[${web1FeedItem.title}]]>${site}${web1FeedItem.link}/${site}${web1FeedItem.link}/${new Date(web1FeedItem.pubDate).toUTCString()}`; -// prettier-ignore +// biome-ignore format: keep in one line const validXmlWithContentResult = `<![CDATA[${title}]]>${site}/<![CDATA[${phpFeedItemWithContent.title}]]>${site}${phpFeedItemWithContent.link}/${site}${phpFeedItemWithContent.link}/${new Date(phpFeedItemWithContent.pubDate).toUTCString()}<![CDATA[${web1FeedItemWithContent.title}]]>${site}${web1FeedItemWithContent.link}/${site}${web1FeedItemWithContent.link}/${new Date(web1FeedItemWithContent.pubDate).toUTCString()}`; -// prettier-ignore +// biome-ignore format: keep in one line const validXmlResultWithAllData = `<![CDATA[${title}]]>${site}/<![CDATA[${phpFeedItem.title}]]>${site}${phpFeedItem.link}/${site}${phpFeedItem.link}/${new Date(phpFeedItem.pubDate).toUTCString()}<![CDATA[${web1FeedItemWithAllData.title}]]>${site}${web1FeedItemWithAllData.link}/${site}${web1FeedItemWithAllData.link}/${new Date(web1FeedItemWithAllData.pubDate).toUTCString()}${web1FeedItemWithAllData.categories[0]}${web1FeedItemWithAllData.categories[1]}${web1FeedItemWithAllData.author}${web1FeedItemWithAllData.commentsUrl}${web1FeedItemWithAllData.source.title}`; -// prettier-ignore +// biome-ignore format: keep in one line const validXmlWithCustomDataResult = `<![CDATA[${title}]]>${site}/<![CDATA[${phpFeedItemWithCustomData.title}]]>${site}${phpFeedItemWithCustomData.link}/${site}${phpFeedItemWithCustomData.link}/${new Date(phpFeedItemWithCustomData.pubDate).toUTCString()}${phpFeedItemWithCustomData.customData}<![CDATA[${web1FeedItemWithContent.title}]]>${site}${web1FeedItemWithContent.link}/${site}${web1FeedItemWithContent.link}/${new Date(web1FeedItemWithContent.pubDate).toUTCString()}`; -// prettier-ignore +// biome-ignore format: keep in one line const validXmlWithStylesheet = `<![CDATA[${title}]]>${site}/`; -// prettier-ignore +// biome-ignore format: keep in one line const validXmlWithXSLStylesheet = `<![CDATA[${title}]]>${site}/`; function assertXmlDeepEqual(a, b) { diff --git a/packages/astro/astro-jsx.d.ts b/packages/astro/astro-jsx.d.ts index 08a6c7fba9..7c2846efc0 100644 --- a/packages/astro/astro-jsx.d.ts +++ b/packages/astro/astro-jsx.d.ts @@ -9,8 +9,6 @@ * Adapted from React’s TypeScript definition from DefinitelyTyped. * @see https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/react/index.d.ts */ -// BUG! Prettier 3.0 removes `declare`: https://github.com/prettier/prettier/issues/15207 -// prettier-ignore declare namespace astroHTML.JSX { export type Child = Node | Node[] | string | number | boolean | null | undefined | unknown; export type Children = Child | Child[]; diff --git a/packages/astro/src/@types/astro.ts b/packages/astro/src/@types/astro.ts index a695ab2b7d..21630ec1e2 100644 --- a/packages/astro/src/@types/astro.ts +++ b/packages/astro/src/@types/astro.ts @@ -1496,9 +1496,8 @@ export interface AstroUserConfig { * Controls the routing strategy to determine your site URLs. Set this based on your folder/URL path configuration for your default language. * */ - // prettier-ignore - routing?: - { + routing?: + | { /** * @docs * @name i18n.routing.prefixDefaultLocale @@ -1515,18 +1514,18 @@ export interface AstroUserConfig { * When `true`, all URLs will display a language prefix. * URLs will be of the form `example.com/[locale]/content/` for every route, including the default language. * Localized folders are used for every language, including the default. - * - * ```js - * export default defineConfig({ - * i18n: { - * defaultLocale: "en", - * locales: ["en", "fr", "pt-br", "es"], - * routing: { - * prefixDefaultLocale: true, - * } - * } - * }) - * ``` + * + * ```js + * export default defineConfig({ + * i18n: { + * defaultLocale: "en", + * locales: ["en", "fr", "pt-br", "es"], + * routing: { + * prefixDefaultLocale: true, + * } + * } + * }) + * ``` */ prefixDefaultLocale?: boolean; @@ -1569,32 +1568,32 @@ export interface AstroUserConfig { * - `"pathname": The strategy is applied to the pathname of the URLs */ strategy?: 'pathname'; - } | - /** - * - * @docs - * @name i18n.routing.manual - * @kind h4 - * @type {string} - * @version 4.6.0 - * @description - * When this option is enabled, Astro will **disable** its i18n middleware so that you can implement your own custom logic. No other `routing` options (e.g. `prefixDefaultLocale`) may be configured with `routing: "manual"`. - * - * You will be responsible for writing your own routing logic, or executing Astro's i18n middleware manually alongside your own. - * - * ```js - * export default defineConfig({ - * i18n: { - * defaultLocale: "en", - * locales: ["en", "fr", "pt-br", "es"], - * routing: { - * prefixDefaultLocale: true, - * } - * } - * }) - * ``` - */ - 'manual'; + } + /** + * + * @docs + * @name i18n.routing.manual + * @kind h4 + * @type {string} + * @version 4.6.0 + * @description + * When this option is enabled, Astro will **disable** its i18n middleware so that you can implement your own custom logic. No other `routing` options (e.g. `prefixDefaultLocale`) may be configured with `routing: "manual"`. + * + * You will be responsible for writing your own routing logic, or executing Astro's i18n middleware manually alongside your own. + * + * ```js + * export default defineConfig({ + * i18n: { + * defaultLocale: "en", + * locales: ["en", "fr", "pt-br", "es"], + * routing: { + * prefixDefaultLocale: true, + * } + * } + * }) + * ``` + */ + | 'manual'; /** * @name i18n.domains diff --git a/packages/astro/src/assets/vite-plugin-assets.ts b/packages/astro/src/assets/vite-plugin-assets.ts index a696e5619e..03a9bef29f 100644 --- a/packages/astro/src/assets/vite-plugin-assets.ts +++ b/packages/astro/src/assets/vite-plugin-assets.ts @@ -147,7 +147,9 @@ export default function assets({ : settings.config.outDir ) )}); - export const assetsDir = /* #__PURE__ */ new URL(${JSON.stringify(settings.config.build.assets)}, outDir); + export const assetsDir = /* #__PURE__ */ new URL(${JSON.stringify( + settings.config.build.assets + )}, outDir); export const getImage = async (options) => await getImageInternal(options, imageConfig); `; } diff --git a/packages/astro/src/cli/install-package.ts b/packages/astro/src/cli/install-package.ts index 7c8601e48a..c84356cdb7 100644 --- a/packages/astro/src/cli/install-package.ts +++ b/packages/astro/src/cli/install-package.ts @@ -39,7 +39,9 @@ export async function getPackage( return packageImport as T; } catch (e) { if (options.optional) return undefined; - let message = `To continue, Astro requires the following dependency to be installed: ${bold(packageName)}.`; + let message = `To continue, Astro requires the following dependency to be installed: ${bold( + packageName + )}.`; if (ci.isCI) { message += ` Packages cannot be installed automatically in CI environments.`; diff --git a/packages/astro/src/core/errors/dev/utils.ts b/packages/astro/src/core/errors/dev/utils.ts index f5de83de47..c151b55cd7 100644 --- a/packages/astro/src/core/errors/dev/utils.ts +++ b/packages/astro/src/core/errors/dev/utils.ts @@ -171,7 +171,9 @@ function collectInfoFromStacktrace(error: SSRError & { stack: string }): StackIn error.pluginCode || error.id || // TODO: this could be better, `src` might be something else - stackText.split('\n').find((ln) => ln.includes('src') || ln.includes('node_modules')); + stackText + .split('\n') + .find((ln) => ln.includes('src') || ln.includes('node_modules')); // Disable eslint as we're not sure how to improve this regex yet // eslint-disable-next-line regexp/no-super-linear-backtracking const source = possibleFilePath?.replace?.(/^[^(]+\(([^)]+).*$/, '$1').replace(/^\s+at\s+/, ''); diff --git a/packages/astro/src/core/errors/errors-data.ts b/packages/astro/src/core/errors/errors-data.ts index 6cb22cc00e..e2593e6f12 100644 --- a/packages/astro/src/core/errors/errors-data.ts +++ b/packages/astro/src/core/errors/errors-data.ts @@ -168,9 +168,7 @@ export const NoMatchingRenderer = { ${ validRenderersCount > 0 - ? `There ${plural ? 'are' : 'is'} ${validRenderersCount} renderer${ - plural ? 's' : '' - } configured in your \`astro.config.mjs\` file, + ? `There ${plural ? 'are' : 'is'} ${validRenderersCount} renderer${plural ? 's' : ''} configured in your \`astro.config.mjs\` file, but ${plural ? 'none were' : 'it was not'} able to server-side render \`${componentName}\`.` : `No valid renderer was found ${ componentExtension diff --git a/packages/astro/src/runtime/client/dev-toolbar/apps/settings.ts b/packages/astro/src/runtime/client/dev-toolbar/apps/settings.ts index 4f7dc14ce6..eb97bd34e8 100644 --- a/packages/astro/src/runtime/client/dev-toolbar/apps/settings.ts +++ b/packages/astro/src/runtime/client/dev-toolbar/apps/settings.ts @@ -195,8 +195,9 @@ export default { if (placement === settings.config[setting.settingKey]) { option.selected = true; } - option.textContent = - `${placement.slice(0, 1).toUpperCase()}${placement.slice(1)}`.replace('-', ' '); + option.textContent = `${placement.slice(0, 1).toUpperCase()}${placement.slice( + 1 + )}`.replace('-', ' '); astroSelect.append(option); }); astroSelect.element.addEventListener('change', setting.changeEvent); diff --git a/packages/astro/src/runtime/client/dev-toolbar/toolbar.ts b/packages/astro/src/runtime/client/dev-toolbar/toolbar.ts index 278bd09667..2fe3a8f8f0 100644 --- a/packages/astro/src/runtime/client/dev-toolbar/toolbar.ts +++ b/packages/astro/src/runtime/client/dev-toolbar/toolbar.ts @@ -256,7 +256,9 @@ export class AstroDevToolbar extends HTMLElement { width: 1px; } -
+
@@ -281,7 +283,9 @@ export class AstroDevToolbar extends HTMLElement { : '' }
- ${this.getAppTemplate(this.apps.find((app) => app.builtIn && app.id === 'astro:settings')!)} + ${this.getAppTemplate( + this.apps.find((app) => app.builtIn && app.id === 'astro:settings')! + )}
diff --git a/packages/astro/src/runtime/client/dev-toolbar/ui-library/tooltip.ts b/packages/astro/src/runtime/client/dev-toolbar/ui-library/tooltip.ts index b574abd918..062d683715 100644 --- a/packages/astro/src/runtime/client/dev-toolbar/ui-library/tooltip.ts +++ b/packages/astro/src/runtime/client/dev-toolbar/ui-library/tooltip.ts @@ -138,7 +138,11 @@ export class DevToolbarTooltip extends HTMLElement { : '' } ${section.content ? `
${section.content}
` : ''} - ${section.clickDescription ? `${section.clickDescription}` : ''} + ${ + section.clickDescription + ? `${section.clickDescription}` + : '' + } `; fragment.append(sectionElement); diff --git a/packages/astro/src/transitions/router.ts b/packages/astro/src/transitions/router.ts index e0ffb4d7ee..5766656f47 100644 --- a/packages/astro/src/transitions/router.ts +++ b/packages/astro/src/transitions/router.ts @@ -482,7 +482,7 @@ async function transition( preparationEvent.sourceElement instanceof HTMLFormElement ? preparationEvent.sourceElement : preparationEvent.sourceElement instanceof HTMLElement && - 'form' in preparationEvent.sourceElement + 'form' in preparationEvent.sourceElement ? (preparationEvent.sourceElement.form as HTMLFormElement) : preparationEvent.sourceElement?.closest('form'); // Form elements without enctype explicitly set default to application/x-www-form-urlencoded. diff --git a/packages/astro/test/test-adapter.js b/packages/astro/test/test-adapter.js index 72c5e0c0f0..bdfffc83c4 100644 --- a/packages/astro/test/test-adapter.js +++ b/packages/astro/test/test-adapter.js @@ -52,7 +52,11 @@ export default function ( return new Response(data); } - ${provideAddress ? `request[Symbol.for('astro.clientAddress')] = '0.0.0.0';` : ''} + ${ + provideAddress + ? `request[Symbol.for('astro.clientAddress')] = '0.0.0.0';` + : '' + } return super.render(request, routeData, locals); } } diff --git a/packages/db/src/core/errors.ts b/packages/db/src/core/errors.ts index 620b2b985f..655cbbf380 100644 --- a/packages/db/src/core/errors.ts +++ b/packages/db/src/core/errors.ts @@ -35,8 +35,7 @@ export const RENAME_COLUMN_ERROR = (oldSelector: string, newSelector: string) => ); }; -export const FILE_NOT_FOUND_ERROR = (path: string) => - `${red('â–¶ File not found:')} ${bold(path)}\n`; +export const FILE_NOT_FOUND_ERROR = (path: string) => `${red('â–¶ File not found:')} ${bold(path)}\n`; export const SHELL_QUERY_MISSING_ERROR = `${red( 'â–¶ Please provide a query to execute using the --query flag.' diff --git a/packages/db/src/core/schemas.ts b/packages/db/src/core/schemas.ts index 4dff9039ae..a2a8368fbf 100644 --- a/packages/db/src/core/schemas.ts +++ b/packages/db/src/core/schemas.ts @@ -133,7 +133,9 @@ export const dateColumnSchema = z.object({ .union([ sqlSchema, // transform to ISO string for serialization - z.date().transform((d) => d.toISOString()), + z + .date() + .transform((d) => d.toISOString()), ]) .optional(), }), diff --git a/packages/upgrade/src/actions/context.ts b/packages/upgrade/src/actions/context.ts index f89095e7b2..775c552c0d 100644 --- a/packages/upgrade/src/actions/context.ts +++ b/packages/upgrade/src/actions/context.ts @@ -39,7 +39,11 @@ export async function getContext(argv: string[]): Promise { ); const packageManager = detectPackageManager()?.name ?? 'npm'; - const { _: [version = 'latest'] = [], '--help': help = false, '--dry-run': dryRun } = flags; + const { + _: [version = 'latest'] = [], + '--help': help = false, + '--dry-run': dryRun, + } = flags; return { help, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1d2d89b5a8..3b50248aac 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -22,8 +22,8 @@ importers: specifier: ^0.5.8 version: 0.5.10(prettier-plugin-astro@0.12.3)(prettier@3.2.5)(typescript@5.2.2) '@biomejs/biome': - specifier: 1.5.3 - version: 1.5.3 + specifier: 1.6.4 + version: 1.6.4 '@changesets/changelog-github': specifier: ^0.4.8 version: 0.4.8 @@ -6120,88 +6120,88 @@ packages: '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 - /@biomejs/biome@1.5.3: - resolution: {integrity: sha512-yvZCa/g3akwTaAQ7PCwPWDCkZs3Qa5ONg/fgOUT9e6wAWsPftCjLQFPXBeGxPK30yZSSpgEmRCfpGTmVbUjGgg==} - engines: {node: '>=14.*'} + /@biomejs/biome@1.6.4: + resolution: {integrity: sha512-3groVd2oWsLC0ZU+XXgHSNbq31lUcOCBkCcA7sAQGBopHcmL+jmmdoWlY3S61zIh+f2mqQTQte1g6PZKb3JJjA==} + engines: {node: '>=14.21.3'} hasBin: true requiresBuild: true optionalDependencies: - '@biomejs/cli-darwin-arm64': 1.5.3 - '@biomejs/cli-darwin-x64': 1.5.3 - '@biomejs/cli-linux-arm64': 1.5.3 - '@biomejs/cli-linux-arm64-musl': 1.5.3 - '@biomejs/cli-linux-x64': 1.5.3 - '@biomejs/cli-linux-x64-musl': 1.5.3 - '@biomejs/cli-win32-arm64': 1.5.3 - '@biomejs/cli-win32-x64': 1.5.3 + '@biomejs/cli-darwin-arm64': 1.6.4 + '@biomejs/cli-darwin-x64': 1.6.4 + '@biomejs/cli-linux-arm64': 1.6.4 + '@biomejs/cli-linux-arm64-musl': 1.6.4 + '@biomejs/cli-linux-x64': 1.6.4 + '@biomejs/cli-linux-x64-musl': 1.6.4 + '@biomejs/cli-win32-arm64': 1.6.4 + '@biomejs/cli-win32-x64': 1.6.4 dev: true - /@biomejs/cli-darwin-arm64@1.5.3: - resolution: {integrity: sha512-ImU7mh1HghEDyqNmxEZBoMPr8SxekkZuYcs+gynKlNW+TALQs7swkERiBLkG9NR0K1B3/2uVzlvYowXrmlW8hw==} - engines: {node: '>=14.*'} + /@biomejs/cli-darwin-arm64@1.6.4: + resolution: {integrity: sha512-2WZef8byI9NRzGajGj5RTrroW9BxtfbP9etigW1QGAtwu/6+cLkdPOWRAs7uFtaxBNiKFYA8j/BxV5zeAo5QOQ==} + engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] requiresBuild: true dev: true optional: true - /@biomejs/cli-darwin-x64@1.5.3: - resolution: {integrity: sha512-vCdASqYnlpq/swErH7FD6nrFz0czFtK4k/iLgj0/+VmZVjineFPgevOb+Sr9vz0tk0GfdQO60bSpI74zU8M9Dw==} - engines: {node: '>=14.*'} + /@biomejs/cli-darwin-x64@1.6.4: + resolution: {integrity: sha512-uo1zgM7jvzcoDpF6dbGizejDLCqNpUIRkCj/oEK0PB0NUw8re/cn1EnxuOLZqDpn+8G75COLQTOx8UQIBBN/Kg==} + engines: {node: '>=14.21.3'} cpu: [x64] os: [darwin] requiresBuild: true dev: true optional: true - /@biomejs/cli-linux-arm64-musl@1.5.3: - resolution: {integrity: sha512-DYuMizUYUBYfS0IHGjDrOP1RGipqWfMGEvNEJ398zdtmCKLXaUvTimiox5dvx4X15mBK5M2m8wgWUgOP1giUpQ==} - engines: {node: '>=14.*'} + /@biomejs/cli-linux-arm64-musl@1.6.4: + resolution: {integrity: sha512-Hp8Jwt6rjj0wCcYAEN6/cfwrrPLLlGOXZ56Lei4Pt4jy39+UuPeAVFPeclrrCfxyL1wQ2xPrhd/saTHSL6DoJg==} + engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@biomejs/cli-linux-arm64@1.5.3: - resolution: {integrity: sha512-cupBQv0sNF1OKqBfx7EDWMSsKwRrBUZfjXawT4s6hKV6ALq7p0QzWlxr/sDmbKMLOaLQtw2Qgu/77N9rm+f9Rg==} - engines: {node: '>=14.*'} + /@biomejs/cli-linux-arm64@1.6.4: + resolution: {integrity: sha512-wAOieaMNIpLrxGc2/xNvM//CIZg7ueWy3V5A4T7gDZ3OL/Go27EKE59a+vMKsBCYmTt7jFl4yHz0TUkUbodA/w==} + engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@biomejs/cli-linux-x64-musl@1.5.3: - resolution: {integrity: sha512-UUHiAnlDqr2Y/LpvshBFhUYMWkl2/Jn+bi3U6jKuav0qWbbBKU/ByHgR4+NBxpKBYoCtWxhnmatfH1bpPIuZMw==} - engines: {node: '>=14.*'} + /@biomejs/cli-linux-x64-musl@1.6.4: + resolution: {integrity: sha512-wqi0hr8KAx5kBO0B+m5u8QqiYFFBJOSJVSuRqTeGWW+GYLVUtXNidykNqf1JsW6jJDpbkSp2xHKE/bTlVaG2Kg==} + engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@biomejs/cli-linux-x64@1.5.3: - resolution: {integrity: sha512-YQrSArQvcv4FYsk7Q91Yv4uuu5F8hJyORVcv3zsjCLGkjIjx2RhjYLpTL733SNL7v33GmOlZY0eFR1ko38tuUw==} - engines: {node: '>=14.*'} + /@biomejs/cli-linux-x64@1.6.4: + resolution: {integrity: sha512-qTWhuIw+/ePvOkjE9Zxf5OqSCYxtAvcTJtVmZT8YQnmY2I62JKNV2m7tf6O5ViKZUOP0mOQ6NgqHKcHH1eT8jw==} + engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@biomejs/cli-win32-arm64@1.5.3: - resolution: {integrity: sha512-HxatYH7vf/kX9nrD+pDYuV2GI9GV8EFo6cfKkahAecTuZLPxryHx1WEfJthp5eNsE0+09STGkKIKjirP0ufaZA==} - engines: {node: '>=14.*'} + /@biomejs/cli-win32-arm64@1.6.4: + resolution: {integrity: sha512-Wp3FiEeF6v6C5qMfLkHwf4YsoNHr/n0efvoC8jCKO/kX05OXaVExj+1uVQ1eGT7Pvx0XVm/TLprRO0vq/V6UzA==} + engines: {node: '>=14.21.3'} cpu: [arm64] os: [win32] requiresBuild: true dev: true optional: true - /@biomejs/cli-win32-x64@1.5.3: - resolution: {integrity: sha512-fMvbSouZEASU7mZH8SIJSANDm5OqsjgtVXlbUqxwed6BP7uuHRSs396Aqwh2+VoW8fwTpp6ybIUoC9FrzB0kyA==} - engines: {node: '>=14.*'} + /@biomejs/cli-win32-x64@1.6.4: + resolution: {integrity: sha512-mz183Di5hTSGP7KjNWEhivcP1wnHLGmOxEROvoFsIxMYtDhzJDad4k5gI/1JbmA0xe4n52vsgqo09tBhrMT/Zg==} + engines: {node: '>=14.21.3'} cpu: [x64] os: [win32] requiresBuild: true diff --git a/prettier.config.js b/prettier.config.js index b284866080..4c99694291 100644 --- a/prettier.config.js +++ b/prettier.config.js @@ -9,7 +9,7 @@ export default { plugins: ['prettier-plugin-astro'], overrides: [ { - files: ['.*', '*.json', '*.md', '*.toml', '*.yml'], + files: ['.*', '*.md', '*.toml', '*.yml'], options: { useTabs: false, }, From 347bdfe5501fa8c8a4dce4333e74db6526cc5571 Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Wed, 17 Apr 2024 08:38:53 +0000 Subject: [PATCH 16/36] [ci] format --- packages/astro/components/Image.astro | 2 +- packages/astro/components/Picture.astro | 2 +- .../fixtures/astro-component/src/pages/index.astro | 2 +- .../e2e/fixtures/client-only/src/pages/index.astro | 4 ++-- .../hydration-race/src/components/Wrapper.astro | 2 +- .../e2e/fixtures/lit-component/src/pages/index.astro | 2 +- .../multiple-frameworks/src/pages/index.astro | 8 ++++---- .../fixtures/nested-in-preact/src/pages/index.astro | 4 ++-- .../fixtures/nested-in-react/src/pages/index.astro | 4 ++-- .../fixtures/nested-in-solid/src/pages/index.astro | 4 ++-- .../fixtures/nested-in-svelte/src/pages/index.astro | 4 ++-- .../e2e/fixtures/nested-in-vue/src/pages/index.astro | 4 ++-- .../fixtures/nested-recursive/src/pages/index.astro | 4 ++-- .../astro/e2e/fixtures/pass-js/src/pages/index.astro | 2 +- .../e2e/fixtures/solid-recurse/src/pages/index.astro | 2 +- .../e2e/fixtures/tailwindcss/src/pages/index.astro | 4 ++-- .../src/components/ClickToNavigate.jsx | 2 +- .../view-transitions/src/pages/client-load.astro | 2 +- .../src/pages/client-only-four.astro | 4 ++-- .../view-transitions/src/pages/client-only-one.astro | 2 +- .../src/pages/client-only-three.astro | 4 ++-- .../view-transitions/src/pages/client-only-two.astro | 2 +- .../src/pages/inline-script-one.astro | 2 +- .../src/pages/inline-script-two.astro | 2 +- .../view-transitions/src/pages/island-one.astro | 2 +- .../view-transitions/src/pages/island-two.astro | 2 +- .../e2e/fixtures/vue-component/src/pages/index.astro | 4 ++-- packages/astro/e2e/nested-recursive.test.js | 2 +- .../fixtures/mdoc/src/ContentRenderer.astro | 2 +- .../fixtures/mdx/src/ContentRenderer.astro | 2 +- packages/astro/src/assets/endpoint/generic.ts | 4 ++-- packages/astro/src/assets/endpoint/node.ts | 4 ++-- packages/astro/src/core/build/plugin.ts | 2 +- packages/astro/src/core/build/plugins/plugin-css.ts | 2 +- packages/astro/src/core/build/plugins/util.ts | 2 +- packages/astro/src/core/config/schema.ts | 2 +- packages/astro/src/core/logger/vite.ts | 2 +- .../src/runtime/client/dev-toolbar/entrypoint.ts | 4 ++-- packages/astro/src/vite-plugin-astro/index.ts | 2 +- packages/astro/src/vite-plugin-config-alias/index.ts | 2 +- .../astro/test/fixtures/0-css/src/pages/index.astro | 6 +++--- .../src/pages/index.astro | 4 ++-- .../fixtures/alias-tsconfig/src/pages/index.astro | 6 +++--- .../astro-check-errors/src/pages/index.astro | 2 +- .../fixtures/astro-children/src/pages/markup.astro | 2 +- .../fixtures/astro-children/src/pages/multiple.astro | 2 +- .../fixtures/astro-children/src/pages/strings.astro | 2 +- .../fixtures/astro-client-only/src/pages/index.astro | 2 +- .../test/fixtures/astro-jsx/src/pages/index.astro | 2 +- .../fixtures/astro-partial-html/src/pages/head.astro | 2 +- .../fixtures/astro-partial-html/src/pages/jsx.astro | 2 +- .../astro-slots-nested/src/pages/hidden-nested.astro | 2 +- .../src/pages/server-component-nested.astro | 6 +++--- .../astro-slots/src/pages/slottedapi-render.astro | 2 +- .../src/pages/welcome.astro | 2 +- .../src/pages/collections.json.js | 2 +- .../content-collections/src/pages/entries.json.js | 2 +- .../core-image-deletion/src/pages/blog/[slug].astro | 2 +- .../core-image/src/pages/blog/[...slug].astro | 2 +- .../css-import-as-inline/src/pages/index.astro | 2 +- .../css-inline-stylesheets/src/pages/index.astro | 2 +- .../css-order-import/src/pages/component.astro | 2 +- .../fixtures/css-order-import/src/pages/dedupe.astro | 2 +- .../fixtures/css-order-import/src/pages/index.astro | 2 +- .../fixtures/css-order-layout/src/layouts/Main.astro | 2 +- .../css-order-layout/src/layouts/Second.astro | 2 +- .../astro/test/fixtures/fetch/src/pages/index.astro | 2 +- .../fontsource-package/src/pages/index.astro | 2 +- .../head-injection/src/pages/with-slot-in-slot.astro | 2 +- .../head-injection/src/pages/with-slot-render.astro | 2 +- .../test/fixtures/html-slots/src/pages/index.astro | 2 +- .../hydration-race/src/components/Wrapper.astro | 2 +- .../fixtures/hydration-race/src/pages/index.astro | 2 +- .../i18n-routing-subdomain/src/pages/index.astro | 2 +- .../i18n-routing/src/pages/virtual-module.astro | 2 +- .../test/fixtures/jsx/src/pages/frameworks.astro | 8 ++++---- .../multiple-renderers/src/pages/index.astro | 2 +- .../fixtures/preact-component/src/pages/fn.astro | 2 +- .../preact-component/src/pages/signals.astro | 2 +- .../fixtures/react-jsx-export/src/pages/index.astro | 2 +- .../src/pages/[lang]/[...catchall].astro | 2 +- .../routing-priority/src/pages/[lang]/index.astro | 2 +- .../fixtures/routing-priority/src/pages/[page].astro | 2 +- .../fixtures/routing-priority/src/pages/[slug].astro | 2 +- .../routing-priority/src/pages/posts/[...slug].astro | 2 +- .../routing-priority/src/pages/posts/[pid].astro | 2 +- .../fixtures/solid-component/src/pages/index.astro | 6 +++--- .../solid-component/src/pages/ssr-client-none.astro | 2 +- .../src/pages/index.astro | 4 ++-- .../fixtures/static-build/src/pages/hoisted.astro | 2 +- .../test/fixtures/static-build/src/pages/index.astro | 2 +- .../test/fixtures/streaming/src/pages/index.astro | 2 +- packages/create-astro/src/messages.ts | 2 +- packages/db/test/fixtures/basics/db/config.ts | 2 +- packages/db/test/fixtures/basics/db/seed.ts | 2 +- .../db/test/fixtures/basics/src/pages/index.astro | 2 +- .../db/test/fixtures/basics/src/pages/login.astro | 2 +- .../db/test/fixtures/basics/src/pages/run.json.ts | 2 +- packages/db/test/fixtures/db-in-src/db/seed.ts | 2 +- .../db/test/fixtures/db-in-src/pages/index.astro | 2 +- .../src/pages/foreign-key-constraint.json.ts | 2 +- .../fixtures/integration-only/integration/config.ts | 2 +- .../fixtures/integration-only/integration/seed.ts | 2 +- .../test/fixtures/integrations/integration/config.ts | 2 +- .../test/fixtures/integrations/integration/seed.ts | 2 +- packages/db/test/fixtures/local-prod/db/seed.ts | 2 +- .../test/fixtures/local-prod/src/pages/index.astro | 2 +- .../test/fixtures/no-apptoken/src/pages/index.astro | 2 +- .../db/test/fixtures/recipes/src/pages/index.astro | 2 +- .../ticketing-example/src/components/Form.tsx | 2 +- .../ticketing-example/src/pages/[event]/_Ticket.tsx | 2 +- packages/integrations/lit/server-shim.js | 2 +- .../integrations/markdoc/src/content-entry-type.ts | 2 +- .../markdoc/src/runtime-assets-config.ts | 4 ++-- .../content-collections/src/pages/collection.json.js | 2 +- .../content-collections/src/pages/entry.json.js | 2 +- .../fixtures/headings-custom/src/pages/[slug].astro | 2 +- .../test/fixtures/headings/src/pages/[slug].astro | 2 +- .../fixtures/image-assets/src/components/Image.astro | 2 +- .../test/fixtures/render-html/src/pages/[slug].astro | 2 +- .../css-head-mdx/src/pages/posts/[post].astro | 2 +- .../fixtures/css-head-mdx/src/pages/remote.astro | 6 +++--- .../fixtures/mdx-images/src/components/MyImage.astro | 2 +- .../fixtures/mdx-images/src/pages/esm-import.astro | 2 +- .../fixtures/mdx-optimize/src/pages/import.astro | 2 +- packages/integrations/react/server.js | 2 +- .../fixtures/react-component/src/pages/index.astro | 12 ++++++------ packages/integrations/vue/client.js | 2 +- packages/integrations/vue/server.js | 2 +- .../fixtures/app-entrypoint/src/pages/index.astro | 2 +- .../vue/test/fixtures/basics/src/pages/index.astro | 2 +- .../markdown/remark/src/frontmatter-injection.ts | 2 +- packages/telemetry/src/system-info.ts | 2 +- 133 files changed, 171 insertions(+), 171 deletions(-) diff --git a/packages/astro/components/Image.astro b/packages/astro/components/Image.astro index aee198a602..4e55f5608b 100644 --- a/packages/astro/components/Image.astro +++ b/packages/astro/components/Image.astro @@ -1,5 +1,5 @@ --- -import { getImage, type LocalImageProps, type RemoteImageProps } from 'astro:assets'; +import { type LocalImageProps, type RemoteImageProps, getImage } from 'astro:assets'; import { AstroError, AstroErrorData } from '../dist/core/errors/index.js'; import type { HTMLAttributes } from '../types'; diff --git a/packages/astro/components/Picture.astro b/packages/astro/components/Picture.astro index 6dcc50c8e1..3984a53e96 100644 --- a/packages/astro/components/Picture.astro +++ b/packages/astro/components/Picture.astro @@ -1,5 +1,5 @@ --- -import { getImage, type LocalImageProps, type RemoteImageProps } from 'astro:assets'; +import { type LocalImageProps, type RemoteImageProps, getImage } from 'astro:assets'; import type { GetImageResult, ImageOutputFormat } from '../dist/@types/astro'; import { isESMImportedImage, resolveSrc } from '../dist/assets/utils/imageKind'; import { AstroError, AstroErrorData } from '../dist/core/errors/index.js'; diff --git a/packages/astro/e2e/fixtures/astro-component/src/pages/index.astro b/packages/astro/e2e/fixtures/astro-component/src/pages/index.astro index 3ada093e7d..04cb1c110c 100644 --- a/packages/astro/e2e/fixtures/astro-component/src/pages/index.astro +++ b/packages/astro/e2e/fixtures/astro-component/src/pages/index.astro @@ -1,7 +1,7 @@ --- -import Hero from '../components/Hero.astro'; import LinkedLib from '@e2e/astro-linked-lib' import HoistedScript from '@e2e/astro-linked-lib/HoistedScript' +import Hero from '../components/Hero.astro'; --- diff --git a/packages/astro/e2e/fixtures/client-only/src/pages/index.astro b/packages/astro/e2e/fixtures/client-only/src/pages/index.astro index d8b30b9cf0..a80bddc0eb 100644 --- a/packages/astro/e2e/fixtures/client-only/src/pages/index.astro +++ b/packages/astro/e2e/fixtures/client-only/src/pages/index.astro @@ -1,9 +1,9 @@ --- -import * as react from '../components/react/ReactCounter.jsx'; import { PreactCounter } from '../components/preact/PreactCounter.jsx'; +import * as react from '../components/react/ReactCounter.jsx'; import SolidCounter from '../components/solid/SolidCounter.jsx'; -import VueCounter from '../components/vue/VueCounter.vue'; import SvelteCounter from '../components/svelte/SvelteCounter.svelte'; +import VueCounter from '../components/vue/VueCounter.vue'; // Full Astro Component Syntax: // https://docs.astro.build/basics/astro-components/ diff --git a/packages/astro/e2e/fixtures/hydration-race/src/components/Wrapper.astro b/packages/astro/e2e/fixtures/hydration-race/src/components/Wrapper.astro index a3de9b8ecc..9a914d8fb3 100644 --- a/packages/astro/e2e/fixtures/hydration-race/src/components/Wrapper.astro +++ b/packages/astro/e2e/fixtures/hydration-race/src/components/Wrapper.astro @@ -1,6 +1,6 @@ --- -import One from './One.jsx'; import Deeper from './Deeper.astro'; +import One from './One.jsx'; --- diff --git a/packages/astro/e2e/fixtures/lit-component/src/pages/index.astro b/packages/astro/e2e/fixtures/lit-component/src/pages/index.astro index 43eb17a4ec..1d9511057b 100644 --- a/packages/astro/e2e/fixtures/lit-component/src/pages/index.astro +++ b/packages/astro/e2e/fixtures/lit-component/src/pages/index.astro @@ -1,7 +1,7 @@ --- +import ClientOnlyComponent from '../components/ClientOnlyComponent.js'; import MyCounter from '../components/Counter.js'; import NonDeferredCounter from '../components/NonDeferredCounter.js'; -import ClientOnlyComponent from '../components/ClientOnlyComponent.js'; const someProps = { count: 10, diff --git a/packages/astro/e2e/fixtures/multiple-frameworks/src/pages/index.astro b/packages/astro/e2e/fixtures/multiple-frameworks/src/pages/index.astro index ded58d8aa1..55b2108cbe 100644 --- a/packages/astro/e2e/fixtures/multiple-frameworks/src/pages/index.astro +++ b/packages/astro/e2e/fixtures/multiple-frameworks/src/pages/index.astro @@ -1,13 +1,13 @@ --- -// Style Imports -import '../styles/global.css'; // Component Imports import { A, B as Renamed } from '../components'; -import * as react from '../components/react/ReactCounter.jsx'; import { PreactCounter } from '../components/preact/PreactCounter.tsx'; +import * as react from '../components/react/ReactCounter.jsx'; import SolidCounter from '../components/solid/SolidCounter.tsx'; -import VueCounter from '../components/vue/VueCounter.vue'; import SvelteCounter from '../components/svelte/SvelteCounter.svelte'; +import VueCounter from '../components/vue/VueCounter.vue'; +// Style Imports +import '../styles/global.css'; // Full Astro Component Syntax: // https://docs.astro.build/basics/astro-components/ diff --git a/packages/astro/e2e/fixtures/nested-in-preact/src/pages/index.astro b/packages/astro/e2e/fixtures/nested-in-preact/src/pages/index.astro index 19ab504275..962f8f0385 100644 --- a/packages/astro/e2e/fixtures/nested-in-preact/src/pages/index.astro +++ b/packages/astro/e2e/fixtures/nested-in-preact/src/pages/index.astro @@ -1,9 +1,9 @@ --- -import ReactCounter from '../components/react/ReactCounter.jsx'; import { PreactCounter } from '../components/preact/PreactCounter.tsx'; +import ReactCounter from '../components/react/ReactCounter.jsx'; import SolidCounter from '../components/solid/SolidCounter.tsx'; -import VueCounter from '../components/vue/VueCounter.vue'; import SvelteCounter from '../components/svelte/SvelteCounter.svelte'; +import VueCounter from '../components/vue/VueCounter.vue'; // Full Astro Component Syntax: // https://docs.astro.build/basics/astro-components/ diff --git a/packages/astro/e2e/fixtures/nested-in-react/src/pages/index.astro b/packages/astro/e2e/fixtures/nested-in-react/src/pages/index.astro index 1ab459f743..9fb5b48628 100644 --- a/packages/astro/e2e/fixtures/nested-in-react/src/pages/index.astro +++ b/packages/astro/e2e/fixtures/nested-in-react/src/pages/index.astro @@ -1,9 +1,9 @@ --- -import ReactCounter from '../components/react/ReactCounter.jsx'; import { PreactCounter } from '../components/preact/PreactCounter.tsx'; +import ReactCounter from '../components/react/ReactCounter.jsx'; import SolidCounter from '../components/solid/SolidCounter.tsx'; -import VueCounter from '../components/vue/VueCounter.vue'; import SvelteCounter from '../components/svelte/SvelteCounter.svelte'; +import VueCounter from '../components/vue/VueCounter.vue'; // Full Astro Component Syntax: // https://docs.astro.build/basics/astro-components/ diff --git a/packages/astro/e2e/fixtures/nested-in-solid/src/pages/index.astro b/packages/astro/e2e/fixtures/nested-in-solid/src/pages/index.astro index 91552a8367..c4af890a0a 100644 --- a/packages/astro/e2e/fixtures/nested-in-solid/src/pages/index.astro +++ b/packages/astro/e2e/fixtures/nested-in-solid/src/pages/index.astro @@ -1,9 +1,9 @@ --- -import { Counter as ReactCounter } from '../components/react/ReactCounter.jsx'; import { PreactCounter } from '../components/preact/PreactCounter.tsx'; +import { Counter as ReactCounter } from '../components/react/ReactCounter.jsx'; import SolidCounter from '../components/solid/SolidCounter.tsx'; -import VueCounter from '../components/vue/VueCounter.vue'; import SvelteCounter from '../components/svelte/SvelteCounter.svelte'; +import VueCounter from '../components/vue/VueCounter.vue'; // Full Astro Component Syntax: // https://docs.astro.build/basics/astro-components/ diff --git a/packages/astro/e2e/fixtures/nested-in-svelte/src/pages/index.astro b/packages/astro/e2e/fixtures/nested-in-svelte/src/pages/index.astro index 5648a25814..b1b8187d52 100644 --- a/packages/astro/e2e/fixtures/nested-in-svelte/src/pages/index.astro +++ b/packages/astro/e2e/fixtures/nested-in-svelte/src/pages/index.astro @@ -1,9 +1,9 @@ --- -import { Counter as ReactCounter } from '../components/react/ReactCounter.jsx'; import { PreactCounter } from '../components/preact/PreactCounter.tsx'; +import { Counter as ReactCounter } from '../components/react/ReactCounter.jsx'; import SolidCounter from '../components/solid/SolidCounter.tsx'; -import VueCounter from '../components/vue/VueCounter.vue'; import SvelteCounter from '../components/svelte/SvelteCounter.svelte'; +import VueCounter from '../components/vue/VueCounter.vue'; // Full Astro Component Syntax: // https://docs.astro.build/basics/astro-components/ diff --git a/packages/astro/e2e/fixtures/nested-in-vue/src/pages/index.astro b/packages/astro/e2e/fixtures/nested-in-vue/src/pages/index.astro index ea0a88f84d..f8e74ff786 100644 --- a/packages/astro/e2e/fixtures/nested-in-vue/src/pages/index.astro +++ b/packages/astro/e2e/fixtures/nested-in-vue/src/pages/index.astro @@ -1,9 +1,9 @@ --- -import { Counter as ReactCounter } from '../components/react/ReactCounter.jsx'; import { PreactCounter } from '../components/preact/PreactCounter.tsx'; +import { Counter as ReactCounter } from '../components/react/ReactCounter.jsx'; import SolidCounter from '../components/solid/SolidCounter.tsx'; -import VueCounter from '../components/vue/VueCounter.vue'; import SvelteCounter from '../components/svelte/SvelteCounter.svelte'; +import VueCounter from '../components/vue/VueCounter.vue'; // Full Astro Component Syntax: // https://docs.astro.build/basics/astro-components/ diff --git a/packages/astro/e2e/fixtures/nested-recursive/src/pages/index.astro b/packages/astro/e2e/fixtures/nested-recursive/src/pages/index.astro index a17337c897..4b180602db 100644 --- a/packages/astro/e2e/fixtures/nested-recursive/src/pages/index.astro +++ b/packages/astro/e2e/fixtures/nested-recursive/src/pages/index.astro @@ -1,9 +1,9 @@ --- -import ReactCounter from '../components/react/ReactCounter.jsx'; import PreactCounter from '../components/preact/PreactCounter.tsx'; +import ReactCounter from '../components/react/ReactCounter.jsx'; import SolidCounter from '../components/solid/SolidCounter.tsx'; -import VueCounter from '../components/vue/VueCounter.vue'; import SvelteCounter from '../components/svelte/SvelteCounter.svelte'; +import VueCounter from '../components/vue/VueCounter.vue'; --- diff --git a/packages/astro/e2e/fixtures/pass-js/src/pages/index.astro b/packages/astro/e2e/fixtures/pass-js/src/pages/index.astro index 181f2bfba3..24794367f3 100644 --- a/packages/astro/e2e/fixtures/pass-js/src/pages/index.astro +++ b/packages/astro/e2e/fixtures/pass-js/src/pages/index.astro @@ -1,6 +1,6 @@ --- -import type { BigNestedObject } from '../types'; import Component from '../components/React'; +import type { BigNestedObject } from '../types'; const object: BigNestedObject = { nested: { diff --git a/packages/astro/e2e/fixtures/solid-recurse/src/pages/index.astro b/packages/astro/e2e/fixtures/solid-recurse/src/pages/index.astro index 7aeca1aef2..b67eb81ced 100644 --- a/packages/astro/e2e/fixtures/solid-recurse/src/pages/index.astro +++ b/packages/astro/e2e/fixtures/solid-recurse/src/pages/index.astro @@ -1,6 +1,6 @@ --- -import WrapperB from "../components/WrapperB.jsx"; import WrapperA from "../components/WrapperA.jsx"; +import WrapperB from "../components/WrapperB.jsx"; --- diff --git a/packages/astro/e2e/fixtures/tailwindcss/src/pages/index.astro b/packages/astro/e2e/fixtures/tailwindcss/src/pages/index.astro index 948fa51df0..65bff4d4a3 100644 --- a/packages/astro/e2e/fixtures/tailwindcss/src/pages/index.astro +++ b/packages/astro/e2e/fixtures/tailwindcss/src/pages/index.astro @@ -1,8 +1,8 @@ --- -// Component Imports -import Layout from '../components/Layout.astro'; import Button from '../components/Button.astro'; import Complex from '../components/Complex.astro'; +// Component Imports +import Layout from '../components/Layout.astro'; --- diff --git a/packages/astro/e2e/fixtures/view-transitions/src/components/ClickToNavigate.jsx b/packages/astro/e2e/fixtures/view-transitions/src/components/ClickToNavigate.jsx index db8cc25f3a..2d14d42a69 100644 --- a/packages/astro/e2e/fixtures/view-transitions/src/components/ClickToNavigate.jsx +++ b/packages/astro/e2e/fixtures/view-transitions/src/components/ClickToNavigate.jsx @@ -1,5 +1,5 @@ -import React from 'react'; import { navigate } from "astro:transitions/client"; +import React from 'react'; export default function ClickToNavigate({ to, id }) { return ; } diff --git a/packages/astro/e2e/fixtures/view-transitions/src/pages/client-load.astro b/packages/astro/e2e/fixtures/view-transitions/src/pages/client-load.astro index f24d216be9..0eaff1165c 100644 --- a/packages/astro/e2e/fixtures/view-transitions/src/pages/client-load.astro +++ b/packages/astro/e2e/fixtures/view-transitions/src/pages/client-load.astro @@ -1,6 +1,6 @@ --- -import ClickToNavigate from "../components/ClickToNavigate.jsx" import { ViewTransitions } from "astro:transitions"; +import ClickToNavigate from "../components/ClickToNavigate.jsx" --- diff --git a/packages/astro/e2e/fixtures/view-transitions/src/pages/client-only-four.astro b/packages/astro/e2e/fixtures/view-transitions/src/pages/client-only-four.astro index 9ebfa65f04..569a24b1a4 100644 --- a/packages/astro/e2e/fixtures/view-transitions/src/pages/client-only-four.astro +++ b/packages/astro/e2e/fixtures/view-transitions/src/pages/client-only-four.astro @@ -1,8 +1,8 @@ --- -import Layout from '../components/Layout.astro'; import Island from '../components/Island'; -import VueCounter from '../components/VueCounter.vue'; +import Layout from '../components/Layout.astro'; import SvelteCounter from '../components/SvelteCounter.svelte'; +import VueCounter from '../components/VueCounter.vue'; ---

Page 4

diff --git a/packages/astro/e2e/fixtures/view-transitions/src/pages/client-only-one.astro b/packages/astro/e2e/fixtures/view-transitions/src/pages/client-only-one.astro index a51ccc299b..1a9b731bf6 100644 --- a/packages/astro/e2e/fixtures/view-transitions/src/pages/client-only-one.astro +++ b/packages/astro/e2e/fixtures/view-transitions/src/pages/client-only-one.astro @@ -1,6 +1,6 @@ --- -import Layout from '../components/Layout.astro'; import Island from '../components/Island'; +import Layout from '../components/Layout.astro'; ---
go to page 2 diff --git a/packages/astro/e2e/fixtures/view-transitions/src/pages/client-only-three.astro b/packages/astro/e2e/fixtures/view-transitions/src/pages/client-only-three.astro index 34fa699269..83fcd4e182 100644 --- a/packages/astro/e2e/fixtures/view-transitions/src/pages/client-only-three.astro +++ b/packages/astro/e2e/fixtures/view-transitions/src/pages/client-only-three.astro @@ -1,8 +1,8 @@ --- -import Layout from '../components/Layout.astro'; import Island from '../components/Island'; -import VueCounter from '../components/VueCounter.vue'; +import Layout from '../components/Layout.astro'; import SvelteCounter from '../components/SvelteCounter.svelte'; +import VueCounter from '../components/VueCounter.vue'; --- go to page 4 diff --git a/packages/astro/e2e/fixtures/view-transitions/src/pages/client-only-two.astro b/packages/astro/e2e/fixtures/view-transitions/src/pages/client-only-two.astro index 4190d86efb..2175ffd0b1 100644 --- a/packages/astro/e2e/fixtures/view-transitions/src/pages/client-only-two.astro +++ b/packages/astro/e2e/fixtures/view-transitions/src/pages/client-only-two.astro @@ -1,6 +1,6 @@ --- -import Layout from '../components/Layout.astro'; import Island from '../components/Island'; +import Layout from '../components/Layout.astro'; ---

Page 2

diff --git a/packages/astro/e2e/fixtures/view-transitions/src/pages/inline-script-one.astro b/packages/astro/e2e/fixtures/view-transitions/src/pages/inline-script-one.astro index e887fe6a5e..bd59d22cfd 100644 --- a/packages/astro/e2e/fixtures/view-transitions/src/pages/inline-script-one.astro +++ b/packages/astro/e2e/fixtures/view-transitions/src/pages/inline-script-one.astro @@ -1,6 +1,6 @@ --- -import Layout from '../components/Layout.astro'; import InlineScript from '../components/InlineScript.astro'; +import Layout from '../components/Layout.astro'; --- diff --git a/packages/astro/e2e/fixtures/view-transitions/src/pages/inline-script-two.astro b/packages/astro/e2e/fixtures/view-transitions/src/pages/inline-script-two.astro index 430ad94651..2becd8d1cc 100644 --- a/packages/astro/e2e/fixtures/view-transitions/src/pages/inline-script-two.astro +++ b/packages/astro/e2e/fixtures/view-transitions/src/pages/inline-script-two.astro @@ -1,6 +1,6 @@ --- -import Layout from '../components/Layout.astro'; import InlineScript from '../components/InlineScript.astro'; +import Layout from '../components/Layout.astro'; --- diff --git a/packages/astro/e2e/fixtures/view-transitions/src/pages/island-one.astro b/packages/astro/e2e/fixtures/view-transitions/src/pages/island-one.astro index 883d567a11..533ac40889 100644 --- a/packages/astro/e2e/fixtures/view-transitions/src/pages/island-one.astro +++ b/packages/astro/e2e/fixtures/view-transitions/src/pages/island-one.astro @@ -1,6 +1,6 @@ --- -import Layout from '../components/Layout.astro'; import Island from '../components/Island.jsx'; +import Layout from '../components/Layout.astro'; export const prerender = false; const persistProps = Astro.url.searchParams.has('persist'); diff --git a/packages/astro/e2e/fixtures/view-transitions/src/pages/island-two.astro b/packages/astro/e2e/fixtures/view-transitions/src/pages/island-two.astro index 37912591cb..c76ee14521 100644 --- a/packages/astro/e2e/fixtures/view-transitions/src/pages/island-two.astro +++ b/packages/astro/e2e/fixtures/view-transitions/src/pages/island-two.astro @@ -1,6 +1,6 @@ --- -import Layout from '../components/Layout.astro'; import Island from '../components/Island.jsx'; +import Layout from '../components/Layout.astro'; ---

Page 2

diff --git a/packages/astro/e2e/fixtures/vue-component/src/pages/index.astro b/packages/astro/e2e/fixtures/vue-component/src/pages/index.astro index fb10e60382..fd2e8f9b54 100644 --- a/packages/astro/e2e/fixtures/vue-component/src/pages/index.astro +++ b/packages/astro/e2e/fixtures/vue-component/src/pages/index.astro @@ -1,8 +1,8 @@ --- import Counter from '../components/Counter.vue'; -import VueComponent from '../components/VueComponent.vue'; -import AsyncTest from '../components/Test.vue' import State from '../components/State.vue' +import AsyncTest from '../components/Test.vue' +import VueComponent from '../components/VueComponent.vue'; const someProps = { count: 0, diff --git a/packages/astro/e2e/nested-recursive.test.js b/packages/astro/e2e/nested-recursive.test.js index 8271c65575..262cd67723 100644 --- a/packages/astro/e2e/nested-recursive.test.js +++ b/packages/astro/e2e/nested-recursive.test.js @@ -1,4 +1,4 @@ -import { expect, test as base } from '@playwright/test'; +import { test as base, expect } from '@playwright/test'; import { loadFixture, waitForHydrate } from './test-utils.js'; const test = base.extend({ diff --git a/packages/astro/performance/fixtures/mdoc/src/ContentRenderer.astro b/packages/astro/performance/fixtures/mdoc/src/ContentRenderer.astro index 3008f61197..fbe086bc27 100644 --- a/packages/astro/performance/fixtures/mdoc/src/ContentRenderer.astro +++ b/packages/astro/performance/fixtures/mdoc/src/ContentRenderer.astro @@ -1,6 +1,6 @@ --- -import { Heading, Aside, LikeButton, HydratedLikeButton } from '@performance/utils'; import type { CollectionEntry } from 'astro:content'; +import { Aside, Heading, HydratedLikeButton, LikeButton } from '@performance/utils'; type Props = { entry: CollectionEntry<'generated'>; diff --git a/packages/astro/performance/fixtures/mdx/src/ContentRenderer.astro b/packages/astro/performance/fixtures/mdx/src/ContentRenderer.astro index 42c2da57a1..6c40fe40e6 100644 --- a/packages/astro/performance/fixtures/mdx/src/ContentRenderer.astro +++ b/packages/astro/performance/fixtures/mdx/src/ContentRenderer.astro @@ -1,6 +1,6 @@ --- -import Title from './Title.astro'; import type { CollectionEntry } from 'astro:content'; +import Title from './Title.astro'; type Props = { entry: CollectionEntry<'generated'>; diff --git a/packages/astro/src/assets/endpoint/generic.ts b/packages/astro/src/assets/endpoint/generic.ts index 3dd5140cf1..589f9f8b75 100644 --- a/packages/astro/src/assets/endpoint/generic.ts +++ b/packages/astro/src/assets/endpoint/generic.ts @@ -1,11 +1,11 @@ +// @ts-expect-error +import { imageConfig } from 'astro:assets'; import { isRemotePath } from '@astrojs/internal-helpers/path'; import mime from 'mime/lite.js'; import type { APIRoute } from '../../@types/astro.js'; import { getConfiguredImageService } from '../internal.js'; import { etag } from '../utils/etag.js'; import { isRemoteAllowed } from '../utils/remotePattern.js'; -// @ts-expect-error -import { imageConfig } from 'astro:assets'; async function loadRemoteImage(src: URL, headers: Headers) { try { diff --git a/packages/astro/src/assets/endpoint/node.ts b/packages/astro/src/assets/endpoint/node.ts index 4d29a7fadd..1d9ac9df64 100644 --- a/packages/astro/src/assets/endpoint/node.ts +++ b/packages/astro/src/assets/endpoint/node.ts @@ -2,6 +2,8 @@ import os from 'node:os'; import { isAbsolute } from 'node:path'; import { fileURLToPath, pathToFileURL } from 'node:url'; +// @ts-expect-error +import { assetsDir, imageConfig, outDir } from 'astro:assets'; import { isRemotePath, removeQueryString } from '@astrojs/internal-helpers/path'; import { readFile } from 'fs/promises'; import mime from 'mime/lite.js'; @@ -9,8 +11,6 @@ import type { APIRoute } from '../../@types/astro.js'; import { getConfiguredImageService } from '../internal.js'; import { etag } from '../utils/etag.js'; import { isRemoteAllowed } from '../utils/remotePattern.js'; -// @ts-expect-error -import { assetsDir, imageConfig, outDir } from 'astro:assets'; function replaceFileSystemReferences(src: string) { return os.platform().includes('win32') ? src.replace(/^\/@fs\//, '') : src.replace(/^\/@fs/, ''); diff --git a/packages/astro/src/core/build/plugin.ts b/packages/astro/src/core/build/plugin.ts index 68474b0576..f16b5a1d94 100644 --- a/packages/astro/src/core/build/plugin.ts +++ b/packages/astro/src/core/build/plugin.ts @@ -1,4 +1,4 @@ -import type { Plugin as VitePlugin, Rollup } from 'vite'; +import type { Rollup, Plugin as VitePlugin } from 'vite'; import type { BuildInternals } from './internal.js'; import type { StaticBuildOptions, ViteBuildReturn } from './types.js'; diff --git a/packages/astro/src/core/build/plugins/plugin-css.ts b/packages/astro/src/core/build/plugins/plugin-css.ts index 31cb2c9b53..e0dce339f7 100644 --- a/packages/astro/src/core/build/plugins/plugin-css.ts +++ b/packages/astro/src/core/build/plugins/plugin-css.ts @@ -1,5 +1,5 @@ import type { GetModuleInfo } from 'rollup'; -import type { BuildOptions, Plugin as VitePlugin, ResolvedConfig, Rollup } from 'vite'; +import type { BuildOptions, ResolvedConfig, Rollup, Plugin as VitePlugin } from 'vite'; import { isBuildableCSSRequest } from '../../../vite-plugin-astro-server/util.js'; import type { BuildInternals } from '../internal.js'; import type { AstroBuildPlugin, BuildTarget } from '../plugin.js'; diff --git a/packages/astro/src/core/build/plugins/util.ts b/packages/astro/src/core/build/plugins/util.ts index 0c9636b307..d1bd266cd4 100644 --- a/packages/astro/src/core/build/plugins/util.ts +++ b/packages/astro/src/core/build/plugins/util.ts @@ -1,5 +1,5 @@ import { extname } from 'node:path'; -import type { BuildOptions, Plugin as VitePlugin, Rollup } from 'vite'; +import type { BuildOptions, Rollup, Plugin as VitePlugin } from 'vite'; // eslint-disable-next-line @typescript-eslint/ban-types type OutputOptionsHook = Extract; diff --git a/packages/astro/src/core/config/schema.ts b/packages/astro/src/core/config/schema.ts index d9b91a9ce2..303846f760 100644 --- a/packages/astro/src/core/config/schema.ts +++ b/packages/astro/src/core/config/schema.ts @@ -1,8 +1,8 @@ import type { + ShikiConfig, RehypePlugin as _RehypePlugin, RemarkPlugin as _RemarkPlugin, RemarkRehype as _RemarkRehype, - ShikiConfig, } from '@astrojs/markdown-remark'; import { markdownConfigDefaults } from '@astrojs/markdown-remark'; import { type BuiltinTheme, bundledThemes } from 'shiki'; diff --git a/packages/astro/src/core/logger/vite.ts b/packages/astro/src/core/logger/vite.ts index 9ddfd92eb3..317a037826 100644 --- a/packages/astro/src/core/logger/vite.ts +++ b/packages/astro/src/core/logger/vite.ts @@ -1,6 +1,6 @@ import { fileURLToPath } from 'url'; import stripAnsi from 'strip-ansi'; -import type { LogLevel, Logger as ViteLogger, Rollup } from 'vite'; +import type { LogLevel, Rollup, Logger as ViteLogger } from 'vite'; import { isAstroError } from '../errors/errors.js'; import { serverShortcuts as formatServerShortcuts } from '../messages.js'; import { type Logger as AstroLogger, isLogLevelEnabled } from './core.js'; diff --git a/packages/astro/src/runtime/client/dev-toolbar/entrypoint.ts b/packages/astro/src/runtime/client/dev-toolbar/entrypoint.ts index 5a9f3536c1..49eac68fdb 100644 --- a/packages/astro/src/runtime/client/dev-toolbar/entrypoint.ts +++ b/packages/astro/src/runtime/client/dev-toolbar/entrypoint.ts @@ -1,8 +1,8 @@ +// @ts-expect-error +import { loadDevToolbarApps } from 'astro:dev-toolbar'; import type { DevToolbarApp as DevToolbarAppDefinition } from '../../../@types/astro.js'; import { settings } from './settings.js'; import type { AstroDevToolbar, DevToolbarApp } from './toolbar.js'; -// @ts-expect-error -import { loadDevToolbarApps } from 'astro:dev-toolbar'; let overlay: AstroDevToolbar; diff --git a/packages/astro/src/vite-plugin-astro/index.ts b/packages/astro/src/vite-plugin-astro/index.ts index bc9dbd5aa4..2f4e256b76 100644 --- a/packages/astro/src/vite-plugin-astro/index.ts +++ b/packages/astro/src/vite-plugin-astro/index.ts @@ -3,9 +3,9 @@ import type * as vite from 'vite'; import type { AstroConfig, AstroSettings } from '../@types/astro.js'; import type { Logger } from '../core/logger/core.js'; import type { - CompileMetadata, PluginCssMetadata as AstroPluginCssMetadata, PluginMetadata as AstroPluginMetadata, + CompileMetadata, } from './types.js'; import { normalizePath } from 'vite'; diff --git a/packages/astro/src/vite-plugin-config-alias/index.ts b/packages/astro/src/vite-plugin-config-alias/index.ts index 7a7949e516..a5f4ae53cf 100644 --- a/packages/astro/src/vite-plugin-config-alias/index.ts +++ b/packages/astro/src/vite-plugin-config-alias/index.ts @@ -1,6 +1,6 @@ import path from 'node:path'; import type { CompilerOptions } from 'typescript'; -import { type Plugin as VitePlugin, type ResolvedConfig, normalizePath } from 'vite'; +import { type ResolvedConfig, type Plugin as VitePlugin, normalizePath } from 'vite'; import type { AstroSettings } from '../@types/astro.js'; type Alias = { diff --git a/packages/astro/test/fixtures/0-css/src/pages/index.astro b/packages/astro/test/fixtures/0-css/src/pages/index.astro index c11fe1166e..c21f980253 100644 --- a/packages/astro/test/fixtures/0-css/src/pages/index.astro +++ b/packages/astro/test/fixtures/0-css/src/pages/index.astro @@ -5,13 +5,16 @@ import AstroComponent from '../components/Astro.astro'; import AstroComponentNone from '../components/AstroNone.astro'; import AstroSass from '../components/AstroSass.astro'; import AstroScss from '../components/AstroScss.astro'; +import ModuleOrdering from '../components/ModuleOrdering.jsx'; import ReactCSS from '../components/ReactCSS.jsx'; +import ReactDynamic from '../components/ReactDynamic.jsx'; import ReactModules from '../components/ReactModules.jsx'; import ReactModulesSass from '../components/ReactModulesSass.jsx'; import ReactModulesScss from '../components/ReactModulesScss.jsx'; import ReactSass from '../components/ReactSass.jsx'; import ReactScss from '../components/ReactScss.jsx'; import SvelteCSS from '../components/SvelteCSS.svelte'; +import SvelteDynamic from '../components/SvelteDynamic.svelte'; import SvelteSass from '../components/SvelteSass.svelte'; import SvelteScss from '../components/SvelteScss.svelte'; import VueCSS from '../components/VueCSS.vue'; @@ -19,9 +22,6 @@ import VueModules from '../components/VueModules.vue'; import VueSass from '../components/VueSass.vue'; import VueScoped from '../components/VueScoped.vue'; import VueScss from '../components/VueScss.vue'; -import ReactDynamic from '../components/ReactDynamic.jsx'; -import SvelteDynamic from '../components/SvelteDynamic.svelte'; -import ModuleOrdering from '../components/ModuleOrdering.jsx'; import '../styles/imported-url.css'; import '../styles/imported.sass'; diff --git a/packages/astro/test/fixtures/alias-tsconfig-baseurl-only/src/pages/index.astro b/packages/astro/test/fixtures/alias-tsconfig-baseurl-only/src/pages/index.astro index e200a95677..a654eeb12e 100644 --- a/packages/astro/test/fixtures/alias-tsconfig-baseurl-only/src/pages/index.astro +++ b/packages/astro/test/fixtures/alias-tsconfig-baseurl-only/src/pages/index.astro @@ -1,10 +1,10 @@ --- +import Alias from 'components/Alias.svelte'; import Client from 'components/Client.svelte' import Foo from 'components/Foo.astro'; import StyleComp from 'components/Style.astro'; -import Alias from 'components/Alias.svelte'; -import { foo, index } from 'utils/constants'; import 'styles/main.css'; +import { foo, index } from 'utils/constants'; --- diff --git a/packages/astro/test/fixtures/alias-tsconfig/src/pages/index.astro b/packages/astro/test/fixtures/alias-tsconfig/src/pages/index.astro index 25faad0ea7..e880d48440 100644 --- a/packages/astro/test/fixtures/alias-tsconfig/src/pages/index.astro +++ b/packages/astro/test/fixtures/alias-tsconfig/src/pages/index.astro @@ -1,11 +1,11 @@ --- +import Alias from '@components/Alias.svelte'; import Client from '@components/Client.svelte' +import '@styles/main.css'; +import { namespace } from '@test/namespace-package' import Foo from 'src/components/Foo.astro'; import StyleComp from 'src/components/Style.astro'; -import Alias from '@components/Alias.svelte'; -import { namespace } from '@test/namespace-package' import { foo, index } from 'src/utils/constants'; -import '@styles/main.css'; const globResult = Object.keys(import.meta.glob('@components/glob/*.js')).join(', ') --- diff --git a/packages/astro/test/fixtures/astro-check-errors/src/pages/index.astro b/packages/astro/test/fixtures/astro-check-errors/src/pages/index.astro index c161df438c..4521e6f25b 100644 --- a/packages/astro/test/fixtures/astro-check-errors/src/pages/index.astro +++ b/packages/astro/test/fixtures/astro-check-errors/src/pages/index.astro @@ -1,5 +1,5 @@ --- - console.log(doesntExist) +console.log(doesntExist) --- diff --git a/packages/astro/test/fixtures/astro-children/src/pages/markup.astro b/packages/astro/test/fixtures/astro-children/src/pages/markup.astro index b771c24335..2cc198bb0d 100644 --- a/packages/astro/test/fixtures/astro-children/src/pages/markup.astro +++ b/packages/astro/test/fixtures/astro-children/src/pages/markup.astro @@ -1,7 +1,7 @@ --- import PreactComponent from '../components/Component.jsx'; -import VueComponent from '../components/Component.vue'; import SvelteComponent from '../components/Component.svelte'; +import VueComponent from '../components/Component.vue'; --- Children diff --git a/packages/astro/test/fixtures/astro-children/src/pages/multiple.astro b/packages/astro/test/fixtures/astro-children/src/pages/multiple.astro index 8c2f73a91e..41061c0b99 100644 --- a/packages/astro/test/fixtures/astro-children/src/pages/multiple.astro +++ b/packages/astro/test/fixtures/astro-children/src/pages/multiple.astro @@ -1,7 +1,7 @@ --- import PreactComponent from '../components/Component.jsx'; -import VueComponent from '../components/Component.vue'; import SvelteComponent from '../components/Component.svelte'; +import VueComponent from '../components/Component.vue'; --- Children diff --git a/packages/astro/test/fixtures/astro-children/src/pages/strings.astro b/packages/astro/test/fixtures/astro-children/src/pages/strings.astro index 10b1a887fc..f67f29c64b 100644 --- a/packages/astro/test/fixtures/astro-children/src/pages/strings.astro +++ b/packages/astro/test/fixtures/astro-children/src/pages/strings.astro @@ -1,7 +1,7 @@ --- import PreactComponent from '../components/Component.jsx'; -import VueComponent from '../components/Component.vue'; import SvelteComponent from '../components/Component.svelte'; +import VueComponent from '../components/Component.vue'; --- Children diff --git a/packages/astro/test/fixtures/astro-client-only/src/pages/index.astro b/packages/astro/test/fixtures/astro-client-only/src/pages/index.astro index bf239197f1..7a7d59b79f 100644 --- a/packages/astro/test/fixtures/astro-client-only/src/pages/index.astro +++ b/packages/astro/test/fixtures/astro-client-only/src/pages/index.astro @@ -1,6 +1,6 @@ --- -import PersistentCounter from '../components/PersistentCounter.svelte'; import ReactComponent from '../components/JSXComponent.jsx'; +import PersistentCounter from '../components/PersistentCounter.svelte'; --- Client only pages diff --git a/packages/astro/test/fixtures/astro-jsx/src/pages/index.astro b/packages/astro/test/fixtures/astro-jsx/src/pages/index.astro index ccfb2b5a06..b4d0785670 100644 --- a/packages/astro/test/fixtures/astro-jsx/src/pages/index.astro +++ b/packages/astro/test/fixtures/astro-jsx/src/pages/index.astro @@ -1,6 +1,6 @@ --- -import ReactCounter from '../components/ReactCounter.jsx'; import PreactCounter from '../components/PreactCounter.tsx'; +import ReactCounter from '../components/ReactCounter.jsx'; import SolidCounter from '../components/SolidCounter.jsx'; --- diff --git a/packages/astro/test/fixtures/astro-partial-html/src/pages/head.astro b/packages/astro/test/fixtures/astro-partial-html/src/pages/head.astro index 635b09699a..608394142a 100644 --- a/packages/astro/test/fixtures/astro-partial-html/src/pages/head.astro +++ b/packages/astro/test/fixtures/astro-partial-html/src/pages/head.astro @@ -1,6 +1,6 @@ --- -import Head from '../components/Head.astro'; import Component from '../components/Component.jsx'; +import Head from '../components/Head.astro'; --- diff --git a/packages/astro/test/fixtures/astro-partial-html/src/pages/jsx.astro b/packages/astro/test/fixtures/astro-partial-html/src/pages/jsx.astro index b5a34f4ced..09c0e8eb52 100644 --- a/packages/astro/test/fixtures/astro-partial-html/src/pages/jsx.astro +++ b/packages/astro/test/fixtures/astro-partial-html/src/pages/jsx.astro @@ -1,6 +1,6 @@ --- -import Layout from '../components/Layout.astro'; import Component from '../components/Component.jsx'; +import Layout from '../components/Layout.astro'; // note: this test requires to be the very first element --- diff --git a/packages/astro/test/fixtures/astro-slots-nested/src/pages/hidden-nested.astro b/packages/astro/test/fixtures/astro-slots-nested/src/pages/hidden-nested.astro index dcb3ebcba5..d3f0417562 100644 --- a/packages/astro/test/fixtures/astro-slots-nested/src/pages/hidden-nested.astro +++ b/packages/astro/test/fixtures/astro-slots-nested/src/pages/hidden-nested.astro @@ -1,6 +1,6 @@ --- -import Parent from '../components/react/Parent' import Inner from '../components/react/Inner' +import Parent from '../components/react/Parent' --- diff --git a/packages/astro/test/fixtures/astro-slots-nested/src/pages/server-component-nested.astro b/packages/astro/test/fixtures/astro-slots-nested/src/pages/server-component-nested.astro index ec4ae3158b..8c256864fd 100644 --- a/packages/astro/test/fixtures/astro-slots-nested/src/pages/server-component-nested.astro +++ b/packages/astro/test/fixtures/astro-slots-nested/src/pages/server-component-nested.astro @@ -1,9 +1,9 @@ --- -import PassesChildren from '../components/react/PassesChildren.jsx'; -import PassesChildrenP from '../components/preact/PassesChildrenP.jsx'; -import PassesChildrenS from '../components/solid/PassesChildrenS.jsx'; import PassesChildrenSv from '../components/PassesChildrenSv.svelte'; import PassesChildrenV from '../components/PassesChildrenV.vue'; +import PassesChildrenP from '../components/preact/PassesChildrenP.jsx'; +import PassesChildren from '../components/react/PassesChildren.jsx'; +import PassesChildrenS from '../components/solid/PassesChildrenS.jsx'; --- diff --git a/packages/astro/test/fixtures/astro-slots/src/pages/slottedapi-render.astro b/packages/astro/test/fixtures/astro-slots/src/pages/slottedapi-render.astro index 8cd31fdd3b..f383d9e89a 100644 --- a/packages/astro/test/fixtures/astro-slots/src/pages/slottedapi-render.astro +++ b/packages/astro/test/fixtures/astro-slots/src/pages/slottedapi-render.astro @@ -1,7 +1,7 @@ --- import Render from '../components/Render.astro'; -import RenderFn from '../components/RenderFn.astro'; import RenderArgs from '../components/RenderArgs.astro'; +import RenderFn from '../components/RenderFn.astro'; --- diff --git a/packages/astro/test/fixtures/content-collection-references/src/pages/welcome.astro b/packages/astro/test/fixtures/content-collection-references/src/pages/welcome.astro index 3645d37bb5..e372f5a64a 100644 --- a/packages/astro/test/fixtures/content-collection-references/src/pages/welcome.astro +++ b/packages/astro/test/fixtures/content-collection-references/src/pages/welcome.astro @@ -1,6 +1,6 @@ --- import { Image } from 'astro:assets'; -import { getEntry, getEntries } from 'astro:content'; +import { getEntries, getEntry } from 'astro:content'; const welcomePost = await getEntry('blog', 'welcome'); diff --git a/packages/astro/test/fixtures/content-collections/src/pages/collections.json.js b/packages/astro/test/fixtures/content-collections/src/pages/collections.json.js index 638bbea4dc..b7b7d84725 100644 --- a/packages/astro/test/fixtures/content-collections/src/pages/collections.json.js +++ b/packages/astro/test/fixtures/content-collections/src/pages/collections.json.js @@ -1,6 +1,6 @@ +import { getCollection } from 'astro:content'; import * as devalue from 'devalue'; import { stripAllRenderFn } from '../utils.js'; -import { getCollection } from 'astro:content'; export async function GET() { const withoutConfig = stripAllRenderFn(await getCollection('without-config')); diff --git a/packages/astro/test/fixtures/content-collections/src/pages/entries.json.js b/packages/astro/test/fixtures/content-collections/src/pages/entries.json.js index e0f123076c..a05a9138b1 100644 --- a/packages/astro/test/fixtures/content-collections/src/pages/entries.json.js +++ b/packages/astro/test/fixtures/content-collections/src/pages/entries.json.js @@ -1,6 +1,6 @@ +import { getEntryBySlug } from 'astro:content'; import * as devalue from 'devalue'; import { stripRenderFn } from '../utils.js'; -import { getEntryBySlug } from 'astro:content'; export async function GET() { const columbiaWithoutConfig = stripRenderFn(await getEntryBySlug('without-config', 'columbia')); diff --git a/packages/astro/test/fixtures/core-image-deletion/src/pages/blog/[slug].astro b/packages/astro/test/fixtures/core-image-deletion/src/pages/blog/[slug].astro index 418d449bb6..63b6eb70e5 100644 --- a/packages/astro/test/fixtures/core-image-deletion/src/pages/blog/[slug].astro +++ b/packages/astro/test/fixtures/core-image-deletion/src/pages/blog/[slug].astro @@ -1,6 +1,6 @@ --- -import type { GetStaticPaths } from "astro"; import { getCollection } from "astro:content"; +import type { GetStaticPaths } from "astro"; export const getStaticPaths = (async () => { const blog = await getCollection("blog"); diff --git a/packages/astro/test/fixtures/core-image/src/pages/blog/[...slug].astro b/packages/astro/test/fixtures/core-image/src/pages/blog/[...slug].astro index 33f96a70da..dcf329ec42 100644 --- a/packages/astro/test/fixtures/core-image/src/pages/blog/[...slug].astro +++ b/packages/astro/test/fixtures/core-image/src/pages/blog/[...slug].astro @@ -1,5 +1,5 @@ --- -import { getImage,Image } from 'astro:assets'; +import { Image, getImage} from 'astro:assets'; import { getCollection } from 'astro:content'; export async function getStaticPaths() { diff --git a/packages/astro/test/fixtures/css-import-as-inline/src/pages/index.astro b/packages/astro/test/fixtures/css-import-as-inline/src/pages/index.astro index 89a7288ae1..90838f002b 100644 --- a/packages/astro/test/fixtures/css-import-as-inline/src/pages/index.astro +++ b/packages/astro/test/fixtures/css-import-as-inline/src/pages/index.astro @@ -1,6 +1,6 @@ --- -import Layout from '../layouts/Layout.astro'; import inline from '../inline.css?inline'; +import Layout from '../layouts/Layout.astro'; import raw from '../raw.css?raw'; --- diff --git a/packages/astro/test/fixtures/css-inline-stylesheets/src/pages/index.astro b/packages/astro/test/fixtures/css-inline-stylesheets/src/pages/index.astro index bfdbeb5f8e..2aecfb0f2e 100644 --- a/packages/astro/test/fixtures/css-inline-stylesheets/src/pages/index.astro +++ b/packages/astro/test/fixtures/css-inline-stylesheets/src/pages/index.astro @@ -1,6 +1,6 @@ --- -import Button from '../components/Button.astro'; import { getEntryBySlug } from 'astro:content'; +import Button from '../components/Button.astro'; const entry = await getEntryBySlug('en', 'endeavour'); const { Content } = await entry.render(); diff --git a/packages/astro/test/fixtures/css-order-import/src/pages/component.astro b/packages/astro/test/fixtures/css-order-import/src/pages/component.astro index 1b779d18db..3d5f263399 100644 --- a/packages/astro/test/fixtures/css-order-import/src/pages/component.astro +++ b/packages/astro/test/fixtures/css-order-import/src/pages/component.astro @@ -1,7 +1,7 @@ --- +import Client2 from '../components/Client2.jsx'; import One from '../components/One.astro'; import Two from '../components/Two.astro'; -import Client2 from '../components/Client2.jsx'; --- diff --git a/packages/astro/test/fixtures/css-order-import/src/pages/dedupe.astro b/packages/astro/test/fixtures/css-order-import/src/pages/dedupe.astro index ea3a016706..bbd26ad6b2 100644 --- a/packages/astro/test/fixtures/css-order-import/src/pages/dedupe.astro +++ b/packages/astro/test/fixtures/css-order-import/src/pages/dedupe.astro @@ -1,6 +1,6 @@ --- -import '../styles/AstroJsx.css'; import Dedupe from '../components/Dedupe.jsx'; +import '../styles/AstroJsx.css'; --- diff --git a/packages/astro/test/fixtures/css-order-import/src/pages/index.astro b/packages/astro/test/fixtures/css-order-import/src/pages/index.astro index 0a6baab594..6cc9ac708e 100644 --- a/packages/astro/test/fixtures/css-order-import/src/pages/index.astro +++ b/packages/astro/test/fixtures/css-order-import/src/pages/index.astro @@ -1,6 +1,6 @@ --- -import '../styles/base.css'; import Client1 from '../components/Client1.jsx'; +import '../styles/base.css'; --- diff --git a/packages/astro/test/fixtures/css-order-layout/src/layouts/Main.astro b/packages/astro/test/fixtures/css-order-layout/src/layouts/Main.astro index 49f378bc64..225b8c1030 100644 --- a/packages/astro/test/fixtures/css-order-layout/src/layouts/Main.astro +++ b/packages/astro/test/fixtures/css-order-layout/src/layouts/Main.astro @@ -1,6 +1,6 @@ --- -import MainHead from "../components/MainHead.astro"; import BlueButton from "../components/BlueButton.astro"; +import MainHead from "../components/MainHead.astro"; --- diff --git a/packages/astro/test/fixtures/css-order-layout/src/layouts/Second.astro b/packages/astro/test/fixtures/css-order-layout/src/layouts/Second.astro index 49f378bc64..225b8c1030 100644 --- a/packages/astro/test/fixtures/css-order-layout/src/layouts/Second.astro +++ b/packages/astro/test/fixtures/css-order-layout/src/layouts/Second.astro @@ -1,6 +1,6 @@ --- -import MainHead from "../components/MainHead.astro"; import BlueButton from "../components/BlueButton.astro"; +import MainHead from "../components/MainHead.astro"; --- diff --git a/packages/astro/test/fixtures/fetch/src/pages/index.astro b/packages/astro/test/fixtures/fetch/src/pages/index.astro index 06a5bd2b3a..944873d0c5 100644 --- a/packages/astro/test/fixtures/fetch/src/pages/index.astro +++ b/packages/astro/test/fixtures/fetch/src/pages/index.astro @@ -1,6 +1,6 @@ --- -import Test from '../components/AstroComponent.astro'; import AlreadyImported from '../components/AlreadyImported.astro'; +import Test from '../components/AstroComponent.astro'; import CustomDeclaration from '../components/CustomDeclaration.astro'; import JsxComponent from '../components/JsxComponent.jsx'; import SvelteComponent from '../components/SvelteComponent.svelte'; diff --git a/packages/astro/test/fixtures/fontsource-package/src/pages/index.astro b/packages/astro/test/fixtures/fontsource-package/src/pages/index.astro index 454d7dfbaf..c6aba4c401 100644 --- a/packages/astro/test/fixtures/fontsource-package/src/pages/index.astro +++ b/packages/astro/test/fixtures/fontsource-package/src/pages/index.astro @@ -1,6 +1,6 @@ --- -import "@fontsource/montserrat"; import "@fontsource/monofett"; +import "@fontsource/montserrat"; --- diff --git a/packages/astro/test/fixtures/head-injection/src/pages/with-slot-in-slot.astro b/packages/astro/test/fixtures/head-injection/src/pages/with-slot-in-slot.astro index 85b228c436..1bd33e5778 100644 --- a/packages/astro/test/fixtures/head-injection/src/pages/with-slot-in-slot.astro +++ b/packages/astro/test/fixtures/head-injection/src/pages/with-slot-in-slot.astro @@ -1,6 +1,6 @@ --- -import Layout from "../components/SlotRenderLayout.astro"; import RegularSlot from "../components/RegularSlot.astro" +import Layout from "../components/SlotRenderLayout.astro"; --- diff --git a/packages/astro/test/fixtures/head-injection/src/pages/with-slot-render.astro b/packages/astro/test/fixtures/head-injection/src/pages/with-slot-render.astro index 337b4a95cf..b9cbfae961 100644 --- a/packages/astro/test/fixtures/head-injection/src/pages/with-slot-render.astro +++ b/packages/astro/test/fixtures/head-injection/src/pages/with-slot-render.astro @@ -1,6 +1,6 @@ --- -import Layout from "../components/SlotRenderLayout.astro"; import Component from "../components/SlotRenderComponent.astro" +import Layout from "../components/SlotRenderLayout.astro"; --- diff --git a/packages/astro/test/fixtures/html-slots/src/pages/index.astro b/packages/astro/test/fixtures/html-slots/src/pages/index.astro index aa4a3bd258..6ccfffe417 100644 --- a/packages/astro/test/fixtures/html-slots/src/pages/index.astro +++ b/packages/astro/test/fixtures/html-slots/src/pages/index.astro @@ -1,7 +1,7 @@ --- import Default from '../components/Default.html'; -import Named from '../components/Named.html'; import Inline from '../components/Inline.html'; +import Named from '../components/Named.html'; --- Default diff --git a/packages/astro/test/fixtures/hydration-race/src/components/Wrapper.astro b/packages/astro/test/fixtures/hydration-race/src/components/Wrapper.astro index c751b2f77f..d3e1e31e8f 100644 --- a/packages/astro/test/fixtures/hydration-race/src/components/Wrapper.astro +++ b/packages/astro/test/fixtures/hydration-race/src/components/Wrapper.astro @@ -1,6 +1,6 @@ --- -import One from './One.jsx'; import Deeper from './Deeper.astro'; +import One from './One.jsx'; ---
diff --git a/packages/astro/test/fixtures/hydration-race/src/pages/index.astro b/packages/astro/test/fixtures/hydration-race/src/pages/index.astro index d5272cc756..6b196b36d0 100644 --- a/packages/astro/test/fixtures/hydration-race/src/pages/index.astro +++ b/packages/astro/test/fixtures/hydration-race/src/pages/index.astro @@ -1,6 +1,6 @@ --- -import Wrapper from '../components/Wrapper.astro'; import One from '../components/One.jsx'; +import Wrapper from '../components/Wrapper.astro'; --- diff --git a/packages/astro/test/fixtures/i18n-routing-subdomain/src/pages/index.astro b/packages/astro/test/fixtures/i18n-routing-subdomain/src/pages/index.astro index d138455a3e..c6186a7b76 100644 --- a/packages/astro/test/fixtures/i18n-routing-subdomain/src/pages/index.astro +++ b/packages/astro/test/fixtures/i18n-routing-subdomain/src/pages/index.astro @@ -1,5 +1,5 @@ --- -import { getRelativeLocaleUrl, getAbsoluteLocaleUrl, getPathByLocale, getLocaleByPath } from "astro:i18n"; +import { getAbsoluteLocaleUrl, getLocaleByPath, getPathByLocale, getRelativeLocaleUrl } from "astro:i18n"; let absoluteLocaleUrl_pt = getAbsoluteLocaleUrl("pt", "about"); let absoluteLocaleUrl_it = getAbsoluteLocaleUrl("it"); diff --git a/packages/astro/test/fixtures/i18n-routing/src/pages/virtual-module.astro b/packages/astro/test/fixtures/i18n-routing/src/pages/virtual-module.astro index f65356e8fa..4ec7e5ae57 100644 --- a/packages/astro/test/fixtures/i18n-routing/src/pages/virtual-module.astro +++ b/packages/astro/test/fixtures/i18n-routing/src/pages/virtual-module.astro @@ -1,5 +1,5 @@ --- -import { getRelativeLocaleUrl, getAbsoluteLocaleUrl, getPathByLocale, getLocaleByPath } from "astro:i18n"; +import { getAbsoluteLocaleUrl, getLocaleByPath, getPathByLocale, getRelativeLocaleUrl } from "astro:i18n"; let about = getRelativeLocaleUrl("pt", "about"); let spanish = getRelativeLocaleUrl("es", "about"); diff --git a/packages/astro/test/fixtures/jsx/src/pages/frameworks.astro b/packages/astro/test/fixtures/jsx/src/pages/frameworks.astro index cfd28a3d4b..91c1b5ebab 100644 --- a/packages/astro/test/fixtures/jsx/src/pages/frameworks.astro +++ b/packages/astro/test/fixtures/jsx/src/pages/frameworks.astro @@ -1,10 +1,10 @@ --- -import FrameworkSolid from '../components/solid/SolidCounter.jsx' -import FrameworkPreact from '../components/preact/PreactCounter.jsx' -import FrameworkReact from '../components/react/ReactCounter.jsx' +import FrameworkMDX from '../components/Content.mdx' import FrameworkSvelte from '../components/SvelteCounter.svelte' import FrameworkVue from '../components/VueCounter.vue' -import FrameworkMDX from '../components/Content.mdx' +import FrameworkPreact from '../components/preact/PreactCounter.jsx' +import FrameworkReact from '../components/react/ReactCounter.jsx' +import FrameworkSolid from '../components/solid/SolidCounter.jsx' ---
diff --git a/packages/astro/test/fixtures/multiple-renderers/src/pages/index.astro b/packages/astro/test/fixtures/multiple-renderers/src/pages/index.astro index 1708d1cc9c..c5f4756c35 100644 --- a/packages/astro/test/fixtures/multiple-renderers/src/pages/index.astro +++ b/packages/astro/test/fixtures/multiple-renderers/src/pages/index.astro @@ -1,5 +1,5 @@ --- - function Component() { +function Component() { return `
works
`; } --- diff --git a/packages/astro/test/fixtures/preact-component/src/pages/fn.astro b/packages/astro/test/fixtures/preact-component/src/pages/fn.astro index ced75e3019..6d8f6f7ed7 100644 --- a/packages/astro/test/fixtures/preact-component/src/pages/fn.astro +++ b/packages/astro/test/fixtures/preact-component/src/pages/fn.astro @@ -1,6 +1,6 @@ --- -import FunctionComponent from '../components/Function.jsx'; import ArrowFunctionComponent from '../components/ArrowFunction.jsx'; +import FunctionComponent from '../components/Function.jsx'; --- diff --git a/packages/astro/test/fixtures/preact-component/src/pages/signals.astro b/packages/astro/test/fixtures/preact-component/src/pages/signals.astro index bfe4a10205..b68fde36d6 100644 --- a/packages/astro/test/fixtures/preact-component/src/pages/signals.astro +++ b/packages/astro/test/fixtures/preact-component/src/pages/signals.astro @@ -1,6 +1,6 @@ --- -import Signals from '../components/Signals'; import { signal } from '@preact/signals'; +import Signals from '../components/Signals'; const count = signal(1); --- diff --git a/packages/astro/test/fixtures/react-jsx-export/src/pages/index.astro b/packages/astro/test/fixtures/react-jsx-export/src/pages/index.astro index 945f965f56..0d774e80bb 100644 --- a/packages/astro/test/fixtures/react-jsx-export/src/pages/index.astro +++ b/packages/astro/test/fixtures/react-jsx-export/src/pages/index.astro @@ -1,6 +1,6 @@ --- +import {ConstDeclarationExport, FunctionDeclarationExport,LetDeclarationExport } from '../components/DeclarationExportTest' import ListAsDefaultExport, {ListExport, RenamedListExport, ListExportTestComponent} from '../components/ListExportTest' -import {ConstDeclarationExport, LetDeclarationExport, FunctionDeclarationExport} from '../components/DeclarationExportTest' import AnonymousArrowDefaultExport from '../components/defaultExport/AnonymousArrowDefaultExport' import AnonymousFunctionDefaultExport from '../components/defaultExport/AnonymousFunctionDefaultExport' import HocDefaultExport from '../components/defaultExport/HocDefaultExport' diff --git a/packages/astro/test/fixtures/routing-priority/src/pages/[lang]/[...catchall].astro b/packages/astro/test/fixtures/routing-priority/src/pages/[lang]/[...catchall].astro index 622638e700..f212b6e53e 100644 --- a/packages/astro/test/fixtures/routing-priority/src/pages/[lang]/[...catchall].astro +++ b/packages/astro/test/fixtures/routing-priority/src/pages/[lang]/[...catchall].astro @@ -1,5 +1,5 @@ --- - export async function getStaticPaths() { +export async function getStaticPaths() { return [ { params: { lang: 'de', catchall: '1/2' } }, { params: { lang: 'en', catchall: '1/2' } } diff --git a/packages/astro/test/fixtures/routing-priority/src/pages/[lang]/index.astro b/packages/astro/test/fixtures/routing-priority/src/pages/[lang]/index.astro index a0bf178818..4af288f0bf 100644 --- a/packages/astro/test/fixtures/routing-priority/src/pages/[lang]/index.astro +++ b/packages/astro/test/fixtures/routing-priority/src/pages/[lang]/index.astro @@ -1,5 +1,5 @@ --- - export async function getStaticPaths() { +export async function getStaticPaths() { return [ { params: { lang: 'de' } }, // always shadowed by /de/index.astro { params: { lang: 'en' } } diff --git a/packages/astro/test/fixtures/routing-priority/src/pages/[page].astro b/packages/astro/test/fixtures/routing-priority/src/pages/[page].astro index 7543bce3a4..74f5d463f2 100644 --- a/packages/astro/test/fixtures/routing-priority/src/pages/[page].astro +++ b/packages/astro/test/fixtures/routing-priority/src/pages/[page].astro @@ -1,5 +1,5 @@ --- - export async function getStaticPaths() { +export async function getStaticPaths() { return [ { params: { page: "page-1" } diff --git a/packages/astro/test/fixtures/routing-priority/src/pages/[slug].astro b/packages/astro/test/fixtures/routing-priority/src/pages/[slug].astro index 4099428441..55e8161bb4 100644 --- a/packages/astro/test/fixtures/routing-priority/src/pages/[slug].astro +++ b/packages/astro/test/fixtures/routing-priority/src/pages/[slug].astro @@ -1,5 +1,5 @@ --- - export async function getStaticPaths() { +export async function getStaticPaths() { return [ { params: { slug: "slug-1" }, diff --git a/packages/astro/test/fixtures/routing-priority/src/pages/posts/[...slug].astro b/packages/astro/test/fixtures/routing-priority/src/pages/posts/[...slug].astro index 839a46f9bd..a3a57b006a 100644 --- a/packages/astro/test/fixtures/routing-priority/src/pages/posts/[...slug].astro +++ b/packages/astro/test/fixtures/routing-priority/src/pages/posts/[...slug].astro @@ -1,5 +1,5 @@ --- - export async function getStaticPaths() { +export async function getStaticPaths() { return [ { params: { slug: "1/2" }, diff --git a/packages/astro/test/fixtures/routing-priority/src/pages/posts/[pid].astro b/packages/astro/test/fixtures/routing-priority/src/pages/posts/[pid].astro index 47b332a321..a9245b5ba1 100644 --- a/packages/astro/test/fixtures/routing-priority/src/pages/posts/[pid].astro +++ b/packages/astro/test/fixtures/routing-priority/src/pages/posts/[pid].astro @@ -1,5 +1,5 @@ --- - export async function getStaticPaths() { +export async function getStaticPaths() { return [ { params: { pid: 'post-1' } }, { params: { pid: 'post-2' } } diff --git a/packages/astro/test/fixtures/solid-component/src/pages/index.astro b/packages/astro/test/fixtures/solid-component/src/pages/index.astro index 06a35b2879..e4931ded1e 100644 --- a/packages/astro/test/fixtures/solid-component/src/pages/index.astro +++ b/packages/astro/test/fixtures/solid-component/src/pages/index.astro @@ -1,9 +1,9 @@ --- -import Hello from '../components/Hello.jsx'; -import WithNewlines from '../components/WithNewlines.jsx'; import { Router } from "@solidjs/router"; -import ProxyComponent from '../components/ProxyComponent.jsx'; import { Counter as DepCounter } from '@test/solid-jsx-component'; +import Hello from '../components/Hello.jsx'; +import ProxyComponent from '../components/ProxyComponent.jsx'; +import WithNewlines from '../components/WithNewlines.jsx'; --- Solid diff --git a/packages/astro/test/fixtures/solid-component/src/pages/ssr-client-none.astro b/packages/astro/test/fixtures/solid-component/src/pages/ssr-client-none.astro index 60f0b429b5..bf968b5aca 100644 --- a/packages/astro/test/fixtures/solid-component/src/pages/ssr-client-none.astro +++ b/packages/astro/test/fixtures/solid-component/src/pages/ssr-client-none.astro @@ -1,6 +1,6 @@ --- -import { AsyncComponent } from '../components/async-components.jsx'; import { LazyCounter } from '../components/LazyCounter.jsx'; +import { AsyncComponent } from '../components/async-components.jsx'; --- diff --git a/packages/astro/test/fixtures/special-chars-in-component-imports/src/pages/index.astro b/packages/astro/test/fixtures/special-chars-in-component-imports/src/pages/index.astro index 9f44b97c5f..62d5e4afdf 100644 --- a/packages/astro/test/fixtures/special-chars-in-component-imports/src/pages/index.astro +++ b/packages/astro/test/fixtures/special-chars-in-component-imports/src/pages/index.astro @@ -1,11 +1,11 @@ --- import CaretCounter from '../components/^--with-carets/Counter'; import RocketCounter from '../components/and-rockets-🚀/Counter'; +import RoundBracketCounter from '../components/with-(round-brackets)/Counter'; +import SquareBracketCounter from '../components/with-[square-brackets]/Counter'; // Not supported in Vite // import PercentCounter from '../components/now-100%-better/Counter'; import SpaceCounter from '../components/with some spaces/Counter'; -import RoundBracketCounter from '../components/with-(round-brackets)/Counter'; -import SquareBracketCounter from '../components/with-[square-brackets]/Counter'; --- diff --git a/packages/astro/test/fixtures/static-build/src/pages/hoisted.astro b/packages/astro/test/fixtures/static-build/src/pages/hoisted.astro index 9677a6c52b..6d66d98967 100644 --- a/packages/astro/test/fixtures/static-build/src/pages/hoisted.astro +++ b/packages/astro/test/fixtures/static-build/src/pages/hoisted.astro @@ -1,6 +1,6 @@ --- -import InlineHoisted from '../components/InlineHoisted.astro'; import ExternalHoisted from '../components/ExternalHoisted.astro'; +import InlineHoisted from '../components/InlineHoisted.astro'; --- diff --git a/packages/astro/test/fixtures/static-build/src/pages/index.astro b/packages/astro/test/fixtures/static-build/src/pages/index.astro index 5bd2410ac4..054b82a01f 100644 --- a/packages/astro/test/fixtures/static-build/src/pages/index.astro +++ b/packages/astro/test/fixtures/static-build/src/pages/index.astro @@ -1,7 +1,7 @@ --- +import { test as ssrConfigTest } from '@test/static-build-pkg'; import MainHead from '../components/MainHead.astro'; import Nav from '../components/Nav/index.jsx'; -import { test as ssrConfigTest } from '@test/static-build-pkg'; let allPosts = await Astro.glob('./posts/*.md'); // Note that this just tests a warning diff --git a/packages/astro/test/fixtures/streaming/src/pages/index.astro b/packages/astro/test/fixtures/streaming/src/pages/index.astro index ef0e8eb49b..dd680eba76 100644 --- a/packages/astro/test/fixtures/streaming/src/pages/index.astro +++ b/packages/astro/test/fixtures/streaming/src/pages/index.astro @@ -1,6 +1,6 @@ --- -import Header from '../components/Header.astro'; import AsyncEach from '../components/AsyncEach.astro'; +import Header from '../components/Header.astro'; import { wait } from '../wait'; async function * list() { diff --git a/packages/create-astro/src/messages.ts b/packages/create-astro/src/messages.ts index 0109835c6a..eeeba5a504 100644 --- a/packages/create-astro/src/messages.ts +++ b/packages/create-astro/src/messages.ts @@ -1,6 +1,6 @@ import { exec } from 'node:child_process'; /* eslint no-console: 'off' */ -import { color, label, say as houston, spinner as load } from '@astrojs/cli-kit'; +import { color, say as houston, label, spinner as load } from '@astrojs/cli-kit'; import { align, sleep } from '@astrojs/cli-kit/utils'; import stripAnsi from 'strip-ansi'; import { shell } from './shell.js'; diff --git a/packages/db/test/fixtures/basics/db/config.ts b/packages/db/test/fixtures/basics/db/config.ts index d8c476db19..010ed3a186 100644 --- a/packages/db/test/fixtures/basics/db/config.ts +++ b/packages/db/test/fixtures/basics/db/config.ts @@ -1,5 +1,5 @@ -import { Themes } from './theme'; import { column, defineDb, defineTable } from 'astro:db'; +import { Themes } from './theme'; const Author = defineTable({ columns: { diff --git a/packages/db/test/fixtures/basics/db/seed.ts b/packages/db/test/fixtures/basics/db/seed.ts index ec5ab2e0c2..9a1ef4322e 100644 --- a/packages/db/test/fixtures/basics/db/seed.ts +++ b/packages/db/test/fixtures/basics/db/seed.ts @@ -1,6 +1,6 @@ +import { Author, Session, User, db } from 'astro:db'; import { asDrizzleTable } from '@astrojs/db/utils'; import { Themes as ThemesConfig } from './theme'; -import { Author, Session, User, db } from 'astro:db'; const Themes = asDrizzleTable('Themes', ThemesConfig); export default async function () { diff --git a/packages/db/test/fixtures/basics/src/pages/index.astro b/packages/db/test/fixtures/basics/src/pages/index.astro index 2d21f81103..2be0c4b238 100644 --- a/packages/db/test/fixtures/basics/src/pages/index.astro +++ b/packages/db/test/fixtures/basics/src/pages/index.astro @@ -1,6 +1,6 @@ --- /// -import { Author, db, Themes } from 'astro:db'; +import { Author, Themes, db } from 'astro:db'; const authors = await db.select().from(Author); const themes = await db.select().from(Themes); diff --git a/packages/db/test/fixtures/basics/src/pages/login.astro b/packages/db/test/fixtures/basics/src/pages/login.astro index 41b86ab149..4551fc4832 100644 --- a/packages/db/test/fixtures/basics/src/pages/login.astro +++ b/packages/db/test/fixtures/basics/src/pages/login.astro @@ -1,5 +1,5 @@ --- -import { db, Session, User, eq } from 'astro:db'; +import { Session, User, db, eq } from 'astro:db'; const users = await db.select().from(User); const sessions = await db.select().from(Session).innerJoin(User, eq(Session.userId, User.id)); diff --git a/packages/db/test/fixtures/basics/src/pages/run.json.ts b/packages/db/test/fixtures/basics/src/pages/run.json.ts index 82d5a6a7c5..a866193144 100644 --- a/packages/db/test/fixtures/basics/src/pages/run.json.ts +++ b/packages/db/test/fixtures/basics/src/pages/run.json.ts @@ -1,6 +1,6 @@ +import { db, sql } from 'astro:db'; /// import type { APIRoute } from 'astro'; -import { db, sql } from 'astro:db'; export const GET: APIRoute = async () => { const authors = await db.run(sql`SELECT * FROM Author`); diff --git a/packages/db/test/fixtures/db-in-src/db/seed.ts b/packages/db/test/fixtures/db-in-src/db/seed.ts index 7ff9f5f30d..a84e634549 100644 --- a/packages/db/test/fixtures/db-in-src/db/seed.ts +++ b/packages/db/test/fixtures/db-in-src/db/seed.ts @@ -1,5 +1,5 @@ -import { asDrizzleTable } from '@astrojs/db/utils'; import { User, db } from 'astro:db'; +import { asDrizzleTable } from '@astrojs/db/utils'; export default async function () { await db.batch([ diff --git a/packages/db/test/fixtures/db-in-src/pages/index.astro b/packages/db/test/fixtures/db-in-src/pages/index.astro index 90f6381150..4b79dba2c8 100644 --- a/packages/db/test/fixtures/db-in-src/pages/index.astro +++ b/packages/db/test/fixtures/db-in-src/pages/index.astro @@ -1,6 +1,6 @@ --- /// -import { db, User } from 'astro:db'; +import { User, db } from 'astro:db'; const users = await db.select().from(User); --- diff --git a/packages/db/test/fixtures/error-handling/src/pages/foreign-key-constraint.json.ts b/packages/db/test/fixtures/error-handling/src/pages/foreign-key-constraint.json.ts index 9aef159c9b..8e6bad8c36 100644 --- a/packages/db/test/fixtures/error-handling/src/pages/foreign-key-constraint.json.ts +++ b/packages/db/test/fixtures/error-handling/src/pages/foreign-key-constraint.json.ts @@ -1,5 +1,5 @@ -import type { APIRoute } from 'astro'; import { Ingredient, db, isDbError } from 'astro:db'; +import type { APIRoute } from 'astro'; export const GET: APIRoute = async () => { try { diff --git a/packages/db/test/fixtures/integration-only/integration/config.ts b/packages/db/test/fixtures/integration-only/integration/config.ts index d1f1aac263..71490be957 100644 --- a/packages/db/test/fixtures/integration-only/integration/config.ts +++ b/packages/db/test/fixtures/integration-only/integration/config.ts @@ -1,5 +1,5 @@ -import { menu } from './shared'; import { defineDb } from 'astro:db'; +import { menu } from './shared'; export default defineDb({ tables: { diff --git a/packages/db/test/fixtures/integration-only/integration/seed.ts b/packages/db/test/fixtures/integration-only/integration/seed.ts index d46b05e1c1..ed2b2e2ebf 100644 --- a/packages/db/test/fixtures/integration-only/integration/seed.ts +++ b/packages/db/test/fixtures/integration-only/integration/seed.ts @@ -1,6 +1,6 @@ +import { db } from 'astro:db'; import { asDrizzleTable } from '@astrojs/db/utils'; import { menu } from './shared'; -import { db } from 'astro:db'; export default async function () { const table = asDrizzleTable('menu', menu); diff --git a/packages/db/test/fixtures/integrations/integration/config.ts b/packages/db/test/fixtures/integrations/integration/config.ts index d1f1aac263..71490be957 100644 --- a/packages/db/test/fixtures/integrations/integration/config.ts +++ b/packages/db/test/fixtures/integrations/integration/config.ts @@ -1,5 +1,5 @@ -import { menu } from './shared'; import { defineDb } from 'astro:db'; +import { menu } from './shared'; export default defineDb({ tables: { diff --git a/packages/db/test/fixtures/integrations/integration/seed.ts b/packages/db/test/fixtures/integrations/integration/seed.ts index d46b05e1c1..ed2b2e2ebf 100644 --- a/packages/db/test/fixtures/integrations/integration/seed.ts +++ b/packages/db/test/fixtures/integrations/integration/seed.ts @@ -1,6 +1,6 @@ +import { db } from 'astro:db'; import { asDrizzleTable } from '@astrojs/db/utils'; import { menu } from './shared'; -import { db } from 'astro:db'; export default async function () { const table = asDrizzleTable('menu', menu); diff --git a/packages/db/test/fixtures/local-prod/db/seed.ts b/packages/db/test/fixtures/local-prod/db/seed.ts index 7ff9f5f30d..a84e634549 100644 --- a/packages/db/test/fixtures/local-prod/db/seed.ts +++ b/packages/db/test/fixtures/local-prod/db/seed.ts @@ -1,5 +1,5 @@ -import { asDrizzleTable } from '@astrojs/db/utils'; import { User, db } from 'astro:db'; +import { asDrizzleTable } from '@astrojs/db/utils'; export default async function () { await db.batch([ diff --git a/packages/db/test/fixtures/local-prod/src/pages/index.astro b/packages/db/test/fixtures/local-prod/src/pages/index.astro index 1e2bdc7b97..f36d44bd4e 100644 --- a/packages/db/test/fixtures/local-prod/src/pages/index.astro +++ b/packages/db/test/fixtures/local-prod/src/pages/index.astro @@ -1,6 +1,6 @@ --- /// -import { db, User } from 'astro:db'; +import { User, db } from 'astro:db'; const users = await db.select().from(User); --- diff --git a/packages/db/test/fixtures/no-apptoken/src/pages/index.astro b/packages/db/test/fixtures/no-apptoken/src/pages/index.astro index 62d7b08578..477e18fa33 100644 --- a/packages/db/test/fixtures/no-apptoken/src/pages/index.astro +++ b/packages/db/test/fixtures/no-apptoken/src/pages/index.astro @@ -1,6 +1,6 @@ --- /// -import { db, User } from 'astro:db'; +import { User, db } from 'astro:db'; // Just for the side-effect of running all the code await db.select().from(User); diff --git a/packages/db/test/fixtures/recipes/src/pages/index.astro b/packages/db/test/fixtures/recipes/src/pages/index.astro index f1856c12ed..9fd2dac419 100644 --- a/packages/db/test/fixtures/recipes/src/pages/index.astro +++ b/packages/db/test/fixtures/recipes/src/pages/index.astro @@ -1,6 +1,6 @@ --- /// -import { Recipe, Ingredient, db, eq } from 'astro:db'; +import { Ingredient, Recipe, db, eq } from 'astro:db'; const ingredientsByRecipe = await db .select({ diff --git a/packages/db/test/fixtures/ticketing-example/src/components/Form.tsx b/packages/db/test/fixtures/ticketing-example/src/components/Form.tsx index a4f69c5585..f393d82816 100644 --- a/packages/db/test/fixtures/ticketing-example/src/components/Form.tsx +++ b/packages/db/test/fixtures/ticketing-example/src/components/Form.tsx @@ -1,6 +1,5 @@ // Generated by simple:form -import { type ComponentProps, createContext, useContext, useState } from 'react'; import { navigate } from 'astro:transitions/client'; import { type FieldErrors, @@ -13,6 +12,7 @@ import { toValidateField, validateForm, } from 'simple:form'; +import { type ComponentProps, createContext, useContext, useState } from 'react'; export function useCreateFormContext(validator: FormValidator, fieldErrors?: FieldErrors) { const initial = getInitialFormState({ validator, fieldErrors }); diff --git a/packages/db/test/fixtures/ticketing-example/src/pages/[event]/_Ticket.tsx b/packages/db/test/fixtures/ticketing-example/src/pages/[event]/_Ticket.tsx index bb244122bd..5e488d69d7 100644 --- a/packages/db/test/fixtures/ticketing-example/src/pages/[event]/_Ticket.tsx +++ b/packages/db/test/fixtures/ticketing-example/src/pages/[event]/_Ticket.tsx @@ -1,7 +1,7 @@ +import { createForm } from 'simple:form'; import { useState } from 'react'; import { z } from 'zod'; import { Form, Input } from '../../components/Form'; -import { createForm } from 'simple:form'; export const ticketForm = createForm({ email: z.string().email(), diff --git a/packages/integrations/lit/server-shim.js b/packages/integrations/lit/server-shim.js index 7cbee09f40..ed371f89a3 100644 --- a/packages/integrations/lit/server-shim.js +++ b/packages/integrations/lit/server-shim.js @@ -1,4 +1,4 @@ -import { HTMLElement as litShimHTMLElement, customElements as litCE } from '@lit-labs/ssr-dom-shim'; +import { customElements as litCE, HTMLElement as litShimHTMLElement } from '@lit-labs/ssr-dom-shim'; // Something at build time injects document.currentScript = undefined instead of // document.currentScript = null. This causes Sass build to fail because it diff --git a/packages/integrations/markdoc/src/content-entry-type.ts b/packages/integrations/markdoc/src/content-entry-type.ts index 5168c49c16..8fc4bd77cc 100644 --- a/packages/integrations/markdoc/src/content-entry-type.ts +++ b/packages/integrations/markdoc/src/content-entry-type.ts @@ -6,7 +6,7 @@ import Markdoc from '@markdoc/markdoc'; import type { AstroConfig, ContentEntryType } from 'astro'; import { emitESMImage } from 'astro/assets/utils'; import matter from 'gray-matter'; -import type { ErrorPayload as ViteErrorPayload, Rollup } from 'vite'; +import type { Rollup, ErrorPayload as ViteErrorPayload } from 'vite'; import type { ComponentConfig } from './config.js'; import { htmlTokenTransform } from './html/transform/html-token-transform.js'; import type { MarkdocConfigResult } from './load-config.js'; diff --git a/packages/integrations/markdoc/src/runtime-assets-config.ts b/packages/integrations/markdoc/src/runtime-assets-config.ts index d93605f6c9..0211c1381c 100644 --- a/packages/integrations/markdoc/src/runtime-assets-config.ts +++ b/packages/integrations/markdoc/src/runtime-assets-config.ts @@ -1,7 +1,7 @@ -import type { Config as MarkdocConfig } from '@markdoc/markdoc'; -import Markdoc from '@markdoc/markdoc'; //@ts-expect-error Cannot find module 'astro:assets' or its corresponding type declarations. import { Image } from 'astro:assets'; +import type { Config as MarkdocConfig } from '@markdoc/markdoc'; +import Markdoc from '@markdoc/markdoc'; export const assetsConfig: MarkdocConfig = { nodes: { diff --git a/packages/integrations/markdoc/test/fixtures/content-collections/src/pages/collection.json.js b/packages/integrations/markdoc/test/fixtures/content-collections/src/pages/collection.json.js index 75dd29d8e9..cb3c846526 100644 --- a/packages/integrations/markdoc/test/fixtures/content-collections/src/pages/collection.json.js +++ b/packages/integrations/markdoc/test/fixtures/content-collections/src/pages/collection.json.js @@ -1,6 +1,6 @@ +import { getCollection } from 'astro:content'; import { stringify } from 'devalue'; import { stripAllRenderFn } from '../../utils.js'; -import { getCollection } from 'astro:content'; export async function GET() { const posts = await getCollection('blog'); diff --git a/packages/integrations/markdoc/test/fixtures/content-collections/src/pages/entry.json.js b/packages/integrations/markdoc/test/fixtures/content-collections/src/pages/entry.json.js index 1399aa3aae..53dd17013b 100644 --- a/packages/integrations/markdoc/test/fixtures/content-collections/src/pages/entry.json.js +++ b/packages/integrations/markdoc/test/fixtures/content-collections/src/pages/entry.json.js @@ -1,6 +1,6 @@ +import { getEntryBySlug } from 'astro:content'; import { stringify } from 'devalue'; import { stripRenderFn } from '../../utils.js'; -import { getEntryBySlug } from 'astro:content'; export async function GET() { const post = await getEntryBySlug('blog', 'post-1'); diff --git a/packages/integrations/markdoc/test/fixtures/headings-custom/src/pages/[slug].astro b/packages/integrations/markdoc/test/fixtures/headings-custom/src/pages/[slug].astro index 2baef9d696..90b021e955 100644 --- a/packages/integrations/markdoc/test/fixtures/headings-custom/src/pages/[slug].astro +++ b/packages/integrations/markdoc/test/fixtures/headings-custom/src/pages/[slug].astro @@ -1,5 +1,5 @@ --- -import { getCollection, CollectionEntry } from "astro:content"; +import { CollectionEntry, getCollection } from "astro:content"; export async function getStaticPaths() { const docs = await getCollection('docs'); diff --git a/packages/integrations/markdoc/test/fixtures/headings/src/pages/[slug].astro b/packages/integrations/markdoc/test/fixtures/headings/src/pages/[slug].astro index 2baef9d696..90b021e955 100644 --- a/packages/integrations/markdoc/test/fixtures/headings/src/pages/[slug].astro +++ b/packages/integrations/markdoc/test/fixtures/headings/src/pages/[slug].astro @@ -1,5 +1,5 @@ --- -import { getCollection, CollectionEntry } from "astro:content"; +import { CollectionEntry, getCollection } from "astro:content"; export async function getStaticPaths() { const docs = await getCollection('docs'); diff --git a/packages/integrations/markdoc/test/fixtures/image-assets/src/components/Image.astro b/packages/integrations/markdoc/test/fixtures/image-assets/src/components/Image.astro index aac1294525..e572c04d78 100644 --- a/packages/integrations/markdoc/test/fixtures/image-assets/src/components/Image.astro +++ b/packages/integrations/markdoc/test/fixtures/image-assets/src/components/Image.astro @@ -1,7 +1,7 @@ --- +import { Image } from 'astro:assets'; // src/components/MyImage.astro import type { ImageMetadata } from 'astro'; -import { Image } from 'astro:assets'; type Props = { src: string | ImageMetadata; alt: string; diff --git a/packages/integrations/markdoc/test/fixtures/render-html/src/pages/[slug].astro b/packages/integrations/markdoc/test/fixtures/render-html/src/pages/[slug].astro index 1f60f6589b..bea51d3b58 100644 --- a/packages/integrations/markdoc/test/fixtures/render-html/src/pages/[slug].astro +++ b/packages/integrations/markdoc/test/fixtures/render-html/src/pages/[slug].astro @@ -1,5 +1,5 @@ --- -import { getEntryBySlug, getCollection } from "astro:content"; +import { getCollection, getEntryBySlug } from "astro:content"; const { slug } = Astro.params; diff --git a/packages/integrations/mdx/test/fixtures/css-head-mdx/src/pages/posts/[post].astro b/packages/integrations/mdx/test/fixtures/css-head-mdx/src/pages/posts/[post].astro index 7d6ca0ca4d..5afb5be922 100644 --- a/packages/integrations/mdx/test/fixtures/css-head-mdx/src/pages/posts/[post].astro +++ b/packages/integrations/mdx/test/fixtures/css-head-mdx/src/pages/posts/[post].astro @@ -1,7 +1,7 @@ --- import { getCollection } from 'astro:content'; -import Layout from '../../layouts/ContentLayout.astro'; import SmallCaps from '../../components/SmallCaps.astro'; +import Layout from '../../layouts/ContentLayout.astro'; export async function getStaticPaths() { const entries = await getCollection('posts'); diff --git a/packages/integrations/mdx/test/fixtures/css-head-mdx/src/pages/remote.astro b/packages/integrations/mdx/test/fixtures/css-head-mdx/src/pages/remote.astro index 9a7b76a102..7c80006425 100644 --- a/packages/integrations/mdx/test/fixtures/css-head-mdx/src/pages/remote.astro +++ b/packages/integrations/mdx/test/fixtures/css-head-mdx/src/pages/remote.astro @@ -1,8 +1,8 @@ --- -import '../styles/global.css' -import Layout from '../layouts/One.astro'; -import Paragraph from '../components/P.astro'; import { Markdown } from 'astro-remote' +import Paragraph from '../components/P.astro'; +import Layout from '../layouts/One.astro'; +import '../styles/global.css' --- diff --git a/packages/integrations/mdx/test/fixtures/mdx-images/src/components/MyImage.astro b/packages/integrations/mdx/test/fixtures/mdx-images/src/components/MyImage.astro index e3541867c7..3cb699e3ab 100644 --- a/packages/integrations/mdx/test/fixtures/mdx-images/src/components/MyImage.astro +++ b/packages/integrations/mdx/test/fixtures/mdx-images/src/components/MyImage.astro @@ -1,6 +1,6 @@ --- -import type { ImageMetadata } from 'astro'; import { Image } from 'astro:assets'; +import type { ImageMetadata } from 'astro'; type Props = { src: string | ImageMetadata; diff --git a/packages/integrations/mdx/test/fixtures/mdx-images/src/pages/esm-import.astro b/packages/integrations/mdx/test/fixtures/mdx-images/src/pages/esm-import.astro index e5f7a61d97..4e4db66a4d 100644 --- a/packages/integrations/mdx/test/fixtures/mdx-images/src/pages/esm-import.astro +++ b/packages/integrations/mdx/test/fixtures/mdx-images/src/pages/esm-import.astro @@ -1,6 +1,6 @@ --- -import MDX from '../components/Component.mdx'; import MyImage from 'src/components/MyImage.astro'; +import MDX from '../components/Component.mdx'; --- diff --git a/packages/integrations/mdx/test/fixtures/mdx-optimize/src/pages/import.astro b/packages/integrations/mdx/test/fixtures/mdx-optimize/src/pages/import.astro index b522a30280..9bfa7cebf7 100644 --- a/packages/integrations/mdx/test/fixtures/mdx-optimize/src/pages/import.astro +++ b/packages/integrations/mdx/test/fixtures/mdx-optimize/src/pages/import.astro @@ -1,6 +1,6 @@ --- -import { Content, components } from './index.mdx' import Strong from '../components/Strong.astro' +import { Content, components } from './index.mdx' --- diff --git a/packages/integrations/react/server.js b/packages/integrations/react/server.js index f7de2ff2e2..b2e94fbf0b 100644 --- a/packages/integrations/react/server.js +++ b/packages/integrations/react/server.js @@ -1,8 +1,8 @@ +import opts from 'astro:react:opts'; import React from 'react'; import ReactDOM from 'react-dom/server'; import { incrementId } from './context.js'; import StaticHtml from './static-html.js'; -import opts from 'astro:react:opts'; const slotName = (str) => str.trim().replace(/[-_]([a-z])/g, (_, w) => w.toUpperCase()); const reactTypeof = Symbol.for('react.element'); diff --git a/packages/integrations/react/test/fixtures/react-component/src/pages/index.astro b/packages/integrations/react/test/fixtures/react-component/src/pages/index.astro index 3afd8233f2..b3b95c4b3b 100644 --- a/packages/integrations/react/test/fixtures/react-component/src/pages/index.astro +++ b/packages/integrations/react/test/fixtures/react-component/src/pages/index.astro @@ -1,12 +1,12 @@ --- -import Hello from '../components/Hello.jsx'; -import Later from '../components/Goodbye.vue'; import ArrowFunction from '../components/ArrowFunction.jsx'; -import PropsSpread from '../components/PropsSpread.jsx'; -import {Research2} from '../components/Research.jsx'; -import Pure from '../components/Pure.jsx'; -import TypeScriptComponent from '../components/TypeScriptComponent'; import CloneElement from '../components/CloneElement'; +import Later from '../components/Goodbye.vue'; +import Hello from '../components/Hello.jsx'; +import PropsSpread from '../components/PropsSpread.jsx'; +import Pure from '../components/Pure.jsx'; +import {Research2} from '../components/Research.jsx'; +import TypeScriptComponent from '../components/TypeScriptComponent'; import WithChildren from '../components/WithChildren'; import WithId from '../components/WithId'; diff --git a/packages/integrations/vue/client.js b/packages/integrations/vue/client.js index 3fdf53dae9..807f843fc9 100644 --- a/packages/integrations/vue/client.js +++ b/packages/integrations/vue/client.js @@ -1,6 +1,6 @@ +import { setup } from 'virtual:@astrojs/vue/app'; import { Suspense, createApp, createSSRApp, h } from 'vue'; import StaticHtml from './static-html.js'; -import { setup } from 'virtual:@astrojs/vue/app'; export default (element) => async (Component, props, slotted, { client }) => { diff --git a/packages/integrations/vue/server.js b/packages/integrations/vue/server.js index 55d61871d8..be57dd43ab 100644 --- a/packages/integrations/vue/server.js +++ b/packages/integrations/vue/server.js @@ -1,7 +1,7 @@ +import { setup } from 'virtual:@astrojs/vue/app'; import { createSSRApp, h } from 'vue'; import { renderToString } from 'vue/server-renderer'; import StaticHtml from './static-html.js'; -import { setup } from 'virtual:@astrojs/vue/app'; function check(Component) { return !!Component['ssrRender'] || !!Component['__ssrInlineRender']; diff --git a/packages/integrations/vue/test/fixtures/app-entrypoint/src/pages/index.astro b/packages/integrations/vue/test/fixtures/app-entrypoint/src/pages/index.astro index a517f8a979..511b626baa 100644 --- a/packages/integrations/vue/test/fixtures/app-entrypoint/src/pages/index.astro +++ b/packages/integrations/vue/test/fixtures/app-entrypoint/src/pages/index.astro @@ -1,8 +1,8 @@ --- import Foo from '../components/Foo.vue'; -import MultipleScriptBlocks, { doubleNumber } from '../components/MultipleScriptBlocks.vue'; import GenericComponent from '../components/Generics.vue'; import GenericsAndBlocks, { customFormatter } from '../components/GenericsAndBlocks.vue'; +import MultipleScriptBlocks, { doubleNumber } from '../components/MultipleScriptBlocks.vue'; --- diff --git a/packages/integrations/vue/test/fixtures/basics/src/pages/index.astro b/packages/integrations/vue/test/fixtures/basics/src/pages/index.astro index e17de6edf9..b2f292d105 100644 --- a/packages/integrations/vue/test/fixtures/basics/src/pages/index.astro +++ b/packages/integrations/vue/test/fixtures/basics/src/pages/index.astro @@ -1,6 +1,6 @@ --- -import Parent from '../components/Parent.astro'; import Bar from '../components/Foo.vue'; +import Parent from '../components/Parent.astro'; --- diff --git a/packages/markdown/remark/src/frontmatter-injection.ts b/packages/markdown/remark/src/frontmatter-injection.ts index cb53d2ab28..91b98ebcba 100644 --- a/packages/markdown/remark/src/frontmatter-injection.ts +++ b/packages/markdown/remark/src/frontmatter-injection.ts @@ -1,4 +1,4 @@ -import type { VFile, VFileData as Data } from 'vfile'; +import type { VFileData as Data, VFile } from 'vfile'; import type { MarkdownAstroData } from './types.js'; function isValidAstroData(obj: unknown): obj is MarkdownAstroData { diff --git a/packages/telemetry/src/system-info.ts b/packages/telemetry/src/system-info.ts index 1315c63c94..2913b69414 100644 --- a/packages/telemetry/src/system-info.ts +++ b/packages/telemetry/src/system-info.ts @@ -1,5 +1,5 @@ import os from 'node:os'; -import { isCI, name as ciName } from 'ci-info'; +import { name as ciName, isCI } from 'ci-info'; import isDocker from 'is-docker'; import isWSL from 'is-wsl'; From dc74afca9f5eebc2d61331298d6ef187d92051e0 Mon Sep 17 00:00:00 2001 From: Martin Trapp <94928215+martrapp@users.noreply.github.com> Date: Wed, 17 Apr 2024 11:56:31 +0200 Subject: [PATCH 17/36] Fixes an issue with persisted non-text input fields that have the focus during view transition navigation. (#10799) * Fixes an issue with persisted non-text input fields that have the focus during view transition navigation. * better check --- .changeset/itchy-donuts-destroy.md | 5 ++++ .../src/pages/persist-1.astro | 26 +++++++++++++++++++ .../src/pages/persist-2.astro | 17 ++++++++++++ packages/astro/e2e/view-transitions.test.js | 17 ++++++++++++ packages/astro/src/transitions/router.ts | 4 +-- 5 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 .changeset/itchy-donuts-destroy.md create mode 100644 packages/astro/e2e/fixtures/view-transitions/src/pages/persist-1.astro create mode 100644 packages/astro/e2e/fixtures/view-transitions/src/pages/persist-2.astro diff --git a/.changeset/itchy-donuts-destroy.md b/.changeset/itchy-donuts-destroy.md new file mode 100644 index 0000000000..655b27a265 --- /dev/null +++ b/.changeset/itchy-donuts-destroy.md @@ -0,0 +1,5 @@ +--- +"astro": patch +--- + +Fixes an issue with persisted non-text input fields that have the focus during view transition navigation. diff --git a/packages/astro/e2e/fixtures/view-transitions/src/pages/persist-1.astro b/packages/astro/e2e/fixtures/view-transitions/src/pages/persist-1.astro new file mode 100644 index 0000000000..830667b3e6 --- /dev/null +++ b/packages/astro/e2e/fixtures/view-transitions/src/pages/persist-1.astro @@ -0,0 +1,26 @@ +--- +import Layout from '../components/Layout.astro'; +--- + +

Persist 1

+
+ + +
+
test content
+
+ diff --git a/packages/astro/e2e/fixtures/view-transitions/src/pages/persist-2.astro b/packages/astro/e2e/fixtures/view-transitions/src/pages/persist-2.astro new file mode 100644 index 0000000000..f79dedcd5e --- /dev/null +++ b/packages/astro/e2e/fixtures/view-transitions/src/pages/persist-2.astro @@ -0,0 +1,17 @@ +--- +import Layout from '../components/Layout.astro'; +--- + +

Persist 2

+ go to 3 +
+
test content
+ + + + diff --git a/packages/astro/e2e/view-transitions.test.js b/packages/astro/e2e/view-transitions.test.js index b963bf2fd7..14cb8668d2 100644 --- a/packages/astro/e2e/view-transitions.test.js +++ b/packages/astro/e2e/view-transitions.test.js @@ -1403,3 +1403,20 @@ test.describe('View Transitions', () => { ).toEqual(0); }); }); + +test('transition:persist persists selection', async ({ page, astro }) => { + let text = ""; + page.on('console', (msg) => { + text=msg.text(); + }); + await page.goto(astro.resolveUrl('/persist-1')); + await expect(page.locator('#one'), 'should have content').toHaveText('Persist 1'); + // go to page 2 + await page.press('input[name="name"]', 'Enter'); + await expect(page.locator('#two'), 'should have content').toHaveText('Persist 2'); + expect(text).toBe('true some cool text 5 9'); + + await page.goBack(); + await expect(page.locator('#one'), 'should have content').toHaveText('Persist 1'); + expect(text).toBe('true true'); +}); diff --git a/packages/astro/src/transitions/router.ts b/packages/astro/src/transitions/router.ts index 5766656f47..a68e423d05 100644 --- a/packages/astro/src/transitions/router.ts +++ b/packages/astro/src/transitions/router.ts @@ -305,8 +305,8 @@ async function updateDOM( activeElement instanceof HTMLInputElement || activeElement instanceof HTMLTextAreaElement ) { - activeElement.selectionStart = start!; - activeElement.selectionEnd = end!; + if (typeof start === 'number') activeElement.selectionStart = start; + if (typeof end === 'number') activeElement.selectionEnd = end; } } }; From 1452cf69a4dbf6c49f0d3b18e70cf257c3c3cf72 Mon Sep 17 00:00:00 2001 From: Martin Trapp Date: Wed, 17 Apr 2024 09:57:24 +0000 Subject: [PATCH 18/36] [ci] format --- packages/astro/e2e/view-transitions.test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/astro/e2e/view-transitions.test.js b/packages/astro/e2e/view-transitions.test.js index 14cb8668d2..ef76010a58 100644 --- a/packages/astro/e2e/view-transitions.test.js +++ b/packages/astro/e2e/view-transitions.test.js @@ -1405,9 +1405,9 @@ test.describe('View Transitions', () => { }); test('transition:persist persists selection', async ({ page, astro }) => { - let text = ""; + let text = ''; page.on('console', (msg) => { - text=msg.text(); + text = msg.text(); }); await page.goto(astro.resolveUrl('/persist-1')); await expect(page.locator('#one'), 'should have content').toHaveText('Persist 1'); From 914daad18b4604dc63e0afdb8bb01e9129594c67 Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Wed, 17 Apr 2024 13:01:29 +0100 Subject: [PATCH 19/36] test: fix regression upon import sorting (#10802) --- biome.json | 18 +++++++++++------- .../css-order-layout/src/layouts/Main.astro | 2 +- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/biome.json b/biome.json index aed74ad496..fd35328f81 100644 --- a/biome.json +++ b/biome.json @@ -1,7 +1,14 @@ { "$schema": "https://biomejs.dev/schemas/1.6.4/schema.json", "files": { - "ignore": ["vendor", "dist/**"], + "ignore": [ + "vendor", + "**/dist/**", + "**/smoke/**", + "**/fixtures/**", + "**/vendor/**", + "**/.vercel/**" + ], "include": ["test/**", "e2e/**", "packages/**"] }, "formatter": { @@ -11,18 +18,15 @@ "ignore": [ "benchmark/projects/", "benchmark/results/", - "**/dist/**", - "**/smoke/**", - "**/fixtures/**", - "**/vendor/**", - "**/.vercel/**", ".changeset", "pnpm-lock.yaml", "package.json", "*.astro" ] }, - "organizeImports": { "enabled": true }, + "organizeImports": { + "enabled": true + }, "linter": { "enabled": false }, "javascript": { "formatter": { diff --git a/packages/astro/test/fixtures/css-order-layout/src/layouts/Main.astro b/packages/astro/test/fixtures/css-order-layout/src/layouts/Main.astro index 225b8c1030..49f378bc64 100644 --- a/packages/astro/test/fixtures/css-order-layout/src/layouts/Main.astro +++ b/packages/astro/test/fixtures/css-order-layout/src/layouts/Main.astro @@ -1,6 +1,6 @@ --- -import BlueButton from "../components/BlueButton.astro"; import MainHead from "../components/MainHead.astro"; +import BlueButton from "../components/BlueButton.astro"; --- From 0e22462d1534afc8f7bb6782f86db680c7a5f245 Mon Sep 17 00:00:00 2001 From: Robin Gisler <63500142+gislerro@users.noreply.github.com> Date: Thu, 18 Apr 2024 09:09:25 +0200 Subject: [PATCH 20/36] fix(sitemap): Trailing slashes on root url (#10772) * add tests that reveal issue * fix trailing slash root page issue * add changeset --- .changeset/late-bags-marry.md | 5 ++ packages/integrations/sitemap/package.json | 1 + packages/integrations/sitemap/src/index.ts | 11 ++- .../integrations/sitemap/src/write-sitemap.ts | 69 +++++++++++++++++++ .../trailing-slash/src/pages/index.astro | 8 +++ .../sitemap/test/trailing-slash.test.js | 29 ++++++-- pnpm-lock.yaml | 7 ++ 7 files changed, 117 insertions(+), 13 deletions(-) create mode 100644 .changeset/late-bags-marry.md create mode 100644 packages/integrations/sitemap/src/write-sitemap.ts create mode 100644 packages/integrations/sitemap/test/fixtures/trailing-slash/src/pages/index.astro diff --git a/.changeset/late-bags-marry.md b/.changeset/late-bags-marry.md new file mode 100644 index 0000000000..af6b4ba3ef --- /dev/null +++ b/.changeset/late-bags-marry.md @@ -0,0 +1,5 @@ +--- +"@astrojs/sitemap": patch +--- + +Fixes an issue where the root url does not follow the `trailingSlash` config option diff --git a/packages/integrations/sitemap/package.json b/packages/integrations/sitemap/package.json index 9ccbf3d5be..cdff0a8aab 100644 --- a/packages/integrations/sitemap/package.json +++ b/packages/integrations/sitemap/package.json @@ -34,6 +34,7 @@ }, "dependencies": { "sitemap": "^7.1.1", + "stream-replace-string": "^2.0.0", "zod": "^3.22.4" }, "devDependencies": { diff --git a/packages/integrations/sitemap/src/index.ts b/packages/integrations/sitemap/src/index.ts index b0548d8f11..a2fae5b5ad 100644 --- a/packages/integrations/sitemap/src/index.ts +++ b/packages/integrations/sitemap/src/index.ts @@ -2,11 +2,11 @@ import path from 'node:path'; import { fileURLToPath } from 'node:url'; import type { AstroConfig, AstroIntegration } from 'astro'; import type { EnumChangefreq, LinkItem as LinkItemBase, SitemapItemLoose } from 'sitemap'; -import { simpleSitemapAndIndex } from 'sitemap'; import { ZodError } from 'zod'; -import { generateSitemap } from './generate-sitemap.js'; import { validateOptions } from './validate-options.js'; +import { generateSitemap } from './generate-sitemap.js'; +import { writeSitemap } from './write-sitemap.js'; export { EnumChangefreq as ChangeFreqEnum } from 'sitemap'; export type ChangeFreq = `${EnumChangefreq}`; @@ -167,14 +167,13 @@ const createPlugin = (options?: SitemapOptions): AstroIntegration => { } } const destDir = fileURLToPath(dir); - await simpleSitemapAndIndex({ + await writeSitemap({ hostname: finalSiteUrl.href, destinationDir: destDir, publicBasePath: config.base, sourceData: urlData, - limit: entryLimit, - gzip: false, - }); + limit: entryLimit + }, config) logger.info(`\`${OUTFILE}\` created at \`${path.relative(process.cwd(), destDir)}\``); } catch (err) { if (err instanceof ZodError) { diff --git a/packages/integrations/sitemap/src/write-sitemap.ts b/packages/integrations/sitemap/src/write-sitemap.ts new file mode 100644 index 0000000000..d55d4fc50b --- /dev/null +++ b/packages/integrations/sitemap/src/write-sitemap.ts @@ -0,0 +1,69 @@ +import { normalize, resolve } from 'path'; +import { createWriteStream, type WriteStream } from 'fs' +import { mkdir } from 'fs/promises'; +import { promisify } from 'util'; +import { Readable, pipeline } from 'stream'; +import replace from 'stream-replace-string' + +import { SitemapAndIndexStream, SitemapStream } from 'sitemap'; + +import type { AstroConfig } from 'astro'; +import type { SitemapItem } from "./index.js"; + +type WriteSitemapConfig = { + hostname: string; + sitemapHostname?: string; + sourceData: SitemapItem[]; + destinationDir: string; + publicBasePath?: string; + limit?: number; +} + +// adapted from sitemap.js/sitemap-simple +export async function writeSitemap({ hostname, sitemapHostname = hostname, +sourceData, destinationDir, limit = 50000, publicBasePath = './', }: WriteSitemapConfig, astroConfig: AstroConfig) { + + await mkdir(destinationDir, { recursive: true }) + + const sitemapAndIndexStream = new SitemapAndIndexStream({ + limit, + getSitemapStream: (i) => { + const sitemapStream = new SitemapStream({ + hostname, + }); + const path = `./sitemap-${i}.xml`; + const writePath = resolve(destinationDir, path); + if (!publicBasePath.endsWith('/')) { + publicBasePath += '/'; + } + const publicPath = normalize(publicBasePath + path); + + let stream: WriteStream + if (astroConfig.trailingSlash === 'never' || astroConfig.build.format === 'file') { + // workaround for trailing slash issue in sitemap.js: https://github.com/ekalinin/sitemap.js/issues/403 + const host = hostname.endsWith('/') ? hostname.slice(0, -1) : hostname + const searchStr = `${host}/` + const replaceStr = `${host}` + stream = sitemapStream.pipe(replace(searchStr, replaceStr)).pipe(createWriteStream(writePath)) + } else { + stream = sitemapStream.pipe(createWriteStream(writePath)) + } + + return [ + new URL( + publicPath, + sitemapHostname + ).toString(), + sitemapStream, + stream, + ]; + }, + }); + + let src = Readable.from(sourceData) + const indexPath = resolve( + destinationDir, + `./sitemap-index.xml` + ); + return promisify(pipeline)(src, sitemapAndIndexStream, createWriteStream(indexPath)); +} \ No newline at end of file diff --git a/packages/integrations/sitemap/test/fixtures/trailing-slash/src/pages/index.astro b/packages/integrations/sitemap/test/fixtures/trailing-slash/src/pages/index.astro new file mode 100644 index 0000000000..5a29cbdbe8 --- /dev/null +++ b/packages/integrations/sitemap/test/fixtures/trailing-slash/src/pages/index.astro @@ -0,0 +1,8 @@ + + + Index + + +

Index

+ + \ No newline at end of file diff --git a/packages/integrations/sitemap/test/trailing-slash.test.js b/packages/integrations/sitemap/test/trailing-slash.test.js index e0a6158fbe..181f0def53 100644 --- a/packages/integrations/sitemap/test/trailing-slash.test.js +++ b/packages/integrations/sitemap/test/trailing-slash.test.js @@ -22,7 +22,10 @@ describe('Trailing slash', () => { it('URLs end with trailing slash', async () => { const data = await readXML(fixture.readFile('/sitemap-0.xml')); const urls = data.urlset.url; - assert.equal(urls[0].loc[0], 'http://example.com/one/'); + + assert.equal(urls[0].loc[0], 'http://example.com/'); + assert.equal(urls[1].loc[0], 'http://example.com/one/'); + assert.equal(urls[2].loc[0], 'http://example.com/two/'); }); }); @@ -41,7 +44,10 @@ describe('Trailing slash', () => { it('URLs do not end with trailing slash', async () => { const data = await readXML(fixture.readFile('/sitemap-0.xml')); const urls = data.urlset.url; - assert.equal(urls[0].loc[0], 'http://example.com/one'); + + assert.equal(urls[0].loc[0], 'http://example.com'); + assert.equal(urls[1].loc[0], 'http://example.com/one'); + assert.equal(urls[2].loc[0], 'http://example.com/two'); }); }); }); @@ -55,10 +61,13 @@ describe('Trailing slash', () => { await fixture.build(); }); - it('URLs do no end with trailing slash', async () => { + it('URLs do not end with trailing slash', async () => { const data = await readXML(fixture.readFile('/sitemap-0.xml')); const urls = data.urlset.url; - assert.equal(urls[0].loc[0], 'http://example.com/one'); + + assert.equal(urls[0].loc[0], 'http://example.com'); + assert.equal(urls[1].loc[0], 'http://example.com/one'); + assert.equal(urls[2].loc[0], 'http://example.com/two'); }); describe('with base path', () => { before(async () => { @@ -73,7 +82,9 @@ describe('Trailing slash', () => { it('URLs do not end with trailing slash', async () => { const data = await readXML(fixture.readFile('/sitemap-0.xml')); const urls = data.urlset.url; - assert.equal(urls[0].loc[0], 'http://example.com/base/one'); + assert.equal(urls[0].loc[0], 'http://example.com/base'); + assert.equal(urls[1].loc[0], 'http://example.com/base/one'); + assert.equal(urls[2].loc[0], 'http://example.com/base/two'); }); }); }); @@ -90,7 +101,9 @@ describe('Trailing slash', () => { it('URLs end with trailing slash', async () => { const data = await readXML(fixture.readFile('/sitemap-0.xml')); const urls = data.urlset.url; - assert.equal(urls[0].loc[0], 'http://example.com/one/'); + assert.equal(urls[0].loc[0], 'http://example.com/'); + assert.equal(urls[1].loc[0], 'http://example.com/one/'); + assert.equal(urls[2].loc[0], 'http://example.com/two/'); }); describe('with base path', () => { before(async () => { @@ -105,7 +118,9 @@ describe('Trailing slash', () => { it('URLs end with trailing slash', async () => { const data = await readXML(fixture.readFile('/sitemap-0.xml')); const urls = data.urlset.url; - assert.equal(urls[0].loc[0], 'http://example.com/base/one/'); + assert.equal(urls[0].loc[0], 'http://example.com/base/'); + assert.equal(urls[1].loc[0], 'http://example.com/base/one/'); + assert.equal(urls[2].loc[0], 'http://example.com/base/two/'); }); }); }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3b50248aac..8b81958b2d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4888,6 +4888,9 @@ importers: sitemap: specifier: ^7.1.1 version: 7.1.1 + stream-replace-string: + specifier: ^2.0.0 + version: 2.0.0 zod: specifier: ^3.22.4 version: 3.22.4 @@ -15642,6 +15645,10 @@ packages: bl: 5.1.0 dev: false + /stream-replace-string@2.0.0: + resolution: {integrity: sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==} + dev: false + /stream-transform@2.1.3: resolution: {integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==} dependencies: From 5750ad12bed9b4e154f1c1b0f77f0f8dc17972b8 Mon Sep 17 00:00:00 2001 From: Robin Gisler Date: Thu, 18 Apr 2024 07:10:24 +0000 Subject: [PATCH 21/36] [ci] format --- packages/integrations/sitemap/src/index.ts | 19 +-- .../integrations/sitemap/src/write-sitemap.ts | 112 +++++++++--------- 2 files changed, 67 insertions(+), 64 deletions(-) diff --git a/packages/integrations/sitemap/src/index.ts b/packages/integrations/sitemap/src/index.ts index a2fae5b5ad..36ecc8eac6 100644 --- a/packages/integrations/sitemap/src/index.ts +++ b/packages/integrations/sitemap/src/index.ts @@ -4,8 +4,8 @@ import type { AstroConfig, AstroIntegration } from 'astro'; import type { EnumChangefreq, LinkItem as LinkItemBase, SitemapItemLoose } from 'sitemap'; import { ZodError } from 'zod'; -import { validateOptions } from './validate-options.js'; import { generateSitemap } from './generate-sitemap.js'; +import { validateOptions } from './validate-options.js'; import { writeSitemap } from './write-sitemap.js'; export { EnumChangefreq as ChangeFreqEnum } from 'sitemap'; @@ -167,13 +167,16 @@ const createPlugin = (options?: SitemapOptions): AstroIntegration => { } } const destDir = fileURLToPath(dir); - await writeSitemap({ - hostname: finalSiteUrl.href, - destinationDir: destDir, - publicBasePath: config.base, - sourceData: urlData, - limit: entryLimit - }, config) + await writeSitemap( + { + hostname: finalSiteUrl.href, + destinationDir: destDir, + publicBasePath: config.base, + sourceData: urlData, + limit: entryLimit, + }, + config + ); logger.info(`\`${OUTFILE}\` created at \`${path.relative(process.cwd(), destDir)}\``); } catch (err) { if (err instanceof ZodError) { diff --git a/packages/integrations/sitemap/src/write-sitemap.ts b/packages/integrations/sitemap/src/write-sitemap.ts index d55d4fc50b..9993d7790b 100644 --- a/packages/integrations/sitemap/src/write-sitemap.ts +++ b/packages/integrations/sitemap/src/write-sitemap.ts @@ -1,69 +1,69 @@ +import { type WriteStream, createWriteStream } from 'fs'; import { normalize, resolve } from 'path'; -import { createWriteStream, type WriteStream } from 'fs' -import { mkdir } from 'fs/promises'; -import { promisify } from 'util'; import { Readable, pipeline } from 'stream'; -import replace from 'stream-replace-string' +import { promisify } from 'util'; +import { mkdir } from 'fs/promises'; +import replace from 'stream-replace-string'; import { SitemapAndIndexStream, SitemapStream } from 'sitemap'; import type { AstroConfig } from 'astro'; -import type { SitemapItem } from "./index.js"; +import type { SitemapItem } from './index.js'; type WriteSitemapConfig = { - hostname: string; - sitemapHostname?: string; - sourceData: SitemapItem[]; - destinationDir: string; - publicBasePath?: string; - limit?: number; -} + hostname: string; + sitemapHostname?: string; + sourceData: SitemapItem[]; + destinationDir: string; + publicBasePath?: string; + limit?: number; +}; // adapted from sitemap.js/sitemap-simple -export async function writeSitemap({ hostname, sitemapHostname = hostname, -sourceData, destinationDir, limit = 50000, publicBasePath = './', }: WriteSitemapConfig, astroConfig: AstroConfig) { +export async function writeSitemap( + { + hostname, + sitemapHostname = hostname, + sourceData, + destinationDir, + limit = 50000, + publicBasePath = './', + }: WriteSitemapConfig, + astroConfig: AstroConfig +) { + await mkdir(destinationDir, { recursive: true }); - await mkdir(destinationDir, { recursive: true }) + const sitemapAndIndexStream = new SitemapAndIndexStream({ + limit, + getSitemapStream: (i) => { + const sitemapStream = new SitemapStream({ + hostname, + }); + const path = `./sitemap-${i}.xml`; + const writePath = resolve(destinationDir, path); + if (!publicBasePath.endsWith('/')) { + publicBasePath += '/'; + } + const publicPath = normalize(publicBasePath + path); - const sitemapAndIndexStream = new SitemapAndIndexStream({ - limit, - getSitemapStream: (i) => { - const sitemapStream = new SitemapStream({ - hostname, - }); - const path = `./sitemap-${i}.xml`; - const writePath = resolve(destinationDir, path); - if (!publicBasePath.endsWith('/')) { - publicBasePath += '/'; - } - const publicPath = normalize(publicBasePath + path); + let stream: WriteStream; + if (astroConfig.trailingSlash === 'never' || astroConfig.build.format === 'file') { + // workaround for trailing slash issue in sitemap.js: https://github.com/ekalinin/sitemap.js/issues/403 + const host = hostname.endsWith('/') ? hostname.slice(0, -1) : hostname; + const searchStr = `${host}/`; + const replaceStr = `${host}`; + stream = sitemapStream + .pipe(replace(searchStr, replaceStr)) + .pipe(createWriteStream(writePath)); + } else { + stream = sitemapStream.pipe(createWriteStream(writePath)); + } - let stream: WriteStream - if (astroConfig.trailingSlash === 'never' || astroConfig.build.format === 'file') { - // workaround for trailing slash issue in sitemap.js: https://github.com/ekalinin/sitemap.js/issues/403 - const host = hostname.endsWith('/') ? hostname.slice(0, -1) : hostname - const searchStr = `${host}/` - const replaceStr = `${host}` - stream = sitemapStream.pipe(replace(searchStr, replaceStr)).pipe(createWriteStream(writePath)) - } else { - stream = sitemapStream.pipe(createWriteStream(writePath)) - } - - return [ - new URL( - publicPath, - sitemapHostname - ).toString(), - sitemapStream, - stream, - ]; - }, - }); - - let src = Readable.from(sourceData) - const indexPath = resolve( - destinationDir, - `./sitemap-index.xml` - ); - return promisify(pipeline)(src, sitemapAndIndexStream, createWriteStream(indexPath)); -} \ No newline at end of file + return [new URL(publicPath, sitemapHostname).toString(), sitemapStream, stream]; + }, + }); + + let src = Readable.from(sourceData); + const indexPath = resolve(destinationDir, `./sitemap-index.xml`); + return promisify(pipeline)(src, sitemapAndIndexStream, createWriteStream(indexPath)); +} From 35e43ecdaae7adc4b9a0b974192a033568cfb3f0 Mon Sep 17 00:00:00 2001 From: Arsh <69170106+lilnasy@users.noreply.github.com> Date: Thu, 18 Apr 2024 13:10:13 +0530 Subject: [PATCH 22/36] optimization(runtime): create smaller objects for each Astro global (#10773) * optimization(runtime): create smaller objects for each Astro global * add changeset * Make slots lazy --------- Co-authored-by: bluwy --- .changeset/lazy-rats-beam.md | 5 ++ packages/astro/src/core/render-context.ts | 59 +++++++++++++++++++---- 2 files changed, 54 insertions(+), 10 deletions(-) create mode 100644 .changeset/lazy-rats-beam.md diff --git a/.changeset/lazy-rats-beam.md b/.changeset/lazy-rats-beam.md new file mode 100644 index 0000000000..66acfe33f2 --- /dev/null +++ b/.changeset/lazy-rats-beam.md @@ -0,0 +1,5 @@ +--- +"astro": patch +--- + +Improves performance for frequent use of small components. diff --git a/packages/astro/src/core/render-context.ts b/packages/astro/src/core/render-context.ts index eb05df6f5d..5cfc8ef2ed 100644 --- a/packages/astro/src/core/render-context.ts +++ b/packages/astro/src/core/render-context.ts @@ -242,12 +242,57 @@ export class RenderContext { return result; } + #astroPagePartial?: Omit; + /** + * The Astro global is sourced in 3 different phases: + * - **Static**: `.generator` and `.glob` is printed by the compiler, instantiated once per process per astro file + * - **Page-level**: `.request`, `.cookies`, `.locals` etc. These remain the same for the duration of the request. + * - **Component-level**: `.props`, `.slots`, and `.self` are unique to each _use_ of each component. + * + * The page level partial is used as the prototype of the user-visible `Astro` global object, which is instantiated once per use of a component. + */ createAstro( result: SSRResult, - astroGlobalPartial: AstroGlobalPartial, + astroStaticPartial: AstroGlobalPartial, props: Record, slotValues: Record | null ): AstroGlobal { + // Create page partial with static partial so they can be cached together. + const astroPagePartial = (this.#astroPagePartial ??= this.createAstroPagePartial( + result, + astroStaticPartial + )); + // Create component-level partials. `Astro.self` is added by the compiler. + const astroComponentPartial = { props, self: null }; + + // Create final object. `Astro.slots` will be lazily created. + const Astro: Omit = Object.assign( + Object.create(astroPagePartial), + astroComponentPartial + ); + + // Handle `Astro.slots` + let _slots: AstroGlobal['slots']; + Object.defineProperty(Astro, 'slots', { + get: () => { + if (!_slots) { + _slots = new Slots( + result, + slotValues, + this.pipeline.logger + ) as unknown as AstroGlobal['slots']; + } + return _slots; + }, + }); + + return Astro as AstroGlobal; + } + + createAstroPagePartial( + result: SSRResult, + astroStaticPartial: AstroGlobalPartial + ): Omit { const renderContext = this; const { cookies, locals, params, pipeline, request, url } = this; const { response } = result; @@ -260,12 +305,10 @@ export class RenderContext { } return new Response(null, { status, headers: { Location: path } }); }; - const slots = new Slots(result, slotValues, pipeline.logger) as unknown as AstroGlobal['slots']; - // `Astro.self` is added by the compiler - const astroGlobalCombined: Omit = { - generator: astroGlobalPartial.generator, - glob: astroGlobalPartial.glob, + return { + generator: astroStaticPartial.generator, + glob: astroStaticPartial.glob, cookies, get clientAddress() { return renderContext.clientAddress(); @@ -280,17 +323,13 @@ export class RenderContext { get preferredLocaleList() { return renderContext.computePreferredLocaleList(); }, - props, locals, redirect, request, response, - slots, site: pipeline.site, url, }; - - return astroGlobalCombined as AstroGlobal; } clientAddress() { From 77822a822b04b5113726f713df104e8667333c59 Mon Sep 17 00:00:00 2001 From: Avinash Reddy Date: Thu, 18 Apr 2024 14:33:36 +0530 Subject: [PATCH 23/36] add/cli: update list of integrations (#10811) --- .changeset/yellow-fishes-occur.md | 5 +++++ packages/astro/src/cli/add/index.ts | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 .changeset/yellow-fishes-occur.md diff --git a/.changeset/yellow-fishes-occur.md b/.changeset/yellow-fishes-occur.md new file mode 100644 index 0000000000..028412e5fc --- /dev/null +++ b/.changeset/yellow-fishes-occur.md @@ -0,0 +1,5 @@ +--- +"astro": patch +--- + +Update list of available integrations in the `astro add` CLI help. diff --git a/packages/astro/src/cli/add/index.ts b/packages/astro/src/cli/add/index.ts index 2f8b73d560..c38ab57c1d 100644 --- a/packages/astro/src/cli/add/index.ts +++ b/packages/astro/src/cli/add/index.ts @@ -148,12 +148,12 @@ export async function add(names: string[], { flags }: AddOptions) { ['node', 'astro add node'], ], Others: [ + ['db', 'astro add db'], ['tailwind', 'astro add tailwind'], - ['image', 'astro add image'], ['mdx', 'astro add mdx'], + ['markdoc', 'astro add markdoc'], ['partytown', 'astro add partytown'], ['sitemap', 'astro add sitemap'], - ['prefetch', 'astro add prefetch'], ], }, description: `For more integrations, check out: ${cyan('https://astro.build/integrations')}`, From 63132771373ce1510be3e8814897accc0bf62ef8 Mon Sep 17 00:00:00 2001 From: Matthew Phillips Date: Thu, 18 Apr 2024 11:23:05 -0400 Subject: [PATCH 24/36] Invalidate CC cache manifest when lockfile or config changes (#10763) * Invalidate CC cache manifest when lockfile or config changes * Close the handle and increment manifest version * debug info * Provide a reason for cache busting * Handle compile metadata missing * Try it this way * Copy over cached assets as well * Only restore chunks when cache is valid * Better handle invalid caches * Explain when there is no content manifest * Add tests * debugging * Remove debugging * Update packages/astro/src/core/build/plugins/plugin-content.ts Co-authored-by: Bjorn Lu * Update packages/astro/src/core/build/plugins/plugin-content.ts Co-authored-by: Bjorn Lu * Review comments * Add chunks path constant --------- Co-authored-by: Bjorn Lu --- .changeset/metal-terms-push.md | 5 + packages/astro/src/@types/astro.ts | 1 + packages/astro/src/core/build/consts.ts | 1 + packages/astro/src/core/build/index.ts | 1 + packages/astro/src/core/build/internal.ts | 2 + .../src/core/build/plugins/plugin-content.ts | 191 +++++++++++++++--- packages/astro/src/core/build/static-build.ts | 5 +- packages/astro/src/core/config/config.ts | 20 +- packages/astro/src/core/config/index.ts | 2 +- packages/astro/src/integrations/index.ts | 4 +- packages/astro/src/vite-plugin-astro/index.ts | 22 +- ...ent-collections-cache-invalidation.test.js | 98 +++++++++ .../.gitignore | 1 + .../astro.config.mjs | 12 ++ .../lockfile-mismatch/content/manifest.json | 1 + .../version-mismatch/content/manifest.json | 1 + .../package.json | 8 + .../src/content/blog/one.md | 5 + .../src/content/config.ts | 10 + .../src/pages/index.astro | 10 + pnpm-lock.yaml | 6 + 21 files changed, 355 insertions(+), 51 deletions(-) create mode 100644 .changeset/metal-terms-push.md create mode 100644 packages/astro/src/core/build/consts.ts create mode 100644 packages/astro/test/experimental-content-collections-cache-invalidation.test.js create mode 100644 packages/astro/test/fixtures/content-collections-cache-invalidation/.gitignore create mode 100644 packages/astro/test/fixtures/content-collections-cache-invalidation/astro.config.mjs create mode 100644 packages/astro/test/fixtures/content-collections-cache-invalidation/cache/lockfile-mismatch/content/manifest.json create mode 100644 packages/astro/test/fixtures/content-collections-cache-invalidation/cache/version-mismatch/content/manifest.json create mode 100644 packages/astro/test/fixtures/content-collections-cache-invalidation/package.json create mode 100644 packages/astro/test/fixtures/content-collections-cache-invalidation/src/content/blog/one.md create mode 100644 packages/astro/test/fixtures/content-collections-cache-invalidation/src/content/config.ts create mode 100644 packages/astro/test/fixtures/content-collections-cache-invalidation/src/pages/index.astro diff --git a/.changeset/metal-terms-push.md b/.changeset/metal-terms-push.md new file mode 100644 index 0000000000..d9cbf378b3 --- /dev/null +++ b/.changeset/metal-terms-push.md @@ -0,0 +1,5 @@ +--- +"astro": patch +--- + +Invalidate CC cache manifest when lockfile or config changes diff --git a/packages/astro/src/@types/astro.ts b/packages/astro/src/@types/astro.ts index 21630ec1e2..52bf7d397c 100644 --- a/packages/astro/src/@types/astro.ts +++ b/packages/astro/src/@types/astro.ts @@ -2779,6 +2779,7 @@ export interface AstroIntegration { dir: URL; routes: RouteData[]; logger: AstroIntegrationLogger; + cacheManifest: boolean; }) => void | Promise; }; } diff --git a/packages/astro/src/core/build/consts.ts b/packages/astro/src/core/build/consts.ts new file mode 100644 index 0000000000..bf3162fc4b --- /dev/null +++ b/packages/astro/src/core/build/consts.ts @@ -0,0 +1 @@ +export const CHUNKS_PATH = 'chunks/'; diff --git a/packages/astro/src/core/build/index.ts b/packages/astro/src/core/build/index.ts index d77e69fd27..2b71feaf9a 100644 --- a/packages/astro/src/core/build/index.ts +++ b/packages/astro/src/core/build/index.ts @@ -218,6 +218,7 @@ class AstroBuilder { .flat() .map((pageData) => pageData.route), logging: this.logger, + cacheManifest: internals.cacheManifestUsed, }); if (this.logger.level && levels[this.logger.level()] <= levels['info']) { diff --git a/packages/astro/src/core/build/internal.ts b/packages/astro/src/core/build/internal.ts index c2c53df11f..a5e4566271 100644 --- a/packages/astro/src/core/build/internal.ts +++ b/packages/astro/src/core/build/internal.ts @@ -89,6 +89,7 @@ export interface BuildInternals { discoveredScripts: Set; cachedClientEntries: string[]; + cacheManifestUsed: boolean; propagatedStylesMap: Map>; propagatedScriptsMap: Map>; @@ -140,6 +141,7 @@ export function createBuildInternals(): BuildInternals { componentMetadata: new Map(), ssrSplitEntryChunks: new Map(), entryPoints: new Map(), + cacheManifestUsed: false, }; } diff --git a/packages/astro/src/core/build/plugins/plugin-content.ts b/packages/astro/src/core/build/plugins/plugin-content.ts index f9c9ba7e4b..ce11359d83 100644 --- a/packages/astro/src/core/build/plugins/plugin-content.ts +++ b/packages/astro/src/core/build/plugins/plugin-content.ts @@ -3,6 +3,7 @@ import fsMod from 'node:fs'; import { fileURLToPath } from 'node:url'; import pLimit from 'p-limit'; import { type Plugin as VitePlugin, normalizePath } from 'vite'; +import { configPaths } from '../../config/index.js'; import { CONTENT_RENDER_FLAG, PROPAGATED_ASSET_FLAG } from '../../../content/consts.js'; import { type ContentLookupMap, hasContentFlag } from '../../../content/utils.js'; import { @@ -10,7 +11,7 @@ import { generateLookupMap, } from '../../../content/vite-plugin-content-virtual-mod.js'; import { isServerLikeOutput } from '../../../prerender/utils.js'; -import { joinPaths, removeFileExtension, removeLeadingForwardSlash } from '../../path.js'; +import { joinPaths, removeFileExtension, removeLeadingForwardSlash, appendForwardSlash } from '../../path.js'; import { addRollupInput } from '../add-rollup-input.js'; import { type BuildInternals } from '../internal.js'; import type { AstroBuildPlugin } from '../plugin.js'; @@ -18,12 +19,14 @@ import { copyFiles } from '../static-build.js'; import type { StaticBuildOptions } from '../types.js'; import { encodeName } from '../util.js'; import { extendManualChunks } from './util.js'; +import { emptyDir } from '../../fs/index.js'; +import { CHUNKS_PATH } from '../consts.js'; const CONTENT_CACHE_DIR = './content/'; const CONTENT_MANIFEST_FILE = './manifest.json'; // IMPORTANT: Update this version when making significant changes to the manifest format. // Only manifests generated with the same version number can be compared. -const CONTENT_MANIFEST_VERSION = 0; +const CONTENT_MANIFEST_VERSION = 1; interface ContentManifestKey { collection: string; @@ -39,40 +42,44 @@ interface ContentManifest { // Tracks components that should be passed to the client build // When the cache is restored, these might no longer be referenced clientEntries: string[]; + // Hash of the lockfiles, pnpm-lock.yaml, package-lock.json, etc. + // Kept so that installing new packages results in a full rebuild. + lockfiles: string; + // Hash of the Astro config. Changing options results in invalidating the cache. + configs: string; } const virtualEmptyModuleId = `virtual:empty-content`; const resolvedVirtualEmptyModuleId = `\0${virtualEmptyModuleId}`; +const NO_MANIFEST_VERSION = -1 as const; function createContentManifest(): ContentManifest { - return { version: -1, entries: [], serverEntries: [], clientEntries: [] }; + return { version: NO_MANIFEST_VERSION, entries: [], serverEntries: [], clientEntries: [], lockfiles: "", configs: "" }; } function vitePluginContent( opts: StaticBuildOptions, lookupMap: ContentLookupMap, - internals: BuildInternals + internals: BuildInternals, + cachedBuildOutput: Array<{ cached: URL; dist: URL; }> ): VitePlugin { const { config } = opts.settings; const { cacheDir } = config; const distRoot = config.outDir; const distContentRoot = new URL('./content/', distRoot); - const cachedChunks = new URL('./chunks/', opts.settings.config.cacheDir); - const distChunks = new URL('./chunks/', opts.settings.config.outDir); const contentCacheDir = new URL(CONTENT_CACHE_DIR, cacheDir); const contentManifestFile = new URL(CONTENT_MANIFEST_FILE, contentCacheDir); - const cache = contentCacheDir; - const cacheTmp = new URL('./.tmp/', cache); + const cacheTmp = new URL('./.tmp/', contentCacheDir); let oldManifest = createContentManifest(); let newManifest = createContentManifest(); let entries: ContentEntries; let injectedEmptyFile = false; + let currentManifestState: ReturnType = 'valid'; if (fsMod.existsSync(contentManifestFile)) { try { const data = fsMod.readFileSync(contentManifestFile, { encoding: 'utf8' }); oldManifest = JSON.parse(data); - internals.cachedClientEntries = oldManifest.clientEntries; } catch {} } @@ -84,6 +91,32 @@ function vitePluginContent( newManifest = await generateContentManifest(opts, lookupMap); entries = getEntriesFromManifests(oldManifest, newManifest); + // If the manifest is valid, use the cached client entries as nothing has changed + currentManifestState = manifestState(oldManifest, newManifest); + if(currentManifestState === 'valid') { + internals.cachedClientEntries = oldManifest.clientEntries; + } else { + let logReason = ''; + switch(currentManifestState) { + case 'config-mismatch': + logReason = 'Astro config has changed'; + break; + case 'lockfile-mismatch': + logReason = 'Lockfiles have changed'; + break; + case 'no-entries': + logReason = 'No content collections entries cached'; + break; + case 'version-mismatch': + logReason = 'The cache manifest version has changed'; + break; + case 'no-manifest': + logReason = 'No content manifest was found in the cache'; + break; + } + opts.logger.info('build', `Cache invalid, rebuilding from source. Reason: ${logReason}.`); + } + // Of the cached entries, these ones need to be rebuilt for (const { type, entry } of entries.buildFromSource) { const fileURL = encodeURI(joinPaths(opts.settings.config.root.toString(), entry)); @@ -96,10 +129,18 @@ function vitePluginContent( } newOptions = addRollupInput(newOptions, inputs); } - // Restores cached chunks from the previous build - if (fsMod.existsSync(cachedChunks)) { - await copyFiles(cachedChunks, distChunks, true); + + // Restores cached chunks and assets from the previous build + // If the manifest state is not valid then it needs to rebuild everything + // so don't do that in this case. + if(currentManifestState === 'valid') { + for(const { cached, dist } of cachedBuildOutput) { + if (fsMod.existsSync(cached)) { + await copyFiles(cached, dist, true); + } + } } + // If nothing needs to be rebuilt, we inject a fake entrypoint to appease Rollup if (entries.buildFromSource.length === 0) { newOptions = addRollupInput(newOptions, [virtualEmptyModuleId]); @@ -199,16 +240,20 @@ function vitePluginContent( ]); newManifest.serverEntries = Array.from(serverComponents); newManifest.clientEntries = Array.from(clientComponents); + + const cacheExists = fsMod.existsSync(contentCacheDir); + // If the manifest is invalid, empty the cache so that we can create a new one. + if(cacheExists && currentManifestState !== 'valid') { + emptyDir(contentCacheDir); + } + await fsMod.promises.mkdir(contentCacheDir, { recursive: true }); await fsMod.promises.writeFile(contentManifestFile, JSON.stringify(newManifest), { encoding: 'utf8', }); - - const cacheExists = fsMod.existsSync(cache); - fsMod.mkdirSync(cache, { recursive: true }); await fsMod.promises.mkdir(cacheTmp, { recursive: true }); await copyFiles(distContentRoot, cacheTmp, true); - if (cacheExists) { + if (cacheExists && currentManifestState === 'valid') { await copyFiles(contentCacheDir, distContentRoot, false); } await copyFiles(cacheTmp, contentCacheDir); @@ -242,12 +287,12 @@ function getEntriesFromManifests( oldManifest: ContentManifest, newManifest: ContentManifest ): ContentEntries { - const { version: oldVersion, entries: oldEntries } = oldManifest; - const { version: newVersion, entries: newEntries } = newManifest; + const { entries: oldEntries } = oldManifest; + const { entries: newEntries } = newManifest; let entries: ContentEntries = { restoreFromCache: [], buildFromSource: [] }; const newEntryMap = new Map(newEntries); - if (oldVersion !== newVersion || oldEntries.length === 0) { + if (manifestState(oldManifest, newManifest) !== 'valid') { entries.buildFromSource = Array.from(newEntryMap.keys()); return entries; } @@ -265,16 +310,37 @@ function getEntriesFromManifests( return entries; } +type ManifestState = 'valid' | 'no-manifest' | 'version-mismatch' | 'no-entries' | 'lockfile-mismatch' | 'config-mismatch'; + +function manifestState(oldManifest: ContentManifest, newManifest: ContentManifest): ManifestState { + // There isn't an existing manifest. + if(oldManifest.version === NO_MANIFEST_VERSION) { + return 'no-manifest'; + } + // Version mismatch, always invalid + if (oldManifest.version !== newManifest.version) { + return 'version-mismatch'; + } + if(oldManifest.entries.length === 0) { + return 'no-entries'; + } + // Lockfiles have changed or there is no lockfile at all. + if((oldManifest.lockfiles !== newManifest.lockfiles) || newManifest.lockfiles === '') { + return 'lockfile-mismatch'; + } + // Config has changed. + if(oldManifest.configs !== newManifest.configs) { + return 'config-mismatch'; + } + return 'valid'; +} + async function generateContentManifest( opts: StaticBuildOptions, lookupMap: ContentLookupMap ): Promise { - let manifest: ContentManifest = { - version: CONTENT_MANIFEST_VERSION, - entries: [], - serverEntries: [], - clientEntries: [], - }; + let manifest = createContentManifest(); + manifest.version = CONTENT_MANIFEST_VERSION; const limit = pLimit(10); const promises: Promise[] = []; @@ -290,13 +356,63 @@ async function generateContentManifest( ); } } + + const [lockfiles, configs] = await Promise.all([ + lockfilesHash(opts.settings.config.root), + configHash(opts.settings.config.root) + ]); + + manifest.lockfiles = lockfiles; + manifest.configs = configs; await Promise.all(promises); return manifest; } -function checksum(data: string): string { - return createHash('sha1').update(data).digest('base64'); +async function pushBufferInto(fileURL: URL, buffers: Uint8Array[]) { + try { + const handle = await fsMod.promises.open(fileURL, 'r'); + const data = await handle.readFile(); + buffers.push(data); + await handle.close(); + } catch { + // File doesn't exist, ignore + } +} + +async function lockfilesHash(root: URL) { + // Order is important so don't change this. + const lockfiles = ['package-lock.json', 'pnpm-lock.yaml', 'yarn.lock', 'bun.lockb']; + const datas: Uint8Array[] = []; + const promises: Promise[] = []; + for(const lockfileName of lockfiles) { + const fileURL = new URL(`./${lockfileName}`, root); + promises.push(pushBufferInto(fileURL, datas)); + } + await Promise.all(promises); + return checksum(...datas); +} + +async function configHash(root: URL) { + const configFileNames = configPaths; + for(const configPath of configFileNames) { + try { + const fileURL = new URL(`./${configPath}`, root); + const data = await fsMod.promises.readFile(fileURL); + const hash = checksum(data); + return hash; + } catch { + // File doesn't exist + } + } + // No config file, still create a hash since we can compare nothing against nothing. + return checksum(`export default {}`); +} + +function checksum(...datas: string[] | Uint8Array[]): string { + const hash = createHash('sha1'); + datas.forEach(data => hash.update(data)); + return hash.digest('base64'); } function collectionTypeToFlag(type: 'content' | 'data') { @@ -308,8 +424,15 @@ export function pluginContent( opts: StaticBuildOptions, internals: BuildInternals ): AstroBuildPlugin { - const cachedChunks = new URL('./chunks/', opts.settings.config.cacheDir); - const distChunks = new URL('./chunks/', opts.settings.config.outDir); + const { cacheDir, outDir } = opts.settings.config; + + const chunksFolder = './' + CHUNKS_PATH; + const assetsFolder = './' + appendForwardSlash(opts.settings.config.build.assets); + // These are build output that is kept in the cache. + const cachedBuildOutput = [ + { cached: new URL(chunksFolder, cacheDir), dist: new URL(chunksFolder, outDir) }, + { cached: new URL(assetsFolder, cacheDir), dist: new URL(assetsFolder, outDir) }, + ]; return { targets: ['server'], @@ -321,10 +444,9 @@ export function pluginContent( if (isServerLikeOutput(opts.settings.config)) { return { vitePlugin: undefined }; } - const lookupMap = await generateLookupMap({ settings: opts.settings, fs: fsMod }); return { - vitePlugin: vitePluginContent(opts, lookupMap, internals), + vitePlugin: vitePluginContent(opts, lookupMap, internals, cachedBuildOutput), }; }, @@ -335,8 +457,11 @@ export function pluginContent( if (isServerLikeOutput(opts.settings.config)) { return; } - if (fsMod.existsSync(distChunks)) { - await copyFiles(distChunks, cachedChunks, true); + // Cache build output of chunks and assets + for(const { cached, dist } of cachedBuildOutput) { + if (fsMod.existsSync(dist)) { + await copyFiles(dist, cached, true); + } } }, }, diff --git a/packages/astro/src/core/build/static-build.ts b/packages/astro/src/core/build/static-build.ts index 5eebc5429e..ede0e36e35 100644 --- a/packages/astro/src/core/build/static-build.ts +++ b/packages/astro/src/core/build/static-build.ts @@ -34,6 +34,7 @@ import { RESOLVED_SPLIT_MODULE_ID, RESOLVED_SSR_VIRTUAL_MODULE_ID } from './plug import { ASTRO_PAGE_EXTENSION_POST_PATTERN } from './plugins/util.js'; import type { StaticBuildOptions } from './types.js'; import { encodeName, getTimeStat, viteBuildReturnToRollupOutputs } from './util.js'; +import { CHUNKS_PATH } from './consts.js'; export async function viteBuild(opts: StaticBuildOptions) { const { allPages, settings } = opts; @@ -196,7 +197,7 @@ async function ssrBuild( // We need to keep these separate chunkFileNames(chunkInfo) { const { name } = chunkInfo; - let prefix = 'chunks/'; + let prefix = CHUNKS_PATH; let suffix = '_[hash].mjs'; if (isContentCache) { @@ -454,7 +455,7 @@ export async function copyFiles(fromFolder: URL, toFolder: URL, includeDotfiles dot: includeDotfiles, }); if (files.length === 0) return; - await Promise.all( + return await Promise.all( files.map(async function copyFile(filename) { const from = new URL(filename, fromFolder); const to = new URL(filename, toFolder); diff --git a/packages/astro/src/core/config/config.ts b/packages/astro/src/core/config/config.ts index f4ce117201..5bb2eda772 100644 --- a/packages/astro/src/core/config/config.ts +++ b/packages/astro/src/core/config/config.ts @@ -78,15 +78,19 @@ export function resolveRoot(cwd?: string | URL): string { return cwd ? path.resolve(cwd) : process.cwd(); } +// Config paths to search for. In order of likely appearance +// to speed up the check. +export const configPaths = Object.freeze([ + 'astro.config.mjs', + 'astro.config.js', + 'astro.config.ts', + 'astro.config.mts', + 'astro.config.cjs', + 'astro.config.cts', +]); + async function search(fsMod: typeof fs, root: string) { - const paths = [ - 'astro.config.mjs', - 'astro.config.js', - 'astro.config.ts', - 'astro.config.mts', - 'astro.config.cjs', - 'astro.config.cts', - ].map((p) => path.join(root, p)); + const paths = configPaths.map((p) => path.join(root, p)); for (const file of paths) { if (fsMod.existsSync(file)) { diff --git a/packages/astro/src/core/config/index.ts b/packages/astro/src/core/config/index.ts index 4bb1f05378..0f697ddd60 100644 --- a/packages/astro/src/core/config/index.ts +++ b/packages/astro/src/core/config/index.ts @@ -1,4 +1,4 @@ -export { resolveConfig, resolveConfigPath, resolveFlags, resolveRoot } from './config.js'; +export { configPaths, resolveConfig, resolveConfigPath, resolveFlags, resolveRoot } from './config.js'; export { createNodeLogger } from './logging.js'; export { mergeConfig } from './merge.js'; export type { AstroConfigType } from './schema.js'; diff --git a/packages/astro/src/integrations/index.ts b/packages/astro/src/integrations/index.ts index 88072b20dd..7603f24a60 100644 --- a/packages/astro/src/integrations/index.ts +++ b/packages/astro/src/integrations/index.ts @@ -477,9 +477,10 @@ type RunHookBuildDone = { pages: string[]; routes: RouteData[]; logging: Logger; + cacheManifest: boolean; }; -export async function runHookBuildDone({ config, pages, routes, logging }: RunHookBuildDone) { +export async function runHookBuildDone({ config, pages, routes, logging, cacheManifest }: RunHookBuildDone) { const dir = isServerLikeOutput(config) ? config.build.client : config.outDir; await fs.promises.mkdir(dir, { recursive: true }); @@ -495,6 +496,7 @@ export async function runHookBuildDone({ config, pages, routes, logging }: RunHo dir, routes, logger, + cacheManifest, }), logger: logging, }); diff --git a/packages/astro/src/vite-plugin-astro/index.ts b/packages/astro/src/vite-plugin-astro/index.ts index 2f4e256b76..c33f5dd0c7 100644 --- a/packages/astro/src/vite-plugin-astro/index.ts +++ b/packages/astro/src/vite-plugin-astro/index.ts @@ -89,12 +89,22 @@ export default function astro({ settings, logger }: AstroPluginOptions): vite.Pl // modules are compiled first, then its virtual modules. const filename = normalizePath(normalizeFilename(parsedId.filename, config.root)); let compileMetadata = astroFileToCompileMetadata.get(filename); - // If `compileMetadata` doesn't exist in dev, that means the virtual module may have been invalidated. - // We try to re-compile the main Astro module (`filename`) first before retrieving the metadata again. - if (!compileMetadata && server) { - const code = await loadId(server.pluginContainer, filename); - // `compile` should re-set `filename` in `astroFileToCompileMetadata` - if (code != null) await compile(code, filename); + if (!compileMetadata) { + // If `compileMetadata` doesn't exist in dev, that means the virtual module may have been invalidated. + // We try to re-compile the main Astro module (`filename`) first before retrieving the metadata again. + if(server) { + const code = await loadId(server.pluginContainer, filename); + // `compile` should re-set `filename` in `astroFileToCompileMetadata` + if (code != null) await compile(code, filename); + } + // When cached we might load client-side scripts during the build + else if(config.experimental.contentCollectionCache) { + await this.load({ + id: filename, + resolveDependencies: false, + }); + } + compileMetadata = astroFileToCompileMetadata.get(filename); } // If the metadata still doesn't exist, that means the virtual modules are somehow compiled first, diff --git a/packages/astro/test/experimental-content-collections-cache-invalidation.test.js b/packages/astro/test/experimental-content-collections-cache-invalidation.test.js new file mode 100644 index 0000000000..5ec688a91b --- /dev/null +++ b/packages/astro/test/experimental-content-collections-cache-invalidation.test.js @@ -0,0 +1,98 @@ +import assert from 'node:assert/strict'; +import { after, before, describe, it } from 'node:test'; +import { loadFixture } from './test-utils.js'; +import fs from 'node:fs'; +import { copyFiles } from '../dist/core/build/static-build.js'; + +describe('Experimental Content Collections cache - invalidation', () => { + class CacheBackup { + constructor(root, relCacheDir) { + this.root = new URL(root, import.meta.url); + this.cacheDir = new URL(relCacheDir, this.root); + this.tmpDir = new URL(`./tmp` + relCacheDir.slice(1), this.root); + } + backup() { + this.rmTmp(); + copyFiles(this.cacheDir, this.tmpDir); + } + restore() { + fs.rmSync(this.cacheDir, { recursive: true }); + copyFiles(this.tmpDir, this.cacheDir); + } + rmTmp() { + fs.rmSync(this.tmpDir, { force: true, recursive: true }); + } + } + + class ManifestTestPlugin { + used = false; + plugin() { + return { + name: '@test/manifest-used', + hooks: { + 'astro:build:done': ({ cacheManifest }) => { + this.used = cacheManifest; + } + } + } + } + } + + describe('manifest version', () => { + let fixture, backup, + /** @type {ManifestTestPlugin} */ + testPlugin; + before(async () => { + testPlugin = new ManifestTestPlugin(); + fixture = await loadFixture({ + root: './fixtures/content-collections-cache-invalidation/', + cacheDir: './cache/version-mismatch/', + experimental: { contentCollectionCache: true }, + integrations: [ + testPlugin.plugin() + ] + }); + backup = new CacheBackup('./fixtures/content-collections-cache-invalidation/', './cache/version-mismatch/'); + backup.backup(); + await fixture.build(); + }); + + after(async () => { + backup.restore(); + //await fixture.clean(); + }); + + it('Manifest was not used', () => { + assert.equal(testPlugin.used, false, 'manifest not used because of version mismatch'); + }); + }); + + describe('lockfiles', () => { + let fixture, backup, + /** @type {ManifestTestPlugin} */ + testPlugin; + before(async () => { + testPlugin = new ManifestTestPlugin(); + fixture = await loadFixture({ + root: './fixtures/content-collections-cache-invalidation/', + cacheDir: './cache/lockfile-mismatch/', + experimental: { contentCollectionCache: true }, + integrations: [ + testPlugin.plugin() + ] + }); + backup = new CacheBackup('./fixtures/content-collections-cache-invalidation/', './cache/lockfile-mismatch/'); + backup.backup(); + await fixture.build(); + }); + + after(async () => { + backup.restore(); + //await fixture.clean(); + }); + + it('Manifest was not used', () => { + assert.equal(testPlugin.used, false, 'manifest not used because of lockfile mismatch'); + }); + }); +}); diff --git a/packages/astro/test/fixtures/content-collections-cache-invalidation/.gitignore b/packages/astro/test/fixtures/content-collections-cache-invalidation/.gitignore new file mode 100644 index 0000000000..3fec32c842 --- /dev/null +++ b/packages/astro/test/fixtures/content-collections-cache-invalidation/.gitignore @@ -0,0 +1 @@ +tmp/ diff --git a/packages/astro/test/fixtures/content-collections-cache-invalidation/astro.config.mjs b/packages/astro/test/fixtures/content-collections-cache-invalidation/astro.config.mjs new file mode 100644 index 0000000000..a74151f32b --- /dev/null +++ b/packages/astro/test/fixtures/content-collections-cache-invalidation/astro.config.mjs @@ -0,0 +1,12 @@ +import { defineConfig } from 'astro/config'; + +// https://astro.build/config +export default defineConfig({ + base: '/docs', + compressHTML: false, + vite: { + build: { + assetsInlineLimit: 0, + } + } +}); diff --git a/packages/astro/test/fixtures/content-collections-cache-invalidation/cache/lockfile-mismatch/content/manifest.json b/packages/astro/test/fixtures/content-collections-cache-invalidation/cache/lockfile-mismatch/content/manifest.json new file mode 100644 index 0000000000..6b5f197498 --- /dev/null +++ b/packages/astro/test/fixtures/content-collections-cache-invalidation/cache/lockfile-mismatch/content/manifest.json @@ -0,0 +1 @@ +{"version":1,"entries":[[{"collection":"blog","type":"content","entry":"/src/content/blog/one.md"},"No8AlxYwy8HK3dH9W3Mj/6SeHMI="]],"serverEntries":[],"clientEntries":[],"lockfiles":"2jmj7l5rSw0yVb/vlWAYkK/YBwk=","configs":"h80ch7FwzpG2BXKQM39ZqFpU3dg="} \ No newline at end of file diff --git a/packages/astro/test/fixtures/content-collections-cache-invalidation/cache/version-mismatch/content/manifest.json b/packages/astro/test/fixtures/content-collections-cache-invalidation/cache/version-mismatch/content/manifest.json new file mode 100644 index 0000000000..20a905210d --- /dev/null +++ b/packages/astro/test/fixtures/content-collections-cache-invalidation/cache/version-mismatch/content/manifest.json @@ -0,0 +1 @@ +{"version":1111111,"entries":[[{"collection":"blog","type":"content","entry":"/src/content/blog/one.md"},"No8AlxYwy8HK3dH9W3Mj/6SeHMI="]],"serverEntries":[],"clientEntries":[],"lockfiles":"2jmj7l5rSw0yVb/vlWAYkK/YBwk=","configs":"h80ch7FwzpG2BXKQM39ZqFpU3dg="} diff --git a/packages/astro/test/fixtures/content-collections-cache-invalidation/package.json b/packages/astro/test/fixtures/content-collections-cache-invalidation/package.json new file mode 100644 index 0000000000..865550ef33 --- /dev/null +++ b/packages/astro/test/fixtures/content-collections-cache-invalidation/package.json @@ -0,0 +1,8 @@ +{ + "name": "@test/content-collections-cache-invalidation", + "version": "0.0.0", + "private": true, + "dependencies": { + "astro": "workspace:*" + } +} diff --git a/packages/astro/test/fixtures/content-collections-cache-invalidation/src/content/blog/one.md b/packages/astro/test/fixtures/content-collections-cache-invalidation/src/content/blog/one.md new file mode 100644 index 0000000000..fec6f5277e --- /dev/null +++ b/packages/astro/test/fixtures/content-collections-cache-invalidation/src/content/blog/one.md @@ -0,0 +1,5 @@ +--- +title: One +--- + +Hello world diff --git a/packages/astro/test/fixtures/content-collections-cache-invalidation/src/content/config.ts b/packages/astro/test/fixtures/content-collections-cache-invalidation/src/content/config.ts new file mode 100644 index 0000000000..db96db2eaa --- /dev/null +++ b/packages/astro/test/fixtures/content-collections-cache-invalidation/src/content/config.ts @@ -0,0 +1,10 @@ +import { defineCollection, z } from 'astro:content'; + +const blog = defineCollection({ + type: 'collection', + schema: z.object({ + title: z.string() + }) +}); + +export const collections = { blog }; diff --git a/packages/astro/test/fixtures/content-collections-cache-invalidation/src/pages/index.astro b/packages/astro/test/fixtures/content-collections-cache-invalidation/src/pages/index.astro new file mode 100644 index 0000000000..e06d49b853 --- /dev/null +++ b/packages/astro/test/fixtures/content-collections-cache-invalidation/src/pages/index.astro @@ -0,0 +1,10 @@ +--- +--- + + + Testing + + +

Testing

+ + diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8b81958b2d..95d3b4649a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2466,6 +2466,12 @@ importers: specifier: workspace:* version: link:../../.. + packages/astro/test/fixtures/content-collections-cache-invalidation: + dependencies: + astro: + specifier: workspace:* + version: link:../../.. + packages/astro/test/fixtures/content-collections-empty-dir: dependencies: astro: From 6561af9def95542a2cf302fc204cdb0c8e0a6b21 Mon Sep 17 00:00:00 2001 From: Matthew Phillips Date: Thu, 18 Apr 2024 15:24:04 +0000 Subject: [PATCH 25/36] [ci] format --- .../src/core/build/plugins/plugin-content.ts | 62 ++++++++++++------- packages/astro/src/core/build/static-build.ts | 2 +- packages/astro/src/core/config/index.ts | 8 ++- packages/astro/src/integrations/index.ts | 8 ++- packages/astro/src/vite-plugin-astro/index.ts | 4 +- ...ent-collections-cache-invalidation.test.js | 42 +++++++------ 6 files changed, 80 insertions(+), 46 deletions(-) diff --git a/packages/astro/src/core/build/plugins/plugin-content.ts b/packages/astro/src/core/build/plugins/plugin-content.ts index ce11359d83..24512f8ebc 100644 --- a/packages/astro/src/core/build/plugins/plugin-content.ts +++ b/packages/astro/src/core/build/plugins/plugin-content.ts @@ -3,7 +3,6 @@ import fsMod from 'node:fs'; import { fileURLToPath } from 'node:url'; import pLimit from 'p-limit'; import { type Plugin as VitePlugin, normalizePath } from 'vite'; -import { configPaths } from '../../config/index.js'; import { CONTENT_RENDER_FLAG, PROPAGATED_ASSET_FLAG } from '../../../content/consts.js'; import { type ContentLookupMap, hasContentFlag } from '../../../content/utils.js'; import { @@ -11,16 +10,22 @@ import { generateLookupMap, } from '../../../content/vite-plugin-content-virtual-mod.js'; import { isServerLikeOutput } from '../../../prerender/utils.js'; -import { joinPaths, removeFileExtension, removeLeadingForwardSlash, appendForwardSlash } from '../../path.js'; +import { configPaths } from '../../config/index.js'; +import { emptyDir } from '../../fs/index.js'; +import { + appendForwardSlash, + joinPaths, + removeFileExtension, + removeLeadingForwardSlash, +} from '../../path.js'; import { addRollupInput } from '../add-rollup-input.js'; +import { CHUNKS_PATH } from '../consts.js'; import { type BuildInternals } from '../internal.js'; import type { AstroBuildPlugin } from '../plugin.js'; import { copyFiles } from '../static-build.js'; import type { StaticBuildOptions } from '../types.js'; import { encodeName } from '../util.js'; import { extendManualChunks } from './util.js'; -import { emptyDir } from '../../fs/index.js'; -import { CHUNKS_PATH } from '../consts.js'; const CONTENT_CACHE_DIR = './content/'; const CONTENT_MANIFEST_FILE = './manifest.json'; @@ -54,14 +59,21 @@ const resolvedVirtualEmptyModuleId = `\0${virtualEmptyModuleId}`; const NO_MANIFEST_VERSION = -1 as const; function createContentManifest(): ContentManifest { - return { version: NO_MANIFEST_VERSION, entries: [], serverEntries: [], clientEntries: [], lockfiles: "", configs: "" }; + return { + version: NO_MANIFEST_VERSION, + entries: [], + serverEntries: [], + clientEntries: [], + lockfiles: '', + configs: '', + }; } function vitePluginContent( opts: StaticBuildOptions, lookupMap: ContentLookupMap, internals: BuildInternals, - cachedBuildOutput: Array<{ cached: URL; dist: URL; }> + cachedBuildOutput: Array<{ cached: URL; dist: URL }> ): VitePlugin { const { config } = opts.settings; const { cacheDir } = config; @@ -93,11 +105,11 @@ function vitePluginContent( // If the manifest is valid, use the cached client entries as nothing has changed currentManifestState = manifestState(oldManifest, newManifest); - if(currentManifestState === 'valid') { + if (currentManifestState === 'valid') { internals.cachedClientEntries = oldManifest.clientEntries; } else { let logReason = ''; - switch(currentManifestState) { + switch (currentManifestState) { case 'config-mismatch': logReason = 'Astro config has changed'; break; @@ -133,8 +145,8 @@ function vitePluginContent( // Restores cached chunks and assets from the previous build // If the manifest state is not valid then it needs to rebuild everything // so don't do that in this case. - if(currentManifestState === 'valid') { - for(const { cached, dist } of cachedBuildOutput) { + if (currentManifestState === 'valid') { + for (const { cached, dist } of cachedBuildOutput) { if (fsMod.existsSync(cached)) { await copyFiles(cached, dist, true); } @@ -243,7 +255,7 @@ function vitePluginContent( const cacheExists = fsMod.existsSync(contentCacheDir); // If the manifest is invalid, empty the cache so that we can create a new one. - if(cacheExists && currentManifestState !== 'valid') { + if (cacheExists && currentManifestState !== 'valid') { emptyDir(contentCacheDir); } @@ -310,26 +322,32 @@ function getEntriesFromManifests( return entries; } -type ManifestState = 'valid' | 'no-manifest' | 'version-mismatch' | 'no-entries' | 'lockfile-mismatch' | 'config-mismatch'; +type ManifestState = + | 'valid' + | 'no-manifest' + | 'version-mismatch' + | 'no-entries' + | 'lockfile-mismatch' + | 'config-mismatch'; function manifestState(oldManifest: ContentManifest, newManifest: ContentManifest): ManifestState { // There isn't an existing manifest. - if(oldManifest.version === NO_MANIFEST_VERSION) { + if (oldManifest.version === NO_MANIFEST_VERSION) { return 'no-manifest'; } // Version mismatch, always invalid if (oldManifest.version !== newManifest.version) { return 'version-mismatch'; } - if(oldManifest.entries.length === 0) { + if (oldManifest.entries.length === 0) { return 'no-entries'; } // Lockfiles have changed or there is no lockfile at all. - if((oldManifest.lockfiles !== newManifest.lockfiles) || newManifest.lockfiles === '') { + if (oldManifest.lockfiles !== newManifest.lockfiles || newManifest.lockfiles === '') { return 'lockfile-mismatch'; } // Config has changed. - if(oldManifest.configs !== newManifest.configs) { + if (oldManifest.configs !== newManifest.configs) { return 'config-mismatch'; } return 'valid'; @@ -356,10 +374,10 @@ async function generateContentManifest( ); } } - + const [lockfiles, configs] = await Promise.all([ lockfilesHash(opts.settings.config.root), - configHash(opts.settings.config.root) + configHash(opts.settings.config.root), ]); manifest.lockfiles = lockfiles; @@ -385,7 +403,7 @@ async function lockfilesHash(root: URL) { const lockfiles = ['package-lock.json', 'pnpm-lock.yaml', 'yarn.lock', 'bun.lockb']; const datas: Uint8Array[] = []; const promises: Promise[] = []; - for(const lockfileName of lockfiles) { + for (const lockfileName of lockfiles) { const fileURL = new URL(`./${lockfileName}`, root); promises.push(pushBufferInto(fileURL, datas)); } @@ -395,7 +413,7 @@ async function lockfilesHash(root: URL) { async function configHash(root: URL) { const configFileNames = configPaths; - for(const configPath of configFileNames) { + for (const configPath of configFileNames) { try { const fileURL = new URL(`./${configPath}`, root); const data = await fsMod.promises.readFile(fileURL); @@ -411,7 +429,7 @@ async function configHash(root: URL) { function checksum(...datas: string[] | Uint8Array[]): string { const hash = createHash('sha1'); - datas.forEach(data => hash.update(data)); + datas.forEach((data) => hash.update(data)); return hash.digest('base64'); } @@ -458,7 +476,7 @@ export function pluginContent( return; } // Cache build output of chunks and assets - for(const { cached, dist } of cachedBuildOutput) { + for (const { cached, dist } of cachedBuildOutput) { if (fsMod.existsSync(dist)) { await copyFiles(dist, cached, true); } diff --git a/packages/astro/src/core/build/static-build.ts b/packages/astro/src/core/build/static-build.ts index ede0e36e35..cdd24e1c00 100644 --- a/packages/astro/src/core/build/static-build.ts +++ b/packages/astro/src/core/build/static-build.ts @@ -23,6 +23,7 @@ import { PAGE_SCRIPT_ID } from '../../vite-plugin-scripts/index.js'; import { AstroError, AstroErrorData } from '../errors/index.js'; import { routeIsRedirect } from '../redirects/index.js'; import { getOutDirWithinCwd } from './common.js'; +import { CHUNKS_PATH } from './consts.js'; import { generatePages } from './generate.js'; import { trackPageData } from './internal.js'; import { type AstroBuildPluginContainer, createPluginContainer } from './plugin.js'; @@ -34,7 +35,6 @@ import { RESOLVED_SPLIT_MODULE_ID, RESOLVED_SSR_VIRTUAL_MODULE_ID } from './plug import { ASTRO_PAGE_EXTENSION_POST_PATTERN } from './plugins/util.js'; import type { StaticBuildOptions } from './types.js'; import { encodeName, getTimeStat, viteBuildReturnToRollupOutputs } from './util.js'; -import { CHUNKS_PATH } from './consts.js'; export async function viteBuild(opts: StaticBuildOptions) { const { allPages, settings } = opts; diff --git a/packages/astro/src/core/config/index.ts b/packages/astro/src/core/config/index.ts index 0f697ddd60..3beaa56635 100644 --- a/packages/astro/src/core/config/index.ts +++ b/packages/astro/src/core/config/index.ts @@ -1,4 +1,10 @@ -export { configPaths, resolveConfig, resolveConfigPath, resolveFlags, resolveRoot } from './config.js'; +export { + configPaths, + resolveConfig, + resolveConfigPath, + resolveFlags, + resolveRoot, +} from './config.js'; export { createNodeLogger } from './logging.js'; export { mergeConfig } from './merge.js'; export type { AstroConfigType } from './schema.js'; diff --git a/packages/astro/src/integrations/index.ts b/packages/astro/src/integrations/index.ts index 7603f24a60..81901737e9 100644 --- a/packages/astro/src/integrations/index.ts +++ b/packages/astro/src/integrations/index.ts @@ -480,7 +480,13 @@ type RunHookBuildDone = { cacheManifest: boolean; }; -export async function runHookBuildDone({ config, pages, routes, logging, cacheManifest }: RunHookBuildDone) { +export async function runHookBuildDone({ + config, + pages, + routes, + logging, + cacheManifest, +}: RunHookBuildDone) { const dir = isServerLikeOutput(config) ? config.build.client : config.outDir; await fs.promises.mkdir(dir, { recursive: true }); diff --git a/packages/astro/src/vite-plugin-astro/index.ts b/packages/astro/src/vite-plugin-astro/index.ts index c33f5dd0c7..9d6367b99d 100644 --- a/packages/astro/src/vite-plugin-astro/index.ts +++ b/packages/astro/src/vite-plugin-astro/index.ts @@ -92,13 +92,13 @@ export default function astro({ settings, logger }: AstroPluginOptions): vite.Pl if (!compileMetadata) { // If `compileMetadata` doesn't exist in dev, that means the virtual module may have been invalidated. // We try to re-compile the main Astro module (`filename`) first before retrieving the metadata again. - if(server) { + if (server) { const code = await loadId(server.pluginContainer, filename); // `compile` should re-set `filename` in `astroFileToCompileMetadata` if (code != null) await compile(code, filename); } // When cached we might load client-side scripts during the build - else if(config.experimental.contentCollectionCache) { + else if (config.experimental.contentCollectionCache) { await this.load({ id: filename, resolveDependencies: false, diff --git a/packages/astro/test/experimental-content-collections-cache-invalidation.test.js b/packages/astro/test/experimental-content-collections-cache-invalidation.test.js index 5ec688a91b..abc8ea8393 100644 --- a/packages/astro/test/experimental-content-collections-cache-invalidation.test.js +++ b/packages/astro/test/experimental-content-collections-cache-invalidation.test.js @@ -1,8 +1,8 @@ import assert from 'node:assert/strict'; -import { after, before, describe, it } from 'node:test'; -import { loadFixture } from './test-utils.js'; import fs from 'node:fs'; +import { after, before, describe, it } from 'node:test'; import { copyFiles } from '../dist/core/build/static-build.js'; +import { loadFixture } from './test-utils.js'; describe('Experimental Content Collections cache - invalidation', () => { class CacheBackup { @@ -32,27 +32,29 @@ describe('Experimental Content Collections cache - invalidation', () => { hooks: { 'astro:build:done': ({ cacheManifest }) => { this.used = cacheManifest; - } - } - } + }, + }, + }; } } describe('manifest version', () => { - let fixture, backup, - /** @type {ManifestTestPlugin} */ - testPlugin; + let fixture, + backup, + /** @type {ManifestTestPlugin} */ + testPlugin; before(async () => { testPlugin = new ManifestTestPlugin(); fixture = await loadFixture({ root: './fixtures/content-collections-cache-invalidation/', cacheDir: './cache/version-mismatch/', experimental: { contentCollectionCache: true }, - integrations: [ - testPlugin.plugin() - ] + integrations: [testPlugin.plugin()], }); - backup = new CacheBackup('./fixtures/content-collections-cache-invalidation/', './cache/version-mismatch/'); + backup = new CacheBackup( + './fixtures/content-collections-cache-invalidation/', + './cache/version-mismatch/' + ); backup.backup(); await fixture.build(); }); @@ -68,20 +70,22 @@ describe('Experimental Content Collections cache - invalidation', () => { }); describe('lockfiles', () => { - let fixture, backup, - /** @type {ManifestTestPlugin} */ - testPlugin; + let fixture, + backup, + /** @type {ManifestTestPlugin} */ + testPlugin; before(async () => { testPlugin = new ManifestTestPlugin(); fixture = await loadFixture({ root: './fixtures/content-collections-cache-invalidation/', cacheDir: './cache/lockfile-mismatch/', experimental: { contentCollectionCache: true }, - integrations: [ - testPlugin.plugin() - ] + integrations: [testPlugin.plugin()], }); - backup = new CacheBackup('./fixtures/content-collections-cache-invalidation/', './cache/lockfile-mismatch/'); + backup = new CacheBackup( + './fixtures/content-collections-cache-invalidation/', + './cache/lockfile-mismatch/' + ); backup.backup(); await fixture.build(); }); From 7fda037b277201b261e53dd0d43a92c5e8f1c638 Mon Sep 17 00:00:00 2001 From: "Houston (Bot)" <108291165+astrobot-houston@users.noreply.github.com> Date: Thu, 18 Apr 2024 08:35:39 -0700 Subject: [PATCH 26/36] [ci] release (#10798) Co-authored-by: github-actions[bot] --- .changeset/few-pets-relax.md | 5 -- .changeset/itchy-donuts-destroy.md | 5 -- .changeset/late-bags-marry.md | 5 -- .changeset/lazy-rats-beam.md | 5 -- .changeset/metal-terms-push.md | 5 -- .changeset/yellow-fishes-occur.md | 5 -- examples/basics/package.json | 2 +- examples/blog/package.json | 4 +- examples/component/package.json | 2 +- examples/framework-alpine/package.json | 2 +- examples/framework-lit/package.json | 2 +- examples/framework-multiple/package.json | 2 +- examples/framework-preact/package.json | 2 +- examples/framework-react/package.json | 2 +- examples/framework-solid/package.json | 2 +- examples/framework-svelte/package.json | 2 +- examples/framework-vue/package.json | 2 +- examples/hackernews/package.json | 2 +- examples/integration/package.json | 2 +- examples/middleware/package.json | 2 +- examples/minimal/package.json | 2 +- examples/non-html-pages/package.json | 2 +- examples/portfolio/package.json | 2 +- examples/ssr/package.json | 2 +- examples/starlog/package.json | 2 +- examples/view-transitions/package.json | 2 +- examples/with-markdoc/package.json | 2 +- examples/with-markdown-plugins/package.json | 2 +- examples/with-markdown-shiki/package.json | 2 +- examples/with-mdx/package.json | 2 +- examples/with-nanostores/package.json | 2 +- examples/with-tailwindcss/package.json | 2 +- examples/with-vitest/package.json | 2 +- packages/astro/CHANGELOG.md | 12 +++++ packages/astro/package.json | 2 +- packages/db/CHANGELOG.md | 6 +++ packages/db/package.json | 2 +- packages/integrations/sitemap/CHANGELOG.md | 6 +++ packages/integrations/sitemap/package.json | 2 +- pnpm-lock.yaml | 56 ++++++++++----------- 40 files changed, 83 insertions(+), 89 deletions(-) delete mode 100644 .changeset/few-pets-relax.md delete mode 100644 .changeset/itchy-donuts-destroy.md delete mode 100644 .changeset/late-bags-marry.md delete mode 100644 .changeset/lazy-rats-beam.md delete mode 100644 .changeset/metal-terms-push.md delete mode 100644 .changeset/yellow-fishes-occur.md diff --git a/.changeset/few-pets-relax.md b/.changeset/few-pets-relax.md deleted file mode 100644 index 7e2682c274..0000000000 --- a/.changeset/few-pets-relax.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@astrojs/db": patch ---- - -Expose the Drizzle `alias` utility from `astro:db` to enable self-joins on a table. diff --git a/.changeset/itchy-donuts-destroy.md b/.changeset/itchy-donuts-destroy.md deleted file mode 100644 index 655b27a265..0000000000 --- a/.changeset/itchy-donuts-destroy.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"astro": patch ---- - -Fixes an issue with persisted non-text input fields that have the focus during view transition navigation. diff --git a/.changeset/late-bags-marry.md b/.changeset/late-bags-marry.md deleted file mode 100644 index af6b4ba3ef..0000000000 --- a/.changeset/late-bags-marry.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@astrojs/sitemap": patch ---- - -Fixes an issue where the root url does not follow the `trailingSlash` config option diff --git a/.changeset/lazy-rats-beam.md b/.changeset/lazy-rats-beam.md deleted file mode 100644 index 66acfe33f2..0000000000 --- a/.changeset/lazy-rats-beam.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"astro": patch ---- - -Improves performance for frequent use of small components. diff --git a/.changeset/metal-terms-push.md b/.changeset/metal-terms-push.md deleted file mode 100644 index d9cbf378b3..0000000000 --- a/.changeset/metal-terms-push.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"astro": patch ---- - -Invalidate CC cache manifest when lockfile or config changes diff --git a/.changeset/yellow-fishes-occur.md b/.changeset/yellow-fishes-occur.md deleted file mode 100644 index 028412e5fc..0000000000 --- a/.changeset/yellow-fishes-occur.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"astro": patch ---- - -Update list of available integrations in the `astro add` CLI help. diff --git a/examples/basics/package.json b/examples/basics/package.json index 5c22341e65..02522acb7a 100644 --- a/examples/basics/package.json +++ b/examples/basics/package.json @@ -11,6 +11,6 @@ "astro": "astro" }, "dependencies": { - "astro": "^4.6.2" + "astro": "^4.6.3" } } diff --git a/examples/blog/package.json b/examples/blog/package.json index afadb4360f..072a6a3317 100644 --- a/examples/blog/package.json +++ b/examples/blog/package.json @@ -13,7 +13,7 @@ "dependencies": { "@astrojs/mdx": "^2.3.1", "@astrojs/rss": "^4.0.5", - "@astrojs/sitemap": "^3.1.3", - "astro": "^4.6.2" + "@astrojs/sitemap": "^3.1.4", + "astro": "^4.6.3" } } diff --git a/examples/component/package.json b/examples/component/package.json index 352bccdfbf..bcfcb66ac8 100644 --- a/examples/component/package.json +++ b/examples/component/package.json @@ -15,7 +15,7 @@ ], "scripts": {}, "devDependencies": { - "astro": "^4.6.2" + "astro": "^4.6.3" }, "peerDependencies": { "astro": "^4.0.0" diff --git a/examples/framework-alpine/package.json b/examples/framework-alpine/package.json index 00708fe304..f6639d87d7 100644 --- a/examples/framework-alpine/package.json +++ b/examples/framework-alpine/package.json @@ -14,6 +14,6 @@ "@astrojs/alpinejs": "^0.4.0", "@types/alpinejs": "^3.13.5", "alpinejs": "^3.13.3", - "astro": "^4.6.2" + "astro": "^4.6.3" } } diff --git a/examples/framework-lit/package.json b/examples/framework-lit/package.json index 6243b58fa8..3c70813b75 100644 --- a/examples/framework-lit/package.json +++ b/examples/framework-lit/package.json @@ -13,7 +13,7 @@ "dependencies": { "@astrojs/lit": "^4.0.1", "@webcomponents/template-shadowroot": "^0.2.1", - "astro": "^4.6.2", + "astro": "^4.6.3", "lit": "^3.1.2" } } diff --git a/examples/framework-multiple/package.json b/examples/framework-multiple/package.json index dabc84475a..b0fd48b55b 100644 --- a/examples/framework-multiple/package.json +++ b/examples/framework-multiple/package.json @@ -18,7 +18,7 @@ "@astrojs/vue": "^4.1.0", "@types/react": "^18.2.37", "@types/react-dom": "^18.2.15", - "astro": "^4.6.2", + "astro": "^4.6.3", "preact": "^10.19.2", "react": "^18.2.0", "react-dom": "^18.2.0", diff --git a/examples/framework-preact/package.json b/examples/framework-preact/package.json index 993a445a2b..657eaf8bb5 100644 --- a/examples/framework-preact/package.json +++ b/examples/framework-preact/package.json @@ -13,7 +13,7 @@ "dependencies": { "@astrojs/preact": "^3.2.0", "@preact/signals": "^1.2.1", - "astro": "^4.6.2", + "astro": "^4.6.3", "preact": "^10.19.2" } } diff --git a/examples/framework-react/package.json b/examples/framework-react/package.json index b0eb38cb6b..b96a70e073 100644 --- a/examples/framework-react/package.json +++ b/examples/framework-react/package.json @@ -14,7 +14,7 @@ "@astrojs/react": "^3.3.0", "@types/react": "^18.2.37", "@types/react-dom": "^18.2.15", - "astro": "^4.6.2", + "astro": "^4.6.3", "react": "^18.2.0", "react-dom": "^18.2.0" } diff --git a/examples/framework-solid/package.json b/examples/framework-solid/package.json index e9709aec35..410555d9f6 100644 --- a/examples/framework-solid/package.json +++ b/examples/framework-solid/package.json @@ -12,7 +12,7 @@ }, "dependencies": { "@astrojs/solid-js": "^4.1.0", - "astro": "^4.6.2", + "astro": "^4.6.3", "solid-js": "^1.8.5" } } diff --git a/examples/framework-svelte/package.json b/examples/framework-svelte/package.json index a3aef84631..9a37664b2e 100644 --- a/examples/framework-svelte/package.json +++ b/examples/framework-svelte/package.json @@ -12,7 +12,7 @@ }, "dependencies": { "@astrojs/svelte": "^5.4.0", - "astro": "^4.6.2", + "astro": "^4.6.3", "svelte": "^4.2.5" } } diff --git a/examples/framework-vue/package.json b/examples/framework-vue/package.json index c4877b256e..b7a1e49e99 100644 --- a/examples/framework-vue/package.json +++ b/examples/framework-vue/package.json @@ -12,7 +12,7 @@ }, "dependencies": { "@astrojs/vue": "^4.1.0", - "astro": "^4.6.2", + "astro": "^4.6.3", "vue": "^3.3.8" } } diff --git a/examples/hackernews/package.json b/examples/hackernews/package.json index 5314b60259..a7ea4297ae 100644 --- a/examples/hackernews/package.json +++ b/examples/hackernews/package.json @@ -12,6 +12,6 @@ }, "dependencies": { "@astrojs/node": "^8.2.5", - "astro": "^4.6.2" + "astro": "^4.6.3" } } diff --git a/examples/integration/package.json b/examples/integration/package.json index db06164601..7121e8c347 100644 --- a/examples/integration/package.json +++ b/examples/integration/package.json @@ -15,7 +15,7 @@ ], "scripts": {}, "devDependencies": { - "astro": "^4.6.2" + "astro": "^4.6.3" }, "peerDependencies": { "astro": "^4.0.0" diff --git a/examples/middleware/package.json b/examples/middleware/package.json index 6c43007318..1d84d85804 100644 --- a/examples/middleware/package.json +++ b/examples/middleware/package.json @@ -13,7 +13,7 @@ }, "dependencies": { "@astrojs/node": "^8.2.5", - "astro": "^4.6.2", + "astro": "^4.6.3", "html-minifier": "^4.0.0" }, "devDependencies": { diff --git a/examples/minimal/package.json b/examples/minimal/package.json index 031742f2c7..8b3a8dfedb 100644 --- a/examples/minimal/package.json +++ b/examples/minimal/package.json @@ -11,6 +11,6 @@ "astro": "astro" }, "dependencies": { - "astro": "^4.6.2" + "astro": "^4.6.3" } } diff --git a/examples/non-html-pages/package.json b/examples/non-html-pages/package.json index 777c3a6da4..884f8d7591 100644 --- a/examples/non-html-pages/package.json +++ b/examples/non-html-pages/package.json @@ -11,6 +11,6 @@ "astro": "astro" }, "dependencies": { - "astro": "^4.6.2" + "astro": "^4.6.3" } } diff --git a/examples/portfolio/package.json b/examples/portfolio/package.json index 3f03d77df4..3af8adde6a 100644 --- a/examples/portfolio/package.json +++ b/examples/portfolio/package.json @@ -11,6 +11,6 @@ "astro": "astro" }, "dependencies": { - "astro": "^4.6.2" + "astro": "^4.6.3" } } diff --git a/examples/ssr/package.json b/examples/ssr/package.json index ba0c478bc0..8ebd90fd16 100644 --- a/examples/ssr/package.json +++ b/examples/ssr/package.json @@ -14,7 +14,7 @@ "dependencies": { "@astrojs/node": "^8.2.5", "@astrojs/svelte": "^5.4.0", - "astro": "^4.6.2", + "astro": "^4.6.3", "svelte": "^4.2.5" } } diff --git a/examples/starlog/package.json b/examples/starlog/package.json index d6500f4068..0778ec8f88 100644 --- a/examples/starlog/package.json +++ b/examples/starlog/package.json @@ -10,7 +10,7 @@ "astro": "astro" }, "dependencies": { - "astro": "^4.6.2", + "astro": "^4.6.3", "sass": "^1.69.5", "sharp": "^0.32.6" } diff --git a/examples/view-transitions/package.json b/examples/view-transitions/package.json index 2ef6379f89..61865cdee0 100644 --- a/examples/view-transitions/package.json +++ b/examples/view-transitions/package.json @@ -12,6 +12,6 @@ "devDependencies": { "@astrojs/tailwind": "^5.1.0", "@astrojs/node": "^8.2.5", - "astro": "^4.6.2" + "astro": "^4.6.3" } } diff --git a/examples/with-markdoc/package.json b/examples/with-markdoc/package.json index b398a7ce4a..085a5b1b93 100644 --- a/examples/with-markdoc/package.json +++ b/examples/with-markdoc/package.json @@ -12,6 +12,6 @@ }, "dependencies": { "@astrojs/markdoc": "^0.10.0", - "astro": "^4.6.2" + "astro": "^4.6.3" } } diff --git a/examples/with-markdown-plugins/package.json b/examples/with-markdown-plugins/package.json index 4c70d2970e..095b2e5d69 100644 --- a/examples/with-markdown-plugins/package.json +++ b/examples/with-markdown-plugins/package.json @@ -12,7 +12,7 @@ }, "dependencies": { "@astrojs/markdown-remark": "^5.1.0", - "astro": "^4.6.2", + "astro": "^4.6.3", "hast-util-select": "^6.0.2", "rehype-autolink-headings": "^7.1.0", "rehype-slug": "^6.0.0", diff --git a/examples/with-markdown-shiki/package.json b/examples/with-markdown-shiki/package.json index 5e09959585..e06edaee9f 100644 --- a/examples/with-markdown-shiki/package.json +++ b/examples/with-markdown-shiki/package.json @@ -11,6 +11,6 @@ "astro": "astro" }, "dependencies": { - "astro": "^4.6.2" + "astro": "^4.6.3" } } diff --git a/examples/with-mdx/package.json b/examples/with-mdx/package.json index 68d15e5ff4..056c1ad1aa 100644 --- a/examples/with-mdx/package.json +++ b/examples/with-mdx/package.json @@ -13,7 +13,7 @@ "dependencies": { "@astrojs/mdx": "^2.3.1", "@astrojs/preact": "^3.2.0", - "astro": "^4.6.2", + "astro": "^4.6.3", "preact": "^10.19.2" } } diff --git a/examples/with-nanostores/package.json b/examples/with-nanostores/package.json index c7194eef7a..4c3093f01d 100644 --- a/examples/with-nanostores/package.json +++ b/examples/with-nanostores/package.json @@ -13,7 +13,7 @@ "dependencies": { "@astrojs/preact": "^3.2.0", "@nanostores/preact": "^0.5.0", - "astro": "^4.6.2", + "astro": "^4.6.3", "nanostores": "^0.9.5", "preact": "^10.19.2" } diff --git a/examples/with-tailwindcss/package.json b/examples/with-tailwindcss/package.json index e4bf87d312..b0322860f6 100644 --- a/examples/with-tailwindcss/package.json +++ b/examples/with-tailwindcss/package.json @@ -14,7 +14,7 @@ "@astrojs/mdx": "^2.3.1", "@astrojs/tailwind": "^5.1.0", "@types/canvas-confetti": "^1.6.3", - "astro": "^4.6.2", + "astro": "^4.6.3", "autoprefixer": "^10.4.15", "canvas-confetti": "^1.9.1", "postcss": "^8.4.28", diff --git a/examples/with-vitest/package.json b/examples/with-vitest/package.json index 75bc03d3be..34b915f6ae 100644 --- a/examples/with-vitest/package.json +++ b/examples/with-vitest/package.json @@ -12,7 +12,7 @@ "test": "vitest" }, "dependencies": { - "astro": "^4.6.2", + "astro": "^4.6.3", "vitest": "^1.3.1" } } diff --git a/packages/astro/CHANGELOG.md b/packages/astro/CHANGELOG.md index 3156fd3b9d..2cf022a658 100644 --- a/packages/astro/CHANGELOG.md +++ b/packages/astro/CHANGELOG.md @@ -1,5 +1,17 @@ # astro +## 4.6.3 + +### Patch Changes + +- [#10799](https://github.com/withastro/astro/pull/10799) [`dc74afca9f5eebc2d61331298d6ef187d92051e0`](https://github.com/withastro/astro/commit/dc74afca9f5eebc2d61331298d6ef187d92051e0) Thanks [@martrapp](https://github.com/martrapp)! - Fixes an issue with persisted non-text input fields that have the focus during view transition navigation. + +- [#10773](https://github.com/withastro/astro/pull/10773) [`35e43ecdaae7adc4b9a0b974192a033568cfb3f0`](https://github.com/withastro/astro/commit/35e43ecdaae7adc4b9a0b974192a033568cfb3f0) Thanks [@lilnasy](https://github.com/lilnasy)! - Improves performance for frequent use of small components. + +- [#10763](https://github.com/withastro/astro/pull/10763) [`63132771373ce1510be3e8814897accc0bf62ef8`](https://github.com/withastro/astro/commit/63132771373ce1510be3e8814897accc0bf62ef8) Thanks [@matthewp](https://github.com/matthewp)! - Invalidate CC cache manifest when lockfile or config changes + +- [#10811](https://github.com/withastro/astro/pull/10811) [`77822a822b04b5113726f713df104e8667333c59`](https://github.com/withastro/astro/commit/77822a822b04b5113726f713df104e8667333c59) Thanks [@AvinashReddy3108](https://github.com/AvinashReddy3108)! - Update list of available integrations in the `astro add` CLI help. + ## 4.6.2 ### Patch Changes diff --git a/packages/astro/package.json b/packages/astro/package.json index f0532b1df2..154886d4d1 100644 --- a/packages/astro/package.json +++ b/packages/astro/package.json @@ -1,6 +1,6 @@ { "name": "astro", - "version": "4.6.2", + "version": "4.6.3", "description": "Astro is a modern site builder with web best practices, performance, and DX front-of-mind.", "type": "module", "author": "withastro", diff --git a/packages/db/CHANGELOG.md b/packages/db/CHANGELOG.md index e7087ef74c..b909fffe0a 100644 --- a/packages/db/CHANGELOG.md +++ b/packages/db/CHANGELOG.md @@ -1,5 +1,11 @@ # @astrojs/db +## 0.10.5 + +### Patch Changes + +- [#10789](https://github.com/withastro/astro/pull/10789) [`d4c91cb10924a0627a9e9a80bc549b3c82d043e6`](https://github.com/withastro/astro/commit/d4c91cb10924a0627a9e9a80bc549b3c82d043e6) Thanks [@NickDubelman](https://github.com/NickDubelman)! - Expose the Drizzle `alias` utility from `astro:db` to enable self-joins on a table. + ## 0.10.4 ### Patch Changes diff --git a/packages/db/package.json b/packages/db/package.json index d4e56e19bf..074fdcb81d 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -1,6 +1,6 @@ { "name": "@astrojs/db", - "version": "0.10.4", + "version": "0.10.5", "description": "Add libSQL and Astro Studio support to your Astro site", "license": "MIT", "repository": { diff --git a/packages/integrations/sitemap/CHANGELOG.md b/packages/integrations/sitemap/CHANGELOG.md index 9df35d31f5..3ed7fa219b 100644 --- a/packages/integrations/sitemap/CHANGELOG.md +++ b/packages/integrations/sitemap/CHANGELOG.md @@ -1,5 +1,11 @@ # @astrojs/sitemap +## 3.1.4 + +### Patch Changes + +- [#10772](https://github.com/withastro/astro/pull/10772) [`0e22462d1534afc8f7bb6782f86db680c7a5f245`](https://github.com/withastro/astro/commit/0e22462d1534afc8f7bb6782f86db680c7a5f245) Thanks [@gislerro](https://github.com/gislerro)! - Fixes an issue where the root url does not follow the `trailingSlash` config option + ## 3.1.3 ### Patch Changes diff --git a/packages/integrations/sitemap/package.json b/packages/integrations/sitemap/package.json index cdff0a8aab..b9b6ed24fc 100644 --- a/packages/integrations/sitemap/package.json +++ b/packages/integrations/sitemap/package.json @@ -1,7 +1,7 @@ { "name": "@astrojs/sitemap", "description": "Generate a sitemap for your Astro site", - "version": "3.1.3", + "version": "3.1.4", "type": "module", "types": "./dist/index.d.ts", "author": "withastro", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 95d3b4649a..6b6cc11abe 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -134,7 +134,7 @@ importers: examples/basics: dependencies: astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro examples/blog: @@ -146,16 +146,16 @@ importers: specifier: ^4.0.5 version: link:../../packages/astro-rss '@astrojs/sitemap': - specifier: ^3.1.3 + specifier: ^3.1.4 version: link:../../packages/integrations/sitemap astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro examples/component: devDependencies: astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro examples/framework-alpine: @@ -170,7 +170,7 @@ importers: specifier: ^3.13.3 version: 3.13.8 astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro examples/framework-lit: @@ -182,7 +182,7 @@ importers: specifier: ^0.2.1 version: 0.2.1 astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro lit: specifier: ^3.1.2 @@ -212,7 +212,7 @@ importers: specifier: ^18.2.15 version: 18.2.25 astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro preact: specifier: ^10.19.2 @@ -242,7 +242,7 @@ importers: specifier: ^1.2.1 version: 1.2.1(preact@10.20.2) astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro preact: specifier: ^10.19.2 @@ -260,7 +260,7 @@ importers: specifier: ^18.2.15 version: 18.2.25 astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro react: specifier: ^18.2.0 @@ -275,7 +275,7 @@ importers: specifier: ^4.1.0 version: link:../../packages/integrations/solid astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro solid-js: specifier: ^1.8.5 @@ -287,7 +287,7 @@ importers: specifier: ^5.4.0 version: link:../../packages/integrations/svelte astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro svelte: specifier: ^4.2.5 @@ -299,7 +299,7 @@ importers: specifier: ^4.1.0 version: link:../../packages/integrations/vue astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro vue: specifier: ^3.3.8 @@ -311,13 +311,13 @@ importers: specifier: ^8.2.5 version: link:../../packages/integrations/node astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro examples/integration: devDependencies: astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro examples/middleware: @@ -326,7 +326,7 @@ importers: specifier: ^8.2.5 version: link:../../packages/integrations/node astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro html-minifier: specifier: ^4.0.0 @@ -339,19 +339,19 @@ importers: examples/minimal: dependencies: astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro examples/non-html-pages: dependencies: astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro examples/portfolio: dependencies: astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro examples/ssr: @@ -363,7 +363,7 @@ importers: specifier: ^5.4.0 version: link:../../packages/integrations/svelte astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro svelte: specifier: ^4.2.5 @@ -372,7 +372,7 @@ importers: examples/starlog: dependencies: astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro sass: specifier: ^1.69.5 @@ -390,7 +390,7 @@ importers: specifier: ^5.1.0 version: link:../../packages/integrations/tailwind astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro examples/with-markdoc: @@ -399,7 +399,7 @@ importers: specifier: ^0.10.0 version: link:../../packages/integrations/markdoc astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro examples/with-markdown-plugins: @@ -408,7 +408,7 @@ importers: specifier: ^5.1.0 version: link:../../packages/markdown/remark astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro hast-util-select: specifier: ^6.0.2 @@ -429,7 +429,7 @@ importers: examples/with-markdown-shiki: dependencies: astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro examples/with-mdx: @@ -441,7 +441,7 @@ importers: specifier: ^3.2.0 version: link:../../packages/integrations/preact astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro preact: specifier: ^10.19.2 @@ -456,7 +456,7 @@ importers: specifier: ^0.5.0 version: 0.5.1(nanostores@0.9.5)(preact@10.20.2) astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro nanostores: specifier: ^0.9.5 @@ -477,7 +477,7 @@ importers: specifier: ^1.6.3 version: 1.6.4 astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro autoprefixer: specifier: ^10.4.15 @@ -495,7 +495,7 @@ importers: examples/with-vitest: dependencies: astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro vitest: specifier: ^1.3.1 From f214ae798c97becff2aaf81a530613ab002055f3 Mon Sep 17 00:00:00 2001 From: Damanjeet Singh <49544630+DamanjeetSingh1@users.noreply.github.com> Date: Fri, 19 Apr 2024 13:32:17 +0530 Subject: [PATCH 27/36] fixed the path to checkout existing blog posts on the home page of the blog starter template (#10814) Currently the 4th point on home page says: "Check out the included blog posts in src/pages/blog/". It the path here should be "src/content/blog/". --- examples/blog/src/pages/index.astro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/blog/src/pages/index.astro b/examples/blog/src/pages/index.astro index 46975d8fbd..31269efde0 100644 --- a/examples/blog/src/pages/index.astro +++ b/examples/blog/src/pages/index.astro @@ -30,7 +30,7 @@ import { SITE_TITLE, SITE_DESCRIPTION } from '../consts';
  • Edit this page in src/pages/index.astro
  • Edit the site header items in src/components/Header.astro
  • Add your name to the footer in src/components/Footer.astro
  • -
  • Check out the included blog posts in src/pages/blog/
  • +
  • Check out the included blog posts in src/content/blog/
  • Customize the blog post page layout in src/layouts/BlogPost.astro
  • From 91219a5cf84061a36fd08f86012e9b728a3f3ccb Mon Sep 17 00:00:00 2001 From: Bjorn Lu Date: Fri, 19 Apr 2024 20:49:33 +0800 Subject: [PATCH 28/36] Use renovate (#10422) * Use renovate * Add more ignore --- .github/renovate.json5 | 15 +++++++++++++++ .github/workflows/nightly.yml | 13 ------------- 2 files changed, 15 insertions(+), 13 deletions(-) create mode 100644 .github/renovate.json5 delete mode 100644 .github/workflows/nightly.yml diff --git a/.github/renovate.json5 b/.github/renovate.json5 new file mode 100644 index 0000000000..2dcf853436 --- /dev/null +++ b/.github/renovate.json5 @@ -0,0 +1,15 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": ["config:base", "schedule:weekly", "group:allNonMajor"], + "labels": ["dependencies"], + "rangeStrategy": "bump", + "ignoreDeps": [ + // manually bumping + "@biomejs/biome", + "@types/node", + "sharp", + + // follow vite deps version + "postcss-load-config", + ], +} diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml deleted file mode 100644 index 2a3bfd1948..0000000000 --- a/.github/workflows/nightly.yml +++ /dev/null @@ -1,13 +0,0 @@ -name: Nightly - -on: - schedule: - # Run every Monday at 12:00 UTC - - cron: "0 12 * * 1" - workflow_dispatch: - -jobs: - lockfile: - if: github.repository_owner == 'withastro' - uses: withastro/automation/.github/workflows/lockfile.yml@main - secrets: inherit From 237e17c8feea244b06b00ceaed08cb16d3d6baeb Mon Sep 17 00:00:00 2001 From: Bjorn Lu Date: Sat, 20 Apr 2024 00:11:20 +0800 Subject: [PATCH 29/36] Update major deps (#10823) --- .github/renovate.json5 | 10 +- .../fixtures/multiple-frameworks/package.json | 2 +- packages/astro/package.json | 5 +- packages/astro/performance/package.json | 2 - packages/astro/src/assets/endpoint/generic.ts | 4 +- packages/astro/src/assets/endpoint/node.ts | 4 +- .../test/fixtures/lit-element/package.json | 2 +- packages/db/package.json | 6 +- packages/integrations/markdoc/package.json | 2 +- packages/integrations/mdx/package.json | 5 +- packages/integrations/partytown/package.json | 2 +- packages/integrations/vercel/test/setup.js | 12 - packages/integrations/vue/package.json | 1 - packages/markdown/remark/package.json | 3 +- pnpm-lock.yaml | 649 ++++++------------ scripts/cmd/copy.js | 2 +- scripts/package.json | 2 +- 17 files changed, 250 insertions(+), 463 deletions(-) delete mode 100644 packages/integrations/vercel/test/setup.js diff --git a/.github/renovate.json5 b/.github/renovate.json5 index 2dcf853436..3ca916bd1f 100644 --- a/.github/renovate.json5 +++ b/.github/renovate.json5 @@ -4,11 +4,19 @@ "labels": ["dependencies"], "rangeStrategy": "bump", "ignoreDeps": [ - // manually bumping + // manually bumping deps "@biomejs/biome", "@types/node", "sharp", + // manually bumping workflow actions + "actions/labeler", + + // ignore "engines" update + "node", + "npm", + "pnpm", + // follow vite deps version "postcss-load-config", ], diff --git a/packages/astro/e2e/fixtures/multiple-frameworks/package.json b/packages/astro/e2e/fixtures/multiple-frameworks/package.json index 4666b1593e..ebaa1ab7f3 100644 --- a/packages/astro/e2e/fixtures/multiple-frameworks/package.json +++ b/packages/astro/e2e/fixtures/multiple-frameworks/package.json @@ -13,7 +13,7 @@ }, "dependencies": { "@webcomponents/template-shadowroot": "^0.2.1", - "lit": "^2.8.0", + "lit": "^3.1.0", "preact": "^10.19.2", "react": "^18.1.0", "react-dom": "^18.1.0", diff --git a/packages/astro/package.json b/packages/astro/package.json index 154886d4d1..9a5c148f55 100644 --- a/packages/astro/package.json +++ b/packages/astro/package.json @@ -155,8 +155,8 @@ "js-yaml": "^4.1.0", "kleur": "^4.1.4", "magic-string": "^0.30.3", - "mime": "^3.0.0", - "ora": "^7.0.1", + "mrmime": "^2.0.0", + "ora": "^8.0.1", "p-limit": "^5.0.0", "p-queue": "^8.0.1", "path-to-regexp": "^6.2.1", @@ -187,7 +187,6 @@ "@types/aria-query": "^5.0.4", "@types/babel__generator": "^7.6.7", "@types/babel__traverse": "^7.20.4", - "@types/chai": "^4.3.10", "@types/common-ancestor-path": "^1.0.2", "@types/connect": "^3.4.38", "@types/cssesc": "^3.0.2", diff --git a/packages/astro/performance/package.json b/packages/astro/performance/package.json index 25bfad16b4..c0833b9522 100644 --- a/packages/astro/performance/package.json +++ b/packages/astro/performance/package.json @@ -12,9 +12,7 @@ "license": "ISC", "devDependencies": { "@types/yargs-parser": "^21.0.3", - "cross-env": "^7.0.3", "kleur": "^4.1.5", - "npm-run-all": "^4.1.5", "yargs-parser": "^21.1.1" } } diff --git a/packages/astro/src/assets/endpoint/generic.ts b/packages/astro/src/assets/endpoint/generic.ts index 589f9f8b75..9ef87846c0 100644 --- a/packages/astro/src/assets/endpoint/generic.ts +++ b/packages/astro/src/assets/endpoint/generic.ts @@ -1,7 +1,7 @@ // @ts-expect-error import { imageConfig } from 'astro:assets'; import { isRemotePath } from '@astrojs/internal-helpers/path'; -import mime from 'mime/lite.js'; +import * as mime from 'mrmime'; import type { APIRoute } from '../../@types/astro.js'; import { getConfiguredImageService } from '../internal.js'; import { etag } from '../utils/etag.js'; @@ -66,7 +66,7 @@ export const GET: APIRoute = async ({ request }) => { return new Response(data, { status: 200, headers: { - 'Content-Type': mime.getType(format) ?? `image/${format}`, + 'Content-Type': mime.lookup(format) ?? `image/${format}`, 'Cache-Control': 'public, max-age=31536000', ETag: etag(data.toString()), Date: new Date().toUTCString(), diff --git a/packages/astro/src/assets/endpoint/node.ts b/packages/astro/src/assets/endpoint/node.ts index 1d9ac9df64..d50e8b1938 100644 --- a/packages/astro/src/assets/endpoint/node.ts +++ b/packages/astro/src/assets/endpoint/node.ts @@ -6,7 +6,7 @@ import { fileURLToPath, pathToFileURL } from 'node:url'; import { assetsDir, imageConfig, outDir } from 'astro:assets'; import { isRemotePath, removeQueryString } from '@astrojs/internal-helpers/path'; import { readFile } from 'fs/promises'; -import mime from 'mime/lite.js'; +import * as mime from 'mrmime'; import type { APIRoute } from '../../@types/astro.js'; import { getConfiguredImageService } from '../internal.js'; import { etag } from '../utils/etag.js'; @@ -110,7 +110,7 @@ export const GET: APIRoute = async ({ request }) => { return new Response(data, { status: 200, headers: { - 'Content-Type': mime.getType(format) ?? `image/${format}`, + 'Content-Type': mime.lookup(format) ?? `image/${format}`, 'Cache-Control': 'public, max-age=31536000', ETag: etag(data.toString()), Date: new Date().toUTCString(), diff --git a/packages/astro/test/fixtures/lit-element/package.json b/packages/astro/test/fixtures/lit-element/package.json index 51bfae32c2..9e5167c912 100644 --- a/packages/astro/test/fixtures/lit-element/package.json +++ b/packages/astro/test/fixtures/lit-element/package.json @@ -6,6 +6,6 @@ "@astrojs/lit": "workspace:*", "@webcomponents/template-shadowroot": "^0.2.1", "astro": "workspace:*", - "lit": "^2.8.0" + "lit": "^3.1.0" } } diff --git a/packages/db/package.json b/packages/db/package.json index 074fdcb81d..1764dd3e5f 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -78,14 +78,14 @@ "kleur": "^4.1.5", "nanoid": "^5.0.1", "open": "^10.0.3", - "ora": "^7.0.1", + "ora": "^8.0.1", "prompts": "^2.4.2", "strip-ansi": "^7.1.0", "yargs-parser": "^21.1.1", "zod": "^3.22.4" }, "devDependencies": { - "@types/chai": "^4.3.6", + "@types/chai": "^4.3.14", "@types/deep-diff": "^1.0.5", "@types/diff": "^5.0.8", "@types/mocha": "^10.0.2", @@ -93,7 +93,7 @@ "@types/yargs-parser": "^21.0.3", "astro": "workspace:*", "astro-scripts": "workspace:*", - "chai": "^4.3.10", + "chai": "^4.4.1", "cheerio": "1.0.0-rc.12", "mocha": "^10.2.0", "typescript": "^5.2.2", diff --git a/packages/integrations/markdoc/package.json b/packages/integrations/markdoc/package.json index c928fbb200..93cc2b174f 100644 --- a/packages/integrations/markdoc/package.json +++ b/packages/integrations/markdoc/package.json @@ -78,7 +78,7 @@ }, "devDependencies": { "@types/html-escaper": "^3.0.2", - "@types/markdown-it": "^13.0.6", + "@types/markdown-it": "^14.0.1", "astro": "workspace:*", "astro-scripts": "workspace:*", "devalue": "^4.3.2", diff --git a/packages/integrations/mdx/package.json b/packages/integrations/mdx/package.json index 5dbc7dd952..c0e4575bb8 100644 --- a/packages/integrations/mdx/package.json +++ b/packages/integrations/mdx/package.json @@ -44,7 +44,7 @@ "kleur": "^4.1.4", "rehype-raw": "^7.0.0", "remark-gfm": "^4.0.0", - "remark-smartypants": "^2.0.0", + "remark-smartypants": "^3.0.0", "source-map": "^0.7.4", "unist-util-visit": "^5.0.0", "vfile": "^6.0.1" @@ -53,7 +53,6 @@ "astro": "^4.0.0" }, "devDependencies": { - "@types/chai": "^4.3.10", "@types/estree": "^1.0.5", "@types/mdast": "^4.0.3", "@types/mocha": "^10.0.4", @@ -65,7 +64,7 @@ "mdast-util-mdx": "^3.0.0", "mdast-util-to-string": "^4.0.0", "reading-time": "^1.5.0", - "rehype-mathjax": "^5.0.0", + "rehype-mathjax": "^6.0.0", "rehype-pretty-code": "^0.13.0", "remark-math": "^6.0.0", "remark-rehype": "^11.0.0", diff --git a/packages/integrations/partytown/package.json b/packages/integrations/partytown/package.json index 83ba89c63c..d23210d9dd 100644 --- a/packages/integrations/partytown/package.json +++ b/packages/integrations/partytown/package.json @@ -33,7 +33,7 @@ }, "dependencies": { "@builder.io/partytown": "^0.8.0", - "mrmime": "^1.0.1" + "mrmime": "^2.0.0" }, "devDependencies": { "astro": "workspace:*", diff --git a/packages/integrations/vercel/test/setup.js b/packages/integrations/vercel/test/setup.js deleted file mode 100644 index c53aa9894f..0000000000 --- a/packages/integrations/vercel/test/setup.js +++ /dev/null @@ -1,12 +0,0 @@ -import { use } from 'chai'; -import chaiJestSnapshot from 'chai-jest-snapshot'; - -use(chaiJestSnapshot); - -before(function () { - chaiJestSnapshot.resetSnapshotRegistry(); -}); - -beforeEach(function () { - chaiJestSnapshot.configureUsingMochaContext(this); -}); diff --git a/packages/integrations/vue/package.json b/packages/integrations/vue/package.json index db48b34b31..e0dc2f60ec 100644 --- a/packages/integrations/vue/package.json +++ b/packages/integrations/vue/package.json @@ -45,7 +45,6 @@ "@vue/compiler-sfc": "^3.3.8" }, "devDependencies": { - "@types/chai": "^4.3.10", "astro": "workspace:*", "astro-scripts": "workspace:*", "cheerio": "1.0.0-rc.12", diff --git a/packages/markdown/remark/package.json b/packages/markdown/remark/package.json index 5e2c8975c7..0a75470f28 100644 --- a/packages/markdown/remark/package.json +++ b/packages/markdown/remark/package.json @@ -45,7 +45,7 @@ "remark-gfm": "^4.0.0", "remark-parse": "^11.0.0", "remark-rehype": "^11.0.0", - "remark-smartypants": "^2.0.0", + "remark-smartypants": "^3.0.0", "shiki": "^1.1.2", "unified": "^11.0.4", "unist-util-remove-position": "^5.0.0", @@ -54,7 +54,6 @@ "vfile": "^6.0.1" }, "devDependencies": { - "@types/chai": "^4.3.10", "@types/estree": "^1.0.5", "@types/hast": "^3.0.3", "@types/mdast": "^4.0.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6b6cc11abe..b3a7f89323 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -626,12 +626,12 @@ importers: magic-string: specifier: ^0.30.3 version: 0.30.9 - mime: - specifier: ^3.0.0 - version: 3.0.0 + mrmime: + specifier: ^2.0.0 + version: 2.0.0 ora: - specifier: ^7.0.1 - version: 7.0.1 + specifier: ^8.0.1 + version: 8.0.1 p-limit: specifier: ^5.0.0 version: 5.0.0 @@ -712,9 +712,6 @@ importers: '@types/babel__traverse': specifier: ^7.20.4 version: 7.20.5 - '@types/chai': - specifier: ^4.3.10 - version: 4.3.14 '@types/common-ancestor-path': specifier: ^1.0.2 version: 1.0.2 @@ -1079,8 +1076,8 @@ importers: specifier: ^0.2.1 version: 0.2.1 lit: - specifier: ^2.8.0 - version: 2.8.0 + specifier: ^3.1.0 + version: 3.1.2 preact: specifier: ^10.19.2 version: 10.20.2 @@ -1605,15 +1602,9 @@ importers: '@types/yargs-parser': specifier: ^21.0.3 version: 21.0.3 - cross-env: - specifier: ^7.0.3 - version: 7.0.3 kleur: specifier: ^4.1.5 version: 4.1.5 - npm-run-all: - specifier: ^4.1.5 - version: 4.1.5 yargs-parser: specifier: ^21.1.1 version: 21.1.1 @@ -3084,8 +3075,8 @@ importers: specifier: workspace:* version: link:../../.. lit: - specifier: ^2.8.0 - version: 2.8.0 + specifier: ^3.1.0 + version: 3.1.2 packages/astro/test/fixtures/markdown: dependencies: @@ -3908,8 +3899,8 @@ importers: specifier: ^10.0.3 version: 10.1.0 ora: - specifier: ^7.0.1 - version: 7.0.1 + specifier: ^8.0.1 + version: 8.0.1 prompts: specifier: ^2.4.2 version: 2.4.2 @@ -3924,7 +3915,7 @@ importers: version: 3.22.4 devDependencies: '@types/chai': - specifier: ^4.3.6 + specifier: ^4.3.14 version: 4.3.14 '@types/deep-diff': specifier: ^1.0.5 @@ -3948,7 +3939,7 @@ importers: specifier: workspace:* version: link:../../scripts chai: - specifier: ^4.3.10 + specifier: ^4.4.1 version: 4.4.1 cheerio: specifier: 1.0.0-rc.12 @@ -4225,8 +4216,8 @@ importers: specifier: ^3.0.2 version: 3.0.2 '@types/markdown-it': - specifier: ^13.0.6 - version: 13.0.7 + specifier: ^14.0.1 + version: 14.0.1 astro: specifier: workspace:* version: link:../../astro @@ -4411,8 +4402,8 @@ importers: specifier: ^4.0.0 version: 4.0.0 remark-smartypants: - specifier: ^2.0.0 - version: 2.1.0 + specifier: ^3.0.0 + version: 3.0.0 source-map: specifier: ^0.7.4 version: 0.7.4 @@ -4423,9 +4414,6 @@ importers: specifier: ^6.0.1 version: 6.0.1 devDependencies: - '@types/chai': - specifier: ^4.3.10 - version: 4.3.14 '@types/estree': specifier: ^1.0.5 version: 1.0.5 @@ -4460,8 +4448,8 @@ importers: specifier: ^1.5.0 version: 1.5.0 rehype-mathjax: - specifier: ^5.0.0 - version: 5.0.0 + specifier: ^6.0.0 + version: 6.0.0 rehype-pretty-code: specifier: ^0.13.0 version: 0.13.1 @@ -4790,8 +4778,8 @@ importers: specifier: ^0.8.0 version: 0.8.2 mrmime: - specifier: ^1.0.1 - version: 1.0.1 + specifier: ^2.0.0 + version: 2.0.0 devDependencies: astro: specifier: workspace:* @@ -5254,9 +5242,6 @@ importers: specifier: ^3.3.8 version: 3.4.21 devDependencies: - '@types/chai': - specifier: ^4.3.10 - version: 4.3.14 astro: specifier: workspace:* version: link:../../astro @@ -5390,8 +5375,8 @@ importers: specifier: ^11.0.0 version: 11.1.0 remark-smartypants: - specifier: ^2.0.0 - version: 2.1.0 + specifier: ^3.0.0 + version: 3.0.0 shiki: specifier: ^1.1.2 version: 1.3.0 @@ -5411,9 +5396,6 @@ importers: specifier: ^6.0.1 version: 6.0.1 devDependencies: - '@types/chai': - specifier: ^4.3.10 - version: 4.3.14 '@types/estree': specifier: ^1.0.5 version: 1.0.5 @@ -5540,8 +5522,8 @@ importers: specifier: ^4.2.5 version: 4.2.14 tar: - specifier: ^6.1.15 - version: 6.2.1 + specifier: ^7.0.1 + version: 7.0.1 devDependencies: '@octokit/action': specifier: ^6.0.5 @@ -5577,6 +5559,14 @@ packages: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 + /@asamuzakjp/dom-selector@2.0.2: + resolution: {integrity: sha512-x1KXOatwofR6ZAYzXRBL5wrdV0vwNxlTCK9NCuLqAzQYARqGcvFwiJA6A1ERuh+dgeA4Dxm3JBYictIes+SqUQ==} + dependencies: + bidi-js: 1.0.3 + css-tree: 2.3.1 + is-potential-custom-element-name: 1.0.1 + dev: true + /@assemblyscript/loader@0.19.23: resolution: {integrity: sha512-ulkCYfFbYj01ie1MDOyxv2F6SpRN1TOj7fQxbP07D6HmeR+gr2JLSmINKjga2emB+b1L2KGrFKBTc+e00p54nw==} dev: false @@ -7335,6 +7325,13 @@ packages: wrap-ansi: 8.1.0 wrap-ansi-cjs: /wrap-ansi@7.0.0 + /@isaacs/fs-minipass@4.0.1: + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + dependencies: + minipass: 7.0.4 + dev: false + /@jest/schemas@29.6.3: resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -7506,12 +7503,6 @@ packages: parse5: 7.1.2 dev: false - /@lit/reactive-element@1.6.3: - resolution: {integrity: sha512-QuTgnG52Poic7uM1AN5yJ09QMe0O28e10XzSvWDz02TJiiKee4stsiownEIadWm8nYzyDAyT+gKzUoZmiWQtsQ==} - dependencies: - '@lit-labs/ssr-dom-shim': 1.2.0 - dev: false - /@lit/reactive-element@2.0.4: resolution: {integrity: sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ==} dependencies: @@ -8030,11 +8021,6 @@ packages: - supports-color dev: false - /@tootallnate/once@2.0.0: - resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} - engines: {node: '>= 10'} - dev: true - /@trysound/sax@0.2.0: resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} engines: {node: '>=10.13.0'} @@ -8230,15 +8216,15 @@ packages: dev: false optional: true - /@types/markdown-it@13.0.7: - resolution: {integrity: sha512-U/CBi2YUUcTHBt5tjO2r5QV/x0Po6nsYwQU4Y04fBS6vfoImaiZ6f8bi3CjTCxBPQSO1LMyUqkByzi8AidyxfA==} + /@types/markdown-it@14.0.1: + resolution: {integrity: sha512-6WfOG3jXR78DW8L5cTYCVVGAsIFZskRHCDo5tbqa+qtKVt4oDRVH7hyIWu1SpDQJlmIoEivNQZ5h+AGAOrgOtQ==} dependencies: '@types/linkify-it': 3.0.5 '@types/mdurl': 1.0.5 dev: true - /@types/mathjax@0.0.37: - resolution: {integrity: sha512-y0WSZBtBNQwcYipTU/BhgeFu1EZNlFvUNCmkMXV9kBQZq7/o5z82dNVyH3yy2Xv5zzeNeQoHSL4Xm06+EQiH+g==} + /@types/mathjax@0.0.40: + resolution: {integrity: sha512-rHusx08LCg92WJxrsM3SPjvLTSvK5C+gealtSuhKbEOcUZfWlwigaFoPLf6Dfxhg4oryN5qP9Sj7zOQ4HYXINw==} dev: true /@types/mdast@4.0.3: @@ -8278,10 +8264,10 @@ packages: '@types/node': 18.19.31 dev: true - /@types/nlcst@1.0.4: - resolution: {integrity: sha512-ABoYdNQ/kBSsLvZAekMhIPMQ3YUZvavStpKYs7BjLLuKVmIMA0LUgZ7b54zzuWJRbHF80v1cNf4r90Vd6eMQDg==} + /@types/nlcst@2.0.3: + resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==} dependencies: - '@types/unist': 2.0.10 + '@types/unist': 3.0.2 dev: false /@types/node-fetch@2.6.11: @@ -8950,11 +8936,6 @@ packages: resolution: {integrity: sha512-fXL/vIUakyZL62hyvUh+EMwbVoTc0hksublmRz6ai6et8znHkJa6gtqMUZo1oc7dIz46exHSIImml9QTdknMHg==} dev: false - /abab@2.0.6: - resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} - deprecated: Use your platform's native atob() and btoa() methods instead - dev: true - /abbrev@1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} dev: false @@ -8999,6 +8980,7 @@ packages: debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color + dev: false /agent-base@7.1.1: resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} @@ -9007,7 +8989,6 @@ packages: debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color - dev: false /aggregate-error@4.0.1: resolution: {integrity: sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==} @@ -9380,6 +9361,12 @@ packages: is-windows: 1.0.2 dev: true + /bidi-js@1.0.3: + resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} + dependencies: + require-from-string: 2.0.2 + dev: true + /binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} @@ -9399,14 +9386,6 @@ packages: readable-stream: 3.6.2 dev: false - /bl@5.1.0: - resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==} - dependencies: - buffer: 6.0.3 - inherits: 2.0.4 - readable-stream: 3.6.2 - dev: false - /body-parser@1.20.2: resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -9488,13 +9467,6 @@ packages: ieee754: 1.2.1 dev: false - /buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - dev: false - /bundle-name@4.1.0: resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} engines: {node: '>=18'} @@ -9692,6 +9664,11 @@ packages: engines: {node: '>=10'} dev: false + /chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + dev: false + /ci-info@3.9.0: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} @@ -9912,14 +9889,6 @@ packages: resolution: {integrity: sha512-YIaY9TR5Nxeb8SMdtrU8asWVM4jqJDNDYlKV21LxtYcfNJhp1kEsgSa6qXwXgzN0WQWGODps0+TlGp2xQSHwOg==} dev: false - /cross-env@7.0.3: - resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} - engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} - hasBin: true - dependencies: - cross-spawn: 7.0.3 - dev: true - /cross-spawn@5.1.0: resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} dependencies: @@ -9928,17 +9897,6 @@ packages: which: 1.3.1 dev: true - /cross-spawn@6.0.5: - resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} - engines: {node: '>=4.8'} - dependencies: - nice-try: 1.0.5 - path-key: 2.0.1 - semver: 5.7.2 - shebang-command: 1.2.0 - which: 1.3.1 - dev: true - /cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} @@ -10033,9 +9991,9 @@ packages: /cssom@0.5.0: resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==} - /cssstyle@3.0.0: - resolution: {integrity: sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==} - engines: {node: '>=14'} + /cssstyle@4.0.1: + resolution: {integrity: sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==} + engines: {node: '>=18'} dependencies: rrweb-cssom: 0.6.0 dev: true @@ -10070,13 +10028,12 @@ packages: engines: {node: '>= 12'} dev: false - /data-urls@4.0.0: - resolution: {integrity: sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==} - engines: {node: '>=14'} + /data-urls@5.0.0: + resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} + engines: {node: '>=18'} dependencies: - abab: 2.0.6 - whatwg-mimetype: 3.0.0 - whatwg-url: 12.0.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 14.0.0 dev: true /data-view-buffer@1.0.1: @@ -10358,14 +10315,6 @@ packages: /domelementtype@2.3.0: resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - /domexception@4.0.0: - resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} - engines: {node: '>=12'} - deprecated: Use your platform's native DOMException instead - dependencies: - webidl-conversions: 7.0.0 - dev: true - /domhandler@5.0.3: resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} engines: {node: '>= 4'} @@ -11755,11 +11704,11 @@ packages: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} dev: true - /html-encoding-sniffer@3.0.0: - resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} - engines: {node: '>=12'} + /html-encoding-sniffer@4.0.0: + resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} + engines: {node: '>=18'} dependencies: - whatwg-encoding: 2.0.0 + whatwg-encoding: 3.1.1 dev: true /html-entities@2.3.3: @@ -11826,12 +11775,11 @@ packages: resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} dev: false - /http-proxy-agent@5.0.0: - resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} - engines: {node: '>= 6'} + /http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} dependencies: - '@tootallnate/once': 2.0.0 - agent-base: 6.0.2 + agent-base: 7.1.1 debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -11845,6 +11793,7 @@ packages: debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color + dev: false /https-proxy-agent@7.0.4: resolution: {integrity: sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==} @@ -11854,7 +11803,6 @@ packages: debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color - dev: false /human-id@1.0.2: resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} @@ -12006,11 +11954,6 @@ packages: has-tostringtag: 1.0.2 dev: true - /is-buffer@2.0.5: - resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} - engines: {node: '>=4'} - dev: false - /is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} @@ -12195,6 +12138,11 @@ packages: engines: {node: '>=12'} dev: false + /is-unicode-supported@2.0.0: + resolution: {integrity: sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==} + engines: {node: '>=18'} + dev: false + /is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: @@ -12266,38 +12214,36 @@ packages: engines: {node: '>=12.0.0'} dev: true - /jsdom@22.1.0: - resolution: {integrity: sha512-/9AVW7xNbsBv6GfWho4TTNjEo9fe6Zhf9O7s0Fhhr3u+awPwAJMKwAMXnkk5vBxflqLW9hTHX/0cs+P3gW+cQw==} - engines: {node: '>=16'} + /jsdom@23.2.0: + resolution: {integrity: sha512-L88oL7D/8ufIES+Zjz7v0aes+oBMh2Xnh3ygWvL0OaICOomKEPKuPnIfBJekiXr+BHbbMjrWn/xqrDQuxFTeyA==} + engines: {node: '>=18'} peerDependencies: - canvas: ^2.5.0 + canvas: ^2.11.2 peerDependenciesMeta: canvas: optional: true dependencies: - abab: 2.0.6 - cssstyle: 3.0.0 - data-urls: 4.0.0 + '@asamuzakjp/dom-selector': 2.0.2 + cssstyle: 4.0.1 + data-urls: 5.0.0 decimal.js: 10.4.3 - domexception: 4.0.0 form-data: 4.0.0 - html-encoding-sniffer: 3.0.0 - http-proxy-agent: 5.0.0 - https-proxy-agent: 5.0.1 + html-encoding-sniffer: 4.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.4 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.7 parse5: 7.1.2 rrweb-cssom: 0.6.0 saxes: 6.0.0 symbol-tree: 3.2.4 tough-cookie: 4.1.3 - w3c-xmlserializer: 4.0.0 + w3c-xmlserializer: 5.0.0 webidl-conversions: 7.0.0 - whatwg-encoding: 2.0.0 - whatwg-mimetype: 3.0.0 - whatwg-url: 12.0.1 + whatwg-encoding: 3.1.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 14.0.0 ws: 8.16.0 - xml-name-validator: 4.0.0 + xml-name-validator: 5.0.0 transitivePeerDependencies: - bufferutil - supports-color @@ -12314,10 +12260,6 @@ packages: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} dev: true - /json-parse-better-errors@1.0.2: - resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} - dev: true - /json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} dev: true @@ -12443,14 +12385,6 @@ packages: uhyphen: 0.2.0 dev: true - /lit-element@3.3.3: - resolution: {integrity: sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA==} - dependencies: - '@lit-labs/ssr-dom-shim': 1.2.0 - '@lit/reactive-element': 1.6.3 - lit-html: 2.8.0 - dev: false - /lit-element@4.0.4: resolution: {integrity: sha512-98CvgulX6eCPs6TyAIQoJZBCQPo80rgXR+dVBs61cstJXqtI+USQZAbA4gFHh6L/mxBx9MrgPLHLsUgDUHAcCQ==} dependencies: @@ -12458,25 +12392,11 @@ packages: '@lit/reactive-element': 2.0.4 lit-html: 3.1.2 - /lit-html@2.8.0: - resolution: {integrity: sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q==} - dependencies: - '@types/trusted-types': 2.0.7 - dev: false - /lit-html@3.1.2: resolution: {integrity: sha512-3OBZSUrPnAHoKJ9AMjRL/m01YJxQMf+TMHanNtTHG68ubjnZxK0RFl102DPzsw4mWnHibfZIBJm3LWCZ/LmMvg==} dependencies: '@types/trusted-types': 2.0.7 - /lit@2.8.0: - resolution: {integrity: sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==} - dependencies: - '@lit/reactive-element': 1.6.3 - lit-element: 3.3.3 - lit-html: 2.8.0 - dev: false - /lit@3.1.2: resolution: {integrity: sha512-VZx5iAyMtX7CV4K8iTLdCkMaYZ7ipjJZ0JcSdJ0zIdGxxyurjIn7yuuSxNBD7QmjvcNJwr0JS4cAdAtsy7gZ6w==} dependencies: @@ -12488,16 +12408,6 @@ packages: resolution: {integrity: sha512-b1dgKyF4PHhinonmr3PB172Nj0qQgA/7DE9EmeIXHR1ksnFEC2olWjNJyJGdsN2cleKHRjjsmrziKlwXtPlmLQ==} dev: false - /load-json-file@4.0.0: - resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} - engines: {node: '>=4'} - dependencies: - graceful-fs: 4.2.11 - parse-json: 4.0.0 - pify: 3.0.0 - strip-bom: 3.0.0 - dev: true - /load-yaml-file@0.2.0: resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} engines: {node: '>=6'} @@ -12558,9 +12468,9 @@ packages: is-unicode-supported: 0.1.0 dev: true - /log-symbols@5.1.0: - resolution: {integrity: sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==} - engines: {node: '>=12'} + /log-symbols@6.0.0: + resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} + engines: {node: '>=18'} dependencies: chalk: 5.3.0 is-unicode-supported: 1.3.0 @@ -12926,11 +12836,6 @@ packages: tslib: 2.6.2 dev: true - /memorystream@0.3.1: - resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} - engines: {node: '>= 0.10.0'} - dev: true - /meow@6.1.1: resolution: {integrity: sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==} engines: {node: '>=8'} @@ -13326,12 +13231,6 @@ packages: engines: {node: '>=4'} hasBin: true - /mime@3.0.0: - resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} - engines: {node: '>=10.0.0'} - hasBin: true - dev: false - /mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} @@ -13414,6 +13313,14 @@ packages: yallist: 4.0.0 dev: false + /minizlib@3.0.1: + resolution: {integrity: sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==} + engines: {node: '>= 18'} + dependencies: + minipass: 7.0.4 + rimraf: 5.0.5 + dev: false + /mixme@0.5.10: resolution: {integrity: sha512-5H76ANWinB1H3twpJ6JY8uvAtpmFvHNArpilJAjXRKXSDDLPIMoZArw5SH0q9z+lLs8IrMw7Q2VWpWimFKFT1Q==} engines: {node: '>= 8.0.0'} @@ -13440,6 +13347,12 @@ packages: hasBin: true dev: true + /mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + dev: false + /mlly@1.6.1: resolution: {integrity: sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==} dependencies: @@ -13481,8 +13394,8 @@ packages: engines: {node: '>=4'} dev: false - /mrmime@1.0.1: - resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} + /mrmime@2.0.0: + resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} engines: {node: '>=10'} dev: false @@ -13535,14 +13448,10 @@ packages: engines: {node: '>= 0.6'} dev: true - /nice-try@1.0.5: - resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} - dev: true - - /nlcst-to-string@3.1.1: - resolution: {integrity: sha512-63mVyqaqt0cmn2VcI2aH6kxe1rLAmSROqHMA0i4qqg1tidkfExgpb0FGMikMCn86mw5dFtBtEANfmSSK7TjNHw==} + /nlcst-to-string@4.0.0: + resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==} dependencies: - '@types/nlcst': 1.0.4 + '@types/nlcst': 2.0.3 dev: false /no-case@2.3.2: @@ -13662,22 +13571,6 @@ packages: resolution: {integrity: sha512-5PDmaAsVfnWUgTUbJ3ERwn7u79Z0dYxN9ErxCpVJJqe2RK0PJ3z+iFUxuqjwtlDDegXvtWoxD/3Fzxox7tFGWA==} dev: false - /npm-run-all@4.1.5: - resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} - engines: {node: '>= 4'} - hasBin: true - dependencies: - ansi-styles: 3.2.1 - chalk: 2.4.2 - cross-spawn: 6.0.5 - memorystream: 0.3.1 - minimatch: 3.1.2 - pidtree: 0.3.1 - read-pkg: 3.0.0 - shell-quote: 1.8.1 - string.prototype.padend: 3.1.6 - dev: true - /npm-run-path@5.3.0: resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -13698,10 +13591,6 @@ packages: dependencies: boolbase: 1.0.0 - /nwsapi@2.2.7: - resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} - dev: true - /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -13791,18 +13680,18 @@ packages: type-check: 0.4.0 dev: true - /ora@7.0.1: - resolution: {integrity: sha512-0TUxTiFJWv+JnjWm4o9yvuskpEJLXTcng8MJuKd+SzAzp2o+OP3HWqNhB4OdJRt1Vsd9/mR0oyaEYlOnL7XIRw==} - engines: {node: '>=16'} + /ora@8.0.1: + resolution: {integrity: sha512-ANIvzobt1rls2BDny5fWZ3ZVKyD6nscLvfFRpQgfWsythlcsVUC9kL0zq6j2Z5z9wwp1kd7wpsD/T9qNPVLCaQ==} + engines: {node: '>=18'} dependencies: chalk: 5.3.0 cli-cursor: 4.0.0 cli-spinners: 2.9.2 is-interactive: 2.0.0 - is-unicode-supported: 1.3.0 - log-symbols: 5.1.0 - stdin-discarder: 0.1.0 - string-width: 6.1.0 + is-unicode-supported: 2.0.0 + log-symbols: 6.0.0 + stdin-discarder: 0.2.2 + string-width: 7.1.0 strip-ansi: 7.1.0 dev: false @@ -13921,14 +13810,6 @@ packages: is-decimal: 2.0.1 is-hexadecimal: 2.0.1 - /parse-json@4.0.0: - resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} - engines: {node: '>=4'} - dependencies: - error-ex: 1.3.2 - json-parse-better-errors: 1.0.2 - dev: true - /parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} @@ -13939,12 +13820,15 @@ packages: lines-and-columns: 1.2.4 dev: true - /parse-latin@5.0.1: - resolution: {integrity: sha512-b/K8ExXaWC9t34kKeDV8kGXBkXZ1HCSAZRYE7HR14eA1GlXX5L8iWhs8USJNhQU9q5ci413jCKF0gOyovvyRBg==} + /parse-latin@7.0.0: + resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==} dependencies: - nlcst-to-string: 3.1.1 - unist-util-modify-children: 3.1.1 - unist-util-visit-children: 2.0.2 + '@types/nlcst': 2.0.3 + '@types/unist': 3.0.2 + nlcst-to-string: 4.0.0 + unist-util-modify-children: 4.0.0 + unist-util-visit-children: 3.0.0 + vfile: 6.0.1 dev: false /parse-numeric-range@1.3.0: @@ -13990,11 +13874,6 @@ packages: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} - /path-key@2.0.1: - resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} - engines: {node: '>=4'} - dev: true - /path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -14021,13 +13900,6 @@ packages: resolution: {integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==} dev: false - /path-type@3.0.0: - resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} - engines: {node: '>=4'} - dependencies: - pify: 3.0.0 - dev: true - /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -14058,21 +13930,10 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - /pidtree@0.3.1: - resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} - engines: {node: '>=0.10'} - hasBin: true - dev: true - /pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} - /pify@3.0.0: - resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} - engines: {node: '>=4'} - dev: true - /pify@4.0.1: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} @@ -14768,15 +14629,6 @@ packages: type-fest: 0.8.1 dev: true - /read-pkg@3.0.0: - resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} - engines: {node: '>=4'} - dependencies: - load-json-file: 4.0.0 - normalize-package-data: 2.5.0 - path-type: 3.0.0 - dev: true - /read-pkg@5.2.0: resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} engines: {node: '>=8'} @@ -14866,14 +14718,14 @@ packages: unified: 11.0.4 unist-util-visit: 5.0.0 - /rehype-mathjax@5.0.0: - resolution: {integrity: sha512-IRPgpSpwOq4JNn3efeTrbYDMmzjOKCTJtu1Wyo/+6nenyqwqIvlojYDczRILOeHa1HyCMYmqpdvfOovOVzDIGg==} + /rehype-mathjax@6.0.0: + resolution: {integrity: sha512-SioRmn+0mRWtDc4QVKG9JG88bXhPazfhc11GQoQ68mwot2WWyfabyZ7tuJu3Z4LCf893wXkQTVTF8PUlntoDwA==} dependencies: '@types/hast': 3.0.4 - '@types/mathjax': 0.0.37 + '@types/mathjax': 0.0.40 hast-util-from-dom: 5.0.0 hast-util-to-text: 4.0.1 - jsdom: 22.1.0 + jsdom: 23.2.0 mathjax-full: 3.2.2 unified: 11.0.4 unist-util-visit-parents: 6.0.1 @@ -15034,12 +14886,13 @@ packages: - supports-color dev: true - /remark-smartypants@2.1.0: - resolution: {integrity: sha512-qoF6Vz3BjU2tP6OfZqHOvCU0ACmu/6jhGaINSQRI9mM7wCxNQTKB3JUAN4SVoN2ybElEDTxBIABRep7e569iJw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + /remark-smartypants@3.0.0: + resolution: {integrity: sha512-6/xo47aZxWJd1L6VsDWX5EJRtRC2X0+vBRVh6MPD1doayFC6VRrxez6Z8GcEDqznvf9Ly+EtpasNYQptyhy8nQ==} + engines: {node: '>=16.0.0'} dependencies: - retext: 8.1.0 - retext-smartypants: 5.2.0 + retext: 9.0.0 + retext-smartypants: 6.1.0 + unified: 11.0.4 unist-util-visit: 5.0.0 dev: false @@ -15065,6 +14918,11 @@ packages: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: true + /require-main-filename@2.0.0: resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} dev: true @@ -15098,39 +14956,37 @@ packages: signal-exit: 3.0.7 dev: false - /retext-latin@3.1.0: - resolution: {integrity: sha512-5MrD1tuebzO8ppsja5eEu+ZbBeUNCjoEarn70tkXOS7Bdsdf6tNahsv2bY0Z8VooFF6cw7/6S+d3yI/TMlMVVQ==} + /retext-latin@4.0.0: + resolution: {integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==} dependencies: - '@types/nlcst': 1.0.4 - parse-latin: 5.0.1 - unherit: 3.0.1 - unified: 10.1.2 + '@types/nlcst': 2.0.3 + parse-latin: 7.0.0 + unified: 11.0.4 dev: false - /retext-smartypants@5.2.0: - resolution: {integrity: sha512-Do8oM+SsjrbzT2UNIKgheP0hgUQTDDQYyZaIY3kfq0pdFzoPk+ZClYJ+OERNXveog4xf1pZL4PfRxNoVL7a/jw==} + /retext-smartypants@6.1.0: + resolution: {integrity: sha512-LDPXg95346bqFZnDMHo0S7Rq5p64+B+N8Vz733+wPMDtwb9rCOs9LIdIEhrUOU+TAywX9St+ocQWJt8wrzivcQ==} dependencies: - '@types/nlcst': 1.0.4 - nlcst-to-string: 3.1.1 - unified: 10.1.2 - unist-util-visit: 4.1.2 + '@types/nlcst': 2.0.3 + nlcst-to-string: 4.0.0 + unist-util-visit: 5.0.0 dev: false - /retext-stringify@3.1.0: - resolution: {integrity: sha512-767TLOaoXFXyOnjx/EggXlb37ZD2u4P1n0GJqVdpipqACsQP+20W+BNpMYrlJkq7hxffnFk+jc6mAK9qrbuB8w==} + /retext-stringify@4.0.0: + resolution: {integrity: sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==} dependencies: - '@types/nlcst': 1.0.4 - nlcst-to-string: 3.1.1 - unified: 10.1.2 + '@types/nlcst': 2.0.3 + nlcst-to-string: 4.0.0 + unified: 11.0.4 dev: false - /retext@8.1.0: - resolution: {integrity: sha512-N9/Kq7YTn6ZpzfiGW45WfEGJqFf1IM1q8OsRa1CGzIebCJBNCANDRmOrholiDRGKo/We7ofKR4SEvcGAWEMD3Q==} + /retext@9.0.0: + resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==} dependencies: - '@types/nlcst': 1.0.4 - retext-latin: 3.1.0 - retext-stringify: 3.1.0 - unified: 10.1.2 + '@types/nlcst': 2.0.3 + retext-latin: 4.0.0 + retext-stringify: 4.0.0 + unified: 11.0.4 dev: false /retimer@3.0.0: @@ -15147,6 +15003,14 @@ packages: dependencies: glob: 7.2.3 + /rimraf@5.0.5: + resolution: {integrity: sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==} + engines: {node: '>=14'} + hasBin: true + dependencies: + glob: 10.3.12 + dev: false + /rollup@4.14.3: resolution: {integrity: sha512-ag5tTQKYsj1bhrFC9+OEWqb5O6VYgtQDO9hPDBMmIbePwhfSr+ExlcU741t8Dhw5DkPCQf6noz0jb36D6W9/hw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -15405,10 +15269,6 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - /shell-quote@1.8.1: - resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} - dev: true - /shiki-twoslash@3.1.2(typescript@5.2.2): resolution: {integrity: sha512-JBcRIIizi+exIA/OUhYkV6jtyeZco0ykCkIRd5sgwIt1Pm4pz+maoaRZpm6SkhPwvif4fCA7xOtJOykhpIV64Q==} peerDependencies: @@ -15644,11 +15504,9 @@ packages: resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} dev: false - /stdin-discarder@0.1.0: - resolution: {integrity: sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - bl: 5.1.0 + /stdin-discarder@0.2.2: + resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} + engines: {node: '>=18'} dev: false /stream-replace-string@2.0.0: @@ -15687,15 +15545,6 @@ packages: emoji-regex: 9.2.2 strip-ansi: 7.1.0 - /string-width@6.1.0: - resolution: {integrity: sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==} - engines: {node: '>=16'} - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 10.3.0 - strip-ansi: 7.1.0 - dev: false - /string-width@7.1.0: resolution: {integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==} engines: {node: '>=18'} @@ -15705,16 +15554,6 @@ packages: strip-ansi: 7.1.0 dev: false - /string.prototype.padend@3.1.6: - resolution: {integrity: sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 - dev: true - /string.prototype.trim@1.2.9: resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} engines: {node: '>= 0.4'} @@ -16040,6 +15879,18 @@ packages: yallist: 4.0.0 dev: false + /tar@7.0.1: + resolution: {integrity: sha512-IjMhdQMZFpKsHEQT3woZVxBtCQY+0wk3CVxdRkGXEgyGa0dNS/ehPvOMr2nmfC7x5Zj2N+l6yZUpmICjLGS35w==} + engines: {node: '>=18'} + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 5.0.0 + minizlib: 3.0.1 + mkdirp: 3.0.1 + yallist: 5.0.0 + dev: false + /term-size@2.2.1: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} @@ -16128,9 +15979,9 @@ packages: /tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - /tr46@4.1.1: - resolution: {integrity: sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==} - engines: {node: '>=14'} + /tr46@5.0.0: + resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} + engines: {node: '>=18'} dependencies: punycode: 2.3.1 dev: true @@ -16454,26 +16305,10 @@ packages: engines: {node: '>=18.0'} dev: true - /unherit@3.0.1: - resolution: {integrity: sha512-akOOQ/Yln8a2sgcLj4U0Jmx0R5jpIg2IUyRrWOzmEbjBtGzBdHtSeFKgoEcoH4KYIG/Pb8GQ/BwtYm0GCq1Sqg==} - dev: false - /unicorn-magic@0.1.0: resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} engines: {node: '>=18'} - /unified@10.1.2: - resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} - dependencies: - '@types/unist': 2.0.10 - bail: 2.0.2 - extend: 3.0.2 - is-buffer: 2.0.5 - is-plain-obj: 4.1.0 - trough: 2.2.0 - vfile: 5.3.7 - dev: false - /unified@11.0.4: resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} dependencies: @@ -16498,21 +16333,15 @@ packages: resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==} dev: true - /unist-util-is@5.2.1: - resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} - dependencies: - '@types/unist': 2.0.10 - dev: false - /unist-util-is@6.0.0: resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} dependencies: '@types/unist': 3.0.2 - /unist-util-modify-children@3.1.1: - resolution: {integrity: sha512-yXi4Lm+TG5VG+qvokP6tpnk+r1EPwyYL04JWDxLvgvPV40jANh7nm3udk65OOWquvbMDe+PL9+LmkxDpTv/7BA==} + /unist-util-modify-children@4.0.0: + resolution: {integrity: sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==} dependencies: - '@types/unist': 2.0.10 + '@types/unist': 3.0.2 array-iterate: 2.0.1 dev: false @@ -16542,21 +16371,15 @@ packages: zwitch: 2.0.4 dev: false - /unist-util-stringify-position@3.0.3: - resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} - dependencies: - '@types/unist': 2.0.10 - dev: false - /unist-util-stringify-position@4.0.0: resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} dependencies: '@types/unist': 3.0.2 - /unist-util-visit-children@2.0.2: - resolution: {integrity: sha512-+LWpMFqyUwLGpsQxpumsQ9o9DG2VGLFrpz+rpVXYIEdPy57GSy5HioC0g3bg/8WP9oCLlapQtklOzQ8uLS496Q==} + /unist-util-visit-children@3.0.0: + resolution: {integrity: sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==} dependencies: - '@types/unist': 2.0.10 + '@types/unist': 3.0.2 dev: false /unist-util-visit-parents@2.1.2: @@ -16571,13 +16394,6 @@ packages: unist-util-is: 4.1.0 dev: true - /unist-util-visit-parents@5.1.3: - resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} - dependencies: - '@types/unist': 2.0.10 - unist-util-is: 5.2.1 - dev: false - /unist-util-visit-parents@6.0.1: resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} dependencies: @@ -16597,14 +16413,6 @@ packages: unist-util-visit-parents: 3.1.1 dev: true - /unist-util-visit@4.1.2: - resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} - dependencies: - '@types/unist': 2.0.10 - unist-util-is: 5.2.1 - unist-util-visit-parents: 5.1.3 - dev: false - /unist-util-visit@5.0.0: resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} dependencies: @@ -16701,28 +16509,12 @@ packages: '@types/unist': 3.0.2 vfile: 6.0.1 - /vfile-message@3.1.4: - resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} - dependencies: - '@types/unist': 2.0.10 - unist-util-stringify-position: 3.0.3 - dev: false - /vfile-message@4.0.2: resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} dependencies: '@types/unist': 3.0.2 unist-util-stringify-position: 4.0.0 - /vfile@5.3.7: - resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} - dependencies: - '@types/unist': 2.0.10 - is-buffer: 2.0.5 - unist-util-stringify-position: 3.0.3 - vfile-message: 3.1.4 - dev: false - /vfile@6.0.1: resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} dependencies: @@ -17048,11 +16840,11 @@ packages: '@vue/shared': 3.4.21 typescript: 5.2.2 - /w3c-xmlserializer@4.0.0: - resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} - engines: {node: '>=14'} + /w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} dependencies: - xml-name-validator: 4.0.0 + xml-name-validator: 5.0.0 dev: true /wcwidth@1.0.1: @@ -17081,23 +16873,23 @@ packages: engines: {node: '>=12'} dev: true - /whatwg-encoding@2.0.0: - resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} - engines: {node: '>=12'} + /whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} dependencies: iconv-lite: 0.6.3 dev: true - /whatwg-mimetype@3.0.0: - resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} - engines: {node: '>=12'} + /whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} dev: true - /whatwg-url@12.0.1: - resolution: {integrity: sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==} - engines: {node: '>=14'} + /whatwg-url@14.0.0: + resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==} + engines: {node: '>=18'} dependencies: - tr46: 4.1.1 + tr46: 5.0.0 webidl-conversions: 7.0.0 dev: true @@ -17235,9 +17027,9 @@ packages: utf-8-validate: optional: true - /xml-name-validator@4.0.0: - resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} - engines: {node: '>=12'} + /xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} dev: true /xml2js@0.6.2: @@ -17281,6 +17073,11 @@ packages: /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + /yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + dev: false + /yaml@2.4.1: resolution: {integrity: sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==} engines: {node: '>= 14'} diff --git a/scripts/cmd/copy.js b/scripts/cmd/copy.js index 377a60a391..943c998dfb 100644 --- a/scripts/cmd/copy.js +++ b/scripts/cmd/copy.js @@ -2,7 +2,7 @@ import arg from 'arg'; import { globby as glob } from 'globby'; import { promises as fs, readFileSync } from 'node:fs'; import { posix } from 'node:path'; -import tar from 'tar'; +import * as tar from 'tar/create'; const { resolve, dirname, sep, join } = posix; diff --git a/scripts/package.json b/scripts/package.json index 2365867f5b..3ea28ab255 100644 --- a/scripts/package.json +++ b/scripts/package.json @@ -14,7 +14,7 @@ "kleur": "^4.1.4", "p-limit": "^5.0.0", "svelte": "^4.2.5", - "tar": "^6.1.15" + "tar": "^7.0.1" }, "devDependencies": { "@octokit/action": "^6.0.5", From 2727370932197e2a84bc013b704bf1eb8e69e735 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 22 Apr 2024 11:28:03 +0800 Subject: [PATCH 30/36] chore(deps): update dependency @types/mime to v4 (#10834) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: bluwy --- packages/astro/package.json | 1 - pnpm-lock.yaml | 7 ------- 2 files changed, 8 deletions(-) diff --git a/packages/astro/package.json b/packages/astro/package.json index 9a5c148f55..c468d0eb6f 100644 --- a/packages/astro/package.json +++ b/packages/astro/package.json @@ -198,7 +198,6 @@ "@types/html-escaper": "^3.0.2", "@types/http-cache-semantics": "^4.0.4", "@types/js-yaml": "^4.0.9", - "@types/mime": "^3.0.4", "@types/mocha": "^10.0.4", "@types/probe-image-size": "^7.2.3", "@types/prompts": "^2.4.8", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b3a7f89323..b465732820 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -745,9 +745,6 @@ importers: '@types/js-yaml': specifier: ^4.0.9 version: 4.0.9 - '@types/mime': - specifier: ^3.0.4 - version: 3.0.4 '@types/mocha': specifier: ^10.0.4 version: 10.0.6 @@ -8243,10 +8240,6 @@ packages: resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} dev: true - /@types/mime@3.0.4: - resolution: {integrity: sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==} - dev: true - /@types/minimist@1.2.5: resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} dev: true From 79b738539add08d12b5598aca2ebddb8ed8d571c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 22 Apr 2024 13:38:37 +0800 Subject: [PATCH 31/36] chore(deps): update dependency chai to v5 (#10835) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: bluwy --- .github/renovate.json5 | 7 +++++- packages/db/package.json | 2 +- pnpm-lock.yaml | 48 ++++++++++++++++++++++++++++++++++++++-- 3 files changed, 53 insertions(+), 4 deletions(-) diff --git a/.github/renovate.json5 b/.github/renovate.json5 index 3ca916bd1f..9e2a0a36e2 100644 --- a/.github/renovate.json5 +++ b/.github/renovate.json5 @@ -1,6 +1,11 @@ { "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "extends": ["config:base", "schedule:weekly", "group:allNonMajor"], + "extends": [ + "config:recommended", + "schedule:weekly", + "group:allNonMajor", + ":disablePeerDependencies", + ], "labels": ["dependencies"], "rangeStrategy": "bump", "ignoreDeps": [ diff --git a/packages/db/package.json b/packages/db/package.json index 1764dd3e5f..246777ce83 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -93,7 +93,7 @@ "@types/yargs-parser": "^21.0.3", "astro": "workspace:*", "astro-scripts": "workspace:*", - "chai": "^4.4.1", + "chai": "^5.1.0", "cheerio": "1.0.0-rc.12", "mocha": "^10.2.0", "typescript": "^5.2.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b465732820..371e2b33ba 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -3936,8 +3936,8 @@ importers: specifier: workspace:* version: link:../../scripts chai: - specifier: ^4.4.1 - version: 4.4.1 + specifier: ^5.1.0 + version: 5.1.0 cheerio: specifier: 1.0.0-rc.12 version: 1.0.0-rc.12 @@ -9148,6 +9148,12 @@ packages: /assertion-error@1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + dev: false + + /assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + dev: true /astring@1.8.6: resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} @@ -9548,6 +9554,18 @@ packages: loupe: 2.3.7 pathval: 1.1.1 type-detect: 4.0.8 + dev: false + + /chai@5.1.0: + resolution: {integrity: sha512-kDZ7MZyM6Q1DhR9jy7dalKohXQ2yrlXkk59CR52aRKxJrobmlBNqnFQxX9xOX8w+4mz8SYlKJa/7D7ddltFXCw==} + engines: {node: '>=12'} + dependencies: + assertion-error: 2.0.1 + check-error: 2.0.0 + deep-eql: 5.0.1 + loupe: 3.1.0 + pathval: 2.0.0 + dev: true /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} @@ -9593,6 +9611,12 @@ packages: resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} dependencies: get-func-name: 2.0.2 + dev: false + + /check-error@2.0.0: + resolution: {integrity: sha512-tjLAOBHKVxtPoHe/SA7kNOMvhCRdCJ3vETdeY0RuAc9popf+hyaSV6ZEg9hr4cpWF7jmo/JSWEnLDrnijS9Tog==} + engines: {node: '>= 16'} + dev: true /cheerio-select@2.1.0: resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} @@ -10130,6 +10154,12 @@ packages: engines: {node: '>=6'} dependencies: type-detect: 4.0.8 + dev: false + + /deep-eql@5.0.1: + resolution: {integrity: sha512-nwQCf6ne2gez3o1MxWifqkciwt0zhl0LO1/UwVu4uMBuPmflWM4oQ70XMqHqnBJA+nhzncaqL9HVL6KkHJ28lw==} + engines: {node: '>=6'} + dev: true /deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} @@ -12493,6 +12523,13 @@ packages: resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} dependencies: get-func-name: 2.0.2 + dev: false + + /loupe@3.1.0: + resolution: {integrity: sha512-qKl+FrLXUhFuHUoDJG7f8P8gEMHq9NFS0c6ghXG1J0rldmZFQZoNVv/vyirE9qwCIhWZDsvEFd1sbFu3GvRQFg==} + dependencies: + get-func-name: 2.0.2 + dev: true /lower-case@1.1.4: resolution: {integrity: sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==} @@ -13908,6 +13945,12 @@ packages: /pathval@1.1.1: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + dev: false + + /pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} + dev: true /periscopic@3.1.0: resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} @@ -16140,6 +16183,7 @@ packages: /type-detect@4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} + dev: false /type-fest@0.13.1: resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} From 68e3b7c59dcbbcf902d3ad42b5aa8df81cc89332 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 22 Apr 2024 13:39:43 +0800 Subject: [PATCH 32/36] chore(deps): update dependency devalue to v5 (#10836) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- packages/astro/package.json | 2 +- packages/integrations/markdoc/package.json | 2 +- pnpm-lock.yaml | 12 ++++++------ 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/astro/package.json b/packages/astro/package.json index c468d0eb6f..fbcdf61176 100644 --- a/packages/astro/package.json +++ b/packages/astro/package.json @@ -138,7 +138,7 @@ "cssesc": "^3.0.0", "debug": "^4.3.4", "deterministic-object-hash": "^2.0.1", - "devalue": "^4.3.2", + "devalue": "^5.0.0", "diff": "^5.1.0", "dlv": "^1.1.3", "dset": "^3.1.3", diff --git a/packages/integrations/markdoc/package.json b/packages/integrations/markdoc/package.json index 93cc2b174f..af59304a0f 100644 --- a/packages/integrations/markdoc/package.json +++ b/packages/integrations/markdoc/package.json @@ -81,7 +81,7 @@ "@types/markdown-it": "^14.0.1", "astro": "workspace:*", "astro-scripts": "workspace:*", - "devalue": "^4.3.2", + "devalue": "^5.0.0", "linkedom": "^0.16.4", "vite": "^5.1.4" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 371e2b33ba..eaa91e0537 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -576,8 +576,8 @@ importers: specifier: ^2.0.1 version: 2.0.2 devalue: - specifier: ^4.3.2 - version: 4.3.2 + specifier: ^5.0.0 + version: 5.0.0 diff: specifier: ^5.1.0 version: 5.2.0 @@ -4222,8 +4222,8 @@ importers: specifier: workspace:* version: link:../../../scripts devalue: - specifier: ^4.3.2 - version: 4.3.2 + specifier: ^5.0.0 + version: 5.0.0 linkedom: specifier: ^0.16.4 version: 0.16.11 @@ -10287,8 +10287,8 @@ packages: base-64: 1.0.0 dev: false - /devalue@4.3.2: - resolution: {integrity: sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==} + /devalue@5.0.0: + resolution: {integrity: sha512-gO+/OMXF7488D+u3ue+G7Y4AA3ZmUnB3eHJXmBTgNHvr4ZNzl36A0ZtG+XCRNYCkYx/bFmw4qtkoFLa+wSrwAA==} /devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} From a2df344bff15647c2bfb3f49e3f7b66aa069d6f4 Mon Sep 17 00:00:00 2001 From: Martin Trapp <94928215+martrapp@users.noreply.github.com> Date: Mon, 22 Apr 2024 12:18:37 +0200 Subject: [PATCH 33/36] revert handling of JavaScript animations during view transitions (#10841) --- .changeset/weak-swans-sparkle.md | 5 +++++ packages/astro/src/transitions/router.ts | 2 -- 2 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 .changeset/weak-swans-sparkle.md diff --git a/.changeset/weak-swans-sparkle.md b/.changeset/weak-swans-sparkle.md new file mode 100644 index 0000000000..ee99d8bc70 --- /dev/null +++ b/.changeset/weak-swans-sparkle.md @@ -0,0 +1,5 @@ +--- +"astro": patch +--- + +Due to regression on mobile WebKit browsers, reverts a change made for JavaScript animations during view transitions. diff --git a/packages/astro/src/transitions/router.ts b/packages/astro/src/transitions/router.ts index a68e423d05..8655d94c2b 100644 --- a/packages/astro/src/transitions/router.ts +++ b/packages/astro/src/transitions/router.ts @@ -397,8 +397,6 @@ async function updateDOM( return style.animationIterationCount === 'infinite'; } const currentAnimations = document.getAnimations(); - // allow animations triggered by viewTransition.ready to start - await new Promise((r) => setTimeout(r)); // Trigger view transition animations waiting for data-astro-transition-fallback document.documentElement.setAttribute(OLD_NEW_ATTR, phase); const nextAnimations = document.getAnimations(); From 2f4d627815d93ae8c10db747dc6cbf1dd9130cd6 Mon Sep 17 00:00:00 2001 From: Bjorn Lu Date: Mon, 22 Apr 2024 21:18:27 +0800 Subject: [PATCH 34/36] Refactor MDX postprocess plugin (#10832) --- packages/integrations/mdx/src/index.ts | 74 +---------- packages/integrations/mdx/src/utils.ts | 2 +- .../mdx/src/vite-plugin-mdx-postprocess.ts | 115 ++++++++++++++++++ 3 files changed, 118 insertions(+), 73 deletions(-) create mode 100644 packages/integrations/mdx/src/vite-plugin-mdx-postprocess.ts diff --git a/packages/integrations/mdx/src/index.ts b/packages/integrations/mdx/src/index.ts index db7f641345..e48d0d8f19 100644 --- a/packages/integrations/mdx/src/index.ts +++ b/packages/integrations/mdx/src/index.ts @@ -3,19 +3,14 @@ import { fileURLToPath } from 'node:url'; import { markdownConfigDefaults, setVfileFrontmatter } from '@astrojs/markdown-remark'; import type { AstroIntegration, ContentEntryType, HookParameters, SSRError } from 'astro'; import astroJSXRenderer from 'astro/jsx/renderer.js'; -import { parse as parseESM } from 'es-module-lexer'; import type { Options as RemarkRehypeOptions } from 'remark-rehype'; import type { PluggableList } from 'unified'; import { VFile } from 'vfile'; import type { Plugin as VitePlugin } from 'vite'; import { createMdxProcessor } from './plugins.js'; import type { OptimizeOptions } from './rehype-optimize-static.js'; -import { - ASTRO_IMAGE_ELEMENT, - ASTRO_IMAGE_IMPORT, - USES_ASTRO_IMAGE_FLAG, -} from './remark-images-to-component.js'; import { getFileInfo, ignoreStringPlugins, parseFrontmatter } from './utils.js'; +import { vitePluginMdxPostprocess } from './vite-plugin-mdx-postprocess.js'; export type MdxOptions = Omit & { extendMarkdownConfig: boolean; @@ -157,72 +152,7 @@ export default function mdx(partialMdxOptions: Partial = {}): AstroI } }, }, - { - name: '@astrojs/mdx-postprocess', - // These transforms must happen *after* JSX runtime transformations - transform(code, id) { - if (!id.endsWith('.mdx')) return; - - const [moduleImports, moduleExports] = parseESM(code); - - // Fragment import should already be injected, but check just to be safe. - const importsFromJSXRuntime = moduleImports - .filter(({ n }) => n === 'astro/jsx-runtime') - .map(({ ss, se }) => code.substring(ss, se)); - const hasFragmentImport = importsFromJSXRuntime.some((statement) => - /[\s,{](?:Fragment,|Fragment\s*\})/.test(statement) - ); - if (!hasFragmentImport) { - code = 'import { Fragment } from "astro/jsx-runtime"\n' + code; - } - - const { fileUrl, fileId } = getFileInfo(id, config); - if (!moduleExports.find(({ n }) => n === 'url')) { - code += `\nexport const url = ${JSON.stringify(fileUrl)};`; - } - if (!moduleExports.find(({ n }) => n === 'file')) { - code += `\nexport const file = ${JSON.stringify(fileId)};`; - } - if (!moduleExports.find(({ n }) => n === 'Content')) { - // If have `export const components`, pass that as props to `Content` as fallback - const hasComponents = moduleExports.find(({ n }) => n === 'components'); - const usesAstroImage = moduleExports.find( - ({ n }) => n === USES_ASTRO_IMAGE_FLAG - ); - - let componentsCode = `{ Fragment${ - hasComponents ? ', ...components' : '' - }, ...props.components,`; - if (usesAstroImage) { - componentsCode += ` ${JSON.stringify(ASTRO_IMAGE_ELEMENT)}: ${ - hasComponents ? 'components.img ?? ' : '' - } props.components?.img ?? ${ASTRO_IMAGE_IMPORT}`; - } - componentsCode += ' }'; - - // Make `Content` the default export so we can wrap `MDXContent` and pass in `Fragment` - code = code.replace( - 'export default function MDXContent', - 'function MDXContent' - ); - code += `\nexport const Content = (props = {}) => MDXContent({ - ...props, - components: ${componentsCode}, - }); - export default Content;`; - } - - // mark the component as an MDX component - code += `\nContent[Symbol.for('mdx-component')] = true`; - - // Ensures styles and scripts are injected into a `` - // When a layout is not applied - code += `\nContent[Symbol.for('astro.needsHeadRendering')] = !Boolean(frontmatter.layout);`; - code += `\nContent.moduleId = ${JSON.stringify(id)};`; - - return { code, map: null }; - }, - }, + vitePluginMdxPostprocess(config), ] as VitePlugin[], }, }); diff --git a/packages/integrations/mdx/src/utils.ts b/packages/integrations/mdx/src/utils.ts index 199929dc87..9adf3586f4 100644 --- a/packages/integrations/mdx/src/utils.ts +++ b/packages/integrations/mdx/src/utils.ts @@ -10,7 +10,7 @@ function appendForwardSlash(path: string) { return path.endsWith('/') ? path : path + '/'; } -interface FileInfo { +export interface FileInfo { fileId: string; fileUrl: string; } diff --git a/packages/integrations/mdx/src/vite-plugin-mdx-postprocess.ts b/packages/integrations/mdx/src/vite-plugin-mdx-postprocess.ts new file mode 100644 index 0000000000..c60504be6c --- /dev/null +++ b/packages/integrations/mdx/src/vite-plugin-mdx-postprocess.ts @@ -0,0 +1,115 @@ +import type { AstroConfig } from 'astro'; +import { type ExportSpecifier, type ImportSpecifier, parse } from 'es-module-lexer'; +import type { Plugin } from 'vite'; +import { + ASTRO_IMAGE_ELEMENT, + ASTRO_IMAGE_IMPORT, + USES_ASTRO_IMAGE_FLAG, +} from './remark-images-to-component.js'; +import { type FileInfo, getFileInfo } from './utils.js'; + +// These transforms must happen *after* JSX runtime transformations +export function vitePluginMdxPostprocess(astroConfig: AstroConfig): Plugin { + return { + name: '@astrojs/mdx-postprocess', + transform(code, id) { + if (!id.endsWith('.mdx')) return; + + const fileInfo = getFileInfo(id, astroConfig); + const [imports, exports] = parse(code); + + // Call a series of functions that transform the code + code = injectFragmentImport(code, imports); + code = injectMetadataExports(code, exports, fileInfo); + code = transformContentExport(code, exports); + code = annotateContentExport(code, id); + + // The code transformations above are append-only, so the line/column mappings are the same + // and we can omit the sourcemap for performance. + return { code, map: null }; + }, + }; +} + +const fragmentImportRegex = /[\s,{](?:Fragment,|Fragment\s*\})/; + +/** + * Inject `Fragment` identifier import if not already present. It should already be injected, + * but check just to be safe. + * + * TODO: Double-check if we no longer need this function. + */ +function injectFragmentImport(code: string, imports: readonly ImportSpecifier[]) { + const importsFromJSXRuntime = imports + .filter(({ n }) => n === 'astro/jsx-runtime') + .map(({ ss, se }) => code.substring(ss, se)); + const hasFragmentImport = importsFromJSXRuntime.some((statement) => + fragmentImportRegex.test(statement) + ); + if (!hasFragmentImport) { + code = `import { Fragment } from "astro/jsx-runtime"\n` + code; + } + return code; +} + +/** + * Inject MDX metadata as exports of the module. + */ +function injectMetadataExports( + code: string, + exports: readonly ExportSpecifier[], + fileInfo: FileInfo +) { + if (!exports.some(({ n }) => n === 'url')) { + code += `\nexport const url = ${JSON.stringify(fileInfo.fileUrl)};`; + } + if (!exports.some(({ n }) => n === 'file')) { + code += `\nexport const file = ${JSON.stringify(fileInfo.fileId)};`; + } + return code; +} + +/** + * Transforms the `MDXContent` default export as `Content`, which wraps `MDXContent` and + * passes additional `components` props. + */ +function transformContentExport(code: string, exports: readonly ExportSpecifier[]) { + if (exports.find(({ n }) => n === 'Content')) return code; + + // If have `export const components`, pass that as props to `Content` as fallback + const hasComponents = exports.find(({ n }) => n === 'components'); + const usesAstroImage = exports.find(({ n }) => n === USES_ASTRO_IMAGE_FLAG); + + // Generate code for the `components` prop passed to `MDXContent` + let componentsCode = `{ Fragment${hasComponents ? ', ...components' : ''}, ...props.components,`; + if (usesAstroImage) { + componentsCode += ` ${JSON.stringify(ASTRO_IMAGE_ELEMENT)}: ${ + hasComponents ? 'components.img ?? ' : '' + } props.components?.img ?? ${ASTRO_IMAGE_IMPORT}`; + } + componentsCode += ' }'; + + // Make `Content` the default export so we can wrap `MDXContent` and pass in `Fragment` + code = code.replace('export default function MDXContent', 'function MDXContent'); + code += ` +export const Content = (props = {}) => MDXContent({ + ...props, + components: ${componentsCode}, +}); +export default Content;`; + return code; +} + +/** + * Add properties to the `Content` export. + */ +function annotateContentExport(code: string, id: string) { + // Mark `Content` as MDX component + code += `\nContent[Symbol.for('mdx-component')] = true`; + // Ensure styles and scripts are injected into a `` when a layout is not applied + code += `\nContent[Symbol.for('astro.needsHeadRendering')] = !Boolean(frontmatter.layout);`; + // Assign the `moduleId` metadata to `Content` + code += `\nContent.moduleId = ${JSON.stringify(id)};`; + + return code; +} From 251ab8bb12866145ebdc9df26a0468b00e2c32ea Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Mon, 22 Apr 2024 10:49:59 +0100 Subject: [PATCH 35/36] feat: implement reroute in dev (#10818) * chore: implement reroute in dev * chore: revert naming change * chore: conditionally create the new request * chore: handle error * remove only * remove only * chore: add tests and remove logs * chore: fix regression * chore: fix regression route matching * chore: remove unwanted test --- packages/astro/src/@types/astro.ts | 25 +++- packages/astro/src/core/app/pipeline.ts | 15 +- packages/astro/src/core/app/types.ts | 2 + packages/astro/src/core/base-pipeline.ts | 19 +++ packages/astro/src/core/build/generate.ts | 1 + packages/astro/src/core/build/pipeline.ts | 19 ++- .../src/core/build/plugins/plugin-manifest.ts | 1 + packages/astro/src/core/config/schema.ts | 2 + .../src/core/middleware/callMiddleware.ts | 13 +- packages/astro/src/core/middleware/index.ts | 14 +- .../astro/src/core/middleware/sequence.ts | 9 +- packages/astro/src/core/render-context.ts | 138 +++++++++++++++--- packages/astro/src/prerender/routing.ts | 2 +- .../src/vite-plugin-astro-server/pipeline.ts | 86 +++++++++-- .../src/vite-plugin-astro-server/plugin.ts | 4 +- .../src/vite-plugin-astro-server/route.ts | 66 ++++----- .../middleware-virtual/astro.config.mjs | 3 + .../fixtures/middleware-virtual/package.json | 8 + .../middleware-virtual/src/middleware.js | 6 + .../middleware-virtual/src/pages/index.astro | 13 ++ .../test/fixtures/reroute/astro.config.mjs | 8 + .../astro/test/fixtures/reroute/package.json | 8 + .../reroute/src/pages/blog/hello/index.astro | 11 ++ .../reroute/src/pages/blog/salut/index.astro | 11 ++ .../fixtures/reroute/src/pages/index.astro | 10 ++ .../fixtures/reroute/src/pages/reroute.astro | 11 ++ packages/astro/test/reroute.test.js | 42 ++++++ .../test/units/routing/route-matching.test.js | 2 +- .../vite-plugin-astro-server/request.test.js | 2 +- 29 files changed, 465 insertions(+), 86 deletions(-) create mode 100644 packages/astro/test/fixtures/middleware-virtual/astro.config.mjs create mode 100644 packages/astro/test/fixtures/middleware-virtual/package.json create mode 100644 packages/astro/test/fixtures/middleware-virtual/src/middleware.js create mode 100644 packages/astro/test/fixtures/middleware-virtual/src/pages/index.astro create mode 100644 packages/astro/test/fixtures/reroute/astro.config.mjs create mode 100644 packages/astro/test/fixtures/reroute/package.json create mode 100644 packages/astro/test/fixtures/reroute/src/pages/blog/hello/index.astro create mode 100644 packages/astro/test/fixtures/reroute/src/pages/blog/salut/index.astro create mode 100644 packages/astro/test/fixtures/reroute/src/pages/index.astro create mode 100644 packages/astro/test/fixtures/reroute/src/pages/reroute.astro create mode 100644 packages/astro/test/reroute.test.js diff --git a/packages/astro/src/@types/astro.ts b/packages/astro/src/@types/astro.ts index 52bf7d397c..a189cfeb27 100644 --- a/packages/astro/src/@types/astro.ts +++ b/packages/astro/src/@types/astro.ts @@ -245,6 +245,10 @@ export interface AstroGlobal< * [Astro reference](https://docs.astro.build/en/guides/server-side-rendering/) */ redirect: AstroSharedContext['redirect']; + /** + * TODO add documentation + */ + reroute: AstroSharedContext['reroute']; /** * The element allows a component to reference itself recursively. * @@ -1917,6 +1921,18 @@ export interface AstroUserConfig { origin?: boolean; }; }; + + /** + * @docs + * @name experimental.rerouting + * @type {boolean} + * @default `false` + * @version 4.6.0 + * @description + * + * TODO + */ + rerouting: boolean; }; } @@ -2478,6 +2494,11 @@ interface AstroSharedContext< */ redirect(path: string, status?: ValidRedirectStatus): Response; + /** + * TODO: add documentation + */ + reroute(reroutePayload: ReroutePayload): Promise; + /** * Object accessed via Astro middleware */ @@ -2784,7 +2805,9 @@ export interface AstroIntegration { }; } -export type MiddlewareNext = () => Promise; +export type ReroutePayload = string | URL | Request; + +export type MiddlewareNext = (reroutePayload?: ReroutePayload) => Promise; export type MiddlewareHandler = ( context: APIContext, next: MiddlewareNext diff --git a/packages/astro/src/core/app/pipeline.ts b/packages/astro/src/core/app/pipeline.ts index b1c615a1eb..0f124a18ee 100644 --- a/packages/astro/src/core/app/pipeline.ts +++ b/packages/astro/src/core/app/pipeline.ts @@ -1,4 +1,10 @@ -import type { RouteData, SSRElement, SSRResult } from '../../@types/astro.js'; +import type { + ComponentInstance, + ReroutePayload, + RouteData, + SSRElement, + SSRResult, +} from '../../@types/astro.js'; import { Pipeline } from '../base-pipeline.js'; import { createModuleScriptElement, createStylesheetElementSet } from '../render/ssr-element.js'; @@ -41,4 +47,11 @@ export class AppPipeline extends Pipeline { } componentMetadata() {} + getComponentByRoute(_routeData: RouteData): Promise { + throw new Error('unimplemented'); + } + + tryReroute(_reroutePayload: ReroutePayload): Promise<[RouteData, ComponentInstance]> { + throw new Error('unimplemented'); + } } diff --git a/packages/astro/src/core/app/types.ts b/packages/astro/src/core/app/types.ts index fd56c6f106..6b327fd6fe 100644 --- a/packages/astro/src/core/app/types.ts +++ b/packages/astro/src/core/app/types.ts @@ -65,6 +65,8 @@ export type SSRManifest = { i18n: SSRManifestI18n | undefined; middleware: MiddlewareHandler; checkOrigin: boolean; + // TODO: remove once the experimental flag is removed + reroutingEnabled: boolean; }; export type SSRManifestI18n = { diff --git a/packages/astro/src/core/base-pipeline.ts b/packages/astro/src/core/base-pipeline.ts index 832823db35..4f6c825539 100644 --- a/packages/astro/src/core/base-pipeline.ts +++ b/packages/astro/src/core/base-pipeline.ts @@ -1,5 +1,7 @@ import type { + ComponentInstance, MiddlewareHandler, + ReroutePayload, RouteData, RuntimeMode, SSRLoadedRenderer, @@ -59,6 +61,23 @@ export abstract class Pipeline { abstract headElements(routeData: RouteData): Promise | HeadElements; abstract componentMetadata(routeData: RouteData): Promise | void; + + /** + * It attempts to retrieve the `RouteData` that matches the input `url`, and the component that belongs to the `RouteData`. + * + * ## Errors + * + * - if not `RouteData` is found + * + * @param {ReroutePayload} reroutePayload + */ + abstract tryReroute(reroutePayload: ReroutePayload): Promise<[RouteData, ComponentInstance]>; + + /** + * Tells the pipeline how to retrieve a component give a `RouteData` + * @param routeData + */ + abstract getComponentByRoute(routeData: RouteData): Promise; } // eslint-disable-next-line @typescript-eslint/no-empty-interface diff --git a/packages/astro/src/core/build/generate.ts b/packages/astro/src/core/build/generate.ts index 381c9e6426..402c68c2ab 100644 --- a/packages/astro/src/core/build/generate.ts +++ b/packages/astro/src/core/build/generate.ts @@ -615,6 +615,7 @@ function createBuildManifest( i18n: i18nManifest, buildFormat: settings.config.build.format, middleware, + reroutingEnabled: settings.config.experimental.rerouting, checkOrigin: settings.config.experimental.security?.csrfProtection?.origin ?? false, }; } diff --git a/packages/astro/src/core/build/pipeline.ts b/packages/astro/src/core/build/pipeline.ts index 245904660c..f84e33c90a 100644 --- a/packages/astro/src/core/build/pipeline.ts +++ b/packages/astro/src/core/build/pipeline.ts @@ -1,4 +1,11 @@ -import type { RouteData, SSRLoadedRenderer, SSRResult } from '../../@types/astro.js'; +import type { + RouteData, + SSRLoadedRenderer, + SSRResult, + MiddlewareHandler, + ReroutePayload, + ComponentInstance, +} from '../../@types/astro.js'; import { getOutputDirectory, isServerLikeOutput } from '../../prerender/utils.js'; import { BEFORE_HYDRATION_SCRIPT_ID, PAGE_SCRIPT_ID } from '../../vite-plugin-scripts/index.js'; import type { SSRManifest } from '../app/types.js'; @@ -21,6 +28,8 @@ import { getVirtualModulePageNameFromPath } from './plugins/util.js'; import { ASTRO_PAGE_EXTENSION_POST_PATTERN } from './plugins/util.js'; import type { PageBuildData, StaticBuildOptions } from './types.js'; import { i18nHasFallback } from './util.js'; +import { defineMiddleware } from '../middleware/index.js'; +import { undefined } from 'zod'; /** * The build pipeline is responsible to gather the files emitted by the SSR build and generate the pages by executing these files. @@ -226,4 +235,12 @@ export class BuildPipeline extends Pipeline { return pages; } + + getComponentByRoute(_routeData: RouteData): Promise { + throw new Error('unimplemented'); + } + + tryReroute(_reroutePayload: ReroutePayload): Promise<[RouteData, ComponentInstance]> { + throw new Error('unimplemented'); + } } diff --git a/packages/astro/src/core/build/plugins/plugin-manifest.ts b/packages/astro/src/core/build/plugins/plugin-manifest.ts index c1e87bf458..e2f2992047 100644 --- a/packages/astro/src/core/build/plugins/plugin-manifest.ts +++ b/packages/astro/src/core/build/plugins/plugin-manifest.ts @@ -277,5 +277,6 @@ function buildManifest( i18n: i18nManifest, buildFormat: settings.config.build.format, checkOrigin: settings.config.experimental.security?.csrfProtection?.origin ?? false, + reroutingEnabled: settings.config.experimental.rerouting, }; } diff --git a/packages/astro/src/core/config/schema.ts b/packages/astro/src/core/config/schema.ts index 303846f760..879589b4b8 100644 --- a/packages/astro/src/core/config/schema.ts +++ b/packages/astro/src/core/config/schema.ts @@ -87,6 +87,7 @@ const ASTRO_CONFIG_DEFAULTS = { globalRoutePriority: false, i18nDomains: false, security: {}, + rerouting: false, }, } satisfies AstroUserConfig & { server: { open: boolean } }; @@ -525,6 +526,7 @@ export const AstroConfigSchema = z.object({ .optional() .default(ASTRO_CONFIG_DEFAULTS.experimental.security), i18nDomains: z.boolean().optional().default(ASTRO_CONFIG_DEFAULTS.experimental.i18nDomains), + rerouting: z.boolean().optional().default(ASTRO_CONFIG_DEFAULTS.experimental.rerouting), }) .strict( `Invalid or outdated experimental feature.\nCheck for incorrect spelling or outdated Astro version.\nSee https://docs.astro.build/en/reference/configuration-reference/#experimental-flags for a list of all current experiments.` diff --git a/packages/astro/src/core/middleware/callMiddleware.ts b/packages/astro/src/core/middleware/callMiddleware.ts index 0133c13d03..5a0456680a 100644 --- a/packages/astro/src/core/middleware/callMiddleware.ts +++ b/packages/astro/src/core/middleware/callMiddleware.ts @@ -1,4 +1,9 @@ -import type { APIContext, MiddlewareHandler, MiddlewareNext } from '../../@types/astro.js'; +import type { + APIContext, + MiddlewareHandler, + MiddlewareNext, + ReroutePayload, +} from '../../@types/astro.js'; import { AstroError, AstroErrorData } from '../errors/index.js'; /** @@ -38,13 +43,13 @@ import { AstroError, AstroErrorData } from '../errors/index.js'; export async function callMiddleware( onRequest: MiddlewareHandler, apiContext: APIContext, - responseFunction: () => Promise | Response + responseFunction: (reroutePayload?: ReroutePayload) => Promise | Response ): Promise { let nextCalled = false; let responseFunctionPromise: Promise | Response | undefined = undefined; - const next: MiddlewareNext = async () => { + const next: MiddlewareNext = async (payload) => { nextCalled = true; - responseFunctionPromise = responseFunction(); + responseFunctionPromise = responseFunction(payload); return responseFunctionPromise; }; diff --git a/packages/astro/src/core/middleware/index.ts b/packages/astro/src/core/middleware/index.ts index cb9304bffb..cabbbc9cb9 100644 --- a/packages/astro/src/core/middleware/index.ts +++ b/packages/astro/src/core/middleware/index.ts @@ -1,17 +1,14 @@ -import type { APIContext, MiddlewareHandler, Params } from '../../@types/astro.js'; +import type { APIContext, MiddlewareHandler, Params, ReroutePayload } from '../../@types/astro.js'; import { computeCurrentLocale, computePreferredLocale, computePreferredLocaleList, } from '../../i18n/utils.js'; -import { ASTRO_VERSION } from '../constants.js'; +import { ASTRO_VERSION, clientLocalsSymbol, clientAddressSymbol } from '../constants.js'; import { AstroCookies } from '../cookies/index.js'; import { AstroError, AstroErrorData } from '../errors/index.js'; import { sequence } from './sequence.js'; -const clientAddressSymbol = Symbol.for('astro.clientAddress'); -const clientLocalsSymbol = Symbol.for('astro.locals'); - function defineMiddleware(fn: MiddlewareHandler) { return fn; } @@ -49,6 +46,12 @@ function createContext({ const url = new URL(request.url); const route = url.pathname; + // TODO verify that this function works in an edge middleware environment + const reroute = (_reroutePayload: ReroutePayload) => { + // return dummy response + return Promise.resolve(new Response(null)); + }; + return { cookies: new AstroCookies(request), request, @@ -56,6 +59,7 @@ function createContext({ site: undefined, generator: `Astro v${ASTRO_VERSION}`, props: {}, + reroute, redirect(path, status) { return new Response(null, { status: status || 302, diff --git a/packages/astro/src/core/middleware/sequence.ts b/packages/astro/src/core/middleware/sequence.ts index 9a68963945..5a0842d8f8 100644 --- a/packages/astro/src/core/middleware/sequence.ts +++ b/packages/astro/src/core/middleware/sequence.ts @@ -1,4 +1,4 @@ -import type { APIContext, MiddlewareHandler } from '../../@types/astro.js'; +import type { APIContext, MiddlewareHandler, ReroutePayload } from '../../@types/astro.js'; import { defineMiddleware } from './index.js'; // From SvelteKit: https://github.com/sveltejs/kit/blob/master/packages/kit/src/exports/hooks/sequence.js @@ -10,10 +10,9 @@ export function sequence(...handlers: MiddlewareHandler[]): MiddlewareHandler { const filtered = handlers.filter((h) => !!h); const length = filtered.length; if (!length) { - const handler: MiddlewareHandler = defineMiddleware((context, next) => { + return defineMiddleware((context, next) => { return next(); }); - return handler; } return defineMiddleware((context, next) => { @@ -24,11 +23,11 @@ export function sequence(...handlers: MiddlewareHandler[]): MiddlewareHandler { // @ts-expect-error // SAFETY: Usually `next` always returns something in user land, but in `sequence` we are actually // doing a loop over all the `next` functions, and eventually we call the last `next` that returns the `Response`. - const result = handle(handleContext, async () => { + const result = handle(handleContext, async (payload: ReroutePayload) => { if (i < length - 1) { return applyHandle(i + 1, handleContext); } else { - return next(); + return next(payload); } }); return result; diff --git a/packages/astro/src/core/render-context.ts b/packages/astro/src/core/render-context.ts index 5cfc8ef2ed..215b678f78 100644 --- a/packages/astro/src/core/render-context.ts +++ b/packages/astro/src/core/render-context.ts @@ -4,6 +4,8 @@ import type { AstroGlobalPartial, ComponentInstance, MiddlewareHandler, + MiddlewareNext, + ReroutePayload, RouteData, SSRResult, } from '../@types/astro.js'; @@ -39,14 +41,23 @@ export class RenderContext { public locals: App.Locals, readonly middleware: MiddlewareHandler, readonly pathname: string, - readonly request: Request, - readonly routeData: RouteData, + public request: Request, + public routeData: RouteData, public status: number, - readonly cookies = new AstroCookies(request), - readonly params = getParams(routeData, pathname), - readonly url = new URL(request.url) + protected cookies = new AstroCookies(request), + public params = getParams(routeData, pathname), + protected url = new URL(request.url) ) {} + /** + * A flag that tells the render content if the rerouting was triggered + */ + isRerouting = false; + /** + * A safety net in case of loops + */ + counter = 0; + static create({ locals = {}, middleware, @@ -56,7 +67,7 @@ export class RenderContext { routeData, status = 200, }: Pick & - Partial>) { + Partial>): RenderContext { return new RenderContext( pipeline, locals, @@ -80,11 +91,11 @@ export class RenderContext { * - fallback */ async render(componentInstance: ComponentInstance | undefined): Promise { - const { cookies, middleware, pathname, pipeline, routeData } = this; + const { cookies, middleware, pathname, pipeline } = this; const { logger, routeCache, serverLike, streaming } = pipeline; const props = await getProps({ mod: componentInstance, - routeData, + routeData: this.routeData, routeCache, pathname, logger, @@ -92,8 +103,37 @@ export class RenderContext { }); const apiContext = this.createAPIContext(props); - const lastNext = async () => { - switch (routeData.type) { + this.counter++; + if (this.counter == 4) { + return new Response('Loop Detected', { + // https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/508 + status: 508, + statusText: 'Loop Detected', + }); + } + const lastNext: MiddlewareNext = async (payload) => { + if (payload) { + if (this.pipeline.manifest.reroutingEnabled) { + try { + const [routeData, component] = await pipeline.tryReroute(payload); + this.routeData = routeData; + componentInstance = component; + } catch (e) { + return new Response('Not found', { + status: 404, + statusText: 'Not found', + }); + } finally { + this.isRerouting = true; + } + } else { + this.pipeline.logger.warn( + 'router', + 'You tried to use the routing feature without enabling it via experimental flag. This is not allowed.' + ); + } + } + switch (this.routeData.type) { case 'endpoint': return renderEndpoint(componentInstance as any, apiContext, serverLike, logger); case 'redirect': @@ -108,7 +148,7 @@ export class RenderContext { props, {}, streaming, - routeData + this.routeData ); } catch (e) { // If there is an error in the page's frontmatter or instantiation of the RenderTemplate fails midway, @@ -119,7 +159,11 @@ export class RenderContext { // Signal to the i18n middleware to maybe act on this response response.headers.set(ROUTE_TYPE_HEADER, 'page'); // Signal to the error-page-rerouting infra to let this response pass through to avoid loops - if (routeData.route === '/404' || routeData.route === '/500') { + if ( + this.routeData.route === '/404' || + this.routeData.route === '/500' || + this.isRerouting + ) { response.headers.set(REROUTE_DIRECTIVE_HEADER, 'no'); } return response; @@ -130,7 +174,9 @@ export class RenderContext { } }; - const response = await callMiddleware(middleware, apiContext, lastNext); + const response = this.isRerouting + ? await lastNext() + : await callMiddleware(middleware, apiContext, lastNext); if (response.headers.get(ROUTE_TYPE_HEADER)) { response.headers.delete(ROUTE_TYPE_HEADER); } @@ -143,10 +189,36 @@ export class RenderContext { createAPIContext(props: APIContext['props']): APIContext { const renderContext = this; - const { cookies, params, pipeline, request, url } = this; + const { cookies, params, pipeline, url } = this; const generator = `Astro v${ASTRO_VERSION}`; const redirect = (path: string, status = 302) => new Response(null, { status, headers: { Location: path } }); + + const reroute = async (reroutePayload: ReroutePayload) => { + try { + const [routeData, component] = await pipeline.tryReroute(reroutePayload); + this.routeData = routeData; + if (reroutePayload instanceof Request) { + this.request = reroutePayload; + } else { + this.request = new Request( + new URL(routeData.pathname ?? routeData.route, this.url.origin), + this.request + ); + } + this.url = new URL(this.request.url); + this.cookies = new AstroCookies(this.request); + this.params = getParams(routeData, url.toString()); + this.isRerouting = true; + return await this.render(component); + } catch (e) { + return new Response('Not found', { + status: 404, + statusText: 'Not found', + }); + } + }; + return { cookies, get clientAddress() { @@ -167,7 +239,7 @@ export class RenderContext { renderContext.locals = val; // we also put it on the original Request object, // where the adapter might be expecting to read it after the response. - Reflect.set(request, clientLocalsSymbol, val); + Reflect.set(this.request, clientLocalsSymbol, val); } }, params, @@ -179,7 +251,8 @@ export class RenderContext { }, props, redirect, - request, + reroute, + request: this.request, site: pipeline.site, url, }; @@ -294,11 +367,11 @@ export class RenderContext { astroStaticPartial: AstroGlobalPartial ): Omit { const renderContext = this; - const { cookies, locals, params, pipeline, request, url } = this; + const { cookies, locals, params, pipeline, url } = this; const { response } = result; const redirect = (path: string, status = 302) => { // If the response is already sent, error as we cannot proceed with the redirect. - if ((request as any)[responseSentSymbol]) { + if ((this.request as any)[responseSentSymbol]) { throw new AstroError({ ...AstroErrorData.ResponseSentError, }); @@ -306,6 +379,32 @@ export class RenderContext { return new Response(null, { status, headers: { Location: path } }); }; + const reroute = async (reroutePayload: ReroutePayload) => { + try { + const [routeData, component] = await pipeline.tryReroute(reroutePayload); + this.routeData = routeData; + if (reroutePayload instanceof Request) { + this.request = reroutePayload; + } else { + this.request = new Request( + new URL(routeData.pathname ?? routeData.route, this.url.origin), + this.request + ); + } + this.url = new URL(this.request.url); + this.cookies = new AstroCookies(this.request); + this.params = getParams(routeData, url.toString()); + this.isRerouting = true; + return await this.render(component); + } catch (e) { + return new Response('Not found', { + status: 404, + statusText: 'Not found', + }); + } + }; + + return { generator: astroStaticPartial.generator, glob: astroStaticPartial.glob, @@ -325,7 +424,8 @@ export class RenderContext { }, locals, redirect, - request, + reroute, + request: this.request, response, site: pipeline.site, url, diff --git a/packages/astro/src/prerender/routing.ts b/packages/astro/src/prerender/routing.ts index e6c09dd702..cbdddff5c8 100644 --- a/packages/astro/src/prerender/routing.ts +++ b/packages/astro/src/prerender/routing.ts @@ -54,7 +54,7 @@ async function preloadAndSetPrerenderStatus({ continue; } - const preloadedComponent = await pipeline.preload(filePath); + const preloadedComponent = await pipeline.preload(route, filePath); // gets the prerender metadata set by the `astro:scanner` vite plugin const prerenderStatus = getPrerenderStatus({ diff --git a/packages/astro/src/vite-plugin-astro-server/pipeline.ts b/packages/astro/src/vite-plugin-astro-server/pipeline.ts index 0b7859846e..4217ebd139 100644 --- a/packages/astro/src/vite-plugin-astro-server/pipeline.ts +++ b/packages/astro/src/vite-plugin-astro-server/pipeline.ts @@ -1,8 +1,10 @@ -import url from 'node:url'; +import { fileURLToPath } from 'node:url'; import type { AstroSettings, ComponentInstance, DevToolbarMetadata, + ManifestData, + ReroutePayload, RouteData, SSRElement, SSRLoadedRenderer, @@ -15,7 +17,7 @@ import { enhanceViteSSRError } from '../core/errors/dev/index.js'; import { AggregateError, CSSError, MarkdownError } from '../core/errors/index.js'; import type { Logger } from '../core/logger/core.js'; import type { ModuleLoader } from '../core/module-loader/index.js'; -import { Pipeline, loadRenderer } from '../core/render/index.js'; +import { loadRenderer, Pipeline } from '../core/render/index.js'; import { isPage, resolveIdToUrl, viteID } from '../core/util.js'; import { isServerLikeOutput } from '../prerender/utils.js'; import { PAGE_SCRIPT_ID } from '../vite-plugin-scripts/index.js'; @@ -30,6 +32,13 @@ export class DevPipeline extends Pipeline { // so it needs to be mutable here unlike in other environments override renderers = new Array(); + manifestData: ManifestData | undefined; + + componentInterner: WeakMap = new WeakMap< + RouteData, + ComponentInstance + >(); + private constructor( readonly loader: ModuleLoader, readonly logger: Logger, @@ -44,13 +53,18 @@ export class DevPipeline extends Pipeline { super(logger, manifest, mode, [], resolve, serverLike, streaming); } - static create({ - loader, - logger, - manifest, - settings, - }: Pick) { - return new DevPipeline(loader, logger, manifest, settings); + static create( + manifestData: ManifestData, + { + loader, + logger, + manifest, + settings, + }: Pick + ) { + const pipeline = new DevPipeline(loader, logger, manifest, settings); + pipeline.manifestData = manifestData; + return pipeline; } async headElements(routeData: RouteData): Promise { @@ -81,7 +95,7 @@ export class DevPipeline extends Pipeline { scripts.add({ props: { type: 'module', src }, children: '' }); const additionalMetadata: DevToolbarMetadata['__astro_dev_toolbar__'] = { - root: url.fileURLToPath(settings.config.root), + root: fileURLToPath(settings.config.root), version: ASTRO_VERSION, debugInfo: await getInfoOutput({ userConfig: settings.config, print: false }), }; @@ -135,7 +149,7 @@ export class DevPipeline extends Pipeline { return getComponentMetadata(filePath, loader); } - async preload(filePath: URL) { + async preload(routeData: RouteData, filePath: URL) { const { loader } = this; if (filePath.href === new URL(DEFAULT_404_COMPONENT, this.config.root).href) { return { default: default404Page } as any as ComponentInstance; @@ -148,7 +162,9 @@ export class DevPipeline extends Pipeline { try { // Load the module from the Vite SSR Runtime. - return (await loader.import(viteID(filePath))) as ComponentInstance; + const componentInstance = (await loader.import(viteID(filePath))) as ComponentInstance; + this.componentInterner.set(routeData, componentInstance); + return componentInstance; } catch (error) { // If the error came from Markdown or CSS, we already handled it and there's no need to enhance it if (MarkdownError.is(error) || CSSError.is(error) || AggregateError.is(error)) { @@ -161,5 +177,51 @@ export class DevPipeline extends Pipeline { clearRouteCache() { this.routeCache.clearAll(); + this.componentInterner = new WeakMap(); + } + + async getComponentByRoute(routeData: RouteData): Promise { + const component = this.componentInterner.get(routeData); + if (component) { + return component; + } else { + const filePath = new URL(`./${routeData.component}`, this.config.root); + return await this.preload(routeData, filePath); + } + } + + async tryReroute(payload: ReroutePayload): Promise<[RouteData, ComponentInstance]> { + let foundRoute; + if (!this.manifestData) { + throw new Error('Missing manifest data'); + } + + for (const route of this.manifestData.routes) { + if (payload instanceof URL) { + if (route.pattern.test(payload.pathname)) { + foundRoute = route; + break; + } + } else if (payload instanceof Request) { + // TODO: handle request, if needed + } else { + if (route.pattern.test(decodeURI(payload))) { + foundRoute = route; + break; + } + } + } + + if (foundRoute) { + const componentInstance = await this.getComponentByRoute(foundRoute); + return [foundRoute, componentInstance]; + } else { + // TODO: handle error properly + throw new Error('Route not found'); + } + } + + setManifestData(manifestData: ManifestData) { + this.manifestData = manifestData; } } diff --git a/packages/astro/src/vite-plugin-astro-server/plugin.ts b/packages/astro/src/vite-plugin-astro-server/plugin.ts index 082de6bceb..10b9ff4637 100644 --- a/packages/astro/src/vite-plugin-astro-server/plugin.ts +++ b/packages/astro/src/vite-plugin-astro-server/plugin.ts @@ -35,10 +35,10 @@ export default function createVitePluginAstroServer({ configureServer(viteServer) { const loader = createViteLoader(viteServer); const manifest = createDevelopmentManifest(settings); - const pipeline = DevPipeline.create({ loader, logger, manifest, settings }); let manifestData: ManifestData = ensure404Route( createRouteManifest({ settings, fsMod }, logger) ); + const pipeline = DevPipeline.create(manifestData, { loader, logger, manifest, settings }); const controller = createController({ loader }); const localStorage = new AsyncLocalStorage(); @@ -47,6 +47,7 @@ export default function createVitePluginAstroServer({ pipeline.clearRouteCache(); if (needsManifestRebuild) { manifestData = ensure404Route(createRouteManifest({ settings }, logger)); + pipeline.setManifestData(manifestData); } } // Rebuild route manifest on file change, if needed. @@ -144,6 +145,7 @@ export function createDevelopmentManifest(settings: AstroSettings): SSRManifest inlinedScripts: new Map(), i18n: i18nManifest, checkOrigin: settings.config.experimental.security?.csrfProtection?.origin ?? false, + reroutingEnabled: settings.config.experimental.rerouting, middleware(_, next) { return next(); }, diff --git a/packages/astro/src/vite-plugin-astro-server/route.ts b/packages/astro/src/vite-plugin-astro-server/route.ts index 21053420a7..e62bfe34ed 100644 --- a/packages/astro/src/vite-plugin-astro-server/route.ts +++ b/packages/astro/src/vite-plugin-astro-server/route.ts @@ -114,7 +114,7 @@ export async function matchRoute( if (custom404) { const filePath = new URL(`./${custom404.component}`, config.root); - const preloadedComponent = await pipeline.preload(filePath); + const preloadedComponent = await pipeline.preload(custom404, filePath); return { route: custom404, @@ -197,40 +197,38 @@ export async function handleRoute({ if (!pathNameHasLocale && pathname !== '/') { return handle404Response(origin, incomingRequest, incomingResponse); } - request = createRequest({ - base: config.base, - url, - headers: incomingRequest.headers, - logger, - // no route found, so we assume the default for rendering the 404 page - staticLike: config.output === 'static' || config.output === 'hybrid', - }); - route = { - component: '', - generate(_data: any): string { - return ''; - }, - params: [], - // Disable eslint as we only want to generate an empty RegExp - // eslint-disable-next-line prefer-regex-literals - pattern: new RegExp(''), - prerender: false, - segments: [], - type: 'fallback', - route: '', - fallbackRoutes: [], - isIndex: false, - }; - renderContext = RenderContext.create({ - pipeline: pipeline, - pathname, - middleware, - request, - routeData: route, - }); - } else { - return handle404Response(origin, incomingRequest, incomingResponse); } + request = createRequest({ + base: config.base, + url, + headers: incomingRequest.headers, + logger, + // no route found, so we assume the default for rendering the 404 page + staticLike: config.output === 'static' || config.output === 'hybrid', + }); + route = { + component: '', + generate(_data: any): string { + return ''; + }, + params: [], + // Disable eslint as we only want to generate an empty RegExp + // eslint-disable-next-line prefer-regex-literals + pattern: new RegExp(''), + prerender: false, + segments: [], + type: 'fallback', + route: '', + fallbackRoutes: [], + isIndex: false, + }; + renderContext = RenderContext.create({ + pipeline: pipeline, + pathname, + middleware, + request, + routeData: route, + }); } else { const filePath: URL | undefined = matchedRoute.filePath; const { preloadedComponent } = matchedRoute; diff --git a/packages/astro/test/fixtures/middleware-virtual/astro.config.mjs b/packages/astro/test/fixtures/middleware-virtual/astro.config.mjs new file mode 100644 index 0000000000..bc095ecddb --- /dev/null +++ b/packages/astro/test/fixtures/middleware-virtual/astro.config.mjs @@ -0,0 +1,3 @@ +import { defineConfig } from "astro/config"; + +export default defineConfig({}) diff --git a/packages/astro/test/fixtures/middleware-virtual/package.json b/packages/astro/test/fixtures/middleware-virtual/package.json new file mode 100644 index 0000000000..7cfbeb7210 --- /dev/null +++ b/packages/astro/test/fixtures/middleware-virtual/package.json @@ -0,0 +1,8 @@ +{ + "name": "@test/middleware-virtual", + "version": "0.0.0", + "private": true, + "dependencies": { + "astro": "workspace:*" + } +} diff --git a/packages/astro/test/fixtures/middleware-virtual/src/middleware.js b/packages/astro/test/fixtures/middleware-virtual/src/middleware.js new file mode 100644 index 0000000000..55004a00cf --- /dev/null +++ b/packages/astro/test/fixtures/middleware-virtual/src/middleware.js @@ -0,0 +1,6 @@ +import { defineMiddleware } from 'astro:middleware'; + +export const onRequest = defineMiddleware(async (context, next) => { + console.log('[MIDDLEWARE] in ' + context.url.toString()); + return next(); +}); diff --git a/packages/astro/test/fixtures/middleware-virtual/src/pages/index.astro b/packages/astro/test/fixtures/middleware-virtual/src/pages/index.astro new file mode 100644 index 0000000000..9bd31f5fde --- /dev/null +++ b/packages/astro/test/fixtures/middleware-virtual/src/pages/index.astro @@ -0,0 +1,13 @@ +--- +const data = Astro.locals; +--- + + + + Index + + + +Index + + diff --git a/packages/astro/test/fixtures/reroute/astro.config.mjs b/packages/astro/test/fixtures/reroute/astro.config.mjs new file mode 100644 index 0000000000..af73691617 --- /dev/null +++ b/packages/astro/test/fixtures/reroute/astro.config.mjs @@ -0,0 +1,8 @@ +import { defineConfig } from 'astro/config'; + +// https://astro.build/config +export default defineConfig({ + experimental: { + rerouting: true + } +}); diff --git a/packages/astro/test/fixtures/reroute/package.json b/packages/astro/test/fixtures/reroute/package.json new file mode 100644 index 0000000000..ed64e57a97 --- /dev/null +++ b/packages/astro/test/fixtures/reroute/package.json @@ -0,0 +1,8 @@ +{ + "name": "@test/reroute", + "version": "0.0.0", + "private": true, + "dependencies": { + "astro": "workspace:*" + } +} diff --git a/packages/astro/test/fixtures/reroute/src/pages/blog/hello/index.astro b/packages/astro/test/fixtures/reroute/src/pages/blog/hello/index.astro new file mode 100644 index 0000000000..07a8544aec --- /dev/null +++ b/packages/astro/test/fixtures/reroute/src/pages/blog/hello/index.astro @@ -0,0 +1,11 @@ +--- +return Astro.reroute(new URL("../../", Astro.url)) +--- + + + Blog hello + + +

    Blog hello

    + + diff --git a/packages/astro/test/fixtures/reroute/src/pages/blog/salut/index.astro b/packages/astro/test/fixtures/reroute/src/pages/blog/salut/index.astro new file mode 100644 index 0000000000..373653afd7 --- /dev/null +++ b/packages/astro/test/fixtures/reroute/src/pages/blog/salut/index.astro @@ -0,0 +1,11 @@ +--- +return Astro.reroute(new Request(new URL("../../", Astro.url))) +--- + + + Blog hello + + +

    Blog hello

    + + diff --git a/packages/astro/test/fixtures/reroute/src/pages/index.astro b/packages/astro/test/fixtures/reroute/src/pages/index.astro new file mode 100644 index 0000000000..727a45a657 --- /dev/null +++ b/packages/astro/test/fixtures/reroute/src/pages/index.astro @@ -0,0 +1,10 @@ +--- +--- + + + Index + + +

    Index

    + + diff --git a/packages/astro/test/fixtures/reroute/src/pages/reroute.astro b/packages/astro/test/fixtures/reroute/src/pages/reroute.astro new file mode 100644 index 0000000000..8396946f14 --- /dev/null +++ b/packages/astro/test/fixtures/reroute/src/pages/reroute.astro @@ -0,0 +1,11 @@ +--- +return Astro.reroute("/") +--- + + + Reroute + + +

    Reroute

    + + diff --git a/packages/astro/test/reroute.test.js b/packages/astro/test/reroute.test.js new file mode 100644 index 0000000000..8740d318fd --- /dev/null +++ b/packages/astro/test/reroute.test.js @@ -0,0 +1,42 @@ +import { describe, it, before, after } from 'node:test'; +import { loadFixture } from './test-utils.js'; +import { load as cheerioLoad } from 'cheerio'; +import assert from 'node:assert/strict'; + +describe('Dev reroute', () => { + /** @type {import('./test-utils').Fixture} */ + let fixture; + let devServer; + + before(async () => { + fixture = await loadFixture({ + root: './fixtures/reroute/', + }); + devServer = await fixture.startDevServer(); + }); + + after(async () => { + await devServer.stop(); + }); + + it('the render the index page when navigating /reroute ', async () => { + const html = await fixture.fetch('/reroute').then((res) => res.text()); + const $ = cheerioLoad(html); + + assert.equal($('h1').text(), 'Index'); + }); + + it('the render the index page when navigating /blog/hello ', async () => { + const html = await fixture.fetch('/blog/hello').then((res) => res.text()); + const $ = cheerioLoad(html); + + assert.equal($('h1').text(), 'Index'); + }); + + it('the render the index page when navigating /blog/salut ', async () => { + const html = await fixture.fetch('/blog/hello').then((res) => res.text()); + const $ = cheerioLoad(html); + + assert.equal($('h1').text(), 'Index'); + }); +}); diff --git a/packages/astro/test/units/routing/route-matching.test.js b/packages/astro/test/units/routing/route-matching.test.js index b2f27d8c9f..5eafa6c80a 100644 --- a/packages/astro/test/units/routing/route-matching.test.js +++ b/packages/astro/test/units/routing/route-matching.test.js @@ -146,7 +146,7 @@ describe('Route matching', () => { const loader = createViteLoader(container.viteServer); const manifest = createDevelopmentManifest(container.settings); - pipeline = DevPipeline.create({ loader, logger: defaultLogger, manifest, settings }); + pipeline = DevPipeline.create(undefined, { loader, logger: defaultLogger, manifest, settings }); manifestData = createRouteManifest( { cwd: fileURLToPath(root), diff --git a/packages/astro/test/units/vite-plugin-astro-server/request.test.js b/packages/astro/test/units/vite-plugin-astro-server/request.test.js index 7ea587f97e..f976a9d30b 100644 --- a/packages/astro/test/units/vite-plugin-astro-server/request.test.js +++ b/packages/astro/test/units/vite-plugin-astro-server/request.test.js @@ -22,7 +22,7 @@ async function createDevPipeline(overrides = {}) { const loader = overrides.loader ?? createLoader(); const manifest = createDevelopmentManifest(settings); - return DevPipeline.create({ loader, logger: defaultLogger, manifest, settings }); + return DevPipeline.create(undefined, { loader, logger: defaultLogger, manifest, settings }); } describe('vite-plugin-astro-server', () => { From 56f2274907985976fc8d8fbfe02e85ef043d6e68 Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Mon, 22 Apr 2024 14:54:12 +0100 Subject: [PATCH 36/36] feat: reroute in SSG (#10843) * feat: rerouting in ssg * linting --- packages/astro/src/core/build/generate.ts | 77 ++-------- packages/astro/src/core/build/pipeline.ts | 144 ++++++++++++++++-- packages/astro/src/core/render-context.ts | 4 + .../src/vite-plugin-astro-server/pipeline.ts | 6 +- .../src/vite-plugin-astro-server/route.ts | 1 + .../reroute/src/pages/dynamic/[id].astro | 21 +++ .../reroute/src/pages/spread/[...id].astro | 20 +++ .../astro/test/i18n-routing-manual.test.js | 2 - packages/astro/test/reroute.test.js | 64 +++++++- 9 files changed, 255 insertions(+), 84 deletions(-) create mode 100644 packages/astro/test/fixtures/reroute/src/pages/dynamic/[id].astro create mode 100644 packages/astro/test/fixtures/reroute/src/pages/spread/[...id].astro diff --git a/packages/astro/src/core/build/generate.ts b/packages/astro/src/core/build/generate.ts index 402c68c2ab..13d31b3acb 100644 --- a/packages/astro/src/core/build/generate.ts +++ b/packages/astro/src/core/build/generate.ts @@ -35,24 +35,14 @@ import { getOutputDirectory, isServerLikeOutput } from '../../prerender/utils.js import type { SSRManifestI18n } from '../app/types.js'; import { NoPrerenderedRoutesWithDomains } from '../errors/errors-data.js'; import { AstroError, AstroErrorData } from '../errors/index.js'; -import { routeIsFallback } from '../redirects/helpers.js'; -import { - RedirectSinglePageBuiltModule, - getRedirectLocationOrThrow, - routeIsRedirect, -} from '../redirects/index.js'; +import { getRedirectLocationOrThrow, routeIsRedirect } from '../redirects/index.js'; import { RenderContext } from '../render-context.js'; import { callGetStaticPaths } from '../render/route-cache.js'; import { createRequest } from '../request.js'; import { matchRoute } from '../routing/match.js'; import { getOutputFilename } from '../util.js'; import { getOutDirWithinCwd, getOutFile, getOutFolder } from './common.js'; -import { - cssOrder, - getEntryFilePathFromComponentPath, - getPageDataByComponent, - mergeInlineCss, -} from './internal.js'; +import { cssOrder, getPageDataByComponent, mergeInlineCss } from './internal.js'; import { BuildPipeline } from './pipeline.js'; import type { PageBuildData, @@ -66,46 +56,6 @@ function createEntryURL(filePath: string, outFolder: URL) { return new URL('./' + filePath + `?time=${Date.now()}`, outFolder); } -async function getEntryForRedirectRoute( - route: RouteData, - internals: BuildInternals, - outFolder: URL -): Promise { - if (route.type !== 'redirect') { - throw new Error(`Expected a redirect route.`); - } - if (route.redirectRoute) { - const filePath = getEntryFilePathFromComponentPath(internals, route.redirectRoute.component); - if (filePath) { - const url = createEntryURL(filePath, outFolder); - const ssrEntryPage: SinglePageBuiltModule = await import(url.toString()); - return ssrEntryPage; - } - } - - return RedirectSinglePageBuiltModule; -} - -async function getEntryForFallbackRoute( - route: RouteData, - internals: BuildInternals, - outFolder: URL -): Promise { - if (route.type !== 'fallback') { - throw new Error(`Expected a redirect route.`); - } - if (route.redirectRoute) { - const filePath = getEntryFilePathFromComponentPath(internals, route.redirectRoute.component); - if (filePath) { - const url = createEntryURL(filePath, outFolder); - const ssrEntryPage: SinglePageBuiltModule = await import(url.toString()); - return ssrEntryPage; - } - } - - return RedirectSinglePageBuiltModule; -} - // Gives back a facadeId that is relative to the root. // ie, src/pages/index.astro instead of /Users/name..../src/pages/index.astro export function rootRelativeFacadeId(facadeId: string, settings: AstroSettings): string { @@ -185,14 +135,15 @@ export async function generatePages(options: StaticBuildOptions, internals: Buil }); } - const ssrEntryURLPage = createEntryURL(filePath, outFolder); - const ssrEntryPage = await import(ssrEntryURLPage.toString()); + const ssrEntryPage = await pipeline.retrieveSsrEntry(pageData.route, filePath); if (options.settings.adapter?.adapterFeatures?.functionPerRoute) { // forcing to use undefined, so we fail in an expected way if the module is not even there. + // @ts-expect-error When building for `functionPerRoute`, the module exports a `pageModule` function instead const ssrEntry = ssrEntryPage?.pageModule; if (ssrEntry) { await generatePage(pageData, ssrEntry, builtPaths, pipeline); } else { + const ssrEntryURLPage = createEntryURL(filePath, outFolder); throw new Error( `Unable to find the manifest for the module ${ssrEntryURLPage.toString()}. This is unexpected and likely a bug in Astro, please report.` ); @@ -205,18 +156,8 @@ export async function generatePages(options: StaticBuildOptions, internals: Buil } } else { for (const [pageData, filePath] of pagesToGenerate) { - if (routeIsRedirect(pageData.route)) { - const entry = await getEntryForRedirectRoute(pageData.route, internals, outFolder); - await generatePage(pageData, entry, builtPaths, pipeline); - } else if (routeIsFallback(pageData.route)) { - const entry = await getEntryForFallbackRoute(pageData.route, internals, outFolder); - await generatePage(pageData, entry, builtPaths, pipeline); - } else { - const ssrEntryURLPage = createEntryURL(filePath, outFolder); - const entry: SinglePageBuiltModule = await import(ssrEntryURLPage.toString()); - - await generatePage(pageData, entry, builtPaths, pipeline); - } + const entry = await pipeline.retrieveSsrEntry(pageData.route, filePath); + await generatePage(pageData, entry, builtPaths, pipeline); } } logger.info( @@ -232,12 +173,12 @@ export async function generatePages(options: StaticBuildOptions, internals: Buil .map((x) => x.transforms.size) .reduce((a, b) => a + b, 0); const cpuCount = os.cpus().length; - const assetsCreationpipeline = await prepareAssetsGenerationEnv(pipeline, totalCount); + const assetsCreationPipeline = await prepareAssetsGenerationEnv(pipeline, totalCount); const queue = new PQueue({ concurrency: Math.max(cpuCount, 1) }); const assetsTimer = performance.now(); for (const [originalPath, transforms] of staticImageList) { - await generateImagesForPath(originalPath, transforms, assetsCreationpipeline, queue); + await generateImagesForPath(originalPath, transforms, assetsCreationPipeline, queue); } await queue.onIdle(); diff --git a/packages/astro/src/core/build/pipeline.ts b/packages/astro/src/core/build/pipeline.ts index f84e33c90a..d973b24ca0 100644 --- a/packages/astro/src/core/build/pipeline.ts +++ b/packages/astro/src/core/build/pipeline.ts @@ -1,10 +1,9 @@ import type { + ComponentInstance, + ReroutePayload, RouteData, SSRLoadedRenderer, SSRResult, - MiddlewareHandler, - ReroutePayload, - ComponentInstance, } from '../../@types/astro.js'; import { getOutputDirectory, isServerLikeOutput } from '../../prerender/utils.js'; import { BEFORE_HYDRATION_SCRIPT_ID, PAGE_SCRIPT_ID } from '../../vite-plugin-scripts/index.js'; @@ -19,22 +18,42 @@ import { import { type BuildInternals, cssOrder, + getEntryFilePathFromComponentPath, getPageDataByComponent, mergeInlineCss, } from './internal.js'; import { ASTRO_PAGE_MODULE_ID, ASTRO_PAGE_RESOLVED_MODULE_ID } from './plugins/plugin-pages.js'; import { RESOLVED_SPLIT_MODULE_ID } from './plugins/plugin-ssr.js'; -import { getVirtualModulePageNameFromPath } from './plugins/util.js'; -import { ASTRO_PAGE_EXTENSION_POST_PATTERN } from './plugins/util.js'; -import type { PageBuildData, StaticBuildOptions } from './types.js'; +import { + ASTRO_PAGE_EXTENSION_POST_PATTERN, + getVirtualModulePageNameFromPath, +} from './plugins/util.js'; +import type { PageBuildData, SinglePageBuiltModule, StaticBuildOptions } from './types.js'; import { i18nHasFallback } from './util.js'; -import { defineMiddleware } from '../middleware/index.js'; -import { undefined } from 'zod'; +import { RedirectSinglePageBuiltModule } from '../redirects/index.js'; +import { getOutDirWithinCwd } from './common.js'; /** * The build pipeline is responsible to gather the files emitted by the SSR build and generate the pages by executing these files. */ export class BuildPipeline extends Pipeline { + #componentsInterner: WeakMap = new WeakMap< + RouteData, + SinglePageBuiltModule + >(); + /** + * This cache is needed to map a single `RouteData` to its file path. + * @private + */ + #routesByFilePath: WeakMap = new WeakMap(); + + get outFolder() { + const ssr = isServerLikeOutput(this.settings.config); + return ssr + ? this.settings.config.build.server + : getOutDirWithinCwd(this.settings.config.outDir); + } + private constructor( readonly internals: BuildInternals, readonly manifest: SSRManifest, @@ -233,14 +252,115 @@ export class BuildPipeline extends Pipeline { } } + for (const [buildData, filePath] of pages.entries()) { + this.#routesByFilePath.set(buildData.route, filePath); + } + return pages; } - getComponentByRoute(_routeData: RouteData): Promise { - throw new Error('unimplemented'); + async getComponentByRoute(routeData: RouteData): Promise { + if (this.#componentsInterner.has(routeData)) { + // SAFETY: checked before + const entry = this.#componentsInterner.get(routeData)!; + return await entry.page(); + } else { + // SAFETY: the pipeline calls `retrieveRoutesToGenerate`, which is in charge to fill the cache. + const filePath = this.#routesByFilePath.get(routeData)!; + const module = await this.retrieveSsrEntry(routeData, filePath); + return module.page(); + } } - tryReroute(_reroutePayload: ReroutePayload): Promise<[RouteData, ComponentInstance]> { - throw new Error('unimplemented'); + async tryReroute(payload: ReroutePayload): Promise<[RouteData, ComponentInstance]> { + let foundRoute: RouteData | undefined; + // options.manifest is the actual type that contains the information + for (const route of this.options.manifest.routes) { + if (payload instanceof URL) { + if (route.pattern.test(payload.pathname)) { + foundRoute = route; + break; + } + } else if (payload instanceof Request) { + const url = new URL(payload.url); + if (route.pattern.test(url.pathname)) { + foundRoute = route; + break; + } + } else { + if (route.pattern.test(decodeURI(payload))) { + foundRoute = route; + break; + } + } + } + if (foundRoute) { + const componentInstance = await this.getComponentByRoute(foundRoute); + return [foundRoute, componentInstance]; + } else { + throw new Error('Route not found'); + } + } + + async retrieveSsrEntry(route: RouteData, filePath: string): Promise { + if (this.#componentsInterner.has(route)) { + // SAFETY: it is checked inside the if + return this.#componentsInterner.get(route)!; + } + let entry; + if (routeIsRedirect(route)) { + entry = await this.#getEntryForRedirectRoute(route, this.internals, this.outFolder); + } else if (routeIsFallback(route)) { + entry = await this.#getEntryForFallbackRoute(route, this.internals, this.outFolder); + } else { + const ssrEntryURLPage = createEntryURL(filePath, this.outFolder); + entry = await import(ssrEntryURLPage.toString()); + } + this.#componentsInterner.set(route, entry); + return entry; + } + + async #getEntryForFallbackRoute( + route: RouteData, + internals: BuildInternals, + outFolder: URL + ): Promise { + if (route.type !== 'fallback') { + throw new Error(`Expected a redirect route.`); + } + if (route.redirectRoute) { + const filePath = getEntryFilePathFromComponentPath(internals, route.redirectRoute.component); + if (filePath) { + const url = createEntryURL(filePath, outFolder); + const ssrEntryPage: SinglePageBuiltModule = await import(url.toString()); + return ssrEntryPage; + } + } + + return RedirectSinglePageBuiltModule; + } + + async #getEntryForRedirectRoute( + route: RouteData, + internals: BuildInternals, + outFolder: URL + ): Promise { + if (route.type !== 'redirect') { + throw new Error(`Expected a redirect route.`); + } + if (route.redirectRoute) { + const filePath = getEntryFilePathFromComponentPath(internals, route.redirectRoute.component); + if (filePath) { + const url = createEntryURL(filePath, outFolder); + const ssrEntryPage: SinglePageBuiltModule = await import(url.toString()); + return ssrEntryPage; + } + } + + return RedirectSinglePageBuiltModule; } } + +function createEntryURL(filePath: string, outFolder: URL) { + return new URL('./' + filePath + `?time=${Date.now()}`, outFolder); +} diff --git a/packages/astro/src/core/render-context.ts b/packages/astro/src/core/render-context.ts index 215b678f78..0eb7df01dc 100644 --- a/packages/astro/src/core/render-context.ts +++ b/packages/astro/src/core/render-context.ts @@ -195,6 +195,7 @@ export class RenderContext { new Response(null, { status, headers: { Location: path } }); const reroute = async (reroutePayload: ReroutePayload) => { + pipeline.logger.debug('router', 'Called rerouting to:', reroutePayload); try { const [routeData, component] = await pipeline.tryReroute(reroutePayload); this.routeData = routeData; @@ -212,6 +213,7 @@ export class RenderContext { this.isRerouting = true; return await this.render(component); } catch (e) { + pipeline.logger.debug('router', 'Routing failed.', e); return new Response('Not found', { status: 404, statusText: 'Not found', @@ -381,6 +383,7 @@ export class RenderContext { const reroute = async (reroutePayload: ReroutePayload) => { try { + pipeline.logger.debug('router', 'Calling rerouting: ', reroutePayload); const [routeData, component] = await pipeline.tryReroute(reroutePayload); this.routeData = routeData; if (reroutePayload instanceof Request) { @@ -397,6 +400,7 @@ export class RenderContext { this.isRerouting = true; return await this.render(component); } catch (e) { + pipeline.logger.debug('router', 'Rerouting failed, returning a 404.', e); return new Response('Not found', { status: 404, statusText: 'Not found', diff --git a/packages/astro/src/vite-plugin-astro-server/pipeline.ts b/packages/astro/src/vite-plugin-astro-server/pipeline.ts index 4217ebd139..7667bb377b 100644 --- a/packages/astro/src/vite-plugin-astro-server/pipeline.ts +++ b/packages/astro/src/vite-plugin-astro-server/pipeline.ts @@ -203,7 +203,11 @@ export class DevPipeline extends Pipeline { break; } } else if (payload instanceof Request) { - // TODO: handle request, if needed + const url = new URL(payload.url); + if (route.pattern.test(url.pathname)) { + foundRoute = route; + break; + } } else { if (route.pattern.test(decodeURI(payload))) { foundRoute = route; diff --git a/packages/astro/src/vite-plugin-astro-server/route.ts b/packages/astro/src/vite-plugin-astro-server/route.ts index e62bfe34ed..85bf969f9d 100644 --- a/packages/astro/src/vite-plugin-astro-server/route.ts +++ b/packages/astro/src/vite-plugin-astro-server/route.ts @@ -222,6 +222,7 @@ export async function handleRoute({ fallbackRoutes: [], isIndex: false, }; + renderContext = RenderContext.create({ pipeline: pipeline, pathname, diff --git a/packages/astro/test/fixtures/reroute/src/pages/dynamic/[id].astro b/packages/astro/test/fixtures/reroute/src/pages/dynamic/[id].astro new file mode 100644 index 0000000000..fc1b64fbba --- /dev/null +++ b/packages/astro/test/fixtures/reroute/src/pages/dynamic/[id].astro @@ -0,0 +1,21 @@ +--- + +export function getStaticPaths() { + return [ + { params: { id: 'hello' } }, + ]; +} + + +return Astro.reroute("/") + +--- + + + + Dynamic [id].astro + + +

    /dynamic/[id].astro

    + + diff --git a/packages/astro/test/fixtures/reroute/src/pages/spread/[...id].astro b/packages/astro/test/fixtures/reroute/src/pages/spread/[...id].astro new file mode 100644 index 0000000000..1169380cab --- /dev/null +++ b/packages/astro/test/fixtures/reroute/src/pages/spread/[...id].astro @@ -0,0 +1,20 @@ +--- +export function getStaticPaths() { + return [ + { params: { id: 'hello' } }, + ]; +} + +return Astro.reroute("/") + +--- + + + + + Spread [...id].astro + + +

    /spread/[...id].astro

    + + diff --git a/packages/astro/test/i18n-routing-manual.test.js b/packages/astro/test/i18n-routing-manual.test.js index d664b37978..1feaf96334 100644 --- a/packages/astro/test/i18n-routing-manual.test.js +++ b/packages/astro/test/i18n-routing-manual.test.js @@ -58,8 +58,6 @@ describe('Dev server manual routing', () => { describe('SSG manual routing', () => { /** @type {import('./test-utils').Fixture} */ let fixture; - /** @type {import('./test-utils').DevServer} */ - let devServer; before(async () => { fixture = await loadFixture({ diff --git a/packages/astro/test/reroute.test.js b/packages/astro/test/reroute.test.js index 8740d318fd..e90f4e6723 100644 --- a/packages/astro/test/reroute.test.js +++ b/packages/astro/test/reroute.test.js @@ -34,7 +34,69 @@ describe('Dev reroute', () => { }); it('the render the index page when navigating /blog/salut ', async () => { - const html = await fixture.fetch('/blog/hello').then((res) => res.text()); + const html = await fixture.fetch('/blog/salut').then((res) => res.text()); + const $ = cheerioLoad(html); + + assert.equal($('h1').text(), 'Index'); + }); + + it('the render the index page when navigating dynamic route /dynamic/[id] ', async () => { + const html = await fixture.fetch('/dynamic/hello').then((res) => res.text()); + const $ = cheerioLoad(html); + + assert.equal($('h1').text(), 'Index'); + }); + + it('the render the index page when navigating spread route /spread/[...spread] ', async () => { + const html = await fixture.fetch('/spread/hello').then((res) => res.text()); + const $ = cheerioLoad(html); + + assert.equal($('h1').text(), 'Index'); + }); +}); + +describe('Build reroute', () => { + /** @type {import('./test-utils').Fixture} */ + let fixture; + + before(async () => { + fixture = await loadFixture({ + root: './fixtures/reroute/', + }); + await fixture.build(); + }); + + it('the render the index page when navigating /reroute ', async () => { + const html = await fixture.readFile('/reroute/index.html'); + const $ = cheerioLoad(html); + + assert.equal($('h1').text(), 'Index'); + }); + + it('the render the index page when navigating /blog/hello ', async () => { + const html = await fixture.readFile('/blog/hello/index.html'); + const $ = cheerioLoad(html); + + assert.equal($('h1').text(), 'Index'); + }); + + it('the render the index page when navigating /blog/salut ', async () => { + const html = await fixture.readFile('/blog/salut/index.html'); + + const $ = cheerioLoad(html); + + assert.equal($('h1').text(), 'Index'); + }); + + it('the render the index page when navigating dynamic route /dynamic/[id] ', async () => { + const html = await fixture.readFile('/dynamic/hello/index.html'); + const $ = cheerioLoad(html); + + assert.equal($('h1').text(), 'Index'); + }); + + it('the render the index page when navigating spread route /spread/[...spread] ', async () => { + const html = await fixture.readFile('/spread/hello/index.html'); const $ = cheerioLoad(html); assert.equal($('h1').text(), 'Index');