@sveltejs/kit 3.0.0-next.24 → 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 +16 -10
- package/src/constants.js +6 -0
- package/src/core/adapt/builder.js +128 -33
- package/src/core/adapt/index.js +3 -0
- package/src/core/config/index.js +4 -7
- package/src/core/env.js +39 -14
- 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 +4 -4
- package/src/core/sync/create_manifest_data/index.js +0 -1
- package/src/core/sync/write_app_manifest.js +3 -2
- package/src/core/sync/write_server.js +3 -17
- package/src/core/utils.js +10 -0
- package/src/exports/adapter.js +22 -0
- package/src/exports/public.d.ts +101 -49
- package/src/exports/vite/build/index.js +1173 -0
- package/src/exports/vite/build/remote.js +4 -4
- package/src/exports/vite/build/service-worker.js +98 -0
- package/src/exports/vite/dev/generate_manifest.js +308 -0
- package/src/exports/vite/dev/index.js +40 -282
- package/src/exports/vite/index.js +156 -1717
- package/src/exports/vite/plugins/env-vars.js +53 -34
- package/src/exports/vite/plugins/guard.js +217 -0
- 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 +98 -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/query.js +2 -2
- 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 +43 -198
- 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 +254 -264
- package/src/runtime/server/data/index.js +14 -36
- package/src/runtime/server/errors.js +7 -10
- package/src/runtime/server/fetch.js +21 -25
- package/src/runtime/server/index.js +35 -31
- package/src/runtime/server/internal.js +34 -5
- package/src/runtime/server/page/actions.js +6 -8
- package/src/runtime/server/page/data_serializer.js +6 -10
- package/src/runtime/server/page/index.js +18 -28
- package/src/runtime/server/page/load_data.js +2 -2
- package/src/runtime/server/page/render.js +22 -40
- package/src/runtime/server/page/respond_with_error.js +10 -13
- package/src/runtime/server/page/server_routing.js +21 -27
- package/src/runtime/server/remote-functions.js +136 -136
- package/src/runtime/server/respond.js +66 -64
- package/src/runtime/server/state.js +2 -0
- package/src/runtime/server/utils.js +4 -11
- package/src/runtime/shared.js +9 -0
- package/src/runtime/utils.js +41 -0
- package/src/types/ambient-private.d.ts +1 -2
- package/src/types/global-private.d.ts +8 -0
- package/src/types/internal.d.ts +56 -17
- package/src/utils/filesystem.js +44 -28
- package/src/utils/streaming.js +5 -15
- package/src/version.js +1 -1
- package/types/index.d.ts +235 -93
- package/types/index.d.ts.map +9 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
/** @import { RequestEvent
|
|
2
|
-
/** @import { PageNodeIndexes, RequestState, RequiredResolveOptions, ServerDataNode, SSRNode
|
|
1
|
+
/** @import { RequestEvent } from '@sveltejs/kit' */
|
|
2
|
+
/** @import { PageNodeIndexes, RequestState, RequiredResolveOptions, ServerDataNode, SSRNode } from 'types' */
|
|
3
3
|
import { text } from '@sveltejs/kit';
|
|
4
4
|
import { Redirect } from '@sveltejs/kit/internal';
|
|
5
5
|
import { compact } from '../../../utils/array.js';
|
|
@@ -8,6 +8,7 @@ import { noop } from '../../../utils/functions.js';
|
|
|
8
8
|
import { add_data_suffix } from '../../pathname.js';
|
|
9
9
|
import { build_error_chain, nearest_error_pages } from '../../error-chain.js';
|
|
10
10
|
import { redirect_response } from '../utils.js';
|
|
11
|
+
import { manifest } from '../internal.js';
|
|
11
12
|
import { static_error_page, handle_error_and_jsonify } from '../errors.js';
|
|
12
13
|
import {
|
|
13
14
|
handle_action_json_request,
|
|
@@ -32,13 +33,11 @@ const MAX_DEPTH = 10;
|
|
|
32
33
|
* @param {RequestEvent} event
|
|
33
34
|
* @param {RequestState} state
|
|
34
35
|
* @param {PageNodeIndexes} page
|
|
35
|
-
* @param {SSROptions} options
|
|
36
|
-
* @param {SSRManifest} manifest
|
|
37
36
|
* @param {import('../../../utils/page_nodes.js').PageNodes} nodes
|
|
38
37
|
* @param {RequiredResolveOptions} resolve_opts
|
|
39
38
|
* @returns {Promise<Response>}
|
|
40
39
|
*/
|
|
41
|
-
export async function render_page(event, state, page,
|
|
40
|
+
export async function render_page(event, state, page, nodes, resolve_opts) {
|
|
42
41
|
if (state.depth > MAX_DEPTH) {
|
|
43
42
|
// infinite request cycle detected
|
|
44
43
|
return text(`Not found: ${event.url.pathname}`, {
|
|
@@ -47,8 +46,8 @@ export async function render_page(event, state, page, options, manifest, nodes,
|
|
|
47
46
|
}
|
|
48
47
|
|
|
49
48
|
if (is_action_json_request(event)) {
|
|
50
|
-
const node = await manifest.
|
|
51
|
-
return handle_action_json_request(event, state,
|
|
49
|
+
const node = await manifest.nodes[page.leaf]();
|
|
50
|
+
return handle_action_json_request(event, state, node?.server);
|
|
52
51
|
}
|
|
53
52
|
|
|
54
53
|
try {
|
|
@@ -62,7 +61,7 @@ export async function render_page(event, state, page, options, manifest, nodes,
|
|
|
62
61
|
if (is_action_request(event)) {
|
|
63
62
|
const remote_id = get_remote_action(event.url);
|
|
64
63
|
if (remote_id) {
|
|
65
|
-
action_result = await handle_remote_form_post(event, state,
|
|
64
|
+
action_result = await handle_remote_form_post(event, state, remote_id);
|
|
66
65
|
} else {
|
|
67
66
|
// for action requests, first call handler in +page.server.js
|
|
68
67
|
// (this also determines status code)
|
|
@@ -150,10 +149,8 @@ export async function render_page(event, state, page, options, manifest, nodes,
|
|
|
150
149
|
error: null,
|
|
151
150
|
event,
|
|
152
151
|
state,
|
|
153
|
-
options,
|
|
154
|
-
manifest,
|
|
155
152
|
resolve_opts,
|
|
156
|
-
data_serializer: server_data_serializer(event, state
|
|
153
|
+
data_serializer: server_data_serializer(event, state)
|
|
157
154
|
});
|
|
158
155
|
}
|
|
159
156
|
|
|
@@ -163,10 +160,10 @@ export async function render_page(event, state, page, options, manifest, nodes,
|
|
|
163
160
|
/** @type {Error | null} */
|
|
164
161
|
let load_error = null;
|
|
165
162
|
|
|
166
|
-
const data_serializer = server_data_serializer(event, state
|
|
163
|
+
const data_serializer = server_data_serializer(event, state);
|
|
167
164
|
const data_serializer_json =
|
|
168
165
|
(state.prerendering || state.prerender_default === true) && should_prerender_data
|
|
169
|
-
? server_data_serializer_json(event, state
|
|
166
|
+
? server_data_serializer_json(event, state)
|
|
170
167
|
: null;
|
|
171
168
|
|
|
172
169
|
/** @type {Array<Promise<ServerDataNode | null>>} */
|
|
@@ -274,11 +271,11 @@ export async function render_page(event, state, page, options, manifest, nodes,
|
|
|
274
271
|
return redirect_response(err.status, err.location);
|
|
275
272
|
}
|
|
276
273
|
|
|
277
|
-
const error = await handle_error_and_jsonify(event, state,
|
|
274
|
+
const error = await handle_error_and_jsonify(event, state, err);
|
|
278
275
|
const status = error.status;
|
|
279
276
|
|
|
280
277
|
for (const { error: index, idx } of nearest_error_pages(i, branch, page.errors)) {
|
|
281
|
-
const node = await manifest.
|
|
278
|
+
const node = await manifest.nodes[index]();
|
|
282
279
|
|
|
283
280
|
data_serializer.set_max_nodes(idx);
|
|
284
281
|
|
|
@@ -293,8 +290,6 @@ export async function render_page(event, state, page, options, manifest, nodes,
|
|
|
293
290
|
return await render_response({
|
|
294
291
|
event,
|
|
295
292
|
state,
|
|
296
|
-
options,
|
|
297
|
-
manifest,
|
|
298
293
|
resolve_opts,
|
|
299
294
|
page_config: {
|
|
300
295
|
ssr: nodes.ssr(),
|
|
@@ -302,7 +297,7 @@ export async function render_page(event, state, page, options, manifest, nodes,
|
|
|
302
297
|
},
|
|
303
298
|
status,
|
|
304
299
|
error,
|
|
305
|
-
error_components: await load_error_components(ssr, error_branch, page
|
|
300
|
+
error_components: await load_error_components(ssr, error_branch, page),
|
|
306
301
|
branch: error_branch,
|
|
307
302
|
fetched,
|
|
308
303
|
data_serializer
|
|
@@ -311,7 +306,7 @@ export async function render_page(event, state, page, options, manifest, nodes,
|
|
|
311
306
|
|
|
312
307
|
// if we're still here, it means the error happened in the root layout,
|
|
313
308
|
// which means we have to fall back to error.html
|
|
314
|
-
return static_error_page(
|
|
309
|
+
return static_error_page(status, error.message);
|
|
315
310
|
}
|
|
316
311
|
} else {
|
|
317
312
|
// push an empty slot so we can rewind past gaps to the
|
|
@@ -339,8 +334,6 @@ export async function render_page(event, state, page, options, manifest, nodes,
|
|
|
339
334
|
return await render_response({
|
|
340
335
|
event,
|
|
341
336
|
state,
|
|
342
|
-
options,
|
|
343
|
-
manifest,
|
|
344
337
|
resolve_opts,
|
|
345
338
|
page_config: {
|
|
346
339
|
csr,
|
|
@@ -351,8 +344,8 @@ export async function render_page(event, state, page, options, manifest, nodes,
|
|
|
351
344
|
branch: compact(branch),
|
|
352
345
|
action_result,
|
|
353
346
|
fetched,
|
|
354
|
-
data_serializer: !ssr ? server_data_serializer(event, state
|
|
355
|
-
error_components: await load_error_components(ssr, branch, page
|
|
347
|
+
data_serializer: !ssr ? server_data_serializer(event, state) : data_serializer,
|
|
348
|
+
error_components: await load_error_components(ssr, branch, page)
|
|
356
349
|
});
|
|
357
350
|
} catch (e) {
|
|
358
351
|
// a remote function could have thrown a redirect during render
|
|
@@ -365,8 +358,6 @@ export async function render_page(event, state, page, options, manifest, nodes,
|
|
|
365
358
|
return await respond_with_error({
|
|
366
359
|
event,
|
|
367
360
|
state,
|
|
368
|
-
options,
|
|
369
|
-
manifest,
|
|
370
361
|
error: e,
|
|
371
362
|
resolve_opts
|
|
372
363
|
});
|
|
@@ -377,12 +368,11 @@ export async function render_page(event, state, page, options, manifest, nodes,
|
|
|
377
368
|
* @param {boolean} ssr
|
|
378
369
|
* @param {Array<import('./types.js').Loaded | null>} branch
|
|
379
370
|
* @param {PageNodeIndexes} page
|
|
380
|
-
* @param {SSRManifest} manifest
|
|
381
371
|
*/
|
|
382
|
-
function load_error_components(ssr, branch, page
|
|
372
|
+
function load_error_components(ssr, branch, page) {
|
|
383
373
|
if (!ssr) return undefined;
|
|
384
374
|
|
|
385
375
|
return build_error_chain(branch, page.errors, (idx) =>
|
|
386
|
-
manifest.
|
|
376
|
+
manifest.nodes[idx]?.().then((e) => e.component?.())
|
|
387
377
|
);
|
|
388
378
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { DEV } from 'esm-env';
|
|
2
2
|
import { noop } from '../../../utils/functions.js';
|
|
3
3
|
import { disable_search, make_trackable } from '../../../utils/url.js';
|
|
4
|
-
import { validate_depends, validate_load_response } from '../../shared.js';
|
|
4
|
+
import { fetch_cache_url, validate_depends, validate_load_response } from '../../shared.js';
|
|
5
5
|
import { with_request_store, merge_tracing, record_span } from '@sveltejs/kit/internal/server';
|
|
6
6
|
import { base64_encode } from '../../utils.js';
|
|
7
7
|
import { NULL_BODY_STATUS } from '../constants.js';
|
|
@@ -344,7 +344,7 @@ export function create_universal_fetch(event, prerendering, fetched, csr, resolv
|
|
|
344
344
|
}
|
|
345
345
|
|
|
346
346
|
fetched.push({
|
|
347
|
-
url:
|
|
347
|
+
url: fetch_cache_url(url, event.url),
|
|
348
348
|
method: event.request.method,
|
|
349
349
|
request_body: /** @type {string | ArrayBufferView | null | undefined} */ (request_body),
|
|
350
350
|
request_headers: cloned_headers,
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
/** @import { Component } from 'svelte'; */
|
|
2
|
+
/** @import { SyncRenderOutput } from 'svelte/server' */
|
|
2
3
|
import * as devalue from 'devalue';
|
|
3
4
|
import { DEV } from 'esm-env';
|
|
4
5
|
import { isRedirect, text } from '@sveltejs/kit';
|
|
@@ -18,8 +19,8 @@ import {
|
|
|
18
19
|
route_id_resolution_pathname
|
|
19
20
|
} from '../../pathname.js';
|
|
20
21
|
import { try_get_request_store, with_request_store } from '@sveltejs/kit/internal/server';
|
|
21
|
-
import {
|
|
22
|
-
import { count_non_ssi_comments
|
|
22
|
+
import { stream_text } from '../../utils.js';
|
|
23
|
+
import { count_non_ssi_comments } from '../utils.js';
|
|
23
24
|
import { handle_error_and_jsonify } from '../errors.js';
|
|
24
25
|
import * as env from '<sveltekit:generated>/env/config.js';
|
|
25
26
|
import { collect_remote_data } from '../remote-functions.js';
|
|
@@ -27,6 +28,7 @@ import Root from '../../components/root.svelte';
|
|
|
27
28
|
import { render } from 'svelte/server';
|
|
28
29
|
import { Props, RenderNode } from '../../props.svelte.js';
|
|
29
30
|
import { has_custom_transporters, uneval } from '#app/internal/transport';
|
|
31
|
+
import { manifest, options } from '../internal.js';
|
|
30
32
|
|
|
31
33
|
// TODO rename this function/module
|
|
32
34
|
|
|
@@ -35,8 +37,6 @@ import { has_custom_transporters, uneval } from '#app/internal/transport';
|
|
|
35
37
|
* @param {{
|
|
36
38
|
* branch: Array<import('./types.js').Loaded>;
|
|
37
39
|
* fetched: Array<import('./types.js').Fetched>;
|
|
38
|
-
* options: import('types').SSROptions;
|
|
39
|
-
* manifest: import('@sveltejs/kit').SSRManifest;
|
|
40
40
|
* page_config: { ssr: boolean; csr: boolean };
|
|
41
41
|
* status: number;
|
|
42
42
|
* error: App.Error | null;
|
|
@@ -51,8 +51,6 @@ import { has_custom_transporters, uneval } from '#app/internal/transport';
|
|
|
51
51
|
export async function render_response({
|
|
52
52
|
branch,
|
|
53
53
|
fetched,
|
|
54
|
-
options,
|
|
55
|
-
manifest,
|
|
56
54
|
page_config,
|
|
57
55
|
status,
|
|
58
56
|
error = null,
|
|
@@ -73,7 +71,7 @@ export async function render_response({
|
|
|
73
71
|
}
|
|
74
72
|
}
|
|
75
73
|
|
|
76
|
-
const
|
|
74
|
+
const client = manifest.client;
|
|
77
75
|
|
|
78
76
|
const modulepreloads = new Set(client?.imports);
|
|
79
77
|
const stylesheets = new Set(client?.stylesheets);
|
|
@@ -91,8 +89,7 @@ export async function render_response({
|
|
|
91
89
|
// TODO if we add a client entry point one day, we will need to include inline_styles with the entry, otherwise stylesheets will be linked even if they are below inlineStyleThreshold
|
|
92
90
|
const inline_styles = new Map();
|
|
93
91
|
|
|
94
|
-
|
|
95
|
-
/** @type {Omit<Awaited<ReturnType<typeof render>>, 'html'>} */
|
|
92
|
+
/** @type {Omit<SyncRenderOutput, 'html'>} */
|
|
96
93
|
let rendered;
|
|
97
94
|
|
|
98
95
|
const form_value =
|
|
@@ -134,7 +131,7 @@ export async function render_response({
|
|
|
134
131
|
if (!paths.assets || (paths.assets[0] === '/' && paths.assets !== SVELTE_KIT_ASSETS)) {
|
|
135
132
|
assets = base;
|
|
136
133
|
}
|
|
137
|
-
} else if (
|
|
134
|
+
} else if (__SVELTEKIT_HASH_ROUTING__) {
|
|
138
135
|
// we have to assume that we're in the right place
|
|
139
136
|
base_expression = "new URL('.', location).pathname.slice(0, -1)";
|
|
140
137
|
}
|
|
@@ -203,7 +200,7 @@ export async function render_response({
|
|
|
203
200
|
throw e;
|
|
204
201
|
}
|
|
205
202
|
|
|
206
|
-
const handled = handle_error_and_jsonify(event, render_state,
|
|
203
|
+
const handled = handle_error_and_jsonify(event, render_state, e);
|
|
207
204
|
|
|
208
205
|
// TODO 4.0 make this an async function and await `handled`
|
|
209
206
|
if (handled instanceof Promise) {
|
|
@@ -287,7 +284,7 @@ export async function render_response({
|
|
|
287
284
|
// Vite makes the start script available through the base path and without it.
|
|
288
285
|
// We load it via the base path in order to support remote IDE environments which proxy
|
|
289
286
|
// all URLs under the base path during development.
|
|
290
|
-
return paths.base + path;
|
|
287
|
+
return relative ? `${base}/${path.slice(1)}` : paths.base + path;
|
|
291
288
|
}
|
|
292
289
|
return `${assets}/${path}`;
|
|
293
290
|
};
|
|
@@ -312,7 +309,10 @@ export async function render_response({
|
|
|
312
309
|
* @param {string[]} attributes
|
|
313
310
|
*/
|
|
314
311
|
const add_preload = (path, attributes) => {
|
|
315
|
-
if (
|
|
312
|
+
if (
|
|
313
|
+
__SVELTEKIT_LINK_HEADER_PRELOAD__ &&
|
|
314
|
+
!(state.prerendering || state.prerender_default === true)
|
|
315
|
+
) {
|
|
316
316
|
link_headers.add(`<${encodeURI(path)}>; ${attributes.join('; ')}; nopush`);
|
|
317
317
|
} else {
|
|
318
318
|
head.add_link_tag(path, attributes);
|
|
@@ -329,7 +329,7 @@ export async function render_response({
|
|
|
329
329
|
// include them in disabled state so that Vite can detect them and doesn't try to add them
|
|
330
330
|
attributes.push('disabled', 'media="(max-width: 0)"');
|
|
331
331
|
} else {
|
|
332
|
-
if (
|
|
332
|
+
if (__SVELTEKIT_LINK_HEADER_PRELOAD__ && resolve_opts.preload({ type: 'css', path })) {
|
|
333
333
|
link_headers.add(`<${encodeURI(path)}>; rel="preload"; as="style"; nopush`);
|
|
334
334
|
}
|
|
335
335
|
}
|
|
@@ -347,7 +347,7 @@ export async function render_response({
|
|
|
347
347
|
}
|
|
348
348
|
}
|
|
349
349
|
|
|
350
|
-
const global =
|
|
350
|
+
const global = __SVELTEKIT_GLOBAL_NAME__;
|
|
351
351
|
const { data, chunks } = data_serializer.get_data(csp);
|
|
352
352
|
|
|
353
353
|
if (page_config.ssr && page_config.csr) {
|
|
@@ -509,7 +509,7 @@ export async function render_response({
|
|
|
509
509
|
); // make output after it's put together with the rest more readable
|
|
510
510
|
hydrate.push(`params: ${devalue.uneval(event.params)}`, `server_route: ${stringified}`);
|
|
511
511
|
}
|
|
512
|
-
} else if (
|
|
512
|
+
} else if (__SVELTEKIT_EMBEDDED__) {
|
|
513
513
|
hydrate.push(`params: ${devalue.uneval(event.params)}`, `route: ${s(event.route)}`);
|
|
514
514
|
}
|
|
515
515
|
|
|
@@ -517,7 +517,7 @@ export async function render_response({
|
|
|
517
517
|
args.push(`{\n${indent}\t${hydrate.join(`,\n${indent}\t`)}\n${indent}}`);
|
|
518
518
|
}
|
|
519
519
|
|
|
520
|
-
const remote_data = await collect_remote_data({}, event, state
|
|
520
|
+
const remote_data = await collect_remote_data({}, event, state);
|
|
521
521
|
|
|
522
522
|
const serialized_data =
|
|
523
523
|
Object.keys(remote_data).length > 0
|
|
@@ -549,7 +549,7 @@ export async function render_response({
|
|
|
549
549
|
blocks.push(boot);
|
|
550
550
|
}
|
|
551
551
|
|
|
552
|
-
if (
|
|
552
|
+
if (__SVELTEKIT_SERVICE_WORKER__) {
|
|
553
553
|
let opts = ", { type: 'module' }";
|
|
554
554
|
if (options.service_worker_options != null) {
|
|
555
555
|
const service_worker_options = { ...options.service_worker_options, type: 'module' };
|
|
@@ -610,7 +610,7 @@ export async function render_response({
|
|
|
610
610
|
headers.set('content-security-policy-report-only', report_only_header);
|
|
611
611
|
}
|
|
612
612
|
|
|
613
|
-
if (
|
|
613
|
+
if (__SVELTEKIT_LINK_HEADER_PRELOAD__ && link_headers.size) {
|
|
614
614
|
headers.set('link', Array.from(link_headers).join(', '));
|
|
615
615
|
}
|
|
616
616
|
}
|
|
@@ -652,27 +652,9 @@ export async function render_response({
|
|
|
652
652
|
}
|
|
653
653
|
}
|
|
654
654
|
|
|
655
|
-
return
|
|
656
|
-
?
|
|
657
|
-
|
|
658
|
-
headers
|
|
659
|
-
})
|
|
660
|
-
: new Response(
|
|
661
|
-
new ReadableStream({
|
|
662
|
-
async start(controller) {
|
|
663
|
-
controller.enqueue(text_encoder.encode(transformed + '\n'));
|
|
664
|
-
for await (const chunk of chunks) {
|
|
665
|
-
if (chunk.length) controller.enqueue(text_encoder.encode(chunk));
|
|
666
|
-
}
|
|
667
|
-
controller.close();
|
|
668
|
-
},
|
|
669
|
-
|
|
670
|
-
type: 'bytes'
|
|
671
|
-
}),
|
|
672
|
-
{
|
|
673
|
-
headers
|
|
674
|
-
}
|
|
675
|
-
);
|
|
655
|
+
return chunks
|
|
656
|
+
? new Response(stream_text(transformed + '\n', chunks), { status, headers })
|
|
657
|
+
: text(transformed, { status, headers });
|
|
676
658
|
}
|
|
677
659
|
|
|
678
660
|
class Head {
|
|
@@ -5,6 +5,7 @@ import { redirect_response } from '../utils.js';
|
|
|
5
5
|
import { handle_error_and_jsonify, static_error_page } from '../errors.js';
|
|
6
6
|
import { PageNodes } from '../../../utils/page_nodes.js';
|
|
7
7
|
import { server_data_serializer } from './data_serializer.js';
|
|
8
|
+
import { manifest } from '../internal.js';
|
|
8
9
|
|
|
9
10
|
/**
|
|
10
11
|
* @typedef {import('./types.js').Loaded} Loaded
|
|
@@ -14,30 +15,28 @@ import { server_data_serializer } from './data_serializer.js';
|
|
|
14
15
|
* @param {{
|
|
15
16
|
* event: import('@sveltejs/kit').RequestEvent;
|
|
16
17
|
* state: import('types').RequestState;
|
|
17
|
-
* options: import('types').SSROptions;
|
|
18
|
-
* manifest: import('@sveltejs/kit').SSRManifest;
|
|
19
18
|
* error: unknown;
|
|
20
19
|
* resolve_opts: import('types').RequiredResolveOptions;
|
|
21
20
|
* }} opts
|
|
22
21
|
*/
|
|
23
|
-
export async function respond_with_error({ event, state,
|
|
22
|
+
export async function respond_with_error({ event, state, error, resolve_opts }) {
|
|
24
23
|
// reroute to the fallback page to prevent an infinite chain of requests.
|
|
25
24
|
if (event.request.headers.get('x-sveltekit-error')) {
|
|
26
|
-
const transformed = await handle_error_and_jsonify(event, state,
|
|
27
|
-
return static_error_page(
|
|
25
|
+
const transformed = await handle_error_and_jsonify(event, state, error);
|
|
26
|
+
return static_error_page(transformed.status, transformed.message);
|
|
28
27
|
}
|
|
29
28
|
|
|
30
29
|
/** @type {import('./types.js').Fetched[]} */
|
|
31
30
|
const fetched = [];
|
|
32
31
|
try {
|
|
33
32
|
const branch = [];
|
|
34
|
-
const default_layout = await manifest.
|
|
33
|
+
const default_layout = await manifest.nodes[0](); // 0 is always the root layout
|
|
35
34
|
const nodes = new PageNodes([default_layout]);
|
|
36
35
|
const ssr = nodes.ssr();
|
|
37
36
|
const csr = nodes.csr();
|
|
38
|
-
const data_serializer = server_data_serializer(event, state
|
|
37
|
+
const data_serializer = server_data_serializer(event, state);
|
|
39
38
|
// Do this here first in case the awaits below before rendering themselves error
|
|
40
|
-
const transformed = await handle_error_and_jsonify(event, state,
|
|
39
|
+
const transformed = await handle_error_and_jsonify(event, state, error);
|
|
41
40
|
|
|
42
41
|
if (ssr) {
|
|
43
42
|
state.error = true;
|
|
@@ -72,7 +71,7 @@ export async function respond_with_error({ event, state, options, manifest, erro
|
|
|
72
71
|
data
|
|
73
72
|
},
|
|
74
73
|
{
|
|
75
|
-
node: await manifest.
|
|
74
|
+
node: await manifest.nodes[1](), // 1 is always the root error
|
|
76
75
|
data: null,
|
|
77
76
|
server_data: null
|
|
78
77
|
}
|
|
@@ -80,8 +79,6 @@ export async function respond_with_error({ event, state, options, manifest, erro
|
|
|
80
79
|
}
|
|
81
80
|
|
|
82
81
|
return await render_response({
|
|
83
|
-
options,
|
|
84
|
-
manifest,
|
|
85
82
|
page_config: {
|
|
86
83
|
ssr,
|
|
87
84
|
csr
|
|
@@ -103,8 +100,8 @@ export async function respond_with_error({ event, state, options, manifest, erro
|
|
|
103
100
|
return redirect_response(e.status, e.location);
|
|
104
101
|
}
|
|
105
102
|
|
|
106
|
-
const transformed = await handle_error_and_jsonify(event, state,
|
|
103
|
+
const transformed = await handle_error_and_jsonify(event, state, e);
|
|
107
104
|
|
|
108
|
-
return static_error_page(
|
|
105
|
+
return static_error_page(transformed.status, transformed.message);
|
|
109
106
|
}
|
|
110
107
|
}
|
|
@@ -1,15 +1,16 @@
|
|
|
1
|
-
/** @import { SSRManifest } from '
|
|
1
|
+
/** @import { SSRManifest } from 'types' */
|
|
2
2
|
import { base, assets } from '#app/paths';
|
|
3
3
|
import { relative } from '$app/paths/internal/server';
|
|
4
4
|
import { text } from '@sveltejs/kit';
|
|
5
5
|
import { s } from '../../../utils/misc.js';
|
|
6
6
|
import { find_route } from '../../../utils/routing.js';
|
|
7
7
|
import { get_relative_path } from '../../utils.js';
|
|
8
|
+
import { manifest } from '../internal.js';
|
|
8
9
|
|
|
9
10
|
/**
|
|
10
11
|
* @param {import('types').SSRClientRoute} route
|
|
11
12
|
* @param {URL} url
|
|
12
|
-
* @param {NonNullable<SSRManifest['
|
|
13
|
+
* @param {NonNullable<SSRManifest['client']>} client
|
|
13
14
|
* @returns {string}
|
|
14
15
|
*/
|
|
15
16
|
export function generate_route_object(route, url, client) {
|
|
@@ -38,23 +39,18 @@ export function generate_route_object(route, url, client) {
|
|
|
38
39
|
function create_client_import(import_path, url) {
|
|
39
40
|
if (!import_path) return 'Promise.resolve({})';
|
|
40
41
|
|
|
41
|
-
// During DEV, Vite will make the paths absolute (e.g. /@fs/...)
|
|
42
|
-
if (import_path[0] === '/') {
|
|
43
|
-
return `import('${import_path}')`;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
42
|
// During PROD, they're root-relative
|
|
47
|
-
if (assets !== '') {
|
|
43
|
+
if (assets !== '' && import_path[0] !== '/') {
|
|
48
44
|
return `import('${assets}/${import_path}')`;
|
|
49
45
|
}
|
|
50
46
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
}
|
|
47
|
+
// During DEV, Vite will make the paths absolute (e.g. /@fs/...)
|
|
48
|
+
const absolute = import_path[0] === '/' ? import_path : `${base}/${import_path}`;
|
|
49
|
+
if (!relative) return `import('${absolute}')`;
|
|
54
50
|
|
|
55
51
|
// Else we make them relative to the server-side route resolution request
|
|
56
52
|
// to support IPFS, the internet archive, etc.
|
|
57
|
-
let path = get_relative_path(url.pathname,
|
|
53
|
+
let path = get_relative_path(url.pathname, absolute);
|
|
58
54
|
if (path[0] !== '.') path = `./${path}`;
|
|
59
55
|
return `import('${path}')`;
|
|
60
56
|
}
|
|
@@ -62,23 +58,22 @@ function create_client_import(import_path, url) {
|
|
|
62
58
|
/**
|
|
63
59
|
* @param {string} resolved_path
|
|
64
60
|
* @param {URL} url
|
|
65
|
-
* @param {SSRManifest} manifest
|
|
66
61
|
* @returns {Promise<Response>}
|
|
67
62
|
*/
|
|
68
|
-
export async function resolve_route(resolved_path, url
|
|
69
|
-
if (!manifest.
|
|
63
|
+
export async function resolve_route(resolved_path, url) {
|
|
64
|
+
if (!manifest.client?.routes) {
|
|
70
65
|
return text('Server-side route resolution disabled', { status: 400 });
|
|
71
66
|
}
|
|
72
67
|
|
|
73
68
|
try {
|
|
74
|
-
const matchers = await manifest.
|
|
75
|
-
const result = find_route(resolved_path, manifest.
|
|
69
|
+
const matchers = await manifest.matchers();
|
|
70
|
+
const result = find_route(resolved_path, manifest.client.routes, matchers);
|
|
76
71
|
|
|
77
72
|
return create_server_routing_response(
|
|
78
73
|
result?.route ?? null,
|
|
79
74
|
result?.params ?? {},
|
|
80
75
|
url,
|
|
81
|
-
manifest.
|
|
76
|
+
manifest.client
|
|
82
77
|
).response;
|
|
83
78
|
} catch {
|
|
84
79
|
return text('Error resolving route', { status: 500 });
|
|
@@ -99,29 +94,28 @@ export async function resolve_route(resolved_path, url, manifest) {
|
|
|
99
94
|
*
|
|
100
95
|
* @param {string} route_id
|
|
101
96
|
* @param {URL} url
|
|
102
|
-
* @param {SSRManifest} manifest
|
|
103
97
|
* @returns {Response}
|
|
104
98
|
*/
|
|
105
|
-
export function resolve_route_by_id(route_id, url
|
|
106
|
-
if (!manifest.
|
|
99
|
+
export function resolve_route_by_id(route_id, url) {
|
|
100
|
+
if (!manifest.client?.routes) {
|
|
107
101
|
return text('Server-side route resolution disabled', { status: 400 });
|
|
108
102
|
}
|
|
109
103
|
|
|
110
104
|
try {
|
|
111
|
-
const route = manifest.
|
|
105
|
+
const route = manifest.client.routes.find((r) => r.id === route_id);
|
|
112
106
|
|
|
113
107
|
if (route) {
|
|
114
|
-
return create_server_routing_response(route, null, url, manifest.
|
|
108
|
+
return create_server_routing_response(route, null, url, manifest.client).response;
|
|
115
109
|
}
|
|
116
110
|
|
|
117
111
|
// `client.routes` only contains routes with a `+page`, so a miss above doesn't mean the
|
|
118
112
|
// route doesn't exist — it might be a `+server.js`-only route. `_.routes` includes those
|
|
119
113
|
// (with `page: null`), so we can distinguish "exists but has no code" from "unknown".
|
|
120
|
-
if (manifest.
|
|
114
|
+
if (manifest.routes.some((r) => r.id === route_id && !r.page)) {
|
|
121
115
|
return text('export const endpoint_only = true;', { headers: js_headers() });
|
|
122
116
|
}
|
|
123
117
|
|
|
124
|
-
return create_server_routing_response(null, null, url, manifest.
|
|
118
|
+
return create_server_routing_response(null, null, url, manifest.client).response;
|
|
125
119
|
} catch {
|
|
126
120
|
return text('Error resolving route', { status: 500 });
|
|
127
121
|
}
|
|
@@ -137,7 +131,7 @@ function js_headers() {
|
|
|
137
131
|
* @param {import('types').SSRClientRoute | null} route
|
|
138
132
|
* @param {Partial<Record<string, string>> | null} params
|
|
139
133
|
* @param {URL} url
|
|
140
|
-
* @param {NonNullable<SSRManifest['
|
|
134
|
+
* @param {NonNullable<SSRManifest['client']>} client
|
|
141
135
|
* @returns {{response: Response, body: string}}
|
|
142
136
|
*/
|
|
143
137
|
export function create_server_routing_response(route, params, url, client) {
|
|
@@ -164,7 +158,7 @@ export function create_server_routing_response(route, params, url, client) {
|
|
|
164
158
|
*
|
|
165
159
|
* @param {import('types').SSRClientRoute} route
|
|
166
160
|
* @param {URL} url
|
|
167
|
-
* @param {NonNullable<SSRManifest['
|
|
161
|
+
* @param {NonNullable<SSRManifest['client']>} client
|
|
168
162
|
* @returns {string}
|
|
169
163
|
*/
|
|
170
164
|
function create_css_import(route, url, client) {
|