@takazudo/zfb-runtime 0.1.0-next.7 → 0.1.0-next.70
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/CHANGELOG.md +6 -0
- package/README.md +139 -6
- package/dist/client-router/events.d.ts.map +1 -1
- package/dist/client-router/events.js +2 -2
- package/dist/client-router/events.js.map +1 -1
- package/dist/client-router/index.js +0 -1
- package/dist/client-router/index.js.map +1 -1
- package/dist/client-router/prefetch.d.ts.map +1 -1
- package/dist/client-router/prefetch.js +107 -53
- package/dist/client-router/prefetch.js.map +1 -1
- package/dist/client-router/router.d.ts.map +1 -1
- package/dist/client-router/router.js +206 -19
- package/dist/client-router/router.js.map +1 -1
- package/dist/client-router/swap-functions.d.ts.map +1 -1
- package/dist/client-router/swap-functions.js +36 -4
- package/dist/client-router/swap-functions.js.map +1 -1
- package/dist/client-router.d.ts +21 -1
- package/dist/client-router.d.ts.map +1 -1
- package/dist/client-router.js +46 -20
- package/dist/client-router.js.map +1 -1
- package/dist/router.d.ts +17 -0
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +171 -33
- package/dist/router.js.map +1 -1
- package/package.json +12 -4
- package/dist/client-router/cssesc.d.ts +0 -9
- package/dist/client-router/cssesc.d.ts.map +0 -1
- package/dist/client-router/cssesc.js +0 -95
- package/dist/client-router/cssesc.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
> **Newer releases:** see https://takazudomodular.com/pj/zudo-front-builder/docs/changelog/ for v0.1.0-next.5 and later. Entries below are historical (kept for npm readers).
|
|
4
4
|
|
|
5
|
+
## Unreleased
|
|
6
|
+
|
|
7
|
+
### Performance
|
|
8
|
+
|
|
9
|
+
- **paths() memo** — `createPageRouter` now evaluates each dynamic route's `paths()` export exactly once per router instance. Previously, both the `GET /__paths__/<route>` build-pipeline call and every subsequent page render request invoked `paths()` independently, producing O(N²) work for an N-page dynamic route. The memo is shared between the `/__paths__` handler and the per-page render handler; rejections are not cached so a transient paths() failure retries on the next request. Production SSR isolates evaluate `paths()` once per isolate, matching the build-time-enumerator contract; dev mode is safe because each file-save creates a fresh router instance with a clean memo. (#974)
|
|
10
|
+
|
|
5
11
|
## 0.1.0-next.4
|
|
6
12
|
|
|
7
13
|
Version bump for lockstep release. No API changes in `zfb-runtime` itself. Note: the content-snapshot flow fix (#442) touched `packages/zfb/src/content.ts`, which affects how the CLI calls `setContentSnapshot` — but the `zfb-runtime` API surface is unchanged.
|
package/README.md
CHANGED
|
@@ -39,7 +39,9 @@ user pages/ + content/ + layouts/ + components/
|
|
|
39
39
|
|
|
40
40
|
This package supplies the page-router factory the Worker entry calls. It
|
|
41
41
|
is built on [Hono][hono] but does not leak Hono types through the public
|
|
42
|
-
surface — consumers
|
|
42
|
+
surface — consumers import from `src/index.ts`, which re-exports the
|
|
43
|
+
page-router types, the client-router and prefetch API, lifecycle event
|
|
44
|
+
constants, and plugin types, none of which require Hono.
|
|
43
45
|
|
|
44
46
|
[hono]: https://hono.dev/
|
|
45
47
|
|
|
@@ -64,6 +66,138 @@ import type {
|
|
|
64
66
|
} from "@takazudo/zfb-runtime";
|
|
65
67
|
```
|
|
66
68
|
|
|
69
|
+
### Client-router / view-transitions / prefetch
|
|
70
|
+
|
|
71
|
+
```ts
|
|
72
|
+
import {
|
|
73
|
+
ClientRouter, // <ClientRouter /> Preact component — mounts view-transition intercepts
|
|
74
|
+
navigate, // imperative navigation
|
|
75
|
+
supportsViewTransitions, // browser capability check
|
|
76
|
+
transitionEnabledOnThisPage, // reads zfb-view-transitions-enabled meta
|
|
77
|
+
prefetch, // prefetch a URL on demand
|
|
78
|
+
prefetchInit, // bootstrap prefetch strategy (e.g. { prefetchAll: true })
|
|
79
|
+
TRANSITION_BEFORE_PREPARATION,
|
|
80
|
+
TRANSITION_AFTER_PREPARATION,
|
|
81
|
+
TRANSITION_BEFORE_SWAP,
|
|
82
|
+
TRANSITION_AFTER_SWAP,
|
|
83
|
+
TRANSITION_PAGE_LOAD,
|
|
84
|
+
TRANSITION_NAVIGATION_ABORTED,
|
|
85
|
+
swapFunctions, // swap step overrides for advanced consumers
|
|
86
|
+
swap,
|
|
87
|
+
} from "@takazudo/zfb-runtime";
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
The `./snapshot` and `./client-router` subpath exports are also available for
|
|
91
|
+
consumers that only need part of the surface:
|
|
92
|
+
|
|
93
|
+
```ts
|
|
94
|
+
import type { ContentSnapshot } from "@takazudo/zfb-runtime/snapshot";
|
|
95
|
+
import { ClientRouter } from "@takazudo/zfb-runtime/client-router";
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
#### Enabling SPA soft-navigation (the runtime ships automatically)
|
|
99
|
+
|
|
100
|
+
Mounting `<ClientRouter />` in your layout `<head>` is normally **all you need**.
|
|
101
|
+
The build detects the usage and automatically ships the client-router runtime to
|
|
102
|
+
the browser — you do **not** have to add a manual `"use client"` bootstrap
|
|
103
|
+
island.
|
|
104
|
+
|
|
105
|
+
```tsx
|
|
106
|
+
import { ClientRouter } from "@takazudo/zfb-runtime";
|
|
107
|
+
|
|
108
|
+
export default function Layout({ children }) {
|
|
109
|
+
return (
|
|
110
|
+
<html>
|
|
111
|
+
<head>
|
|
112
|
+
<ClientRouter fallback="animate" />
|
|
113
|
+
</head>
|
|
114
|
+
<body>{children}</body>
|
|
115
|
+
</html>
|
|
116
|
+
);
|
|
117
|
+
}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
**How the runtime reaches the browser.** `<ClientRouter />` itself only renders
|
|
121
|
+
SSR `<head>` tags. The click/form interception is registered by an `init()` call
|
|
122
|
+
that runs as a side effect when `@takazudo/zfb-runtime/client-router` is imported
|
|
123
|
+
in the browser, guarded so it never runs during SSR:
|
|
124
|
+
|
|
125
|
+
```ts
|
|
126
|
+
// inside @takazudo/zfb-runtime — client-router.ts
|
|
127
|
+
if (typeof document !== "undefined") {
|
|
128
|
+
init();
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
To get that side-effect import into the client bundle, zfb's island scanner
|
|
133
|
+
detects when a page transitively reaches `<ClientRouter />` and injects
|
|
134
|
+
`import "@takazudo/zfb-runtime/client-router"` into the islands asset
|
|
135
|
+
(`assets/islands.js`) — **even when the project has no `"use client"` islands of
|
|
136
|
+
its own**. The asset is then loaded on the page, the import runs, and `init()`
|
|
137
|
+
fires on the client with zero boilerplate. (Auto-include added in zfb #289 /
|
|
138
|
+
#307; the runtime is byte-for-byte absent from projects that never reach
|
|
139
|
+
`<ClientRouter />`.)
|
|
140
|
+
|
|
141
|
+
**What counts as a `ClientRouter` usage the scanner detects:**
|
|
142
|
+
|
|
143
|
+
- a named `ClientRouter` import from the `@takazudo/zfb-runtime` barrel —
|
|
144
|
+
`import { ClientRouter } from "@takazudo/zfb-runtime"` (renamed forms like
|
|
145
|
+
`{ ClientRouter as CR }` match on the imported name), or
|
|
146
|
+
- any import or re-export of the `@takazudo/zfb-runtime/client-router` subpath
|
|
147
|
+
(e.g. when you only need `navigate` / `prefetch`), or
|
|
148
|
+
- a named `ClientRouter` imported from a *local* barrel that re-exports the
|
|
149
|
+
runtime via `export * from "@takazudo/zfb-runtime"`.
|
|
150
|
+
|
|
151
|
+
The importing module has to be reachable from a page in `pages/` — that is the
|
|
152
|
+
import graph the scanner walks.
|
|
153
|
+
|
|
154
|
+
**When you need a manual side-effect import.** Detection keys off the *import* of
|
|
155
|
+
`ClientRouter`, and a couple of shapes are deliberately **not** treated as a
|
|
156
|
+
trigger — firing on them would ship the runtime to projects that only reference
|
|
157
|
+
`ClientRouter` as a type or never call it:
|
|
158
|
+
|
|
159
|
+
- a namespace import — `import * as rt from "@takazudo/zfb-runtime"` used as
|
|
160
|
+
`rt.ClientRouter`, and
|
|
161
|
+
- a type-only import — `import type { ClientRouter }` (or `{ type ClientRouter }`).
|
|
162
|
+
|
|
163
|
+
If soft-navigation is not working because your reference takes one of these forms
|
|
164
|
+
(or the mounting module is otherwise not reachable from a page), force the
|
|
165
|
+
runtime in with an explicit side-effect import from a page-reachable
|
|
166
|
+
`"use client"` island. The island renders nothing; running its bundle in the
|
|
167
|
+
browser fires the same `typeof document !== "undefined"` guard (`init()` is
|
|
168
|
+
idempotent, so reaching it again is a no-op):
|
|
169
|
+
|
|
170
|
+
```tsx
|
|
171
|
+
// src/components/client-router-bootstrap.tsx
|
|
172
|
+
"use client";
|
|
173
|
+
import "@takazudo/zfb-runtime/client-router";
|
|
174
|
+
|
|
175
|
+
export default function ClientRouterBootstrap() {
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// Stable marker name so the SSR marker, the scanner record, and the hydration
|
|
180
|
+
// manifest agree under production minification.
|
|
181
|
+
ClientRouterBootstrap.displayName = "ClientRouterBootstrap";
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
```tsx
|
|
185
|
+
import { Island } from "@takazudo/zfb";
|
|
186
|
+
import ClientRouterBootstrap from "@/components/client-router-bootstrap";
|
|
187
|
+
|
|
188
|
+
// Mount once near the end of <body>; when="load" registers the intercepts as
|
|
189
|
+
// soon as the islands runtime starts.
|
|
190
|
+
<Island when="load">
|
|
191
|
+
<ClientRouterBootstrap />
|
|
192
|
+
</Island>;
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
This is the escape hatch, not the default — prefer a plain
|
|
196
|
+
`import { ClientRouter } from "@takazudo/zfb-runtime"`, which the scanner detects
|
|
197
|
+
on its own. See the [Client-Side Routing concept
|
|
198
|
+
guide](https://takazudomodular.com/pj/zudo-front-builder/docs/concepts/client-side-routing/)
|
|
199
|
+
for the full API.
|
|
200
|
+
|
|
67
201
|
### `createPageRouter(options) → PageRouter`
|
|
68
202
|
|
|
69
203
|
Build a fetch-handler that serves the supplied pages. The returned
|
|
@@ -108,8 +242,10 @@ The shape every page module must export:
|
|
|
108
242
|
interface PageModule {
|
|
109
243
|
readonly default: (props: Record<string, unknown>) => unknown;
|
|
110
244
|
readonly prerender?: boolean; // literal `false` excludes from SSG
|
|
111
|
-
readonly
|
|
245
|
+
readonly contentType?: string; // overrides Content-Type (e.g. "application/xml")
|
|
112
246
|
readonly headings?: readonly PageHeading[]; // MDX-emitted TOC data
|
|
247
|
+
readonly paths?: () => unknown[] | Promise<unknown[]>; // enumerates concrete URLs for dynamic routes (SSG)
|
|
248
|
+
readonly getStaticProps?: () => Promise<{ props: Record<string, unknown> }>; // fetches props at build/render time; result spread into default()
|
|
113
249
|
}
|
|
114
250
|
|
|
115
251
|
interface PageHeading {
|
|
@@ -126,12 +262,9 @@ Default `Content-Type` is `text/html; charset=utf-8`.
|
|
|
126
262
|
```ts
|
|
127
263
|
interface FrameworkAdapter {
|
|
128
264
|
renderToString: (vnode: unknown) => string;
|
|
129
|
-
hydrate?: (...args: unknown[]) => unknown; // reserved for follow-up SSR-with-hydration
|
|
130
265
|
}
|
|
131
266
|
```
|
|
132
267
|
|
|
133
|
-
`hydrate` is reserved — the page router does not call it today.
|
|
134
|
-
|
|
135
268
|
### `ContentSnapshot` / `EntrySnapshot`
|
|
136
269
|
|
|
137
270
|
Direct TypeScript mirror of the Rust contract in
|
|
@@ -200,7 +333,7 @@ enumerated route and writing the response body to `dist/{route}/index.html`.
|
|
|
200
333
|
- The returned function is **always** `(request: Request) => Promise<Response>`,
|
|
201
334
|
even if the underlying Hono path returns synchronously.
|
|
202
335
|
- `Content-Type` defaults to `text/html; charset=utf-8`. Page modules
|
|
203
|
-
with a `
|
|
336
|
+
with a `contentType` field override it.
|
|
204
337
|
- Errors in page evaluation surface as 500 responses with a diagnostic
|
|
205
338
|
text body; the host's source-map plumbing projects those back to the
|
|
206
339
|
user's TSX line.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/client-router/events.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAElE,eAAO,MAAM,6BAA6B,2BAA2B,CAAC;AACtE,eAAO,MAAM,4BAA4B,0BAA0B,CAAC;AACpE,eAAO,MAAM,sBAAsB,oBAAoB,CAAC;AACxD,eAAO,MAAM,qBAAqB,mBAAmB,CAAC;AACtD,eAAO,MAAM,oBAAoB,kBAAkB,CAAC;AACpD,eAAO,MAAM,6BAA6B,2BAA2B,CAAC;AAEtE,KAAK,MAAM,GACP,uBAAuB,GACvB,gBAAgB,GAChB,eAAe,GACf,wBAAwB,CAAC;AAC7B,eAAO,MAAM,YAAY,GAAI,MAAM,MAAM,YAA4C,CAAC;AACtF,eAAO,MAAM,UAAU,eAAsC,CAAC;AAK9D,cAAM,WAAY,SAAQ,KAAK;IAC7B,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC;IACnB,EAAE,EAAE,GAAG,CAAC;IACR,SAAS,EAAE,SAAS,GAAG,MAAM,CAAC;IAC9B,QAAQ,CAAC,cAAc,EAAE,oBAAoB,CAAC;IAC9C,QAAQ,CAAC,aAAa,EAAE,OAAO,GAAG,SAAS,CAAC;IAC5C,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC;IACnB,WAAW,EAAE,QAAQ,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;gBAG3B,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,SAAS,GAAG,SAAS,EACpC,IAAI,EAAE,GAAG,EACT,EAAE,EAAE,GAAG,EACP,SAAS,EAAE,SAAS,GAAG,MAAM,EAC7B,cAAc,EAAE,oBAAoB,EACpC,aAAa,EAAE,OAAO,GAAG,SAAS,EAClC,IAAI,EAAE,GAAG,EACT,WAAW,EAAE,QAAQ,EACrB,MAAM,EAAE,WAAW;CAuBtB;AAMD,eAAO,MAAM,kCAAkC,GAC7C,OAAO,GAAG,KACT,KAAK,IAAI,
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/client-router/events.ts"],"names":[],"mappings":"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"}
|
|
@@ -46,7 +46,7 @@ class BeforeEvent extends Event {
|
|
|
46
46
|
* TransitionBeforePreparationEvent
|
|
47
47
|
|
|
48
48
|
*/
|
|
49
|
-
export const isTransitionBeforePreparationEvent = (value) => value.type === TRANSITION_BEFORE_PREPARATION;
|
|
49
|
+
export const isTransitionBeforePreparationEvent = (value) => typeof value === "object" && value !== null && value.type === TRANSITION_BEFORE_PREPARATION;
|
|
50
50
|
export class TransitionBeforePreparationEvent extends BeforeEvent {
|
|
51
51
|
formData;
|
|
52
52
|
loader;
|
|
@@ -63,7 +63,7 @@ export class TransitionBeforePreparationEvent extends BeforeEvent {
|
|
|
63
63
|
/*
|
|
64
64
|
* TransitionBeforeSwapEvent
|
|
65
65
|
*/
|
|
66
|
-
export const isTransitionBeforeSwapEvent = (value) => value.type === TRANSITION_BEFORE_SWAP;
|
|
66
|
+
export const isTransitionBeforeSwapEvent = (value) => typeof value === "object" && value !== null && value.type === TRANSITION_BEFORE_SWAP;
|
|
67
67
|
export class TransitionBeforeSwapEvent extends BeforeEvent {
|
|
68
68
|
direction;
|
|
69
69
|
viewTransition;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/client-router/events.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAG3C,MAAM,CAAC,MAAM,6BAA6B,GAAG,wBAAwB,CAAC;AACtE,MAAM,CAAC,MAAM,4BAA4B,GAAG,uBAAuB,CAAC;AACpE,MAAM,CAAC,MAAM,sBAAsB,GAAG,iBAAiB,CAAC;AACxD,MAAM,CAAC,MAAM,qBAAqB,GAAG,gBAAgB,CAAC;AACtD,MAAM,CAAC,MAAM,oBAAoB,GAAG,eAAe,CAAC;AACpD,MAAM,CAAC,MAAM,6BAA6B,GAAG,wBAAwB,CAAC;AAOtE,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AACtF,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;AAE9D;;GAEG;AACH,MAAM,WAAY,SAAQ,KAAK;IACpB,IAAI,CAAM;IACnB,EAAE,CAAM;IACR,SAAS,CAAqB;IACrB,cAAc,CAAuB;IACrC,aAAa,CAAsB;IACnC,IAAI,CAAM;IACnB,WAAW,CAAW;IACb,MAAM,CAAc;IAE7B,YACE,IAAY,EACZ,aAAoC,EACpC,IAAS,EACT,EAAO,EACP,SAA6B,EAC7B,cAAoC,EACpC,aAAkC,EAClC,IAAS,EACT,WAAqB,EACrB,MAAmB;QAEnB,KAAK,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QAErB,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE;YAC5B,IAAI,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE;YAC1B,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;YACxC,SAAS,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;YAC/C,cAAc,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE;YACpC,aAAa,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE;YACnC,IAAI,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE;YAC1B,WAAW,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;YACjD,MAAM,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE;SAC7B,CAAC,CAAC;IACL,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,kCAAkC,GAAG,CAChD,KAAU,EACiC,EAAE,
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/client-router/events.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,5 +14,4 @@ export { navigate, supportsViewTransitions, transitionEnabledOnThisPage, init }
|
|
|
14
14
|
// `init` from prefetch.ts is re-exported as `prefetchInit` to avoid colliding
|
|
15
15
|
// with the router's `init` above.
|
|
16
16
|
export { prefetch, init as prefetchInit } from "./prefetch.js";
|
|
17
|
-
// (cssesc is an internal helper, not part of the public surface — not re-exported.)
|
|
18
17
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client-router/index.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,4EAA4E;AAC5E,4EAA4E;AAE5E,mBAAmB;AACnB,OAAO,EAAE,YAAY,EAA0B,MAAM,qBAAqB,CAAC;AAE3E,OAAO,EACL,6BAA6B,EAC7B,4BAA4B,EAC5B,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,EACpB,6BAA6B,EAC7B,gCAAgC,EAChC,yBAAyB,EACzB,kCAAkC,EAClC,2BAA2B,GAC5B,MAAM,aAAa,CAAC;AAIrB,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAE1D,yBAAyB;AACzB,sEAAsE;AACtE,oDAAoD;AACpD,yFAAyF;AACzF,OAAO,EAAE,QAAQ,EAAE,uBAAuB,EAAE,2BAA2B,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAGnG,kCAAkC;AAClC,8EAA8E;AAC9E,kCAAkC;AAClC,OAAO,EAAE,QAAQ,EAAE,IAAI,IAAI,YAAY,EAAE,MAAM,eAAe,CAAC
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client-router/index.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,4EAA4E;AAC5E,4EAA4E;AAE5E,mBAAmB;AACnB,OAAO,EAAE,YAAY,EAA0B,MAAM,qBAAqB,CAAC;AAE3E,OAAO,EACL,6BAA6B,EAC7B,4BAA4B,EAC5B,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,EACpB,6BAA6B,EAC7B,gCAAgC,EAChC,yBAAyB,EACzB,kCAAkC,EAClC,2BAA2B,GAC5B,MAAM,aAAa,CAAC;AAIrB,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAE1D,yBAAyB;AACzB,sEAAsE;AACtE,oDAAoD;AACpD,yFAAyF;AACzF,OAAO,EAAE,QAAQ,EAAE,uBAAuB,EAAE,2BAA2B,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAGnG,kCAAkC;AAClC,8EAA8E;AAC9E,kCAAkC;AAClC,OAAO,EAAE,QAAQ,EAAE,IAAI,IAAI,YAAY,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prefetch.d.ts","sourceRoot":"","sources":["../../src/client-router/prefetch.ts"],"names":[],"mappings":"AAiBA,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,UAAU,GAAG,MAAM,GAAG,KAAK,CAAC;AAErE,MAAM,WAAW,mBAAmB;IAClC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,eAAe,CAAC,EAAE,gBAAgB,CAAC;CACpC;AAED,MAAM,WAAW,eAAe;IAC9B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACzB;
|
|
1
|
+
{"version":3,"file":"prefetch.d.ts","sourceRoot":"","sources":["../../src/client-router/prefetch.ts"],"names":[],"mappings":"AAiBA,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,UAAU,GAAG,MAAM,GAAG,KAAK,CAAC;AAErE,MAAM,WAAW,mBAAmB;IAClC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,eAAe,CAAC,EAAE,gBAAgB,CAAC;CACpC;AAED,MAAM,WAAW,eAAe;IAC9B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACzB;AA4BD;;;GAGG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAYtC;AAkGD;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,eAAoB,GAAG,IAAI,CAStE;AA4LD;;;;;;;;GAQG;AACH,wBAAgB,IAAI,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAkCxD"}
|
|
@@ -18,16 +18,22 @@
|
|
|
18
18
|
let initialized = false;
|
|
19
19
|
let prefetchAll = false;
|
|
20
20
|
let defaultStrategy = "hover";
|
|
21
|
-
// Set of hrefs that have been
|
|
21
|
+
// Set of hrefs that have been successfully prefetched.
|
|
22
22
|
const prefetched = new Set();
|
|
23
|
-
// Map of in-flight prefetch promises for dedup.
|
|
23
|
+
// Map of in-flight prefetch promises for dedup (also used as the concurrent short-circuit guard).
|
|
24
24
|
const inFlight = new Map();
|
|
25
|
+
// How long to wait for a <link rel=prefetch>'s load/error before treating
|
|
26
|
+
// the prefetch as settled anyway (see executePrefetch).
|
|
27
|
+
const LINK_SETTLE_TIMEOUT_MS = 10_000;
|
|
25
28
|
// The viewport observer — retained across post-swap re-scans so new elements
|
|
26
29
|
// can be observed without recreating the observer.
|
|
27
30
|
let viewportObserver = null;
|
|
28
31
|
// Hover cancel handle — set when a pointerenter idle-callback fires, cleared on
|
|
29
32
|
// pointerleave before the callback executes.
|
|
30
33
|
const hoverCancelHandles = new Map();
|
|
34
|
+
// Focus cancel handle — set when a focusin idle-callback fires, cleared on
|
|
35
|
+
// focusout before the callback executes.
|
|
36
|
+
const focusCancelHandles = new Map();
|
|
31
37
|
/**
|
|
32
38
|
* Reset all module-level state. Exported for test isolation only — not part of
|
|
33
39
|
* the public API and not re-exported from any barrel.
|
|
@@ -43,6 +49,7 @@ export function __resetForTests() {
|
|
|
43
49
|
viewportObserver = null;
|
|
44
50
|
}
|
|
45
51
|
hoverCancelHandles.clear();
|
|
52
|
+
focusCancelHandles.clear();
|
|
46
53
|
}
|
|
47
54
|
// ---------------------------------------------------------------------------
|
|
48
55
|
// Feature detection
|
|
@@ -84,23 +91,45 @@ function executePrefetch(href, opts) {
|
|
|
84
91
|
if (existing)
|
|
85
92
|
return existing;
|
|
86
93
|
const p = (async () => {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
94
|
+
try {
|
|
95
|
+
const method = opts.with ?? (supportsLinkPrefetch() ? "link" : "fetch");
|
|
96
|
+
if (method === "link") {
|
|
97
|
+
const link = document.createElement("link");
|
|
98
|
+
link.rel = "prefetch";
|
|
99
|
+
link.href = href;
|
|
100
|
+
// Wait for load/error so we only mark success on actual load and allow
|
|
101
|
+
// retry after error — inserting without waiting would mark success
|
|
102
|
+
// immediately even on failure. (Bug: Takazudo/zudo-front-builder#896)
|
|
103
|
+
// Some browsers (e.g. Safari) never fire load/error on rel=prefetch
|
|
104
|
+
// links; without the settle timeout the href would sit in inFlight
|
|
105
|
+
// forever and block every future retry. Timing out counts as
|
|
106
|
+
// success — the resource was requested, which is all prefetch needs.
|
|
107
|
+
await new Promise((resolve, reject) => {
|
|
108
|
+
const timer = setTimeout(() => resolve(), LINK_SETTLE_TIMEOUT_MS);
|
|
109
|
+
link.addEventListener("load", () => {
|
|
110
|
+
clearTimeout(timer);
|
|
111
|
+
resolve();
|
|
112
|
+
}, { once: true });
|
|
113
|
+
link.addEventListener("error", () => {
|
|
114
|
+
clearTimeout(timer);
|
|
115
|
+
// Remove the failed element so retries don't accumulate
|
|
116
|
+
// dead <link> nodes in <head>.
|
|
117
|
+
link.remove();
|
|
118
|
+
reject(new Error(`prefetch link error: ${href}`));
|
|
119
|
+
}, { once: true });
|
|
120
|
+
document.head.appendChild(link);
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
await fetch(href, { priority: "low" });
|
|
125
|
+
}
|
|
126
|
+
prefetched.add(href);
|
|
93
127
|
}
|
|
94
|
-
|
|
95
|
-
|
|
128
|
+
finally {
|
|
129
|
+
inFlight.delete(href);
|
|
96
130
|
}
|
|
97
|
-
prefetched.add(href);
|
|
98
|
-
inFlight.delete(href);
|
|
99
131
|
})();
|
|
100
132
|
inFlight.set(href, p);
|
|
101
|
-
// Also add to prefetched immediately to prevent concurrent triggers from
|
|
102
|
-
// queuing duplicate in-flight entries before the async operation resolves.
|
|
103
|
-
prefetched.add(href);
|
|
104
133
|
return p;
|
|
105
134
|
}
|
|
106
135
|
/**
|
|
@@ -112,49 +141,65 @@ export function prefetch(url, opts = {}) {
|
|
|
112
141
|
return; // cross-origin — skip
|
|
113
142
|
if (opts.ignoreSlowConnection !== true && isSlowConnection())
|
|
114
143
|
return;
|
|
115
|
-
if (prefetched.has(href))
|
|
116
|
-
return;
|
|
117
|
-
void executePrefetch(href, opts);
|
|
118
|
-
}
|
|
119
|
-
// ---------------------------------------------------------------------------
|
|
120
|
-
// Trigger: hover (pointerenter / focusin with cancel on pointerleave)
|
|
121
|
-
// ---------------------------------------------------------------------------
|
|
122
|
-
function onPointerEnter(e) {
|
|
123
|
-
const link = e.target.closest("a[href]");
|
|
124
|
-
if (!link)
|
|
125
|
-
return;
|
|
126
|
-
if (!shouldPrefetchLink(link, "hover"))
|
|
144
|
+
if (prefetched.has(href) || inFlight.has(href))
|
|
127
145
|
return;
|
|
128
|
-
|
|
129
|
-
const fire = () => {
|
|
130
|
-
hoverCancelHandles.delete(link);
|
|
131
|
-
prefetch(link.href);
|
|
132
|
-
};
|
|
133
|
-
if (typeof requestIdleCallback !== "undefined") {
|
|
134
|
-
const handle = requestIdleCallback(fire);
|
|
135
|
-
hoverCancelHandles.set(link, handle);
|
|
136
|
-
}
|
|
137
|
-
else {
|
|
138
|
-
const handle = setTimeout(fire, 100);
|
|
139
|
-
hoverCancelHandles.set(link, handle);
|
|
140
|
-
}
|
|
146
|
+
executePrefetch(href, opts).catch(() => { });
|
|
141
147
|
}
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
148
|
+
/**
|
|
149
|
+
* Returns a pair of [enterHandler, leaveHandler] that queue and cancel an idle
|
|
150
|
+
* prefetch callback, keyed on the supplied per-trigger cancel-handle map.
|
|
151
|
+
*
|
|
152
|
+
* Both the pointer (hover) and focus triggers use identical queue/cancel logic;
|
|
153
|
+
* the only difference between them is which map tracks their pending handles.
|
|
154
|
+
* Parameterising by the map eliminates that duplication.
|
|
155
|
+
*/
|
|
156
|
+
function makeEnterLeaveHandlers(cancelHandles) {
|
|
157
|
+
function enterHandler(e) {
|
|
158
|
+
const link = e.target.closest("a[href]");
|
|
159
|
+
if (!link)
|
|
160
|
+
return;
|
|
161
|
+
if (!shouldPrefetchLink(link, "hover"))
|
|
162
|
+
return;
|
|
163
|
+
// Use requestIdleCallback if available, else a small timeout.
|
|
164
|
+
const fire = () => {
|
|
165
|
+
cancelHandles.delete(link);
|
|
166
|
+
prefetch(link.href);
|
|
167
|
+
};
|
|
168
|
+
if (typeof requestIdleCallback !== "undefined") {
|
|
169
|
+
const handle = requestIdleCallback(fire);
|
|
170
|
+
cancelHandles.set(link, handle);
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
const handle = setTimeout(fire, 100);
|
|
174
|
+
cancelHandles.set(link, handle);
|
|
175
|
+
}
|
|
151
176
|
}
|
|
152
|
-
|
|
153
|
-
|
|
177
|
+
function leaveHandler(e) {
|
|
178
|
+
const link = e.target.closest("a[href]");
|
|
179
|
+
if (!link)
|
|
180
|
+
return;
|
|
181
|
+
const handle = cancelHandles.get(link);
|
|
182
|
+
if (handle === undefined)
|
|
183
|
+
return;
|
|
184
|
+
if (typeof cancelIdleCallback !== "undefined") {
|
|
185
|
+
cancelIdleCallback(handle);
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
clearTimeout(handle);
|
|
189
|
+
}
|
|
190
|
+
cancelHandles.delete(link);
|
|
154
191
|
}
|
|
155
|
-
|
|
192
|
+
return [enterHandler, leaveHandler];
|
|
156
193
|
}
|
|
157
194
|
// ---------------------------------------------------------------------------
|
|
195
|
+
// Trigger: hover (pointerenter / pointerleave)
|
|
196
|
+
// ---------------------------------------------------------------------------
|
|
197
|
+
const [onPointerEnter, onPointerLeave] = makeEnterLeaveHandlers(hoverCancelHandles);
|
|
198
|
+
// ---------------------------------------------------------------------------
|
|
199
|
+
// Trigger: focus (focusin / focusout with cancel on focusout)
|
|
200
|
+
// ---------------------------------------------------------------------------
|
|
201
|
+
const [onFocusIn, onFocusOut] = makeEnterLeaveHandlers(focusCancelHandles);
|
|
202
|
+
// ---------------------------------------------------------------------------
|
|
158
203
|
// Trigger: tap (touchstart / mousedown)
|
|
159
204
|
// ---------------------------------------------------------------------------
|
|
160
205
|
function onTap(e) {
|
|
@@ -241,6 +286,13 @@ function shouldPrefetchLink(link, triggerStrategy) {
|
|
|
241
286
|
// Post-swap re-scan
|
|
242
287
|
// ---------------------------------------------------------------------------
|
|
243
288
|
function onAfterSwap() {
|
|
289
|
+
// Disconnect the existing observer before re-scanning so detached anchors from
|
|
290
|
+
// the old body are unobserved and don't accumulate across SPA swaps.
|
|
291
|
+
// (Bug: Takazudo/zudo-front-builder#896 — observer leak across SPA swaps)
|
|
292
|
+
if (viewportObserver) {
|
|
293
|
+
viewportObserver.disconnect();
|
|
294
|
+
viewportObserver = null;
|
|
295
|
+
}
|
|
244
296
|
observeViewportLinks();
|
|
245
297
|
prefetchLoadLinks();
|
|
246
298
|
}
|
|
@@ -268,8 +320,10 @@ export function init(options) {
|
|
|
268
320
|
defaultStrategy = options?.defaultStrategy ?? "hover";
|
|
269
321
|
// Hover + tap — document delegation, picks up SPA-inserted links automatically.
|
|
270
322
|
document.addEventListener("pointerenter", onPointerEnter, { capture: true });
|
|
271
|
-
document.addEventListener("focusin", onPointerEnter, { capture: true });
|
|
272
323
|
document.addEventListener("pointerleave", onPointerLeave, { capture: true });
|
|
324
|
+
// Focus — separate cancel map so hover and focus don't share handles.
|
|
325
|
+
document.addEventListener("focusin", onFocusIn, { capture: true });
|
|
326
|
+
document.addEventListener("focusout", onFocusOut, { capture: true });
|
|
273
327
|
document.addEventListener("touchstart", onTap, { capture: true, passive: true });
|
|
274
328
|
document.addEventListener("mousedown", onTap, { capture: true });
|
|
275
329
|
// Viewport — observe current links immediately.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prefetch.js","sourceRoot":"","sources":["../../src/client-router/prefetch.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,oCAAoC;AACpC,6CAA6C;AAC7C,EAAE;AACF,8EAA8E;AAC9E,6CAA6C;AAC7C,yCAAyC;AACzC,EAAE;AACF,oCAAoC;AACpC,yCAAyC;AACzC,qDAAqD;AACrD,sFAAsF;AACtF,EAAE;AACF,6EAA6E;AAC7E,uDAAuD;AACvD,wEAAwE;AAcxE,yEAAyE;AACzE,IAAI,WAAW,GAAG,KAAK,CAAC;AACxB,IAAI,WAAW,GAAG,KAAK,CAAC;AACxB,IAAI,eAAe,GAAqB,OAAO,CAAC;AAEhD,
|
|
1
|
+
{"version":3,"file":"prefetch.js","sourceRoot":"","sources":["../../src/client-router/prefetch.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/client-router/router.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/client-router/router.ts"],"names":[],"mappings":"AA6DA,OAAO,KAAK,EAAa,QAAQ,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAgC/D,eAAO,MAAM,uBAAuB,SAA8C,CAAC;AAEnF,eAAO,MAAM,2BAA2B,eACwC,CAAC;AAmHjF,wBAAgB,WAAW,IAAI,QAAQ,CAWtC;AAsiBD,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,iBA0B7D;AAkRD,MAAM,WAAW,WAAW;IAC1B,oFAAoF;IACpF,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAMD;;;;;GAKG;AACH,wBAAgB,IAAI,CAAC,QAAQ,CAAC,EAAE,WAAW,GAAG,IAAI,CAgBjD"}
|