Skip to content

Commit 408e1f5

Browse files
authored
fix: ensure redirect used in packages uses the same Redirect instance (#13843)
* add failing test * format * thank you Dominik G! * better comment * changeset * avoid specifying cjs test dep as a workspace
1 parent 6c44239 commit 408e1f5

File tree

11 files changed

+86
-3
lines changed

11 files changed

+86
-3
lines changed

.changeset/old-eels-shop.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@sveltejs/kit': patch
3+
---
4+
5+
fix: avoid externalising packages that depend on `@sveltejs/kit` so that libraries can also use `redirect` and `error` helpers

packages/kit/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@
2929
"mrmime": "^2.0.0",
3030
"sade": "^1.8.1",
3131
"set-cookie-parser": "^2.6.0",
32-
"sirv": "^3.0.0"
32+
"sirv": "^3.0.0",
33+
"vitefu": "^1.0.6"
3334
},
3435
"devDependencies": {
3536
"@playwright/test": "catalog:",

packages/kit/src/exports/vite/index.js

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import {
3636
} from './module_ids.js';
3737
import { import_peer } from '../../utils/import.js';
3838
import { compact } from '../../utils/array.js';
39+
import { crawlFrameworkPkgs } from 'vitefu';
3940

4041
const cwd = process.cwd();
4142

@@ -227,7 +228,7 @@ async function kit({ svelte_config }) {
227228
* Build the SvelteKit-provided Vite config to be merged with the user's vite.config.js file.
228229
* @see https://vitejs.dev/guide/api-plugin.html#config
229230
*/
230-
config(config, config_env) {
231+
async config(config, config_env) {
231232
initial_config = config;
232233
vite_config_env = config_env;
233234
is_build = config_env.command === 'build';
@@ -250,6 +251,20 @@ async function kit({ svelte_config }) {
250251

251252
const generated = path.posix.join(kit.outDir, 'generated');
252253

254+
const packages_depending_on_svelte_kit = (
255+
await crawlFrameworkPkgs({
256+
root: cwd,
257+
isBuild: is_build,
258+
viteUserConfig: config,
259+
isSemiFrameworkPkgByJson: (pkg_json) => {
260+
return (
261+
!!pkg_json.dependencies?.['@sveltejs/kit'] ||
262+
!!pkg_json.peerDependencies?.['@sveltejs/kit']
263+
);
264+
}
265+
})
266+
).ssr.noExternal;
267+
253268
// dev and preview config can be shared
254269
/** @type {import('vite').UserConfig} */
255270
const new_config = {
@@ -306,7 +321,11 @@ async function kit({ svelte_config }) {
306321
// when it is detected to keep our virtual modules working.
307322
// See https://github.com/sveltejs/kit/pull/9172
308323
// and https://vitest.dev/config/#deps-registernodeloader
309-
'@sveltejs/kit'
324+
'@sveltejs/kit',
325+
// We need to bundle any packages depending on @sveltejs/kit so that
326+
// everyone uses the same instances of classes such as `Redirect`
327+
// which we use in `instanceof` checks
328+
...packages_depending_on_svelte_kit
310329
]
311330
}
312331
};
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export function authenticate(redirectUrl: string): never;
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { redirect } from '@sveltejs/kit';
2+
3+
/**
4+
* @param {string} redirectUrl
5+
* @returns {never}
6+
*/
7+
export function authenticate(redirectUrl) {
8+
redirect(302, redirectUrl);
9+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{
2+
"name": "redirect-pkg",
3+
"private": true,
4+
"version": "1.0.0",
5+
"main": "index.js",
6+
"types": "index.d.ts",
7+
"files": [
8+
"index.js",
9+
"index.d.ts"
10+
],
11+
"type": "module",
12+
"peerDependencies": {
13+
"@sveltejs/kit": "workspace:*"
14+
}
15+
}

packages/kit/test/apps/basics/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
"cross-env": "^7.0.3",
2323
"svelte": "^5.23.1",
2424
"svelte-check": "^4.1.1",
25+
"redirect-pkg": "file:./_test_dependencies/redirect-pkg",
2526
"typescript": "^5.5.4",
2627
"vite": "^6.2.7"
2728
},
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { authenticate } from 'redirect-pkg';
2+
3+
export function load() {
4+
authenticate('/redirect/c');
5+
}

packages/kit/test/apps/basics/test/cross-platform/test.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -616,6 +616,11 @@ test.describe('Redirects', () => {
616616
span = page.locator('#cookie-value');
617617
expect(await span.innerText()).toContain('undefined');
618618
});
619+
620+
test('works when used from another package', async ({ page }) => {
621+
await page.goto('/redirect/package');
622+
expect(await page.textContent('h1')).toBe('c');
623+
});
619624
});
620625

621626
test.describe('Routing', () => {

pnpm-lock.yaml

Lines changed: 21 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)