@qwik.dev/router 2.0.0-beta.1 → 2.0.0-beta.11

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 (149) hide show
  1. package/adapters/static/vite.d.ts +1 -1
  2. package/lib/adapters/azure-swa/vite/index-BqUeglYs.cjs +1 -0
  3. package/lib/adapters/azure-swa/vite/index-CBIchDYq.js +651 -0
  4. package/lib/adapters/azure-swa/vite/index-ClHGw5z1.js +6 -0
  5. package/lib/adapters/azure-swa/vite/index-CrwlB95_.js +22 -0
  6. package/lib/adapters/azure-swa/vite/index-DTIOTwZo.cjs +11 -0
  7. package/lib/adapters/azure-swa/vite/index-vQuPcef3.cjs +1 -0
  8. package/lib/adapters/azure-swa/vite/index.cjs +5 -96
  9. package/lib/adapters/azure-swa/vite/index.d.ts +2 -2
  10. package/lib/adapters/azure-swa/vite/index.mjs +205 -26
  11. package/lib/adapters/bun-server/vite/index-BqUeglYs.cjs +1 -0
  12. package/lib/adapters/bun-server/vite/index-CBIchDYq.js +651 -0
  13. package/lib/adapters/bun-server/vite/index-ClHGw5z1.js +6 -0
  14. package/lib/adapters/bun-server/vite/index-CrwlB95_.js +22 -0
  15. package/lib/adapters/bun-server/vite/index-DTIOTwZo.cjs +11 -0
  16. package/lib/adapters/bun-server/vite/index-vQuPcef3.cjs +1 -0
  17. package/lib/adapters/bun-server/vite/index.cjs +5 -50
  18. package/lib/adapters/bun-server/vite/index.d.ts +2 -2
  19. package/lib/adapters/bun-server/vite/index.mjs +200 -12
  20. package/lib/adapters/cloud-run/vite/index-BqUeglYs.cjs +1 -0
  21. package/lib/adapters/cloud-run/vite/index-CBIchDYq.js +651 -0
  22. package/lib/adapters/cloud-run/vite/index-ClHGw5z1.js +6 -0
  23. package/lib/adapters/cloud-run/vite/index-CrwlB95_.js +22 -0
  24. package/lib/adapters/cloud-run/vite/index-DTIOTwZo.cjs +11 -0
  25. package/lib/adapters/cloud-run/vite/index-vQuPcef3.cjs +1 -0
  26. package/lib/adapters/cloud-run/vite/index.cjs +5 -47
  27. package/lib/adapters/cloud-run/vite/index.d.ts +2 -2
  28. package/lib/adapters/cloud-run/vite/index.mjs +199 -11
  29. package/lib/adapters/cloudflare-pages/vite/index-Bg_9YkM5.js +22 -0
  30. package/lib/adapters/cloudflare-pages/vite/index-C1aDmh1S.cjs +1 -0
  31. package/lib/adapters/cloudflare-pages/vite/index-CHT9Y93A.js +254 -0
  32. package/lib/adapters/cloudflare-pages/vite/index-Ck7KvpK1.cjs +11 -0
  33. package/lib/adapters/cloudflare-pages/vite/index-ClHGw5z1.js +6 -0
  34. package/lib/adapters/cloudflare-pages/vite/index-Cp1cjAds.js +645 -0
  35. package/lib/adapters/cloudflare-pages/vite/index-D9RL9dvJ.cjs +5 -0
  36. package/lib/adapters/cloudflare-pages/vite/index-vQuPcef3.cjs +1 -0
  37. package/lib/adapters/cloudflare-pages/vite/index.cjs +1 -115
  38. package/lib/adapters/cloudflare-pages/vite/index.d.ts +2 -2
  39. package/lib/adapters/cloudflare-pages/vite/index.mjs +4 -78
  40. package/lib/adapters/deno-server/vite/index-BqUeglYs.cjs +1 -0
  41. package/lib/adapters/deno-server/vite/index-CBIchDYq.js +651 -0
  42. package/lib/adapters/deno-server/vite/index-ClHGw5z1.js +6 -0
  43. package/lib/adapters/deno-server/vite/index-CrwlB95_.js +22 -0
  44. package/lib/adapters/deno-server/vite/index-DTIOTwZo.cjs +11 -0
  45. package/lib/adapters/deno-server/vite/index-vQuPcef3.cjs +1 -0
  46. package/lib/adapters/deno-server/vite/index.cjs +5 -62
  47. package/lib/adapters/deno-server/vite/index.d.ts +2 -2
  48. package/lib/adapters/deno-server/vite/index.mjs +202 -14
  49. package/lib/adapters/netlify-edge/vite/index-BqUeglYs.cjs +1 -0
  50. package/lib/adapters/netlify-edge/vite/index-CBIchDYq.js +651 -0
  51. package/lib/adapters/netlify-edge/vite/index-ClHGw5z1.js +6 -0
  52. package/lib/adapters/netlify-edge/vite/index-CrwlB95_.js +22 -0
  53. package/lib/adapters/netlify-edge/vite/index-DTIOTwZo.cjs +11 -0
  54. package/lib/adapters/netlify-edge/vite/index-vQuPcef3.cjs +1 -0
  55. package/lib/adapters/netlify-edge/vite/index.cjs +6 -129
  56. package/lib/adapters/netlify-edge/vite/index.d.ts +2 -2
  57. package/lib/adapters/netlify-edge/vite/index.mjs +244 -60
  58. package/lib/adapters/node-server/vite/index-BqUeglYs.cjs +1 -0
  59. package/lib/adapters/node-server/vite/index-CBIchDYq.js +651 -0
  60. package/lib/adapters/node-server/vite/index-ClHGw5z1.js +6 -0
  61. package/lib/adapters/node-server/vite/index-CrwlB95_.js +22 -0
  62. package/lib/adapters/node-server/vite/index-DTIOTwZo.cjs +11 -0
  63. package/lib/adapters/node-server/vite/index-vQuPcef3.cjs +1 -0
  64. package/lib/adapters/node-server/vite/index.cjs +5 -50
  65. package/lib/adapters/node-server/vite/index.d.ts +2 -2
  66. package/lib/adapters/node-server/vite/index.mjs +200 -12
  67. package/lib/adapters/shared/vite/index-BqUeglYs.cjs +1 -0
  68. package/lib/adapters/shared/vite/index-CBIchDYq.js +651 -0
  69. package/lib/adapters/shared/vite/index-ClHGw5z1.js +6 -0
  70. package/lib/adapters/shared/vite/index-CrwlB95_.js +22 -0
  71. package/lib/adapters/shared/vite/index-DTIOTwZo.cjs +11 -0
  72. package/lib/adapters/shared/vite/index-vQuPcef3.cjs +1 -0
  73. package/lib/adapters/shared/vite/index.cjs +2 -375
  74. package/lib/adapters/shared/vite/index.d.ts +9 -15
  75. package/lib/adapters/shared/vite/index.mjs +159 -292
  76. package/lib/adapters/ssg/vite/index-BqUeglYs.cjs +1 -0
  77. package/lib/adapters/ssg/vite/index-CBIchDYq.js +651 -0
  78. package/lib/adapters/ssg/vite/index-ClHGw5z1.js +6 -0
  79. package/lib/adapters/ssg/vite/index-CrwlB95_.js +22 -0
  80. package/lib/adapters/ssg/vite/index-DTIOTwZo.cjs +11 -0
  81. package/lib/adapters/ssg/vite/index-vQuPcef3.cjs +1 -0
  82. package/lib/adapters/ssg/vite/index.cjs +5 -0
  83. package/lib/adapters/ssg/vite/index.d.ts +13 -0
  84. package/lib/adapters/ssg/vite/index.mjs +205 -0
  85. package/lib/adapters/vercel-edge/vite/index-BqUeglYs.cjs +1 -0
  86. package/lib/adapters/vercel-edge/vite/index-CBIchDYq.js +651 -0
  87. package/lib/adapters/vercel-edge/vite/index-ClHGw5z1.js +6 -0
  88. package/lib/adapters/vercel-edge/vite/index-CrwlB95_.js +22 -0
  89. package/lib/adapters/vercel-edge/vite/index-DTIOTwZo.cjs +11 -0
  90. package/lib/adapters/vercel-edge/vite/index-vQuPcef3.cjs +1 -0
  91. package/lib/adapters/vercel-edge/vite/index.cjs +5 -118
  92. package/lib/adapters/vercel-edge/vite/index.d.ts +2 -2
  93. package/lib/adapters/vercel-edge/vite/index.mjs +234 -51
  94. package/lib/index.d.ts +172 -50
  95. package/lib/index.qwik.cjs +370 -191
  96. package/lib/index.qwik.mjs +372 -193
  97. package/lib/middleware/aws-lambda/index.cjs +1 -0
  98. package/lib/middleware/aws-lambda/index.d.ts +3 -2
  99. package/lib/middleware/aws-lambda/index.mjs +27 -41
  100. package/lib/middleware/azure-swa/index.cjs +1 -0
  101. package/lib/middleware/azure-swa/index.mjs +46 -269
  102. package/lib/middleware/bun/index.cjs +1 -0
  103. package/lib/middleware/bun/index.mjs +68 -120
  104. package/lib/middleware/cloudflare-pages/index.cjs +1 -0
  105. package/lib/middleware/cloudflare-pages/index.mjs +48 -80
  106. package/lib/middleware/deno/index.cjs +1 -0
  107. package/lib/middleware/deno/index.mjs +63 -110
  108. package/lib/middleware/firebase/index.cjs +1 -0
  109. package/lib/middleware/firebase/index.mjs +16 -28
  110. package/lib/middleware/netlify-edge/index.cjs +1 -0
  111. package/lib/middleware/netlify-edge/index.mjs +36 -64
  112. package/lib/middleware/node/index.cjs +1 -314
  113. package/lib/middleware/node/index.mjs +116 -198
  114. package/lib/middleware/request-handler/index.cjs +11 -1607
  115. package/lib/middleware/request-handler/index.d.ts +63 -62
  116. package/lib/middleware/request-handler/index.mjs +890 -1333
  117. package/lib/middleware/vercel-edge/index.cjs +1 -0
  118. package/lib/middleware/vercel-edge/index.mjs +47 -82
  119. package/lib/modules.d.ts +4 -12
  120. package/lib/service-worker.cjs +1 -17
  121. package/lib/service-worker.mjs +5 -15
  122. package/lib/ssg/deno.cjs +1 -0
  123. package/lib/ssg/deno.mjs +6 -0
  124. package/lib/ssg/index-CBIchDYq.js +651 -0
  125. package/lib/ssg/index-ClHGw5z1.js +6 -0
  126. package/lib/ssg/index-DTIOTwZo.cjs +11 -0
  127. package/lib/ssg/index-vQuPcef3.cjs +1 -0
  128. package/lib/ssg/index.cjs +1 -0
  129. package/lib/{static → ssg}/index.d.ts +17 -17
  130. package/lib/ssg/index.mjs +22 -0
  131. package/lib/ssg/node.cjs +11 -0
  132. package/lib/ssg/node.mjs +651 -0
  133. package/lib/vite/index.cjs +28 -27431
  134. package/lib/vite/index.d.ts +19 -3
  135. package/lib/vite/index.mjs +1425 -27227
  136. package/modules.d.ts +4 -12
  137. package/package.json +50 -39
  138. package/ssg.d.ts +2 -0
  139. package/static.d.ts +1 -1
  140. package/lib/adapters/static/vite/index.cjs +0 -368
  141. package/lib/adapters/static/vite/index.d.ts +0 -10
  142. package/lib/adapters/static/vite/index.mjs +0 -331
  143. package/lib/static/deno.mjs +0 -8
  144. package/lib/static/index.cjs +0 -67
  145. package/lib/static/index.mjs +0 -48
  146. package/lib/static/node.cjs +0 -1124
  147. package/lib/static/node.mjs +0 -1086
  148. package/middleware/request-handler/generated/not-found-paths.ts +0 -7
  149. package/middleware/request-handler/generated/static-paths.ts +0 -35
