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

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 (140) hide show
  1. package/lib/adapters/azure-swa/vite/index.cjs +61 -5
  2. package/lib/adapters/azure-swa/vite/index.mjs +26 -201
  3. package/lib/adapters/bun-server/vite/index.cjs +27 -5
  4. package/lib/adapters/bun-server/vite/index.mjs +14 -196
  5. package/lib/adapters/cloud-run/vite/index.cjs +24 -5
  6. package/lib/adapters/cloud-run/vite/index.mjs +13 -195
  7. package/lib/adapters/cloudflare-pages/vite/index.cjs +65 -1
  8. package/lib/adapters/cloudflare-pages/vite/index.mjs +63 -4
  9. package/lib/adapters/deno-server/vite/index.cjs +39 -5
  10. package/lib/adapters/deno-server/vite/index.mjs +16 -198
  11. package/lib/adapters/netlify-edge/vite/index.cjs +88 -6
  12. package/lib/adapters/netlify-edge/vite/index.mjs +56 -240
  13. package/lib/adapters/node-server/vite/index.cjs +27 -5
  14. package/lib/adapters/node-server/vite/index.mjs +14 -196
  15. package/lib/adapters/shared/vite/index.cjs +303 -2
  16. package/lib/adapters/shared/vite/index.d.ts +4 -4
  17. package/lib/adapters/shared/vite/index.mjs +248 -143
  18. package/lib/adapters/ssg/vite/index.cjs +19 -5
  19. package/lib/adapters/ssg/vite/index.mjs +11 -193
  20. package/lib/adapters/vercel-edge/vite/index.cjs +81 -5
  21. package/lib/adapters/vercel-edge/vite/index.d.ts +1 -1
  22. package/lib/adapters/vercel-edge/vite/index.mjs +48 -229
  23. package/lib/chunks/error-handler.cjs +58 -0
  24. package/lib/chunks/error-handler.mjs +59 -0
  25. package/lib/chunks/format-error.cjs +136 -0
  26. package/lib/chunks/format-error.mjs +137 -0
  27. package/lib/chunks/fs.cjs +274 -0
  28. package/lib/chunks/fs.mjs +275 -0
  29. package/lib/chunks/index.cjs +877 -0
  30. package/lib/chunks/index.mjs +876 -0
  31. package/lib/chunks/mime-types.cjs +52 -0
  32. package/lib/chunks/mime-types.mjs +53 -0
  33. package/lib/chunks/routing.qwik.cjs +452 -0
  34. package/lib/chunks/routing.qwik.mjs +453 -0
  35. package/lib/chunks/types.qwik.cjs +24 -0
  36. package/lib/chunks/types.qwik.mjs +25 -0
  37. package/lib/index.d.ts +9 -3
  38. package/lib/index.qwik.cjs +543 -1001
  39. package/lib/index.qwik.mjs +512 -972
  40. package/lib/middleware/aws-lambda/index.cjs +52 -1
  41. package/lib/middleware/aws-lambda/index.mjs +37 -26
  42. package/lib/middleware/azure-swa/index.cjs +92 -1
  43. package/lib/middleware/azure-swa/index.mjs +64 -46
  44. package/lib/middleware/bun/index.cjs +143 -1
  45. package/lib/middleware/bun/index.mjs +103 -117
  46. package/lib/middleware/cloudflare-pages/index.cjs +96 -1
  47. package/lib/middleware/cloudflare-pages/index.mjs +68 -47
  48. package/lib/middleware/deno/index.cjs +130 -1
  49. package/lib/middleware/deno/index.mjs +93 -112
  50. package/lib/middleware/firebase/index.cjs +33 -1
  51. package/lib/middleware/firebase/index.mjs +25 -16
  52. package/lib/middleware/netlify-edge/index.cjs +71 -1
  53. package/lib/middleware/netlify-edge/index.mjs +52 -36
  54. package/lib/middleware/node/index.cjs +219 -1
  55. package/lib/middleware/node/index.mjs +178 -165
  56. package/lib/middleware/request-handler/index.cjs +1488 -18
  57. package/lib/middleware/request-handler/index.d.ts +20 -2
  58. package/lib/middleware/request-handler/index.mjs +1225 -873
  59. package/lib/middleware/vercel-edge/index.cjs +98 -1
  60. package/lib/middleware/vercel-edge/index.mjs +71 -47
  61. package/lib/service-worker/index.cjs +5 -0
  62. package/lib/service-worker/index.mjs +5 -0
  63. package/lib/ssg/index.cjs +15 -1
  64. package/lib/ssg/index.mjs +12 -19
  65. package/lib/vite/index.cjs +2006 -27
  66. package/lib/vite/index.d.ts +9 -9
  67. package/lib/vite/index.mjs +1597 -1216
  68. package/package.json +9 -8
  69. package/lib/adapters/azure-swa/vite/index-BqUeglYs.cjs +0 -1
  70. package/lib/adapters/azure-swa/vite/index-CBIchDYq.js +0 -651
  71. package/lib/adapters/azure-swa/vite/index-ClHGw5z1.js +0 -6
  72. package/lib/adapters/azure-swa/vite/index-CrwlB95_.js +0 -22
  73. package/lib/adapters/azure-swa/vite/index-DTIOTwZo.cjs +0 -11
  74. package/lib/adapters/azure-swa/vite/index-vQuPcef3.cjs +0 -1
  75. package/lib/adapters/bun-server/vite/index-BqUeglYs.cjs +0 -1
  76. package/lib/adapters/bun-server/vite/index-CBIchDYq.js +0 -651
  77. package/lib/adapters/bun-server/vite/index-ClHGw5z1.js +0 -6
  78. package/lib/adapters/bun-server/vite/index-CrwlB95_.js +0 -22
  79. package/lib/adapters/bun-server/vite/index-DTIOTwZo.cjs +0 -11
  80. package/lib/adapters/bun-server/vite/index-vQuPcef3.cjs +0 -1
  81. package/lib/adapters/cloud-run/vite/index-BqUeglYs.cjs +0 -1
  82. package/lib/adapters/cloud-run/vite/index-CBIchDYq.js +0 -651
  83. package/lib/adapters/cloud-run/vite/index-ClHGw5z1.js +0 -6
  84. package/lib/adapters/cloud-run/vite/index-CrwlB95_.js +0 -22
  85. package/lib/adapters/cloud-run/vite/index-DTIOTwZo.cjs +0 -11
  86. package/lib/adapters/cloud-run/vite/index-vQuPcef3.cjs +0 -1
  87. package/lib/adapters/cloudflare-pages/vite/index-BIeHg2Cj.cjs +0 -5
  88. package/lib/adapters/cloudflare-pages/vite/index-C455V8_A.cjs +0 -1
  89. package/lib/adapters/cloudflare-pages/vite/index-ClHGw5z1.js +0 -6
  90. package/lib/adapters/cloudflare-pages/vite/index-D3HITboM.js +0 -645
  91. package/lib/adapters/cloudflare-pages/vite/index-DKcVHRBy.cjs +0 -11
  92. package/lib/adapters/cloudflare-pages/vite/index-DwovcBp3.js +0 -22
  93. package/lib/adapters/cloudflare-pages/vite/index-bogwy7wh.js +0 -250
  94. package/lib/adapters/cloudflare-pages/vite/index-vQuPcef3.cjs +0 -1
  95. package/lib/adapters/deno-server/vite/index-BqUeglYs.cjs +0 -1
  96. package/lib/adapters/deno-server/vite/index-CBIchDYq.js +0 -651
  97. package/lib/adapters/deno-server/vite/index-ClHGw5z1.js +0 -6
  98. package/lib/adapters/deno-server/vite/index-CrwlB95_.js +0 -22
  99. package/lib/adapters/deno-server/vite/index-DTIOTwZo.cjs +0 -11
  100. package/lib/adapters/deno-server/vite/index-vQuPcef3.cjs +0 -1
  101. package/lib/adapters/netlify-edge/vite/index-BqUeglYs.cjs +0 -1
  102. package/lib/adapters/netlify-edge/vite/index-CBIchDYq.js +0 -651
  103. package/lib/adapters/netlify-edge/vite/index-ClHGw5z1.js +0 -6
  104. package/lib/adapters/netlify-edge/vite/index-CrwlB95_.js +0 -22
  105. package/lib/adapters/netlify-edge/vite/index-DTIOTwZo.cjs +0 -11
  106. package/lib/adapters/netlify-edge/vite/index-vQuPcef3.cjs +0 -1
  107. package/lib/adapters/node-server/vite/index-BqUeglYs.cjs +0 -1
  108. package/lib/adapters/node-server/vite/index-CBIchDYq.js +0 -651
  109. package/lib/adapters/node-server/vite/index-ClHGw5z1.js +0 -6
  110. package/lib/adapters/node-server/vite/index-CrwlB95_.js +0 -22
  111. package/lib/adapters/node-server/vite/index-DTIOTwZo.cjs +0 -11
  112. package/lib/adapters/node-server/vite/index-vQuPcef3.cjs +0 -1
  113. package/lib/adapters/shared/vite/index-BqUeglYs.cjs +0 -1
  114. package/lib/adapters/shared/vite/index-CBIchDYq.js +0 -651
  115. package/lib/adapters/shared/vite/index-ClHGw5z1.js +0 -6
  116. package/lib/adapters/shared/vite/index-CrwlB95_.js +0 -22
  117. package/lib/adapters/shared/vite/index-DTIOTwZo.cjs +0 -11
  118. package/lib/adapters/shared/vite/index-vQuPcef3.cjs +0 -1
  119. package/lib/adapters/ssg/vite/index-BqUeglYs.cjs +0 -1
  120. package/lib/adapters/ssg/vite/index-CBIchDYq.js +0 -651
  121. package/lib/adapters/ssg/vite/index-ClHGw5z1.js +0 -6
  122. package/lib/adapters/ssg/vite/index-CrwlB95_.js +0 -22
  123. package/lib/adapters/ssg/vite/index-DTIOTwZo.cjs +0 -11
  124. package/lib/adapters/ssg/vite/index-vQuPcef3.cjs +0 -1
  125. package/lib/adapters/vercel-edge/vite/index-BqUeglYs.cjs +0 -1
  126. package/lib/adapters/vercel-edge/vite/index-CBIchDYq.js +0 -651
  127. package/lib/adapters/vercel-edge/vite/index-ClHGw5z1.js +0 -6
  128. package/lib/adapters/vercel-edge/vite/index-CrwlB95_.js +0 -22
  129. package/lib/adapters/vercel-edge/vite/index-DTIOTwZo.cjs +0 -11
  130. package/lib/adapters/vercel-edge/vite/index-vQuPcef3.cjs +0 -1
  131. package/lib/service-worker.cjs +0 -1
  132. package/lib/service-worker.mjs +0 -5
  133. package/lib/ssg/deno.cjs +0 -1
  134. package/lib/ssg/deno.mjs +0 -6
  135. package/lib/ssg/index-CBIchDYq.js +0 -651
  136. package/lib/ssg/index-ClHGw5z1.js +0 -6
  137. package/lib/ssg/index-DTIOTwZo.cjs +0 -11
  138. package/lib/ssg/index-vQuPcef3.cjs +0 -1
  139. package/lib/ssg/node.cjs +0 -11
  140. package/lib/ssg/node.mjs +0 -651
