ignotum 0.0.13 → 0.0.15

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.
Files changed (131) hide show
  1. package/README.md +6 -6
  2. package/dist/cli/bin.mjs +6111 -4448
  3. package/dist/cli/bin.mjs.map +1 -1
  4. package/dist/cli/emscripten-module-D5GzfUNv.mjs +533 -0
  5. package/dist/cli/emscripten-module-D5GzfUNv.mjs.map +1 -0
  6. package/dist/cli/ffi-7IElU4Co.mjs +148 -0
  7. package/dist/cli/ffi-7IElU4Co.mjs.map +1 -0
  8. package/dist/cli/managed-release-WHYLZwaS.mjs +10902 -0
  9. package/dist/cli/managed-release-WHYLZwaS.mjs.map +1 -0
  10. package/dist/cli/managed-release.d.mts +1 -0
  11. package/dist/cli/managed-release.mjs +14 -0
  12. package/dist/cli/managed-release.mjs.map +1 -0
  13. package/dist/cli/module-ES6BEMUI-D36I4NVn.mjs +1289 -0
  14. package/dist/cli/module-ES6BEMUI-D36I4NVn.mjs.map +1 -0
  15. package/dist/runtime/{api-Cv3hMbzo.d.ts → api-B4fwp5a2.d.ts} +4 -4
  16. package/dist/runtime/bootstrap-BISQSn_O.js +916 -0
  17. package/dist/runtime/bootstrap-BISQSn_O.js.map +1 -0
  18. package/dist/runtime/bootstrap-BTFScKAc.d.ts +545 -0
  19. package/dist/runtime/client.d.ts +50 -15
  20. package/dist/runtime/client.js +7 -1138
  21. package/dist/runtime/client.js.map +1 -1
  22. package/dist/runtime/descriptor-CTY4mtwS-cS43EbwS.js +269 -0
  23. package/dist/runtime/descriptor-CTY4mtwS-cS43EbwS.js.map +1 -0
  24. package/dist/runtime/{id-Bt9XWRGL.js → id--1m0NuUL.js} +4 -4
  25. package/dist/runtime/id--1m0NuUL.js.map +1 -0
  26. package/dist/runtime/{id-BzFHf3Wo-DGPCjgrf.d.ts → id-7an3nxTu-DZJSM5xh.d.ts} +2 -2
  27. package/dist/runtime/id-CBOt2kDo.d.ts +1 -0
  28. package/dist/runtime/identity-QjtJRxBD.d.ts +2 -0
  29. package/dist/runtime/image-Djtjy4Z8.js +19 -0
  30. package/dist/runtime/image-Djtjy4Z8.js.map +1 -0
  31. package/dist/runtime/index-D4seNHlX.d.ts +184 -0
  32. package/dist/runtime/internal/api.d.ts +1 -1
  33. package/dist/runtime/internal/api.js +30 -1
  34. package/dist/runtime/internal/api.js.map +1 -0
  35. package/dist/runtime/internal/bootstrap.d.ts +2 -0
  36. package/dist/runtime/internal/bootstrap.js +2 -0
  37. package/dist/runtime/internal/client.d.ts +2 -0
  38. package/dist/runtime/internal/client.js +75 -0
  39. package/dist/runtime/internal/client.js.map +1 -0
  40. package/dist/runtime/internal/host.d.ts +25 -8
  41. package/dist/runtime/internal/host.js +27 -6
  42. package/dist/runtime/internal/host.js.map +1 -1
  43. package/dist/runtime/internal/routes.d.ts +2 -0
  44. package/dist/runtime/internal/routes.js +2 -0
  45. package/dist/runtime/internal/server.d.ts +1 -1
  46. package/dist/runtime/internal/server.js +1 -1
  47. package/dist/runtime/internal/types.d.ts +2 -1
  48. package/dist/runtime/internal/types.js +1 -1
  49. package/dist/runtime/pagination-CBOt2kDo.d.ts +1 -0
  50. package/dist/runtime/pagination-D3qd6s9N.js +33 -0
  51. package/dist/runtime/pagination-D3qd6s9N.js.map +1 -0
  52. package/dist/runtime/result-BkziOG1L.d.ts +1 -0
  53. package/dist/runtime/router-BSBI1oN1.js +2377 -0
  54. package/dist/runtime/router-BSBI1oN1.js.map +1 -0
  55. package/dist/runtime/routes-Ce8TVP-T.js +690 -0
  56. package/dist/runtime/routes-Ce8TVP-T.js.map +1 -0
  57. package/dist/runtime/{schema-1Zs03-iS.js → schema-D1wOqiNH.js} +40 -12
  58. package/dist/runtime/schema-D1wOqiNH.js.map +1 -0
  59. package/dist/runtime/server.d.ts +5 -5
  60. package/dist/runtime/server.js +2 -2
  61. package/dist/runtime/{sync-Bs8J3fIr.d.ts → sync-D-GK2sv9.d.ts} +3 -2
  62. package/dist/runtime/{api-CAgKDij7.js → sync-DzUwA8W9.js} +22 -41
  63. package/dist/runtime/sync-DzUwA8W9.js.map +1 -0
  64. package/dist/runtime/types-DeCCyqLU-BIm7rU-0.d.ts +341 -0
  65. package/package.json +29 -4
  66. package/src/cli/agent-files.ts +14 -8
  67. package/src/cli/build/managed-client.ts +411 -0
  68. package/src/cli/build/managed-server.ts +294 -0
  69. package/src/cli/build/managed.ts +67 -0
  70. package/src/cli/build/output.ts +47 -0
  71. package/src/cli/build/server.ts +51 -220
  72. package/src/cli/client-config.ts +1 -140
  73. package/src/cli/client-styles.ts +1 -0
  74. package/src/cli/codegen.ts +9 -4
  75. package/src/cli/command.ts +28 -5
  76. package/src/cli/control-client.ts +84 -101
  77. package/src/cli/deploy.ts +133 -177
  78. package/src/cli/dev.ts +506 -107
  79. package/src/cli/image-assets.ts +499 -0
  80. package/src/cli/managed-client-boundaries.ts +103 -0
  81. package/src/cli/managed-dev-platform.ts +118 -0
  82. package/src/cli/managed-exports.ts +219 -0
  83. package/src/cli/managed-release-bin.ts +13 -0
  84. package/src/cli/managed-release.ts +260 -0
  85. package/src/cli/module-boundaries.ts +11 -1
  86. package/src/cli/new-app.ts +111 -87
  87. package/src/cli/route-codegen.ts +311 -0
  88. package/src/cli/route-static.ts +710 -0
  89. package/src/client/bootstrap.ts +110 -0
  90. package/src/client/errors.ts +13 -7
  91. package/src/client/files.ts +64 -0
  92. package/src/client/id.ts +9 -5
  93. package/src/client/image.ts +28 -0
  94. package/src/client/index.ts +25 -2
  95. package/src/client/managed-client.ts +729 -0
  96. package/src/client/managed-upgrade.ts +283 -0
  97. package/src/client/recovery-journal.ts +195 -0
  98. package/src/client/route-boundaries.ts +184 -0
  99. package/src/client/router-history.ts +152 -0
  100. package/src/client/router-store.ts +644 -0
  101. package/src/client/router.ts +324 -0
  102. package/src/client/routes.ts +28 -0
  103. package/src/client/sync.ts +66 -592
  104. package/src/dev-runtime/database.ts +77 -2
  105. package/src/dev-runtime/functions.ts +3 -3
  106. package/src/dev-runtime/id.ts +19 -4
  107. package/src/dev-runtime/managed-functions.ts +255 -0
  108. package/src/dev-runtime/managed-sync.ts +263 -0
  109. package/src/dev-runtime/managed-websocket.ts +71 -0
  110. package/src/dev-runtime/migrations.ts +20 -0
  111. package/src/dev-runtime/sync.ts +236 -236
  112. package/src/image-assets.d.ts +36 -0
  113. package/src/internal/client.ts +186 -0
  114. package/src/internal/host.ts +1 -1
  115. package/src/internal/http-paths.ts +0 -3
  116. package/src/internal/routes.ts +45 -0
  117. package/dist/runtime/api-CAgKDij7.js.map +0 -1
  118. package/dist/runtime/descriptor-Cyo9FP9n-C0SRVXNW.js +0 -154
  119. package/dist/runtime/descriptor-Cyo9FP9n-C0SRVXNW.js.map +0 -1
  120. package/dist/runtime/id-Bt9XWRGL.js.map +0 -1
  121. package/dist/runtime/id-Dz0apuB3.d.ts +0 -1
  122. package/dist/runtime/index-D54flWtH.d.ts +0 -402
  123. package/dist/runtime/pagination-DnKg3dkI-r5ZUxBBx.d.ts +0 -112
  124. package/dist/runtime/pagination-Dz0apuB3.d.ts +0 -1
  125. package/dist/runtime/result-DKAA4gpS.d.ts +0 -1
  126. package/dist/runtime/schema-1Zs03-iS.js.map +0 -1
  127. package/src/cli/build/client.ts +0 -119
  128. package/src/cli/build/public.ts +0 -186
  129. package/src/cli/client-entry.ts +0 -152
  130. package/src/cli/client-plugin.ts +0 -136
  131. package/src/client/app.ts +0 -15
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap-BISQSn_O.js","names":["Versioned.upgrade","Versioned.initial","h"],"sources":["../../../shared/dist/routing/metadata.js","../../../shared/dist/routing.js","../../src/client/router-history.ts","../../src/client/router-store.ts","../../src/client/route-boundaries.ts","../../src/client/bootstrap.ts"],"sourcesContent":["import { Effect, Schema } from \"effect\";\nimport { LayoutMetadata, StaticMetadata, appDefinitionLimits } from \"@ignotum/contracts/app-definition\";\n//#region src/routing/metadata.ts\nconst MetadataInput = Schema.Struct({\n\tapplicationName: Schema.String.check(Schema.isMinLength(1), Schema.isMaxLength(256)),\n\tlayouts: Schema.Array(LayoutMetadata).check(Schema.isMaxLength(appDefinitionLimits.layouts)),\n\tpage: Schema.optional(StaticMetadata),\n\toutcome: Schema.Literals([\n\t\t\"Matched\",\n\t\t\"Invalid\",\n\t\t\"NotFound\"\n\t])\n}).annotate({ parseOptions: { onExcessProperty: \"error\" } });\nvar InvalidMetadata = class extends Schema.TaggedError()(\"InvalidMetadata\", { message: Schema.String }) {};\n/**\n* Layouts run from outermost to nearest. Values remain plain text: document writers must escape\n* HTML text and attributes, and browser writers must use textContent and setAttribute.\n* `remove` names managed tags absent from this result, including after navigation.\n*/\nconst resolveMetadata = Effect.fn(\"Routing.resolveMetadata\")(function* (input) {\n\tconst { applicationName, layouts, page, outcome } = yield* Schema.decodeEffect(MetadataInput)(input).pipe(Effect.mapError(() => InvalidMetadata.make({ message: \"Static metadata is invalid.\" })));\n\tlet title = applicationName;\n\tlet template;\n\tlet description;\n\tlet robots;\n\tfor (const layout of layouts) {\n\t\ttitle = layout.title ?? title;\n\t\ttemplate = layout.titleTemplate ?? template;\n\t\tdescription = layout.meta?.description ?? description;\n\t\trobots = layout.meta?.robots ?? robots;\n\t}\n\tconst matchedPage = outcome === \"NotFound\" ? void 0 : page;\n\tconst pageTitle = matchedPage?.title;\n\tif (pageTitle !== void 0) title = template === void 0 ? pageTitle : template.replace(\"%s\", () => pageTitle);\n\tdescription = matchedPage?.meta?.description ?? description;\n\trobots = outcome === \"Matched\" ? matchedPage?.meta?.robots ?? robots : \"noindex\";\n\tconst remove = [];\n\tif (description === void 0) remove.push(\"description\");\n\tif (robots === void 0) remove.push(\"robots\");\n\treturn {\n\t\ttitle,\n\t\tmeta: {\n\t\t\tdescription,\n\t\t\trobots\n\t\t},\n\t\tremove\n\t};\n});\n//#endregion\nexport { InvalidMetadata, MetadataInput, resolveMetadata };\n\n//# sourceMappingURL=metadata.js.map","import { RoutingDefinitionError, compilePatterns, matchDirectory, matchPattern, parsePattern, validateRoutePattern } from \"./routing/pattern.js\";\nimport { InvalidUrl, ParsedLocation, PartialLocation, UrlIssue, buildUrl, decodeRouteInputs, parseLocation } from \"./routing/url.js\";\nimport { InvalidMetadata, MetadataInput, resolveMetadata } from \"./routing/metadata.js\";\nimport { Effect } from \"effect\";\n//#region src/routing/index.ts\nconst reservedSegments = (segments) => segments[0] === \"_ignotum\";\n/** Accept a root-relative location before a URL parser can discard invalid dot segments. */\nconst matchLocation = Effect.fn(\"Routing.matchLocation\")(function* (patterns, input) {\n\tconst parsed = yield* parseLocation(input).pipe(Effect.result);\n\tif (parsed._tag === \"Failure\") {\n\t\tconst error = parsed.failure;\n\t\tconst partial = error.partial;\n\t\tconst segments = partial?.segments ?? [];\n\t\tconst reserved = reservedSegments(segments);\n\t\tconst branch = partial?.pathComplete ? matchPattern(patterns, segments) : matchDirectory(patterns, segments);\n\t\treturn {\n\t\t\t_tag: \"Invalid\",\n\t\t\tstatus: 400,\n\t\t\troute: !reserved && partial?.pathComplete ? branch.route : void 0,\n\t\t\tlayouts: reserved ? [] : branch.layouts,\n\t\t\treserved,\n\t\t\tlocation: void 0,\n\t\t\tissues: error.issues\n\t\t};\n\t}\n\tconst location = parsed.success;\n\tconst reserved = reservedSegments(location.segments);\n\tconst branch = matchPattern(patterns, location.segments);\n\tif (reserved || branch.route === void 0) return {\n\t\t_tag: \"NotFound\",\n\t\tstatus: 404,\n\t\tlayouts: reserved ? [] : branch.layouts,\n\t\treserved,\n\t\tlocation\n\t};\n\tconst route = branch.route;\n\tconst decoded = yield* decodeRouteInputs(route, branch.params, location.search).pipe(Effect.result);\n\tif (decoded._tag === \"Failure\") return {\n\t\t_tag: \"Invalid\",\n\t\tstatus: 400,\n\t\troute,\n\t\tlayouts: branch.layouts,\n\t\treserved: false,\n\t\tlocation,\n\t\tissues: decoded.failure.issues\n\t};\n\treturn {\n\t\t_tag: \"Matched\",\n\t\tstatus: 200,\n\t\troute,\n\t\tlayouts: branch.layouts,\n\t\treserved: false,\n\t\tlocation,\n\t\t...decoded.success\n\t};\n});\n/** Contains no URL, decoded values, or request-specific validation issues. */\nconst documentVariant = (outcome) => ({\n\toutcome: outcome._tag,\n\trouteId: outcome._tag === \"NotFound\" ? null : outcome.route?.id ?? null,\n\tlayoutIds: outcome.layouts.map((layout) => layout.id),\n\treserved: outcome.reserved\n});\nconst documentVariantKey = (outcome) => {\n\tconst variant = documentVariant(outcome);\n\treturn JSON.stringify([\n\t\tvariant.outcome,\n\t\tvariant.routeId,\n\t\tvariant.layoutIds,\n\t\tvariant.reserved\n\t]);\n};\n//#endregion\nexport { InvalidMetadata, InvalidUrl, MetadataInput, ParsedLocation, PartialLocation, RoutingDefinitionError, UrlIssue, buildUrl, compilePatterns, decodeRouteInputs, documentVariant, documentVariantKey, matchDirectory, matchLocation, matchPattern, parseLocation, parsePattern, resolveMetadata, validateRoutePattern };\n\n//# sourceMappingURL=routing.js.map","import * as Versioned from \"@ignotum/contracts/versioned\";\nimport { Deferred, Effect, Schema } from \"effect\";\n\nconst HistoryEntryV1 = Schema.Struct({ formatVersion: Schema.Literal(1), key: Schema.String });\nconst HistoryEntryV2 = Schema.Struct({\n formatVersion: Schema.Literal(2),\n key: Schema.String,\n index: Schema.NullOr(Schema.Int),\n});\nconst HistoryEntry = Versioned.upgrade(\n Versioned.initial(HistoryEntryV1),\n HistoryEntryV2,\n (old) => ({\n formatVersion: 2 as const,\n key: old.key,\n index: null,\n }),\n);\nconst HistoryState = Schema.Struct({ __ignotumRouter: HistoryEntry });\nconst StateObject = Schema.Record(Schema.String, Schema.Unknown);\nexport interface HistoryPosition {\n readonly key: string;\n readonly index: number;\n readonly href: string;\n}\nconst hrefOf = (browser: Window) =>\n `${browser.location.pathname}${browser.location.search}${browser.location.hash}`;\n\n/** Serializes router corrections to native traversal without adding duplicate entries. */\nexport class RouterHistory {\n committed: HistoryPosition;\n private actual: HistoryPosition;\n private readonly positions = new Map<string, number>();\n private seeking: { position: HistoryPosition; done: Deferred.Deferred<boolean> } | undefined;\n private readonly originalScrollRestoration;\n private direction = -1;\n private scrollPending = false;\n private expectedKey: string | undefined;\n readonly scroll = new Map<string, { x: number; y: number }>();\n constructor(\n private readonly browser: Window,\n private readonly onTraversal: (position: HistoryPosition) => void,\n ) {\n const parsed = Schema.decodeUnknownOption(HistoryState)(browser.history.state);\n const entry = parsed._tag === \"Some\" ? parsed.value.__ignotumRouter : undefined;\n this.actual = this.committed = {\n key: entry?.key ?? browser.crypto.randomUUID(),\n index: entry?.index ?? 0,\n href: hrefOf(browser),\n };\n this.write(this.actual, false);\n this.originalScrollRestoration = browser.history.scrollRestoration;\n browser.history.scrollRestoration = \"manual\";\n browser.addEventListener(\"popstate\", this.onPop);\n browser.addEventListener(\"scroll\", this.saveScroll);\n }\n private write(position: HistoryPosition, push: boolean): void {\n const parsed = Schema.decodeUnknownOption(StateObject)(this.browser.history.state);\n const owned = {\n __ignotumRouter: Schema.encodeSync(HistoryEntry)({\n formatVersion: 2,\n key: position.key,\n index: position.index,\n }),\n };\n const state = parsed._tag === \"Some\" ? { ...parsed.value, ...owned } : owned;\n if (push) this.browser.history.pushState(state, \"\", position.href);\n else this.browser.history.replaceState(state, \"\", position.href);\n this.positions.set(position.key, position.index);\n }\n saveScroll = (): void => {\n if (this.scrollPending) return;\n this.scroll.set(this.committed.key, { x: this.browser.scrollX, y: this.browser.scrollY });\n };\n captureScroll(): { x: number; y: number } {\n this.saveScroll();\n this.scrollPending = true;\n return (\n this.scroll.get(this.committed.key) ?? { x: this.browser.scrollX, y: this.browser.scrollY }\n );\n }\n finishScroll(): void {\n this.scrollPending = false;\n this.saveScroll();\n }\n restoreSourceScroll(): void {\n if (!this.scrollPending) return;\n const saved = this.scroll.get(this.committed.key);\n if (saved !== undefined) this.browser.scrollTo(saved.x, saved.y);\n this.finishScroll();\n }\n private onPop = (): void => {\n const parsed = Schema.decodeUnknownOption(HistoryState)(this.browser.history.state);\n const entry = parsed._tag === \"Some\" ? parsed.value.__ignotumRouter : undefined;\n const key = entry?.key ?? this.browser.crypto.randomUUID();\n const index = entry?.index ?? this.positions.get(key) ?? this.actual.index + this.direction;\n this.actual = { key, index, href: hrefOf(this.browser) };\n this.write(this.actual, false);\n const expected = this.expectedKey;\n this.expectedKey = undefined;\n const seeking = this.seeking;\n if (seeking !== undefined && (expected === key || seeking.position.key === key)) {\n this.advanceSeek();\n return;\n }\n if (seeking !== undefined) {\n this.seeking = undefined;\n Effect.runSync(Deferred.succeed(seeking.done, false));\n }\n this.onTraversal(this.actual);\n };\n private advanceSeek(): void {\n const seeking = this.seeking;\n if (seeking === undefined || this.expectedKey !== undefined) return;\n if (this.actual.key === seeking.position.key) {\n this.seeking = undefined;\n Effect.runSync(Deferred.succeed(seeking.done, true));\n } else {\n this.expectedKey = seeking.position.key;\n this.browser.history.go(seeking.position.index - this.actual.index);\n }\n }\n seek(position: HistoryPosition): Promise<boolean> {\n if (this.seeking !== undefined) {\n if (this.seeking.position.key === position.key)\n return Effect.runPromise(Deferred.await(this.seeking.done));\n Effect.runSync(Deferred.succeed(this.seeking.done, false));\n }\n const done = Deferred.makeUnsafe<boolean>();\n this.seeking = { position, done };\n this.advanceSeek();\n return Effect.runPromise(Deferred.await(done));\n }\n commit(position: HistoryPosition, kind: \"initial\" | \"push\" | \"replace\" | \"traverse\"): void {\n if (kind === \"push\" || kind === \"replace\") this.write(position, kind === \"push\");\n this.actual = this.committed = position;\n }\n back = (): void => {\n this.direction = -1;\n this.browser.history.back();\n };\n forward = (): void => {\n this.direction = 1;\n this.browser.history.forward();\n };\n dispose(): void {\n this.browser.removeEventListener(\"popstate\", this.onPop);\n this.browser.removeEventListener(\"scroll\", this.saveScroll);\n this.browser.history.scrollRestoration = this.originalScrollRestoration;\n if (this.seeking !== undefined) Effect.runSync(Deferred.succeed(this.seeking.done, false));\n }\n}\n","import type {\n AppModuleId,\n LayoutDefinition,\n ModuleExportReference,\n RouteDefinition,\n} from \"@ignotum/contracts/app-definition\";\nimport { ExecutionSelection } from \"@ignotum/contracts/platform\";\nimport { RouterHistory, type HistoryPosition } from \"./router-history.js\";\nimport {\n compilePatterns,\n matchLocation,\n resolveMetadata,\n type RouteOutcome,\n type UrlValue,\n type UrlIssue,\n} from \"@ignotum/shared/routing\";\nimport { Deferred, Effect, Predicate, Schema } from \"effect\";\nimport type { ComponentChildren, ComponentType } from \"preact\";\nimport type { NavigationResult, RouteLocation } from \"./routes.js\";\n\nexport interface RegisteredClientModule {\n readonly load: () => Promise<object>;\n readonly styles?: readonly string[];\n}\n\n/** Executable registration produced by the compiler, separate from the immutable declaration. */\nexport interface ClientRegistration {\n readonly applicationName: string;\n readonly routes: readonly RouteDefinition[];\n readonly layouts: readonly LayoutDefinition[];\n readonly modules: ReadonlyMap<AppModuleId, RegisteredClientModule>;\n readonly styles?: readonly string[];\n}\n\nexport interface RouterPageProps {\n readonly params: Readonly<Record<string, UrlValue>>;\n readonly searchParams: Readonly<Record<string, UrlValue>>;\n}\nexport interface RouterLayoutProps {\n readonly children: ComponentChildren;\n}\nexport interface ErrorBoundaryProps {\n readonly error: unknown;\n readonly retry: () => void;\n}\nexport interface InvalidBoundaryProps {\n readonly location: RouteLocation;\n readonly issues: readonly UrlIssue[];\n}\nexport interface NotFoundBoundaryProps {\n readonly location: RouteLocation;\n}\nconst ErrorComponent = Schema.declare((value): value is ComponentType<ErrorBoundaryProps> =>\n Predicate.isFunction(value),\n);\nconst InvalidComponent = Schema.declare((value): value is ComponentType<InvalidBoundaryProps> =>\n Predicate.isFunction(value),\n);\nconst NotFoundComponent = Schema.declare((value): value is ComponentType<NotFoundBoundaryProps> =>\n Predicate.isFunction(value),\n);\nconst PageModule = Schema.Struct({\n error: Schema.optional(ErrorComponent),\n invalid: Schema.optional(InvalidComponent),\n component: Schema.declare((value): value is ComponentType<RouterPageProps> =>\n Predicate.isFunction(value),\n ),\n});\nconst LayoutModule = Schema.Struct({\n error: Schema.optional(ErrorComponent),\n invalid: Schema.optional(InvalidComponent),\n notFound: Schema.optional(NotFoundComponent),\n component: Schema.declare((value): value is ComponentType<RouterLayoutProps> =>\n Predicate.isFunction(value),\n ),\n});\nconst ModuleExports = Schema.Record(Schema.String, Schema.Unknown);\n\nexport interface LoadedBranch {\n readonly outcome: RouteOutcome;\n readonly layouts: readonly {\n readonly id: LayoutDefinition[\"id\"];\n readonly component: ComponentType<RouterLayoutProps>;\n readonly error?: ComponentType<ErrorBoundaryProps>;\n readonly invalid?: ComponentType<InvalidBoundaryProps>;\n readonly notFound?: ComponentType<NotFoundBoundaryProps>;\n }[];\n readonly page: ComponentType<RouterPageProps> | undefined;\n readonly pageBoundaries?: {\n readonly error?: ComponentType<ErrorBoundaryProps>;\n readonly invalid?: ComponentType<InvalidBoundaryProps>;\n };\n}\nexport class BranchLoadError extends Schema.TaggedError<BranchLoadError>()(\"BranchLoadError\", {\n error: Schema.Unknown,\n branch: Schema.declare((value): value is LoadedBranch => Predicate.isObject(value)),\n}) {}\nexport type BlockerState =\n | { readonly status: \"idle\" }\n | {\n readonly status: \"blocked\";\n readonly from: RouteLocation;\n readonly to: RouteLocation;\n readonly proceed: () => void;\n readonly reset: () => void;\n };\nexport type NavigationState =\n | { readonly status: \"idle\" }\n | { readonly status: \"loading\"; readonly to: RouteLocation };\nexport interface RouterSnapshot {\n readonly location: RouteLocation | undefined;\n readonly branch: LoadedBranch | undefined;\n readonly navigation: NavigationState;\n readonly failure:\n | { readonly error: unknown; readonly retry: () => void; readonly branch?: LoadedBranch }\n | undefined;\n readonly commit: number;\n}\nexport interface NavigationOptions {\n readonly replace?: boolean;\n readonly scroll?: \"auto\" | \"preserve\";\n}\ninterface Transition {\n readonly id: number;\n readonly href: string;\n readonly location: RouteLocation;\n readonly kind: \"initial\" | \"push\" | \"replace\" | \"traverse\";\n readonly completion: Deferred.Deferred<NavigationResult>;\n readonly position: HistoryPosition;\n readonly scroll: \"auto\" | \"preserve\";\n readonly searchOnly: boolean;\n readonly sourceScroll: { readonly x: number; readonly y: number };\n}\n\nconst locationOf = (href: string, key: string, origin: string): RouteLocation => {\n const parsed = new URL(href, origin);\n let hash = parsed.hash.slice(1);\n try {\n hash = decodeURIComponent(hash);\n } catch {\n // Invalid fragments still need a readable location for the invalid-URL view.\n }\n return { pathname: parsed.pathname, search: parsed.search, hash, key };\n};\n\n/** One store per mount. Load caches contain code and CSS only, never component/query state. */\nexport class RouterStore {\n readonly selection: ExecutionSelection;\n private readonly patterns;\n private readonly listeners = new Set<() => void>();\n private readonly modules = new Map<AppModuleId, Promise<typeof ModuleExports.Type>>();\n private readonly styles = new Map<string, Promise<void>>();\n private readonly styleCleanups = new Set<() => void>();\n private readonly redirects = new Set<string>();\n private history: RouterHistory | undefined;\n private readonly blockers = new Set<symbol>();\n private blocked: { transition: Transition; remaining: Set<symbol> } | undefined;\n private upgrading = false;\n private admission:\n | { readonly validate: () => Promise<boolean>; readonly recoverLoad: () => Promise<void> }\n | undefined;\n private serial = 0;\n private transition: Transition | undefined;\n private committedHref: string | undefined;\n private disposed = false;\n private started = false;\n private snapshot: RouterSnapshot = {\n location: undefined,\n branch: undefined,\n navigation: { status: \"idle\" },\n failure: undefined,\n commit: 0,\n };\n\n constructor(\n private readonly registration: ClientRegistration,\n selection: ExecutionSelection,\n readonly browser: Window,\n ) {\n this.selection = Schema.decodeSync(ExecutionSelection)(selection);\n this.patterns = Effect.runSync(compilePatterns(registration.routes, registration.layouts));\n for (const reference of [\n ...registration.routes.map((route) => route.page),\n ...registration.layouts.map((layout) => layout.module),\n ]) {\n if (!registration.modules.has(reference.module))\n throw new Error(`Client module '${reference.module}' is missing from registration.`);\n }\n }\n\n getSnapshot = (): RouterSnapshot => this.snapshot;\n subscribe = (listener: () => void): (() => void) => {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n };\n private update(snapshot: RouterSnapshot): void {\n this.snapshot = snapshot;\n for (const listener of this.listeners) listener();\n }\n\n start(): Promise<NavigationResult> {\n if (this.started) throw new Error(\"The Ignotum router has already started.\");\n this.started = true;\n this.history = new RouterHistory(this.browser, this.onTraversal);\n this.browser.addEventListener(\"beforeunload\", this.onBeforeUnload);\n const position = this.history.committed;\n return this.transitionTo(position.href, \"initial\", position.key, {}, position);\n }\n\n private onTraversal = (position: HistoryPosition): void => {\n this.redirects.clear();\n // Native traversal already changed the address. Restore the source while confirmation/code waits.\n void this.history?.seek(this.history.committed);\n void this.transitionTo(position.href, \"traverse\", position.key, {}, position);\n };\n back = (): void => this.history?.back();\n forward = (): void => this.history?.forward();\n private onBeforeUnload = (event: BeforeUnloadEvent): void => {\n if (this.upgrading || this.blockers.size === 0) return;\n event.preventDefault();\n event.returnValue = \"\";\n };\n /** Internal platform upgrade entry; route confirmation never delays this reload. */\n stopForUpgrade = (): void => {\n if (this.disposed) return;\n this.upgrading = true;\n this.browser.removeEventListener(\"beforeunload\", this.onBeforeUnload);\n this.blockers.clear();\n this.cancelPending();\n };\n upgrade = (): void => {\n if (this.disposed) return;\n this.stopForUpgrade();\n this.browser.location.reload();\n };\n setAdmission(admission: NonNullable<RouterStore[\"admission\"]>): void {\n this.admission = admission;\n }\n setBlocker(id: symbol, when: boolean): void {\n if (when) this.blockers.add(id);\n else this.blockers.delete(id);\n if (!when && this.blocked?.remaining.delete(id) === true) this.releaseBlocked();\n }\n getBlocker(id: symbol): BlockerState {\n const blocked = this.blocked;\n const from = this.snapshot.location;\n if (blocked === undefined || from === undefined || !blocked.remaining.has(id))\n return { status: \"idle\" };\n return {\n status: \"blocked\",\n from,\n to: blocked.transition.location,\n proceed: () => {\n if (this.blocked !== blocked) return;\n blocked.remaining.delete(id);\n this.releaseBlocked();\n },\n reset: () => {\n if (this.blocked !== blocked) return;\n this.cancelPending();\n this.update({ ...this.snapshot, navigation: { status: \"idle\" } });\n },\n };\n }\n private releaseBlocked(): void {\n const blocked = this.blocked;\n if (blocked === undefined) return;\n if (blocked.remaining.size === 0) {\n this.blocked = undefined;\n this.loadTransition(blocked.transition);\n } else this.update({ ...this.snapshot });\n }\n\n navigate(\n href: string,\n options: NavigationOptions = {},\n redirect = false,\n ): Promise<NavigationResult> {\n if (this.disposed || this.upgrading) return Promise.resolve({ status: \"cancelled\" });\n if (!redirect) this.redirects.clear();\n if (href === this.committedHref) {\n this.cancelPending();\n this.update({ ...this.snapshot, navigation: { status: \"idle\" }, failure: undefined });\n return Promise.resolve({ status: \"committed\" });\n }\n if (redirect) {\n if (this.committedHref !== undefined) this.redirects.add(this.committedHref);\n if (this.redirects.has(href) || this.redirects.size >= 32) {\n const error = new Error(`Ignotum redirect loop at '${href}'.`);\n this.cancelPending();\n this.update({\n ...this.snapshot,\n navigation: { status: \"idle\" },\n failure: {\n error,\n retry: () => {\n this.redirects.clear();\n void this.navigate(href, options, true);\n },\n },\n });\n return Promise.resolve({ status: \"failed\", error });\n }\n }\n const key =\n options.replace === true\n ? (this.snapshot.location?.key ?? this.browser.crypto.randomUUID())\n : this.browser.crypto.randomUUID();\n return this.transitionTo(href, options.replace === true ? \"replace\" : \"push\", key, options);\n }\n\n preload = async (href: string): Promise<void> => {\n if (\n this.disposed ||\n this.upgrading ||\n (this.admission !== undefined && !(await this.admission.validate()))\n )\n return;\n const outcome = Effect.runSync(matchLocation(this.patterns, href));\n await this.loadBranch(outcome, false);\n };\n\n private cancelPending(): void {\n if (this.history !== undefined) void this.history.seek(this.history.committed);\n this.blocked = undefined;\n if (this.transition !== undefined)\n Effect.runSync(Deferred.succeed(this.transition.completion, { status: \"cancelled\" }));\n this.transition = undefined;\n }\n\n private transitionTo(\n href: string,\n kind: Transition[\"kind\"],\n key: string,\n options: NavigationOptions = {},\n historyPosition?: HistoryPosition,\n ): Promise<NavigationResult> {\n if (this.disposed || this.upgrading) return Promise.resolve({ status: \"cancelled\" });\n const sourceScroll = this.history?.captureScroll() ?? {\n x: this.browser.scrollX,\n y: this.browser.scrollY,\n };\n this.cancelPending();\n const location = locationOf(href, key, this.browser.location.origin);\n const previous = this.snapshot.location;\n const searchOnly =\n previous !== undefined &&\n previous.pathname === location.pathname &&\n previous.hash === location.hash;\n const completion = Deferred.makeUnsafe<NavigationResult>();\n const position = historyPosition ?? {\n key,\n href,\n index: (this.history?.committed.index ?? 0) + (kind === \"push\" ? 1 : 0),\n };\n const transition: Transition = {\n id: ++this.serial,\n href,\n location,\n kind,\n completion,\n position,\n scroll: options.scroll ?? (searchOnly ? \"preserve\" : \"auto\"),\n searchOnly,\n sourceScroll,\n };\n this.transition = transition;\n if (kind !== \"initial\" && this.blockers.size > 0 && this.snapshot.location !== undefined) {\n this.blocked = { transition, remaining: new Set(this.blockers) };\n this.update({ ...this.snapshot, navigation: { status: \"idle\" }, failure: undefined });\n } else this.loadTransition(transition);\n return Effect.runPromise(Deferred.await(completion));\n }\n\n private loadTransition(transition: Transition): void {\n const { href, location, kind } = transition;\n const outcome = Effect.runSync(matchLocation(this.patterns, href));\n this.update({\n ...this.snapshot,\n navigation: { status: \"loading\", to: location },\n failure: undefined,\n });\n const load = async () => {\n if (this.admission !== undefined && !(await this.admission.validate()))\n throw new Error(\"The app must verify its current selection before navigating.\");\n if (this.upgrading || this.disposed) throw new Error(\"The app is updating.\");\n return this.loadBranch(outcome);\n };\n void load().then(\n async (branch) => {\n if (this.transition !== transition || this.disposed) return;\n try {\n const history = this.history;\n if (history !== undefined) {\n const restored = await history.seek(history.committed);\n if (!restored || this.transition !== transition || this.disposed) return;\n if (kind === \"traverse\") {\n const arrived = await history.seek(transition.position);\n if (!arrived || this.transition !== transition || this.disposed) return;\n }\n history.commit(transition.position, kind);\n }\n this.applyMetadata(outcome);\n this.committedHref = href;\n this.update({\n location,\n branch,\n navigation: { status: \"idle\" },\n failure: undefined,\n commit: transition.id,\n });\n } catch (error) {\n this.fail(transition, error);\n }\n },\n (error) => {\n this.fail(transition, error);\n if (!this.upgrading) void this.admission?.recoverLoad();\n },\n );\n }\n\n /** Called by the mounted view after Preact has committed the destination DOM. */\n rendered(commit: number): void {\n if (this.transition?.id !== commit || this.snapshot.commit !== commit) {\n if (this.snapshot.navigation.status === \"idle\" && this.blocked === undefined)\n this.history?.restoreSourceScroll();\n return;\n }\n const transition = this.transition;\n const document = this.browser.document;\n if (!transition.searchOnly) {\n const target =\n document.querySelector<HTMLElement>(\"#app main, #app [role=main]\") ??\n document.getElementById(\"app\");\n if (target !== null) {\n const hadTabIndex = target.hasAttribute(\"tabindex\");\n if (!hadTabIndex) target.setAttribute(\"tabindex\", \"-1\");\n target.focus({ preventScroll: true });\n }\n }\n const saved = this.history?.scroll.get(transition.location.key);\n if (transition.kind === \"traverse\" && saved !== undefined)\n this.browser.scrollTo(saved.x, saved.y);\n else if (transition.scroll === \"auto\") {\n const target =\n transition.location.hash === \"\" ? null : document.getElementById(transition.location.hash);\n if (target !== null) target.scrollIntoView();\n else this.browser.scrollTo(0, 0);\n } else this.browser.scrollTo(transition.sourceScroll.x, transition.sourceScroll.y);\n this.history?.finishScroll();\n Effect.runSync(Deferred.succeed(this.transition.completion, { status: \"committed\" }));\n this.transition = undefined;\n }\n\n // oxlint-disable-next-line anti-slop/no-unknown-parameters -- Module loaders and DOM APIs can throw arbitrary values; NavigationResult preserves the original error.\n private fail(transition: Transition, error: unknown): void {\n if (this.transition !== transition || this.disposed) return;\n this.transition = undefined;\n const loadFailure = error instanceof BranchLoadError ? error : undefined;\n const originalError = loadFailure === undefined ? error : loadFailure.error;\n this.update({\n ...this.snapshot,\n navigation: { status: \"idle\" },\n failure: {\n error: originalError,\n branch: transition.kind === \"initial\" ? undefined : loadFailure?.branch,\n retry: () => {\n void this.transitionTo(\n transition.href,\n transition.kind,\n transition.location.key,\n { scroll: transition.scroll },\n transition.position,\n );\n },\n },\n });\n Effect.runSync(\n Deferred.succeed(transition.completion, { status: \"failed\", error: originalError }),\n );\n }\n\n private loadStyle(href: string): Promise<void> {\n const absolute = new URL(href, this.browser.location.origin).href;\n const cached = this.styles.get(absolute);\n if (cached !== undefined) return cached;\n const document = this.browser.document;\n const existing = Array.from(\n document.querySelectorAll<HTMLLinkElement>('link[rel=\"stylesheet\"]'),\n ).find((link) => link.href === absolute);\n if (existing?.sheet !== null && existing?.sheet !== undefined) return Promise.resolve();\n const link = existing ?? document.createElement(\"link\");\n const promise = Effect.runPromise(\n Effect.callback<void, Error>((resume) => {\n const cleanup = () => {\n link.removeEventListener(\"load\", onLoad);\n link.removeEventListener(\"error\", onError);\n this.styleCleanups.delete(cancel);\n };\n const onLoad = () => {\n cleanup();\n resume(Effect.void);\n };\n const onError = () => {\n cleanup();\n link.remove();\n resume(Effect.fail(new Error(`Could not load route stylesheet '${href}'.`)));\n };\n const cancel = () => {\n cleanup();\n if (existing === undefined) link.remove();\n resume(Effect.fail(new Error(\"Router disposed.\")));\n };\n this.styleCleanups.add(cancel);\n link.addEventListener(\"load\", onLoad);\n link.addEventListener(\"error\", onError);\n if (existing === undefined) {\n link.rel = \"stylesheet\";\n link.crossOrigin = \"anonymous\";\n link.href = absolute;\n document.head.append(link);\n }\n return Effect.sync(cleanup);\n }),\n ).catch((error) => {\n this.styles.delete(absolute);\n throw error;\n });\n this.styles.set(absolute, promise);\n return promise;\n }\n\n private loadModule(id: AppModuleId): Promise<typeof ModuleExports.Type> {\n const cached = this.modules.get(id);\n if (cached !== undefined) return cached;\n const module = this.registration.modules.get(id);\n if (module === undefined)\n return Promise.reject(new Error(`Client module '${id}' is not registered.`));\n const loaded = Promise.resolve()\n .then(module.load)\n .then(Schema.decodeUnknownSync(ModuleExports))\n .catch((error) => {\n this.modules.delete(id);\n throw error;\n });\n this.modules.set(id, loaded);\n return loaded;\n }\n private async loadExport(reference: ModuleExportReference): Promise<typeof Schema.Unknown.Type> {\n const exports = await this.loadModule(reference.module);\n if (!Object.hasOwn(exports, reference.exportName))\n throw new Error(`Module '${reference.module}' has no '${reference.exportName}' export.`);\n return exports[reference.exportName];\n }\n private async loadBranch(outcome: RouteOutcome, withStyles = true): Promise<LoadedBranch> {\n const route = outcome._tag === \"NotFound\" ? undefined : outcome.route;\n const available = new Map<LayoutDefinition[\"id\"], LoadedBranch[\"layouts\"][number]>();\n try {\n const [layouts, page] = await Promise.all([\n Promise.all(\n outcome.layouts.map(async (layout) => {\n const [loaded] = await Promise.all([\n this.loadExport(layout.module).then(Schema.decodeUnknownSync(LayoutModule)),\n withStyles\n ? Promise.all(\n (this.registration.modules.get(layout.module.module)?.styles ?? []).map(\n (href) => this.loadStyle(href),\n ),\n )\n : undefined,\n ]);\n const result = { id: layout.id, ...loaded };\n available.set(layout.id, result);\n return result;\n }),\n ),\n route === undefined\n ? undefined\n : this.loadExport(route.page).then(Schema.decodeUnknownSync(PageModule)),\n Promise.all(\n withStyles\n ? [\n ...(this.registration.styles ?? []),\n ...(route === undefined\n ? []\n : (this.registration.modules.get(route.page.module)?.styles ?? [])),\n ].map(async (href) => this.loadStyle(href))\n : [],\n ),\n ]);\n return { outcome, layouts, page: page?.component, pageBoundaries: page };\n } catch (error) {\n const layouts: Array<LoadedBranch[\"layouts\"][number]> = [];\n for (const definition of outcome.layouts) {\n const loaded = available.get(definition.id);\n if (loaded === undefined) break;\n layouts.push(loaded);\n }\n throw BranchLoadError.make({ error, branch: { outcome, layouts, page: undefined } });\n }\n }\n\n setRenderError(error: boolean): void {\n if (this.snapshot.branch !== undefined) this.applyMetadata(this.snapshot.branch.outcome, error);\n }\n\n private applyMetadata(outcome: RouteOutcome, renderError = false): void {\n const resolved = Effect.runSync(\n resolveMetadata({\n applicationName: this.registration.applicationName,\n layouts: outcome.layouts.map((layout) => layout.metadata),\n page: outcome._tag === \"NotFound\" ? undefined : outcome.route?.metadata,\n outcome: renderError ? \"Invalid\" : outcome._tag,\n }),\n );\n const document = this.browser.document;\n document.title = resolved.title;\n for (const name of [\"description\", \"robots\"] as const) {\n const tags = Array.from(\n document.head.querySelectorAll<HTMLMetaElement>(`meta[name=\"${name}\"]`),\n );\n const value = resolved.meta[name];\n if (value === undefined) {\n for (const tag of tags) tag.remove();\n continue;\n }\n const tag = tags.shift() ?? document.createElement(\"meta\");\n for (const duplicate of tags) duplicate.remove();\n tag.name = name;\n tag.content = value;\n if (!tag.isConnected) document.head.append(tag);\n }\n }\n\n dispose(): void {\n this.disposed = true;\n this.cancelPending();\n this.history?.dispose();\n this.browser.removeEventListener(\"beforeunload\", this.onBeforeUnload);\n for (const cleanup of this.styleCleanups) cleanup();\n this.listeners.clear();\n }\n}\n","import { createElement as h, Fragment, type ComponentChildren, type ComponentType } from \"preact\";\nimport { useErrorBoundary, useState } from \"preact/hooks\";\nimport type {\n ErrorBoundaryProps,\n LoadedBranch,\n RouterSnapshot,\n RouterStore,\n} from \"./router-store.js\";\nimport type { RouteLocation } from \"./routes.js\";\n\nexport const DefaultError = ({ error, retry }: ErrorBoundaryProps): ComponentChildren =>\n h(\n \"div\",\n { role: \"alert\" },\n error instanceof Error ? error.message : \"This page could not load or render. \",\n h(\"button\", { onClick: retry }, \"Retry\"),\n );\n\ninterface BoundaryProps {\n readonly children: ComponentChildren;\n readonly component: ComponentType<ErrorBoundaryProps>;\n readonly branch: LoadedBranch;\n readonly router: RouterStore;\n readonly onRetry?: () => void;\n}\nconst Boundary = ({\n children,\n component,\n branch,\n router,\n onRetry,\n}: BoundaryProps): ComponentChildren => {\n const [failure, setFailure] = useState<{\n readonly branch: LoadedBranch;\n readonly error: unknown;\n }>();\n const [, reset] = useErrorBoundary((error) => {\n setFailure({ branch, error });\n router.setRenderError(true);\n });\n return failure?.branch !== branch\n ? children\n : h(component, {\n error: failure.error,\n retry: () => {\n router.setRenderError(false);\n onRetry?.();\n setFailure(undefined);\n reset();\n },\n });\n};\n\nexport const Branch = ({\n branch,\n location,\n router,\n failure,\n}: {\n readonly branch: LoadedBranch;\n readonly location: RouteLocation;\n readonly router: RouterStore;\n readonly failure: RouterSnapshot[\"failure\"];\n}): ComponentChildren => {\n const outcome = branch.outcome;\n let child: ComponentChildren;\n let lastLayout = branch.layouts.length - 1;\n let boundaryOwner: number | undefined;\n if (outcome._tag === \"Matched\" && branch.page !== undefined) {\n child = h(branch.page, {\n key: outcome.route.id,\n params: outcome.params,\n searchParams: outcome.searchParams,\n });\n } else if (outcome._tag === \"Invalid\" && branch.pageBoundaries?.invalid !== undefined) {\n child = h(branch.pageBoundaries.invalid, { location, issues: outcome.issues });\n } else {\n child = h(\n \"main\",\n { \"data-ignotum-outcome\": outcome._tag },\n outcome._tag === \"Invalid\" ? \"Invalid URL\" : \"Page not found\",\n );\n for (let index = lastLayout; index >= 0; index--) {\n const layout = branch.layouts[index]!;\n if (outcome._tag === \"Invalid\" && layout.invalid !== undefined) {\n child = h(layout.invalid, { location, issues: outcome.issues });\n lastLayout = index;\n boundaryOwner = index;\n break;\n }\n if (outcome._tag === \"NotFound\" && layout.notFound !== undefined) {\n child = h(layout.notFound, { location });\n lastLayout = index;\n boundaryOwner = index;\n break;\n }\n }\n }\n if (branch.pageBoundaries?.error !== undefined && outcome._tag === \"Matched\")\n child = h(Boundary, {\n key: \"page-boundary\",\n component: branch.pageBoundaries.error,\n branch,\n router,\n children: child,\n });\n let sharedLayouts = 0;\n while (\n sharedLayouts <= lastLayout &&\n branch.layouts[sharedLayouts]?.id === failure?.branch?.layouts[sharedLayouts]?.id\n )\n sharedLayouts++;\n const loadFailure =\n failure === undefined\n ? null\n : h(LoadFailure, {\n failure,\n router,\n layouts: branch.layouts.slice(0, sharedLayouts),\n });\n for (let index = lastLayout; index >= 0; index--) {\n const layout = branch.layouts[index]!;\n if (layout.error !== undefined && index !== boundaryOwner)\n child = h(Boundary, {\n key: layout.id,\n component: layout.error,\n branch,\n router,\n children: child,\n });\n child = h(layout.component, {\n key: layout.id,\n children: h(Fragment, {}, child, index === sharedLayouts - 1 ? loadFailure : null),\n });\n }\n return h(Boundary, {\n component: DefaultError,\n branch,\n router,\n children: h(Fragment, {}, child, sharedLayouts === 0 ? loadFailure : null),\n });\n};\n\nexport const LoadFailure = ({\n failure,\n router,\n layouts,\n}: {\n readonly failure: NonNullable<RouterSnapshot[\"failure\"]>;\n readonly layouts?: LoadedBranch[\"layouts\"];\n readonly router: RouterStore;\n}): ComponentChildren => {\n const branch = failure.branch;\n if (branch === undefined)\n return h(\"div\", { \"data-ignotum-load-error\": \"\" }, h(DefaultError, failure));\n let child: ComponentChildren = h(DefaultError, failure);\n let found = false;\n for (const layout of [...(layouts ?? branch.layouts)].reverse()) {\n if (layout.error === undefined) continue;\n if (!found) {\n child = h(layout.error, { error: failure.error, retry: failure.retry });\n found = true;\n } else {\n child = h(Boundary, {\n component: layout.error,\n branch,\n router,\n onRetry: failure.retry,\n children: child,\n });\n }\n }\n return h(\n \"div\",\n { \"data-ignotum-load-error\": \"\" },\n h(Boundary, {\n component: DefaultError,\n branch,\n router,\n onRetry: failure.retry,\n children: child,\n }),\n );\n};\n","import type { ExecutionSelection } from \"@ignotum/contracts/platform\";\nimport { createElement, Fragment, render, type ComponentChildren } from \"preact\";\nimport { useLayoutEffect, useState } from \"preact/hooks\";\nimport { mountManagedSync } from \"./sync.js\";\nimport type { ManagedBrowserClient } from \"./managed-client.js\";\nimport { RouterContext, useRouterSnapshot } from \"./router.js\";\n// oxlint-disable-next-line anti-slop-effect/no-service-constructor-imports -- Each browser mount owns its router and releases it on disposal.\nimport { RouterStore, type ClientRegistration } from \"./router-store.js\";\n\nimport { Branch, LoadFailure } from \"./route-boundaries.js\";\n\nconst RouterView = ({ router }: { readonly router: RouterStore }): ComponentChildren => {\n const snapshot = useRouterSnapshot(router);\n useLayoutEffect(() => {\n router.rendered(snapshot.commit);\n }, [router, snapshot]);\n return createElement(\n RouterContext.Provider,\n { value: router },\n snapshot.branch === undefined || snapshot.location === undefined\n ? createElement(\"div\", { role: \"status\" }, snapshot.failure === undefined ? \"Loading…\" : null)\n : createElement(Branch, {\n branch: snapshot.branch,\n location: snapshot.location,\n router,\n failure: snapshot.failure,\n }),\n snapshot.failure !== undefined && snapshot.branch === undefined\n ? createElement(LoadFailure, { failure: snapshot.failure, router })\n : null,\n );\n};\n\nconst mounts = new WeakSet<Element>();\n\nconst ManagedStatus = ({ client }: { readonly client: ManagedBrowserClient }) => {\n const [snapshot, setSnapshot] = useState(client.upgrade.getSnapshot);\n useLayoutEffect(\n () => client.upgrade.subscribe(() => setSnapshot(client.upgrade.getSnapshot())),\n [client],\n );\n if (snapshot.phase === \"ready\" && snapshot.recovery.length === 0) return null;\n return createElement(\n \"aside\",\n {\n \"data-ignotum-update\": snapshot.phase,\n role: snapshot.phase === \"error\" ? \"alert\" : \"status\",\n },\n snapshot.message ?? (snapshot.phase === \"connecting\" ? \"Connecting to the app…\" : null),\n snapshot.recovery.length === 0\n ? null\n : createElement(\n \"ul\",\n null,\n snapshot.recovery.map((message) => createElement(\"li\", { key: message }, message)),\n ),\n snapshot.phase === \"error\"\n ? createElement(\"button\", { type: \"button\", onClick: () => client.retry() }, \"Reload app\")\n : null,\n snapshot.recovery.length === 0\n ? null\n : createElement(\n \"button\",\n { type: \"button\", onClick: client.upgrade.dismissRecovery },\n \"Dismiss\",\n ),\n );\n};\n\n/** The platform owns mounting. Generated registrations contain no Preact render/bootstrap code. */\nexport const mountClient = (registration: ClientRegistration, selection: ExecutionSelection) => {\n const root = window.document.getElementById(\"app\");\n if (root === null) throw new Error(\"Ignotum mount element is missing.\");\n if (mounts.has(root)) throw new Error(\"The Ignotum client is already mounted.\");\n const router = new RouterStore(registration, selection, window);\n const managed = mountManagedSync(selection, window, {\n stopAdmission: router.stopForUpgrade,\n reload: router.upgrade,\n });\n router.setAdmission({\n validate: managed.client.validate,\n recoverLoad: managed.client.recoverLoad,\n });\n render(\n createElement(\n Fragment,\n null,\n createElement(ManagedStatus, { client: managed.client }),\n createElement(RouterView, { router }),\n ),\n root,\n );\n const ready = managed.client\n .whenReady()\n .then((accepted) => (accepted ? router.start() : { status: \"cancelled\" as const }));\n mounts.add(root);\n let disposed = false;\n return {\n ready,\n upgrade: () => managed.client.upgrade.require(),\n dispose: () => {\n if (disposed) return;\n disposed = true;\n mounts.delete(root);\n router.dispose();\n managed.dispose();\n render(null, root);\n },\n };\n};\n"],"mappings":"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"}