@absolutejs/absolute 0.20.0-beta.174 → 0.20.0-beta.175
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/CHANGELOG.md +23 -0
- package/changelog.json +60 -0
- package/dist/angular/browser.js +13 -2
- package/dist/angular/browser.js.map +3 -3
- package/dist/angular/components/core/streamingSlotRegistrar.js +1 -1
- package/dist/angular/components/core/streamingSlotRegistry.js +2 -2
- package/dist/angular/index.js +67 -8
- package/dist/angular/index.js.map +10 -8
- package/dist/angular/server.js +67 -8
- package/dist/angular/server.js.map +10 -8
- package/dist/build.js +312 -119
- package/dist/build.js.map +20 -18
- package/dist/cli/{compile-n6fs2vmx.js → compile-w2z6c9vt.js} +1 -1
- package/dist/cli/{dev-6h1f0mzq.js → dev-8br5mr7t.js} +16 -2
- package/dist/cli/{index-mqevg32w.js → index-6522t968.js} +21 -2
- package/dist/cli/{index-bhyd3ejc.js → index-7z1hh3fg.js} +1 -1
- package/dist/cli/index.js +6 -6
- package/dist/cli/{islands-vk05sj6v.js → islands-bx67g15t.js} +4 -4
- package/dist/cli/{mobile-62b6j3j7.js → mobile-we5q51ey.js} +2 -2
- package/dist/cli/{start-jh6kyp92.js → start-srs11bm8.js} +2 -2
- package/dist/client/chunks/index-4j1snyh2.js +18 -0
- package/dist/client/chunks/index-4j1snyh2.js.map +10 -0
- package/dist/client/chunks/{index-6b66nzyf.js → index-a3rpg5kw.js} +6 -16
- package/dist/client/chunks/{index-6b66nzyf.js.map → index-a3rpg5kw.js.map} +3 -4
- package/dist/client/chunks/{islands-s2ta5ajb.js → islands-mfjmdwnb.js} +11 -4
- package/dist/client/chunks/{islands-s2ta5ajb.js.map → islands-mfjmdwnb.js.map} +3 -3
- package/dist/client/chunks/{react-dcvkaba2.js → react-sprprqzs.js} +20 -4
- package/dist/client/chunks/react-sprprqzs.js.map +10 -0
- package/dist/client/chunks/svelte-6ewphsvj.js +30 -0
- package/dist/client/chunks/svelte-6ewphsvj.js.map +10 -0
- package/dist/client/chunks/{vue-a84fzp3v.js → vue-db6ppn1f.js} +14 -4
- package/dist/client/chunks/vue-db6ppn1f.js.map +10 -0
- package/dist/client/index.js +65 -8
- package/dist/client/index.js.map +4 -4
- package/dist/client/navigation.js +5 -3
- package/dist/client/navigation.js.map +2 -2
- package/dist/client/prefetch.js +1 -1
- package/dist/dev/client/handlers/islands.ts +85 -0
- package/dist/dev/client/hmrClient.ts +6 -0
- package/dist/index.js +448 -242
- package/dist/index.js.map +21 -19
- package/dist/islands/index.js +57 -10
- package/dist/islands/index.js.map +9 -7
- package/dist/react/browser.js +15 -4
- package/dist/react/browser.js.map +5 -5
- package/dist/react/components/client.js +506 -0
- package/dist/react/components/index.js +14 -15
- package/dist/react/components/index.js.map +4 -4
- package/dist/react/components/server/index.js +728 -0
- package/dist/react/hooks/index.js +14 -15
- package/dist/react/hooks/index.js.map +4 -4
- package/dist/react/index.js +66 -6
- package/dist/react/index.js.map +11 -9
- package/dist/react/router/browser.js +7 -8
- package/dist/react/router/browser.js.map +4 -4
- package/dist/react/router/index.js +7 -8
- package/dist/react/router/index.js.map +4 -4
- package/dist/react/server.js +14 -1
- package/dist/react/server.js.map +4 -4
- package/dist/src/build/buildReactServerComponents.d.ts +4 -0
- package/dist/src/build/islandEntries.d.ts +5 -0
- package/dist/src/client/hydrators/react.d.ts +7 -0
- package/dist/src/client/hydrators/svelte.d.ts +3 -0
- package/dist/src/client/hydrators/vue.d.ts +3 -0
- package/dist/src/client/preserveIslandMarkup.d.ts +5 -0
- package/dist/src/core/islandServerGeneration.d.ts +3 -0
- package/dist/src/react/components/client.d.ts +4 -0
- package/dist/src/react/components/server/index.d.ts +8 -0
- package/dist/src/react/serverComponents/constants.d.ts +2 -1
- package/dist/svelte/index.js +66 -6
- package/dist/svelte/index.js.map +10 -8
- package/dist/svelte/server.js +38 -3
- package/dist/svelte/server.js.map +6 -5
- package/dist/types/build.d.ts +3 -2
- package/dist/types/globals.d.ts +15 -0
- package/dist/vue/browser.js +26 -16
- package/dist/vue/browser.js.map +5 -5
- package/dist/vue/index.js +65 -21
- package/dist/vue/index.js.map +10 -9
- package/package.json +1 -1
- package/dist/client/chunks/react-dcvkaba2.js.map +0 -10
- package/dist/client/chunks/svelte-4yfa5bxa.js +0 -17
- package/dist/client/chunks/svelte-4yfa5bxa.js.map +0 -10
- package/dist/client/chunks/vue-a84fzp3v.js.map +0 -10
|
@@ -0,0 +1,506 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
"use client";
|
|
3
|
+
|
|
4
|
+
// src/react/router/Link.tsx
|
|
5
|
+
import {
|
|
6
|
+
useContext
|
|
7
|
+
} from "react";
|
|
8
|
+
|
|
9
|
+
// src/dev/client/cspNonce.ts
|
|
10
|
+
var applyPageNonce = (element) => {
|
|
11
|
+
const nonce = readPageNonce();
|
|
12
|
+
if (nonce)
|
|
13
|
+
element.nonce = nonce;
|
|
14
|
+
return element;
|
|
15
|
+
};
|
|
16
|
+
var readPageNonce = () => {
|
|
17
|
+
if (typeof document === "undefined")
|
|
18
|
+
return;
|
|
19
|
+
const carrier = document.querySelector("script[nonce], style[nonce]");
|
|
20
|
+
return carrier?.nonce || undefined;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
// src/client/prefetch.ts
|
|
24
|
+
var PREFETCH_CACHE_LIMIT = 16;
|
|
25
|
+
var HOVER_DEBOUNCE_MS = 250;
|
|
26
|
+
var MAX_IN_FLIGHT = 2;
|
|
27
|
+
var MAX_LIVE_SPECULATION_RULES = 2;
|
|
28
|
+
var VIEWPORT_ROOT_MARGIN = "128px";
|
|
29
|
+
var SLOW_EFFECTIVE_TYPES = new Set(["slow-2g", "2g"]);
|
|
30
|
+
var NOT_FOUND = 404;
|
|
31
|
+
var NOT_ACCEPTABLE = 406;
|
|
32
|
+
var ROUTE_DATA_MEDIA_TYPE = "application/vnd.absolute.route+json";
|
|
33
|
+
var cache = new Map;
|
|
34
|
+
var queue = [];
|
|
35
|
+
var inFlight = 0;
|
|
36
|
+
var preloadedModules = new Set;
|
|
37
|
+
var prefetchedStyles = new Set;
|
|
38
|
+
var liveSpeculationRules = new Map;
|
|
39
|
+
var offlineResponse = () => new Response(null, { status: 0 });
|
|
40
|
+
var storageKind = (kind) => kind === "route" ? "document" : kind;
|
|
41
|
+
var cacheKey = (kind, url) => `${storageKind(kind)}:${url}`;
|
|
42
|
+
var resolveHref = (url) => {
|
|
43
|
+
if (typeof window === "undefined")
|
|
44
|
+
return url;
|
|
45
|
+
try {
|
|
46
|
+
return new URL(url, window.location.href).href;
|
|
47
|
+
} catch {
|
|
48
|
+
return url;
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
var isGloballyDisabled = () => typeof window !== "undefined" && Reflect.get(window, "__ABSOLUTE_PREFETCH__") === false;
|
|
52
|
+
var isSlowConnection = () => {
|
|
53
|
+
if (typeof navigator === "undefined")
|
|
54
|
+
return false;
|
|
55
|
+
const connection = Reflect.get(navigator, "connection");
|
|
56
|
+
if (typeof connection !== "object" || connection === null)
|
|
57
|
+
return false;
|
|
58
|
+
if (Reflect.get(connection, "saveData") === true)
|
|
59
|
+
return true;
|
|
60
|
+
const effectiveType = Reflect.get(connection, "effectiveType");
|
|
61
|
+
return typeof effectiveType === "string" && SLOW_EFFECTIVE_TYPES.has(effectiveType);
|
|
62
|
+
};
|
|
63
|
+
var prefersReducedData = () => {
|
|
64
|
+
if (typeof window === "undefined" || !window.matchMedia)
|
|
65
|
+
return false;
|
|
66
|
+
return window.matchMedia("(prefers-reduced-data: reduce)").matches;
|
|
67
|
+
};
|
|
68
|
+
var canPrefetch = () => typeof window !== "undefined" && !isGloballyDisabled() && !isSlowConnection() && !prefersReducedData();
|
|
69
|
+
var readNodeEnv = () => {
|
|
70
|
+
const processLike = Reflect.get(globalThis, "process");
|
|
71
|
+
if (typeof processLike !== "object" || processLike === null) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
const env = Reflect.get(processLike, "env");
|
|
75
|
+
if (typeof env !== "object" || env === null)
|
|
76
|
+
return;
|
|
77
|
+
const value = Reflect.get(env, "NODE_ENV");
|
|
78
|
+
return typeof value === "string" ? value : undefined;
|
|
79
|
+
};
|
|
80
|
+
var isDevelopmentClient = () => {
|
|
81
|
+
if (typeof window === "undefined")
|
|
82
|
+
return false;
|
|
83
|
+
if (Reflect.get(window, "__HMR_FRAMEWORK__") !== undefined)
|
|
84
|
+
return true;
|
|
85
|
+
if (Reflect.get(window, "__HMR_WS__") !== undefined)
|
|
86
|
+
return true;
|
|
87
|
+
if (typeof document !== "undefined" && document.querySelector("script[data-hmr-client]") !== null) {
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
return readNodeEnv() === "development";
|
|
91
|
+
};
|
|
92
|
+
var isPrefetchableHref = (href) => {
|
|
93
|
+
if (typeof window === "undefined")
|
|
94
|
+
return false;
|
|
95
|
+
if (href === "" || href.startsWith("#"))
|
|
96
|
+
return false;
|
|
97
|
+
try {
|
|
98
|
+
const url = new URL(href, window.location.href);
|
|
99
|
+
if (url.protocol !== "http:" && url.protocol !== "https:")
|
|
100
|
+
return false;
|
|
101
|
+
return url.origin === window.location.origin;
|
|
102
|
+
} catch {
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
var resolveDefaultPrefetchMode = () => isDevelopmentClient() ? "hover" : "viewport";
|
|
107
|
+
var runQueue = () => {
|
|
108
|
+
while (inFlight < MAX_IN_FLIGHT) {
|
|
109
|
+
const next = queue.shift();
|
|
110
|
+
if (!next)
|
|
111
|
+
return;
|
|
112
|
+
if (next.cancelled)
|
|
113
|
+
continue;
|
|
114
|
+
next.start();
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
var finishTask = () => {
|
|
118
|
+
inFlight = Math.max(0, inFlight - 1);
|
|
119
|
+
runQueue();
|
|
120
|
+
};
|
|
121
|
+
var runWhenReleased = async (gate, task, signal) => {
|
|
122
|
+
await gate;
|
|
123
|
+
try {
|
|
124
|
+
return await task(signal);
|
|
125
|
+
} catch {
|
|
126
|
+
return offlineResponse();
|
|
127
|
+
} finally {
|
|
128
|
+
finishTask();
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
var enqueue = (task) => {
|
|
132
|
+
const controller = new AbortController;
|
|
133
|
+
let release = () => {
|
|
134
|
+
return;
|
|
135
|
+
};
|
|
136
|
+
const gate = new Promise((resolve) => {
|
|
137
|
+
release = resolve;
|
|
138
|
+
});
|
|
139
|
+
const queued = {
|
|
140
|
+
cancelled: false,
|
|
141
|
+
start: () => {
|
|
142
|
+
inFlight += 1;
|
|
143
|
+
release();
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
const promise = runWhenReleased(gate, task, controller.signal);
|
|
147
|
+
queue.push(queued);
|
|
148
|
+
runQueue();
|
|
149
|
+
const abort = () => {
|
|
150
|
+
if (queued.cancelled)
|
|
151
|
+
return;
|
|
152
|
+
queued.cancelled = true;
|
|
153
|
+
controller.abort();
|
|
154
|
+
};
|
|
155
|
+
return { abort, promise };
|
|
156
|
+
};
|
|
157
|
+
var evictOldest = () => {
|
|
158
|
+
const oldest = cache.keys().next();
|
|
159
|
+
if (oldest.done)
|
|
160
|
+
return;
|
|
161
|
+
cache.get(oldest.value)?.abort();
|
|
162
|
+
cache.delete(oldest.value);
|
|
163
|
+
};
|
|
164
|
+
var touch = (key, entry) => {
|
|
165
|
+
cache.delete(key);
|
|
166
|
+
cache.set(key, entry);
|
|
167
|
+
};
|
|
168
|
+
var injectLink = (rel, href, asType) => {
|
|
169
|
+
if (typeof document === "undefined")
|
|
170
|
+
return;
|
|
171
|
+
const link = document.createElement("link");
|
|
172
|
+
link.rel = rel;
|
|
173
|
+
link.href = href;
|
|
174
|
+
if (asType)
|
|
175
|
+
link.setAttribute("as", asType);
|
|
176
|
+
document.head.append(link);
|
|
177
|
+
};
|
|
178
|
+
var injectPrefetchFallback = (kind, url) => {
|
|
179
|
+
if (kind !== "document" || !supportsLinkRel("prefetch"))
|
|
180
|
+
return;
|
|
181
|
+
injectLink("prefetch", url, "document");
|
|
182
|
+
};
|
|
183
|
+
var supportsLinkRel = (rel) => {
|
|
184
|
+
if (typeof document === "undefined")
|
|
185
|
+
return false;
|
|
186
|
+
const link = document.createElement("link");
|
|
187
|
+
return typeof link.relList?.supports === "function" && link.relList.supports(rel);
|
|
188
|
+
};
|
|
189
|
+
var prefetchStylesheet = (href) => {
|
|
190
|
+
if (typeof document === "undefined")
|
|
191
|
+
return false;
|
|
192
|
+
const resolved = resolveHref(href);
|
|
193
|
+
if (prefetchedStyles.has(resolved))
|
|
194
|
+
return false;
|
|
195
|
+
prefetchedStyles.add(resolved);
|
|
196
|
+
injectLink("prefetch", href, "style");
|
|
197
|
+
return true;
|
|
198
|
+
};
|
|
199
|
+
var preloadModule = (href) => {
|
|
200
|
+
if (typeof document === "undefined")
|
|
201
|
+
return false;
|
|
202
|
+
const resolved = resolveHref(href);
|
|
203
|
+
if (preloadedModules.has(resolved))
|
|
204
|
+
return false;
|
|
205
|
+
const existing = Array.from(document.querySelectorAll('link[rel="modulepreload"]'));
|
|
206
|
+
if (existing.some((link) => resolveHref(link.href) === resolved)) {
|
|
207
|
+
preloadedModules.add(resolved);
|
|
208
|
+
return false;
|
|
209
|
+
}
|
|
210
|
+
preloadedModules.add(resolved);
|
|
211
|
+
injectLink("modulepreload", href);
|
|
212
|
+
return true;
|
|
213
|
+
};
|
|
214
|
+
var isRecord = (value) => typeof value === "object" && value !== null;
|
|
215
|
+
var isHref = (value) => typeof value === "string" && value.length > 0;
|
|
216
|
+
var warmRouteDataAssets = (envelope) => {
|
|
217
|
+
if (!isRecord(envelope))
|
|
218
|
+
return;
|
|
219
|
+
const { assets } = envelope;
|
|
220
|
+
if (!isRecord(assets))
|
|
221
|
+
return;
|
|
222
|
+
const { client, css, index } = assets;
|
|
223
|
+
for (const href of [index, client].filter(isHref))
|
|
224
|
+
preloadModule(href);
|
|
225
|
+
if (!Array.isArray(css))
|
|
226
|
+
return;
|
|
227
|
+
for (const href of css.filter(isHref))
|
|
228
|
+
prefetchStylesheet(href);
|
|
229
|
+
};
|
|
230
|
+
var warmFromRouteData = async (response) => {
|
|
231
|
+
try {
|
|
232
|
+
warmRouteDataAssets(await response.clone().json());
|
|
233
|
+
} catch {}
|
|
234
|
+
return response;
|
|
235
|
+
};
|
|
236
|
+
var fetchDocument = (url, signal) => fetch(url, { credentials: "same-origin", signal });
|
|
237
|
+
var fetchRouteData = async (url, signal) => {
|
|
238
|
+
const response = await fetch(url, {
|
|
239
|
+
credentials: "same-origin",
|
|
240
|
+
headers: { Accept: ROUTE_DATA_MEDIA_TYPE },
|
|
241
|
+
signal
|
|
242
|
+
});
|
|
243
|
+
const contentType = response.headers.get("content-type") ?? "";
|
|
244
|
+
const isRouteData = response.ok && contentType.includes(ROUTE_DATA_MEDIA_TYPE);
|
|
245
|
+
if (isRouteData)
|
|
246
|
+
return warmFromRouteData(response);
|
|
247
|
+
await response.body?.cancel().catch(() => {
|
|
248
|
+
return;
|
|
249
|
+
});
|
|
250
|
+
const status = response.status === NOT_FOUND || response.status === NOT_ACCEPTABLE ? response.status : NOT_ACCEPTABLE;
|
|
251
|
+
return new Response(null, { status });
|
|
252
|
+
};
|
|
253
|
+
var prefetch = (url, options = {}) => {
|
|
254
|
+
const kind = options.kind ?? "document";
|
|
255
|
+
if (!canPrefetch())
|
|
256
|
+
return;
|
|
257
|
+
if (kind === "module") {
|
|
258
|
+
preloadModule(url);
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
if (kind === "route") {
|
|
262
|
+
prefetch(url, { kind: "document" });
|
|
263
|
+
prefetch(url, { kind: "data" });
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
const key = cacheKey(kind, url);
|
|
267
|
+
const existing = cache.get(key);
|
|
268
|
+
if (existing) {
|
|
269
|
+
touch(key, existing);
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
if (typeof fetch === "undefined") {
|
|
273
|
+
injectPrefetchFallback(kind, url);
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
while (cache.size >= PREFETCH_CACHE_LIMIT)
|
|
277
|
+
evictOldest();
|
|
278
|
+
const { abort, promise } = enqueue((signal) => kind === "data" ? fetchRouteData(url, signal) : fetchDocument(url, signal));
|
|
279
|
+
cache.set(key, { abort, kind, promise, url });
|
|
280
|
+
};
|
|
281
|
+
var supportsSpeculationRules = () => typeof HTMLScriptElement !== "undefined" && typeof HTMLScriptElement.supports === "function" && HTMLScriptElement.supports("speculationrules");
|
|
282
|
+
var speculate = (url) => {
|
|
283
|
+
if (!canPrefetch() || !supportsSpeculationRules())
|
|
284
|
+
return false;
|
|
285
|
+
if (typeof document === "undefined")
|
|
286
|
+
return false;
|
|
287
|
+
const resolved = resolveHref(url);
|
|
288
|
+
if (liveSpeculationRules.has(resolved))
|
|
289
|
+
return false;
|
|
290
|
+
while (liveSpeculationRules.size >= MAX_LIVE_SPECULATION_RULES) {
|
|
291
|
+
const oldest = liveSpeculationRules.keys().next();
|
|
292
|
+
if (oldest.done)
|
|
293
|
+
break;
|
|
294
|
+
liveSpeculationRules.get(oldest.value)?.remove();
|
|
295
|
+
liveSpeculationRules.delete(oldest.value);
|
|
296
|
+
}
|
|
297
|
+
const script = applyPageNonce(document.createElement("script"));
|
|
298
|
+
script.type = "speculationrules";
|
|
299
|
+
script.textContent = JSON.stringify({
|
|
300
|
+
prerender: [{ eagerness: "immediate", urls: [url] }]
|
|
301
|
+
});
|
|
302
|
+
document.head.append(script);
|
|
303
|
+
liveSpeculationRules.set(resolved, script);
|
|
304
|
+
return true;
|
|
305
|
+
};
|
|
306
|
+
var noopHandle = {
|
|
307
|
+
cancel: () => {}
|
|
308
|
+
};
|
|
309
|
+
var scheduleHoverPrefetch = (url, options = {}) => {
|
|
310
|
+
if (typeof window === "undefined")
|
|
311
|
+
return noopHandle;
|
|
312
|
+
const timer = window.setTimeout(() => {
|
|
313
|
+
prefetch(url, { kind: options.kind ?? "route" });
|
|
314
|
+
if (options.prerender)
|
|
315
|
+
speculate(url);
|
|
316
|
+
options.onPrefetch?.();
|
|
317
|
+
}, HOVER_DEBOUNCE_MS);
|
|
318
|
+
return {
|
|
319
|
+
cancel: () => window.clearTimeout(timer)
|
|
320
|
+
};
|
|
321
|
+
};
|
|
322
|
+
var viewportTargets = new WeakMap;
|
|
323
|
+
var viewportObserver = null;
|
|
324
|
+
var handleIntersections = (entries) => {
|
|
325
|
+
for (const entry of entries) {
|
|
326
|
+
if (!entry.isIntersecting)
|
|
327
|
+
continue;
|
|
328
|
+
const target = viewportTargets.get(entry.target);
|
|
329
|
+
viewportObserver?.unobserve(entry.target);
|
|
330
|
+
viewportTargets.delete(entry.target);
|
|
331
|
+
if (!target)
|
|
332
|
+
continue;
|
|
333
|
+
prefetch(target.url, { kind: target.options.kind });
|
|
334
|
+
target.options.onVisible?.();
|
|
335
|
+
}
|
|
336
|
+
};
|
|
337
|
+
var getViewportObserver = () => {
|
|
338
|
+
if (viewportObserver)
|
|
339
|
+
return viewportObserver;
|
|
340
|
+
if (typeof IntersectionObserver === "undefined")
|
|
341
|
+
return null;
|
|
342
|
+
viewportObserver = new IntersectionObserver(handleIntersections, {
|
|
343
|
+
rootMargin: VIEWPORT_ROOT_MARGIN
|
|
344
|
+
});
|
|
345
|
+
return viewportObserver;
|
|
346
|
+
};
|
|
347
|
+
var observeViewport = (element, url, options = {}) => {
|
|
348
|
+
const observer = getViewportObserver();
|
|
349
|
+
if (!observer || !canPrefetch())
|
|
350
|
+
return () => {
|
|
351
|
+
return;
|
|
352
|
+
};
|
|
353
|
+
viewportTargets.set(element, { options, url });
|
|
354
|
+
observer.observe(element);
|
|
355
|
+
return () => {
|
|
356
|
+
observer.unobserve(element);
|
|
357
|
+
viewportTargets.delete(element);
|
|
358
|
+
};
|
|
359
|
+
};
|
|
360
|
+
|
|
361
|
+
// src/react/hooks/usePrefetch.ts
|
|
362
|
+
import { useCallback, useEffect, useRef } from "react";
|
|
363
|
+
var usePrefetch = (href, options = {}) => {
|
|
364
|
+
const { kind, mode, prerender = false } = options;
|
|
365
|
+
const viewportKind = kind ?? "document";
|
|
366
|
+
const triggerKind = kind ?? "route";
|
|
367
|
+
const elementRef = useRef(null);
|
|
368
|
+
const hoverHandle = useRef(null);
|
|
369
|
+
const cancelHover = useCallback(() => {
|
|
370
|
+
hoverHandle.current?.cancel();
|
|
371
|
+
hoverHandle.current = null;
|
|
372
|
+
}, []);
|
|
373
|
+
const isActive = useCallback(() => {
|
|
374
|
+
if (href === undefined || !isPrefetchableHref(href))
|
|
375
|
+
return false;
|
|
376
|
+
const resolved = mode ?? resolveDefaultPrefetchMode();
|
|
377
|
+
return resolved !== "none";
|
|
378
|
+
}, [href, mode]);
|
|
379
|
+
useEffect(() => {
|
|
380
|
+
const element = elementRef.current;
|
|
381
|
+
if (!element || href === undefined || !isActive())
|
|
382
|
+
return;
|
|
383
|
+
const resolved = mode ?? resolveDefaultPrefetchMode();
|
|
384
|
+
if (resolved !== "viewport")
|
|
385
|
+
return;
|
|
386
|
+
return observeViewport(element, href, { kind: viewportKind });
|
|
387
|
+
}, [href, isActive, mode, viewportKind]);
|
|
388
|
+
useEffect(() => cancelHover, [cancelHover]);
|
|
389
|
+
const onPointerEnter = useCallback(() => {
|
|
390
|
+
if (href === undefined || !isActive())
|
|
391
|
+
return;
|
|
392
|
+
cancelHover();
|
|
393
|
+
hoverHandle.current = scheduleHoverPrefetch(href, {
|
|
394
|
+
kind: triggerKind,
|
|
395
|
+
prerender
|
|
396
|
+
});
|
|
397
|
+
}, [cancelHover, href, isActive, prerender, triggerKind]);
|
|
398
|
+
const onPointerDown = useCallback(() => {
|
|
399
|
+
if (href === undefined || !isActive())
|
|
400
|
+
return;
|
|
401
|
+
cancelHover();
|
|
402
|
+
prefetch(href, { kind: triggerKind });
|
|
403
|
+
if (prerender)
|
|
404
|
+
speculate(href);
|
|
405
|
+
}, [cancelHover, href, isActive, prerender, triggerKind]);
|
|
406
|
+
return {
|
|
407
|
+
onBlur: cancelHover,
|
|
408
|
+
onFocus: onPointerEnter,
|
|
409
|
+
onPointerDown,
|
|
410
|
+
onPointerEnter,
|
|
411
|
+
onPointerLeave: cancelHover,
|
|
412
|
+
ref: elementRef
|
|
413
|
+
};
|
|
414
|
+
};
|
|
415
|
+
|
|
416
|
+
// src/react/router/navigationContext.ts
|
|
417
|
+
import { createContext } from "react";
|
|
418
|
+
var RouterNavigationContext = createContext(null);
|
|
419
|
+
|
|
420
|
+
// src/react/router/Link.tsx
|
|
421
|
+
import { jsx } from "react/jsx-runtime";
|
|
422
|
+
var isModifierClick = (event) => event.metaKey || event.ctrlKey || event.shiftKey || event.altKey;
|
|
423
|
+
var Link = ({
|
|
424
|
+
href,
|
|
425
|
+
prefetch: prefetchMode,
|
|
426
|
+
prerender = false,
|
|
427
|
+
replace = false,
|
|
428
|
+
target,
|
|
429
|
+
download,
|
|
430
|
+
children,
|
|
431
|
+
onBlur,
|
|
432
|
+
onClick,
|
|
433
|
+
onFocus,
|
|
434
|
+
onPointerDown,
|
|
435
|
+
onPointerEnter,
|
|
436
|
+
onPointerLeave,
|
|
437
|
+
...rest
|
|
438
|
+
}) => {
|
|
439
|
+
const navigation = useContext(RouterNavigationContext);
|
|
440
|
+
const {
|
|
441
|
+
ref,
|
|
442
|
+
onBlur: prefetchBlur,
|
|
443
|
+
onFocus: prefetchFocus,
|
|
444
|
+
onPointerDown: prefetchPointerDown,
|
|
445
|
+
onPointerEnter: prefetchPointerEnter,
|
|
446
|
+
onPointerLeave: prefetchPointerLeave
|
|
447
|
+
} = usePrefetch(href, { mode: prefetchMode, prerender });
|
|
448
|
+
const handleClick = (event) => {
|
|
449
|
+
onClick?.(event);
|
|
450
|
+
if (event.defaultPrevented)
|
|
451
|
+
return;
|
|
452
|
+
if (isModifierClick(event) || event.button !== 0)
|
|
453
|
+
return;
|
|
454
|
+
if (target && target !== "_self")
|
|
455
|
+
return;
|
|
456
|
+
if (download !== undefined)
|
|
457
|
+
return;
|
|
458
|
+
if (!navigation || !isPrefetchableHref(href))
|
|
459
|
+
return;
|
|
460
|
+
if (navigation.matches(href) === false)
|
|
461
|
+
return;
|
|
462
|
+
event.preventDefault();
|
|
463
|
+
navigation.navigate(href, { replace });
|
|
464
|
+
};
|
|
465
|
+
const handlePointerEnter = (event) => {
|
|
466
|
+
onPointerEnter?.(event);
|
|
467
|
+
prefetchPointerEnter();
|
|
468
|
+
};
|
|
469
|
+
const handlePointerLeave = (event) => {
|
|
470
|
+
onPointerLeave?.(event);
|
|
471
|
+
prefetchPointerLeave();
|
|
472
|
+
};
|
|
473
|
+
const handlePointerDown = (event) => {
|
|
474
|
+
onPointerDown?.(event);
|
|
475
|
+
prefetchPointerDown();
|
|
476
|
+
};
|
|
477
|
+
const handleFocus = (event) => {
|
|
478
|
+
onFocus?.(event);
|
|
479
|
+
prefetchFocus();
|
|
480
|
+
};
|
|
481
|
+
const handleBlur = (event) => {
|
|
482
|
+
onBlur?.(event);
|
|
483
|
+
prefetchBlur();
|
|
484
|
+
};
|
|
485
|
+
return /* @__PURE__ */ jsx("a", {
|
|
486
|
+
...rest,
|
|
487
|
+
download,
|
|
488
|
+
href,
|
|
489
|
+
onBlur: handleBlur,
|
|
490
|
+
onClick: handleClick,
|
|
491
|
+
onFocus: handleFocus,
|
|
492
|
+
onPointerDown: handlePointerDown,
|
|
493
|
+
onPointerEnter: handlePointerEnter,
|
|
494
|
+
onPointerLeave: handlePointerLeave,
|
|
495
|
+
ref,
|
|
496
|
+
target,
|
|
497
|
+
children
|
|
498
|
+
});
|
|
499
|
+
};
|
|
500
|
+
|
|
501
|
+
// src/react/components/client.ts
|
|
502
|
+
"use client";
|
|
503
|
+
export {
|
|
504
|
+
Link,
|
|
505
|
+
usePrefetch
|
|
506
|
+
};
|
|
@@ -162,6 +162,19 @@ var init_constants = __esm(() => {
|
|
|
162
162
|
TWO_THIRDS = 2 / 3;
|
|
163
163
|
});
|
|
164
164
|
|
|
165
|
+
// src/dev/client/cspNonce.ts
|
|
166
|
+
var applyPageNonce = (element) => {
|
|
167
|
+
const nonce = readPageNonce();
|
|
168
|
+
if (nonce)
|
|
169
|
+
element.nonce = nonce;
|
|
170
|
+
return element;
|
|
171
|
+
}, readPageNonce = () => {
|
|
172
|
+
if (typeof document === "undefined")
|
|
173
|
+
return;
|
|
174
|
+
const carrier = document.querySelector("script[nonce], style[nonce]");
|
|
175
|
+
return carrier?.nonce || undefined;
|
|
176
|
+
};
|
|
177
|
+
|
|
165
178
|
// src/react/components/Head.tsx
|
|
166
179
|
init_cspNonceRef();
|
|
167
180
|
init_fontAssets();
|
|
@@ -987,20 +1000,6 @@ import {
|
|
|
987
1000
|
useContext
|
|
988
1001
|
} from "react";
|
|
989
1002
|
|
|
990
|
-
// src/dev/client/cspNonce.ts
|
|
991
|
-
var applyPageNonce = (element) => {
|
|
992
|
-
const nonce = readPageNonce();
|
|
993
|
-
if (nonce)
|
|
994
|
-
element.nonce = nonce;
|
|
995
|
-
return element;
|
|
996
|
-
};
|
|
997
|
-
var readPageNonce = () => {
|
|
998
|
-
if (typeof document === "undefined")
|
|
999
|
-
return;
|
|
1000
|
-
const carrier = document.querySelector("script[nonce], style[nonce]");
|
|
1001
|
-
return carrier?.nonce || undefined;
|
|
1002
|
-
};
|
|
1003
|
-
|
|
1004
1003
|
// src/client/prefetch.ts
|
|
1005
1004
|
var PREFETCH_CACHE_LIMIT = 16;
|
|
1006
1005
|
var HOVER_DEBOUNCE_MS = 250;
|
|
@@ -1488,5 +1487,5 @@ export {
|
|
|
1488
1487
|
usePrefetch
|
|
1489
1488
|
};
|
|
1490
1489
|
|
|
1491
|
-
//# debugId=
|
|
1490
|
+
//# debugId=A6EB3EF7F464277264756E2164756E21
|
|
1492
1491
|
//# sourceMappingURL=index.js.map
|