From 297edf83d7693f0c6eddec1cfc0954e54eda5a80 Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Tue, 21 Mar 2023 15:33:38 +0100 Subject: [PATCH 1/4] fix: constructor correct pathname for isr from route with nested params fixes #9459 --- .changeset/heavy-news-argue.md | 5 +++ packages/adapter-vercel/index.js | 9 ++--- packages/adapter-vercel/package.json | 7 ++-- packages/adapter-vercel/test/utils.spec.js | 38 ++++++++++++++++++++++ packages/adapter-vercel/utils.js | 24 ++++++++++++++ pnpm-lock.yaml | 2 ++ 6 files changed, 76 insertions(+), 9 deletions(-) create mode 100644 .changeset/heavy-news-argue.md create mode 100644 packages/adapter-vercel/test/utils.spec.js create mode 100644 packages/adapter-vercel/utils.js diff --git a/.changeset/heavy-news-argue.md b/.changeset/heavy-news-argue.md new file mode 100644 index 000000000000..210d8efe9729 --- /dev/null +++ b/.changeset/heavy-news-argue.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/adapter-vercel': patch +--- + +fix: constructor correct pathname for isr from route with nested params diff --git a/packages/adapter-vercel/index.js b/packages/adapter-vercel/index.js index 06c3cbbed9e8..4c6344f3dffd 100644 --- a/packages/adapter-vercel/index.js +++ b/packages/adapter-vercel/index.js @@ -3,6 +3,7 @@ import path from 'node:path'; import { fileURLToPath } from 'node:url'; import { nodeFileTrace } from '@vercel/nft'; import esbuild from 'esbuild'; +import { get_pathname } from './utils.js'; const VALID_RUNTIMES = ['edge', 'nodejs16.x', 'nodejs18.x']; @@ -292,13 +293,7 @@ const plugin = function (defaults = {}) { fs.symlinkSync(relative, `${base}.func`); fs.symlinkSync(`../${relative}`, `${base}/__data.json.func`); - let i = 1; - const pathname = route.segments - .map((segment) => { - return segment.dynamic ? `$${i++}` : segment.content; - }) - .join('/'); - + const pathname = get_pathname(route); const json = JSON.stringify(isr, null, '\t'); write(`${base}.prerender-config.json`, json); diff --git a/packages/adapter-vercel/package.json b/packages/adapter-vercel/package.json index 54f522efef14..2d1009c1608b 100644 --- a/packages/adapter-vercel/package.json +++ b/packages/adapter-vercel/package.json @@ -20,12 +20,14 @@ "files": [ "files", "index.js", + "utils.js", "index.d.ts" ], "scripts": { "lint": "prettier --check . --config ../../.prettierrc --ignore-path .gitignore", "format": "pnpm lint --write", - "check": "tsc" + "check": "tsc", + "test": "uvu test .spec.js" }, "dependencies": { "@vercel/nft": "^0.22.1", @@ -34,7 +36,8 @@ "devDependencies": { "@sveltejs/kit": "workspace:^", "@types/node": "^16.18.6", - "typescript": "^4.9.4" + "typescript": "^4.9.4", + "uvu": "^0.5.6" }, "peerDependencies": { "@sveltejs/kit": "^1.5.0" diff --git a/packages/adapter-vercel/test/utils.spec.js b/packages/adapter-vercel/test/utils.spec.js new file mode 100644 index 000000000000..980d2687d47b --- /dev/null +++ b/packages/adapter-vercel/test/utils.spec.js @@ -0,0 +1,38 @@ +import { test } from 'uvu'; +import * as assert from 'uvu/assert'; +import { get_pathname } from '../utils.js'; + +/** + * @param {import('@sveltejs/kit').RouteDefinition['segments']} segments + * @param {string} expected + */ +function run_get_pathname_test(segments, expected) { + const route = /** @type {import('@sveltejs/kit').RouteDefinition} */ ({ segments }); + assert.equal(get_pathname(route), expected); +} + +test('get_pathname for simple route', () => { + run_get_pathname_test([{ content: 'foo', dynamic: false, rest: false }], 'foo'); +}); + +test('get_pathname for route with parameters', () => { + run_get_pathname_test( + [ + { content: 'foo', dynamic: false, rest: false }, + { content: '[bar]', dynamic: true, rest: false } + ], + 'foo/$1' + ); +}); + +test('get_pathname for route with parameters within segment', () => { + run_get_pathname_test( + [ + { content: 'foo-[bar]', dynamic: true, rest: false }, + { content: '[baz]-buz', dynamic: true, rest: false } + ], + 'foo-$1/$2-buz' + ); +}); + +test.run(); diff --git a/packages/adapter-vercel/utils.js b/packages/adapter-vercel/utils.js new file mode 100644 index 000000000000..dfd41ae5c6c3 --- /dev/null +++ b/packages/adapter-vercel/utils.js @@ -0,0 +1,24 @@ +/** @param {import("@sveltejs/kit").RouteDefinition} route */ +export function get_pathname(route) { + let i = 1; + + return route.segments + .map((segment) => { + console.log(segment); + if (!segment.dynamic) { + return segment.content; + } + + const parts = segment.content.split(/\[(.+?)\](?!\])/); + return parts + .map((content, j) => { + if (j % 2) { + return `$${i++}`; + } else { + return content; + } + }) + .join(''); + }) + .join('/'); +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0c7b645652e2..36076cd96456 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -194,6 +194,7 @@ importers: '@vercel/nft': ^0.22.1 esbuild: ^0.16.3 typescript: ^4.9.4 + uvu: ^0.5.6 dependencies: '@vercel/nft': 0.22.1 esbuild: 0.16.3 @@ -201,6 +202,7 @@ importers: '@sveltejs/kit': link:../kit '@types/node': 16.18.6 typescript: 4.9.4 + uvu: 0.5.6 packages/amp: specifiers: {} From 168fcdbcbe717f04528629e93406e6e6249b8081 Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Tue, 21 Mar 2023 15:41:22 +0100 Subject: [PATCH 2/4] remove extraneous slashes --- packages/adapter-vercel/files/serverless.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/adapter-vercel/files/serverless.js b/packages/adapter-vercel/files/serverless.js index e2f506c22859..5a6c2f64e2fd 100644 --- a/packages/adapter-vercel/files/serverless.js +++ b/packages/adapter-vercel/files/serverless.js @@ -22,10 +22,12 @@ export default async (req, res) => { const [path, search] = req.url.split('?'); const params = new URLSearchParams(search); - const pathname = params.get('__pathname'); + let pathname = params.get('__pathname'); if (pathname) { params.delete('__pathname'); + // Optional routes' pathname replacements look like `/foo/$1/bar` which means we could end up with an url like /foo//bar + pathname = pathname.replace(/\/+/g, '/'); req.url = `${pathname}${path.endsWith(DATA_SUFFIX) ? DATA_SUFFIX : ''}?${params}`; } } From fd250ff1fe80e3f51816b46b37a0dc5d707482c1 Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Tue, 21 Mar 2023 15:42:16 +0100 Subject: [PATCH 3/4] typo --- .changeset/heavy-news-argue.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/heavy-news-argue.md b/.changeset/heavy-news-argue.md index 210d8efe9729..31dc77f73d81 100644 --- a/.changeset/heavy-news-argue.md +++ b/.changeset/heavy-news-argue.md @@ -2,4 +2,4 @@ '@sveltejs/adapter-vercel': patch --- -fix: constructor correct pathname for isr from route with nested params +fix: construct correct pathname for isr from route with nested params From d40d3691f71861d6b81844587cf2df6a3e818517 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Mon, 17 Apr 2023 17:34:24 -0400 Subject: [PATCH 4/4] remove logging --- packages/adapter-vercel/utils.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/adapter-vercel/utils.js b/packages/adapter-vercel/utils.js index dfd41ae5c6c3..de10073e8846 100644 --- a/packages/adapter-vercel/utils.js +++ b/packages/adapter-vercel/utils.js @@ -4,7 +4,6 @@ export function get_pathname(route) { return route.segments .map((segment) => { - console.log(segment); if (!segment.dynamic) { return segment.content; }