@@ -0,0 +1,453 @@
1
+ import { createAsyncComputed$, isBrowser } from "@qwik.dev/core";
2
+ import { p } from "@qwik.dev/core/preloader";
3
+ import { _deserialize, _UNINITIALIZED } from "@qwik.dev/core/internal";
4
+ import { R as RouteDataProp, M as MenuDataProp } from "./types.qwik.mjs";
5
+ const MODULE_CACHE = /* @__PURE__ */ new WeakMap();
6
+ const CLIENT_DATA_CACHE = /* @__PURE__ */ new Map();
7
+ const QACTION_KEY = "qaction";
8
+ const QLOADER_KEY = "qloaders";
9
+ const QFN_KEY = "qfunc";
10
+ const QDATA_KEY = "qdata";
11
+ const Q_ROUTE = "q:route";
12
+ const DEFAULT_LOADERS_SERIALIZATION_STRATEGY = globalThis.__DEFAULT_LOADERS_SERIALIZATION_STRATEGY__ || "never";
13
+ const MAX_Q_DATA_RETRY_COUNT = 3;
14
+ const loadClientData = async (url, element, opts, retryCount = 0) => {
15
+ const pagePathname = url.pathname;
16
+ const pageSearch = url.search;
17
+ const clientDataPath = getClientDataPath(pagePathname, pageSearch, {
18
+ actionId: opts?.action?.id,
19
+ loaderIds: opts?.loaderIds
20
+ });
21
+ let qData;
22
+ if (!opts?.action) {
23
+ qData = CLIENT_DATA_CACHE.get(clientDataPath);
24
+ }
25
+ if (opts?.preloadRouteBundles !== false) {
26
+ preloadRouteBundles(pagePathname, 0.8);
27
+ }
28
+ let resolveFn;
29
+ if (!qData) {
30
+ const fetchOptions = getFetchOptions(opts?.action, opts?.clearCache);
31
+ if (opts?.action) {
32
+ opts.action.data = void 0;
33
+ }
34
+ qData = fetch(clientDataPath, fetchOptions).then((rsp) => {
35
+ if (rsp.status === 404 && opts?.loaderIds && retryCount < MAX_Q_DATA_RETRY_COUNT) {
36
+ opts.loaderIds = void 0;
37
+ return loadClientData(url, element, opts, retryCount + 1);
38
+ }
39
+ if (rsp.redirected) {
40
+ const redirectedURL = new URL(rsp.url);
41
+ const isQData = redirectedURL.pathname.endsWith("/q-data.json");
42
+ if (!isQData || redirectedURL.origin !== location.origin) {
43
+ if (!opts?.isPrefetch) {
44
+ location.href = redirectedURL.href;
45
+ }
46
+ return;
47
+ }
48
+ }
49
+ if ((rsp.headers.get("content-type") || "").includes("json")) {
50
+ return rsp.text().then((text) => {
51
+ const [clientData] = _deserialize(text, element);
52
+ if (!clientData) {
53
+ location.href = url.href;
54
+ return;
55
+ }
56
+ if (opts?.clearCache) {
57
+ CLIENT_DATA_CACHE.delete(clientDataPath);
58
+ }
59
+ if (clientData.redirect) {
60
+ location.href = clientData.redirect;
61
+ } else if (opts?.action) {
62
+ const { action } = opts;
63
+ const actionData = clientData.loaders[action.id];
64
+ resolveFn = () => {
65
+ action.resolve({ status: rsp.status, result: actionData });
66
+ };
67
+ }
68
+ return clientData;
69
+ });
70
+ } else {
71
+ if (opts?.isPrefetch !== true) {
72
+ location.href = url.href;
73
+ }
74
+ return void 0;
75
+ }
76
+ });
77
+ if (!opts?.action) {
78
+ CLIENT_DATA_CACHE.set(clientDataPath, qData);
79
+ }
80
+ }
81
+ return qData.then((v) => {
82
+ if (!v) {
83
+ CLIENT_DATA_CACHE.delete(clientDataPath);
84
+ }
85
+ resolveFn && resolveFn();
86
+ return v;
87
+ });
88
+ };
89
+ const getFetchOptions = (action, noCache) => {
90
+ const actionData = action?.data;
91
+ if (!actionData) {
92
+ if (noCache) {
93
+ return {
94
+ cache: "no-cache",
95
+ headers: {
96
+ "Cache-Control": "no-cache",
97
+ Pragma: "no-cache"
98
+ }
99
+ };
100
+ }
101
+ return void 0;
102
+ }
103
+ if (actionData instanceof FormData) {
104
+ return {
105
+ method: "POST",
106
+ body: actionData
107
+ };
108
+ } else {
109
+ return {
110
+ method: "POST",
111
+ body: JSON.stringify(actionData),
112
+ headers: {
113
+ "Content-Type": "application/json; charset=UTF-8"
114
+ }
115
+ };
116
+ }
117
+ };
118
+ const toPath = (url) => url.pathname + url.search + url.hash;
119
+ const toUrl = (url, baseUrl) => new URL(url, baseUrl.href);
120
+ const isSameOrigin = (a, b) => a.origin === b.origin;
121
+ const withSlash = (path) => path.endsWith("/") ? path : path + "/";
122
+ const isSamePathname = ({ pathname: a }, { pathname: b }) => {
123
+ const lDiff = Math.abs(a.length - b.length);
124
+ return lDiff === 0 ? a === b : lDiff === 1 && withSlash(a) === withSlash(b);
125
+ };
126
+ const isSameSearchQuery = (a, b) => a.search === b.search;
127
+ const isSamePath = (a, b) => isSameSearchQuery(a, b) && isSamePathname(a, b);
128
+ const getClientDataPath = (pathname, pageSearch, options) => {
129
+ let search = pageSearch ?? "";
130
+ if (options?.actionId) {
131
+ search += (search ? "&" : "?") + QACTION_KEY + "=" + encodeURIComponent(options.actionId);
132
+ }
133
+ if (options?.loaderIds) {
134
+ for (const loaderId of options.loaderIds) {
135
+ search += (search ? "&" : "?") + QLOADER_KEY + "=" + encodeURIComponent(loaderId);
136
+ }
137
+ }
138
+ return pathname + (pathname.endsWith("/") ? "" : "/") + "q-data.json" + search;
139
+ };
140
+ const getClientNavPath = (props, baseUrl) => {
141
+ const href = props.href;
142
+ if (typeof href === "string" && typeof props.target !== "string" && !props.reload) {
143
+ try {
144
+ const linkUrl = toUrl(href.trim(), baseUrl.url);
145
+ const currentUrl = toUrl("", baseUrl.url);
146
+ if (isSameOrigin(linkUrl, currentUrl)) {
147
+ return toPath(linkUrl);
148
+ }
149
+ } catch (e) {
150
+ console.error(e);
151
+ }
152
+ } else if (props.reload) {
153
+ return toPath(toUrl("", baseUrl.url));
154
+ }
155
+ return null;
156
+ };
157
+ const shouldPreload = (clientNavPath, currentLoc) => {
158
+ if (clientNavPath) {
159
+ const prefetchUrl = toUrl(clientNavPath, currentLoc.url);
160
+ const currentUrl = toUrl("", currentLoc.url);
161
+ return !isSamePathname(prefetchUrl, currentUrl);
162
+ }
163
+ return false;
164
+ };
165
+ const isPromise = (value) => {
166
+ return value && typeof value.then === "function";
167
+ };
168
+ const createLoaderSignal = (loadersObject, loaderId, url, serializationStrategy, container) => {
169
+ return createAsyncComputed$(
170
+ async () => {
171
+ if (isBrowser && loadersObject[loaderId] === _UNINITIALIZED) {
172
+ const data = await loadClientData(url, void 0, {
173
+ loaderIds: [loaderId]
174
+ });
175
+ loadersObject[loaderId] = data?.loaders[loaderId] ?? _UNINITIALIZED;
176
+ }
177
+ return loadersObject[loaderId];
178
+ },
179
+ {
180
+ container,
181
+ serializationStrategy
182
+ }
183
+ );
184
+ };
185
+ const clientNavigate = (win, navType, fromURL, toURL, replaceState = false) => {
186
+ if (navType !== "popstate") {
187
+ const samePath = isSamePath(fromURL, toURL);
188
+ const sameHash = fromURL.hash === toURL.hash;
189
+ if (!samePath || !sameHash) {
190
+ const newState = {
191
+ _qRouterScroll: newScrollState()
192
+ };
193
+ if (replaceState) {
194
+ win.history.replaceState(newState, "", toPath(toURL));
195
+ } else {
196
+ win.history.pushState(newState, "", toPath(toURL));
197
+ }
198
+ }
199
+ }
200
+ };
201
+ const newScrollState = () => {
202
+ return {
203
+ x: 0,
204
+ y: 0,
205
+ w: 0,
206
+ h: 0
207
+ };
208
+ };
209
+ const preloadRouteBundles = (path, probability = 0.8) => {
210
+ if (isBrowser) {
211
+ path = path.endsWith("/") ? path : path + "/";
212
+ path = path.length > 1 && path.startsWith("/") ? path.slice(1) : path;
213
+ p(path, probability);
214
+ }
215
+ };
216
+ function matchRoute(route, path) {
217
+ const routeIdx = startIdxSkipSlash(route);
218
+ const routeLength = lengthNoTrailingSlash(route);
219
+ const pathIdx = startIdxSkipSlash(path);
220
+ const pathLength = lengthNoTrailingSlash(path);
221
+ return matchRoutePart(route, routeIdx, routeLength, path, pathIdx, pathLength);
222
+ }
223
+ function matchRoutePart(route, routeIdx, routeLength, path, pathIdx, pathLength) {
224
+ if (path.startsWith("/build/")) {
225
+ return null;
226
+ }
227
+ let params = null;
228
+ while (routeIdx < routeLength) {
229
+ const routeCh = route.charCodeAt(routeIdx++);
230
+ const pathCh = path.charCodeAt(pathIdx++);
231
+ if (routeCh === 91) {
232
+ const isMany = isThreeDots(route, routeIdx);
233
+ const paramNameStart = routeIdx + (isMany ? 3 : 0);
234
+ const paramNameEnd = scan(
235
+ route,
236
+ paramNameStart,
237
+ routeLength,
238
+ 93
239
+ /* CLOSE_BRACKET */
240
+ );
241
+ const paramName = route.substring(paramNameStart, paramNameEnd);
242
+ const paramSuffixEnd = scan(
243
+ route,
244
+ paramNameEnd + 1,
245
+ routeLength,
246
+ 47
247
+ /* SLASH */
248
+ );
249
+ const suffix = route.substring(paramNameEnd + 1, paramSuffixEnd);
250
+ routeIdx = paramNameEnd + 1;
251
+ const paramValueStart = pathIdx - 1;
252
+ if (isMany) {
253
+ const match = recursiveScan(
254
+ paramName,
255
+ suffix,
256
+ path,
257
+ paramValueStart,
258
+ pathLength,
259
+ route,
260
+ routeIdx + suffix.length + 1,
261
+ routeLength
262
+ );
263
+ if (match) {
264
+ return Object.assign(params || (params = {}), match);
265
+ }
266
+ }
267
+ const paramValueEnd = scan(path, paramValueStart, pathLength, 47, suffix);
268
+ if (paramValueEnd == -1) {
269
+ return null;
270
+ }
271
+ const paramValue = path.substring(paramValueStart, paramValueEnd);
272
+ if (!isMany && !suffix && !paramValue) {
273
+ return null;
274
+ }
275
+ pathIdx = paramValueEnd;
276
+ (params || (params = {}))[paramName] = decodeURIComponent(paramValue);
277
+ } else if (routeCh !== pathCh) {
278
+ if (!(isNaN(pathCh) && isRestParameter(route, routeIdx))) {
279
+ return null;
280
+ }
281
+ }
282
+ }
283
+ if (allConsumed(route, routeIdx) && allConsumed(path, pathIdx)) {
284
+ return params || {};
285
+ } else {
286
+ return null;
287
+ }
288
+ }
289
+ function isRestParameter(text, idx) {
290
+ return text.charCodeAt(idx) === 91 && isThreeDots(text, idx + 1);
291
+ }
292
+ function lengthNoTrailingSlash(text) {
293
+ const length = text.length;
294
+ return length > 1 && text.charCodeAt(length - 1) === 47 ? length - 1 : length;
295
+ }
296
+ function allConsumed(text, idx) {
297
+ const length = text.length;
298
+ return idx >= length || idx == length - 1 && text.charCodeAt(idx) === 47;
299
+ }
300
+ function startIdxSkipSlash(text) {
301
+ return text.charCodeAt(0) === 47 ? 1 : 0;
302
+ }
303
+ function isThreeDots(text, idx) {
304
+ return text.charCodeAt(idx) === 46 && text.charCodeAt(idx + 1) === 46 && text.charCodeAt(idx + 2) === 46;
305
+ }
306
+ function scan(text, idx, end, ch, suffix = "") {
307
+ while (idx < end && text.charCodeAt(idx) !== ch) {
308
+ idx++;
309
+ }
310
+ const suffixLength = suffix.length;
311
+ for (let i = 0; i < suffixLength; i++) {
312
+ if (text.charCodeAt(idx - suffixLength + i) !== suffix.charCodeAt(i)) {
313
+ return -1;
314
+ }
315
+ }
316
+ return idx - suffixLength;
317
+ }
318
+ function recursiveScan(paramName, suffix, path, pathStart, pathLength, route, routeStart, routeLength) {
319
+ if (path.charCodeAt(pathStart) === 47) {
320
+ pathStart++;
321
+ }
322
+ let pathIdx = pathLength;
323
+ const sep = suffix + "/";
324
+ while (pathIdx >= pathStart) {
325
+ const match = matchRoutePart(route, routeStart, routeLength, path, pathIdx, pathLength);
326
+ if (match) {
327
+ let value = path.substring(pathStart, Math.min(pathIdx, pathLength));
328
+ if (value.endsWith(sep)) {
329
+ value = value.substring(0, value.length - sep.length);
330
+ }
331
+ match[paramName] = decodeURIComponent(value);
332
+ return match;
333
+ }
334
+ const newPathIdx = lastIndexOf(path, pathStart, sep, pathIdx, pathStart - 1) + sep.length;
335
+ if (pathIdx === newPathIdx) {
336
+ break;
337
+ }
338
+ pathIdx = newPathIdx;
339
+ }
340
+ return null;
341
+ }
342
+ function lastIndexOf(text, start, match, searchIdx, notFoundIdx) {
343
+ let idx = text.lastIndexOf(match, searchIdx);
344
+ if (idx == searchIdx - match.length) {
345
+ idx = text.lastIndexOf(match, searchIdx - match.length - 1);
346
+ }
347
+ return idx > start ? idx : notFoundIdx;
348
+ }
349
+ const deepFreeze = (obj) => {
350
+ if (obj == null) {
351
+ return obj;
352
+ }
353
+ Object.getOwnPropertyNames(obj).forEach((prop) => {
354
+ const value = obj[prop];
355
+ if (value && typeof value === "object" && !Object.isFrozen(value)) {
356
+ deepFreeze(value);
357
+ }
358
+ });
359
+ return Object.freeze(obj);
360
+ };
361
+ const loadRoute = async (routes, menus, cacheModules, pathname, isInternal) => {
362
+ if (!Array.isArray(routes)) {
363
+ return null;
364
+ }
365
+ for (const routeData of routes) {
366
+ const routeName = routeData[RouteDataProp.RouteName];
367
+ const params = matchRoute(routeName, pathname);
368
+ if (!params) {
369
+ continue;
370
+ }
371
+ const moduleLoaders = routeData[RouteDataProp.ModuleLoaders];
372
+ const routeBundleNames = routeData[RouteDataProp.RouteBundleNames];
373
+ const modules = new Array(moduleLoaders.length);
374
+ const pendingLoads = [];
375
+ moduleLoaders.forEach((moduleLoader, i) => {
376
+ loadModule(
377
+ moduleLoader,
378
+ pendingLoads,
379
+ (routeModule) => modules[i] = routeModule,
380
+ cacheModules
381
+ );
382
+ });
383
+ let menu = void 0;
384
+ if (!isInternal) {
385
+ const menuLoader = getMenuLoader(menus, pathname);
386
+ loadModule(
387
+ menuLoader,
388
+ pendingLoads,
389
+ (menuModule) => menu = menuModule?.default,
390
+ cacheModules
391
+ );
392
+ }
393
+ if (pendingLoads.length > 0) {
394
+ await Promise.all(pendingLoads);
395
+ }
396
+ return [routeName, params, modules, deepFreeze(menu), routeBundleNames];
397
+ }
398
+ return null;
399
+ };
400
+ const loadModule = (moduleLoader, pendingLoads, moduleSetter, cacheModules) => {
401
+ if (typeof moduleLoader === "function") {
402
+ const loadedModule = MODULE_CACHE.get(moduleLoader);
403
+ if (loadedModule) {
404
+ moduleSetter(loadedModule);
405
+ } else {
406
+ const moduleOrPromise = moduleLoader();
407
+ if (typeof moduleOrPromise.then === "function") {
408
+ pendingLoads.push(
409
+ moduleOrPromise.then((loadedModule2) => {
410
+ if (cacheModules !== false) {
411
+ MODULE_CACHE.set(moduleLoader, loadedModule2);
412
+ }
413
+ moduleSetter(loadedModule2);
414
+ })
415
+ );
416
+ } else if (moduleOrPromise) {
417
+ moduleSetter(moduleOrPromise);
418
+ }
419
+ }
420
+ }
421
+ };
422
+ const getMenuLoader = (menus, pathname) => {
423
+ if (menus) {
424
+ pathname = pathname.endsWith("/") ? pathname : pathname + "/";
425
+ const menu = menus.find(
426
+ (m) => m[MenuDataProp.Pathname] === pathname || pathname.startsWith(m[MenuDataProp.Pathname])
427
+ );
428
+ if (menu) {
429
+ return menu[MenuDataProp.MenuLoader];
430
+ }
431
+ }
432
+ };
433
+ export {
434
+ CLIENT_DATA_CACHE as C,
435
+ DEFAULT_LOADERS_SERIALIZATION_STRATEGY as D,
436
+ Q_ROUTE as Q,
437
+ isSamePath as a,
438
+ isSameOrigin as b,
439
+ createLoaderSignal as c,
440
+ loadRoute as d,
441
+ clientNavigate as e,
442
+ deepFreeze as f,
443
+ getClientNavPath as g,
444
+ QFN_KEY as h,
445
+ isPromise as i,
446
+ QACTION_KEY as j,
447
+ QDATA_KEY as k,
448
+ loadClientData as l,
449
+ QLOADER_KEY as m,
450
+ preloadRouteBundles as p,
451
+ shouldPreload as s,
452
+ toUrl as t
453
+ };
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ var RouteDataProp = /* @__PURE__ */ ((RouteDataProp2) => {
3
+ RouteDataProp2[RouteDataProp2["RouteName"] = 0] = "RouteName";
4
+ RouteDataProp2[RouteDataProp2["ModuleLoaders"] = 1] = "ModuleLoaders";
5
+ RouteDataProp2[RouteDataProp2["OriginalPathname"] = 2] = "OriginalPathname";
6
+ RouteDataProp2[RouteDataProp2["RouteBundleNames"] = 3] = "RouteBundleNames";
7
+ return RouteDataProp2;
8
+ })(RouteDataProp || {});
9
+ var MenuDataProp = /* @__PURE__ */ ((MenuDataProp2) => {
10
+ MenuDataProp2[MenuDataProp2["Pathname"] = 0] = "Pathname";
11
+ MenuDataProp2[MenuDataProp2["MenuLoader"] = 1] = "MenuLoader";
12
+ return MenuDataProp2;
13
+ })(MenuDataProp || {});
14
+ var LoadedRouteProp = /* @__PURE__ */ ((LoadedRouteProp2) => {
15
+ LoadedRouteProp2[LoadedRouteProp2["RouteName"] = 0] = "RouteName";
16
+ LoadedRouteProp2[LoadedRouteProp2["Params"] = 1] = "Params";
17
+ LoadedRouteProp2[LoadedRouteProp2["Mods"] = 2] = "Mods";
18
+ LoadedRouteProp2[LoadedRouteProp2["Menu"] = 3] = "Menu";
19
+ LoadedRouteProp2[LoadedRouteProp2["RouteBundleNames"] = 4] = "RouteBundleNames";
20
+ return LoadedRouteProp2;
21
+ })(LoadedRouteProp || {});
22
+ exports.LoadedRouteProp = LoadedRouteProp;
23
+ exports.MenuDataProp = MenuDataProp;
24
+ exports.RouteDataProp = RouteDataProp;
@@ -0,0 +1,25 @@
1
+ var RouteDataProp = /* @__PURE__ */ ((RouteDataProp2) => {
2
+ RouteDataProp2[RouteDataProp2["RouteName"] = 0] = "RouteName";
3
+ RouteDataProp2[RouteDataProp2["ModuleLoaders"] = 1] = "ModuleLoaders";
4
+ RouteDataProp2[RouteDataProp2["OriginalPathname"] = 2] = "OriginalPathname";
5
+ RouteDataProp2[RouteDataProp2["RouteBundleNames"] = 3] = "RouteBundleNames";
6
+ return RouteDataProp2;
7
+ })(RouteDataProp || {});
8
+ var MenuDataProp = /* @__PURE__ */ ((MenuDataProp2) => {
9
+ MenuDataProp2[MenuDataProp2["Pathname"] = 0] = "Pathname";
10
+ MenuDataProp2[MenuDataProp2["MenuLoader"] = 1] = "MenuLoader";
11
+ return MenuDataProp2;
12
+ })(MenuDataProp || {});
13
+ var LoadedRouteProp = /* @__PURE__ */ ((LoadedRouteProp2) => {
14
+ LoadedRouteProp2[LoadedRouteProp2["RouteName"] = 0] = "RouteName";
15
+ LoadedRouteProp2[LoadedRouteProp2["Params"] = 1] = "Params";
16
+ LoadedRouteProp2[LoadedRouteProp2["Mods"] = 2] = "Mods";
17
+ LoadedRouteProp2[LoadedRouteProp2["Menu"] = 3] = "Menu";
18
+ LoadedRouteProp2[LoadedRouteProp2["RouteBundleNames"] = 4] = "RouteBundleNames";
19
+ return LoadedRouteProp2;
20
+ })(LoadedRouteProp || {});
21
+ export {
22
+ LoadedRouteProp as L,
23
+ MenuDataProp as M,
24
+ RouteDataProp as R
25
+ };
package/lib/index.d.ts CHANGED
@@ -244,6 +244,7 @@ export declare type DocumentHead = DocumentHeadValue | ((props: DocumentHeadProp
244
244
  /** @public */
245
245
  export declare interface DocumentHeadProps extends RouteLocation {
246
246
  readonly head: ResolvedDocumentHead;
247
+ /** @deprecated This is not necessary, it works correctly without */
247
248
  readonly withLocale: <T>(fn: () => T) => T;
248
249
  readonly resolveValue: ResolveSyncValue;
249
250
  }
@@ -664,7 +665,7 @@ export declare interface QwikRouterProps {
664
665
  viewTransition?: boolean;
665
666
  }
666
667
 
667
- /** @public This is a wrapper around the `useQwikRouter()` hook. We recommend using the hook instead of this component. */
668
+ /** @public This is a wrapper around the `useQwikRouter()` hook. We recommend using the hook instead of this component, unless you have a good reason to make your root component reactive. */
668
669
  export declare const QwikRouterProvider: Component<QwikRouterProps>;
669
670
 
670
671
  /** @public */
@@ -705,10 +706,15 @@ export declare const routeAction$: ActionConstructor;
705
706
  /* Excluded from this release type: routeActionQrl */
706
707
 
707
708
  /** @public */
708
- export declare type RouteData = [routeName: string, loaders: ModuleLoader[]] | [
709
+ export declare type RouteData = [
709
710
  routeName: string,
710
- loaders: ModuleLoader[],
711
+ moduleLoaders: ModuleLoader[]
712
+ ] | [
713
+ routeName: string,
714
+ moduleLoaders: ModuleLoader[],
715
+ /** The actual src/routes pathname, not rewritten */
711
716
  originalPathname: string,
717
+ /** The bundles that contain the loaders */
712
718
  routeBundleNames: string[]
713
719
  ];
714
720