@madojs/mado 0.11.1 → 0.13.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/AGENTS.md +116 -32
- package/CHANGELOG.md +216 -1
- package/README.md +158 -173
- package/dist/src/component.d.ts +6 -3
- package/dist/src/component.d.ts.map +1 -0
- package/dist/src/component.js +163 -36
- package/dist/src/component.js.map +1 -1
- package/dist/src/context.d.ts +13 -32
- package/dist/src/context.d.ts.map +1 -0
- package/dist/src/context.js +73 -48
- package/dist/src/context.js.map +1 -1
- package/dist/src/css.d.ts +1 -0
- package/dist/src/css.d.ts.map +1 -0
- package/dist/src/css.js +34 -5
- package/dist/src/css.js.map +1 -1
- package/dist/src/devtools-hook.d.ts +14 -0
- package/dist/src/devtools-hook.d.ts.map +1 -0
- package/dist/src/devtools-hook.js +27 -0
- package/dist/src/devtools-hook.js.map +1 -0
- package/dist/src/devtools.d.ts +24 -22
- package/dist/src/devtools.d.ts.map +1 -0
- package/dist/src/devtools.js +230 -58
- package/dist/src/devtools.js.map +1 -1
- package/dist/src/diagnostics.d.ts +12 -0
- package/dist/src/diagnostics.d.ts.map +1 -0
- package/dist/src/diagnostics.js +68 -8
- package/dist/src/diagnostics.js.map +1 -1
- package/dist/src/each.d.ts +1 -5
- package/dist/src/each.d.ts.map +1 -0
- package/dist/src/each.js +0 -8
- package/dist/src/each.js.map +1 -1
- package/dist/src/forms.d.ts +27 -96
- package/dist/src/forms.d.ts.map +1 -0
- package/dist/src/forms.js +184 -394
- package/dist/src/forms.js.map +1 -1
- package/dist/src/head.d.ts +7 -6
- package/dist/src/head.d.ts.map +1 -0
- package/dist/src/head.js +8 -7
- package/dist/src/head.js.map +1 -1
- package/dist/src/html/bindings.d.ts +1 -0
- package/dist/src/html/bindings.d.ts.map +1 -0
- package/dist/src/html/bindings.js.map +1 -1
- package/dist/src/html/parser.d.ts +4 -5
- package/dist/src/html/parser.d.ts.map +1 -0
- package/dist/src/html/parser.js +64 -15
- package/dist/src/html/parser.js.map +1 -1
- package/dist/src/html/template-types.d.ts +1 -0
- package/dist/src/html/template-types.d.ts.map +1 -0
- package/dist/src/html/template-types.js.map +1 -1
- package/dist/src/html/template.d.ts +5 -1
- package/dist/src/html/template.d.ts.map +1 -0
- package/dist/src/html/template.js +102 -13
- package/dist/src/html/template.js.map +1 -1
- package/dist/src/index.d.ts +15 -12
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +18 -10
- package/dist/src/index.js.map +1 -1
- package/dist/src/json.d.ts +3 -0
- package/dist/src/json.d.ts.map +1 -0
- package/dist/src/json.js +14 -0
- package/dist/src/json.js.map +1 -0
- package/dist/src/lifecycle.d.ts +1 -0
- package/dist/src/lifecycle.d.ts.map +1 -0
- package/dist/src/lifecycle.js +3 -2
- package/dist/src/lifecycle.js.map +1 -1
- package/dist/src/page.d.ts +63 -28
- package/dist/src/page.d.ts.map +1 -0
- package/dist/src/page.js +5 -0
- package/dist/src/page.js.map +1 -1
- package/dist/src/persisted.d.ts +6 -1
- package/dist/src/persisted.d.ts.map +1 -0
- package/dist/src/persisted.js +17 -11
- package/dist/src/persisted.js.map +1 -1
- package/dist/src/resource.d.ts +2 -1
- package/dist/src/resource.d.ts.map +1 -0
- package/dist/src/resource.js +128 -50
- package/dist/src/resource.js.map +1 -1
- package/dist/src/router/base.d.ts +66 -0
- package/dist/src/router/base.d.ts.map +1 -0
- package/dist/src/router/base.js +168 -0
- package/dist/src/router/base.js.map +1 -0
- package/dist/src/router/manifest.d.ts +1 -0
- package/dist/src/router/manifest.d.ts.map +1 -0
- package/dist/src/router/manifest.js +156 -171
- package/dist/src/router/manifest.js.map +1 -1
- package/dist/src/router/match.d.ts +17 -2
- package/dist/src/router/match.d.ts.map +1 -0
- package/dist/src/router/match.js +60 -6
- package/dist/src/router/match.js.map +1 -1
- package/dist/src/router/navigation.d.ts +1 -0
- package/dist/src/router/navigation.d.ts.map +1 -0
- package/dist/src/router/navigation.js +58 -9
- package/dist/src/router/navigation.js.map +1 -1
- package/dist/src/signal.d.ts +1 -0
- package/dist/src/signal.d.ts.map +1 -0
- package/dist/src/signal.js +46 -17
- package/dist/src/signal.js.map +1 -1
- package/dist/src/static-runtime.d.ts +82 -0
- package/dist/src/static-runtime.d.ts.map +1 -0
- package/dist/src/static-runtime.js +209 -0
- package/dist/src/static-runtime.js.map +1 -0
- package/dist/src/vite/index.d.ts +32 -3
- package/dist/src/vite/index.d.ts.map +1 -0
- package/dist/src/vite/index.js +49 -17
- package/dist/src/vite/index.js.map +1 -1
- package/docs/README.md +5 -8
- package/docs/architecture/adr/0001-browser-static-snapshots.md +132 -0
- package/docs/architecture/v1-roadmap.md +19 -0
- package/docs/en/00-the-mado-way.md +1 -1
- package/docs/en/01-quickstart.md +183 -0
- package/docs/en/10-pages-and-components.md +279 -0
- package/docs/en/11-templates-and-signals.md +211 -0
- package/docs/en/12-routing.md +229 -0
- package/docs/en/13-data.md +227 -0
- package/docs/en/14-forms.md +91 -0
- package/docs/en/15-static-snapshots.md +181 -0
- package/docs/en/{10-app-architecture.md → 16-app-architecture.md} +56 -4
- package/docs/en/{13-deployment.md → 20-deployment.md} +79 -17
- package/docs/en/{15-error-handling.md → 21-error-handling.md} +9 -6
- package/docs/en/{14-testing.md → 22-testing.md} +6 -5
- package/docs/en/23-cookbook.md +292 -0
- package/docs/en/24-devtools-and-diagnostics.md +45 -0
- package/docs/en/{18-api-freeze-map.md → 30-api-freeze-map.md} +17 -9
- package/docs/en/{20-v1-stability.md → 32-v1-stability.md} +5 -5
- package/docs/en/33-migration-0.12-0.13.md +56 -0
- package/docs/en/40-llm-guide.md +774 -0
- package/docs/en/{06-for-backenders.md → 41-for-backenders.md} +28 -25
- package/docs/en/{05-why-mado.md → 42-why-mado.md} +3 -3
- package/docs/en/README.md +99 -27
- package/docs/recipes/nginx/Containerfile +26 -0
- package/docs/recipes/nginx/nginx.conf +42 -0
- package/llms.txt +263 -210
- package/package.json +51 -23
- package/scripts/clean.mjs +8 -0
- package/scripts/cli/generate.mjs +57 -10
- package/scripts/cli/help.mjs +13 -5
- package/scripts/cli/index.mjs +31 -7
- package/scripts/cli/init.mjs +19 -19
- package/scripts/cli/release.mjs +38 -83
- package/scripts/cli/run.mjs +5 -3
- package/scripts/logger.mjs +117 -0
- package/scripts/output-guard.mjs +128 -0
- package/scripts/preview.mjs +105 -24
- package/scripts/static/browser.mjs +695 -0
- package/scripts/static/discover.mjs +284 -0
- package/scripts/static/output.mjs +141 -0
- package/scripts/static/serialize.mjs +212 -0
- package/scripts/static/server.mjs +167 -0
- package/scripts/static.mjs +205 -0
- package/starters/default/README.md +57 -55
- package/starters/default/package.json +6 -12
- package/starters/default/src/app.routes.ts +20 -33
- package/starters/default/src/components/feature-card.component.ts +40 -0
- package/starters/default/src/components/live-counter.component.ts +57 -0
- package/starters/default/src/content/guides.ts +55 -0
- package/starters/default/src/main.ts +9 -13
- package/starters/default/src/pages/app.page.ts +41 -0
- package/starters/default/src/pages/guide.page.ts +40 -0
- package/starters/default/src/pages/home.page.ts +49 -0
- package/starters/default/src/pages/not-found.page.ts +18 -0
- package/starters/default/src/styles/document.css +39 -0
- package/starters/default/src/styles/reset.css +37 -0
- package/starters/default/src/styles/tokens.css +30 -0
- package/starters/default/src/styles.d.ts +3 -1
- package/starters/default/src/vite-env.d.ts +1 -1
- package/starters/default/tsconfig.node.json +13 -0
- package/starters/default/vite.config.ts +14 -4
- package/starters/modular/README.md +142 -0
- package/starters/modular/index.html +13 -0
- package/starters/modular/package.json +30 -0
- package/starters/modular/src/app.routes.ts +39 -0
- package/starters/{default → modular}/src/layouts/app-shell.layout.ts +9 -7
- package/starters/{default → modular}/src/layouts/auth-shell.layout.ts +3 -3
- package/starters/modular/src/main.ts +16 -0
- package/starters/{default → modular}/src/modules/auth/login.page.ts +5 -12
- package/starters/{default → modular}/src/modules/billing/pages/invoice-detail.page.ts +3 -4
- package/starters/{default → modular}/src/modules/billing/pages/invoices-list.page.ts +4 -4
- package/starters/{default → modular}/src/modules/home/home.page.ts +5 -7
- package/starters/modular/src/modules/home/not-found.page.ts +14 -0
- package/starters/{default → modular}/src/shared/styles/reset.css +21 -1
- package/starters/modular/src/styles.d.ts +1 -0
- package/starters/modular/src/vite-env.d.ts +1 -0
- package/starters/modular/tsconfig.json +33 -0
- package/starters/modular/tsconfig.node.json +13 -0
- package/starters/modular/vite.config.ts +132 -0
- package/TODO.md +0 -79
- package/dist/src/lazy.d.ts +0 -38
- package/dist/src/lazy.js +0 -73
- package/dist/src/lazy.js.map +0 -1
- package/docs/en/01-routing.md +0 -152
- package/docs/en/02-project-layout.md +0 -124
- package/docs/en/03-static-bake.md +0 -249
- package/docs/en/04-ide-setup.md +0 -162
- package/docs/en/07-llm-pitfalls.md +0 -724
- package/docs/en/08-llm-zero-history-test.md +0 -56
- package/docs/en/09-shadow-vs-light-dom.md +0 -174
- package/docs/en/11-layouts.md +0 -113
- package/docs/en/12-auth-and-api.md +0 -124
- package/docs/en/16-bake-cookbook.md +0 -100
- package/docs/en/17-shadow-dom-forms.md +0 -192
- package/docs/fr/00-the-mado-way.md +0 -85
- package/docs/fr/01-routing.md +0 -120
- package/docs/fr/02-project-layout.md +0 -84
- package/docs/fr/03-static-bake.md +0 -289
- package/docs/fr/04-ide-setup.md +0 -162
- package/docs/fr/05-why-mado.md +0 -193
- package/docs/fr/06-for-backenders.md +0 -438
- package/docs/fr/07-llm-pitfalls.md +0 -625
- package/docs/fr/08-llm-zero-history-test.md +0 -38
- package/docs/fr/09-shadow-vs-light-dom.md +0 -65
- package/docs/fr/10-app-architecture.md +0 -138
- package/docs/fr/11-layouts.md +0 -47
- package/docs/fr/12-auth-and-api.md +0 -76
- package/docs/fr/13-deployment.md +0 -57
- package/docs/fr/14-testing.md +0 -41
- package/docs/fr/15-error-handling.md +0 -50
- package/docs/fr/16-bake-cookbook.md +0 -88
- package/docs/fr/17-shadow-dom-forms.md +0 -196
- package/docs/fr/18-api-freeze-map.md +0 -63
- package/docs/fr/19-reactivity-ordering.md +0 -97
- package/docs/fr/20-v1-stability.md +0 -88
- package/docs/fr/README.md +0 -27
- package/docs/ru/00-the-mado-way.md +0 -84
- package/docs/ru/01-routing.md +0 -119
- package/docs/ru/02-project-layout.md +0 -84
- package/docs/ru/03-static-bake.md +0 -250
- package/docs/ru/04-ide-setup.md +0 -144
- package/docs/ru/05-why-mado.md +0 -193
- package/docs/ru/06-for-backenders.md +0 -428
- package/docs/ru/07-llm-pitfalls.md +0 -624
- package/docs/ru/08-llm-zero-history-test.md +0 -57
- package/docs/ru/09-shadow-vs-light-dom.md +0 -63
- package/docs/ru/10-app-architecture.md +0 -152
- package/docs/ru/11-layouts.md +0 -47
- package/docs/ru/12-auth-and-api.md +0 -75
- package/docs/ru/13-deployment.md +0 -66
- package/docs/ru/14-testing.md +0 -50
- package/docs/ru/15-error-handling.md +0 -56
- package/docs/ru/16-bake-cookbook.md +0 -95
- package/docs/ru/17-shadow-dom-forms.md +0 -193
- package/docs/ru/18-api-freeze-map.md +0 -64
- package/docs/ru/19-reactivity-ordering.md +0 -95
- package/docs/ru/20-v1-stability.md +0 -82
- package/docs/ru/README.md +0 -25
- package/docs/uk/00-the-mado-way.md +0 -82
- package/docs/uk/01-routing.md +0 -76
- package/docs/uk/02-project-layout.md +0 -73
- package/docs/uk/03-static-bake.md +0 -48
- package/docs/uk/04-ide-setup.md +0 -26
- package/docs/uk/05-why-mado.md +0 -34
- package/docs/uk/06-for-backenders.md +0 -55
- package/docs/uk/07-llm-pitfalls.md +0 -145
- package/docs/uk/08-llm-zero-history-test.md +0 -34
- package/docs/uk/09-shadow-vs-light-dom.md +0 -58
- package/docs/uk/10-app-architecture.md +0 -97
- package/docs/uk/11-layouts.md +0 -47
- package/docs/uk/12-auth-and-api.md +0 -70
- package/docs/uk/13-deployment.md +0 -40
- package/docs/uk/14-testing.md +0 -34
- package/docs/uk/15-error-handling.md +0 -32
- package/docs/uk/16-bake-cookbook.md +0 -36
- package/docs/uk/17-shadow-dom-forms.md +0 -193
- package/docs/uk/18-api-freeze-map.md +0 -61
- package/docs/uk/19-reactivity-ordering.md +0 -95
- package/docs/uk/20-v1-stability.md +0 -83
- package/docs/uk/README.md +0 -27
- package/scripts/bake.mjs +0 -570
- package/scripts/package-smoke.mjs +0 -77
- package/scripts/release-notes.mjs +0 -66
- package/scripts/size-budget.mjs +0 -91
- package/starters/default/src/modules/home/not-found.page.ts +0 -11
- package/starters/default/src/shared/ui/x-button.component.ts +0 -49
- /package/docs/en/{19-reactivity-ordering.md → 31-reactivity-ordering.md} +0 -0
- /package/starters/{default → modular}/.editorconfig +0 -0
- /package/starters/{default → modular}/eslint.config.mjs +0 -0
- /package/starters/{default → modular}/public/favicon.svg +0 -0
- /package/starters/{default → modular}/src/modules/auth/_contracts/auth-api.types.ts +0 -0
- /package/starters/{default → modular}/src/modules/auth/auth.connector.ts +0 -0
- /package/starters/{default → modular}/src/modules/auth/auth.guard.ts +0 -0
- /package/starters/{default → modular}/src/modules/auth/auth.public.ts +0 -0
- /package/starters/{default → modular}/src/modules/auth/auth.routes.ts +0 -0
- /package/starters/{default → modular}/src/modules/auth/auth.service.ts +0 -0
- /package/starters/{default → modular}/src/modules/auth/auth.types.ts +0 -0
- /package/starters/{default → modular}/src/modules/billing/_contracts/stripe.types.ts +0 -0
- /package/starters/{default → modular}/src/modules/billing/api/stripe.connector.ts +0 -0
- /package/starters/{default → modular}/src/modules/billing/billing.public.ts +0 -0
- /package/starters/{default → modular}/src/modules/billing/billing.routes.ts +0 -0
- /package/starters/{default → modular}/src/modules/billing/billing.types.ts +0 -0
- /package/starters/{default → modular}/src/modules/billing/components/invoice-status-badge.component.ts +0 -0
- /package/starters/{default → modular}/src/modules/billing/data/invoices.resource.ts +0 -0
- /package/starters/{default → modular}/src/shared/http/http-client.ts +0 -0
- /package/starters/{default → modular}/src/shared/http/http-error.ts +0 -0
- /package/starters/{default → modular}/src/shared/http/interceptors.ts +0 -0
- /package/starters/{default → modular}/src/shared/lib/format-date.ts +0 -0
- /package/starters/{default → modular}/src/shared/styles/content.css +0 -0
- /package/starters/{default → modular}/src/shared/styles/shell.css +0 -0
- /package/starters/{default → modular}/src/shared/styles/tokens.css +0 -0
- /package/starters/{default → modular}/src/shared/ui/x-spinner.component.ts +0 -0
|
@@ -13,20 +13,22 @@
|
|
|
13
13
|
* without loading state and without a microtask. Removes flicker on back/forward.
|
|
14
14
|
*/
|
|
15
15
|
import { signal } from "../signal.js";
|
|
16
|
+
import { reportError } from "../diagnostics.js";
|
|
17
|
+
import { emitDevtools } from "../devtools-hook.js";
|
|
16
18
|
import { html } from "../html/template.js";
|
|
17
19
|
import { applyHead } from "../head.js";
|
|
18
20
|
import { createLifecycle, getCurrentLifecycle, runInLifecycle, } from "../lifecycle.js";
|
|
19
21
|
import { flatten, patternToRegex, } from "./match.js";
|
|
22
|
+
import { stripBase } from "./base.js";
|
|
20
23
|
import { navigate, router } from "./navigation.js";
|
|
24
|
+
import { beginStaticRoute, consumeStaticSeed, markStaticRouteReady, recordStaticError, setStaticRouterState, trackStatic, } from "../static-runtime.js";
|
|
21
25
|
/**
|
|
22
26
|
* Registry of active RoutesContexts. Used by the global
|
|
23
27
|
* prefetchPath() — iterates over all active instances. On router.dispose()
|
|
24
28
|
* the corresponding context is removed from the registry.
|
|
25
29
|
*/
|
|
26
30
|
const activeRoutes = new Set();
|
|
27
|
-
const
|
|
28
|
-
let guardRedirectsThisTick = 0;
|
|
29
|
-
let guardRedirectResetScheduled = false;
|
|
31
|
+
const MAX_GUARD_REDIRECTS = 10;
|
|
30
32
|
/**
|
|
31
33
|
* Create a router from a manifest. Returns the same RouterApi as router().
|
|
32
34
|
*/
|
|
@@ -36,13 +38,34 @@ export function routes(manifest, options = {}) {
|
|
|
36
38
|
pathToFlat: new Map(),
|
|
37
39
|
compiledForPrefetch: [],
|
|
38
40
|
renderSeq: 0,
|
|
41
|
+
guardRedirects: 0,
|
|
39
42
|
activeLifecycle: null,
|
|
43
|
+
seedForPathname: null,
|
|
40
44
|
};
|
|
41
45
|
activeRoutes.add(ctx);
|
|
42
46
|
const flat = flatten(manifest);
|
|
43
47
|
const lowLevel = {};
|
|
44
48
|
for (const [pattern, entry] of flat) {
|
|
45
|
-
lowLevel[pattern] = (params) =>
|
|
49
|
+
lowLevel[pattern] = (params) => {
|
|
50
|
+
// Use the ROUTE pathname (Vite base already stripped) so the seed
|
|
51
|
+
// attribute written at capture time matches the lookup at runtime
|
|
52
|
+
// boot regardless of which base the app deploys under.
|
|
53
|
+
const pathname = typeof location !== "undefined" ? stripBase(location.pathname) : "/";
|
|
54
|
+
// Seed lifecycle: consume exactly once per pathname (the script is
|
|
55
|
+
// removed on first read), then keep the value in ctx so subsequent
|
|
56
|
+
// render passes for the same route commit see the same seed. A new
|
|
57
|
+
// pathname triggers begin-route + a fresh consume; navigating back
|
|
58
|
+
// to a previous static URL returns undefined because the script is
|
|
59
|
+
// already gone from the document.
|
|
60
|
+
if (ctx.seedForPathname?.pathname !== pathname) {
|
|
61
|
+
ctx.seedForPathname = {
|
|
62
|
+
pathname,
|
|
63
|
+
value: consumeStaticSeed(pathname),
|
|
64
|
+
};
|
|
65
|
+
beginStaticRoute(pathname);
|
|
66
|
+
}
|
|
67
|
+
return renderEntry(ctx, entry, params, options, ++ctx.renderSeq);
|
|
68
|
+
};
|
|
46
69
|
ctx.pathToFlat.set(pattern, entry);
|
|
47
70
|
if (pattern !== "*") {
|
|
48
71
|
ctx.compiledForPrefetch.push({ regex: patternToRegex(pattern), entry });
|
|
@@ -79,11 +102,21 @@ export function routes(manifest, options = {}) {
|
|
|
79
102
|
* `resource()` in view emits a [mado:resource-outside-lifecycle]
|
|
80
103
|
* warning even when used correctly.
|
|
81
104
|
*/
|
|
82
|
-
function
|
|
105
|
+
function disposeActiveLifecycle(ctx) {
|
|
83
106
|
ctx.activeLifecycle?.dispose();
|
|
107
|
+
ctx.activeLifecycle = null;
|
|
108
|
+
}
|
|
109
|
+
function renderInPageLifecycle(ctx, render) {
|
|
84
110
|
const lc = createLifecycle();
|
|
85
|
-
|
|
86
|
-
|
|
111
|
+
try {
|
|
112
|
+
const value = runInLifecycle(lc, render);
|
|
113
|
+
ctx.activeLifecycle = lc;
|
|
114
|
+
return value;
|
|
115
|
+
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
lc.dispose();
|
|
118
|
+
throw err;
|
|
119
|
+
}
|
|
87
120
|
}
|
|
88
121
|
// ---------- prefetch ----------
|
|
89
122
|
/**
|
|
@@ -112,7 +145,8 @@ async function loadPage(ctx, loader) {
|
|
|
112
145
|
const cached = ctx.moduleCache.get(loader);
|
|
113
146
|
if (cached)
|
|
114
147
|
return cached;
|
|
115
|
-
const
|
|
148
|
+
const loaded = loader();
|
|
149
|
+
const p = await trackIfPromise(loaded, "route module");
|
|
116
150
|
ctx.moduleCache.set(loader, p);
|
|
117
151
|
return p;
|
|
118
152
|
}
|
|
@@ -138,25 +172,30 @@ function tryLoadSync(ctx, entry) {
|
|
|
138
172
|
/**
|
|
139
173
|
* Apply the page's title/head. Extracted from renderEntry so it
|
|
140
174
|
* can be called from both the async and sync branch.
|
|
175
|
+
*
|
|
176
|
+
* `seed` is the build-time static seed consumed once per route commit and
|
|
177
|
+
* passed through both head() and load(); it is `undefined` for SPA
|
|
178
|
+
* navigations and for non-static routes.
|
|
141
179
|
*/
|
|
142
|
-
function applyPageMeta(page, params, options) {
|
|
143
|
-
const
|
|
144
|
-
|
|
145
|
-
document.title = title + (options.titleSuffix ?? "");
|
|
146
|
-
}
|
|
180
|
+
function applyPageMeta(page, params, seed, options) {
|
|
181
|
+
const pageTitle = typeof page.title === "function" ? page.title(params) : page.title;
|
|
182
|
+
let head = {};
|
|
147
183
|
if (!page.head) {
|
|
148
184
|
applyHead({});
|
|
149
|
-
return;
|
|
150
|
-
}
|
|
151
|
-
try {
|
|
152
|
-
const baked = readBaked();
|
|
153
|
-
applyHead(page.head(params, baked));
|
|
154
185
|
}
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
186
|
+
else {
|
|
187
|
+
try {
|
|
188
|
+
head = page.head(params, seed);
|
|
189
|
+
applyHead(head);
|
|
190
|
+
}
|
|
191
|
+
catch (err) {
|
|
192
|
+
applyHead({});
|
|
193
|
+
recordStaticError(err);
|
|
194
|
+
reportError("router", "page-head", "page.head() threw", err);
|
|
195
|
+
}
|
|
159
196
|
}
|
|
197
|
+
const title = head.title ?? pageTitle;
|
|
198
|
+
document.title = title ? title + (options.titleSuffix ?? "") : "";
|
|
160
199
|
}
|
|
161
200
|
/**
|
|
162
201
|
* SYNC FAST PATH: if the page is already in moduleCache, we render it
|
|
@@ -169,52 +208,44 @@ function applyPageMeta(page, params, options) {
|
|
|
169
208
|
* — render the ready page immediately; otherwise show loading.
|
|
170
209
|
*/
|
|
171
210
|
function renderEntry(ctx, entry, params, options, seq) {
|
|
211
|
+
if (typeof __MADO_DEVTOOLS__ === "undefined" || __MADO_DEVTOOLS__)
|
|
212
|
+
emitDevtools("router:navigation", ctx, {
|
|
213
|
+
seq,
|
|
214
|
+
path: typeof location !== "undefined" ? location.pathname + location.search : "/",
|
|
215
|
+
params,
|
|
216
|
+
});
|
|
217
|
+
// Navigation owns the currently visible page lifecycle. Dispose it before
|
|
218
|
+
// loaders/guards begin so halted, redirected and failed navigations cannot
|
|
219
|
+
// leave the previous page's effects alive behind a loading shell.
|
|
220
|
+
disposeActiveLifecycle(ctx);
|
|
172
221
|
// ---------- SYNC FAST PATH ----------
|
|
173
222
|
// Only available when (a) the page+layouts are cached AND (b) there are no
|
|
174
223
|
// guards OR every guard is synchronous and returns void. Anything more
|
|
175
224
|
// complex (async guards, redirects) must take the async path so we never
|
|
176
225
|
// render a route the guard would have stopped.
|
|
177
226
|
const sync = tryLoadSync(ctx, entry);
|
|
178
|
-
const
|
|
179
|
-
|
|
180
|
-
:
|
|
181
|
-
|
|
182
|
-
: undefined;
|
|
183
|
-
if (sync && syncGuardVerdict === null) {
|
|
184
|
-
applyPageMeta(sync.page, params, options);
|
|
227
|
+
const hasGuards = !!sync && (entry.guards.length > 0 || collectPageGuards(sync.page).length > 0);
|
|
228
|
+
if (sync && !hasGuards) {
|
|
229
|
+
setStaticRouterState("render:sync");
|
|
230
|
+
const seed = ctx.seedForPathname?.value;
|
|
185
231
|
try {
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
if (
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
// outer sync check; today that can't happen, but bail to async path
|
|
194
|
-
// defensively.
|
|
195
|
-
if (v)
|
|
196
|
-
return renderGuardVerdictSync(v, options);
|
|
197
|
-
if (v === undefined) {
|
|
198
|
-
// Fall through to async path by skipping the sync return; rebuild
|
|
199
|
-
// the render via a fresh entry-render call would be ideal, but for
|
|
200
|
-
// now log and render nothing. Pages with async guards will not hit
|
|
201
|
-
// sync fast path because trySyncGuards on entry.guards already
|
|
202
|
-
// returned undefined and we never enter this block in that case.
|
|
203
|
-
return html ``;
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
const lc = openPageLifecycle(ctx);
|
|
207
|
-
return runInLifecycle(lc, () => renderWithLayouts(sync.page, sync.layouts, params));
|
|
232
|
+
const view = renderInPageLifecycle(ctx, () => renderWithLayouts(sync.page, sync.layouts, params, seed));
|
|
233
|
+
applyPageMeta(sync.page, params, seed, options);
|
|
234
|
+
ctx.guardRedirects = 0;
|
|
235
|
+
markStaticRouteReady("ready");
|
|
236
|
+
if (typeof __MADO_DEVTOOLS__ === "undefined" || __MADO_DEVTOOLS__)
|
|
237
|
+
emitDevtools("router:ready", ctx, { seq, params, mode: "sync" });
|
|
238
|
+
return view;
|
|
208
239
|
}
|
|
209
240
|
catch (err) {
|
|
210
241
|
const e = err instanceof Error ? err : new Error(String(err));
|
|
242
|
+
recordStaticError(e);
|
|
243
|
+
markStaticRouteReady("error");
|
|
211
244
|
return renderError(e, params, options, sync.page);
|
|
212
245
|
}
|
|
213
246
|
}
|
|
214
|
-
if (sync && syncGuardVerdict) {
|
|
215
|
-
return renderGuardVerdictSync(syncGuardVerdict, options);
|
|
216
|
-
}
|
|
217
247
|
// ---------- ASYNC PATH ----------
|
|
248
|
+
setStaticRouterState("loading");
|
|
218
249
|
// 'idle' — first window (until loadingDelay): render empty to avoid
|
|
219
250
|
// progress-bar flicker on fast connections.
|
|
220
251
|
// 'loading' — module didn't arrive in time → show loading.
|
|
@@ -249,7 +280,7 @@ function renderEntry(ctx, entry, params, options, seq) {
|
|
|
249
280
|
const pageGuards = collectPageGuards(pg);
|
|
250
281
|
let verdict = null;
|
|
251
282
|
if (entry.guards.length > 0 || pageGuards.length > 0) {
|
|
252
|
-
verdict = await runGuards([...entry.guards, ...pageGuards], params);
|
|
283
|
+
verdict = await trackStatic(runGuards([...entry.guards, ...pageGuards], params), "route guards");
|
|
253
284
|
}
|
|
254
285
|
resolved = true;
|
|
255
286
|
if (timer)
|
|
@@ -257,12 +288,20 @@ function renderEntry(ctx, entry, params, options, seq) {
|
|
|
257
288
|
if (isStale(ctx, seq))
|
|
258
289
|
return;
|
|
259
290
|
if (verdict) {
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
291
|
+
setStaticRouterState(`guard:${verdict.kind}`);
|
|
292
|
+
state.set({ kind: "guard" });
|
|
293
|
+
if (typeof __MADO_DEVTOOLS__ === "undefined" || __MADO_DEVTOOLS__)
|
|
294
|
+
emitDevtools("router:guard", ctx, { seq, verdict });
|
|
295
|
+
applyGuardVerdict(ctx, verdict);
|
|
296
|
+
if (verdict.kind === "halt") {
|
|
297
|
+
ctx.guardRedirects = 0;
|
|
298
|
+
markStaticRouteReady("halted");
|
|
299
|
+
}
|
|
300
|
+
// The guard state removes any immediate loading view; a redirect starts
|
|
301
|
+
// a fresh route transaction, while halt remains intentionally blank.
|
|
263
302
|
return;
|
|
264
303
|
}
|
|
265
|
-
applyPageMeta(pg, params, options);
|
|
304
|
+
applyPageMeta(pg, params, ctx.seedForPathname?.value, options);
|
|
266
305
|
state.set({ kind: "ready", page: pg, layouts: lts });
|
|
267
306
|
}
|
|
268
307
|
catch (err) {
|
|
@@ -272,7 +311,12 @@ function renderEntry(ctx, entry, params, options, seq) {
|
|
|
272
311
|
if (isStale(ctx, seq))
|
|
273
312
|
return;
|
|
274
313
|
const e = err instanceof Error ? err : new Error(String(err));
|
|
314
|
+
ctx.guardRedirects = 0;
|
|
315
|
+
recordStaticError(e);
|
|
316
|
+
markStaticRouteReady("error");
|
|
275
317
|
state.set({ kind: "error", err: e });
|
|
318
|
+
if (typeof __MADO_DEVTOOLS__ === "undefined" || __MADO_DEVTOOLS__)
|
|
319
|
+
emitDevtools("router:error", ctx, { seq, error: e });
|
|
276
320
|
}
|
|
277
321
|
})();
|
|
278
322
|
return html `${() => {
|
|
@@ -282,15 +326,29 @@ function renderEntry(ctx, entry, params, options, seq) {
|
|
|
282
326
|
if (s.kind === "loading") {
|
|
283
327
|
return options.loading?.() ?? defaultLoadingView();
|
|
284
328
|
}
|
|
329
|
+
if (s.kind === "guard")
|
|
330
|
+
return "";
|
|
285
331
|
if (s.kind === "error") {
|
|
286
332
|
return renderError(s.err, params, options);
|
|
287
333
|
}
|
|
288
334
|
try {
|
|
289
|
-
const
|
|
290
|
-
|
|
335
|
+
const seed = ctx.seedForPathname?.value;
|
|
336
|
+
const view = renderInPageLifecycle(ctx, () => renderWithLayouts(s.page, s.layouts, params, seed));
|
|
337
|
+
ctx.guardRedirects = 0;
|
|
338
|
+
markStaticRouteReady("ready");
|
|
339
|
+
if (typeof __MADO_DEVTOOLS__ === "undefined" || __MADO_DEVTOOLS__)
|
|
340
|
+
emitDevtools("router:ready", ctx, { seq, params, mode: "async" });
|
|
341
|
+
return view;
|
|
291
342
|
}
|
|
292
343
|
catch (err) {
|
|
293
344
|
const e = err instanceof Error ? err : new Error(String(err));
|
|
345
|
+
disposeActiveLifecycle(ctx);
|
|
346
|
+
applyHead({});
|
|
347
|
+
document.title = "";
|
|
348
|
+
recordStaticError(e);
|
|
349
|
+
markStaticRouteReady("error");
|
|
350
|
+
if (typeof __MADO_DEVTOOLS__ === "undefined" || __MADO_DEVTOOLS__)
|
|
351
|
+
emitDevtools("router:error", ctx, { seq, error: e });
|
|
294
352
|
return renderError(e, params, options, s.page);
|
|
295
353
|
}
|
|
296
354
|
}}`;
|
|
@@ -325,8 +383,7 @@ async function runGuards(guards, params) {
|
|
|
325
383
|
catch (err) {
|
|
326
384
|
// A guard that throws is treated like "halt" — surface the error to the
|
|
327
385
|
// console but do not render the page.
|
|
328
|
-
|
|
329
|
-
console.error("[mado] guard threw:", err);
|
|
386
|
+
reportError("router", "guard", "guard threw", err);
|
|
330
387
|
return { kind: "halt" };
|
|
331
388
|
}
|
|
332
389
|
const verdict = normalizeGuardResult(v);
|
|
@@ -336,33 +393,6 @@ async function runGuards(guards, params) {
|
|
|
336
393
|
}
|
|
337
394
|
return null;
|
|
338
395
|
}
|
|
339
|
-
/**
|
|
340
|
-
* Fast-path: run synchronous guards only. Returns:
|
|
341
|
-
* null → all passed
|
|
342
|
-
* verdict → first non-pass verdict
|
|
343
|
-
* undefined → at least one guard is async, fall through to async path
|
|
344
|
-
*/
|
|
345
|
-
function trySyncGuards(guards, params) {
|
|
346
|
-
const path = typeof location !== "undefined" ? location.pathname + location.search : "/";
|
|
347
|
-
for (const g of guards) {
|
|
348
|
-
let v;
|
|
349
|
-
try {
|
|
350
|
-
v = g({ params, path });
|
|
351
|
-
}
|
|
352
|
-
catch (err) {
|
|
353
|
-
// eslint-disable-next-line no-console
|
|
354
|
-
console.error("[mado] guard threw:", err);
|
|
355
|
-
return { kind: "halt" };
|
|
356
|
-
}
|
|
357
|
-
if (v && typeof v.then === "function")
|
|
358
|
-
return undefined;
|
|
359
|
-
const verdict = normalizeGuardResult(v);
|
|
360
|
-
if (!verdict)
|
|
361
|
-
continue;
|
|
362
|
-
return verdict;
|
|
363
|
-
}
|
|
364
|
-
return null;
|
|
365
|
-
}
|
|
366
396
|
function normalizeGuardResult(verdict) {
|
|
367
397
|
if (verdict === undefined || verdict === true)
|
|
368
398
|
return null;
|
|
@@ -377,34 +407,16 @@ function normalizeGuardResult(verdict) {
|
|
|
377
407
|
return { kind: "halt" };
|
|
378
408
|
return null;
|
|
379
409
|
}
|
|
380
|
-
function applyGuardVerdict(v) {
|
|
410
|
+
function applyGuardVerdict(ctx, v) {
|
|
381
411
|
if (v.kind === "redirect") {
|
|
382
|
-
navigateFromGuard(v.to, v.replace);
|
|
412
|
+
navigateFromGuard(ctx, v.to, v.replace);
|
|
383
413
|
}
|
|
384
414
|
// "halt" — render nothing; caller already aborted.
|
|
385
415
|
}
|
|
386
|
-
function
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
if (v.kind === "redirect") {
|
|
391
|
-
queueMicrotask(() => navigateFromGuard(v.to, v.replace));
|
|
392
|
-
}
|
|
393
|
-
return html ``;
|
|
394
|
-
}
|
|
395
|
-
function navigateFromGuard(to, replace) {
|
|
396
|
-
if (!guardRedirectResetScheduled) {
|
|
397
|
-
guardRedirectResetScheduled = true;
|
|
398
|
-
setTimeout(() => {
|
|
399
|
-
guardRedirectsThisTick = 0;
|
|
400
|
-
guardRedirectResetScheduled = false;
|
|
401
|
-
}, 0);
|
|
402
|
-
}
|
|
403
|
-
guardRedirectsThisTick++;
|
|
404
|
-
if (guardRedirectsThisTick > MAX_GUARD_REDIRECTS_PER_TICK) {
|
|
405
|
-
// eslint-disable-next-line no-console
|
|
406
|
-
console.error("[mado] guard redirect loop detected: more than " +
|
|
407
|
-
`${MAX_GUARD_REDIRECTS_PER_TICK} redirects in one tick; halted at ${to}.`);
|
|
416
|
+
function navigateFromGuard(ctx, to, replace) {
|
|
417
|
+
ctx.guardRedirects++;
|
|
418
|
+
if (ctx.guardRedirects > MAX_GUARD_REDIRECTS) {
|
|
419
|
+
reportError("router", "guard-redirect-loop", `guard redirect loop detected: more than ${MAX_GUARD_REDIRECTS} consecutive redirects; halted at ${to}`, undefined);
|
|
408
420
|
return;
|
|
409
421
|
}
|
|
410
422
|
navigate(to, { replace: replace ?? true });
|
|
@@ -413,89 +425,62 @@ function navigateFromGuard(to, replace) {
|
|
|
413
425
|
* Wrap a page's view in layouts (from inner to outer).
|
|
414
426
|
* Each layout receives `child` = TemplateResult of the child page or
|
|
415
427
|
* next layout — composes like a matryoshka.
|
|
428
|
+
*
|
|
429
|
+
* `seed` is the build-time static seed (or undefined for SPA navigation).
|
|
430
|
+
* It is passed to `page.load(params, seed)`; if no `load` is declared the
|
|
431
|
+
* seed itself becomes the view's data so static-only pages render their
|
|
432
|
+
* initial data without needing a runtime loader.
|
|
416
433
|
*/
|
|
417
|
-
function renderWithLayouts(page, layouts, params) {
|
|
418
|
-
|
|
419
|
-
|
|
434
|
+
function renderWithLayouts(page, layouts, params, seed) {
|
|
435
|
+
// Contract: page.load receives the seed; when no load is declared the
|
|
436
|
+
// seed itself is the runtime data (otherwise static-only pages would
|
|
437
|
+
// lose their initial data after head() has consumed it).
|
|
438
|
+
const data = page.load ? page.load(params, seed) : seed;
|
|
439
|
+
assertSynchronousLoad(data, "page.load");
|
|
420
440
|
// Expose onDispose to page views so they can clean up timers, manual
|
|
421
441
|
// subscriptions, etc. that aren't auto-managed by resource()/effect().
|
|
422
442
|
const lc = getCurrentLifecycle();
|
|
423
443
|
const onDispose = lc ? (fn) => lc.onDispose(fn) : undefined;
|
|
444
|
+
// Expose ROUTE pathname (base stripped) to user views so they receive
|
|
445
|
+
// the same value the matcher works with.
|
|
446
|
+
const routePath = () => stripBase(location.pathname);
|
|
424
447
|
let view = page.view({
|
|
425
448
|
params,
|
|
426
449
|
data,
|
|
427
|
-
path:
|
|
450
|
+
path: routePath,
|
|
428
451
|
child: null,
|
|
429
452
|
onDispose,
|
|
430
453
|
});
|
|
431
454
|
for (let i = layouts.length - 1; i >= 0; i--) {
|
|
432
455
|
const layout = layouts[i];
|
|
433
456
|
const layoutData = layout.load ? layout.load(params) : undefined;
|
|
457
|
+
assertSynchronousLoad(layoutData, "layout.load");
|
|
434
458
|
view = layout.view({
|
|
435
459
|
params,
|
|
436
460
|
data: layoutData,
|
|
437
|
-
path:
|
|
461
|
+
path: routePath,
|
|
438
462
|
child: view,
|
|
439
463
|
onDispose,
|
|
440
464
|
});
|
|
441
465
|
}
|
|
442
466
|
return view;
|
|
443
467
|
}
|
|
468
|
+
function assertSynchronousLoad(value, label) {
|
|
469
|
+
if (value && typeof value.then === "function") {
|
|
470
|
+
throw new TypeError(`[mado:router] ${label} must return a synchronous value or Resource; ` +
|
|
471
|
+
"use resource() for asynchronous data");
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
function trackIfPromise(value, label) {
|
|
475
|
+
return value && typeof value.then === "function"
|
|
476
|
+
? trackStatic(value, label)
|
|
477
|
+
: Promise.resolve(value);
|
|
478
|
+
}
|
|
444
479
|
// ---------- Default loading view ----------
|
|
445
480
|
//
|
|
446
|
-
// Thin progress bar at the top of the screen.
|
|
447
|
-
// globally (lazy, on first show). No animations for prefers-reduced-motion.
|
|
448
|
-
const DEFAULT_LOADING_STYLE_ID = "mado-default-loading-style";
|
|
449
|
-
const DEFAULT_LOADING_CSS = `
|
|
450
|
-
@keyframes mado-progress {
|
|
451
|
-
0% { transform: translateX(-100%); }
|
|
452
|
-
50% { transform: translateX(0%); }
|
|
453
|
-
100% { transform: translateX(100%); }
|
|
454
|
-
}
|
|
455
|
-
.mado-progress-bar {
|
|
456
|
-
position: fixed; top: 0; left: 0; right: 0;
|
|
457
|
-
height: 2px; background: rgba(0,0,0,.06);
|
|
458
|
-
z-index: 2147483647; overflow: hidden;
|
|
459
|
-
pointer-events: none;
|
|
460
|
-
}
|
|
461
|
-
.mado-progress-bar::after {
|
|
462
|
-
content: ""; display: block; height: 100%; width: 40%;
|
|
463
|
-
background: currentColor; opacity: .8;
|
|
464
|
-
animation: mado-progress 1.2s ease-in-out infinite;
|
|
465
|
-
}
|
|
466
|
-
@media (prefers-reduced-motion: reduce) {
|
|
467
|
-
.mado-progress-bar::after { animation: none; width: 100%; }
|
|
468
|
-
}
|
|
469
|
-
`;
|
|
470
|
-
function ensureDefaultLoadingStyle() {
|
|
471
|
-
if (typeof document === "undefined")
|
|
472
|
-
return;
|
|
473
|
-
if (document.getElementById(DEFAULT_LOADING_STYLE_ID))
|
|
474
|
-
return;
|
|
475
|
-
const style = document.createElement("style");
|
|
476
|
-
style.id = DEFAULT_LOADING_STYLE_ID;
|
|
477
|
-
style.textContent = DEFAULT_LOADING_CSS;
|
|
478
|
-
document.head.appendChild(style);
|
|
479
|
-
}
|
|
481
|
+
// Thin progress bar at the top of the screen.
|
|
480
482
|
function defaultLoadingView() {
|
|
481
|
-
|
|
482
|
-
return html `<div class="mado-progress-bar" aria-hidden="true"></div>`;
|
|
483
|
-
}
|
|
484
|
-
/**
|
|
485
|
-
* Read baked data from `<script id="bake" type="application/json">`
|
|
486
|
-
* placed by `scripts/bake.mjs` during static generation. Returns
|
|
487
|
-
* undefined in SPA mode.
|
|
488
|
-
*/
|
|
489
|
-
function readBaked() {
|
|
490
|
-
const el = document.getElementById("bake");
|
|
491
|
-
if (!el || el.textContent == null)
|
|
492
|
-
return undefined;
|
|
493
|
-
try {
|
|
494
|
-
return JSON.parse(el.textContent);
|
|
495
|
-
}
|
|
496
|
-
catch {
|
|
497
|
-
return undefined;
|
|
498
|
-
}
|
|
483
|
+
return html `<div aria-hidden="true" style="position:fixed;inset:0 0 auto;height:2px;background:currentColor;opacity:.65;z-index:2147483647;pointer-events:none"></div>`;
|
|
499
484
|
}
|
|
500
485
|
// ---------- Test hooks ----------
|
|
501
486
|
/** @internal */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../src/router/manifest.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../src/router/manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAG3C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,cAAc,GAEf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,OAAO,EACP,cAAc,GAKf,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAkB,MAAM,iBAAiB,CAAC;AACnE,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,EACjB,oBAAoB,EACpB,WAAW,GACZ,MAAM,sBAAsB,CAAC;AA4E9B;;;;GAIG;AACH,MAAM,YAAY,GAAG,IAAI,GAAG,EAAiB,CAAC;AAC9C,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAE/B;;GAEG;AACH,MAAM,UAAU,MAAM,CACpB,QAAmB,EACnB,OAAO,GAAkB,EAAE;IAE3B,MAAM,GAAG,GAAkB;QACzB,WAAW,EAAE,IAAI,GAAG,EAAE;QACtB,UAAU,EAAE,IAAI,GAAG,EAAE;QACrB,mBAAmB,EAAE,EAAE;QACvB,SAAS,EAAE,CAAC;QACZ,cAAc,EAAE,CAAC;QACjB,eAAe,EAAE,IAAI;QACrB,eAAe,EAAE,IAAI;KACtB,CAAC;IACF,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAEtB,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC/B,MAAM,QAAQ,GAAW,EAAE,CAAC;IAC5B,KAAK,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;QACpC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE;YAC7B,kEAAkE;YAClE,kEAAkE;YAClE,uDAAuD;YACvD,MAAM,QAAQ,GACZ,OAAO,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YACvE,mEAAmE;YACnE,mEAAmE;YACnE,mEAAmE;YACnE,mEAAmE;YACnE,mEAAmE;YACnE,kCAAkC;YAClC,IAAI,GAAG,CAAC,eAAe,EAAE,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAC/C,GAAG,CAAC,eAAe,GAAG;oBACpB,QAAQ;oBACR,KAAK,EAAE,iBAAiB,CAAC,QAAQ,CAAC;iBACnC,CAAC;gBACF,gBAAgB,CAAC,QAAQ,CAAC,CAAC;YAC7B,CAAC;YACD,OAAO,WAAW,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QACnE,CAAC,CAAC;QACF,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACnC,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC;YACpB,GAAG,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,EAAE;QAC3B,eAAe,EAAE,OAAO,CAAC,eAAe;QACxC,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;QAC5C,eAAe,EAAE,OAAO,CAAC,eAAe;QACxC,qGAAqG;QACrG,QAAQ,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,qBAAqB,CAAC,GAAG,EAAE,QAAQ,CAAC;KAC7D,CAAC,CAAC;IACH,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC;IAChC,GAAG,CAAC,OAAO,GAAG,GAAG,EAAE;QACjB,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACzB,iEAAiE;QACjE,+DAA+D;QAC/D,sCAAsC;QACtC,GAAG,CAAC,eAAe,EAAE,OAAO,EAAE,CAAC;QAC/B,GAAG,CAAC,eAAe,GAAG,IAAI,CAAC;QAC3B,WAAW,EAAE,CAAC;IAChB,CAAC,CAAC;IACF,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAS,sBAAsB,CAAC,GAAkB;IAChD,GAAG,CAAC,eAAe,EAAE,OAAO,EAAE,CAAC;IAC/B,GAAG,CAAC,eAAe,GAAG,IAAI,CAAC;AAC7B,CAAC;AAED,SAAS,qBAAqB,CAAI,GAAkB,EAAE,MAAe;IACnE,MAAM,EAAE,GAAG,eAAe,EAAE,CAAC;IAC7B,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,cAAc,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QACzC,GAAG,CAAC,eAAe,GAAG,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,EAAE,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,iCAAiC;AAEjC;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAC/B,qBAAqB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACvC,CAAC;AACH,CAAC;AAED,SAAS,qBAAqB,CAAC,GAAkB,EAAE,QAAgB;IACjE,MAAM,KAAK,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC3C,MAAM,KAAK,GACT,KAAK,IAAI,GAAG,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC;IAC9E,IAAI,CAAC,KAAK;QAAE,OAAO;IACnB,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC5C,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,OAAO;QAAE,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AACpE,CAAC;AAED,gCAAgC;AAGhC,KAAK,UAAU,QAAQ,CACrB,GAAkB,EAClB,MAAkC;IAElC,MAAM,MAAM,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3C,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;IACxB,MAAM,CAAC,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACvD,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC/B,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;GAIG;AACH,SAAS,WAAW,CAClB,GAAkB,EAClB,KAAgB;IAEhB,MAAM,IAAI,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC/C,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5B,MAAM,OAAO,GAAW,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAC9B,MAAM,EAAE,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAClC,IAAI,CAAC,EAAE;YAAE,OAAO,SAAS,CAAC;QAC1B,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC3B,CAAC;AAED,+BAA+B;AAG/B;;;;;;;GAOG;AACH,SAAS,aAAa,CACpB,IAAU,EACV,MAAmB,EACnB,IAA2B,EAC3B,OAAsB;IAEtB,MAAM,SAAS,GACb,OAAO,IAAI,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;IACrE,IAAI,IAAI,GAAa,EAAE,CAAC;IACxB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACf,SAAS,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC;SAAM,CAAC;QACN,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAC/B,SAAS,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,SAAS,CAAC,EAAE,CAAC,CAAC;YACd,iBAAiB,CAAC,GAAG,CAAC,CAAC;YACvB,WAAW,CAAC,QAAQ,EAAE,WAAW,EAAE,mBAAmB,EAAE,GAAG,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,SAAS,CAAC;IACtC,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACpE,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,WAAW,CAClB,GAAkB,EAClB,KAAgB,EAChB,MAAmB,EACnB,OAAsB,EACtB,GAAW;IAEX,IAAI,OAAO,iBAAiB,KAAK,WAAW,IAAI,iBAAiB;QAAE,YAAY,CAAC,mBAAmB,EAAE,GAAG,EAAE;YACxG,GAAG;YACH,IAAI,EAAE,OAAO,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG;YACjF,MAAM;SACP,CAAC,CAAC;IACH,0EAA0E;IAC1E,2EAA2E;IAC3E,kEAAkE;IAClE,sBAAsB,CAAC,GAAG,CAAC,CAAC;IAE5B,uCAAuC;IACvC,2EAA2E;IAC3E,uEAAuE;IACvE,yEAAyE;IACzE,+CAA+C;IAC/C,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACrC,MAAM,SAAS,GAAG,CAAC,CAAC,IAAI,IAAI,CAC1B,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CACnE,CAAC;IACF,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACvB,oBAAoB,CAAC,aAAa,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,GAAG,CAAC,eAAe,EAAE,KAAK,CAAC;QACxC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,qBAAqB,CAAC,GAAG,EAAE,GAAG,EAAE,CAC3C,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CACzD,CAAC;YACF,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;YAChD,GAAG,CAAC,cAAc,GAAG,CAAC,CAAC;YACvB,oBAAoB,CAAC,OAAO,CAAC,CAAC;YAC9B,IAAI,OAAO,iBAAiB,KAAK,WAAW,IAAI,iBAAiB;gBAAE,YAAY,CAAC,cAAc,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YACpI,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9D,iBAAiB,CAAC,CAAC,CAAC,CAAC;YACrB,oBAAoB,CAAC,OAAO,CAAC,CAAC;YAC9B,OAAO,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IACD,mCAAmC;IACnC,oBAAoB,CAAC,SAAS,CAAC,CAAC;IAChC,oEAAoE;IACpE,4CAA4C;IAC5C,2DAA2D;IAC3D,oCAAoC;IACpC,MAAM,KAAK,GAAG,MAAM,CAMlB,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAEpB,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,IAAI,GAAG,CAAC;IAC1C,MAAM,KAAK,GACT,KAAK,GAAG,CAAC;QACP,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC;gBAAE,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QACtE,CAAC,EAAE,KAAK,CAAC;QACX,CAAC,CAAC,IAAI,CAAC;IACX,4CAA4C;IAC5C,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC;QAAE,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IAEtE,CAAC,KAAK,IAAI,EAAE;QACV,IAAI,CAAC;YACH,MAAM,CAAC,EAAE,EAAE,GAAG,GAAG,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBACrC,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC;gBAC3B,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;aAC9C,CAAC,CAAC;YACH,IAAI,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;gBACtB,QAAQ,GAAG,IAAI,CAAC;gBAChB,IAAI,KAAK;oBAAE,YAAY,CAAC,KAAK,CAAC,CAAC;gBAC/B,OAAO;YACT,CAAC;YACD,yEAAyE;YACzE,wEAAwE;YACxE,mEAAmE;YACnE,MAAM,UAAU,GAAG,iBAAiB,CAAC,EAAU,CAAC,CAAC;YACjD,IAAI,OAAO,GAGA,IAAI,CAAC;YAChB,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrD,OAAO,GAAG,MAAM,WAAW,CACzB,SAAS,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,GAAG,UAAU,CAAC,EAAE,MAAM,CAAC,EACnD,cAAc,CACf,CAAC;YACJ,CAAC;YACD,QAAQ,GAAG,IAAI,CAAC;YAChB,IAAI,KAAK;gBAAE,YAAY,CAAC,KAAK,CAAC,CAAC;YAC/B,IAAI,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC;gBAAE,OAAO;YAC9B,IAAI,OAAO,EAAE,CAAC;gBACZ,oBAAoB,CAAC,SAAS,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC9C,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;gBAC7B,IAAI,OAAO,iBAAiB,KAAK,WAAW,IAAI,iBAAiB;oBAAE,YAAY,CAAC,cAAc,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;gBACvH,iBAAiB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;gBAChC,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;oBAC5B,GAAG,CAAC,cAAc,GAAG,CAAC,CAAC;oBACvB,oBAAoB,CAAC,QAAQ,CAAC,CAAC;gBACjC,CAAC;gBACD,wEAAwE;gBACxE,qEAAqE;gBACrE,OAAO;YACT,CAAC;YACD,aAAa,CAAC,EAAU,EAAE,MAAM,EAAE,GAAG,CAAC,eAAe,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;YACvE,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAU,EAAE,OAAO,EAAE,GAAa,EAAE,CAAC,CAAC;QACzE,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,QAAQ,GAAG,IAAI,CAAC;YAChB,IAAI,KAAK;gBAAE,YAAY,CAAC,KAAK,CAAC,CAAC;YAC/B,IAAI,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC;gBAAE,OAAO;YAC9B,MAAM,CAAC,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9D,GAAG,CAAC,cAAc,GAAG,CAAC,CAAC;YACvB,iBAAiB,CAAC,CAAC,CAAC,CAAC;YACrB,oBAAoB,CAAC,OAAO,CAAC,CAAC;YAC9B,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YACrC,IAAI,OAAO,iBAAiB,KAAK,WAAW,IAAI,iBAAiB;gBAAE,YAAY,CAAC,cAAc,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAC1H,CAAC;IACH,CAAC,CAAC,EAAE,CAAC;IAEL,OAAO,IAAI,CAAA,GAAG,GAAG,EAAE;QACjB,MAAM,CAAC,GAAG,KAAK,EAAE,CAAC;QAClB,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO,EAAE,CAAC;QACjC,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACzB,OAAO,OAAO,CAAC,OAAO,EAAE,EAAE,IAAI,kBAAkB,EAAE,CAAC;QACrD,CAAC;QACD,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO;YAAE,OAAO,EAAE,CAAC;QAClC,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACvB,OAAO,WAAW,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAC7C,CAAC;QACD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,GAAG,CAAC,eAAe,EAAE,KAAK,CAAC;YACxC,MAAM,IAAI,GAAG,qBAAqB,CAAC,GAAG,EAAE,GAAG,EAAE,CAC3C,iBAAiB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CACnD,CAAC;YACF,GAAG,CAAC,cAAc,GAAG,CAAC,CAAC;YACvB,oBAAoB,CAAC,OAAO,CAAC,CAAC;YAC9B,IAAI,OAAO,iBAAiB,KAAK,WAAW,IAAI,iBAAiB;gBAAE,YAAY,CAAC,cAAc,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YACrI,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9D,sBAAsB,CAAC,GAAG,CAAC,CAAC;YAC5B,SAAS,CAAC,EAAE,CAAC,CAAC;YACd,QAAQ,CAAC,KAAK,GAAG,EAAE,CAAC;YACpB,iBAAiB,CAAC,CAAC,CAAC,CAAC;YACrB,oBAAoB,CAAC,OAAO,CAAC,CAAC;YAC9B,IAAI,OAAO,iBAAiB,KAAK,WAAW,IAAI,iBAAiB;gBAAE,YAAY,CAAC,cAAc,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YACxH,OAAO,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACjD,CAAC;IACH,CAAC,EAAE,CAAC;AACN,CAAC;AAED,SAAS,OAAO,CAAC,GAAkB,EAAE,GAAW;IAC9C,OAAO,GAAG,KAAK,GAAG,CAAC,SAAS,CAAC;AAC/B,CAAC;AAED,SAAS,WAAW,CAClB,GAAU,EACV,MAAmB,EACnB,OAAsB,EACtB,IAAW;IAEX,IAAI,IAAI,EAAE,SAAS;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACxD,IAAI,OAAO,CAAC,SAAS;QAAE,OAAO,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC7D,OAAO,OAAO,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI,CAAA,QAAQ,GAAG,CAAC,OAAO,QAAQ,CAAC;AACjE,CAAC;AAED,+BAA+B;AAE/B,SAAS,iBAAiB,CAAC,IAAU;IACnC,IAAI,CAAC,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IAC3B,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC/D,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,SAAS,CACtB,MAAe,EACf,MAAmB;IAEnB,MAAM,IAAI,GACR,OAAO,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;IAC9E,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,CAAC;QACN,IAAI,CAAC;YACH,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAChC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,wEAAwE;YACxE,sCAAsC;YACtC,WAAW,CAAC,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC;YACnD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAC1B,CAAC;QACD,MAAM,OAAO,GAAG,oBAAoB,CAAC,CAAC,CAAC,CAAC;QACxC,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,oBAAoB,CAC3B,OAAoB;IAEpB,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC3D,IAAI,OAAO,KAAK,KAAK;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC/C,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC;IAC1E,IAAI,UAAU,IAAI,OAAO,EAAE,CAAC;QAC1B,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;IAC9E,CAAC;IACD,IAAI,OAAO,CAAC,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC1C,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,iBAAiB,CACxB,GAAkB,EAClB,CAAyE;IAEzE,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC1B,iBAAiB,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;IACD,mDAAmD;AACrD,CAAC;AAED,SAAS,iBAAiB,CACxB,GAAkB,EAClB,EAAU,EACV,OAAiB;IAEjB,GAAG,CAAC,cAAc,EAAE,CAAC;IACrB,IAAI,GAAG,CAAC,cAAc,GAAG,mBAAmB,EAAE,CAAC;QAC7C,WAAW,CACT,QAAQ,EACR,qBAAqB,EACrB,2CAA2C,mBAAmB,qCAAqC,EAAE,EAAE,EACvG,SAAS,CACV,CAAC;QACF,OAAO;IACT,CAAC;IAED,QAAQ,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,iBAAiB,CACxB,IAAU,EACV,OAAe,EACf,MAAmB,EACnB,IAA2B;IAE3B,sEAAsE;IACtE,qEAAqE;IACrE,yDAAyD;IACzD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAE,IAAgB,CAAC;IACrE,qBAAqB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAEzC,qEAAqE;IACrE,uEAAuE;IACvE,MAAM,EAAE,GAAG,mBAAmB,EAAE,CAAC;IACjC,MAAM,SAAS,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,EAAc,EAAE,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAExE,sEAAsE;IACtE,yCAAyC;IACzC,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACrD,IAAI,IAAI,GAAmB,IAAI,CAAC,IAAI,CAAC;QACnC,MAAM;QACN,IAAI;QACJ,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,IAAI;QACX,SAAS;KAC2B,CAAC,CAAC;IAExC,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7C,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC;QAC3B,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACjE,qBAAqB,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;QACjD,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;YACjB,MAAM;YACN,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,IAAI;YACX,SAAS;SAC2B,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAc,EAAE,KAAa;IAC1D,IAAI,KAAK,IAAI,OAAQ,KAA8B,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QACxE,MAAM,IAAI,SAAS,CACjB,iBAAiB,KAAK,gDAAgD;YACpE,sCAAsC,CACzC,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAI,KAAqB,EAAE,KAAa;IAC7D,OAAO,KAAK,IAAI,OAAQ,KAAoB,CAAC,IAAI,KAAK,UAAU;QAC9D,CAAC,CAAC,WAAW,CAAC,KAAmB,EAAE,KAAK,CAAC;QACzC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,KAAU,CAAC,CAAC;AAClC,CAAC;AAED,6CAA6C;AAC7C,EAAE;AACF,8CAA8C;AAE9C,SAAS,kBAAkB;IACzB,OAAO,IAAI,CAAA,4JAA4J,CAAC;AAC1K,CAAC;AAED,mCAAmC;AAEnC,gBAAgB;AAChB,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,gBAAgB;QACd,OAAO,YAAY,CAAC,IAAI,CAAC;IAC3B,CAAC;CACF,CAAC","sourcesContent":["/**\n * routes() — high-level manifest router with lazy loading, layouts,\n * prefetch and a sync-fast-path for already-loaded pages.\n *\n * On top of the raw router() from navigation.ts this adds:\n * - dynamic-import loaders (code splitting via `() => import(...)`),\n * - route groups with layouts (via page.ts: layout({ layout, routes })),\n * - per-instance module cache (not global — two routes() calls\n * in the same process do NOT interfere),\n * - hover prefetch and programmatic prefetchPath(),\n * - smart loadingDelay (no progress-bar flicker on fast networks),\n * - sync-fast-path: if the page is already in cache — renders synchronously,\n * without loading state and without a microtask. Removes flicker on back/forward.\n */\n\nimport { signal } from \"../signal.js\";\nimport { reportError } from \"../diagnostics.js\";\nimport { emitDevtools } from \"../devtools-hook.js\";\nimport { html } from \"../html/template.js\";\nimport type { TemplateResult } from \"../html/template-types.js\";\nimport type { Guard, GuardResult, HeadMeta, Page, PageContext } from \"../page.js\";\nimport { applyHead } from \"../head.js\";\nimport {\n createLifecycle,\n getCurrentLifecycle,\n runInLifecycle,\n type LifecycleHandle,\n} from \"../lifecycle.js\";\nimport {\n flatten,\n patternToRegex,\n type FlatEntry,\n type RouteParams,\n type Routes,\n type RoutesMap,\n} from \"./match.js\";\nimport { stripBase } from \"./base.js\";\nimport { navigate, router, type RouterApi } from \"./navigation.js\";\nimport {\n beginStaticRoute,\n consumeStaticSeed,\n markStaticRouteReady,\n recordStaticError,\n setStaticRouterState,\n trackStatic,\n} from \"../static-runtime.js\";\nimport type { JsonValue } from \"../page.js\";\n\nexport interface RoutesOptions {\n /**\n * TemplateResult while the module is loading. Default — thin\n * progress bar at the top (see defaultLoadingView). If the page is in cache,\n * loading is not shown at all (sync render).\n */\n loading?: () => TemplateResult;\n /** TemplateResult if the import threw. */\n error?: (err: Error) => TemplateResult;\n /**\n * Route-level error boundary for lazy import, load() and view() errors.\n * A page's local `errorView` wins when present.\n */\n errorPage?: (err: Error, params: RouteParams) => TemplateResult;\n /** Prefix for document.title (e.g. ' · MyApp'). */\n titleSuffix?: string;\n /**\n * Delay before showing the loading view in ms. If loading\n * finishes faster — loading is not shown, the ready page renders immediately.\n * Guards against flicker on fast connections.\n * Default 100ms. Set to 0 to disable.\n */\n loadingDelay?: number;\n /**\n * Use View Transitions API on navigation (smooth crossfade).\n * Default true.\n */\n viewTransitions?: boolean;\n /**\n * Restore saved scroll on back/forward and scroll new navigations to top.\n * Default true.\n */\n scrollRestoration?: boolean;\n /**\n * Move focus to the main content landmark after navigation.\n * Default true.\n */\n focusManagement?: boolean;\n}\n\n/**\n * Internal state for one routes() instance. Previously these Maps\n * were global — two routes() calls interfered. Now each\n * routes() has its own context.\n */\ninterface RoutesContext {\n moduleCache: Map<unknown, Page>;\n pathToFlat: Map<string, FlatEntry>;\n compiledForPrefetch: Array<{ regex: RegExp; entry: FlatEntry }>;\n renderSeq: number;\n guardRedirects: number;\n /**\n * Lifecycle of the page currently visible on screen. Disposed and\n * replaced on every navigation so that resource() / effect() / persisted()\n * subscriptions created inside page.view() are cleaned up exactly when\n * the page leaves — no leak, no \"resource-outside-lifecycle\" warning.\n */\n activeLifecycle: LifecycleHandle | null;\n /**\n * Build-time seed for the current route commit. Consumed exactly once per\n * pathname from `<script data-mado-static-data>` (see consumeStaticSeed)\n * and held here for the duration of the route's render passes so both\n * head() and load() receive the same value — `routes()` may re-evaluate\n * `view()` several times (idle → ready, layout re-runs) and re-calling\n * `consumeStaticSeed()` would return undefined because the script element\n * is removed on first read.\n *\n * Cleared the moment we observe a navigation to a different pathname,\n * which guarantees SPA navigations never inherit a stale seed.\n */\n seedForPathname: { pathname: string; value: JsonValue | undefined } | null;\n}\n\n/**\n * Registry of active RoutesContexts. Used by the global\n * prefetchPath() — iterates over all active instances. On router.dispose()\n * the corresponding context is removed from the registry.\n */\nconst activeRoutes = new Set<RoutesContext>();\nconst MAX_GUARD_REDIRECTS = 10;\n\n/**\n * Create a router from a manifest. Returns the same RouterApi as router().\n */\nexport function routes(\n manifest: RoutesMap,\n options: RoutesOptions = {},\n): RouterApi {\n const ctx: RoutesContext = {\n moduleCache: new Map(),\n pathToFlat: new Map(),\n compiledForPrefetch: [],\n renderSeq: 0,\n guardRedirects: 0,\n activeLifecycle: null,\n seedForPathname: null,\n };\n activeRoutes.add(ctx);\n\n const flat = flatten(manifest);\n const lowLevel: Routes = {};\n for (const [pattern, entry] of flat) {\n lowLevel[pattern] = (params) => {\n // Use the ROUTE pathname (Vite base already stripped) so the seed\n // attribute written at capture time matches the lookup at runtime\n // boot regardless of which base the app deploys under.\n const pathname =\n typeof location !== \"undefined\" ? stripBase(location.pathname) : \"/\";\n // Seed lifecycle: consume exactly once per pathname (the script is\n // removed on first read), then keep the value in ctx so subsequent\n // render passes for the same route commit see the same seed. A new\n // pathname triggers begin-route + a fresh consume; navigating back\n // to a previous static URL returns undefined because the script is\n // already gone from the document.\n if (ctx.seedForPathname?.pathname !== pathname) {\n ctx.seedForPathname = {\n pathname,\n value: consumeStaticSeed(pathname),\n };\n beginStaticRoute(pathname);\n }\n return renderEntry(ctx, entry, params, options, ++ctx.renderSeq);\n };\n ctx.pathToFlat.set(pattern, entry);\n if (pattern !== \"*\") {\n ctx.compiledForPrefetch.push({ regex: patternToRegex(pattern), entry });\n }\n }\n\n const api = router(lowLevel, {\n viewTransitions: options.viewTransitions,\n scrollRestoration: options.scrollRestoration,\n focusManagement: options.focusManagement,\n // Raise prefetch into sub-router: hover on a link → find matching FlatEntry → load loader + layouts.\n prefetch: (pathname) => prefetchPathInContext(ctx, pathname),\n });\n const origDispose = api.dispose;\n api.dispose = () => {\n activeRoutes.delete(ctx);\n // Tear down the last page's lifecycle so its resource()/effect()\n // subscriptions are released when the whole router is disposed\n // (test isolation, hot reload, etc.).\n ctx.activeLifecycle?.dispose();\n ctx.activeLifecycle = null;\n origDispose();\n };\n return api;\n}\n\n/**\n * Open a fresh page lifecycle for the current render, disposing the\n * previous page's lifecycle. Called right before any page.view() or\n * layout.view() runs so that resource()/effect() created inside view\n * find a `getCurrentLifecycle()` and register their cleanup with it.\n *\n * This is the single canonical place where page-level lifecycle is\n * opened — `page.view()` is the documented place to create resources\n * (see pitfalls + starter examples). Without this wrapper, calling\n * `resource()` in view emits a [mado:resource-outside-lifecycle]\n * warning even when used correctly.\n */\nfunction disposeActiveLifecycle(ctx: RoutesContext): void {\n ctx.activeLifecycle?.dispose();\n ctx.activeLifecycle = null;\n}\n\nfunction renderInPageLifecycle<T>(ctx: RoutesContext, render: () => T): T {\n const lc = createLifecycle();\n try {\n const value = runInLifecycle(lc, render);\n ctx.activeLifecycle = lc;\n return value;\n } catch (err) {\n lc.dispose();\n throw err;\n }\n}\n\n// ---------- prefetch ----------\n\n/**\n * Prefetch-load modules for a path (hover, programmatic).\n * Safe to call repeatedly — cached.\n *\n * Iterates all active routes() and starts loaders for matched entries.\n * If there is no active routes() — no-op.\n */\nexport function prefetchPath(pathname: string): void {\n for (const ctx of activeRoutes) {\n prefetchPathInContext(ctx, pathname);\n }\n}\n\nfunction prefetchPathInContext(ctx: RoutesContext, pathname: string): void {\n const exact = ctx.pathToFlat.get(pathname);\n const entry =\n exact ?? ctx.compiledForPrefetch.find((c) => c.regex.test(pathname))?.entry;\n if (!entry) return;\n loadPage(ctx, entry.loader).catch(() => {});\n for (const lt of entry.layouts) loadPage(ctx, lt).catch(() => {});\n}\n\n// ---------- Loading ----------\n\n\nasync function loadPage(\n ctx: RoutesContext,\n loader: () => Promise<Page> | Page,\n): Promise<Page> {\n const cached = ctx.moduleCache.get(loader);\n if (cached) return cached;\n const loaded = loader();\n const p = await trackIfPromise(loaded, \"route module\");\n ctx.moduleCache.set(loader, p);\n return p;\n}\n\n/**\n * Synchronous cache check. If all modules (page + layouts)\n * are already loaded — returns them without a Promise. This allows\n * renderEntry to render the page without loading state and without a microtask.\n */\nfunction tryLoadSync(\n ctx: RoutesContext,\n entry: FlatEntry,\n): { page: Page; layouts: Page[] } | undefined {\n const page = ctx.moduleCache.get(entry.loader);\n if (!page) return undefined;\n const layouts: Page[] = [];\n for (const l of entry.layouts) {\n const lp = ctx.moduleCache.get(l);\n if (!lp) return undefined;\n layouts.push(lp);\n }\n return { page, layouts };\n}\n\n// ---------- Render ----------\n\n\n/**\n * Apply the page's title/head. Extracted from renderEntry so it\n * can be called from both the async and sync branch.\n *\n * `seed` is the build-time static seed consumed once per route commit and\n * passed through both head() and load(); it is `undefined` for SPA\n * navigations and for non-static routes.\n */\nfunction applyPageMeta(\n page: Page,\n params: RouteParams,\n seed: JsonValue | undefined,\n options: RoutesOptions,\n): void {\n const pageTitle =\n typeof page.title === \"function\" ? page.title(params) : page.title;\n let head: HeadMeta = {};\n if (!page.head) {\n applyHead({});\n } else {\n try {\n head = page.head(params, seed);\n applyHead(head);\n } catch (err) {\n applyHead({});\n recordStaticError(err);\n reportError(\"router\", \"page-head\", \"page.head() threw\", err);\n }\n }\n const title = head.title ?? pageTitle;\n document.title = title ? title + (options.titleSuffix ?? \"\") : \"\";\n}\n\n/**\n * SYNC FAST PATH: if the page is already in moduleCache, we render it\n * right now, without loading state and without a microtask. This removes\n * blank/progress flicker on repeat navigations.\n *\n * ASYNC PATH: on a cold navigation the module still needs to be loaded.\n * To avoid flickering with a loading view on fast networks, we use\n * `loadingDelay` (default 100ms): if loading finishes within that time\n * — render the ready page immediately; otherwise show loading.\n */\nfunction renderEntry(\n ctx: RoutesContext,\n entry: FlatEntry,\n params: RouteParams,\n options: RoutesOptions,\n seq: number,\n): TemplateResult {\n if (typeof __MADO_DEVTOOLS__ === \"undefined\" || __MADO_DEVTOOLS__) emitDevtools(\"router:navigation\", ctx, {\n seq,\n path: typeof location !== \"undefined\" ? location.pathname + location.search : \"/\",\n params,\n });\n // Navigation owns the currently visible page lifecycle. Dispose it before\n // loaders/guards begin so halted, redirected and failed navigations cannot\n // leave the previous page's effects alive behind a loading shell.\n disposeActiveLifecycle(ctx);\n\n // ---------- SYNC FAST PATH ----------\n // Only available when (a) the page+layouts are cached AND (b) there are no\n // guards OR every guard is synchronous and returns void. Anything more\n // complex (async guards, redirects) must take the async path so we never\n // render a route the guard would have stopped.\n const sync = tryLoadSync(ctx, entry);\n const hasGuards = !!sync && (\n entry.guards.length > 0 || collectPageGuards(sync.page).length > 0\n );\n if (sync && !hasGuards) {\n setStaticRouterState(\"render:sync\");\n const seed = ctx.seedForPathname?.value;\n try {\n const view = renderInPageLifecycle(ctx, () =>\n renderWithLayouts(sync.page, sync.layouts, params, seed),\n );\n applyPageMeta(sync.page, params, seed, options);\n ctx.guardRedirects = 0;\n markStaticRouteReady(\"ready\");\n if (typeof __MADO_DEVTOOLS__ === \"undefined\" || __MADO_DEVTOOLS__) emitDevtools(\"router:ready\", ctx, { seq, params, mode: \"sync\" });\n return view;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n recordStaticError(e);\n markStaticRouteReady(\"error\");\n return renderError(e, params, options, sync.page);\n }\n }\n // ---------- ASYNC PATH ----------\n setStaticRouterState(\"loading\");\n // 'idle' — first window (until loadingDelay): render empty to avoid\n // progress-bar flicker on fast connections.\n // 'loading' — module didn't arrive in time → show loading.\n // 'ready' / 'error' — final states.\n const state = signal<\n | { kind: \"idle\" }\n | { kind: \"loading\" }\n | { kind: \"guard\" }\n | { kind: \"error\"; err: Error }\n | { kind: \"ready\"; page: Page; layouts: Page[] }\n >({ kind: \"idle\" });\n\n let resolved = false;\n const delay = options.loadingDelay ?? 100;\n const timer =\n delay > 0\n ? setTimeout(() => {\n if (!resolved && !isStale(ctx, seq)) state.set({ kind: \"loading\" });\n }, delay)\n : null;\n // delay = 0 means show loading immediately.\n if (delay === 0 && !isStale(ctx, seq)) state.set({ kind: \"loading\" });\n\n (async () => {\n try {\n const [pg, ...lts] = await Promise.all([\n loadPage(ctx, entry.loader),\n ...entry.layouts.map((l) => loadPage(ctx, l)),\n ]);\n if (isStale(ctx, seq)) {\n resolved = true;\n if (timer) clearTimeout(timer);\n return;\n }\n // Guards: parent-group guards (entry.guards) first, then the page's own.\n // Fast path: skip the await entirely when there are no guards, so we do\n // not introduce an extra microtask versus the pre-guards behavior.\n const pageGuards = collectPageGuards(pg as Page);\n let verdict:\n | { kind: \"redirect\"; to: string; replace?: boolean }\n | { kind: \"halt\" }\n | null = null;\n if (entry.guards.length > 0 || pageGuards.length > 0) {\n verdict = await trackStatic(\n runGuards([...entry.guards, ...pageGuards], params),\n \"route guards\",\n );\n }\n resolved = true;\n if (timer) clearTimeout(timer);\n if (isStale(ctx, seq)) return;\n if (verdict) {\n setStaticRouterState(`guard:${verdict.kind}`);\n state.set({ kind: \"guard\" });\n if (typeof __MADO_DEVTOOLS__ === \"undefined\" || __MADO_DEVTOOLS__) emitDevtools(\"router:guard\", ctx, { seq, verdict });\n applyGuardVerdict(ctx, verdict);\n if (verdict.kind === \"halt\") {\n ctx.guardRedirects = 0;\n markStaticRouteReady(\"halted\");\n }\n // The guard state removes any immediate loading view; a redirect starts\n // a fresh route transaction, while halt remains intentionally blank.\n return;\n }\n applyPageMeta(pg as Page, params, ctx.seedForPathname?.value, options);\n state.set({ kind: \"ready\", page: pg as Page, layouts: lts as Page[] });\n } catch (err: unknown) {\n resolved = true;\n if (timer) clearTimeout(timer);\n if (isStale(ctx, seq)) return;\n const e = err instanceof Error ? err : new Error(String(err));\n ctx.guardRedirects = 0;\n recordStaticError(e);\n markStaticRouteReady(\"error\");\n state.set({ kind: \"error\", err: e });\n if (typeof __MADO_DEVTOOLS__ === \"undefined\" || __MADO_DEVTOOLS__) emitDevtools(\"router:error\", ctx, { seq, error: e });\n }\n })();\n\n return html`${() => {\n const s = state();\n if (s.kind === \"idle\") return \"\";\n if (s.kind === \"loading\") {\n return options.loading?.() ?? defaultLoadingView();\n }\n if (s.kind === \"guard\") return \"\";\n if (s.kind === \"error\") {\n return renderError(s.err, params, options);\n }\n try {\n const seed = ctx.seedForPathname?.value;\n const view = renderInPageLifecycle(ctx, () =>\n renderWithLayouts(s.page, s.layouts, params, seed),\n );\n ctx.guardRedirects = 0;\n markStaticRouteReady(\"ready\");\n if (typeof __MADO_DEVTOOLS__ === \"undefined\" || __MADO_DEVTOOLS__) emitDevtools(\"router:ready\", ctx, { seq, params, mode: \"async\" });\n return view;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n disposeActiveLifecycle(ctx);\n applyHead({});\n document.title = \"\";\n recordStaticError(e);\n markStaticRouteReady(\"error\");\n if (typeof __MADO_DEVTOOLS__ === \"undefined\" || __MADO_DEVTOOLS__) emitDevtools(\"router:error\", ctx, { seq, error: e });\n return renderError(e, params, options, s.page);\n }\n }}`;\n}\n\nfunction isStale(ctx: RoutesContext, seq: number): boolean {\n return seq !== ctx.renderSeq;\n}\n\nfunction renderError(\n err: Error,\n params: RouteParams,\n options: RoutesOptions,\n page?: Page,\n): TemplateResult {\n if (page?.errorView) return page.errorView(err, params);\n if (options.errorPage) return options.errorPage(err, params);\n return options.error?.(err) ?? html`<pre>${err.message}</pre>`;\n}\n\n// ---------- Guards ----------\n\nfunction collectPageGuards(page: Page): Guard[] {\n if (!page.guard) return [];\n return Array.isArray(page.guard) ? page.guard : [page.guard];\n}\n\n/**\n * Run guards in order and return the first non-pass verdict, or `null` if all\n * pass. Async-aware.\n */\nasync function runGuards(\n guards: Guard[],\n params: RouteParams,\n): Promise<{ kind: \"redirect\"; to: string; replace?: boolean } | { kind: \"halt\" } | null> {\n const path =\n typeof location !== \"undefined\" ? location.pathname + location.search : \"/\";\n for (const g of guards) {\n let v;\n try {\n v = await g({ params, path });\n } catch (err) {\n // A guard that throws is treated like \"halt\" — surface the error to the\n // console but do not render the page.\n reportError(\"router\", \"guard\", \"guard threw\", err);\n return { kind: \"halt\" };\n }\n const verdict = normalizeGuardResult(v);\n if (!verdict) continue;\n return verdict;\n }\n return null;\n}\n\nfunction normalizeGuardResult(\n verdict: GuardResult,\n): { kind: \"redirect\"; to: string; replace?: boolean } | { kind: \"halt\" } | null {\n if (verdict === undefined || verdict === true) return null;\n if (verdict === false) return { kind: \"halt\" };\n if (typeof verdict === \"string\") return { kind: \"redirect\", to: verdict };\n if (\"redirect\" in verdict) {\n return { kind: \"redirect\", to: verdict.redirect, replace: verdict.replace };\n }\n if (verdict.halt) return { kind: \"halt\" };\n return null;\n}\n\nfunction applyGuardVerdict(\n ctx: RoutesContext,\n v: { kind: \"redirect\"; to: string; replace?: boolean } | { kind: \"halt\" },\n): void {\n if (v.kind === \"redirect\") {\n navigateFromGuard(ctx, v.to, v.replace);\n }\n // \"halt\" — render nothing; caller already aborted.\n}\n\nfunction navigateFromGuard(\n ctx: RoutesContext,\n to: string,\n replace?: boolean,\n): void {\n ctx.guardRedirects++;\n if (ctx.guardRedirects > MAX_GUARD_REDIRECTS) {\n reportError(\n \"router\",\n \"guard-redirect-loop\",\n `guard redirect loop detected: more than ${MAX_GUARD_REDIRECTS} consecutive redirects; halted at ${to}`,\n undefined,\n );\n return;\n }\n\n navigate(to, { replace: replace ?? true });\n}\n\n/**\n * Wrap a page's view in layouts (from inner to outer).\n * Each layout receives `child` = TemplateResult of the child page or\n * next layout — composes like a matryoshka.\n *\n * `seed` is the build-time static seed (or undefined for SPA navigation).\n * It is passed to `page.load(params, seed)`; if no `load` is declared the\n * seed itself becomes the view's data so static-only pages render their\n * initial data without needing a runtime loader.\n */\nfunction renderWithLayouts(\n page: Page,\n layouts: Page[],\n params: RouteParams,\n seed: JsonValue | undefined,\n): TemplateResult {\n // Contract: page.load receives the seed; when no load is declared the\n // seed itself is the runtime data (otherwise static-only pages would\n // lose their initial data after head() has consumed it).\n const data = page.load ? page.load(params, seed) : (seed as unknown);\n assertSynchronousLoad(data, \"page.load\");\n\n // Expose onDispose to page views so they can clean up timers, manual\n // subscriptions, etc. that aren't auto-managed by resource()/effect().\n const lc = getCurrentLifecycle();\n const onDispose = lc ? (fn: () => void) => lc.onDispose(fn) : undefined;\n\n // Expose ROUTE pathname (base stripped) to user views so they receive\n // the same value the matcher works with.\n const routePath = () => stripBase(location.pathname);\n let view: TemplateResult = page.view({\n params,\n data,\n path: routePath,\n child: null,\n onDispose,\n } as PageContext<RouteParams, unknown>);\n\n for (let i = layouts.length - 1; i >= 0; i--) {\n const layout = layouts[i]!;\n const layoutData = layout.load ? layout.load(params) : undefined;\n assertSynchronousLoad(layoutData, \"layout.load\");\n view = layout.view({\n params,\n data: layoutData,\n path: routePath,\n child: view,\n onDispose,\n } as PageContext<RouteParams, unknown>);\n }\n\n return view;\n}\n\nfunction assertSynchronousLoad(value: unknown, label: string): void {\n if (value && typeof (value as PromiseLike<unknown>).then === \"function\") {\n throw new TypeError(\n `[mado:router] ${label} must return a synchronous value or Resource; ` +\n \"use resource() for asynchronous data\",\n );\n }\n}\n\nfunction trackIfPromise<T>(value: T | Promise<T>, label: string): Promise<T> {\n return value && typeof (value as Promise<T>).then === \"function\"\n ? trackStatic(value as Promise<T>, label)\n : Promise.resolve(value as T);\n}\n\n// ---------- Default loading view ----------\n//\n// Thin progress bar at the top of the screen.\n\nfunction defaultLoadingView(): TemplateResult {\n return html`<div aria-hidden=\"true\" style=\"position:fixed;inset:0 0 auto;height:2px;background:currentColor;opacity:.65;z-index:2147483647;pointer-events:none\"></div>`;\n}\n\n// ---------- Test hooks ----------\n\n/** @internal */\nexport const _testHooks = {\n activeRoutesSize(): number {\n return activeRoutes.size;\n },\n};\n"]}
|