diff options
6 files changed, 48 insertions, 20 deletions
diff --git a/packages/integrations/vercel/CHANGELOG.md b/packages/integrations/vercel/CHANGELOG.md index ff066de63..cb2556add 100644 --- a/packages/integrations/vercel/CHANGELOG.md +++ b/packages/integrations/vercel/CHANGELOG.md @@ -20,6 +20,12 @@ - [#385](https://github.com/withastro/adapters/pull/385) [`bb725b7`](https://github.com/withastro/adapters/commit/bb725b7a430a01a3cd197e3e84381be4fa0c945c) Thanks [@florian-lefebvre](https://github.com/florian-lefebvre)! - Cleans up `astro:env` support +## 7.8.2 + +### Patch Changes + +- [#373](https://github.com/withastro/adapters/pull/373) [`5b802a4`](https://github.com/withastro/adapters/commit/5b802a4099743c86418747872171bbe224caaa6d) Thanks [@hrabiel](https://github.com/hrabiel)! - Fix excluding routes with rest parameters from ISR + ## 7.8.1 ### Patch Changes diff --git a/packages/integrations/vercel/package.json b/packages/integrations/vercel/package.json index bbdb967ac..4f9ca6c55 100644 --- a/packages/integrations/vercel/package.json +++ b/packages/integrations/vercel/package.json @@ -37,9 +37,9 @@ }, "dependencies": { "@astrojs/internal-helpers": "^0.4.1", - "@vercel/analytics": "^1.3.1", + "@vercel/analytics": "^1.3.2", "@vercel/edge": "^1.1.2", - "@vercel/nft": "^0.27.4", + "@vercel/nft": "^0.27.5", "esbuild": "^0.21.5", "fast-glob": "^3.3.2" }, diff --git a/packages/integrations/vercel/src/lib/redirects.ts b/packages/integrations/vercel/src/lib/redirects.ts index 9a7a503aa..7ef4d5045 100644 --- a/packages/integrations/vercel/src/lib/redirects.ts +++ b/packages/integrations/vercel/src/lib/redirects.ts @@ -45,25 +45,31 @@ function getParts(part: string, file: string) { // 2022-04-26 function getMatchPattern(segments: RoutePart[][]) { return segments - .map((segment) => { - return segment[0].spread + .map((segment, segmentIndex) => { + return segment.length === 1 && segment[0].spread ? '(?:\\/(.*?))?' - : segment - .map((part) => { - if (part) - return part.dynamic - ? '([^/]+?)' - : part.content - .normalize() - .replace(/\?/g, '%3F') - .replace(/#/g, '%23') - .replace(/%5B/g, '[') - .replace(/%5D/g, ']') - .replace(/[*+?^${}()|[\]\\]/g, '\\$&'); - }) - .join(''); + : // Omit leading slash if segment is a spread. + // This is handled using a regex in Astro core. + // To avoid complex data massaging, we handle in-place here. + (segmentIndex === 0 ? '' : '/') + + segment + .map((part) => { + if (part) + return part.spread + ? '(.*?)' + : part.dynamic + ? '([^/]+?)' + : part.content + .normalize() + .replace(/\?/g, '%3F') + .replace(/#/g, '%23') + .replace(/%5B/g, '[') + .replace(/%5D/g, ']') + .replace(/[*+?^${}()|[\]\\]/g, '\\$&'); + }) + .join(''); }) - .join('/'); + .join(''); } function getReplacePattern(segments: RoutePart[][]) { diff --git a/packages/integrations/vercel/test/fixtures/isr/astro.config.mjs b/packages/integrations/vercel/test/fixtures/isr/astro.config.mjs index 4b675ab6c..97626d60b 100644 --- a/packages/integrations/vercel/test/fixtures/isr/astro.config.mjs +++ b/packages/integrations/vercel/test/fixtures/isr/astro.config.mjs @@ -7,7 +7,7 @@ export default defineConfig({ isr: { bypassToken: "1c9e601d-9943-4e7c-9575-005556d774a8", expiration: 120, - exclude: ["/two", "/excluded/[dynamic]"] + exclude: ["/two", "/excluded/[dynamic]", "/excluded/[...rest]"] } }) }); diff --git a/packages/integrations/vercel/test/fixtures/isr/src/pages/excluded/[...rest].astro b/packages/integrations/vercel/test/fixtures/isr/src/pages/excluded/[...rest].astro new file mode 100644 index 000000000..caf4f5416 --- /dev/null +++ b/packages/integrations/vercel/test/fixtures/isr/src/pages/excluded/[...rest].astro @@ -0,0 +1,8 @@ +<html> + <head> + <title>Rest</title> + </head> + <body> + <h1>Rest</h1> + </body> +</html> diff --git a/packages/integrations/vercel/test/isr.test.js b/packages/integrations/vercel/test/isr.test.js index 6c88d0081..e3af25d66 100644 --- a/packages/integrations/vercel/test/isr.test.js +++ b/packages/integrations/vercel/test/isr.test.js @@ -38,10 +38,18 @@ describe('ISR', () => { dest: '_render', }, { + src: '^/excluded(?:\\/(.*?))?$', + dest: '_render', + }, + { src: '^\\/excluded\\/([^/]+?)\\/?$', dest: '/_isr?x_astro_path=$0', }, { + src: '^\\/excluded(?:\\/(.*?))?\\/?$', + dest: '/_isr?x_astro_path=$0', + }, + { src: '^\\/one\\/?$', dest: '/_isr?x_astro_path=$0', }, |