@sveltejs/kit 2.63.0 → 2.64.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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sveltejs/kit",
3
- "version": "2.63.0",
3
+ "version": "2.64.0",
4
4
  "description": "SvelteKit is the fastest way to build Svelte apps",
5
5
  "keywords": [
6
6
  "framework",
@@ -33,6 +33,7 @@ export default function create_manifest_data({
33
33
  const matchers = create_matchers(config, cwd);
34
34
  const { nodes, routes } = create_routes_and_nodes(cwd, config, fallback);
35
35
 
36
+ // validate matcher names used in parameterised routes
36
37
  for (const route of routes) {
37
38
  for (const param of route.params) {
38
39
  if (param.matcher && !matchers[param.matcher]) {
@@ -51,6 +52,7 @@ export default function create_manifest_data({
51
52
  }
52
53
 
53
54
  /**
55
+ * Returns a list of files in the `static` directory.
54
56
  * @param {import('types').ValidatedConfig} config
55
57
  */
56
58
  export function create_assets(config) {
@@ -131,6 +133,7 @@ function create_routes_and_nodes(cwd, config, fallback) {
131
133
  /** @type {import('types').PageNode[]} */
132
134
  const nodes = [];
133
135
 
136
+ // create route data by processing files in `src/routes`
134
137
  if (fs.existsSync(config.kit.files.routes)) {
135
138
  /**
136
139
  * @param {number} depth
@@ -390,6 +393,7 @@ function create_routes_and_nodes(cwd, config, fallback) {
390
393
 
391
394
  prevent_conflicts(routes);
392
395
 
396
+ // fallback root layout and root error components
393
397
  const root = routes[0];
394
398
 
395
399
  if (!root.layout?.component) {
@@ -398,10 +402,11 @@ function create_routes_and_nodes(cwd, config, fallback) {
398
402
  }
399
403
 
400
404
  if (!root.error?.component) {
401
- if (!root.error) root.error = { depth: 0 };
405
+ if (!root.error) root.error = { depth: 0, parent: root.layout };
402
406
  root.error.component = posixify(path.relative(cwd, `${fallback}/error.svelte`));
403
407
  }
404
408
 
409
+ // populate the page nodes list
405
410
  // we do layouts/errors first as they are more likely to be reused,
406
411
  // and smaller indexes take fewer bytes. also, this guarantees that
407
412
  // the default error/layout are 0/1
@@ -423,6 +428,7 @@ function create_routes_and_nodes(cwd, config, fallback) {
423
428
 
424
429
  const node_analyser = create_node_analyser();
425
430
 
431
+ // add the related layout, page, and error nodes for a route
426
432
  for (const route of routes) {
427
433
  if (!route.leaf) continue;
428
434
 
@@ -467,6 +473,22 @@ function create_routes_and_nodes(cwd, config, fallback) {
467
473
  }
468
474
  }
469
475
 
476
+ // add parents to error nodes so that we can compute which page options apply to them
477
+ for (const route of routes) {
478
+ if (!route.error) continue;
479
+
480
+ /** @type {import('types').RouteData | null} */
481
+ let current_route = route;
482
+ while (current_route) {
483
+ if (current_route.layout) {
484
+ route.error.parent = current_route.layout;
485
+ break;
486
+ }
487
+ current_route = current_route.parent;
488
+ }
489
+ }
490
+
491
+ // compute the final page options for each page node
470
492
  for (const node of nodes) {
471
493
  node.page_options = node_analyser.get_page_options(node);
472
494
  }
@@ -484,6 +506,7 @@ function create_routes_and_nodes(cwd, config, fallback) {
484
506
  }
485
507
 
486
508
  /**
509
+ * Determine if and how the file is relevant to the routing system.
487
510
  * @param {string} project_relative
488
511
  * @param {string} file
489
512
  * @param {string[]} component_extensions
@@ -1,6 +1,7 @@
1
1
  /** @import { EnvVarConfig } from '@sveltejs/kit' */
2
2
  import path from 'node:path';
3
3
  import { create_explicit_env_types } from '../env.js';
4
+ import { posixify } from '../../utils/filesystem.js';
4
5
  import { write_if_changed } from './utils.js';
5
6
 
6
7
  const DOCS = '// See https://svelte.dev/docs/kit/environment-variables for more information';
@@ -18,7 +19,7 @@ export function write_env(kit, entry, env_config) {
18
19
  const out = path.join(kit.outDir, 'env.d.ts');
19
20
 
20
21
  if (entry && env_config) {
21
- const relative = path.relative(kit.outDir, entry);
22
+ const relative = posixify(path.relative(kit.outDir, entry));
22
23
  content.push(
23
24
  `// This file is generated from ${relative}.\n${DOCS}`,
24
25
  create_explicit_env_types(env_config, relative, 'private'),
@@ -1,7 +1,7 @@
1
1
  /** @import { StandardSchemaV1 } from '@standard-schema/spec' */
2
2
  /** @import { EnvVarConfig } from '@sveltejs/kit' */
3
3
 
4
- import { stackless } from '../vite/utils.js';
4
+ import { stackless } from '../../utils/error.js';
5
5
 
6
6
  const MISSING = {
7
7
  message: `Value is missing. If it is optional, add a Standard Schema validator declaring it as such.`
@@ -478,7 +478,7 @@ export interface KitConfig {
478
478
  experimental?: {
479
479
  /**
480
480
  * Whether to enable explicit environment variables using `src/env.js` or `src/env.ts`.
481
- * @since 2.62.0
481
+ * @since 2.63.0
482
482
  * @default false
483
483
  */
484
484
  explicitEnvironmentVariables?: boolean;
@@ -152,7 +152,11 @@ export function build_server_nodes(
152
152
  /** @type {Set<string>} */
153
153
  const eager_assets = new Set();
154
154
 
155
- if (node.component && client_manifest) {
155
+ const uses_server_component = node.child_pages
156
+ ? node.child_pages.some((child) => child.page_options?.ssr !== false)
157
+ : node.page_options?.ssr !== false;
158
+
159
+ if (node.component && client_manifest && uses_server_component) {
156
160
  exports.push(
157
161
  'let component_cache;',
158
162
  `export const component = async () => component_cache ??= (await import('../${
@@ -29,13 +29,8 @@ import { build_service_worker } from './build/build_service_worker.js';
29
29
  import { assets_base, find_deps, resolve_symlinks } from './build/utils.js';
30
30
  import { dev } from './dev/index.js';
31
31
  import { preview } from './preview/index.js';
32
- import {
33
- error_for_missing_config,
34
- get_config_aliases,
35
- get_env,
36
- normalize_id,
37
- stackless
38
- } from './utils.js';
32
+ import { error_for_missing_config, get_config_aliases, get_env, normalize_id } from './utils.js';
33
+ import { stackless } from '../../utils/error.js';
39
34
  import { write_client_manifest } from '../../core/sync/write_client_manifest.js';
40
35
  import prerender from '../../core/postbuild/prerender.js';
41
36
  import analyse from '../../core/postbuild/analyse.js';
@@ -1,8 +1,9 @@
1
+ /** @import { PageOptions } from './types.js' */
1
2
  import { tsPlugin } from '@sveltejs/acorn-typescript';
2
3
  import { Parser } from 'acorn';
3
4
  import { read } from '../../../utils/filesystem.js';
4
5
 
5
- const valid_page_options_array = /** @type {const} */ ([
6
+ export const valid_page_options_array = /** @type {const} */ ([
6
7
  'ssr',
7
8
  'prerender',
8
9
  'csr',
@@ -15,9 +16,6 @@ const valid_page_options_array = /** @type {const} */ ([
15
16
  /** @type {Set<string>} */
16
17
  const valid_page_options = new Set(valid_page_options_array);
17
18
 
18
- /** @typedef {typeof valid_page_options_array[number]} ValidPageOption */
19
- /** @typedef {Partial<Record<ValidPageOption, any>>} PageOptions */
20
-
21
19
  const skip_parsing_regex = new RegExp(
22
20
  `${Array.from(valid_page_options).join('|')}|(?:export[\\s\\n]+\\*[\\s\\n]+from)`
23
21
  );
@@ -0,0 +1,14 @@
1
+ import type { PrerenderOption, TrailingSlash } from 'types';
2
+ import type { valid_page_options_array } from './index.js';
3
+
4
+ type ValidPageOption = (typeof valid_page_options_array)[number];
5
+
6
+ export type PageOptions = Partial<{
7
+ [K in ValidPageOption]: K extends 'ssr' | 'csr'
8
+ ? boolean
9
+ : K extends 'prerender'
10
+ ? PrerenderOption
11
+ : K extends 'trailingSlash'
12
+ ? TrailingSlash
13
+ : any;
14
+ }>;
@@ -4,6 +4,7 @@ import { posixify } from '../../utils/filesystem.js';
4
4
  import { negotiate } from '../../utils/http.js';
5
5
  import { filter_env } from '../../utils/env.js';
6
6
  import { escape_html } from '../../utils/escape.js';
7
+ import { stackless } from '../../utils/error.js';
7
8
  import { dedent } from '../../core/sync/utils.js';
8
9
  import {
9
10
  app_server,
@@ -184,18 +185,6 @@ export function normalize_id(id, lib, cwd) {
184
185
  return posixify(id);
185
186
  }
186
187
 
187
- /**
188
- * For times when you need to throw an error, but without
189
- * displaying a useless stack trace (since the developer
190
- * can't do anything useful with it)
191
- * @param {string} message
192
- */
193
- export function stackless(message) {
194
- const error = new Error(message);
195
- error.stack = '';
196
- return error;
197
- }
198
-
199
188
  export const strip_virtual_prefix = /** @param {string} id */ (id) => id.replace('\0virtual:', '');
200
189
 
201
190
  /**
@@ -1,10 +1,8 @@
1
+ import { dev } from '../env/index.js';
1
2
  export * from '../env/index.js';
2
3
 
3
- if (__SVELTEKIT_EXPERIMENTAL_EXPLICIT_ENVIRONMENT_VARIABLES__) {
4
- throw new Error(
5
- 'Cannot import `$app/environment` when `experimental.explicitEnvironmentVariables` is enabled. Use `$app/env` instead.'
4
+ if (dev && __SVELTEKIT_EXPERIMENTAL_EXPLICIT_ENVIRONMENT_VARIABLES__) {
5
+ console.warn(
6
+ 'Use `$app/env` instead of `$app/environment` when `experimental.explicitEnvironmentVariables` is enabled'
6
7
  );
7
8
  }
8
-
9
- // force the Vite client to load, so that defines are definitely defined
10
- import.meta.hot;
@@ -1,42 +1,15 @@
1
+ import { read_stream } from './stream.js';
2
+
1
3
  /**
2
4
  * Yields parsed JSON objects from a ReadableStream of newline-delimited JSON.
3
5
  * Each yielded value is the raw `JSON.parse`'d object — callers handle deserialization.
4
6
  * @param {ReadableStreamDefaultReader<Uint8Array>} reader
5
7
  */
6
8
  export async function* read_ndjson(reader) {
7
- let done = false;
8
- let buffer = '';
9
- const decoder = new TextDecoder();
10
-
11
- while (true) {
12
- let split = buffer.indexOf('\n');
13
- while (split !== -1) {
14
- const line = buffer.slice(0, split).trim();
15
- buffer = buffer.slice(split + 1);
16
-
17
- if (line) {
18
- yield JSON.parse(line);
19
- }
20
-
21
- split = buffer.indexOf('\n');
22
- }
23
-
24
- if (done) {
25
- const line = buffer.trim();
26
- if (line) {
27
- yield JSON.parse(line);
28
- }
29
- return;
30
- }
31
-
32
- const chunk = await reader.read();
33
- done = chunk.done;
34
- if (chunk.value) {
35
- buffer += decoder.decode(chunk.value, { stream: true });
36
- }
37
-
38
- if (done) {
39
- buffer += decoder.decode();
9
+ for await (const block of read_stream(reader, '\n')) {
10
+ const line = block.trim();
11
+ if (line) {
12
+ yield JSON.parse(line);
40
13
  }
41
14
  }
42
15
  }
@@ -4,7 +4,7 @@ import { app_dir, base } from '$app/paths/internal/client';
4
4
  import * as devalue from 'devalue';
5
5
  import { HttpError } from '@sveltejs/kit/internal';
6
6
  import { app } from '../client.js';
7
- import { stringify_remote_arg } from '../../shared.js';
7
+ import { stringify_command_arg } from '../../shared.js';
8
8
  import {
9
9
  get_remote_request_headers,
10
10
  apply_refreshes,
@@ -56,7 +56,7 @@ export function command(id) {
56
56
  const response = await fetch(`${base}/${app_dir}/remote/${id}`, {
57
57
  method: 'POST',
58
58
  body: JSON.stringify({
59
- payload: stringify_remote_arg(arg, app.hooks.transport, false),
59
+ payload: await stringify_command_arg(arg, app.hooks.transport),
60
60
  refreshes: Array.from(refreshes ?? [])
61
61
  }),
62
62
  headers
@@ -4,21 +4,28 @@ import { get_remote_request_headers, handle_side_channel_response } from '../sha
4
4
  import * as devalue from 'devalue';
5
5
  import { HttpError } from '@sveltejs/kit/internal';
6
6
  import { noop } from '../../../../utils/functions.js';
7
- import { read_ndjson } from '../../ndjson.js';
7
+ import { read_sse } from '../../sse.js';
8
8
 
9
9
  /**
10
- * @param {Response} response
11
- * @returns {Promise<ReadableStreamDefaultReader<Uint8Array>>}
10
+ * @template T
11
+ * @param {string} id
12
+ * @param {string} payload
13
+ * @param {AbortController} [controller]
14
+ * @param {() => void} [on_connect]
15
+ * @returns {AsyncGenerator<T>}
12
16
  */
13
- async function get_stream_reader(response) {
14
- const content_type = response.headers.get('content-type') ?? '';
17
+ export async function* create_live_iterator(
18
+ id,
19
+ payload,
20
+ controller = new AbortController(),
21
+ on_connect = noop
22
+ ) {
23
+ const url = `${base}/${app_dir}/remote/${id}${payload ? `?payload=${payload}` : ''}`;
15
24
 
16
- if (response.ok && content_type.includes('application/json')) {
17
- // we can end up here if we e.g. redirect in `handle`
18
- const result = await response.json();
19
- await handle_side_channel_response(result);
20
- throw new HttpError(500, 'Invalid query.live response');
21
- }
25
+ const response = await fetch(url, {
26
+ headers: get_remote_request_headers(),
27
+ signal: controller.signal
28
+ });
22
29
 
23
30
  if (!response.ok) {
24
31
  const result = await response.json().catch(() => ({
@@ -30,60 +37,34 @@ async function get_stream_reader(response) {
30
37
  throw new HttpError(result.status ?? response.status ?? 500, result.error);
31
38
  }
32
39
 
33
- if (!response.body) {
34
- throw new Error('Expected query.live response body to be a ReadableStream');
40
+ if (response.headers.get('content-type')?.includes('application/json')) {
41
+ // we can end up here if we e.g. redirect in `handle`
42
+ const result = await response.json();
43
+ await handle_side_channel_response(result);
44
+ throw new HttpError(500, 'Invalid query.live response');
35
45
  }
36
46
 
37
- return response.body.getReader();
38
- }
39
-
40
- /**
41
- * Yields deserialized results from a ReadableStream of newline-delimited JSON
42
- * @param {ReadableStreamDefaultReader<Uint8Array>} reader
43
- */
44
- async function* read_live_ndjson(reader) {
45
- for await (const node of read_ndjson(reader)) {
46
- if (node.type === 'result') {
47
- yield devalue.parse(node.result, app.decoders);
48
- continue;
49
- }
50
-
51
- await handle_side_channel_response(node);
52
- throw new HttpError(500, 'Invalid query.live response');
47
+ if (!response.body) {
48
+ throw new Error('Expected query.live response body to be a ReadableStream');
53
49
  }
54
- }
55
50
 
56
- /**
57
- * @template T
58
- * @param {string} id
59
- * @param {string} payload
60
- * @param {AbortController} [controller]
61
- * @param {() => void} [on_connect]
62
- * @returns {AsyncGenerator<T>}
63
- */
64
- export async function* create_live_iterator(
65
- id,
66
- payload,
67
- controller = new AbortController(),
68
- on_connect = noop
69
- ) {
70
- const url = `${base}/${app_dir}/remote/${id}${payload ? `?payload=${payload}` : ''}`;
71
- /** @type {ReadableStreamDefaultReader<Uint8Array> | null} */
72
- let reader = null;
51
+ const reader = response.body.getReader();
73
52
 
74
53
  try {
75
- const response = await fetch(url, {
76
- headers: get_remote_request_headers(),
77
- signal: controller.signal
78
- });
79
- reader = await get_stream_reader(response);
80
-
81
54
  on_connect();
82
55
 
83
- yield* read_live_ndjson(reader);
56
+ for await (const node of read_sse(reader)) {
57
+ if (node.type === 'result') {
58
+ yield devalue.parse(node.result, app.decoders);
59
+ continue;
60
+ }
61
+
62
+ await handle_side_channel_response(node);
63
+ throw new HttpError(500, 'Invalid query.live response');
64
+ }
84
65
  } finally {
85
66
  try {
86
- await reader?.cancel();
67
+ await reader.cancel();
87
68
  } catch {
88
69
  // already closed
89
70
  }
@@ -0,0 +1,32 @@
1
+ import { read_stream } from './stream.js';
2
+
3
+ /**
4
+ * @param {string} block
5
+ * @returns {string | undefined}
6
+ */
7
+ function parse_sse_event_data(block) {
8
+ const lines = block.split('\n');
9
+ let data = '';
10
+
11
+ for (const line of lines) {
12
+ if (line.startsWith('data:')) {
13
+ data += (data ? '\n' : '') + line.slice(5).trimStart();
14
+ }
15
+ }
16
+
17
+ return data || undefined;
18
+ }
19
+
20
+ /**
21
+ * Yields parsed JSON objects from a ReadableStream of Server-Sent Events.
22
+ * Each yielded value is the raw `JSON.parse`'d object from a `data:` field.
23
+ * @param {ReadableStreamDefaultReader<Uint8Array>} reader
24
+ */
25
+ export async function* read_sse(reader) {
26
+ for await (const block of read_stream(reader, '\n\n')) {
27
+ const data = parse_sse_event_data(block);
28
+ if (data) {
29
+ yield JSON.parse(data);
30
+ }
31
+ }
32
+ }
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Reads from a stream, decoding it as text and yielding each block of content
3
+ * separated by `delimiter`. The trailing block (if any) is yielded once the
4
+ * stream closes.
5
+ * @param {ReadableStreamDefaultReader<Uint8Array>} reader
6
+ * @param {string} delimiter
7
+ */
8
+ export async function* read_stream(reader, delimiter) {
9
+ let done = false;
10
+ let buffer = '';
11
+ const decoder = new TextDecoder();
12
+
13
+ while (true) {
14
+ let split = buffer.indexOf(delimiter);
15
+ while (split !== -1) {
16
+ yield buffer.slice(0, split);
17
+ buffer = buffer.slice(split + delimiter.length);
18
+ split = buffer.indexOf(delimiter);
19
+ }
20
+
21
+ if (done) {
22
+ if (buffer) {
23
+ yield buffer;
24
+ }
25
+ return;
26
+ }
27
+
28
+ const chunk = await reader.read();
29
+ done = chunk.done;
30
+ if (chunk.value) {
31
+ buffer += decoder.decode(chunk.value, { stream: true });
32
+ }
33
+
34
+ if (done) {
35
+ buffer += decoder.decode();
36
+ }
37
+ }
38
+ }
@@ -634,8 +634,11 @@ export async function render_response({
634
634
  }`);
635
635
  }
636
636
 
637
+ // we need to eagerly import the Vite client module in development to ensure
638
+ // that Vite global constant replacements are initialised before our code runs
637
639
  const init_app = `
638
640
  {
641
+ ${DEV ? `import('${paths.base}/@vite/client')` : ''}
639
642
  ${blocks.join('\n\n\t\t\t\t\t')}
640
643
  }
641
644
  `;
@@ -170,7 +170,7 @@ async function handle_remote_call_internal(event, state, options, manifest, id)
170
170
  * @param {any} payload
171
171
  */
172
172
  function send(controller, payload) {
173
- controller.enqueue(encoder.encode(JSON.stringify(payload) + '\n'));
173
+ controller.enqueue(encoder.encode('data: ' + JSON.stringify(payload) + '\n\n'));
174
174
  }
175
175
 
176
176
  let closed = false;
@@ -245,7 +245,7 @@ async function handle_remote_call_internal(event, state, options, manifest, id)
245
245
  {
246
246
  headers: {
247
247
  'cache-control': 'private, no-store',
248
- 'content-type': 'application/x-ndjson'
248
+ 'content-type': 'text/event-stream'
249
249
  }
250
250
  }
251
251
  );
@@ -97,6 +97,8 @@ function to_sorted(value, clones) {
97
97
  const remote_object = '__skrao';
98
98
  const remote_map = '__skram';
99
99
  const remote_set = '__skras';
100
+ const remote_file = '__skraf';
101
+ const remote_promise_guard = '__skrap';
100
102
  const remote_regex_guard = '__skrag';
101
103
  const remote_arg_marker = Symbol(remote_object);
102
104
 
@@ -108,13 +110,12 @@ const remote_arg_marker = Symbol(remote_object);
108
110
  function create_remote_arg_reducers(transport, sort, remote_arg_clones) {
109
111
  /** @type {Record<string, (value: unknown) => unknown>} */
110
112
  const remote_fns_reducers = {
111
- [remote_regex_guard]:
112
- /** @type {(value: unknown) => void} */
113
- (value) => {
114
- if (value instanceof RegExp) {
115
- throw new Error('Regular expressions are not valid remote function arguments');
116
- }
113
+ /** @param {unknown} value */
114
+ [remote_regex_guard]: (value) => {
115
+ if (value instanceof RegExp) {
116
+ throw new Error('Regular expressions are not valid remote function arguments');
117
117
  }
118
+ }
118
119
  };
119
120
 
120
121
  if (sort) {
@@ -230,6 +231,24 @@ function create_remote_arg_revivers(transport) {
230
231
  }
231
232
 
232
233
  return set;
234
+ },
235
+ /** @type {(value: any) => File} */
236
+ [remote_file]: (value) => {
237
+ if (
238
+ !value ||
239
+ typeof value !== 'object' ||
240
+ typeof value.name !== 'string' ||
241
+ typeof value.type !== 'string' ||
242
+ typeof value.size !== 'number' ||
243
+ typeof value.lastModified !== 'number' ||
244
+ !(value.data instanceof ArrayBuffer)
245
+ ) {
246
+ throw new Error('Invalid data for File reviver');
247
+ }
248
+
249
+ const { data, name, ...meta } = value;
250
+
251
+ return new File([data], name, meta);
233
252
  }
234
253
  };
235
254
 
@@ -250,18 +269,69 @@ function create_remote_arg_revivers(transport) {
250
269
  * it is both a valid URL and a valid file name (necessary for prerendering).
251
270
  * @param {any} value
252
271
  * @param {Transport} transport
253
- * @param {boolean} [sort]
254
272
  */
255
- export function stringify_remote_arg(value, transport, sort = true) {
273
+ export function stringify_remote_arg(value, transport) {
256
274
  if (value === undefined) return '';
257
275
 
258
276
  // If people hit file/url size limits, we can look into using something like compress_and_encode_text from svelte.dev beyond a certain size
259
- const json_string = devalue.stringify(
260
- value,
261
- create_remote_arg_reducers(transport, sort, new Map())
262
- );
277
+ const json = devalue.stringify(value, create_remote_arg_reducers(transport, true, new Map()));
278
+
279
+ return url_friendly_base64_encode(json);
280
+ }
281
+
282
+ /**
283
+ * Stringifies command arguments, including `File` objects.
284
+ * @param {any} value
285
+ * @param {Transport} transport
286
+ */
287
+ export async function stringify_command_arg(value, transport) {
288
+ if (value === undefined) return '';
289
+
290
+ const reducers = create_remote_arg_reducers(transport, false, new Map());
263
291
 
264
- const bytes = text_encoder.encode(json_string);
292
+ /** @type {Set<Promise<any>>} */
293
+ const allowed_promises = new Set();
294
+
295
+ /** @param {any} value */
296
+ reducers[remote_file] = (value) => {
297
+ if (value instanceof File) {
298
+ const promise = value.arrayBuffer().then((data) => ({
299
+ data,
300
+ lastModified: value.lastModified,
301
+ name: value.name,
302
+ size: value.size,
303
+ type: value.type
304
+ }));
305
+
306
+ allowed_promises.add(promise);
307
+
308
+ return promise;
309
+ }
310
+ };
311
+
312
+ // we don't want to allow arbitrary promises, because they won't
313
+ // show up as promises on the other side. this is something
314
+ // we could potentially change in future. stringifyAsync
315
+ // will await them, so we need to explicitly deny them
316
+ /** @param {unknown} value */
317
+ reducers[remote_promise_guard] = (value) => {
318
+ if (value instanceof Promise && !allowed_promises.has(value)) {
319
+ throw new Error('Promises are not valid remote function arguments');
320
+ }
321
+ };
322
+
323
+ const json = await devalue.stringifyAsync(value, reducers);
324
+
325
+ return url_friendly_base64_encode(json);
326
+ }
327
+
328
+ /**
329
+ * Base64-encodes `string` in such a way that the result is safe to use
330
+ * as both a URI component and a filename
331
+ * @param {string} string
332
+ */
333
+ function url_friendly_base64_encode(string) {
334
+ const bytes = text_encoder.encode(string);
265
335
  return base64_encode(bytes).replaceAll('=', '').replaceAll('+', '-').replaceAll('/', '_');
266
336
  }
267
337
 
@@ -34,7 +34,7 @@ import {
34
34
  TrailingSlash
35
35
  } from './private.js';
36
36
  import { Span } from '@opentelemetry/api';
37
- import type { PageOptions } from '../exports/vite/static_analysis/index.js';
37
+ import { PageOptions } from '../exports/vite/static_analysis/types.js';
38
38
  import { SharedIterator } from '../utils/shared-iterator.js';
39
39
 
40
40
  export interface ServerModule {
@@ -1,5 +1,17 @@
1
1
  import { HttpError, SvelteKitError } from '@sveltejs/kit/internal';
2
2
 
3
+ /**
4
+ * For times when you need to throw an error, but without
5
+ * displaying a useless stack trace (since the developer
6
+ * can't do anything useful with it)
7
+ * @param {string} message
8
+ */
9
+ export function stackless(message) {
10
+ const error = new Error(message);
11
+ error.stack = '';
12
+ return error;
13
+ }
14
+
3
15
  /**
4
16
  * @param {unknown} err
5
17
  * @return {Error}
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.63.0';
4
+ export const VERSION = '2.64.0';
package/types/index.d.ts CHANGED
@@ -452,7 +452,7 @@ declare module '@sveltejs/kit' {
452
452
  experimental?: {
453
453
  /**
454
454
  * Whether to enable explicit environment variables using `src/env.js` or `src/env.ts`.
455
- * @since 2.62.0
455
+ * @since 2.63.0
456
456
  * @default false
457
457
  */
458
458
  explicitEnvironmentVariables?: boolean;
@@ -2948,8 +2948,16 @@ declare module '@sveltejs/kit' {
2948
2948
  export type LessThan<TNumber extends number, TArray extends any[] = []> = TNumber extends TArray["length"] ? TArray[number] : LessThan<TNumber, [...TArray, TArray["length"]]>;
2949
2949
  export type NumericRange<TStart extends number, TEnd extends number> = Exclude<TEnd | LessThan<TEnd>, LessThan<TStart>>;
2950
2950
  type ValidPageOption = (typeof valid_page_options_array)[number];
2951
- type PageOptions = Partial<Record<ValidPageOption, any>>;
2952
- const valid_page_options_array: readonly ["ssr", "prerender", "csr", "trailingSlash", "config", "entries", "load"];
2951
+
2952
+ type PageOptions = Partial<{
2953
+ [K in ValidPageOption]: K extends 'ssr' | 'csr'
2954
+ ? boolean
2955
+ : K extends 'prerender'
2956
+ ? PrerenderOption
2957
+ : K extends 'trailingSlash'
2958
+ ? TrailingSlash
2959
+ : any;
2960
+ }>;
2953
2961
  export const VERSION: string;
2954
2962
  class HttpError_1 {
2955
2963
 
@@ -2966,6 +2974,7 @@ declare module '@sveltejs/kit' {
2966
2974
  status: 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308;
2967
2975
  location: string;
2968
2976
  }
2977
+ const valid_page_options_array: readonly ["ssr", "prerender", "csr", "trailingSlash", "config", "entries", "load"];
2969
2978
 
2970
2979
  export {};
2971
2980
  }
@@ -149,8 +149,8 @@
149
149
  "normalizeUrl",
150
150
  "ValidPageOption",
151
151
  "PageOptions",
152
- "valid_page_options_array",
153
152
  "VERSION",
153
+ "valid_page_options_array",
154
154
  "defineEnvVars",
155
155
  "sequence",
156
156
  "getRequest",
@@ -200,8 +200,9 @@
200
200
  "../src/types/private.d.ts",
201
201
  "../src/types/internal.d.ts",
202
202
  "../src/exports/index.js",
203
- "../src/exports/vite/static_analysis/index.js",
203
+ "../src/exports/vite/static_analysis/types.d.ts",
204
204
  "../src/version.js",
205
+ "../src/exports/vite/static_analysis/index.js",
205
206
  "../src/exports/hooks/index.js",
206
207
  "../src/exports/hooks/sequence.js",
207
208
  "../src/exports/node/index.js",
@@ -242,8 +243,9 @@
242
243
  null,
243
244
  null,
244
245
  null,
246
+ null,
245
247
  null
246
248
  ],
247
- "mappings": "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",
249
+ "mappings": "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",
248
250
  "ignoreList": []
249
251
  }