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