Skip to content

Commit e201fa9

Browse files
janabimustafadummdidummbenmccann
authored
fix: remove ":$" from virtual module ids to allow dev server to work with proxies (#12157)
Co-authored-by: Simon H <5968653+dummdidumm@users.noreply.github.com> Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com>
1 parent c2ffdcf commit e201fa9

File tree

7 files changed

+92
-39
lines changed

7 files changed

+92
-39
lines changed

.changeset/eleven-colts-relax.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: remove ":$" from virtual module ids to allow dev server to work with proxies

packages/kit/src/exports/vite/build/build_service_worker.js

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import fs from 'node:fs';
22
import * as vite from 'vite';
33
import { dedent } from '../../../core/sync/utils.js';
44
import { s } from '../../../utils/misc.js';
5-
import { get_config_aliases, strip_virtual_prefix, get_env } from '../utils.js';
5+
import { get_config_aliases, strip_virtual_prefix, get_env, normalize_id } from '../utils.js';
66
import { create_static_module } from '../../../core/env.js';
77
import { env_static_public, service_worker } from '../module_ids.js';
88

@@ -68,7 +68,8 @@ export async function build_service_worker(
6868
name: 'service-worker-build-virtual-modules',
6969
resolveId(id) {
7070
if (id.startsWith('$env/') || id.startsWith('$app/') || id === '$service-worker') {
71-
return `\0virtual:${id}`;
71+
// ids with :$ don't work with reverse proxies like nginx
72+
return `\0virtual:${id.substring(1)}`;
7273
}
7374
},
7475

@@ -83,7 +84,10 @@ export async function build_service_worker(
8384
return create_static_module('$env/static/public', env.public);
8485
}
8586

86-
const stripped = strip_virtual_prefix(id);
87+
const normalized_cwd = vite.normalizePath(process.cwd());
88+
const normalized_lib = vite.normalizePath(kit.files.lib);
89+
const relative = normalize_id(id, normalized_lib, normalized_cwd);
90+
const stripped = strip_virtual_prefix(relative);
8791
throw new Error(
8892
`Cannot import ${stripped} into service-worker code. Only the modules $service-worker and $env/static/public are available in service workers.`
8993
);

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

Lines changed: 1 addition & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import path from 'node:path';
22
import { posixify } from '../../../utils/filesystem.js';
3-
import { strip_virtual_prefix } from '../utils.js';
3+
import { normalize_id, strip_virtual_prefix } from '../utils.js';
44
import { app_server, env_dynamic_private, env_static_private } from '../module_ids.js';
55

66
const ILLEGAL_IMPORTS = new Set([env_dynamic_private, env_static_private, app_server]);
@@ -85,25 +85,3 @@ export function module_guard(context, { cwd, lib }) {
8585
}
8686
};
8787
}
88-
89-
/**
90-
* Removes cwd/lib path from the start of the id
91-
* @param {string} id
92-
* @param {string} lib
93-
* @param {string} cwd
94-
*/
95-
export function normalize_id(id, lib, cwd) {
96-
if (id.startsWith(lib)) {
97-
id = id.replace(lib, '$lib');
98-
}
99-
100-
if (id.startsWith(cwd)) {
101-
id = path.relative(cwd, id);
102-
}
103-
104-
if (id === app_server) {
105-
return '$app/server';
106-
}
107-
108-
return posixify(id);
109-
}

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

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { assert, test } from 'vitest';
22
import { module_guard } from './index.js';
3+
import * as module_ids from '../module_ids.js';
34

