@sveltejs/kit 3.0.0-next.22 → 3.0.0-next.24

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.
Files changed (106) hide show
  1. package/package.json +40 -9
  2. package/src/cli.js +3 -3
  3. package/src/constants.js +13 -1
  4. package/src/core/adapt/builder.js +2 -3
  5. package/src/core/env.js +139 -181
  6. package/src/core/postbuild/analyse.js +9 -4
  7. package/src/core/postbuild/prerender.js +22 -23
  8. package/src/core/sync/create_manifest_data/index.js +29 -33
  9. package/src/core/sync/sync.js +23 -40
  10. package/src/core/sync/write_app_manifest.js +83 -0
  11. package/src/core/sync/write_client_manifest.js +6 -4
  12. package/src/core/sync/write_server.js +10 -6
  13. package/src/core/sync/write_types/index.js +2 -2
  14. package/src/core/utils.js +0 -28
  15. package/src/exports/hooks/public.d.ts +9 -1
  16. package/src/exports/index.js +10 -0
  17. package/src/exports/node/index.js +77 -5
  18. package/src/exports/public.d.ts +9 -0
  19. package/src/exports/vite/build/build_server.js +3 -3
  20. package/src/exports/vite/build/utils.js +48 -4
  21. package/src/exports/vite/dev/index.js +11 -22
  22. package/src/exports/vite/index.js +62 -345
  23. package/src/exports/vite/module_ids.js +1 -11
  24. package/src/exports/vite/plugins/env-vars.js +117 -0
  25. package/src/exports/vite/preview/index.js +6 -4
  26. package/src/exports/vite/utils.js +2 -4
  27. package/src/runtime/app/env/{types.d.ts → client.js} +9 -4
  28. package/src/runtime/app/env/index.js +1 -2
  29. package/src/runtime/app/env/private/index.js +1 -0
  30. package/src/runtime/app/env/public/client.js +1 -1
  31. package/src/runtime/app/env/public/server.js +1 -1
  32. package/src/runtime/app/env/{internal.js → server.js} +4 -4
  33. package/src/runtime/app/forms/client.js +263 -0
  34. package/src/runtime/app/forms/index.js +1 -263
  35. package/src/runtime/app/forms/public.d.ts +1 -1
  36. package/src/runtime/app/forms/server.js +6 -0
  37. package/src/runtime/app/forms/shared.js +34 -0
  38. package/src/runtime/app/manifest/index.js +1 -1
  39. package/src/runtime/app/navigation/client.js +15 -0
  40. package/src/runtime/app/navigation/index.js +1 -15
  41. package/src/runtime/app/navigation/public.d.ts +1 -1
  42. package/src/runtime/app/navigation/server.js +15 -0
  43. package/src/runtime/app/paths/server.js +1 -1
  44. package/src/runtime/app/server/public.d.ts +512 -0
  45. package/src/runtime/app/server/remote/command.js +1 -1
  46. package/src/runtime/app/server/remote/form.js +16 -6
  47. package/src/runtime/app/server/remote/prerender.js +2 -3
  48. package/src/runtime/app/server/remote/query.js +2 -2
  49. package/src/runtime/app/server/remote/requested.js +3 -3
  50. package/src/runtime/app/state/client.svelte.js +207 -0
  51. package/src/runtime/app/state/index.js +1 -66
  52. package/src/runtime/app/state/public.d.ts +1 -1
  53. package/src/runtime/client/bundle.js +1 -1
  54. package/src/runtime/client/client.js +206 -274
  55. package/src/runtime/client/fetcher.js +18 -8
  56. package/src/runtime/client/remote-functions/command.svelte.js +1 -1
  57. package/src/runtime/client/remote-functions/form.svelte.js +10 -7
  58. package/src/runtime/client/remote-functions/prerender.svelte.js +2 -2
  59. package/src/runtime/client/remote-functions/query/index.js +1 -1
  60. package/src/runtime/client/remote-functions/query/instance.svelte.js +2 -1
  61. package/src/runtime/client/remote-functions/query-batch.svelte.js +1 -1
  62. package/src/runtime/client/remote-functions/query-live/index.js +1 -1
  63. package/src/runtime/client/remote-functions/query-live/instance.svelte.js +4 -3
  64. package/src/runtime/client/remote-functions/query-live/iterator.js +1 -1
  65. package/src/runtime/client/remote-functions/shared.svelte.js +3 -3
  66. package/src/runtime/client/snapshots.js +1 -3
  67. package/src/runtime/client/stream.js +27 -20
  68. package/src/runtime/client/utils.js +7 -3
  69. package/src/runtime/components/root.svelte +5 -5
  70. package/src/runtime/env/dynamic/private.js +1 -1
  71. package/src/runtime/env/static/private.js +1 -1
  72. package/src/runtime/error-chain.js +54 -0
  73. package/src/runtime/form-utils.js +53 -77
  74. package/src/runtime/invalid-import.js +1 -0
  75. package/src/runtime/props.svelte.js +1 -1
  76. package/src/runtime/server/data/index.js +1 -1
  77. package/src/runtime/server/endpoint.js +8 -3
  78. package/src/runtime/server/env_module.js +1 -1
  79. package/src/runtime/server/errors.js +2 -2
  80. package/src/runtime/server/index.js +2 -2
  81. package/src/runtime/server/page/actions.js +77 -122
  82. package/src/runtime/server/page/index.js +37 -69
  83. package/src/runtime/server/page/render.js +18 -23
  84. package/src/runtime/server/remote-functions.js +15 -43
  85. package/src/runtime/server/respond.js +23 -3
  86. package/src/telemetry.js +1 -33
  87. package/src/types/ambient-private.d.ts +9 -17
  88. package/src/types/internal.d.ts +21 -5
  89. package/src/types/private.d.ts +1 -1
  90. package/src/utils/exports.js +1 -0
  91. package/src/utils/filesystem.js +9 -21
  92. package/src/utils/functions.js +10 -0
  93. package/src/utils/promise.js +25 -0
  94. package/src/utils/routing.js +0 -11
  95. package/src/utils/url.js +0 -11
  96. package/src/version.js +1 -1
  97. package/types/index.d.ts +1134 -1136
  98. package/types/index.d.ts.map +50 -50
  99. package/src/exports/remote/index.js +0 -11
  100. package/src/exports/remote/public.d.ts +0 -519
  101. package/src/runtime/app/env/private.js +0 -1
  102. package/src/runtime/app/env/standard-schema.d.ts +0 -0
  103. package/src/runtime/app/state/client.js +0 -63
  104. package/src/runtime/client/state.svelte.js +0 -98
  105. package/src/runtime/server/ambient.d.ts +0 -4
  106. package/src/utils/path.js +0 -23
