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