@sveltejs/kit 2.33.1 → 2.34.1
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 +1 -1
- package/src/core/postbuild/analyse.js +3 -4
- package/src/core/postbuild/prerender.js +6 -6
- package/src/core/sync/write_non_ambient.js +3 -1
- package/src/core/sync/write_server.js +2 -2
- package/src/exports/vite/utils.js +3 -3
- package/src/runtime/app/paths/types.d.ts +1 -1
- package/src/runtime/server/constants.js +1 -0
- package/src/runtime/server/cookie.js +52 -16
- package/src/runtime/server/index.js +6 -27
- package/src/runtime/server/page/load_data.js +43 -8
- package/src/runtime/server/page/render.js +32 -19
- package/src/runtime/server/page/types.d.ts +1 -1
- package/src/runtime/server/respond.js +6 -3
- package/src/runtime/shared-server.js +1 -12
- package/src/types/internal.d.ts +0 -1
- package/src/types/synthetic/$env+dynamic+private.md +0 -2
- package/src/types/synthetic/$env+dynamic+public.md +0 -2
- package/src/utils/env.js +4 -24
- package/src/version.js +1 -1
- package/types/index.d.ts +1 -1
- package/types/index.d.ts.map +1 -1
package/package.json
CHANGED
|
@@ -5,7 +5,7 @@ import { load_config } from '../config/index.js';
|
|
|
5
5
|
import { forked } from '../../utils/fork.js';
|
|
6
6
|
import { installPolyfills } from '../../exports/node/polyfills.js';
|
|
7
7
|
import { ENDPOINT_METHODS } from '../../constants.js';
|
|
8
|
-
import {
|
|
8
|
+
import { filter_env } from '../../utils/env.js';
|
|
9
9
|
import { has_server_load, resolve_route } from '../../utils/routing.js';
|
|
10
10
|
import { check_feature } from '../../utils/features.js';
|
|
11
11
|
import { createReadableStream } from '@sveltejs/kit/node';
|
|
@@ -56,11 +56,10 @@ async function analyse({
|
|
|
56
56
|
|
|
57
57
|
// set env, in case it's used in initialisation
|
|
58
58
|
const { publicPrefix: public_prefix, privatePrefix: private_prefix } = config.env;
|
|
59
|
-
const private_env =
|
|
60
|
-
const public_env =
|
|
59
|
+
const private_env = filter_env(env, private_prefix, public_prefix);
|
|
60
|
+
const public_env = filter_env(env, public_prefix, private_prefix);
|
|
61
61
|
internal.set_private_env(private_env);
|
|
62
62
|
internal.set_public_env(public_env);
|
|
63
|
-
internal.set_safe_public_env(public_env);
|
|
64
63
|
internal.set_manifest(manifest);
|
|
65
64
|
internal.set_read_implementation((file) => createReadableStream(`${server_root}/server/${file}`));
|
|
66
65
|
|
|
@@ -125,6 +125,12 @@ async function prerender({ hash, out, manifest_path, metadata, verbose, env }) {
|
|
|
125
125
|
|
|
126
126
|
installPolyfills();
|
|
127
127
|
|
|
128
|
+
const server = new Server(manifest);
|
|
129
|
+
await server.init({
|
|
130
|
+
env,
|
|
131
|
+
read: (file) => createReadableStream(`${config.outDir}/output/server/${file}`)
|
|
132
|
+
});
|
|
133
|
+
|
|
128
134
|
/** @type {Map<string, string>} */
|
|
129
135
|
const saved = new Map();
|
|
130
136
|
|
|
@@ -503,12 +509,6 @@ async function prerender({ hash, out, manifest_path, metadata, verbose, env }) {
|
|
|
503
509
|
|
|
504
510
|
log.info('Prerendering');
|
|
505
511
|
|
|
506
|
-
const server = new Server(manifest);
|
|
507
|
-
await server.init({
|
|
508
|
-
env,
|
|
509
|
-
read: (file) => createReadableStream(`${config.outDir}/output/server/${file}`)
|
|
510
|
-
});
|
|
511
|
-
|
|
512
512
|
for (const entry of config.prerender.entries) {
|
|
513
513
|
if (entry === '*') {
|
|
514
514
|
for (const [id, prerender] of prerender_map) {
|
|
@@ -91,6 +91,8 @@ function generate_app_types(manifest_data) {
|
|
|
91
91
|
layouts.push(layout_type);
|
|
92
92
|
}
|
|
93
93
|
|
|
94
|
+
const assets = manifest_data.assets.map((asset) => s('/' + asset.file));
|
|
95
|
+
|
|
94
96
|
return [
|
|
95
97
|
'declare module "$app/types" {',
|
|
96
98
|
'\texport interface AppTypes {',
|
|
@@ -99,7 +101,7 @@ function generate_app_types(manifest_data) {
|
|
|
99
101
|
`\t\tLayoutParams(): {\n\t\t\t${layouts.join(';\n\t\t\t')}\n\t\t};`,
|
|
100
102
|
`\t\tPathname(): ${Array.from(pathnames).join(' | ')};`,
|
|
101
103
|
'\t\tResolvedPathname(): `${"" | `/${string}`}${ReturnType<AppTypes[\'Pathname\']>}`;',
|
|
102
|
-
`\t\tAsset(): ${
|
|
104
|
+
`\t\tAsset(): ${assets.concat('string & {}').join(' | ')};`,
|
|
103
105
|
'\t}',
|
|
104
106
|
'}'
|
|
105
107
|
].join('\n');
|
|
@@ -32,7 +32,7 @@ import root from '../root.${isSvelte5Plus() ? 'js' : 'svelte'}';
|
|
|
32
32
|
import { set_building, set_prerendering } from '__sveltekit/environment';
|
|
33
33
|
import { set_assets } from '__sveltekit/paths';
|
|
34
34
|
import { set_manifest, set_read_implementation } from '__sveltekit/server';
|
|
35
|
-
import { set_private_env, set_public_env
|
|
35
|
+
import { set_private_env, set_public_env } from '${runtime_directory}/shared-server.js';
|
|
36
36
|
|
|
37
37
|
export const options = {
|
|
38
38
|
app_template_contains_nonce: ${template.includes('%sveltekit.nonce%')},
|
|
@@ -87,7 +87,7 @@ export async function get_hooks() {
|
|
|
87
87
|
};
|
|
88
88
|
}
|
|
89
89
|
|
|
90
|
-
export { set_assets, set_building, set_manifest, set_prerendering, set_private_env, set_public_env, set_read_implementation
|
|
90
|
+
export { set_assets, set_building, set_manifest, set_prerendering, set_private_env, set_public_env, set_read_implementation };
|
|
91
91
|
`;
|
|
92
92
|
|
|
93
93
|
// TODO need to re-run this whenever src/app.html or src/error.html are
|
|
@@ -2,7 +2,7 @@ import path from 'node:path';
|
|
|
2
2
|
import { loadEnv } from 'vite';
|
|
3
3
|
import { posixify } from '../../utils/filesystem.js';
|
|
4
4
|
import { negotiate } from '../../utils/http.js';
|
|
5
|
-
import {
|
|
5
|
+
import { filter_env } from '../../utils/env.js';
|
|
6
6
|
import { escape_html } from '../../utils/escape.js';
|
|
7
7
|
import { dedent } from '../../core/sync/utils.js';
|
|
8
8
|
import {
|
|
@@ -71,8 +71,8 @@ export function get_env(env_config, mode) {
|
|
|
71
71
|
const env = loadEnv(mode, env_config.dir, '');
|
|
72
72
|
|
|
73
73
|
return {
|
|
74
|
-
public:
|
|
75
|
-
private:
|
|
74
|
+
public: filter_env(env, public_prefix, private_prefix),
|
|
75
|
+
private: filter_env(env, private_prefix, public_prefix)
|
|
76
76
|
};
|
|
77
77
|
}
|
|
78
78
|
|
|
@@ -56,7 +56,7 @@ export function resolve<T extends RouteId | Pathname>(...args: ResolveArgs<T>):
|
|
|
56
56
|
* import { asset } from '$app/paths';
|
|
57
57
|
* </script>
|
|
58
58
|
*
|
|
59
|
-
* <img alt="a potato" src={asset('potato.jpg')} />
|
|
59
|
+
* <img alt="a potato" src={asset('/potato.jpg')} />
|
|
60
60
|
* ```
|
|
61
61
|
* @since 2.26
|
|
62
62
|
*/
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const NULL_BODY_STATUS = [101, 103, 204, 205, 304];
|
|
@@ -27,6 +27,21 @@ function validate_options(options) {
|
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
+
/**
|
|
31
|
+
* Generates a unique key for a cookie based on its domain, path, and name in
|
|
32
|
+
* the format: `<domain>/<path>?<name>`.
|
|
33
|
+
* If domain is undefined, it will be omitted.
|
|
34
|
+
* For example: `/?name`, `example.com/foo?name`.
|
|
35
|
+
*
|
|
36
|
+
* @param {string | undefined} domain
|
|
37
|
+
* @param {string} path
|
|
38
|
+
* @param {string} name
|
|
39
|
+
* @returns {string}
|
|
40
|
+
*/
|
|
41
|
+
function generate_cookie_key(domain, path, name) {
|
|
42
|
+
return `${domain || ''}${path}?${encodeURIComponent(name)}`;
|
|
43
|
+
}
|
|
44
|
+
|
|
30
45
|
/**
|
|
31
46
|
* @param {Request} request
|
|
32
47
|
* @param {URL} url
|
|
@@ -38,8 +53,8 @@ export function get_cookies(request, url) {
|
|
|
38
53
|
/** @type {string | undefined} */
|
|
39
54
|
let normalized_url;
|
|
40
55
|
|
|
41
|
-
/** @type {
|
|
42
|
-
const new_cookies =
|
|
56
|
+
/** @type {Map<string, import('./page/types.js').Cookie>} */
|
|
57
|
+
const new_cookies = new Map();
|
|
43
58
|
|
|
44
59
|
/** @type {import('cookie').CookieSerializeOptions} */
|
|
45
60
|
const defaults = {
|
|
@@ -60,13 +75,19 @@ export function get_cookies(request, url) {
|
|
|
60
75
|
* @param {import('cookie').CookieParseOptions} [opts]
|
|
61
76
|
*/
|
|
62
77
|
get(name, opts) {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
c
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
78
|
+
// Look for the most specific matching cookie from new_cookies
|
|
79
|
+
const best_match = Array.from(new_cookies.values())
|
|
80
|
+
.filter((c) => {
|
|
81
|
+
return (
|
|
82
|
+
c.name === name &&
|
|
83
|
+
domain_matches(url.hostname, c.options.domain) &&
|
|
84
|
+
path_matches(url.pathname, c.options.path)
|
|
85
|
+
);
|
|
86
|
+
})
|
|
87
|
+
.sort((a, b) => b.options.path.length - a.options.path.length)[0];
|
|
88
|
+
|
|
89
|
+
if (best_match) {
|
|
90
|
+
return best_match.options.maxAge === 0 ? undefined : best_match.value;
|
|
70
91
|
}
|
|
71
92
|
|
|
72
93
|
const req_cookies = parse(header, { decode: opts?.decode });
|
|
@@ -98,15 +119,28 @@ export function get_cookies(request, url) {
|
|
|
98
119
|
getAll(opts) {
|
|
99
120
|
const cookies = parse(header, { decode: opts?.decode });
|
|
100
121
|
|
|
101
|
-
|
|
122
|
+
// Group cookies by name and find the most specific one for each name
|
|
123
|
+
const lookup = new Map();
|
|
124
|
+
|
|
125
|
+
for (const c of new_cookies.values()) {
|
|
102
126
|
if (
|
|
103
127
|
domain_matches(url.hostname, c.options.domain) &&
|
|
104
128
|
path_matches(url.pathname, c.options.path)
|
|
105
129
|
) {
|
|
106
|
-
|
|
130
|
+
const existing = lookup.get(c.name);
|
|
131
|
+
|
|
132
|
+
// If no existing cookie or this one has a more specific (longer) path, use this one
|
|
133
|
+
if (!existing || c.options.path.length > existing.options.path.length) {
|
|
134
|
+
lookup.set(c.name, c);
|
|
135
|
+
}
|
|
107
136
|
}
|
|
108
137
|
}
|
|
109
138
|
|
|
139
|
+
// Add the most specific cookies to the result
|
|
140
|
+
for (const c of lookup.values()) {
|
|
141
|
+
cookies[c.name] = c.value;
|
|
142
|
+
}
|
|
143
|
+
|
|
110
144
|
return Object.entries(cookies).map(([name, value]) => ({ name, value }));
|
|
111
145
|
},
|
|
112
146
|
|
|
@@ -172,8 +206,7 @@ export function get_cookies(request, url) {
|
|
|
172
206
|
};
|
|
173
207
|
|
|
174
208
|
// cookies previous set during this event with cookies.set have higher precedence
|
|
175
|
-
for (const
|
|
176
|
-
const cookie = new_cookies[key];
|
|
209
|
+
for (const cookie of new_cookies.values()) {
|
|
177
210
|
if (!domain_matches(destination.hostname, cookie.options.domain)) continue;
|
|
178
211
|
if (!path_matches(destination.pathname, cookie.options.path)) continue;
|
|
179
212
|
|
|
@@ -214,10 +247,13 @@ export function get_cookies(request, url) {
|
|
|
214
247
|
path = resolve(normalized_url, path);
|
|
215
248
|
}
|
|
216
249
|
|
|
217
|
-
|
|
250
|
+
// Generate unique key for cookie storage
|
|
251
|
+
const cookie_key = generate_cookie_key(options.domain, path, name);
|
|
252
|
+
const cookie = { name, value, options: { ...options, path } };
|
|
253
|
+
new_cookies.set(cookie_key, cookie);
|
|
218
254
|
|
|
219
255
|
if (__SVELTEKIT_DEV__) {
|
|
220
|
-
const serialized = serialize(name, value,
|
|
256
|
+
const serialized = serialize(name, value, cookie.options);
|
|
221
257
|
if (text_encoder.encode(serialized).byteLength > MAX_COOKIE_SIZE) {
|
|
222
258
|
throw new Error(`Cookie "${name}" is too large, and will be discarded by the browser`);
|
|
223
259
|
}
|
|
@@ -271,7 +307,7 @@ export function path_matches(path, constraint) {
|
|
|
271
307
|
|
|
272
308
|
/**
|
|
273
309
|
* @param {Headers} headers
|
|
274
|
-
* @param {import('./page/types.js').Cookie
|
|
310
|
+
* @param {MapIterator<import('./page/types.js').Cookie>} cookies
|
|
275
311
|
*/
|
|
276
312
|
export function add_cookies_to_headers(headers, cookies) {
|
|
277
313
|
for (const new_cookie of cookies) {
|
|
@@ -1,21 +1,11 @@
|
|
|
1
1
|
import { respond } from './respond.js';
|
|
2
|
-
import { set_private_env, set_public_env
|
|
2
|
+
import { set_private_env, set_public_env } from '../shared-server.js';
|
|
3
3
|
import { options, get_hooks } from '__SERVER__/internal.js';
|
|
4
4
|
import { DEV } from 'esm-env';
|
|
5
|
-
import {
|
|
6
|
-
import { prerendering } from '__sveltekit/environment';
|
|
5
|
+
import { filter_env } from '../../utils/env.js';
|
|
7
6
|
import { set_read_implementation, set_manifest } from '__sveltekit/server';
|
|
8
7
|
import { set_app } from './app.js';
|
|
9
8
|
|
|
10
|
-
/** @type {ProxyHandler<{ type: 'public' | 'private' }>} */
|
|
11
|
-
const prerender_env_handler = {
|
|
12
|
-
get({ type }, prop) {
|
|
13
|
-
throw new Error(
|
|
14
|
-
`Cannot read values from $env/dynamic/${type} while prerendering (attempted to read env.${prop.toString()}). Use $env/static/${type} instead`
|
|
15
|
-
);
|
|
16
|
-
}
|
|
17
|
-
};
|
|
18
|
-
|
|
19
9
|
/** @type {Promise<any>} */
|
|
20
10
|
let init_promise;
|
|
21
11
|
|
|
@@ -44,21 +34,10 @@ export class Server {
|
|
|
44
34
|
// been done already.
|
|
45
35
|
|
|
46
36
|
// set env, in case it's used in initialisation
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
const private_env = filter_private_env(env, prefixes);
|
|
53
|
-
const public_env = filter_public_env(env, prefixes);
|
|
54
|
-
|
|
55
|
-
set_private_env(
|
|
56
|
-
prerendering ? new Proxy({ type: 'private' }, prerender_env_handler) : private_env
|
|
57
|
-
);
|
|
58
|
-
set_public_env(
|
|
59
|
-
prerendering ? new Proxy({ type: 'public' }, prerender_env_handler) : public_env
|
|
60
|
-
);
|
|
61
|
-
set_safe_public_env(public_env);
|
|
37
|
+
const { env_public_prefix, env_private_prefix } = this.#options;
|
|
38
|
+
|
|
39
|
+
set_private_env(filter_env(env, env_private_prefix, env_public_prefix));
|
|
40
|
+
set_public_env(filter_env(env, env_public_prefix, env_private_prefix));
|
|
62
41
|
|
|
63
42
|
if (read) {
|
|
64
43
|
// Wrap the read function to handle MaybePromise<ReadableStream>
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { DEV } from 'esm-env';
|
|
2
|
+
import * as devalue from 'devalue';
|
|
2
3
|
import { disable_search, make_trackable } from '../../../utils/url.js';
|
|
3
4
|
import { validate_depends, validate_load_response } from '../../shared.js';
|
|
4
5
|
import { with_request_store, merge_tracing } from '@sveltejs/kit/internal/server';
|
|
5
6
|
import { record_span } from '../../telemetry/record_span.js';
|
|
6
|
-
import { get_node_type } from '../utils.js';
|
|
7
|
+
import { clarify_devalue_error, get_node_type } from '../utils.js';
|
|
7
8
|
import { base64_encode, text_decoder } from '../../utils.js';
|
|
9
|
+
import { NULL_BODY_STATUS } from '../constants.js';
|
|
8
10
|
|
|
9
11
|
/**
|
|
10
12
|
* Calls the user's server `load` function.
|
|
@@ -232,11 +234,38 @@ export async function load_data({
|
|
|
232
234
|
},
|
|
233
235
|
fn: async (current) => {
|
|
234
236
|
const traced_event = merge_tracing(event, current);
|
|
235
|
-
return await with_request_store({ event: traced_event, state: event_state }, () =>
|
|
236
|
-
|
|
237
|
+
return await with_request_store({ event: traced_event, state: event_state }, () => {
|
|
238
|
+
/** @type {Record<string, any> | null} */
|
|
239
|
+
let data = null;
|
|
240
|
+
|
|
241
|
+
return load.call(null, {
|
|
237
242
|
url: event.url,
|
|
238
243
|
params: event.params,
|
|
239
|
-
|
|
244
|
+
get data() {
|
|
245
|
+
if (data === null && server_data_node?.data != null) {
|
|
246
|
+
/** @type {Record<string, (value: any) => any>} */
|
|
247
|
+
const reducers = {};
|
|
248
|
+
|
|
249
|
+
/** @type {Record<string, (value: any) => any>} */
|
|
250
|
+
const revivers = {};
|
|
251
|
+
|
|
252
|
+
for (const key in event_state.transport) {
|
|
253
|
+
reducers[key] = event_state.transport[key].encode;
|
|
254
|
+
revivers[key] = event_state.transport[key].decode;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
// run it through devalue so that the developer can't accidentally mutate it
|
|
258
|
+
try {
|
|
259
|
+
data = devalue.parse(devalue.stringify(server_data_node.data, reducers), revivers);
|
|
260
|
+
} catch (e) {
|
|
261
|
+
// @ts-expect-error
|
|
262
|
+
e.path = e.path.slice(1);
|
|
263
|
+
throw new Error(clarify_devalue_error(event, /** @type {any} */ (e)));
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
return data;
|
|
268
|
+
},
|
|
240
269
|
route: event.route,
|
|
241
270
|
fetch: create_universal_fetch(event, state, fetched, csr, resolve_opts),
|
|
242
271
|
setHeaders: event.setHeaders,
|
|
@@ -244,8 +273,8 @@ export async function load_data({
|
|
|
244
273
|
parent,
|
|
245
274
|
untrack: (fn) => fn(),
|
|
246
275
|
tracing: traced_event.tracing
|
|
247
|
-
})
|
|
248
|
-
);
|
|
276
|
+
});
|
|
277
|
+
});
|
|
249
278
|
}
|
|
250
279
|
});
|
|
251
280
|
|
|
@@ -317,7 +346,7 @@ export function create_universal_fetch(event, state, fetched, csr, resolve_opts)
|
|
|
317
346
|
const proxy = new Proxy(response, {
|
|
318
347
|
get(response, key, _receiver) {
|
|
319
348
|
/**
|
|
320
|
-
* @param {string} body
|
|
349
|
+
* @param {string | undefined} body
|
|
321
350
|
* @param {boolean} is_b64
|
|
322
351
|
*/
|
|
323
352
|
async function push_fetched(body, is_b64) {
|
|
@@ -399,6 +428,11 @@ export function create_universal_fetch(event, state, fetched, csr, resolve_opts)
|
|
|
399
428
|
async function text() {
|
|
400
429
|
const body = await response.text();
|
|
401
430
|
|
|
431
|
+
if (body === '' && NULL_BODY_STATUS.includes(response.status)) {
|
|
432
|
+
await push_fetched(undefined, false);
|
|
433
|
+
return undefined;
|
|
434
|
+
}
|
|
435
|
+
|
|
402
436
|
if (!body || typeof body === 'string') {
|
|
403
437
|
await push_fetched(body, false);
|
|
404
438
|
}
|
|
@@ -416,7 +450,8 @@ export function create_universal_fetch(event, state, fetched, csr, resolve_opts)
|
|
|
416
450
|
|
|
417
451
|
if (key === 'json') {
|
|
418
452
|
return async () => {
|
|
419
|
-
|
|
453
|
+
const body = await text();
|
|
454
|
+
return body ? JSON.parse(body) : undefined;
|
|
420
455
|
};
|
|
421
456
|
}
|
|
422
457
|
|
|
@@ -9,7 +9,7 @@ import { s } from '../../../utils/misc.js';
|
|
|
9
9
|
import { Csp } from './csp.js';
|
|
10
10
|
import { uneval_action_response } from './actions.js';
|
|
11
11
|
import { clarify_devalue_error, handle_error_and_jsonify, serialize_uses } from '../utils.js';
|
|
12
|
-
import { public_env
|
|
12
|
+
import { public_env } from '../../shared-server.js';
|
|
13
13
|
import { create_async_iterator } from '../../../utils/streaming.js';
|
|
14
14
|
import { SVELTE_KIT_ASSETS } from '../../../constants.js';
|
|
15
15
|
import { SCHEME } from '../../../utils/url.js';
|
|
@@ -72,8 +72,18 @@ export async function render_response({
|
|
|
72
72
|
const stylesheets = new Set(client.stylesheets);
|
|
73
73
|
const fonts = new Set(client.fonts);
|
|
74
74
|
|
|
75
|
-
/**
|
|
76
|
-
|
|
75
|
+
/**
|
|
76
|
+
* The value of the Link header that is added to the response when not prerendering
|
|
77
|
+
* @type {Set<string>}
|
|
78
|
+
*/
|
|
79
|
+
const link_headers = new Set();
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* `<link>` tags that are added to prerendered responses
|
|
83
|
+
* (note that stylesheets are always added, prerendered or not)
|
|
84
|
+
* @type {Set<string>}
|
|
85
|
+
*/
|
|
86
|
+
const link_tags = new Set();
|
|
77
87
|
|
|
78
88
|
/** @type {Map<string, string>} */
|
|
79
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
|
|
@@ -264,8 +274,7 @@ export async function render_response({
|
|
|
264
274
|
attributes.push('disabled', 'media="(max-width: 0)"');
|
|
265
275
|
} else {
|
|
266
276
|
if (resolve_opts.preload({ type: 'css', path })) {
|
|
267
|
-
|
|
268
|
-
link_header_preloads.add(`<${encodeURI(path)}>; ${preload_atts.join(';')}; nopush`);
|
|
277
|
+
link_headers.add(`<${encodeURI(path)}>; rel="preload"; as="style"; nopush`);
|
|
269
278
|
}
|
|
270
279
|
}
|
|
271
280
|
|
|
@@ -277,15 +286,12 @@ export async function render_response({
|
|
|
277
286
|
|
|
278
287
|
if (resolve_opts.preload({ type: 'font', path })) {
|
|
279
288
|
const ext = dep.slice(dep.lastIndexOf('.') + 1);
|
|
280
|
-
const attributes = [
|
|
281
|
-
'rel="preload"',
|
|
282
|
-
'as="font"',
|
|
283
|
-
`type="font/${ext}"`,
|
|
284
|
-
`href="${path}"`,
|
|
285
|
-
'crossorigin'
|
|
286
|
-
];
|
|
287
289
|
|
|
288
|
-
|
|
290
|
+
link_tags.add(`<link rel="preload" as="font" type="font/${ext}" href="${path}" crossorigin>`);
|
|
291
|
+
|
|
292
|
+
link_headers.add(
|
|
293
|
+
`<${encodeURI(path)}>; rel="preload"; as="font"; type="font/${ext}"; crossorigin; nopush`
|
|
294
|
+
);
|
|
289
295
|
}
|
|
290
296
|
}
|
|
291
297
|
|
|
@@ -322,15 +328,22 @@ export async function render_response({
|
|
|
322
328
|
|
|
323
329
|
for (const path of included_modulepreloads) {
|
|
324
330
|
// see the kit.output.preloadStrategy option for details on why we have multiple options here
|
|
325
|
-
|
|
331
|
+
link_headers.add(`<${encodeURI(path)}>; rel="modulepreload"; nopush`);
|
|
332
|
+
|
|
326
333
|
if (options.preload_strategy !== 'modulepreload') {
|
|
327
334
|
head += `\n\t\t<link rel="preload" as="script" crossorigin="anonymous" href="${path}">`;
|
|
328
|
-
} else
|
|
329
|
-
|
|
335
|
+
} else {
|
|
336
|
+
link_tags.add(`<link rel="modulepreload" href="${path}">`);
|
|
330
337
|
}
|
|
331
338
|
}
|
|
332
339
|
}
|
|
333
340
|
|
|
341
|
+
if (state.prerendering && link_tags.size > 0) {
|
|
342
|
+
head += Array.from(link_tags)
|
|
343
|
+
.map((tag) => `\n\t\t${tag}`)
|
|
344
|
+
.join('');
|
|
345
|
+
}
|
|
346
|
+
|
|
334
347
|
// prerender a `/path/to/page/__route.js` module
|
|
335
348
|
if (manifest._.client.routes && state.prerendering && !state.prerendering.fallback) {
|
|
336
349
|
const pathname = add_resolution_suffix(event.url.pathname);
|
|
@@ -545,8 +558,8 @@ export async function render_response({
|
|
|
545
558
|
headers.set('content-security-policy-report-only', report_only_header);
|
|
546
559
|
}
|
|
547
560
|
|
|
548
|
-
if (
|
|
549
|
-
headers.set('link', Array.from(
|
|
561
|
+
if (link_headers.size) {
|
|
562
|
+
headers.set('link', Array.from(link_headers).join(', '));
|
|
550
563
|
}
|
|
551
564
|
}
|
|
552
565
|
|
|
@@ -558,7 +571,7 @@ export async function render_response({
|
|
|
558
571
|
body,
|
|
559
572
|
assets,
|
|
560
573
|
nonce: /** @type {string} */ (csp.nonce),
|
|
561
|
-
env:
|
|
574
|
+
env: public_env
|
|
562
575
|
});
|
|
563
576
|
|
|
564
577
|
// TODO flush chunks as early as we can
|
|
@@ -432,7 +432,7 @@ export async function internal_respond(request, options, manifest, state) {
|
|
|
432
432
|
response.headers.set(key, /** @type {string} */ (value));
|
|
433
433
|
}
|
|
434
434
|
|
|
435
|
-
add_cookies_to_headers(response.headers,
|
|
435
|
+
add_cookies_to_headers(response.headers, new_cookies.values());
|
|
436
436
|
|
|
437
437
|
if (state.prerendering && event.route.id !== null) {
|
|
438
438
|
response.headers.set('x-sveltekit-routeid', encodeURI(event.route.id));
|
|
@@ -507,7 +507,7 @@ export async function internal_respond(request, options, manifest, state) {
|
|
|
507
507
|
: route?.page && is_action_json_request(event)
|
|
508
508
|
? action_json_redirect(e)
|
|
509
509
|
: redirect_response(e.status, e.location);
|
|
510
|
-
add_cookies_to_headers(response.headers,
|
|
510
|
+
add_cookies_to_headers(response.headers, new_cookies.values());
|
|
511
511
|
return response;
|
|
512
512
|
}
|
|
513
513
|
return await handle_fatal_error(event, event_state, options, e);
|
|
@@ -682,7 +682,10 @@ export async function internal_respond(request, options, manifest, state) {
|
|
|
682
682
|
|
|
683
683
|
// we can't load the endpoint from our own manifest,
|
|
684
684
|
// so we need to make an actual HTTP request
|
|
685
|
-
|
|
685
|
+
const response = await fetch(request);
|
|
686
|
+
|
|
687
|
+
// clone the response so that headers are mutable (https://github.com/sveltejs/kit/issues/13857)
|
|
688
|
+
return new Response(response.body, response);
|
|
686
689
|
} catch (e) {
|
|
687
690
|
// TODO if `e` is instead named `error`, some fucked up Vite transformation happens
|
|
688
691
|
// and I don't even know how to describe it. need to investigate at some point
|
|
@@ -5,17 +5,11 @@
|
|
|
5
5
|
export let private_env = {};
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
|
-
* `$env/dynamic/public
|
|
8
|
+
* `$env/dynamic/public`
|
|
9
9
|
* @type {Record<string, string>}
|
|
10
10
|
*/
|
|
11
11
|
export let public_env = {};
|
|
12
12
|
|
|
13
|
-
/**
|
|
14
|
-
* The same as `public_env`, but without the proxy. Use for `%sveltekit.env.PUBLIC_FOO%`
|
|
15
|
-
* @type {Record<string, string>}
|
|
16
|
-
*/
|
|
17
|
-
export let safe_public_env = {};
|
|
18
|
-
|
|
19
13
|
/** @param {any} error */
|
|
20
14
|
export let fix_stack_trace = (error) => error?.stack;
|
|
21
15
|
|
|
@@ -29,11 +23,6 @@ export function set_public_env(environment) {
|
|
|
29
23
|
public_env = environment;
|
|
30
24
|
}
|
|
31
25
|
|
|
32
|
-
/** @type {(environment: Record<string, string>) => void} */
|
|
33
|
-
export function set_safe_public_env(environment) {
|
|
34
|
-
safe_public_env = environment;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
26
|
/** @param {(error: Error) => string} value */
|
|
38
27
|
export function set_fix_stack_trace(value) {
|
|
39
28
|
fix_stack_trace = value;
|
package/src/types/internal.d.ts
CHANGED
|
@@ -44,7 +44,6 @@ export interface ServerInternalModule {
|
|
|
44
44
|
set_private_env(environment: Record<string, string>): void;
|
|
45
45
|
set_public_env(environment: Record<string, string>): void;
|
|
46
46
|
set_read_implementation(implementation: (path: string) => ReadableStream): void;
|
|
47
|
-
set_safe_public_env(environment: Record<string, string>): void;
|
|
48
47
|
set_version(version: string): void;
|
|
49
48
|
set_fix_stack_trace(fix_stack_trace: (error: unknown) => string): void;
|
|
50
49
|
get_hooks: () => Promise<Record<string, any>>;
|
|
@@ -2,8 +2,6 @@ This module provides access to runtime environment variables, as defined by the
|
|
|
2
2
|
|
|
3
3
|
This module cannot be imported into client-side code.
|
|
4
4
|
|
|
5
|
-
Dynamic environment variables cannot be used during prerendering.
|
|
6
|
-
|
|
7
5
|
```ts
|
|
8
6
|
import { env } from '$env/dynamic/private';
|
|
9
7
|
console.log(env.DEPLOYMENT_SPECIFIC_VARIABLE);
|
|
@@ -2,8 +2,6 @@ Similar to [`$env/dynamic/private`](https://svelte.dev/docs/kit/$env-dynamic-pri
|
|
|
2
2
|
|
|
3
3
|
Note that public dynamic environment variables must all be sent from the server to the client, causing larger network requests — when possible, use `$env/static/public` instead.
|
|
4
4
|
|
|
5
|
-
Dynamic environment variables cannot be used during prerendering.
|
|
6
|
-
|
|
7
5
|
```ts
|
|
8
6
|
import { env } from '$env/dynamic/public';
|
|
9
7
|
console.log(env.PUBLIC_DEPLOYMENT_SPECIFIC_VARIABLE);
|
package/src/utils/env.js
CHANGED
|
@@ -1,33 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @param {Record<string, string>} env
|
|
3
|
-
* @param {
|
|
4
|
-
*
|
|
5
|
-
* private_prefix: string;
|
|
6
|
-
* }} prefixes
|
|
3
|
+
* @param {string} allowed
|
|
4
|
+
* @param {string} disallowed
|
|
7
5
|
* @returns {Record<string, string>}
|
|
8
6
|
*/
|
|
9
|
-
export function
|
|
7
|
+
export function filter_env(env, allowed, disallowed) {
|
|
10
8
|
return Object.fromEntries(
|
|
11
9
|
Object.entries(env).filter(
|
|
12
|
-
([k]) =>
|
|
13
|
-
k.startsWith(private_prefix) && (public_prefix === '' || !k.startsWith(public_prefix))
|
|
14
|
-
)
|
|
15
|
-
);
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* @param {Record<string, string>} env
|
|
20
|
-
* @param {{
|
|
21
|
-
* public_prefix: string;
|
|
22
|
-
* private_prefix: string;
|
|
23
|
-
* }} prefixes
|
|
24
|
-
* @returns {Record<string, string>}
|
|
25
|
-
*/
|
|
26
|
-
export function filter_public_env(env, { public_prefix, private_prefix }) {
|
|
27
|
-
return Object.fromEntries(
|
|
28
|
-
Object.entries(env).filter(
|
|
29
|
-
([k]) =>
|
|
30
|
-
k.startsWith(public_prefix) && (private_prefix === '' || !k.startsWith(private_prefix))
|
|
10
|
+
([k]) => k.startsWith(allowed) && (disallowed === '' || !k.startsWith(disallowed))
|
|
31
11
|
)
|
|
32
12
|
);
|
|
33
13
|
}
|
package/src/version.js
CHANGED
package/types/index.d.ts
CHANGED
|
@@ -2770,7 +2770,7 @@ declare module '$app/paths' {
|
|
|
2770
2770
|
* import { asset } from '$app/paths';
|
|
2771
2771
|
* </script>
|
|
2772
2772
|
*
|
|
2773
|
-
* <img alt="a potato" src={asset('potato.jpg')} />
|
|
2773
|
+
* <img alt="a potato" src={asset('/potato.jpg')} />
|
|
2774
2774
|
* ```
|
|
2775
2775
|
* @since 2.26
|
|
2776
2776
|
*/
|
package/types/index.d.ts.map
CHANGED
|
@@ -187,6 +187,6 @@
|
|
|
187
187
|
null,
|
|
188
188
|
null
|
|
189
189
|
],
|
|
190
|
-
"mappings": "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
|
|
190
|
+
"mappings": "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",
|
|
191
191
|
"ignoreList": []
|
|
192
192
|
}
|