@@ -1,263 +1 @@
1
- /** @import { ActionResult, SubmitFunction } from './types.js' */
2
- import { DEV } from 'esm-env';
3
- import { noop } from '../../../utils/functions.js';
4
- import { refreshAll } from '../navigation/index.js';
5
- import {
6
- applyAction,
7
- apply_action_navigation,
8
- handle_error,
9
- is_current_location
10
- } from '../../client/client.js';
11
- import { notify_version } from '../../client/state.svelte.js';
12
- import { parse } from '#app/internal/transport';
13
-
14
- export { applyAction };
15
-
16
- /**
17
- * Use this function to deserialize the response from a form submission.
18
- * Usage:
19
- *
20
- * ```js
21
- * import { deserialize } from '$app/forms';
22
- *
23
- * async function handleSubmit(event) {
24
- * const response = await fetch('/form?/action', {
25
- * method: 'POST',
26
- * body: new FormData(event.target)
27
- * });
28
- *
29
- * const result = deserialize(await response.text());
30
- * // ...
31
- * }
32
- * ```
33
- * @template {Record<string, unknown> | undefined} Success
34
- * @template {Record<string, unknown> | undefined} Failure
35
- * @param {string} result
36
- * @returns {ActionResult<Success, Failure>}
37
- */
38
- export function deserialize(result) {
39
- const parsed = JSON.parse(result);
40
-
41
- if (parsed.data) {
42
- parsed.data = parse(parsed.data);
43
- }
44
-
45
- return parsed;
46
- }
47
-
48
- /**
49
- * Shallow clone an element, so that we can access e.g. `form.action` without worrying
50
- * that someone has added an `<input name="action">` (https://github.com/sveltejs/kit/issues/7593)
51
- * @template {HTMLElement} T
52
- * @param {T} element
53
- * @returns {T}
54
- */
55
- function clone(element) {
56
- return /** @type {T} */ (HTMLElement.prototype.cloneNode.call(element));
57
- }
58
-
59
- /**
60
- * This action enhances a `<form>` element that otherwise would work without JavaScript.
61
- *
62
- * The `submit` function is called upon submission with the given FormData and the `action` that should be triggered.
63
- * If `cancel` is called, the form will not be submitted.
64
- * You can use the abort `controller` to cancel the submission in case another one starts.
65
- * If a function is returned, that function is called with the response from the server.
66
- * If nothing is returned, the fallback will be used.
67
- *
68
- * If this function or its return value isn't set, it emulates the browser-native behaviour, just without the full-page reload. It
69
- * - resets the `<form>` element and refreshes all data in case of a successful submission with no redirect response
70
- * - updates the `form` prop, `page.form` and `page.status` if the action is on the same page as the form
71
- * - navigates to the page the submission lands on — populating that page's `form` prop and `page.status` — on success and failure if that isn't the current page, just as a native form submission would, but with the `?/actionName` param stripped from the destination URL
72
- * - redirects in case of a redirect response
73
- * - renders the nearest error page in case of an unexpected error — the one nearest the action's route, if the action is on a different page
74
- *
75
- * If you provide a custom function with a callback and want to use the default behavior, invoke `update` in your callback.
76
- * It accepts an options object
77
- * - `reset: false` if you don't want the `<form>` values to be reset after a successful submission
78
- * - `refreshAll` to control whether all data is refreshed after submission; it defaults to `true` for successes and `false` for failures
79
- * - `navigate: false` to apply non-redirect results to the current page rather than navigating to `result.location`; redirects are always followed
80
- * @template {Record<string, unknown> | undefined} Success
81
- * @template {Record<string, unknown> | undefined} Failure
82
- * @param {HTMLFormElement} form_element The form element
83
- * @param {SubmitFunction<Success, Failure>} submit Submit callback
84
- */
85
- export function enhance(form_element, submit = noop) {
86
- if (DEV && clone(form_element).method !== 'post') {
87
- throw new Error('use:enhance can only be used on <form> fields with method="POST"');
88
- }
89
-
90
- /**
91
- * @param {{
92
- * result: ActionResult;
93
- * reset?: boolean;
94
- * refreshAll?: boolean;
95
- * invalidateAll?: boolean;
96
- * navigate?: boolean;
97
- * }} opts
98
- */
99
- const fallback_callback = async ({
100
- result,
101
- reset = true,
102
- refreshAll: should_refresh_all,
103
- invalidateAll: deprecated_invalidate_all,
104
- navigate = true
105
- }) => {
106
- if (DEV && deprecated_invalidate_all !== undefined) {
107
- console.warn(
108
- 'The `update({ invalidateAll })` option has been deprecated in favour of `update({ refreshAll })`'
109
- );
110
- }
111
-
112
- should_refresh_all ??= deprecated_invalidate_all ?? result.type === 'success';
113
-
114
- if (result.type === 'success' && reset) {
115
- // We call reset from the prototype to avoid DOM clobbering
116
- HTMLFormElement.prototype.reset.call(form_element);
117
- }
118
-
119
- const destination =
120
- navigate && result.type !== 'redirect' && !is_current_location(result.location)
121
- ? result.location
122
- : undefined;
123
-
124
- if (destination === undefined) {
125
- if (should_refresh_all && result.type !== 'redirect') {
126
- await refreshAll();
127
- }
128
-
129
- await applyAction(result);
130
- return;
131
- }
132
-
133
- // emulate the browser: navigate to where the submission lands, rendering that
134
- // page with this result
135
- await apply_action_navigation(destination, result, should_refresh_all);
136
- };
137
-
138
- /** @param {SubmitEvent} event */
139
- async function handle_submit(event) {
140
- const method = event.submitter?.hasAttribute('formmethod')
141
- ? /** @type {HTMLButtonElement | HTMLInputElement} */ (event.submitter).formMethod
142
- : clone(form_element).method;
143
- if (method !== 'post') return;
144
-
145
- event.preventDefault();
146
-
147
- const action = new URL(
148
- // We can't do submitter.formAction directly because that property is always set
149
- event.submitter?.hasAttribute('formaction')
150
- ? /** @type {HTMLButtonElement | HTMLInputElement} */ (event.submitter).formAction
151
- : clone(form_element).action
152
- );
153
-
154
- const enctype = event.submitter?.hasAttribute('formenctype')
155
- ? /** @type {HTMLButtonElement | HTMLInputElement} */ (event.submitter).formEnctype
156
- : clone(form_element).enctype;
157
-
158
- const form_data = new FormData(form_element, event.submitter);
159
-
160
- if (DEV && enctype !== 'multipart/form-data') {
161
- for (const value of form_data.values()) {
162
- if (value instanceof File) {
163
- throw new Error(
164
- 'Your form contains <input type="file"> fields, but is missing the necessary `enctype="multipart/form-data"` attribute. This will lead to inconsistent behavior between enhanced and native forms. For more details, see https://github.com/sveltejs/kit/issues/9819.'
165
- );
166
- }
167
- }
168
- }
169
-
170
- const controller = new AbortController();
171
-
172
- let cancelled = false;
173
- const cancel = () => (cancelled = true);
174
-
175
- const callback =
176
- (await submit({
177
- action,
178
- cancel,
179
- controller,
180
- formData: form_data,
181
- formElement: form_element,
182
- submitter: event.submitter
183
- })) ?? fallback_callback;
184
- if (cancelled) return;
185
-
186
- /** @type {ActionResult} */
187
- let result;
188
-
189
- try {
190
- const headers = new Headers({
191
- accept: 'application/json',
192
- 'x-sveltekit-action': 'true'
193
- });
194
-
195
- // do not explicitly set the `Content-Type` header when sending `FormData`
196
- // or else it will interfere with the browser's header setting
197
- // see https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest_API/Using_FormData_Objects#sect4
198
- if (enctype !== 'multipart/form-data') {
199
- headers.set(
200
- 'Content-Type',
201
- /^(:?application\/x-www-form-urlencoded|text\/plain)$/.test(enctype)
202
- ? enctype
203
- : 'application/x-www-form-urlencoded'
204
- );
205
- }
206
-
207
- // @ts-expect-error `URLSearchParams(form_data)` is kosher, but typescript doesn't know that
208
- const body = enctype === 'multipart/form-data' ? form_data : new URLSearchParams(form_data);
209
-
210
- const response = await fetch(action, {
211
- method: 'POST',
212
- headers,
213
- cache: 'no-store',
214
- body,
215
- signal: controller.signal
216
- });
217
-
218
- // detect new deployments from the response header
219
- notify_version(response.headers.get('x-sveltekit-version'));
220
-
221
- result = deserialize(await response.text());
222
- if (result.type === 'error' || result.type === 'failure') {
223
- result.status = response.status;
224
- }
225
- } catch (error) {
226
- if (/** @type {any} */ (error)?.name === 'AbortError') return;
227
- result = {
228
- type: 'error',
229
- error: await handle_error(error, {
230
- params: {},
231
- route: { id: null },
232
- url: new URL(location.href)
233
- })
234
- };
235
- }
236
-
237
- await callback({
238
- action,
239
- formData: form_data,
240
- formElement: form_element,
241
- update: (opts) =>
242
- fallback_callback({
243
- result,
244
- reset: opts?.reset,
245
- refreshAll: opts?.refreshAll,
246
- invalidateAll: opts?.invalidateAll,
247
- navigate: opts?.navigate
248
- }),
249
- // @ts-expect-error generic constraints stuff we don't care about
250
- result
251
- });
252
- }
253
-
254
- // @ts-expect-error
255
- HTMLFormElement.prototype.addEventListener.call(form_element, 'submit', handle_submit);
256
-
257
- return {
258
- destroy() {
259
- // @ts-expect-error
260
- HTMLFormElement.prototype.removeEventListener.call(form_element, 'submit', handle_submit);
261
- }
262
- };
263
- }
1
+ export { applyAction, deserialize, enhance } from '#app/forms';
@@ -1,2 +1,2 @@
1
- export * from './index.js';
1
+ export * from './client.js';
2
2
  export type { ActionResult, SubmitFunction } from './types.js';
