@sveltejs/kit 2.61.0 → 2.62.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.61.0",
3
+ "version": "2.62.0",
4
4
  "description": "SvelteKit is the fastest way to build Svelte apps",
5
5
  "keywords": [
6
6
  "framework",
@@ -33,10 +33,10 @@
33
33
  },
34
34
  "devDependencies": {
35
35
  "@opentelemetry/api": "^1.0.0",
36
- "@playwright/test": "^1.59.1",
36
+ "@playwright/test": "^1.60.0",
37
37
  "@sveltejs/vite-plugin-svelte": "^6.0.0-next.3",
38
38
  "@types/connect": "^3.4.38",
39
- "@types/node": "^18.19.119",
39
+ "@types/node": "^18.19.130",
40
40
  "@types/set-cookie-parser": "^2.4.7",
41
41
  "dts-buddy": "^0.8.0",
42
42
  "jsdom": "^26.1.0",
@@ -168,7 +168,10 @@ export function create_builder({
168
168
 
169
169
  const fallback = await generate_fallback({
170
170
  manifest_path,
171
- env: { ...env.private, ...env.public }
171
+ env: { ...env.private, ...env.public },
172
+ out_dir: config.kit.outDir,
173
+ origin: config.kit.prerender.origin,
174
+ assets: config.kit.files.assets
172
175
  });
173
176
 
174
177
  if (existsSync(dest)) {
@@ -185,6 +188,8 @@ export function create_builder({
185
188
  },
186
189
 
187
190
  generateEnvModule() {
191
+ if (!build_data.client?.uses_env_dynamic_public) return;
192
+
188
193
  const dest = `${config.kit.outDir}/output/prerendered/dependencies/${config.kit.appDir}/env.js`;
189
194
  const env = get_env(config.kit.env, vite_config.mode);
190
195
 
@@ -1,15 +1,19 @@
1
+ /** @import { Config } from '@sveltejs/kit' */
2
+ /** @import { ValidatedConfig } from 'types' */
3
+ /** @import { ResolvedConfig } from 'vite' */
1
4
  import fs from 'node:fs';
2
5
  import path from 'node:path';
3
6
  import process from 'node:process';
4
7
  import * as url from 'node:url';
5
8
  import options from './options.js';
6
9
  import { resolve_entry } from '../../utils/filesystem.js';
10
+ import { import_peer } from '../../utils/import.js';
7
11
 
8
12
  /**
9
13
  * Loads the template (src/app.html by default) and validates that it has the
10
14
  * required content.
11
15
  * @param {string} cwd
12
- * @param {import('types').ValidatedConfig} config
16
+ * @param {ValidatedConfig} config
13
17
  */
14
18
  export function load_template(cwd, { kit }) {
15
19
  const { env, files } = kit;
@@ -43,7 +47,7 @@ export function load_template(cwd, { kit }) {
43
47
  /**
44
48
  * Loads the error page (src/error.html by default) if it exists.
45
49
  * Falls back to a generic error page content.
46
- * @param {import('types').ValidatedConfig} config
50
+ * @param {ValidatedConfig} config
47
51
  */
48
52
  export function load_error_page(config) {
49
53
  let { errorTemplate } = config.kit.files;
@@ -58,11 +62,34 @@ export function load_error_page(config) {
58
62
  }
59
63
 
60
64
  /**
61
- * Loads and validates Svelte config file
65
+ * Loads and validates Svelte config file. Tries Vite config first, falls back to svelte.config.js
62
66
  * @param {{ cwd?: string }} options
63
- * @returns {Promise<import('types').ValidatedConfig>}
67
+ * @returns {Promise<ValidatedConfig>}
64
68
  */
65
69
  export async function load_config({ cwd = process.cwd() } = {}) {
70
+ try {
71
+ const vite_config = await load_config_from_vite({ cwd });
72
+ if (vite_config) {
73
+ return vite_config;
74
+ }
75
+ } catch (e) {
76
+ // TODO SvelteKit 3: fail completely instead
77
+ console.error(
78
+ 'Loading Svelte config from Vite config failed:',
79
+ e,
80
+ '\n\nFalling back to loading svelte.config.js'
81
+ );
82
+ }
83
+
84
+ return load_svelte_config(cwd);
85
+ }
86
+
87
+ /**
88
+ * Loads and validates Svelte config file
89
+ * @param {string} [cwd]
90
+ * @returns {Promise<ValidatedConfig>}
91
+ */
92
+ export async function load_svelte_config(cwd = process.cwd()) {
66
93
  const config_files = ['js', 'ts']
67
94
  .map((ext) => path.join(cwd, `svelte.config.${ext}`))
68
95
  .filter((f) => fs.existsSync(f));
@@ -73,52 +100,87 @@ export async function load_config({ cwd = process.cwd() } = {}) {
73
100
  );
74
101
  return process_config({}, { cwd });
75
102
  }
103
+
76
104
  const config_file = config_files[0];
77
105
  if (config_files.length > 1) {
78
106
  console.log(
79
107
  `Found multiple Svelte config files in ${cwd}: ${config_files.map((f) => path.basename(f)).join(', ')}. Using ${path.basename(config_file)}`
80
108
  );
81
109
  }
110
+
82
111
  const config = await import(`${url.pathToFileURL(config_file).href}?ts=${Date.now()}`);
112
+ return process_config(config.default, { cwd, source: path.relative(cwd, config_file) });
113
+ }
83
114
 
84
- try {
85
- return process_config(config.default, { cwd });
86
- } catch (e) {
87
- const error = /** @type {Error} */ (e);
115
+ /**
116
+ * Loads and validates Svelte config via Vite config resolution (if set that way).
117
+ * @param {{ cwd?: string; mode?: string }} options
118
+ * @returns {Promise<ValidatedConfig | undefined>}
119
+ */
120
+ async function load_config_from_vite({ cwd = process.cwd(), mode } = {}) {
121
+ const { resolveConfig } = await import_peer('vite');
122
+ const current_cwd = process.cwd();
88
123
 
89
- // redact the stack trace — it's not helpful to users
90
- error.stack = `Could not load ${config_file}: ${error.message}\n`;
91
- throw error;
124
+ if (cwd !== current_cwd) {
125
+ process.chdir(cwd);
126
+ }
127
+
128
+ /** @type {ResolvedConfig} */
129
+ let resolved;
130
+
131
+ try {
132
+ resolved = await resolveConfig({}, 'build', mode ?? process.env.MODE ?? 'production');
133
+ } finally {
134
+ if (cwd !== current_cwd) {
135
+ process.chdir(current_cwd);
136
+ }
92
137
  }
138
+
139
+ const plugin = resolved.plugins.find(
140
+ (plugin) => plugin.name === 'vite-plugin-sveltekit-setup' && plugin.api?.options
141
+ );
142
+
143
+ return plugin?.api.options;
93
144
  }
94
145
 
95
146
  /**
96
- * @param {import('@sveltejs/kit').Config} config
97
- * @returns {import('types').ValidatedConfig}
147
+ * @param {Config} config
148
+ * @returns {ValidatedConfig}
98
149
  */
99
- function process_config(config, { cwd = process.cwd() } = {}) {
100
- const validated = validate_config(config, cwd);
101
-
102
- validated.kit.outDir = path.resolve(cwd, validated.kit.outDir);
103
-
104
- for (const key in validated.kit.files) {
105
- if (key === 'hooks') {
106
- validated.kit.files.hooks.client = path.resolve(cwd, validated.kit.files.hooks.client);
107
- validated.kit.files.hooks.server = path.resolve(cwd, validated.kit.files.hooks.server);
108
- validated.kit.files.hooks.universal = path.resolve(cwd, validated.kit.files.hooks.universal);
109
- } else {
110
- // @ts-expect-error
111
- validated.kit.files[key] = path.resolve(cwd, validated.kit.files[key]);
150
+ export function process_config(config, { cwd = process.cwd(), source = 'svelte.config.js' } = {}) {
151
+ try {
152
+ const validated = validate_config(config, cwd);
153
+
154
+ validated.kit.outDir = path.resolve(cwd, validated.kit.outDir);
155
+
156
+ for (const key in validated.kit.files) {
157
+ if (key === 'hooks') {
158
+ validated.kit.files.hooks.client = path.resolve(cwd, validated.kit.files.hooks.client);
159
+ validated.kit.files.hooks.server = path.resolve(cwd, validated.kit.files.hooks.server);
160
+ validated.kit.files.hooks.universal = path.resolve(
161
+ cwd,
162
+ validated.kit.files.hooks.universal
163
+ );
164
+ } else {
165
+ // @ts-expect-error
166
+ validated.kit.files[key] = path.resolve(cwd, validated.kit.files[key]);
167
+ }
112
168
  }
113
- }
114
169
 
115
- return validated;
170
+ return validated;
171
+ } catch (e) {
172
+ const error = /** @type {Error} */ (e);
173
+
174
+ // redact the stack trace — it's not helpful to users
175
+ error.stack = `Error loading ${source}: ${error.message}\n`;
176
+ throw error;
177
+ }
116
178
  }
117
179
 
118
180
  /**
119
- * @param {import('@sveltejs/kit').Config} config
181
+ * @param {Config} config
120
182
  * @param {string} [cwd]
121
- * @returns {import('types').ValidatedConfig}
183
+ * @returns {ValidatedConfig}
122
184
  */
123
185
  export function validate_config(config, cwd = process.cwd()) {
124
186
  if (typeof config !== 'object') {
@@ -127,7 +189,7 @@ export function validate_config(config, cwd = process.cwd()) {
127
189
  );
128
190
  }
129
191
 
130
- /** @type {import('types').ValidatedConfig} */
192
+ /** @type {ValidatedConfig} */
131
193
  const validated = options(config, 'config');
132
194
  const files = validated.kit.files;
133
195
 
@@ -2,7 +2,6 @@ import { readFileSync } from 'node:fs';
2
2
  import { join } from 'node:path';
3
3
  import { pathToFileURL } from 'node:url';
4
4
  import { installPolyfills } from '../../exports/node/polyfills.js';
5
- import { load_config } from '../config/index.js';
6
5
  import { forked } from '../../utils/fork.js';
7
6
 
8
7
  export default forked(import.meta.url, generate_fallback);
@@ -11,15 +10,15 @@ export default forked(import.meta.url, generate_fallback);
11
10
  * @param {{
12
11
  * manifest_path: string;
13
12
  * env: Record<string, string>
13
+ * out_dir: string;
14
+ * origin: string;
15
+ * assets: string;
14
16
  * }} opts
15
17
  */
16
- async function generate_fallback({ manifest_path, env }) {
17
- /** @type {import('types').ValidatedKitConfig} */
18
- const config = (await load_config()).kit;
19
-
18
+ async function generate_fallback({ manifest_path, env, out_dir, origin, assets }) {
20
19
  installPolyfills();
21
20
 
22
- const server_root = join(config.outDir, 'output');
21
+ const server_root = join(out_dir, 'output');
23
22
 
24
23
  /** @type {import('types').ServerInternalModule} */
25
24
  const { set_building } = await import(pathToFileURL(`${server_root}/server/internal.js`).href);
@@ -35,7 +34,7 @@ async function generate_fallback({ manifest_path, env }) {
35
34
  const server = new Server(manifest);
36
35
  await server.init({ env });
37
36
 
38
- const response = await server.respond(new Request(config.prerender.origin + '/[fallback]'), {
37
+ const response = await server.respond(new Request(origin + '/[fallback]'), {
39
38
  getClientAddress: () => {
40
39
  throw new Error('Cannot read clientAddress during prerendering');
41
40
  },
@@ -44,7 +43,7 @@ async function generate_fallback({ manifest_path, env }) {
44
43
  dependencies: new Map(),
45
44
  remote_responses: new Map()
46
45
  },
47
- read: (file) => readFileSync(join(config.files.assets, file))
46
+ read: (file) => readFileSync(join(assets, file))
48
47
  });
49
48
 
50
49
  if (response.ok) {
@@ -106,7 +106,10 @@ async function prerender({ hash, out, manifest_path, metadata, verbose, env }) {
106
106
  if (hash) {
107
107
  const fallback = await generate_fallback({
108
108
  manifest_path,
109
- env
109
+ env,
110
+ out_dir: config.outDir,
111
+ origin: config.prerender.origin,
112
+ assets: config.files.assets
110
113
  });
111
114
 
112
115
  const file = output_filename('/', true);
@@ -1,8 +1,8 @@
1
1
  import { createReadStream } from 'node:fs';
2
2
  import { Readable } from 'node:stream';
3
- import * as set_cookie_parser from 'set-cookie-parser';
4
3
  import { SvelteKitError } from '../internal/index.js';
5
4
  import { noop } from '../../utils/functions.js';
5
+ import { get_set_cookies } from '../../utils/http.js';
6
6
 
7
7
  /**
8
8
  * @param {import('http').IncomingMessage} req
@@ -169,15 +169,7 @@ export async function getRequest({ request, base, bodySizeLimit }) {
169
169
  export async function setResponse(res, response) {
170
170
  for (const [key, value] of response.headers) {
171
171
  try {
172
- res.setHeader(
173
- key,
174
- key === 'set-cookie'
175
- ? set_cookie_parser.splitCookiesString(
176
- // This is absurd but necessary, TODO: investigate why
177
- /** @type {string}*/ (response.headers.get(key))
178
- )
179
- : value
180
- );
172
+ res.setHeader(key, key === 'set-cookie' ? get_set_cookies(response.headers) : value);
181
173
  } catch (error) {
182
174
  res.getHeaderNames().forEach((name) => res.removeHeader(name));
183
175
  res.writeHead(500).end(String(error));
@@ -141,7 +141,7 @@ export interface Builder {
141
141
  generateFallback: (dest: string) => Promise<void>;
142
142
 
143
143
  /**
144
- * Generate a module exposing build-time environment variables as `$env/dynamic/public`.
144
+ * Generate a module exposing build-time environment variables as `$env/dynamic/public` if the app uses it.
145
145
  */
146
146
  generateEnvModule: () => void;
147
147
 
@@ -1,6 +1,8 @@
1
- /** @import { Options } from '@sveltejs/vite-plugin-svelte' */
1
+ /** @import { Options, SvelteConfig } from '@sveltejs/vite-plugin-svelte' */
2
2
  /** @import { PreprocessorGroup } from 'svelte/compiler' */
3
+ /** @import { KitConfig } from '@sveltejs/kit' */
3
4
  /** @import { ConfigEnv, Manifest, Plugin, ResolvedConfig, UserConfig, ViteDevServer } from 'vite' */
5
+ /** @import { ValidatedConfig } from 'types' */
4
6
  import fs from 'node:fs';
5
7
  import path from 'node:path';
6
8
  import process from 'node:process';
@@ -12,7 +14,7 @@ import { create_static_module, create_dynamic_module } from '../../core/env.js';
12
14
  import * as sync from '../../core/sync/sync.js';
13
15
  import { create_assets } from '../../core/sync/create_manifest_data/index.js';
14
16
  import { runtime_directory, logger } from '../../core/utils.js';
15
- import { load_config } from '../../core/config/index.js';
17
+ import { load_svelte_config, process_config } from '../../core/config/index.js';
16
18
  import { generate_manifest } from '../../core/generate_manifest/index.js';
17
19
  import { build_server_nodes } from './build/build_server.js';
18
20
  import { build_service_worker } from './build/build_service_worker.js';
@@ -133,10 +135,31 @@ const warning_preprocessor = {
133
135
 
134
136
  /**
135
137
  * Returns the SvelteKit Vite plugins.
138
+ * Since version 2.62.0 you can pass [configuration](configuration) directly, in which case `svelte.config.js` is ignored.
139
+ * @param {KitConfig & Omit<SvelteConfig, 'onwarn'>} [config]
136
140
  * @returns {Promise<Plugin[]>}
137
141
  */
138
- export async function sveltekit() {
139
- const svelte_config = await load_config();
142
+ export async function sveltekit(config) {
143
+ /** @type {ValidatedConfig} */
144
+ let svelte_config;
145
+
146
+ if (config !== undefined) {
147
+ const { extensions, compilerOptions, vitePlugin, preprocess, ...kit } = config;
148
+ svelte_config = process_config(
149
+ { extensions, compilerOptions, vitePlugin, preprocess, kit },
150
+ { cwd, source: 'SvelteKit options from Vite config' }
151
+ );
152
+
153
+ const config_file = ['svelte.config.js', 'svelte.config.ts'].find((file) =>
154
+ fs.existsSync(file)
155
+ );
156
+
157
+ if (config_file) {
158
+ console.warn(`${config_file} is ignored when options are passed via your Vite config`);
159
+ }
160
+ } else {
161
+ svelte_config = await load_svelte_config();
162
+ }
140
163
 
141
164
  /** @type {Options['preprocess']} */
142
165
  let preprocess = svelte_config.preprocess;
@@ -243,6 +266,9 @@ async function kit({ svelte_config }) {
243
266
  /** @type {Plugin} */
244
267
  const plugin_setup = {
245
268
  name: 'vite-plugin-sveltekit-setup',
269
+ api: {
270
+ options: svelte_config
271
+ },
246
272
 
247
273
  /**
248
274
  * Build the SvelteKit-provided Vite config to be merged with the user's vite.config.js file.
@@ -1,3 +1,4 @@
1
+ import { DEV } from 'esm-env';
1
2
  import {
2
3
  page as _page,
3
4
  navigating as _navigating,
@@ -53,12 +54,15 @@ export const navigating = {
53
54
  }
54
55
  };
55
56
 
56
- Object.defineProperty(navigating, 'current', {
57
- get() {
58
- // between 2.12.0 and 2.12.1 `navigating.current` existed
59
- throw new Error('Replace navigating.current.<prop> with navigating.<prop>');
60
- }
61
- });
57
+ // TODO: remove in 3.0
58
+ if (DEV) {
59
+ Object.defineProperty(navigating, 'current', {
60
+ get() {
61
+ // between 2.12.0 and 2.12.1 `navigating.current` existed
62
+ throw new Error('Replace navigating.current.<prop> with navigating.<prop>');
63
+ }
64
+ });
65
+ }
62
66
 
63
67
  export const updated = {
64
68
  get current() {
@@ -1,3 +1,4 @@
1
+ /** @import { ServerNodesResponse, ServerRedirectNode } from 'types' */
1
2
  /** @import { CacheEntry } from './remote-functions/cache.svelte.js' */
2
3
  /** @import { Query } from './remote-functions/query/instance.svelte.js' */
3
4
  /** @import { LiveQuery } from './remote-functions/query-live/instance.svelte.js' */
@@ -231,6 +232,7 @@ let load_cache = null;
231
232
  function discard_load_cache() {
232
233
  void load_cache?.fork?.then((f) => f?.discard());
233
234
  load_cache = null;
235
+ current_a = { element: undefined, href: undefined };
234
236
  }
235
237
 
236
238
  /**
@@ -1842,8 +1844,10 @@ async function navigate({
1842
1844
  if (load_cache?.fork && !load_cache_fork) {
1843
1845
  // discard fork of different route
1844
1846
  discard_load_cache();
1847
+ } else {
1848
+ load_cache = null;
1849
+ current_a = { element: undefined, href: undefined };
1845
1850
  }
1846
- load_cache = null;
1847
1851
 
1848
1852
  navigation_result.props.page.state = state;
1849
1853
 
@@ -2029,11 +2033,16 @@ if (import.meta.hot) {
2029
2033
 
2030
2034
  /** @typedef {(typeof PRELOAD_PRIORITIES)['hover'] | (typeof PRELOAD_PRIORITIES)['tap']} PreloadDataPriority */
2031
2035
 
2036
+ /**
2037
+ * The anchor element whose href is being preloaded. It is reset after navigation
2038
+ * or changes when a different anchor element is being preloaded.
2039
+ * @type {{ element: Element | SVGAElement | undefined; href: string | SVGAnimatedString | undefined }}
2040
+ */
2041
+ let current_a = { element: undefined, href: undefined };
2042
+
2032
2043
  function setup_preload() {
2033
2044
  /** @type {NodeJS.Timeout} */
2034
2045
  let mousemove_timeout;
2035
- /** @type {{ element: Element | SVGAElement | undefined; href: string | SVGAnimatedString | undefined }} */
2036
- let current_a = { element: undefined, href: undefined };
2037
2046
  /** @type {PreloadDataPriority} */
2038
2047
  let current_priority;
2039
2048
 
@@ -2626,7 +2635,7 @@ function _start_router() {
2626
2635
  });
2627
2636
 
2628
2637
  // @ts-expect-error this isn't supported everywhere yet
2629
- if (!navigator.connection?.saveData && !/2g/.test(navigator.connection?.effectiveType)) {
2638
+ if (!navigator.connection?.saveData) {
2630
2639
  setup_preload();
2631
2640
  }
2632
2641
 
@@ -3067,61 +3076,69 @@ async function load_data(url, invalid) {
3067
3076
  throw new HttpError(res.status, message);
3068
3077
  }
3069
3078
 
3070
- // TODO: fix eslint error / figure out if it actually applies to our situation
3071
- // eslint-disable-next-line
3072
- return new Promise(async (resolve) => {
3073
- /**
3074
- * Map of deferred promises that will be resolved by a subsequent chunk of data
3075
- * @type {Map<string, import('types').Deferred>}
3076
- */
3077
- const deferreds = new Map();
3078
- const reader = /** @type {ReadableStream<Uint8Array>} */ (res.body).getReader();
3079
-
3080
- /**
3081
- * @param {any} data
3082
- */
3083
- function deserialize(data) {
3084
- return devalue.unflatten(data, {
3085
- ...app.decoders,
3086
- Promise: (id) => {
3087
- return new Promise((fulfil, reject) => {
3088
- deferreds.set(id, { fulfil, reject });
3089
- });
3090
- }
3091
- });
3092
- }
3079
+ return new Promise((resolve, reject) => {
3080
+ process_stream(resolve, res).catch(reject);
3081
+ });
3093
3082
 
3094
- for await (const node of read_ndjson(reader)) {
3095
- if (node.type === 'redirect') {
3096
- return resolve(node);
3097
- }
3083
+ // TODO edge case handling necessary? stream() read fails?
3084
+ }
3098
3085
 
3099
- if (node.type === 'data') {
3100
- // This is the first (and possibly only, if no pending promises) chunk
3101
- node.nodes?.forEach((/** @type {any} */ node) => {
3102
- if (node?.type === 'data') {
3103
- node.uses = deserialize_uses(node.uses);
3104
- node.data = deserialize(node.data);
3105
- }
3086
+ /**
3087
+ * @param {(value: ServerNodesResponse | ServerRedirectNode) => void} resolve
3088
+ * @param {Response} res
3089
+ * @returns {Promise<void>}
3090
+ */
3091
+ async function process_stream(resolve, res) {
3092
+ const reader = /** @type {ReadableStream<Uint8Array>} */ (res.body).getReader();
3093
+
3094
+ /**
3095
+ * Map of deferred promises that will be resolved by a subsequent chunk of data
3096
+ * @type {Map<string, import('types').Deferred>}
3097
+ */
3098
+ const deferreds = new Map();
3099
+
3100
+ /**
3101
+ * @param {any} data
3102
+ */
3103
+ function deserialize(data) {
3104
+ return devalue.unflatten(data, {
3105
+ ...app.decoders,
3106
+ Promise: (id) => {
3107
+ return new Promise((fulfil, reject) => {
3108
+ deferreds.set(id, { fulfil, reject });
3106
3109
  });
3110
+ }
3111
+ });
3112
+ }
3107
3113
 
3108
- resolve(node);
3109
- } else if (node.type === 'chunk') {
3110
- // This is a subsequent chunk containing deferred data
3111
- const { id, data, error } = node;
3112
- const deferred = /** @type {import('types').Deferred} */ (deferreds.get(id));
3113
- deferreds.delete(id);
3114
+ for await (const node of read_ndjson(reader)) {
3115
+ if (node.type === 'redirect') {
3116
+ return resolve(node);
3117
+ }
3114
3118
 
3115
- if (error) {
3116
- deferred.reject(deserialize(error));
3117
- } else {
3118
- deferred.fulfil(deserialize(data));
3119
+ if (node.type === 'data') {
3120
+ // This is the first (and possibly only, if no pending promises) chunk
3121
+ node.nodes?.forEach((/** @type {any} */ node) => {
3122
+ if (node?.type === 'data') {
3123
+ node.uses = deserialize_uses(node.uses);
3124
+ node.data = deserialize(node.data);
3119
3125
  }
3126
+ });
3127
+
3128
+ resolve(node);
3129
+ } else if (node.type === 'chunk') {
3130
+ // This is a subsequent chunk containing deferred data
3131
+ const { id, data, error } = node;
3132
+ const deferred = /** @type {import('types').Deferred} */ (deferreds.get(id));
3133
+ deferreds.delete(id);
3134
+
3135
+ if (error) {
3136
+ deferred.reject(deserialize(error));
3137
+ } else {
3138
+ deferred.fulfil(deserialize(data));
3120
3139
  }
3121
3140
  }
3122
- });
3123
-
3124
- // TODO edge case handling necessary? stream() read fails?
3141
+ }
3125
3142
  }
3126
3143
 
3127
3144
  /**
@@ -1,5 +1,6 @@
1
1
  import * as set_cookie_parser from 'set-cookie-parser';
2
2
  import { noop } from '../../utils/functions.js';
3
+ import { get_set_cookies } from '../../utils/http.js';
3
4
  import { respond } from './respond.js';
4
5
  import * as paths from '$app/paths/internal/server';
5
6
  import { read_implementation } from '__sveltekit/server';
@@ -152,22 +153,19 @@ export function create_fetch({ event, options, manifest, state, get_cookie_heade
152
153
 
153
154
  const response = await internal_fetch(request, options, manifest, state);
154
155
 
155
- const set_cookie = response.headers.get('set-cookie');
156
- if (set_cookie) {
157
- for (const str of set_cookie_parser.splitCookiesString(set_cookie)) {
158
- const { name, value, ...options } = set_cookie_parser.parseString(str, {
159
- decodeValues: false
160
- });
156
+ for (const str of get_set_cookies(response.headers)) {
157
+ const { name, value, ...options } = set_cookie_parser.parseString(str, {
158
+ decodeValues: false
159
+ });
161
160
 
162
- const path = options.path ?? (url.pathname.split('/').slice(0, -1).join('/') || '/');
161
+ const path = options.path ?? (url.pathname.split('/').slice(0, -1).join('/') || '/');
163
162
 
164
- // options.sameSite is string, something more specific is required - type cast is safe
165
- set_internal(name, value, {
166
- path,
167
- encode: (value) => value,
168
- .../** @type {import('cookie').CookieSerializeOptions} */ (options)
169
- });
170
- }
163
+ // options.sameSite is string, something more specific is required - type cast is safe
164
+ set_internal(name, value, {
165
+ path,
166
+ encode: (value) => value,
167
+ .../** @type {import('cookie').CookieSerializeOptions} */ (options)
168
+ });
171
169
  }
172
170
 
173
171
  return response;
@@ -8,7 +8,7 @@ import { is_endpoint_request, render_endpoint } from './endpoint.js';
8
8
  import { render_page } from './page/index.js';
9
9
  import { render_response } from './page/render.js';
10
10
  import { respond_with_error } from './page/respond_with_error.js';
11
- import { is_form_content_type } from '../../utils/http.js';
11
+ import { get_set_cookies, is_form_content_type } from '../../utils/http.js';
12
12
  import {
13
13
  handle_fatal_error,
14
14
  has_prerendered_path,
@@ -511,19 +511,16 @@ export async function internal_respond(request, options, manifest, state) {
511
511
  if (if_none_match_value === etag) {
512
512
  const headers = new Headers({ etag });
513
513
 
514
- // https://datatracker.ietf.org/doc/html/rfc7232#section-4.1 + set-cookie
515
- for (const key of [
516
- 'cache-control',
517
- 'content-location',
518
- 'date',
519
- 'expires',
520
- 'vary',
521
- 'set-cookie'
522
- ]) {
514
+ // https://datatracker.ietf.org/doc/html/rfc7232#section-4.1
515
+ for (const key of ['cache-control', 'content-location', 'date', 'expires', 'vary']) {
523
516
  const value = response.headers.get(key);
524
517
  if (value) headers.set(key, value);
525
518
  }
526
519
 
520
+ for (const cookie of get_set_cookies(response.headers)) {
521
+ headers.append('set-cookie', cookie);
522
+ }
523
+
527
524
  return new Response(undefined, {
528
525
  status: 304,
529
526
  headers
package/src/utils/http.js CHANGED
@@ -1,3 +1,4 @@
1
+ import * as set_cookie_parser from 'set-cookie-parser';
1
2
  import { BINARY_FORM_CONTENT_TYPE } from '../runtime/form-utils.js';
2
3
 
3
4
  /**
@@ -56,6 +57,26 @@ export function negotiate(accept, types) {
56
57
  return accepted;
57
58
  }
58
59
 
60
+ /**
61
+ * Reads all `Set-Cookie` headers as separate values. `Headers.get('set-cookie')`
62
+ * collapses them into a single comma-joined string that browsers cannot parse, so
63
+ * we use `Headers.getSetCookie()` where available and fall back to splitting the
64
+ * joined string otherwise.
65
+ *
66
+ * TODO 3.0 `getSetCookie` is available in Node 19.7+; once we drop support for
67
+ * older versions we can use it directly and remove the `splitCookiesString` fallback
68
+ * @param {Headers} headers
69
+ * @returns {string[]}
70
+ */
71
+ export function get_set_cookies(headers) {
72
+ if (typeof headers.getSetCookie === 'function') {
73
+ return headers.getSetCookie();
74
+ }
75
+
76
+ const set_cookie = headers.get('set-cookie');
77
+ return set_cookie ? set_cookie_parser.splitCookiesString(set_cookie) : [];
78
+ }
79
+
59
80
  /**
60
81
  * Returns `true` if the request contains a `content-type` header with the given type
61
82
  * @param {Request} request
@@ -3,7 +3,7 @@ import { decode_params } from './url.js';
3
3
 
4
4
  const param_pattern = /^(\[)?(\.\.\.)?(\w+)(?:=(\w+))?(\])?$/;
5
5
 
6
- const root_group_pattern = /^\/\((?:.+)\)$/;
6
+ const root_group_pattern = /^\/\((?:[^)]+)\)$/;
7
7
 
8
8
  /**
9
9
  * Creates the regex pattern, extracts parameter names, and generates types for a route
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.61.0';
4
+ export const VERSION = '2.62.0';
package/types/index.d.ts CHANGED
@@ -116,7 +116,7 @@ declare module '@sveltejs/kit' {
116
116
  generateFallback: (dest: string) => Promise<void>;
117
117
 
118
118
  /**
119
- * Generate a module exposing build-time environment variables as `$env/dynamic/public`.
119
+ * Generate a module exposing build-time environment variables as `$env/dynamic/public` if the app uses it.
120
120
  */
121
121
  generateEnvModule: () => void;
122
122
 
@@ -2923,7 +2923,7 @@ declare module '@sveltejs/kit' {
2923
2923
  class Redirect_1 {
2924
2924
 
2925
2925
  constructor(status: 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308, location: string);
2926
- status: 301 | 302 | 303 | 307 | 308 | 300 | 304 | 305 | 306;
2926
+ status: 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308;
2927
2927
  location: string;
2928
2928
  }
2929
2929
 
@@ -3036,11 +3036,14 @@ declare module '@sveltejs/kit/node/polyfills' {
3036
3036
  }
3037
3037
 
3038
3038
  declare module '@sveltejs/kit/vite' {
3039
+ import type { KitConfig } from '@sveltejs/kit';
3040
+ import type { SvelteConfig } from '@sveltejs/vite-plugin-svelte';
3039
3041
  import type { Plugin } from 'vite';
3040
3042
  /**
3041
3043
  * Returns the SvelteKit Vite plugins.
3044
+ * Since version 2.62.0 you can pass [configuration](configuration) directly, in which case `svelte.config.js` is ignored.
3042
3045
  * */
3043
- export function sveltekit(): Promise<Plugin[]>;
3046
+ export function sveltekit(config?: KitConfig & Omit<SvelteConfig, "onwarn">): Promise<Plugin[]>;
3044
3047
 
3045
3048
  export {};
3046
3049
  }
@@ -238,6 +238,6 @@
238
238
  null,
239
239
  null
240
240
  ],
241
- "mappings": "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",
241
+ "mappings": "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",
242
242
  "ignoreList": []
243
243
  }