@sveltejs/kit 3.0.0-next.25 → 3.0.0-next.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +5 -7
- package/src/core/adapt/builder.js +127 -31
- package/src/core/adapt/index.js +3 -0
- package/src/core/config/index.js +4 -7
- package/src/core/env.js +36 -8
- package/src/core/generate_manifest/index.js +42 -43
- package/src/core/postbuild/analyse.js +4 -4
- package/src/core/postbuild/fallback.js +1 -1
- package/src/core/postbuild/prerender.js +2 -2
- package/src/core/sync/create_manifest_data/index.js +0 -1
- package/src/core/sync/write_app_manifest.js +3 -2
- package/src/exports/public.d.ts +100 -48
- package/src/exports/vite/build/index.js +1173 -0
- package/src/exports/vite/build/remote.js +4 -4
- package/src/exports/vite/dev/generate_manifest.js +308 -0
- package/src/exports/vite/dev/index.js +28 -284
- package/src/exports/vite/index.js +117 -1308
- package/src/exports/vite/plugins/env-vars.js +11 -34
- package/src/exports/vite/plugins/guard.js +19 -7
- package/src/exports/vite/plugins/remote.js +237 -0
- package/src/exports/vite/preview/index.js +8 -8
- package/src/exports/vite/static_analysis/index.js +15 -15
- package/src/exports/vite/utils.js +1 -1
- package/src/runner.js +4 -3
- package/src/runtime/app/paths/server.js +2 -2
- package/src/runtime/app/server/index.js +3 -3
- package/src/runtime/app/server/public.d.ts +114 -57
- package/src/runtime/app/server/remote/requested.js +31 -15
- package/src/runtime/app/state/client.svelte.js +3 -1
- package/src/runtime/client/client.js +39 -194
- package/src/runtime/client/fetcher.js +6 -6
- package/src/runtime/client/focus.js +120 -0
- package/src/runtime/client/remote-functions/command.svelte.js +20 -9
- package/src/runtime/client/remote-functions/form.svelte.js +12 -7
- package/src/runtime/client/remote-functions/query/instance.svelte.js +19 -5
- package/src/runtime/client/remote-functions/shared.svelte.js +22 -1
- package/src/runtime/client/scroll.js +39 -0
- package/src/runtime/client/utils.js +28 -0
- package/src/runtime/form-utils.js +243 -245
- package/src/runtime/server/data/index.js +3 -10
- package/src/runtime/server/fetch.js +13 -15
- package/src/runtime/server/index.js +8 -7
- package/src/runtime/server/internal.js +1 -2
- package/src/runtime/server/page/index.js +10 -15
- package/src/runtime/server/page/load_data.js +2 -2
- package/src/runtime/server/page/render.js +8 -13
- package/src/runtime/server/page/respond_with_error.js +4 -5
- package/src/runtime/server/page/server_routing.js +21 -27
- package/src/runtime/server/remote-functions.js +14 -14
- package/src/runtime/server/respond.js +17 -40
- package/src/runtime/server/state.js +1 -0
- package/src/runtime/server/utils.js +4 -4
- package/src/runtime/shared.js +9 -0
- package/src/types/ambient-private.d.ts +1 -2
- package/src/types/internal.d.ts +49 -6
- package/src/utils/filesystem.js +43 -27
- package/src/version.js +1 -1
- package/types/index.d.ts +215 -92
- package/types/index.d.ts.map +6 -2
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sveltejs/kit",
|
|
3
|
-
"version": "3.0.0-next.
|
|
3
|
+
"version": "3.0.0-next.27",
|
|
4
4
|
"description": "SvelteKit is the fastest way to build Svelte apps",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"framework",
|
|
@@ -20,8 +20,6 @@
|
|
|
20
20
|
"dependencies": {
|
|
21
21
|
"@rolldown/pluginutils": "^1.0.1",
|
|
22
22
|
"@standard-schema/spec": "^1.1.0",
|
|
23
|
-
"@sveltejs/acorn-typescript": "^1.0.12",
|
|
24
|
-
"acorn": "^8.18.0",
|
|
25
23
|
"cookie": "^2.0.1",
|
|
26
24
|
"devalue": "^5.9.0",
|
|
27
25
|
"esm-env": "^1.2.2",
|
|
@@ -31,14 +29,14 @@
|
|
|
31
29
|
},
|
|
32
30
|
"devDependencies": {
|
|
33
31
|
"@opentelemetry/api": "^1.9.1",
|
|
34
|
-
"@playwright/test": "^1.62.
|
|
32
|
+
"@playwright/test": "^1.62.1",
|
|
35
33
|
"@sveltejs/vite-plugin-svelte": "^7.3.0",
|
|
36
34
|
"@types/connect": "^3.4.38",
|
|
37
35
|
"@typescript/native": "npm:typescript@^7.0.2",
|
|
38
36
|
"@types/node": "^22.19.19",
|
|
39
37
|
"dts-buddy": "^0.8.3",
|
|
40
38
|
"jsdom": "^30.0.0",
|
|
41
|
-
"svelte": "^5.
|
|
39
|
+
"svelte": "^5.57.0",
|
|
42
40
|
"svelte-preprocess": "^6.0.5",
|
|
43
41
|
"typescript": "~6.0.3",
|
|
44
42
|
"valibot": "^1.4.2",
|
|
@@ -66,8 +64,8 @@
|
|
|
66
64
|
"files": [
|
|
67
65
|
"src",
|
|
68
66
|
"!src/**/*.spec.js",
|
|
69
|
-
"!src
|
|
70
|
-
"!src
|
|
67
|
+
"!src/**/fixtures",
|
|
68
|
+
"!src/**/test",
|
|
71
69
|
"types",
|
|
72
70
|
"svelte-kit.js"
|
|
73
71
|
],
|
|
@@ -13,19 +13,21 @@ import {
|
|
|
13
13
|
rmSync,
|
|
14
14
|
statSync
|
|
15
15
|
} from 'node:fs';
|
|
16
|
-
import
|
|
16
|
+
import path from 'node:path';
|
|
17
17
|
import { pipeline } from 'node:stream';
|
|
18
18
|
import { promisify } from 'node:util';
|
|
19
19
|
import zlib from 'node:zlib';
|
|
20
|
-
import { copy, walk } from '../../utils/filesystem.js';
|
|
20
|
+
import { copy, relative_path, walk } from '../../utils/filesystem.js';
|
|
21
21
|
import { posixify } from '../../utils/os.js';
|
|
22
22
|
import { generate_manifest } from '../generate_manifest/index.js';
|
|
23
23
|
import { get_route_segments } from '../../utils/routing.js';
|
|
24
24
|
import generate_fallback from '../postbuild/fallback.js';
|
|
25
|
-
import { write } from '../sync/utils.js';
|
|
25
|
+
import { dedent, write } from '../sync/utils.js';
|
|
26
26
|
import { find_server_assets } from '../generate_manifest/find_server_assets.js';
|
|
27
27
|
import { create_exported_declarations } from '../env.js';
|
|
28
28
|
import { handle_issues, validate } from '../../exports/internal/env.js';
|
|
29
|
+
import { get_mime_lookup } from '../utils.js';
|
|
30
|
+
import { lookup as mime_lookup } from '../../utils/mime.js';
|
|
29
31
|
|
|
30
32
|
const pipe = promisify(pipeline);
|
|
31
33
|
const extensions = [
|
|
@@ -51,6 +53,7 @@ const extensions = [
|
|
|
51
53
|
* route_data: RouteData[];
|
|
52
54
|
* prerendered: Prerendered;
|
|
53
55
|
* prerender_map: PrerenderMap;
|
|
56
|
+
* app_manifest: typeof import('$app/manifest');
|
|
54
57
|
* log: Logger;
|
|
55
58
|
* vite_config: ResolvedConfig;
|
|
56
59
|
* remotes: RemoteChunk[];
|
|
@@ -65,6 +68,7 @@ export function create_builder({
|
|
|
65
68
|
route_data,
|
|
66
69
|
prerendered,
|
|
67
70
|
prerender_map,
|
|
71
|
+
app_manifest,
|
|
68
72
|
log,
|
|
69
73
|
vite_config,
|
|
70
74
|
remotes,
|
|
@@ -103,6 +107,12 @@ export function create_builder({
|
|
|
103
107
|
return facade;
|
|
104
108
|
});
|
|
105
109
|
|
|
110
|
+
// $app/manifest cannot include the service worker because it's used by the service worker itself,
|
|
111
|
+
// but the adapter needs to know about it so we add it here.
|
|
112
|
+
if (build_data.service_worker) {
|
|
113
|
+
app_manifest.assets.push({ path: build_data.service_worker });
|
|
114
|
+
}
|
|
115
|
+
|
|
106
116
|
return {
|
|
107
117
|
log,
|
|
108
118
|
rimraf: (dir) => rmSync(dir, { force: true, recursive: true }),
|
|
@@ -112,17 +122,38 @@ export function create_builder({
|
|
|
112
122
|
config,
|
|
113
123
|
prerendered,
|
|
114
124
|
routes,
|
|
125
|
+
manifest: app_manifest,
|
|
126
|
+
get mimeTypes() {
|
|
127
|
+
// TODO - make the `generate_manifest` function return data instead of a string, and retrieve mime types from there
|
|
128
|
+
const mime_types = get_mime_lookup(build_data.manifest_data);
|
|
129
|
+
const server_assets = find_server_assets(
|
|
130
|
+
build_data,
|
|
131
|
+
route_data.filter((route) => prerender_map.get(route.id) !== true),
|
|
132
|
+
vite_config.root
|
|
133
|
+
);
|
|
134
|
+
for (const file of server_assets) {
|
|
135
|
+
const ext = path.extname(file);
|
|
136
|
+
mime_types[ext] ??= mime_lookup(ext) || '';
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// record extensions that only exist in prerendered output, e.g. a prerendered favicon.ico
|
|
140
|
+
for (const pathname of prerendered.paths) {
|
|
141
|
+
const ext = path.extname(pathname);
|
|
142
|
+
if (ext) mime_types[ext] ??= mime_lookup(ext) || '';
|
|
143
|
+
}
|
|
144
|
+
return mime_types;
|
|
145
|
+
},
|
|
115
146
|
|
|
116
147
|
async compress(directory) {
|
|
117
148
|
if (!existsSync(directory)) {
|
|
118
149
|
return [];
|
|
119
150
|
}
|
|
120
151
|
|
|
121
|
-
const files = [...walk(directory)].filter((file) => extensions.includes(extname(file)));
|
|
152
|
+
const files = [...walk(directory)].filter((file) => extensions.includes(path.extname(file)));
|
|
122
153
|
|
|
123
154
|
await Promise.all(
|
|
124
155
|
files.flatMap((file) => {
|
|
125
|
-
const abs = resolve(directory, file);
|
|
156
|
+
const abs = path.resolve(directory, file);
|
|
126
157
|
return [compress_file(abs, 'gz'), compress_file(abs, 'br')];
|
|
127
158
|
})
|
|
128
159
|
);
|
|
@@ -184,17 +215,34 @@ export function create_builder({
|
|
|
184
215
|
write(`${dest}/env.js`, `export const env=${payload}`);
|
|
185
216
|
},
|
|
186
217
|
|
|
187
|
-
generateManifest(
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
218
|
+
generateManifest() {
|
|
219
|
+
throw new Error(
|
|
220
|
+
'The `generateManifest` adapter API has been removed — use `generateServerInstance` or `builder.manifest` instead. You may need to update your adapter'
|
|
221
|
+
);
|
|
222
|
+
},
|
|
223
|
+
|
|
224
|
+
generateServerInstance(dest, { routes: subset, serverDirectory } = {}) {
|
|
225
|
+
const relative = relative_path(
|
|
226
|
+
path.dirname(dest),
|
|
227
|
+
serverDirectory ?? this.getServerDirectory()
|
|
228
|
+
);
|
|
229
|
+
write(
|
|
230
|
+
dest,
|
|
231
|
+
dedent`
|
|
232
|
+
import { Server } from '${relative}/index.js';
|
|
233
|
+
const manifest = ${generate_manifest({
|
|
234
|
+
build_data,
|
|
235
|
+
prerendered: prerendered.paths,
|
|
236
|
+
relative_path: relative,
|
|
237
|
+
routes: subset
|
|
238
|
+
? subset.map((route) => /** @type {import('types').RouteData} */ (lookup.get(route)))
|
|
239
|
+
: route_data.filter((route) => prerender_map.get(route.id) !== true),
|
|
240
|
+
remotes,
|
|
241
|
+
root: vite_config.root
|
|
242
|
+
})};
|
|
243
|
+
export const server = new Server(manifest);
|
|
244
|
+
`
|
|
245
|
+
);
|
|
198
246
|
},
|
|
199
247
|
|
|
200
248
|
getBuildDirectory(name) {
|
|
@@ -234,6 +282,30 @@ export function create_builder({
|
|
|
234
282
|
return copy(`${config.outDir}/output/server`, dest);
|
|
235
283
|
},
|
|
236
284
|
|
|
285
|
+
createInstrumentationInitializer({
|
|
286
|
+
outputDirectory,
|
|
287
|
+
environment,
|
|
288
|
+
serverDirectory = `${config.outDir}/output/server`
|
|
289
|
+
}) {
|
|
290
|
+
const provider = path.join(outputDirectory, '__sveltekit_env.js');
|
|
291
|
+
write(provider, environment ?? 'export default process.env;');
|
|
292
|
+
|
|
293
|
+
const initializer = path.join(outputDirectory, '__sveltekit_env_init.js');
|
|
294
|
+
write(
|
|
295
|
+
initializer,
|
|
296
|
+
create_env_module({
|
|
297
|
+
environment: to_import_specifier(
|
|
298
|
+
posixify(path.relative(path.dirname(initializer), provider))
|
|
299
|
+
),
|
|
300
|
+
set_env: to_import_specifier(
|
|
301
|
+
posixify(path.relative(path.dirname(initializer), `${serverDirectory}/env.js`))
|
|
302
|
+
)
|
|
303
|
+
})
|
|
304
|
+
);
|
|
305
|
+
|
|
306
|
+
return initializer;
|
|
307
|
+
},
|
|
308
|
+
|
|
237
309
|
hasServerInstrumentationFile() {
|
|
238
310
|
return existsSync(`${config.outDir}/output/server/instrumentation.server.js`);
|
|
239
311
|
},
|
|
@@ -241,7 +313,8 @@ export function create_builder({
|
|
|
241
313
|
instrument({
|
|
242
314
|
entrypoint,
|
|
243
315
|
instrumentation,
|
|
244
|
-
start = join(dirname(entrypoint), 'start.js'),
|
|
316
|
+
start = path.join(path.dirname(entrypoint), 'start.js'),
|
|
317
|
+
initializer,
|
|
245
318
|
module = {
|
|
246
319
|
exports: ['default']
|
|
247
320
|
}
|
|
@@ -256,25 +329,35 @@ export function create_builder({
|
|
|
256
329
|
`Entrypoint file ${entrypoint} not found. This is probably a bug in your adapter.`
|
|
257
330
|
);
|
|
258
331
|
}
|
|
332
|
+
if (!existsSync(initializer)) {
|
|
333
|
+
throw new Error(
|
|
334
|
+
`Instrumentation initializer ${initializer} not found. This is probably a bug in your adapter.`
|
|
335
|
+
);
|
|
336
|
+
}
|
|
259
337
|
|
|
260
338
|
copy(entrypoint, start);
|
|
261
339
|
if (existsSync(`${entrypoint}.map`)) {
|
|
262
340
|
copy(`${entrypoint}.map`, `${start}.map`);
|
|
263
341
|
}
|
|
264
342
|
|
|
265
|
-
const relative_instrumentation = posixify(
|
|
266
|
-
|
|
343
|
+
const relative_instrumentation = posixify(
|
|
344
|
+
path.relative(path.dirname(entrypoint), instrumentation)
|
|
345
|
+
);
|
|
346
|
+
const relative_start = posixify(path.relative(path.dirname(entrypoint), start));
|
|
347
|
+
const relative_initializer = posixify(path.relative(path.dirname(entrypoint), initializer));
|
|
267
348
|
|
|
268
349
|
const facade =
|
|
269
350
|
'generateText' in module
|
|
270
351
|
? module.generateText({
|
|
271
352
|
instrumentation: relative_instrumentation,
|
|
272
|
-
start: relative_start
|
|
353
|
+
start: relative_start,
|
|
354
|
+
initializer: relative_initializer
|
|
273
355
|
})
|
|
274
356
|
: create_instrumentation_facade({
|
|
275
357
|
instrumentation: relative_instrumentation,
|
|
276
358
|
start: relative_start,
|
|
277
|
-
exports: module.exports
|
|
359
|
+
exports: module.exports,
|
|
360
|
+
initializer: relative_initializer
|
|
278
361
|
});
|
|
279
362
|
|
|
280
363
|
rmSync(entrypoint, { force: true, recursive: true });
|
|
@@ -307,16 +390,15 @@ async function compress_file(file, format = 'gz') {
|
|
|
307
390
|
|
|
308
391
|
/**
|
|
309
392
|
* Given a list of exports, generate a facade that:
|
|
393
|
+
* - Imports the environment initializer
|
|
310
394
|
* - Imports the instrumentation file
|
|
311
|
-
* - Imports `exports` from the entrypoint (dynamically
|
|
395
|
+
* - Imports `exports` from the entrypoint (dynamically)
|
|
312
396
|
* - Re-exports `exports` from the entrypoint
|
|
313
397
|
*
|
|
314
|
-
* @param {{ instrumentation: string; start: string; exports: string[] }} opts
|
|
398
|
+
* @param {{ instrumentation: string; start: string; exports: string[]; initializer: string }} opts
|
|
315
399
|
* @returns {string}
|
|
316
400
|
*/
|
|
317
|
-
function create_instrumentation_facade({ instrumentation, start, exports }) {
|
|
318
|
-
const import_instrumentation = `import './${instrumentation}';`;
|
|
319
|
-
|
|
401
|
+
function create_instrumentation_facade({ instrumentation, start, exports, initializer }) {
|
|
320
402
|
const { namespace, declarations, reexports } = create_exported_declarations(
|
|
321
403
|
exports,
|
|
322
404
|
(name, ns) => `${ns}.${name}`,
|
|
@@ -324,12 +406,26 @@ function create_instrumentation_facade({ instrumentation, start, exports }) {
|
|
|
324
406
|
);
|
|
325
407
|
|
|
326
408
|
const parts = [
|
|
327
|
-
`
|
|
409
|
+
`import ${JSON.stringify(to_import_specifier(initializer))};`,
|
|
410
|
+
`import ${JSON.stringify(to_import_specifier(instrumentation))};`,
|
|
411
|
+
`const ${namespace} = await import(${JSON.stringify(to_import_specifier(start))});`,
|
|
328
412
|
declarations.join('\n'),
|
|
329
413
|
reexports.length > 0 ? `export { ${reexports.join(', ')} };` : ''
|
|
330
|
-
]
|
|
331
|
-
.filter(Boolean)
|
|
332
|
-
.join('\n');
|
|
414
|
+
];
|
|
333
415
|
|
|
334
|
-
return
|
|
416
|
+
return parts.filter(Boolean).join('\n');
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
/**
|
|
420
|
+
* @param {string} path
|
|
421
|
+
*/
|
|
422
|
+
function to_import_specifier(path) {
|
|
423
|
+
return path.startsWith('.') ? path : `./${path}`;
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
/**
|
|
427
|
+
* @param {{ environment: string; set_env: string }} opts
|
|
428
|
+
*/
|
|
429
|
+
function create_env_module({ environment, set_env }) {
|
|
430
|
+
return `import env from ${JSON.stringify(environment)};\nimport { set_env } from ${JSON.stringify(set_env)};\nset_env(env);\n`;
|
|
335
431
|
}
|
package/src/core/adapt/index.js
CHANGED
|
@@ -7,6 +7,7 @@ import { create_builder } from './builder.js';
|
|
|
7
7
|
* @param {import('types').ServerMetadata} server_metadata
|
|
8
8
|
* @param {import('types').Prerendered} prerendered
|
|
9
9
|
* @param {import('types').PrerenderMap} prerender_map
|
|
10
|
+
* @param {typeof import('$app/manifest')} app_manifest
|
|
10
11
|
* @param {import('types').Logger} log
|
|
11
12
|
* @param {import('types').RemoteChunk[]} remotes
|
|
12
13
|
* @param {import('vite').ResolvedConfig} vite_config
|
|
@@ -18,6 +19,7 @@ export async function adapt(
|
|
|
18
19
|
server_metadata,
|
|
19
20
|
prerendered,
|
|
20
21
|
prerender_map,
|
|
22
|
+
app_manifest,
|
|
21
23
|
log,
|
|
22
24
|
remotes,
|
|
23
25
|
vite_config,
|
|
@@ -48,6 +50,7 @@ export async function adapt(
|
|
|
48
50
|
route_data: build_data.manifest_data.routes.filter((route) => route.page || route.endpoint),
|
|
49
51
|
prerendered,
|
|
50
52
|
prerender_map,
|
|
53
|
+
app_manifest,
|
|
51
54
|
log,
|
|
52
55
|
remotes,
|
|
53
56
|
vite_config,
|
package/src/core/config/index.js
CHANGED
|
@@ -200,13 +200,10 @@ export function validate_config(config) {
|
|
|
200
200
|
}
|
|
201
201
|
}
|
|
202
202
|
|
|
203
|
-
if (
|
|
204
|
-
validated.
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
throw new Error(
|
|
208
|
-
"The `csp.directives['trusted-types']` option must include 'svelte-trusted-html'"
|
|
209
|
-
);
|
|
203
|
+
if (typeof config.adapter?.vite === 'function') {
|
|
204
|
+
validated.adapter.vite = config.adapter.vite({
|
|
205
|
+
config: validated
|
|
206
|
+
});
|
|
210
207
|
}
|
|
211
208
|
|
|
212
209
|
return validated;
|
package/src/core/env.js
CHANGED
|
@@ -5,6 +5,7 @@ import path from 'node:path';
|
|
|
5
5
|
import * as devalue from 'devalue';
|
|
6
6
|
import { dedent } from './sync/utils.js';
|
|
7
7
|
import { get_global_name, runtime_directory } from './utils.js';
|
|
8
|
+
import { stackless } from '../utils/error.js';
|
|
8
9
|
import { resolve_entry } from '../utils/filesystem.js';
|
|
9
10
|
import { handle_issues, validate } from '../exports/internal/env.js';
|
|
10
11
|
import { get_config_aliases } from '../exports/vite/utils.js';
|
|
@@ -22,7 +23,9 @@ import { posixify } from '../utils/os.js';
|
|
|
22
23
|
* @returns {string | null}
|
|
23
24
|
*/
|
|
24
25
|
export function resolve_env_entry(config, root) {
|
|
25
|
-
|
|
26
|
+
const entry = resolve_entry(path.resolve(root, config.files.src, 'env'));
|
|
27
|
+
// posix, like the paths Vite hands to `hotUpdate`
|
|
28
|
+
return entry && posixify(entry);
|
|
26
29
|
}
|
|
27
30
|
|
|
28
31
|
/**
|
|
@@ -35,6 +38,8 @@ export function resolve_env_entry(config, root) {
|
|
|
35
38
|
export async function load_explicit_env(kit, file, root, mode) {
|
|
36
39
|
/** @type {Set<string>} */
|
|
37
40
|
const deps = new Set();
|
|
41
|
+
/** @type {Map<EnvType, string>} */
|
|
42
|
+
const env_importers = new Map();
|
|
38
43
|
|
|
39
44
|
if (!file) {
|
|
40
45
|
return { variables: null, deps };
|
|
@@ -62,6 +67,16 @@ export async function load_explicit_env(kit, file, root, mode) {
|
|
|
62
67
|
plugins: [
|
|
63
68
|
{
|
|
64
69
|
name: 'dependency-scanner',
|
|
70
|
+
enforce: 'pre',
|
|
71
|
+
resolveId(id, importer) {
|
|
72
|
+
const prefixes = ['$app/env/', `${runtime_directory}/app/env/`];
|
|
73
|
+
const prefix = prefixes.find((prefix) => id.startsWith(prefix));
|
|
74
|
+
const type = prefix && id.slice(prefix.length);
|
|
75
|
+
|
|
76
|
+
if (importer && (type === 'private' || type === 'public')) {
|
|
77
|
+
env_importers.set(type, importer);
|
|
78
|
+
}
|
|
79
|
+
},
|
|
65
80
|
load(id) {
|
|
66
81
|
deps.add(id);
|
|
67
82
|
}
|
|
@@ -94,14 +109,27 @@ export async function load_explicit_env(kit, file, root, mode) {
|
|
|
94
109
|
} catch (e) {
|
|
95
110
|
const error = /** @type {any} */ (e || {});
|
|
96
111
|
|
|
97
|
-
if (
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
) {
|
|
101
|
-
throw new Error(
|
|
102
|
-
`Cannot import \`$app/*\` modules other than \`$app/env\` inside \`src/env\``,
|
|
103
|
-
{ cause: e }
|
|
112
|
+
if (error.code === 'ERR_MODULE_NOT_FOUND') {
|
|
113
|
+
const match = error.message?.match(
|
|
114
|
+
/<sveltekit:generated>\/env\/(private|public)\/server\.js/
|
|
104
115
|
);
|
|
116
|
+
|
|
117
|
+
if (match) {
|
|
118
|
+
const type = /** @type {EnvType} */ (match[1]);
|
|
119
|
+
const importer = env_importers.get(type);
|
|
120
|
+
const message = importer
|
|
121
|
+
? `Module \`${posixify(path.relative(root, importer))}\` imports \`$app/env/${type}\`, which creates a circular dependency with \`src/env\``
|
|
122
|
+
: `Cannot import \`$app/env/${type}\` inside \`src/env\` or its dependencies because it creates a circular dependency`;
|
|
123
|
+
|
|
124
|
+
throw stackless(message);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
if (error.message?.includes(`Cannot find module '$app`)) {
|
|
128
|
+
throw new Error(
|
|
129
|
+
`Cannot import \`$app/*\` modules other than \`$app/env\` inside \`src/env\``,
|
|
130
|
+
{ cause: e }
|
|
131
|
+
);
|
|
132
|
+
}
|
|
105
133
|
}
|
|
106
134
|
|
|
107
135
|
throw error;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @import { RemoteChunk } from 'types' */
|
|
1
|
+
/** @import { BuildData, RemoteChunk, RouteData } from 'types' */
|
|
2
2
|
import fs from 'node:fs';
|
|
3
3
|
import path from 'node:path';
|
|
4
4
|
import { lookup as mime_lookup } from '../../utils/mime.js';
|
|
@@ -15,10 +15,10 @@ import { uneval } from 'devalue';
|
|
|
15
15
|
* Generates the data used to write the server-side manifest.js file. This data is used in the Vite
|
|
16
16
|
* build process, to power routing, etc.
|
|
17
17
|
* @param {{
|
|
18
|
-
* build_data:
|
|
18
|
+
* build_data: BuildData;
|
|
19
19
|
* prerendered: string[];
|
|
20
20
|
* relative_path: string;
|
|
21
|
-
* routes:
|
|
21
|
+
* routes: RouteData[];
|
|
22
22
|
* remotes: RemoteChunk[];
|
|
23
23
|
* root: string;
|
|
24
24
|
* }} opts
|
|
@@ -102,49 +102,48 @@ export function generate_manifest({
|
|
|
102
102
|
|
|
103
103
|
// prettier-ignore
|
|
104
104
|
// String representation of
|
|
105
|
-
/** @template {import('
|
|
105
|
+
/** @template {import('types').SSRManifest} T */
|
|
106
106
|
const manifest_expr = dedent`
|
|
107
107
|
{
|
|
108
|
-
|
|
109
|
-
|
|
108
|
+
app_dir: ${s(build_data.app_dir)},
|
|
109
|
+
app_path: ${s(build_data.app_path)},
|
|
110
110
|
assets: new Set(${s(assets)}),
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
}
|
|
111
|
+
mime_types: ${s(mime_types)},
|
|
112
|
+
client: ${uneval(build_data.client)},
|
|
113
|
+
|
|
114
|
+
nodes: [
|
|
115
|
+
${(node_paths).map(loader).join(',\n')}
|
|
116
|
+
],
|
|
117
|
+
remotes: {
|
|
118
|
+
${remotes.map((remote) => `'${remote.hash}': ${loader(join_relative(relative_path, `chunks/remote-${remote.hash}.js`))}`).join(',\n')}
|
|
119
|
+
},
|
|
120
|
+
routes: [
|
|
121
|
+
${routes.map(route => {
|
|
122
|
+
if (!route.page && !route.endpoint) return;
|
|
123
|
+
|
|
124
|
+
return dedent`
|
|
125
|
+
{
|
|
126
|
+
id: ${s(route.id)},
|
|
127
|
+
pattern: ${route.pattern},
|
|
128
|
+
params: ${s(route.params)},
|
|
129
|
+
page: ${route.page ? `{ layouts: ${get_nodes(route.page.layouts)}, errors: ${get_nodes(route.page.errors)}, leaf: ${reindexed.get(route.page.leaf)} }` : 'null'},
|
|
130
|
+
endpoint: ${route.endpoint ? loader(join_relative(relative_path, resolve_symlinks(build_data.server_manifest, route.endpoint.file, root).chunk.file)) : 'null'}
|
|
131
|
+
}
|
|
132
|
+
`;
|
|
133
|
+
}).filter(Boolean).join(',\n')}
|
|
134
|
+
],
|
|
135
|
+
prerendered_routes: new Set(${s(prerendered)}),
|
|
136
|
+
matchers: async () => {
|
|
137
|
+
${
|
|
138
|
+
uses_matchers && build_data.manifest_data.params
|
|
139
|
+
? dedent`
|
|
140
|
+
const { params } = await import('${join_relative(relative_path, '/entries/params.js')}');
|
|
141
|
+
return params;
|
|
142
|
+
`
|
|
143
|
+
: 'return {};'
|
|
144
|
+
}
|
|
145
|
+
},
|
|
146
|
+
server_assets: ${s(files)}
|
|
148
147
|
}
|
|
149
148
|
`;
|
|
150
149
|
|
|
@@ -34,7 +34,7 @@ async function analyse({
|
|
|
34
34
|
remotes,
|
|
35
35
|
vite_config_file
|
|
36
36
|
}) {
|
|
37
|
-
/** @type {import('
|
|
37
|
+
/** @type {import('types').SSRManifest} */
|
|
38
38
|
const manifest = (await import(pathToFileURL(manifest_path).href)).manifest;
|
|
39
39
|
|
|
40
40
|
const vite_config = await load_vite_config(vite_config_file);
|
|
@@ -65,7 +65,7 @@ async function analyse({
|
|
|
65
65
|
remotes: new Map()
|
|
66
66
|
};
|
|
67
67
|
|
|
68
|
-
const nodes = await Promise.all(manifest.
|
|
68
|
+
const nodes = await Promise.all(manifest.nodes.map((loader) => loader()));
|
|
69
69
|
|
|
70
70
|
// analyse nodes
|
|
71
71
|
for (const node of nodes) {
|
|
@@ -88,7 +88,7 @@ async function analyse({
|
|
|
88
88
|
}
|
|
89
89
|
|
|
90
90
|
// analyse routes
|
|
91
|
-
for (const route of manifest.
|
|
91
|
+
for (const route of manifest.routes) {
|
|
92
92
|
const page =
|
|
93
93
|
route.page &&
|
|
94
94
|
analyse_page(
|
|
@@ -147,7 +147,7 @@ async function analyse({
|
|
|
147
147
|
|
|
148
148
|
// analyse remotes
|
|
149
149
|
for (const remote of remotes) {
|
|
150
|
-
const loader = manifest.
|
|
150
|
+
const loader = manifest.remotes[remote.hash];
|
|
151
151
|
const { default: functions } = await loader();
|
|
152
152
|
|
|
153
153
|
const exports = new Map();
|
|
@@ -24,7 +24,7 @@ async function generate_fallback({ manifest_path, env, out_dir, origin, assets }
|
|
|
24
24
|
/** @type {import('types').ServerModule} */
|
|
25
25
|
const { Server } = await import(pathToFileURL(`${server_root}/server/index.js`).href);
|
|
26
26
|
|
|
27
|
-
/** @type {import('
|
|
27
|
+
/** @type {import('types').SSRManifest} */
|
|
28
28
|
const manifest = (await import(pathToFileURL(manifest_path).href)).manifest;
|
|
29
29
|
|
|
30
30
|
set_building();
|
|
@@ -48,7 +48,7 @@ async function prerender({
|
|
|
48
48
|
vite_config_file,
|
|
49
49
|
is_tty
|
|
50
50
|
}) {
|
|
51
|
-
/** @type {import('
|
|
51
|
+
/** @type {import('types').SSRManifest} */
|
|
52
52
|
const manifest = (await import(pathToFileURL(manifest_path).href)).manifest;
|
|
53
53
|
|
|
54
54
|
/** @type {import('types').ServerInternalModule} */
|
|
@@ -659,7 +659,7 @@ async function prerender({
|
|
|
659
659
|
/** @type {Array<import('types').RemotePrerenderInternals>} */
|
|
660
660
|
const prerender_functions = [];
|
|
661
661
|
|
|
662
|
-
for (const loader of Object.values(manifest.
|
|
662
|
+
for (const loader of Object.values(manifest.remotes)) {
|
|
663
663
|
const module = await loader();
|
|
664
664
|
|
|
665
665
|
for (const fn of Object.values(module.default)) {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
/** @import { Asset, ManifestData, RouteData } from 'types' */
|
|
2
|
+
/** @import { ManifestRoute } from '$app/manifest' */
|
|
2
3
|
|
|
3
4
|
import { s } from '../../utils/misc.js';
|
|
4
5
|
import { is_app_route, is_endpoint_route, is_page_route } from './create_manifest_data/index.js';
|
|
@@ -60,11 +61,11 @@ function stringify_assets(assets) {
|
|
|
60
61
|
|
|
61
62
|
/**
|
|
62
63
|
* @param {RouteData[] | undefined} routes
|
|
63
|
-
* @returns {
|
|
64
|
+
* @returns {ManifestRoute[]}
|
|
64
65
|
*/
|
|
65
66
|
export function get_manifest_routes(routes) {
|
|
66
67
|
return (
|
|
67
|
-
routes?.filter(is_app_route).map((route) => ({
|
|
68
|
+
routes?.filter(is_app_route).map((route) => /** @type {ManifestRoute} */ ({
|
|
68
69
|
id: route.id,
|
|
69
70
|
page: is_page_route(route),
|
|
70
71
|
endpoint: is_endpoint_route(route)
|