@@ -7,6 +7,7 @@ const internal = require("@qwik.dev/core/internal");
7
7
  const qwikRouterConfig = require("@qwik-router-config");
8
8
  const zod = require("zod");
9
9
  const swRegister = require("@qwik-router-sw-register");
10
+ const server = require("@qwik.dev/core/server");
10
11
  function _interopNamespaceDefault(e) {
11
12
  const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
12
13
  if (e) {
@@ -39,106 +40,25 @@ const ErrorBoundary = core.component$((props) => {
39
40
  const MODULE_CACHE = /* @__PURE__ */ new WeakMap();
40
41
  const CLIENT_DATA_CACHE = /* @__PURE__ */ new Map();
41
42
  const QACTION_KEY = "qaction";
43
+ const QLOADER_KEY = "qloaders";
42
44
  const QFN_KEY = "qfunc";
43
45
  const QDATA_KEY = "qdata";
44
- const toPath = (url) => url.pathname + url.search + url.hash;
45
- const toUrl = (url, baseUrl) => new URL(url, baseUrl.href);
46
- const isSameOrigin = (a, b) => a.origin === b.origin;
47
- const withSlash = (path) => path.endsWith("/") ? path : path + "/";
48
- const isSamePathname = ({ pathname: a }, { pathname: b }) => {
49
- const lDiff = Math.abs(a.length - b.length);
50
- return lDiff === 0 ? a === b : lDiff === 1 && withSlash(a) === withSlash(b);
51
- };
52
- const isSameSearchQuery = (a, b) => a.search === b.search;
53
- const isSamePath = (a, b) => isSameSearchQuery(a, b) && isSamePathname(a, b);
54
- const getClientDataPath = (pathname, pageSearch, action) => {
55
- let search = pageSearch ?? "";
56
- if (action) {
57
- search += (search ? "&" : "?") + QACTION_KEY + "=" + encodeURIComponent(action.id);
58
- }
59
- return pathname + (pathname.endsWith("/") ? "" : "/") + "q-data.json" + search;
60
- };
61
- const getClientNavPath = (props, baseUrl) => {
62
- const href = props.href;
63
- if (typeof href === "string" && typeof props.target !== "string" && !props.reload) {
64
- try {
65
- const linkUrl = toUrl(href.trim(), baseUrl.url);
66
- const currentUrl = toUrl("", baseUrl.url);
67
- if (isSameOrigin(linkUrl, currentUrl)) {
68
- return toPath(linkUrl);
69
- }
70
- } catch (e) {
71
- console.error(e);
72
- }
73
- } else if (props.reload) {
74
- return toPath(toUrl("", baseUrl.url));
75
- }
76
- return null;
77
- };
78
- const shouldPreload = (clientNavPath, currentLoc) => {
79
- if (clientNavPath) {
80
- const prefetchUrl = toUrl(clientNavPath, currentLoc.url);
81
- const currentUrl = toUrl("", currentLoc.url);
82
- return !isSamePathname(prefetchUrl, currentUrl);
83
- }
84
- return false;
85
- };
86
- const isPromise = (value) => {
87
- return value && typeof value.then === "function";
88
- };
89
- const deepFreeze = (obj) => {
90
- if (obj == null) {
91
- return obj;
92
- }
93
- Object.getOwnPropertyNames(obj).forEach((prop) => {
94
- const value = obj[prop];
95
- if (value && typeof value === "object" && !Object.isFrozen(value)) {
96
- deepFreeze(value);
97
- }
98
- });
99
- return Object.freeze(obj);
100
- };
101
- const clientNavigate = (win, navType, fromURL, toURL, replaceState = false) => {
102
- if (navType !== "popstate") {
103
- const samePath = isSamePath(fromURL, toURL);
104
- const sameHash = fromURL.hash === toURL.hash;
105
- if (!samePath || !sameHash) {
106
- const newState = {
107
- _qRouterScroll: newScrollState()
108
- };
109
- if (replaceState) {
110
- win.history.replaceState(newState, "", toPath(toURL));
111
- } else {
112
- win.history.pushState(newState, "", toPath(toURL));
113
- }
114
- }
115
- }
116
- };
117
- const newScrollState = () => {
118
- return {
119
- x: 0,
120
- y: 0,
121
- w: 0,
122
- h: 0
123
- };
124
- };
125
- const prefetchSymbols = (path) => {
126
- if (core.isBrowser) {
127
- path = path.endsWith("/") ? path : path + "/";
128
- path = path.length > 1 && path.startsWith("/") ? path.slice(1) : path;
129
- preloader.p(path, 0.8);
130
- }
131
- };
132
- const loadClientData = async (url, element, opts) => {
46
+ const Q_ROUTE = "q:route";
47
+ const DEFAULT_LOADERS_SERIALIZATION_STRATEGY = globalThis.__DEFAULT_LOADERS_SERIALIZATION_STRATEGY__ || "never";
48
+ const MAX_Q_DATA_RETRY_COUNT = 3;
49
+ const loadClientData = async (url, element, opts, retryCount = 0) => {
133
50
  const pagePathname = url.pathname;
134
51
  const pageSearch = url.search;
135
- const clientDataPath = getClientDataPath(pagePathname, pageSearch, opts?.action);
52
+ const clientDataPath = getClientDataPath(pagePathname, pageSearch, {
53
+ actionId: opts?.action?.id,
54
+ loaderIds: opts?.loaderIds
55
+ });
136
56
  let qData;
137
57
  if (!opts?.action) {
138
58
  qData = CLIENT_DATA_CACHE.get(clientDataPath);
139
59
  }
140
- if (opts?.prefetchSymbols !== false) {
141
- prefetchSymbols(pagePathname);
60
+ if (opts?.preloadRouteBundles !== false) {
61
+ preloadRouteBundles(pagePathname, 0.8);
142
62
  }
143
63
  let resolveFn;
144
64
  if (!qData) {
@@ -147,11 +67,17 @@ const loadClientData = async (url, element, opts) => {
147
67
  opts.action.data = void 0;
148
68
  }
149
69
  qData = fetch(clientDataPath, fetchOptions).then((rsp) => {
70
+ if (rsp.status === 404 && opts?.loaderIds && retryCount < MAX_Q_DATA_RETRY_COUNT) {
71
+ opts.loaderIds = void 0;
72
+ return loadClientData(url, element, opts, retryCount + 1);
73
+ }
150
74
  if (rsp.redirected) {
151
75
  const redirectedURL = new URL(rsp.url);
152
76
  const isQData = redirectedURL.pathname.endsWith("/q-data.json");
153
77
  if (!isQData || redirectedURL.origin !== location.origin) {
154
- location.href = redirectedURL.href;
78
+ if (!opts?.isPrefetch) {
79
+ location.href = redirectedURL.href;
80
+ }
155
81
  return;
156
82
  }
157
83
  }
@@ -222,11 +148,108 @@ const getFetchOptions = (action, noCache) => {
222
148
  method: "POST",
223
149
  body: JSON.stringify(actionData),
224
150
  headers: {
225
- "Content-Type": "application/json, charset=UTF-8"
151
+ "Content-Type": "application/json; charset=UTF-8"
226
152
  }
227
153
  };
228
154
  }
229
155
  };
156
+ const toPath = (url) => url.pathname + url.search + url.hash;
157
+ const toUrl = (url, baseUrl) => new URL(url, baseUrl.href);
158
+ const isSameOrigin = (a, b) => a.origin === b.origin;
159
+ const withSlash = (path) => path.endsWith("/") ? path : path + "/";
160
+ const isSamePathname = ({ pathname: a }, { pathname: b }) => {
161
+ const lDiff = Math.abs(a.length - b.length);
162
+ return lDiff === 0 ? a === b : lDiff === 1 && withSlash(a) === withSlash(b);
163
+ };
164
+ const isSameSearchQuery = (a, b) => a.search === b.search;
165
+ const isSamePath = (a, b) => isSameSearchQuery(a, b) && isSamePathname(a, b);
166
+ const getClientDataPath = (pathname, pageSearch, options) => {
167
+ let search = pageSearch ?? "";
168
+ if (options?.actionId) {
169
+ search += (search ? "&" : "?") + QACTION_KEY + "=" + encodeURIComponent(options.actionId);
170
+ }
171
+ if (options?.loaderIds) {
172
+ for (const loaderId of options.loaderIds) {
173
+ search += (search ? "&" : "?") + QLOADER_KEY + "=" + encodeURIComponent(loaderId);
174
+ }
175
+ }
176
+ return pathname + (pathname.endsWith("/") ? "" : "/") + "q-data.json" + search;
177
+ };
178
+ const getClientNavPath = (props, baseUrl) => {
179
+ const href = props.href;
180
+ if (typeof href === "string" && typeof props.target !== "string" && !props.reload) {
181
+ try {
182
+ const linkUrl = toUrl(href.trim(), baseUrl.url);
183
+ const currentUrl = toUrl("", baseUrl.url);
184
+ if (isSameOrigin(linkUrl, currentUrl)) {
185
+ return toPath(linkUrl);
186
+ }
187
+ } catch (e) {
188
+ console.error(e);
189
+ }
190
+ } else if (props.reload) {
191
+ return toPath(toUrl("", baseUrl.url));
192
+ }
193
+ return null;
194
+ };
195
+ const shouldPreload = (clientNavPath, currentLoc) => {
196
+ if (clientNavPath) {
197
+ const prefetchUrl = toUrl(clientNavPath, currentLoc.url);
198
+ const currentUrl = toUrl("", currentLoc.url);
199
+ return !isSamePathname(prefetchUrl, currentUrl);
200
+ }
201
+ return false;
202
+ };
203
+ const isPromise = (value) => {
204
+ return value && typeof value.then === "function";
205
+ };
206
+ const createLoaderSignal = (loadersObject, loaderId, url, serializationStrategy, container) => {
207
+ return core.createAsyncComputed$(async () => {
208
+ if (core.isBrowser && loadersObject[loaderId] === internal._UNINITIALIZED) {
209
+ const data = await loadClientData(url, void 0, {
210
+ loaderIds: [
211
+ loaderId
212
+ ]
213
+ });
214
+ loadersObject[loaderId] = data?.loaders[loaderId] ?? internal._UNINITIALIZED;
215
+ }
216
+ return loadersObject[loaderId];
217
+ }, {
218
+ container,
219
+ serializationStrategy
220
+ });
221
+ };
222
+ const clientNavigate = (win, navType, fromURL, toURL, replaceState = false) => {
223
+ if (navType !== "popstate") {
224
+ const samePath = isSamePath(fromURL, toURL);
225
+ const sameHash = fromURL.hash === toURL.hash;
226
+ if (!samePath || !sameHash) {
227
+ const newState = {
228
+ _qRouterScroll: newScrollState()
229
+ };
230
+ if (replaceState) {
231
+ win.history.replaceState(newState, "", toPath(toURL));
232
+ } else {
233
+ win.history.pushState(newState, "", toPath(toURL));
234
+ }
235
+ }
236
+ }
237
+ };
238
+ const newScrollState = () => {
239
+ return {
240
+ x: 0,
241
+ y: 0,
242
+ w: 0,
243
+ h: 0
244
+ };
245
+ };
246
+ const preloadRouteBundles = (path, probability = 0.8) => {
247
+ if (core.isBrowser) {
248
+ path = path.endsWith("/") ? path : path + "/";
249
+ path = path.length > 1 && path.startsWith("/") ? path.slice(1) : path;
250
+ preloader.p(path, probability);
251
+ }
252
+ };
230
253
  const RouteStateContext = /* @__PURE__ */ core.createContextId("qc-s");
231
254
  const ContentContext = /* @__PURE__ */ core.createContextId("qc-c");
232
255
  const ContentInternalContext = /* @__PURE__ */ core.createContextId("qc-ic");
@@ -269,33 +292,38 @@ const Link = core.component$((props) => {
269
292
  }
270
293
  if (elm && elm.href) {
271
294
  const url = new URL(elm.href);
272
- prefetchSymbols(url.pathname);
295
+ preloadRouteBundles(url.pathname);
273
296
  if (elm.hasAttribute("data-prefetch")) {
274
297
  loadClientData(url, elm, {
275
- prefetchSymbols: false,
298
+ preloadRouteBundles: false,
276
299
  isPrefetch: true
277
300
  });
278
301
  }
279
302
  }
280
303
  }) : void 0;
281
- const preventDefault = clientNavPath ? core.sync$((event, target) => {
304
+ const preventDefault = clientNavPath ? core.sync$((event) => {
282
305
  if (!(event.metaKey || event.ctrlKey || event.shiftKey || event.altKey)) {
283
306
  event.preventDefault();
284
307
  }
285
308
  }) : void 0;
286
- const handleClick = clientNavPath ? core.$(async (event, elm) => {
309
+ const handleClientSideNavigation = clientNavPath ? core.$((event, elm) => {
287
310
  if (event.defaultPrevented) {
288
311
  if (elm.href) {
289
312
  elm.setAttribute("aria-pressed", "true");
290
- await nav(elm.href, {
313
+ nav(elm.href, {
291
314
  forceReload: reload,
292
315
  replaceState,
293
316
  scroll
317
+ }).then(() => {
318
+ elm.removeAttribute("aria-pressed");
294
319
  });
295
- elm.removeAttribute("aria-pressed");
296
320
  }
297
321
  }
298
322
  }) : void 0;
323
+ const handlePreload = core.$((_, elm) => {
324
+ const url = new URL(elm.href);
325
+ preloadRouteBundles(url.pathname, 1);
326
+ });
299
327
  core.useVisibleTask$(({ track }) => {
300
328
  track(() => loc.url.pathname);
301
329
  const handler = linkProps.onQVisible$;
@@ -317,8 +345,9 @@ const Link = core.component$((props) => {
317
345
  ...linkProps,
318
346
  onClick$: [
319
347
  preventDefault,
348
+ handlePreload,
320
349
  onClick$,
321
- handleClick
350
+ handleClientSideNavigation
322
351
  ],
323
352
  "data-prefetch": prefetchData,
324
353
  onMouseOver$: [
@@ -334,8 +363,8 @@ const Link = core.component$((props) => {
334
363
  children: /* @__PURE__ */ jsxRuntime.jsx(core.Slot, {})
335
364
  });
336
365
  });
337
- const resolveHead = (endpoint, routeLocation, contentModules, locale) => {
338
- const head = createDocumentHead();
366
+ const resolveHead = (endpoint, routeLocation, contentModules, locale, defaults) => {
367
+ const head = createDocumentHead(defaults);
339
368
  const getData = (loaderOrAction) => {
340
369
  const id = loaderOrAction.__id;
341
370
  if (loaderOrAction.__brand === "server_loader") {
@@ -349,23 +378,31 @@ const resolveHead = (endpoint, routeLocation, contentModules, locale) => {
349
378
  }
350
379
  return data;
351
380
  };
352
- const headProps = {
353
- head,
354
- withLocale: (fn) => core.withLocale(locale, fn),
355
- resolveValue: getData,
356
- ...routeLocation
357
- };
358
- for (let i = contentModules.length - 1; i >= 0; i--) {
359
- const contentModuleHead = contentModules[i] && contentModules[i].head;
381
+ const fns = [];
382
+ for (const contentModule of contentModules) {
383
+ const contentModuleHead = contentModule?.head;
360
384
  if (contentModuleHead) {
361
385
  if (typeof contentModuleHead === "function") {
362
- resolveDocumentHead(head, core.withLocale(locale, () => contentModuleHead(headProps)));
386
+ fns.unshift(contentModuleHead);
363
387
  } else if (typeof contentModuleHead === "object") {
364
388
  resolveDocumentHead(head, contentModuleHead);
365
389
  }
366
390
  }
367
391
  }
368
- return headProps.head;
392
+ if (fns.length) {
393
+ const headProps = {
394
+ head,
395
+ withLocale: (fn) => core.withLocale(locale, fn),
396
+ resolveValue: getData,
397
+ ...routeLocation
398
+ };
399
+ core.withLocale(locale, () => {
400
+ for (const fn of fns) {
401
+ resolveDocumentHead(head, fn(headProps));
402
+ }
403
+ });
404
+ }
405
+ return head;
369
406
  };
370
407
  const resolveDocumentHead = (resolvedHead, updatedHead) => {
371
408
  if (typeof updatedHead.title === "string") {
@@ -391,13 +428,23 @@ const mergeArray = (existingArr, newArr) => {
391
428
  }
392
429
  }
393
430
  };
394
- const createDocumentHead = () => ({
395
- title: "",
396
- meta: [],
397
- links: [],
398
- styles: [],
399
- scripts: [],
400
- frontmatter: {}
431
+ const createDocumentHead = (defaults) => ({
432
+ title: defaults?.title || "",
433
+ meta: [
434
+ ...defaults?.meta || []
435
+ ],
436
+ links: [
437
+ ...defaults?.links || []
438
+ ],
439
+ styles: [
440
+ ...defaults?.styles || []
441
+ ],
442
+ scripts: [
443
+ ...defaults?.scripts || []
444
+ ],
445
+ frontmatter: {
446
+ ...defaults?.frontmatter
447
+ }
401
448
  });
402
449
  function matchRoute(route, path) {
403
450
  const routeIdx = startIdxSkipSlash(route);
@@ -407,6 +454,9 @@ function matchRoute(route, path) {
407
454
  return matchRoutePart(route, routeIdx, routeLength, path, pathIdx, pathLength);
408
455
  }
409
456
  function matchRoutePart(route, routeIdx, routeLength, path, pathIdx, pathLength) {
457
+ if (path.startsWith("/build/")) {
458
+ return null;
459
+ }
410
460
  let params = null;
411
461
  while (routeIdx < routeLength) {
412
462
  const routeCh = route.charCodeAt(routeIdx++);
@@ -508,26 +558,52 @@ function lastIndexOf(text, start, match, searchIdx, notFoundIdx) {
508
558
  }
509
559
  return idx > start ? idx : notFoundIdx;
510
560
  }
511
- const loadRoute = async (routes, menus, cacheModules, pathname) => {
561
+ var RouteDataProp = /* @__PURE__ */ (function(RouteDataProp2) {
562
+ RouteDataProp2[RouteDataProp2["RouteName"] = 0] = "RouteName";
563
+ RouteDataProp2[RouteDataProp2["Loaders"] = 1] = "Loaders";
564
+ RouteDataProp2[RouteDataProp2["OriginalPathname"] = 2] = "OriginalPathname";
565
+ RouteDataProp2[RouteDataProp2["RouteBundleNames"] = 3] = "RouteBundleNames";
566
+ return RouteDataProp2;
567
+ })({});
568
+ var MenuDataProp = /* @__PURE__ */ (function(MenuDataProp2) {
569
+ MenuDataProp2[MenuDataProp2["Pathname"] = 0] = "Pathname";
570
+ MenuDataProp2[MenuDataProp2["MenuLoader"] = 1] = "MenuLoader";
571
+ return MenuDataProp2;
572
+ })({});
573
+ const deepFreeze = (obj) => {
574
+ if (obj == null) {
575
+ return obj;
576
+ }
577
+ Object.getOwnPropertyNames(obj).forEach((prop) => {
578
+ const value = obj[prop];
579
+ if (value && typeof value === "object" && !Object.isFrozen(value)) {
580
+ deepFreeze(value);
581
+ }
582
+ });
583
+ return Object.freeze(obj);
584
+ };
585
+ const loadRoute = async (routes, menus, cacheModules, pathname, isInternal) => {
512
586
  if (!Array.isArray(routes)) {
513
587
  return null;
514
588
  }
515
589
  for (const routeData of routes) {
516
- const routeName = routeData[0];
590
+ const routeName = routeData[RouteDataProp.RouteName];
517
591
  const params = matchRoute(routeName, pathname);
518
592
  if (!params) {
519
593
  continue;
520
594
  }
521
- const loaders = routeData[1];
522
- const routeBundleNames = routeData[3];
595
+ const loaders = routeData[RouteDataProp.Loaders];
596
+ const routeBundleNames = routeData[RouteDataProp.RouteBundleNames];
523
597
  const modules = new Array(loaders.length);
524
598
  const pendingLoads = [];
525
599
  loaders.forEach((moduleLoader, i) => {
526
600
  loadModule(moduleLoader, pendingLoads, (routeModule) => modules[i] = routeModule, cacheModules);
527
601
  });
528
- const menuLoader = getMenuLoader(menus, pathname);
529
602
  let menu = void 0;
530
- loadModule(menuLoader, pendingLoads, (menuModule) => menu = menuModule?.default, cacheModules);
603
+ {
604
+ const menuLoader = getMenuLoader(menus, pathname);
605
+ loadModule(menuLoader, pendingLoads, (menuModule) => menu = menuModule?.default, cacheModules);
606
+ }
531
607
  if (pendingLoads.length > 0) {
532
608
  await Promise.all(pendingLoads);
533
609
  }
@@ -564,9 +640,9 @@ const loadModule = (moduleLoader, pendingLoads, moduleSetter, cacheModules) => {
564
640
  const getMenuLoader = (menus, pathname) => {
565
641
  if (menus) {
566
642
  pathname = pathname.endsWith("/") ? pathname : pathname + "/";
567
- const menu = menus.find((m) => m[0] === pathname || pathname.startsWith(m[0] + (pathname.endsWith("/") ? "" : "/")));
643
+ const menu = menus.find((m) => m[MenuDataProp.Pathname] === pathname || pathname.startsWith(m[MenuDataProp.Pathname]));
568
644
  if (menu) {
569
- return menu[1];
645
+ return menu[MenuDataProp.MenuLoader];
570
646
  }
571
647
  }
572
648
  };
@@ -758,8 +834,8 @@ const spaInit = core.event$((_, el) => {
758
834
  };
759
835
  win[scrollEnabled] = true;
760
836
  setTimeout(() => {
761
- addEventListener("popstate", win[initPopstate]);
762
- addEventListener("scroll", win[initScroll], {
837
+ win.addEventListener("popstate", win[initPopstate]);
838
+ win.addEventListener("scroll", win[initScroll], {
763
839
  passive: true
764
840
  });
765
841
  document.body.addEventListener("click", win[initAnchors]);
@@ -791,25 +867,15 @@ const startViewTransition = (params) => {
791
867
  params.update?.();
792
868
  }
793
869
  };
870
+ const transitionCss = "@layer qwik {\n @supports selector(html:active-view-transition-type(type)) {\n html:active-view-transition-type(qwik-navigation) {\n :root {\n view-transition-name: none;\n }\n }\n }\n @supports not selector(html:active-view-transition-type(type)) {\n :root {\n view-transition-name: none;\n }\n }\n}\n";
794
871
  const QWIK_CITY_SCROLLER = "_qCityScroller";
795
872
  const QWIK_ROUTER_SCROLLER = "_qRouterScroller";
796
873
  const preventNav = {};
797
874
  const internalState = {
798
875
  navCount: 0
799
876
  };
800
- const QwikRouterProvider = core.component$((props) => {
801
- core.useStyles$(`
802
- @layer qwik {
803
- @supports selector(html:active-view-transition-type(type)) {
804
- html:active-view-transition-type(qwik-router-spa) {
805
- :root{view-transition-name:none}
806
- }
807
- }
808
- @supports not selector(html:active-view-transition-type(type)) {
809
- :root{view-transition-name:none}
810
- }
811
- }
812
- `);
877
+ const useQwikRouter = (props) => {
878
+ core.useStyles$(transitionCss);
813
879
  const env = useQwikRouterEnv();
814
880
  if (!env?.params) {
815
881
  throw new Error(`Missing Qwik Router Env Data for help visit https://github.com/QwikDev/qwik/issues/6237`);
@@ -818,24 +884,40 @@ const QwikRouterProvider = core.component$((props) => {
818
884
  if (!urlEnv) {
819
885
  throw new Error(`Missing Qwik URL Env Data`);
820
886
  }
887
+ const serverHead = core.useServerData("documentHead");
821
888
  if (core.isServer) {
822
889
  if (env.ev.originalUrl.pathname !== env.ev.url.pathname && !__EXPERIMENTAL__.enableRequestRewrite) {
823
890
  throw new Error(`enableRequestRewrite is an experimental feature and is not enabled. Please enable the feature flag by adding \`experimental: ["enableRequestRewrite"]\` to your qwikVite plugin options.`);
824
891
  }
825
892
  }
826
893
  const url = new URL(urlEnv);
827
- const routeLocation = core.useStore({
894
+ const routeLocationTarget = {
828
895
  url,
829
896
  params: env.params,
830
897
  isNavigating: false,
831
898
  prevUrl: void 0
832
- }, {
899
+ };
900
+ const routeLocation = core.useStore(routeLocationTarget, {
833
901
  deep: false
834
902
  });
835
903
  const navResolver = {};
836
- const loaderState = internal._weakSerialize(core.useStore(env.response.loaders, {
837
- deep: false
838
- }));
904
+ const container = internal._getContextContainer();
905
+ const getSerializationStrategy = (loaderId) => {
906
+ return env.response.loadersSerializationStrategy.get(loaderId) || DEFAULT_LOADERS_SERIALIZATION_STRATEGY;
907
+ };
908
+ const loadersObject = {};
909
+ const loaderState = {};
910
+ for (const [key, value] of Object.entries(env.response.loaders)) {
911
+ loadersObject[key] = value;
912
+ loaderState[key] = createLoaderSignal(loadersObject, key, url, getSerializationStrategy(key), container);
913
+ }
914
+ loadersObject[internal.SerializerSymbol] = (obj) => {
915
+ const loadersSerializationObject = {};
916
+ for (const [k, v] of Object.entries(obj)) {
917
+ loadersSerializationObject[k] = getSerializationStrategy(k) === "always" ? v : internal._UNINITIALIZED;
918
+ }
919
+ return loadersSerializationObject;
920
+ };
839
921
  const routeInternal = core.useSignal({
840
922
  type: "initial",
841
923
  dest: url,
@@ -843,7 +925,7 @@ const QwikRouterProvider = core.component$((props) => {
843
925
  replaceState: false,
844
926
  scroll: true
845
927
  });
846
- const documentHead = core.useStore(createDocumentHead);
928
+ const documentHead = core.useStore(() => createDocumentHead(serverHead));
847
929
  const content = core.useStore({
848
930
  headings: void 0,
849
931
  menu: void 0
@@ -928,7 +1010,7 @@ const QwikRouterProvider = core.component$((props) => {
928
1010
  let scroller = document.getElementById(QWIK_ROUTER_SCROLLER);
929
1011
  if (!scroller) {
930
1012
  scroller = document.getElementById(QWIK_CITY_SCROLLER);
931
- if (scroller) {
1013
+ if (scroller && core.isDev) {
932
1014
  console.warn(`Please update your scroller ID to "${QWIK_ROUTER_SCROLLER}" as "${QWIK_CITY_SCROLLER}" is deprecated and will be removed in V3`);
933
1015
  }
934
1016
  }
@@ -989,10 +1071,10 @@ const QwikRouterProvider = core.component$((props) => {
989
1071
  } else {
990
1072
  trackUrl = new URL(navigation.dest, location);
991
1073
  if (trackUrl.pathname.endsWith("/")) {
992
- if (!qwikRouterConfig__namespace.trailingSlash) {
1074
+ if (globalThis.__NO_TRAILING_SLASH__) {
993
1075
  trackUrl.pathname = trackUrl.pathname.slice(0, -1);
994
1076
  }
995
- } else if (qwikRouterConfig__namespace.trailingSlash) {
1077
+ } else if (!globalThis.__NO_TRAILING_SLASH__) {
996
1078
  trackUrl.pathname += "/";
997
1079
  }
998
1080
  let loadRoutePromise = loadRoute(qwikRouterConfig__namespace.routes, qwikRouterConfig__namespace.menus, qwikRouterConfig__namespace.cacheModules, trackUrl.pathname);
@@ -1034,25 +1116,38 @@ const QwikRouterProvider = core.component$((props) => {
1034
1116
  const [routeName, params, mods, menu] = loadedRoute;
1035
1117
  const contentModules = mods;
1036
1118
  const pageModule = contentModules[contentModules.length - 1];
1037
- const isRedirect = navType === "form" && !isSamePath(trackUrl, prevUrl);
1038
- if (navigation.dest.search && !isRedirect) {
1119
+ if (navigation.dest.search && !!isSamePath(trackUrl, prevUrl)) {
1039
1120
  trackUrl.search = navigation.dest.search;
1040
1121
  }
1122
+ let shouldForcePrevUrl = false;
1123
+ let shouldForceUrl = false;
1124
+ let shouldForceParams = false;
1041
1125
  if (!isSamePath(trackUrl, prevUrl)) {
1042
- routeLocation.prevUrl = prevUrl;
1126
+ if (internal._hasStoreEffects(routeLocation, "prevUrl")) {
1127
+ shouldForcePrevUrl = true;
1128
+ }
1129
+ routeLocationTarget.prevUrl = prevUrl;
1130
+ }
1131
+ if (routeLocationTarget.url !== trackUrl) {
1132
+ if (internal._hasStoreEffects(routeLocation, "url")) {
1133
+ shouldForceUrl = true;
1134
+ }
1135
+ routeLocationTarget.url = trackUrl;
1136
+ }
1137
+ if (routeLocationTarget.params !== params) {
1138
+ if (internal._hasStoreEffects(routeLocation, "params")) {
1139
+ shouldForceParams = true;
1140
+ }
1141
+ routeLocationTarget.params = params;
1043
1142
  }
1044
- routeLocation.url = trackUrl;
1045
- routeLocation.params = {
1046
- ...params
1047
- };
1048
1143
  routeInternal.untrackedValue = {
1049
1144
  type: navType,
1050
1145
  dest: trackUrl
1051
1146
  };
1052
- const resolvedHead = resolveHead(clientPageData, routeLocation, contentModules, locale);
1147
+ const resolvedHead = resolveHead(clientPageData, routeLocation, contentModules, locale, serverHead);
1053
1148
  content.headings = pageModule.headings;
1054
1149
  content.menu = menu;
1055
- contentInternal.value = core.noSerialize(contentModules);
1150
+ contentInternal.untrackedValue = core.noSerialize(contentModules);
1056
1151
  documentHead.links = resolvedHead.links;
1057
1152
  documentHead.meta = resolvedHead.meta;
1058
1153
  documentHead.styles = resolvedHead.styles;
@@ -1065,15 +1160,25 @@ const QwikRouterProvider = core.component$((props) => {
1065
1160
  scrollState = getScrollHistory();
1066
1161
  }
1067
1162
  const scroller = document.getElementById(QWIK_ROUTER_SCROLLER) ?? document.documentElement;
1068
- if (navigation.scroll && (!navigation.forceReload || !isSamePath(trackUrl, prevUrl)) && (navType === "link" || navType === "popstate") || isRedirect) {
1163
+ if (navigation.scroll && (!navigation.forceReload || !isSamePath(trackUrl, prevUrl)) && (navType === "link" || navType === "popstate") || navType === "form" && !isSamePath(trackUrl, prevUrl)) {
1069
1164
  document.__q_scroll_restore__ = () => restoreScroll(navType, trackUrl, prevUrl, scroller, scrollState);
1070
1165
  }
1071
1166
  const loaders = clientPageData?.loaders;
1072
- const win = window;
1073
1167
  if (loaders) {
1074
- Object.assign(loaderState, loaders);
1168
+ const container2 = internal._getContextContainer();
1169
+ for (const [key, value] of Object.entries(loaders)) {
1170
+ const signal = loaderState[key];
1171
+ const awaitedValue = await value;
1172
+ loadersObject[key] = awaitedValue;
1173
+ if (!signal) {
1174
+ loaderState[key] = createLoaderSignal(loadersObject, key, trackUrl, DEFAULT_LOADERS_SERIALIZATION_STRATEGY, container2);
1175
+ } else {
1176
+ signal.invalidate();
1177
+ }
1178
+ }
1075
1179
  }
1076
1180
  CLIENT_DATA_CACHE.clear();
1181
+ const win = window;
1077
1182
  if (!win._qRouterSPA) {
1078
1183
  win._qRouterSPA = true;
1079
1184
  history.scrollRestoration = "manual";
@@ -1184,10 +1289,11 @@ const QwikRouterProvider = core.component$((props) => {
1184
1289
  }
1185
1290
  const navigate = () => {
1186
1291
  clientNavigate(window, navType, prevUrl, trackUrl, replaceState);
1292
+ contentInternal.force();
1187
1293
  return internal._waitUntilRendered(elm);
1188
1294
  };
1189
1295
  const _waitNextPage = () => {
1190
- if (core.isServer || props.viewTransition === false) {
1296
+ if (core.isServer || props?.viewTransition === false) {
1191
1297
  return navigate();
1192
1298
  } else {
1193
1299
  const viewTransition = startViewTransition({
@@ -1203,14 +1309,23 @@ const QwikRouterProvider = core.component$((props) => {
1203
1309
  }
1204
1310
  };
1205
1311
  _waitNextPage().then(() => {
1206
- const container = internal._getQContainerElement(elm);
1207
- container.setAttribute("q:route", routeName);
1312
+ const container2 = internal._getQContainerElement(elm);
1313
+ container2.setAttribute(Q_ROUTE, routeName);
1208
1314
  const scrollState2 = currentScrollState(scroller);
1209
1315
  saveScrollHistory(scrollState2);
1210
1316
  win._qRouterScrollEnabled = true;
1211
1317
  if (core.isBrowser) {
1212
1318
  callRestoreScrollOnDocument();
1213
1319
  }
1320
+ if (shouldForcePrevUrl) {
1321
+ internal.forceStoreEffects(routeLocation, "prevUrl");
1322
+ }
1323
+ if (shouldForceUrl) {
1324
+ internal.forceStoreEffects(routeLocation, "url");
1325
+ }
1326
+ if (shouldForceParams) {
1327
+ internal.forceStoreEffects(routeLocation, "params");
1328
+ }
1214
1329
  routeLocation.isNavigating = false;
1215
1330
  navResolver.r?.();
1216
1331
  });
@@ -1223,10 +1338,13 @@ const QwikRouterProvider = core.component$((props) => {
1223
1338
  run();
1224
1339
  }
1225
1340
  });
1341
+ };
1342
+ const QwikRouterProvider = core.component$((props) => {
1343
+ useQwikRouter(props);
1226
1344
  return /* @__PURE__ */ jsxRuntime.jsx(core.Slot, {});
1227
1345
  });
1228
1346
  const QwikCityProvider = QwikRouterProvider;
1229
- const QwikRouterMockProvider = core.component$((props) => {
1347
+ const useQwikMockRouter = (props) => {
1230
1348
  const urlEnv = props.url ?? "http://localhost/";
1231
1349
  const url = new URL(urlEnv);
1232
1350
  const routeLocation = core.useStore({
@@ -1237,7 +1355,7 @@ const QwikRouterMockProvider = core.component$((props) => {
1237
1355
  }, {
1238
1356
  deep: false
1239
1357
  });
1240
- const loaderState = core.useSignal({});
1358
+ const loaderState = {};
1241
1359
  const routeInternal = core.useSignal({
1242
1360
  type: "initial",
1243
1361
  dest: url
@@ -1264,6 +1382,9 @@ const QwikRouterMockProvider = core.component$((props) => {
1264
1382
  core.useContextProvider(RouteStateContext, loaderState);
1265
1383
  core.useContextProvider(RouteActionContext, actionState);
1266
1384
  core.useContextProvider(RouteInternalContext, routeInternal);
1385
+ };
1386
+ const QwikRouterMockProvider = core.component$((props) => {
1387
+ useQwikMockRouter(props);
1267
1388
  return /* @__PURE__ */ jsxRuntime.jsx(core.Slot, {});
1268
1389
  });
1269
1390
  const QwikCityMockProvider = QwikRouterMockProvider;
@@ -1272,13 +1393,14 @@ const RouterOutlet = core.component$(() => {
1272
1393
  if (!serverData) {
1273
1394
  throw new Error("PrefetchServiceWorker component must be rendered on the server.");
1274
1395
  }
1275
- const { value } = core.useContext(ContentInternalContext);
1276
- if (value && value.length > 0) {
1277
- const contentsLen = value.length;
1396
+ const internalContext = core.useContext(ContentInternalContext);
1397
+ const contents = internalContext.value;
1398
+ if (contents && contents.length > 0) {
1399
+ const contentsLen = contents.length;
1278
1400
  let cmp = null;
1279
1401
  for (let i = contentsLen - 1; i >= 0; i--) {
1280
- if (value[i].default) {
1281
- cmp = core.jsx(value[i].default, {
1402
+ if (contents[i].default) {
1403
+ cmp = core.jsx(contents[i].default, {
1282
1404
  children: cmp
1283
1405
  });
1284
1406
  }
@@ -1307,6 +1429,7 @@ const RouterOutlet = core.component$(() => {
1307
1429
  return core.SkipRender;
1308
1430
  });
1309
1431
  var store;
1432
+ // @__NO_SIDE_EFFECTS__
1310
1433
  function getGlobalConfig(config2) {
1311
1434
  return {
1312
1435
  lang: config2?.lang ?? store?.lang,
@@ -1315,6 +1438,7 @@ function getGlobalConfig(config2) {
1315
1438
  abortPipeEarly: config2?.abortPipeEarly ?? store?.abortPipeEarly
1316
1439
  };
1317
1440
  }
1441
+ // @__NO_SIDE_EFFECTS__
1318
1442
  function getDotPath(issue) {
1319
1443
  if (issue.path) {
1320
1444
  let key = "";
@@ -1333,11 +1457,12 @@ function getDotPath(issue) {
1333
1457
  }
1334
1458
  return null;
1335
1459
  }
1460
+ // @__NO_SIDE_EFFECTS__
1336
1461
  function flatten(issues) {
1337
1462
  const flatErrors = {};
1338
1463
  for (const issue of issues) {
1339
1464
  if (issue.path) {
1340
- const dotPath = getDotPath(issue);
1465
+ const dotPath = /* @__PURE__ */ getDotPath(issue);
1341
1466
  if (dotPath) {
1342
1467
  if (!flatErrors.nested) {
1343
1468
  flatErrors.nested = {};
@@ -1364,10 +1489,11 @@ function flatten(issues) {
1364
1489
  }
1365
1490
  return flatErrors;
1366
1491
  }
1492
+ // @__NO_SIDE_EFFECTS__
1367
1493
  async function safeParseAsync(schema, input, config2) {
1368
- const dataset = await schema._run(
1369
- { typed: false, value: input },
1370
- getGlobalConfig(config2)
1494
+ const dataset = await schema["~run"](
1495
+ { value: input },
1496
+ /* @__PURE__ */ getGlobalConfig(config2)
1371
1497
  );
1372
1498
  return {
1373
1499
  typed: dataset.typed,
@@ -1482,24 +1608,25 @@ const globalActionQrl = (actionQrl, ...rest) => {
1482
1608
  const routeAction$ = /* @__PURE__ */ core.implicit$FirstArg(routeActionQrl);
1483
1609
  const globalAction$ = /* @__PURE__ */ core.implicit$FirstArg(globalActionQrl);
1484
1610
  const routeLoaderQrl = (loaderQrl, ...rest) => {
1485
- const { id, validators } = getValidators(rest, loaderQrl);
1611
+ const { id, validators, serializationStrategy } = getValidators(rest, loaderQrl);
1486
1612
  function loader() {
1487
- return core.useContext(RouteStateContext, (state) => {
1488
- if (!(id in state)) {
1489
- throw new Error(`routeLoader$ "${loaderQrl.getSymbol()}" was invoked in a route where it was not declared.
1613
+ const state = internal._resolveContextWithoutSequentialScope(RouteStateContext);
1614
+ if (!(id in state)) {
1615
+ throw new Error(`routeLoader$ "${loaderQrl.getSymbol()}" was invoked in a route where it was not declared.
1490
1616
  This is because the routeLoader$ was not exported in a 'layout.tsx' or 'index.tsx' file of the existing route.
1491
1617
  For more information check: https://qwik.dev/docs/route-loader/
1492
1618
 
1493
1619
  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.
1494
1620
  For more information check: https://qwik.dev/docs/re-exporting-loaders/`);
1495
- }
1496
- return internal._wrapStore(state, id);
1497
- });
1621
+ }
1622
+ core.untrack(() => state[id].value);
1623
+ return state[id];
1498
1624
  }
1499
1625
  loader.__brand = "server_loader";
1500
1626
  loader.__qrl = loaderQrl;
1501
1627
  loader.__validators = validators;
1502
1628
  loader.__id = id;
1629
+ loader.__serializationStrategy = serializationStrategy;
1503
1630
  Object.freeze(loader);
1504
1631
  return loader;
1505
1632
  };
@@ -1542,7 +1669,7 @@ const valibotQrl = (qrl) => {
1542
1669
  async validate(ev, inputData) {
1543
1670
  const schema = await qrl.resolve().then((obj) => typeof obj === "function" ? obj(ev) : obj);
1544
1671
  const data = inputData ?? await ev.parseBody();
1545
- const result = await safeParseAsync(schema, data);
1672
+ const result = await /* @__PURE__ */ safeParseAsync(schema, data);
1546
1673
  if (result.success) {
1547
1674
  return {
1548
1675
  success: true,
@@ -1556,7 +1683,7 @@ const valibotQrl = (qrl) => {
1556
1683
  success: false,
1557
1684
  status: 400,
1558
1685
  error: {
1559
- formErrors: flatten(result.issues).root ?? [],
1686
+ formErrors: (/* @__PURE__ */ flatten(result.issues)).root ?? [],
1560
1687
  fieldErrors: flattenValibotIssues(result.issues)
1561
1688
  }
1562
1689
  };
@@ -1604,7 +1731,7 @@ const zodQrl = (qrl) => {
1604
1731
  }
1605
1732
  });
1606
1733
  const data = inputData ?? await ev.parseBody();
1607
- const result = await schema.safeParseAsync(data);
1734
+ const result = await core.withLocale(ev.locale(), () => schema.safeParseAsync(data));
1608
1735
  if (result.success) {
1609
1736
  return result;
1610
1737
  } else {
@@ -1689,7 +1816,7 @@ const serverQrl = (qrl, options) => {
1689
1816
  const res = await fetch(`${origin}?${QFN_KEY}=${qrlHash}${query}`, config);
1690
1817
  const contentType = res.headers.get("Content-Type");
1691
1818
  if (res.ok && contentType === "text/qwik-json-stream" && res.body) {
1692
- return async function* () {
1819
+ return (async function* () {
1693
1820
  try {
1694
1821
  for await (const result of deserializeStream(res.body, ctxElm ?? document.documentElement, abortSignal)) {
1695
1822
  yield result;
@@ -1699,7 +1826,7 @@ const serverQrl = (qrl, options) => {
1699
1826
  await res.body.cancel();
1700
1827
  }
1701
1828
  }
1702
- }();
1829
+ })();
1703
1830
  } else if (contentType === "application/qwik-json") {
1704
1831
  const str = await res.text();
1705
1832
  const [obj] = internal._deserialize(str, ctxElm ?? document.documentElement);
@@ -1728,6 +1855,7 @@ const serverQrl = (qrl, options) => {
1728
1855
  const server$ = /* @__PURE__ */ core.implicit$FirstArg(serverQrl);
1729
1856
  const getValidators = (rest, qrl) => {
1730
1857
  let id;
1858
+ let serializationStrategy = DEFAULT_LOADERS_SERIALIZATION_STRATEGY;
1731
1859
  const validators = [];
1732
1860
  if (rest.length === 1) {
1733
1861
  const options = rest[0];
@@ -1736,6 +1864,9 @@ const getValidators = (rest, qrl) => {
1736
1864
  validators.push(options);
1737
1865
  } else {
1738
1866
  id = options.id;
1867
+ if (options.serializationStrategy) {
1868
+ serializationStrategy = options.serializationStrategy;
1869
+ }
1739
1870
  if (options.validation) {
1740
1871
  validators.push(...options.validation);
1741
1872
  }
@@ -1756,7 +1887,8 @@ const getValidators = (rest, qrl) => {
1756
1887
  }
1757
1888
  return {
1758
1889
  validators: validators.reverse(),
1759
- id
1890
+ id,
1891
+ serializationStrategy
1760
1892
  };
1761
1893
  };
1762
1894
  const deserializeStream = async function* (stream, ctxElm, abortSignal) {
@@ -1908,10 +2040,55 @@ function omitProps(obj, keys) {
1908
2040
  }
1909
2041
  return omittedObj;
1910
2042
  }
2043
+ const createRenderer = (getOptions) => {
2044
+ return (opts) => {
2045
+ const { jsx, options } = getOptions(opts);
2046
+ return server.renderToStream(jsx, options);
2047
+ };
2048
+ };
2049
+ const DocumentHeadTags = core.component$((props) => {
2050
+ let head = useDocumentHead();
2051
+ if (props) {
2052
+ head = {
2053
+ ...head,
2054
+ ...props
2055
+ };
2056
+ }
2057
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, {
2058
+ children: [
2059
+ head.title && /* @__PURE__ */ jsxRuntime.jsx("title", {
2060
+ children: head.title
2061
+ }),
2062
+ head.meta.map((m) => /* @__PURE__ */ jsxRuntime.jsx("meta", {
2063
+ ...m
2064
+ })),
2065
+ head.links.map((l) => /* @__PURE__ */ jsxRuntime.jsx("link", {
2066
+ ...l
2067
+ })),
2068
+ head.styles.map((s) => {
2069
+ const props2 = s.props || s;
2070
+ return /* @__PURE__ */ core.createElement("style", {
2071
+ ...props2,
2072
+ dangerouslySetInnerHTML: s.style || props2.dangerouslySetInnerHTML,
2073
+ key: s.key
2074
+ });
2075
+ }),
2076
+ head.scripts.map((s) => {
2077
+ const props2 = s.props || s;
2078
+ return /* @__PURE__ */ core.createElement("script", {
2079
+ ...props2,
2080
+ dangerouslySetInnerHTML: s.script || props2.dangerouslySetInnerHTML,
2081
+ key: s.key
2082
+ });
2083
+ })
2084
+ ]
2085
+ });
2086
+ });
1911
2087
  Object.defineProperty(exports, "z", {
1912
2088
  enumerable: true,
1913
2089
  get: () => zod.z
1914
2090
  });
2091
+ exports.DocumentHeadTags = DocumentHeadTags;
1915
2092
  exports.ErrorBoundary = ErrorBoundary;
1916
2093
  exports.Form = Form;
1917
2094
  exports.Link = Link;
@@ -1923,6 +2100,7 @@ exports.QwikRouterMockProvider = QwikRouterMockProvider;
1923
2100
  exports.QwikRouterProvider = QwikRouterProvider;
1924
2101
  exports.RouterOutlet = RouterOutlet;
1925
2102
  exports.ServiceWorkerRegister = ServiceWorkerRegister;
2103
+ exports.createRenderer = createRenderer;
1926
2104
  exports.globalAction$ = globalAction$;
1927
2105
  exports.globalActionQrl = globalActionQrl;
1928
2106
  exports.omitProps = omitProps;
@@ -1939,6 +2117,7 @@ exports.useLocation = useLocation;
1939
2117
  exports.useNavigate = useNavigate;
1940
2118
  exports.usePreventNavigate$ = usePreventNavigate$;
1941
2119
  exports.usePreventNavigateQrl = usePreventNavigateQrl;
2120
+ exports.useQwikRouter = useQwikRouter;
1942
2121
  exports.valibot$ = valibot$;
1943
2122
  exports.valibotQrl = valibotQrl;
1944
2123
  exports.validator$ = validator$;