@madojs/mado 0.12.0 → 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 +15 -8
- package/CHANGELOG.md +58 -0
- package/README.md +25 -3
- package/dist/src/component.d.ts +3 -1
- package/dist/src/component.d.ts.map +1 -0
- package/dist/src/component.js +65 -30
- 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.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 +1 -0
- package/dist/src/head.d.ts.map +1 -0
- package/dist/src/head.js +2 -1
- 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 +3 -4
- package/dist/src/html/parser.d.ts.map +1 -0
- package/dist/src/html/parser.js +63 -14
- 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 +78 -3
- package/dist/src/html/template.js.map +1 -1
- package/dist/src/index.d.ts +7 -8
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +5 -7
- 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 +1 -0
- package/dist/src/page.d.ts.map +1 -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 +126 -49
- package/dist/src/resource.js.map +1 -1
- package/dist/src/router/base.d.ts +1 -0
- package/dist/src/router/base.d.ts.map +1 -0
- package/dist/src/router/base.js.map +1 -1
- 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 +89 -148
- package/dist/src/router/manifest.js.map +1 -1
- package/dist/src/router/match.d.ts +1 -0
- package/dist/src/router/match.d.ts.map +1 -0
- package/dist/src/router/match.js +19 -5
- 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.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 +1 -0
- package/dist/src/static-runtime.d.ts.map +1 -0
- package/dist/src/static-runtime.js.map +1 -1
- package/dist/src/vite/index.d.ts +1 -0
- package/dist/src/vite/index.d.ts.map +1 -0
- package/dist/src/vite/index.js +4 -3
- package/dist/src/vite/index.js.map +1 -1
- package/docs/architecture/v1-roadmap.md +19 -0
- package/docs/en/10-pages-and-components.md +9 -1
- package/docs/en/13-data.md +8 -6
- package/docs/en/14-forms.md +66 -219
- package/docs/en/15-static-snapshots.md +4 -4
- package/docs/en/16-app-architecture.md +3 -2
- package/docs/en/20-deployment.md +21 -8
- package/docs/en/21-error-handling.md +9 -6
- package/docs/en/24-devtools-and-diagnostics.md +45 -0
- package/docs/en/30-api-freeze-map.md +8 -9
- package/docs/en/32-v1-stability.md +2 -2
- package/docs/en/33-migration-0.12-0.13.md +56 -0
- package/docs/en/40-llm-guide.md +7 -9
- package/docs/en/41-for-backenders.md +13 -9
- package/docs/en/42-why-mado.md +2 -2
- package/docs/en/README.md +2 -0
- package/docs/recipes/nginx/nginx.conf +2 -2
- package/llms.txt +25 -7
- package/package.json +37 -16
- package/scripts/clean.mjs +8 -0
- package/scripts/cli/generate.mjs +11 -14
- package/scripts/cli/help.mjs +2 -0
- package/scripts/cli/index.mjs +14 -6
- package/scripts/cli/init.mjs +13 -18
- package/scripts/cli/release.mjs +22 -19
- package/scripts/cli/run.mjs +5 -3
- package/scripts/logger.mjs +117 -0
- package/scripts/output-guard.mjs +128 -0
- package/scripts/preview.mjs +11 -19
- package/scripts/static/browser.mjs +49 -8
- package/scripts/static/discover.mjs +4 -1
- package/scripts/static.mjs +21 -7
- package/starters/default/package.json +4 -4
- package/starters/default/tsconfig.node.json +13 -0
- package/starters/default/vite.config.ts +0 -3
- package/starters/modular/README.md +4 -4
- package/starters/modular/package.json +4 -4
- package/starters/modular/src/layouts/app-shell.layout.ts +1 -2
- package/starters/modular/src/modules/auth/login.page.ts +5 -12
- package/starters/modular/src/modules/billing/pages/invoice-detail.page.ts +3 -4
- package/starters/modular/src/modules/billing/pages/invoices-list.page.ts +1 -1
- package/starters/modular/src/shared/styles/reset.css +21 -1
- package/starters/modular/tsconfig.json +10 -1
- package/starters/modular/tsconfig.node.json +13 -0
- package/starters/modular/vite.config.ts +6 -5
- package/dist/src/lazy.d.ts +0 -38
- package/dist/src/lazy.js +0 -73
- package/dist/src/lazy.js.map +0 -1
- package/scripts/bake.mjs +0 -5
- package/scripts/docs-lint.mjs +0 -170
- package/scripts/package-smoke.mjs +0 -135
- package/scripts/release-notes.mjs +0 -66
- package/scripts/size-budget.mjs +0 -95
- package/starters/modular/src/shared/ui/x-button.component.ts +0 -49
|
@@ -13,6 +13,8 @@
|
|
|
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";
|
|
@@ -26,9 +28,7 @@ import { beginStaticRoute, consumeStaticSeed, markStaticRouteReady, recordStatic
|
|
|
26
28
|
* the corresponding context is removed from the registry.
|
|
27
29
|
*/
|
|
28
30
|
const activeRoutes = new Set();
|
|
29
|
-
const
|
|
30
|
-
let guardRedirectsThisTick = 0;
|
|
31
|
-
let guardRedirectResetScheduled = false;
|
|
31
|
+
const MAX_GUARD_REDIRECTS = 10;
|
|
32
32
|
/**
|
|
33
33
|
* Create a router from a manifest. Returns the same RouterApi as router().
|
|
34
34
|
*/
|
|
@@ -38,6 +38,7 @@ export function routes(manifest, options = {}) {
|
|
|
38
38
|
pathToFlat: new Map(),
|
|
39
39
|
compiledForPrefetch: [],
|
|
40
40
|
renderSeq: 0,
|
|
41
|
+
guardRedirects: 0,
|
|
41
42
|
activeLifecycle: null,
|
|
42
43
|
seedForPathname: null,
|
|
43
44
|
};
|
|
@@ -101,11 +102,21 @@ export function routes(manifest, options = {}) {
|
|
|
101
102
|
* `resource()` in view emits a [mado:resource-outside-lifecycle]
|
|
102
103
|
* warning even when used correctly.
|
|
103
104
|
*/
|
|
104
|
-
function
|
|
105
|
+
function disposeActiveLifecycle(ctx) {
|
|
105
106
|
ctx.activeLifecycle?.dispose();
|
|
107
|
+
ctx.activeLifecycle = null;
|
|
108
|
+
}
|
|
109
|
+
function renderInPageLifecycle(ctx, render) {
|
|
106
110
|
const lc = createLifecycle();
|
|
107
|
-
|
|
108
|
-
|
|
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
|
+
}
|
|
109
120
|
}
|
|
110
121
|
// ---------- prefetch ----------
|
|
111
122
|
/**
|
|
@@ -167,23 +178,24 @@ function tryLoadSync(ctx, entry) {
|
|
|
167
178
|
* navigations and for non-static routes.
|
|
168
179
|
*/
|
|
169
180
|
function applyPageMeta(page, params, seed, options) {
|
|
170
|
-
const
|
|
171
|
-
|
|
172
|
-
document.title = title + (options.titleSuffix ?? "");
|
|
173
|
-
}
|
|
181
|
+
const pageTitle = typeof page.title === "function" ? page.title(params) : page.title;
|
|
182
|
+
let head = {};
|
|
174
183
|
if (!page.head) {
|
|
175
184
|
applyHead({});
|
|
176
|
-
return;
|
|
177
185
|
}
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
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
|
+
}
|
|
186
196
|
}
|
|
197
|
+
const title = head.title ?? pageTitle;
|
|
198
|
+
document.title = title ? title + (options.titleSuffix ?? "") : "";
|
|
187
199
|
}
|
|
188
200
|
/**
|
|
189
201
|
* SYNC FAST PATH: if the page is already in moduleCache, we render it
|
|
@@ -196,45 +208,33 @@ function applyPageMeta(page, params, seed, options) {
|
|
|
196
208
|
* — render the ready page immediately; otherwise show loading.
|
|
197
209
|
*/
|
|
198
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);
|
|
199
221
|
// ---------- SYNC FAST PATH ----------
|
|
200
222
|
// Only available when (a) the page+layouts are cached AND (b) there are no
|
|
201
223
|
// guards OR every guard is synchronous and returns void. Anything more
|
|
202
224
|
// complex (async guards, redirects) must take the async path so we never
|
|
203
225
|
// render a route the guard would have stopped.
|
|
204
226
|
const sync = tryLoadSync(ctx, entry);
|
|
205
|
-
const
|
|
206
|
-
|
|
207
|
-
: sync
|
|
208
|
-
? trySyncGuards(entry.guards, params)
|
|
209
|
-
: undefined;
|
|
210
|
-
if (sync && syncGuardVerdict === null) {
|
|
227
|
+
const hasGuards = !!sync && (entry.guards.length > 0 || collectPageGuards(sync.page).length > 0);
|
|
228
|
+
if (sync && !hasGuards) {
|
|
211
229
|
setStaticRouterState("render:sync");
|
|
212
230
|
const seed = ctx.seedForPathname?.value;
|
|
213
|
-
applyPageMeta(sync.page, params, seed, options);
|
|
214
231
|
try {
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
const pageGuards = collectPageGuards(sync.page);
|
|
219
|
-
if (pageGuards.length > 0) {
|
|
220
|
-
const v = trySyncGuards(pageGuards, params);
|
|
221
|
-
// `v === undefined` would mean an async page-guard slipped past the
|
|
222
|
-
// outer sync check; today that can't happen, but bail to async path
|
|
223
|
-
// defensively.
|
|
224
|
-
if (v)
|
|
225
|
-
return renderGuardVerdictSync(v, options);
|
|
226
|
-
if (v === undefined) {
|
|
227
|
-
// Fall through to async path by skipping the sync return; rebuild
|
|
228
|
-
// the render via a fresh entry-render call would be ideal, but for
|
|
229
|
-
// now log and render nothing. Pages with async guards will not hit
|
|
230
|
-
// sync fast path because trySyncGuards on entry.guards already
|
|
231
|
-
// returned undefined and we never enter this block in that case.
|
|
232
|
-
return html ``;
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
const lc = openPageLifecycle(ctx);
|
|
236
|
-
const view = runInLifecycle(lc, () => renderWithLayouts(sync.page, sync.layouts, params, seed));
|
|
232
|
+
const view = renderInPageLifecycle(ctx, () => renderWithLayouts(sync.page, sync.layouts, params, seed));
|
|
233
|
+
applyPageMeta(sync.page, params, seed, options);
|
|
234
|
+
ctx.guardRedirects = 0;
|
|
237
235
|
markStaticRouteReady("ready");
|
|
236
|
+
if (typeof __MADO_DEVTOOLS__ === "undefined" || __MADO_DEVTOOLS__)
|
|
237
|
+
emitDevtools("router:ready", ctx, { seq, params, mode: "sync" });
|
|
238
238
|
return view;
|
|
239
239
|
}
|
|
240
240
|
catch (err) {
|
|
@@ -244,10 +244,6 @@ function renderEntry(ctx, entry, params, options, seq) {
|
|
|
244
244
|
return renderError(e, params, options, sync.page);
|
|
245
245
|
}
|
|
246
246
|
}
|
|
247
|
-
if (sync && syncGuardVerdict) {
|
|
248
|
-
setStaticRouterState("guard");
|
|
249
|
-
return renderGuardVerdictSync(syncGuardVerdict, options);
|
|
250
|
-
}
|
|
251
247
|
// ---------- ASYNC PATH ----------
|
|
252
248
|
setStaticRouterState("loading");
|
|
253
249
|
// 'idle' — first window (until loadingDelay): render empty to avoid
|
|
@@ -293,16 +289,20 @@ function renderEntry(ctx, entry, params, options, seq) {
|
|
|
293
289
|
return;
|
|
294
290
|
if (verdict) {
|
|
295
291
|
setStaticRouterState(`guard:${verdict.kind}`);
|
|
296
|
-
|
|
297
|
-
if (
|
|
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
298
|
markStaticRouteReady("halted");
|
|
299
|
-
|
|
300
|
-
//
|
|
299
|
+
}
|
|
300
|
+
// The guard state removes any immediate loading view; a redirect starts
|
|
301
|
+
// a fresh route transaction, while halt remains intentionally blank.
|
|
301
302
|
return;
|
|
302
303
|
}
|
|
303
304
|
applyPageMeta(pg, params, ctx.seedForPathname?.value, options);
|
|
304
305
|
state.set({ kind: "ready", page: pg, layouts: lts });
|
|
305
|
-
markStaticRouteReady("ready");
|
|
306
306
|
}
|
|
307
307
|
catch (err) {
|
|
308
308
|
resolved = true;
|
|
@@ -311,9 +311,12 @@ function renderEntry(ctx, entry, params, options, seq) {
|
|
|
311
311
|
if (isStale(ctx, seq))
|
|
312
312
|
return;
|
|
313
313
|
const e = err instanceof Error ? err : new Error(String(err));
|
|
314
|
+
ctx.guardRedirects = 0;
|
|
314
315
|
recordStaticError(e);
|
|
315
316
|
markStaticRouteReady("error");
|
|
316
317
|
state.set({ kind: "error", err: e });
|
|
318
|
+
if (typeof __MADO_DEVTOOLS__ === "undefined" || __MADO_DEVTOOLS__)
|
|
319
|
+
emitDevtools("router:error", ctx, { seq, error: e });
|
|
317
320
|
}
|
|
318
321
|
})();
|
|
319
322
|
return html `${() => {
|
|
@@ -323,19 +326,29 @@ function renderEntry(ctx, entry, params, options, seq) {
|
|
|
323
326
|
if (s.kind === "loading") {
|
|
324
327
|
return options.loading?.() ?? defaultLoadingView();
|
|
325
328
|
}
|
|
329
|
+
if (s.kind === "guard")
|
|
330
|
+
return "";
|
|
326
331
|
if (s.kind === "error") {
|
|
327
332
|
return renderError(s.err, params, options);
|
|
328
333
|
}
|
|
329
334
|
try {
|
|
330
|
-
const lc = openPageLifecycle(ctx);
|
|
331
335
|
const seed = ctx.seedForPathname?.value;
|
|
332
|
-
const view =
|
|
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" });
|
|
333
341
|
return view;
|
|
334
342
|
}
|
|
335
343
|
catch (err) {
|
|
336
344
|
const e = err instanceof Error ? err : new Error(String(err));
|
|
345
|
+
disposeActiveLifecycle(ctx);
|
|
346
|
+
applyHead({});
|
|
347
|
+
document.title = "";
|
|
337
348
|
recordStaticError(e);
|
|
338
349
|
markStaticRouteReady("error");
|
|
350
|
+
if (typeof __MADO_DEVTOOLS__ === "undefined" || __MADO_DEVTOOLS__)
|
|
351
|
+
emitDevtools("router:error", ctx, { seq, error: e });
|
|
339
352
|
return renderError(e, params, options, s.page);
|
|
340
353
|
}
|
|
341
354
|
}}`;
|
|
@@ -370,8 +383,7 @@ async function runGuards(guards, params) {
|
|
|
370
383
|
catch (err) {
|
|
371
384
|
// A guard that throws is treated like "halt" — surface the error to the
|
|
372
385
|
// console but do not render the page.
|
|
373
|
-
|
|
374
|
-
console.error("[mado] guard threw:", err);
|
|
386
|
+
reportError("router", "guard", "guard threw", err);
|
|
375
387
|
return { kind: "halt" };
|
|
376
388
|
}
|
|
377
389
|
const verdict = normalizeGuardResult(v);
|
|
@@ -381,33 +393,6 @@ async function runGuards(guards, params) {
|
|
|
381
393
|
}
|
|
382
394
|
return null;
|
|
383
395
|
}
|
|
384
|
-
/**
|
|
385
|
-
* Fast-path: run synchronous guards only. Returns:
|
|
386
|
-
* null → all passed
|
|
387
|
-
* verdict → first non-pass verdict
|
|
388
|
-
* undefined → at least one guard is async, fall through to async path
|
|
389
|
-
*/
|
|
390
|
-
function trySyncGuards(guards, params) {
|
|
391
|
-
const path = typeof location !== "undefined" ? location.pathname + location.search : "/";
|
|
392
|
-
for (const g of guards) {
|
|
393
|
-
let v;
|
|
394
|
-
try {
|
|
395
|
-
v = g({ params, path });
|
|
396
|
-
}
|
|
397
|
-
catch (err) {
|
|
398
|
-
// eslint-disable-next-line no-console
|
|
399
|
-
console.error("[mado] guard threw:", err);
|
|
400
|
-
return { kind: "halt" };
|
|
401
|
-
}
|
|
402
|
-
if (v && typeof v.then === "function")
|
|
403
|
-
return undefined;
|
|
404
|
-
const verdict = normalizeGuardResult(v);
|
|
405
|
-
if (!verdict)
|
|
406
|
-
continue;
|
|
407
|
-
return verdict;
|
|
408
|
-
}
|
|
409
|
-
return null;
|
|
410
|
-
}
|
|
411
396
|
function normalizeGuardResult(verdict) {
|
|
412
397
|
if (verdict === undefined || verdict === true)
|
|
413
398
|
return null;
|
|
@@ -422,34 +407,16 @@ function normalizeGuardResult(verdict) {
|
|
|
422
407
|
return { kind: "halt" };
|
|
423
408
|
return null;
|
|
424
409
|
}
|
|
425
|
-
function applyGuardVerdict(v) {
|
|
410
|
+
function applyGuardVerdict(ctx, v) {
|
|
426
411
|
if (v.kind === "redirect") {
|
|
427
|
-
navigateFromGuard(v.to, v.replace);
|
|
412
|
+
navigateFromGuard(ctx, v.to, v.replace);
|
|
428
413
|
}
|
|
429
414
|
// "halt" — render nothing; caller already aborted.
|
|
430
415
|
}
|
|
431
|
-
function
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
if (v.kind === "redirect") {
|
|
436
|
-
queueMicrotask(() => navigateFromGuard(v.to, v.replace));
|
|
437
|
-
}
|
|
438
|
-
return html ``;
|
|
439
|
-
}
|
|
440
|
-
function navigateFromGuard(to, replace) {
|
|
441
|
-
if (!guardRedirectResetScheduled) {
|
|
442
|
-
guardRedirectResetScheduled = true;
|
|
443
|
-
setTimeout(() => {
|
|
444
|
-
guardRedirectsThisTick = 0;
|
|
445
|
-
guardRedirectResetScheduled = false;
|
|
446
|
-
}, 0);
|
|
447
|
-
}
|
|
448
|
-
guardRedirectsThisTick++;
|
|
449
|
-
if (guardRedirectsThisTick > MAX_GUARD_REDIRECTS_PER_TICK) {
|
|
450
|
-
// eslint-disable-next-line no-console
|
|
451
|
-
console.error("[mado] guard redirect loop detected: more than " +
|
|
452
|
-
`${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);
|
|
453
420
|
return;
|
|
454
421
|
}
|
|
455
422
|
navigate(to, { replace: replace ?? true });
|
|
@@ -469,6 +436,7 @@ function renderWithLayouts(page, layouts, params, seed) {
|
|
|
469
436
|
// seed itself is the runtime data (otherwise static-only pages would
|
|
470
437
|
// lose their initial data after head() has consumed it).
|
|
471
438
|
const data = page.load ? page.load(params, seed) : seed;
|
|
439
|
+
assertSynchronousLoad(data, "page.load");
|
|
472
440
|
// Expose onDispose to page views so they can clean up timers, manual
|
|
473
441
|
// subscriptions, etc. that aren't auto-managed by resource()/effect().
|
|
474
442
|
const lc = getCurrentLifecycle();
|
|
@@ -486,6 +454,7 @@ function renderWithLayouts(page, layouts, params, seed) {
|
|
|
486
454
|
for (let i = layouts.length - 1; i >= 0; i--) {
|
|
487
455
|
const layout = layouts[i];
|
|
488
456
|
const layoutData = layout.load ? layout.load(params) : undefined;
|
|
457
|
+
assertSynchronousLoad(layoutData, "layout.load");
|
|
489
458
|
view = layout.view({
|
|
490
459
|
params,
|
|
491
460
|
data: layoutData,
|
|
@@ -496,6 +465,12 @@ function renderWithLayouts(page, layouts, params, seed) {
|
|
|
496
465
|
}
|
|
497
466
|
return view;
|
|
498
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
|
+
}
|
|
499
474
|
function trackIfPromise(value, label) {
|
|
500
475
|
return value && typeof value.then === "function"
|
|
501
476
|
? trackStatic(value, label)
|
|
@@ -503,43 +478,9 @@ function trackIfPromise(value, label) {
|
|
|
503
478
|
}
|
|
504
479
|
// ---------- Default loading view ----------
|
|
505
480
|
//
|
|
506
|
-
// Thin progress bar at the top of the screen.
|
|
507
|
-
// globally (lazy, on first show). No animations for prefers-reduced-motion.
|
|
508
|
-
const DEFAULT_LOADING_STYLE_ID = "mado-default-loading-style";
|
|
509
|
-
const DEFAULT_LOADING_CSS = `
|
|
510
|
-
@keyframes mado-progress {
|
|
511
|
-
0% { transform: translateX(-100%); }
|
|
512
|
-
50% { transform: translateX(0%); }
|
|
513
|
-
100% { transform: translateX(100%); }
|
|
514
|
-
}
|
|
515
|
-
.mado-progress-bar {
|
|
516
|
-
position: fixed; top: 0; left: 0; right: 0;
|
|
517
|
-
height: 2px; background: rgba(0,0,0,.06);
|
|
518
|
-
z-index: 2147483647; overflow: hidden;
|
|
519
|
-
pointer-events: none;
|
|
520
|
-
}
|
|
521
|
-
.mado-progress-bar::after {
|
|
522
|
-
content: ""; display: block; height: 100%; width: 40%;
|
|
523
|
-
background: currentColor; opacity: .8;
|
|
524
|
-
animation: mado-progress 1.2s ease-in-out infinite;
|
|
525
|
-
}
|
|
526
|
-
@media (prefers-reduced-motion: reduce) {
|
|
527
|
-
.mado-progress-bar::after { animation: none; width: 100%; }
|
|
528
|
-
}
|
|
529
|
-
`;
|
|
530
|
-
function ensureDefaultLoadingStyle() {
|
|
531
|
-
if (typeof document === "undefined")
|
|
532
|
-
return;
|
|
533
|
-
if (document.getElementById(DEFAULT_LOADING_STYLE_ID))
|
|
534
|
-
return;
|
|
535
|
-
const style = document.createElement("style");
|
|
536
|
-
style.id = DEFAULT_LOADING_STYLE_ID;
|
|
537
|
-
style.textContent = DEFAULT_LOADING_CSS;
|
|
538
|
-
document.head.appendChild(style);
|
|
539
|
-
}
|
|
481
|
+
// Thin progress bar at the top of the screen.
|
|
540
482
|
function defaultLoadingView() {
|
|
541
|
-
|
|
542
|
-
return html `<div class="mado-progress-bar" aria-hidden="true"></div>`;
|
|
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>`;
|
|
543
484
|
}
|
|
544
485
|
// ---------- Test hooks ----------
|
|
545
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"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"match.d.ts","sourceRoot":"","sources":["../../../src/router/match.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAEL,MAAM,EACN,KAAK,KAAK,EACV,KAAK,IAAI,EACT,KAAK,UAAU,EAChB,MAAM,YAAY,CAAC;AAIpB,OAAO,EAAE,MAAM,EAAE,CAAC;AAClB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEhE,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACjD,MAAM,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,WAAW,KAAK,cAAc,CAAC;AACnE,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AAElD,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,YAAY,CAAC;CACvB;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,aAAa,CAY7E;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,SAAS,aAAa,EAAE,GACjC;IAAE,KAAK,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,WAAW,CAAA;CAAE,GAAG,IAAI,CAatD;AAED,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGtD;AAqBD;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAOnD;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B,MAAM,CAkBR;AAKD,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AAEnD,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACnC,OAAO,EAAE,KAAK,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IAC3C;;;OAGG;IACH,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CACrB,GAAG,EAAE,SAAS,EACd,MAAM,SAAK,EACX,OAAO,GAAE,SAAS,CAAC,SAAS,CAAM,EAClC,MAAM,GAAE,KAAK,EAAO,GACnB,KAAK,CAAC,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAsB5B;AAMD,8DAA8D;AAC9D,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAMrD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAevE"}
|
package/dist/src/router/match.js
CHANGED
|
@@ -21,10 +21,7 @@ export function compile(pattern, handler) {
|
|
|
21
21
|
return { pattern, regex: /.*/, keys: [], handler };
|
|
22
22
|
}
|
|
23
23
|
const keys = [];
|
|
24
|
-
const re = pattern
|
|
25
|
-
keys.push(m.slice(1));
|
|
26
|
-
return "([^/]+)";
|
|
27
|
-
});
|
|
24
|
+
const re = routePatternSource(pattern, keys);
|
|
28
25
|
return {
|
|
29
26
|
pattern,
|
|
30
27
|
regex: new RegExp(`^${re}/?$`),
|
|
@@ -54,9 +51,26 @@ export function matchRoute(path, compiled) {
|
|
|
54
51
|
}
|
|
55
52
|
/** Simple regex WITHOUT keys — for prefetch (we only need the match fact). */
|
|
56
53
|
export function patternToRegex(pattern) {
|
|
57
|
-
const re = pattern
|
|
54
|
+
const re = routePatternSource(pattern);
|
|
58
55
|
return new RegExp(`^${re}/?$`);
|
|
59
56
|
}
|
|
57
|
+
function routePatternSource(pattern, keys) {
|
|
58
|
+
const input = pattern.replace(/\/$/, "");
|
|
59
|
+
let source = "";
|
|
60
|
+
let cursor = 0;
|
|
61
|
+
const params = /:([\w]+)/g;
|
|
62
|
+
for (const match of input.matchAll(params)) {
|
|
63
|
+
const index = match.index ?? 0;
|
|
64
|
+
source += escapeRegex(input.slice(cursor, index));
|
|
65
|
+
source += "([^/]+)";
|
|
66
|
+
keys?.push(match[1]);
|
|
67
|
+
cursor = index + match[0].length;
|
|
68
|
+
}
|
|
69
|
+
return source + escapeRegex(input.slice(cursor));
|
|
70
|
+
}
|
|
71
|
+
function escapeRegex(value) {
|
|
72
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
73
|
+
}
|
|
60
74
|
/**
|
|
61
75
|
* Extract `:key` names from a route pattern, in declaration order.
|
|
62
76
|
* Used by static discovery and prefetch URL synthesis; centralised here so
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"match.js","sourceRoot":"","sources":["../../../src/router/match.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"match.js","sourceRoot":"","sources":["../../../src/router/match.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Pure pattern matching + flatten/normalize of the manifest.\n *\n * There is NO window/document/history or signals here — only functions\n * over strings and objects. This allows:\n * - testing routing in Node without jsdom;\n * - reusing the same compile/regex in static discovery / prefetch without duplication.\n */\n\nimport {\n isLayoutGroup,\n isPage,\n type Guard,\n type Page,\n type RouteEntry,\n} from \"../page.js\";\n\n// Re-export isPage so build-time tooling (scripts/static/discover.mjs)\n// can pull every routing helper it needs from a single module.\nexport { isPage };\nimport type { TemplateResult } from \"../html/template-types.js\";\n\nexport type RouteParams = Record<string, string>;\nexport type RouteHandler = (params: RouteParams) => TemplateResult;\nexport type Routes = Record<string, RouteHandler>;\n\nexport interface CompiledRoute {\n pattern: string;\n regex: RegExp;\n keys: string[];\n handler: RouteHandler;\n}\n\n/**\n * Compile a pattern like `/users/:id` into a `CompiledRoute` with\n * named keys and a regex for matching against `location.pathname`.\n *\n * Special case `*` — wildcard fallback, matches anything.\n */\nexport function compile(pattern: string, handler: RouteHandler): CompiledRoute {\n if (pattern === \"*\") {\n return { pattern, regex: /.*/, keys: [], handler };\n }\n const keys: string[] = [];\n const re = routePatternSource(pattern, keys);\n return {\n pattern,\n regex: new RegExp(`^${re}/?$`),\n keys,\n handler,\n };\n}\n\n/**\n * Find the first matching CompiledRoute for path. Returns already\n * decoded params (decodeURIComponent on each segment).\n * Wildcard (`*`) is skipped — handle it separately as a fallback.\n */\nexport function matchRoute(\n path: string,\n compiled: readonly CompiledRoute[],\n): { route: CompiledRoute; params: RouteParams } | null {\n for (const r of compiled) {\n if (r.pattern === \"*\") continue;\n const m = r.regex.exec(path);\n if (m) {\n const params: RouteParams = {};\n r.keys.forEach((k, i) => {\n params[k] = decodeURIComponent(m[i + 1] ?? \"\");\n });\n return { route: r, params };\n }\n }\n return null;\n}\n\n/** Simple regex WITHOUT keys — for prefetch (we only need the match fact). */\nexport function patternToRegex(pattern: string): RegExp {\n const re = routePatternSource(pattern);\n return new RegExp(`^${re}/?$`);\n}\n\nfunction routePatternSource(pattern: string, keys?: string[]): string {\n const input = pattern.replace(/\\/$/, \"\");\n let source = \"\";\n let cursor = 0;\n const params = /:([\\w]+)/g;\n for (const match of input.matchAll(params)) {\n const index = match.index ?? 0;\n source += escapeRegex(input.slice(cursor, index));\n source += \"([^/]+)\";\n keys?.push(match[1]!);\n cursor = index + match[0].length;\n }\n return source + escapeRegex(input.slice(cursor));\n}\n\nfunction escapeRegex(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\n/**\n * Extract `:key` names from a route pattern, in declaration order.\n * Used by static discovery and prefetch URL synthesis; centralised here so\n * the two pipelines stay in sync.\n */\nexport function paramKeys(pattern: string): string[] {\n const keys: string[] = [];\n pattern.replace(/:([\\w]+)/g, (_m, key) => {\n keys.push(key);\n return \"\";\n });\n return keys;\n}\n\n/**\n * Materialise a route pattern into a concrete pathname by substituting\n * declared `:key` placeholders with URL-encoded values from `params`.\n * Throws with route context when a required param is missing or the\n * resulting URL contains query / fragment.\n */\nexport function applyParams(\n pattern: string,\n params: Record<string, string>,\n): string {\n if (pattern === \"/\") return \"/\";\n const pathname = pattern.replace(/:([\\w]+)/g, (_m, key) => {\n const value = params[key];\n if (value == null) {\n throw new Error(`[mado] missing param :${key} for ${pattern}`);\n }\n return encodeURIComponent(String(value));\n });\n if (pathname.includes(\"?\") || pathname.includes(\"#\")) {\n throw new Error(\n `[mado] ${pattern}: query strings and fragments are not part of a route pathname.`,\n );\n }\n const absolute = pathname.startsWith(\"/\") ? pathname : `/${pathname}`;\n return absolute.length > 1 && absolute.endsWith(\"/\")\n ? absolute.slice(0, -1)\n : absolute;\n}\n\n// ---------- Manifest (routes()) ----------\n\n\nexport type RoutesMap = Record<string, RouteEntry>;\n\nexport interface FlatEntry {\n loader: () => Promise<Page> | Page;\n layouts: Array<() => Promise<Page> | Page>;\n /**\n * Guards inherited from enclosing layout groups, outer → inner.\n * The page may add its own via `Page.guard` — those run last.\n */\n guards: Guard[];\n}\n\n/**\n * Unfold a layout-group manifest into a flat list of `[fullPattern, FlatEntry]`.\n * Accumulates parent layouts along the way, so each leaf route\n * \"knows\" all its layouts (from outer to inner).\n */\nexport function flatten(\n map: RoutesMap,\n prefix = \"\",\n layouts: FlatEntry[\"layouts\"] = [],\n guards: Guard[] = [],\n): Array<[string, FlatEntry]> {\n const out: Array<[string, FlatEntry]> = [];\n for (const [k, v] of Object.entries(map)) {\n const full = joinPath(prefix, k);\n if (isLayoutGroup(v)) {\n const nextLayouts = v.layout\n ? [...layouts, normalize(v.layout)]\n : layouts;\n const nextGuards = v.guard\n ? [...guards, ...toGuardArray(v.guard)]\n : guards;\n for (const sub of flatten(v.routes, full, nextLayouts, nextGuards)) {\n out.push(sub);\n }\n } else {\n out.push([\n full || \"/\",\n { loader: normalize(v), layouts, guards: [...guards] },\n ]);\n }\n }\n return out;\n}\n\nfunction toGuardArray(g: Guard | Guard[]): Guard[] {\n return Array.isArray(g) ? g : [g];\n}\n\n/** Careful path segment joining without duplicate slashes. */\nexport function joinPath(a: string, b: string): string {\n if (!a) return b;\n if (!b) return a;\n if (a.endsWith(\"/\")) a = a.slice(0, -1);\n if (b.startsWith(\"/\")) b = b.slice(1);\n return `${a}/${b}`;\n}\n\n/**\n * Normalise a RouteEntry into a uniform `() => Promise<Page> | Page`.\n *\n * RouteEntry comes in three forms:\n * - a ready Page → return as-is\n * - dynamic import → await the default export and check it's a Page\n * - something else → throw (bad manifest entry)\n *\n * This function is the single place that handles both forms;\n * the rest of the code works only with the unified loader.\n */\nexport function normalize(entry: RouteEntry): () => Promise<Page> | Page {\n if (isPage(entry)) return () => entry;\n if (typeof entry === \"function\") {\n return async () => {\n const mod = await (entry as () => Promise<{ default: Page }>)();\n const p = mod.default;\n if (!isPage(p)) {\n throw new Error(\n \"[mado] Lazy route did not return page({...}) as the default export.\",\n );\n }\n return p;\n };\n }\n throw new Error(\"[mado] Invalid entry in routes(): \" + String(entry));\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../../../src/router/navigation.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAU,KAAK,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAErD,OAAO,EAKL,KAAK,MAAM,EACZ,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAIhE,MAAM,WAAW,SAAS;IACxB,+DAA+D;IAC/D,IAAI,EAAE,MAAM,cAAc,CAAC;IAC3B,gCAAgC;IAChC,IAAI,EAAE,MAAM,MAAM,CAAC;IACnB,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;IACzD,kDAAkD;IAClD,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,MAAM,CACpB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,aAAkB,GAC1B,SAAS,CAqKX;AA4BD;;;;;;;;;;;;GAYG;AACH,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAWvE;AAsJD,MAAM,WAAW,UAAU;IACzB,IAAI,MAAM,CAAC;IACX,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;CAC5D;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,SAAK,GAAG,UAAU,CAgBtE;AAED;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC"}
|