@sveltejs/kit 3.0.0-next.1 → 3.0.0-next.2

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": "3.0.0-next.1",
3
+ "version": "3.0.0-next.2",
4
4
  "description": "SvelteKit is the fastest way to build Svelte apps",
5
5
  "keywords": [
6
6
  "framework",
@@ -32,6 +32,7 @@ export default function create_manifest_data({
32
32
  const matchers = create_matchers(config, cwd);
33
33
  const { nodes, routes } = create_routes_and_nodes(cwd, config, fallback);
34
34
 
35
+ // validate matcher names used in parameterised routes
35
36
  for (const route of routes) {
36
37
  for (const param of route.params) {
37
38
  if (param.matcher && !matchers[param.matcher]) {
@@ -50,6 +51,7 @@ export default function create_manifest_data({
50
51
  }
51
52
 
52
53
  /**
54
+ * Returns a list of files in the `static` directory.
53
55
  * @param {import('types').ValidatedConfig} config
54
56
  */
55
57
  export function create_assets(config) {
@@ -130,6 +132,7 @@ function create_routes_and_nodes(cwd, config, fallback) {
130
132
  /** @type {import('types').PageNode[]} */
131
133
  const nodes = [];
132
134
 
135
+ // create route data by processing files in `src/routes`
133
136
  if (fs.existsSync(config.kit.files.routes)) {
134
137
  /**
135
138
  * @param {number} depth
@@ -388,6 +391,7 @@ function create_routes_and_nodes(cwd, config, fallback) {
388
391
 
389
392
  prevent_conflicts(routes);
390
393
 
394
+ // fallback root layout and root error components
391
395
  const root = routes[0];
392
396
 
393
397
  if (!root.layout?.component) {
@@ -396,10 +400,11 @@ function create_routes_and_nodes(cwd, config, fallback) {
396
400
  }
397
401
 
398
402
  if (!root.error?.component) {
399
- if (!root.error) root.error = { depth: 0 };
403
+ if (!root.error) root.error = { depth: 0, parent: root.layout };
400
404
  root.error.component = posixify(path.relative(cwd, `${fallback}/error.svelte`));
401
405
  }
402
406
 
407
+ // populate the page nodes list
403
408
  // we do layouts/errors first as they are more likely to be reused,
404
409
  // and smaller indexes take fewer bytes. also, this guarantees that
405
410
  // the default error/layout are 0/1
@@ -421,6 +426,7 @@ function create_routes_and_nodes(cwd, config, fallback) {
421
426
 
422
427
  const node_analyser = create_node_analyser(cwd);
423
428
 
429
+ // add the related layout, page, and error nodes for a route
424
430
  for (const route of routes) {
425
431
  if (!route.leaf) continue;
426
432
 
@@ -465,6 +471,22 @@ function create_routes_and_nodes(cwd, config, fallback) {
465
471
  }
466
472
  }
467
473
 
474
+ // add parents to error nodes so that we can compute which page options apply to them
475
+ for (const route of routes) {
476
+ if (!route.error) continue;
477
+
478
+ /** @type {import('types').RouteData | null} */
479
+ let current_route = route;
480
+ while (current_route) {
481
+ if (current_route.layout) {
482
+ route.error.parent = current_route.layout;
483
+ break;
484
+ }
485
+ current_route = current_route.parent;
486
+ }
487
+ }
488
+
489
+ // compute the final page options for each page node
468
490
  for (const node of nodes) {
469
491
  node.page_options = node_analyser.get_page_options(node);
470
492
  }
@@ -482,6 +504,7 @@ function create_routes_and_nodes(cwd, config, fallback) {
482
504
  }
483
505
 
484
506
  /**
507
+ * Determine if and how the file is relevant to the routing system.
485
508
  * @param {string} project_relative
486
509
  * @param {string} file
487
510
  * @param {string[]} component_extensions
@@ -2,6 +2,7 @@
2
2
  import path from 'node:path';
3
3
  import { create_explicit_env_types } from '../env.js';
4
4
  import { write_if_changed } from './utils.js';
5
+ import { posixify } from '../../utils/os.js';
5
6
 
6
7
  const DOCS = '// See https://svelte.dev/docs/kit/environment-variables for more information';
7
8
 
@@ -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.`
@@ -155,7 +155,11 @@ export function build_server_nodes(
155
155
  /** @type {Set<string>} */
156
156
  const eager_assets = new Set();
157
157
 
158
- if (node.component && client_manifest) {
158
+ const uses_server_component = node.child_pages
159
+ ? node.child_pages.some((child) => child.page_options?.ssr !== false)
160
+ : node.page_options?.ssr !== false;
161
+
162
+ if (node.component && client_manifest && uses_server_component) {
159
163
  exports.push(
160
164
  'let component_cache;',
161
165
  `export const component = async () => component_cache ??= (await import('../${
@@ -30,9 +30,9 @@ import {
30
30
  error_for_missing_config,
31
31
  get_config_aliases,
32
32
  normalize_id,
33
- stackless,
34
33
  strip_virtual_prefix
35
34
  } from './utils.js';
35
+ import { stackless } from '../../utils/error.js';
36
36
  import { write_client_manifest } from '../../core/sync/write_client_manifest.js';
37
37
  import prerender from '../../core/postbuild/prerender.js';
38
38
  import analyse from '../../core/postbuild/analyse.js';
@@ -1,9 +1,10 @@
1
+ /** @import { PageOptions } from './types.js' */
1
2
  import path from 'node:path';
2
3
  import { tsPlugin } from '@sveltejs/acorn-typescript';
3
4
  import { Parser } from 'acorn';
4
5
  import { read } from '../../../utils/filesystem.js';
5
6
 
6
- const valid_page_options_array = /** @type {const} */ ([
7
+ export const valid_page_options_array = /** @type {const} */ ([
7
8
  'ssr',
8
9
  'prerender',
9
10
  'csr',
@@ -16,9 +17,6 @@ const valid_page_options_array = /** @type {const} */ ([
16
17
  /** @type {Set<string>} */
17
18
  const valid_page_options = new Set(valid_page_options_array);
18
19
 
19
- /** @typedef {typeof valid_page_options_array[number]} ValidPageOption */
20
- /** @typedef {Partial<Record<ValidPageOption, any>>} PageOptions */
21
-
22
20
  const skip_parsing_regex = new RegExp(
23
21
  `${Array.from(valid_page_options).join('|')}|(?:export[\\s\\n]+\\*[\\s\\n]+from)`
24
22
  );
@@ -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
+ }>;
@@ -2,6 +2,7 @@ import path from 'node:path';
2
2
  import { posixify } from '../../utils/os.js';
3
3
  import { negotiate } from '../../utils/http.js';
4
4
  import { escape_html } from '../../utils/escape.js';
5
+ import { stackless } from '../../utils/error.js';
5
6
  import { dedent } from '../../core/sync/utils.js';
6
7
  import {
7
8
  app_server,
@@ -148,18 +149,6 @@ export function normalize_id(id, lib, cwd) {
148
149
  return posixify(id);
149
150
  }
150
151
 
151
- /**
152
- * For times when you need to throw an error, but without
153
- * displaying a useless stack trace (since the developer
154
- * can't do anything useful with it)
155
- * @param {string} message
156
- */
157
- export function stackless(message) {
158
- const error = new Error(message);
159
- error.stack = '';
160
- return error;
161
- }
162
-
163
152
  export const strip_virtual_prefix = /** @param {string} id */ (id) => id.replace('\0virtual:', '');
164
153
 
165
154
  /**
@@ -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
+ }
@@ -639,8 +639,11 @@ export async function render_response({
639
639
  }`);
640
640
  }
641
641
 
642
+ // we need to eagerly import the Vite client module in development to ensure
643
+ // that Vite global constant replacements are initialised before our code runs
642
644
  const init_app = `
643
645
  {
646
+ ${DEV ? `import('${paths.base}/@vite/client')` : ''}
644
647
  ${blocks.join('\n\n\t\t\t\t\t')}
645
648
  }
646
649
  `;
@@ -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
  );
@@ -96,6 +96,8 @@ function to_sorted(value, clones) {
96
96
  const remote_object = '__skrao';
97
97
  const remote_map = '__skram';
98
98
  const remote_set = '__skras';
99
+ const remote_file = '__skraf';
100
+ const remote_promise_guard = '__skrap';
99
101
  const remote_regex_guard = '__skrag';
100
102
  const remote_arg_marker = Symbol(remote_object);
101
103
 
@@ -107,13 +109,12 @@ const remote_arg_marker = Symbol(remote_object);
107
109
  function create_remote_arg_reducers(transport, sort, remote_arg_clones) {
108
110
  /** @type {Record<string, (value: unknown) => unknown>} */
109
111
  const remote_fns_reducers = {
110
- [remote_regex_guard]:
111
- /** @type {(value: unknown) => void} */
112
- (value) => {
113
- if (value instanceof RegExp) {
114
- throw new Error('Regular expressions are not valid remote function arguments');
115
- }
112
+ /** @param {unknown} value */
113
+ [remote_regex_guard]: (value) => {
114
+ if (value instanceof RegExp) {
115
+ throw new Error('Regular expressions are not valid remote function arguments');
116
116
  }
117
+ }
117
118
  };
118
119
 
119
120
  if (sort) {
@@ -229,6 +230,24 @@ function create_remote_arg_revivers(transport) {
229
230
  }
230
231
 
231
232
  return set;
233
+ },
234
+ /** @type {(value: any) => File} */
235
+ [remote_file]: (value) => {
236
+ if (
237
+ !value ||
238
+ typeof value !== 'object' ||
239
+ typeof value.name !== 'string' ||
240
+ typeof value.type !== 'string' ||
241
+ typeof value.size !== 'number' ||
242
+ typeof value.lastModified !== 'number' ||
243
+ !(value.data instanceof ArrayBuffer)
244
+ ) {
245
+ throw new Error('Invalid data for File reviver');
246
+ }
247
+
248
+ const { data, name, ...meta } = value;
249
+
250
+ return new File([data], name, meta);
232
251
  }
233
252
  };
234
253
 
@@ -249,18 +268,69 @@ function create_remote_arg_revivers(transport) {
249
268
  * it is both a valid URL and a valid file name (necessary for prerendering).
250
269
  * @param {any} value
251
270
  * @param {Transport} transport
252
- * @param {boolean} [sort]
253
271
  */
254
- export function stringify_remote_arg(value, transport, sort = true) {
272
+ export function stringify_remote_arg(value, transport) {
255
273
  if (value === undefined) return '';
256
274
 
257
275
  // 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
258
- const json_string = devalue.stringify(
259
- value,
260
- create_remote_arg_reducers(transport, sort, new Map())
261
- );
276
+ const json = devalue.stringify(value, create_remote_arg_reducers(transport, true, new Map()));
277
+
278
+ return url_friendly_base64_encode(json);
279
+ }
280
+
281
+ /**
282
+ * Stringifies command arguments, including `File` objects.
283
+ * @param {any} value
284
+ * @param {Transport} transport
285
+ */
286
+ export async function stringify_command_arg(value, transport) {
287
+ if (value === undefined) return '';
288
+
289
+ const reducers = create_remote_arg_reducers(transport, false, new Map());
262
290
 
263
- const bytes = text_encoder.encode(json_string);
291
+ /** @type {Set<Promise<any>>} */
292
+ const allowed_promises = new Set();
293
+
294
+ /** @param {any} value */
295
+ reducers[remote_file] = (value) => {
296
+ if (value instanceof File) {
297
+ const promise = value.arrayBuffer().then((data) => ({
298
+ data,
299
+ lastModified: value.lastModified,
300
+ name: value.name,
301
+ size: value.size,
302
+ type: value.type
303
+ }));
304
+
305
+ allowed_promises.add(promise);
306
+
307
+ return promise;
308
+ }
309
+ };
310
+
311
+ // we don't want to allow arbitrary promises, because they won't
312
+ // show up as promises on the other side. this is something
313
+ // we could potentially change in future. stringifyAsync
314
+ // will await them, so we need to explicitly deny them
315
+ /** @param {unknown} value */
316
+ reducers[remote_promise_guard] = (value) => {
317
+ if (value instanceof Promise && !allowed_promises.has(value)) {
318
+ throw new Error('Promises are not valid remote function arguments');
319
+ }
320
+ };
321
+
322
+ const json = await devalue.stringifyAsync(value, reducers);
323
+
324
+ return url_friendly_base64_encode(json);
325
+ }
326
+
327
+ /**
328
+ * Base64-encodes `string` in such a way that the result is safe to use
329
+ * as both a URI component and a filename
330
+ * @param {string} string
331
+ */
332
+ function url_friendly_base64_encode(string) {
333
+ const bytes = text_encoder.encode(string);
264
334
  return base64_encode(bytes).replaceAll('=', '').replaceAll('+', '-').replaceAll('/', '_');
265
335
  }
266
336
 
@@ -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 = '3.0.0-next.1';
4
+ export const VERSION = '3.0.0-next.2';
package/types/index.d.ts CHANGED
@@ -2906,9 +2906,18 @@ declare module '@sveltejs/kit' {
2906
2906
  denormalize: (url?: string | URL) => URL;
2907
2907
  };
2908
2908
  type ValidPageOption = (typeof valid_page_options_array)[number];
2909
- type PageOptions = Partial<Record<ValidPageOption, any>>;
2910
- const valid_page_options_array: readonly ["ssr", "prerender", "csr", "trailingSlash", "config", "entries", "load"];
2909
+
2910
+ type PageOptions = Partial<{
2911
+ [K in ValidPageOption]: K extends 'ssr' | 'csr'
2912
+ ? boolean
2913
+ : K extends 'prerender'
2914
+ ? PrerenderOption
2915
+ : K extends 'trailingSlash'
2916
+ ? TrailingSlash
2917
+ : any;
2918
+ }>;
2911
2919
  export const VERSION: string;
2920
+ const valid_page_options_array: readonly ["ssr", "prerender", "csr", "trailingSlash", "config", "entries", "load"];
2912
2921
 
2913
2922
  export {};
2914
2923
  }
@@ -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",
@@ -198,8 +198,9 @@
198
198
  "../src/types/private.d.ts",
199
199
  "../src/types/internal.d.ts",
200
200
  "../src/exports/index.js",
201
- "../src/exports/vite/static_analysis/index.js",
201
+ "../src/exports/vite/static_analysis/types.d.ts",
202
202
  "../src/version.js",
203
+ "../src/exports/vite/static_analysis/index.js",
203
204
  "../src/exports/hooks/index.js",
204
205
  "../src/exports/hooks/sequence.js",
205
206
  "../src/exports/node/index.js",
@@ -235,8 +236,9 @@
235
236
  null,
236
237
  null,
237
238
  null,
239
+ null,
238
240
  null
239
241
  ],
240
- "mappings": ";;;;;;;;MAiCKA,IAAIA;;;;;kBAKQC,OAAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAiCZC,cAAcA;;;;;;aAMdC,cAAcA;;;;;;;;MAQrBC,aAAaA;;;;;OAKJC,YAAYA;;kBAETC,aAAaA;;;;;;MAMzBC,qBAAqBA;;;;;;;;;;;kBAWTC,OAAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA6IPC,MAAMA;;;;;;;;;;;kBAWNC,OAAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAqDPC,QAAQA;;;;;;;;kBAQRC,SAASA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAolBdC,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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aA6CrBC,cAAcA;;kBAETC,cAAcA;;;;;;;;;;;;;;;;;;;;kBAoBdC,eAAeA;;;;;;;;;;;;;;;;;;aAkBpBC,kBAAkBA;;kBAEbC,cAAcA;;;;;;;;kBAQdC,eAAeA;;;;;;;;kBAQfC,oBAAoBA;;;;;;;;;;;;;kBAapBC,kBAAkBA;;;;;;;;;;;;;;;;;;kBAkBlBC,cAAcA;;;;;;;;;;;;;aAanBC,UAAUA;;;;;;;;;aASVC,cAAcA;;;;;;;;;;aAUdC,UAAUA;;;;;;;;;;;aAWVC,aAAaA;;;;;;;;;;;kBAWRC,IAAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aA8CTC,YAAYA;;;;;;;;;aASZC,cAAcA;;;;;;;;;;;aAWdC,kBAAkBA;;;;;aAKlBC,oBAAoBA;;;;;;;;;;;;;;;;aAgBpBC,wBAAwBA;;;;;;;;;;;;;;;;;;aAkBxBC,eAAeA;;;;kBAIVC,YAAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aA+GjBC,cAAcA;;;;;kBAKTC,cAAcA;;;;;;;;;;;;;;;;;;;;;;;kBAuBdC,eAAeA;;;;;;;;;;;;;;;cAenBC,MAAMA;;;;;;kBAMFC,iBAAiBA;;;;;;;kBAOjBC,WAAWA;;;;;;;;;;;;;;;;;;;;;;;;;aAyBhBC,UAAUA;;;;;;;kBAOLC,eAAeA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAkFpBC,MAAMA;;;;;;;;;;aAUNC,OAAOA;;;;;;;;;;;;;;;;aAgBPC,YAAYA;;;;;;;;;;;;kBAYPC,SAASA;;;;;;;;;;kBAUTC,QAAQA;;;;;;;aAObC,cAAcA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA6BTC,QAAQA;;;;;;MAMpBC,uBAAuBA;;;MAGvBC,YAAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aA6BLC,mBAAmBA;;;;;MAK1BC,iBAAiBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAkDjBC,sBAAsBA;;;;;;;;;;;MAWtBC,WAAWA;MACXC,eAAeA;;;;;;aAMRC,oBAAoBA;;MAE3BC,MAAMA;;;;;;;;;;;;;;;;;;;aAmBCC,eAAeA;;;;;;;;;;;;;;MActBC,wBAAwBA;;;;;MAKxBC,YAAYA;;;;;;;;;;;;;;;;;;MAkBZC,oBAAoBA;;;;;;;;;;;;;;;aAebC,gBAAgBA;;;;;;;;;;;;;;;;;;;;;MAqBvBC,mBAAmBA;;;;MAInBC,UAAUA;;kBAEEC,eAAeA;;;;kBAIfC,eAAeA;;;;;;;MAO3BC,SAASA;;;;;;;;;;;;;aAaFC,YAAYA;;;;;;;;;;;;;;;;;;kBAkBPC,eAAeA;;;;;;;;aAQpBC,UAAUA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aA2DVC,aAAaA;;;;;;;;aAQbC,iBAAiBA;;;;;;;aAOjBC,cAAcA;;;;;;;;;;;;;;;;;;aAkBdC,WAAWA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAqCXC,eAAeA;;;;;;;;;;aAUfC,mBAAmBA;;;;;aAKnBC,uBAAuBA;;;;;;;;;;;;;;;;aAgBvBC,mBAAmBA;;;;;;;;;;;aAWnBC,uBAAuBA;;;;;;;;kBAQlBC,YAAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;WCxuEZC,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;;;;;;;MAOjBC,aAAaA;;MAEbC,WAAWA;;;;;;;;MAQXC,KAAKA;WCtMAC,KAAKA;;;;;;WAeLC,SAASA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WA6HTC,YAAYA;;;;;;;;;;;;;WAkBZC,QAAQA;;;;;;;;;;;;;;;;MAkCbC,iBAAiBA;;;;;;;;;WAWZC,UAAUA;;;;;;;;;;;;;WAaVC,SAASA;;;;;;;;;;;;;;;;;;;;;;;;;WAqJTC,YAAYA;;;;;;;;;;;;;;;;;;;;MAoBjBC,kBAAkBA;;WAEbC,aAAaA;;;;;;;;;;;WAWbC,UAAUA;;;;;;;;;;;WAWVC,OAAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA4BZC,aAAaA;;WA6BRC,eAAeA;;;;;;MAMpBC,uBAAuBA;;MAGvBC,WAAWA;;;;;;;;WAQNC,QAAQA;;;;;;;;;WASRC,cAAcA;;;;;;;;;MAqDnBC,eAAeA;;;;;;MAMfC,kBAAkBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBClhBdC,WAAWA;;;;;;;;;;;;;;;;;;;iBAsBXC,QAAQA;;;;;iBAiBRC,UAAUA;;;;;;;iBAUVC,IAAIA;;;;;;;iBA2BJC,IAAIA;;;;;;;;;;;;;;;;iBAkDJC,eAAeA;;;;;;;;;;;;;;;;;;;;;;;;;;iBA+BfC,OAAOA;;;;;;iBAYPC,iBAAiBA;;;;;;;;;;;;;;iBAmBjBC,YAAYA;;;;;MCtP2BC,eAAeA;MACjBC,WAAWA;OAd1DC,wBAAwBA;cCFjBC,OAAOA;;;;;;;;;;;iBCQJC,aAAaA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBCoEbC,QAAQA;;;;;;iBCoCFC,UAAUA;;;;;;iBAgDVC,WAAWA;;;;;iBAwEjBC,oBAAoBA;;;;;;;;;;;;iBCnFdC,SAASA;;;;;;;;;cCrJlBC,OAAOA;;;;;cAKPC,GAAGA;;;;;cAKHC,QAAQA;;;;;cAKRC,OAAOA;;;;;;;;;;;;;;;;;;;;;;;;iBCaJC,WAAWA;;;;;;;;;;;;;;;;;;;;;;;;iBAgDXC,OAAOA;;;;;;;iBCo5EDC,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;MX9xEhBzE,YAAYA;;;;;;;;;;;;;;YY/Ib0E,IAAIA;;;;;;;;;YASJC,MAAMA;;;;;iBAKDC,YAAYA;;;MCnBvBC,iBAAiBA;;;;;;MAMVC,WAAWA;;;;;;;;;;;;;;;;;;;;;;;;;;iBCWPC,KAAKA;;;;;;;;;;;;;;;;;;;;;iBA6BLC,OAAOA;;;;;;;;;;;;;;;;;;;iBAmCDC,KAAKA;;;;;;;;;;;;;;;;;;;;;;;iBCtEXC,IAAIA;;;;;;;;iBCUJC,eAAeA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MfyTnBC,qCAAqCA;;;;;;;;MA2LrCC,8BAA8BA;MDrX9BrF,YAAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ciB1GXsF,IAAIA;;;;;cAQJC,UAAUA;;;;;;;;;;;cAMVC,OAAOA;;;;;;;;;iBCrDPC,SAASA;;;;;;;;;;;;;;;cAyBTH,IAAIA;;;;;;;;;;cAiBJC,UAAUA;;;;;;;;cAeVC,OAAOA",
242
+ "mappings": "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",
241
243
  "ignoreList": []
242
244
  }