@sveltejs/kit 2.36.2 → 2.37.0
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 +6 -4
- package/src/exports/public.d.ts +11 -2
- package/src/exports/vite/index.js +0 -2
- package/src/runtime/app/server/remote/form.js +3 -2
- package/src/runtime/app/server/remote/query.js +29 -4
- package/src/runtime/app/server/remote/shared.js +6 -1
- package/src/runtime/app/state/server.js +9 -9
- package/src/runtime/app/stores.js +4 -4
- package/src/runtime/client/client.js +1 -1
- package/src/runtime/client/remote-functions/form.svelte.js +6 -5
- package/src/runtime/server/cookie.js +3 -2
- package/src/runtime/server/page/actions.js +2 -2
- package/src/runtime/server/page/csp.js +4 -3
- package/src/runtime/server/page/load_data.js +2 -2
- package/src/runtime/server/page/render.js +5 -5
- package/src/runtime/server/remote.js +24 -23
- package/src/runtime/server/respond.js +26 -25
- package/src/runtime/server/utils.js +1 -1
- package/src/types/ambient.d.ts +1 -1
- package/src/types/global-private.d.ts +0 -1
- package/src/types/internal.d.ts +1 -1
- package/src/version.js +1 -1
- package/types/index.d.ts +12 -3
- package/types/index.d.ts.map +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sveltejs/kit",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.37.0",
|
|
4
4
|
"description": "SvelteKit is the fastest way to build Svelte apps",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"framework",
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
"@types/cookie": "^0.6.0",
|
|
24
24
|
"acorn": "^8.14.1",
|
|
25
25
|
"cookie": "^0.6.0",
|
|
26
|
-
"devalue": "^5.
|
|
26
|
+
"devalue": "^5.3.2",
|
|
27
27
|
"esm-env": "^1.2.2",
|
|
28
28
|
"kleur": "^4.1.5",
|
|
29
29
|
"magic-string": "^0.30.5",
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"@types/set-cookie-parser": "^2.4.7",
|
|
42
42
|
"dts-buddy": "^0.6.2",
|
|
43
43
|
"rollup": "^4.14.2",
|
|
44
|
-
"svelte": "^5.
|
|
44
|
+
"svelte": "^5.38.5",
|
|
45
45
|
"svelte-preprocess": "^6.0.0",
|
|
46
46
|
"typescript": "^5.3.3",
|
|
47
47
|
"vite": "^6.3.5",
|
|
@@ -115,7 +115,9 @@
|
|
|
115
115
|
"test:cross-platform:build": "pnpm test:unit && pnpm -r --workspace-concurrency 1 --filter=\"./test/**\" test:cross-platform:build",
|
|
116
116
|
"test:server-side-route-resolution:dev": "pnpm -r --workspace-concurrency 1 --filter=\"./test/**\" test:server-side-route-resolution:dev",
|
|
117
117
|
"test:server-side-route-resolution:build": "pnpm test:unit && pnpm -r --workspace-concurrency 1 --filter=\"./test/**\" test:server-side-route-resolution:build",
|
|
118
|
-
"test:unit": "vitest --config kit.vitest.config.js run",
|
|
118
|
+
"test:unit:dev": "vitest --config kit.vitest.config.js run",
|
|
119
|
+
"test:unit:prod": "NODE_ENV=production vitest --config kit.vitest.config.js run csp.spec.js cookie.spec.js",
|
|
120
|
+
"test:unit": "pnpm test:unit:dev && pnpm test:unit:prod",
|
|
119
121
|
"generate:version": "node scripts/generate-version.js",
|
|
120
122
|
"generate:types": "node scripts/generate-dts.js"
|
|
121
123
|
}
|
package/src/exports/public.d.ts
CHANGED
|
@@ -437,7 +437,9 @@ export interface KitConfig {
|
|
|
437
437
|
*
|
|
438
438
|
* If the array contains `'*'`, all origins will be trusted. This is generally not recommended!
|
|
439
439
|
*
|
|
440
|
-
*
|
|
440
|
+
* > [!NOTE] Only add origins you completely trust, as this bypasses CSRF protection for those origins.
|
|
441
|
+
*
|
|
442
|
+
* CSRF checks only apply in production, not in local development.
|
|
441
443
|
* @default []
|
|
442
444
|
* @example ['https://checkout.stripe.com', 'https://accounts.google.com']
|
|
443
445
|
*/
|
|
@@ -1802,6 +1804,13 @@ export type RemoteResource<T> = Promise<Awaited<T>> & {
|
|
|
1802
1804
|
);
|
|
1803
1805
|
|
|
1804
1806
|
export type RemoteQuery<T> = RemoteResource<T> & {
|
|
1807
|
+
/**
|
|
1808
|
+
* On the client, this function will update the value of the query without re-fetching it.
|
|
1809
|
+
*
|
|
1810
|
+
* On the server, this can be called in the context of a `command` or `form` and the specified data will accompany the action response back to the client.
|
|
1811
|
+
* This prevents SvelteKit needing to refresh all queries on the page in a second server round-trip.
|
|
1812
|
+
*/
|
|
1813
|
+
set(value: T): void;
|
|
1805
1814
|
/**
|
|
1806
1815
|
* On the client, this function will re-fetch the query from the server.
|
|
1807
1816
|
*
|
|
@@ -1822,7 +1831,7 @@ export type RemoteQuery<T> = RemoteResource<T> & {
|
|
|
1822
1831
|
* await submit().updates(
|
|
1823
1832
|
* todos.withOverride((todos) => [...todos, { text: data.get('text') }])
|
|
1824
1833
|
* );
|
|
1825
|
-
* }}>
|
|
1834
|
+
* })}>
|
|
1826
1835
|
* <input type="text" name="text" />
|
|
1827
1836
|
* <button type="submit">Add Todo</button>
|
|
1828
1837
|
* </form>
|
|
@@ -335,7 +335,6 @@ async function kit({ svelte_config }) {
|
|
|
335
335
|
__SVELTEKIT_ADAPTER_NAME__: s(kit.adapter?.name),
|
|
336
336
|
__SVELTEKIT_APP_VERSION_FILE__: s(`${kit.appDir}/version.json`),
|
|
337
337
|
__SVELTEKIT_APP_VERSION_POLL_INTERVAL__: s(kit.version.pollInterval),
|
|
338
|
-
__SVELTEKIT_DEV__: 'false',
|
|
339
338
|
__SVELTEKIT_EMBEDDED__: s(kit.embedded),
|
|
340
339
|
__SVELTEKIT_EXPERIMENTAL__REMOTE_FUNCTIONS__: s(kit.experimental.remoteFunctions),
|
|
341
340
|
__SVELTEKIT_CLIENT_ROUTING__: s(kit.router.resolution === 'client'),
|
|
@@ -351,7 +350,6 @@ async function kit({ svelte_config }) {
|
|
|
351
350
|
} else {
|
|
352
351
|
new_config.define = {
|
|
353
352
|
__SVELTEKIT_APP_VERSION_POLL_INTERVAL__: '0',
|
|
354
|
-
__SVELTEKIT_DEV__: 'true',
|
|
355
353
|
__SVELTEKIT_EMBEDDED__: s(kit.embedded),
|
|
356
354
|
__SVELTEKIT_EXPERIMENTAL__REMOTE_FUNCTIONS__: s(kit.experimental.remoteFunctions),
|
|
357
355
|
__SVELTEKIT_CLIENT_ROUTING__: s(kit.router.resolution === 'client'),
|
|
@@ -108,14 +108,15 @@ export function form(fn) {
|
|
|
108
108
|
/** @type {RemoteForm<any>['for']} */
|
|
109
109
|
value: (key) => {
|
|
110
110
|
const { state } = get_request_store();
|
|
111
|
-
|
|
111
|
+
const cache_key = __.id + '|' + JSON.stringify(key);
|
|
112
|
+
let instance = (state.form_instances ??= new Map()).get(cache_key);
|
|
112
113
|
|
|
113
114
|
if (!instance) {
|
|
114
115
|
instance = create_instance(key);
|
|
115
116
|
instance.__.id = `${__.id}/${encodeURIComponent(JSON.stringify(key))}`;
|
|
116
117
|
instance.__.name = __.name;
|
|
117
118
|
|
|
118
|
-
state.form_instances.set(
|
|
119
|
+
state.form_instances.set(cache_key, instance);
|
|
119
120
|
}
|
|
120
121
|
|
|
121
122
|
return instance;
|
|
@@ -72,14 +72,35 @@ export function query(validate_or_fn, maybe_fn) {
|
|
|
72
72
|
|
|
73
73
|
const { event, state } = get_request_store();
|
|
74
74
|
|
|
75
|
+
const abort_controller = new AbortController();
|
|
75
76
|
/** @type {Promise<any> & Partial<RemoteQuery<any>>} */
|
|
76
|
-
const promise = get_response(
|
|
77
|
-
|
|
77
|
+
const promise = get_response(
|
|
78
|
+
__.id,
|
|
79
|
+
arg,
|
|
80
|
+
state,
|
|
81
|
+
() => run_remote_function(event, state, false, arg, validate, fn),
|
|
82
|
+
abort_controller.signal
|
|
78
83
|
);
|
|
79
84
|
|
|
80
85
|
promise.catch(() => {});
|
|
81
86
|
|
|
82
|
-
|
|
87
|
+
/** @param {Output} value */
|
|
88
|
+
promise.set = (value) => {
|
|
89
|
+
abort_controller.abort();
|
|
90
|
+
const { state } = get_request_store();
|
|
91
|
+
const refreshes = state.refreshes;
|
|
92
|
+
|
|
93
|
+
if (!refreshes) {
|
|
94
|
+
throw new Error(
|
|
95
|
+
`Cannot call set on query '${__.name}' because it is not executed in the context of a command/form remote function`
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const cache_key = create_remote_cache_key(__.id, stringify_remote_arg(arg, state.transport));
|
|
100
|
+
refreshes[cache_key] = Promise.resolve(value);
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
promise.refresh = () => {
|
|
83
104
|
const { state } = get_request_store();
|
|
84
105
|
const refreshes = state.refreshes;
|
|
85
106
|
|
|
@@ -90,10 +111,14 @@ export function query(validate_or_fn, maybe_fn) {
|
|
|
90
111
|
}
|
|
91
112
|
|
|
92
113
|
const cache_key = create_remote_cache_key(__.id, stringify_remote_arg(arg, state.transport));
|
|
93
|
-
refreshes[cache_key] =
|
|
114
|
+
refreshes[cache_key] = promise;
|
|
115
|
+
|
|
116
|
+
// TODO we could probably just return promise here, but would need to update the types
|
|
117
|
+
return promise.then(() => {});
|
|
94
118
|
};
|
|
95
119
|
|
|
96
120
|
promise.withOverride = () => {
|
|
121
|
+
abort_controller.abort();
|
|
97
122
|
throw new Error(`Cannot call '${__.name}.withOverride()' on the server`);
|
|
98
123
|
};
|
|
99
124
|
|
|
@@ -66,9 +66,14 @@ export function create_validator(validate_or_fn, maybe_fn) {
|
|
|
66
66
|
* @param {any} arg
|
|
67
67
|
* @param {RequestState} state
|
|
68
68
|
* @param {() => Promise<T>} get_result
|
|
69
|
+
* @param {AbortSignal | undefined=} signal
|
|
69
70
|
* @returns {Promise<T>}
|
|
70
71
|
*/
|
|
71
|
-
export function get_response(id, arg, state, get_result) {
|
|
72
|
+
export async function get_response(id, arg, state, get_result, signal) {
|
|
73
|
+
if (signal) {
|
|
74
|
+
await new Promise((r) => setTimeout(r, 0));
|
|
75
|
+
if (signal.aborted) throw new DOMException('The operation was aborted.', 'AbortError');
|
|
76
|
+
}
|
|
72
77
|
const cache_key = create_remote_cache_key(id, stringify_remote_arg(arg, state.transport));
|
|
73
78
|
|
|
74
79
|
return ((state.remote_data ??= {})[cache_key] ??= get_result());
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { DEV } from 'esm-env';
|
|
1
2
|
import { getContext } from 'svelte';
|
|
2
3
|
|
|
3
4
|
function context() {
|
|
@@ -16,31 +17,30 @@ function context_dev(name) {
|
|
|
16
17
|
}
|
|
17
18
|
}
|
|
18
19
|
|
|
19
|
-
// TODO we're using DEV in some places and __SVELTEKIT_DEV__ in others - why? Can we consolidate?
|
|
20
20
|
export const page = {
|
|
21
21
|
get data() {
|
|
22
|
-
return (
|
|
22
|
+
return (DEV ? context_dev('page.data') : context()).page.data;
|
|
23
23
|
},
|
|
24
24
|
get error() {
|
|
25
|
-
return (
|
|
25
|
+
return (DEV ? context_dev('page.error') : context()).page.error;
|
|
26
26
|
},
|
|
27
27
|
get form() {
|
|
28
|
-
return (
|
|
28
|
+
return (DEV ? context_dev('page.form') : context()).page.form;
|
|
29
29
|
},
|
|
30
30
|
get params() {
|
|
31
|
-
return (
|
|
31
|
+
return (DEV ? context_dev('page.params') : context()).page.params;
|
|
32
32
|
},
|
|
33
33
|
get route() {
|
|
34
|
-
return (
|
|
34
|
+
return (DEV ? context_dev('page.route') : context()).page.route;
|
|
35
35
|
},
|
|
36
36
|
get state() {
|
|
37
|
-
return (
|
|
37
|
+
return (DEV ? context_dev('page.state') : context()).page.state;
|
|
38
38
|
},
|
|
39
39
|
get status() {
|
|
40
|
-
return (
|
|
40
|
+
return (DEV ? context_dev('page.status') : context()).page.status;
|
|
41
41
|
},
|
|
42
42
|
get url() {
|
|
43
|
-
return (
|
|
43
|
+
return (DEV ? context_dev('page.url') : context()).page.url;
|
|
44
44
|
}
|
|
45
45
|
};
|
|
46
46
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { getContext } from 'svelte';
|
|
2
|
-
import { BROWSER } from 'esm-env';
|
|
2
|
+
import { BROWSER, DEV } from 'esm-env';
|
|
3
3
|
import { stores as browser_stores } from '../client/client.js';
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -35,7 +35,7 @@ export const getStores = () => {
|
|
|
35
35
|
*/
|
|
36
36
|
export const page = {
|
|
37
37
|
subscribe(fn) {
|
|
38
|
-
const store =
|
|
38
|
+
const store = DEV ? get_store('page') : getStores().page;
|
|
39
39
|
return store.subscribe(fn);
|
|
40
40
|
}
|
|
41
41
|
};
|
|
@@ -52,7 +52,7 @@ export const page = {
|
|
|
52
52
|
*/
|
|
53
53
|
export const navigating = {
|
|
54
54
|
subscribe(fn) {
|
|
55
|
-
const store =
|
|
55
|
+
const store = DEV ? get_store('navigating') : getStores().navigating;
|
|
56
56
|
return store.subscribe(fn);
|
|
57
57
|
}
|
|
58
58
|
};
|
|
@@ -67,7 +67,7 @@ export const navigating = {
|
|
|
67
67
|
*/
|
|
68
68
|
export const updated = {
|
|
69
69
|
subscribe(fn) {
|
|
70
|
-
const store =
|
|
70
|
+
const store = DEV ? get_store('updated') : getStores().updated;
|
|
71
71
|
|
|
72
72
|
if (BROWSER) {
|
|
73
73
|
updated.check = store.check;
|
|
@@ -440,7 +440,7 @@ function persist_state() {
|
|
|
440
440
|
* @param {number} redirect_count
|
|
441
441
|
* @param {{}} [nav_token]
|
|
442
442
|
*/
|
|
443
|
-
async function _goto(url, options, redirect_count, nav_token) {
|
|
443
|
+
export async function _goto(url, options, redirect_count, nav_token) {
|
|
444
444
|
/** @type {string[]} */
|
|
445
445
|
let query_keys;
|
|
446
446
|
const result = await navigate({
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
app,
|
|
10
10
|
remote_responses,
|
|
11
11
|
started,
|
|
12
|
-
|
|
12
|
+
_goto,
|
|
13
13
|
set_nearest_error_page,
|
|
14
14
|
invalidateAll
|
|
15
15
|
} from '../client.js';
|
|
@@ -82,7 +82,6 @@ export function form(id) {
|
|
|
82
82
|
if (!response.ok) {
|
|
83
83
|
// We only end up here in case of a network error or if the server has an internal error
|
|
84
84
|
// (which shouldn't happen because we handle errors on the server and always send a 200 response)
|
|
85
|
-
result = undefined;
|
|
86
85
|
throw new Error('Failed to execute remote function');
|
|
87
86
|
}
|
|
88
87
|
|
|
@@ -102,12 +101,14 @@ export function form(id) {
|
|
|
102
101
|
if (!invalidateAll) {
|
|
103
102
|
refresh_queries(refreshes, updates);
|
|
104
103
|
}
|
|
105
|
-
|
|
104
|
+
// Use internal version to allow redirects to external URLs
|
|
105
|
+
void _goto(form_result.location, { invalidateAll }, 0);
|
|
106
106
|
} else {
|
|
107
107
|
result = undefined;
|
|
108
108
|
throw new HttpError(500, form_result.error);
|
|
109
109
|
}
|
|
110
110
|
} catch (e) {
|
|
111
|
+
result = undefined;
|
|
111
112
|
release_overrides(updates);
|
|
112
113
|
throw e;
|
|
113
114
|
} finally {
|
|
@@ -210,7 +211,7 @@ export function form(id) {
|
|
|
210
211
|
};
|
|
211
212
|
};
|
|
212
213
|
|
|
213
|
-
instance.onsubmit = form_onsubmit(({ submit }) => submit());
|
|
214
|
+
instance.onsubmit = form_onsubmit(({ submit, form }) => submit().then(() => form.reset()));
|
|
214
215
|
|
|
215
216
|
/** @param {Parameters<RemoteForm<any>['buttonProps']['enhance']>[0]} callback */
|
|
216
217
|
const form_action_onclick = (callback) => {
|
|
@@ -247,7 +248,7 @@ export function form(id) {
|
|
|
247
248
|
type: 'submit',
|
|
248
249
|
formmethod: 'POST',
|
|
249
250
|
formaction: action,
|
|
250
|
-
onclick: form_action_onclick(({ submit }) => submit())
|
|
251
|
+
onclick: form_action_onclick(({ submit, form }) => submit().then(() => form.reset()))
|
|
251
252
|
};
|
|
252
253
|
|
|
253
254
|
Object.defineProperty(button_props, 'enhance', {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { parse, serialize } from 'cookie';
|
|
2
|
+
import { DEV } from 'esm-env';
|
|
2
3
|
import { normalize_path, resolve } from '../../utils/url.js';
|
|
3
4
|
import { add_data_suffix } from '../pathname.js';
|
|
4
5
|
import { text_encoder } from '../utils.js';
|
|
@@ -96,7 +97,7 @@ export function get_cookies(request, url) {
|
|
|
96
97
|
// in development, if the cookie was set during this session with `cookies.set`,
|
|
97
98
|
// but at a different path, warn the user. (ignore cookies from request headers,
|
|
98
99
|
// since we don't know which path they were set at)
|
|
99
|
-
if (
|
|
100
|
+
if (DEV && !cookie) {
|
|
100
101
|
const paths = Array.from(cookie_paths[name] ?? []).filter((path) => {
|
|
101
102
|
// we only care about paths that are _more_ specific than the current path
|
|
102
103
|
return path_matches(path, url.pathname) && path !== url.pathname;
|
|
@@ -252,7 +253,7 @@ export function get_cookies(request, url) {
|
|
|
252
253
|
const cookie = { name, value, options: { ...options, path } };
|
|
253
254
|
new_cookies.set(cookie_key, cookie);
|
|
254
255
|
|
|
255
|
-
if (
|
|
256
|
+
if (DEV) {
|
|
256
257
|
const serialized = serialize(name, value, cookie.options);
|
|
257
258
|
if (text_encoder.encode(serialized).byteLength > MAX_COOKIE_SIZE) {
|
|
258
259
|
throw new Error(`Cookie "${name}" is too large, and will be discarded by the browser`);
|
|
@@ -57,7 +57,7 @@ export async function handle_action_json_request(event, event_state, options, se
|
|
|
57
57
|
try {
|
|
58
58
|
const data = await call_action(event, event_state, actions);
|
|
59
59
|
|
|
60
|
-
if (
|
|
60
|
+
if (DEV) {
|
|
61
61
|
validate_action_return(data);
|
|
62
62
|
}
|
|
63
63
|
|
|
@@ -176,7 +176,7 @@ export async function handle_action_request(event, event_state, server) {
|
|
|
176
176
|
try {
|
|
177
177
|
const data = await call_action(event, event_state, actions);
|
|
178
178
|
|
|
179
|
-
if (
|
|
179
|
+
if (DEV) {
|
|
180
180
|
validate_action_return(data);
|
|
181
181
|
}
|
|
182
182
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { DEV } from 'esm-env';
|
|
1
2
|
import { escape_html } from '../../../utils/escape.js';
|
|
2
3
|
import { sha256 } from './crypto.js';
|
|
3
4
|
|
|
@@ -77,7 +78,7 @@ class BaseProvider {
|
|
|
77
78
|
*/
|
|
78
79
|
constructor(use_hashes, directives, nonce) {
|
|
79
80
|
this.#use_hashes = use_hashes;
|
|
80
|
-
this.#directives =
|
|
81
|
+
this.#directives = DEV ? { ...directives } : directives; // clone in dev so we can safely mutate
|
|
81
82
|
|
|
82
83
|
const d = this.#directives;
|
|
83
84
|
|
|
@@ -93,7 +94,7 @@ class BaseProvider {
|
|
|
93
94
|
const style_src_attr = d['style-src-attr'];
|
|
94
95
|
const style_src_elem = d['style-src-elem'];
|
|
95
96
|
|
|
96
|
-
if (
|
|
97
|
+
if (DEV) {
|
|
97
98
|
// remove strict-dynamic in dev...
|
|
98
99
|
// TODO reinstate this if we can figure out how to make strict-dynamic work
|
|
99
100
|
// if (d['default-src']) {
|
|
@@ -148,7 +149,7 @@ class BaseProvider {
|
|
|
148
149
|
|
|
149
150
|
this.#script_needs_csp = this.#script_src_needs_csp || this.#script_src_elem_needs_csp;
|
|
150
151
|
this.#style_needs_csp =
|
|
151
|
-
!
|
|
152
|
+
!DEV &&
|
|
152
153
|
(this.#style_src_needs_csp ||
|
|
153
154
|
this.#style_src_attr_needs_csp ||
|
|
154
155
|
this.#style_src_elem_needs_csp);
|
|
@@ -176,7 +176,7 @@ export async function load_server_data({ event, event_state, state, node, parent
|
|
|
176
176
|
}
|
|
177
177
|
});
|
|
178
178
|
|
|
179
|
-
if (
|
|
179
|
+
if (DEV) {
|
|
180
180
|
validate_load_response(result, `in ${node.server_id}`);
|
|
181
181
|
}
|
|
182
182
|
|
|
@@ -278,7 +278,7 @@ export async function load_data({
|
|
|
278
278
|
}
|
|
279
279
|
});
|
|
280
280
|
|
|
281
|
-
if (
|
|
281
|
+
if (DEV) {
|
|
282
282
|
validate_load_response(result, `in ${node.universal_id}`);
|
|
283
283
|
}
|
|
284
284
|
|
|
@@ -182,7 +182,7 @@ export async function render_response({
|
|
|
182
182
|
])
|
|
183
183
|
};
|
|
184
184
|
|
|
185
|
-
if (
|
|
185
|
+
if (DEV) {
|
|
186
186
|
const fetch = globalThis.fetch;
|
|
187
187
|
let warned = false;
|
|
188
188
|
globalThis.fetch = (info, init) => {
|
|
@@ -255,7 +255,7 @@ export async function render_response({
|
|
|
255
255
|
: Array.from(inline_styles.values()).join('\n');
|
|
256
256
|
|
|
257
257
|
if (style) {
|
|
258
|
-
const attributes =
|
|
258
|
+
const attributes = DEV ? [' data-sveltekit'] : [];
|
|
259
259
|
if (csp.style_needs_nonce) attributes.push(` nonce="${csp.nonce}"`);
|
|
260
260
|
|
|
261
261
|
csp.add_style(style);
|
|
@@ -295,7 +295,7 @@ export async function render_response({
|
|
|
295
295
|
}
|
|
296
296
|
}
|
|
297
297
|
|
|
298
|
-
const global =
|
|
298
|
+
const global = DEV ? '__sveltekit_dev' : `__sveltekit_${options.version_hash}`;
|
|
299
299
|
|
|
300
300
|
const { data, chunks } = get_data(
|
|
301
301
|
event,
|
|
@@ -516,10 +516,10 @@ export async function render_response({
|
|
|
516
516
|
}
|
|
517
517
|
|
|
518
518
|
if (options.service_worker) {
|
|
519
|
-
let opts =
|
|
519
|
+
let opts = DEV ? ", { type: 'module' }" : '';
|
|
520
520
|
if (options.service_worker_options != null) {
|
|
521
521
|
const service_worker_options = { ...options.service_worker_options };
|
|
522
|
-
if (
|
|
522
|
+
if (DEV) {
|
|
523
523
|
service_worker_options.type = 'module';
|
|
524
524
|
}
|
|
525
525
|
opts = `, ${s(service_worker_options)}`;
|
|
@@ -149,34 +149,35 @@ async function handle_remote_call_internal(event, state, options, manifest, id)
|
|
|
149
149
|
* @param {string[]} client_refreshes
|
|
150
150
|
*/
|
|
151
151
|
async function serialize_refreshes(client_refreshes) {
|
|
152
|
-
const refreshes = {
|
|
153
|
-
...state.refreshes,
|
|
154
|
-
...Object.fromEntries(
|
|
155
|
-
await Promise.all(
|
|
156
|
-
client_refreshes.map(async (key) => {
|
|
157
|
-
const [hash, name, payload] = key.split('/');
|
|
158
|
-
const loader = manifest._.remotes[hash];
|
|
152
|
+
const refreshes = /** @type {Record<string, Promise<any>>} */ (state.refreshes);
|
|
159
153
|
|
|
160
|
-
|
|
161
|
-
|
|
154
|
+
for (const key of client_refreshes) {
|
|
155
|
+
if (refreshes[key] !== undefined) continue;
|
|
162
156
|
|
|
163
|
-
|
|
164
|
-
const fn = module[name];
|
|
157
|
+
const [hash, name, payload] = key.split('/');
|
|
165
158
|
|
|
166
|
-
|
|
159
|
+
const loader = manifest._.remotes[hash];
|
|
160
|
+
const fn = (await loader?.())?.[name];
|
|
167
161
|
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
}
|
|
162
|
+
if (!fn) error(400, 'Bad Request');
|
|
163
|
+
|
|
164
|
+
refreshes[key] = with_request_store({ event, state }, () =>
|
|
165
|
+
fn(parse_remote_arg(payload, transport))
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
if (Object.keys(refreshes).length === 0) {
|
|
170
|
+
return undefined;
|
|
171
|
+
}
|
|
178
172
|
|
|
179
|
-
return
|
|
173
|
+
return stringify(
|
|
174
|
+
Object.fromEntries(
|
|
175
|
+
await Promise.all(
|
|
176
|
+
Object.entries(refreshes).map(async ([key, promise]) => [key, await promise])
|
|
177
|
+
)
|
|
178
|
+
),
|
|
179
|
+
transport
|
|
180
|
+
);
|
|
180
181
|
}
|
|
181
182
|
}
|
|
182
183
|
|
|
@@ -40,7 +40,6 @@ import { record_span } from '../telemetry/record_span.js';
|
|
|
40
40
|
import { otel } from '../telemetry/otel.js';
|
|
41
41
|
|
|
42
42
|
/* global __SVELTEKIT_ADAPTER_NAME__ */
|
|
43
|
-
/* global __SVELTEKIT_DEV__ */
|
|
44
43
|
|
|
45
44
|
/** @type {import('types').RequiredResolveOptions['transformPageChunk']} */
|
|
46
45
|
const default_transform = ({ html }) => html;
|
|
@@ -74,32 +73,34 @@ export async function internal_respond(request, options, manifest, state) {
|
|
|
74
73
|
const is_data_request = has_data_suffix(url.pathname);
|
|
75
74
|
const remote_id = get_remote_id(url);
|
|
76
75
|
|
|
77
|
-
|
|
76
|
+
if (!DEV) {
|
|
77
|
+
const request_origin = request.headers.get('origin');
|
|
78
78
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
}
|
|
84
|
-
} else if (options.csrf_check_origin) {
|
|
85
|
-
const forbidden =
|
|
86
|
-
is_form_content_type(request) &&
|
|
87
|
-
(request.method === 'POST' ||
|
|
88
|
-
request.method === 'PUT' ||
|
|
89
|
-
request.method === 'PATCH' ||
|
|
90
|
-
request.method === 'DELETE') &&
|
|
91
|
-
request_origin !== url.origin &&
|
|
92
|
-
(!request_origin || !options.csrf_trusted_origins.includes(request_origin));
|
|
93
|
-
|
|
94
|
-
if (forbidden) {
|
|
95
|
-
const message = `Cross-site ${request.method} form submissions are forbidden`;
|
|
96
|
-
const opts = { status: 403 };
|
|
97
|
-
|
|
98
|
-
if (request.headers.get('accept') === 'application/json') {
|
|
99
|
-
return json({ message }, opts);
|
|
79
|
+
if (remote_id) {
|
|
80
|
+
if (request.method !== 'GET' && request_origin !== url.origin) {
|
|
81
|
+
const message = 'Cross-site remote requests are forbidden';
|
|
82
|
+
return json({ message }, { status: 403 });
|
|
100
83
|
}
|
|
84
|
+
} else if (options.csrf_check_origin) {
|
|
85
|
+
const forbidden =
|
|
86
|
+
is_form_content_type(request) &&
|
|
87
|
+
(request.method === 'POST' ||
|
|
88
|
+
request.method === 'PUT' ||
|
|
89
|
+
request.method === 'PATCH' ||
|
|
90
|
+
request.method === 'DELETE') &&
|
|
91
|
+
request_origin !== url.origin &&
|
|
92
|
+
(!request_origin || !options.csrf_trusted_origins.includes(request_origin));
|
|
93
|
+
|
|
94
|
+
if (forbidden) {
|
|
95
|
+
const message = `Cross-site ${request.method} form submissions are forbidden`;
|
|
96
|
+
const opts = { status: 403 };
|
|
97
|
+
|
|
98
|
+
if (request.headers.get('accept') === 'application/json') {
|
|
99
|
+
return json({ message }, opts);
|
|
100
|
+
}
|
|
101
101
|
|
|
102
|
-
|
|
102
|
+
return text(message, opts);
|
|
103
|
+
}
|
|
103
104
|
}
|
|
104
105
|
}
|
|
105
106
|
|
|
@@ -167,7 +168,7 @@ export async function internal_respond(request, options, manifest, state) {
|
|
|
167
168
|
request,
|
|
168
169
|
route: { id: null },
|
|
169
170
|
setHeaders: (new_headers) => {
|
|
170
|
-
if (
|
|
171
|
+
if (DEV) {
|
|
171
172
|
validateHeaders(new_headers);
|
|
172
173
|
}
|
|
173
174
|
|
|
@@ -104,7 +104,7 @@ export async function handle_error_and_jsonify(event, state, options, error) {
|
|
|
104
104
|
return { message: 'Unknown Error', ...error.body };
|
|
105
105
|
}
|
|
106
106
|
|
|
107
|
-
if (
|
|
107
|
+
if (DEV && typeof error == 'object') {
|
|
108
108
|
fix_stack_trace(error);
|
|
109
109
|
}
|
|
110
110
|
|
package/src/types/ambient.d.ts
CHANGED
|
@@ -66,7 +66,7 @@ declare module '$service-worker' {
|
|
|
66
66
|
*/
|
|
67
67
|
export const build: string[];
|
|
68
68
|
/**
|
|
69
|
-
* An array of URL strings representing the files in your static directory, or whatever directory is specified by `config.kit.files.assets`. You can customize which files are included from `static` directory using [`config.kit.serviceWorker.files`](https://svelte.dev/docs/kit/configuration)
|
|
69
|
+
* An array of URL strings representing the files in your static directory, or whatever directory is specified by `config.kit.files.assets`. You can customize which files are included from `static` directory using [`config.kit.serviceWorker.files`](https://svelte.dev/docs/kit/configuration#serviceWorker)
|
|
70
70
|
*/
|
|
71
71
|
export const files: string[];
|
|
72
72
|
/**
|
|
@@ -2,7 +2,6 @@ declare global {
|
|
|
2
2
|
const __SVELTEKIT_ADAPTER_NAME__: string;
|
|
3
3
|
const __SVELTEKIT_APP_VERSION_FILE__: string;
|
|
4
4
|
const __SVELTEKIT_APP_VERSION_POLL_INTERVAL__: number;
|
|
5
|
-
const __SVELTEKIT_DEV__: boolean;
|
|
6
5
|
const __SVELTEKIT_EMBEDDED__: boolean;
|
|
7
6
|
/** True if `config.kit.experimental.instrumentation.server` is `true` */
|
|
8
7
|
const __SVELTEKIT_SERVER_TRACING_ENABLED__: boolean;
|
package/src/types/internal.d.ts
CHANGED
|
@@ -587,7 +587,7 @@ export interface RequestState {
|
|
|
587
587
|
};
|
|
588
588
|
form_instances?: Map<any, any>;
|
|
589
589
|
remote_data?: Record<string, MaybePromise<any>>;
|
|
590
|
-
refreshes?: Record<string, any
|
|
590
|
+
refreshes?: Record<string, Promise<any>>;
|
|
591
591
|
}
|
|
592
592
|
|
|
593
593
|
export interface RequestStore {
|
package/src/version.js
CHANGED
package/types/index.d.ts
CHANGED
|
@@ -413,7 +413,9 @@ declare module '@sveltejs/kit' {
|
|
|
413
413
|
*
|
|
414
414
|
* If the array contains `'*'`, all origins will be trusted. This is generally not recommended!
|
|
415
415
|
*
|
|
416
|
-
*
|
|
416
|
+
* > [!NOTE] Only add origins you completely trust, as this bypasses CSRF protection for those origins.
|
|
417
|
+
*
|
|
418
|
+
* CSRF checks only apply in production, not in local development.
|
|
417
419
|
* @default []
|
|
418
420
|
* @example ['https://checkout.stripe.com', 'https://accounts.google.com']
|
|
419
421
|
*/
|
|
@@ -1778,6 +1780,13 @@ declare module '@sveltejs/kit' {
|
|
|
1778
1780
|
);
|
|
1779
1781
|
|
|
1780
1782
|
export type RemoteQuery<T> = RemoteResource<T> & {
|
|
1783
|
+
/**
|
|
1784
|
+
* On the client, this function will update the value of the query without re-fetching it.
|
|
1785
|
+
*
|
|
1786
|
+
* On the server, this can be called in the context of a `command` or `form` and the specified data will accompany the action response back to the client.
|
|
1787
|
+
* This prevents SvelteKit needing to refresh all queries on the page in a second server round-trip.
|
|
1788
|
+
*/
|
|
1789
|
+
set(value: T): void;
|
|
1781
1790
|
/**
|
|
1782
1791
|
* On the client, this function will re-fetch the query from the server.
|
|
1783
1792
|
*
|
|
@@ -1798,7 +1807,7 @@ declare module '@sveltejs/kit' {
|
|
|
1798
1807
|
* await submit().updates(
|
|
1799
1808
|
* todos.withOverride((todos) => [...todos, { text: data.get('text') }])
|
|
1800
1809
|
* );
|
|
1801
|
-
* }}>
|
|
1810
|
+
* })}>
|
|
1802
1811
|
* <input type="text" name="text" />
|
|
1803
1812
|
* <button type="submit">Add Todo</button>
|
|
1804
1813
|
* </form>
|
|
@@ -3087,7 +3096,7 @@ declare module '$service-worker' {
|
|
|
3087
3096
|
*/
|
|
3088
3097
|
export const build: string[];
|
|
3089
3098
|
/**
|
|
3090
|
-
* An array of URL strings representing the files in your static directory, or whatever directory is specified by `config.kit.files.assets`. You can customize which files are included from `static` directory using [`config.kit.serviceWorker.files`](https://svelte.dev/docs/kit/configuration)
|
|
3099
|
+
* An array of URL strings representing the files in your static directory, or whatever directory is specified by `config.kit.files.assets`. You can customize which files are included from `static` directory using [`config.kit.serviceWorker.files`](https://svelte.dev/docs/kit/configuration#serviceWorker)
|
|
3091
3100
|
*/
|
|
3092
3101
|
export const files: string[];
|
|
3093
3102
|
/**
|
package/types/index.d.ts.map
CHANGED
|
@@ -187,6 +187,6 @@
|
|
|
187
187
|
null,
|
|
188
188
|
null
|
|
189
189
|
],
|
|
190
|
-
"mappings": ";;;;;;;;;;;kBAkCiBA,OAAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAiCZC,cAAcA;;;;;;aAMdC,cAAcA;;;;;;;;MAQrBC,aAAaA;;;;;OAKJC,YAAYA;;kBAETC,aAAaA;;;;;;MAMzBC,qBAAqBA;;;;;;;;;;;kBAWTC,OAAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA8IPC,MAAMA;;;;;;;;;;;kBAWNC,OAAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA4DPC,QAAQA;;;;;;;;kBAQRC,SAASA
|
|
190
|
+
"mappings": "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",
|
|
191
191
|
"ignoreList": []
|
|
192
192
|
}
|