@sveltejs/kit 2.37.1 → 2.38.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.37.1",
3
+ "version": "2.38.1",
4
4
  "description": "SvelteKit is the fastest way to build Svelte apps",
5
5
  "keywords": [
6
6
  "framework",
@@ -10,9 +10,15 @@ export function validate_remote_functions(module, file) {
10
10
  }
11
11
 
12
12
  for (const name in module) {
13
- const type = module[name]?.__?.type;
13
+ const type = /** @type {import('types').RemoteInfo['type']} */ (module[name]?.__?.type);
14
14
 
15
- if (type !== 'form' && type !== 'command' && type !== 'query' && type !== 'prerender') {
15
+ if (
16
+ type !== 'form' &&
17
+ type !== 'command' &&
18
+ type !== 'query' &&
19
+ type !== 'query_batch' &&
20
+ type !== 'prerender'
21
+ ) {
16
22
  throw new Error(
17
23
  `\`${name}\` exported from ${file} is invalid — all exports from this file must be remote functions`
18
24
  );
@@ -64,7 +64,13 @@ export function command(validate_or_fn, maybe_fn) {
64
64
  const wrapper = (arg) => {
65
65
  const { event, state } = get_request_store();
66
66
 
67
- if (!event.isRemoteRequest) {
67
+ if (state.is_endpoint_request) {
68
+ if (!['POST', 'PUT', 'PATCH', 'DELETE'].includes(event.request.method)) {
69
+ throw new Error(
70
+ `Cannot call a command (\`${__.name}(${maybe_fn ? '...' : ''})\`) from a ${event.request.method} handler`
71
+ );
72
+ }
73
+ } else if (!event.isRemoteRequest) {
68
74
  throw new Error(
69
75
  `Cannot call a command (\`${__.name}(${maybe_fn ? '...' : ''})\`) during server-side rendering`
70
76
  );
@@ -122,3 +122,149 @@ export function query(validate_or_fn, maybe_fn) {
122
122
 
123
123
  return wrapper;
124
124
  }
125
+
126
+ /**
127
+ * Creates a batch query function that collects multiple calls and executes them in a single request
128
+ *
129
+ * See [Remote functions](https://svelte.dev/docs/kit/remote-functions#query.batch) for full documentation.
130
+ *
131
+ * @template Input
132
+ * @template Output
133
+ * @overload
134
+ * @param {'unchecked'} validate
135
+ * @param {(args: Input[]) => MaybePromise<(arg: Input, idx: number) => Output>} fn
136
+ * @returns {RemoteQueryFunction<Input, Output>}
137
+ * @since 2.35
138
+ */
139
+ /**
140
+ * Creates a batch query function that collects multiple calls and executes them in a single request
141
+ *
142
+ * See [Remote functions](https://svelte.dev/docs/kit/remote-functions#query.batch) for full documentation.
143
+ *
144
+ * @template {StandardSchemaV1} Schema
145
+ * @template Output
146
+ * @overload
147
+ * @param {Schema} schema
148
+ * @param {(args: StandardSchemaV1.InferOutput<Schema>[]) => MaybePromise<(arg: StandardSchemaV1.InferOutput<Schema>, idx: number) => Output>} fn
149
+ * @returns {RemoteQueryFunction<StandardSchemaV1.InferInput<Schema>, Output>}
150
+ * @since 2.35
151
+ */
152
+ /**
153
+ * @template Input
154
+ * @template Output
155
+ * @param {any} validate_or_fn
156
+ * @param {(args?: Input[]) => MaybePromise<(arg: Input, idx: number) => Output>} [maybe_fn]
157
+ * @returns {RemoteQueryFunction<Input, Output>}
158
+ * @since 2.35
159
+ */
160
+ /*@__NO_SIDE_EFFECTS__*/
161
+ function batch(validate_or_fn, maybe_fn) {
162
+ /** @type {(args?: Input[]) => (arg: Input, idx: number) => Output} */
163
+ const fn = maybe_fn ?? validate_or_fn;
164
+
165
+ /** @type {(arg?: any) => MaybePromise<Input>} */
166
+ const validate = create_validator(validate_or_fn, maybe_fn);
167
+
168
+ /** @type {RemoteInfo & { type: 'query_batch' }} */
169
+ const __ = {
170
+ type: 'query_batch',
171
+ id: '',
172
+ name: '',
173
+ run: (args) => {
174
+ const { event, state } = get_request_store();
175
+
176
+ return run_remote_function(
177
+ event,
178
+ state,
179
+ false,
180
+ args,
181
+ (array) => Promise.all(array.map(validate)),
182
+ fn
183
+ );
184
+ }
185
+ };
186
+
187
+ /** @type {{ args: any[], resolvers: Array<{resolve: (value: any) => void, reject: (error: any) => void}> }} */
188
+ let batching = { args: [], resolvers: [] };
189
+
190
+ /** @type {RemoteQueryFunction<Input, Output> & { __: RemoteInfo }} */
191
+ const wrapper = (arg) => {
192
+ if (prerendering) {
193
+ throw new Error(
194
+ `Cannot call query.batch '${__.name}' while prerendering, as prerendered pages need static data. Use 'prerender' from $app/server instead`
195
+ );
196
+ }
197
+
198
+ const { event, state } = get_request_store();
199
+
200
+ /** @type {Promise<any> & Partial<RemoteQuery<any>>} */
201
+ const promise = get_response(__.id, arg, state, () => {
202
+ // Collect all the calls to the same query in the same macrotask,
203
+ // then execute them as one backend request.
204
+ return new Promise((resolve, reject) => {
205
+ // We don't need to deduplicate args here, because get_response already caches/reuses identical calls
206
+ batching.args.push(arg);
207
+ batching.resolvers.push({ resolve, reject });
208
+
209
+ if (batching.args.length > 1) return;
210
+
211
+ setTimeout(async () => {
212
+ const batched = batching;
213
+ batching = { args: [], resolvers: [] };
214
+
215
+ try {
216
+ const get_result = await run_remote_function(
217
+ event,
218
+ state,
219
+ false,
220
+ batched.args,
221
+ (array) => Promise.all(array.map(validate)),
222
+ fn
223
+ );
224
+
225
+ for (let i = 0; i < batched.resolvers.length; i++) {
226
+ try {
227
+ batched.resolvers[i].resolve(get_result(batched.args[i], i));
228
+ } catch (error) {
229
+ batched.resolvers[i].reject(error);
230
+ }
231
+ }
232
+ } catch (error) {
233
+ for (const resolver of batched.resolvers) {
234
+ resolver.reject(error);
235
+ }
236
+ }
237
+ }, 0);
238
+ });
239
+ });
240
+
241
+ promise.catch(() => {});
242
+
243
+ promise.refresh = async () => {
244
+ const { state } = get_request_store();
245
+ const refreshes = state.refreshes;
246
+
247
+ if (!refreshes) {
248
+ throw new Error(
249
+ `Cannot call refresh on query.batch '${__.name}' because it is not executed in the context of a command/form remote function`
250
+ );
251
+ }
252
+
253
+ const cache_key = create_remote_cache_key(__.id, stringify_remote_arg(arg, state.transport));
254
+ refreshes[cache_key] = await /** @type {Promise<any>} */ (promise);
255
+ };
256
+
257
+ promise.withOverride = () => {
258
+ throw new Error(`Cannot call '${__.name}.withOverride()' on the server`);
259
+ };
260
+
261
+ return /** @type {RemoteQuery<Output>} */ (promise);
262
+ };
263
+
264
+ Object.defineProperty(wrapper, '__', { value: __ });
265
+
266
+ return wrapper;
267
+ }
268
+
269
+ // Add batch as a property to the query function
270
+ Object.defineProperty(query, 'batch', { value: batch, enumerable: true });
@@ -1,4 +1,4 @@
1
1
  export { command } from './command.svelte.js';
2
2
  export { form } from './form.svelte.js';
3
3
  export { prerender } from './prerender.svelte.js';
4
- export { query } from './query.svelte.js';
4
+ export { query, query_batch } from './query.svelte.js';
@@ -1,8 +1,11 @@
1
1
  /** @import { RemoteQueryFunction } from '@sveltejs/kit' */
2
+ /** @import { RemoteFunctionResponse } from 'types' */
2
3
  import { app_dir, base } from '__sveltekit/paths';
3
- import { remote_responses, started } from '../client.js';
4
+ import { app, goto, remote_responses, started } from '../client.js';
4
5
  import { tick } from 'svelte';
5
6
  import { create_remote_function, remote_request } from './shared.svelte.js';
7
+ import * as devalue from 'devalue';
8
+ import { HttpError, Redirect } from '@sveltejs/kit/internal';
6
9
 
7
10
  /**
8
11
  * @param {string} id
@@ -25,6 +28,95 @@ export function query(id) {
25
28
  });
26
29
  }
27
30
 
31
+ /**
32
+ * @param {string} id
33
+ * @returns {(arg: any) => Query<any>}
34
+ */
35
+ export function query_batch(id) {
36
+ /** @type {Map<string, Array<{resolve: (value: any) => void, reject: (error: any) => void}>>} */
37
+ let batching = new Map();
38
+
39
+ return create_remote_function(id, (cache_key, payload) => {
40
+ return new Query(cache_key, () => {
41
+ if (!started) {
42
+ const result = remote_responses[cache_key];
43
+ if (result) {
44
+ return result;
45
+ }
46
+ }
47
+
48
+ // Collect all the calls to the same query in the same macrotask,
49
+ // then execute them as one backend request.
50
+ return new Promise((resolve, reject) => {
51
+ // create_remote_function caches identical calls, but in case a refresh to the same query is called multiple times this function
52
+ // is invoked multiple times with the same payload, so we need to deduplicate here
53
+ const entry = batching.get(payload) ?? [];
54
+ entry.push({ resolve, reject });
55
+ batching.set(payload, entry);
56
+
57
+ if (batching.size > 1) return;
58
+
59
+ // Wait for the next macrotask - don't use microtask as Svelte runtime uses these to collect changes and flush them,
60
+ // and flushes could reveal more queries that should be batched.
61
+ setTimeout(async () => {
62
+ const batched = batching;
63
+ batching = new Map();
64
+
65
+ try {
66
+ const response = await fetch(`${base}/${app_dir}/remote/${id}`, {
67
+ method: 'POST',
68
+ body: JSON.stringify({
69
+ payloads: Array.from(batched.keys())
70
+ }),
71
+ headers: {
72
+ 'Content-Type': 'application/json'
73
+ }
74
+ });
75
+
76
+ if (!response.ok) {
77
+ throw new Error('Failed to execute batch query');
78
+ }
79
+
80
+ const result = /** @type {RemoteFunctionResponse} */ (await response.json());
81
+ if (result.type === 'error') {
82
+ throw new HttpError(result.status ?? 500, result.error);
83
+ }
84
+
85
+ if (result.type === 'redirect') {
86
+ await goto(result.location);
87
+ throw new Redirect(307, result.location);
88
+ }
89
+
90
+ const results = devalue.parse(result.result, app.decoders);
91
+
92
+ // Resolve individual queries
93
+ // Maps guarantee insertion order so we can do it like this
94
+ let i = 0;
95
+
96
+ for (const resolvers of batched.values()) {
97
+ for (const { resolve, reject } of resolvers) {
98
+ if (results[i].type === 'error') {
99
+ reject(new HttpError(results[i].status, results[i].error));
100
+ } else {
101
+ resolve(results[i].data);
102
+ }
103
+ }
104
+ i++;
105
+ }
106
+ } catch (error) {
107
+ // Reject all queries in the batch
108
+ for (const resolver of batched.values()) {
109
+ for (const { reject } of resolver) {
110
+ reject(error);
111
+ }
112
+ }
113
+ }
114
+ }, 0);
115
+ });
116
+ });
117
+ });
118
+ }
119
+
28
120
  /**
29
121
  * @template T
30
122
  * @implements {Partial<Promise<T>>}
@@ -21,13 +21,7 @@ export async function remote_request(url) {
21
21
  const result = /** @type {RemoteFunctionResponse} */ (await response.json());
22
22
 
23
23
  if (result.type === 'redirect') {
24
- // resource_cache.delete(cache_key);
25
- // version++;
26
- // await goto(result.location);
27
- // /** @type {Query<any>} */ (resource).refresh();
28
- // TODO double-check this
29
24
  await goto(result.location);
30
- await new Promise((r) => setTimeout(r, 100));
31
25
  throw new Redirect(307, result.location);
32
26
  }
33
27
 
@@ -41,6 +41,8 @@ export async function render_endpoint(event, event_state, mod, state) {
41
41
  }
42
42
  }
43
43
 
44
+ event_state.is_endpoint_request = true;
45
+
44
46
  try {
45
47
  const response = await with_request_store({ event, state: event_state }, () =>
46
48
  handler(/** @type {import('@sveltejs/kit').RequestEvent<Record<string, any>>} */ (event))
@@ -1,4 +1,5 @@
1
1
  import * as devalue from 'devalue';
2
+ import { compact } from '../../../utils/array.js';
2
3
  import { create_async_iterator } from '../../../utils/streaming.js';
3
4
  import {
4
5
  clarify_devalue_error,
@@ -96,7 +97,7 @@ export function server_data_serializer(event, event_state, options) {
96
97
  const close = `</script>\n`;
97
98
 
98
99
  return {
99
- data: `[${strings.join(',')}]`,
100
+ data: `[${compact(strings).join(',')}]`,
100
101
  chunks: promise_id > 1 ? iterator.iterate((str) => open + str + close) : null
101
102
  };
102
103
  }
@@ -195,7 +195,10 @@ export async function render_page(
195
195
  }
196
196
  });
197
197
 
198
- data_serializer.add_node(i, server_data);
198
+ if (node) {
199
+ data_serializer.add_node(i, server_data);
200
+ }
201
+
199
202
  data_serializer_json?.add_node(i, server_data);
200
203
 
201
204
  return server_data;
@@ -348,7 +351,8 @@ export async function render_page(
348
351
  branch: ssr === false ? [] : compact(branch),
349
352
  action_result,
350
353
  fetched,
351
- data_serializer
354
+ data_serializer:
355
+ ssr === false ? server_data_serializer(event, event_state, options) : data_serializer
352
356
  });
353
357
  } catch (e) {
354
358
  // if we end up here, it means the data loaded successfully
@@ -60,20 +60,65 @@ async function handle_remote_call_internal(event, state, options, manifest, id)
60
60
  let form_client_refreshes;
61
61
 
62
62
  try {
63
+ if (info.type === 'query_batch') {
64
+ if (event.request.method !== 'POST') {
65
+ throw new SvelteKitError(
66
+ 405,
67
+ 'Method Not Allowed',
68
+ `\`query.batch\` functions must be invoked via POST request, not ${event.request.method}`
69
+ );
70
+ }
71
+
72
+ /** @type {{ payloads: string[] }} */
73
+ const { payloads } = await event.request.json();
74
+
75
+ const args = payloads.map((payload) => parse_remote_arg(payload, transport));
76
+ const get_result = await with_request_store({ event, state }, () => info.run(args));
77
+ const results = await Promise.all(
78
+ args.map(async (arg, i) => {
79
+ try {
80
+ return { type: 'result', data: get_result(arg, i) };
81
+ } catch (error) {
82
+ return {
83
+ type: 'error',
84
+ error: await handle_error_and_jsonify(event, state, options, error),
85
+ status:
86
+ error instanceof HttpError || error instanceof SvelteKitError ? error.status : 500
87
+ };
88
+ }
89
+ })
90
+ );
91
+
92
+ return json(
93
+ /** @type {RemoteFunctionResponse} */ ({
94
+ type: 'result',
95
+ result: stringify(results, transport)
96
+ })
97
+ );
98
+ }
99
+
63
100
  if (info.type === 'form') {
101
+ if (event.request.method !== 'POST') {
102
+ throw new SvelteKitError(
103
+ 405,
104
+ 'Method Not Allowed',
105
+ `\`form\` functions must be invoked via POST request, not ${event.request.method}`
106
+ );
107
+ }
108
+
64
109
  if (!is_form_content_type(event.request)) {
65
110
  throw new SvelteKitError(
66
111
  415,
67
112
  'Unsupported Media Type',
68
- `Form actions expect form-encoded data — received ${event.request.headers.get(
113
+ `\`form\` functions expect form-encoded data — received ${event.request.headers.get(
69
114
  'content-type'
70
115
  )}`
71
116
  );
72
117
  }
73
118
 
74
119
  const form_data = await event.request.formData();
75
- form_client_refreshes = JSON.parse(
76
- /** @type {string} */ (form_data.get('sveltekit:remote_refreshes')) ?? '[]'
120
+ form_client_refreshes = /** @type {string[]} */ (
121
+ JSON.parse(/** @type {string} */ (form_data.get('sveltekit:remote_refreshes')) ?? '[]')
77
122
  );
78
123
  form_data.delete('sveltekit:remote_refreshes');
79
124
 
@@ -84,7 +129,7 @@ async function handle_remote_call_internal(event, state, options, manifest, id)
84
129
  /** @type {RemoteFunctionResponse} */ ({
85
130
  type: 'result',
86
131
  result: stringify(data, transport),
87
- refreshes: await serialize_refreshes(/** @type {string[]} */ (form_client_refreshes))
132
+ refreshes: await serialize_refreshes(form_client_refreshes)
88
133
  })
89
134
  );
90
135
  }
@@ -149,7 +194,7 @@ async function handle_remote_call_internal(event, state, options, manifest, id)
149
194
  * @param {string[]} client_refreshes
150
195
  */
151
196
  async function serialize_refreshes(client_refreshes) {
152
- const refreshes = /** @type {Record<string, Promise<any>>} */ (state.refreshes);
197
+ const refreshes = state.refreshes ?? {};
153
198
 
154
199
  for (const key of client_refreshes) {
155
200
  if (refreshes[key] !== undefined) continue;
@@ -553,6 +553,16 @@ export type RemoteInfo =
553
553
  id: string;
554
554
  name: string;
555
555
  }
556
+ | {
557
+ /**
558
+ * Corresponds to the name of the client-side exports (that's why we use underscores and not dots)
559
+ */
560
+ type: 'query_batch';
561
+ id: string;
562
+ name: string;
563
+ /** Direct access to the function without batching etc logic, for remote functions called from the client */
564
+ run: (args: any[]) => Promise<(arg: any, idx: number) => any>;
565
+ }
556
566
  | {
557
567
  type: 'form';
558
568
  id: string;
@@ -588,6 +598,7 @@ export interface RequestState {
588
598
  form_instances?: Map<any, any>;
589
599
  remote_data?: Record<string, MaybePromise<any>>;
590
600
  refreshes?: Record<string, Promise<any>>;
601
+ is_endpoint_request?: boolean;
591
602
  }
592
603
 
593
604
  export interface RequestStore {
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.37.1';
4
+ export const VERSION = '2.38.1';
package/types/index.d.ts CHANGED
@@ -2922,6 +2922,24 @@ declare module '$app/server' {
2922
2922
  * @since 2.27
2923
2923
  */
2924
2924
  export function query<Schema extends StandardSchemaV1, Output>(schema: Schema, fn: (arg: StandardSchemaV1.InferOutput<Schema>) => MaybePromise<Output>): RemoteQueryFunction<StandardSchemaV1.InferInput<Schema>, Output>;
2925
+ export namespace query {
2926
+ /**
2927
+ * Creates a batch query function that collects multiple calls and executes them in a single request
2928
+ *
2929
+ * See [Remote functions](https://svelte.dev/docs/kit/remote-functions#query.batch) for full documentation.
2930
+ *
2931
+ * @since 2.35
2932
+ */
2933
+ function batch<Input, Output>(validate: "unchecked", fn: (args: Input[]) => MaybePromise<(arg: Input, idx: number) => Output>): RemoteQueryFunction<Input, Output>;
2934
+ /**
2935
+ * Creates a batch query function that collects multiple calls and executes them in a single request
2936
+ *
2937
+ * See [Remote functions](https://svelte.dev/docs/kit/remote-functions#query.batch) for full documentation.
2938
+ *
2939
+ * @since 2.35
2940
+ */
2941
+ function batch<Schema extends StandardSchemaV1, Output>(schema: Schema, fn: (args: StandardSchemaV1.InferOutput<Schema>[]) => MaybePromise<(arg: StandardSchemaV1.InferOutput<Schema>, idx: number) => Output>): RemoteQueryFunction<StandardSchemaV1.InferInput<Schema>, Output>;
2942
+ }
2925
2943
  type RemotePrerenderInputsGenerator<Input = any> = () => MaybePromise<Input[]>;
2926
2944
  type MaybePromise<T> = T | Promise<T>;
2927
2945
 
@@ -187,6 +187,6 @@
187
187
  null,
188
188
  null
189
189
  ],
190
- "mappings": "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",
190
+ "mappings": "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",
191
191
  "ignoreList": []
192
192
  }