@sveltejs/kit 2.54.0 → 2.56.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.
Files changed (45) hide show
  1. package/package.json +3 -4
  2. package/src/core/postbuild/analyse.js +3 -3
  3. package/src/core/postbuild/prerender.js +9 -6
  4. package/src/core/sync/write_non_ambient.js +143 -37
  5. package/src/core/sync/write_tsconfig.js +3 -1
  6. package/src/core/sync/write_types/index.js +1 -5
  7. package/src/exports/internal/remote-functions.js +2 -2
  8. package/src/exports/public.d.ts +38 -12
  9. package/src/exports/vite/build/build_server.js +24 -4
  10. package/src/exports/vite/build/build_service_worker.js +16 -6
  11. package/src/exports/vite/build/utils.js +18 -3
  12. package/src/exports/vite/index.js +336 -327
  13. package/src/runtime/app/paths/server.js +1 -1
  14. package/src/runtime/app/server/index.js +1 -1
  15. package/src/runtime/app/server/remote/command.js +12 -7
  16. package/src/runtime/app/server/remote/form.js +14 -14
  17. package/src/runtime/app/server/remote/index.js +1 -0
  18. package/src/runtime/app/server/remote/prerender.js +8 -7
  19. package/src/runtime/app/server/remote/query.js +141 -66
  20. package/src/runtime/app/server/remote/requested.js +172 -0
  21. package/src/runtime/app/server/remote/shared.js +32 -10
  22. package/src/runtime/app/state/server.js +1 -1
  23. package/src/runtime/client/client.js +45 -20
  24. package/src/runtime/client/remote-functions/command.svelte.js +39 -16
  25. package/src/runtime/client/remote-functions/form.svelte.js +41 -24
  26. package/src/runtime/client/remote-functions/prerender.svelte.js +105 -76
  27. package/src/runtime/client/remote-functions/query.svelte.js +408 -138
  28. package/src/runtime/client/remote-functions/shared.svelte.js +95 -94
  29. package/src/runtime/components/svelte-5/error.svelte +2 -0
  30. package/src/runtime/form-utils.js +3 -7
  31. package/src/runtime/server/endpoint.js +0 -1
  32. package/src/runtime/server/page/actions.js +2 -1
  33. package/src/runtime/server/page/load_data.js +3 -1
  34. package/src/runtime/server/page/render.js +38 -15
  35. package/src/runtime/server/remote.js +65 -50
  36. package/src/runtime/server/respond.js +17 -3
  37. package/src/runtime/server/utils.js +0 -12
  38. package/src/runtime/shared.js +233 -5
  39. package/src/types/global-private.d.ts +4 -4
  40. package/src/types/internal.d.ts +80 -44
  41. package/src/utils/css.js +0 -3
  42. package/src/utils/escape.js +15 -3
  43. package/src/version.js +1 -1
  44. package/types/index.d.ts +67 -13
  45. package/types/index.d.ts.map +6 -1
@@ -1,13 +1,11 @@
1
+ /** @import { RemotePrerenderFunction } from '@sveltejs/kit' */
1
2
  import { app_dir, base } from '$app/paths/internal/client';
2
3
  import { version } from '__sveltekit/environment';
3
4
  import * as devalue from 'devalue';
4
5
  import { DEV } from 'esm-env';
5
- import { app, remote_responses } from '../client.js';
6
- import {
7
- create_remote_function,
8
- get_remote_request_headers,
9
- remote_request
10
- } from './shared.svelte.js';
6
+ import { app, prerender_responses } from '../client.js';
7
+ import { get_remote_request_headers, remote_request } from './shared.svelte.js';
8
+ import { create_remote_key, stringify_remote_arg } from '../../shared.js';
11
9
 
12
10
  // Initialize Cache API for prerender functions
13
11
  const CACHE_NAME = DEV ? `sveltekit:${Date.now()}` : `sveltekit:${version}`;
@@ -32,9 +30,105 @@ const prerender_cache_ready = (async () => {
32
30
  }
33
31
  })();
34
32
 
