@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.
- package/package.json +3 -4
- package/src/core/postbuild/analyse.js +3 -3
- package/src/core/postbuild/prerender.js +9 -6
- package/src/core/sync/write_non_ambient.js +143 -37
- package/src/core/sync/write_tsconfig.js +3 -1
- package/src/core/sync/write_types/index.js +1 -5
- package/src/exports/internal/remote-functions.js +2 -2
- package/src/exports/public.d.ts +38 -12
- package/src/exports/vite/build/build_server.js +24 -4
- package/src/exports/vite/build/build_service_worker.js +16 -6
- package/src/exports/vite/build/utils.js +18 -3
- package/src/exports/vite/index.js +336 -327
- package/src/runtime/app/paths/server.js +1 -1
- package/src/runtime/app/server/index.js +1 -1
- package/src/runtime/app/server/remote/command.js +12 -7
- package/src/runtime/app/server/remote/form.js +14 -14
- package/src/runtime/app/server/remote/index.js +1 -0
- package/src/runtime/app/server/remote/prerender.js +8 -7
- package/src/runtime/app/server/remote/query.js +141 -66
- package/src/runtime/app/server/remote/requested.js +172 -0
- package/src/runtime/app/server/remote/shared.js +32 -10
- package/src/runtime/app/state/server.js +1 -1
- package/src/runtime/client/client.js +45 -20
- package/src/runtime/client/remote-functions/command.svelte.js +39 -16
- package/src/runtime/client/remote-functions/form.svelte.js +41 -24
- package/src/runtime/client/remote-functions/prerender.svelte.js +105 -76
- package/src/runtime/client/remote-functions/query.svelte.js +408 -138
- package/src/runtime/client/remote-functions/shared.svelte.js +95 -94
- package/src/runtime/components/svelte-5/error.svelte +2 -0
- package/src/runtime/form-utils.js +3 -7
- package/src/runtime/server/endpoint.js +0 -1
- package/src/runtime/server/page/actions.js +2 -1
- package/src/runtime/server/page/load_data.js +3 -1
- package/src/runtime/server/page/render.js +38 -15
- package/src/runtime/server/remote.js +65 -50
- package/src/runtime/server/respond.js +17 -3
- package/src/runtime/server/utils.js +0 -12
- package/src/runtime/shared.js +233 -5
- package/src/types/global-private.d.ts +4 -4
- package/src/types/internal.d.ts +80 -44
- package/src/utils/css.js +0 -3
- package/src/utils/escape.js +15 -3
- package/src/version.js +1 -1
- package/types/index.d.ts +67 -13
- 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,
|
|
6
|
-
import {
|
|
7
|
-
|
|
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 {
|
|
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
|
-
|
|
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
|
}
|