@qwik.dev/router 2.0.0-beta.13 → 2.0.0-beta.15

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 (66) hide show
  1. package/lib/adapters/azure-swa/vite/index.mjs +7 -7
  2. package/lib/adapters/bun-server/vite/index.mjs +7 -7
  3. package/lib/adapters/cloud-run/vite/index.mjs +7 -7
  4. package/lib/adapters/cloudflare-pages/vite/index.mjs +8 -8
  5. package/lib/adapters/deno-server/vite/index.mjs +7 -7
  6. package/lib/adapters/netlify-edge/vite/index.mjs +7 -7
  7. package/lib/adapters/node-server/vite/index.mjs +7 -7
  8. package/lib/adapters/shared/vite/index.mjs +8 -8
  9. package/lib/adapters/ssg/vite/index.mjs +7 -8
  10. package/lib/adapters/vercel-edge/vite/index.mjs +7 -7
  11. package/lib/chunks/error-handler.mjs +2 -4
  12. package/lib/chunks/format-error.mjs +6 -6
  13. package/lib/chunks/fs.mjs +6 -27
  14. package/lib/chunks/index.mjs +39 -31
  15. package/lib/chunks/mime-types.mjs +2 -3
  16. package/lib/chunks/routing.qwik.mjs +23 -47
  17. package/lib/chunks/types.qwik.mjs +2 -5
  18. package/lib/index.d.ts +2 -1
  19. package/lib/index.qwik.mjs +48 -68
  20. package/lib/middleware/aws-lambda/index.mjs +4 -5
  21. package/lib/middleware/azure-swa/index.mjs +6 -7
  22. package/lib/middleware/bun/index.mjs +8 -9
  23. package/lib/middleware/cloudflare-pages/index.mjs +5 -6
  24. package/lib/middleware/deno/index.mjs +7 -8
  25. package/lib/middleware/firebase/index.mjs +4 -5
  26. package/lib/middleware/netlify-edge/index.mjs +5 -6
  27. package/lib/middleware/node/index.mjs +15 -11
  28. package/lib/middleware/request-handler/index.d.ts +2 -2
  29. package/lib/middleware/request-handler/index.mjs +64 -79
  30. package/lib/middleware/vercel-edge/index.mjs +5 -6
  31. package/lib/service-worker/index.mjs +2 -3
  32. package/lib/ssg/index.mjs +3 -4
  33. package/lib/vite/index.d.ts +7 -1
  34. package/lib/vite/index.mjs +91 -68
  35. package/package.json +21 -39
  36. package/lib/adapters/azure-swa/vite/index.cjs +0 -61
  37. package/lib/adapters/bun-server/vite/index.cjs +0 -27
  38. package/lib/adapters/cloud-run/vite/index.cjs +0 -24
  39. package/lib/adapters/cloudflare-pages/vite/index.cjs +0 -65
  40. package/lib/adapters/deno-server/vite/index.cjs +0 -39
  41. package/lib/adapters/netlify-edge/vite/index.cjs +0 -88
  42. package/lib/adapters/node-server/vite/index.cjs +0 -27
  43. package/lib/adapters/shared/vite/index.cjs +0 -306
  44. package/lib/adapters/ssg/vite/index.cjs +0 -19
  45. package/lib/adapters/vercel-edge/vite/index.cjs +0 -81
  46. package/lib/chunks/error-handler.cjs +0 -58
  47. package/lib/chunks/format-error.cjs +0 -136
  48. package/lib/chunks/fs.cjs +0 -274
  49. package/lib/chunks/index.cjs +0 -877
  50. package/lib/chunks/mime-types.cjs +0 -52
  51. package/lib/chunks/routing.qwik.cjs +0 -452
  52. package/lib/chunks/types.qwik.cjs +0 -24
  53. package/lib/index.qwik.cjs +0 -1662
  54. package/lib/middleware/aws-lambda/index.cjs +0 -52
  55. package/lib/middleware/azure-swa/index.cjs +0 -92
  56. package/lib/middleware/bun/index.cjs +0 -143
  57. package/lib/middleware/cloudflare-pages/index.cjs +0 -96
  58. package/lib/middleware/deno/index.cjs +0 -130
  59. package/lib/middleware/firebase/index.cjs +0 -33
  60. package/lib/middleware/netlify-edge/index.cjs +0 -71
  61. package/lib/middleware/node/index.cjs +0 -219
  62. package/lib/middleware/request-handler/index.cjs +0 -1488
  63. package/lib/middleware/vercel-edge/index.cjs +0 -98
  64. package/lib/service-worker/index.cjs +0 -5
  65. package/lib/ssg/index.cjs +0 -15
  66. package/lib/vite/index.cjs +0 -2021
