@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sveltejs/kit",
3
- "version": "2.33.1",
3
+ "version": "2.34.1",
4
4
  "description": "SvelteKit is the fastest way to build Svelte apps",
5
5
  "keywords": [
6
6
  "framework",
@@ -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 { filter_private_env, filter_public_env } from '../../utils/env.js';
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 = filter_private_env(env, { public_prefix, private_prefix });
60
- const public_env = filter_public_env(env, { public_prefix, private_prefix });
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(): ${manifest_data.assets.map((asset) => s('/' + asset.file)).join(' | ') || 'never'};`,
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, set_safe_public_env } from '${runtime_directory}/shared-server.js';
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, set_safe_public_env };
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 { filter_private_env, filter_public_env } from '../../utils/env.js';
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: filter_public_env(env, { public_prefix, private_prefix }),
75
- private: filter_private_env(env, { public_prefix, private_prefix })
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 {Record<string, import('./page/types.js').Cookie>} */
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
- const c = new_cookies[name];
64
- if (
65
- c &&
66
- domain_matches(url.hostname, c.options.domain) &&
67
- path_matches(url.pathname, c.options.path)
68
- ) {
69
- return c.value;
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
- for (const c of Object.values(new_cookies)) {
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
- cookies[c.name] = c.value;
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 key in new_cookies) {
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
- new_cookies[name] = { name, value, options: { ...options, path } };
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, new_cookies[name].options);
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[]} cookies
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, set_safe_public_env } from '../shared-server.js';
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 { filter_private_env, filter_public_env } from '../../utils/env.js';
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 prefixes = {
48
- public_prefix: this.#options.env_public_prefix,
49
- private_prefix: this.#options.env_private_prefix
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
- load.call(null, {
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
- data: server_data_node?.data ?? null,
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
- return JSON.parse(await text());
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, safe_public_env } from '../../shared-server.js';
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
- /** @type {Set<string>} */
76
- const link_header_preloads = new Set();
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
- const preload_atts = ['rel="preload"', 'as="style"'];
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
- head += `\n\t\t<link ${attributes.join(' ')}>`;
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
- link_header_preloads.add(`<${encodeURI(path)}>; rel="modulepreload"; nopush`);
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 if (state.prerendering) {
329
- head += `\n\t\t<link rel="modulepreload" href="${path}">`;
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 (link_header_preloads.size) {
549
- headers.set('link', Array.from(link_header_preloads).join(', '));
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: safe_public_env
574
+ env: public_env
562
575
  });
563
576
 
564
577
  // TODO flush chunks as early as we can
@@ -6,7 +6,7 @@ export interface Fetched {
6
6
  method: string;
7
7
  request_body?: string | ArrayBufferView | null;
8
8
  request_headers?: HeadersInit | undefined;
9
- response_body: string;
9
+ response_body: string | undefined;
10
10
  response: Response;
11
11
  is_b64?: boolean;
12
12
  }
@@ -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, Object.values(new_cookies));
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, Object.values(new_cookies));
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
- return await fetch(request);
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`. When prerendering, this will be a proxy that forbids reads
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;
@@ -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
- * public_prefix: string;
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 filter_private_env(env, { public_prefix, private_prefix }) {
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
@@ -1,4 +1,4 @@
1
1
  // generated during release, do not modify
2
2
 
3
3
  /** @type {string} */
4
- export const VERSION = '2.33.1';
4
+ export const VERSION = '2.34.1';
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
  */
@@ -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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAqjBdC,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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAgCrBC,cAAcA;;kBAETC,UAAUA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAoCVC,cAAcA;;;;;;;;;;kBAUdC,UAAUA;;;;;;;;;;;;;;;;;;kBAkBVC,aAAaA;;;;;;;;;;;;;;;;;;;kBAmBbC,IAAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aA8CTC,YAAYA;;kBAEPC,YAAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aA+GjBC,cAAcA;;;;;kBAKTC,cAAcA;;;;;;;;;;;;;;;;;;;;;;;kBAuBdC,eAAeA;;;;;;;;;;;;;;;cAenBC,MAAMA;;;;;;kBAMFC,iBAAiBA;;;;;;;kBAOjBC,WAAWA;;;;;;;;;;;;;;;;;;;;;;;;;aAyBhBC,UAAUA;;;;;;;kBAOLC,eAAeA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAkFpBC,MAAMA;;;;;;;;;;aAUNC,OAAOA;;;;;;;;;;;;;;;;aAgBPC,YAAYA;;;;;;;;;;;;kBC7lDXC,SAASA;;;;;;;;;;kBAqBTC,QAAQA;;;;;;;aDqmDTC,cAAcA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA6BTC,QAAQA;;;;;;;;aAQbC,UAAUA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAoEVC,aAAaA;;;;;;;;aAQbC,cAAcA;;;;;;;;;;;;;;;;;;aAkBdC,WAAWA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA8BNC,mBAAmBA;;;;;;;;aAQxBC,uBAAuBA;;;;;aAKvBC,mBAAmBA;WElyDdC,YAAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAkDZC,GAAGA;;;;;;;;;;;;;;;;;;;;;WAqBHC,aAAaA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAmElBC,UAAUA;;WAELC,MAAMA;;;;;;;;;MASXC,YAAYA;;WAEPC,WAAWA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAmCXC,yBAAyBA;;;;;;;;;;WAUzBC,yBAAyBA;;;;WAIzBC,sCAAsCA;;;;WAItCC,4BAA4BA;;;;MAIjCC,8BAA8BA;MAC9BC,8BAA8BA;MAC9BC,iCAAiCA;;;;;MAKjCC,2CAA2CA;;;;;;aAM3CC,eAAeA;;WAIVC,cAAcA;;;;;WAKdC,YAAYA;;;;;;MAMjBC,aAAaA;WC9LRC,KAAKA;;;;;;WAeLC,SAASA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAuHTC,YAAYA;;;;;;;;;;;;;;;;;WAiBZC,QAAQA;;;;;;;;;;;;;;MAgCbC,iBAAiBA;;;;;;;;;WAWZC,UAAUA;;;;;;;;;;;;;WAaVC,SAASA;;;;;;;;;;;;;;;;;;;;;;;WAsHTC,YAAYA;;;;;;;;;;;;;;;;MAgBjBC,kBAAkBA;;WAEbC,aAAaA;;;;;;;;;;WAUbC,UAAUA;;;;;;;;;;;WAWVC,OAAOA;;;;;;;;;;;;;;;;;;;;;;;MAuBZC,aAAaA;;WA4BRC,eAAeA;;;;;;MAMpBC,uBAAuBA;;MAGvBC,WAAWA;;;;;;;;WAQNC,QAAQA;;;;;;;;;WASRC,cAAcA;;;;;;;;;MA+CnBC,eAAeA;;;;;MAKfC,kBAAkBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBC1cdC,WAAWA;;;;;;;;;;;;;;;;;;;iBAsBXC,QAAQA;;;;;iBAiBRC,UAAUA;;;;;;iBASVC,IAAIA;;;;;;iBA4BJC,IAAIA;;;;;;;;;;;;;;;;iBAkDJC,eAAeA;;;;;;;;;;;;;;iBAmBfC,YAAYA;;;;;;;cCrOfC,OAAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBC4EJC,QAAQA;;;;;;iBC4BFC,UAAUA;;;;;;iBAkCVC,WAAWA;;;;;iBAgFjBC,oBAAoBA;;;;;;;;;;;iBC3MpBC,gBAAgBA;;;;;;;;;iBCuHVC,SAASA;;;;;;;;;cCtIlBC,OAAOA;;;;;cAKPC,GAAGA;;;;;cAKHC,QAAQA;;;;;cAKRC,OAAOA;;;;;;;;;;;;;;;;;;;;;;;;iBCYJC,WAAWA;;;;;;;;;;;;;;;;;;;;;;;;iBAgDXC,OAAOA;;;;;;;iBCmmEDC,WAAWA;;;;;;;;;;;iBA9UjBC,aAAaA;;;;;;;;;;;;iBAiBbC,cAAcA;;;;;;;;;;iBAedC,UAAUA;;;;;iBASVC,qBAAqBA;;;;;;;;;;iBA8BrBC,IAAIA;;;;;;;;;;;;;;;;;;;;;;;;;iBAsCJC,UAAUA;;;;iBA0BVC,aAAaA;;;;;iBAebC,UAAUA;;;;;;;;;;;;;;iBAqBJC,WAAWA;;;;;;;;;;;;;;;;;;iBAoCXC,WAAWA;;;;;iBAsCjBC,SAASA;;;;;iBA+CTC,YAAYA;MV5+DhBlE,YAAYA;;;;;;;;;;;;;;YWlJbmE,IAAIA;;;;;;;;;YASJC,MAAMA;;MAEZC,WAAWA;;;;;;;;;;;;;;;;;;;;;;;;;iBAyBAC,OAAOA;;;;;;;;;;;;;;;;;iBAiBPC,KAAKA;;;;;iBAKLC,YAAYA;;;;;;;;;;;;;;;;;;;;;;iBChDZC,IAAIA;;;;;;;;iBCOJC,eAAeA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBCTfC,IAAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MbycRC,8BAA8BA;MD/T9B5E,YAAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ce1GX6E,IAAIA;;;;;cAQJC,UAAUA;;;;;;;;;;;cAMVC,OAAOA;;;;;;;;;iBCrDPC,SAASA;;;;;;;;;;;;;;;cAyBTH,IAAIA;;;;;;;;;;cAiBJC,UAAUA;;;;;;;;cAeVC,OAAOA",
190
+ "mappings": "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",
191
191
  "ignoreList": []
192
192
  }