@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
|
@@ -6,28 +6,19 @@ import { server_data_serializer_json } from '../page/data_serializer.js';
|
|
|
6
6
|
import { load_server_data } from '../page/load_data.js';
|
|
7
7
|
import { handle_error_and_jsonify } from '../errors.js';
|
|
8
8
|
import { normalize_path } from '../../../utils/url.js';
|
|
9
|
-
import {
|
|
9
|
+
import { stream_text } from '../../utils.js';
|
|
10
10
|
import { with_version_header } from '../utils.js';
|
|
11
|
+
import { manifest } from '../internal.js';
|
|
11
12
|
|
|
12
13
|
/**
|
|
13
14
|
* @param {import('@sveltejs/kit').RequestEvent} event
|
|
14
15
|
* @param {import('types').RequestState} state
|
|
15
16
|
* @param {{ page: Pick<import('types').PageNodeIndexes, 'layouts' | 'leaf'> | null }} route
|
|
16
|
-
* @param {import('types').SSROptions} options
|
|
17
|
-
* @param {import('@sveltejs/kit').SSRManifest} manifest
|
|
18
17
|
* @param {boolean[] | undefined} invalidated_data_nodes
|
|
19
18
|
* @param {import('types').TrailingSlash} trailing_slash
|
|
20
19
|
* @returns {Promise<Response>}
|
|
21
20
|
*/
|
|
22
|
-
export async function render_data(
|
|
23
|
-
event,
|
|
24
|
-
state,
|
|
25
|
-
route,
|
|
26
|
-
options,
|
|
27
|
-
manifest,
|
|
28
|
-
invalidated_data_nodes,
|
|
29
|
-
trailing_slash
|
|
30
|
-
) {
|
|
21
|
+
export async function render_data(event, state, route, invalidated_data_nodes, trailing_slash) {
|
|
31
22
|
if (!route.page) {
|
|
32
23
|
// requesting /__data.json should fail for a +server.js
|
|
33
24
|
return with_version_header(new Response(undefined, { status: 404 }));
|
|
@@ -54,7 +45,7 @@ export async function render_data(
|
|
|
54
45
|
}
|
|
55
46
|
|
|
56
47
|
// == because it could be undefined (in dev) or null (in build, because of JSON.stringify)
|
|
57
|
-
const node = n == undefined ? n : await manifest.
|
|
48
|
+
const node = n == undefined ? n : await manifest.nodes[n]();
|
|
58
49
|
// load this. for the child, return as is. for the final result, stream things
|
|
59
50
|
return load_server_data({
|
|
60
51
|
event: new_event,
|
|
@@ -92,7 +83,7 @@ export async function render_data(
|
|
|
92
83
|
return fn();
|
|
93
84
|
});
|
|
94
85
|
|
|
95
|
-
const data_serializer = server_data_serializer_json(event, state
|
|
86
|
+
const data_serializer = server_data_serializer_json(event, state);
|
|
96
87
|
await Promise.all(
|
|
97
88
|
promises.map(async (p, i) => {
|
|
98
89
|
const node = await p.catch(async (error) => {
|
|
@@ -100,7 +91,7 @@ export async function render_data(
|
|
|
100
91
|
throw error;
|
|
101
92
|
}
|
|
102
93
|
|
|
103
|
-
const transformed = await handle_error_and_jsonify(event, state,
|
|
94
|
+
const transformed = await handle_error_and_jsonify(event, state, error);
|
|
104
95
|
|
|
105
96
|
return /** @type {import('types').ServerErrorNode} */ ({
|
|
106
97
|
type: 'error',
|
|
@@ -120,27 +111,14 @@ export async function render_data(
|
|
|
120
111
|
}
|
|
121
112
|
|
|
122
113
|
return with_version_header(
|
|
123
|
-
new Response(
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
}
|
|
130
|
-
controller.close();
|
|
131
|
-
},
|
|
132
|
-
|
|
133
|
-
type: 'bytes'
|
|
134
|
-
}),
|
|
135
|
-
{
|
|
136
|
-
headers: {
|
|
137
|
-
// we use a proprietary content type to prevent buffering.
|
|
138
|
-
// the `text` prefix makes it inspectable
|
|
139
|
-
'content-type': 'text/sveltekit-data',
|
|
140
|
-
'cache-control': 'private, no-store'
|
|
141
|
-
}
|
|
114
|
+
new Response(stream_text(data, chunks), {
|
|
115
|
+
headers: {
|
|
116
|
+
// we use a proprietary content type to prevent buffering.
|
|
117
|
+
// the `text` prefix makes it inspectable
|
|
118
|
+
'content-type': 'text/sveltekit-data',
|
|
119
|
+
'cache-control': 'private, no-store'
|
|
142
120
|
}
|
|
143
|
-
)
|
|
121
|
+
})
|
|
144
122
|
);
|
|
145
123
|
} catch (e) {
|
|
146
124
|
const error = normalize_error(e);
|
|
@@ -148,7 +126,7 @@ export async function render_data(
|
|
|
148
126
|
if (error instanceof Redirect) {
|
|
149
127
|
return redirect_json_response(error);
|
|
150
128
|
} else {
|
|
151
|
-
const transformed = await handle_error_and_jsonify(event, state,
|
|
129
|
+
const transformed = await handle_error_and_jsonify(event, state, error);
|
|
152
130
|
return json_response(transformed, transformed.status);
|
|
153
131
|
}
|
|
154
132
|
}
|
|
@@ -8,17 +8,16 @@ import {
|
|
|
8
8
|
import { with_request_store } from '@sveltejs/kit/internal/server';
|
|
9
9
|
import { add_deprecated_handle_error_properties, coalesce_to_error } from '../../utils/error.js';
|
|
10
10
|
import { negotiate } from '../../utils/http.js';
|
|
11
|
-
import { fix_stack_trace } from './internal.js';
|
|
11
|
+
import { fix_stack_trace, hooks, options } from './internal.js';
|
|
12
12
|
import { escape_html } from '../../utils/escape.js';
|
|
13
13
|
|
|
14
14
|
/**
|
|
15
15
|
* @param {import('@sveltejs/kit').RequestEvent} event
|
|
16
16
|
* @param {import('types').RequestState} state
|
|
17
|
-
* @param {import('types').SSROptions} options
|
|
18
17
|
* @param {unknown} error
|
|
19
18
|
*/
|
|
20
|
-
export async function handle_fatal_error(event, state,
|
|
21
|
-
const body = await handle_error_and_jsonify(event, state,
|
|
19
|
+
export async function handle_fatal_error(event, state, error) {
|
|
20
|
+
const body = await handle_error_and_jsonify(event, state, error);
|
|
22
21
|
const status = body.status;
|
|
23
22
|
|
|
24
23
|
// sec-fetch-dest would be nicer, but non-browser clients and plain HTTP hosts don't send it
|
|
@@ -33,17 +32,16 @@ export async function handle_fatal_error(event, state, options, error) {
|
|
|
33
32
|
});
|
|
34
33
|
}
|
|
35
34
|
|
|
36
|
-
return static_error_page(
|
|
35
|
+
return static_error_page(status, body.message);
|
|
37
36
|
}
|
|
38
37
|
|
|
39
38
|
/**
|
|
40
39
|
* @param {import('@sveltejs/kit').RequestEvent} event
|
|
41
40
|
* @param {import('types').RequestState} state
|
|
42
|
-
* @param {import('types').SSROptions} options
|
|
43
41
|
* @param {any} error
|
|
44
42
|
* @returns {App.Error | Promise<App.Error>}
|
|
45
43
|
*/
|
|
46
|
-
export function handle_error_and_jsonify(event, state,
|
|
44
|
+
export function handle_error_and_jsonify(event, state, error) {
|
|
47
45
|
if (error instanceof HandledHttpError) {
|
|
48
46
|
return error.body;
|
|
49
47
|
}
|
|
@@ -90,7 +88,7 @@ export function handle_error_and_jsonify(event, state, options, error) {
|
|
|
90
88
|
const input = { ...caught, event };
|
|
91
89
|
if (__SVELTEKIT_DEV__) add_deprecated_handle_error_properties(input, fallback);
|
|
92
90
|
|
|
93
|
-
result = with_request_store({ event, state }, () =>
|
|
91
|
+
result = with_request_store({ event, state }, () => hooks.handleError(input));
|
|
94
92
|
} catch (hook_error) {
|
|
95
93
|
log_handle_error_hook_failure(error, hook_error);
|
|
96
94
|
return { status: fallback.status, message: 'Internal Error' };
|
|
@@ -141,11 +139,10 @@ function log_handle_error_hook_failure(error, hook_error) {
|
|
|
141
139
|
/**
|
|
142
140
|
* Return as a response that renders the error.html
|
|
143
141
|
*
|
|
144
|
-
* @param {import('types').SSROptions} options
|
|
145
142
|
* @param {number} status
|
|
146
143
|
* @param {string} message
|
|
147
144
|
*/
|
|
148
|
-
export function static_error_page(
|
|
145
|
+
export function static_error_page(status, message) {
|
|
149
146
|
let page = options.templates.error({ status, message: escape_html(message) });
|
|
150
147
|
|
|
151
148
|
if (__SVELTEKIT_DEV__) {
|
|
@@ -2,22 +2,20 @@ import { parseSetCookie } from 'cookie';
|
|
|
2
2
|
import { noop } from '../../utils/functions.js';
|
|
3
3
|
import { respond } from './respond.js';
|
|
4
4
|
import * as paths from '#app/paths';
|
|
5
|
-
import { read_implementation } from './internal.js';
|
|
5
|
+
import { hooks, manifest, read_implementation } from './internal.js';
|
|
6
6
|
import { has_prerendered_path } from './utils.js';
|
|
7
7
|
import { fork_state_for_subrequest } from './state.js';
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* @param {{
|
|
11
11
|
* event: import('@sveltejs/kit').RequestEvent;
|
|
12
|
-
* options: import('types').SSROptions;
|
|
13
|
-
* manifest: import('@sveltejs/kit').SSRManifest;
|
|
14
12
|
* state: import('types').RequestState;
|
|
15
13
|
* get_cookie_header: (url: URL, header: string | null) => string;
|
|
16
14
|
* set_internal: (name: string, value: string, opts: import('./page/types.js').Cookie['options']) => void;
|
|
17
15
|
* }} opts
|
|
18
16
|
* @returns {typeof fetch}
|
|
19
17
|
*/
|
|
20
|
-
export function create_fetch({ event,
|
|
18
|
+
export function create_fetch({ event, state, get_cookie_header, set_internal }) {
|
|
21
19
|
/**
|
|
22
20
|
* @type {typeof fetch}
|
|
23
21
|
*/
|
|
@@ -30,7 +28,7 @@ export function create_fetch({ event, options, manifest, state, get_cookie_heade
|
|
|
30
28
|
let credentials =
|
|
31
29
|
(info instanceof Request ? info.credentials : init?.credentials) ?? 'same-origin';
|
|
32
30
|
|
|
33
|
-
return
|
|
31
|
+
return hooks.handleFetch({
|
|
34
32
|
event,
|
|
35
33
|
request: original_request,
|
|
36
34
|
fetch: async (info, init) => {
|
|
@@ -88,24 +86,24 @@ export function create_fetch({ event, options, manifest, state, get_cookie_heade
|
|
|
88
86
|
).slice(1);
|
|
89
87
|
const filename_html = `${filename}/index.html`; // path may also match path/index.html
|
|
90
88
|
|
|
91
|
-
const is_asset = manifest.assets.has(filename) || filename in manifest.
|
|
89
|
+
const is_asset = manifest.assets.has(filename) || filename in manifest.server_assets;
|
|
92
90
|
const is_asset_html =
|
|
93
|
-
manifest.assets.has(filename_html) || filename_html in manifest.
|
|
91
|
+
manifest.assets.has(filename_html) || filename_html in manifest.server_assets;
|
|
94
92
|
|
|
95
93
|
if (is_asset || is_asset_html) {
|
|
96
94
|
const file = is_asset ? filename : filename_html;
|
|
97
95
|
|
|
98
96
|
if (state.read) {
|
|
99
97
|
const type = is_asset
|
|
100
|
-
? manifest.
|
|
98
|
+
? manifest.mime_types[filename.slice(filename.lastIndexOf('.'))]
|
|
101
99
|
: 'text/html';
|
|
102
100
|
|
|
103
101
|
return new Response(state.read(file), {
|
|
104
102
|
headers: type ? { 'content-type': type } : {}
|
|
105
103
|
});
|
|
106
|
-
} else if (read_implementation && file in manifest.
|
|
107
|
-
const length = manifest.
|
|
108
|
-
const type = manifest.
|
|
104
|
+
} else if (read_implementation && file in manifest.server_assets) {
|
|
105
|
+
const length = manifest.server_assets[file];
|
|
106
|
+
const type = manifest.mime_types[file.slice(file.lastIndexOf('.'))];
|
|
109
107
|
|
|
110
108
|
return new Response(read_implementation(file), {
|
|
111
109
|
headers: {
|
|
@@ -118,7 +116,7 @@ export function create_fetch({ event, options, manifest, state, get_cookie_heade
|
|
|
118
116
|
return await fetch(request);
|
|
119
117
|
}
|
|
120
118
|
|
|
121
|
-
if (has_prerendered_path(
|
|
119
|
+
if (has_prerendered_path(decoded)) {
|
|
122
120
|
// The path of something prerendered could match a different route
|
|
123
121
|
// that is still in the manifest, leading to the wrong route being loaded.
|
|
124
122
|
// We therefore bail early here. The prerendered logic is different for
|
|
@@ -148,18 +146,19 @@ export function create_fetch({ event, options, manifest, state, get_cookie_heade
|
|
|
148
146
|
request.headers.set('accept-language', accept_language);
|
|
149
147
|
}
|
|
150
148
|
|
|
151
|
-
const response = await internal_fetch(request,
|
|
149
|
+
const response = await internal_fetch(request, state);
|
|
152
150
|
|
|
153
151
|
for (const str of response.headers.getSetCookie()) {
|
|
154
|
-
const { name, value, ...
|
|
152
|
+
const { name, value, ...cookie_options } = parseSetCookie(str, { decode: (v) => v });
|
|
155
153
|
|
|
156
|
-
const path =
|
|
154
|
+
const path =
|
|
155
|
+
cookie_options.path ?? (url.pathname.split('/').slice(0, -1).join('/') || '/');
|
|
157
156
|
|
|
158
|
-
//
|
|
157
|
+
// sameSite is string, something more specific is required - type cast is safe
|
|
159
158
|
set_internal(name, /** @type {string} */ (value), {
|
|
160
159
|
path,
|
|
161
160
|
encode: (value) => value,
|
|
162
|
-
.../** @type {import('cookie').SerializeOptions} */ (
|
|
161
|
+
.../** @type {import('cookie').SerializeOptions} */ (cookie_options)
|
|
163
162
|
});
|
|
164
163
|
}
|
|
165
164
|
|
|
@@ -193,12 +192,10 @@ function normalize_fetch_input(info, init, url) {
|
|
|
193
192
|
|
|
194
193
|
/**
|
|
195
194
|
* @param {Request} request
|
|
196
|
-
* @param {import('types').SSROptions} options
|
|
197
|
-
* @param {import('@sveltejs/kit').SSRManifest} manifest
|
|
198
195
|
* @param {import('types').RequestState} state
|
|
199
196
|
* @returns {Promise<Response>}
|
|
200
197
|
*/
|
|
201
|
-
async function internal_fetch(request,
|
|
198
|
+
async function internal_fetch(request, state) {
|
|
202
199
|
if (request.signal?.aborted) {
|
|
203
200
|
throw new DOMException('The operation was aborted.', 'AbortError');
|
|
204
201
|
}
|
|
@@ -206,7 +203,7 @@ async function internal_fetch(request, options, manifest, state) {
|
|
|
206
203
|
const subrequest_state = fork_state_for_subrequest(state);
|
|
207
204
|
|
|
208
205
|
if (!request.signal) {
|
|
209
|
-
return await respond(request,
|
|
206
|
+
return await respond(request, subrequest_state);
|
|
210
207
|
}
|
|
211
208
|
|
|
212
209
|
let remove_abort_listener = noop;
|
|
@@ -219,8 +216,7 @@ async function internal_fetch(request, options, manifest, state) {
|
|
|
219
216
|
remove_abort_listener = () => request.signal.removeEventListener('abort', on_abort);
|
|
220
217
|
});
|
|
221
218
|
|
|
222
|
-
return Promise.race([
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
]).finally(remove_abort_listener);
|
|
219
|
+
return Promise.race([respond(request, subrequest_state), abort_promise]).finally(
|
|
220
|
+
remove_abort_listener
|
|
221
|
+
);
|
|
226
222
|
}
|
|
@@ -1,14 +1,24 @@
|
|
|
1
1
|
import { noop } from '../../utils/functions.js';
|
|
2
|
-
import {
|
|
2
|
+
import { stream_from_iterable } from '../utils.js';
|
|
3
|
+
import { IN_WEBCONTAINER, REROUTED_URL_HEADER } from '../../constants.js';
|
|
3
4
|
import { respond } from './respond.js';
|
|
4
5
|
import { create_request_state } from './state.js';
|
|
5
6
|
import { options, get_hooks } from '<sveltekit:generated>/server.js';
|
|
6
|
-
import {
|
|
7
|
+
import {
|
|
8
|
+
set_read_implementation,
|
|
9
|
+
set_manifest,
|
|
10
|
+
set_options,
|
|
11
|
+
set_hooks,
|
|
12
|
+
fix_stack_trace
|
|
13
|
+
} from './internal.js';
|
|
7
14
|
import { set_env } from '<sveltekit:generated>/env/config.js';
|
|
8
15
|
import { init_tracing } from '@sveltejs/kit/internal/server';
|
|
9
16
|
import { DEV } from 'esm-env';
|
|
10
17
|
import { init_transport } from '#app/internal/transport';
|
|
11
18
|
|
|
19
|
+
// set at module scope because prerendering evaluates user modules before constructing a `Server`
|
|
20
|
+
set_options(options);
|
|
21
|
+
|
|
12
22
|
/** @type {Promise<any>} */
|
|
13
23
|
let init_promise;
|
|
14
24
|
|
|
@@ -48,18 +58,8 @@ if (DEV) {
|
|
|
48
58
|
}
|
|
49
59
|
|
|
50
60
|
export class Server {
|
|
51
|
-
/** @
|
|
52
|
-
#options;
|
|
53
|
-
|
|
54
|
-
/** @type {import('@sveltejs/kit').SSRManifest} */
|
|
55
|
-
#manifest;
|
|
56
|
-
|
|
57
|
-
/** @param {import('@sveltejs/kit').SSRManifest} manifest */
|
|
61
|
+
/** @param {import('types').SSRManifest} manifest */
|
|
58
62
|
constructor(manifest) {
|
|
59
|
-
/** @type {import('types').SSROptions} */
|
|
60
|
-
this.#options = options;
|
|
61
|
-
this.#manifest = manifest;
|
|
62
|
-
|
|
63
63
|
// Since AsyncLocalStorage is not working in webcontainers, we don't reset `sync_store`
|
|
64
64
|
// in `src/exports/internal/server/event.js` and handle only one request at a time.
|
|
65
65
|
if (IN_WEBCONTAINER) {
|
|
@@ -105,14 +105,11 @@ export class Server {
|
|
|
105
105
|
return result;
|
|
106
106
|
}
|
|
107
107
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
(
|
|
112
|
-
|
|
113
|
-
if (stream) yield* stream;
|
|
114
|
-
})()
|
|
115
|
-
)
|
|
108
|
+
return stream_from_iterable(
|
|
109
|
+
(async function* () {
|
|
110
|
+
const stream = await result;
|
|
111
|
+
if (stream) yield* stream;
|
|
112
|
+
})()
|
|
116
113
|
);
|
|
117
114
|
};
|
|
118
115
|
|
|
@@ -125,7 +122,7 @@ export class Server {
|
|
|
125
122
|
try {
|
|
126
123
|
const module = await get_hooks();
|
|
127
124
|
|
|
128
|
-
|
|
125
|
+
set_hooks({
|
|
129
126
|
handle: module.handle || (({ event, resolve }) => resolve(event)),
|
|
130
127
|
handleError:
|
|
131
128
|
module.handleError ||
|
|
@@ -154,7 +151,7 @@ export class Server {
|
|
|
154
151
|
}),
|
|
155
152
|
handleFetch: module.handleFetch || (({ request, fetch }) => fetch(request)),
|
|
156
153
|
reroute: module.reroute || noop
|
|
157
|
-
};
|
|
154
|
+
});
|
|
158
155
|
|
|
159
156
|
init_transport(module.transport ?? {});
|
|
160
157
|
|
|
@@ -163,14 +160,14 @@ export class Server {
|
|
|
163
160
|
}
|
|
164
161
|
} catch (e) {
|
|
165
162
|
if (__SVELTEKIT_DEV__) {
|
|
166
|
-
|
|
163
|
+
set_hooks({
|
|
167
164
|
handle: () => {
|
|
168
165
|
throw e;
|
|
169
166
|
},
|
|
170
167
|
handleError: ({ error }) => console.error(error),
|
|
171
168
|
handleFetch: ({ request, fetch }) => fetch(request),
|
|
172
169
|
reroute: noop
|
|
173
|
-
};
|
|
170
|
+
});
|
|
174
171
|
} else {
|
|
175
172
|
throw e;
|
|
176
173
|
}
|
|
@@ -183,18 +180,25 @@ export class Server {
|
|
|
183
180
|
* @param {import('types').InternalRequestOptions} options
|
|
184
181
|
*/
|
|
185
182
|
async respond(request, options) {
|
|
186
|
-
const
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
this.#manifest,
|
|
190
|
-
create_request_state(options)
|
|
191
|
-
);
|
|
183
|
+
const request_state = create_request_state(options);
|
|
184
|
+
|
|
185
|
+
const response = await respond(request, request_state);
|
|
192
186
|
|
|
193
187
|
if (DEV) {
|
|
194
188
|
const error = decoded_responses.get(response);
|
|
195
189
|
if (error) console.error(fix_stack_trace(error));
|
|
196
190
|
}
|
|
197
191
|
|
|
192
|
+
if (request_state.rerouted_url) {
|
|
193
|
+
response.headers.set(REROUTED_URL_HEADER, request_state.rerouted_url);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// the HTTP layer discards HEAD response bodies, but nothing does when the server is called directly
|
|
197
|
+
if (request.method === 'HEAD' && response.body !== null) {
|
|
198
|
+
response.body.cancel().catch(noop);
|
|
199
|
+
return new Response(null, response);
|
|
200
|
+
}
|
|
201
|
+
|
|
198
202
|
return response;
|
|
199
203
|
}
|
|
200
204
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @import { SSRManifest } from '
|
|
1
|
+
/** @import { ServerHooks, SSROptions, SSRManifest } from 'types'; */
|
|
2
2
|
import { restore, save } from './dev.js';
|
|
3
3
|
import {
|
|
4
4
|
has_data_suffix,
|
|
@@ -16,6 +16,8 @@ const styleText =
|
|
|
16
16
|
|
|
17
17
|
const read_implementation_key = Symbol.for('sveltekit.read_implementation');
|
|
18
18
|
const manifest_key = Symbol.for('sveltekit.manifest');
|
|
19
|
+
const options_key = Symbol.for('sveltekit.options');
|
|
20
|
+
const hooks_key = Symbol.for('sveltekit.hooks');
|
|
19
21
|
|
|
20
22
|
export let read_implementation = /** @type {((path: string) => ReadableStream<any>) | null} */ (
|
|
21
23
|
(__SVELTEKIT_DEV__ && restore(read_implementation_key)) ?? null
|
|
@@ -25,6 +27,12 @@ export let manifest = /** @type {SSRManifest} */ (
|
|
|
25
27
|
(__SVELTEKIT_DEV__ && restore(manifest_key)) ?? null
|
|
26
28
|
);
|
|
27
29
|
|
|
30
|
+
export let options = /** @type {SSROptions} */ (
|
|
31
|
+
(__SVELTEKIT_DEV__ && restore(options_key)) ?? null
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
export let hooks = /** @type {ServerHooks} */ ((__SVELTEKIT_DEV__ && restore(hooks_key)) ?? null);
|
|
35
|
+
|
|
28
36
|
/**
|
|
29
37
|
* @param {(path: string) => ReadableStream<any>} fn
|
|
30
38
|
*/
|
|
@@ -42,11 +50,28 @@ export function set_manifest(value) {
|
|
|
42
50
|
if (__SVELTEKIT_DEV__) save(manifest_key, value);
|
|
43
51
|
}
|
|
44
52
|
|
|
53
|
+
/**
|
|
54
|
+
* @param {SSROptions} value
|
|
55
|
+
*/
|
|
56
|
+
export function set_options(value) {
|
|
57
|
+
options = value;
|
|
58
|
+
if (__SVELTEKIT_DEV__) save(options_key, value);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* @param {ServerHooks} value
|
|
63
|
+
*/
|
|
64
|
+
export function set_hooks(value) {
|
|
65
|
+
hooks = value;
|
|
66
|
+
if (__SVELTEKIT_DEV__) save(hooks_key, value);
|
|
67
|
+
}
|
|
68
|
+
|
|
45
69
|
/**
|
|
46
70
|
* @param {number} status
|
|
47
71
|
* @param {Request} request
|
|
72
|
+
* @returns {string}
|
|
48
73
|
*/
|
|
49
|
-
export function
|
|
74
|
+
export function format_response(status, request) {
|
|
50
75
|
const url = new URL(request.url);
|
|
51
76
|
const requested = url.href.replace(url.origin, '');
|
|
52
77
|
|
|
@@ -59,13 +84,17 @@ export function log_response(status, request) {
|
|
|
59
84
|
const pathname = strip_resolution_suffix(url.pathname) || '/';
|
|
60
85
|
log += pathname + styleText('dim', requested.slice(pathname.length));
|
|
61
86
|
} else if (has_remote_prefix(url)) {
|
|
62
|
-
const id = /** @type {string} */ (strip_remote_prefix(url)
|
|
63
|
-
|
|
87
|
+
const id = /** @type {string} */ (strip_remote_prefix(url));
|
|
88
|
+
const [file_hash, name, arg_hash] = id.split('/');
|
|
89
|
+
|
|
90
|
+
log += styleText('dim', `${url.pathname.slice(0, -id.length)}${file_hash}/`) + name;
|
|
91
|
+
if (arg_hash) log += styleText('dim', `/${arg_hash}`);
|
|
92
|
+
if (url.search) log += styleText('dim', url.search);
|
|
64
93
|
} else {
|
|
65
94
|
log += requested;
|
|
66
95
|
}
|
|
67
96
|
|
|
68
|
-
|
|
97
|
+
return log;
|
|
69
98
|
}
|
|
70
99
|
|
|
71
100
|
export { fix_stack_trace, set_fix_stack_trace } from './sourcemaps.js';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/** @import { RequestEvent, Actions } from '@sveltejs/kit' */
|
|
2
2
|
/** @import { ActionResult } from '$app/forms' */
|
|
3
|
-
/** @import {
|
|
3
|
+
/** @import { SSRNode, ServerNode, ServerActionResult } from 'types' */
|
|
4
4
|
import { DEV } from 'esm-env';
|
|
5
5
|
import { HttpError, Redirect, ActionFailure, SvelteKitError } from '@sveltejs/kit/internal';
|
|
6
6
|
import { with_request_store, merge_tracing, record_span } from '@sveltejs/kit/internal/server';
|
|
@@ -23,28 +23,26 @@ export function is_action_json_request(event) {
|
|
|
23
23
|
/**
|
|
24
24
|
* @param {RequestEvent} event
|
|
25
25
|
* @param {import('types').RequestState} state
|
|
26
|
-
* @param {SSROptions} options
|
|
27
26
|
* @param {SSRNode['server'] | undefined} server
|
|
28
27
|
*/
|
|
29
|
-
export async function handle_action_json_request(event, state,
|
|
28
|
+
export async function handle_action_json_request(event, state, server) {
|
|
30
29
|
const result = await handle_action_request(event, state, server);
|
|
31
|
-
return action_result_json(event, state,
|
|
30
|
+
return action_result_json(event, state, result);
|
|
32
31
|
}
|
|
33
32
|
|
|
34
33
|
/**
|
|
35
34
|
* @param {RequestEvent} event
|
|
36
35
|
* @param {import('types').RequestState} state
|
|
37
|
-
* @param {SSROptions} options
|
|
38
36
|
* @param {ServerActionResult} result
|
|
39
37
|
* @returns {Promise<Response>}
|
|
40
38
|
*/
|
|
41
|
-
async function action_result_json(event, state,
|
|
39
|
+
async function action_result_json(event, state, result) {
|
|
42
40
|
if (result.type === 'redirect') {
|
|
43
41
|
return action_json(result);
|
|
44
42
|
}
|
|
45
43
|
|
|
46
44
|
if (result.type === 'error') {
|
|
47
|
-
const error = await handle_error_and_jsonify(event, state,
|
|
45
|
+
const error = await handle_error_and_jsonify(event, state, result.error);
|
|
48
46
|
return action_json({ ...result, error }, { status: error.status });
|
|
49
47
|
}
|
|
50
48
|
|
|
@@ -64,7 +62,7 @@ async function action_result_json(event, state, options, result) {
|
|
|
64
62
|
{ status: result.status }
|
|
65
63
|
);
|
|
66
64
|
} catch (e) {
|
|
67
|
-
return action_result_json(event, state,
|
|
65
|
+
return action_result_json(event, state, action_error_result(e, result.location));
|
|
68
66
|
}
|
|
69
67
|
}
|
|
70
68
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as devalue from 'devalue';
|
|
2
2
|
import { compact } from '../../../utils/array.js';
|
|
3
3
|
import { create_async_iterator } from '../../../utils/streaming.js';
|
|
4
|
-
import { clarify_devalue_error,
|
|
4
|
+
import { clarify_devalue_error, serialize_uses } from '../utils.js';
|
|
5
5
|
import { handle_error_and_jsonify } from '../errors.js';
|
|
6
6
|
import { encoders } from '#app/internal/transport';
|
|
7
7
|
|
|
@@ -10,15 +10,14 @@ import { encoders } from '#app/internal/transport';
|
|
|
10
10
|
* async iterable containing their resolutions
|
|
11
11
|
* @param {import('@sveltejs/kit').RequestEvent} event
|
|
12
12
|
* @param {import('types').RequestState} state
|
|
13
|
-
* @param {import('types').SSROptions} options
|
|
14
13
|
* @returns {import('./types.js').ServerDataSerializer}
|
|
15
14
|
*/
|
|
16
|
-
export function server_data_serializer(event, state
|
|
15
|
+
export function server_data_serializer(event, state) {
|
|
17
16
|
let promise_id = 1;
|
|
18
17
|
let max_nodes = -1;
|
|
19
18
|
|
|
20
19
|
const iterator = create_async_iterator();
|
|
21
|
-
const global =
|
|
20
|
+
const global = __SVELTEKIT_GLOBAL_NAME__;
|
|
22
21
|
|
|
23
22
|
/** @param {number} index */
|
|
24
23
|
function get_replacer(index) {
|
|
@@ -31,7 +30,7 @@ export function server_data_serializer(event, state, options) {
|
|
|
31
30
|
.then(/** @param {any} data */ (data) => ({ data }))
|
|
32
31
|
.catch(
|
|
33
32
|
/** @param {any} error */ async (error) => ({
|
|
34
|
-
error: await handle_error_and_jsonify(event, state,
|
|
33
|
+
error: await handle_error_and_jsonify(event, state, error)
|
|
35
34
|
})
|
|
36
35
|
)
|
|
37
36
|
.then(
|
|
@@ -46,7 +45,6 @@ export function server_data_serializer(event, state, options) {
|
|
|
46
45
|
error = await handle_error_and_jsonify(
|
|
47
46
|
event,
|
|
48
47
|
state,
|
|
49
|
-
options,
|
|
50
48
|
new Error(`Failed to serialize promise while rendering ${event.route.id}`, {
|
|
51
49
|
cause: e
|
|
52
50
|
})
|
|
@@ -127,10 +125,9 @@ export function server_data_serializer(event, state, options) {
|
|
|
127
125
|
* async iterable containing their resolutions
|
|
128
126
|
* @param {import('@sveltejs/kit').RequestEvent} event
|
|
129
127
|
* @param {import('types').RequestState} state
|
|
130
|
-
* @param {import('types').SSROptions} options
|
|
131
128
|
* @returns {import('./types.js').ServerDataSerializerJson}
|
|
132
129
|
*/
|
|
133
|
-
export function server_data_serializer_json(event, state
|
|
130
|
+
export function server_data_serializer_json(event, state) {
|
|
134
131
|
let promise_id = 1;
|
|
135
132
|
|
|
136
133
|
const iterator = create_async_iterator();
|
|
@@ -152,7 +149,7 @@ export function server_data_serializer_json(event, state, options) {
|
|
|
152
149
|
.catch(
|
|
153
150
|
/** @param {any} e */ async (e) => {
|
|
154
151
|
key = 'error';
|
|
155
|
-
return handle_error_and_jsonify(event, state,
|
|
152
|
+
return handle_error_and_jsonify(event, state, /** @type {any} */ (e));
|
|
156
153
|
}
|
|
157
154
|
)
|
|
158
155
|
.then(
|
|
@@ -165,7 +162,6 @@ export function server_data_serializer_json(event, state, options) {
|
|
|
165
162
|
const error = await handle_error_and_jsonify(
|
|
166
163
|
event,
|
|
167
164
|
state,
|
|
168
|
-
options,
|
|
169
165
|
new Error(`Failed to serialize promise while rendering ${event.route.id}`, {
|
|
170
166
|
cause: e
|
|
171
167
|
})
|