Skip to content

Commit

Permalink
fix: construct correct pathname for isr from route with nested params (
Browse files Browse the repository at this point in the history
…#9470)

* fix: constructor correct pathname for isr from route with nested params

fixes #9459

* remove extraneous slashes

* typo

* remove logging

---------

Co-authored-by: Rich Harris <git@rich-harris.dev>
  • Loading branch information
dummdidumm and Rich Harris authored Apr 17, 2023
1 parent a243aa6 commit f427d47
Show file tree
Hide file tree
Showing 7 changed files with 79 additions and 10 deletions.
5 changes: 5 additions & 0 deletions .changeset/heavy-news-argue.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@sveltejs/adapter-vercel': patch
---

fix: construct correct pathname for isr from route with nested params
4 changes: 3 additions & 1 deletion packages/adapter-vercel/files/serverless.js
Original file line number Diff line number Diff line change
Expand Up @@ -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}`;
}
}
Expand Down
9 changes: 2 additions & 7 deletions packages/adapter-vercel/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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'];

Expand Down Expand Up @@ -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);
Expand Down
7 changes: 5 additions & 2 deletions packages/adapter-vercel/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,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",
Expand All @@ -35,7 +37,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"
Expand Down
38 changes: 38 additions & 0 deletions packages/adapter-vercel/test/utils.spec.js
Original file line number Diff line number Diff line change
@@ -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<any>['segments']} segments
* @param {string} expected
*/
function run_get_pathname_test(segments, expected) {
const route = /** @type {import('@sveltejs/kit').RouteDefinition<any>} */ ({ 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();
23 changes: 23 additions & 0 deletions packages/adapter-vercel/utils.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
/** @param {import("@sveltejs/kit").RouteDefinition<any>} route */
export function get_pathname(route) {
let i = 1;

return route.segments
.map((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('/');
}
3 changes: 3 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit f427d47

Please sign in to comment.