diff --git a/.changeset/better-zebras-notice.md b/.changeset/better-zebras-notice.md
deleted file mode 100644
index ff1c2e5799aa..000000000000
--- a/.changeset/better-zebras-notice.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'astro': patch
----
-
-Fixes a bug where `experimental_getFontFileURL()` rejected valid font URLs when using the Cloudflare adapter
diff --git a/.changeset/calm-maps-travel.md b/.changeset/calm-maps-travel.md
new file mode 100644
index 000000000000..dd658d5914d2
--- /dev/null
+++ b/.changeset/calm-maps-travel.md
@@ -0,0 +1,5 @@
+---
+'astro': patch
+---
+
+Fixes a bug where `new FetchState(request)` could fail in development when server dependencies were optimized
diff --git a/.changeset/cyan-pigs-take.md b/.changeset/cyan-pigs-take.md
deleted file mode 100644
index ef6248cca3b6..000000000000
--- a/.changeset/cyan-pigs-take.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'astro': patch
----
-
-Updates deprecation messages target from Astro 7 to 8
diff --git a/.changeset/famous-trains-like.md b/.changeset/famous-trains-like.md
deleted file mode 100644
index fcb9c402bd64..000000000000
--- a/.changeset/famous-trains-like.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'astro': patch
----
-
-Fixes session ID validation to reject non-UUID cookie values before using them as storage keys
diff --git a/.changeset/few-toys-rhyme.md b/.changeset/few-toys-rhyme.md
deleted file mode 100644
index 2d73c1c45f2f..000000000000
--- a/.changeset/few-toys-rhyme.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'astro': patch
----
-
-Fixes `--mode`, `--site`, `--base`, `--out-dir`, `--verbose`, `--silent`, and `--open` flags being silently dropped when using `astro dev --background` or `astro preview --background`
diff --git a/.changeset/fix-content-modules-stale-import.md b/.changeset/fix-content-modules-stale-import.md
deleted file mode 100644
index 52b5d4116e2f..000000000000
--- a/.changeset/fix-content-modules-stale-import.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-'astro': patch
----
-
-Fixes `content-modules.mjs` not removing entries for deleted or renamed content files, which could cause Vite to attempt to resolve non-existent modules
-
-As part of this fix, `#moduleImports` is now fully rebuilt from `deferredRender` entries before every write, so a module import added only through the public `addModuleImport()` API without a corresponding `deferredRender` entry in the store will no longer be preserved across writes.
diff --git a/.changeset/fix-preferred-locale-quality-sort.md b/.changeset/fix-preferred-locale-quality-sort.md
deleted file mode 100644
index a675a66296ad..000000000000
--- a/.changeset/fix-preferred-locale-quality-sort.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'astro': patch
----
-
-Fixes `Astro.preferredLocale` and `Astro.preferredLocaleList` ignoring `Accept-Language` quality values when they are absent or `0`. An entry without an explicit `q=` now correctly counts as quality `1.0` (per RFC 7231) and an entry with `q=0` is treated as not acceptable, so the highest-quality locale is selected regardless of header order.
diff --git a/.changeset/gentle-regions-shave.md b/.changeset/gentle-regions-shave.md
deleted file mode 100644
index 4ea58b32cf9d..000000000000
--- a/.changeset/gentle-regions-shave.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-'astro': patch
-'@astrojs/mdx': patch
----
-
-Fixes build errors showing wrong file location, missing line:col, and misleading hints when a plugin error (e.g. from MDX) is wrapped by Vite's build error
diff --git a/.changeset/gold-bugs-glow.md b/.changeset/gold-bugs-glow.md
deleted file mode 100644
index de81aeffcfa0..000000000000
--- a/.changeset/gold-bugs-glow.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'astro': patch
----
-
-Fixes a type error when passing an image from a content collection `image()` schema to a component or ` `. The schema returned by `image()` was missing the `apng` format, so it no longer matched the type of an imported image.
diff --git a/.changeset/gold-roses-fetch.md b/.changeset/gold-roses-fetch.md
deleted file mode 100644
index 0f0534d834d5..000000000000
--- a/.changeset/gold-roses-fetch.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'astro': patch
----
-
-Fixes an issue where Astro CSP support didn't correctly handle cases `"unsafe-inline"` resource. Now when `"unsafe-inline"`, Astro won't emit hashes for the directive specified.
diff --git a/.changeset/grumpy-bats-return.md b/.changeset/grumpy-bats-return.md
deleted file mode 100644
index 05df2d2b98e6..000000000000
--- a/.changeset/grumpy-bats-return.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-'@astrojs/mdx': patch
-'@astrojs/markdown-satteri': patch
----
-
-Fixes Sätteri processor option types to accept all plugin entries supported by Sätteri v0.10.3.
diff --git a/.changeset/long-tips-care.md b/.changeset/long-tips-care.md
deleted file mode 100644
index e3e06abaa1e4..000000000000
--- a/.changeset/long-tips-care.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'astro': patch
----
-
-Fixes `memoryCache()` storing responses that set cookies through `Astro.cookies` or `Astro.session`
diff --git a/.changeset/modern-canyons-obey.md b/.changeset/modern-canyons-obey.md
deleted file mode 100644
index bf11760bb3ac..000000000000
--- a/.changeset/modern-canyons-obey.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'astro': patch
----
-
-Fixes `server:defer` crashing the dev server with "undefined is not a function" when a deferred component imports from `astro:i18n`
diff --git a/.changeset/moody-geckos-train.md b/.changeset/moody-geckos-train.md
deleted file mode 100644
index 033bebc96236..000000000000
--- a/.changeset/moody-geckos-train.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@astrojs/netlify': patch
----
-
-Fixes generated Netlify Image CDN allowlists to reject remote URLs that contain an allowed image origin only within their path or query string
diff --git a/.changeset/persisted-media-keep-identity.md b/.changeset/persisted-media-keep-identity.md
deleted file mode 100644
index 591521d921df..000000000000
--- a/.changeset/persisted-media-keep-identity.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'astro': patch
----
-
-Fixes a regression where `transition:persist` stopped working for `` and `` elements.
diff --git a/.changeset/ready-monkeys-train.md b/.changeset/ready-monkeys-train.md
deleted file mode 100644
index 27ea8c782393..000000000000
--- a/.changeset/ready-monkeys-train.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'astro': patch
----
-
-Adds support for importing `.apng` files as image metadata for use with standard ` ` elements. Astro's image components reject APNG files to avoid removing their animation
diff --git a/.changeset/short-tables-thank.md b/.changeset/short-tables-thank.md
deleted file mode 100644
index 85488172c250..000000000000
--- a/.changeset/short-tables-thank.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'create-astro': patch
----
-
-Fixes `npm install` warnings on npm v11+ about esbuild's install scripts not being covered by `allowScripts`. Adds `ensureNpmScriptsAllowed()` to pre-approve esbuild in `package.json` before running `npm install`, matching the existing pnpm v11 compatibility fix.
diff --git a/.changeset/strong-lines-sit.md b/.changeset/strong-lines-sit.md
deleted file mode 100644
index fbb08da55ce8..000000000000
--- a/.changeset/strong-lines-sit.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'astro': patch
----
-
-Fixes i18n `fallbackType: "rewrite"` returning 500 instead of 404 when the fallback locale also has no matching static path for a prerendered dynamic route
diff --git a/.changeset/sunny-planes-rush.md b/.changeset/sunny-planes-rush.md
deleted file mode 100644
index 9797ff267a4f..000000000000
--- a/.changeset/sunny-planes-rush.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'astro': patch
----
-
-Bumps the Astro compiler to the latest version. [Changelog](https://github.com/withastro/compiler-rs/releases/tag/%40astrojs%2Fcompiler-rs%400.4.0).
diff --git a/.changeset/tidy-pears-shake.md b/.changeset/tidy-pears-shake.md
deleted file mode 100644
index 9a2814b5cd99..000000000000
--- a/.changeset/tidy-pears-shake.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'astro': patch
----
-
-Improves the performance of the Astro CLI in local by enabling Node's module compilation cache.
diff --git a/.changeset/tricky-hornets-take.md b/.changeset/tricky-hornets-take.md
deleted file mode 100644
index 21be81e5bc7a..000000000000
--- a/.changeset/tricky-hornets-take.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@astrojs/cloudflare': patch
----
-
-Fixes dep scanning failure when `.astro` frontmatter contains regex literals with quote characters (e.g. `/"/g`)
diff --git a/.changeset/wacky-teeth-wear.md b/.changeset/wacky-teeth-wear.md
deleted file mode 100644
index 7b6756a0ca78..000000000000
--- a/.changeset/wacky-teeth-wear.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'astro': patch
----
-
-Fixes incremental builds serving cached HTML that references stale CSS filenames after a stylesheet-only edit
diff --git a/.changeset/wicked-zebras-sip.md b/.changeset/wicked-zebras-sip.md
deleted file mode 100644
index 0699a0ab6451..000000000000
--- a/.changeset/wicked-zebras-sip.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'astro': patch
----
-
-Fixes the dev server refusing to start in Docker containers after a restart due to PID reuse in the lock file check
diff --git a/.changeset/witty-cloths-do.md b/.changeset/witty-cloths-do.md
deleted file mode 100644
index 7a39f96fb8f3..000000000000
--- a/.changeset/witty-cloths-do.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'astro': patch
----
-
-Fixes a build failure when defining `vite.environments.ssr` in the Astro config. User-provided environment config for `ssr`, `prerender`, or `client` is now properly deep-merged with Astro's internal environment settings instead of silently breaking the server entry naming.
diff --git a/.changeset/young-suns-walk.md b/.changeset/young-suns-walk.md
deleted file mode 100644
index 44e9980137cd..000000000000
--- a/.changeset/young-suns-walk.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'astro': patch
----
-
-Fixes the `glob()` content loader failing to load files with colons in their names (e.g., `Guide: Architecture.md`)
diff --git a/examples/advanced-routing/package.json b/examples/advanced-routing/package.json
index 1ddddb8b9ac7..56d70dd1b5c3 100644
--- a/examples/advanced-routing/package.json
+++ b/examples/advanced-routing/package.json
@@ -14,7 +14,7 @@
},
"dependencies": {
"@astrojs/node": "^11.1.4",
- "astro": "^7.2.4",
+ "astro": "^7.2.5",
"hono": "^4.12.14"
},
"allowScripts": {
diff --git a/examples/basics/package.json b/examples/basics/package.json
index c48360da0a18..ee9874178b4d 100644
--- a/examples/basics/package.json
+++ b/examples/basics/package.json
@@ -13,7 +13,7 @@
"astro": "astro"
},
"dependencies": {
- "astro": "^7.2.4"
+ "astro": "^7.2.5"
},
"allowScripts": {
"esbuild": true
diff --git a/examples/blog/package.json b/examples/blog/package.json
index 2f91beddffc0..f1c01e9cf534 100644
--- a/examples/blog/package.json
+++ b/examples/blog/package.json
@@ -13,10 +13,10 @@
"astro": "astro"
},
"dependencies": {
- "@astrojs/mdx": "^7.0.7",
+ "@astrojs/mdx": "^7.0.8",
"@astrojs/rss": "^4.0.19",
"@astrojs/sitemap": "^3.7.3",
- "astro": "^7.2.4",
+ "astro": "^7.2.5",
"sharp": "^0.35.0"
},
"allowScripts": {
diff --git a/examples/component/package.json b/examples/component/package.json
index a66e7451df75..a6deefb7f3cf 100644
--- a/examples/component/package.json
+++ b/examples/component/package.json
@@ -18,7 +18,7 @@
],
"scripts": {},
"devDependencies": {
- "astro": "^7.2.4"
+ "astro": "^7.2.5"
},
"peerDependencies": {
"astro": "^5.0.0 || ^6.0.0"
diff --git a/examples/container-with-vitest/package.json b/examples/container-with-vitest/package.json
index 6ae7c7b2016a..7b73fad1253f 100644
--- a/examples/container-with-vitest/package.json
+++ b/examples/container-with-vitest/package.json
@@ -15,7 +15,7 @@
},
"dependencies": {
"@astrojs/react": "^6.0.4",
- "astro": "^7.2.4",
+ "astro": "^7.2.5",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"vitest": "^4.1.0"
diff --git a/examples/framework-alpine/package.json b/examples/framework-alpine/package.json
index 1881b4140f66..e4391bc893d9 100644
--- a/examples/framework-alpine/package.json
+++ b/examples/framework-alpine/package.json
@@ -16,7 +16,7 @@
"@astrojs/alpinejs": "^1.0.0",
"@types/alpinejs": "^3.13.11",
"alpinejs": "^3.15.8",
- "astro": "^7.2.4"
+ "astro": "^7.2.5"
},
"allowScripts": {
"esbuild": true
diff --git a/examples/framework-multiple/package.json b/examples/framework-multiple/package.json
index 4e47f06ca8b8..a756a9727869 100644
--- a/examples/framework-multiple/package.json
+++ b/examples/framework-multiple/package.json
@@ -20,7 +20,7 @@
"@astrojs/vue": "^7.0.2",
"@types/react": "^18.3.28",
"@types/react-dom": "^18.3.7",
- "astro": "^7.2.4",
+ "astro": "^7.2.5",
"preact": "^10.28.4",
"react": "^18.3.1",
"react-dom": "^18.3.1",
diff --git a/examples/framework-preact/package.json b/examples/framework-preact/package.json
index e7abe20da8de..69d57a98217a 100644
--- a/examples/framework-preact/package.json
+++ b/examples/framework-preact/package.json
@@ -15,7 +15,7 @@
"dependencies": {
"@astrojs/preact": "^6.0.4",
"@preact/signals": "^2.8.1",
- "astro": "^7.2.4",
+ "astro": "^7.2.5",
"preact": "^10.28.4"
},
"allowScripts": {
diff --git a/examples/framework-react/package.json b/examples/framework-react/package.json
index 49cc0ca31c19..30cdf7066505 100644
--- a/examples/framework-react/package.json
+++ b/examples/framework-react/package.json
@@ -16,7 +16,7 @@
"@astrojs/react": "^6.0.4",
"@types/react": "^18.3.28",
"@types/react-dom": "^18.3.7",
- "astro": "^7.2.4",
+ "astro": "^7.2.5",
"react": "^18.3.1",
"react-dom": "^18.3.1"
},
diff --git a/examples/framework-solid/package.json b/examples/framework-solid/package.json
index 554f799d8807..c316e2df1523 100644
--- a/examples/framework-solid/package.json
+++ b/examples/framework-solid/package.json
@@ -14,7 +14,7 @@
},
"dependencies": {
"@astrojs/solid-js": "^7.0.2",
- "astro": "^7.2.4",
+ "astro": "^7.2.5",
"solid-js": "^1.9.11"
},
"allowScripts": {
diff --git a/examples/framework-svelte/package.json b/examples/framework-svelte/package.json
index 2c55b78d8eba..be0f5d28b9d6 100644
--- a/examples/framework-svelte/package.json
+++ b/examples/framework-svelte/package.json
@@ -14,7 +14,7 @@
},
"dependencies": {
"@astrojs/svelte": "^9.0.1",
- "astro": "^7.2.4",
+ "astro": "^7.2.5",
"svelte": "^5.53.5"
},
"allowScripts": {
diff --git a/examples/framework-vue/package.json b/examples/framework-vue/package.json
index 202202ee80de..5f5e73818e51 100644
--- a/examples/framework-vue/package.json
+++ b/examples/framework-vue/package.json
@@ -14,7 +14,7 @@
},
"dependencies": {
"@astrojs/vue": "^7.0.2",
- "astro": "^7.2.4",
+ "astro": "^7.2.5",
"vue": "^3.5.29"
},
"allowScripts": {
diff --git a/examples/hackernews/package.json b/examples/hackernews/package.json
index 15b61c81d144..8c19932ad4e9 100644
--- a/examples/hackernews/package.json
+++ b/examples/hackernews/package.json
@@ -14,7 +14,7 @@
},
"dependencies": {
"@astrojs/node": "^11.1.4",
- "astro": "^7.2.4"
+ "astro": "^7.2.5"
},
"allowScripts": {
"esbuild": true
diff --git a/examples/integration/package.json b/examples/integration/package.json
index d87db02ef3a1..b24c12e59279 100644
--- a/examples/integration/package.json
+++ b/examples/integration/package.json
@@ -18,7 +18,7 @@
],
"scripts": {},
"devDependencies": {
- "astro": "^7.2.4"
+ "astro": "^7.2.5"
},
"peerDependencies": {
"astro": "^4.0.0"
diff --git a/examples/minimal/package.json b/examples/minimal/package.json
index 8ea8d9837e33..0cfc330738b0 100644
--- a/examples/minimal/package.json
+++ b/examples/minimal/package.json
@@ -13,7 +13,7 @@
"astro": "astro"
},
"dependencies": {
- "astro": "^7.2.4"
+ "astro": "^7.2.5"
},
"allowScripts": {
"esbuild": true
diff --git a/examples/portfolio/package.json b/examples/portfolio/package.json
index bac2f217ae56..ebe5c1242841 100644
--- a/examples/portfolio/package.json
+++ b/examples/portfolio/package.json
@@ -13,7 +13,7 @@
"astro": "astro"
},
"dependencies": {
- "astro": "^7.2.4"
+ "astro": "^7.2.5"
},
"allowScripts": {
"esbuild": true
diff --git a/examples/ssr/package.json b/examples/ssr/package.json
index f498797979d8..b8badab12d4c 100644
--- a/examples/ssr/package.json
+++ b/examples/ssr/package.json
@@ -16,7 +16,7 @@
"dependencies": {
"@astrojs/node": "^11.1.4",
"@astrojs/svelte": "^9.0.1",
- "astro": "^7.2.4",
+ "astro": "^7.2.5",
"svelte": "^5.53.5"
},
"allowScripts": {
diff --git a/examples/starlog/package.json b/examples/starlog/package.json
index 12d44981e785..de6d9ad7c50f 100644
--- a/examples/starlog/package.json
+++ b/examples/starlog/package.json
@@ -9,7 +9,7 @@
"astro": "astro"
},
"dependencies": {
- "astro": "^7.2.4",
+ "astro": "^7.2.5",
"sass": "^1.97.3",
"sharp": "^0.35.0"
},
diff --git a/examples/toolbar-app/package.json b/examples/toolbar-app/package.json
index b561a8f063f7..4aacbe14fc85 100644
--- a/examples/toolbar-app/package.json
+++ b/examples/toolbar-app/package.json
@@ -16,7 +16,7 @@
},
"devDependencies": {
"@types/node": "^22.10.6",
- "astro": "^7.2.4"
+ "astro": "^7.2.5"
},
"engines": {
"node": ">=22.12.0"
diff --git a/examples/with-markdoc/package.json b/examples/with-markdoc/package.json
index 7044bfd0b898..281a370e923a 100644
--- a/examples/with-markdoc/package.json
+++ b/examples/with-markdoc/package.json
@@ -14,7 +14,7 @@
},
"dependencies": {
"@astrojs/markdoc": "^2.0.8",
- "astro": "^7.2.4"
+ "astro": "^7.2.5"
},
"allowScripts": {
"esbuild": true
diff --git a/examples/with-mdx/package.json b/examples/with-mdx/package.json
index db64f8e9962a..243d11208d35 100644
--- a/examples/with-mdx/package.json
+++ b/examples/with-mdx/package.json
@@ -13,9 +13,9 @@
"astro": "astro"
},
"dependencies": {
- "@astrojs/mdx": "^7.0.7",
+ "@astrojs/mdx": "^7.0.8",
"@astrojs/preact": "^6.0.4",
- "astro": "^7.2.4",
+ "astro": "^7.2.5",
"preact": "^10.28.4"
},
"allowScripts": {
diff --git a/examples/with-nanostores/package.json b/examples/with-nanostores/package.json
index e5471a8a3010..b532853e4dda 100644
--- a/examples/with-nanostores/package.json
+++ b/examples/with-nanostores/package.json
@@ -15,7 +15,7 @@
"dependencies": {
"@astrojs/preact": "^6.0.4",
"@nanostores/preact": "^1.0.0",
- "astro": "^7.2.4",
+ "astro": "^7.2.5",
"nanostores": "^1.1.1",
"preact": "^10.28.4"
},
diff --git a/examples/with-tailwindcss/package.json b/examples/with-tailwindcss/package.json
index 359b244b373a..dae4c9f9e0e2 100644
--- a/examples/with-tailwindcss/package.json
+++ b/examples/with-tailwindcss/package.json
@@ -13,10 +13,10 @@
"astro": "astro"
},
"dependencies": {
- "@astrojs/mdx": "^7.0.7",
+ "@astrojs/mdx": "^7.0.8",
"@tailwindcss/vite": "^4.2.1",
"@types/canvas-confetti": "^1.9.0",
- "astro": "^7.2.4",
+ "astro": "^7.2.5",
"canvas-confetti": "^1.9.4",
"tailwindcss": "^4.2.1",
"vite": "^8.0.13"
diff --git a/examples/with-vitest/package.json b/examples/with-vitest/package.json
index f7bbd3021346..6af1d5f1d7cb 100644
--- a/examples/with-vitest/package.json
+++ b/examples/with-vitest/package.json
@@ -14,7 +14,7 @@
"test": "vitest"
},
"dependencies": {
- "astro": "^7.2.4",
+ "astro": "^7.2.5",
"vitest": "^5.0.0-beta.2"
},
"allowScripts": {
diff --git a/packages/astro/CHANGELOG.md b/packages/astro/CHANGELOG.md
index 39f99190bd78..7c6aef3efb19 100644
--- a/packages/astro/CHANGELOG.md
+++ b/packages/astro/CHANGELOG.md
@@ -1,5 +1,58 @@
# astro
+## 7.2.5
+
+### Patch Changes
+
+- [#17758](https://github.com/withastro/astro/pull/17758) [`5f419e2`](https://github.com/withastro/astro/commit/5f419e25c570002a2ce0e10a973aa13336016b0c) Thanks [@astro-factory](https://github.com/apps/astro-factory)! - Fixes a bug where `experimental_getFontFileURL()` rejected valid font URLs when using the Cloudflare adapter
+
+- [#17416](https://github.com/withastro/astro/pull/17416) [`493796b`](https://github.com/withastro/astro/commit/493796b4c318b19985eccaac7a11aa7b787e1efe) Thanks [@iseraph-dev](https://github.com/iseraph-dev)! - Skips no-op pathname writes when normalizing SSR request URLs
+
+- [#17712](https://github.com/withastro/astro/pull/17712) [`bd374b7`](https://github.com/withastro/astro/commit/bd374b7507de8d706c845946fd847e76de6fc06b) Thanks [@fkatsuhiro](https://github.com/fkatsuhiro)! - Updates deprecation messages target from Astro 7 to 8
+
+- [#17719](https://github.com/withastro/astro/pull/17719) [`dac1768`](https://github.com/withastro/astro/commit/dac17688f691c6cecdff969aa48523bf17fc0657) Thanks [@astrobot-houston](https://github.com/astrobot-houston)! - Fixes session ID validation to reject non-UUID cookie values before using them as storage keys
+
+- [#17770](https://github.com/withastro/astro/pull/17770) [`84eb7e7`](https://github.com/withastro/astro/commit/84eb7e7db99573b80c339efe0392d959e7a9b6cf) Thanks [@astro-factory](https://github.com/apps/astro-factory)! - Fixes `--mode`, `--site`, `--base`, `--out-dir`, `--verbose`, `--silent`, and `--open` flags being silently dropped when using `astro dev --background` or `astro preview --background`
+
+- [#17713](https://github.com/withastro/astro/pull/17713) [`d035290`](https://github.com/withastro/astro/commit/d035290a14afac8834885b727327a7f44d3a3a48) Thanks [@wakqasahmed](https://github.com/wakqasahmed)! - Fixes `content-modules.mjs` not removing entries for deleted or renamed content files, which could cause Vite to attempt to resolve non-existent modules
+
+ As part of this fix, `#moduleImports` is now fully rebuilt from `deferredRender` entries before every write, so a module import added only through the public `addModuleImport()` API without a corresponding `deferredRender` entry in the store will no longer be preserved across writes.
+
+- [#17743](https://github.com/withastro/astro/pull/17743) [`adc750f`](https://github.com/withastro/astro/commit/adc750fa27ea1d4767e30fc12e64a342fbebbd89) Thanks [@contactjawad](https://github.com/contactjawad)! - Fixes `Astro.preferredLocale` and `Astro.preferredLocaleList` ignoring `Accept-Language` quality values when they are absent or `0`. An entry without an explicit `q=` now correctly counts as quality `1.0` (per RFC 7231) and an entry with `q=0` is treated as not acceptable, so the highest-quality locale is selected regardless of header order.
+
+- [#17757](https://github.com/withastro/astro/pull/17757) [`660991c`](https://github.com/withastro/astro/commit/660991c820fbeb087b2f27361e6ebaeba8285358) Thanks [@astro-factory](https://github.com/apps/astro-factory)! - Fixes build errors showing wrong file location, missing line:col, and misleading hints when a plugin error (e.g. from MDX) is wrapped by Vite's build error
+
+- [#17783](https://github.com/withastro/astro/pull/17783) [`60b14ff`](https://github.com/withastro/astro/commit/60b14ffff5b7a66b06d9b12e72933ba9222f519d) Thanks [@matthewp](https://github.com/matthewp)! - Fixes a type error when passing an image from a content collection `image()` schema to a component or ` `. The schema returned by `image()` was missing the `apng` format, so it no longer matched the type of an imported image.
+
+- [#17664](https://github.com/withastro/astro/pull/17664) [`d483125`](https://github.com/withastro/astro/commit/d48312502ef33a32aef3f25b6b6035db8b38e189) Thanks [@astrobot-houston](https://github.com/astrobot-houston)! - Fixes an issue where Astro CSP support didn't correctly handle cases `"unsafe-inline"` resource. Now when `"unsafe-inline"`, Astro won't emit hashes for the directive specified.
+
+- [#17810](https://github.com/withastro/astro/pull/17810) [`0fc5f65`](https://github.com/withastro/astro/commit/0fc5f655ff33701711e91ca950d4f6143ba13c9a) Thanks [@florian-lefebvre](https://github.com/florian-lefebvre)! - Fixes a regression in the content collections that could cause images to not be resolved
+
+- [#17781](https://github.com/withastro/astro/pull/17781) [`aa33b44`](https://github.com/withastro/astro/commit/aa33b440a5222604cc154f2fa1ec6d71b42d7ddc) Thanks [@matthewp](https://github.com/matthewp)! - Fixes `memoryCache()` storing responses that set cookies through `Astro.cookies` or `Astro.session`
+
+- [#17787](https://github.com/withastro/astro/pull/17787) [`6661fbe`](https://github.com/withastro/astro/commit/6661fbe54a2bd5e784110d89b31bc682b8ff7f21) Thanks [@astro-factory](https://github.com/apps/astro-factory)! - Fixes `server:defer` crashing the dev server with "undefined is not a function" when a deferred component imports from `astro:i18n`
+
+- [#17750](https://github.com/withastro/astro/pull/17750) [`dd0e3ac`](https://github.com/withastro/astro/commit/dd0e3aca0b898307431120a5bc1541681190178d) Thanks [@dobrodob](https://github.com/dobrodob)! - Fixes a regression where `transition:persist` stopped working for `` and `` elements.
+
+- [#17774](https://github.com/withastro/astro/pull/17774) [`fe1d16d`](https://github.com/withastro/astro/commit/fe1d16d9865d2e71d4e9deca6a1303dce50c393b) Thanks [@astro-factory](https://github.com/apps/astro-factory)! - Adds support for importing `.apng` files as image metadata for use with standard ` ` elements. Astro's image components reject APNG files to avoid removing their animation
+
+- [#17799](https://github.com/withastro/astro/pull/17799) [`8797754`](https://github.com/withastro/astro/commit/8797754d0b9c07ae7f6f53a48bc223f0e0e489ca) Thanks [@astro-factory](https://github.com/apps/astro-factory)! - Fixes i18n `fallbackType: "rewrite"` returning 500 instead of 404 when the fallback locale also has no matching static path for a prerendered dynamic route
+
+- [#17741](https://github.com/withastro/astro/pull/17741) [`99d3d3d`](https://github.com/withastro/astro/commit/99d3d3dbbfa4fd7b128a056337f1a719437a7377) Thanks [@ericswpark](https://github.com/ericswpark)! - Bumps the Astro compiler to the latest version. [Changelog](https://github.com/withastro/compiler-rs/releases/tag/%40astrojs%2Fcompiler-rs%400.4.0).
+
+- [#17782](https://github.com/withastro/astro/pull/17782) [`3578d45`](https://github.com/withastro/astro/commit/3578d45d34226d63cff3d261c971c221de6794d2) Thanks [@Princesseuh](https://github.com/Princesseuh)! - Improves the performance of the Astro CLI in local by enabling Node's module compilation cache.
+
+- [#17705](https://github.com/withastro/astro/pull/17705) [`2043e4f`](https://github.com/withastro/astro/commit/2043e4fc0f906665a04cac2a94db2aeea1f8e225) Thanks [@astrobot-houston](https://github.com/astrobot-houston)! - Fixes incremental builds serving cached HTML that references stale CSS filenames after a stylesheet-only edit
+
+- [#17754](https://github.com/withastro/astro/pull/17754) [`3d50dfd`](https://github.com/withastro/astro/commit/3d50dfdd14e2eff09f28645b8e788aca36323ff1) Thanks [@astro-factory](https://github.com/apps/astro-factory)! - Fixes the dev server refusing to start in Docker containers after a restart due to PID reuse in the lock file check
+
+- [#17769](https://github.com/withastro/astro/pull/17769) [`bbda94d`](https://github.com/withastro/astro/commit/bbda94d69b9af76baa7473a1182beb8b4bd92c82) Thanks [@astro-factory](https://github.com/apps/astro-factory)! - Fixes a build failure when defining `vite.environments.ssr` in the Astro config. User-provided environment config for `ssr`, `prerender`, or `client` is now properly deep-merged with Astro's internal environment settings instead of silently breaking the server entry naming.
+
+- [#17776](https://github.com/withastro/astro/pull/17776) [`0874da8`](https://github.com/withastro/astro/commit/0874da8c64dd4974bf15f22602c5eae0841f7691) Thanks [@astro-factory](https://github.com/apps/astro-factory)! - Fixes the `glob()` content loader failing to load files with colons in their names (e.g., `Guide: Architecture.md`)
+
+- Updated dependencies [[`0762a83`](https://github.com/withastro/astro/commit/0762a8385b5b5b093def3768a0c4d0464a9dccc4), [`0c99615`](https://github.com/withastro/astro/commit/0c996155d82acbb0c3accad1e56ba356bf47b743)]:
+ - @astrojs/markdown-satteri@0.3.8
+
## 7.2.4
### Patch Changes
diff --git a/packages/astro/package.json b/packages/astro/package.json
index 417a05a29844..28ad3fe41eaf 100644
--- a/packages/astro/package.json
+++ b/packages/astro/package.json
@@ -1,6 +1,6 @@
{
"name": "astro",
- "version": "7.2.4",
+ "version": "7.2.5",
"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/astro/src/content/mutable-data-store.ts b/packages/astro/src/content/mutable-data-store.ts
index ef6c0878ec5d..f843ed122958 100644
--- a/packages/astro/src/content/mutable-data-store.ts
+++ b/packages/astro/src/content/mutable-data-store.ts
@@ -363,7 +363,17 @@ export default new Map([\n${lines.join(',\n')}]);
entries: () => this.entries(collectionName),
values: () => this.values(collectionName),
keys: () => this.keys(collectionName),
- set: ({ id: key, data, body, filePath, deferredRender, digest, rendered, assetImports }) => {
+ set: ({
+ id: key,
+ data,
+ body,
+ filePath,
+ deferredRender,
+ digest,
+ rendered,
+ assetImports,
+ imageImports: incomingImageImports,
+ }) => {
if (!key) {
throw new Error(`ID must be a non-empty string`);
}
@@ -376,6 +386,18 @@ export default new Map([\n${lines.join(',\n')}]);
}
const foundAssets = new Set(assetImports);
const imageImports: (string | number)[][] = [];
+ const seenImageImportPaths = new Set();
+ const recordImageImport = (imagePath: (string | number)[]) => {
+ const pathKey = JSON.stringify(imagePath);
+ if (seenImageImportPaths.has(pathKey)) {
+ return;
+ }
+ seenImageImportPaths.add(pathKey);
+ imageImports.push(imagePath);
+ };
+ for (const existingImagePath of incomingImageImports ?? []) {
+ recordImageImport([...existingImagePath]);
+ }
// Image fields are prefixed during schema parsing. Record their locations and
// strip the prefix so the stored data holds a plain, devalue-serializable src
// string. The recorded paths let read-time resolution rewrite only these fields
@@ -384,7 +406,7 @@ export default new Map([\n${lines.join(',\n')}]);
if (typeof val === 'string' && val.startsWith(IMAGE_IMPORT_PREFIX)) {
const src = val.replace(IMAGE_IMPORT_PREFIX, '');
foundAssets.add(src);
- imageImports.push(ctx.path.map((segment) => segment as string | number));
+ recordImageImport(ctx.path.map((segment) => segment as string | number));
ctx.update(src);
}
});
diff --git a/packages/astro/src/core/fetch/fetch-state.ts b/packages/astro/src/core/fetch/fetch-state.ts
index bd0be821aa90..754fd0a73fd8 100644
--- a/packages/astro/src/core/fetch/fetch-state.ts
+++ b/packages/astro/src/core/fetch/fetch-state.ts
@@ -34,6 +34,7 @@ import { getParams, getProps } from '../render/index.js';
import { executeRewrite } from '../rewrites/handler.js';
import { isRoute404or500, isRouteServerIsland } from '../routing/match.js';
import { MultiLevelEncodingError, validateAndDecodePathname } from '../util/pathname.js';
+import { setPathname } from '../util/normalized-url.js';
import { getOriginPathname, setOriginPathname } from '../routing/rewrite.js';
import { computePathnameFromDomain } from '../i18n/domain.js';
import { getCustom404Route, routeHasHtmlExtension } from '../routing/helpers.js';
@@ -331,8 +332,8 @@ export class FetchState implements AstroFetchState {
const url = new URL(request.url);
const publicPathname = this.#normalizePathname(url.pathname);
const pathname = this.#computePathname(publicPathname);
- url.pathname = publicPathname;
- url.pathname = collapseDuplicateSlashes(url.pathname);
+ setPathname(url, publicPathname);
+ setPathname(url, collapseDuplicateSlashes(url.pathname));
// For domain-based i18n routing, the locale prefix is derived from the
// request's Host header rather than its URL. When a locale is detected,
// the resulting pathname includes the prefix (e.g. /en/boats/1/foo) that
diff --git a/packages/astro/src/core/util/normalized-url.ts b/packages/astro/src/core/util/normalized-url.ts
index 88b30b993ef1..68e63eb85611 100644
--- a/packages/astro/src/core/util/normalized-url.ts
+++ b/packages/astro/src/core/util/normalized-url.ts
@@ -9,21 +9,34 @@ export function createNormalizedUrl(requestUrl: string): URL {
return normalizeUrl(new URL(requestUrl));
}
+/**
+ * Assigns `url.pathname` only when the value differs.
+ * The setter re-parses the whole URL, so a no-op write is still expensive.
+ */
+export function setPathname(url: URL, pathname: string): void {
+ if (url.pathname !== pathname) {
+ url.pathname = pathname;
+ }
+}
+
/**
* Normalizes an already-parsed URL in place: decodes and validates the
* pathname, collapses duplicate slashes. Returns the same URL object.
+ *
+ * Collapse runs after the decode is written back: the pathname setter
+ * rewrites `\` to `/`, so a decoded backslash only becomes `//` once assigned.
*/
export function normalizeUrl(url: URL): URL {
try {
- url.pathname = validateAndDecodePathname(url.pathname);
+ setPathname(url, validateAndDecodePathname(url.pathname));
} catch {
// For decoding failures (truly malformed URLs), fall back gracefully.
try {
- url.pathname = decodeURI(url.pathname);
+ setPathname(url, decodeURI(url.pathname));
} catch {
// If even basic decoding fails, return URL as-is
}
}
- url.pathname = collapseDuplicateSlashes(url.pathname);
+ setPathname(url, collapseDuplicateSlashes(url.pathname));
return url;
}
diff --git a/packages/astro/src/manifest/serialized.ts b/packages/astro/src/manifest/serialized.ts
index 8c8276a8e5e4..8506f7ea0ceb 100644
--- a/packages/astro/src/manifest/serialized.ts
+++ b/packages/astro/src/manifest/serialized.ts
@@ -77,6 +77,24 @@ export function serializedManifestPlugin({
return {
name: SERIALIZED_MANIFEST_ID,
enforce: 'pre',
+ // Dependency optimization runs as a nested Rolldown build that cannot load Vite virtual
+ // modules. Keep this import external so the server module graph resolves it below.
+ configEnvironment(environmentName) {
+ if (
+ command === 'dev' &&
+ (environmentName === ASTRO_VITE_ENVIRONMENT_NAMES.astro ||
+ environmentName === ASTRO_VITE_ENVIRONMENT_NAMES.ssr ||
+ environmentName === ASTRO_VITE_ENVIRONMENT_NAMES.prerender)
+ ) {
+ return {
+ optimizeDeps: {
+ rolldownOptions: {
+ external: [AMBIENT_MANIFEST_SPECIFIER],
+ },
+ },
+ };
+ }
+ },
configureServer(server) {
server.watcher.on('add', (path) => reloadManifest(path, server));
server.watcher.on('unlink', (path) => reloadManifest(path, server));
diff --git a/packages/astro/test/units/content-layer/asset-imports.test.ts b/packages/astro/test/units/content-layer/asset-imports.test.ts
index e4024e324f25..8781ad7b65ff 100644
--- a/packages/astro/test/units/content-layer/asset-imports.test.ts
+++ b/packages/astro/test/units/content-layer/asset-imports.test.ts
@@ -1,8 +1,102 @@
import assert from 'node:assert/strict';
-import { describe, it } from 'node:test';
import fs from 'node:fs/promises';
+import { describe, it } from 'node:test';
+import { z } from 'zod';
+import { imageSrcToImportId } from '../../../dist/assets/utils/resolveImports.js';
+import { defineCollection } from '../../../dist/content/config.js';
+import { ContentLayer } from '../../../dist/content/content-layer.js';
import { MutableDataStore } from '../../../dist/content/mutable-data-store.js';
-import { createTempDir } from './test-helpers.ts';
+import { resolveEntryData } from '../../../dist/content/runtime.js';
+import { AstroLogger } from '../../../dist/core/logger/core.js';
+import { createMinimalSettings, createTempDir, createTestConfigObserver } from './test-helpers.ts';
+
+const FILE_PATH = 'src/data/posts/shuttle/index.md';
+
+const SRCS: Record = {
+ dotSlash: './shuttle.jpg',
+ dotDot: '../data/shuttle.jpg',
+ bare: 'shuttle.jpg',
+ bareNested: 'nested/shuttle.jpg',
+ absolute: '/src/data/shuttle.jpg',
+ alias: '@images/shuttle.jpg',
+};
+
+// Both a top-level and a nested image field, so the recorded paths cover both
+// shapes: `['image']` and `['banner', 'image']`.
+const EXPECTED_IMAGE_PATHS = [['image'], ['banner', 'image']];
+
+const RESOLVED: any = { src: '/_astro/shuttle.hash.jpg', width: 100, height: 100, format: 'jpg' };
+
+const imageSchema = ({ image }: any) =>
+ z.object({
+ id: z.string(),
+ image: image(),
+ banner: z.object({ image: image(), alt: z.string() }),
+ enriched: z.boolean().optional(),
+ });
+
+function makeEntryData(id: string, image: string) {
+ return { id, image, banner: { image, alt: `${id} banner` } };
+}
+
+async function syncCollection(loader: any) {
+ const root = new URL('../../fixtures/content-layer/', import.meta.url);
+ const store = new MutableDataStore();
+ const contentLayer = new ContentLayer({
+ settings: createMinimalSettings(root),
+ logger: new AstroLogger({ destination: { write: () => true }, level: 'silent' }),
+ store,
+ contentConfigObserver: createTestConfigObserver({
+ imgs: defineCollection({ loader, schema: imageSchema }),
+ }),
+ });
+ await contentLayer.sync();
+ return store.values('imgs');
+}
+
+/**
+ * Mirrors what the build does: every `assetImports` src becomes a Vite import id
+ * that resolves to the built `ImageMetadata`.
+ */
+function buildAssetMap(entries: Array) {
+ const map = new Map();
+ for (const entry of entries) {
+ for (const src of entry.assetImports ?? []) {
+ const id = imageSrcToImportId(src, entry.filePath);
+ if (id) map.set(id, RESOLVED);
+ }
+ }
+ return map;
+}
+
+function assertImagesResolve(entries: Array) {
+ assert.equal(entries.length, Object.keys(SRCS).length);
+ const map = buildAssetMap(entries);
+
+ for (const entry of entries) {
+ const src = SRCS[entry.id];
+
+ // 7.2.3 stores the plain src and records where the image fields live,
+ // instead of keeping an `__ASTRO_IMAGE_`-prefixed string in the data.
+ assert.equal(entry.data.image, src, `${entry.id}: stored src`);
+ assert.equal(entry.data.banner.image, src, `${entry.id}: stored nested src`);
+ assert.deepEqual(
+ entry.imageImports,
+ EXPECTED_IMAGE_PATHS,
+ `${entry.id}: image field paths must be recorded on the entry`,
+ );
+
+ const data: any = resolveEntryData(entry, map);
+ assert.equal(data.image, RESOLVED, `${entry.id}: image must resolve to ImageMetadata`);
+ assert.equal(
+ data.banner.image,
+ RESOLVED,
+ `${entry.id}: nested image must resolve to ImageMetadata`,
+ );
+ // Untouched siblings are passed through.
+ assert.equal(data.banner.alt, `${entry.id} banner`);
+ }
+}
describe('Content Layer - Asset Imports', () => {
it('generates unique symbol names for imports with colliding shorthashes', async () => {
@@ -33,4 +127,55 @@ describe('Content Layer - Asset Imports', () => {
assert.equal(importNames.length, 2, 'should have exactly 2 imports');
assert.notEqual(importNames[0], importNames[1], 'import identifiers must be unique');
});
+
+ it('resolves images for entries the loader stores once', async () => {
+ const entries = await syncCollection({
+ name: 'store-once',
+ async load(context: any) {
+ for (const [id, image] of Object.entries(SRCS)) {
+ const data = await context.parseData({
+ id,
+ data: makeEntryData(id, image),
+ filePath: FILE_PATH,
+ });
+ context.store.set({ id, data, filePath: FILE_PATH });
+ }
+ },
+ });
+
+ assertImagesResolve(entries);
+ });
+
+ it('resolves images for entries the loader reads back and re-stores', async () => {
+ const entries = await syncCollection({
+ name: 'read-modify-write',
+ async load(context: any) {
+ for (const [id, image] of Object.entries(SRCS)) {
+ const data = await context.parseData({
+ id,
+ data: makeEntryData(id, image),
+ filePath: FILE_PATH,
+ });
+ context.store.set({ id, data, filePath: FILE_PATH });
+ }
+
+ // Second pass: a loader that enriches an entry after the initial store
+ // (attaching a sibling file's contents, a computed field, ...) reads the
+ // stored entry back and re-stores it. `set()` strips the image prefix in
+ // place on the first pass, so on this pass there is no prefix left to
+ // re-discover — the entry's recorded `imageImports` are the only record
+ // of where the images live, and must survive the round-trip.
+ for (const entry of context.store.values()) {
+ context.store.set({ ...entry, data: { ...entry.data, enriched: true } });
+ }
+ },
+ });
+
+ // Guard: the second pass really did re-store every entry.
+ for (const entry of entries) {
+ assert.equal(entry.data.enriched, true, `${entry.id}: entry was re-stored`);
+ }
+
+ assertImagesResolve(entries);
+ });
});
diff --git a/packages/astro/test/units/util/normalized-url.test.ts b/packages/astro/test/units/util/normalized-url.test.ts
new file mode 100644
index 000000000000..fbe80d006221
--- /dev/null
+++ b/packages/astro/test/units/util/normalized-url.test.ts
@@ -0,0 +1,68 @@
+import assert from 'node:assert/strict';
+import { describe, it } from 'node:test';
+import { createNormalizedUrl, normalizeUrl } from '../../../dist/core/util/normalized-url.js';
+
+describe('normalizeUrl', () => {
+ // #region Plain paths (the common case: nothing to rewrite)
+
+ it('leaves an ordinary path unchanged', () => {
+ assert.equal(normalizeUrl(new URL('https://e.com/about')).pathname, '/about');
+ });
+
+ it('leaves the root path unchanged', () => {
+ assert.equal(normalizeUrl(new URL('https://e.com/')).pathname, '/');
+ });
+
+ it('preserves the search and hash', () => {
+ assert.equal(normalizeUrl(new URL('https://e.com/x?q=1#h')).href, 'https://e.com/x?q=1#h');
+ });
+
+ it('returns the same URL object', () => {
+ const url = new URL('https://e.com/a');
+ assert.equal(normalizeUrl(url), url);
+ });
+
+ // #endregion
+ // #region Duplicate slashes
+
+ it('collapses duplicate slashes', () => {
+ assert.equal(normalizeUrl(new URL('https://e.com/a//b')).pathname, '/a/b');
+ assert.equal(normalizeUrl(new URL('https://e.com///a///b')).pathname, '/a/b');
+ });
+
+ // #endregion
+ // #region Encoding
+
+ it('decodes single-encoded unreserved characters', () => {
+ assert.equal(normalizeUrl(new URL('https://e.com/api/%61dmin')).pathname, '/api/admin');
+ });
+
+ it('fully decodes multi-encoded unreserved characters', () => {
+ assert.equal(normalizeUrl(new URL('https://e.com/api/%2561dmin')).pathname, '/api/admin');
+ });
+
+ it('keeps reserved characters encoded', () => {
+ assert.equal(normalizeUrl(new URL('https://e.com/path%3Fname')).pathname, '/path%3Fname');
+ });
+
+ it('re-encodes characters the pathname setter escapes', () => {
+ assert.equal(normalizeUrl(new URL('https://e.com/a%20b')).pathname, '/a%20b');
+ });
+
+ // #endregion
+ // #region Backslash
+
+ // Pathname setter rewrites `\` to `/`, so collapse must run after the
+ // decode is assigned: `/a%5C/b` -> `/a\/b` -> `/a//b` -> `/a/b`.
+ it('collapses a slash introduced by decoding a backslash', () => {
+ assert.equal(normalizeUrl(new URL('https://e.com/a%5C/b')).pathname, '/a/b');
+ });
+
+ // #endregion
+});
+
+describe('createNormalizedUrl', () => {
+ it('parses and normalizes a request URL string', () => {
+ assert.equal(createNormalizedUrl('https://e.com/a//%61dmin').pathname, '/a/admin');
+ });
+});
diff --git a/packages/create-astro/CHANGELOG.md b/packages/create-astro/CHANGELOG.md
index 7b1fe68bf55c..d7aca99dc9e8 100644
--- a/packages/create-astro/CHANGELOG.md
+++ b/packages/create-astro/CHANGELOG.md
@@ -1,5 +1,11 @@
# create-astro
+## 5.2.4
+
+### Patch Changes
+
+- [#17756](https://github.com/withastro/astro/pull/17756) [`f88c875`](https://github.com/withastro/astro/commit/f88c875c2c89af3b8cbb9f9eebdcddde6e0645c8) Thanks [@astro-factory](https://github.com/apps/astro-factory)! - Fixes `npm install` warnings on npm v11+ about esbuild's install scripts not being covered by `allowScripts`. Adds `ensureNpmScriptsAllowed()` to pre-approve esbuild in `package.json` before running `npm install`, matching the existing pnpm v11 compatibility fix.
+
## 5.2.3
### Patch Changes
diff --git a/packages/create-astro/package.json b/packages/create-astro/package.json
index 708425cbf3bd..0b712c3cd104 100644
--- a/packages/create-astro/package.json
+++ b/packages/create-astro/package.json
@@ -1,6 +1,6 @@
{
"name": "create-astro",
- "version": "5.2.3",
+ "version": "5.2.4",
"type": "module",
"author": "withastro",
"license": "MIT",
diff --git a/packages/integrations/cloudflare/CHANGELOG.md b/packages/integrations/cloudflare/CHANGELOG.md
index 19d156646a5e..d742de1b660c 100644
--- a/packages/integrations/cloudflare/CHANGELOG.md
+++ b/packages/integrations/cloudflare/CHANGELOG.md
@@ -1,5 +1,14 @@
# @astrojs/cloudflare
+## 14.2.4
+
+### Patch Changes
+
+- [#17789](https://github.com/withastro/astro/pull/17789) [`7c541a7`](https://github.com/withastro/astro/commit/7c541a70c5c3688e7f159d8e1b39888a54f1bee4) Thanks [@astro-factory](https://github.com/apps/astro-factory)! - Fixes dep scanning failure when `.astro` frontmatter contains regex literals with quote characters (e.g. `/"/g`)
+
+- Updated dependencies []:
+ - @astrojs/underscore-redirects@1.0.4
+
## 14.2.3
### Patch Changes
diff --git a/packages/integrations/cloudflare/package.json b/packages/integrations/cloudflare/package.json
index 774ef12a332c..13ad94939f01 100644
--- a/packages/integrations/cloudflare/package.json
+++ b/packages/integrations/cloudflare/package.json
@@ -1,7 +1,7 @@
{
"name": "@astrojs/cloudflare",
"description": "Deploy your site to Cloudflare Workers",
- "version": "14.2.3",
+ "version": "14.2.4",
"type": "module",
"author": "withastro",
"license": "MIT",
diff --git a/packages/integrations/cloudflare/test/custom-entryfile-fetch-state.test.ts b/packages/integrations/cloudflare/test/custom-entryfile-fetch-state.test.ts
index cdf9da121c96..f3a937f13b03 100644
--- a/packages/integrations/cloudflare/test/custom-entryfile-fetch-state.test.ts
+++ b/packages/integrations/cloudflare/test/custom-entryfile-fetch-state.test.ts
@@ -1,6 +1,8 @@
import * as assert from 'node:assert/strict';
+import { rmSync } from 'node:fs';
import { after, before, describe, it } from 'node:test';
-import { type Fixture, loadFixture, type PreviewServer } from './test-utils.ts';
+import { fileURLToPath } from 'node:url';
+import { type DevServer, type Fixture, loadFixture, type PreviewServer } from './test-utils.ts';
// Regression test for https://github.com/withastro/astro/issues/17591:
// a custom worker entryfile that builds its own request state with
@@ -38,3 +40,30 @@ describe('Custom entry file using astro/fetch', () => {
);
});
});
+
+describe('Custom entry file using astro/fetch in dev', () => {
+ let fixture: Fixture;
+ let devServer: DevServer;
+
+ before(async () => {
+ fixture = await loadFixture({
+ root: './fixtures/custom-entryfile-fetch-state/',
+ });
+ // Optimizer plugins are not included in Vite's cache key.
+ const viteCacheDir = new URL('./node_modules/.vite/', fixture.config.root);
+ rmSync(fileURLToPath(viteCacheDir), { recursive: true, force: true });
+ devServer = await fixture.startDevServer();
+ });
+
+ after(async () => {
+ await devServer.stop();
+ });
+
+ it('renders an SSR page from a state built with new FetchState(request)', async () => {
+ const response = await fixture.fetch('/');
+ const html = await response.text();
+ assert.equal(response.status, 200, html);
+ assert.equal(response.headers.get('X-Fetch-State-Entrypoint'), 'true');
+ assert.match(html, /astro-cloudflare-custom-entryfile-fetch-state/);
+ });
+});
diff --git a/packages/integrations/mdx/CHANGELOG.md b/packages/integrations/mdx/CHANGELOG.md
index c67c936ef938..52bc392d8777 100644
--- a/packages/integrations/mdx/CHANGELOG.md
+++ b/packages/integrations/mdx/CHANGELOG.md
@@ -1,5 +1,13 @@
# @astrojs/mdx
+## 7.0.8
+
+### Patch Changes
+
+- [#17757](https://github.com/withastro/astro/pull/17757) [`660991c`](https://github.com/withastro/astro/commit/660991c820fbeb087b2f27361e6ebaeba8285358) Thanks [@astro-factory](https://github.com/apps/astro-factory)! - Fixes build errors showing wrong file location, missing line:col, and misleading hints when a plugin error (e.g. from MDX) is wrapped by Vite's build error
+
+- [#17766](https://github.com/withastro/astro/pull/17766) [`0762a83`](https://github.com/withastro/astro/commit/0762a8385b5b5b093def3768a0c4d0464a9dccc4) Thanks [@HiDeoo](https://github.com/HiDeoo)! - Fixes Sätteri processor option types to accept all plugin entries supported by Sätteri v0.10.3.
+
## 7.0.7
### Patch Changes
diff --git a/packages/integrations/mdx/package.json b/packages/integrations/mdx/package.json
index 08121efe9318..63fa681d5d52 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": "7.0.7",
+ "version": "7.0.8",
"type": "module",
"author": "withastro",
"license": "MIT",
diff --git a/packages/integrations/netlify/CHANGELOG.md b/packages/integrations/netlify/CHANGELOG.md
index 26e314000eb3..03e42470202f 100644
--- a/packages/integrations/netlify/CHANGELOG.md
+++ b/packages/integrations/netlify/CHANGELOG.md
@@ -1,5 +1,14 @@
# @astrojs/netlify
+## 8.2.4
+
+### Patch Changes
+
+- [#17752](https://github.com/withastro/astro/pull/17752) [`e362d4c`](https://github.com/withastro/astro/commit/e362d4cf540b27730482455c8fc02efe57d16702) Thanks [@matthewp](https://github.com/matthewp)! - Fixes generated Netlify Image CDN allowlists to reject remote URLs that contain an allowed image origin only within their path or query string
+
+- Updated dependencies []:
+ - @astrojs/underscore-redirects@1.0.4
+
## 8.2.3
### Patch Changes
diff --git a/packages/integrations/netlify/package.json b/packages/integrations/netlify/package.json
index 76fa0759b611..6ca1677e9949 100644
--- a/packages/integrations/netlify/package.json
+++ b/packages/integrations/netlify/package.json
@@ -1,7 +1,7 @@
{
"name": "@astrojs/netlify",
"description": "Deploy your site to Netlify",
- "version": "8.2.3",
+ "version": "8.2.4",
"type": "module",
"author": "withastro",
"license": "MIT",
diff --git a/packages/integrations/vercel/CHANGELOG.md b/packages/integrations/vercel/CHANGELOG.md
index 8569bc7edde5..bd014bb2ef71 100644
--- a/packages/integrations/vercel/CHANGELOG.md
+++ b/packages/integrations/vercel/CHANGELOG.md
@@ -1,5 +1,11 @@
# @astrojs/vercel
+## 11.0.8
+
+### Patch Changes
+
+- [#17794](https://github.com/withastro/astro/pull/17794) [`dd29ce8`](https://github.com/withastro/astro/commit/dd29ce81f5b562f5d0dccdd96e28dade350c5e4c) Thanks [@astro-factory](https://github.com/apps/astro-factory)! - Fixes a bug where `@vercel/nft` file tracing silently dropped all dependency files when `outDir` was configured outside `root`, causing deployed functions to crash with `ERR_MODULE_NOT_FOUND`
+
## 11.0.7
### Patch Changes
diff --git a/packages/integrations/vercel/package.json b/packages/integrations/vercel/package.json
index 7fe1bb134717..9dafb44c76c0 100644
--- a/packages/integrations/vercel/package.json
+++ b/packages/integrations/vercel/package.json
@@ -1,7 +1,7 @@
{
"name": "@astrojs/vercel",
"description": "Deploy your site to Vercel",
- "version": "11.0.7",
+ "version": "11.0.8",
"type": "module",
"author": "withastro",
"license": "MIT",
diff --git a/packages/integrations/vercel/src/lib/nft.ts b/packages/integrations/vercel/src/lib/nft.ts
index 7275158548c7..c79cd48e873c 100644
--- a/packages/integrations/vercel/src/lib/nft.ts
+++ b/packages/integrations/vercel/src/lib/nft.ts
@@ -1,10 +1,28 @@
-import { relative as relativePath } from 'node:path';
+import { dirname, isAbsolute, relative as relativePath, sep } from 'node:path';
import { fileURLToPath, pathToFileURL } from 'node:url';
import { copyFilesToFolder } from '@astrojs/internal-helpers/fs';
import { appendForwardSlash } from '@astrojs/internal-helpers/path';
import type { AstroIntegrationLogger } from 'astro';
import { searchForWorkspaceRoot } from './searchRoot.js';
+export function findCommonAncestor(rootPath: string, entryPath: string): string {
+ let ancestor = rootPath;
+ let relativeEntryPath = relativePath(ancestor, entryPath);
+
+ while (
+ relativeEntryPath === '..' ||
+ relativeEntryPath.startsWith(`..${sep}`) ||
+ isAbsolute(relativeEntryPath)
+ ) {
+ const parent = dirname(ancestor);
+ if (parent === ancestor) break;
+ ancestor = parent;
+ relativeEntryPath = relativePath(ancestor, entryPath);
+ }
+
+ return ancestor;
+}
+
export async function copyDependenciesToFunction(
{
entry,
@@ -29,8 +47,10 @@ export async function copyDependenciesToFunction(
const entryPath = fileURLToPath(entry);
logger.info(`Bundling function ${relativePath(fileURLToPath(outDir), entryPath)}`);
- // Set the base to the workspace root
- const base = pathToFileURL(appendForwardSlash(searchForWorkspaceRoot(fileURLToPath(root))));
+ // NFT only traces files within `base`, so it must encompass the project root and build output.
+ // https://github.com/withastro/astro/issues/17761
+ const searchStart = findCommonAncestor(fileURLToPath(root), entryPath);
+ const base = pathToFileURL(appendForwardSlash(searchForWorkspaceRoot(searchStart)));
// The Vite bundle includes an import to `@vercel/nft` for some reason,
// and that trips up `@vercel/nft` itself during the adapter build. Using a
diff --git a/packages/integrations/vercel/test/fixtures/outdir-outside-root/app/astro.config.mjs b/packages/integrations/vercel/test/fixtures/outdir-outside-root/app/astro.config.mjs
new file mode 100644
index 000000000000..6267aa67fb86
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/outdir-outside-root/app/astro.config.mjs
@@ -0,0 +1,8 @@
+import vercel from '@astrojs/vercel';
+import { defineConfig } from 'astro/config';
+
+export default defineConfig({
+ adapter: vercel(),
+ output: 'server',
+ outDir: '../dist',
+});
diff --git a/packages/integrations/vercel/test/fixtures/outdir-outside-root/app/package.json b/packages/integrations/vercel/test/fixtures/outdir-outside-root/app/package.json
new file mode 100644
index 000000000000..2475b918a98d
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/outdir-outside-root/app/package.json
@@ -0,0 +1,9 @@
+{
+ "name": "@test/astro-vercel-outdir-outside-root",
+ "version": "0.0.0",
+ "private": true,
+ "dependencies": {
+ "@astrojs/vercel": "workspace:*",
+ "astro": "workspace:*"
+ }
+}
diff --git a/packages/integrations/vercel/test/fixtures/outdir-outside-root/app/src/pages/index.astro b/packages/integrations/vercel/test/fixtures/outdir-outside-root/app/src/pages/index.astro
new file mode 100644
index 000000000000..a28c8ca1b154
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/outdir-outside-root/app/src/pages/index.astro
@@ -0,0 +1,10 @@
+---
+const time = new Date().toISOString();
+---
+
+ Test
+
+ Hello
+ Server time: {time}
+
+
diff --git a/packages/integrations/vercel/test/outdir-outside-root.test.ts b/packages/integrations/vercel/test/outdir-outside-root.test.ts
new file mode 100644
index 000000000000..18ef189a1852
--- /dev/null
+++ b/packages/integrations/vercel/test/outdir-outside-root.test.ts
@@ -0,0 +1,30 @@
+import assert from 'node:assert/strict';
+import { before, describe, it } from 'node:test';
+import { type Fixture, loadFixture } from './test-utils.ts';
+
+describe('outDir outside root', () => {
+ let fixture: Fixture;
+
+ before(async () => {
+ fixture = await loadFixture({
+ root: './fixtures/outdir-outside-root/app/',
+ });
+ await fixture.build({});
+ });
+
+ it('build successful', { timeout: 30000 }, async () => {
+ // .vercel/output is created relative to root (app/), readFile resolves
+ // relative to outDir (dist/), so we go up to the fixture dir and into app.
+ assert.ok(await fixture.readFile('../app/.vercel/output/config.json'));
+ });
+
+ it('function includes traced chunks, not just entry', { timeout: 30000 }, async () => {
+ const files = await fixture.glob('../app/.vercel/output/functions/_render.func/**/*.mjs');
+ // The function should contain the entry plus at least one chunk.
+ // If NFT tracing fails (the bug), only the entry is included.
+ assert.ok(
+ files.length > 1,
+ `Expected more than 1 .mjs file in the function, got ${files.length}`,
+ );
+ });
+});
diff --git a/packages/integrations/vercel/test/units/nft.test.ts b/packages/integrations/vercel/test/units/nft.test.ts
new file mode 100644
index 000000000000..984a5d99bb4b
--- /dev/null
+++ b/packages/integrations/vercel/test/units/nft.test.ts
@@ -0,0 +1,30 @@
+import assert from 'node:assert/strict';
+import { join, parse } from 'node:path';
+import { describe, it } from 'node:test';
+import { findCommonAncestor } from '../../dist/lib/nft.js';
+
+describe('findCommonAncestor', () => {
+ const volumeRoot = parse(process.cwd()).root;
+
+ it('returns the root path when it contains the entry', () => {
+ const root = join(volumeRoot, 'workspace', 'app');
+ const entry = join(root, 'dist', 'entry.mjs');
+
+ assert.equal(findCommonAncestor(root, entry), root);
+ });
+
+ it('returns a shared parent when the entry is outside the root', () => {
+ const parent = join(volumeRoot, 'workspace');
+ const root = join(parent, 'app');
+ const entry = join(parent, 'dist', 'entry.mjs');
+
+ assert.equal(findCommonAncestor(root, entry), parent);
+ });
+
+ it('stops at the filesystem root', () => {
+ const root = join(volumeRoot, 'app');
+ const entry = join(volumeRoot, 'dist', 'entry.mjs');
+
+ assert.equal(findCommonAncestor(root, entry), volumeRoot);
+ });
+});
diff --git a/packages/language-tools/ts-plugin/test/units/proxy-language-service.test.mts b/packages/language-tools/ts-plugin/test/units/proxy-language-service.test.mts
new file mode 100644
index 000000000000..359803d32490
--- /dev/null
+++ b/packages/language-tools/ts-plugin/test/units/proxy-language-service.test.mts
@@ -0,0 +1,27 @@
+import 'mocha';
+import assert from 'node:assert';
+import type { Language } from '@volar/language-core';
+import { createProxyLanguageService } from '@volar/typescript/lib/node/proxyLanguageService.js';
+import type ts from 'typescript';
+
+suite('Proxy language service', () => {
+ test('uses language service methods assigned by a later plugin', () => {
+ let called = 'original';
+ const languageService = {
+ getCompletionsAtPosition() {
+ called = 'original';
+ },
+ } as unknown as ts.LanguageService;
+ const { initialize, proxy } = createProxyLanguageService(languageService);
+
+ initialize({ scripts: { get: () => undefined } } as unknown as Language);
+ void proxy.getCompletionsAtPosition;
+ proxy.getCompletionsAtPosition = () => {
+ called = 'decorated';
+ return undefined;
+ };
+ proxy.getCompletionsAtPosition('component.vue', 0, undefined);
+
+ assert.strictEqual(called, 'decorated');
+ });
+});
diff --git a/packages/language-tools/vscode/CHANGELOG.md b/packages/language-tools/vscode/CHANGELOG.md
index 5cdd00f3840b..ae6f2b007b5e 100644
--- a/packages/language-tools/vscode/CHANGELOG.md
+++ b/packages/language-tools/vscode/CHANGELOG.md
@@ -1,5 +1,11 @@
# astro-vscode
+## 2.16.19
+
+### Patch Changes
+
+- [#17791](https://github.com/withastro/astro/pull/17791) [`426eaa1`](https://github.com/withastro/astro/commit/426eaa17530f27f65a366e7f19a86279178bbc92) Thanks [@matthewp](https://github.com/matthewp)! - Fixes missing Vue template auto-import completions when the Astro extension loads first
+
## 2.16.18
### Patch Changes
diff --git a/packages/language-tools/vscode/package.json b/packages/language-tools/vscode/package.json
index a5ae4470be7d..b21be263bca5 100644
--- a/packages/language-tools/vscode/package.json
+++ b/packages/language-tools/vscode/package.json
@@ -24,7 +24,7 @@
"color": "#17191E",
"theme": "dark"
},
- "version": "2.16.18",
+ "version": "2.16.19",
"author": "withastro",
"license": "MIT",
"publisher": "astro-build",
diff --git a/packages/markdown/satteri/CHANGELOG.md b/packages/markdown/satteri/CHANGELOG.md
index 93bce8dfd973..7428f31f46a8 100644
--- a/packages/markdown/satteri/CHANGELOG.md
+++ b/packages/markdown/satteri/CHANGELOG.md
@@ -1,5 +1,13 @@
# @astrojs/markdown-satteri
+## 0.3.8
+
+### Patch Changes
+
+- [#17766](https://github.com/withastro/astro/pull/17766) [`0762a83`](https://github.com/withastro/astro/commit/0762a8385b5b5b093def3768a0c4d0464a9dccc4) Thanks [@HiDeoo](https://github.com/HiDeoo)! - Fixes Sätteri processor option types to accept all plugin entries supported by Sätteri v0.10.3.
+
+- [#17314](https://github.com/withastro/astro/pull/17314) [`0c99615`](https://github.com/withastro/astro/commit/0c996155d82acbb0c3accad1e56ba356bf47b743) Thanks [@barry166](https://github.com/barry166)! - Fixes the editor tooltip for `smartPunctuation` claiming it defaults to `false` when Astro enables it by default.
+
## 0.3.7
### Patch Changes
diff --git a/packages/markdown/satteri/package.json b/packages/markdown/satteri/package.json
index 8d67782bcefd..d81f08cf54ae 100644
--- a/packages/markdown/satteri/package.json
+++ b/packages/markdown/satteri/package.json
@@ -1,6 +1,6 @@
{
"name": "@astrojs/markdown-satteri",
- "version": "0.3.7",
+ "version": "0.3.8",
"type": "module",
"author": "withastro",
"license": "MIT",
diff --git a/packages/markdown/satteri/src/index.ts b/packages/markdown/satteri/src/index.ts
index 2865ef3057d1..3861f89edd45 100644
--- a/packages/markdown/satteri/src/index.ts
+++ b/packages/markdown/satteri/src/index.ts
@@ -14,6 +14,7 @@ export {
export {
isSatteriProcessor,
satteri,
+ type SatteriFeatures,
type SatteriProcessorOptions,
type SatteriResolvedOptions,
} from './processor.js';
diff --git a/packages/markdown/satteri/src/processor.ts b/packages/markdown/satteri/src/processor.ts
index a643fe578cdc..e208907d6341 100644
--- a/packages/markdown/satteri/src/processor.ts
+++ b/packages/markdown/satteri/src/processor.ts
@@ -8,10 +8,19 @@ import type {
} from 'satteri';
import { createSatteriMarkdownProcessor } from './satteri-processor.js';
+export interface SatteriFeatures extends Omit {
+ /**
+ * Smart punctuation à la SmartyPants.
+ *
+ * Default: `true` in Astro.
+ */
+ smartPunctuation?: Features['smartPunctuation'];
+}
+
export interface SatteriProcessorOptions {
mdastPlugins?: MdastPluginList;
hastPlugins?: HastPluginList;
- features?: Features;
+ features?: SatteriFeatures;
}
/**
@@ -21,7 +30,7 @@ export interface SatteriProcessorOptions {
export interface SatteriResolvedOptions {
mdastPlugins: MdastPluginEntry[];
hastPlugins: HastPluginEntry[];
- features: Features;
+ features: SatteriFeatures;
}
/**
diff --git a/packages/markdown/satteri/test/markdown.test.ts b/packages/markdown/satteri/test/markdown.test.ts
index 0b95f2a61d84..fc7fc9bc0531 100644
--- a/packages/markdown/satteri/test/markdown.test.ts
+++ b/packages/markdown/satteri/test/markdown.test.ts
@@ -50,6 +50,15 @@ describe('satteri markdown', () => {
assert.ok(code.includes('"hello"'));
});
+ it('accepts a granular options object for `smartPunctuation`', async () => {
+ const renderer = await satteri({
+ features: { smartPunctuation: { dashes: false } },
+ }).createRenderer({});
+ const { code } = await renderer.render('He said "hello" -- really');
+ assert.match(code, /“hello”/);
+ assert.ok(code.includes('--'));
+ });
+
it('collects local image paths into metadata', async () => {
const processor = await createSatteriMarkdownProcessor();
const { metadata } = await processor.render('');
diff --git a/patches/@volar__typescript@2.4.28.patch b/patches/@volar__typescript@2.4.28.patch
new file mode 100644
index 000000000000..78d76767e98d
--- /dev/null
+++ b/patches/@volar__typescript@2.4.28.patch
@@ -0,0 +1,12 @@
+diff --git a/lib/node/proxyLanguageService.js b/lib/node/proxyLanguageService.js
+index 95f2cc3ef6336b7762bcd0a5036af27b114367a5..9b0c9e0a68bed912737dd8d2179afe21997277f7 100644
+--- a/lib/node/proxyLanguageService.js
++++ b/lib/node/proxyLanguageService.js
+@@ -112,6 +112,7 @@ function createProxyLanguageService(languageService) {
+ return Reflect.get(target, p, receiver);
+ },
+ set(target, p, value, receiver) {
++ proxyCache.delete(p);
+ return Reflect.set(target, p, value, receiver);
+ },
+ }),
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 77222f64390c..6b7ce518b647 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -208,6 +208,9 @@ overrides:
'@types/node@22': ^22.19.0
modern-tar: '>=0.7.7'
+patchedDependencies:
+ '@volar/typescript@2.4.28': 08646e153f568c63dc1e7a3dae0333806b3d8395c5ffbad47fa695f7c26bacad
+
importers:
.:
@@ -390,7 +393,7 @@ importers:
specifier: ^11.1.4
version: link:../../packages/integrations/node
astro:
- specifier: ^7.2.4
+ specifier: ^7.2.5
version: link:../../packages/astro
hono:
specifier: ^4.12.14
@@ -399,13 +402,13 @@ importers:
examples/basics:
dependencies:
astro:
- specifier: ^7.2.4
+ specifier: ^7.2.5
version: link:../../packages/astro
examples/blog:
dependencies:
'@astrojs/mdx':
- specifier: ^7.0.7
+ specifier: ^7.0.8
version: link:../../packages/integrations/mdx
'@astrojs/rss':
specifier: ^4.0.19
@@ -414,7 +417,7 @@ importers:
specifier: ^3.7.3
version: link:../../packages/integrations/sitemap
astro:
- specifier: ^7.2.4
+ specifier: ^7.2.5
version: link:../../packages/astro
sharp:
specifier: ^0.35.0
@@ -423,7 +426,7 @@ importers:
examples/component:
devDependencies:
astro:
- specifier: ^7.2.4
+ specifier: ^7.2.5
version: link:../../packages/astro
examples/container-with-vitest:
@@ -432,7 +435,7 @@ importers:
specifier: ^6.0.4
version: link:../../packages/integrations/react
astro:
- specifier: ^7.2.4
+ specifier: ^7.2.5
version: link:../../packages/astro
react:
specifier: ^18.3.1
@@ -463,7 +466,7 @@ importers:
specifier: ^3.15.8
version: 3.15.8
astro:
- specifier: ^7.2.4
+ specifier: ^7.2.5
version: link:../../packages/astro
examples/framework-multiple:
@@ -490,7 +493,7 @@ importers:
specifier: ^18.3.7
version: 18.3.7(@types/react@18.3.28)
astro:
- specifier: ^7.2.4
+ specifier: ^7.2.5
version: link:../../packages/astro
preact:
specifier: ^10.28.4
@@ -520,7 +523,7 @@ importers:
specifier: ^2.8.1
version: 2.8.2(preact@10.29.8)
astro:
- specifier: ^7.2.4
+ specifier: ^7.2.5
version: link:../../packages/astro
preact:
specifier: ^10.28.4
@@ -538,7 +541,7 @@ importers:
specifier: ^18.3.7
version: 18.3.7(@types/react@18.3.28)
astro:
- specifier: ^7.2.4
+ specifier: ^7.2.5
version: link:../../packages/astro
react:
specifier: ^18.3.1
@@ -553,7 +556,7 @@ importers:
specifier: ^7.0.2
version: link:../../packages/integrations/solid
astro:
- specifier: ^7.2.4
+ specifier: ^7.2.5
version: link:../../packages/astro
solid-js:
specifier: ^1.9.11
@@ -565,7 +568,7 @@ importers:
specifier: ^9.0.1
version: link:../../packages/integrations/svelte
astro:
- specifier: ^7.2.4
+ specifier: ^7.2.5
version: link:../../packages/astro
svelte:
specifier: ^5.53.5
@@ -577,7 +580,7 @@ importers:
specifier: ^7.0.2
version: link:../../packages/integrations/vue
astro:
- specifier: ^7.2.4
+ specifier: ^7.2.5
version: link:../../packages/astro
vue:
specifier: ^3.5.29
@@ -589,25 +592,25 @@ importers:
specifier: ^11.1.4
version: link:../../packages/integrations/node
astro:
- specifier: ^7.2.4
+ specifier: ^7.2.5
version: link:../../packages/astro
examples/integration:
devDependencies:
astro:
- specifier: ^7.2.4
+ specifier: ^7.2.5
version: link:../../packages/astro
examples/minimal:
dependencies:
astro:
- specifier: ^7.2.4
+ specifier: ^7.2.5
version: link:../../packages/astro
examples/portfolio:
dependencies:
astro:
- specifier: ^7.2.4
+ specifier: ^7.2.5
version: link:../../packages/astro
examples/ssr:
@@ -619,7 +622,7 @@ importers:
specifier: ^9.0.1
version: link:../../packages/integrations/svelte
astro:
- specifier: ^7.2.4
+ specifier: ^7.2.5
version: link:../../packages/astro
svelte:
specifier: ^5.53.5
@@ -628,7 +631,7 @@ importers:
examples/starlog:
dependencies:
astro:
- specifier: ^7.2.4
+ specifier: ^7.2.5
version: link:../../packages/astro
sass:
specifier: ^1.97.3
@@ -643,7 +646,7 @@ importers:
specifier: ^22.19.0
version: 22.19.19
astro:
- specifier: ^7.2.4
+ specifier: ^7.2.5
version: link:../../packages/astro
examples/with-markdoc:
@@ -652,19 +655,19 @@ importers:
specifier: ^2.0.8
version: link:../../packages/integrations/markdoc
astro:
- specifier: ^7.2.4
+ specifier: ^7.2.5
version: link:../../packages/astro
examples/with-mdx:
dependencies:
'@astrojs/mdx':
- specifier: ^7.0.7
+ specifier: ^7.0.8
version: link:../../packages/integrations/mdx
'@astrojs/preact':
specifier: ^6.0.4
version: link:../../packages/integrations/preact
astro:
- specifier: ^7.2.4
+ specifier: ^7.2.5
version: link:../../packages/astro
preact:
specifier: ^10.28.4
@@ -679,7 +682,7 @@ importers:
specifier: ^1.0.0
version: 1.0.0(nanostores@1.1.1)(preact@10.29.8)
astro:
- specifier: ^7.2.4
+ specifier: ^7.2.5
version: link:../../packages/astro
nanostores:
specifier: ^1.1.1
@@ -691,7 +694,7 @@ importers:
examples/with-tailwindcss:
dependencies:
'@astrojs/mdx':
- specifier: ^7.0.7
+ specifier: ^7.0.8
version: link:../../packages/integrations/mdx
'@tailwindcss/vite':
specifier: ^4.2.1
@@ -700,7 +703,7 @@ importers:
specifier: ^1.9.0
version: 1.9.0
astro:
- specifier: ^7.2.4
+ specifier: ^7.2.5
version: link:../../packages/astro
canvas-confetti:
specifier: ^1.9.4
@@ -715,7 +718,7 @@ importers:
examples/with-vitest:
dependencies:
astro:
- specifier: ^7.2.4
+ specifier: ^7.2.5
version: link:../../packages/astro
vitest:
specifier: ^5.0.0-beta.2
@@ -6434,6 +6437,15 @@ importers:
specifier: workspace:*
version: link:../../../../../astro
+ packages/integrations/vercel/test/fixtures/outdir-outside-root/app:
+ dependencies:
+ '@astrojs/vercel':
+ specifier: workspace:*
+ version: link:../../../..
+ astro:
+ specifier: workspace:*
+ version: link:../../../../../../astro
+
packages/integrations/vercel/test/fixtures/prerendered-error-pages:
dependencies:
'@astrojs/vercel':
@@ -6811,7 +6823,7 @@ importers:
version: 2.4.28
'@volar/typescript':
specifier: ~2.4.28
- version: 2.4.28
+ version: 2.4.28(patch_hash=08646e153f568c63dc1e7a3dae0333806b3d8395c5ffbad47fa695f7c26bacad)
astro-scripts:
specifier: workspace:*
version: link:../../../scripts
@@ -6869,7 +6881,7 @@ importers:
version: 2.4.28
'@volar/typescript':
specifier: ~2.4.28
- version: 2.4.28
+ version: 2.4.28(patch_hash=08646e153f568c63dc1e7a3dae0333806b3d8395c5ffbad47fa695f7c26bacad)
semver:
specifier: ^7.7.4
version: 7.8.5
@@ -20083,7 +20095,7 @@ snapshots:
'@volar/kit@2.4.28(typescript@6.0.3)':
dependencies:
'@volar/language-service': 2.4.28
- '@volar/typescript': 2.4.28
+ '@volar/typescript': 2.4.28(patch_hash=08646e153f568c63dc1e7a3dae0333806b3d8395c5ffbad47fa695f7c26bacad)
typesafe-path: 0.2.2
typescript: 6.0.3
vscode-languageserver-textdocument: 1.0.12
@@ -20097,7 +20109,7 @@ snapshots:
dependencies:
'@volar/language-core': 2.4.28
'@volar/language-service': 2.4.28
- '@volar/typescript': 2.4.28
+ '@volar/typescript': 2.4.28(patch_hash=08646e153f568c63dc1e7a3dae0333806b3d8395c5ffbad47fa695f7c26bacad)
path-browserify: 1.0.1
request-light: 0.7.0
vscode-languageserver: 9.0.1
@@ -20121,7 +20133,7 @@ snapshots:
vscode-languageserver-textdocument: 1.0.12
vscode-uri: 3.1.0
- '@volar/typescript@2.4.28':
+ '@volar/typescript@2.4.28(patch_hash=08646e153f568c63dc1e7a3dae0333806b3d8395c5ffbad47fa695f7c26bacad)':
dependencies:
'@volar/language-core': 2.4.28
path-browserify: 1.0.1
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index c68a5edddc66..7589639b297d 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -101,3 +101,6 @@ allowBuilds:
protobufjs: false
sharp: false
workerd: false
+
+patchedDependencies:
+ '@volar/typescript@2.4.28': patches/@volar__typescript@2.4.28.patch