one 1.9.9 → 1.9.10
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/dist/cjs/router/router.cjs +7 -3
- package/dist/cjs/router/router.js +10 -2
- package/dist/cjs/router/router.js.map +1 -1
- package/dist/cjs/router/router.native.js +10 -5
- package/dist/cjs/router/router.native.js.map +1 -1
- package/dist/cjs/server/getServerManifest.cjs +29 -3
- package/dist/cjs/server/getServerManifest.js +24 -2
- package/dist/cjs/server/getServerManifest.js.map +2 -2
- package/dist/cjs/server/getServerManifest.native.js +26 -7
- package/dist/cjs/server/getServerManifest.native.js.map +1 -1
- package/dist/cjs/server/getServerManifest.test.cjs +152 -0
- package/dist/cjs/server/getServerManifest.test.js +143 -0
- package/dist/cjs/server/getServerManifest.test.js.map +6 -0
- package/dist/cjs/server/getServerManifest.test.native.js +168 -0
- package/dist/cjs/server/getServerManifest.test.native.js.map +1 -0
- package/dist/cjs/useLoader.js.map +1 -1
- package/dist/cjs/useLoader.native.js.map +1 -1
- package/dist/cjs/useMatches.js +3 -1
- package/dist/cjs/useMatches.js.map +1 -1
- package/dist/cjs/useMatches.native.js.map +1 -1
- package/dist/cjs/views/PreloadLinks.cjs +23 -11
- package/dist/cjs/views/PreloadLinks.js +25 -10
- package/dist/cjs/views/PreloadLinks.js.map +1 -1
- package/dist/cjs/vite/plugins/clientTreeShakePlugin.test.js +24 -8
- package/dist/cjs/vite/plugins/clientTreeShakePlugin.test.js.map +1 -1
- package/dist/cjs/vite/plugins/clientTreeShakePlugin.test.native.js.map +1 -1
- package/dist/esm/router/router.js +10 -2
- package/dist/esm/router/router.js.map +1 -1
- package/dist/esm/router/router.mjs +7 -3
- package/dist/esm/router/router.mjs.map +1 -1
- package/dist/esm/router/router.native.js +10 -5
- package/dist/esm/router/router.native.js.map +1 -1
- package/dist/esm/server/getServerManifest.js +23 -2
- package/dist/esm/server/getServerManifest.js.map +2 -2
- package/dist/esm/server/getServerManifest.mjs +28 -2
- package/dist/esm/server/getServerManifest.mjs.map +1 -1
- package/dist/esm/server/getServerManifest.native.js +25 -6
- package/dist/esm/server/getServerManifest.native.js.map +1 -1
- package/dist/esm/server/getServerManifest.test.js +144 -0
- package/dist/esm/server/getServerManifest.test.js.map +6 -0
- package/dist/esm/server/getServerManifest.test.mjs +153 -0
- package/dist/esm/server/getServerManifest.test.mjs.map +1 -0
- package/dist/esm/server/getServerManifest.test.native.js +166 -0
- package/dist/esm/server/getServerManifest.test.native.js.map +1 -0
- package/dist/esm/useLoader.js +5 -1
- package/dist/esm/useLoader.js.map +1 -1
- package/dist/esm/useLoader.mjs.map +1 -1
- package/dist/esm/useLoader.native.js.map +1 -1
- package/dist/esm/useMatches.js +3 -1
- package/dist/esm/useMatches.js.map +1 -1
- package/dist/esm/useMatches.mjs.map +1 -1
- package/dist/esm/useMatches.native.js.map +1 -1
- package/dist/esm/views/PreloadLinks.js +25 -10
- package/dist/esm/views/PreloadLinks.js.map +1 -1
- package/dist/esm/views/PreloadLinks.mjs +23 -11
- package/dist/esm/views/PreloadLinks.mjs.map +1 -1
- package/dist/esm/vite/plugins/clientTreeShakePlugin.test.js +24 -8
- package/dist/esm/vite/plugins/clientTreeShakePlugin.test.js.map +1 -1
- package/dist/esm/vite/plugins/clientTreeShakePlugin.test.mjs.map +1 -1
- package/dist/esm/vite/plugins/clientTreeShakePlugin.test.native.js.map +1 -1
- package/package.json +9 -9
- package/src/router/router.ts +13 -3
- package/src/server/getServerManifest.test.ts +178 -0
- package/src/server/getServerManifest.ts +51 -4
- package/src/useLoader.ts +15 -6
- package/src/useMatches.ts +3 -1
- package/src/views/PreloadLinks.tsx +34 -15
- package/src/vite/plugins/clientTreeShakePlugin.test.ts +20 -4
- package/types/router/router.d.ts.map +1 -1
- package/types/server/getServerManifest.d.ts.map +1 -1
- package/types/server/getServerManifest.test.d.ts +2 -0
- package/types/server/getServerManifest.test.d.ts.map +1 -0
- package/types/useLoader.d.ts.map +1 -1
- package/types/useMatches.d.ts.map +1 -1
- package/types/views/PreloadLinks.d.ts +0 -9
- package/types/views/PreloadLinks.d.ts.map +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/views/PreloadLinks.tsx"],
|
|
4
|
-
"mappings": "AAAA,SAAS,WAAW,cAAc;AAClC,SAAS,cAAc;AACvB,SAAS,oBAAoB;AAM7B,MAAM,gBAAiB,QAAQ,IAAI,qBAAqB;
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -2,22 +2,34 @@ import { useEffect, useRef } from "react";
|
|
|
2
2
|
import { getURL } from "../getURL.mjs";
|
|
3
3
|
import { preloadRoute } from "../router/router.mjs";
|
|
4
4
|
const PREFETCH_MODE = process.env.ONE_LINK_PREFETCH || "intent";
|
|
5
|
+
function getHrefFromTarget(url, target) {
|
|
6
|
+
if (!(target instanceof HTMLElement)) return null;
|
|
7
|
+
const anchor = target instanceof HTMLAnchorElement ? target : target.closest("a");
|
|
8
|
+
if (!(anchor instanceof HTMLAnchorElement)) return null;
|
|
9
|
+
const href = anchor.getAttribute("href");
|
|
10
|
+
return href && (href[0] === "/" || href.startsWith(url)) ? href.replace(url, "") : null;
|
|
11
|
+
}
|
|
5
12
|
function PreloadLinks() {
|
|
6
|
-
if (typeof window > "u"
|
|
13
|
+
if (typeof window > "u") return null;
|
|
14
|
+
if (!import.meta.env.PROD) return useEffect(() => {
|
|
15
|
+
const url = getURL(),
|
|
16
|
+
controller = new AbortController();
|
|
17
|
+
return document.addEventListener("mouseover", e => {
|
|
18
|
+
const href = getHrefFromTarget(url, e.target);
|
|
19
|
+
href && preloadRoute(href);
|
|
20
|
+
}, {
|
|
21
|
+
passive: !0,
|
|
22
|
+
signal: controller.signal
|
|
23
|
+
}), () => controller.abort();
|
|
24
|
+
}, []), null;
|
|
25
|
+
if (PREFETCH_MODE === "false") return null;
|
|
7
26
|
const cleanupRef = useRef(null);
|
|
8
27
|
return useEffect(() => {
|
|
9
|
-
const url = getURL()
|
|
10
|
-
getHrefFromTarget = target => {
|
|
11
|
-
if (!(target instanceof HTMLElement)) return null;
|
|
12
|
-
const anchor = target instanceof HTMLAnchorElement ? target : target.closest("a");
|
|
13
|
-
if (!(anchor instanceof HTMLAnchorElement)) return null;
|
|
14
|
-
const href = anchor.getAttribute("href");
|
|
15
|
-
return href && (href[0] === "/" || href.startsWith(url)) ? href.replace(url, "") : null;
|
|
16
|
-
};
|
|
28
|
+
const url = getURL();
|
|
17
29
|
if (PREFETCH_MODE === "hover") {
|
|
18
30
|
const controller = new AbortController();
|
|
19
31
|
return document.addEventListener("mouseover", e => {
|
|
20
|
-
const href = getHrefFromTarget(e.target);
|
|
32
|
+
const href = getHrefFromTarget(url, e.target);
|
|
21
33
|
href && preloadRoute(href);
|
|
22
34
|
}, {
|
|
23
35
|
passive: !0,
|
|
@@ -79,7 +91,7 @@ function PreloadLinks() {
|
|
|
79
91
|
}), cleanupRef.current = () => {
|
|
80
92
|
clearTimeout(timeout), cleanups.forEach(c => c()), observer.disconnect();
|
|
81
93
|
}, document.addEventListener("mouseover", e => {
|
|
82
|
-
const href = getHrefFromTarget(e.target);
|
|
94
|
+
const href = getHrefFromTarget(url, e.target);
|
|
83
95
|
href && preloadRoute(href);
|
|
84
96
|
}, {
|
|
85
97
|
passive: !0,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useEffect","useRef","getURL","preloadRoute","PREFETCH_MODE","process","env","ONE_LINK_PREFETCH","
|
|
1
|
+
{"version":3,"names":["useEffect","useRef","getURL","preloadRoute","PREFETCH_MODE","process","env","ONE_LINK_PREFETCH","getHrefFromTarget","url","target","HTMLElement","anchor","HTMLAnchorElement","closest","href","getAttribute","startsWith","replace","PreloadLinks","window","import","meta","PROD","controller","AbortController","document","addEventListener","e","passive","signal","abort","cleanupRef","then","startPrefetchViewport","observePrefetchViewport","cleanups","seen","WeakSet","observeLinks","querySelectorAll","forEach","link","has","add","push","timeout","observer","MutationObserver","clearTimeout","setTimeout","observe","body","childList","subtree","current","c","disconnect","startPrefetchIntent","observePrefetchIntent"],"sources":["../../../src/views/PreloadLinks.tsx"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -91,7 +91,8 @@ export default function Page() {
|
|
|
91
91
|
`, "/app/index.tsx");
|
|
92
92
|
expect(result).toBeUndefined();
|
|
93
93
|
}), it("should embed routeId in loader stub when root is provided", async () => {
|
|
94
|
-
const result = await transformTreeShakeClient(
|
|
94
|
+
const result = await transformTreeShakeClient(
|
|
95
|
+
`
|
|
95
96
|
import { serverOnlyModule } from 'server-only-pkg'
|
|
96
97
|
import { useLoader } from 'one'
|
|
97
98
|
|
|
@@ -103,10 +104,14 @@ export default function Layout() {
|
|
|
103
104
|
const data = useLoader(loader)
|
|
104
105
|
return data
|
|
105
106
|
}
|
|
106
|
-
`,
|
|
107
|
+
`,
|
|
108
|
+
"/project/app/_layout.tsx",
|
|
109
|
+
"/project"
|
|
110
|
+
);
|
|
107
111
|
expect(result).toBeDefined(), expect(result.code).toContain('export function loader() {return "./_layout.tsx"}'), expect(result.code).not.toContain("__vxrn__loader__");
|
|
108
112
|
}), it("should embed routeId with render mode suffix in loader stub", async () => {
|
|
109
|
-
const result = await transformTreeShakeClient(
|
|
113
|
+
const result = await transformTreeShakeClient(
|
|
114
|
+
`
|
|
110
115
|
import { serverOnlyModule } from 'server-only-pkg'
|
|
111
116
|
import { useLoader } from 'one'
|
|
112
117
|
|
|
@@ -118,7 +123,10 @@ export default function Layout() {
|
|
|
118
123
|
const data = useLoader(loader)
|
|
119
124
|
return data
|
|
120
125
|
}
|
|
121
|
-
`,
|
|
126
|
+
`,
|
|
127
|
+
"/project/app/user+ssr.tsx",
|
|
128
|
+
"/project"
|
|
129
|
+
);
|
|
122
130
|
expect(result).toBeDefined(), expect(result.code).toContain('export function loader() {return "./user+ssr.tsx"}');
|
|
123
131
|
}), it("should fall back to __vxrn__loader__ stub when no root provided", async () => {
|
|
124
132
|
const result = await transformTreeShakeClient(`
|
|
@@ -136,7 +144,8 @@ export default function Page() {
|
|
|
136
144
|
`, "/app/index.tsx");
|
|
137
145
|
expect(result).toBeDefined(), expect(result.code).toContain("__vxrn__loader__");
|
|
138
146
|
}), it("should not transform route file when loader is imported (no inline declaration)", async () => {
|
|
139
|
-
const result = await transformTreeShakeClient(
|
|
147
|
+
const result = await transformTreeShakeClient(
|
|
148
|
+
`
|
|
140
149
|
import { loader } from './loaders/my-loader'
|
|
141
150
|
import { useLoader } from 'one'
|
|
142
151
|
|
|
@@ -146,7 +155,10 @@ export default function Layout() {
|
|
|
146
155
|
const data = useLoader(loader)
|
|
147
156
|
return data
|
|
148
157
|
}
|
|
149
|
-
`,
|
|
158
|
+
`,
|
|
159
|
+
"/project/app/_layout.tsx",
|
|
160
|
+
"/project"
|
|
161
|
+
);
|
|
150
162
|
expect(result).toBeUndefined();
|
|
151
163
|
}), it("should tree-shake server imports from source file where loader is defined", async () => {
|
|
152
164
|
const result = await transformTreeShakeClient(
|
|
@@ -168,14 +180,18 @@ export function helperUsedByClient() {
|
|
|
168
180
|
'export function loader() {return "./loaders/my-loader.ts"}'
|
|
169
181
|
);
|
|
170
182
|
}), it("should not transform re-export from source syntax", async () => {
|
|
171
|
-
const result = await transformTreeShakeClient(
|
|
183
|
+
const result = await transformTreeShakeClient(
|
|
184
|
+
`
|
|
172
185
|
export { loader } from './loaders/shared-loader'
|
|
173
186
|
import { useLoader } from 'one'
|
|
174
187
|
|
|
175
188
|
export default function Page() {
|
|
176
189
|
return 'hello'
|
|
177
190
|
}
|
|
178
|
-
`,
|
|
191
|
+
`,
|
|
192
|
+
"/project/app/page.tsx",
|
|
193
|
+
"/project"
|
|
194
|
+
);
|
|
179
195
|
expect(result).toBeUndefined();
|
|
180
196
|
}), it("should preserve type-only imports during tree shaking", async () => {
|
|
181
197
|
const result = await transformTreeShakeClient(`
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/vite/plugins/clientTreeShakePlugin.test.ts"],
|
|
4
|
-
"mappings": "AAAA,SAAS,UAAU,QAAQ,UAAU;AACrC,SAAS,gCAAgC;AAEzC,SAAS,yBAAyB,MAAM;AACtC,WAAS,4BAA4B,MAAM;AACzC,OAAG,+CAA+C,YAAY;AAe5D,YAAM,SAAS,MAAM,yBAdR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAcuC,gBAAgB;AACpE,aAAO,MAAM,EAAE,YAAY,GAE3B,OAAO,OAAQ,IAAI,EAAE,IAAI,UAAU,iBAAiB,GAEpD,OAAO,OAAQ,IAAI,EAAE,UAAU,cAAc,GAC7C,OAAO,OAAQ,IAAI,EAAE,UAAU,KAAK;AAAA,IACtC,CAAC,GAED,GAAG,mDAAmD,YAAY;AAehE,YAAM,SAAS,MAAM,yBAdR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAcuC,gBAAgB;AACpE,aAAO,MAAM,EAAE,YAAY,GAE3B,OAAO,OAAQ,IAAI,EAAE,IAAI,UAAU,iBAAiB;AAAA,IACtD,CAAC,GAED,GAAG,yDAAyD,YAAY;AAetE,YAAM,SAAS,MAAM,yBAdR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAcuC,gBAAgB;AACpE,aAAO,MAAM,EAAE,YAAY,GAE3B,OAAO,OAAQ,IAAI,EAAE,IAAI,UAAU,iBAAiB;AAAA,IACtD,CAAC,GAED,GAAG,qEAAqE,YAAY;AAgBlF,YAAM,SAAS,MAAM,yBAfR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAeuC,gBAAgB;AACpE,aAAO,MAAM,EAAE,YAAY,GAE3B,OAAO,OAAQ,IAAI,EAAE,IAAI,UAAU,iBAAiB,GAEpD,OAAO,OAAQ,IAAI,EAAE,UAAU,YAAY;AAAA,IAC7C,CAAC,GAED,GAAG,sDAAsD,YAAY;AAanE,YAAM,SAAS,MAAM,yBAZR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAYuC,iBAAiB;AACrE,aAAO,MAAM,EAAE,YAAY,GAC3B,OAAO,OAAQ,IAAI,EAAE,IAAI,UAAU,iBAAiB;AAAA,IACtD,CAAC,GAED,GAAG,qEAAqE,YAAY;AAQlF,YAAM,SAAS,MAAM,yBAPR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAOuC,gBAAgB;AACpE,aAAO,MAAM,EAAE,cAAc;AAAA,IAC/B,CAAC,GAED,GAAG,6DAA6D,YAAY;AAc1E,YAAM,SAAS,MAAM,
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["describe","expect","it","transformTreeShakeClient","result","toBeDefined","code","not","toContain","toBeUndefined"],"sources":["../../../../src/vite/plugins/clientTreeShakePlugin.test.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,QAAA,EAAUC,MAAA,EAAQC,EAAA,QAAU;AACrC,SAASC,wBAAA,QAAgC;AAEzCH,QAAA,CAAS,yBAAyB,MAAM;EACtCA,QAAA,CAAS,4BAA4B,MAAM;IACzCE,EAAA,CAAG,+CAA+C,YAAY;MAe5D,MAAME,MAAA,GAAS,MAAMD,wBAAA,CAdR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAcuC,gBAAgB;MACpEF,MAAA,CAAOG,MAAM,EAAEC,WAAA,CAAY,GAE3BJ,MAAA,CAAOG,MAAA,CAAQE,IAAI,EAAEC,GAAA,CAAIC,SAAA,CAAU,iBAAiB,GAEpDP,MAAA,CAAOG,MAAA,CAAQE,IAAI,EAAEE,SAAA,CAAU,cAAc,GAC7CP,MAAA,CAAOG,MAAA,CAAQE,IAAI,EAAEE,SAAA,CAAU,KAAK;IACtC,CAAC,GAEDN,EAAA,CAAG,mDAAmD,YAAY;MAehE,MAAME,MAAA,GAAS,MAAMD,wBAAA,CAdR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAcuC,gBAAgB;MACpEF,MAAA,CAAOG,MAAM,EAAEC,WAAA,CAAY,GAE3BJ,MAAA,CAAOG,MAAA,CAAQE,IAAI,EAAEC,GAAA,CAAIC,SAAA,CAAU,iBAAiB;IACtD,CAAC,GAEDN,EAAA,CAAG,yDAAyD,YAAY;MAetE,MAAME,MAAA,GAAS,MAAMD,wBAAA,CAdR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAcuC,gBAAgB;MACpEF,MAAA,CAAOG,MAAM,EAAEC,WAAA,CAAY,GAE3BJ,MAAA,CAAOG,MAAA,CAAQE,IAAI,EAAEC,GAAA,CAAIC,SAAA,CAAU,iBAAiB;IACtD,CAAC,GAEDN,EAAA,CAAG,qEAAqE,YAAY;MAgBlF,MAAME,MAAA,GAAS,MAAMD,wBAAA,CAfR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAeuC,gBAAgB;MACpEF,MAAA,CAAOG,MAAM,EAAEC,WAAA,CAAY,GAE3BJ,MAAA,CAAOG,MAAA,CAAQE,IAAI,EAAEC,GAAA,CAAIC,SAAA,CAAU,iBAAiB,GAEpDP,MAAA,CAAOG,MAAA,CAAQE,IAAI,EAAEE,SAAA,CAAU,YAAY;IAC7C,CAAC,GAEDN,EAAA,CAAG,sDAAsD,YAAY;MAanE,MAAME,MAAA,GAAS,MAAMD,wBAAA,CAZR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAYuC,iBAAiB;MACrEF,MAAA,CAAOG,MAAM,EAAEC,WAAA,CAAY,GAC3BJ,MAAA,CAAOG,MAAA,CAAQE,IAAI,EAAEC,GAAA,CAAIC,SAAA,CAAU,iBAAiB;IACtD,CAAC,GAEDN,EAAA,CAAG,qEAAqE,YAAY;MAQlF,MAAME,MAAA,GAAS,MAAMD,wBAAA,CAPR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAOuC,gBAAgB;MACpEF,MAAA,CAAOG,MAAM,EAAEK,aAAA,CAAc;IAC/B,CAAC,GAEDP,EAAA,CAAG,6DAA6D,YAAY;MAc1E,MAAME,MAAA,GAAS,MAAMD,wBAAA,CAbR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,
|
|
1
|
+
{"version":3,"names":["describe","expect","it","transformTreeShakeClient","result","toBeDefined","code","not","toContain","toBeUndefined"],"sources":["../../../../src/vite/plugins/clientTreeShakePlugin.test.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["describe","expect","it","transformTreeShakeClient","code","result","toBeDefined","not","toContain","toBeUndefined","sourceCode"],"sources":["../../../../src/vite/plugins/clientTreeShakePlugin.test.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,QAAA,EAAUC,MAAA,EAAQC,EAAA,QAAU;AACrC,SAASC,wBAAA,QAAgC;AAEzCH,QAAA,CAAS,yBAAyB,YAAM;EACtCA,QAAA,CAAS,4BAA4B,YAAM;IACzCE,EAAA,CAAG,+CAA+C,kBAAY;MAe5D,IAAAE,IAAM;AAdO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;QAcuCC,MAAA,SAAAF,wBAAgB,CAAAC,IAAA;MACpEH,MAAA,CAAOI,MAAM,EAAEC,WAAA,CAAY,GAE3BL,MAAA,CAAOI,MAAA,CAAQD,IAAI,EAAEG,GAAA,CAAIC,SAAA,CAAU,iBAAiB,GAEpDP,MAAA,CAAOI,MAAA,CAAQD,IAAI,EAAEI,SAAA,CAAU,cAAc,GAC7CP,MAAA,CAAOI,MAAA,CAAQD,IAAI,EAAEI,SAAA,CAAU,KAAK;IACtC,CAAC,GAEDN,EAAA,CAAG,mDAAmD,kBAAY;MAehE,IAAAE,IAAM;AAdO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;QAcuCC,MAAA,SAAAF,wBAAgB,CAAAC,IAAA;MACpEH,MAAA,CAAOI,MAAM,EAAEC,WAAA,CAAY,GAE3BL,MAAA,CAAOI,MAAA,CAAQD,IAAI,EAAEG,GAAA,CAAIC,SAAA,CAAU,iBAAiB;IACtD,CAAC,GAEDN,EAAA,CAAG,yDAAyD,kBAAY;MAetE,IAAAE,IAAM;AAdO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;QAcuCC,MAAA,SAAAF,wBAAgB,CAAAC,IAAA;MACpEH,MAAA,CAAOI,MAAM,EAAEC,WAAA,CAAY,GAE3BL,MAAA,CAAOI,MAAA,CAAQD,IAAI,EAAEG,GAAA,CAAIC,SAAA,CAAU,iBAAiB;IACtD,CAAC,GAEDN,EAAA,CAAG,qEAAqE,kBAAY;MAgBlF,IAAAE,IAAM;AAfO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;QAeuCC,MAAA,SAAAF,wBAAgB,CAAAC,IAAA;MACpEH,MAAA,CAAOI,MAAM,EAAEC,WAAA,CAAY,GAE3BL,MAAA,CAAOI,MAAA,CAAQD,IAAI,EAAEG,GAAA,CAAIC,SAAA,CAAU,iBAAiB,GAEpDP,MAAA,CAAOI,MAAA,CAAQD,IAAI,EAAEI,SAAA,CAAU,YAAY;IAC7C,CAAC,GAEDN,EAAA,CAAG,sDAAsD,kBAAY;MAanE,IAAAE,IAAM;AAZO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;QAYuCC,MAAA,SAAAF,wBAAiB,CAAAC,IAAA;MACrEH,MAAA,CAAOI,MAAM,EAAEC,WAAA,CAAY,GAC3BL,MAAA,CAAOI,MAAA,CAAQD,IAAI,EAAEG,GAAA,CAAIC,SAAA,CAAU,iBAAiB;IACtD,CAAC,GAEDN,EAAA,CAAG,qEAAqE,kBAAY;MAQlF,IAAAE,IAAM;AAPO;AAAA;AAAA;AAAA;AAAA;AAAA;QAOuCC,MAAA,SAAAF,wBAAgB,CAAAC,IAAA;MACpEH,MAAA,CAAOI,MAAM,EAAEI,aAAA,CAAc;IAC/B,CAAC,GAEDP,EAAA,CAAG,6DAA6D,kBAAY;MAc1E,IAAAE,IAAM;
|
|
1
|
+
{"version":3,"names":["describe","expect","it","transformTreeShakeClient","code","result","toBeDefined","not","toContain","toBeUndefined","sourceCode"],"sources":["../../../../src/vite/plugins/clientTreeShakePlugin.test.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,QAAA,EAAUC,MAAA,EAAQC,EAAA,QAAU;AACrC,SAASC,wBAAA,QAAgC;AAEzCH,QAAA,CAAS,yBAAyB,YAAM;EACtCA,QAAA,CAAS,4BAA4B,YAAM;IACzCE,EAAA,CAAG,+CAA+C,kBAAY;MAe5D,IAAAE,IAAM;AAdO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;QAcuCC,MAAA,SAAAF,wBAAgB,CAAAC,IAAA;MACpEH,MAAA,CAAOI,MAAM,EAAEC,WAAA,CAAY,GAE3BL,MAAA,CAAOI,MAAA,CAAQD,IAAI,EAAEG,GAAA,CAAIC,SAAA,CAAU,iBAAiB,GAEpDP,MAAA,CAAOI,MAAA,CAAQD,IAAI,EAAEI,SAAA,CAAU,cAAc,GAC7CP,MAAA,CAAOI,MAAA,CAAQD,IAAI,EAAEI,SAAA,CAAU,KAAK;IACtC,CAAC,GAEDN,EAAA,CAAG,mDAAmD,kBAAY;MAehE,IAAAE,IAAM;AAdO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;QAcuCC,MAAA,SAAAF,wBAAgB,CAAAC,IAAA;MACpEH,MAAA,CAAOI,MAAM,EAAEC,WAAA,CAAY,GAE3BL,MAAA,CAAOI,MAAA,CAAQD,IAAI,EAAEG,GAAA,CAAIC,SAAA,CAAU,iBAAiB;IACtD,CAAC,GAEDN,EAAA,CAAG,yDAAyD,kBAAY;MAetE,IAAAE,IAAM;AAdO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;QAcuCC,MAAA,SAAAF,wBAAgB,CAAAC,IAAA;MACpEH,MAAA,CAAOI,MAAM,EAAEC,WAAA,CAAY,GAE3BL,MAAA,CAAOI,MAAA,CAAQD,IAAI,EAAEG,GAAA,CAAIC,SAAA,CAAU,iBAAiB;IACtD,CAAC,GAEDN,EAAA,CAAG,qEAAqE,kBAAY;MAgBlF,IAAAE,IAAM;AAfO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;QAeuCC,MAAA,SAAAF,wBAAgB,CAAAC,IAAA;MACpEH,MAAA,CAAOI,MAAM,EAAEC,WAAA,CAAY,GAE3BL,MAAA,CAAOI,MAAA,CAAQD,IAAI,EAAEG,GAAA,CAAIC,SAAA,CAAU,iBAAiB,GAEpDP,MAAA,CAAOI,MAAA,CAAQD,IAAI,EAAEI,SAAA,CAAU,YAAY;IAC7C,CAAC,GAEDN,EAAA,CAAG,sDAAsD,kBAAY;MAanE,IAAAE,IAAM;AAZO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;QAYuCC,MAAA,SAAAF,wBAAiB,CAAAC,IAAA;MACrEH,MAAA,CAAOI,MAAM,EAAEC,WAAA,CAAY,GAC3BL,MAAA,CAAOI,MAAA,CAAQD,IAAI,EAAEG,GAAA,CAAIC,SAAA,CAAU,iBAAiB;IACtD,CAAC,GAEDN,EAAA,CAAG,qEAAqE,kBAAY;MAQlF,IAAAE,IAAM;AAPO;AAAA;AAAA;AAAA;AAAA;AAAA;QAOuCC,MAAA,SAAAF,wBAAgB,CAAAC,IAAA;MACpEH,MAAA,CAAOI,MAAM,EAAEI,aAAA,CAAc;IAC/B,CAAC,GAEDP,EAAA,CAAG,6DAA6D,kBAAY;MAc1E,IAAAE,IAAM;AAAe;AAbR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;QAAAC,MAAA,SAAAF,wBAAA,CAAAC,IAAA;MAAAH,MAAA,CAAAI,MAAA,EAAAC,WAAA,IAAAL,MAAA,CAAAI,MAAA,CAAAD,IAAA,EAAAI,SAAA,uDAAAP,MAAA,CAAAI,MAAA,CAAAD,IAAA,EAAAG,GAAA,CAAAC,SAAA;IAAA,IAeXN,EAAA;MAAA,IACAE,IAAA;AAAA;AAEF;AAGqD;AAiBrD;AAAqB;AAbR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;QAAAC,MAAA,SAAAF,wBAAA,CAAAC,IAAA;MAAAH,MAAA,CAAAI,MAAA,EAAAC,WAAA,IAAAL,MAAA,CAAAI,MAAA,CAAAD,IAAA,EAAAI,SAAA;IAAA,IAAAN,EAAA;MAAA,IAAAE,IAAA;AAAA;AAAA;AAAA;AAeX;AACA;AAEF;AACmF;AAiBnF;AAba;AAAA;AAAA;AAAA;QAAAC,MAAA,SAAAF,wBAAA,CAAAC,IAAA;MAAAH,MAAA,CAAAI,MAAA,EAAAC,WAAA,IAAAL,MAAA,CAAAI,MAAA,CAAAD,IAAA,EAAAI,SAAA;IAAA,IAAAN,EAAA;MAAA,IAAAE,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAcb;AACiD;AAiBjD;AAAqB;AAXR;QAAAC,MAAA,SAAAF,wBAAA,CAAAC,IAAA;MAAAH,MAAA,CAAAI,MAAA,EAAAI,aAAA;IAAA,IAAAP,EAAA;MAAA,IAAAQ,UAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAaX;AACA;AAEF;QAAAL,MAAA,SAAOF,wBAAsB,CAAAO,UAAA;MAC9BT,MAEE,CAAAI,MAAA,EAAAC,WAAA,IAAAL,MAAA,CAAAI,MAAA,CAAAD,IAAA,EAAAG,GAAA,CAAAC,SAAA,oBAA6EP,MAAA,CAAAI,MAAY,CAAAD,IAAA,EAAAI,SAAA,wBAAAP,MAAA,CAAAI,MAAA,CAAAD,IAAA,EAAAI,SAAA;IAc1F,IAAAN,EAAA,oDAAqB;MAAA,IAXFE,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;QAAAC,MAAA,SAAAF,wBAAA,CAAAC,IAAA;MAAAH,MAAA,CAAAI,MAAA,EAAAI,aAAA;IAAA,IAAAP,EAAA;MAAA,IAAAE,IAAA;AAAA;AAajB;AACA;AAEF;AAMqB;AACnB;AACF;AAaA;AAAqB;AARR;AAAA;AAAA;AAAA;AAAA;QAAAC,MAAA,SAAAF,wBAAA,CAAAC,IAAA;MAAAH,MAAA,CAAAI,MAAA,EAAAC,WAAA,IAAAL,MAAA,CAAAI,MAAA,CAAAD,IAAA,EAAAI,SAAA,eAAAP,MAAA,CAAAI,MAAA,CAAAD,IAAA,EAAAG,GAAA,CAAAC,SAAA;IAAA,IAAAN,EAAA;MAAA,IAUXE,IAAA;AAAA;AACA;AAEF;AAA6B;AAmB7B;AAfa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;QAAAC,MAAA,SAAAF,wBAAA,CAAAC,IAAA;MAAAH,MAAA,CAAAI,MAAA,EAAAC,WAAA,IAAAL,MAAA,CAAAI,MAAA,CAAAD,IAAA,EAAAI,SAAA,qBAAAP,MAAA,CAAAI,MAAA,CAAAD,IAAA,EAAAG,GAAA,CAAAC,SAAA;IAAA;EAAA;AAAA","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "one",
|
|
3
|
-
"version": "1.9.
|
|
3
|
+
"version": "1.9.10",
|
|
4
4
|
"license": "BSD-3-Clause",
|
|
5
5
|
"sideEffects": [
|
|
6
6
|
"setup.mjs",
|
|
@@ -154,17 +154,17 @@
|
|
|
154
154
|
"@react-navigation/routers": "~7.5.1",
|
|
155
155
|
"@swc/core": "^1.14.0",
|
|
156
156
|
"@ungap/structured-clone": "^1.2.0",
|
|
157
|
-
"@vxrn/color-scheme": "1.9.
|
|
158
|
-
"@vxrn/compiler": "1.9.
|
|
159
|
-
"@vxrn/resolve": "1.9.
|
|
160
|
-
"@vxrn/tslib-lite": "1.9.
|
|
161
|
-
"@vxrn/use-isomorphic-layout-effect": "1.9.
|
|
162
|
-
"@vxrn/vite-plugin-metro": "1.9.
|
|
157
|
+
"@vxrn/color-scheme": "1.9.10",
|
|
158
|
+
"@vxrn/compiler": "1.9.10",
|
|
159
|
+
"@vxrn/resolve": "1.9.10",
|
|
160
|
+
"@vxrn/tslib-lite": "1.9.10",
|
|
161
|
+
"@vxrn/use-isomorphic-layout-effect": "1.9.10",
|
|
162
|
+
"@vxrn/vite-plugin-metro": "1.9.10",
|
|
163
163
|
"babel-dead-code-elimination": "1.0.10",
|
|
164
164
|
"babel-plugin-module-resolver": "^5.0.2",
|
|
165
165
|
"citty": "^0.1.6",
|
|
166
166
|
"core-js": "^3.38.1",
|
|
167
|
-
"create-vxrn": "1.9.
|
|
167
|
+
"create-vxrn": "1.9.10",
|
|
168
168
|
"escape-string-regexp": "^5.0.0",
|
|
169
169
|
"expo-linking": "~8.0.8",
|
|
170
170
|
"expo-modules-core": "~3.0.24",
|
|
@@ -189,7 +189,7 @@
|
|
|
189
189
|
"use-latest-callback": "^0.2.3",
|
|
190
190
|
"vite": "^7.1.12",
|
|
191
191
|
"vite-tsconfig-paths": "^6.0.5",
|
|
192
|
-
"vxrn": "1.9.
|
|
192
|
+
"vxrn": "1.9.10",
|
|
193
193
|
"ws": "^8.18.0",
|
|
194
194
|
"xxhashjs": "^0.2.2"
|
|
195
195
|
},
|
package/src/router/router.ts
CHANGED
|
@@ -1005,13 +1005,23 @@ export async function linkTo(
|
|
|
1005
1005
|
|
|
1006
1006
|
setLoadingState('loading')
|
|
1007
1007
|
|
|
1008
|
-
|
|
1009
|
-
|
|
1008
|
+
const normalizedPreloadPath = normalizeLoaderPath(href)
|
|
1009
|
+
|
|
1010
|
+
// sync fast path: skip async preload when data is already cached
|
|
1011
|
+
// (e.g., from hover/viewport/intent prefetching via PreloadLinks)
|
|
1012
|
+
if (!(normalizedPreloadPath in preloadedLoaderData) && !(href in preloadedLoaderData)) {
|
|
1013
|
+
await preloadRoute(href, true)
|
|
1014
|
+
} else if (process.env.NODE_ENV !== 'development') {
|
|
1015
|
+
// cached data in prod: still inject CSS (non-blocking so we don't delay nav)
|
|
1016
|
+
const inject = cssInjectFunctions[href]
|
|
1017
|
+
if (inject) {
|
|
1018
|
+
inject().catch(() => {})
|
|
1019
|
+
}
|
|
1020
|
+
}
|
|
1010
1021
|
|
|
1011
1022
|
// detect loader redirect signal before proceeding with navigation
|
|
1012
1023
|
// this handles the case where a server loader returned redirect() during
|
|
1013
1024
|
// a client-side navigation — we navigate to the redirect target instead
|
|
1014
|
-
const normalizedPreloadPath = normalizeLoaderPath(href)
|
|
1015
1025
|
const preloadResult = preloadedLoaderData[normalizedPreloadPath]
|
|
1016
1026
|
if (preloadResult?.__oneRedirect) {
|
|
1017
1027
|
const redirectTarget = preloadResult.__oneRedirect
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest'
|
|
2
|
+
import { getServerManifest } from './getServerManifest'
|
|
3
|
+
import type { RouteNode } from '../router/Route'
|
|
4
|
+
|
|
5
|
+
function makeRouteNode(overrides: Partial<RouteNode>): RouteNode {
|
|
6
|
+
return {
|
|
7
|
+
loadRoute: () => ({}),
|
|
8
|
+
contextKey: '',
|
|
9
|
+
route: '',
|
|
10
|
+
children: [],
|
|
11
|
+
dynamic: null,
|
|
12
|
+
type: 'ssg',
|
|
13
|
+
...overrides,
|
|
14
|
+
} as RouteNode
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
describe('getServerManifest route specificity', () => {
|
|
18
|
+
it('static segment /blog/[slug] should come before fully dynamic /[a]/[b]', () => {
|
|
19
|
+
// simulates: (site)/blog/[slug]+ssg.tsx vs (chat)/[serverId]/[channelId]/index.tsx
|
|
20
|
+
const root = makeRouteNode({
|
|
21
|
+
route: '',
|
|
22
|
+
children: [
|
|
23
|
+
// group (site) with blog/[slug]
|
|
24
|
+
makeRouteNode({
|
|
25
|
+
route: '(site)',
|
|
26
|
+
children: [
|
|
27
|
+
makeRouteNode({
|
|
28
|
+
route: 'blog/[slug]',
|
|
29
|
+
contextKey: '(site)/blog/[slug]+ssg.tsx',
|
|
30
|
+
type: 'ssg',
|
|
31
|
+
dynamic: [{ name: 'slug', deep: false }],
|
|
32
|
+
children: [],
|
|
33
|
+
}),
|
|
34
|
+
],
|
|
35
|
+
}),
|
|
36
|
+
// group (chat) with [serverId]/[channelId]
|
|
37
|
+
makeRouteNode({
|
|
38
|
+
route: '(chat)',
|
|
39
|
+
children: [
|
|
40
|
+
makeRouteNode({
|
|
41
|
+
route: '[serverId]',
|
|
42
|
+
dynamic: [{ name: 'serverId', deep: false }],
|
|
43
|
+
children: [
|
|
44
|
+
makeRouteNode({
|
|
45
|
+
route: '[channelId]',
|
|
46
|
+
dynamic: [{ name: 'channelId', deep: false }],
|
|
47
|
+
children: [
|
|
48
|
+
makeRouteNode({
|
|
49
|
+
route: 'index',
|
|
50
|
+
contextKey: '(chat)/[serverId]/[channelId]/index.tsx',
|
|
51
|
+
type: 'spa',
|
|
52
|
+
children: [],
|
|
53
|
+
}),
|
|
54
|
+
],
|
|
55
|
+
}),
|
|
56
|
+
],
|
|
57
|
+
}),
|
|
58
|
+
],
|
|
59
|
+
}),
|
|
60
|
+
],
|
|
61
|
+
})
|
|
62
|
+
|
|
63
|
+
const manifest = getServerManifest(root)
|
|
64
|
+
const pages = manifest.pageRoutes.map((r) => r.file)
|
|
65
|
+
|
|
66
|
+
const blogIdx = pages.indexOf('(site)/blog/[slug]+ssg.tsx')
|
|
67
|
+
const chatIdx = pages.indexOf('(chat)/[serverId]/[channelId]/index.tsx')
|
|
68
|
+
|
|
69
|
+
expect(blogIdx).toBeGreaterThanOrEqual(0)
|
|
70
|
+
expect(chatIdx).toBeGreaterThanOrEqual(0)
|
|
71
|
+
// blog route (static first segment) must come before chat route (all dynamic)
|
|
72
|
+
expect(blogIdx).toBeLessThan(chatIdx)
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
it('/blog should come before /[slug]', () => {
|
|
76
|
+
const root = makeRouteNode({
|
|
77
|
+
route: '',
|
|
78
|
+
children: [
|
|
79
|
+
makeRouteNode({
|
|
80
|
+
route: 'blog',
|
|
81
|
+
contextKey: 'blog.tsx',
|
|
82
|
+
type: 'ssg',
|
|
83
|
+
children: [],
|
|
84
|
+
}),
|
|
85
|
+
makeRouteNode({
|
|
86
|
+
route: '[slug]',
|
|
87
|
+
contextKey: '[slug].tsx',
|
|
88
|
+
type: 'ssr',
|
|
89
|
+
dynamic: [{ name: 'slug', deep: false }],
|
|
90
|
+
children: [],
|
|
91
|
+
}),
|
|
92
|
+
],
|
|
93
|
+
})
|
|
94
|
+
|
|
95
|
+
const manifest = getServerManifest(root)
|
|
96
|
+
const pages = manifest.pageRoutes.map((r) => r.file)
|
|
97
|
+
expect(pages.indexOf('blog.tsx')).toBeLessThan(pages.indexOf('[slug].tsx'))
|
|
98
|
+
})
|
|
99
|
+
|
|
100
|
+
it('/blog/hello-world should match blog route first, not [serverId]/[channelId]', () => {
|
|
101
|
+
const root = makeRouteNode({
|
|
102
|
+
route: '',
|
|
103
|
+
children: [
|
|
104
|
+
makeRouteNode({
|
|
105
|
+
route: '(site)',
|
|
106
|
+
children: [
|
|
107
|
+
makeRouteNode({
|
|
108
|
+
route: 'blog/[slug]',
|
|
109
|
+
contextKey: '(site)/blog/[slug]+ssg.tsx',
|
|
110
|
+
type: 'ssg',
|
|
111
|
+
dynamic: [{ name: 'slug', deep: false }],
|
|
112
|
+
children: [],
|
|
113
|
+
}),
|
|
114
|
+
],
|
|
115
|
+
}),
|
|
116
|
+
makeRouteNode({
|
|
117
|
+
route: '(chat)',
|
|
118
|
+
children: [
|
|
119
|
+
makeRouteNode({
|
|
120
|
+
route: '[serverId]',
|
|
121
|
+
dynamic: [{ name: 'serverId', deep: false }],
|
|
122
|
+
children: [
|
|
123
|
+
makeRouteNode({
|
|
124
|
+
route: '[channelId]',
|
|
125
|
+
dynamic: [{ name: 'channelId', deep: false }],
|
|
126
|
+
children: [
|
|
127
|
+
makeRouteNode({
|
|
128
|
+
route: 'index',
|
|
129
|
+
contextKey: '(chat)/[serverId]/[channelId]/index.tsx',
|
|
130
|
+
type: 'spa',
|
|
131
|
+
children: [],
|
|
132
|
+
}),
|
|
133
|
+
],
|
|
134
|
+
}),
|
|
135
|
+
],
|
|
136
|
+
}),
|
|
137
|
+
],
|
|
138
|
+
}),
|
|
139
|
+
],
|
|
140
|
+
})
|
|
141
|
+
|
|
142
|
+
const manifest = getServerManifest(root)
|
|
143
|
+
|
|
144
|
+
// find first matching route for /blog/hello-world
|
|
145
|
+
const pathname = '/blog/hello-world'
|
|
146
|
+
const matched = manifest.pageRoutes.find((route) => {
|
|
147
|
+
return new RegExp(route.namedRegex).test(pathname)
|
|
148
|
+
})
|
|
149
|
+
|
|
150
|
+
expect(matched?.file).toBe('(site)/blog/[slug]+ssg.tsx')
|
|
151
|
+
})
|
|
152
|
+
|
|
153
|
+
it('[slug] should come before [...catchAll]', () => {
|
|
154
|
+
const root = makeRouteNode({
|
|
155
|
+
route: '',
|
|
156
|
+
children: [
|
|
157
|
+
makeRouteNode({
|
|
158
|
+
route: '[...catchAll]',
|
|
159
|
+
contextKey: '[...catchAll].tsx',
|
|
160
|
+
type: 'ssr',
|
|
161
|
+
dynamic: [{ name: 'catchAll', deep: true }],
|
|
162
|
+
children: [],
|
|
163
|
+
}),
|
|
164
|
+
makeRouteNode({
|
|
165
|
+
route: '[slug]',
|
|
166
|
+
contextKey: '[slug].tsx',
|
|
167
|
+
type: 'ssr',
|
|
168
|
+
dynamic: [{ name: 'slug', deep: false }],
|
|
169
|
+
children: [],
|
|
170
|
+
}),
|
|
171
|
+
],
|
|
172
|
+
})
|
|
173
|
+
|
|
174
|
+
const manifest = getServerManifest(root)
|
|
175
|
+
const pages = manifest.pageRoutes.map((r) => r.file)
|
|
176
|
+
expect(pages.indexOf('[slug].tsx')).toBeLessThan(pages.indexOf('[...catchAll].tsx'))
|
|
177
|
+
})
|
|
178
|
+
})
|
|
@@ -11,7 +11,6 @@
|
|
|
11
11
|
|
|
12
12
|
import { getContextKey, matchGroupName } from '../router/matchers'
|
|
13
13
|
import type { RouteNode } from '../router/Route'
|
|
14
|
-
import { sortRoutes } from '../router/sortRoutes'
|
|
15
14
|
import type { One, RouteInfo } from '../vite/types'
|
|
16
15
|
|
|
17
16
|
// TODO: Share these types across cli, server, router, etc.
|
|
@@ -41,6 +40,55 @@ function isNotFoundRoute(route: RouteNode) {
|
|
|
41
40
|
return Boolean(route.dynamic && route.dynamic[route.dynamic.length - 1].notFound)
|
|
42
41
|
}
|
|
43
42
|
|
|
43
|
+
// sort flattened routes by URL pattern specificity so more specific routes match first
|
|
44
|
+
// compares segment-by-segment: static > [param] > [...catchAll] > +not-found
|
|
45
|
+
function sortByPathSpecificity(
|
|
46
|
+
[keyA, nodeA]: [string, RouteNode],
|
|
47
|
+
[keyB, nodeB]: [string, RouteNode]
|
|
48
|
+
): number {
|
|
49
|
+
const partsA = keyA.split('/').filter(Boolean)
|
|
50
|
+
const partsB = keyB.split('/').filter(Boolean)
|
|
51
|
+
|
|
52
|
+
const minLen = Math.min(partsA.length, partsB.length)
|
|
53
|
+
for (let i = 0; i < minLen; i++) {
|
|
54
|
+
const aIsDynamic = partsA[i].startsWith('[') || partsA[i] === '+not-found'
|
|
55
|
+
const bIsDynamic = partsB[i].startsWith('[') || partsB[i] === '+not-found'
|
|
56
|
+
|
|
57
|
+
// static beats dynamic
|
|
58
|
+
if (!aIsDynamic && bIsDynamic) return -1
|
|
59
|
+
if (aIsDynamic && !bIsDynamic) return 1
|
|
60
|
+
|
|
61
|
+
// both dynamic: single param beats catch-all/not-found
|
|
62
|
+
if (aIsDynamic && bIsDynamic) {
|
|
63
|
+
const aIsCatchAll = partsA[i].startsWith('[...') || partsA[i] === '+not-found'
|
|
64
|
+
const bIsCatchAll = partsB[i].startsWith('[...') || partsB[i] === '+not-found'
|
|
65
|
+
if (!aIsCatchAll && bIsCatchAll) return -1
|
|
66
|
+
if (aIsCatchAll && !bIsCatchAll) return 1
|
|
67
|
+
|
|
68
|
+
// both catch-all: not-found goes last
|
|
69
|
+
if (aIsCatchAll && bIsCatchAll) {
|
|
70
|
+
const aNotFound = partsA[i] === '+not-found'
|
|
71
|
+
const bNotFound = partsB[i] === '+not-found'
|
|
72
|
+
if (aNotFound && !bNotFound) return 1
|
|
73
|
+
if (!aNotFound && bNotFound) return -1
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// more segments = more specific
|
|
79
|
+
if (partsA.length !== partsB.length) {
|
|
80
|
+
return partsB.length - partsA.length
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// not-found routes last
|
|
84
|
+
const aNotFound = isNotFoundRoute(nodeA)
|
|
85
|
+
const bNotFound = isNotFoundRoute(nodeB)
|
|
86
|
+
if (aNotFound && !bNotFound) return 1
|
|
87
|
+
if (!aNotFound && bNotFound) return -1
|
|
88
|
+
|
|
89
|
+
return 0
|
|
90
|
+
}
|
|
91
|
+
|
|
44
92
|
// Given a nested route tree, return a flattened array of all routes that can be matched.
|
|
45
93
|
export function getServerManifest(route: RouteNode): OneRouterServerManifestV1 {
|
|
46
94
|
function getFlatNodes(route: RouteNode, layouts?: RouteNode[]): [string, RouteNode][] {
|
|
@@ -76,9 +124,8 @@ export function getServerManifest(route: RouteNode): OneRouterServerManifestV1 {
|
|
|
76
124
|
// TODO this could be a lot faster if not functional:
|
|
77
125
|
|
|
78
126
|
// Remove duplicates from the runtime manifest which expands array syntax.
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
.reverse()
|
|
127
|
+
// sort by URL pattern specificity so static segments beat dynamic ones at each position
|
|
128
|
+
const flat = getFlatNodes(route).sort(sortByPathSpecificity)
|
|
82
129
|
|
|
83
130
|
// warn on having multiple routes with the same path!
|
|
84
131
|
const pathToRoute: Record<string, RouteNode> = {}
|
package/src/useLoader.ts
CHANGED
|
@@ -4,7 +4,11 @@ import { useParams, usePathname } from './hooks'
|
|
|
4
4
|
import { findNearestNotFoundRoute, setNotFoundState } from './notFoundState'
|
|
5
5
|
import { router } from './router/imperative-api'
|
|
6
6
|
import { preloadedLoaderData, preloadingLoader, routeNode } from './router/router'
|
|
7
|
-
import {
|
|
7
|
+
import {
|
|
8
|
+
subscribeToClientMatches,
|
|
9
|
+
getClientMatchesSnapshot,
|
|
10
|
+
updateMatchLoaderData,
|
|
11
|
+
} from './useMatches'
|
|
8
12
|
import { getLoaderPath } from './utils/cleanUrl'
|
|
9
13
|
import { dynamicImport } from './utils/dynamicImport'
|
|
10
14
|
import { weakKey } from './utils/weakKey'
|
|
@@ -243,7 +247,10 @@ if (process.env.NODE_ENV === 'development' && typeof window !== 'undefined') {
|
|
|
243
247
|
* dedicated per-layout refetch endpoint would be needed to truly re-run a layout
|
|
244
248
|
* loader in isolation; that can be added in a follow-up.
|
|
245
249
|
*/
|
|
246
|
-
export async function refetchMatchLoader(
|
|
250
|
+
export async function refetchMatchLoader(
|
|
251
|
+
routeId: string,
|
|
252
|
+
currentPath: string
|
|
253
|
+
): Promise<void> {
|
|
247
254
|
const cacheBust = `${Date.now()}`
|
|
248
255
|
const loaderJSUrl = getLoaderPath(currentPath, true, cacheBust)
|
|
249
256
|
|
|
@@ -314,10 +321,12 @@ export function useLoaderState<
|
|
|
314
321
|
|
|
315
322
|
// detect if the loader stub returns a routeId string (set by clientTreeShakePlugin)
|
|
316
323
|
// this enables looking up data from the matches array (needed for layout loaders)
|
|
317
|
-
const matchRouteId = loader
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
324
|
+
const matchRouteId = loader
|
|
325
|
+
? (() => {
|
|
326
|
+
const result = loader()
|
|
327
|
+
return typeof result === 'string' && result.startsWith('./') ? result : null
|
|
328
|
+
})()
|
|
329
|
+
: null
|
|
321
330
|
|
|
322
331
|
// subscribe to clientMatches changes so refetch triggers re-render
|
|
323
332
|
const clientMatches = useSyncExternalStore(
|
package/src/useMatches.ts
CHANGED
|
@@ -37,7 +37,9 @@ export function setClientMatches(matches: RouteMatch[]) {
|
|
|
37
37
|
* @internal
|
|
38
38
|
*/
|
|
39
39
|
export function updateMatchLoaderData(routeId: string, loaderData: unknown) {
|
|
40
|
-
clientMatches = clientMatches.map((m) =>
|
|
40
|
+
clientMatches = clientMatches.map((m) =>
|
|
41
|
+
m.routeId === routeId ? { ...m, loaderData } : m
|
|
42
|
+
)
|
|
41
43
|
for (const listener of clientMatchesListeners) {
|
|
42
44
|
listener()
|
|
43
45
|
}
|