45
/**
56
*
@@ -44,7 +45,7 @@ test('throws an error when importing $env/static/private', () => {
4445
importedIds: ['~/src/routes/+page.svelte']
4546
},
4647
'~/src/routes/+page.svelte': {
47-
importedIds: ['\0virtual:$env/static/private']
48+
importedIds: ['\0virtual:env/static/private']
4849
}
4950
},
5051
`Cannot import $env/static/private into client-side code:
@@ -60,7 +61,7 @@ test('throws an error when dynamically importing $env/static/private', () => {
6061
importedIds: ['~/src/routes/+page.svelte']
6162
},
6263
'~/src/routes/+page.svelte': {
63-
dynamicallyImportedIds: ['\0virtual:$env/static/private']
64+
dynamicallyImportedIds: ['\0virtual:env/static/private']
6465
}
6566
},
6667
`Cannot import $env/static/private into client-side code:
@@ -76,7 +77,7 @@ test('throws an error when importing $env/dynamic/private', () => {
7677
importedIds: ['~/src/routes/+page.svelte']
7778
},
7879
'~/src/routes/+page.svelte': {
79-
importedIds: ['\0virtual:$env/dynamic/private']
80+
importedIds: ['\0virtual:env/dynamic/private']
8081
}
8182
},
8283
`Cannot import $env/dynamic/private into client-side code:
@@ -92,7 +93,7 @@ test('throws an error when dynamically importing $env/dynamic/private', () => {
9293
importedIds: ['~/src/routes/+page.svelte']
9394
},
9495
'~/src/routes/+page.svelte': {
95-
dynamicallyImportedIds: ['\0virtual:$env/dynamic/private']
96+
dynamicallyImportedIds: ['\0virtual:env/dynamic/private']
9697
}
9798
},
9899
`Cannot import $env/dynamic/private into client-side code:
@@ -101,6 +102,11 @@ test('throws an error when dynamically importing $env/dynamic/private', () => {
101102
);
102103
});
103104

105+
// nginx does not process URLs containing the sequence `:$`
106+
test('":$" is not in virtual module ids', () => {
107+
assert.notInclude(Object.values(module_ids).join(''), ':$');
108+
});
109+
104110
test('throws an error when importing a .server.js module', () => {
105111
check(
106112
{

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

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@ import { build_server_nodes } from './build/build_server.js';
1515
import { build_service_worker } from './build/build_service_worker.js';
1616
import { assets_base, find_deps } from './build/utils.js';
1717
import { dev } from './dev/index.js';
18-
import { is_illegal, module_guard, normalize_id } from './graph_analysis/index.js';
18+
import { is_illegal, module_guard } from './graph_analysis/index.js';
1919
import { preview } from './preview/index.js';
20-
import { get_config_aliases, get_env, strip_virtual_prefix } from './utils.js';
20+
import { get_config_aliases, get_env, normalize_id, strip_virtual_prefix } from './utils.js';
2121
import { write_client_manifest } from '../../core/sync/write_client_manifest.js';
2222
import prerender from '../../core/postbuild/prerender.js';
2323
import analyse from '../../core/postbuild/analyse.js';
@@ -376,16 +376,26 @@ async function kit({ svelte_config }) {
376376
parsed_importer.name === parsed_service_worker.name;
377377

378378
if (importer_is_service_worker && id !== '$service-worker' && id !== '$env/static/public') {
379+
const normalized_cwd = vite.normalizePath(cwd);
380+
const normalized_lib = vite.normalizePath(kit.files.lib);
379381
throw new Error(
380-
`Cannot import ${id} into service-worker code. Only the modules $service-worker and $env/static/public are available in service workers.`
382+
`Cannot import ${normalize_id(
383+
id,
384+
normalized_lib,
385+
normalized_cwd
386+
)} into service-worker code. Only the modules $service-worker and $env/static/public are available in service workers.`
381387
);
382388
}
383389

384390
import_map.set(id, importer);
385391
}
386392

387393
// treat $env/static/[public|private] as virtual
388-
if (id.startsWith('$env/') || id.startsWith('__sveltekit/') || id === '$service-worker') {
394+
if (id.startsWith('$env/') || id === '$service-worker') {
395+
// ids with :$ don't work with reverse proxies like nginx
396+
return `\0virtual:${id.substring(1)}`;
397+
}
398+
if (id.startsWith('__sveltekit/')) {
389399
return `\0virtual:${id}`;
390400
}
391401
},

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import { fileURLToPath } from 'node:url';
22

3-
export const env_static_private = '\0virtual:$env/static/private';
4-
export const env_static_public = '\0virtual:$env/static/public';
5-
export const env_dynamic_private = '\0virtual:$env/dynamic/private';
6-
export const env_dynamic_public = '\0virtual:$env/dynamic/public';
3+
export const env_static_private = '\0virtual:env/static/private';
4+
export const env_static_public = '\0virtual:env/static/public';
5+
export const env_dynamic_private = '\0virtual:env/dynamic/private';
6+
export const env_dynamic_public = '\0virtual:env/dynamic/public';
77

8-
export const service_worker = '\0virtual:$service-worker';
8+
export const service_worker = '\0virtual:service-worker';
99

1010
export const sveltekit_environment = '\0virtual:__sveltekit/environment';
1111
export const sveltekit_paths = '\0virtual:__sveltekit/paths';

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

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,14 @@ import { posixify } from '../../utils/filesystem.js';
44
import { negotiate } from '../../utils/http.js';
55
import { filter_private_env, filter_public_env } from '../../utils/env.js';
66
import { escape_html } from '../../utils/escape.js';
7+
import {
8+
app_server,
9+
env_dynamic_private,
10+
env_dynamic_public,
11+
env_static_private,
12+
env_static_public,
13+
service_worker
14+
} from './module_ids.js';
715

816
/**
917
* Transforms kit.alias to a valid vite.resolve.alias array.
@@ -105,4 +113,46 @@ export function not_found(req, res, base) {
105113
}
106114
}
107115

116+
/**
117+
* Removes cwd/lib path from the start of the id
118+
* @param {string} id
119+
* @param {string} lib
120+
* @param {string} cwd
121+
*/
122+
export function normalize_id(id, lib, cwd) {
123+
if (id.startsWith(lib)) {
124+
id = id.replace(lib, '$lib');
125+
}
126+
127+
if (id.startsWith(cwd)) {
128+
id = path.relative(cwd, id);
129+
}
130+
131+
if (id === app_server) {
132+
return '$app/server';
133+
}
134+
135+
if (id === env_static_private) {
136+
return '$env/static/private';
137+
}
138+
139+
if (id === env_static_public) {
140+
return '$env/static/public';
141+
}
142+
143+
if (id === env_dynamic_private) {
144+
return '$env/dynamic/private';
145+
}
146+
147+
if (id === env_dynamic_public) {
148+
return '$env/dynamic/public';
149+
}
150+
151+
if (id === service_worker) {
152+
return '$service-worker';
153+
}
154+
155+
return posixify(id);
156+
}
157+
108158
export const strip_virtual_prefix = /** @param {string} id */ (id) => id.replace('\0virtual:', '');

0 commit comments

Comments
 (0)