@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
package/dist/src/signal.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signal.js","sourceRoot":"","sources":["../../src/signal.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"signal.js","sourceRoot":"","sources":["../../src/signal.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Reactivity via signals.\n *\n * Idea: a signal is a getter-function that also has .set / .update.\n * When a signal is read inside an effect/computed, we record \"who read it\"\n * and notify subscribers when the value changes. No proxies, no Virtual DOM.\n *\n * Performance:\n * - effect runs are deduplicated and scheduled via queueMicrotask,\n * so multiple .set() calls in a row produce a single subscriber pass;\n * - batch(fn) explicitly groups changes (supports arbitrary nesting);\n * - flushSync() — flush pending effects right now (useful in tests).\n *\n * API:\n * const count = signal(0);\n * count(); // get\n * count.set(5); // set\n * count.update(n=>n+1);\n *\n * const doubled = computed(() => count() * 2);\n *\n * effect(() => console.log(count()));\n *\n * batch(() => { a.set(1); b.set(2); });\n */\n\nimport { reportError } from \"./diagnostics.js\";\nimport { getCurrentLifecycle } from \"./lifecycle.js\";\nimport { emitDevtools } from \"./devtools-hook.js\";\n\ntype Subscriber = () => void;\n\nconst MAX_FLUSH_RUNS_PER_SUBSCRIBER = 100;\n\n/**\n * Subscriber with metadata.\n * - sync=true → when a dep changes, run() is called SYNCHRONOUSLY\n * (used by computed: dirty is marked without delay);\n * - sync=false → run() is scheduled via the microtask scheduler\n * (used by effect: renders are batched).\n */\ninterface SubscriberEntry {\n run: Subscriber;\n sync: boolean;\n}\n\ninterface Tracker {\n deps: Set<SubscriberSet>;\n entry: SubscriberEntry;\n}\n\nlet activeTracker: Tracker | null = null;\n\nclass SubscriberSet extends Set<SubscriberEntry> {\n private emptyScheduled = false;\n\n constructor(private readonly onEmpty?: () => void) {\n super();\n }\n\n override add(entry: SubscriberEntry): this {\n super.add(entry);\n this.emptyScheduled = false;\n return this;\n }\n\n override delete(entry: SubscriberEntry): boolean {\n const deleted = super.delete(entry);\n if (deleted) this.queueEmpty();\n return deleted;\n }\n\n override clear(): void {\n const hadEntries = this.size > 0;\n super.clear();\n if (hadEntries) this.queueEmpty();\n }\n\n private queueEmpty(): void {\n if (!this.onEmpty || this.size > 0 || this.emptyScheduled) return;\n this.emptyScheduled = true;\n queueMicrotask(() => {\n this.emptyScheduled = false;\n if (this.size === 0) this.onEmpty?.();\n });\n }\n}\n\nfunction cleanupTracker(tracker: Tracker): void {\n for (const dep of tracker.deps) dep.delete(tracker.entry);\n tracker.deps.clear();\n}\n\n// ---------- Scheduler ----------\n\nconst pending = new Set<Subscriber>();\n// Reconciles for observed `equals`-computeds whose deps changed inside a batch.\n// Deferred to batch end so they recompute once, on fully-applied (consistent)\n// state, instead of eagerly inside each set() on half-applied state.\n// (FABLE_REPORT.md finding #4)\nconst deferredEquals = new Set<Subscriber>();\nlet batchDepth = 0;\nlet flushScheduled = false;\n\n/** Run all deferred equals-computed reconciles; cascades may enqueue more. */\nfunction drainDeferredEquals(): void {\n while (deferredEquals.size > 0) {\n const items = [...deferredEquals];\n deferredEquals.clear();\n for (const fn of items) {\n try {\n fn();\n } catch (err) {\n reportError(\"reactivity\", \"computed-reconcile\", \"deferred computed reconcile threw\", err);\n }\n }\n }\n}\n\n\nfunction schedule(sub: Subscriber): void {\n pending.add(sub);\n if (batchDepth > 0) return;\n if (flushScheduled) return;\n flushScheduled = true;\n queueMicrotask(flush);\n}\n\nfunction flush(): void {\n flushScheduled = false;\n // Defensive: reconcile any deferred equals-computeds before running effects,\n // so effects always observe settled computed values.\n drainDeferredEquals();\n const runCounts = new Map<Subscriber, number>();\n\n // guard against Set modification during iteration\n while (pending.size > 0) {\n const subs = [...pending];\n pending.clear();\n for (const sub of subs) {\n const runs = (runCounts.get(sub) ?? 0) + 1;\n runCounts.set(sub, runs);\n if (runs > MAX_FLUSH_RUNS_PER_SUBSCRIBER) {\n reportError(\n \"reactivity\",\n \"effect-cycle\",\n `effect cycle detected: subscriber re-ran more than ${MAX_FLUSH_RUNS_PER_SUBSCRIBER} times in one flush`,\n undefined,\n );\n continue;\n }\n try {\n sub();\n } catch (err) {\n // a subscriber must not crash the others\n reportError(\"reactivity\", \"effect-run\", \"effect threw\", err);\n }\n }\n }\n}\n\n/**\n * Group multiple signal changes into a single subscriber pass.\n * Supports arbitrary nesting.\n */\nexport function batch<T>(fn: () => T): T {\n batchDepth++;\n try {\n return fn();\n } finally {\n batchDepth--;\n if (batchDepth === 0) {\n // Reconcile deferred equals-computeds now that all sets are applied and\n // state is consistent. This may enqueue effects into `pending`.\n drainDeferredEquals();\n if (pending.size > 0 && !flushScheduled) {\n flushScheduled = true;\n queueMicrotask(flush);\n }\n }\n }\n\n}\n\n/**\n * Forcefully flush pending effects right now (synchronously).\n * Useful in tests: removes the need to wait for a microtask.\n */\nexport function flushSync(): void {\n flush();\n}\n\n// ---------- signal ----------\n\n\nexport interface Signal<T> {\n (): T;\n set(value: T): void;\n update(updater: (prev: T) => T): void;\n peek(): T;\n}\n\nexport function signal<T>(initial: T): Signal<T> {\n let value = initial;\n const subscribers = new SubscriberSet();\n\n const read = (() => {\n if (activeTracker) {\n subscribers.add(activeTracker.entry);\n activeTracker.deps.add(subscribers);\n }\n return value;\n }) as Signal<T>;\n\n read.set = (next: T) => {\n if (Object.is(value, next)) return;\n const previous = value;\n value = next;\n if (typeof __MADO_DEVTOOLS__ === \"undefined\" || __MADO_DEVTOOLS__) emitDevtools(\"signal:set\", read, { previous, value: next });\n // snapshot: a subscriber may re-subscribe in run(), mutating the Set\n const snapshot = [...subscribers];\n // sync subscribers (computed) first — mark dirty before effects read;\n // then async via the scheduler.\n for (const e of snapshot) {\n if (e.sync) {\n try {\n e.run();\n } catch (err) {\n reportError(\"reactivity\", \"sync-subscriber\", \"sync subscriber threw\", err);\n }\n }\n }\n for (const e of snapshot) {\n if (!e.sync) schedule(e.run);\n }\n };\n\n read.update = (fn: (prev: T) => T) => read.set(fn(value));\n read.peek = () => value;\n debugInfo.set(read, { subscribers });\n if (typeof __MADO_DEVTOOLS__ === \"undefined\" || __MADO_DEVTOOLS__) emitDevtools(\"signal:create\", read, { value });\n\n return read;\n}\n\n// ---------- computed (lazy, dirty-flag) ----------\n\n\nexport interface Computed<T> {\n (): T;\n peek(): T;\n}\n\nexport interface ComputedOptions<T> {\n /**\n * Equality check used when an observed computed is invalidated.\n *\n * If the new value is equal to the previous value, subscribers are not\n * notified. Defaults to always notifying on dependency invalidation, which\n * preserves the classic lazy dirty-flag behavior.\n */\n equals?: (prev: T, next: T) => boolean;\n}\n\n/**\n * Lazy computed based on a dirty-flag:\n * - fn is NOT called until the computed is read;\n * - if none of the deps changed since the last read — cached value is returned;\n * - when a dep changes the computed is marked dirty (NOT recomputed),\n * and triggers its own subscribers via schedule(). Subscribers\n * (an effect or another computed) will read our value on their next run\n * → fn is recomputed exactly once.\n *\n * Implementation: computed = \"signal source\" (has subscribers) +\n * \"tracker\" (has deps). When a dep calls the tracker's run(),\n * instead of actually recomputing we mark ourselves dirty and\n * propagate to subscribers.\n */\nexport function computed<T>(\n fn: () => T,\n options: ComputedOptions<T> = {},\n): Computed<T> {\n let value: T = undefined as unknown as T;\n let dirty = true;\n let hasValue = false;\n let computing = false;\n\n // Recompute an observed equals-computed and notify only if the value\n // actually changed. Extracted so it can run eagerly (outside a batch) or\n // deferred to batch end (inside a batch), where it sees consistent state.\n const reconcileEquals = (): void => {\n if (subscribers.size === 0) {\n dirty = true;\n suspend();\n return;\n }\n const prevValue = value;\n recompute();\n if (hasValue && options.equals!(prevValue, value)) return;\n notifySubscribers();\n };\n\n const onInvalidate: Subscriber = () => {\n // dep changed → mark dirty synchronously and cascade.\n // Sync subscribers (other computed) are triggered immediately — they also\n // set dirty without delay. Async (effects) go through the scheduler.\n if (dirty) return;\n if (subscribers.size === 0) {\n dirty = true;\n suspend();\n return;\n }\n if (options.equals && hasValue) {\n // Inside a batch, defer the recompute+compare to batch end so it runs\n // once on fully-applied state instead of eagerly on half-applied state\n // (which would observe a mixed snapshot and could notify spuriously or\n // run O(number of sets) times). (FABLE_REPORT.md finding #4)\n if (batchDepth > 0) {\n deferredEquals.add(reconcileEquals);\n return;\n }\n reconcileEquals();\n return;\n }\n dirty = true;\n notifySubscribers();\n };\n\n\n const tracker: Tracker = {\n deps: new Set(),\n entry: { run: onInvalidate, sync: true },\n };\n\n const subscribers = new SubscriberSet(() => {\n suspend();\n });\n\n const suspend = (): void => {\n if (subscribers.size > 0) return;\n cleanupTracker(tracker);\n dirty = true;\n };\n\n const queueSuspendIfUnobserved = (): void => {\n if (subscribers.size > 0) return;\n queueMicrotask(() => {\n if (subscribers.size === 0) suspend();\n });\n };\n\n const notifySubscribers = (): void => {\n const snapshot = [...subscribers];\n for (const e of snapshot) {\n if (e.sync) {\n try {\n e.run();\n } catch (err) {\n reportError(\"reactivity\", \"sync-subscriber\", \"sync subscriber threw\", err);\n }\n } else {\n schedule(e.run);\n }\n }\n };\n\n const recompute = (): void => {\n if (computing) {\n throw new Error(\"[mado] computed cycle detected\");\n }\n cleanupTracker(tracker);\n\n const prev = activeTracker;\n activeTracker = tracker;\n computing = true;\n try {\n value = fn();\n } finally {\n computing = false;\n activeTracker = prev;\n }\n dirty = false;\n hasValue = true;\n if (typeof __MADO_DEVTOOLS__ === \"undefined\" || __MADO_DEVTOOLS__) emitDevtools(\"computed:value\", read, { value });\n queueSuspendIfUnobserved();\n };\n\n const read = (() => {\n if (activeTracker) {\n subscribers.add(activeTracker.entry);\n activeTracker.deps.add(subscribers);\n }\n if (dirty) recompute();\n return value;\n }) as Computed<T>;\n\n read.peek = () => {\n if (dirty) recompute();\n return value;\n };\n\n debugInfo.set(read, { subscribers, tracker });\n if (typeof __MADO_DEVTOOLS__ === \"undefined\" || __MADO_DEVTOOLS__) emitDevtools(\"computed:create\", read);\n return read;\n}\n\n// ---------- effect ----------\n\nexport type Disposer = () => void;\n\nexport function effect(fn: () => void | Disposer): Disposer {\n let cleanup: Disposer | void;\n let disposed = false;\n\n const run: Subscriber = () => {\n if (disposed) return;\n if (typeof __MADO_DEVTOOLS__ === \"undefined\" || __MADO_DEVTOOLS__) emitDevtools(\"effect:run\", run);\n cleanupTracker(tracker);\n\n const previousCleanup = cleanup;\n cleanup = undefined;\n if (typeof previousCleanup === \"function\") previousCleanup();\n\n const prev = activeTracker;\n activeTracker = tracker;\n try {\n cleanup = fn();\n } catch (err) {\n cleanupTracker(tracker);\n throw err;\n } finally {\n activeTracker = prev;\n }\n };\n\n const tracker: Tracker = {\n deps: new Set(),\n entry: { run, sync: false },\n };\n\n const dispose = (): void => {\n if (disposed) return;\n disposed = true;\n pending.delete(run);\n cleanupTracker(tracker);\n const finalCleanup = cleanup;\n cleanup = undefined;\n if (typeof finalCleanup === \"function\") finalCleanup();\n if (typeof __MADO_DEVTOOLS__ === \"undefined\" || __MADO_DEVTOOLS__) emitDevtools(\"effect:dispose\", run);\n };\n\n if (typeof __MADO_DEVTOOLS__ === \"undefined\" || __MADO_DEVTOOLS__) emitDevtools(\"effect:create\", run);\n run();\n getCurrentLifecycle()?.onDispose(dispose);\n return dispose;\n}\n\n/**\n * Execute a function outside of tracking — reading signals will not create a subscription.\n */\nexport function untracked<T>(fn: () => T): T {\n const prev = activeTracker;\n activeTracker = null;\n try {\n return fn();\n } finally {\n activeTracker = prev;\n }\n}\n\ninterface DebugInfo {\n subscribers: SubscriberSet;\n tracker?: Tracker;\n}\n\nconst debugInfo = new WeakMap<object, DebugInfo>();\n\n/** @internal */\nexport const _testHooks = {\n subscriberCount(source: object): number {\n return debugInfo.get(source)?.subscribers.size ?? 0;\n },\n dependencyCount(source: object): number {\n return debugInfo.get(source)?.tracker?.deps.size ?? 0;\n },\n};\n"]}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import type { JsonValue } from "./page.js";
|
|
2
|
+
export interface StaticDiagnostics {
|
|
3
|
+
routeReady: boolean;
|
|
4
|
+
pending: string[];
|
|
5
|
+
lastRouterState: string | null;
|
|
6
|
+
errors: string[];
|
|
7
|
+
expectedPathname: string | null;
|
|
8
|
+
}
|
|
9
|
+
export interface WhenStableOptions {
|
|
10
|
+
/**
|
|
11
|
+
* Cap on time to wait for the route to call `routeReady()`. Defaults
|
|
12
|
+
* to 15s — long enough to load and render even a slow code-split
|
|
13
|
+
* route, short enough that a deadlocked one fails loudly.
|
|
14
|
+
*/
|
|
15
|
+
routeReadyMs?: number;
|
|
16
|
+
/**
|
|
17
|
+
* Cap on time to wait for tracked resources (initial fetches, lazy
|
|
18
|
+
* imports created before `routeReady()`) to settle once the route is
|
|
19
|
+
* ready. Defaults to 15s.
|
|
20
|
+
*/
|
|
21
|
+
resourcesMs?: number;
|
|
22
|
+
/**
|
|
23
|
+
* Cap on time to wait for `document.fonts.ready`. Web fonts that
|
|
24
|
+
* never resolve must not block the snapshot pipeline indefinitely.
|
|
25
|
+
* Defaults to 5s. We log a diagnostic and proceed on timeout.
|
|
26
|
+
*/
|
|
27
|
+
fontsMs?: number;
|
|
28
|
+
/**
|
|
29
|
+
* Cap on time to wait for two paint frames so async style or layout
|
|
30
|
+
* effects can flush before serialization. Defaults to 1s.
|
|
31
|
+
*/
|
|
32
|
+
paintMs?: number;
|
|
33
|
+
}
|
|
34
|
+
export interface MadoStaticRuntime {
|
|
35
|
+
beginRoute(pathname: string): void;
|
|
36
|
+
routeReady(state?: string): void;
|
|
37
|
+
track<T>(promise: Promise<T>, label: string): Promise<T>;
|
|
38
|
+
whenStable(options?: WhenStableOptions): Promise<void>;
|
|
39
|
+
diagnostics(): StaticDiagnostics;
|
|
40
|
+
setRouterState(state: string): void;
|
|
41
|
+
recordError(error: unknown): void;
|
|
42
|
+
}
|
|
43
|
+
declare global {
|
|
44
|
+
interface Window {
|
|
45
|
+
/**
|
|
46
|
+
* Build-time signal that this document is being rendered by the static
|
|
47
|
+
* snapshot capture harness. Set by Mado runtime when the document
|
|
48
|
+
* carries the `data-mado-static-capture` attribute. CSP-safe: it does
|
|
49
|
+
* NOT come from an inline script.
|
|
50
|
+
*/
|
|
51
|
+
__MADO_STATIC_MODE__?: boolean;
|
|
52
|
+
__MADO_STATIC__?: MadoStaticRuntime;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Consume the build-time seed for the active route exactly once.
|
|
57
|
+
*
|
|
58
|
+
* Lifecycle: discovery encodes the seed into the snapshot as a
|
|
59
|
+
* `<script type="application/json" data-mado-static-data>` element. On the
|
|
60
|
+
* first client boot of a static route the router calls
|
|
61
|
+
* `consumeStaticSeed(pathname)` from a single place.
|
|
62
|
+
*
|
|
63
|
+
* - In production (no capture marker): the script element is removed
|
|
64
|
+
* after parsing so subsequent SPA navigations cannot resurrect a stale
|
|
65
|
+
* seed.
|
|
66
|
+
* - During build-time capture (data-mado-static-capture present): the
|
|
67
|
+
* script element is preserved so the serializer can keep it in the
|
|
68
|
+
* final snapshot HTML — that way the real client boot receives the
|
|
69
|
+
* same seed once again.
|
|
70
|
+
*
|
|
71
|
+
* Returns `undefined` if no seed is present, the JSON is malformed, or the
|
|
72
|
+
* pathname does not match. The router passes the result into both
|
|
73
|
+
* `page.head(params, seed)` and `page.load(params, seed)`.
|
|
74
|
+
*/
|
|
75
|
+
export declare function consumeStaticSeed(pathname: string): JsonValue | undefined;
|
|
76
|
+
export declare function getStaticRuntime(): MadoStaticRuntime | null;
|
|
77
|
+
export declare function trackStatic<T>(promise: Promise<T>, label: string): Promise<T>;
|
|
78
|
+
export declare function beginStaticRoute(pathname: string): void;
|
|
79
|
+
export declare function markStaticRouteReady(state?: string): void;
|
|
80
|
+
export declare function setStaticRouterState(state: string): void;
|
|
81
|
+
export declare function recordStaticError(error: unknown): void;
|
|
82
|
+
//# sourceMappingURL=static-runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"static-runtime.d.ts","sourceRoot":"","sources":["../../src/static-runtime.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAE3C,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED,MAAM,WAAW,iBAAiB;IAChC;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACzD,UAAU,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,WAAW,IAAI,iBAAiB,CAAC;IACjC,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;CACnC;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd;;;;;WAKG;QACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;QAC/B,eAAe,CAAC,EAAE,iBAAiB,CAAC;KACrC;CACF;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,GACf,SAAS,GAAG,SAAS,CAsBvB;AAOD,wBAAgB,gBAAgB,IAAI,iBAAiB,GAAG,IAAI,CAS3D;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAE7E;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAEvD;AAED,wBAAgB,oBAAoB,CAAC,KAAK,SAAU,GAAG,IAAI,CAE1D;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAExD;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAEtD"}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import { flushSync } from "./signal.js";
|
|
2
|
+
import { stripBase } from "./router/base.js";
|
|
3
|
+
/**
|
|
4
|
+
* Consume the build-time seed for the active route exactly once.
|
|
5
|
+
*
|
|
6
|
+
* Lifecycle: discovery encodes the seed into the snapshot as a
|
|
7
|
+
* `<script type="application/json" data-mado-static-data>` element. On the
|
|
8
|
+
* first client boot of a static route the router calls
|
|
9
|
+
* `consumeStaticSeed(pathname)` from a single place.
|
|
10
|
+
*
|
|
11
|
+
* - In production (no capture marker): the script element is removed
|
|
12
|
+
* after parsing so subsequent SPA navigations cannot resurrect a stale
|
|
13
|
+
* seed.
|
|
14
|
+
* - During build-time capture (data-mado-static-capture present): the
|
|
15
|
+
* script element is preserved so the serializer can keep it in the
|
|
16
|
+
* final snapshot HTML — that way the real client boot receives the
|
|
17
|
+
* same seed once again.
|
|
18
|
+
*
|
|
19
|
+
* Returns `undefined` if no seed is present, the JSON is malformed, or the
|
|
20
|
+
* pathname does not match. The router passes the result into both
|
|
21
|
+
* `page.head(params, seed)` and `page.load(params, seed)`.
|
|
22
|
+
*/
|
|
23
|
+
export function consumeStaticSeed(pathname) {
|
|
24
|
+
if (typeof document === "undefined")
|
|
25
|
+
return undefined;
|
|
26
|
+
const el = document.querySelector('script[type="application/json"][data-mado-static-data]');
|
|
27
|
+
if (!el || el.textContent == null)
|
|
28
|
+
return undefined;
|
|
29
|
+
// The attribute MAY carry the pathname it was emitted for; an empty or
|
|
30
|
+
// missing value means "the only seed in this document", and we accept it
|
|
31
|
+
// for the active route. A non-empty mismatch indicates a stale fragment
|
|
32
|
+
// from a previous route — drop it.
|
|
33
|
+
const elPath = el.getAttribute("data-mado-static-data");
|
|
34
|
+
if (elPath && elPath !== pathname)
|
|
35
|
+
return undefined;
|
|
36
|
+
const preserve = document.documentElement.hasAttribute("data-mado-static-capture");
|
|
37
|
+
try {
|
|
38
|
+
const value = JSON.parse(el.textContent);
|
|
39
|
+
if (!preserve)
|
|
40
|
+
el.remove();
|
|
41
|
+
return value;
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
if (!preserve)
|
|
45
|
+
el.remove();
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function detectCaptureMode() {
|
|
50
|
+
if (typeof document === "undefined")
|
|
51
|
+
return false;
|
|
52
|
+
return document.documentElement.hasAttribute("data-mado-static-capture");
|
|
53
|
+
}
|
|
54
|
+
export function getStaticRuntime() {
|
|
55
|
+
if (typeof window === "undefined")
|
|
56
|
+
return null;
|
|
57
|
+
if (window.__MADO_STATIC__)
|
|
58
|
+
return window.__MADO_STATIC__;
|
|
59
|
+
const enabled = window.__MADO_STATIC_MODE__ === true || detectCaptureMode();
|
|
60
|
+
if (!enabled)
|
|
61
|
+
return null;
|
|
62
|
+
window.__MADO_STATIC_MODE__ = true;
|
|
63
|
+
window.__MADO_STATIC__ = createStaticRuntime();
|
|
64
|
+
return window.__MADO_STATIC__;
|
|
65
|
+
}
|
|
66
|
+
export function trackStatic(promise, label) {
|
|
67
|
+
return getStaticRuntime()?.track(promise, label) ?? promise;
|
|
68
|
+
}
|
|
69
|
+
export function beginStaticRoute(pathname) {
|
|
70
|
+
getStaticRuntime()?.beginRoute(pathname);
|
|
71
|
+
}
|
|
72
|
+
export function markStaticRouteReady(state = "ready") {
|
|
73
|
+
getStaticRuntime()?.routeReady(state);
|
|
74
|
+
}
|
|
75
|
+
export function setStaticRouterState(state) {
|
|
76
|
+
getStaticRuntime()?.setRouterState(state);
|
|
77
|
+
}
|
|
78
|
+
export function recordStaticError(error) {
|
|
79
|
+
getStaticRuntime()?.recordError(error);
|
|
80
|
+
}
|
|
81
|
+
function createStaticRuntime() {
|
|
82
|
+
let nextId = 1;
|
|
83
|
+
let routeReady = false;
|
|
84
|
+
let lastRouterState = null;
|
|
85
|
+
let expectedPathname = null;
|
|
86
|
+
const pending = new Map();
|
|
87
|
+
const errors = [];
|
|
88
|
+
const diagnostics = () => ({
|
|
89
|
+
routeReady,
|
|
90
|
+
pending: [...pending.values()].sort(),
|
|
91
|
+
lastRouterState,
|
|
92
|
+
errors: [...errors],
|
|
93
|
+
expectedPathname,
|
|
94
|
+
});
|
|
95
|
+
// Both `beginRoute()` callers and the `routeReady()` comparison live on
|
|
96
|
+
// the BASE-FREE pathname (the route key the matcher uses). Strip the
|
|
97
|
+
// active Vite base so capture under any deployment shape compares
|
|
98
|
+
// apples to apples.
|
|
99
|
+
const currentPathname = () => typeof location !== "undefined" ? stripBase(location.pathname) : null;
|
|
100
|
+
const runtime = {
|
|
101
|
+
beginRoute(pathname) {
|
|
102
|
+
expectedPathname = pathname;
|
|
103
|
+
routeReady = false;
|
|
104
|
+
lastRouterState = "begin";
|
|
105
|
+
},
|
|
106
|
+
routeReady(state = "ready") {
|
|
107
|
+
// If the runtime moved to a different pathname (effect-driven redirect,
|
|
108
|
+
// guard verdict), only acknowledge readiness for the active path; the
|
|
109
|
+
// capture harness compares pathname before serialization.
|
|
110
|
+
const here = currentPathname();
|
|
111
|
+
if (expectedPathname != null && here != null && here !== expectedPathname) {
|
|
112
|
+
// Stale completion of an old route; do not mark as ready.
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
routeReady = true;
|
|
116
|
+
lastRouterState = state;
|
|
117
|
+
},
|
|
118
|
+
track(promise, label) {
|
|
119
|
+
const id = nextId++;
|
|
120
|
+
pending.set(id, label);
|
|
121
|
+
return Promise.resolve(promise).finally(() => {
|
|
122
|
+
pending.delete(id);
|
|
123
|
+
});
|
|
124
|
+
},
|
|
125
|
+
async whenStable(options = {}) {
|
|
126
|
+
const routeReadyMs = options.routeReadyMs ?? 15_000;
|
|
127
|
+
const resourcesMs = options.resourcesMs ?? 15_000;
|
|
128
|
+
// 1) Route ready: wait until the router calls `markStaticRouteReady`
|
|
129
|
+
// for the active pathname. Resources, fonts and paint frames are
|
|
130
|
+
// irrelevant until the route itself has committed.
|
|
131
|
+
await waitFor(() => routeReady && errors.length === 0, routeReadyMs, () => {
|
|
132
|
+
const d = diagnostics();
|
|
133
|
+
return (`[mado:static] route did not become ready in ${routeReadyMs}ms. ` +
|
|
134
|
+
`state=${d.lastRouterState ?? "unknown"} ` +
|
|
135
|
+
`pending=${d.pending.join(", ") || "none"} ` +
|
|
136
|
+
`errors=${d.errors.join(" | ") || "none"}`);
|
|
137
|
+
});
|
|
138
|
+
// 2) Tracked resources: any `resource()` created before route ready
|
|
139
|
+
// is part of the initial render contract; the snapshot waits for
|
|
140
|
+
// it. Resources created after `routeReady` count as background
|
|
141
|
+
// work and are NOT awaited — they would otherwise let a stray
|
|
142
|
+
// `setInterval` keep capture pinned forever.
|
|
143
|
+
await waitFor(() => pending.size === 0 && errors.length === 0, resourcesMs, () => {
|
|
144
|
+
const d = diagnostics();
|
|
145
|
+
return (`[mado:static] route ready but resources did not settle in ${resourcesMs}ms. ` +
|
|
146
|
+
`pending=${d.pending.join(", ") || "none"} ` +
|
|
147
|
+
`errors=${d.errors.join(" | ") || "none"}`);
|
|
148
|
+
});
|
|
149
|
+
// 3) One last quiet pass: flushSync + microtask drain to ensure
|
|
150
|
+
// any final reactive effect committed during step 2 has
|
|
151
|
+
// rendered before the caller serializes the document.
|
|
152
|
+
try {
|
|
153
|
+
flushSync();
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
/* best effort; diagnostics already capture page errors */
|
|
157
|
+
}
|
|
158
|
+
await microtask();
|
|
159
|
+
},
|
|
160
|
+
diagnostics,
|
|
161
|
+
setRouterState(state) {
|
|
162
|
+
lastRouterState = state;
|
|
163
|
+
},
|
|
164
|
+
recordError(error) {
|
|
165
|
+
errors.push(error instanceof Error ? error.message : String(error));
|
|
166
|
+
},
|
|
167
|
+
};
|
|
168
|
+
return runtime;
|
|
169
|
+
}
|
|
170
|
+
function microtask() {
|
|
171
|
+
return Promise.resolve();
|
|
172
|
+
}
|
|
173
|
+
function delay(ms) {
|
|
174
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Poll `predicate` until it returns true or `timeoutMs` elapses. Calls
|
|
178
|
+
* `flushSync()` once per pass so reactive effects scheduled during the
|
|
179
|
+
* tick get a chance to commit before the next check. On timeout throws
|
|
180
|
+
* the message returned by `describe()` so each phase of `whenStable`
|
|
181
|
+
* produces a phase-specific diagnostic.
|
|
182
|
+
*/
|
|
183
|
+
async function waitFor(predicate, timeoutMs, describe) {
|
|
184
|
+
const started = Date.now();
|
|
185
|
+
// Two consecutive quiet ticks before we declare success: the predicate
|
|
186
|
+
// can transition transiently while a microtask flush rebuilds the
|
|
187
|
+
// route view.
|
|
188
|
+
let quietPasses = 0;
|
|
189
|
+
while (Date.now() - started < timeoutMs) {
|
|
190
|
+
try {
|
|
191
|
+
flushSync();
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
/* page errors surface separately via recordError */
|
|
195
|
+
}
|
|
196
|
+
await microtask();
|
|
197
|
+
if (predicate()) {
|
|
198
|
+
quietPasses++;
|
|
199
|
+
if (quietPasses >= 2)
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
quietPasses = 0;
|
|
204
|
+
}
|
|
205
|
+
await delay(10);
|
|
206
|
+
}
|
|
207
|
+
throw new Error(describe());
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=static-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"static-runtime.js","sourceRoot":"","sources":["../../src/static-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AA4D7C;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,iBAAiB,CAC/B,QAAgB;IAEhB,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO,SAAS,CAAC;IACtD,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAC/B,wDAAwD,CACzD,CAAC;IACF,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,WAAW,IAAI,IAAI;QAAE,OAAO,SAAS,CAAC;IACpD,uEAAuE;IACvE,yEAAyE;IACzE,wEAAwE;IACxE,mCAAmC;IACnC,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,uBAAuB,CAAC,CAAC;IACxD,IAAI,MAAM,IAAI,MAAM,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IACpD,MAAM,QAAQ,GACZ,QAAQ,CAAC,eAAe,CAAC,YAAY,CAAC,0BAA0B,CAAC,CAAC;IACpE,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,WAAW,CAAc,CAAC;QACtD,IAAI,CAAC,QAAQ;YAAE,EAAE,CAAC,MAAM,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,CAAC,QAAQ;YAAE,EAAE,CAAC,MAAM,EAAE,CAAC;QAC3B,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB;IACxB,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO,KAAK,CAAC;IAClD,OAAO,QAAQ,CAAC,eAAe,CAAC,YAAY,CAAC,0BAA0B,CAAC,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IAC/C,IAAI,MAAM,CAAC,eAAe;QAAE,OAAO,MAAM,CAAC,eAAe,CAAC;IAC1D,MAAM,OAAO,GACX,MAAM,CAAC,oBAAoB,KAAK,IAAI,IAAI,iBAAiB,EAAE,CAAC;IAC9D,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,MAAM,CAAC,oBAAoB,GAAG,IAAI,CAAC;IACnC,MAAM,CAAC,eAAe,GAAG,mBAAmB,EAAE,CAAC;IAC/C,OAAO,MAAM,CAAC,eAAe,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,WAAW,CAAI,OAAmB,EAAE,KAAa;IAC/D,OAAO,gBAAgB,EAAE,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,OAAO,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,gBAAgB,EAAE,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAK,GAAG,OAAO;IAClD,gBAAgB,EAAE,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,gBAAgB,EAAE,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,gBAAgB,EAAE,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,mBAAmB;IAC1B,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,IAAI,eAAe,GAAkB,IAAI,CAAC;IAC1C,IAAI,gBAAgB,GAAkB,IAAI,CAAC;IAC3C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC1C,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,MAAM,WAAW,GAAG,GAAsB,EAAE,CAAC,CAAC;QAC5C,UAAU;QACV,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE;QACrC,eAAe;QACf,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC;QACnB,gBAAgB;KACjB,CAAC,CAAC;IAEH,wEAAwE;IACxE,qEAAqE;IACrE,kEAAkE;IAClE,oBAAoB;IACpB,MAAM,eAAe,GAAG,GAAkB,EAAE,CAC1C,OAAO,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAExE,MAAM,OAAO,GAAsB;QACjC,UAAU,CAAC,QAAgB;YACzB,gBAAgB,GAAG,QAAQ,CAAC;YAC5B,UAAU,GAAG,KAAK,CAAC;YACnB,eAAe,GAAG,OAAO,CAAC;QAC5B,CAAC;QACD,UAAU,CAAC,KAAK,GAAG,OAAO;YACxB,wEAAwE;YACxE,sEAAsE;YACtE,0DAA0D;YAC1D,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;YAC/B,IAAI,gBAAgB,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,gBAAgB,EAAE,CAAC;gBAC1E,0DAA0D;gBAC1D,OAAO;YACT,CAAC;YACD,UAAU,GAAG,IAAI,CAAC;YAClB,eAAe,GAAG,KAAK,CAAC;QAC1B,CAAC;QACD,KAAK,CAAI,OAAmB,EAAE,KAAa;YACzC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YACvB,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;gBAC3C,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACrB,CAAC,CAAC,CAAC;QACL,CAAC;QACD,KAAK,CAAC,UAAU,CAAC,OAAO,GAAsB,EAAE;YAC9C,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,MAAM,CAAC;YACpD,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,MAAM,CAAC;YAElD,qEAAqE;YACrE,oEAAoE;YACpE,sDAAsD;YACtD,MAAM,OAAO,CACX,GAAG,EAAE,CAAC,UAAU,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EACvC,YAAY,EACZ,GAAG,EAAE;gBACH,MAAM,CAAC,GAAG,WAAW,EAAE,CAAC;gBACxB,OAAO,CACL,+CAA+C,YAAY,MAAM;oBACjE,SAAS,CAAC,CAAC,eAAe,IAAI,SAAS,GAAG;oBAC1C,WAAW,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,GAAG;oBAC5C,UAAU,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,MAAM,EAAE,CAC3C,CAAC;YACJ,CAAC,CACF,CAAC;YAEF,oEAAoE;YACpE,oEAAoE;YACpE,kEAAkE;YAClE,iEAAiE;YACjE,gDAAgD;YAChD,MAAM,OAAO,CACX,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAC/C,WAAW,EACX,GAAG,EAAE;gBACH,MAAM,CAAC,GAAG,WAAW,EAAE,CAAC;gBACxB,OAAO,CACL,6DAA6D,WAAW,MAAM;oBAC9E,WAAW,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,GAAG;oBAC5C,UAAU,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,MAAM,EAAE,CAC3C,CAAC;YACJ,CAAC,CACF,CAAC;YAEF,gEAAgE;YAChE,2DAA2D;YAC3D,yDAAyD;YACzD,IAAI,CAAC;gBACH,SAAS,EAAE,CAAC;YACd,CAAC;YAAC,MAAM,CAAC;gBACP,0DAA0D;YAC5D,CAAC;YACD,MAAM,SAAS,EAAE,CAAC;QACpB,CAAC;QACD,WAAW;QACX,cAAc,CAAC,KAAa;YAC1B,eAAe,GAAG,KAAK,CAAC;QAC1B,CAAC;QACD,WAAW,CAAC,KAAc;YACxB,MAAM,CAAC,IAAI,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACtE,CAAC;KACF,CAAC;IAEF,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;AAC3B,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,OAAO,CACpB,SAAwB,EACxB,SAAiB,EACjB,QAAsB;IAEtB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC3B,uEAAuE;IACvE,kEAAkE;IAClE,cAAc;IACd,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,GAAG,SAAS,EAAE,CAAC;QACxC,IAAI,CAAC;YACH,SAAS,EAAE,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,oDAAoD;QACtD,CAAC;QACD,MAAM,SAAS,EAAE,CAAC;QAClB,IAAI,SAAS,EAAE,EAAE,CAAC;YAChB,WAAW,EAAE,CAAC;YACd,IAAI,WAAW,IAAI,CAAC;gBAAE,OAAO;QAC/B,CAAC;aAAM,CAAC;YACN,WAAW,GAAG,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC9B,CAAC","sourcesContent":["import { flushSync } from \"./signal.js\";\nimport { stripBase } from \"./router/base.js\";\nimport type { JsonValue } from \"./page.js\";\n\nexport interface StaticDiagnostics {\n routeReady: boolean;\n pending: string[];\n lastRouterState: string | null;\n errors: string[];\n expectedPathname: string | null;\n}\n\nexport interface WhenStableOptions {\n /**\n * Cap on time to wait for the route to call `routeReady()`. Defaults\n * to 15s — long enough to load and render even a slow code-split\n * route, short enough that a deadlocked one fails loudly.\n */\n routeReadyMs?: number;\n /**\n * Cap on time to wait for tracked resources (initial fetches, lazy\n * imports created before `routeReady()`) to settle once the route is\n * ready. Defaults to 15s.\n */\n resourcesMs?: number;\n /**\n * Cap on time to wait for `document.fonts.ready`. Web fonts that\n * never resolve must not block the snapshot pipeline indefinitely.\n * Defaults to 5s. We log a diagnostic and proceed on timeout.\n */\n fontsMs?: number;\n /**\n * Cap on time to wait for two paint frames so async style or layout\n * effects can flush before serialization. Defaults to 1s.\n */\n paintMs?: number;\n}\n\nexport interface MadoStaticRuntime {\n beginRoute(pathname: string): void;\n routeReady(state?: string): void;\n track<T>(promise: Promise<T>, label: string): Promise<T>;\n whenStable(options?: WhenStableOptions): Promise<void>;\n diagnostics(): StaticDiagnostics;\n setRouterState(state: string): void;\n recordError(error: unknown): void;\n}\n\ndeclare global {\n interface Window {\n /**\n * Build-time signal that this document is being rendered by the static\n * snapshot capture harness. Set by Mado runtime when the document\n * carries the `data-mado-static-capture` attribute. CSP-safe: it does\n * NOT come from an inline script.\n */\n __MADO_STATIC_MODE__?: boolean;\n __MADO_STATIC__?: MadoStaticRuntime;\n }\n}\n\n/**\n * Consume the build-time seed for the active route exactly once.\n *\n * Lifecycle: discovery encodes the seed into the snapshot as a\n * `<script type=\"application/json\" data-mado-static-data>` element. On the\n * first client boot of a static route the router calls\n * `consumeStaticSeed(pathname)` from a single place.\n *\n * - In production (no capture marker): the script element is removed\n * after parsing so subsequent SPA navigations cannot resurrect a stale\n * seed.\n * - During build-time capture (data-mado-static-capture present): the\n * script element is preserved so the serializer can keep it in the\n * final snapshot HTML — that way the real client boot receives the\n * same seed once again.\n *\n * Returns `undefined` if no seed is present, the JSON is malformed, or the\n * pathname does not match. The router passes the result into both\n * `page.head(params, seed)` and `page.load(params, seed)`.\n */\nexport function consumeStaticSeed(\n pathname: string,\n): JsonValue | undefined {\n if (typeof document === \"undefined\") return undefined;\n const el = document.querySelector<HTMLScriptElement>(\n 'script[type=\"application/json\"][data-mado-static-data]',\n );\n if (!el || el.textContent == null) return undefined;\n // The attribute MAY carry the pathname it was emitted for; an empty or\n // missing value means \"the only seed in this document\", and we accept it\n // for the active route. A non-empty mismatch indicates a stale fragment\n // from a previous route — drop it.\n const elPath = el.getAttribute(\"data-mado-static-data\");\n if (elPath && elPath !== pathname) return undefined;\n const preserve =\n document.documentElement.hasAttribute(\"data-mado-static-capture\");\n try {\n const value = JSON.parse(el.textContent) as JsonValue;\n if (!preserve) el.remove();\n return value;\n } catch {\n if (!preserve) el.remove();\n return undefined;\n }\n}\n\nfunction detectCaptureMode(): boolean {\n if (typeof document === \"undefined\") return false;\n return document.documentElement.hasAttribute(\"data-mado-static-capture\");\n}\n\nexport function getStaticRuntime(): MadoStaticRuntime | null {\n if (typeof window === \"undefined\") return null;\n if (window.__MADO_STATIC__) return window.__MADO_STATIC__;\n const enabled =\n window.__MADO_STATIC_MODE__ === true || detectCaptureMode();\n if (!enabled) return null;\n window.__MADO_STATIC_MODE__ = true;\n window.__MADO_STATIC__ = createStaticRuntime();\n return window.__MADO_STATIC__;\n}\n\nexport function trackStatic<T>(promise: Promise<T>, label: string): Promise<T> {\n return getStaticRuntime()?.track(promise, label) ?? promise;\n}\n\nexport function beginStaticRoute(pathname: string): void {\n getStaticRuntime()?.beginRoute(pathname);\n}\n\nexport function markStaticRouteReady(state = \"ready\"): void {\n getStaticRuntime()?.routeReady(state);\n}\n\nexport function setStaticRouterState(state: string): void {\n getStaticRuntime()?.setRouterState(state);\n}\n\nexport function recordStaticError(error: unknown): void {\n getStaticRuntime()?.recordError(error);\n}\n\nfunction createStaticRuntime(): MadoStaticRuntime {\n let nextId = 1;\n let routeReady = false;\n let lastRouterState: string | null = null;\n let expectedPathname: string | null = null;\n const pending = new Map<number, string>();\n const errors: string[] = [];\n\n const diagnostics = (): StaticDiagnostics => ({\n routeReady,\n pending: [...pending.values()].sort(),\n lastRouterState,\n errors: [...errors],\n expectedPathname,\n });\n\n // Both `beginRoute()` callers and the `routeReady()` comparison live on\n // the BASE-FREE pathname (the route key the matcher uses). Strip the\n // active Vite base so capture under any deployment shape compares\n // apples to apples.\n const currentPathname = (): string | null =>\n typeof location !== \"undefined\" ? stripBase(location.pathname) : null;\n\n const runtime: MadoStaticRuntime = {\n beginRoute(pathname: string) {\n expectedPathname = pathname;\n routeReady = false;\n lastRouterState = \"begin\";\n },\n routeReady(state = \"ready\") {\n // If the runtime moved to a different pathname (effect-driven redirect,\n // guard verdict), only acknowledge readiness for the active path; the\n // capture harness compares pathname before serialization.\n const here = currentPathname();\n if (expectedPathname != null && here != null && here !== expectedPathname) {\n // Stale completion of an old route; do not mark as ready.\n return;\n }\n routeReady = true;\n lastRouterState = state;\n },\n track<T>(promise: Promise<T>, label: string): Promise<T> {\n const id = nextId++;\n pending.set(id, label);\n return Promise.resolve(promise).finally(() => {\n pending.delete(id);\n });\n },\n async whenStable(options: WhenStableOptions = {}) {\n const routeReadyMs = options.routeReadyMs ?? 15_000;\n const resourcesMs = options.resourcesMs ?? 15_000;\n\n // 1) Route ready: wait until the router calls `markStaticRouteReady`\n // for the active pathname. Resources, fonts and paint frames are\n // irrelevant until the route itself has committed.\n await waitFor(\n () => routeReady && errors.length === 0,\n routeReadyMs,\n () => {\n const d = diagnostics();\n return (\n `[mado:static] route did not become ready in ${routeReadyMs}ms. ` +\n `state=${d.lastRouterState ?? \"unknown\"} ` +\n `pending=${d.pending.join(\", \") || \"none\"} ` +\n `errors=${d.errors.join(\" | \") || \"none\"}`\n );\n },\n );\n\n // 2) Tracked resources: any `resource()` created before route ready\n // is part of the initial render contract; the snapshot waits for\n // it. Resources created after `routeReady` count as background\n // work and are NOT awaited — they would otherwise let a stray\n // `setInterval` keep capture pinned forever.\n await waitFor(\n () => pending.size === 0 && errors.length === 0,\n resourcesMs,\n () => {\n const d = diagnostics();\n return (\n `[mado:static] route ready but resources did not settle in ${resourcesMs}ms. ` +\n `pending=${d.pending.join(\", \") || \"none\"} ` +\n `errors=${d.errors.join(\" | \") || \"none\"}`\n );\n },\n );\n\n // 3) One last quiet pass: flushSync + microtask drain to ensure\n // any final reactive effect committed during step 2 has\n // rendered before the caller serializes the document.\n try {\n flushSync();\n } catch {\n /* best effort; diagnostics already capture page errors */\n }\n await microtask();\n },\n diagnostics,\n setRouterState(state: string) {\n lastRouterState = state;\n },\n recordError(error: unknown) {\n errors.push(error instanceof Error ? error.message : String(error));\n },\n };\n\n return runtime;\n}\n\nfunction microtask(): Promise<void> {\n return Promise.resolve();\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Poll `predicate` until it returns true or `timeoutMs` elapses. Calls\n * `flushSync()` once per pass so reactive effects scheduled during the\n * tick get a chance to commit before the next check. On timeout throws\n * the message returned by `describe()` so each phase of `whenStable`\n * produces a phase-specific diagnostic.\n */\nasync function waitFor(\n predicate: () => boolean,\n timeoutMs: number,\n describe: () => string,\n): Promise<void> {\n const started = Date.now();\n // Two consecutive quiet ticks before we declare success: the predicate\n // can transition transiently while a microtask flush rebuilds the\n // route view.\n let quietPasses = 0;\n while (Date.now() - started < timeoutMs) {\n try {\n flushSync();\n } catch {\n /* page errors surface separately via recordError */\n }\n await microtask();\n if (predicate()) {\n quietPasses++;\n if (quietPasses >= 2) return;\n } else {\n quietPasses = 0;\n }\n await delay(10);\n }\n throw new Error(describe());\n}\n"]}
|
package/dist/src/vite/index.d.ts
CHANGED
|
@@ -1,10 +1,39 @@
|
|
|
1
1
|
import type { Plugin } from "vite";
|
|
2
2
|
export interface MadoVitePluginOptions {
|
|
3
|
+
/**
|
|
4
|
+
* Public origin used to build absolute URLs for static snapshots
|
|
5
|
+
* (sitemap entries, canonical links, OpenGraph URLs).
|
|
6
|
+
*
|
|
7
|
+
* mado({ site: "https://madojs.dev" })
|
|
8
|
+
*
|
|
9
|
+
* Combined with Vite's `base`, the canonical URL for a route is
|
|
10
|
+
* `site + base + pathname`. Required when at least one page declares
|
|
11
|
+
* `static`; otherwise the build emits absolute URLs that point
|
|
12
|
+
* nowhere.
|
|
13
|
+
*/
|
|
14
|
+
site?: string;
|
|
3
15
|
}
|
|
4
16
|
/**
|
|
5
17
|
* Vite integration for Mado apps.
|
|
6
18
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
19
|
+
* Intentionally minimal: Vite owns dev serving, HTML processing, assets
|
|
20
|
+
* and bundling. This plugin is the bridge that hands the snapshot CLI the
|
|
21
|
+
* three pieces of resolved Vite config it needs and asks Vite for a
|
|
22
|
+
* Mado-flavoured full reload on TypeScript/JavaScript changes.
|
|
23
|
+
*
|
|
24
|
+
* What it owns:
|
|
25
|
+
* 1. a small `build.target` default (matches what the runtime relies on);
|
|
26
|
+
* 2. forcing a full page reload when a `.ts` / `.js` module updates,
|
|
27
|
+
* so signals / components do not have to track HMR state;
|
|
28
|
+
* 3. emitting `_mado/build.json` into the output so
|
|
29
|
+
* `scripts/static.mjs` can read the resolved Vite `base`, `assetsDir`
|
|
30
|
+
* and the user-declared `site` without parsing `vite.config.ts`.
|
|
31
|
+
*
|
|
32
|
+
* What it does NOT own:
|
|
33
|
+
* - HTML ownership (Vite keeps that),
|
|
34
|
+
* - publicDir / outDir / assetsDir defaults (Vite already supplies them),
|
|
35
|
+
* - snapshot orchestration (CLI keeps that),
|
|
36
|
+
* - SSR or hydration.
|
|
9
37
|
*/
|
|
10
|
-
export declare function mado(
|
|
38
|
+
export declare function mado(options?: MadoVitePluginOptions): Plugin;
|
|
39
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/vite/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAkB,MAAM,MAAM,CAAC;AAEnD,MAAM,WAAW,qBAAqB;IACpC;;;;;;;;;;OAUG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,IAAI,CAAC,OAAO,GAAE,qBAA0B,GAAG,MAAM,CAiDhE"}
|
package/dist/src/vite/index.js
CHANGED
|
@@ -1,32 +1,64 @@
|
|
|
1
|
-
import { resolve } from "node:path";
|
|
2
1
|
/**
|
|
3
2
|
* Vite integration for Mado apps.
|
|
4
3
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* Intentionally minimal: Vite owns dev serving, HTML processing, assets
|
|
5
|
+
* and bundling. This plugin is the bridge that hands the snapshot CLI the
|
|
6
|
+
* three pieces of resolved Vite config it needs and asks Vite for a
|
|
7
|
+
* Mado-flavoured full reload on TypeScript/JavaScript changes.
|
|
8
|
+
*
|
|
9
|
+
* What it owns:
|
|
10
|
+
* 1. a small `build.target` default (matches what the runtime relies on);
|
|
11
|
+
* 2. forcing a full page reload when a `.ts` / `.js` module updates,
|
|
12
|
+
* so signals / components do not have to track HMR state;
|
|
13
|
+
* 3. emitting `_mado/build.json` into the output so
|
|
14
|
+
* `scripts/static.mjs` can read the resolved Vite `base`, `assetsDir`
|
|
15
|
+
* and the user-declared `site` without parsing `vite.config.ts`.
|
|
16
|
+
*
|
|
17
|
+
* What it does NOT own:
|
|
18
|
+
* - HTML ownership (Vite keeps that),
|
|
19
|
+
* - publicDir / outDir / assetsDir defaults (Vite already supplies them),
|
|
20
|
+
* - snapshot orchestration (CLI keeps that),
|
|
21
|
+
* - SSR or hydration.
|
|
7
22
|
*/
|
|
8
|
-
export function mado(
|
|
9
|
-
let
|
|
23
|
+
export function mado(options = {}) {
|
|
24
|
+
let resolved = null;
|
|
10
25
|
return {
|
|
11
26
|
name: "mado",
|
|
12
|
-
config(
|
|
13
|
-
root = resolve(process.cwd(), userConfig.root ?? ".");
|
|
27
|
+
config(_config, environment) {
|
|
14
28
|
return {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
outDir: "out",
|
|
19
|
-
assetsDir: "assets",
|
|
20
|
-
target: "es2022",
|
|
29
|
+
build: { target: "es2022" },
|
|
30
|
+
define: {
|
|
31
|
+
__MADO_DEVTOOLS__: environment.command === "serve" ? "true" : "false",
|
|
21
32
|
},
|
|
22
33
|
};
|
|
23
34
|
},
|
|
35
|
+
configResolved(config) {
|
|
36
|
+
resolved = config;
|
|
37
|
+
},
|
|
24
38
|
handleHotUpdate(ctx) {
|
|
25
|
-
if (
|
|
26
|
-
|
|
27
|
-
|
|
39
|
+
if (!/\.[cm]?[jt]s$/.test(ctx.file))
|
|
40
|
+
return;
|
|
41
|
+
// Invalidate the module graph first; otherwise the reload would
|
|
42
|
+
// serve cached modules and miss the change. Mirrors the canonical
|
|
43
|
+
// Vite "force full reload" recipe.
|
|
44
|
+
const invalidated = new Set();
|
|
45
|
+
for (const mod of ctx.modules) {
|
|
46
|
+
ctx.server.moduleGraph.invalidateModule(mod, invalidated, ctx.timestamp, true);
|
|
28
47
|
}
|
|
29
|
-
|
|
48
|
+
ctx.server.ws.send({ type: "full-reload" });
|
|
49
|
+
return [];
|
|
50
|
+
},
|
|
51
|
+
generateBundle() {
|
|
52
|
+
if (!resolved)
|
|
53
|
+
return;
|
|
54
|
+
this.emitFile({
|
|
55
|
+
type: "asset",
|
|
56
|
+
fileName: "_mado/build.json",
|
|
57
|
+
source: JSON.stringify({
|
|
58
|
+
site: options.site ?? null,
|
|
59
|
+
base: resolved.base,
|
|
60
|
+
}),
|
|
61
|
+
});
|
|
30
62
|
},
|
|
31
63
|
};
|
|
32
64
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/vite/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/vite/index.ts"],"names":[],"mappings":"AAiBA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,IAAI,CAAC,OAAO,GAA0B,EAAE;IACtD,IAAI,QAAQ,GAA0B,IAAI,CAAC;IAE3C,OAAO;QACL,IAAI,EAAE,MAAM;QAEZ,MAAM,CAAC,OAAO,EAAE,WAAW;YACzB,OAAO;gBACL,KAAK,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE;gBAC3B,MAAM,EAAE;oBACN,iBAAiB,EAAE,WAAW,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO;iBACtE;aACF,CAAC;QACJ,CAAC;QAED,cAAc,CAAC,MAAM;YACnB,QAAQ,GAAG,MAAM,CAAC;QACpB,CAAC;QAED,eAAe,CAAC,GAAG;YACjB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,OAAO;YAC5C,gEAAgE;YAChE,kEAAkE;YAClE,mCAAmC;YACnC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAW,CAAC;YACvC,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;gBAC9B,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,gBAAgB,CACrC,GAAG,EACH,WAAyB,EACzB,GAAG,CAAC,SAAS,EACb,IAAI,CACL,CAAC;YACJ,CAAC;YACD,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;YAC5C,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,cAAc;YACZ,IAAI,CAAC,QAAQ;gBAAE,OAAO;YACtB,IAAI,CAAC,QAAQ,CAAC;gBACZ,IAAI,EAAE,OAAO;gBACb,QAAQ,EAAE,kBAAkB;gBAC5B,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC;oBACrB,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,IAAI;oBAC1B,IAAI,EAAE,QAAQ,CAAC,IAAI;iBACpB,CAAC;aACH,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["import type { Plugin, ResolvedConfig } from \"vite\";\n\nexport interface MadoVitePluginOptions {\n /**\n * Public origin used to build absolute URLs for static snapshots\n * (sitemap entries, canonical links, OpenGraph URLs).\n *\n * mado({ site: \"https://madojs.dev\" })\n *\n * Combined with Vite's `base`, the canonical URL for a route is\n * `site + base + pathname`. Required when at least one page declares\n * `static`; otherwise the build emits absolute URLs that point\n * nowhere.\n */\n site?: string;\n}\n\n/**\n * Vite integration for Mado apps.\n *\n * Intentionally minimal: Vite owns dev serving, HTML processing, assets\n * and bundling. This plugin is the bridge that hands the snapshot CLI the\n * three pieces of resolved Vite config it needs and asks Vite for a\n * Mado-flavoured full reload on TypeScript/JavaScript changes.\n *\n * What it owns:\n * 1. a small `build.target` default (matches what the runtime relies on);\n * 2. forcing a full page reload when a `.ts` / `.js` module updates,\n * so signals / components do not have to track HMR state;\n * 3. emitting `_mado/build.json` into the output so\n * `scripts/static.mjs` can read the resolved Vite `base`, `assetsDir`\n * and the user-declared `site` without parsing `vite.config.ts`.\n *\n * What it does NOT own:\n * - HTML ownership (Vite keeps that),\n * - publicDir / outDir / assetsDir defaults (Vite already supplies them),\n * - snapshot orchestration (CLI keeps that),\n * - SSR or hydration.\n */\nexport function mado(options: MadoVitePluginOptions = {}): Plugin {\n let resolved: ResolvedConfig | null = null;\n\n return {\n name: \"mado\",\n\n config(_config, environment) {\n return {\n build: { target: \"es2022\" },\n define: {\n __MADO_DEVTOOLS__: environment.command === \"serve\" ? \"true\" : \"false\",\n },\n };\n },\n\n configResolved(config) {\n resolved = config;\n },\n\n handleHotUpdate(ctx) {\n if (!/\\.[cm]?[jt]s$/.test(ctx.file)) return;\n // Invalidate the module graph first; otherwise the reload would\n // serve cached modules and miss the change. Mirrors the canonical\n // Vite \"force full reload\" recipe.\n const invalidated = new Set<unknown>();\n for (const mod of ctx.modules) {\n ctx.server.moduleGraph.invalidateModule(\n mod,\n invalidated as Set<never>,\n ctx.timestamp,\n true,\n );\n }\n ctx.server.ws.send({ type: \"full-reload\" });\n return [];\n },\n\n generateBundle() {\n if (!resolved) return;\n this.emitFile({\n type: \"asset\",\n fileName: \"_mado/build.json\",\n source: JSON.stringify({\n site: options.site ?? null,\n base: resolved.base,\n }),\n });\n },\n };\n}\n"]}
|
package/docs/README.md
CHANGED
|
@@ -1,12 +1,9 @@
|
|
|
1
1
|
# Mado docs
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Canonical project documentation is maintained in English only.
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|---|---|
|
|
7
|
-
| [Français](./fr/README.md) | translated |
|
|
8
|
-
| [English](./en/README.md) | translated |
|
|
9
|
-
| [Ukrainian](./uk/README.md) | translated |
|
|
10
|
-
| [Russian](./ru/README.md) | translated |
|
|
5
|
+
- [English documentation](./en/README.md)
|
|
11
6
|
|
|
12
|
-
|
|
7
|
+
Older translations (`fr/`, `uk/`, `ru/`) were removed at v0.12. They
|
|
8
|
+
remain available in git history and the `v0.11.1` tag for any
|
|
9
|
+
external links that still need them.
|