@@ -1,1662 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const jsxRuntime = require("@qwik.dev/core/jsx-runtime");
4
- const core = require("@qwik.dev/core");
5
- const routing = require("./chunks/routing.qwik.cjs");
6
- const qwikRouterConfig = require("@qwik-router-config");
7
- const internal = require("@qwik.dev/core/internal");
8
- const requestHandler = require("@qwik.dev/router/middleware/request-handler");
9
- const v = require("valibot");
10
- const z = require("zod");
11
- const swRegister = require("@qwik-router-sw-register");
12
- const server = require("@qwik.dev/core/server");
13
- require("@qwik.dev/core/preloader");
14
- require("./chunks/types.qwik.cjs");
15
- function _interopNamespaceDefault(e) {
16
- const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
17
- if (e) {
18
- for (const k in e) {
19
- if (k !== "default") {
20
- const d = Object.getOwnPropertyDescriptor(e, k);
21
- Object.defineProperty(n, k, d.get ? d : {
22
- enumerable: true,
23
- get: () => e[k]
24
- });
25
- }
26
- }
27
- }
28
- n.default = e;
29
- return Object.freeze(n);
30
- }
31
- const qwikRouterConfig__namespace = /* @__PURE__ */ _interopNamespaceDefault(qwikRouterConfig);
32
- const v__namespace = /* @__PURE__ */ _interopNamespaceDefault(v);
33
- const z__namespace = /* @__PURE__ */ _interopNamespaceDefault(z);
34
- const ErrorBoundary = core.component$((props) => {
35
- const store = core.useErrorBoundary();
36
- core.useOnWindow(
37
- "qerror",
38
- core.$((e) => {
39
- store.error = e.detail.error;
40
- })
41
- );
42
- if (store.error && props.fallback$) {
43
- return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: props.fallback$(store.error) });
44
- }
45
- return /* @__PURE__ */ jsxRuntime.jsx(core.Slot, {});
46
- });
47
- const RouteStateContext = /* @__PURE__ */ core.createContextId("qc-s");
48
- const ContentContext = /* @__PURE__ */ core.createContextId("qc-c");
49
- const ContentInternalContext = /* @__PURE__ */ core.createContextId("qc-ic");
50
- const DocumentHeadContext = /* @__PURE__ */ core.createContextId("qc-h");
51
- const RouteLocationContext = /* @__PURE__ */ core.createContextId("qc-l");
52
- const RouteNavigateContext = /* @__PURE__ */ core.createContextId("qc-n");
53
- const RouteActionContext = /* @__PURE__ */ core.createContextId("qc-a");
54
- const RoutePreventNavigateContext = /* @__PURE__ */ core.createContextId("qc-p");
55
- const useContent = () => core.useContext(ContentContext);
56
- const useDocumentHead = () => core.useContext(DocumentHeadContext);
57
- const useLocation = () => core.useContext(RouteLocationContext);
58
- const useNavigate = () => core.useContext(RouteNavigateContext);
59
- const usePreventNavigateQrl = (fn) => {
60
- if (!__EXPERIMENTAL__.preventNavigate) {
61
- throw new Error(
62
- 'usePreventNavigate$ is experimental and must be enabled with `experimental: ["preventNavigate"]` in the `qwikVite` plugin.'
63
- );
64
- }
65
- const registerPreventNav = core.useContext(RoutePreventNavigateContext);
66
- core.useVisibleTask$(() => registerPreventNav(fn));
67
- };
68
- const usePreventNavigate$ = core.implicit$FirstArg(usePreventNavigateQrl);
69
- const useAction = () => core.useContext(RouteActionContext);
70
- const useQwikRouterEnv = () => core.noSerialize(core.useServerData("qwikrouter"));
71
- const Link = core.component$((props) => {
72
- const nav = useNavigate();
73
- const loc = useLocation();
74
- const originalHref = props.href;
75
- const anchorRef = core.useSignal();
76
- const {
77
- onClick$,
78
- prefetch: prefetchProp,
79
- reload,
80
- replaceState,
81
- scroll,
82
- ...linkProps
83
- } = /* @__PURE__ */ (() => props)();
84
- const clientNavPath = core.untrack(() => routing.getClientNavPath({ ...linkProps, reload }, loc));
85
- linkProps.href = clientNavPath || originalHref;
86
- const prefetchData = core.untrack(
87
- () => !!clientNavPath && prefetchProp !== false && prefetchProp !== "js" || void 0
88
- );
89
- const prefetch = core.untrack(
90
- () => prefetchData || !!clientNavPath && prefetchProp !== false && routing.shouldPreload(clientNavPath, loc)
91
- );
92
- const handlePrefetch = prefetch ? core.$((_, elm) => {
93
- if (navigator.connection?.saveData) {
94
- return;
95
- }
96
- if (elm && elm.href) {
97
- const url = new URL(elm.href);
98
- routing.preloadRouteBundles(url.pathname);
99
- if (elm.hasAttribute("data-prefetch")) {
100
- routing.loadClientData(url, elm, {
101
- preloadRouteBundles: false,
102
- isPrefetch: true
103
- });
104
- }
105
- }
106
- }) : void 0;
107
- const preventDefault = clientNavPath ? core.sync$((event) => {
108
- if (!(event.metaKey || event.ctrlKey || event.shiftKey || event.altKey)) {
109
- event.preventDefault();
110
- }
111
- }) : void 0;
112
- const handleClientSideNavigation = clientNavPath ? core.$((event, elm) => {
113
- if (event.defaultPrevented) {
114
- if (elm.href) {
115
- elm.setAttribute("aria-pressed", "true");
116
- nav(elm.href, { forceReload: reload, replaceState, scroll }).then(() => {
117
- elm.removeAttribute("aria-pressed");
118
- });
119
- }
120
- }
121
- }) : void 0;
122
- const handlePreload = core.$((_, elm) => {
123
- const url = new URL(elm.href);
124
- routing.preloadRouteBundles(url.pathname, 1);
125
- });
126
- core.useVisibleTask$(({ track }) => {
127
- track(() => loc.url.pathname);
128
- const handler = linkProps.onQVisible$;
129
- if (handler) {
130
- const event = new CustomEvent("qvisible");
131
- if (Array.isArray(handler)) {
132
- handler.flat(10).forEach(
133
- (handler2) => handler2?.(event, anchorRef.value)
134
- );
135
- } else {
136
- handler?.(event, anchorRef.value);
137
- }
138
- }
139
- if (!core.isDev && anchorRef.value) {
140
- handlePrefetch?.(void 0, anchorRef.value);
141
- }
142
- });
143
- return /* @__PURE__ */ jsxRuntime.jsx(
144
- "a",
145
- {
146
- ref: anchorRef,
147
- ...{ "q:link": !!clientNavPath },
148
- ...linkProps,
149
- onClick$: [
150
- preventDefault,
151
- handlePreload,
152
- // needs to be in between preventDefault and onClick$ to ensure it starts asap.
153
- onClick$,
154
- handleClientSideNavigation
155
- ],
156
- "data-prefetch": prefetchData,
157
- onMouseOver$: [linkProps.onMouseOver$, handlePrefetch],
158
- onFocus$: [linkProps.onFocus$, handlePrefetch],
159
- onQVisible$: [],
160
- children: /* @__PURE__ */ jsxRuntime.jsx(core.Slot, {})
161
- }
162
- );
163
- });
164
- const resolveHead = (endpoint, routeLocation, contentModules, locale, defaults) => core.withLocale(locale, () => {
165
- const head = createDocumentHead(defaults);
166
- const getData = ((loaderOrAction) => {
167
- const id = loaderOrAction.__id;
168
- if (loaderOrAction.__brand === "server_loader") {
169
- if (!(id in endpoint.loaders)) {
170
- throw new Error(
171
- "You can not get the returned data of a loader that has not been executed for this request."
172
- );
173
- }
174
- }
175
- const data = endpoint.loaders[id];
176
- if (routing.isPromise(data)) {
177
- throw new Error("Loaders returning a promise can not be resolved for the head function.");
178
- }
179
- return data;
180
- });
181
- const fns = [];
182
- for (const contentModule of contentModules) {
183
- const contentModuleHead = contentModule?.head;
184
- if (contentModuleHead) {
185
- if (typeof contentModuleHead === "function") {
186
- fns.unshift(contentModuleHead);
187
- } else if (typeof contentModuleHead === "object") {
188
- resolveDocumentHead(head, contentModuleHead);
189
- }
190
- }
191
- }
192
- if (fns.length) {
193
- const headProps = {
194
- head,
195
- withLocale: (fn) => fn(),
196
- resolveValue: getData,
197
- ...routeLocation
198
- };
199
- for (const fn of fns) {
200
- resolveDocumentHead(head, fn(headProps));
201
- }
202
- }
203
- return head;
204
- });
205
- const resolveDocumentHead = (resolvedHead, updatedHead) => {
206
- if (typeof updatedHead.title === "string") {
207
- resolvedHead.title = updatedHead.title;
208
- }
209
- mergeArray(resolvedHead.meta, updatedHead.meta);
210
- mergeArray(resolvedHead.links, updatedHead.links);
211
- mergeArray(resolvedHead.styles, updatedHead.styles);
212
- mergeArray(resolvedHead.scripts, updatedHead.scripts);
213
- Object.assign(resolvedHead.frontmatter, updatedHead.frontmatter);
214
- };
215
- const mergeArray = (existingArr, newArr) => {
216
- if (Array.isArray(newArr)) {
217
- for (const newItem of newArr) {
218
- if (typeof newItem.key === "string") {
219
- const existingIndex = existingArr.findIndex((i) => i.key === newItem.key);
220
- if (existingIndex > -1) {
221
- existingArr[existingIndex] = newItem;
222
- continue;
223
- }
224
- }
225
- existingArr.push(newItem);
226
- }
227
- }
228
- };
229
- const createDocumentHead = (defaults) => ({
230
- title: defaults?.title || "",
231
- meta: [...defaults?.meta || []],
232
- links: [...defaults?.links || []],
233
- styles: [...defaults?.styles || []],
234
- scripts: [...defaults?.scripts || []],
235
- frontmatter: { ...defaults?.frontmatter }
236
- });
237
- function callRestoreScrollOnDocument() {
238
- if (document.__q_scroll_restore__) {
239
- document.__q_scroll_restore__();
240
- document.__q_scroll_restore__ = void 0;
241
- }
242
- }
243
- const restoreScroll = (type, toUrl, fromUrl, scroller, scrollState) => {
244
- if (type === "popstate" && scrollState) {
245
- scroller.scrollTo(scrollState.x, scrollState.y);
246
- } else if (type === "link" || type === "form") {
247
- if (!hashScroll(toUrl, fromUrl)) {
248
- scroller.scrollTo(0, 0);
249
- }
250
- }
251
- };
252
- const hashScroll = (toUrl, fromUrl) => {
253
- const elmId = toUrl.hash.slice(1);
254
- const elm = elmId && document.getElementById(elmId);
255
- if (elm) {
256
- elm.scrollIntoView();
257
- return true;
258
- } else if (!elm && toUrl.hash && routing.isSamePath(toUrl, fromUrl)) {
259
- return true;
260
- }
261
- return false;
262
- };
263
- const currentScrollState = (elm) => {
264
- return {
265
- x: elm.scrollLeft,
266
- y: elm.scrollTop,
267
- w: Math.max(elm.scrollWidth, elm.clientWidth),
268
- h: Math.max(elm.scrollHeight, elm.clientHeight)
269
- };
270
- };
271
- const getScrollHistory = () => {
272
- const state = history.state;
273
- return state?._qRouterScroll;
274
- };
275
- const saveScrollHistory = (scrollState) => {
276
- const state = history.state || {};
277
- state._qRouterScroll = scrollState;
278
- history.replaceState(state, "");
279
- };
280
- const spaInit = core.event$((_, el) => {
281
- if (!window._qRouterSPA && !window._qRouterInitPopstate) {
282
- const currentPath = location.pathname + location.search;
283
- const checkAndScroll = (scrollState) => {
284
- if (scrollState) {
285
- window.scrollTo(scrollState.x, scrollState.y);
286
- }
287
- };
288
- const currentScrollState2 = () => {
289
- const elm = document.documentElement;
290
- return {
291
- x: elm.scrollLeft,
292
- y: elm.scrollTop,
293
- w: Math.max(elm.scrollWidth, elm.clientWidth),
294
- h: Math.max(elm.scrollHeight, elm.clientHeight)
295
- };
296
- };
297
- const saveScrollState = (scrollState) => {
298
- const state = history.state || {};
299
- state._qRouterScroll = scrollState || currentScrollState2();
300
- history.replaceState(state, "");
301
- };
302
- saveScrollState();
303
- window._qRouterInitPopstate = () => {
304
- if (window._qRouterSPA) {
305
- return;
306
- }
307
- window._qRouterScrollEnabled = false;
308
- clearTimeout(window._qRouterScrollDebounce);
309
- if (currentPath !== location.pathname + location.search) {
310
- const getContainer = (el2) => el2.closest("[q\\:container]:not([q\\:container=html]):not([q\\:container=text])");
311
- const container = getContainer(el);
312
- const domContainer = container.qContainer;
313
- const hostElement = domContainer.vNodeLocate(el);
314
- const nav = domContainer?.resolveContext(hostElement, {
315
- id: "qc--n"
316
- });
317
- if (nav) {
318
- nav(location.href, { type: "popstate" });
319
- } else {
320
- location.reload();
321
- }
322
- } else {
323
- if (history.scrollRestoration === "manual") {
324
- const scrollState = history.state?._qRouterScroll;
325
- checkAndScroll(scrollState);
326
- window._qRouterScrollEnabled = true;
327
- }
328
- }
329
- };
330
- if (!window._qRouterHistoryPatch) {
331
- window._qRouterHistoryPatch = true;
332
- const pushState = history.pushState;
333
- const replaceState = history.replaceState;
334
- const prepareState = (state) => {
335
- if (state === null || typeof state === "undefined") {
336
- state = {};
337
- } else if (state?.constructor !== Object) {
338
- state = { _data: state };
339
- if (core.isDev) {
340
- console.warn(
341
- "In a Qwik SPA context, `history.state` is used to store scroll state. Direct calls to `pushState()` and `replaceState()` must supply an actual Object type. We need to be able to automatically attach the scroll state to your state object. A new state object has been created, your data has been moved to: `history.state._data`"
342
- );
343
- }
344
- }
345
- state._qRouterScroll = state._qRouterScroll || currentScrollState2();
346
- return state;
347
- };
348
- history.pushState = (state, title, url) => {
349
- state = prepareState(state);
350
- return pushState.call(history, state, title, url);
351
- };
352
- history.replaceState = (state, title, url) => {
353
- state = prepareState(state);
354
- return replaceState.call(history, state, title, url);
355
- };
356
- }
357
- window._qRouterInitAnchors = (event) => {
358
- if (window._qRouterSPA || event.defaultPrevented) {
359
- return;
360
- }
361
- const target = event.target.closest("a[href]");
362
- if (target && !target.hasAttribute("preventdefault:click")) {
363
- const href = target.getAttribute("href");
364
- const prev = new URL(location.href);
365
- const dest = new URL(href, prev);
366
- const sameOrigin = dest.origin === prev.origin;
367
- const samePath = dest.pathname + dest.search === prev.pathname + prev.search;
368
- if (sameOrigin && samePath) {
369
- event.preventDefault();
370
- if (dest.href !== prev.href) {
371
- history.pushState(null, "", dest);
372
- }
373
- if (!dest.hash) {
374
- if (dest.href.endsWith("#")) {
375
- window.scrollTo(0, 0);
376
- } else {
377
- window._qRouterScrollEnabled = false;
378
- clearTimeout(window._qRouterScrollDebounce);
379
- saveScrollState({ ...currentScrollState2(), x: 0, y: 0 });
380
- location.reload();
381
- }
382
- } else {
383
- const elmId = dest.hash.slice(1);
384
- const elm = document.getElementById(elmId);
385
- if (elm) {
386
- elm.scrollIntoView();
387
- }
388
- }
389
- }
390
- }
391
- };
392
- window._qRouterInitVisibility = () => {
393
- if (!window._qRouterSPA && window._qRouterScrollEnabled && document.visibilityState === "hidden") {
394
- saveScrollState();
395
- }
396
- };
397
- window._qRouterInitScroll = () => {
398
- if (window._qRouterSPA || !window._qRouterScrollEnabled) {
399
- return;
400
- }
401
- clearTimeout(window._qRouterScrollDebounce);
402
- window._qRouterScrollDebounce = setTimeout(() => {
403
- saveScrollState();
404
- window._qRouterScrollDebounce = void 0;
405
- }, 200);
406
- };
407
- window._qRouterScrollEnabled = true;
408
- setTimeout(() => {
409
- window.addEventListener("popstate", window._qRouterInitPopstate);
410
- window.addEventListener("scroll", window._qRouterInitScroll, { passive: true });
411
- document.addEventListener("click", window._qRouterInitAnchors);
412
- if (!window.navigation) {
413
- document.addEventListener("visibilitychange", window._qRouterInitVisibility, {
414
- passive: true
415
- });
416
- }
417
- }, 0);
418
- }
419
- });
420
- const startViewTransition = (params) => {
421
- if (!params.update) {
422
- return;
423
- }
424
- if ("startViewTransition" in document) {
425
- let transition;
426
- try {
427
- transition = document.startViewTransition(params);
428
- } catch {
429
- transition = document.startViewTransition(params.update);
430
- }
431
- const event = new CustomEvent("qviewtransition", { detail: transition });
432
- document.dispatchEvent(event);
433
- return transition;
434
- } else {
435
- params.update?.();
436
- }
437
- };
438
- const transitionCss = "@layer qwik{@supports selector(html:active-view-transition-type(type)){html:active-view-transition-type(qwik-navigation){:root{view-transition-name:none}}}@supports not selector(html:active-view-transition-type(type)){:root{view-transition-name:none}}}";
439
- const QWIK_CITY_SCROLLER = "_qCityScroller";
440
- const QWIK_ROUTER_SCROLLER = "_qRouterScroller";
441
- const preventNav = {};
442
- const internalState = { navCount: 0 };
443
- const useQwikRouter = (props) => {
444
- if (!core.isServer) {
445
- throw new Error(
446
- "useQwikRouter can only run during SSR on the server. If you are seeing this, it means you are re-rendering the root of your application. Fix that or use the <QwikRouterProvider> component around the root of your application."
447
- );
448
- }
449
- core.useStyles$(transitionCss);
450
- const env = useQwikRouterEnv();
451
- if (!env?.params) {
452
- throw new Error(
453
- `Missing Qwik Router Env Data for help visit https://github.com/QwikDev/qwik/issues/6237`
454
- );
455
- }
456
- const urlEnv = core.useServerData("url");
457
- if (!urlEnv) {
458
- throw new Error(`Missing Qwik URL Env Data`);
459
- }
460
- const serverHead = core.useServerData("documentHead");
461
- if (env.ev.originalUrl.pathname !== env.ev.url.pathname && !__EXPERIMENTAL__.enableRequestRewrite) {
462
- throw new Error(
463
- `enableRequestRewrite is an experimental feature and is not enabled. Please enable the feature flag by adding \`experimental: ["enableRequestRewrite"]\` to your qwikVite plugin options.`
464
- );
465
- }
466
- const url = new URL(urlEnv);
467
- const routeLocationTarget = {
468
- url,
469
- params: env.params,
470
- isNavigating: false,
471
- prevUrl: void 0
472
- };
473
- const routeLocation = core.useStore(routeLocationTarget, { deep: false });
474
- const navResolver = {};
475
- const container = internal._getContextContainer();
476
- const getSerializationStrategy = (loaderId) => {
477
- return env.response.loadersSerializationStrategy.get(loaderId) || routing.DEFAULT_LOADERS_SERIALIZATION_STRATEGY;
478
- };
479
- const loadersObject = {};
480
- const loaderState = {};
481
- for (const [key, value] of Object.entries(env.response.loaders)) {
482
- loadersObject[key] = value;
483
- loaderState[key] = routing.createLoaderSignal(
484
- loadersObject,
485
- key,
486
- url,
487
- getSerializationStrategy(key),
488
- container
489
- );
490
- }
491
- loadersObject[internal.SerializerSymbol] = (obj) => {
492
- const loadersSerializationObject = {};
493
- for (const [k, v2] of Object.entries(obj)) {
494
- loadersSerializationObject[k] = getSerializationStrategy(k) === "always" ? v2 : internal._UNINITIALIZED;
495
- }
496
- return loadersSerializationObject;
497
- };
498
- const routeInternal = core.useSignal({
499
- type: "initial",
500
- dest: url,
501
- scroll: true
502
- });
503
- const documentHead = core.useStore(
504
- () => createDocumentHead(serverHead)
505
- );
506
- const content = core.useStore({
507
- headings: void 0,
508
- menu: void 0
509
- });
510
- const contentInternal = core.useSignal();
511
- const currentActionId = env.response.action;
512
- const currentAction = currentActionId ? env.response.loaders[currentActionId] : void 0;
513
- const actionState = core.useSignal(
514
- currentAction ? {
515
- id: currentActionId,
516
- data: env.response.formData,
517
- output: {
518
- result: currentAction,
519
- status: env.response.status
520
- }
521
- } : void 0
522
- );
523
- const registerPreventNav = core.$((fn$) => {
524
- if (!core.isBrowser) {
525
- return;
526
- }
527
- preventNav.$handler$ || (preventNav.$handler$ = (event) => {
528
- internalState.navCount++;
529
- if (!preventNav.$cbs$) {
530
- return;
531
- }
532
- const prevents = [...preventNav.$cbs$.values()].map(
533
- (cb) => cb.resolved ? cb.resolved() : cb()
534
- );
535
- if (prevents.some(Boolean)) {
536
- event.preventDefault();
537
- event.returnValue = true;
538
- }
539
- });
540
- (preventNav.$cbs$ || (preventNav.$cbs$ = /* @__PURE__ */ new Set())).add(fn$);
541
- fn$.resolve();
542
- window.addEventListener("beforeunload", preventNav.$handler$);
543
- return () => {
544
- if (preventNav.$cbs$) {
545
- preventNav.$cbs$.delete(fn$);
546
- if (!preventNav.$cbs$.size) {
547
- preventNav.$cbs$ = void 0;
548
- window.removeEventListener("beforeunload", preventNav.$handler$);
549
- }
550
- }
551
- };
552
- });
553
- const goto = core.$(async (path, opt) => {
554
- const {
555
- type = "link",
556
- forceReload = path === void 0,
557
- // Hack for nav() because this API is already set.
558
- replaceState = false,
559
- scroll = true
560
- } = typeof opt === "object" ? opt : { forceReload: opt };
561
- internalState.navCount++;
562
- if (core.isBrowser && type === "link" && routeInternal.value.type === "initial") {
563
- routeInternal.value.dest = new URL(window.location.href);
564
- }
565
- const lastDest = routeInternal.value.dest;
566
- const dest = path === void 0 ? lastDest : typeof path === "number" ? path : routing.toUrl(path, routeLocation.url);
567
- if (preventNav.$cbs$ && (forceReload || typeof dest === "number" || !routing.isSamePath(dest, lastDest) || !routing.isSameOrigin(dest, lastDest))) {
568
- const ourNavId = internalState.navCount;
569
- const prevents = await Promise.all([...preventNav.$cbs$.values()].map((cb) => cb(dest)));
570
- if (ourNavId !== internalState.navCount || prevents.some(Boolean)) {
571
- if (ourNavId === internalState.navCount && type === "popstate") {
572
- history.pushState(null, "", lastDest);
573
- }
574
- return;
575
- }
576
- }
577
- if (typeof dest === "number") {
578
- if (core.isBrowser) {
579
- history.go(dest);
580
- }
581
- return;
582
- }
583
- if (!routing.isSameOrigin(dest, lastDest)) {
584
- if (core.isBrowser) {
585
- location.href = dest.href;
586
- }
587
- return;
588
- }
589
- if (!forceReload && routing.isSamePath(dest, lastDest)) {
590
- if (core.isBrowser) {
591
- if (type === "link" && dest.href !== location.href) {
592
- history.pushState(null, "", dest);
593
- }
594
- let scroller = document.getElementById(QWIK_ROUTER_SCROLLER);
595
- if (!scroller) {
596
- scroller = document.getElementById(QWIK_CITY_SCROLLER);
597
- if (scroller && core.isDev) {
598
- console.warn(
599
- `Please update your scroller ID to "${QWIK_ROUTER_SCROLLER}" as "${QWIK_CITY_SCROLLER}" is deprecated and will be removed in V3`
600
- );
601
- }
602
- }
603
- if (!scroller) {
604
- scroller = document.documentElement;
605
- }
606
- restoreScroll(type, dest, new URL(location.href), scroller, getScrollHistory());
607
- if (type === "popstate") {
608
- window._qRouterScrollEnabled = true;
609
- }
610
- }
611
- return;
612
- }
613
- routeInternal.value = {
614
- type,
615
- dest,
616
- forceReload,
617
- replaceState,
618
- scroll
619
- };
620
- if (core.isBrowser) {
621
- routing.loadClientData(dest, internal._getContextElement());
622
- routing.loadRoute(
623
- qwikRouterConfig__namespace.routes,
624
- qwikRouterConfig__namespace.menus,
625
- qwikRouterConfig__namespace.cacheModules,
626
- dest.pathname
627
- );
628
- }
629
- actionState.value = void 0;
630
- routeLocation.isNavigating = true;
631
- return new Promise((resolve) => {
632
- navResolver.r = resolve;
633
- });
634
- });
635
- core.useContextProvider(ContentContext, content);
636
- core.useContextProvider(ContentInternalContext, contentInternal);
637
- core.useContextProvider(DocumentHeadContext, documentHead);
638
- core.useContextProvider(RouteLocationContext, routeLocation);
639
- core.useContextProvider(RouteNavigateContext, goto);
640
- core.useContextProvider(RouteStateContext, loaderState);
641
- core.useContextProvider(RouteActionContext, actionState);
642
- core.useContextProvider(RoutePreventNavigateContext, registerPreventNav);
643
- core.useTask$(({ track }) => {
644
- async function run() {
645
- const navigation = track(routeInternal);
646
- const action = track(actionState);
647
- const locale = core.getLocale("");
648
- const prevUrl = routeLocation.url;
649
- const navType = action ? "form" : navigation.type;
650
- const replaceState = navigation.replaceState;
651
- let trackUrl;
652
- let clientPageData;
653
- let loadedRoute = null;
654
- let elm;
655
- if (core.isServer) {
656
- trackUrl = new URL(navigation.dest, routeLocation.url);
657
- loadedRoute = env.loadedRoute;
658
- clientPageData = env.response;
659
- } else {
660
- trackUrl = new URL(navigation.dest, location);
661
- if (trackUrl.pathname.endsWith("/")) {
662
- if (globalThis.__NO_TRAILING_SLASH__) {
663
- trackUrl.pathname = trackUrl.pathname.slice(0, -1);
664
- }
665
- } else if (!globalThis.__NO_TRAILING_SLASH__) {
666
- trackUrl.pathname += "/";
667
- }
668
- let loadRoutePromise = routing.loadRoute(
669
- qwikRouterConfig__namespace.routes,
670
- qwikRouterConfig__namespace.menus,
671
- qwikRouterConfig__namespace.cacheModules,
672
- trackUrl.pathname
673
- );
674
- elm = internal._getContextElement();
675
- const pageData = clientPageData = await routing.loadClientData(trackUrl, elm, {
676
- action,
677
- clearCache: true
678
- });
679
- if (!pageData) {
680
- routeInternal.untrackedValue = { type: navType, dest: trackUrl };
681
- return;
682
- }
683
- const newHref = pageData.href;
684
- const newURL = new URL(newHref, trackUrl);
685
- if (!routing.isSamePath(newURL, trackUrl)) {
686
- if (!pageData.isRewrite) {
687
- trackUrl = newURL;
688
- }
689
- loadRoutePromise = routing.loadRoute(
690
- qwikRouterConfig__namespace.routes,
691
- qwikRouterConfig__namespace.menus,
692
- qwikRouterConfig__namespace.cacheModules,
693
- newURL.pathname
694
- // Load the actual required path.
695
- );
696
- }
697
- try {
698
- loadedRoute = await loadRoutePromise;
699
- } catch (e) {
700
- console.error(e);
701
- window.location.href = newHref;
702
- return;
703
- }
704
- }
705
- if (loadedRoute) {
706
- const [routeName, params, mods, menu] = loadedRoute;
707
- const contentModules = mods;
708
- const pageModule = contentModules[contentModules.length - 1];
709
- if (navigation.dest.search && !!routing.isSamePath(trackUrl, prevUrl)) {
710
- trackUrl.search = navigation.dest.search;
711
- }
712
- let shouldForcePrevUrl = false;
713
- let shouldForceUrl = false;
714
- let shouldForceParams = false;
715
- if (!routing.isSamePath(trackUrl, prevUrl)) {
716
- if (internal._hasStoreEffects(routeLocation, "prevUrl")) {
717
- shouldForcePrevUrl = true;
718
- }
719
- routeLocationTarget.prevUrl = prevUrl;
720
- }
721
- if (routeLocationTarget.url !== trackUrl) {
722
- if (internal._hasStoreEffects(routeLocation, "url")) {
723
- shouldForceUrl = true;
724
- }
725
- routeLocationTarget.url = trackUrl;
726
- }
727
- if (routeLocationTarget.params !== params) {
728
- if (internal._hasStoreEffects(routeLocation, "params")) {
729
- shouldForceParams = true;
730
- }
731
- routeLocationTarget.params = params;
732
- }
733
- routeInternal.untrackedValue = { type: navType, dest: trackUrl };
734
- const resolvedHead = resolveHead(
735
- clientPageData,
736
- routeLocation,
737
- contentModules,
738
- locale,
739
- serverHead
740
- );
741
- content.headings = pageModule.headings;
742
- content.menu = menu;
743
- contentInternal.untrackedValue = core.noSerialize(contentModules);
744
- documentHead.links = resolvedHead.links;
745
- documentHead.meta = resolvedHead.meta;
746
- documentHead.styles = resolvedHead.styles;
747
- documentHead.scripts = resolvedHead.scripts;
748
- documentHead.title = resolvedHead.title;
749
- documentHead.frontmatter = resolvedHead.frontmatter;
750
- if (core.isBrowser) {
751
- let scrollState;
752
- if (navType === "popstate") {
753
- scrollState = getScrollHistory();
754
- }
755
- const scroller = document.getElementById(QWIK_ROUTER_SCROLLER) ?? document.documentElement;
756
- if (navigation.scroll && (!navigation.forceReload || !routing.isSamePath(trackUrl, prevUrl)) && (navType === "link" || navType === "popstate") || // Action might have responded with a redirect.
757
- navType === "form" && !routing.isSamePath(trackUrl, prevUrl)) {
758
- document.__q_scroll_restore__ = () => restoreScroll(navType, trackUrl, prevUrl, scroller, scrollState);
759
- }
760
- const loaders = clientPageData?.loaders;
761
- if (loaders) {
762
- const container2 = internal._getContextContainer();
763
- for (const [key, value] of Object.entries(loaders)) {
764
- const signal = loaderState[key];
765
- const awaitedValue = await value;
766
- loadersObject[key] = awaitedValue;
767
- if (!signal) {
768
- loaderState[key] = routing.createLoaderSignal(
769
- loadersObject,
770
- key,
771
- trackUrl,
772
- routing.DEFAULT_LOADERS_SERIALIZATION_STRATEGY,
773
- container2
774
- );
775
- } else {
776
- signal.invalidate();
777
- }
778
- }
779
- }
780
- routing.CLIENT_DATA_CACHE.clear();
781
- if (!window._qRouterSPA) {
782
- window._qRouterSPA = true;
783
- history.scrollRestoration = "manual";
784
- window.addEventListener("popstate", () => {
785
- window._qRouterScrollEnabled = false;
786
- clearTimeout(window._qRouterScrollDebounce);
787
- goto(location.href, {
788
- type: "popstate"
789
- });
790
- });
791
- window.removeEventListener("popstate", window._qRouterInitPopstate);
792
- window._qRouterInitPopstate = void 0;
793
- if (!window._qRouterHistoryPatch) {
794
- window._qRouterHistoryPatch = true;
795
- const pushState = history.pushState;
796
- const replaceState2 = history.replaceState;
797
- const prepareState = (state) => {
798
- if (state === null || typeof state === "undefined") {
799
- state = {};
800
- } else if (state?.constructor !== Object) {
801
- state = { _data: state };
802
- if (core.isDev) {
803
- console.warn(
804
- "In a Qwik SPA context, `history.state` is used to store scroll state. Direct calls to `pushState()` and `replaceState()` must supply an actual Object type. We need to be able to automatically attach the scroll state to your state object. A new state object has been created, your data has been moved to: `history.state._data`"
805
- );
806
- }
807
- }
808
- state._qRouterScroll = state._qRouterScroll || currentScrollState(scroller);
809
- return state;
810
- };
811
- history.pushState = (state, title, url2) => {
812
- state = prepareState(state);
813
- return pushState.call(history, state, title, url2);
814
- };
815
- history.replaceState = (state, title, url2) => {
816
- state = prepareState(state);
817
- return replaceState2.call(history, state, title, url2);
818
- };
819
- }
820
- document.addEventListener("click", (event) => {
821
- if (event.defaultPrevented) {
822
- return;
823
- }
824
- const target = event.target.closest("a[href]");
825
- if (target && !target.hasAttribute("preventdefault:click")) {
826
- const href = target.getAttribute("href");
827
- const prev = new URL(location.href);
828
- const dest = new URL(href, prev);
829
- if (routing.isSameOrigin(dest, prev) && routing.isSamePath(dest, prev)) {
830
- event.preventDefault();
831
- if (!dest.hash && !dest.href.endsWith("#")) {
832
- if (dest.href !== prev.href) {
833
- history.pushState(null, "", dest);
834
- }
835
- window._qRouterScrollEnabled = false;
836
- clearTimeout(window._qRouterScrollDebounce);
837
- saveScrollHistory({
838
- ...currentScrollState(scroller),
839
- x: 0,
840
- y: 0
841
- });
842
- location.reload();
843
- return;
844
- }
845
- goto(target.getAttribute("href"));
846
- }
847
- }
848
- });
849
- document.removeEventListener("click", window._qRouterInitAnchors);
850
- window._qRouterInitAnchors = void 0;
851
- if (!window.navigation) {
852
- document.addEventListener(
853
- "visibilitychange",
854
- () => {
855
- if ((window._qRouterScrollEnabled || window._qCityScrollEnabled) && document.visibilityState === "hidden") {
856
- if (window._qCityScrollEnabled) {
857
- console.warn(
858
- '"_qCityScrollEnabled" is deprecated. Use "_qRouterScrollEnabled" instead.'
859
- );
860
- }
861
- const scrollState2 = currentScrollState(scroller);
862
- saveScrollHistory(scrollState2);
863
- }
864
- },
865
- { passive: true }
866
- );
867
- document.removeEventListener("visibilitychange", window._qRouterInitVisibility);
868
- window._qRouterInitVisibility = void 0;
869
- }
870
- window.addEventListener(
871
- "scroll",
872
- () => {
873
- if (!window._qRouterScrollEnabled && !window._qCityScrollEnabled) {
874
- return;
875
- }
876
- clearTimeout(window._qRouterScrollDebounce);
877
- window._qRouterScrollDebounce = setTimeout(() => {
878
- const scrollState2 = currentScrollState(scroller);
879
- saveScrollHistory(scrollState2);
880
- window._qRouterScrollDebounce = void 0;
881
- }, 200);
882
- },
883
- { passive: true }
884
- );
885
- removeEventListener("scroll", window._qRouterInitScroll);
886
- window._qRouterInitScroll = void 0;
887
- spaInit.resolve();
888
- }
889
- if (navType !== "popstate") {
890
- window._qRouterScrollEnabled = false;
891
- clearTimeout(window._qRouterScrollDebounce);
892
- const scrollState2 = currentScrollState(scroller);
893
- saveScrollHistory(scrollState2);
894
- }
895
- const navigate = () => {
896
- routing.clientNavigate(window, navType, prevUrl, trackUrl, replaceState);
897
- contentInternal.force();
898
- return internal._waitUntilRendered(elm);
899
- };
900
- const _waitNextPage = () => {
901
- if (core.isServer || props?.viewTransition === false) {
902
- return navigate();
903
- } else {
904
- const viewTransition = startViewTransition({
905
- update: navigate,
906
- types: ["qwik-navigation"]
907
- });
908
- if (!viewTransition) {
909
- return Promise.resolve();
910
- }
911
- return viewTransition.ready;
912
- }
913
- };
914
- _waitNextPage().then(() => {
915
- const container2 = internal._getQContainerElement(elm);
916
- container2.setAttribute(routing.Q_ROUTE, routeName);
917
- const scrollState2 = currentScrollState(scroller);
918
- saveScrollHistory(scrollState2);
919
- window._qRouterScrollEnabled = true;
920
- if (core.isBrowser) {
921
- callRestoreScrollOnDocument();
922
- }
923
- if (shouldForcePrevUrl) {
924
- internal.forceStoreEffects(routeLocation, "prevUrl");
925
- }
926
- if (shouldForceUrl) {
927
- internal.forceStoreEffects(routeLocation, "url");
928
- }
929
- if (shouldForceParams) {
930
- internal.forceStoreEffects(routeLocation, "params");
931
- }
932
- routeLocation.isNavigating = false;
933
- navResolver.r?.();
934
- });
935
- }
936
- }
937
- }
938
- if (core.isServer) {
939
- return run();
940
- } else {
941
- run();
942
- }
943
- });
944
- };
945
- const QwikRouterProvider = core.component$((props) => {
946
- useQwikRouter(props);
947
- return /* @__PURE__ */ jsxRuntime.jsx(core.Slot, {});
948
- });
949
- const QwikCityProvider = QwikRouterProvider;
950
- const useQwikMockRouter = (props) => {
951
- const urlEnv = props.url ?? "http://localhost/";
952
- const url = new URL(urlEnv);
953
- const routeLocation = core.useStore(
954
- {
955
- url,
956
- params: props.params ?? {},
957
- isNavigating: false,
958
- prevUrl: void 0
959
- },
960
- { deep: false }
961
- );
962
- const loaderState = {};
963
- const goto = props.goto ?? core.$(async () => {
964
- console.warn("QwikRouterMockProvider: goto not provided");
965
- });
966
- const documentHead = core.useStore(createDocumentHead, { deep: false });
967
- const content = core.useStore(
968
- {
969
- headings: void 0,
970
- menu: void 0
971
- },
972
- { deep: false }
973
- );
974
- const contentInternal = core.useSignal();
975
- const actionState = core.useSignal();
976
- core.useContextProvider(ContentContext, content);
977
- core.useContextProvider(ContentInternalContext, contentInternal);
978
- core.useContextProvider(DocumentHeadContext, documentHead);
979
- core.useContextProvider(RouteLocationContext, routeLocation);
980
- core.useContextProvider(RouteNavigateContext, goto);
981
- core.useContextProvider(RouteStateContext, loaderState);
982
- core.useContextProvider(RouteActionContext, actionState);
983
- };
984
- const QwikRouterMockProvider = core.component$((props) => {
985
- useQwikMockRouter(props);
986
- return /* @__PURE__ */ jsxRuntime.jsx(core.Slot, {});
987
- });
988
- const QwikCityMockProvider = QwikRouterMockProvider;
989
- const RouterOutlet = core.component$(() => {
990
- const serverData = core.useServerData("containerAttributes");
991
- if (!serverData) {
992
- throw new Error("PrefetchServiceWorker component must be rendered on the server.");
993
- }
994
- const internalContext = core.useContext(ContentInternalContext);
995
- const contents = internalContext.value;
996
- if (contents && contents.length > 0) {
997
- const contentsLen = contents.length;
998
- let cmp = null;
999
- for (let i = contentsLen - 1; i >= 0; i--) {
1000
- if (contents[i].default) {
1001
- cmp = core.jsx(contents[i].default, {
1002
- children: cmp
1003
- });
1004
- }
1005
- }
1006
- return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1007
- cmp,
1008
- !__EXPERIMENTAL__.noSPA && /* @__PURE__ */ jsxRuntime.jsx(
1009
- "script",
1010
- {
1011
- "document:onQCInit$": spaInit,
1012
- "document:onQInit$": core.sync$(() => {
1013
- ((w, h) => {
1014
- if (!w._qcs && h.scrollRestoration === "manual") {
1015
- w._qcs = true;
1016
- const s = h.state?._qRouterScroll;
1017
- if (s) {
1018
- w.scrollTo(s.x, s.y);
1019
- }
1020
- document.dispatchEvent(new Event("qcinit"));
1021
- }
1022
- })(window, history);
1023
- })
1024
- }
1025
- )
1026
- ] });
1027
- }
1028
- return core.SkipRender;
1029
- });
1030
- const routeActionQrl = ((actionQrl, ...rest) => {
1031
- const { id, validators } = getValidators(rest, actionQrl);
1032
- function action() {
1033
- const loc = useLocation();
1034
- const currentAction = useAction();
1035
- const initialState = {
1036
- actionPath: `?${routing.QACTION_KEY}=${id}`,
1037
- submitted: false,
1038
- isRunning: false,
1039
- status: void 0,
1040
- value: void 0,
1041
- formData: void 0
1042
- };
1043
- const state = core.useStore(() => {
1044
- const value = currentAction.value;
1045
- if (value && value?.id === id) {
1046
- const data = value.data;
1047
- if (data instanceof FormData) {
1048
- initialState.formData = data;
1049
- }
1050
- if (value.output) {
1051
- const { status, result } = value.output;
1052
- initialState.status = status;
1053
- initialState.value = result;
1054
- }
1055
- }
1056
- return initialState;
1057
- });
1058
- const submit = core.$((input = {}) => {
1059
- if (core.isServer) {
1060
- throw new Error(`Actions can not be invoked within the server during SSR.
1061
- Action.run() can only be called on the browser, for example when a user clicks a button, or submits a form.`);
1062
- }
1063
- let data;
1064
- let form;
1065
- if (input instanceof SubmitEvent) {
1066
- form = input.target;
1067
- data = new FormData(form);
1068
- if ((input.submitter instanceof HTMLInputElement || input.submitter instanceof HTMLButtonElement) && input.submitter.name) {
1069
- if (input.submitter.name) {
1070
- data.append(input.submitter.name, input.submitter.value);
1071
- }
1072
- }
1073
- } else {
1074
- data = input;
1075
- }
1076
- return new Promise((resolve) => {
1077
- if (data instanceof FormData) {
1078
- state.formData = data;
1079
- }
1080
- state.submitted = true;
1081
- state.isRunning = true;
1082
- loc.isNavigating = true;
1083
- currentAction.value = {
1084
- data,
1085
- id,
1086
- resolve: core.noSerialize(resolve)
1087
- };
1088
- }).then(({ result, status }) => {
1089
- state.isRunning = false;
1090
- state.status = status;
1091
- state.value = result;
1092
- if (form) {
1093
- if (form.getAttribute("data-spa-reset") === "true") {
1094
- form.reset();
1095
- }
1096
- const detail = { status, value: result };
1097
- form.dispatchEvent(
1098
- new CustomEvent("submitcompleted", {
1099
- bubbles: false,
1100
- cancelable: false,
1101
- composed: false,
1102
- detail
1103
- })
1104
- );
1105
- }
1106
- return {
1107
- status,
1108
- value: result
1109
- };
1110
- });
1111
- });
1112
- initialState.submit = submit;
1113
- return state;
1114
- }
1115
- action.__brand = "server_action";
1116
- action.__validators = validators;
1117
- action.__qrl = actionQrl;
1118
- action.__id = id;
1119
- Object.freeze(action);
1120
- return action;
1121
- });
1122
- const globalActionQrl = ((actionQrl, ...rest) => {
1123
- const action = routeActionQrl(actionQrl, ...rest);
1124
- if (core.isServer) {
1125
- if (typeof globalThis._qwikActionsMap === "undefined") {
1126
- globalThis._qwikActionsMap = /* @__PURE__ */ new Map();
1127
- }
1128
- globalThis._qwikActionsMap.set(action.__id, action);
1129
- }
1130
- return action;
1131
- });
1132
- const routeAction$ = /* @__PURE__ */ core.implicit$FirstArg(
1133
- routeActionQrl
1134
- );
1135
- const globalAction$ = /* @__PURE__ */ core.implicit$FirstArg(
1136
- globalActionQrl
1137
- );
1138
- const routeLoaderQrl = ((loaderQrl, ...rest) => {
1139
- const { id, validators, serializationStrategy } = getValidators(rest, loaderQrl);
1140
- function loader() {
1141
- const state = internal._resolveContextWithoutSequentialScope(RouteStateContext);
1142
- if (!(id in state)) {
1143
- throw new Error(`routeLoader$ "${loaderQrl.getSymbol()}" was invoked in a route where it was not declared.
1144
- This is because the routeLoader$ was not exported in a 'layout.tsx' or 'index.tsx' file of the existing route.
1145
- For more information check: https://qwik.dev/docs/route-loader/
1146
-
1147
- If your are managing reusable logic or a library it is essential that this function is re-exported from within 'layout.tsx' or 'index.tsx file of the existing route otherwise it will not run or throw exception.
1148
- For more information check: https://qwik.dev/docs/re-exporting-loaders/`);
1149
- }
1150
- core.untrack(() => state[id].value);
1151
- return state[id];
1152
- }
1153
- loader.__brand = "server_loader";
1154
- loader.__qrl = loaderQrl;
1155
- loader.__validators = validators;
1156
- loader.__id = id;
1157
- loader.__serializationStrategy = serializationStrategy;
1158
- loader.__expires = -1;
1159
- Object.freeze(loader);
1160
- return loader;
1161
- });
1162
- const routeLoader$ = /* @__PURE__ */ core.implicit$FirstArg(routeLoaderQrl);
1163
- const validatorQrl = ((validator) => {
1164
- if (core.isServer) {
1165
- return {
1166
- validate: validator
1167
- };
1168
- }
1169
- return void 0;
1170
- });
1171
- const validator$ = /* @__PURE__ */ core.implicit$FirstArg(validatorQrl);
1172
- const flattenValibotIssues = (issues) => {
1173
- return issues.reduce((acc, issue) => {
1174
- if (issue.path) {
1175
- const hasArrayType = issue.path.some((path) => path.type === "array");
1176
- if (hasArrayType) {
1177
- const keySuffix = issue.expected === "Array" ? "[]" : "";
1178
- const key = issue.path.map((item) => item.type === "array" ? "*" : item.key).join(".").replace(/\.\*/g, "[]") + keySuffix;
1179
- acc[key] = acc[key] || [];
1180
- if (Array.isArray(acc[key])) {
1181
- acc[key].push(issue.message);
1182
- }
1183
- return acc;
1184
- } else {
1185
- acc[issue.path.map((item) => item.key).join(".")] = issue.message;
1186
- }
1187
- }
1188
- return acc;
1189
- }, {});
1190
- };
1191
- const valibotQrl = (qrl) => {
1192
- if (!__EXPERIMENTAL__.valibot) {
1193
- throw new Error(
1194
- 'Valibot is an experimental feature and is not enabled. Please enable the feature flag by adding `experimental: ["valibot"]` to your qwikVite plugin options.'
1195
- );
1196
- }
1197
- if (core.isServer) {
1198
- return {
1199
- __brand: "valibot",
1200
- async validate(ev, inputData) {
1201
- const schema = await qrl.resolve().then((obj) => typeof obj === "function" ? obj(ev) : obj);
1202
- const data = inputData ?? await ev.parseBody();
1203
- const result = await v__namespace.safeParseAsync(schema, data);
1204
- if (result.success) {
1205
- return {
1206
- success: true,
1207
- data: result.output
1208
- };
1209
- } else {
1210
- if (core.isDev) {
1211
- console.error("ERROR: Valibot validation failed", result.issues);
1212
- }
1213
- return {
1214
- success: false,
1215
- status: 400,
1216
- error: {
1217
- formErrors: v__namespace.flatten(result.issues).root ?? [],
1218
- fieldErrors: flattenValibotIssues(result.issues)
1219
- }
1220
- };
1221
- }
1222
- }
1223
- };
1224
- }
1225
- return void 0;
1226
- };
1227
- const valibot$ = /* @__PURE__ */ core.implicit$FirstArg(valibotQrl);
1228
- const flattenZodIssues = (issues) => {
1229
- issues = Array.isArray(issues) ? issues : [issues];
1230
- return issues.reduce((acc, issue) => {
1231
- const isExpectingArray = "expected" in issue && issue.expected === "array";
1232
- const hasArrayType = issue.path.some((path) => typeof path === "number") || isExpectingArray;
1233
- if (hasArrayType) {
1234
- const keySuffix = "expected" in issue && issue.expected === "array" ? "[]" : "";
1235
- const key = issue.path.map((path) => typeof path === "number" ? "*" : path).join(".").replace(/\.\*/g, "[]") + keySuffix;
1236
- acc[key] = acc[key] || [];
1237
- if (Array.isArray(acc[key])) {
1238
- acc[key].push(issue.message);
1239
- }
1240
- return acc;
1241
- } else {
1242
- acc[issue.path.join(".")] = issue.message;
1243
- }
1244
- return acc;
1245
- }, {});
1246
- };
1247
- const zodQrl = (qrl) => {
1248
- if (core.isServer) {
1249
- return {
1250
- __brand: "zod",
1251
- async validate(ev, inputData) {
1252
- const schema = await qrl.resolve().then((obj) => {
1253
- if (typeof obj === "function") {
1254
- obj = obj(z__namespace, ev);
1255
- }
1256
- if (obj instanceof z__namespace.Schema) {
1257
- return obj;
1258
- } else {
1259
- return z__namespace.object(obj);
1260
- }
1261
- });
1262
- const data = inputData ?? await ev.parseBody();
1263
- const result = await core.withLocale(ev.locale(), () => schema.safeParseAsync(data));
1264
- if (result.success) {
1265
- return result;
1266
- } else {
1267
- if (core.isDev) {
1268
- console.error("ERROR: Zod validation failed", result.error.issues);
1269
- }
1270
- return {
1271
- success: false,
1272
- status: 400,
1273
- error: {
1274
- formErrors: result.error.flatten().formErrors,
1275
- fieldErrors: flattenZodIssues(result.error.issues)
1276
- }
1277
- };
1278
- }
1279
- }
1280
- };
1281
- }
1282
- return void 0;
1283
- };
1284
- const zod$ = /* @__PURE__ */ core.implicit$FirstArg(zodQrl);
1285
- const serverQrl = (qrl, options) => {
1286
- if (core.isServer) {
1287
- const captured = qrl.getCaptured();
1288
- if (captured && captured.length > 0 && !internal._getContextElement()) {
1289
- throw new Error("For security reasons, we cannot serialize QRLs that capture lexical scope.");
1290
- }
1291
- }
1292
- const method = options?.method?.toUpperCase?.() || "POST";
1293
- const headers = options?.headers || {};
1294
- const origin = options?.origin || "";
1295
- const fetchOptions = options?.fetchOptions || {};
1296
- return core.$(async function(...args) {
1297
- const abortSignal = args.length > 0 && args[0] instanceof AbortSignal ? args.shift() : void 0;
1298
- if (core.isServer) {
1299
- let requestEvent = requestHandler._asyncRequestStore?.getStore();
1300
- if (!requestEvent) {
1301
- const contexts = [useQwikRouterEnv()?.ev, this, internal._getContextEvent()];
1302
- requestEvent = contexts.find(
1303
- (v2) => v2 && Object.prototype.hasOwnProperty.call(v2, "sharedMap") && Object.prototype.hasOwnProperty.call(v2, "cookie")
1304
- );
1305
- }
1306
- return qrl.apply(requestEvent, core.isDev ? routing.deepFreeze(args) : args);
1307
- } else {
1308
- const ctxElm = internal._getContextElement();
1309
- const filteredArgs = args.map((arg) => {
1310
- if (arg instanceof SubmitEvent && arg.target instanceof HTMLFormElement) {
1311
- return new FormData(arg.target);
1312
- } else if (arg instanceof Event) {
1313
- return null;
1314
- } else if (arg instanceof Node) {
1315
- return null;
1316
- }
1317
- return arg;
1318
- });
1319
- const qrlHash = qrl.getHash();
1320
- let query = "";
1321
- const config = {
1322
- ...fetchOptions,
1323
- method,
1324
- headers: {
1325
- ...headers,
1326
- "Content-Type": "application/qwik-json",
1327
- Accept: "application/json, application/qwik-json, text/qwik-json-stream, text/plain",
1328
- // Required so we don't call accidentally
1329
- "X-QRL": qrlHash
1330
- },
1331
- signal: abortSignal
1332
- };
1333
- const captured = qrl.getCaptured();
1334
- let toSend;
1335
- if (captured?.length) {
1336
- toSend = [filteredArgs, captured];
1337
- } else {
1338
- toSend = filteredArgs.length ? [filteredArgs] : [];
1339
- }
1340
- const body = await internal._serialize(toSend);
1341
- if (method === "GET") {
1342
- query += `&${routing.QDATA_KEY}=${encodeURIComponent(body)}`;
1343
- } else {
1344
- config.body = body;
1345
- }
1346
- const res = await fetch(`${origin}?${routing.QFN_KEY}=${qrlHash}${query}`, config);
1347
- const contentType = res.headers.get("Content-Type");
1348
- if (res.ok && contentType === "text/qwik-json-stream" && res.body) {
1349
- return (async function* () {
1350
- try {
1351
- for await (const result of deserializeStream(
1352
- res.body,
1353
- ctxElm ?? document.documentElement,
1354
- abortSignal
1355
- )) {
1356
- yield result;
1357
- }
1358
- } finally {
1359
- if (!abortSignal?.aborted) {
1360
- await res.body.cancel();
1361
- }
1362
- }
1363
- })();
1364
- } else if (contentType === "application/qwik-json") {
1365
- const str = await res.text();
1366
- const [obj] = internal._deserialize(str, ctxElm ?? document.documentElement);
1367
- if (res.status >= 400) {
1368
- throw obj;
1369
- }
1370
- return obj;
1371
- } else if (contentType === "application/json") {
1372
- const obj = await res.json();
1373
- if (res.status >= 400) {
1374
- throw obj;
1375
- }
1376
- return obj;
1377
- } else if (contentType === "text/plain" || contentType === "text/html") {
1378
- const str = await res.text();
1379
- if (res.status >= 400) {
1380
- throw str;
1381
- }
1382
- return str;
1383
- }
1384
- }
1385
- });
1386
- };
1387
- const server$ = /* @__PURE__ */ core.implicit$FirstArg(serverQrl);
1388
- const getValidators = (rest, qrl) => {
1389
- let id;
1390
- let serializationStrategy = routing.DEFAULT_LOADERS_SERIALIZATION_STRATEGY;
1391
- const validators = [];
1392
- if (rest.length === 1) {
1393
- const options = rest[0];
1394
- if (options && typeof options === "object") {
1395
- if ("validate" in options) {
1396
- validators.push(options);
1397
- } else {
1398
- id = options.id;
1399
- if (options.serializationStrategy) {
1400
- serializationStrategy = options.serializationStrategy;
1401
- }
1402
- if (options.validation) {
1403
- validators.push(...options.validation);
1404
- }
1405
- }
1406
- }
1407
- } else if (rest.length > 1) {
1408
- validators.push(...rest.filter((v2) => !!v2));
1409
- }
1410
- if (typeof id === "string") {
1411
- if (core.isDev) {
1412
- if (!/^[\w/.-]+$/.test(id)) {
1413
- throw new Error(`Invalid id: ${id}, id can only contain [a-zA-Z0-9_.-]`);
1414
- }
1415
- }
1416
- id = `id_${id}`;
1417
- } else {
1418
- id = qrl.getHash();
1419
- }
1420
- return {
1421
- validators: validators.reverse(),
1422
- id,
1423
- serializationStrategy
1424
- };
1425
- };
1426
- const deserializeStream = async function* (stream, ctxElm, abortSignal) {
1427
- const reader = stream.getReader();
1428
- try {
1429
- let buffer = "";
1430
- const decoder = new TextDecoder();
1431
- while (!abortSignal?.aborted) {
1432
- const result = await reader.read();
1433
- if (result.done) {
1434
- break;
1435
- }
1436
- buffer += decoder.decode(result.value, { stream: true });
1437
- const lines = buffer.split(/\n/);
1438
- buffer = lines.pop();
1439
- for (const line of lines) {
1440
- const [deserializedData] = internal._deserialize(line, ctxElm);
1441
- yield deserializedData;
1442
- }
1443
- }
1444
- } finally {
1445
- reader.releaseLock();
1446
- }
1447
- };
1448
- const ServiceWorkerRegister = (props) => /* @__PURE__ */ jsxRuntime.jsx("script", { type: "module", dangerouslySetInnerHTML: swRegister, nonce: props.nonce });
1449
- const Form = ({ action, spaReset, reloadDocument, onSubmit$, ...rest }, key) => {
1450
- if (action) {
1451
- const isArrayApi = Array.isArray(onSubmit$);
1452
- if (isArrayApi) {
1453
- return core.jsx(
1454
- "form",
1455
- {
1456
- ...rest,
1457
- action: action.actionPath,
1458
- "preventdefault:submit": !reloadDocument,
1459
- onSubmit$: [
1460
- ...onSubmit$,
1461
- // action.submit "submitcompleted" event for onSubmitCompleted$ events
1462
- !reloadDocument ? core.$((evt) => {
1463
- if (!action.submitted) {
1464
- return action.submit(evt);
1465
- }
1466
- }) : void 0
1467
- ],
1468
- method: "post",
1469
- ["data-spa-reset"]: spaReset ? "true" : void 0
1470
- },
1471
- key
1472
- );
1473
- }
1474
- return core.jsx(
1475
- "form",
1476
- {
1477
- ...rest,
1478
- action: action.actionPath,
1479
- "preventdefault:submit": !reloadDocument,
1480
- onSubmit$: [
1481
- // Since v2, this fires before the action is executed so it can be prevented
1482
- onSubmit$,
1483
- // action.submit "submitcompleted" event for onSubmitCompleted$ events
1484
- !reloadDocument ? action.submit : void 0
1485
- ],
1486
- method: "post",
1487
- ["data-spa-reset"]: spaReset ? "true" : void 0
1488
- },
1489
- key
1490
- );
1491
- } else {
1492
- return /* @__PURE__ */ jsxRuntime.jsx(
1493
- GetForm,
1494
- {
1495
- spaReset,
1496
- reloadDocument,
1497
- onSubmit$,
1498
- ...rest
1499
- },
1500
- key
1501
- );
1502
- }
1503
- };
1504
- const GetForm = core.component$(
1505
- ({ action: _0, spaReset, reloadDocument, onSubmit$, ...rest }) => {
1506
- const nav = useNavigate();
1507
- return /* @__PURE__ */ jsxRuntime.jsx(
1508
- "form",
1509
- {
1510
- action: "get",
1511
- "preventdefault:submit": !reloadDocument,
1512
- "data-spa-reset": spaReset ? "true" : void 0,
1513
- ...rest,
1514
- onSubmit$: [
1515
- ...Array.isArray(onSubmit$) ? onSubmit$ : [onSubmit$],
1516
- core.$(async (_evt, form) => {
1517
- const formData = new FormData(form);
1518
- const params = new URLSearchParams();
1519
- formData.forEach((value, key) => {
1520
- if (typeof value === "string") {
1521
- params.append(key, value);
1522
- }
1523
- });
1524
- await nav("?" + params.toString(), { type: "form", forceReload: true });
1525
- }),
1526
- core.$((_evt, form) => {
1527
- if (form.getAttribute("data-spa-reset") === "true") {
1528
- form.reset();
1529
- }
1530
- form.dispatchEvent(
1531
- new CustomEvent("submitcompleted", {
1532
- bubbles: false,
1533
- cancelable: false,
1534
- composed: false,
1535
- detail: {
1536
- status: 200
1537
- }
1538
- })
1539
- );
1540
- })
1541
- // end of array
1542
- ],
1543
- children: /* @__PURE__ */ jsxRuntime.jsx(core.Slot, {})
1544
- }
1545
- );
1546
- }
1547
- );
1548
- const untypedAppUrl = function appUrl(route, params, paramsPrefix = "") {
1549
- const path = route.split("/");
1550
- for (let i = 0; i < path.length; i++) {
1551
- const segment = path[i];
1552
- if (segment.startsWith("[") && segment.endsWith("]")) {
1553
- const isSpread = segment.startsWith("[...");
1554
- const key = segment.substring(segment.startsWith("[...") ? 4 : 1, segment.length - 1);
1555
- const value = params ? params[paramsPrefix + key] || params[key] : "";
1556
- path[i] = isSpread ? value : encodeURIComponent(value);
1557
- }
1558
- if (segment.startsWith("(") && segment.endsWith(")")) {
1559
- path.splice(i, 1);
1560
- }
1561
- }
1562
- let url = path.join("/");
1563
- let baseURL = "/";
1564
- if (baseURL) {
1565
- if (!baseURL.endsWith("/")) {
1566
- baseURL += "/";
1567
- }
1568
- while (url.startsWith("/")) {
1569
- url = url.substring(1);
1570
- }
1571
- url = baseURL + url;
1572
- }
1573
- return url;
1574
- };
1575
- function omitProps(obj, keys) {
1576
- const omittedObj = {};
1577
- for (const key in obj) {
1578
- if (!key.startsWith("param:") && !keys.includes(key)) {
1579
- omittedObj[key] = obj[key];
1580
- }
1581
- }
1582
- return omittedObj;
1583
- }
1584
- const createRenderer = (getOptions) => {
1585
- return ((opts) => {
1586
- const { jsx, options } = getOptions(opts);
1587
- return server.renderToStream(jsx, options);
1588
- });
1589
- };
1590
- const DocumentHeadTags = core.component$((props) => {
1591
- let head = useDocumentHead();
1592
- if (props) {
1593
- head = { ...head, ...props };
1594
- }
1595
- return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1596
- head.title && /* @__PURE__ */ jsxRuntime.jsx("title", { children: head.title }),
1597
- head.meta.map((m) => /* @__PURE__ */ jsxRuntime.jsx("meta", { ...m })),
1598
- head.links.map((l) => /* @__PURE__ */ jsxRuntime.jsx("link", { ...l })),
1599
- head.styles.map((s) => {
1600
- const props2 = s.props || s;
1601
- return /* @__PURE__ */ core.createElement(
1602
- "style",
1603
- {
1604
- ...props2,
1605
- dangerouslySetInnerHTML: s.style || props2.dangerouslySetInnerHTML,
1606
- key: s.key
1607
- }
1608
- );
1609
- }),
1610
- head.scripts.map((s) => {
1611
- const props2 = s.props || s;
1612
- return /* @__PURE__ */ core.createElement(
1613
- "script",
1614
- {
1615
- ...props2,
1616
- dangerouslySetInnerHTML: s.script || props2.dangerouslySetInnerHTML,
1617
- key: s.key
1618
- }
1619
- );
1620
- })
1621
- ] });
1622
- });
1623
- Object.defineProperty(exports, "z", {
1624
- enumerable: true,
1625
- get: () => z.z
1626
- });
1627
- exports.DocumentHeadTags = DocumentHeadTags;
1628
- exports.ErrorBoundary = ErrorBoundary;
1629
- exports.Form = Form;
1630
- exports.Link = Link;
1631
- exports.QWIK_CITY_SCROLLER = QWIK_CITY_SCROLLER;
1632
- exports.QWIK_ROUTER_SCROLLER = QWIK_ROUTER_SCROLLER;
1633
- exports.QwikCityMockProvider = QwikCityMockProvider;
1634
- exports.QwikCityProvider = QwikCityProvider;
1635
- exports.QwikRouterMockProvider = QwikRouterMockProvider;
1636
- exports.QwikRouterProvider = QwikRouterProvider;
1637
- exports.RouterOutlet = RouterOutlet;
1638
- exports.ServiceWorkerRegister = ServiceWorkerRegister;
1639
- exports.createRenderer = createRenderer;
1640
- exports.globalAction$ = globalAction$;
1641
- exports.globalActionQrl = globalActionQrl;
1642
- exports.omitProps = omitProps;
1643
- exports.routeAction$ = routeAction$;
1644
- exports.routeActionQrl = routeActionQrl;
1645
- exports.routeLoader$ = routeLoader$;
1646
- exports.routeLoaderQrl = routeLoaderQrl;
1647
- exports.server$ = server$;
1648
- exports.serverQrl = serverQrl;
1649
- exports.untypedAppUrl = untypedAppUrl;
1650
- exports.useContent = useContent;
1651
- exports.useDocumentHead = useDocumentHead;
1652
- exports.useLocation = useLocation;
1653
- exports.useNavigate = useNavigate;
1654
- exports.usePreventNavigate$ = usePreventNavigate$;
1655
- exports.usePreventNavigateQrl = usePreventNavigateQrl;
1656
- exports.useQwikRouter = useQwikRouter;
1657
- exports.valibot$ = valibot$;
1658
- exports.valibotQrl = valibotQrl;
1659
- exports.validator$ = validator$;
1660
- exports.validatorQrl = validatorQrl;
1661
- exports.zod$ = zod$;
1662
- exports.zodQrl = zodQrl;