@nifrajs/web 2.1.0 → 2.3.0
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/README.md +3 -3
- package/dist/build-vite.d.ts +68 -0
- package/dist/build-vite.d.ts.map +1 -0
- package/dist/build-vite.js +433 -0
- package/dist/build-vite.js.map +1 -0
- package/dist/build.d.ts +174 -65
- package/dist/build.d.ts.map +1 -1
- package/dist/build.js +376 -135
- package/dist/build.js.map +1 -1
- package/dist/bun-dev-entry.d.ts +83 -0
- package/dist/bun-dev-entry.d.ts.map +1 -0
- package/dist/bun-dev-entry.js +136 -0
- package/dist/bun-dev-entry.js.map +1 -0
- package/dist/chunk-names.js +1 -1
- package/dist/client.d.ts +3 -9
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +209 -27
- package/dist/client.js.map +1 -1
- package/dist/conformance.d.ts +2 -2
- package/dist/conformance.js +3 -3
- package/dist/deferred.d.ts +11 -11
- package/dist/deferred.d.ts.map +1 -1
- package/dist/deferred.js +16 -16
- package/dist/dev-error.d.ts +2 -2
- package/dist/dev-error.js +3 -3
- package/dist/dev-port.d.ts +36 -0
- package/dist/dev-port.d.ts.map +1 -0
- package/dist/dev-port.js +48 -0
- package/dist/dev-port.js.map +1 -0
- package/dist/dev.d.ts +62 -5
- package/dist/dev.d.ts.map +1 -1
- package/dist/dev.js +419 -60
- package/dist/dev.js.map +1 -1
- package/dist/draft.d.ts +44 -7
- package/dist/draft.d.ts.map +1 -1
- package/dist/draft.js +92 -9
- package/dist/draft.js.map +1 -1
- package/dist/fn-state.d.ts +56 -0
- package/dist/fn-state.d.ts.map +1 -0
- package/dist/fn-state.js +77 -0
- package/dist/fn-state.js.map +1 -0
- package/dist/fn.d.ts +111 -0
- package/dist/fn.d.ts.map +1 -0
- package/dist/fn.js +125 -0
- package/dist/fn.js.map +1 -0
- package/dist/fonts-google.d.ts +9 -9
- package/dist/fonts-google.js +10 -10
- package/dist/fonts.d.ts +7 -7
- package/dist/fonts.js +1 -1
- package/dist/forms.d.ts +8 -8
- package/dist/fs.d.ts +15 -2
- package/dist/fs.d.ts.map +1 -1
- package/dist/fs.js +8 -2
- package/dist/fs.js.map +1 -1
- package/dist/index.d.ts +266 -74
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +869 -179
- package/dist/index.js.map +1 -1
- package/dist/internal/head-attributes.d.ts +15 -0
- package/dist/internal/head-attributes.d.ts.map +1 -0
- package/dist/internal/head-attributes.js +99 -0
- package/dist/internal/head-attributes.js.map +1 -0
- package/dist/internal/script-types.d.ts +14 -0
- package/dist/internal/script-types.d.ts.map +1 -0
- package/dist/internal/script-types.js +17 -0
- package/dist/internal/script-types.js.map +1 -0
- package/dist/internal/server-boundary.d.ts +60 -0
- package/dist/internal/server-boundary.d.ts.map +1 -0
- package/dist/internal/server-boundary.js +174 -0
- package/dist/internal/server-boundary.js.map +1 -0
- package/dist/internal/timing-safe-equal.d.ts +16 -0
- package/dist/internal/timing-safe-equal.d.ts.map +1 -0
- package/dist/internal/timing-safe-equal.js +26 -0
- package/dist/internal/timing-safe-equal.js.map +1 -0
- package/dist/internal/vite-import.d.ts +63 -0
- package/dist/internal/vite-import.d.ts.map +1 -0
- package/dist/internal/vite-import.js +94 -0
- package/dist/internal/vite-import.js.map +1 -0
- package/dist/islands.d.ts +5 -5
- package/dist/islands.js +5 -5
- package/dist/isr.d.ts +15 -15
- package/dist/isr.d.ts.map +1 -1
- package/dist/isr.js +8 -21
- package/dist/isr.js.map +1 -1
- package/dist/llms-txt.d.ts.map +1 -1
- package/dist/llms-txt.js +12 -6
- package/dist/llms-txt.js.map +1 -1
- package/dist/manifest.d.ts +121 -40
- package/dist/manifest.d.ts.map +1 -1
- package/dist/manifest.js +136 -26
- package/dist/manifest.js.map +1 -1
- package/dist/module-graph.d.ts +91 -0
- package/dist/module-graph.d.ts.map +1 -0
- package/dist/module-graph.js +92 -0
- package/dist/module-graph.js.map +1 -0
- package/dist/navigation.d.ts +120 -5
- package/dist/navigation.d.ts.map +1 -1
- package/dist/navigation.js +37 -5
- package/dist/navigation.js.map +1 -1
- package/dist/plugins/css-modules.d.ts +3 -3
- package/dist/plugins/css-modules.d.ts.map +1 -1
- package/dist/plugins/css-modules.js +0 -0
- package/dist/plugins/css-modules.js.map +1 -1
- package/dist/plugins/kit.d.ts +8 -8
- package/dist/plugins/kit.js +9 -9
- package/dist/plugins/scss.js +3 -3
- package/dist/plugins/vite-leak-guard.d.ts +45 -0
- package/dist/plugins/vite-leak-guard.d.ts.map +1 -0
- package/dist/plugins/vite-leak-guard.js +67 -0
- package/dist/plugins/vite-leak-guard.js.map +1 -0
- package/dist/plugins/vite-server-fn.d.ts +23 -0
- package/dist/plugins/vite-server-fn.d.ts.map +1 -0
- package/dist/plugins/vite-server-fn.js +51 -0
- package/dist/plugins/vite-server-fn.js.map +1 -0
- package/dist/plugins/vite-server-only.d.ts +49 -0
- package/dist/plugins/vite-server-only.d.ts.map +1 -0
- package/dist/plugins/vite-server-only.js +57 -0
- package/dist/plugins/vite-server-only.js.map +1 -0
- package/dist/prerender.d.ts +5 -5
- package/dist/prerender.js +7 -7
- package/dist/public-dir.d.ts +36 -0
- package/dist/public-dir.d.ts.map +1 -0
- package/dist/public-dir.js +89 -0
- package/dist/public-dir.js.map +1 -0
- package/dist/query.d.ts +10 -10
- package/dist/query.js +15 -15
- package/dist/route-manifest.d.ts +91 -0
- package/dist/route-manifest.d.ts.map +1 -0
- package/dist/route-manifest.js +128 -0
- package/dist/route-manifest.js.map +1 -0
- package/dist/router.d.ts +94 -22
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +170 -58
- package/dist/router.js.map +1 -1
- package/dist/search.d.ts +94 -0
- package/dist/search.d.ts.map +1 -0
- package/dist/search.js +232 -0
- package/dist/search.js.map +1 -0
- package/dist/server-only.d.ts +6 -6
- package/dist/server-only.js +7 -7
- package/dist/service-worker.d.ts +56 -0
- package/dist/service-worker.d.ts.map +1 -0
- package/dist/service-worker.js +127 -0
- package/dist/service-worker.js.map +1 -0
- package/dist/vite.d.ts +25 -17
- package/dist/vite.d.ts.map +1 -1
- package/dist/vite.js +75 -33
- package/dist/vite.js.map +1 -1
- package/package.json +48 -4
- package/server-manifest.d.ts +31 -0
- package/src/build-vite.ts +553 -0
- package/src/build.ts +563 -172
- package/src/bun-dev-entry.ts +184 -0
- package/src/chunk-names.ts +1 -1
- package/src/client.ts +221 -30
- package/src/conformance.ts +3 -3
- package/src/deferred.ts +17 -17
- package/src/dev-error.ts +3 -3
- package/src/dev-port.ts +63 -0
- package/src/dev.ts +468 -66
- package/src/draft.ts +124 -12
- package/src/fn-state.ts +107 -0
- package/src/fn.ts +199 -0
- package/src/fonts-google.ts +13 -13
- package/src/fonts.ts +7 -7
- package/src/forms.ts +8 -8
- package/src/fs.ts +24 -6
- package/src/index.ts +1174 -225
- package/src/internal/head-attributes.ts +109 -0
- package/src/internal/script-types.ts +18 -0
- package/src/internal/server-boundary.ts +187 -0
- package/src/internal/timing-safe-equal.ts +24 -0
- package/src/internal/vite-import.ts +92 -0
- package/src/islands.ts +7 -7
- package/src/isr.ts +18 -30
- package/src/llms-txt.ts +13 -5
- package/src/manifest.ts +264 -48
- package/src/module-graph.ts +146 -0
- package/src/navigation.ts +151 -5
- package/src/plugins/css-modules.ts +0 -0
- package/src/plugins/kit.ts +11 -11
- package/src/plugins/scss.ts +3 -3
- package/src/plugins/vite-leak-guard.ts +110 -0
- package/src/plugins/vite-server-fn.ts +67 -0
- package/src/plugins/vite-server-only.ts +75 -0
- package/src/prerender.ts +10 -10
- package/src/public-dir.ts +108 -0
- package/src/query.ts +22 -22
- package/src/route-manifest.ts +240 -0
- package/src/router.ts +288 -74
- package/src/search.ts +297 -0
- package/src/server-only.ts +7 -7
- package/src/service-worker.ts +165 -0
- package/src/vite.ts +103 -49
package/dist/client.js
CHANGED
|
@@ -1,4 +1,12 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* `@nifrajs/web/client` - the agnostic browser layer for client-side navigation. It wires the pure
|
|
3
|
+
* router store ({@link ClientRouter}) to the browser: `pushState` on navigate, `popstate` →
|
|
4
|
+
* navigate, and delegated interception of same-origin `<a>` clicks (client transition instead of
|
|
5
|
+
* a full page load). DOM-only - never imported on the server, so the store stays SSR-safe.
|
|
6
|
+
*/
|
|
7
|
+
import { trustedHeadAttributes } from "./internal/head-attributes.js";
|
|
8
|
+
import { EXECUTABLE_SCRIPT_TYPES, INERT_SCRIPT_TYPES } from "./internal/script-types.js";
|
|
9
|
+
import { IDLE_BLOCKER, setBlockerController, setBrowserNavigate, } from "./navigation.js";
|
|
2
10
|
/**
|
|
3
11
|
* Attach history + link interception to a router. Returns a teardown function that removes the
|
|
4
12
|
* listeners. A data-fetch failure during a client navigation falls back to a full-page load, so
|
|
@@ -10,6 +18,16 @@ export function installHistory(router, options = {}) {
|
|
|
10
18
|
// renders), so disable the browser's native restoration which would otherwise fight us.
|
|
11
19
|
history.scrollRestoration = "manual";
|
|
12
20
|
let pendingScroll = null;
|
|
21
|
+
// Navigation-guard state (useBlocker). `index` is our position in the history line, stored in
|
|
22
|
+
// `history.state.nifraIndex`; it exists solely to reverse a blocked back/forward (a popstate can't be
|
|
23
|
+
// cancelled, so we read the delta from the index and `history.go(-delta)` back). `here` is the location
|
|
24
|
+
// we're currently on - after a popstate `location` is already the destination, so "where we were" has
|
|
25
|
+
// to be tracked, not read. `reversing` swallows the popstate our own restoring `history.go` fires.
|
|
26
|
+
let index = history.state?.nifraIndex ?? 0;
|
|
27
|
+
let here = location.pathname + location.search + (location.hash ?? "");
|
|
28
|
+
let reversing = false;
|
|
29
|
+
// A single active guard (like react-router, one blocker at a time); the latest registration wins.
|
|
30
|
+
let registration;
|
|
13
31
|
const scrollOf = (state) => {
|
|
14
32
|
const saved = state?.nifraScroll;
|
|
15
33
|
return Array.isArray(saved) ? saved : [0, 0];
|
|
@@ -38,35 +56,115 @@ export function installHistory(router, options = {}) {
|
|
|
38
56
|
}
|
|
39
57
|
const vt = doc.startViewTransition(run);
|
|
40
58
|
// Rapid in-app clicks supersede an in-flight transition; the browser skips it and rejects its
|
|
41
|
-
// promises. Reasons vary by engine
|
|
59
|
+
// promises. Reasons vary by engine - InvalidStateError "Transition was aborted because of
|
|
42
60
|
// invalid state", or AbortError "Transition was skipped". The navigation still completes, so
|
|
43
61
|
// we swallow these expected aborts rather than let them surface as unhandled rejections.
|
|
44
62
|
for (const p of [vt.ready, vt.finished, vt.updateCallbackDone])
|
|
45
63
|
p.catch(() => { });
|
|
46
64
|
};
|
|
47
|
-
|
|
65
|
+
// Parse a path into the `{ pathname, search, hash }` a `BlockerFunction` decides on.
|
|
66
|
+
const locationOf = (path) => {
|
|
48
67
|
const url = new URL(path, location.origin);
|
|
68
|
+
return { pathname: url.pathname, search: url.search, hash: url.hash };
|
|
69
|
+
};
|
|
70
|
+
// The single funnel every navigation asks before it commits. Returns true (navigation held) when a
|
|
71
|
+
// guard is armed and blocks; false when it may proceed. `retry` performs the navigation and is what
|
|
72
|
+
// `proceed` replays. While a prompt is already open (`blocked`) further navigations are swallowed; the
|
|
73
|
+
// replay from `proceed` (`proceeding`) is let straight through.
|
|
74
|
+
const guard = (nextPath, retry) => {
|
|
75
|
+
const reg = registration;
|
|
76
|
+
if (reg === undefined || reg.state === "proceeding")
|
|
77
|
+
return false;
|
|
78
|
+
if (reg.state === "blocked")
|
|
79
|
+
return true;
|
|
80
|
+
if (!reg.shouldBlock({ currentLocation: locationOf(here), nextLocation: locationOf(nextPath) }))
|
|
81
|
+
return false;
|
|
82
|
+
reg.state = "blocked";
|
|
83
|
+
reg.emit({
|
|
84
|
+
state: "blocked",
|
|
85
|
+
proceed: () => {
|
|
86
|
+
if (reg.state !== "blocked")
|
|
87
|
+
return;
|
|
88
|
+
reg.state = "proceeding";
|
|
89
|
+
reg.emit({ state: "proceeding", proceed: undefined, reset: undefined });
|
|
90
|
+
retry();
|
|
91
|
+
},
|
|
92
|
+
reset: () => {
|
|
93
|
+
if (reg.state !== "blocked")
|
|
94
|
+
return;
|
|
95
|
+
reg.state = "unblocked";
|
|
96
|
+
reg.emit(IDLE_BLOCKER);
|
|
97
|
+
},
|
|
98
|
+
});
|
|
99
|
+
return true;
|
|
100
|
+
};
|
|
101
|
+
// Once a proceeded navigation has committed, return the guard to idle so it can block the next one.
|
|
102
|
+
const settle = () => {
|
|
103
|
+
const reg = registration;
|
|
104
|
+
if (reg !== undefined && reg.state === "proceeding") {
|
|
105
|
+
reg.state = "unblocked";
|
|
106
|
+
reg.emit(IDLE_BLOCKER);
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
// Commit a navigation only after its URL and origin are known-safe. An unmatched same-origin path
|
|
110
|
+
// becomes a hard load BEFORE history is mutated; otherwise the address bar could change while the
|
|
111
|
+
// router intentionally kept rendering the old route.
|
|
112
|
+
const parseNavigationUrl = (path) => {
|
|
113
|
+
try {
|
|
114
|
+
const url = new URL(path, location.origin);
|
|
115
|
+
if (url.protocol !== "http:" && url.protocol !== "https:")
|
|
116
|
+
return null;
|
|
117
|
+
if (url.origin !== location.origin)
|
|
118
|
+
return null;
|
|
119
|
+
return url;
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
const commit = (path, url, mode) => {
|
|
126
|
+
const routePath = url.pathname + url.search;
|
|
127
|
+
if (router.match(routePath) === null) {
|
|
128
|
+
settle();
|
|
129
|
+
fallback(path);
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
49
132
|
if (mode === "replace") {
|
|
50
|
-
// Replace the current entry with the new URL. The entry we're leaving is discarded, so
|
|
51
|
-
// isn't worth saving; the new route scrolls to its fragment target, else the top.
|
|
52
|
-
history.replaceState({}, "", path);
|
|
133
|
+
// Replace the current entry (same index) with the new URL. The entry we're leaving is discarded, so
|
|
134
|
+
// its scroll isn't worth saving; the new route scrolls to its fragment target, else the top.
|
|
135
|
+
history.replaceState({ nifraIndex: index }, "", path);
|
|
53
136
|
pendingScroll = url.hash !== "" ? { hash: hashId(url.hash) } : { pos: [0, 0] };
|
|
54
137
|
}
|
|
55
138
|
else {
|
|
56
|
-
// Save the leaving entry's scroll
|
|
57
|
-
// route: to the fragment target if
|
|
139
|
+
// Save the leaving entry's scroll (spread keeps its nifraIndex), push a fresh higher-indexed entry
|
|
140
|
+
// (URL incl. any #hash), then scroll the new route: to the fragment target if given, else the top.
|
|
58
141
|
history.replaceState({ ...(history.state ?? {}), nifraScroll: [scrollX, scrollY] }, "");
|
|
59
|
-
|
|
142
|
+
index += 1;
|
|
143
|
+
history.pushState({ nifraIndex: index }, "", path);
|
|
60
144
|
pendingScroll = url.hash !== "" ? { hash: hashId(url.hash) } : { pos: [0, 0] };
|
|
61
145
|
}
|
|
146
|
+
here = url.pathname + url.search + url.hash;
|
|
62
147
|
// The data layer fetches by path+search; the #hash is client-only (never sent to the server).
|
|
63
|
-
transition(() => router.navigate(
|
|
148
|
+
transition(() => router.navigate(routePath).catch(() => fallback(path)));
|
|
149
|
+
settle();
|
|
150
|
+
};
|
|
151
|
+
const go = (path, mode) => {
|
|
152
|
+
// Validate before the blocker observes the target. A blocker receives parsed locations, so letting a
|
|
153
|
+
// malformed string reach `locationOf` would make an otherwise no-throw navigate unexpectedly throw.
|
|
154
|
+
const url = parseNavigationUrl(path);
|
|
155
|
+
if (url === null) {
|
|
156
|
+
settle();
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
if (guard(path, () => commit(path, url, mode)))
|
|
160
|
+
return;
|
|
161
|
+
commit(path, url, mode);
|
|
64
162
|
};
|
|
65
163
|
// Programmatic navigation for adapter `useNavigate` bindings, published through the DOM-free bridge
|
|
66
164
|
// (`@nifrajs/web`'s `getBrowserNavigate`). A string path pushes (or replaces); a number is a history
|
|
67
|
-
// delta (`-1` back / `1` forward), matching `history.go`.
|
|
68
|
-
//
|
|
69
|
-
//
|
|
165
|
+
// delta (`-1` back / `1` forward), matching `history.go`. Off-route same-origin destinations hard-load
|
|
166
|
+
// without first creating a stale in-document history entry. Cross-origin and active-scheme strings are
|
|
167
|
+
// rejected; callers that intentionally leave the app use a normal `<a>`.
|
|
70
168
|
const navigate = (to, navOptions) => {
|
|
71
169
|
if (typeof to === "number") {
|
|
72
170
|
history.go(to);
|
|
@@ -75,6 +173,20 @@ export function installHistory(router, options = {}) {
|
|
|
75
173
|
go(to, navOptions?.replace === true ? "replace" : "push");
|
|
76
174
|
};
|
|
77
175
|
setBrowserNavigate(navigate);
|
|
176
|
+
// Publish the guard registry through the DOM-free bridge (`@nifrajs/web`'s `registerBlocker`, which an
|
|
177
|
+
// adapter's `useBlocker` calls). One slot, latest registration wins; the unregister clears it only if
|
|
178
|
+
// it's still the current one (so a stale unmount doesn't wipe a newer guard).
|
|
179
|
+
const controller = {
|
|
180
|
+
register(shouldBlock, onChange) {
|
|
181
|
+
const reg = { shouldBlock, emit: onChange, state: "unblocked" };
|
|
182
|
+
registration = reg;
|
|
183
|
+
return () => {
|
|
184
|
+
if (registration === reg)
|
|
185
|
+
registration = undefined;
|
|
186
|
+
};
|
|
187
|
+
},
|
|
188
|
+
};
|
|
189
|
+
setBlockerController(controller);
|
|
78
190
|
// Resolve an event target to an in-app route path, or null (cross-origin, unknown route, or an
|
|
79
191
|
// anchor opting out via target/download/rel=external). Shared by click + hover/focus prefetch.
|
|
80
192
|
const inAppHref = (target) => {
|
|
@@ -92,9 +204,9 @@ export function installHistory(router, options = {}) {
|
|
|
92
204
|
return null;
|
|
93
205
|
if (router.match(url.pathname) === null)
|
|
94
206
|
return null;
|
|
95
|
-
// A same-page fragment link (`#section`, `/here#section`
|
|
207
|
+
// A same-page fragment link (`#section`, `/here#section` - only the hash differs) → null: let the
|
|
96
208
|
// browser do its native in-page anchor jump. Intercepting it would drop the fragment from the URL
|
|
97
|
-
// and force a scroll-to-top (a fresh push restores [0,0])
|
|
209
|
+
// and force a scroll-to-top (a fresh push restores [0,0]) - i.e. break every in-page anchor (AUDIT
|
|
98
210
|
// H2). (A same-page link with NO hash still soft-navigates, as before.)
|
|
99
211
|
if (url.pathname === location.pathname && url.search === location.search && url.hash !== "")
|
|
100
212
|
return null;
|
|
@@ -121,10 +233,45 @@ export function installHistory(router, options = {}) {
|
|
|
121
233
|
const url = new URL(href, location.origin);
|
|
122
234
|
void router.prefetch(url.pathname + url.search); // warm by path+search; the #hash isn't data
|
|
123
235
|
};
|
|
124
|
-
// Back/forward: the entry exists (no push)
|
|
236
|
+
// Back/forward: the entry already exists (no push). The URL has ALSO already changed - a popstate can't
|
|
237
|
+
// be cancelled - so a guard here can only restore-then-prompt: read the delta from our index, and if the
|
|
238
|
+
// guard holds, `history.go(-delta)` back to where we were (ignoring the popstate that reversal fires via
|
|
239
|
+
// `reversing`) while `proceed` re-issues `history.go(delta)` to redo the move. Unguarded, it's the old
|
|
240
|
+
// path: restore the entry's saved scroll after it renders.
|
|
125
241
|
const onPopState = () => {
|
|
242
|
+
if (reversing) {
|
|
243
|
+
reversing = false;
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
const newIndex = history.state?.nifraIndex ?? 0;
|
|
247
|
+
const dest = location.pathname + location.search + (location.hash ?? "");
|
|
248
|
+
const delta = newIndex - index;
|
|
249
|
+
if (guard(dest, () => history.go(delta))) {
|
|
250
|
+
reversing = true;
|
|
251
|
+
history.go(-delta);
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
index = newIndex;
|
|
255
|
+
here = dest;
|
|
126
256
|
pendingScroll = { pos: scrollOf(history.state) };
|
|
127
257
|
transition(() => router.navigate(location.pathname + location.search).catch(() => fallback(location.pathname)));
|
|
258
|
+
settle();
|
|
259
|
+
};
|
|
260
|
+
// Close / reload / hard navigation away: no in-app destination exists, so consult the guard with the
|
|
261
|
+
// current location as both sides. A dirtiness guard (a boolean, or one that checks its own state) then
|
|
262
|
+
// triggers the browser's native "Leave site?" prompt; a purely destination-based guard won't. Browsers
|
|
263
|
+
// ignore any custom message - the string is set only because legacy engines require `returnValue`.
|
|
264
|
+
const onBeforeUnload = (event) => {
|
|
265
|
+
const reg = registration;
|
|
266
|
+
if (reg === undefined || reg.state === "proceeding")
|
|
267
|
+
return;
|
|
268
|
+
// `blocked` already proves the guard found unsaved state. Re-check only while idle; suppressing the
|
|
269
|
+
// native prompt merely because an in-app confirmation is open creates a close/reload data-loss gap.
|
|
270
|
+
if (reg.state === "unblocked" &&
|
|
271
|
+
!reg.shouldBlock({ currentLocation: locationOf(here), nextLocation: locationOf(here) }))
|
|
272
|
+
return;
|
|
273
|
+
event.preventDefault();
|
|
274
|
+
event.returnValue = "";
|
|
128
275
|
};
|
|
129
276
|
// After a navigation settles (content rendered), apply the pending scroll target on the next frame:
|
|
130
277
|
// a fragment's element for a cross-page `#hash`, the saved position for back/forward, else the top.
|
|
@@ -152,39 +299,53 @@ export function installHistory(router, options = {}) {
|
|
|
152
299
|
document.addEventListener("pointerover", onPrefetch);
|
|
153
300
|
document.addEventListener("focusin", onPrefetch);
|
|
154
301
|
window.addEventListener("popstate", onPopState);
|
|
302
|
+
window.addEventListener("beforeunload", onBeforeUnload);
|
|
155
303
|
return () => {
|
|
156
304
|
unsubscribe();
|
|
157
305
|
setBrowserNavigate(undefined); // stop routing `useNavigate` to a torn-down router
|
|
306
|
+
setBlockerController(undefined); // stop routing `useBlocker` to a torn-down registry
|
|
158
307
|
document.removeEventListener("click", onClick);
|
|
159
308
|
document.removeEventListener("pointerover", onPrefetch);
|
|
160
309
|
document.removeEventListener("focusin", onPrefetch);
|
|
161
310
|
window.removeEventListener("popstate", onPopState);
|
|
311
|
+
window.removeEventListener("beforeunload", onBeforeUnload);
|
|
162
312
|
};
|
|
163
313
|
}
|
|
164
314
|
/**
|
|
165
315
|
* Intercept submissions of same-origin `<form method="post">` whose action targets an app route:
|
|
166
|
-
* submit via the router (no full reload
|
|
316
|
+
* submit via the router (no full reload - POST the action, then revalidate the active loader). On
|
|
167
317
|
* failure it falls back to a native submit, so the form still works. Returns a teardown function.
|
|
168
318
|
*/
|
|
169
319
|
/**
|
|
170
320
|
* Sync the document head to a route's resolved {@link Meta} on client navigation. Sets the title
|
|
171
|
-
* (when provided) and replaces the **managed** (`data-nifra`) `<meta>`/`<link>` tags
|
|
321
|
+
* (when provided) and replaces the **managed** (`data-nifra`) `<meta>`/`<link>` tags - static head
|
|
172
322
|
* content (charset, hand-written tags) is never touched. SSR injects the same `data-nifra` tags, so
|
|
173
323
|
* the first navigation cleanly takes over from the server-rendered head.
|
|
174
324
|
*/
|
|
175
325
|
export function applyHead(head) {
|
|
176
326
|
if (head.title !== undefined)
|
|
177
327
|
document.title = head.title;
|
|
328
|
+
// `<html lang>`/`<html dir>` - applied AUTHORITATIVELY (unlike `title`, which is left alone when the
|
|
329
|
+
// route omits it), mirroring the SSR shell's defaulting exactly: `lang` falls back to `"en"`, `dir` is
|
|
330
|
+
// removed when unset. Anything laxer drifts on a multilingual site - navigating /ur → /en would leave
|
|
331
|
+
// `dir="rtl"` behind and lay the English page out right-to-left, a bug a hard reload would not show.
|
|
332
|
+
const root = document.documentElement;
|
|
333
|
+
root.setAttribute("lang", head.lang ?? "en");
|
|
334
|
+
if (head.dir === undefined)
|
|
335
|
+
root.removeAttribute("dir");
|
|
336
|
+
else
|
|
337
|
+
root.setAttribute("dir", head.dir);
|
|
178
338
|
for (const el of document.head.querySelectorAll("[data-nifra]"))
|
|
179
339
|
el.remove();
|
|
180
340
|
// Values follow the same HTML attribute conventions as the SSR `tagAttrs`: a string sets the value,
|
|
181
|
-
// `true` sets the bare boolean attribute, `false`/`undefined` skip it
|
|
341
|
+
// `true` sets the bare boolean attribute, `false`/`undefined` skip it - so a soft-nav head matches
|
|
182
342
|
// the server-rendered one exactly (no hydration drift on the managed tags).
|
|
183
343
|
const add = (tag, attrs) => {
|
|
344
|
+
const trusted = trustedHeadAttributes(tag, attrs);
|
|
345
|
+
if (trusted === null)
|
|
346
|
+
return;
|
|
184
347
|
const el = document.createElement(tag);
|
|
185
|
-
for (const [name, value] of
|
|
186
|
-
if (value === undefined || value === false)
|
|
187
|
-
continue;
|
|
348
|
+
for (const [name, value] of trusted) {
|
|
188
349
|
el.setAttribute(name, value === true ? "" : value);
|
|
189
350
|
}
|
|
190
351
|
el.setAttribute("data-nifra", "");
|
|
@@ -194,13 +355,34 @@ export function applyHead(head) {
|
|
|
194
355
|
add("meta", m);
|
|
195
356
|
for (const l of head.link ?? [])
|
|
196
357
|
add("link", l);
|
|
197
|
-
// `<script>` slot (JSON-LD etc.)
|
|
358
|
+
// `<script>` slot (JSON-LD etc.) - soft-nav parity with the SSR `headTags` script render. Set the body
|
|
198
359
|
// via `textContent`, NOT `innerHTML`: `textContent` assigns the raw string without HTML re-parsing, so
|
|
199
|
-
// a `</script>` (or `<!--`/`]]>`) payload in the JSON-LD can't break out
|
|
360
|
+
// a `</script>` (or `<!--`/`]]>`) payload in the JSON-LD can't break out - the DOM-native equivalent of
|
|
200
361
|
// the server's `escapeScriptContent`. `type` defaults to `application/ld+json` (matching the SSR side).
|
|
201
362
|
for (const s of head.script ?? []) {
|
|
363
|
+
const type = s.type ?? "application/ld+json";
|
|
364
|
+
if (!INERT_SCRIPT_TYPES.has(type)) {
|
|
365
|
+
throw new TypeError("[nifra/web] refusing executable content in the inert head.script slot");
|
|
366
|
+
}
|
|
367
|
+
const el = document.createElement("script");
|
|
368
|
+
el.setAttribute("type", type);
|
|
369
|
+
el.textContent = s.content;
|
|
370
|
+
el.setAttribute("data-nifra", "");
|
|
371
|
+
document.head.appendChild(el);
|
|
372
|
+
}
|
|
373
|
+
for (const s of head.unsafeScript ?? []) {
|
|
374
|
+
if (s.unsafe !== true || s.nonce.trim() === "") {
|
|
375
|
+
throw new TypeError("[nifra/web] executable inline scripts require a non-empty CSP nonce");
|
|
376
|
+
}
|
|
377
|
+
// Same allowlist the server applies. `setAttribute` cannot be broken out of the way the server's
|
|
378
|
+
// template literal could, so this is not about injection here - it is about the two halves
|
|
379
|
+
// accepting the same documents, so a head that renders cannot fail on the next soft-nav.
|
|
380
|
+
if (!EXECUTABLE_SCRIPT_TYPES.has(s.type)) {
|
|
381
|
+
throw new TypeError(`[nifra/web] unsupported executable script type ${JSON.stringify(s.type)}`);
|
|
382
|
+
}
|
|
202
383
|
const el = document.createElement("script");
|
|
203
|
-
el.setAttribute("type", s.type
|
|
384
|
+
el.setAttribute("type", s.type);
|
|
385
|
+
el.setAttribute("nonce", s.nonce);
|
|
204
386
|
el.textContent = s.content;
|
|
205
387
|
el.setAttribute("data-nifra", "");
|
|
206
388
|
document.head.appendChild(el);
|
|
@@ -225,7 +407,7 @@ export function installForms(router) {
|
|
|
225
407
|
// actionData drives the update); absent or any other value keeps the default revalidation.
|
|
226
408
|
const revalidate = form.dataset.nifraRevalidate !== "false";
|
|
227
409
|
router.submit(url.pathname + url.search, new FormData(form), { revalidate }).catch(() => {
|
|
228
|
-
form.submit(); // data submit failed
|
|
410
|
+
form.submit(); // data submit failed - fall back to a full-page POST
|
|
229
411
|
});
|
|
230
412
|
};
|
|
231
413
|
document.addEventListener("submit", onSubmit);
|
|
@@ -236,7 +418,7 @@ export function installForms(router) {
|
|
|
236
418
|
* and fires a one-shot `nifra:hydrated` event. The generated client entry calls this on the next frame
|
|
237
419
|
* after the adapter mounts (so every framework binding gets it), letting apps gate a custom JS-only
|
|
238
420
|
* interaction that would otherwise fire before its handler is attached. Idempotent. nifra's own
|
|
239
|
-
* progressive-enhancement forms/links don't need it
|
|
421
|
+
* progressive-enhancement forms/links don't need it - only hand-wired onClick/onSubmit handlers with no
|
|
240
422
|
* native fallback do. See the Hydration guide.
|
|
241
423
|
*/
|
|
242
424
|
export function signalHydrated() {
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/conformance.d.ts
CHANGED
|
@@ -39,8 +39,8 @@ export declare class RenderAdapterConformanceError extends Error {
|
|
|
39
39
|
* and hydration-head output is a stable string. It rejects with
|
|
40
40
|
* {@link RenderAdapterConformanceError} naming the first failed check.
|
|
41
41
|
*
|
|
42
|
-
* Framework semantics outside the interface
|
|
43
|
-
* error boundaries, and framework-specific primitives
|
|
42
|
+
* Framework semantics outside the interface-Suspense scheduling, compiler plugins, DOM hydration,
|
|
43
|
+
* error boundaries, and framework-specific primitives-remain the adapter package's local tests.
|
|
44
44
|
*/
|
|
45
45
|
export declare function assertRenderAdapterConformance(adapter: RenderAdapter, fixture: RenderAdapterConformanceFixture): Promise<void>;
|
|
46
46
|
//# sourceMappingURL=conformance.d.ts.map
|
package/dist/conformance.js
CHANGED
|
@@ -60,8 +60,8 @@ const readHtml = async (render, check) => {
|
|
|
60
60
|
* and hydration-head output is a stable string. It rejects with
|
|
61
61
|
* {@link RenderAdapterConformanceError} naming the first failed check.
|
|
62
62
|
*
|
|
63
|
-
* Framework semantics outside the interface
|
|
64
|
-
* error boundaries, and framework-specific primitives
|
|
63
|
+
* Framework semantics outside the interface-Suspense scheduling, compiler plugins, DOM hydration,
|
|
64
|
+
* error boundaries, and framework-specific primitives-remain the adapter package's local tests.
|
|
65
65
|
*/
|
|
66
66
|
export async function assertRenderAdapterConformance(adapter, fixture) {
|
|
67
67
|
const { markers, page, outerLayout, innerLayout, props } = fixture;
|
|
@@ -98,7 +98,7 @@ export async function assertRenderAdapterConformance(adapter, fixture) {
|
|
|
98
98
|
fail("buffered render", "renderToString must return a string");
|
|
99
99
|
const bufferedHtml = buffered;
|
|
100
100
|
if (fixture.deferred) {
|
|
101
|
-
// Deferred content differs between streaming and buffered renders
|
|
101
|
+
// Deferred content differs between streaming and buffered renders - only require every marker.
|
|
102
102
|
for (const marker of [
|
|
103
103
|
markers.outer,
|
|
104
104
|
markers.inner,
|
package/dist/deferred.d.ts
CHANGED
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
* Deferred loader data (`defer()`). A loader may mark slow values as deferred: the critical data
|
|
3
3
|
* renders in the shell, the deferred data streams in behind a `<Suspense>` (the adapter's `<Await>`
|
|
4
4
|
* consumes it) and resolves on the client **without a re-fetch**. This module owns the agnostic
|
|
5
|
-
* protocol
|
|
5
|
+
* protocol - the marker, the resolved/deferred split, and the tiny client registry that streamed
|
|
6
6
|
* resolution scripts settle. The per-adapter `<Await>` lives in `@nifrajs/web-{solid,react}/client`.
|
|
7
7
|
*/
|
|
8
8
|
import { type TransportCodec } from "@nifrajs/core/transport-codec";
|
|
9
9
|
/**
|
|
10
10
|
* A loader value marked to stream in after the shell. The component consumes it with the adapter's
|
|
11
11
|
* `<Await resolve={...}>`; until the promise settles the shell shows the `<Suspense>` fallback.
|
|
12
|
-
* `id` is assigned by the server at serialization time
|
|
12
|
+
* `id` is assigned by the server at serialization time - the streamed resolve script keys off it.
|
|
13
13
|
*/
|
|
14
14
|
export interface Deferred<T> {
|
|
15
15
|
readonly __nifra_deferred: true;
|
|
@@ -17,8 +17,8 @@ export interface Deferred<T> {
|
|
|
17
17
|
readonly promise: Promise<T>;
|
|
18
18
|
}
|
|
19
19
|
/**
|
|
20
|
-
* Mark a loader value as deferred
|
|
21
|
-
* **anywhere** in the loader's returned data
|
|
20
|
+
* Mark a loader value as deferred - it streams in after the shell instead of blocking it. Works
|
|
21
|
+
* **anywhere** in the loader's returned data - a top-level key, or nested in objects/arrays:
|
|
22
22
|
*
|
|
23
23
|
* return { user: await api.user.get(), feed: defer(api.user.feed()),
|
|
24
24
|
* panels: [{ chart: defer(api.metrics()) }] }
|
|
@@ -30,8 +30,8 @@ export declare function defer<T>(promise: Promise<T>): Deferred<T>;
|
|
|
30
30
|
/**
|
|
31
31
|
* Split a loader (or action) result into the **component-facing** data (deferred values carry their
|
|
32
32
|
* assigned `id` + promise, for `<Await>`) and the **client-serializable** data (deferred values
|
|
33
|
-
* replaced with a `{__nifra_deferred: id}` placeholder
|
|
34
|
-
* **recursively**
|
|
33
|
+
* replaced with a `{__nifra_deferred: id}` placeholder - promises don't serialize). Walks the tree
|
|
34
|
+
* **recursively** - `defer()` works at any depth, inside nested objects and arrays - assigning ids in
|
|
35
35
|
* walk order. `idOffset` continues the id space when a page splits two results (loader data **and**
|
|
36
36
|
* action data) into one shared client registry, so their ids don't collide. `deferred` lists the
|
|
37
37
|
* promises for callers that await them. Recurses plain objects + arrays only; the data is expected to
|
|
@@ -46,7 +46,7 @@ export declare function prepareDeferred(data: unknown, idOffset?: number): {
|
|
|
46
46
|
}>;
|
|
47
47
|
};
|
|
48
48
|
/**
|
|
49
|
-
* Stable, non-leaking payload streamed to the client when a deferred value rejects
|
|
49
|
+
* Stable, non-leaking payload streamed to the client when a deferred value rejects - never the raw
|
|
50
50
|
* error text. The real reason is logged server-side; `<Await>`'s `errorFallback` receives
|
|
51
51
|
* this code. (A future typed `DeferredError` could opt into a public, intentional message.) Shared by
|
|
52
52
|
* the NDJSON soft-nav transport and the full-document SSR path (`renderPage`'s `streamDocument`).
|
|
@@ -55,7 +55,7 @@ export declare const DEFERRED_ERROR_CODE = "deferred_error";
|
|
|
55
55
|
/**
|
|
56
56
|
* Stream a loader result as NDJSON for a client (soft) navigation: line 1 is the critical data with
|
|
57
57
|
* `{__nifra_deferred: id}` placeholders (`forClient`), then one line per deferred as its promise
|
|
58
|
-
* settles
|
|
58
|
+
* settles - `{"i": id, "v": value}` on resolve, `{"i": id, "e": "deferred_error"}` on reject (a
|
|
59
59
|
* rejection is data, not a stream error; the opaque code never leaks the raw reason). Closes when all
|
|
60
60
|
* settle. The client (`defaultFetchData`) returns the
|
|
61
61
|
* data after line 1 and settles `<Await>`'s markers as the resolution lines arrive. `JSON.stringify`
|
|
@@ -73,10 +73,10 @@ export declare function ndjsonStream(forClient: unknown, deferred: ReadonlyArray
|
|
|
73
73
|
* works), plus `__nifraDeferred(id)` to read the promise. A plain inline script (not the deferred
|
|
74
74
|
* module entry), so it runs before any streamed resolve script.
|
|
75
75
|
*/
|
|
76
|
-
export declare const DEFERRED_RUNTIME = "(() => {\n const reg = new Map();\n const get = (id) => {\n let e = reg.get(id);\n if (!e) {\n let r, j;\n const p = new Promise((a, b) => { r = a; j = b; });\n // <Await> reads the tagged status/reason synchronously (it never .then()s a rejected promise),\n // so attach a no-op catch to keep a rejection from surfacing as an unhandled rejection.\n p.catch(() => {});\n e = { p, r, j };\n reg.set(id, e);\n }\n return e;\n };\n window.__nifraDeferred = (id) => get(id).p;\n // Tag the promise (status/value/reason)
|
|
76
|
+
export declare const DEFERRED_RUNTIME = "(() => {\n const reg = new Map();\n const get = (id) => {\n let e = reg.get(id);\n if (!e) {\n let r, j;\n const p = new Promise((a, b) => { r = a; j = b; });\n // <Await> reads the tagged status/reason synchronously (it never .then()s a rejected promise),\n // so attach a no-op catch to keep a rejection from surfacing as an unhandled rejection.\n p.catch(() => {});\n e = { p, r, j };\n reg.set(id, e);\n }\n return e;\n };\n window.__nifraDeferred = (id) => get(id).p;\n // Tag the promise (status/value/reason) - React's use() reads them and returns SYNCHRONOUSLY at\n // hydration, so it renders the resolved content directly into the <Suspense> boundary the server\n // streamed (no re-suspend, no fallback flash). r/j also wake awaiters (Solid uses its own _$HY).\n window.__nifraResolve = (id, v) => { const e = get(id); e.p.status = \"fulfilled\"; e.p.value = v; e.r(v); };\n window.__nifraReject = (id, x) => { const e = get(id); e.p.status = \"rejected\"; e.p.reason = x; e.j(x); };\n})();";
|
|
77
77
|
/**
|
|
78
78
|
* Source emitted into the generated client entry: maps serialized `{__nifra_deferred: id}` placeholders
|
|
79
|
-
* (at any depth
|
|
79
|
+
* (at any depth - nested objects/arrays) to the registry's promises, so the component receives real
|
|
80
80
|
* promises to `<Await>`. A no-op for data without placeholders (so non-deferred pages are unchanged).
|
|
81
81
|
*/
|
|
82
82
|
export declare const MAP_DEFERRED_SOURCE = "const mapDeferred = (d) => {\n if (!d || typeof d !== \"object\") return d\n if (typeof d.__nifra_deferred === \"number\") return { __nifra_deferred: true, id: d.__nifra_deferred, promise: window.__nifraDeferred(d.__nifra_deferred) }\n if (Array.isArray(d)) return d.map(mapDeferred)\n const out = {}\n for (const k in d) out[k] = mapDeferred(d[k])\n return out\n}";
|
|
@@ -85,7 +85,7 @@ export declare const MAP_DEFERRED_SOURCE = "const mapDeferred = (d) => {\n if (
|
|
|
85
85
|
* the NDJSON body into a data object whose deferred markers settle as resolution lines arrive.
|
|
86
86
|
* Returns after **line 1** so the router can apply the critical data + render immediately; the
|
|
87
87
|
* markers' promises settle/reject in the background. If the stream ends (or `signal` aborts) with
|
|
88
|
-
* markers unsettled, they reject
|
|
88
|
+
* markers unsettled, they reject - so `<Await>` never hangs.
|
|
89
89
|
*/
|
|
90
90
|
export declare function parseNdjsonData(stream: ReadableStream<Uint8Array>, signal?: AbortSignal, codec?: TransportCodec): Promise<unknown>;
|
|
91
91
|
//# sourceMappingURL=deferred.d.ts.map
|
package/dist/deferred.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deferred.d.ts","sourceRoot":"","sources":["../src/deferred.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAkB,KAAK,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAEnF;;;;GAIG;AACH,MAAM,WAAW,QAAQ,CAAC,CAAC;IACzB,QAAQ,CAAC,gBAAgB,EAAE,IAAI,CAAA;IAC/B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;CAC7B;AAED;;;;;;;;;GASG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAKzD;AAYD;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,OAAO,EACb,QAAQ,SAAI,GACX;IACD,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAA;IAC9B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;QAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;KAAE,CAAC,CAAA;CAC9F,CA2EA;AAED;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,mBAAmB,CAAA;AAInD;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAC1B,SAAS,EAAE,OAAO,EAClB,QAAQ,EAAE,aAAa,CAAC;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;CAAE,CAAC,EACpF,KAAK,GAAE,cAA+B,GACrC,cAAc,CAAC,UAAU,CAAC,CAsB5B;AAED;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,
|
|
1
|
+
{"version":3,"file":"deferred.d.ts","sourceRoot":"","sources":["../src/deferred.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAkB,KAAK,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAEnF;;;;GAIG;AACH,MAAM,WAAW,QAAQ,CAAC,CAAC;IACzB,QAAQ,CAAC,gBAAgB,EAAE,IAAI,CAAA;IAC/B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;CAC7B;AAED;;;;;;;;;GASG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAKzD;AAYD;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,OAAO,EACb,QAAQ,SAAI,GACX;IACD,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAA;IAC9B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;QAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;KAAE,CAAC,CAAA;CAC9F,CA2EA;AAED;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,mBAAmB,CAAA;AAInD;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAC1B,SAAS,EAAE,OAAO,EAClB,QAAQ,EAAE,aAAa,CAAC;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;CAAE,CAAC,EACpF,KAAK,GAAE,cAA+B,GACrC,cAAc,CAAC,UAAU,CAAC,CAsB5B;AAED;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,siCAqBvB,CAAA;AAEN;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,uXAO9B,CAAA;AA8CF;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,EAClC,MAAM,CAAC,EAAE,WAAW,EACpB,KAAK,GAAE,cAA+B,GACrC,OAAO,CAAC,OAAO,CAAC,CA4DlB"}
|