33
+ /**
34
+ * @param {string} url
35
+ * @param {string} encoded
36
+ */
37
+ function put(url, encoded) {
38
+ return /** @type {Cache} */ (prerender_cache)
39
+ .put(
40
+ url,
41
+ // We need to create a new response because the original response is already consumed
42
+ new Response(encoded, {
43
+ headers: {
44
+ 'Content-Type': 'application/json'
45
+ }
46
+ })
47
+ )
48
+ .catch(() => {
49
+ // Nothing we can do here
50
+ });
51
+ }
52
+
53
+ /**
54
+ * @param {string} id
55
+ * @returns {RemotePrerenderFunction<any, any>}
56
+ */
57
+ export function prerender(id) {
58
+ return (arg) => {
59
+ const payload = stringify_remote_arg(arg, app.hooks.transport);
60
+ const cache_key = create_remote_key(id, payload);
61
+
62
+ let resource = prerender_resources.get(cache_key)?.deref();
63
+
64
+ if (!resource) {
65
+ resource = new Prerender(async () => {
66
+ await prerender_cache_ready;
67
+
68
+ const url = `${base}/${app_dir}/remote/${id}${payload ? `/${payload}` : ''}`;
69
+
70
+ if (Object.hasOwn(prerender_responses, cache_key)) {
71
+ const data = prerender_responses[cache_key];
72
+
73
+ if (prerender_cache) {
74
+ void put(url, devalue.stringify(data, app.encoders));
75
+ }
76
+
77
+ return data;
78
+ }
79
+
80
+ // Do this here, after await Svelte' reactivity context is gone.
81
+ const headers = get_remote_request_headers();
82
+
83
+ // Check the Cache API first
84
+ if (prerender_cache) {
85
+ try {
86
+ const cached_response = await prerender_cache.match(url);
87
+
88
+ if (cached_response) {
89
+ const cached_result = await cached_response.text();
90
+ return devalue.parse(cached_result, app.decoders);
91
+ }
92
+ } catch {
93
+ void prerender_cache.delete(url);
94
+ }
95
+ }
96
+
97
+ const encoded = await remote_request(url, headers);
98
+
99
+ // For successful prerender requests, save to cache
100
+ if (prerender_cache) {
101
+ void put(url, encoded);
102
+ }
103
+
104
+ return devalue.parse(encoded, app.decoders);
105
+ });
106
+
107
+ prerender_resources.set(cache_key, new WeakRef(resource));
108
+ prerender_resource_cleanup?.register(resource, cache_key);
109
+ }
110
+
111
+ return resource;
112
+ };
113
+ }
114
+
115
+ /** @type {Map<string, WeakRef<Prerender<any>>>} */
116
+ const prerender_resources = new Map();
117
+
118
+ /** @type {FinalizationRegistry<string> | null} */
119
+ const prerender_resource_cleanup =
120
+ typeof FinalizationRegistry === 'undefined'
121
+ ? null
122
+ : new FinalizationRegistry((cache_key) => {
123
+ const ref = prerender_resources.get(cache_key);
124
+ if (ref && ref.deref() === undefined) {
125
+ prerender_resources.delete(cache_key);
126
+ }
127
+ });
128
+
35
129
  /**
36
130
  * @template T
37
- * @implements {Partial<Promise<T>>}
131
+ * @implements {Promise<T>}
38
132
  */
39
133
  class Prerender {
40
134
  /** @type {Promise<T>} */
@@ -42,7 +136,6 @@ class Prerender {
42
136
 
43
137
  #loading = $state(true);
44
138
  #ready = $state(false);
45
-
46
139
  /** @type {T | undefined} */
47
140
  #current = $state.raw();
48
141
 
@@ -57,6 +150,7 @@ class Prerender {
57
150
  this.#loading = false;
58
151
  this.#ready = true;
59
152
  this.#current = value;
153
+ this.#error = undefined;
60
154
  return value;
61
155
  },
62
156
  (error) => {
@@ -112,73 +206,8 @@ class Prerender {
112
206
  get ready() {
113
207
  return this.#ready;
114
208
  }
115
- }
116
-
117
- /**
118
- * @param {string} url
119
- * @param {string} encoded
120
- */
121
- function put(url, encoded) {
122
- return /** @type {Cache} */ (prerender_cache)
123
- .put(
124
- url,
125
- // We need to create a new response because the original response is already consumed
126
- new Response(encoded, {
127
- headers: {
128
- 'Content-Type': 'application/json'
129
- }
130
- })
131
- )
132
- .catch(() => {
133
- // Nothing we can do here
134
- });
135
- }
136
209
 
137
- /**
138
- * @param {string} id
139
- */
140
- export function prerender(id) {
141
- return create_remote_function(id, (cache_key, payload) => {
142
- return new Prerender(async () => {
143
- await prerender_cache_ready;
144
-
145
- const url = `${base}/${app_dir}/remote/${id}${payload ? `/${payload}` : ''}`;
146
-
147
- if (Object.hasOwn(remote_responses, cache_key)) {
148
- const data = remote_responses[cache_key];
149
-
150
- if (prerender_cache) {
151
- void put(url, devalue.stringify(data, app.encoders));
152
- }
153
-
154
- return data;
155
- }
156
-
157
- // Do this here, after await Svelte' reactivity context is gone.
158
- const headers = get_remote_request_headers();
159
-
160
- // Check the Cache API first
161
- if (prerender_cache) {
162
- try {
163
- const cached_response = await prerender_cache.match(url);
164
-
165
- if (cached_response) {
166
- const cached_result = await cached_response.text();
167
- return devalue.parse(cached_result, app.decoders);
168
- }
169
- } catch {
170
- // Nothing we can do here
171
- }
172
- }
173
-
174
- const encoded = await remote_request(url, headers);
175
-
176
- // For successful prerender requests, save to cache
177
- if (prerender_cache) {
178
- void put(url, encoded);
179
- }
180
-
181
- return devalue.parse(encoded, app.decoders);
182
- });
183
- });
210
+ get [Symbol.toStringTag]() {
211
+ return 'Prerender';
212
+ }
184
213
  }