@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,52 @@
1
+ "use strict";
2
+ const MIME_TYPES = {
3
+ "3gp": "video/3gpp",
4
+ "3gpp": "video/3gpp",
5
+ asf: "video/x-ms-asf",
6
+ asx: "video/x-ms-asf",
7
+ avi: "video/x-msvideo",
8
+ avif: "image/avif",
9
+ bmp: "image/x-ms-bmp",
10
+ css: "text/css",
11
+ flv: "video/x-flv",
12
+ gif: "image/gif",
13
+ htm: "text/html",
14
+ html: "text/html",
15
+ ico: "image/x-icon",
16
+ jng: "image/x-jng",
17
+ jpeg: "image/jpeg",
18
+ jpg: "image/jpeg",
19
+ js: "application/javascript",
20
+ json: "application/json",
21
+ kar: "audio/midi",
22
+ m4a: "audio/x-m4a",
23
+ m4v: "video/x-m4v",
24
+ mid: "audio/midi",
25
+ midi: "audio/midi",
26
+ mng: "video/x-mng",
27
+ mov: "video/quicktime",
28
+ mp3: "audio/mpeg",
29
+ mp4: "video/mp4",
30
+ mpeg: "video/mpeg",
31
+ mpg: "video/mpeg",
32
+ ogg: "audio/ogg",
33
+ pdf: "application/pdf",
34
+ png: "image/png",
35
+ rar: "application/x-rar-compressed",
36
+ shtml: "text/html",
37
+ svg: "image/svg+xml",
38
+ svgz: "image/svg+xml",
39
+ tif: "image/tiff",
40
+ tiff: "image/tiff",
41
+ ts: "video/mp2t",
42
+ txt: "text/plain",
43
+ wbmp: "image/vnd.wap.wbmp",
44
+ webm: "video/webm",
45
+ webp: "image/webp",
46
+ wmv: "video/x-ms-wmv",
47
+ woff: "font/woff",
48
+ woff2: "font/woff2",
49
+ xml: "text/xml",
50
+ zip: "application/zip"
51
+ };
52
+ exports.MIME_TYPES = MIME_TYPES;
@@ -0,0 +1,53 @@
1
+ const MIME_TYPES = {
2
+ "3gp": "video/3gpp",
3
+ "3gpp": "video/3gpp",
4
+ asf: "video/x-ms-asf",
5
+ asx: "video/x-ms-asf",
6
+ avi: "video/x-msvideo",
7
+ avif: "image/avif",
8
+ bmp: "image/x-ms-bmp",
9
+ css: "text/css",
10
+ flv: "video/x-flv",
11
+ gif: "image/gif",
12
+ htm: "text/html",
13
+ html: "text/html",
14
+ ico: "image/x-icon",
15
+ jng: "image/x-jng",
16
+ jpeg: "image/jpeg",
17
+ jpg: "image/jpeg",
18
+ js: "application/javascript",
19
+ json: "application/json",
20
+ kar: "audio/midi",
21
+ m4a: "audio/x-m4a",
22
+ m4v: "video/x-m4v",
23
+ mid: "audio/midi",
24
+ midi: "audio/midi",
25
+ mng: "video/x-mng",
26
+ mov: "video/quicktime",
27
+ mp3: "audio/mpeg",
28
+ mp4: "video/mp4",
29
+ mpeg: "video/mpeg",
30
+ mpg: "video/mpeg",
31
+ ogg: "audio/ogg",
32
+ pdf: "application/pdf",
33
+ png: "image/png",
34
+ rar: "application/x-rar-compressed",
35
+ shtml: "text/html",
36
+ svg: "image/svg+xml",
37
+ svgz: "image/svg+xml",
38
+ tif: "image/tiff",
39
+ tiff: "image/tiff",
40
+ ts: "video/mp2t",
41
+ txt: "text/plain",
42
+ wbmp: "image/vnd.wap.wbmp",
43
+ webm: "video/webm",
44
+ webp: "image/webp",
45
+ wmv: "video/x-ms-wmv",
46
+ woff: "font/woff",
47
+ woff2: "font/woff2",
48
+ xml: "text/xml",
49
+ zip: "application/zip"
50
+ };
51
+ export {
52
+ MIME_TYPES as M
53
+ };
@@ -0,0 +1,452 @@
1
+ "use strict";
2
+ const core = require("@qwik.dev/core");
3
+ const preloader = require("@qwik.dev/core/preloader");
4
+ const internal = require("@qwik.dev/core/internal");
5
+ const types = require("./types.qwik.cjs");
6
+ const MODULE_CACHE = /* @__PURE__ */ new WeakMap();
7
+ const CLIENT_DATA_CACHE = /* @__PURE__ */ new Map();
8
+ const QACTION_KEY = "qaction";
9
+ const QLOADER_KEY = "qloaders";
10
+ const QFN_KEY = "qfunc";
11
+ const QDATA_KEY = "qdata";
12
+ const Q_ROUTE = "q:route";
13
+ const DEFAULT_LOADERS_SERIALIZATION_STRATEGY = globalThis.__DEFAULT_LOADERS_SERIALIZATION_STRATEGY__ || "never";
14
+ const MAX_Q_DATA_RETRY_COUNT = 3;
15
+ const loadClientData = async (url, element, opts, retryCount = 0) => {
16
+ const pagePathname = url.pathname;
17
+ const pageSearch = url.search;
18
+ const clientDataPath = getClientDataPath(pagePathname, pageSearch, {
19
+ actionId: opts?.action?.id,
20
+ loaderIds: opts?.loaderIds
21
+ });
22
+ let qData;
23
+ if (!opts?.action) {
24
+ qData = CLIENT_DATA_CACHE.get(clientDataPath);
25
+ }
26
+ if (opts?.preloadRouteBundles !== false) {
27
+ preloadRouteBundles(pagePathname, 0.8);
28
+ }
29
+ let resolveFn;
30
+ if (!qData) {
31
+ const fetchOptions = getFetchOptions(opts?.action, opts?.clearCache);
32
+ if (opts?.action) {
33
+ opts.action.data = void 0;
34
+ }
35
+ qData = fetch(clientDataPath, fetchOptions).then((rsp) => {
36
+ if (rsp.status === 404 && opts?.loaderIds && retryCount < MAX_Q_DATA_RETRY_COUNT) {
37
+ opts.loaderIds = void 0;
38
+ return loadClientData(url, element, opts, retryCount + 1);
39
+ }
40
+ if (rsp.redirected) {
41
+ const redirectedURL = new URL(rsp.url);
42
+ const isQData = redirectedURL.pathname.endsWith("/q-data.json");
43
+ if (!isQData || redirectedURL.origin !== location.origin) {
44
+ if (!opts?.isPrefetch) {
45
+ location.href = redirectedURL.href;
46
+ }
47
+ return;
48
+ }
49
+ }
50
+ if ((rsp.headers.get("content-type") || "").includes("json")) {
51
+ return rsp.text().then((text) => {
52
+ const [clientData] = internal._deserialize(text, element);
53
+ if (!clientData) {
54
+ location.href = url.href;
55
+ return;
56
+ }
57
+ if (opts?.clearCache) {
58
+ CLIENT_DATA_CACHE.delete(clientDataPath);
59
+ }
60
+ if (clientData.redirect) {
61
+ location.href = clientData.redirect;
62
+ } else if (opts?.action) {
63
+ const { action } = opts;
64
+ const actionData = clientData.loaders[action.id];
65
+ resolveFn = () => {
66
+ action.resolve({ status: rsp.status, result: actionData });
67
+ };
68
+ }
69
+ return clientData;
70
+ });
71
+ } else {
72
+ if (opts?.isPrefetch !== true) {
73
+ location.href = url.href;
74
+ }
75
+ return void 0;
76
+ }
77
+ });
78
+ if (!opts?.action) {
79
+ CLIENT_DATA_CACHE.set(clientDataPath, qData);
80
+ }
81
+ }
82
+ return qData.then((v) => {
83
+ if (!v) {
84
+ CLIENT_DATA_CACHE.delete(clientDataPath);
85
+ }
86
+ resolveFn && resolveFn();
87
+ return v;
88
+ });
89
+ };
90
+ const getFetchOptions = (action, noCache) => {
91
+ const actionData = action?.data;
92
+ if (!actionData) {
93
+ if (noCache) {
94
+ return {
95
+ cache: "no-cache",
96
+ headers: {
97
+ "Cache-Control": "no-cache",
98
+ Pragma: "no-cache"
99
+ }
100
+ };
101
+ }
102
+ return void 0;
103
+ }
104
+ if (actionData instanceof FormData) {
105
+ return {
106
+ method: "POST",
107
+ body: actionData
108
+ };
109
+ } else {
110
+ return {
111
+ method: "POST",
112
+ body: JSON.stringify(actionData),
113
+ headers: {
114
+ "Content-Type": "application/json; charset=UTF-8"
115
+ }
116
+ };
117
+ }
118
+ };
119
+ const toPath = (url) => url.pathname + url.search + url.hash;
120
+ const toUrl = (url, baseUrl) => new URL(url, baseUrl.href);
121
+ const isSameOrigin = (a, b) => a.origin === b.origin;
122
+ const withSlash = (path) => path.endsWith("/") ? path : path + "/";
123
+ const isSamePathname = ({ pathname: a }, { pathname: b }) => {
124
+ const lDiff = Math.abs(a.length - b.length);
125
+ return lDiff === 0 ? a === b : lDiff === 1 && withSlash(a) === withSlash(b);
126
+ };
127
+ const isSameSearchQuery = (a, b) => a.search === b.search;
128
+ const isSamePath = (a, b) => isSameSearchQuery(a, b) && isSamePathname(a, b);
129
+ const getClientDataPath = (pathname, pageSearch, options) => {
130
+ let search = pageSearch ?? "";
131
+ if (options?.actionId) {
132
+ search += (search ? "&" : "?") + QACTION_KEY + "=" + encodeURIComponent(options.actionId);
133
+ }
134
+ if (options?.loaderIds) {
135
+ for (const loaderId of options.loaderIds) {
136
+ search += (search ? "&" : "?") + QLOADER_KEY + "=" + encodeURIComponent(loaderId);
137
+ }
138
+ }
139
+ return pathname + (pathname.endsWith("/") ? "" : "/") + "q-data.json" + search;
140
+ };
141
+ const getClientNavPath = (props, baseUrl) => {
142
+ const href = props.href;
143
+ if (typeof href === "string" && typeof props.target !== "string" && !props.reload) {
144
+ try {
145
+ const linkUrl = toUrl(href.trim(), baseUrl.url);
146
+ const currentUrl = toUrl("", baseUrl.url);
147
+ if (isSameOrigin(linkUrl, currentUrl)) {
148
+ return toPath(linkUrl);
149
+ }
150
+ } catch (e) {
151
+ console.error(e);
152
+ }
153
+ } else if (props.reload) {
154
+ return toPath(toUrl("", baseUrl.url));
155
+ }
156
+ return null;
157
+ };
158
+ const shouldPreload = (clientNavPath, currentLoc) => {
159
+ if (clientNavPath) {
160
+ const prefetchUrl = toUrl(clientNavPath, currentLoc.url);
161
+ const currentUrl = toUrl("", currentLoc.url);
162
+ return !isSamePathname(prefetchUrl, currentUrl);
163
+ }
164
+ return false;
165
+ };
166
+ const isPromise = (value) => {
167
+ return value && typeof value.then === "function";
168
+ };
169
+ const createLoaderSignal = (loadersObject, loaderId, url, serializationStrategy, container) => {
170
+ return core.createAsyncComputed$(
171
+ async () => {
172
+ if (core.isBrowser && loadersObject[loaderId] === internal._UNINITIALIZED) {
173
+ const data = await loadClientData(url, void 0, {
174
+ loaderIds: [loaderId]
175
+ });
176
+ loadersObject[loaderId] = data?.loaders[loaderId] ?? internal._UNINITIALIZED;
177
+ }
178
+ return loadersObject[loaderId];
179
+ },
180
+ {
181
+ container,
182
+ serializationStrategy
183
+ }
184
+ );
185
+ };
186
+ const clientNavigate = (win, navType, fromURL, toURL, replaceState = false) => {
187
+ if (navType !== "popstate") {
188
+ const samePath = isSamePath(fromURL, toURL);
189
+ const sameHash = fromURL.hash === toURL.hash;
190
+ if (!samePath || !sameHash) {
191
+ const newState = {
192
+ _qRouterScroll: newScrollState()
193
+ };
194
+ if (replaceState) {
195
+ win.history.replaceState(newState, "", toPath(toURL));
196
+ } else {
197
+ win.history.pushState(newState, "", toPath(toURL));
198
+ }
199
+ }
200
+ }
201
+ };
202
+ const newScrollState = () => {
203
+ return {
204
+ x: 0,
205
+ y: 0,
206
+ w: 0,
207
+ h: 0
208
+ };
209
+ };
210
+ const preloadRouteBundles = (path, probability = 0.8) => {
211
+ if (core.isBrowser) {
212
+ path = path.endsWith("/") ? path : path + "/";
213
+ path = path.length > 1 && path.startsWith("/") ? path.slice(1) : path;
214
+ preloader.p(path, probability);
215
+ }
216
+ };
217
+ function matchRoute(route, path) {
218
+ const routeIdx = startIdxSkipSlash(route);
219
+ const routeLength = lengthNoTrailingSlash(route);
220
+ const pathIdx = startIdxSkipSlash(path);
221
+ const pathLength = lengthNoTrailingSlash(path);
222
+ return matchRoutePart(route, routeIdx, routeLength, path, pathIdx, pathLength);
223
+ }
224
+ function matchRoutePart(route, routeIdx, routeLength, path, pathIdx, pathLength) {
225
+ if (path.startsWith("/build/")) {
226
+ return null;
227
+ }
228
+ let params = null;
229
+ while (routeIdx < routeLength) {
230
+ const routeCh = route.charCodeAt(routeIdx++);
231
+ const pathCh = path.charCodeAt(pathIdx++);
232
+ if (routeCh === 91) {
233
+ const isMany = isThreeDots(route, routeIdx);
234
+ const paramNameStart = routeIdx + (isMany ? 3 : 0);
235
+ const paramNameEnd = scan(
236
+ route,
237
+ paramNameStart,
238
+ routeLength,
239
+ 93
240
+ /* CLOSE_BRACKET */
241
+ );
242
+ const paramName = route.substring(paramNameStart, paramNameEnd);
243
+ const paramSuffixEnd = scan(
244
+ route,
245
+ paramNameEnd + 1,
246
+ routeLength,
247
+ 47
248
+ /* SLASH */
249
+ );
250
+ const suffix = route.substring(paramNameEnd + 1, paramSuffixEnd);
251
+ routeIdx = paramNameEnd + 1;
252
+ const paramValueStart = pathIdx - 1;
253
+ if (isMany) {
254
+ const match = recursiveScan(
255
+ paramName,
256
+ suffix,
257
+ path,
258
+ paramValueStart,
259
+ pathLength,
260
+ route,
261
+ routeIdx + suffix.length + 1,
262
+ routeLength
263
+ );
264
+ if (match) {
265
+ return Object.assign(params || (params = {}), match);
266
+ }
267
+ }
268
+ const paramValueEnd = scan(path, paramValueStart, pathLength, 47, suffix);
269
+ if (paramValueEnd == -1) {
270
+ return null;
271
+ }
272
+ const paramValue = path.substring(paramValueStart, paramValueEnd);
273
+ if (!isMany && !suffix && !paramValue) {
274
+ return null;
275
+ }
276
+ pathIdx = paramValueEnd;
277
+ (params || (params = {}))[paramName] = decodeURIComponent(paramValue);
278
+ } else if (routeCh !== pathCh) {
279
+ if (!(isNaN(pathCh) && isRestParameter(route, routeIdx))) {
280
+ return null;
281
+ }
282
+ }
283
+ }
284
+ if (allConsumed(route, routeIdx) && allConsumed(path, pathIdx)) {
285
+ return params || {};
286
+ } else {
287
+ return null;
288
+ }
289
+ }
290
+ function isRestParameter(text, idx) {
291
+ return text.charCodeAt(idx) === 91 && isThreeDots(text, idx + 1);
292
+ }
293
+ function lengthNoTrailingSlash(text) {
294
+ const length = text.length;
295
+ return length > 1 && text.charCodeAt(length - 1) === 47 ? length - 1 : length;
296
+ }
297
+ function allConsumed(text, idx) {
298
+ const length = text.length;
299
+ return idx >= length || idx == length - 1 && text.charCodeAt(idx) === 47;
300
+ }
301
+ function startIdxSkipSlash(text) {
302
+ return text.charCodeAt(0) === 47 ? 1 : 0;
303
+ }
304
+ function isThreeDots(text, idx) {
305
+ return text.charCodeAt(idx) === 46 && text.charCodeAt(idx + 1) === 46 && text.charCodeAt(idx + 2) === 46;
306
+ }
307
+ function scan(text, idx, end, ch, suffix = "") {
308
+ while (idx < end && text.charCodeAt(idx) !== ch) {
309
+ idx++;
310
+ }
311
+ const suffixLength = suffix.length;
312
+ for (let i = 0; i < suffixLength; i++) {
313
+ if (text.charCodeAt(idx - suffixLength + i) !== suffix.charCodeAt(i)) {
314
+ return -1;
315
+ }
316
+ }
317
+ return idx - suffixLength;
318
+ }
319
+ function recursiveScan(paramName, suffix, path, pathStart, pathLength, route, routeStart, routeLength) {
320
+ if (path.charCodeAt(pathStart) === 47) {
321
+ pathStart++;
322
+ }
323
+ let pathIdx = pathLength;
324
+ const sep = suffix + "/";
325
+ while (pathIdx >= pathStart) {
326
+ const match = matchRoutePart(route, routeStart, routeLength, path, pathIdx, pathLength);
327
+ if (match) {
328
+ let value = path.substring(pathStart, Math.min(pathIdx, pathLength));
329
+ if (value.endsWith(sep)) {
330
+ value = value.substring(0, value.length - sep.length);
331
+ }
332
+ match[paramName] = decodeURIComponent(value);
333
+ return match;
334
+ }
335
+ const newPathIdx = lastIndexOf(path, pathStart, sep, pathIdx, pathStart - 1) + sep.length;
336
+ if (pathIdx === newPathIdx) {
337
+ break;
338
+ }
339
+ pathIdx = newPathIdx;
340
+ }
341
+ return null;
342
+ }
343
+ function lastIndexOf(text, start, match, searchIdx, notFoundIdx) {
344
+ let idx = text.lastIndexOf(match, searchIdx);
345
+ if (idx == searchIdx - match.length) {
346
+ idx = text.lastIndexOf(match, searchIdx - match.length - 1);
347
+ }
348
+ return idx > start ? idx : notFoundIdx;
349
+ }
350
+ const deepFreeze = (obj) => {
351
+ if (obj == null) {
352
+ return obj;
353
+ }
354
+ Object.getOwnPropertyNames(obj).forEach((prop) => {
355
+ const value = obj[prop];
356
+ if (value && typeof value === "object" && !Object.isFrozen(value)) {
357
+ deepFreeze(value);
358
+ }
359
+ });
360
+ return Object.freeze(obj);
361
+ };
362
+ const loadRoute = async (routes, menus, cacheModules, pathname, isInternal) => {
363
+ if (!Array.isArray(routes)) {
364
+ return null;
365
+ }
366
+ for (const routeData of routes) {
367
+ const routeName = routeData[types.RouteDataProp.RouteName];
368
+ const params = matchRoute(routeName, pathname);
369
+ if (!params) {
370
+ continue;
371
+ }
372
+ const moduleLoaders = routeData[types.RouteDataProp.ModuleLoaders];
373
+ const routeBundleNames = routeData[types.RouteDataProp.RouteBundleNames];
374
+ const modules = new Array(moduleLoaders.length);
375
+ const pendingLoads = [];
376
+ moduleLoaders.forEach((moduleLoader, i) => {
377
+ loadModule(
378
+ moduleLoader,
379
+ pendingLoads,
380
+ (routeModule) => modules[i] = routeModule,
381
+ cacheModules
382
+ );
383
+ });
384
+ let menu = void 0;
385
+ if (!isInternal) {
386
+ const menuLoader = getMenuLoader(menus, pathname);
387
+ loadModule(
388
+ menuLoader,
389
+ pendingLoads,
390
+ (menuModule) => menu = menuModule?.default,
391
+ cacheModules
392
+ );
393
+ }
394
+ if (pendingLoads.length > 0) {
395
+ await Promise.all(pendingLoads);
396
+ }
397
+ return [routeName, params, modules, deepFreeze(menu), routeBundleNames];
398
+ }
399
+ return null;
400
+ };
401
+ const loadModule = (moduleLoader, pendingLoads, moduleSetter, cacheModules) => {
402
+ if (typeof moduleLoader === "function") {
403
+ const loadedModule = MODULE_CACHE.get(moduleLoader);
404
+ if (loadedModule) {
405
+ moduleSetter(loadedModule);
406
+ } else {
407
+ const moduleOrPromise = moduleLoader();
408
+ if (typeof moduleOrPromise.then === "function") {
409
+ pendingLoads.push(
410
+ moduleOrPromise.then((loadedModule2) => {
411
+ if (cacheModules !== false) {
412
+ MODULE_CACHE.set(moduleLoader, loadedModule2);
413
+ }
414
+ moduleSetter(loadedModule2);
415
+ })
416
+ );
417
+ } else if (moduleOrPromise) {
418
+ moduleSetter(moduleOrPromise);
419
+ }
420
+ }
421
+ }
422
+ };
423
+ const getMenuLoader = (menus, pathname) => {
424
+ if (menus) {
425
+ pathname = pathname.endsWith("/") ? pathname : pathname + "/";
426
+ const menu = menus.find(
427
+ (m) => m[types.MenuDataProp.Pathname] === pathname || pathname.startsWith(m[types.MenuDataProp.Pathname])
428
+ );
429
+ if (menu) {
430
+ return menu[types.MenuDataProp.MenuLoader];
431
+ }
432
+ }
433
+ };
434
+ exports.CLIENT_DATA_CACHE = CLIENT_DATA_CACHE;
435
+ exports.DEFAULT_LOADERS_SERIALIZATION_STRATEGY = DEFAULT_LOADERS_SERIALIZATION_STRATEGY;
436
+ exports.QACTION_KEY = QACTION_KEY;
437
+ exports.QDATA_KEY = QDATA_KEY;
438
+ exports.QFN_KEY = QFN_KEY;
439
+ exports.QLOADER_KEY = QLOADER_KEY;
440
+ exports.Q_ROUTE = Q_ROUTE;
441
+ exports.clientNavigate = clientNavigate;
442
+ exports.createLoaderSignal = createLoaderSignal;
443
+ exports.deepFreeze = deepFreeze;
444
+ exports.getClientNavPath = getClientNavPath;
445
+ exports.isPromise = isPromise;
446
+ exports.isSameOrigin = isSameOrigin;
447
+ exports.isSamePath = isSamePath;
448
+ exports.loadClientData = loadClientData;
449
+ exports.loadRoute = loadRoute;
450
+ exports.preloadRouteBundles = preloadRouteBundles;
451
+ exports.shouldPreload = shouldPreload;
452
+ exports.toUrl = toUrl;