@@ -0,0 +1,6 @@
1
+ import { noop, disallow_on_server } from '../../../utils/functions.js';
2
+
3
+ export { deserialize } from './shared.js';
4
+
5
+ export const applyAction = disallow_on_server('applyAction');
6
+ export const enhance = noop;
@@ -0,0 +1,34 @@
1
+ /** @import { ActionResult } from './types.js' */
2
+ import { parse } from '#app/internal/transport';
3
+
4
+ /**
5
+ * Use this function to deserialize the response from a form submission.
6
+ * Usage:
7
+ *
8
+ * ```js
9
+ * import { deserialize } from '$app/forms';
10
+ *
11
+ * async function handleSubmit(event) {
12
+ * const response = await fetch('/form?/action', {
13
+ * method: 'POST',
14
+ * body: new FormData(event.target)
15
+ * });
16
+ *
17
+ * const result = deserialize(await response.text());
18
+ * // ...
19
+ * }
20
+ * ```
21
+ * @template {Record<string, unknown> | undefined} Success
22
+ * @template {Record<string, unknown> | undefined} Failure
23
+ * @param {string} result
24
+ * @returns {ActionResult<Success, Failure>}
25
+ */
26
+ export function deserialize(result) {
27
+ const parsed = JSON.parse(result);
28
+
29
+ if (parsed.data) {
30
+ parsed.data = parse(parsed.data);
31
+ }
32
+
33
+ return parsed;
34
+ }
@@ -1 +1 @@
1
- export * from '__sveltekit/manifest-data';
1
+ export * from '<sveltekit:generated>/app-manifest.js';
@@ -0,0 +1,15 @@
1
+ export {
2
+ afterNavigate,
3
+ beforeNavigate,
4
+ disableScrollHandling,
5
+ goto,
6
+ invalidate,
7
+ invalidateAll,
8
+ refreshAll,
9
+ onNavigate,
10
+ preloadCode,
11
+ preloadData,
12
+ pushState,
13
+ replaceState
14
+ } from '../../client/client.js';
15
+ export { snapshot } from '../../client/snapshots.js';
@@ -1,15 +1 @@
1
- export {
2
- afterNavigate,
3
- beforeNavigate,
4
- disableScrollHandling,
5
- goto,
6
- invalidate,
7
- invalidateAll,
8
- refreshAll,
9
- onNavigate,
10
- preloadCode,
11
- preloadData,
12
- pushState,
13
- replaceState
14
- } from '../../client/client.js';
15
- export { snapshot } from '../../client/snapshots.js';
1
+ export * from '#app/navigation';
@@ -1,6 +1,6 @@
1
1
  import type { LayoutParams as AppLayoutParams, RouteId as AppRouteId } from '$app/types';
