@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.
- package/lib/adapters/azure-swa/vite/index.cjs +61 -5
- package/lib/adapters/azure-swa/vite/index.mjs +26 -201
- package/lib/adapters/bun-server/vite/index.cjs +27 -5
- package/lib/adapters/bun-server/vite/index.mjs +14 -196
- package/lib/adapters/cloud-run/vite/index.cjs +24 -5
- package/lib/adapters/cloud-run/vite/index.mjs +13 -195
- package/lib/adapters/cloudflare-pages/vite/index.cjs +65 -1
- package/lib/adapters/cloudflare-pages/vite/index.mjs +63 -4
- package/lib/adapters/deno-server/vite/index.cjs +39 -5
- package/lib/adapters/deno-server/vite/index.mjs +16 -198
- package/lib/adapters/netlify-edge/vite/index.cjs +88 -6
- package/lib/adapters/netlify-edge/vite/index.mjs +56 -240
- package/lib/adapters/node-server/vite/index.cjs +27 -5
- package/lib/adapters/node-server/vite/index.mjs +14 -196
- package/lib/adapters/shared/vite/index.cjs +303 -2
- package/lib/adapters/shared/vite/index.d.ts +4 -4
- package/lib/adapters/shared/vite/index.mjs +248 -143
- package/lib/adapters/ssg/vite/index.cjs +19 -5
- package/lib/adapters/ssg/vite/index.mjs +11 -193
- package/lib/adapters/vercel-edge/vite/index.cjs +81 -5
- package/lib/adapters/vercel-edge/vite/index.d.ts +1 -1
- package/lib/adapters/vercel-edge/vite/index.mjs +48 -229
- package/lib/chunks/error-handler.cjs +58 -0
- package/lib/chunks/error-handler.mjs +59 -0
- package/lib/chunks/format-error.cjs +136 -0
- package/lib/chunks/format-error.mjs +137 -0
- package/lib/chunks/fs.cjs +274 -0
- package/lib/chunks/fs.mjs +275 -0
- package/lib/chunks/index.cjs +877 -0
- package/lib/chunks/index.mjs +876 -0
- package/lib/chunks/mime-types.cjs +52 -0
- package/lib/chunks/mime-types.mjs +53 -0
- package/lib/chunks/routing.qwik.cjs +452 -0
- package/lib/chunks/routing.qwik.mjs +453 -0
- package/lib/chunks/types.qwik.cjs +24 -0
- package/lib/chunks/types.qwik.mjs +25 -0
- package/lib/index.d.ts +9 -3
- package/lib/index.qwik.cjs +543 -1001
- package/lib/index.qwik.mjs +512 -972
- package/lib/middleware/aws-lambda/index.cjs +52 -1
- package/lib/middleware/aws-lambda/index.mjs +37 -26
- package/lib/middleware/azure-swa/index.cjs +92 -1
- package/lib/middleware/azure-swa/index.mjs +64 -46
- package/lib/middleware/bun/index.cjs +143 -1
- package/lib/middleware/bun/index.mjs +103 -117
- package/lib/middleware/cloudflare-pages/index.cjs +96 -1
- package/lib/middleware/cloudflare-pages/index.mjs +68 -47
- package/lib/middleware/deno/index.cjs +130 -1
- package/lib/middleware/deno/index.mjs +93 -112
- package/lib/middleware/firebase/index.cjs +33 -1
- package/lib/middleware/firebase/index.mjs +25 -16
- package/lib/middleware/netlify-edge/index.cjs +71 -1
- package/lib/middleware/netlify-edge/index.mjs +52 -36
- package/lib/middleware/node/index.cjs +219 -1
- package/lib/middleware/node/index.mjs +178 -165
- package/lib/middleware/request-handler/index.cjs +1488 -18
- package/lib/middleware/request-handler/index.d.ts +20 -2
- package/lib/middleware/request-handler/index.mjs +1225 -873
- package/lib/middleware/vercel-edge/index.cjs +98 -1
- package/lib/middleware/vercel-edge/index.mjs +71 -47
- package/lib/service-worker/index.cjs +5 -0
- package/lib/service-worker/index.mjs +5 -0
- package/lib/ssg/index.cjs +15 -1
- package/lib/ssg/index.mjs +12 -19
- package/lib/vite/index.cjs +2006 -27
- package/lib/vite/index.d.ts +9 -9
- package/lib/vite/index.mjs +1597 -1216
- package/package.json +9 -8
- package/lib/adapters/azure-swa/vite/index-BqUeglYs.cjs +0 -1
- package/lib/adapters/azure-swa/vite/index-CBIchDYq.js +0 -651
- package/lib/adapters/azure-swa/vite/index-ClHGw5z1.js +0 -6
- package/lib/adapters/azure-swa/vite/index-CrwlB95_.js +0 -22
- package/lib/adapters/azure-swa/vite/index-DTIOTwZo.cjs +0 -11
- package/lib/adapters/azure-swa/vite/index-vQuPcef3.cjs +0 -1
- package/lib/adapters/bun-server/vite/index-BqUeglYs.cjs +0 -1
- package/lib/adapters/bun-server/vite/index-CBIchDYq.js +0 -651
- package/lib/adapters/bun-server/vite/index-ClHGw5z1.js +0 -6
- package/lib/adapters/bun-server/vite/index-CrwlB95_.js +0 -22
- package/lib/adapters/bun-server/vite/index-DTIOTwZo.cjs +0 -11
- package/lib/adapters/bun-server/vite/index-vQuPcef3.cjs +0 -1
- package/lib/adapters/cloud-run/vite/index-BqUeglYs.cjs +0 -1
- package/lib/adapters/cloud-run/vite/index-CBIchDYq.js +0 -651
- package/lib/adapters/cloud-run/vite/index-ClHGw5z1.js +0 -6
- package/lib/adapters/cloud-run/vite/index-CrwlB95_.js +0 -22
- package/lib/adapters/cloud-run/vite/index-DTIOTwZo.cjs +0 -11
- package/lib/adapters/cloud-run/vite/index-vQuPcef3.cjs +0 -1
- package/lib/adapters/cloudflare-pages/vite/index-BIeHg2Cj.cjs +0 -5
- package/lib/adapters/cloudflare-pages/vite/index-C455V8_A.cjs +0 -1
- package/lib/adapters/cloudflare-pages/vite/index-ClHGw5z1.js +0 -6
- package/lib/adapters/cloudflare-pages/vite/index-D3HITboM.js +0 -645
- package/lib/adapters/cloudflare-pages/vite/index-DKcVHRBy.cjs +0 -11
- package/lib/adapters/cloudflare-pages/vite/index-DwovcBp3.js +0 -22
- package/lib/adapters/cloudflare-pages/vite/index-bogwy7wh.js +0 -250
- package/lib/adapters/cloudflare-pages/vite/index-vQuPcef3.cjs +0 -1
- package/lib/adapters/deno-server/vite/index-BqUeglYs.cjs +0 -1
- package/lib/adapters/deno-server/vite/index-CBIchDYq.js +0 -651
- package/lib/adapters/deno-server/vite/index-ClHGw5z1.js +0 -6
- package/lib/adapters/deno-server/vite/index-CrwlB95_.js +0 -22
- package/lib/adapters/deno-server/vite/index-DTIOTwZo.cjs +0 -11
- package/lib/adapters/deno-server/vite/index-vQuPcef3.cjs +0 -1
- package/lib/adapters/netlify-edge/vite/index-BqUeglYs.cjs +0 -1
- package/lib/adapters/netlify-edge/vite/index-CBIchDYq.js +0 -651
- package/lib/adapters/netlify-edge/vite/index-ClHGw5z1.js +0 -6
- package/lib/adapters/netlify-edge/vite/index-CrwlB95_.js +0 -22
- package/lib/adapters/netlify-edge/vite/index-DTIOTwZo.cjs +0 -11
- package/lib/adapters/netlify-edge/vite/index-vQuPcef3.cjs +0 -1
- package/lib/adapters/node-server/vite/index-BqUeglYs.cjs +0 -1
- package/lib/adapters/node-server/vite/index-CBIchDYq.js +0 -651
- package/lib/adapters/node-server/vite/index-ClHGw5z1.js +0 -6
- package/lib/adapters/node-server/vite/index-CrwlB95_.js +0 -22
- package/lib/adapters/node-server/vite/index-DTIOTwZo.cjs +0 -11
- package/lib/adapters/node-server/vite/index-vQuPcef3.cjs +0 -1
- package/lib/adapters/shared/vite/index-BqUeglYs.cjs +0 -1
- package/lib/adapters/shared/vite/index-CBIchDYq.js +0 -651
- package/lib/adapters/shared/vite/index-ClHGw5z1.js +0 -6
- package/lib/adapters/shared/vite/index-CrwlB95_.js +0 -22
- package/lib/adapters/shared/vite/index-DTIOTwZo.cjs +0 -11
- package/lib/adapters/shared/vite/index-vQuPcef3.cjs +0 -1
- package/lib/adapters/ssg/vite/index-BqUeglYs.cjs +0 -1
- package/lib/adapters/ssg/vite/index-CBIchDYq.js +0 -651
- package/lib/adapters/ssg/vite/index-ClHGw5z1.js +0 -6
- package/lib/adapters/ssg/vite/index-CrwlB95_.js +0 -22
- package/lib/adapters/ssg/vite/index-DTIOTwZo.cjs +0 -11
- package/lib/adapters/ssg/vite/index-vQuPcef3.cjs +0 -1
- package/lib/adapters/vercel-edge/vite/index-BqUeglYs.cjs +0 -1
- package/lib/adapters/vercel-edge/vite/index-CBIchDYq.js +0 -651
- package/lib/adapters/vercel-edge/vite/index-ClHGw5z1.js +0 -6
- package/lib/adapters/vercel-edge/vite/index-CrwlB95_.js +0 -22
- package/lib/adapters/vercel-edge/vite/index-DTIOTwZo.cjs +0 -11
- package/lib/adapters/vercel-edge/vite/index-vQuPcef3.cjs +0 -1
- package/lib/service-worker.cjs +0 -1
- package/lib/service-worker.mjs +0 -5
- package/lib/ssg/deno.cjs +0 -1
- package/lib/ssg/deno.mjs +0 -6
- package/lib/ssg/index-CBIchDYq.js +0 -651
- package/lib/ssg/index-ClHGw5z1.js +0 -6
- package/lib/ssg/index-DTIOTwZo.cjs +0 -11
- package/lib/ssg/index-vQuPcef3.cjs +0 -1
- package/lib/ssg/node.cjs +0 -11
- 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;
|