@sveltejs/kit 2.50.1 → 2.51.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 +4 -4
- package/src/core/postbuild/crawl.js +3 -3
- package/src/core/sync/write_tsconfig.js +7 -5
- package/src/exports/public.d.ts +14 -1
- package/src/exports/vite/build/build_server.js +116 -80
- package/src/exports/vite/index.js +4 -6
- package/src/exports/vite/static_analysis/utils.js +17 -0
- package/src/runtime/app/environment/index.js +1 -5
- package/src/runtime/app/server/remote/command.js +3 -1
- package/src/runtime/app/server/remote/form.js +1 -2
- package/src/runtime/app/server/remote/prerender.js +1 -1
- package/src/runtime/app/server/remote/query.js +39 -18
- package/src/runtime/app/server/remote/shared.js +4 -5
- package/src/runtime/client/client.js +22 -19
- package/src/runtime/server/fetch.js +6 -2
- package/src/runtime/server/page/csp.js +66 -28
- package/src/runtime/server/page/index.js +7 -2
- package/src/runtime/server/page/render.js +112 -44
- package/src/runtime/server/remote.js +4 -15
- package/src/types/internal.d.ts +13 -7
- package/src/utils/css.js +210 -0
- package/src/utils/routing.js +6 -2
- package/src/version.js +1 -1
- package/types/index.d.ts +22 -3
- package/types/index.d.ts.map +1 -1
package/src/types/internal.d.ts
CHANGED
|
@@ -176,7 +176,7 @@ export class InternalServer extends Server {
|
|
|
176
176
|
request: Request,
|
|
177
177
|
options: RequestOptions & {
|
|
178
178
|
prerendering?: PrerenderOptions;
|
|
179
|
-
read: (file: string) =>
|
|
179
|
+
read: (file: string) => NonSharedBuffer;
|
|
180
180
|
/** A hook called before `handle` during dev, so that `AsyncLocalStorage` can be populated. */
|
|
181
181
|
before_handle?: (event: RequestEvent, config: any, prerender: PrerenderOption) => void;
|
|
182
182
|
emulator?: Emulator;
|
|
@@ -381,7 +381,7 @@ export interface SSRComponent {
|
|
|
381
381
|
default: {
|
|
382
382
|
render(
|
|
383
383
|
props: Record<string, any>,
|
|
384
|
-
opts: { context: Map<any, any
|
|
384
|
+
opts: { context: Map<any, any>; csp?: { nonce?: string; hash?: boolean } }
|
|
385
385
|
): {
|
|
386
386
|
html: string;
|
|
387
387
|
head: string;
|
|
@@ -389,6 +389,10 @@ export interface SSRComponent {
|
|
|
389
389
|
code: string;
|
|
390
390
|
map: any; // TODO
|
|
391
391
|
};
|
|
392
|
+
/** Until we require all Svelte versions that support hashes, this might not be defined */
|
|
393
|
+
hashes?: {
|
|
394
|
+
script: Array<`sha256-${string}`>;
|
|
395
|
+
};
|
|
392
396
|
};
|
|
393
397
|
};
|
|
394
398
|
}
|
|
@@ -431,7 +435,9 @@ export interface SSRNode {
|
|
|
431
435
|
server_id?: string;
|
|
432
436
|
|
|
433
437
|
/** inlined styles */
|
|
434
|
-
inline_styles?(): MaybePromise<
|
|
438
|
+
inline_styles?(): MaybePromise<
|
|
439
|
+
Record<string, string | ((assets: string, base: string) => string)>
|
|
440
|
+
>;
|
|
435
441
|
/** Svelte component */
|
|
436
442
|
component?: SSRComponentLoader;
|
|
437
443
|
/** +page.js or +layout.js */
|
|
@@ -523,9 +529,9 @@ export interface SSRState {
|
|
|
523
529
|
* prerender option is inherited by the endpoint, unless overridden.
|
|
524
530
|
*/
|
|
525
531
|
prerender_default?: PrerenderOption;
|
|
526
|
-
read?: (file: string) =>
|
|
532
|
+
read?: (file: string) => NonSharedBuffer;
|
|
527
533
|
/**
|
|
528
|
-
* Used to
|
|
534
|
+
* Used to set up `__SVELTEKIT_TRACK__` which checks if a used feature is supported.
|
|
529
535
|
* E.g. if `read` from `$app/server` is used, it checks whether the route's config is compatible.
|
|
530
536
|
*/
|
|
531
537
|
before_handle?: (event: RequestEvent, config: any, prerender: PrerenderOption) => void;
|
|
@@ -570,8 +576,8 @@ export type RemoteInfo =
|
|
|
570
576
|
type: 'query_batch';
|
|
571
577
|
id: string;
|
|
572
578
|
name: string;
|
|
573
|
-
/** Direct access to the function
|
|
574
|
-
run: (args: any[]
|
|
579
|
+
/** Direct access to the function, for remote functions called from the client */
|
|
580
|
+
run: (args: any[], options: SSROptions) => Promise<any[]>;
|
|
575
581
|
}
|
|
576
582
|
| {
|
|
577
583
|
type: 'form';
|
package/src/utils/css.js
ADDED
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import MagicString from 'magic-string';
|
|
2
|
+
import * as svelte from 'svelte/compiler';
|
|
3
|
+
|
|
4
|
+
/** @typedef {ReturnType<typeof import('svelte/compiler').parseCss>['children']} StyleSheetChildren */
|
|
5
|
+
|
|
6
|
+
/** @typedef {{ property: string; value: string; start: number; end: number; type: 'Declaration' }} Declaration */
|
|
7
|
+
|
|
8
|
+
const parse = svelte.parseCss
|
|
9
|
+
? svelte.parseCss
|
|
10
|
+
: /** @param {string} css */
|
|
11
|
+
(css) => {
|
|
12
|
+
return /** @type {{ css: { children: StyleSheetChildren } }} */ (
|
|
13
|
+
svelte.parse(`<style>${css}</style>`)
|
|
14
|
+
).css;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
const SKIP_PARSING_REGEX = /url\(/i;
|
|
18
|
+
|
|
19
|
+
/** Capture a single url(...) so we can process them one at a time */
|
|
20
|
+
const URL_FUNCTION_REGEX = /url\(\s*.*?\)/gi;
|
|
21
|
+
|
|
22
|
+
/** Captures the value inside a CSS url(...) */
|
|
23
|
+
const URL_PARAMETER_REGEX = /url\(\s*(['"]?)(.*?)\1\s*\)/i;
|
|
24
|
+
|
|
25
|
+
/** Splits the URL if there's a query string or hash fragment */
|
|
26
|
+
const HASH_OR_QUERY_REGEX = /[#?]/;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Assets handled by Vite that are referenced in the stylesheet always start
|
|
30
|
+
* with this prefix because Vite emits them into the same directory as the CSS file
|
|
31
|
+
*/
|
|
32
|
+
const VITE_ASSET_PREFIX = './';
|
|
33
|
+
|
|
34
|
+
const AST_OFFSET = '<style>'.length;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* We need to fix the asset URLs in the CSS before we inline them into a document
|
|
38
|
+
* because they are now relative to the document instead of the CSS file.
|
|
39
|
+
* @param {{
|
|
40
|
+
* css: string;
|
|
41
|
+
* vite_assets: Set<string>;
|
|
42
|
+
* static_assets: Set<string>;
|
|
43
|
+
* paths_assets: string;
|
|
44
|
+
* base: string;
|
|
45
|
+
* static_asset_prefix: string;
|
|
46
|
+
* }} opts
|
|
47
|
+
* @returns {string}
|
|
48
|
+
*/
|
|
49
|
+
export function fix_css_urls({
|
|
50
|
+
css,
|
|
51
|
+
vite_assets,
|
|
52
|
+
static_assets,
|
|
53
|
+
paths_assets,
|
|
54
|
+
base,
|
|
55
|
+
static_asset_prefix
|
|
56
|
+
}) {
|
|
57
|
+
// skip parsing if there are no url(...) occurrences
|
|
58
|
+
if (!SKIP_PARSING_REGEX.test(css)) {
|
|
59
|
+
return css;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// safe guard in case of trailing slashes (but this should never happen)
|
|
63
|
+
if (paths_assets.endsWith('/')) {
|
|
64
|
+
paths_assets = paths_assets.slice(0, -1);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if (base.endsWith('/')) {
|
|
68
|
+
base = base.slice(0, -1);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const s = new MagicString(css);
|
|
72
|
+
|
|
73
|
+
const parsed = parse(css);
|
|
74
|
+
|
|
75
|
+
for (const child of parsed.children) {
|
|
76
|
+
find_declarations(child, (declaration) => {
|
|
77
|
+
if (!SKIP_PARSING_REGEX.test) return;
|
|
78
|
+
|
|
79
|
+
const cleaned = tippex_comments_and_strings(declaration.value);
|
|
80
|
+
|
|
81
|
+
/** @type {string} */
|
|
82
|
+
let new_value = declaration.value;
|
|
83
|
+
|
|
84
|
+
/** @type {RegExpExecArray | null} */
|
|
85
|
+
let url_function_found;
|
|
86
|
+
URL_FUNCTION_REGEX.lastIndex = 0;
|
|
87
|
+
while ((url_function_found = URL_FUNCTION_REGEX.exec(cleaned))) {
|
|
88
|
+
const [url_function] = url_function_found;
|
|
89
|
+
|
|
90
|
+
// After finding a legitimate url(...), we want to operate on the original
|
|
91
|
+
// that may have a string inside it
|
|
92
|
+
const original_url_function = declaration.value.slice(
|
|
93
|
+
url_function_found.index,
|
|
94
|
+
url_function_found.index + url_function.length
|
|
95
|
+
);
|
|
96
|
+
|
|
97
|
+
const url_parameter_found = URL_PARAMETER_REGEX.exec(original_url_function);
|
|
98
|
+
if (!url_parameter_found) continue;
|
|
99
|
+
|
|
100
|
+
const [, , url] = url_parameter_found;
|
|
101
|
+
const [url_without_hash_or_query] = url.split(HASH_OR_QUERY_REGEX);
|
|
102
|
+
|
|
103
|
+
/** @type {string | undefined} */
|
|
104
|
+
let new_prefix;
|
|
105
|
+
|
|
106
|
+
// Check if it's an asset processed by Vite...
|
|
107
|
+
let current_prefix = url_without_hash_or_query.slice(0, VITE_ASSET_PREFIX.length);
|
|
108
|
+
let filename = url_without_hash_or_query.slice(VITE_ASSET_PREFIX.length);
|
|
109
|
+
const decoded = decodeURIComponent(filename);
|
|
110
|
+
|
|
111
|
+
if (current_prefix === VITE_ASSET_PREFIX && vite_assets.has(decoded)) {
|
|
112
|
+
new_prefix = paths_assets;
|
|
113
|
+
} else {
|
|
114
|
+
// ...or if it's from the static directory
|
|
115
|
+
current_prefix = url_without_hash_or_query.slice(0, static_asset_prefix.length);
|
|
116
|
+
filename = url_without_hash_or_query.slice(static_asset_prefix.length);
|
|
117
|
+
const decoded = decodeURIComponent(filename);
|
|
118
|
+
|
|
119
|
+
if (current_prefix === static_asset_prefix && static_assets.has(decoded)) {
|
|
120
|
+
new_prefix = base;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
if (!new_prefix) continue;
|
|
125
|
+
|
|
126
|
+
new_value = new_value.replace(`${current_prefix}${filename}`, `${new_prefix}/${filename}`);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
if (declaration.value === new_value) return;
|
|
130
|
+
|
|
131
|
+
if (!svelte.parseCss) {
|
|
132
|
+
declaration.start = declaration.start - AST_OFFSET;
|
|
133
|
+
declaration.end = declaration.end - AST_OFFSET;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
s.update(declaration.start, declaration.end, `${declaration.property}: ${new_value}`);
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
return s.toString();
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* @param {StyleSheetChildren[0]} rule
|
|
145
|
+
* @param {(declaration: Declaration) => void} callback
|
|
146
|
+
*/
|
|
147
|
+
function find_declarations(rule, callback) {
|
|
148
|
+
// Vite already inlines relative @import rules, so we don't need to handle them here
|
|
149
|
+
if (!rule.block) return;
|
|
150
|
+
|
|
151
|
+
for (const child of rule.block.children) {
|
|
152
|
+
if (child.type !== 'Declaration') {
|
|
153
|
+
find_declarations(child, callback);
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
callback(child);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Replaces comment and string contents with whitespace.
|
|
162
|
+
* @param {string} value
|
|
163
|
+
* @returns {string}
|
|
164
|
+
*/
|
|
165
|
+
export function tippex_comments_and_strings(value) {
|
|
166
|
+
let new_value = '';
|
|
167
|
+
let escaped = false;
|
|
168
|
+
let in_comment = false;
|
|
169
|
+
|
|
170
|
+
/** @type {null | '"' | "'"} */
|
|
171
|
+
let quote_mark = null;
|
|
172
|
+
|
|
173
|
+
let i = 0;
|
|
174
|
+
while (i < value.length) {
|
|
175
|
+
const char = value[i];
|
|
176
|
+
|
|
177
|
+
if (in_comment) {
|
|
178
|
+
if (char === '*' && value[i + 1] === '/') {
|
|
179
|
+
in_comment = false;
|
|
180
|
+
new_value += char;
|
|
181
|
+
} else {
|
|
182
|
+
new_value += ' ';
|
|
183
|
+
}
|
|
184
|
+
} else if (!quote_mark && char === '/' && value[i + 1] === '*') {
|
|
185
|
+
in_comment = true;
|
|
186
|
+
new_value += '/*';
|
|
187
|
+
i++; // skip the '*' since we already added it
|
|
188
|
+
} else if (escaped) {
|
|
189
|
+
new_value += ' ';
|
|
190
|
+
escaped = false;
|
|
191
|
+
} else if (quote_mark && char === '\\') {
|
|
192
|
+
escaped = true;
|
|
193
|
+
new_value += ' ';
|
|
194
|
+
} else if (char === quote_mark) {
|
|
195
|
+
quote_mark = null;
|
|
196
|
+
new_value += char;
|
|
197
|
+
} else if (quote_mark) {
|
|
198
|
+
new_value += ' ';
|
|
199
|
+
} else if (quote_mark === null && (char === '"' || char === "'")) {
|
|
200
|
+
quote_mark = char;
|
|
201
|
+
new_value += char;
|
|
202
|
+
} else {
|
|
203
|
+
new_value += char;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
i++;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
return new_value;
|
|
210
|
+
}
|
package/src/utils/routing.js
CHANGED
|
@@ -162,8 +162,12 @@ export function exec(match, params, matchers) {
|
|
|
162
162
|
|
|
163
163
|
// if `value` is undefined, it means this is an optional or rest parameter
|
|
164
164
|
if (value === undefined) {
|
|
165
|
-
if (param.rest)
|
|
166
|
-
|
|
165
|
+
if (param.rest) {
|
|
166
|
+
// We need to allow the matcher to run so that it can decide if this optional rest param should be allowed to match
|
|
167
|
+
value = '';
|
|
168
|
+
} else {
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
167
171
|
}
|
|
168
172
|
|
|
169
173
|
if (!param.matcher || matchers[param.matcher](value)) {
|
package/src/version.js
CHANGED
package/types/index.d.ts
CHANGED
|
@@ -1175,6 +1175,19 @@ declare module '@sveltejs/kit' {
|
|
|
1175
1175
|
* The URL that is navigated to
|
|
1176
1176
|
*/
|
|
1177
1177
|
url: URL;
|
|
1178
|
+
/**
|
|
1179
|
+
* The scroll position associated with this navigation.
|
|
1180
|
+
*
|
|
1181
|
+
* For the `from` target, this is the scroll position at the moment of navigation.
|
|
1182
|
+
*
|
|
1183
|
+
* For the `to` target, this represents the scroll position that will be or was restored:
|
|
1184
|
+
* - In `beforeNavigate` and `onNavigate`, this is only available for `popstate` navigations (back/forward button)
|
|
1185
|
+
* and will be `null` for other navigation types, since the final scroll position isn't known
|
|
1186
|
+
* ahead of time.
|
|
1187
|
+
* - In `afterNavigate`, this is always the scroll position that was applied after the navigation
|
|
1188
|
+
* completed.
|
|
1189
|
+
*/
|
|
1190
|
+
scroll: { x: number; y: number } | null;
|
|
1178
1191
|
}
|
|
1179
1192
|
|
|
1180
1193
|
/**
|
|
@@ -1224,7 +1237,7 @@ declare module '@sveltejs/kit' {
|
|
|
1224
1237
|
delta?: undefined;
|
|
1225
1238
|
|
|
1226
1239
|
/**
|
|
1227
|
-
* Dispatched `Event` object when navigation
|
|
1240
|
+
* Dispatched `Event` object when navigation occurred by `popstate` or `link`.
|
|
1228
1241
|
*/
|
|
1229
1242
|
event?: undefined;
|
|
1230
1243
|
}
|
|
@@ -2510,7 +2523,7 @@ declare module '@sveltejs/kit' {
|
|
|
2510
2523
|
default: {
|
|
2511
2524
|
render(
|
|
2512
2525
|
props: Record<string, any>,
|
|
2513
|
-
opts: { context: Map<any, any
|
|
2526
|
+
opts: { context: Map<any, any>; csp?: { nonce?: string; hash?: boolean } }
|
|
2514
2527
|
): {
|
|
2515
2528
|
html: string;
|
|
2516
2529
|
head: string;
|
|
@@ -2518,6 +2531,10 @@ declare module '@sveltejs/kit' {
|
|
|
2518
2531
|
code: string;
|
|
2519
2532
|
map: any; // TODO
|
|
2520
2533
|
};
|
|
2534
|
+
/** Until we require all Svelte versions that support hashes, this might not be defined */
|
|
2535
|
+
hashes?: {
|
|
2536
|
+
script: Array<`sha256-${string}`>;
|
|
2537
|
+
};
|
|
2521
2538
|
};
|
|
2522
2539
|
};
|
|
2523
2540
|
}
|
|
@@ -2560,7 +2577,9 @@ declare module '@sveltejs/kit' {
|
|
|
2560
2577
|
server_id?: string;
|
|
2561
2578
|
|
|
2562
2579
|
/** inlined styles */
|
|
2563
|
-
inline_styles?(): MaybePromise<
|
|
2580
|
+
inline_styles?(): MaybePromise<
|
|
2581
|
+
Record<string, string | ((assets: string, base: string) => string)>
|
|
2582
|
+
>;
|
|
2564
2583
|
/** Svelte component */
|
|
2565
2584
|
component?: SSRComponentLoader;
|
|
2566
2585
|
/** +page.js or +layout.js */
|
package/types/index.d.ts.map
CHANGED
|
@@ -217,6 +217,6 @@
|
|
|
217
217
|
null,
|
|
218
218
|
null
|
|
219
219
|
],
|
|
220
|
-
"mappings": ";;;;;;;;MAgCKA,IAAIA;;;;;kBAKQC,OAAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAiCZC,cAAcA;;;;;;aAMdC,cAAcA;;;;;;;;MAQrBC,aAAaA;;;;;OAKJC,YAAYA;;kBAETC,aAAaA;;;;;;MAMzBC,qBAAqBA;;;;;;;;;;;kBAWTC,OAAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA8IPC,MAAMA;;;;;;;;;;;kBAWNC,OAAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA4DPC,QAAQA;;;;;;;;kBAQRC,SAASA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAykBdC,MAAMA;;;;;;;;;;;aAWNC,iBAAiBA;;;;;;;;;;;;aAYjBC,qBAAqBA;;;;;;;;;aASrBC,iBAAiBA;;;;;;;;;;aAUjBC,WAAWA;;;;;;;;;;aAUXC,UAAUA;;;;;;aAMVC,UAAUA;;;;;;aAMVC,OAAOA;;;;;;;;;;;;;;;;;;;;;;;;;;aA0BPC,SAASA;;;;;kBAKJC,WAAWA;;;;;;;;;;;;aAYhBC,IAAIA;;;;;;;;;;;;kBAYCC,SAASA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAyHTC,eAAeA;;;;;;;;;;;;;;;;;;;;;;;;;;kBA0BfC,gBAAgBA
|
|
220
|
+
"mappings": "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",
|
|
221
221
|
"ignoreList": []
|
|
222
222
|
}
|