2
2
 
3
- export * from './index.js';
3
+ export * from './client.js';
4
4
 
5
5
  /**
6
6
  * Information about the target of a specific navigation.
@@ -0,0 +1,15 @@
1
+ import { noop, disallow_on_server } from '../../../utils/functions.js';
2
+
3
+ export const afterNavigate = noop;
4
+ export const beforeNavigate = noop;
5
+ export const disableScrollHandling = disallow_on_server('disableScrollHandling', '()');
6
+ export const goto = disallow_on_server('goto');
7
+ export const invalidate = disallow_on_server('invalidate');
8
+ export const invalidateAll = disallow_on_server('invalidateAll', '()');
9
+ export const onNavigate = noop;
10
+ export const refreshAll = disallow_on_server('refreshAll', '()');
11
+ export const preloadCode = disallow_on_server('preloadCode');
12
+ export const preloadData = disallow_on_server('preloadData');
13
+ export const pushState = disallow_on_server('pushState');
14
+ export const replaceState = disallow_on_server('replaceState');
15
+ export const snapshot = noop;
@@ -4,7 +4,7 @@ import { decode_pathname } from '../../../utils/url.js';
4
4
  import { add_data_suffix } from '../../../pathname.js';
5
5
  import { try_get_request_store } from '@sveltejs/kit/internal/server';
6
6
  import { manifest } from '../../server/internal.js';
7
- import { get_hooks } from '__SERVER__/internal.js';
7
+ import { get_hooks } from '<sveltekit:generated>/server.js';
8
8
  import { DEV } from 'esm-env';
9
9
 
10
10
  export { base, assets, app_dir } from './internal/server.js';