@source-crafter/xzor-runtime 0.1.10 → 0.1.11
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.
|
@@ -461,6 +461,8 @@ class RenderTreeBuilder {
|
|
|
461
461
|
}
|
|
462
462
|
}
|
|
463
463
|
function setAttr(el, name, value) {
|
|
464
|
+
if (name.charCodeAt(0) === 45 && name.charCodeAt(1) === 45)
|
|
465
|
+
return el.style.setProperty(name, value);
|
|
464
466
|
el.setAttribute(name, value);
|
|
465
467
|
if (name === "value" && "value" in el)
|
|
466
468
|
el.value = value;
|
|
@@ -468,6 +470,8 @@ function setAttr(el, name, value) {
|
|
|
468
470
|
el.checked = true;
|
|
469
471
|
}
|
|
470
472
|
function removeAttr(el, name) {
|
|
473
|
+
if (name.charCodeAt(0) === 45 && name.charCodeAt(1) === 45)
|
|
474
|
+
return void el.style.removeProperty(name);
|
|
471
475
|
el.removeAttribute(name);
|
|
472
476
|
if (name === "value" && "value" in el)
|
|
473
477
|
el.value = "";
|
|
@@ -1046,5 +1050,5 @@ class NavLink extends ComponentBase {
|
|
|
1046
1050
|
|
|
1047
1051
|
export { FINE, setFineHooks, patchIsland, disposeIsland, $isFragment, SVG, $inSvg, Route, viewTransitions, setNavigationForTests, basePath, polyfillDisposeSymbols, ServiceProvider, Mount, Import, Singleton, Scoped, Transient, SharedInstance, ComponentBase, RenderTreeBuilder, setRenderObserver, mount, NavLink };
|
|
1048
1052
|
|
|
1049
|
-
//# debugId=
|
|
1050
|
-
//# sourceMappingURL=index-
|
|
1053
|
+
//# debugId=085B9300273EBAC364756E2164756E21
|
|
1054
|
+
//# sourceMappingURL=index-k290gfdd.js.map
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../runtime/index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"// xzor runtime: the RenderTreeBuilder that generated components call into, and a DOM\n// renderer that re-renders one component at a time and patches only what changed.\n\ntype Handler = (e: Event) => unknown;\ntype Modifier = \"preventDefault\" | \"stopPropagation\";\ntype Modifiers = Partial<Record<Modifier, boolean>>;\n\nexport type VText = { kind: \"text\"; text: string; dom?: Text };\n\nexport type VElement = {\n kind: \"element\";\n tag: string;\n attrs: Record<string, string>;\n events: Record<string, Handler>;\n modifiers: Record<string, Modifiers>;\n children: VNode[];\n key?: unknown;\n ref?: (el: Element) => void;\n dom?: Element;\n};\n\n/** One `@cascade:name(value)` provider; created on the region's first render and carried across the next ones. */\ntype CascadeRecord = {\n name: string;\n value: unknown;\n fixed: boolean;\n consumers: Set<ComponentBase> | undefined;\n parent: CascadeRecord | undefined;\n};\n\n/** Output of one `@if`/`@for`/`@switch`/`@cascade`; its contents are diffed in isolation. */\nexport type VRegion = {\n kind: \"region\";\n children: VNode[];\n anchor?: Comment;\n // `@cascade:name(value)` describes its provider with plain fields; `cascade` is the record they create.\n name?: string;\n value?: unknown;\n fixed?: boolean;\n cascade?: CascadeRecord;\n};\n\n/** A child component; the diff decides whether it keeps its previous instance. */\nexport type VComponent = {\n kind: \"component\";\n type: Ctor<ComponentBase>;\n props: Record<string, unknown>;\n slots?: object;\n key?: unknown;\n ref?: (c: ComponentBase) => void;\n instance?: ComponentBase;\n mounted?: Mounted;\n // `@catch`: set on a routed page, it takes the failures the page itself causes instead of `rethrow`.\n onError?: (err: unknown, nav: number) => void;\n // The navigation that put this page here; a patch refreshes its params whenever it moves on.\n nav?: number;\n};\n\nexport type VNode = VText | VElement | VRegion | VComponent | VFine;\n\n/** A `@fine` component's DOM: built once by `fine.ts`, between two comments; patches only refresh it. */\nexport type VFine = { kind: \"fine\"; build: (parent: Node) => void; root?: FineRoot };\n\n/** @internal What `fine.ts` keeps for one fine vnode. */\nexport type FineRoot = { bindings: unknown; start: Comment; end: Comment };\n\ntype FineHooks = {\n create(build: (parent: Node) => void, owner: ComponentBase, app: IApplication | undefined, scope: unknown): FineRoot;\n refresh(root: FineRoot): void;\n dispose(root: FineRoot): void;\n /** A handler of a fine component ran: it re-runs the bindings that read nothing tracked. */\n handled(owner: ComponentBase, result: unknown): void;\n};\n\nlet fineHooks: FineHooks | undefined;\n\n/** @internal On `FineComponent.prototype`: its handlers and callbacks write tracked fields, so nothing re-renders it. */\nexport const FINE: unique symbol = Symbol(\"xzor.fine\");\n\nconst isFine = (c: ComponentBase): boolean => (c as unknown as Record<symbol, unknown>)[FINE] === true;\n\n/** @internal Set by `fine.ts` (the model entry), so the renderer pays nothing without it. */\nexport function setFineHooks(h: FineHooks): void {\n fineHooks = h;\n}\n\n/**\n * @internal A virtual-DOM island inside a fine template: renders `build` before `end`, patching `old`.\n * `scope` is the cascade scope the fine component was mounted in.\n */\nexport function patchIsland(\n owner: ComponentBase,\n app: IApplication | undefined,\n scope: unknown,\n end: Node,\n old: VNode[],\n build: (b: RenderTreeBuilder) => void,\n): VNode[] {\n const builder = new RenderTreeBuilder(owner);\n build(builder);\n const next = builder.nodes;\n batch(() => patchList(end.parentNode!, old, next, end, owner, app, scope as CascadeRecord | undefined));\n return next;\n}\n\n/** @internal Disposes an island's tree; its DOM goes with the region that holds it. */\nexport function disposeIsland(tree: VNode[]): void {\n for (const v of tree) dispose(v);\n}\n\n/** @internal Whether a value is markup (`RenderFragment`). */\nexport const $isFragment = (value: unknown): boolean => isFragment(value);\n\nexport const SVG = \"http://www.w3.org/2000/svg\";\n/** Whether children of `parent` belong to the SVG namespace (`<foreignObject>` holds HTML). */\nexport const $inSvg = (parent: Node): boolean => (parent as Element).namespaceURI === SVG && parent.nodeName !== \"foreignObject\";\nconst inSvg = $inSvg;\n\nfunction fineNodes(root: FineRoot): Node[] {\n const nodes: Node[] = [];\n for (let n: Node | null = root.start; n !== null; n = n.nextSibling) {\n nodes.push(n);\n if (n === root.end) break;\n }\n return nodes;\n}\n\n/** One entry of the generated `.xzor/routes.ts` table; `match` converts the path segments or rejects them. */\nexport type RouteEntry = {\n tag: string | undefined;\n pattern: string;\n /** The page's shortest pattern this one extends: routes of one family share the page instance. */\n family?: string;\n component: unknown;\n match: (s: string[]) => Record<string, unknown> | null;\n};\n\n/** The project's routes, in precedence order. */\nexport type RouteTable = readonly RouteEntry[];\n\n/**\n * The state of the current navigation, published to the routes block and as the cascading value `route`.\n * `Tags` maps each route tag to its params; the generated table fixes it (`AppRoute`) so `is` checks tags.\n */\nexport class Route<P = Record<string, unknown>, Tags extends object = Record<string, Record<string, unknown>>> {\n readonly #nav: Navigation | undefined;\n\n constructor(\n readonly path: string,\n readonly tag: (keyof Tags & string) | undefined,\n readonly params: P,\n readonly query: URLSearchParams,\n readonly match: Record<string, string>,\n nav?: Navigation,\n ) {\n this.#nav = nav;\n }\n\n /** Narrows `params` to the routes carrying `tag`. */\n is<K extends keyof Tags & string>(tag: K): this is Route<Tags[K], Tags> & { readonly tag: K } {\n return this.tag === tag;\n }\n\n /** History navigation under `@ClientRoutes`; `@ServerRoutes` loads the url. */\n navigate(url: string, opts?: { replace?: boolean }): void {\n if (this.#nav) this.#nav.navigate(url, opts?.replace === true);\n else location.href = url;\n }\n}\n\n/** One section of a `@ClientRoutes`/`@ServerRoutes` block; xzor emits these in source order. */\nexport type RouteSection =\n | { kind: \"tag\"; tag: string; render: (route: Route, page: RenderFragment) => RenderFragment }\n | { kind: \"regex\"; re: RegExp; page: boolean; render: (route: Route, page: RenderFragment) => RenderFragment }\n | {\n kind: \"pattern\";\n match: (segments: string[]) => Record<string, string> | null;\n page: boolean;\n render: (route: Route, page: RenderFragment) => RenderFragment;\n }\n | { kind: \"notFound\"; render: (route: Route) => RenderFragment }\n | { kind: \"catch\"; render: (route: Route, error: unknown) => RenderFragment }\n | { kind: \"default\"; render: (route: Route, page: RenderFragment) => RenderFragment };\n\n/** How `@ClientRoutes` reaches the browser's history; `setNavigationForTests` swaps it. */\nexport type Navigation = {\n current(): URL;\n navigate(url: string, replace: boolean): void;\n subscribe(fn: () => void): () => void;\n /** Like `subscribe`, without taking over link clicks (a `NavLink` only watches). Defaults to `subscribe`. */\n observe?(fn: () => void): () => void;\n};\n\n// One set for the whole page: the listeners below exist only while a routes block is mounted.\nconst navigated = new Set<() => void>();\n// NavLinks: notified like routes blocks, but they never intercept clicks.\nconst observers = new Set<() => void>();\nconst EXTERNAL = /(^|\\s)external(\\s|$)/;\nlet transitions = false;\n\n/** Commits each navigation inside `document.startViewTransition` where the browser has it. */\nexport function viewTransitions(on: boolean): void {\n transitions = on;\n}\n\nfunction notifyNavigated(): void {\n const doc = document as Document & { startViewTransition?: (update: () => void) => { ready: Promise<unknown> } };\n // `ready` rejects when the browser skips the animation (a hidden tab, a newer navigation): the update still ran.\n if (transitions && doc.startViewTransition) doc.startViewTransition(notifyAll).ready.catch(noop);\n else notifyAll();\n}\n\nfunction notifyAll(): void {\n for (const fn of [...navigated]) fn();\n for (const fn of [...observers]) fn();\n}\n\nconst onPopState = (): void => notifyNavigated();\n\nfunction onLinkClick(e: MouseEvent): void {\n if (e.defaultPrevented || e.button !== 0 || e.ctrlKey || e.metaKey || e.shiftKey || e.altKey) return;\n const anchor = (e.target as Element | null)?.closest?.(\"a\");\n const href = anchor?.getAttribute(\"href\");\n if (!anchor || href == null || href.startsWith(\"#\")) return;\n const frame = anchor.getAttribute(\"target\");\n if ((frame !== null && frame !== \"_self\") || anchor.hasAttribute(\"download\")) return;\n const rel = anchor.getAttribute(\"rel\");\n if (rel !== null && EXTERNAL.test(rel)) return;\n // `<base href>` is what the browser resolves a relative link against, so the router has to agree.\n const url = new URL(href, document.baseURI);\n if (url.origin !== location.origin) return;\n // Moving inside the page the user is already on is the browser's job, not a navigation.\n if (url.hash !== \"\" && url.pathname === location.pathname && url.search === location.search) return;\n e.preventDefault();\n browserNavigation.navigate(url.href, false);\n}\n\n// Renders read the current URL every time; it is only parsed again once the address changed.\nlet currentUrl: URL | undefined;\n\nconst browserNavigation: Navigation = {\n current: () => (currentUrl?.href === location.href ? currentUrl : (currentUrl = new URL(location.href))),\n navigate(url, replace) {\n const href = new URL(url, document.baseURI).href;\n if (replace) history.replaceState(null, \"\", href);\n else history.pushState(null, \"\", href);\n notifyNavigated();\n },\n subscribe(fn) {\n navigated.add(fn);\n if (navigated.size === 1) {\n if (observers.size === 0) window.addEventListener(\"popstate\", onPopState);\n document.addEventListener(\"click\", onLinkClick);\n }\n return () => {\n navigated.delete(fn);\n if (navigated.size === 0) {\n if (observers.size === 0) window.removeEventListener(\"popstate\", onPopState);\n document.removeEventListener(\"click\", onLinkClick);\n }\n };\n },\n observe(fn) {\n observers.add(fn);\n if (observers.size === 1 && navigated.size === 0) window.addEventListener(\"popstate\", onPopState);\n return () => {\n observers.delete(fn);\n if (observers.size === 0 && navigated.size === 0) window.removeEventListener(\"popstate\", onPopState);\n };\n },\n};\n\nlet testNavigation: Navigation | undefined;\n\n/** @internal Swaps in a memory navigation; set it before mounting the routes block. */\nexport function setNavigationForTests(nav: Navigation | undefined): void {\n testNavigation = nav;\n}\n\nconst navigationOf = (): Navigation => testNavigation ?? browserNavigation;\n\n/** What one mounted routes block keeps between renders. */\ntype Router = {\n // Set under `@ClientRoutes` only: it is also what `route.navigate` uses.\n nav: Navigation | undefined;\n off: (() => void) | undefined;\n onError: ((err: unknown, nav: number) => void) | undefined;\n caught: Extract<RouteSection, { kind: \"catch\" }> | undefined;\n href: string;\n // Counts the navigations this block has resolved; a failure stamped with an older one is stale.\n id: number;\n route: Route | undefined;\n // Index into the sections of the current render, or -1.\n section: number;\n page: RouteEntry | undefined;\n params: Record<string, unknown>;\n error: unknown;\n failed: boolean;\n};\n\nconst ROUTER: unique symbol = Symbol(\"xzor.router\");\ntype Routed = { [ROUTER]?: Router };\n\nfunction segmentsOf(pathname: string): string[] {\n const rest = pathname.startsWith(\"/\") ? pathname.slice(1) : pathname;\n return rest === \"\" ? [] : rest.split(\"/\");\n}\n\nlet baseFor: string | undefined;\nlet base = \"\";\n\n/** The path of `<base href>` without its last segment: \"\" without one, \"/docs\" under `<base href=\"/docs/\">`. */\nexport function basePath(): string {\n const uri = document.baseURI;\n if (uri !== baseFor) {\n baseFor = uri;\n const path = document.querySelector(\"base[href]\") ? new URL(uri).pathname : \"/\";\n base = path.slice(0, path.lastIndexOf(\"/\"));\n }\n return base;\n}\n\n/** The pathname routes match: relative to `basePath()`, starting with `/`. */\nfunction routePath(pathname: string): string {\n const b = basePath();\n return b !== \"\" && (pathname === b || pathname.startsWith(`${b}/`)) ? pathname.slice(b.length) || \"/\" : pathname;\n}\n\n/** The section's named groups, or null; `lastIndex` is reset in case the regex carries `g` or `y`. */\nfunction groupsOf(re: RegExp, pathname: string): Record<string, string> | null {\n re.lastIndex = 0;\n const m = re.exec(pathname);\n return m ? (m.groups ?? {}) : null;\n}\n\n/** Spec order: a page route picks among the `(page)` sections, otherwise the page-less ones decide. */\nfunction resolveRoute(router: Router, table: RouteTable, sections: readonly RouteSection[], url: URL): void {\n const path = routePath(url.pathname);\n const segments = segmentsOf(path);\n let page: RouteEntry | undefined;\n let params: Record<string, unknown> | null = null;\n for (const entry of table) {\n params = entry.match(segments);\n if (params) {\n page = entry;\n break;\n }\n }\n let section = -1;\n let match: Record<string, string> = {};\n for (let i = 0; i < sections.length && section < 0; i++) {\n const s = sections[i]!;\n if (page) {\n if (s.kind === \"tag\") {\n if (s.tag === page.tag) section = i;\n } else if (s.kind === \"regex\" && s.page) {\n const groups = groupsOf(s.re, path);\n if (groups) {\n section = i;\n match = groups;\n }\n } else if (s.kind === \"pattern\" && s.page) {\n const own = s.match(segments);\n if (own) {\n section = i;\n // The page keeps the table's converted params; the pattern only decides that this section applies.\n match = own;\n }\n }\n } else if (s.kind === \"regex\" && !s.page) {\n const groups = groupsOf(s.re, path);\n if (groups) {\n section = i;\n match = groups;\n }\n } else if (s.kind === \"pattern\" && !s.page) {\n const own = s.match(segments);\n if (own) {\n section = i;\n params = own;\n }\n }\n }\n if (section < 0) section = sections.findIndex((s) => s.kind === (page ? \"default\" : \"notFound\"));\n router.href = url.href;\n router.id++;\n router.page = page;\n router.params = params ?? {};\n router.section = section;\n router.route = new Route(path, page?.tag, router.params, url.searchParams, match, router.nav);\n}\n\n/** A navigation raised while something renders (a page redirecting itself) waits for that render to end. */\nfunction renavigate(owner: ComponentBase): void {\n if (depth === 0) update(owner);\n else queueMicrotask(() => update(owner));\n}\n\ntype Ctor<C extends ComponentBase> = new (...args: any[]) => C;\n// `latest` is the current vnode of a component still waiting for its instance; cleared on arrival or removal.\ntype Mounted = {\n tree: VNode[];\n anchor: Comment;\n app: IApplication | undefined;\n scope: CascadeRecord | undefined;\n latest: VComponent | undefined;\n // The render pass that last refreshed this component's parameters; a cascade skips it then.\n pass: number;\n // A routed page kept across navigations: the latest one it belongs to.\n nav?: number;\n};\n\n/** Builds components that need injected services; generated by xzor from `@Mount` and `@ServiceProvider`. */\nexport interface IApplication {\n onStarted?(): void | Promise<void>;\n /** Consulted only for component classes with a non-empty `static inject`; returns the component, a promise for it, or `undefined` (the runtime then throws). */\n createComponent?(type: Function): ComponentBase | Promise<ComponentBase> | undefined;\n}\n\nconst noop = () => {};\nconst SELECTOR = /[#.[]/;\n\n// Errors from fire-and-forget promises must not vanish; throwing from a microtask reports them.\nconst rethrow = (err: unknown): void =>\n queueMicrotask(() => {\n throw err;\n });\n\nfunction surface(result: unknown): void {\n if (result instanceof Promise) result.catch(rethrow);\n}\n// Projects on the ES2022 lib have no `Symbol.dispose` typing.\ntype DisposeSymbols = { dispose: symbol; asyncDispose: symbol };\nconst wellKnown = Symbol as unknown as DisposeSymbols;\n\n/** @internal Engines without explicit resource management get the registry symbols that TypeScript's downlevel helpers use. */\nexport function polyfillDisposeSymbols(target: Partial<DisposeSymbols>): void {\n target.dispose ??= Symbol.for(\"Symbol.dispose\");\n target.asyncDispose ??= Symbol.for(\"Symbol.asyncDispose\");\n}\n// Runs before any generated provider's class body evaluates `[Symbol.dispose]`, since providers import this module.\npolyfillDisposeSymbols(wellKnown);\ntype ServiceDecorator = {\n <T>(impl: new (...a: any[]) => T): ClassDecorator;\n <T>(key: string, factory: (...a: any[]) => T | Promise<T>): ClassDecorator;\n};\n\nexport const ServiceProvider = (): ClassDecorator => noop;\nexport const Mount = (_component: Function, _target: string): ClassDecorator => noop;\nexport const Import = (..._providers: Function[]): ClassDecorator => noop;\nexport const Singleton: ServiceDecorator = () => noop;\nexport const Scoped: ServiceDecorator = () => noop;\nexport const Transient: ServiceDecorator = () => noop;\nexport const SharedInstance: unique symbol = Symbol(\"xzor.sharedInstance\");\n\nconst mountedComponents = new WeakMap<ComponentBase, Mounted>();\nconst elementHandlers = new WeakMap<\n Element,\n { owner: ComponentBase; events: Record<string, Handler>; modifiers: Record<string, Modifiers>; listening: Set<string> }\n>();\n\nconst FRAGMENT: unique symbol = Symbol(\"xzor.fragment\");\n\ntype Fragment = ((builder: RenderTreeBuilder) => void) & { readonly [FRAGMENT]: true };\n\n/** Markup held as a value (Blazor's RenderFragment); render it with `@member`. */\nexport type RenderFragment = Fragment;\nexport type Renderer = RenderFragment;\n\n/** A component event; invoking it re-renders the component that passed it in. */\nexport type EventCallback<T = void> = (arg: T) => unknown;\n\n/** The DOM element type for a tag name, as `document.createElement` would return it. */\nexport type ElementOf<T extends string> = T extends keyof HTMLElementTagNameMap\n ? HTMLElementTagNameMap[T]\n : T extends keyof SVGElementTagNameMap\n ? SVGElementTagNameMap[T]\n : HTMLElement;\n\nfunction isFragment(value: unknown): value is Fragment {\n return typeof value === \"function\" && FRAGMENT in value;\n}\n\nexport abstract class ComponentBase {\n /** Wraps builder calls as a RenderFragment; xzor emits this for markup used as a value. */\n static fragment(build: (builder: RenderTreeBuilder) => void): RenderFragment {\n return Object.assign(build, { [FRAGMENT]: true as const });\n }\n\n /** Reads a bound input's new value, converted to the bound field's current type. */\n static bindValue<T>(e: Event, current: T): T {\n const input = e.target as HTMLInputElement;\n if (typeof current === \"boolean\") return input.checked as T;\n if (typeof current === \"number\") return Number(input.value) as T;\n return input.value as T;\n }\n\n /** Content the parent passed for each `@slot`; xzor declares the exact type per component. */\n slots: {} = {};\n\n protected abstract buildRenderTree(builder: RenderTreeBuilder): void;\n\n // Lifecycle, in Blazor's order. `...Async` results re-render the component when they settle.\n protected onInitialized(): void {}\n protected onInitializedAsync(): Promise<void> | void {}\n protected onParametersSet(): void {}\n protected onParametersSetAsync(): Promise<void> | void {}\n protected onAfterRender(_firstRender: boolean): void {}\n protected onAfterRenderAsync(_firstRender: boolean): Promise<void> | void {}\n protected shouldRender(): boolean {\n return true;\n }\n /** Called when the component leaves the tree. */\n protected dispose(): void {}\n\n /** Re-renders this component. Event handlers it owns do this automatically. */\n stateHasChanged(): void {\n update(this);\n }\n}\n\ntype Hooks = {\n buildRenderTree(b: RenderTreeBuilder): void;\n onInitialized(): void;\n onInitializedAsync(): Promise<void> | void;\n onParametersSet(): void;\n onParametersSetAsync(): Promise<void> | void;\n onAfterRender(first: boolean): void;\n onAfterRenderAsync(first: boolean): Promise<void> | void;\n shouldRender(): boolean;\n dispose(): void;\n};\n\nconst hooks = (c: ComponentBase) => c as unknown as Hooks;\n\nexport class RenderTreeBuilder {\n readonly #root: VNode[] = [];\n readonly #open: (VElement | VRegion)[] = [];\n\n constructor(private readonly owner: ComponentBase) {}\n\n get nodes(): VNode[] {\n return this.#root;\n }\n\n #append(node: VNode): void {\n (this.#open.at(-1)?.children ?? this.#root).push(node);\n }\n\n #current(): VElement {\n const el = this.#open.at(-1);\n if (el?.kind !== \"element\") throw new Error(\"xzor: attribute outside of an element\");\n return el;\n }\n\n openElement(tag: string): void {\n const el: VElement = { kind: \"element\", tag, attrs: {}, events: {}, modifiers: {}, children: [] };\n this.#append(el);\n this.#open.push(el);\n }\n\n closeElement(): void {\n this.#open.pop();\n }\n\n openRegion(): void {\n const region: VRegion = { kind: \"region\", children: [] };\n this.#append(region);\n this.#open.push(region);\n }\n\n /** `@cascade:name(value)`: a region whose children see `value` under `name`; `fixed` keeps the first value. */\n openCascade(name: string, value: unknown, fixed?: boolean): void {\n const region: VRegion = { kind: \"region\", children: [], name, value, fixed: fixed === true };\n this.#append(region);\n this.#open.push(region);\n }\n\n closeRegion(): void {\n this.#open.pop();\n }\n\n /** `@ClientRoutes`/`@ServerRoutes`: renders the section that matches the current navigation. */\n addRoutes(engine: \"client\" | \"server\", table: RouteTable, sections: readonly RouteSection[]): void {\n const owner = this.owner as ComponentBase & Routed;\n const nav = navigationOf();\n let router = owner[ROUTER];\n if (!router) {\n router = owner[ROUTER] = {\n nav: engine === \"client\" ? nav : undefined,\n off: undefined,\n onError: undefined,\n caught: sections.find((s): s is Extract<RouteSection, { kind: \"catch\" }> => s.kind === \"catch\"),\n href: \"\",\n id: 0,\n route: undefined,\n section: -1,\n page: undefined,\n params: {},\n error: undefined,\n failed: false,\n };\n const failing = router;\n if (router.caught) {\n // The page's own failures reach this one handler; one raised by a page we left is dropped.\n router.onError = (err, id) => {\n if (id !== failing.id) return;\n failing.error = err;\n failing.failed = true;\n queueMicrotask(() => update(owner));\n };\n }\n // `@ServerRoutes` matches once on load: no listeners, no re-render.\n if (router.nav) router.off = router.nav.subscribe(() => renavigate(owner));\n }\n const state = router;\n const url = nav.current();\n if (url.href !== state.href || !state.route) {\n // A navigation clears the error the last page raised.\n state.failed = false;\n state.error = undefined;\n resolveRoute(state, table, sections, url);\n }\n const route = state.route!;\n const section = sections[state.section];\n const page = state.page;\n this.openCascade(\"route\", route);\n if (state.failed) {\n state.caught!.render(route, state.error)(this);\n } else if (page) {\n const entry = page;\n const fragment = ComponentBase.fragment((b) => b.#addPage(entry, state));\n if (section) (section.render as (r: Route, p: RenderFragment) => RenderFragment)(route, fragment)(this);\n else fragment(this);\n } else if (section) {\n (section.render as (r: Route) => RenderFragment)(route)(this);\n }\n this.closeRegion();\n }\n\n // Keyed by route family: navigating between routes of one family (or params only) keeps the page instance.\n #addPage(entry: RouteEntry, router: Router): void {\n this.#append({\n kind: \"component\",\n type: entry.component as Ctor<ComponentBase>,\n props: router.params,\n key: entry.family ?? entry.pattern,\n onError: router.onError,\n nav: router.id,\n });\n }\n\n addAttribute(name: string, value: unknown): void {\n const el = this.#current();\n if (value === false || value == null) delete el.attrs[name];\n else el.attrs[name] = value === true ? \"\" : String(value);\n }\n\n /** `@attributes`: each entry is added in order, so later attributes override it. */\n addAttributes(attrs: Record<string, unknown> | null | undefined): void {\n for (const [name, value] of Object.entries(attrs ?? {})) this.addAttribute(name, value);\n }\n\n /** `@onclick:preventDefault` and `@onclick:stopPropagation`, with or without a handler. */\n addEventModifier(event: string, modifier: Modifier, enabled: boolean): void {\n const el = this.#current();\n (el.modifiers[event] ??= {})[modifier] = enabled;\n }\n\n /** `@key`: list diffs match this element by key instead of position. */\n setKey(key: unknown): void {\n this.#current().key = key;\n }\n\n /** `@ref`: receives the DOM element (typed from its tag) after each render. */\n setRef<T extends string>(_tag: T, ref: (el: ElementOf<T>) => void): void {\n this.#current().ref = ref as (el: Element) => void;\n }\n\n addEventHandler<K extends keyof HTMLElementEventMap>(\n event: K,\n handler: (e: HTMLElementEventMap[K]) => unknown,\n ): void;\n addEventHandler(event: string, handler: Handler): void;\n addEventHandler(event: string, handler: (e: never) => unknown): void {\n this.#current().events[event] = handler as Handler;\n }\n\n addText(text: string): void {\n this.#append({ kind: \"text\", text });\n }\n\n /** `@fine`: the whole template, built once into the DOM; its bindings keep it current. */\n addFine(build: (parent: Node) => void): void {\n this.#append({ kind: \"fine\", build });\n }\n\n addContent(value: unknown): void {\n if (isFragment(value)) {\n this.openRegion();\n value(this);\n this.closeRegion();\n return;\n }\n // An empty text node keeps the slot, so siblings stay aligned when content comes and goes.\n if (value === false || value == null) value = \"\";\n this.#append({ kind: \"text\", text: String(value) });\n }\n\n addComponent<C extends ComponentBase>(\n type: Ctor<C>,\n props: Partial<C>,\n slots?: C[\"slots\"],\n extra?: { key?: unknown; ref?: (c: C) => void },\n ): void {\n this.#append({\n kind: \"component\",\n type,\n props: props as Record<string, unknown>,\n slots,\n key: extra?.key,\n ref: extra?.ref as ((c: ComponentBase) => void) | undefined,\n });\n }\n\n /** Wraps a handler passed to a child as an EventCallback (re-renders this owner). */\n callback<T>(handler: (arg: T) => unknown): EventCallback<T> {\n const owner = this.owner;\n if (isFine(owner))\n return (arg: T) => {\n const result = handler(arg);\n fineHooks!.handled(owner, result);\n return result;\n };\n return (arg: T) => {\n const result = handler(arg);\n update(owner);\n if (result instanceof Promise) void result.then(() => update(owner));\n return result;\n };\n }\n}\n\n// Inputs keep live state in properties, so bound attributes are mirrored onto them.\nfunction setAttr(el: Element, name: string, value: string): void {\n el.setAttribute(name, value);\n if (name === \"value\" && \"value\" in el) (el as HTMLInputElement).value = value;\n if (name === \"checked\" && \"checked\" in el) (el as HTMLInputElement).checked = true;\n}\n\nfunction removeAttr(el: Element, name: string): void {\n el.removeAttribute(name);\n if (name === \"value\" && \"value\" in el) (el as HTMLInputElement).value = \"\";\n if (name === \"checked\" && \"checked\" in el) (el as HTMLInputElement).checked = false;\n}\n\n/** What `@source-crafter/xzor-runtime/model` installs to learn which models a render read. */\nexport type RenderObserver = {\n begin(component: ComponentBase): void;\n end(component: ComponentBase): void;\n dispose(component: ComponentBase): void;\n};\n\nlet observer: RenderObserver | undefined;\n\n/** @internal Set by the model entry; the renderer costs one null check while none is installed. */\nexport function setRenderObserver(o: RenderObserver | undefined): void {\n observer = o;\n}\n\nfunction render(component: ComponentBase): VNode[] {\n const builder = new RenderTreeBuilder(component);\n if (observer === undefined) hooks(component).buildRenderTree(builder);\n else {\n observer.begin(component);\n try {\n hooks(component).buildRenderTree(builder);\n } finally {\n observer.end(component);\n }\n }\n return builder.nodes;\n}\n\n// After-render callbacks wait until the outermost render pass has touched the DOM.\nlet depth = 0;\nlet pass = 0;\nconst afterRender: (() => void)[] = [];\n\nfunction batch(fn: () => void): void {\n if (depth++ === 0) pass++;\n try {\n fn();\n } finally {\n if (--depth === 0) for (const done of afterRender.splice(0)) done();\n }\n}\n\nfunction settle(component: ComponentBase, result: Promise<void> | void, node?: VComponent): void {\n if (!(result instanceof Promise)) return;\n void result.then(() => update(component), node?.onError && ((err: unknown) => fail(node, err)));\n}\n\n/** `@catch`: the failure is reported with the navigation the page belongs to, so a late one can be dropped. */\nfunction fail(v: VComponent, err: unknown): void {\n if (v.onError) v.onError(err, v.mounted?.nav ?? v.nav ?? 0);\n else rethrow(err);\n}\n\nfunction parametersSet(component: ComponentBase): void {\n hooks(component).onParametersSet();\n settle(component, hooks(component).onParametersSetAsync());\n}\n\n/** `static cascades` on a component class: one `[property, cascade name]` pair per `@Cascade` member. */\ntype CascadeList = readonly (readonly [prop: string, name: string])[];\n\nconst cascadesOf = (type: Function): CascadeList | undefined => (type as { cascades?: CascadeList }).cascades;\n\nconst fields = (c: ComponentBase) => c as unknown as Record<string, unknown>;\n\nfunction findCascade(scope: CascadeRecord | undefined, name: string): CascadeRecord | undefined {\n for (let s = scope; s; s = s.parent) if (s.name === name) return s;\n return undefined;\n}\n\n/** Gives each `@Cascade` member the nearest provider's value and subscribes to later changes. */\nfunction resolveCascades(instance: ComponentBase, type: Ctor<ComponentBase>, scope: CascadeRecord | undefined): void {\n const list = cascadesOf(type);\n if (!list) return;\n for (const [prop, name] of list) {\n const record = findCascade(scope, name);\n if (!record) continue;\n fields(instance)[prop] = record.value;\n // Several members may share one name; the set keeps one entry per instance, in subscription order.\n if (!record.fixed) (record.consumers ??= new Set()).add(instance);\n }\n}\n\nfunction unsubscribeCascades(instance: ComponentBase, type: Ctor<ComponentBase>, scope: CascadeRecord | undefined): void {\n const list = cascadesOf(type);\n if (!list) return;\n for (const [, name] of list) findCascade(scope, name)?.consumers?.delete(instance);\n}\n\n// Assigning before the region's children are patched lets a consumer whose props also changed\n// render once with both; the leftovers are told afterwards.\nfunction assignCascade(record: CascadeRecord, consumers: readonly ComponentBase[]): void {\n for (const consumer of consumers) {\n for (const [prop, name] of cascadesOf(consumer.constructor)!) {\n if (name === record.name) fields(consumer)[prop] = record.value;\n }\n }\n}\n\n// A changed cascade takes the same path as a changed prop: onParametersSet, then re-render.\nfunction notifyCascade(consumers: readonly ComponentBase[]): void {\n for (const consumer of consumers) {\n const m = mountedComponents.get(consumer);\n if (!m || m.pass === pass) continue;\n m.pass = pass;\n try {\n parametersSet(consumer);\n update(consumer);\n } catch (err) {\n // One consumer's failure must not keep the rest from seeing the new value.\n rethrow(err);\n }\n }\n}\n\nfunction queueAfterRender(component: ComponentBase, first: boolean): void {\n afterRender.push(() => {\n hooks(component).onAfterRender(first);\n void hooks(component).onAfterRenderAsync(first);\n });\n}\n\nfunction update(component: ComponentBase): void {\n batch(() => {\n const m = mountedComponents.get(component);\n const parent = m?.anchor.parentNode;\n if (!m || !parent || !hooks(component).shouldRender()) return;\n const next = render(component);\n patchList(parent, m.tree, next, m.anchor, component, m.app, m.scope);\n m.tree = next;\n queueAfterRender(component, false);\n });\n}\n\n// `into` is the placeholder left by an async component; it keeps its anchor and the nodes go before it.\nfunction mountComponent(\n component: ComponentBase,\n app: IApplication | undefined,\n scope: CascadeRecord | undefined,\n into?: Mounted,\n node?: VComponent,\n): { nodes: Node[]; mounted: Mounted } {\n hooks(component).onInitialized();\n settle(component, hooks(component).onInitializedAsync(), node);\n parametersSet(component);\n const tree = render(component);\n const mounted = into ?? { tree, anchor: document.createComment(\"\"), app, scope, latest: undefined, pass };\n if (into) into.tree = tree;\n mountedComponents.set(component, mounted);\n const nodes = tree.flatMap((v) => create(v, component, app, scope));\n queueAfterRender(component, true);\n if (!into) nodes.push(mounted.anchor);\n return { nodes, mounted };\n}\n\nfunction construct(type: Ctor<ComponentBase>, app: IApplication | undefined): ComponentBase | Promise<ComponentBase> {\n const inject = (type as { inject?: readonly string[] }).inject;\n if (!inject?.length) return new type();\n const made = app?.createComponent?.(type);\n if (made) return made;\n if (app) throw new Error(`xzor: ${type.name} is not registered with the application`);\n throw new Error(`xzor: ${type.name} needs injected services (${inject.join(\", \")}) but has no application`);\n}\n\nfunction arrive(mounted: Mounted, instance: ComponentBase): void {\n const v = mounted.latest;\n const parent = mounted.anchor.parentNode;\n mounted.latest = undefined;\n // No vnode: removed before arrival. No parent: the anchor was detached without a dispose.\n if (!v || !parent) {\n disposeInstance(instance);\n return;\n }\n try {\n batch(() => {\n applyProps(instance, v);\n resolveCascades(instance, v.type, mounted.scope);\n v.ref?.(instance);\n for (const node of mountComponent(instance, mounted.app, mounted.scope, mounted, v).nodes)\n parent.insertBefore(node, mounted.anchor);\n v.instance = instance;\n });\n } catch (err) {\n fail(v, err);\n if (!v.instance) {\n mountedComponents.delete(instance);\n observer?.dispose(instance);\n unsubscribeCascades(instance, v.type, mounted.scope);\n // Nodes of the failed render were never inserted; keep only the empty placeholder.\n const partial = mounted.tree;\n mounted.tree = [];\n for (const node of partial) {\n try {\n dispose(node);\n } catch (disposeErr) {\n rethrow(disposeErr);\n }\n }\n }\n }\n}\n\nfunction applyProps(instance: ComponentBase, v: VComponent): void {\n Object.assign(instance, v.props);\n if (v.slots) instance.slots = v.slots;\n}\n\nfunction propsChanged(o: VComponent, n: VComponent): boolean {\n // Slot lambdas are recreated on every parent render, so a child with slots always refreshes.\n if (n.slots) return true;\n for (const [key, value] of Object.entries(n.props)) {\n // Like Blazor, objects may have been mutated, so they always count as changed.\n if (!Object.is(o.props[key], value) || (typeof value === \"object\" && value !== null)) return true;\n }\n return false;\n}\n\nconst eventNames = (v: VElement) => new Set([...Object.keys(v.events), ...Object.keys(v.modifiers)]);\n\nfunction listen(el: Element, event: string): void {\n elementHandlers.get(el)!.listening.add(event);\n el.addEventListener(event, (e) => {\n const record = elementHandlers.get(el);\n if (!record) return;\n const mods = record.modifiers[event];\n if (mods?.preventDefault) e.preventDefault();\n if (mods?.stopPropagation) e.stopPropagation();\n const handler = record.events[event];\n if (!handler) return;\n const result = handler(e);\n if (isFine(record.owner)) return fineHooks!.handled(record.owner, result);\n update(record.owner);\n if (result instanceof Promise) void result.then(() => update(record.owner));\n });\n}\n\nfunction create(\n v: VNode,\n owner: ComponentBase,\n app: IApplication | undefined,\n scope: CascadeRecord | undefined,\n svg = false,\n): Node[] {\n switch (v.kind) {\n case \"text\":\n v.dom = document.createTextNode(v.text);\n return [v.dom];\n case \"element\": {\n const el = svg || v.tag === \"svg\" ? document.createElementNS(SVG, v.tag) : document.createElement(v.tag);\n for (const [name, value] of Object.entries(v.attrs)) setAttr(el, name, value);\n elementHandlers.set(el, { owner, events: v.events, modifiers: v.modifiers, listening: new Set() });\n for (const event of eventNames(v)) listen(el, event);\n const inner = inSvg(el);\n for (const child of v.children) el.append(...create(child, owner, app, scope, inner));\n v.dom = el;\n v.ref?.(el);\n return [el];\n }\n case \"region\": {\n v.anchor = document.createComment(\"\");\n // The record outlives the vnode: later renders carry it over in `patch`.\n const inner =\n v.name === undefined\n ? scope\n : (v.cascade = { name: v.name, value: v.value, fixed: v.fixed === true, consumers: undefined, parent: scope });\n return [...v.children.flatMap((c) => create(c, owner, app, inner, svg)), v.anchor];\n }\n case \"component\": {\n if (!v.onError) return createComponent(v, app, scope);\n try {\n return createComponent(v, app, scope);\n } catch (err) {\n return failedComponent(v, err, app, scope);\n }\n }\n case \"fine\": {\n if (!fineHooks) throw new Error(\"xzor: a @fine component needs @source-crafter/xzor-runtime/model\");\n return fineNodes((v.root = fineHooks.create(v.build, owner, app, scope)));\n }\n }\n}\n\nfunction createComponent(v: VComponent, app: IApplication | undefined, scope: CascadeRecord | undefined): Node[] {\n const made = construct(v.type, app);\n if (made instanceof Promise) {\n const mounted: Mounted = (v.mounted = {\n tree: [],\n anchor: document.createComment(\"\"),\n app,\n scope,\n latest: v,\n pass,\n });\n made.then(\n (instance) => arrive(mounted, instance),\n (err) => {\n const latest = mounted.latest;\n mounted.latest = undefined;\n if (latest) fail(latest, err);\n // A routed page we already left: its failure is stale, like any other.\n else if (!v.onError) rethrow(err);\n },\n );\n return [mounted.anchor];\n }\n v.instance = made;\n applyProps(made, v);\n resolveCascades(made, v.type, scope);\n v.ref?.(made);\n const { nodes, mounted } = mountComponent(made, app, scope, undefined, v);\n v.mounted = mounted;\n return nodes;\n}\n\n// `@catch`: the page's nodes never reached the DOM, so only an anchor stays until the block re-renders.\nfunction failedComponent(\n v: VComponent,\n err: unknown,\n app: IApplication | undefined,\n scope: CascadeRecord | undefined,\n): Node[] {\n const instance = v.instance;\n v.instance = undefined;\n if (instance) {\n // Children the page had already mounted go with it, or they keep taking cascades and hooks.\n const partial = mountedComponents.get(instance);\n mountedComponents.delete(instance);\n observer?.dispose(instance);\n unsubscribeCascades(instance, v.type, scope);\n for (const node of partial?.tree ?? []) {\n try {\n dispose(node);\n } catch (disposeErr) {\n rethrow(disposeErr);\n }\n }\n }\n v.mounted = { tree: [], anchor: document.createComment(\"\"), app, scope, latest: undefined, pass };\n fail(v, err);\n return [v.mounted.anchor];\n}\n\nfunction nodesOf(v: VNode): Node[] {\n switch (v.kind) {\n case \"text\":\n case \"element\":\n return [v.dom!];\n case \"region\":\n return [...v.children.flatMap(nodesOf), v.anchor!];\n case \"component\":\n return [...v.mounted!.tree.flatMap(nodesOf), v.mounted!.anchor];\n case \"fine\":\n return fineNodes(v.root!);\n }\n}\n\nfunction same(o: VNode, n: VNode): boolean {\n if (o.kind !== n.kind) return false;\n if (o.kind === \"element\") return o.tag === (n as VElement).tag && o.key === (n as VElement).key;\n if (o.kind === \"component\") return o.type === (n as VComponent).type && o.key === (n as VComponent).key;\n // A provider is only ever patched against the same provider; anything else replaces it.\n if (o.kind === \"region\") return o.name === (n as VRegion).name && o.fixed === (n as VRegion).fixed;\n return true;\n}\n\nfunction dispose(v: VNode): void {\n switch (v.kind) {\n case \"element\":\n v.children.forEach(dispose);\n return;\n case \"region\":\n // The provider goes away with its region, so its consumers need not unsubscribe one by one.\n if (v.cascade) v.cascade.consumers = undefined;\n v.children.forEach(dispose);\n return;\n case \"component\":\n if (!v.instance) {\n if (v.mounted) v.mounted.latest = undefined;\n return;\n }\n v.mounted?.tree.forEach(dispose);\n mountedComponents.delete(v.instance);\n unsubscribeCascades(v.instance, v.type, v.mounted?.scope);\n disposeInstance(v.instance);\n return;\n case \"fine\":\n fineHooks!.dispose(v.root!);\n return;\n }\n}\n\nfunction disposeInstance(c: ComponentBase): void {\n observer?.dispose(c);\n (c as Routed)[ROUTER]?.off?.();\n hooks(c).dispose();\n const d = c as unknown as Record<symbol, (() => unknown) | undefined>;\n d[wellKnown.dispose]?.();\n surface(d[wellKnown.asyncDispose]?.());\n}\n\nfunction remove(parent: Node, v: VNode): void {\n for (const node of nodesOf(v)) parent.removeChild(node);\n dispose(v);\n}\n\nfunction patch(\n o: VNode,\n n: VNode,\n owner: ComponentBase,\n app: IApplication | undefined,\n scope: CascadeRecord | undefined,\n): void {\n switch (n.kind) {\n case \"text\": {\n const dom = (n.dom = (o as VText).dom!);\n if (dom.data !== n.text) dom.data = n.text;\n return;\n }\n case \"element\": {\n const old = o as VElement;\n const el = (n.dom = old.dom!);\n for (const name of Object.keys(old.attrs)) if (!(name in n.attrs)) removeAttr(el, name);\n for (const [name, value] of Object.entries(n.attrs)) {\n const live = name === \"value\" ? (el as HTMLInputElement).value : undefined;\n if (old.attrs[name] !== value || (live !== undefined && live !== value)) setAttr(el, name, value);\n }\n const record = elementHandlers.get(el)!;\n record.events = n.events;\n record.modifiers = n.modifiers;\n for (const event of eventNames(n)) if (!record.listening.has(event)) listen(el, event);\n patchList(el, old.children, n.children, null, owner, app, scope);\n n.ref?.(el);\n return;\n }\n case \"region\": {\n const old = o as VRegion;\n const anchor = (n.anchor = old.anchor!);\n // The provider record is carried like the anchor, so consumers keep their subscription.\n const record = old.cascade;\n let subscribers: ComponentBase[] | undefined;\n let inner = scope;\n if (record) {\n record.parent = scope;\n n.cascade = record;\n inner = record;\n // A fixed provider keeps the value of its first render, for consumers mounted later too.\n if (!record.fixed && !Object.is(record.value, n.value)) {\n record.value = n.value;\n if (record.consumers?.size) {\n subscribers = [...record.consumers];\n assignCascade(record, subscribers);\n }\n }\n }\n patchList(anchor.parentNode!, old.children, n.children, anchor, owner, app, inner);\n // Consumers that this patch mounted or already refreshed skip the notification.\n if (subscribers) notifyCascade(subscribers);\n return;\n }\n case \"component\": {\n const old = o as VComponent;\n n.mounted = old.mounted;\n if (!old.instance) {\n // Still waiting for its instance: carry the newest props to arrival.\n if (n.mounted!.latest) n.mounted!.latest = n;\n return;\n }\n const instance = (n.instance = old.instance);\n // A page whose navigation moved on takes its params again even when they compare equal.\n const changed = n.nav !== old.nav || propsChanged(old, n);\n if (n.nav !== undefined) n.mounted!.nav = n.nav;\n applyProps(instance, n);\n n.ref?.(instance);\n if (changed) {\n n.mounted!.pass = pass;\n parametersSet(instance);\n update(instance);\n }\n return;\n }\n case \"fine\": {\n // Built once: a re-render (`stateHasChanged`) re-runs the bindings, for changes nothing tracks.\n fineHooks!.refresh((n.root = (o as VFine).root!));\n return;\n }\n }\n}\n\nconst keyOf = (v: VNode | undefined) => (v && (v.kind === \"element\" || v.kind === \"component\") ? v.key : undefined);\n\nfunction patchList(\n parent: Node,\n old: VNode[],\n next: VNode[],\n end: Node | null,\n owner: ComponentBase,\n app: IApplication | undefined,\n scope: CascadeRecord | undefined,\n): void {\n if (old.some((v) => keyOf(v) != null) || next.some((v) => keyOf(v) != null)) {\n patchKeyed(parent, old, next, end, owner, app, scope);\n return;\n }\n // Positional diff; regions keep variable-length blocks from misaligning their siblings.\n for (let i = 0; i < next.length; i++) {\n const n = next[i]!;\n const o = old[i];\n if (o && same(o, n)) {\n patch(o, n, owner, app, scope);\n continue;\n }\n const ref = o ? nodesOf(o)[0]! : end;\n for (const node of create(n, owner, app, scope, inSvg(parent))) parent.insertBefore(node, ref);\n if (o) remove(parent, o);\n }\n for (const o of old.slice(next.length)) remove(parent, o);\n}\n\n/** `@key` diff: keyed nodes are matched by key and moved; unkeyed ones by position. */\nfunction patchKeyed(\n parent: Node,\n old: VNode[],\n next: VNode[],\n end: Node | null,\n owner: ComponentBase,\n app: IApplication | undefined,\n scope: CascadeRecord | undefined,\n): void {\n const byKey = new Map<unknown, VNode>();\n for (const o of old) if (keyOf(o) != null) byKey.set(keyOf(o), o);\n const used = new Set<VNode>();\n const matches = next.map((n, i) => {\n const key = keyOf(n);\n const o = key != null ? byKey.get(key) : keyOf(old[i]) == null ? old[i] : undefined;\n if (o && !used.has(o) && same(o, n)) {\n used.add(o);\n return o;\n }\n return undefined;\n });\n for (const o of old) if (!used.has(o)) remove(parent, o);\n let ref = end;\n for (let i = next.length - 1; i >= 0; i--) {\n const n = next[i]!;\n const o = matches[i];\n let nodes: Node[];\n if (o) {\n patch(o, n, owner, app, scope);\n nodes = nodesOf(n);\n } else {\n nodes = create(n, owner, app, scope, inSvg(parent));\n }\n for (let j = nodes.length - 1; j >= 0; j--) {\n const node = nodes[j]!;\n if (node.parentNode !== parent || node.nextSibling !== ref) parent.insertBefore(node, ref);\n ref = node;\n }\n }\n}\n\nfunction resolveTarget(target: string | Element): Element {\n if (typeof target !== \"string\") return target;\n const found = SELECTOR.test(target) ? document.querySelector(target) : document.getElementById(target);\n if (!found) throw new Error(`xzor: mount target \"${target}\" not found`);\n return found;\n}\n\n/** `target` is an element, an element id, or a selector (anything containing `#`, `.` or `[`). */\nexport function mount<C extends ComponentBase>(type: Ctor<C>, target: string | Element, app?: IApplication): C {\n const host = resolveTarget(target);\n const root = construct(type, app);\n if (root instanceof Promise) throw new Error(`xzor: root component ${type.name} cannot be asynchronous`);\n batch(() => host.replaceChildren(...mountComponent(root, app, undefined).nodes));\n surface(app?.onStarted?.());\n return root as C;\n}\n\n/** An `<a>` that carries `activeClass` while the current URL is on its `href`; it follows navigation itself. */\nexport class NavLink extends ComponentBase {\n href = \"\";\n activeClass = \"active\";\n match: \"prefix\" | \"exact\" = \"prefix\";\n\n declare slots: { default?: () => RenderFragment };\n\n #path = \"\";\n // `href` resolved against the base URL, encoded like `location.pathname`; `null` for another origin.\n #for: string | undefined;\n #target: string | null = null;\n #off: (() => void) | undefined;\n\n protected override onInitialized(): void {\n const nav = navigationOf();\n this.#path = nav.current().pathname;\n const fn = () => {\n const path = nav.current().pathname;\n if (path === this.#path) return;\n this.#path = path;\n this.stateHasChanged();\n };\n this.#off = nav.observe ? nav.observe(fn) : nav.subscribe(fn);\n }\n\n protected override dispose(): void {\n this.#off?.();\n }\n\n #active(): boolean {\n if (this.#for !== this.href) {\n this.#for = this.href;\n const url = new URL(this.href, document.baseURI);\n this.#target = url.origin === location.origin ? url.pathname : null;\n }\n const target = this.#target;\n if (target === null) return false;\n const path = this.#path;\n // The root is every path's prefix, so it only ever matches exactly.\n if (this.match === \"exact\" || target === `${basePath()}/`) return path === target;\n return path === target || path.startsWith(target.endsWith(\"/\") ? target : `${target}/`);\n }\n\n protected override buildRenderTree(b: RenderTreeBuilder): void {\n b.openElement(\"a\");\n b.addAttribute(\"href\", this.href);\n if (this.#active()) {\n b.addAttribute(\"class\", this.activeClass);\n b.addAttribute(\"aria-current\", \"page\");\n }\n b.addContent(this.slots.default?.() ?? null);\n b.closeElement();\n }\n}\n"
|
|
5
|
+
"// xzor runtime: the RenderTreeBuilder that generated components call into, and a DOM\n// renderer that re-renders one component at a time and patches only what changed.\n\ntype Handler = (e: Event) => unknown;\ntype Modifier = \"preventDefault\" | \"stopPropagation\";\ntype Modifiers = Partial<Record<Modifier, boolean>>;\n\nexport type VText = { kind: \"text\"; text: string; dom?: Text };\n\nexport type VElement = {\n kind: \"element\";\n tag: string;\n attrs: Record<string, string>;\n events: Record<string, Handler>;\n modifiers: Record<string, Modifiers>;\n children: VNode[];\n key?: unknown;\n ref?: (el: Element) => void;\n dom?: Element;\n};\n\n/** One `@cascade:name(value)` provider; created on the region's first render and carried across the next ones. */\ntype CascadeRecord = {\n name: string;\n value: unknown;\n fixed: boolean;\n consumers: Set<ComponentBase> | undefined;\n parent: CascadeRecord | undefined;\n};\n\n/** Output of one `@if`/`@for`/`@switch`/`@cascade`; its contents are diffed in isolation. */\nexport type VRegion = {\n kind: \"region\";\n children: VNode[];\n anchor?: Comment;\n // `@cascade:name(value)` describes its provider with plain fields; `cascade` is the record they create.\n name?: string;\n value?: unknown;\n fixed?: boolean;\n cascade?: CascadeRecord;\n};\n\n/** A child component; the diff decides whether it keeps its previous instance. */\nexport type VComponent = {\n kind: \"component\";\n type: Ctor<ComponentBase>;\n props: Record<string, unknown>;\n slots?: object;\n key?: unknown;\n ref?: (c: ComponentBase) => void;\n instance?: ComponentBase;\n mounted?: Mounted;\n // `@catch`: set on a routed page, it takes the failures the page itself causes instead of `rethrow`.\n onError?: (err: unknown, nav: number) => void;\n // The navigation that put this page here; a patch refreshes its params whenever it moves on.\n nav?: number;\n};\n\nexport type VNode = VText | VElement | VRegion | VComponent | VFine;\n\n/** A `@fine` component's DOM: built once by `fine.ts`, between two comments; patches only refresh it. */\nexport type VFine = { kind: \"fine\"; build: (parent: Node) => void; root?: FineRoot };\n\n/** @internal What `fine.ts` keeps for one fine vnode. */\nexport type FineRoot = { bindings: unknown; start: Comment; end: Comment };\n\ntype FineHooks = {\n create(build: (parent: Node) => void, owner: ComponentBase, app: IApplication | undefined, scope: unknown): FineRoot;\n refresh(root: FineRoot): void;\n dispose(root: FineRoot): void;\n /** A handler of a fine component ran: it re-runs the bindings that read nothing tracked. */\n handled(owner: ComponentBase, result: unknown): void;\n};\n\nlet fineHooks: FineHooks | undefined;\n\n/** @internal On `FineComponent.prototype`: its handlers and callbacks write tracked fields, so nothing re-renders it. */\nexport const FINE: unique symbol = Symbol(\"xzor.fine\");\n\nconst isFine = (c: ComponentBase): boolean => (c as unknown as Record<symbol, unknown>)[FINE] === true;\n\n/** @internal Set by `fine.ts` (the model entry), so the renderer pays nothing without it. */\nexport function setFineHooks(h: FineHooks): void {\n fineHooks = h;\n}\n\n/**\n * @internal A virtual-DOM island inside a fine template: renders `build` before `end`, patching `old`.\n * `scope` is the cascade scope the fine component was mounted in.\n */\nexport function patchIsland(\n owner: ComponentBase,\n app: IApplication | undefined,\n scope: unknown,\n end: Node,\n old: VNode[],\n build: (b: RenderTreeBuilder) => void,\n): VNode[] {\n const builder = new RenderTreeBuilder(owner);\n build(builder);\n const next = builder.nodes;\n batch(() => patchList(end.parentNode!, old, next, end, owner, app, scope as CascadeRecord | undefined));\n return next;\n}\n\n/** @internal Disposes an island's tree; its DOM goes with the region that holds it. */\nexport function disposeIsland(tree: VNode[]): void {\n for (const v of tree) dispose(v);\n}\n\n/** @internal Whether a value is markup (`RenderFragment`). */\nexport const $isFragment = (value: unknown): boolean => isFragment(value);\n\nexport const SVG = \"http://www.w3.org/2000/svg\";\n/** Whether children of `parent` belong to the SVG namespace (`<foreignObject>` holds HTML). */\nexport const $inSvg = (parent: Node): boolean => (parent as Element).namespaceURI === SVG && parent.nodeName !== \"foreignObject\";\nconst inSvg = $inSvg;\n\nfunction fineNodes(root: FineRoot): Node[] {\n const nodes: Node[] = [];\n for (let n: Node | null = root.start; n !== null; n = n.nextSibling) {\n nodes.push(n);\n if (n === root.end) break;\n }\n return nodes;\n}\n\n/** One entry of the generated `.xzor/routes.ts` table; `match` converts the path segments or rejects them. */\nexport type RouteEntry = {\n tag: string | undefined;\n pattern: string;\n /** The page's shortest pattern this one extends: routes of one family share the page instance. */\n family?: string;\n component: unknown;\n match: (s: string[]) => Record<string, unknown> | null;\n};\n\n/** The project's routes, in precedence order. */\nexport type RouteTable = readonly RouteEntry[];\n\n/**\n * The state of the current navigation, published to the routes block and as the cascading value `route`.\n * `Tags` maps each route tag to its params; the generated table fixes it (`AppRoute`) so `is` checks tags.\n */\nexport class Route<P = Record<string, unknown>, Tags extends object = Record<string, Record<string, unknown>>> {\n readonly #nav: Navigation | undefined;\n\n constructor(\n readonly path: string,\n readonly tag: (keyof Tags & string) | undefined,\n readonly params: P,\n readonly query: URLSearchParams,\n readonly match: Record<string, string>,\n nav?: Navigation,\n ) {\n this.#nav = nav;\n }\n\n /** Narrows `params` to the routes carrying `tag`. */\n is<K extends keyof Tags & string>(tag: K): this is Route<Tags[K], Tags> & { readonly tag: K } {\n return this.tag === tag;\n }\n\n /** History navigation under `@ClientRoutes`; `@ServerRoutes` loads the url. */\n navigate(url: string, opts?: { replace?: boolean }): void {\n if (this.#nav) this.#nav.navigate(url, opts?.replace === true);\n else location.href = url;\n }\n}\n\n/** One section of a `@ClientRoutes`/`@ServerRoutes` block; xzor emits these in source order. */\nexport type RouteSection =\n | { kind: \"tag\"; tag: string; render: (route: Route, page: RenderFragment) => RenderFragment }\n | { kind: \"regex\"; re: RegExp; page: boolean; render: (route: Route, page: RenderFragment) => RenderFragment }\n | {\n kind: \"pattern\";\n match: (segments: string[]) => Record<string, string> | null;\n page: boolean;\n render: (route: Route, page: RenderFragment) => RenderFragment;\n }\n | { kind: \"notFound\"; render: (route: Route) => RenderFragment }\n | { kind: \"catch\"; render: (route: Route, error: unknown) => RenderFragment }\n | { kind: \"default\"; render: (route: Route, page: RenderFragment) => RenderFragment };\n\n/** How `@ClientRoutes` reaches the browser's history; `setNavigationForTests` swaps it. */\nexport type Navigation = {\n current(): URL;\n navigate(url: string, replace: boolean): void;\n subscribe(fn: () => void): () => void;\n /** Like `subscribe`, without taking over link clicks (a `NavLink` only watches). Defaults to `subscribe`. */\n observe?(fn: () => void): () => void;\n};\n\n// One set for the whole page: the listeners below exist only while a routes block is mounted.\nconst navigated = new Set<() => void>();\n// NavLinks: notified like routes blocks, but they never intercept clicks.\nconst observers = new Set<() => void>();\nconst EXTERNAL = /(^|\\s)external(\\s|$)/;\nlet transitions = false;\n\n/** Commits each navigation inside `document.startViewTransition` where the browser has it. */\nexport function viewTransitions(on: boolean): void {\n transitions = on;\n}\n\nfunction notifyNavigated(): void {\n const doc = document as Document & { startViewTransition?: (update: () => void) => { ready: Promise<unknown> } };\n // `ready` rejects when the browser skips the animation (a hidden tab, a newer navigation): the update still ran.\n if (transitions && doc.startViewTransition) doc.startViewTransition(notifyAll).ready.catch(noop);\n else notifyAll();\n}\n\nfunction notifyAll(): void {\n for (const fn of [...navigated]) fn();\n for (const fn of [...observers]) fn();\n}\n\nconst onPopState = (): void => notifyNavigated();\n\nfunction onLinkClick(e: MouseEvent): void {\n if (e.defaultPrevented || e.button !== 0 || e.ctrlKey || e.metaKey || e.shiftKey || e.altKey) return;\n const anchor = (e.target as Element | null)?.closest?.(\"a\");\n const href = anchor?.getAttribute(\"href\");\n if (!anchor || href == null || href.startsWith(\"#\")) return;\n const frame = anchor.getAttribute(\"target\");\n if ((frame !== null && frame !== \"_self\") || anchor.hasAttribute(\"download\")) return;\n const rel = anchor.getAttribute(\"rel\");\n if (rel !== null && EXTERNAL.test(rel)) return;\n // `<base href>` is what the browser resolves a relative link against, so the router has to agree.\n const url = new URL(href, document.baseURI);\n if (url.origin !== location.origin) return;\n // Moving inside the page the user is already on is the browser's job, not a navigation.\n if (url.hash !== \"\" && url.pathname === location.pathname && url.search === location.search) return;\n e.preventDefault();\n browserNavigation.navigate(url.href, false);\n}\n\n// Renders read the current URL every time; it is only parsed again once the address changed.\nlet currentUrl: URL | undefined;\n\nconst browserNavigation: Navigation = {\n current: () => (currentUrl?.href === location.href ? currentUrl : (currentUrl = new URL(location.href))),\n navigate(url, replace) {\n const href = new URL(url, document.baseURI).href;\n if (replace) history.replaceState(null, \"\", href);\n else history.pushState(null, \"\", href);\n notifyNavigated();\n },\n subscribe(fn) {\n navigated.add(fn);\n if (navigated.size === 1) {\n if (observers.size === 0) window.addEventListener(\"popstate\", onPopState);\n document.addEventListener(\"click\", onLinkClick);\n }\n return () => {\n navigated.delete(fn);\n if (navigated.size === 0) {\n if (observers.size === 0) window.removeEventListener(\"popstate\", onPopState);\n document.removeEventListener(\"click\", onLinkClick);\n }\n };\n },\n observe(fn) {\n observers.add(fn);\n if (observers.size === 1 && navigated.size === 0) window.addEventListener(\"popstate\", onPopState);\n return () => {\n observers.delete(fn);\n if (observers.size === 0 && navigated.size === 0) window.removeEventListener(\"popstate\", onPopState);\n };\n },\n};\n\nlet testNavigation: Navigation | undefined;\n\n/** @internal Swaps in a memory navigation; set it before mounting the routes block. */\nexport function setNavigationForTests(nav: Navigation | undefined): void {\n testNavigation = nav;\n}\n\nconst navigationOf = (): Navigation => testNavigation ?? browserNavigation;\n\n/** What one mounted routes block keeps between renders. */\ntype Router = {\n // Set under `@ClientRoutes` only: it is also what `route.navigate` uses.\n nav: Navigation | undefined;\n off: (() => void) | undefined;\n onError: ((err: unknown, nav: number) => void) | undefined;\n caught: Extract<RouteSection, { kind: \"catch\" }> | undefined;\n href: string;\n // Counts the navigations this block has resolved; a failure stamped with an older one is stale.\n id: number;\n route: Route | undefined;\n // Index into the sections of the current render, or -1.\n section: number;\n page: RouteEntry | undefined;\n params: Record<string, unknown>;\n error: unknown;\n failed: boolean;\n};\n\nconst ROUTER: unique symbol = Symbol(\"xzor.router\");\ntype Routed = { [ROUTER]?: Router };\n\nfunction segmentsOf(pathname: string): string[] {\n const rest = pathname.startsWith(\"/\") ? pathname.slice(1) : pathname;\n return rest === \"\" ? [] : rest.split(\"/\");\n}\n\nlet baseFor: string | undefined;\nlet base = \"\";\n\n/** The path of `<base href>` without its last segment: \"\" without one, \"/docs\" under `<base href=\"/docs/\">`. */\nexport function basePath(): string {\n const uri = document.baseURI;\n if (uri !== baseFor) {\n baseFor = uri;\n const path = document.querySelector(\"base[href]\") ? new URL(uri).pathname : \"/\";\n base = path.slice(0, path.lastIndexOf(\"/\"));\n }\n return base;\n}\n\n/** The pathname routes match: relative to `basePath()`, starting with `/`. */\nfunction routePath(pathname: string): string {\n const b = basePath();\n return b !== \"\" && (pathname === b || pathname.startsWith(`${b}/`)) ? pathname.slice(b.length) || \"/\" : pathname;\n}\n\n/** The section's named groups, or null; `lastIndex` is reset in case the regex carries `g` or `y`. */\nfunction groupsOf(re: RegExp, pathname: string): Record<string, string> | null {\n re.lastIndex = 0;\n const m = re.exec(pathname);\n return m ? (m.groups ?? {}) : null;\n}\n\n/** Spec order: a page route picks among the `(page)` sections, otherwise the page-less ones decide. */\nfunction resolveRoute(router: Router, table: RouteTable, sections: readonly RouteSection[], url: URL): void {\n const path = routePath(url.pathname);\n const segments = segmentsOf(path);\n let page: RouteEntry | undefined;\n let params: Record<string, unknown> | null = null;\n for (const entry of table) {\n params = entry.match(segments);\n if (params) {\n page = entry;\n break;\n }\n }\n let section = -1;\n let match: Record<string, string> = {};\n for (let i = 0; i < sections.length && section < 0; i++) {\n const s = sections[i]!;\n if (page) {\n if (s.kind === \"tag\") {\n if (s.tag === page.tag) section = i;\n } else if (s.kind === \"regex\" && s.page) {\n const groups = groupsOf(s.re, path);\n if (groups) {\n section = i;\n match = groups;\n }\n } else if (s.kind === \"pattern\" && s.page) {\n const own = s.match(segments);\n if (own) {\n section = i;\n // The page keeps the table's converted params; the pattern only decides that this section applies.\n match = own;\n }\n }\n } else if (s.kind === \"regex\" && !s.page) {\n const groups = groupsOf(s.re, path);\n if (groups) {\n section = i;\n match = groups;\n }\n } else if (s.kind === \"pattern\" && !s.page) {\n const own = s.match(segments);\n if (own) {\n section = i;\n params = own;\n }\n }\n }\n if (section < 0) section = sections.findIndex((s) => s.kind === (page ? \"default\" : \"notFound\"));\n router.href = url.href;\n router.id++;\n router.page = page;\n router.params = params ?? {};\n router.section = section;\n router.route = new Route(path, page?.tag, router.params, url.searchParams, match, router.nav);\n}\n\n/** A navigation raised while something renders (a page redirecting itself) waits for that render to end. */\nfunction renavigate(owner: ComponentBase): void {\n if (depth === 0) update(owner);\n else queueMicrotask(() => update(owner));\n}\n\ntype Ctor<C extends ComponentBase> = new (...args: any[]) => C;\n// `latest` is the current vnode of a component still waiting for its instance; cleared on arrival or removal.\ntype Mounted = {\n tree: VNode[];\n anchor: Comment;\n app: IApplication | undefined;\n scope: CascadeRecord | undefined;\n latest: VComponent | undefined;\n // The render pass that last refreshed this component's parameters; a cascade skips it then.\n pass: number;\n // A routed page kept across navigations: the latest one it belongs to.\n nav?: number;\n};\n\n/** Builds components that need injected services; generated by xzor from `@Mount` and `@ServiceProvider`. */\nexport interface IApplication {\n onStarted?(): void | Promise<void>;\n /** Consulted only for component classes with a non-empty `static inject`; returns the component, a promise for it, or `undefined` (the runtime then throws). */\n createComponent?(type: Function): ComponentBase | Promise<ComponentBase> | undefined;\n}\n\nconst noop = () => {};\nconst SELECTOR = /[#.[]/;\n\n// Errors from fire-and-forget promises must not vanish; throwing from a microtask reports them.\nconst rethrow = (err: unknown): void =>\n queueMicrotask(() => {\n throw err;\n });\n\nfunction surface(result: unknown): void {\n if (result instanceof Promise) result.catch(rethrow);\n}\n// Projects on the ES2022 lib have no `Symbol.dispose` typing.\ntype DisposeSymbols = { dispose: symbol; asyncDispose: symbol };\nconst wellKnown = Symbol as unknown as DisposeSymbols;\n\n/** @internal Engines without explicit resource management get the registry symbols that TypeScript's downlevel helpers use. */\nexport function polyfillDisposeSymbols(target: Partial<DisposeSymbols>): void {\n target.dispose ??= Symbol.for(\"Symbol.dispose\");\n target.asyncDispose ??= Symbol.for(\"Symbol.asyncDispose\");\n}\n// Runs before any generated provider's class body evaluates `[Symbol.dispose]`, since providers import this module.\npolyfillDisposeSymbols(wellKnown);\ntype ServiceDecorator = {\n <T>(impl: new (...a: any[]) => T): ClassDecorator;\n <T>(key: string, factory: (...a: any[]) => T | Promise<T>): ClassDecorator;\n};\n\nexport const ServiceProvider = (): ClassDecorator => noop;\nexport const Mount = (_component: Function, _target: string): ClassDecorator => noop;\nexport const Import = (..._providers: Function[]): ClassDecorator => noop;\nexport const Singleton: ServiceDecorator = () => noop;\nexport const Scoped: ServiceDecorator = () => noop;\nexport const Transient: ServiceDecorator = () => noop;\nexport const SharedInstance: unique symbol = Symbol(\"xzor.sharedInstance\");\n\nconst mountedComponents = new WeakMap<ComponentBase, Mounted>();\nconst elementHandlers = new WeakMap<\n Element,\n { owner: ComponentBase; events: Record<string, Handler>; modifiers: Record<string, Modifiers>; listening: Set<string> }\n>();\n\nconst FRAGMENT: unique symbol = Symbol(\"xzor.fragment\");\n\ntype Fragment = ((builder: RenderTreeBuilder) => void) & { readonly [FRAGMENT]: true };\n\n/** Markup held as a value (Blazor's RenderFragment); render it with `@member`. */\nexport type RenderFragment = Fragment;\nexport type Renderer = RenderFragment;\n\n/** A component event; invoking it re-renders the component that passed it in. */\nexport type EventCallback<T = void> = (arg: T) => unknown;\n\n/** The DOM element type for a tag name, as `document.createElement` would return it. */\nexport type ElementOf<T extends string> = T extends keyof HTMLElementTagNameMap\n ? HTMLElementTagNameMap[T]\n : T extends keyof SVGElementTagNameMap\n ? SVGElementTagNameMap[T]\n : HTMLElement;\n\nfunction isFragment(value: unknown): value is Fragment {\n return typeof value === \"function\" && FRAGMENT in value;\n}\n\nexport abstract class ComponentBase {\n /** Wraps builder calls as a RenderFragment; xzor emits this for markup used as a value. */\n static fragment(build: (builder: RenderTreeBuilder) => void): RenderFragment {\n return Object.assign(build, { [FRAGMENT]: true as const });\n }\n\n /** Reads a bound input's new value, converted to the bound field's current type. */\n static bindValue<T>(e: Event, current: T): T {\n const input = e.target as HTMLInputElement;\n if (typeof current === \"boolean\") return input.checked as T;\n if (typeof current === \"number\") return Number(input.value) as T;\n return input.value as T;\n }\n\n /** Content the parent passed for each `@slot`; xzor declares the exact type per component. */\n slots: {} = {};\n\n protected abstract buildRenderTree(builder: RenderTreeBuilder): void;\n\n // Lifecycle, in Blazor's order. `...Async` results re-render the component when they settle.\n protected onInitialized(): void {}\n protected onInitializedAsync(): Promise<void> | void {}\n protected onParametersSet(): void {}\n protected onParametersSetAsync(): Promise<void> | void {}\n protected onAfterRender(_firstRender: boolean): void {}\n protected onAfterRenderAsync(_firstRender: boolean): Promise<void> | void {}\n protected shouldRender(): boolean {\n return true;\n }\n /** Called when the component leaves the tree. */\n protected dispose(): void {}\n\n /** Re-renders this component. Event handlers it owns do this automatically. */\n stateHasChanged(): void {\n update(this);\n }\n}\n\ntype Hooks = {\n buildRenderTree(b: RenderTreeBuilder): void;\n onInitialized(): void;\n onInitializedAsync(): Promise<void> | void;\n onParametersSet(): void;\n onParametersSetAsync(): Promise<void> | void;\n onAfterRender(first: boolean): void;\n onAfterRenderAsync(first: boolean): Promise<void> | void;\n shouldRender(): boolean;\n dispose(): void;\n};\n\nconst hooks = (c: ComponentBase) => c as unknown as Hooks;\n\nexport class RenderTreeBuilder {\n readonly #root: VNode[] = [];\n readonly #open: (VElement | VRegion)[] = [];\n\n constructor(private readonly owner: ComponentBase) {}\n\n get nodes(): VNode[] {\n return this.#root;\n }\n\n #append(node: VNode): void {\n (this.#open.at(-1)?.children ?? this.#root).push(node);\n }\n\n #current(): VElement {\n const el = this.#open.at(-1);\n if (el?.kind !== \"element\") throw new Error(\"xzor: attribute outside of an element\");\n return el;\n }\n\n openElement(tag: string): void {\n const el: VElement = { kind: \"element\", tag, attrs: {}, events: {}, modifiers: {}, children: [] };\n this.#append(el);\n this.#open.push(el);\n }\n\n closeElement(): void {\n this.#open.pop();\n }\n\n openRegion(): void {\n const region: VRegion = { kind: \"region\", children: [] };\n this.#append(region);\n this.#open.push(region);\n }\n\n /** `@cascade:name(value)`: a region whose children see `value` under `name`; `fixed` keeps the first value. */\n openCascade(name: string, value: unknown, fixed?: boolean): void {\n const region: VRegion = { kind: \"region\", children: [], name, value, fixed: fixed === true };\n this.#append(region);\n this.#open.push(region);\n }\n\n closeRegion(): void {\n this.#open.pop();\n }\n\n /** `@ClientRoutes`/`@ServerRoutes`: renders the section that matches the current navigation. */\n addRoutes(engine: \"client\" | \"server\", table: RouteTable, sections: readonly RouteSection[]): void {\n const owner = this.owner as ComponentBase & Routed;\n const nav = navigationOf();\n let router = owner[ROUTER];\n if (!router) {\n router = owner[ROUTER] = {\n nav: engine === \"client\" ? nav : undefined,\n off: undefined,\n onError: undefined,\n caught: sections.find((s): s is Extract<RouteSection, { kind: \"catch\" }> => s.kind === \"catch\"),\n href: \"\",\n id: 0,\n route: undefined,\n section: -1,\n page: undefined,\n params: {},\n error: undefined,\n failed: false,\n };\n const failing = router;\n if (router.caught) {\n // The page's own failures reach this one handler; one raised by a page we left is dropped.\n router.onError = (err, id) => {\n if (id !== failing.id) return;\n failing.error = err;\n failing.failed = true;\n queueMicrotask(() => update(owner));\n };\n }\n // `@ServerRoutes` matches once on load: no listeners, no re-render.\n if (router.nav) router.off = router.nav.subscribe(() => renavigate(owner));\n }\n const state = router;\n const url = nav.current();\n if (url.href !== state.href || !state.route) {\n // A navigation clears the error the last page raised.\n state.failed = false;\n state.error = undefined;\n resolveRoute(state, table, sections, url);\n }\n const route = state.route!;\n const section = sections[state.section];\n const page = state.page;\n this.openCascade(\"route\", route);\n if (state.failed) {\n state.caught!.render(route, state.error)(this);\n } else if (page) {\n const entry = page;\n const fragment = ComponentBase.fragment((b) => b.#addPage(entry, state));\n if (section) (section.render as (r: Route, p: RenderFragment) => RenderFragment)(route, fragment)(this);\n else fragment(this);\n } else if (section) {\n (section.render as (r: Route) => RenderFragment)(route)(this);\n }\n this.closeRegion();\n }\n\n // Keyed by route family: navigating between routes of one family (or params only) keeps the page instance.\n #addPage(entry: RouteEntry, router: Router): void {\n this.#append({\n kind: \"component\",\n type: entry.component as Ctor<ComponentBase>,\n props: router.params,\n key: entry.family ?? entry.pattern,\n onError: router.onError,\n nav: router.id,\n });\n }\n\n addAttribute(name: string, value: unknown): void {\n const el = this.#current();\n if (value === false || value == null) delete el.attrs[name];\n else el.attrs[name] = value === true ? \"\" : String(value);\n }\n\n /** `@attributes`: each entry is added in order, so later attributes override it. */\n addAttributes(attrs: Record<string, unknown> | null | undefined): void {\n for (const [name, value] of Object.entries(attrs ?? {})) this.addAttribute(name, value);\n }\n\n /** `@onclick:preventDefault` and `@onclick:stopPropagation`, with or without a handler. */\n addEventModifier(event: string, modifier: Modifier, enabled: boolean): void {\n const el = this.#current();\n (el.modifiers[event] ??= {})[modifier] = enabled;\n }\n\n /** `@key`: list diffs match this element by key instead of position. */\n setKey(key: unknown): void {\n this.#current().key = key;\n }\n\n /** `@ref`: receives the DOM element (typed from its tag) after each render. */\n setRef<T extends string>(_tag: T, ref: (el: ElementOf<T>) => void): void {\n this.#current().ref = ref as (el: Element) => void;\n }\n\n addEventHandler<K extends keyof HTMLElementEventMap>(\n event: K,\n handler: (e: HTMLElementEventMap[K]) => unknown,\n ): void;\n addEventHandler(event: string, handler: Handler): void;\n addEventHandler(event: string, handler: (e: never) => unknown): void {\n this.#current().events[event] = handler as Handler;\n }\n\n addText(text: string): void {\n this.#append({ kind: \"text\", text });\n }\n\n /** `@fine`: the whole template, built once into the DOM; its bindings keep it current. */\n addFine(build: (parent: Node) => void): void {\n this.#append({ kind: \"fine\", build });\n }\n\n addContent(value: unknown): void {\n if (isFragment(value)) {\n this.openRegion();\n value(this);\n this.closeRegion();\n return;\n }\n // An empty text node keeps the slot, so siblings stay aligned when content comes and goes.\n if (value === false || value == null) value = \"\";\n this.#append({ kind: \"text\", text: String(value) });\n }\n\n addComponent<C extends ComponentBase>(\n type: Ctor<C>,\n props: Partial<C>,\n slots?: C[\"slots\"],\n extra?: { key?: unknown; ref?: (c: C) => void },\n ): void {\n this.#append({\n kind: \"component\",\n type,\n props: props as Record<string, unknown>,\n slots,\n key: extra?.key,\n ref: extra?.ref as ((c: ComponentBase) => void) | undefined,\n });\n }\n\n /** Wraps a handler passed to a child as an EventCallback (re-renders this owner). */\n callback<T>(handler: (arg: T) => unknown): EventCallback<T> {\n const owner = this.owner;\n if (isFine(owner))\n return (arg: T) => {\n const result = handler(arg);\n fineHooks!.handled(owner, result);\n return result;\n };\n return (arg: T) => {\n const result = handler(arg);\n update(owner);\n if (result instanceof Promise) void result.then(() => update(owner));\n return result;\n };\n }\n}\n\n// Inputs keep live state in properties, so bound attributes are mirrored onto them. `--name` is a custom property.\nfunction setAttr(el: Element, name: string, value: string): void {\n if (name.charCodeAt(0) === 45 && name.charCodeAt(1) === 45) return (el as HTMLElement).style.setProperty(name, value);\n el.setAttribute(name, value);\n if (name === \"value\" && \"value\" in el) (el as HTMLInputElement).value = value;\n if (name === \"checked\" && \"checked\" in el) (el as HTMLInputElement).checked = true;\n}\n\nfunction removeAttr(el: Element, name: string): void {\n if (name.charCodeAt(0) === 45 && name.charCodeAt(1) === 45) return void (el as HTMLElement).style.removeProperty(name);\n el.removeAttribute(name);\n if (name === \"value\" && \"value\" in el) (el as HTMLInputElement).value = \"\";\n if (name === \"checked\" && \"checked\" in el) (el as HTMLInputElement).checked = false;\n}\n\n/** What `@source-crafter/xzor-runtime/model` installs to learn which models a render read. */\nexport type RenderObserver = {\n begin(component: ComponentBase): void;\n end(component: ComponentBase): void;\n dispose(component: ComponentBase): void;\n};\n\nlet observer: RenderObserver | undefined;\n\n/** @internal Set by the model entry; the renderer costs one null check while none is installed. */\nexport function setRenderObserver(o: RenderObserver | undefined): void {\n observer = o;\n}\n\nfunction render(component: ComponentBase): VNode[] {\n const builder = new RenderTreeBuilder(component);\n if (observer === undefined) hooks(component).buildRenderTree(builder);\n else {\n observer.begin(component);\n try {\n hooks(component).buildRenderTree(builder);\n } finally {\n observer.end(component);\n }\n }\n return builder.nodes;\n}\n\n// After-render callbacks wait until the outermost render pass has touched the DOM.\nlet depth = 0;\nlet pass = 0;\nconst afterRender: (() => void)[] = [];\n\nfunction batch(fn: () => void): void {\n if (depth++ === 0) pass++;\n try {\n fn();\n } finally {\n if (--depth === 0) for (const done of afterRender.splice(0)) done();\n }\n}\n\nfunction settle(component: ComponentBase, result: Promise<void> | void, node?: VComponent): void {\n if (!(result instanceof Promise)) return;\n void result.then(() => update(component), node?.onError && ((err: unknown) => fail(node, err)));\n}\n\n/** `@catch`: the failure is reported with the navigation the page belongs to, so a late one can be dropped. */\nfunction fail(v: VComponent, err: unknown): void {\n if (v.onError) v.onError(err, v.mounted?.nav ?? v.nav ?? 0);\n else rethrow(err);\n}\n\nfunction parametersSet(component: ComponentBase): void {\n hooks(component).onParametersSet();\n settle(component, hooks(component).onParametersSetAsync());\n}\n\n/** `static cascades` on a component class: one `[property, cascade name]` pair per `@Cascade` member. */\ntype CascadeList = readonly (readonly [prop: string, name: string])[];\n\nconst cascadesOf = (type: Function): CascadeList | undefined => (type as { cascades?: CascadeList }).cascades;\n\nconst fields = (c: ComponentBase) => c as unknown as Record<string, unknown>;\n\nfunction findCascade(scope: CascadeRecord | undefined, name: string): CascadeRecord | undefined {\n for (let s = scope; s; s = s.parent) if (s.name === name) return s;\n return undefined;\n}\n\n/** Gives each `@Cascade` member the nearest provider's value and subscribes to later changes. */\nfunction resolveCascades(instance: ComponentBase, type: Ctor<ComponentBase>, scope: CascadeRecord | undefined): void {\n const list = cascadesOf(type);\n if (!list) return;\n for (const [prop, name] of list) {\n const record = findCascade(scope, name);\n if (!record) continue;\n fields(instance)[prop] = record.value;\n // Several members may share one name; the set keeps one entry per instance, in subscription order.\n if (!record.fixed) (record.consumers ??= new Set()).add(instance);\n }\n}\n\nfunction unsubscribeCascades(instance: ComponentBase, type: Ctor<ComponentBase>, scope: CascadeRecord | undefined): void {\n const list = cascadesOf(type);\n if (!list) return;\n for (const [, name] of list) findCascade(scope, name)?.consumers?.delete(instance);\n}\n\n// Assigning before the region's children are patched lets a consumer whose props also changed\n// render once with both; the leftovers are told afterwards.\nfunction assignCascade(record: CascadeRecord, consumers: readonly ComponentBase[]): void {\n for (const consumer of consumers) {\n for (const [prop, name] of cascadesOf(consumer.constructor)!) {\n if (name === record.name) fields(consumer)[prop] = record.value;\n }\n }\n}\n\n// A changed cascade takes the same path as a changed prop: onParametersSet, then re-render.\nfunction notifyCascade(consumers: readonly ComponentBase[]): void {\n for (const consumer of consumers) {\n const m = mountedComponents.get(consumer);\n if (!m || m.pass === pass) continue;\n m.pass = pass;\n try {\n parametersSet(consumer);\n update(consumer);\n } catch (err) {\n // One consumer's failure must not keep the rest from seeing the new value.\n rethrow(err);\n }\n }\n}\n\nfunction queueAfterRender(component: ComponentBase, first: boolean): void {\n afterRender.push(() => {\n hooks(component).onAfterRender(first);\n void hooks(component).onAfterRenderAsync(first);\n });\n}\n\nfunction update(component: ComponentBase): void {\n batch(() => {\n const m = mountedComponents.get(component);\n const parent = m?.anchor.parentNode;\n if (!m || !parent || !hooks(component).shouldRender()) return;\n const next = render(component);\n patchList(parent, m.tree, next, m.anchor, component, m.app, m.scope);\n m.tree = next;\n queueAfterRender(component, false);\n });\n}\n\n// `into` is the placeholder left by an async component; it keeps its anchor and the nodes go before it.\nfunction mountComponent(\n component: ComponentBase,\n app: IApplication | undefined,\n scope: CascadeRecord | undefined,\n into?: Mounted,\n node?: VComponent,\n): { nodes: Node[]; mounted: Mounted } {\n hooks(component).onInitialized();\n settle(component, hooks(component).onInitializedAsync(), node);\n parametersSet(component);\n const tree = render(component);\n const mounted = into ?? { tree, anchor: document.createComment(\"\"), app, scope, latest: undefined, pass };\n if (into) into.tree = tree;\n mountedComponents.set(component, mounted);\n const nodes = tree.flatMap((v) => create(v, component, app, scope));\n queueAfterRender(component, true);\n if (!into) nodes.push(mounted.anchor);\n return { nodes, mounted };\n}\n\nfunction construct(type: Ctor<ComponentBase>, app: IApplication | undefined): ComponentBase | Promise<ComponentBase> {\n const inject = (type as { inject?: readonly string[] }).inject;\n if (!inject?.length) return new type();\n const made = app?.createComponent?.(type);\n if (made) return made;\n if (app) throw new Error(`xzor: ${type.name} is not registered with the application`);\n throw new Error(`xzor: ${type.name} needs injected services (${inject.join(\", \")}) but has no application`);\n}\n\nfunction arrive(mounted: Mounted, instance: ComponentBase): void {\n const v = mounted.latest;\n const parent = mounted.anchor.parentNode;\n mounted.latest = undefined;\n // No vnode: removed before arrival. No parent: the anchor was detached without a dispose.\n if (!v || !parent) {\n disposeInstance(instance);\n return;\n }\n try {\n batch(() => {\n applyProps(instance, v);\n resolveCascades(instance, v.type, mounted.scope);\n v.ref?.(instance);\n for (const node of mountComponent(instance, mounted.app, mounted.scope, mounted, v).nodes)\n parent.insertBefore(node, mounted.anchor);\n v.instance = instance;\n });\n } catch (err) {\n fail(v, err);\n if (!v.instance) {\n mountedComponents.delete(instance);\n observer?.dispose(instance);\n unsubscribeCascades(instance, v.type, mounted.scope);\n // Nodes of the failed render were never inserted; keep only the empty placeholder.\n const partial = mounted.tree;\n mounted.tree = [];\n for (const node of partial) {\n try {\n dispose(node);\n } catch (disposeErr) {\n rethrow(disposeErr);\n }\n }\n }\n }\n}\n\nfunction applyProps(instance: ComponentBase, v: VComponent): void {\n Object.assign(instance, v.props);\n if (v.slots) instance.slots = v.slots;\n}\n\nfunction propsChanged(o: VComponent, n: VComponent): boolean {\n // Slot lambdas are recreated on every parent render, so a child with slots always refreshes.\n if (n.slots) return true;\n for (const [key, value] of Object.entries(n.props)) {\n // Like Blazor, objects may have been mutated, so they always count as changed.\n if (!Object.is(o.props[key], value) || (typeof value === \"object\" && value !== null)) return true;\n }\n return false;\n}\n\nconst eventNames = (v: VElement) => new Set([...Object.keys(v.events), ...Object.keys(v.modifiers)]);\n\nfunction listen(el: Element, event: string): void {\n elementHandlers.get(el)!.listening.add(event);\n el.addEventListener(event, (e) => {\n const record = elementHandlers.get(el);\n if (!record) return;\n const mods = record.modifiers[event];\n if (mods?.preventDefault) e.preventDefault();\n if (mods?.stopPropagation) e.stopPropagation();\n const handler = record.events[event];\n if (!handler) return;\n const result = handler(e);\n if (isFine(record.owner)) return fineHooks!.handled(record.owner, result);\n update(record.owner);\n if (result instanceof Promise) void result.then(() => update(record.owner));\n });\n}\n\nfunction create(\n v: VNode,\n owner: ComponentBase,\n app: IApplication | undefined,\n scope: CascadeRecord | undefined,\n svg = false,\n): Node[] {\n switch (v.kind) {\n case \"text\":\n v.dom = document.createTextNode(v.text);\n return [v.dom];\n case \"element\": {\n const el = svg || v.tag === \"svg\" ? document.createElementNS(SVG, v.tag) : document.createElement(v.tag);\n for (const [name, value] of Object.entries(v.attrs)) setAttr(el, name, value);\n elementHandlers.set(el, { owner, events: v.events, modifiers: v.modifiers, listening: new Set() });\n for (const event of eventNames(v)) listen(el, event);\n const inner = inSvg(el);\n for (const child of v.children) el.append(...create(child, owner, app, scope, inner));\n v.dom = el;\n v.ref?.(el);\n return [el];\n }\n case \"region\": {\n v.anchor = document.createComment(\"\");\n // The record outlives the vnode: later renders carry it over in `patch`.\n const inner =\n v.name === undefined\n ? scope\n : (v.cascade = { name: v.name, value: v.value, fixed: v.fixed === true, consumers: undefined, parent: scope });\n return [...v.children.flatMap((c) => create(c, owner, app, inner, svg)), v.anchor];\n }\n case \"component\": {\n if (!v.onError) return createComponent(v, app, scope);\n try {\n return createComponent(v, app, scope);\n } catch (err) {\n return failedComponent(v, err, app, scope);\n }\n }\n case \"fine\": {\n if (!fineHooks) throw new Error(\"xzor: a @fine component needs @source-crafter/xzor-runtime/model\");\n return fineNodes((v.root = fineHooks.create(v.build, owner, app, scope)));\n }\n }\n}\n\nfunction createComponent(v: VComponent, app: IApplication | undefined, scope: CascadeRecord | undefined): Node[] {\n const made = construct(v.type, app);\n if (made instanceof Promise) {\n const mounted: Mounted = (v.mounted = {\n tree: [],\n anchor: document.createComment(\"\"),\n app,\n scope,\n latest: v,\n pass,\n });\n made.then(\n (instance) => arrive(mounted, instance),\n (err) => {\n const latest = mounted.latest;\n mounted.latest = undefined;\n if (latest) fail(latest, err);\n // A routed page we already left: its failure is stale, like any other.\n else if (!v.onError) rethrow(err);\n },\n );\n return [mounted.anchor];\n }\n v.instance = made;\n applyProps(made, v);\n resolveCascades(made, v.type, scope);\n v.ref?.(made);\n const { nodes, mounted } = mountComponent(made, app, scope, undefined, v);\n v.mounted = mounted;\n return nodes;\n}\n\n// `@catch`: the page's nodes never reached the DOM, so only an anchor stays until the block re-renders.\nfunction failedComponent(\n v: VComponent,\n err: unknown,\n app: IApplication | undefined,\n scope: CascadeRecord | undefined,\n): Node[] {\n const instance = v.instance;\n v.instance = undefined;\n if (instance) {\n // Children the page had already mounted go with it, or they keep taking cascades and hooks.\n const partial = mountedComponents.get(instance);\n mountedComponents.delete(instance);\n observer?.dispose(instance);\n unsubscribeCascades(instance, v.type, scope);\n for (const node of partial?.tree ?? []) {\n try {\n dispose(node);\n } catch (disposeErr) {\n rethrow(disposeErr);\n }\n }\n }\n v.mounted = { tree: [], anchor: document.createComment(\"\"), app, scope, latest: undefined, pass };\n fail(v, err);\n return [v.mounted.anchor];\n}\n\nfunction nodesOf(v: VNode): Node[] {\n switch (v.kind) {\n case \"text\":\n case \"element\":\n return [v.dom!];\n case \"region\":\n return [...v.children.flatMap(nodesOf), v.anchor!];\n case \"component\":\n return [...v.mounted!.tree.flatMap(nodesOf), v.mounted!.anchor];\n case \"fine\":\n return fineNodes(v.root!);\n }\n}\n\nfunction same(o: VNode, n: VNode): boolean {\n if (o.kind !== n.kind) return false;\n if (o.kind === \"element\") return o.tag === (n as VElement).tag && o.key === (n as VElement).key;\n if (o.kind === \"component\") return o.type === (n as VComponent).type && o.key === (n as VComponent).key;\n // A provider is only ever patched against the same provider; anything else replaces it.\n if (o.kind === \"region\") return o.name === (n as VRegion).name && o.fixed === (n as VRegion).fixed;\n return true;\n}\n\nfunction dispose(v: VNode): void {\n switch (v.kind) {\n case \"element\":\n v.children.forEach(dispose);\n return;\n case \"region\":\n // The provider goes away with its region, so its consumers need not unsubscribe one by one.\n if (v.cascade) v.cascade.consumers = undefined;\n v.children.forEach(dispose);\n return;\n case \"component\":\n if (!v.instance) {\n if (v.mounted) v.mounted.latest = undefined;\n return;\n }\n v.mounted?.tree.forEach(dispose);\n mountedComponents.delete(v.instance);\n unsubscribeCascades(v.instance, v.type, v.mounted?.scope);\n disposeInstance(v.instance);\n return;\n case \"fine\":\n fineHooks!.dispose(v.root!);\n return;\n }\n}\n\nfunction disposeInstance(c: ComponentBase): void {\n observer?.dispose(c);\n (c as Routed)[ROUTER]?.off?.();\n hooks(c).dispose();\n const d = c as unknown as Record<symbol, (() => unknown) | undefined>;\n d[wellKnown.dispose]?.();\n surface(d[wellKnown.asyncDispose]?.());\n}\n\nfunction remove(parent: Node, v: VNode): void {\n for (const node of nodesOf(v)) parent.removeChild(node);\n dispose(v);\n}\n\nfunction patch(\n o: VNode,\n n: VNode,\n owner: ComponentBase,\n app: IApplication | undefined,\n scope: CascadeRecord | undefined,\n): void {\n switch (n.kind) {\n case \"text\": {\n const dom = (n.dom = (o as VText).dom!);\n if (dom.data !== n.text) dom.data = n.text;\n return;\n }\n case \"element\": {\n const old = o as VElement;\n const el = (n.dom = old.dom!);\n for (const name of Object.keys(old.attrs)) if (!(name in n.attrs)) removeAttr(el, name);\n for (const [name, value] of Object.entries(n.attrs)) {\n const live = name === \"value\" ? (el as HTMLInputElement).value : undefined;\n if (old.attrs[name] !== value || (live !== undefined && live !== value)) setAttr(el, name, value);\n }\n const record = elementHandlers.get(el)!;\n record.events = n.events;\n record.modifiers = n.modifiers;\n for (const event of eventNames(n)) if (!record.listening.has(event)) listen(el, event);\n patchList(el, old.children, n.children, null, owner, app, scope);\n n.ref?.(el);\n return;\n }\n case \"region\": {\n const old = o as VRegion;\n const anchor = (n.anchor = old.anchor!);\n // The provider record is carried like the anchor, so consumers keep their subscription.\n const record = old.cascade;\n let subscribers: ComponentBase[] | undefined;\n let inner = scope;\n if (record) {\n record.parent = scope;\n n.cascade = record;\n inner = record;\n // A fixed provider keeps the value of its first render, for consumers mounted later too.\n if (!record.fixed && !Object.is(record.value, n.value)) {\n record.value = n.value;\n if (record.consumers?.size) {\n subscribers = [...record.consumers];\n assignCascade(record, subscribers);\n }\n }\n }\n patchList(anchor.parentNode!, old.children, n.children, anchor, owner, app, inner);\n // Consumers that this patch mounted or already refreshed skip the notification.\n if (subscribers) notifyCascade(subscribers);\n return;\n }\n case \"component\": {\n const old = o as VComponent;\n n.mounted = old.mounted;\n if (!old.instance) {\n // Still waiting for its instance: carry the newest props to arrival.\n if (n.mounted!.latest) n.mounted!.latest = n;\n return;\n }\n const instance = (n.instance = old.instance);\n // A page whose navigation moved on takes its params again even when they compare equal.\n const changed = n.nav !== old.nav || propsChanged(old, n);\n if (n.nav !== undefined) n.mounted!.nav = n.nav;\n applyProps(instance, n);\n n.ref?.(instance);\n if (changed) {\n n.mounted!.pass = pass;\n parametersSet(instance);\n update(instance);\n }\n return;\n }\n case \"fine\": {\n // Built once: a re-render (`stateHasChanged`) re-runs the bindings, for changes nothing tracks.\n fineHooks!.refresh((n.root = (o as VFine).root!));\n return;\n }\n }\n}\n\nconst keyOf = (v: VNode | undefined) => (v && (v.kind === \"element\" || v.kind === \"component\") ? v.key : undefined);\n\nfunction patchList(\n parent: Node,\n old: VNode[],\n next: VNode[],\n end: Node | null,\n owner: ComponentBase,\n app: IApplication | undefined,\n scope: CascadeRecord | undefined,\n): void {\n if (old.some((v) => keyOf(v) != null) || next.some((v) => keyOf(v) != null)) {\n patchKeyed(parent, old, next, end, owner, app, scope);\n return;\n }\n // Positional diff; regions keep variable-length blocks from misaligning their siblings.\n for (let i = 0; i < next.length; i++) {\n const n = next[i]!;\n const o = old[i];\n if (o && same(o, n)) {\n patch(o, n, owner, app, scope);\n continue;\n }\n const ref = o ? nodesOf(o)[0]! : end;\n for (const node of create(n, owner, app, scope, inSvg(parent))) parent.insertBefore(node, ref);\n if (o) remove(parent, o);\n }\n for (const o of old.slice(next.length)) remove(parent, o);\n}\n\n/** `@key` diff: keyed nodes are matched by key and moved; unkeyed ones by position. */\nfunction patchKeyed(\n parent: Node,\n old: VNode[],\n next: VNode[],\n end: Node | null,\n owner: ComponentBase,\n app: IApplication | undefined,\n scope: CascadeRecord | undefined,\n): void {\n const byKey = new Map<unknown, VNode>();\n for (const o of old) if (keyOf(o) != null) byKey.set(keyOf(o), o);\n const used = new Set<VNode>();\n const matches = next.map((n, i) => {\n const key = keyOf(n);\n const o = key != null ? byKey.get(key) : keyOf(old[i]) == null ? old[i] : undefined;\n if (o && !used.has(o) && same(o, n)) {\n used.add(o);\n return o;\n }\n return undefined;\n });\n for (const o of old) if (!used.has(o)) remove(parent, o);\n let ref = end;\n for (let i = next.length - 1; i >= 0; i--) {\n const n = next[i]!;\n const o = matches[i];\n let nodes: Node[];\n if (o) {\n patch(o, n, owner, app, scope);\n nodes = nodesOf(n);\n } else {\n nodes = create(n, owner, app, scope, inSvg(parent));\n }\n for (let j = nodes.length - 1; j >= 0; j--) {\n const node = nodes[j]!;\n if (node.parentNode !== parent || node.nextSibling !== ref) parent.insertBefore(node, ref);\n ref = node;\n }\n }\n}\n\nfunction resolveTarget(target: string | Element): Element {\n if (typeof target !== \"string\") return target;\n const found = SELECTOR.test(target) ? document.querySelector(target) : document.getElementById(target);\n if (!found) throw new Error(`xzor: mount target \"${target}\" not found`);\n return found;\n}\n\n/** `target` is an element, an element id, or a selector (anything containing `#`, `.` or `[`). */\nexport function mount<C extends ComponentBase>(type: Ctor<C>, target: string | Element, app?: IApplication): C {\n const host = resolveTarget(target);\n const root = construct(type, app);\n if (root instanceof Promise) throw new Error(`xzor: root component ${type.name} cannot be asynchronous`);\n batch(() => host.replaceChildren(...mountComponent(root, app, undefined).nodes));\n surface(app?.onStarted?.());\n return root as C;\n}\n\n/** An `<a>` that carries `activeClass` while the current URL is on its `href`; it follows navigation itself. */\nexport class NavLink extends ComponentBase {\n href = \"\";\n activeClass = \"active\";\n match: \"prefix\" | \"exact\" = \"prefix\";\n\n declare slots: { default?: () => RenderFragment };\n\n #path = \"\";\n // `href` resolved against the base URL, encoded like `location.pathname`; `null` for another origin.\n #for: string | undefined;\n #target: string | null = null;\n #off: (() => void) | undefined;\n\n protected override onInitialized(): void {\n const nav = navigationOf();\n this.#path = nav.current().pathname;\n const fn = () => {\n const path = nav.current().pathname;\n if (path === this.#path) return;\n this.#path = path;\n this.stateHasChanged();\n };\n this.#off = nav.observe ? nav.observe(fn) : nav.subscribe(fn);\n }\n\n protected override dispose(): void {\n this.#off?.();\n }\n\n #active(): boolean {\n if (this.#for !== this.href) {\n this.#for = this.href;\n const url = new URL(this.href, document.baseURI);\n this.#target = url.origin === location.origin ? url.pathname : null;\n }\n const target = this.#target;\n if (target === null) return false;\n const path = this.#path;\n // The root is every path's prefix, so it only ever matches exactly.\n if (this.match === \"exact\" || target === `${basePath()}/`) return path === target;\n return path === target || path.startsWith(target.endsWith(\"/\") ? target : `${target}/`);\n }\n\n protected override buildRenderTree(b: RenderTreeBuilder): void {\n b.openElement(\"a\");\n b.addAttribute(\"href\", this.href);\n if (this.#active()) {\n b.addAttribute(\"class\", this.activeClass);\n b.addAttribute(\"aria-current\", \"page\");\n }\n b.addContent(this.slots.default?.() ?? null);\n b.closeElement();\n }\n}\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "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",
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": ";AA0EA,IAAI;AAGG,IAAM,OAAsB,OAAO,WAAW;AAErD,IAAM,SAAS,CAAC,MAA+B,EAAyC,UAAU;AAG3F,SAAS,YAAY,CAAC,GAAoB;AAAA,EAC/C,YAAY;AAAA;AAOP,SAAS,WAAW,CACzB,OACA,KACA,OACA,KACA,KACA,OACS;AAAA,EACT,MAAM,UAAU,IAAI,kBAAkB,KAAK;AAAA,EAC3C,MAAM,OAAO;AAAA,EACb,MAAM,OAAO,QAAQ;AAAA,EACrB,MAAM,MAAM,UAAU,IAAI,YAAa,KAAK,MAAM,KAAK,OAAO,KAAK,KAAkC,CAAC;AAAA,EACtG,OAAO;AAAA;AAIF,SAAS,aAAa,CAAC,MAAqB;AAAA,EACjD,WAAW,KAAK;AAAA,IAAM,QAAQ,CAAC;AAAA;AAI1B,IAAM,cAAc,CAAC,UAA4B,WAAW,KAAK;AAEjE,IAAM,MAAM;AAEZ,IAAM,SAAS,CAAC,WAA2B,OAAmB,iBAAiB,OAAO,OAAO,aAAa;AACjH,IAAM,QAAQ;AAEd,SAAS,SAAS,CAAC,MAAwB;AAAA,EACzC,MAAM,QAAgB,CAAC;AAAA,EACvB,SAAS,IAAiB,KAAK,MAAO,MAAM,MAAM,IAAI,EAAE,aAAa;AAAA,IACnE,MAAM,KAAK,CAAC;AAAA,IACZ,IAAI,MAAM,KAAK;AAAA,MAAK;AAAA,EACtB;AAAA,EACA,OAAO;AAAA;AAAA;AAoBF,MAAM,MAAkG;AAAA,EAIlG;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAPF;AAAA,EAET,WAAW,CACA,MACA,KACA,QACA,OACA,OACT,KACA;AAAA,IANS;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IAGT,KAAK,OAAO;AAAA;AAAA,EAId,EAAiC,CAAC,KAA4D;AAAA,IAC5F,OAAO,KAAK,QAAQ;AAAA;AAAA,EAItB,QAAQ,CAAC,KAAa,MAAoC;AAAA,IACxD,IAAI,KAAK;AAAA,MAAM,KAAK,KAAK,SAAS,KAAK,MAAM,YAAY,IAAI;AAAA,IACxD;AAAA,eAAS,OAAO;AAAA;AAEzB;AA0BA,IAAM,YAAY,IAAI;AAEtB,IAAM,YAAY,IAAI;AACtB,IAAM,WAAW;AACjB,IAAI,cAAc;AAGX,SAAS,eAAe,CAAC,IAAmB;AAAA,EACjD,cAAc;AAAA;AAGhB,SAAS,eAAe,GAAS;AAAA,EAC/B,MAAM,MAAM;AAAA,EAEZ,IAAI,eAAe,IAAI;AAAA,IAAqB,IAAI,oBAAoB,SAAS,EAAE,MAAM,MAAM,IAAI;AAAA,EAC1F;AAAA,cAAU;AAAA;AAGjB,SAAS,SAAS,GAAS;AAAA,EACzB,WAAW,MAAM,CAAC,GAAG,SAAS;AAAA,IAAG,GAAG;AAAA,EACpC,WAAW,MAAM,CAAC,GAAG,SAAS;AAAA,IAAG,GAAG;AAAA;AAGtC,IAAM,aAAa,MAAY,gBAAgB;AAE/C,SAAS,WAAW,CAAC,GAAqB;AAAA,EACxC,IAAI,EAAE,oBAAoB,EAAE,WAAW,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE;AAAA,IAAQ;AAAA,EAC9F,MAAM,SAAU,EAAE,QAA2B,UAAU,GAAG;AAAA,EAC1D,MAAM,OAAO,QAAQ,aAAa,MAAM;AAAA,EACxC,IAAI,CAAC,UAAU,QAAQ,QAAQ,KAAK,WAAW,GAAG;AAAA,IAAG;AAAA,EACrD,MAAM,QAAQ,OAAO,aAAa,QAAQ;AAAA,EAC1C,IAAK,UAAU,QAAQ,UAAU,WAAY,OAAO,aAAa,UAAU;AAAA,IAAG;AAAA,EAC9E,MAAM,MAAM,OAAO,aAAa,KAAK;AAAA,EACrC,IAAI,QAAQ,QAAQ,SAAS,KAAK,GAAG;AAAA,IAAG;AAAA,EAExC,MAAM,MAAM,IAAI,IAAI,MAAM,SAAS,OAAO;AAAA,EAC1C,IAAI,IAAI,WAAW,SAAS;AAAA,IAAQ;AAAA,EAEpC,IAAI,IAAI,SAAS,MAAM,IAAI,aAAa,SAAS,YAAY,IAAI,WAAW,SAAS;AAAA,IAAQ;AAAA,EAC7F,EAAE,eAAe;AAAA,EACjB,kBAAkB,SAAS,IAAI,MAAM,KAAK;AAAA;AAI5C,IAAI;AAEJ,IAAM,oBAAgC;AAAA,EACpC,SAAS,MAAO,YAAY,SAAS,SAAS,OAAO,aAAc,aAAa,IAAI,IAAI,SAAS,IAAI;AAAA,EACrG,QAAQ,CAAC,KAAK,SAAS;AAAA,IACrB,MAAM,OAAO,IAAI,IAAI,KAAK,SAAS,OAAO,EAAE;AAAA,IAC5C,IAAI;AAAA,MAAS,QAAQ,aAAa,MAAM,IAAI,IAAI;AAAA,IAC3C;AAAA,cAAQ,UAAU,MAAM,IAAI,IAAI;AAAA,IACrC,gBAAgB;AAAA;AAAA,EAElB,SAAS,CAAC,IAAI;AAAA,IACZ,UAAU,IAAI,EAAE;AAAA,IAChB,IAAI,UAAU,SAAS,GAAG;AAAA,MACxB,IAAI,UAAU,SAAS;AAAA,QAAG,OAAO,iBAAiB,YAAY,UAAU;AAAA,MACxE,SAAS,iBAAiB,SAAS,WAAW;AAAA,IAChD;AAAA,IACA,OAAO,MAAM;AAAA,MACX,UAAU,OAAO,EAAE;AAAA,MACnB,IAAI,UAAU,SAAS,GAAG;AAAA,QACxB,IAAI,UAAU,SAAS;AAAA,UAAG,OAAO,oBAAoB,YAAY,UAAU;AAAA,QAC3E,SAAS,oBAAoB,SAAS,WAAW;AAAA,MACnD;AAAA;AAAA;AAAA,EAGJ,OAAO,CAAC,IAAI;AAAA,IACV,UAAU,IAAI,EAAE;AAAA,IAChB,IAAI,UAAU,SAAS,KAAK,UAAU,SAAS;AAAA,MAAG,OAAO,iBAAiB,YAAY,UAAU;AAAA,IAChG,OAAO,MAAM;AAAA,MACX,UAAU,OAAO,EAAE;AAAA,MACnB,IAAI,UAAU,SAAS,KAAK,UAAU,SAAS;AAAA,QAAG,OAAO,oBAAoB,YAAY,UAAU;AAAA;AAAA;AAGzG;AAEA,IAAI;AAGG,SAAS,qBAAqB,CAAC,KAAmC;AAAA,EACvE,iBAAiB;AAAA;AAGnB,IAAM,eAAe,MAAkB,kBAAkB;AAqBzD,IAAM,SAAwB,OAAO,aAAa;AAGlD,SAAS,UAAU,CAAC,UAA4B;AAAA,EAC9C,MAAM,OAAO,SAAS,WAAW,GAAG,IAAI,SAAS,MAAM,CAAC,IAAI;AAAA,EAC5D,OAAO,SAAS,KAAK,CAAC,IAAI,KAAK,MAAM,GAAG;AAAA;AAG1C,IAAI;AACJ,IAAI,OAAO;AAGJ,SAAS,QAAQ,GAAW;AAAA,EACjC,MAAM,MAAM,SAAS;AAAA,EACrB,IAAI,QAAQ,SAAS;AAAA,IACnB,UAAU;AAAA,IACV,MAAM,OAAO,SAAS,cAAc,YAAY,IAAI,IAAI,IAAI,GAAG,EAAE,WAAW;AAAA,IAC5E,OAAO,KAAK,MAAM,GAAG,KAAK,YAAY,GAAG,CAAC;AAAA,EAC5C;AAAA,EACA,OAAO;AAAA;AAIT,SAAS,SAAS,CAAC,UAA0B;AAAA,EAC3C,MAAM,IAAI,SAAS;AAAA,EACnB,OAAO,MAAM,OAAO,aAAa,KAAK,SAAS,WAAW,GAAG,IAAI,KAAK,SAAS,MAAM,EAAE,MAAM,KAAK,MAAM;AAAA;AAI1G,SAAS,QAAQ,CAAC,IAAY,UAAiD;AAAA,EAC7E,GAAG,YAAY;AAAA,EACf,MAAM,IAAI,GAAG,KAAK,QAAQ;AAAA,EAC1B,OAAO,IAAK,EAAE,UAAU,CAAC,IAAK;AAAA;AAIhC,SAAS,YAAY,CAAC,QAAgB,OAAmB,UAAmC,KAAgB;AAAA,EAC1G,MAAM,OAAO,UAAU,IAAI,QAAQ;AAAA,EACnC,MAAM,WAAW,WAAW,IAAI;AAAA,EAChC,IAAI;AAAA,EACJ,IAAI,SAAyC;AAAA,EAC7C,WAAW,SAAS,OAAO;AAAA,IACzB,SAAS,MAAM,MAAM,QAAQ;AAAA,IAC7B,IAAI,QAAQ;AAAA,MACV,OAAO;AAAA,MACP;AAAA,IACF;AAAA,EACF;AAAA,EACA,IAAI,UAAU;AAAA,EACd,IAAI,QAAgC,CAAC;AAAA,EACrC,SAAS,IAAI,EAAG,IAAI,SAAS,UAAU,UAAU,GAAG,KAAK;AAAA,IACvD,MAAM,IAAI,SAAS;AAAA,IACnB,IAAI,MAAM;AAAA,MACR,IAAI,EAAE,SAAS,OAAO;AAAA,QACpB,IAAI,EAAE,QAAQ,KAAK;AAAA,UAAK,UAAU;AAAA,MACpC,EAAO,SAAI,EAAE,SAAS,WAAW,EAAE,MAAM;AAAA,QACvC,MAAM,SAAS,SAAS,EAAE,IAAI,IAAI;AAAA,QAClC,IAAI,QAAQ;AAAA,UACV,UAAU;AAAA,UACV,QAAQ;AAAA,QACV;AAAA,MACF,EAAO,SAAI,EAAE,SAAS,aAAa,EAAE,MAAM;AAAA,QACzC,MAAM,MAAM,EAAE,MAAM,QAAQ;AAAA,QAC5B,IAAI,KAAK;AAAA,UACP,UAAU;AAAA,UAEV,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF,EAAO,SAAI,EAAE,SAAS,WAAW,CAAC,EAAE,MAAM;AAAA,MACxC,MAAM,SAAS,SAAS,EAAE,IAAI,IAAI;AAAA,MAClC,IAAI,QAAQ;AAAA,QACV,UAAU;AAAA,QACV,QAAQ;AAAA,MACV;AAAA,IACF,EAAO,SAAI,EAAE,SAAS,aAAa,CAAC,EAAE,MAAM;AAAA,MAC1C,MAAM,MAAM,EAAE,MAAM,QAAQ;AAAA,MAC5B,IAAI,KAAK;AAAA,QACP,UAAU;AAAA,QACV,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EACA,IAAI,UAAU;AAAA,IAAG,UAAU,SAAS,UAAU,CAAC,MAAM,EAAE,UAAU,OAAO,YAAY,WAAW;AAAA,EAC/F,OAAO,OAAO,IAAI;AAAA,EAClB,OAAO;AAAA,EACP,OAAO,OAAO;AAAA,EACd,OAAO,SAAS,UAAU,CAAC;AAAA,EAC3B,OAAO,UAAU;AAAA,EACjB,OAAO,QAAQ,IAAI,MAAM,MAAM,MAAM,KAAK,OAAO,QAAQ,IAAI,cAAc,OAAO,OAAO,GAAG;AAAA;AAI9F,SAAS,UAAU,CAAC,OAA4B;AAAA,EAC9C,IAAI,UAAU;AAAA,IAAG,OAAO,KAAK;AAAA,EACxB;AAAA,mBAAe,MAAM,OAAO,KAAK,CAAC;AAAA;AAwBzC,IAAM,OAAO,MAAM;AACnB,IAAM,WAAW;AAGjB,IAAM,UAAU,CAAC,QACf,eAAe,MAAM;AAAA,EACnB,MAAM;AAAA,CACP;AAEH,SAAS,OAAO,CAAC,QAAuB;AAAA,EACtC,IAAI,kBAAkB;AAAA,IAAS,OAAO,MAAM,OAAO;AAAA;AAIrD,IAAM,YAAY;AAGX,SAAS,sBAAsB,CAAC,QAAuC;AAAA,EAC5E,OAAO,YAAY,OAAO,IAAI,gBAAgB;AAAA,EAC9C,OAAO,iBAAiB,OAAO,IAAI,qBAAqB;AAAA;AAG1D,uBAAuB,SAAS;AAMzB,IAAM,kBAAkB,MAAsB;AAC9C,IAAM,QAAQ,CAAC,YAAsB,YAAoC;AACzE,IAAM,SAAS,IAAI,eAA2C;AAC9D,IAAM,YAA8B,MAAM;AAC1C,IAAM,SAA2B,MAAM;AACvC,IAAM,YAA8B,MAAM;AAC1C,IAAM,iBAAgC,OAAO,qBAAqB;AAEzE,IAAM,oBAAoB,IAAI;AAC9B,IAAM,kBAAkB,IAAI;AAK5B,IAAM,WAA0B,OAAO,eAAe;AAkBtD,SAAS,UAAU,CAAC,OAAmC;AAAA,EACrD,OAAO,OAAO,UAAU,cAAc,YAAY;AAAA;AAAA;AAG7C,MAAe,cAAc;AAAA,SAE3B,QAAQ,CAAC,OAA6D;AAAA,IAC3E,OAAO,OAAO,OAAO,OAAO,GAAG,WAAW,KAAc,CAAC;AAAA;AAAA,SAIpD,SAAY,CAAC,GAAU,SAAe;AAAA,IAC3C,MAAM,QAAQ,EAAE;AAAA,IAChB,IAAI,OAAO,YAAY;AAAA,MAAW,OAAO,MAAM;AAAA,IAC/C,IAAI,OAAO,YAAY;AAAA,MAAU,OAAO,OAAO,MAAM,KAAK;AAAA,IAC1D,OAAO,MAAM;AAAA;AAAA,EAIf,QAAY,CAAC;AAAA,EAKH,aAAa,GAAS;AAAA,EACtB,kBAAkB,GAAyB;AAAA,EAC3C,eAAe,GAAS;AAAA,EACxB,oBAAoB,GAAyB;AAAA,EAC7C,aAAa,CAAC,cAA6B;AAAA,EAC3C,kBAAkB,CAAC,cAA6C;AAAA,EAChE,YAAY,GAAY;AAAA,IAChC,OAAO;AAAA;AAAA,EAGC,OAAO,GAAS;AAAA,EAG1B,eAAe,GAAS;AAAA,IACtB,OAAO,IAAI;AAAA;AAEf;AAcA,IAAM,QAAQ,CAAC,MAAqB;AAAA;AAE7B,MAAM,kBAAkB;AAAA,EAIA;AAAA,EAHpB,QAAiB,CAAC;AAAA,EAClB,QAAgC,CAAC;AAAA,EAE1C,WAAW,CAAkB,OAAsB;AAAA,IAAtB;AAAA;AAAA,MAEzB,KAAK,GAAY;AAAA,IACnB,OAAO,KAAK;AAAA;AAAA,EAGd,OAAO,CAAC,MAAmB;AAAA,KACxB,KAAK,MAAM,GAAG,EAAE,GAAG,YAAY,KAAK,OAAO,KAAK,IAAI;AAAA;AAAA,EAGvD,QAAQ,GAAa;AAAA,IACnB,MAAM,KAAK,KAAK,MAAM,GAAG,EAAE;AAAA,IAC3B,IAAI,IAAI,SAAS;AAAA,MAAW,MAAM,IAAI,MAAM,uCAAuC;AAAA,IACnF,OAAO;AAAA;AAAA,EAGT,WAAW,CAAC,KAAmB;AAAA,IAC7B,MAAM,KAAe,EAAE,MAAM,WAAW,KAAK,OAAO,CAAC,GAAG,QAAQ,CAAC,GAAG,WAAW,CAAC,GAAG,UAAU,CAAC,EAAE;AAAA,IAChG,KAAK,QAAQ,EAAE;AAAA,IACf,KAAK,MAAM,KAAK,EAAE;AAAA;AAAA,EAGpB,YAAY,GAAS;AAAA,IACnB,KAAK,MAAM,IAAI;AAAA;AAAA,EAGjB,UAAU,GAAS;AAAA,IACjB,MAAM,SAAkB,EAAE,MAAM,UAAU,UAAU,CAAC,EAAE;AAAA,IACvD,KAAK,QAAQ,MAAM;AAAA,IACnB,KAAK,MAAM,KAAK,MAAM;AAAA;AAAA,EAIxB,WAAW,CAAC,MAAc,OAAgB,OAAuB;AAAA,IAC/D,MAAM,SAAkB,EAAE,MAAM,UAAU,UAAU,CAAC,GAAG,MAAM,OAAO,OAAO,UAAU,KAAK;AAAA,IAC3F,KAAK,QAAQ,MAAM;AAAA,IACnB,KAAK,MAAM,KAAK,MAAM;AAAA;AAAA,EAGxB,WAAW,GAAS;AAAA,IAClB,KAAK,MAAM,IAAI;AAAA;AAAA,EAIjB,SAAS,CAAC,QAA6B,OAAmB,UAAyC;AAAA,IACjG,MAAM,QAAQ,KAAK;AAAA,IACnB,MAAM,MAAM,aAAa;AAAA,IACzB,IAAI,SAAS,MAAM;AAAA,IACnB,IAAI,CAAC,QAAQ;AAAA,MACX,SAAS,MAAM,UAAU;AAAA,QACvB,KAAK,WAAW,WAAW,MAAM;AAAA,QACjC,KAAK;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,SAAS,KAAK,CAAC,MAAqD,EAAE,SAAS,OAAO;AAAA,QAC9F,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,SAAS;AAAA,QACT,MAAM;AAAA,QACN,QAAQ,CAAC;AAAA,QACT,OAAO;AAAA,QACP,QAAQ;AAAA,MACV;AAAA,MACA,MAAM,UAAU;AAAA,MAChB,IAAI,OAAO,QAAQ;AAAA,QAEjB,OAAO,UAAU,CAAC,KAAK,OAAO;AAAA,UAC5B,IAAI,OAAO,QAAQ;AAAA,YAAI;AAAA,UACvB,QAAQ,QAAQ;AAAA,UAChB,QAAQ,SAAS;AAAA,UACjB,eAAe,MAAM,OAAO,KAAK,CAAC;AAAA;AAAA,MAEtC;AAAA,MAEA,IAAI,OAAO;AAAA,QAAK,OAAO,MAAM,OAAO,IAAI,UAAU,MAAM,WAAW,KAAK,CAAC;AAAA,IAC3E;AAAA,IACA,MAAM,QAAQ;AAAA,IACd,MAAM,MAAM,IAAI,QAAQ;AAAA,IACxB,IAAI,IAAI,SAAS,MAAM,QAAQ,CAAC,MAAM,OAAO;AAAA,MAE3C,MAAM,SAAS;AAAA,MACf,MAAM,QAAQ;AAAA,MACd,aAAa,OAAO,OAAO,UAAU,GAAG;AAAA,IAC1C;AAAA,IACA,MAAM,QAAQ,MAAM;AAAA,IACpB,MAAM,UAAU,SAAS,MAAM;AAAA,IAC/B,MAAM,OAAO,MAAM;AAAA,IACnB,KAAK,YAAY,SAAS,KAAK;AAAA,IAC/B,IAAI,MAAM,QAAQ;AAAA,MAChB,MAAM,OAAQ,OAAO,OAAO,MAAM,KAAK,EAAE,IAAI;AAAA,IAC/C,EAAO,SAAI,MAAM;AAAA,MACf,MAAM,QAAQ;AAAA,MACd,MAAM,WAAW,cAAc,SAAS,CAAC,MAAM,EAAE,SAAS,OAAO,KAAK,CAAC;AAAA,MACvE,IAAI;AAAA,QAAU,QAAQ,OAA2D,OAAO,QAAQ,EAAE,IAAI;AAAA,MACjG;AAAA,iBAAS,IAAI;AAAA,IACpB,EAAO,SAAI,SAAS;AAAA,MACjB,QAAQ,OAAwC,KAAK,EAAE,IAAI;AAAA,IAC9D;AAAA,IACA,KAAK,YAAY;AAAA;AAAA,EAInB,QAAQ,CAAC,OAAmB,QAAsB;AAAA,IAChD,KAAK,QAAQ;AAAA,MACX,MAAM;AAAA,MACN,MAAM,MAAM;AAAA,MACZ,OAAO,OAAO;AAAA,MACd,KAAK,MAAM,UAAU,MAAM;AAAA,MAC3B,SAAS,OAAO;AAAA,MAChB,KAAK,OAAO;AAAA,IACd,CAAC;AAAA;AAAA,EAGH,YAAY,CAAC,MAAc,OAAsB;AAAA,IAC/C,MAAM,KAAK,KAAK,SAAS;AAAA,IACzB,IAAI,UAAU,SAAS,SAAS;AAAA,MAAM,OAAO,GAAG,MAAM;AAAA,IACjD;AAAA,SAAG,MAAM,QAAQ,UAAU,OAAO,KAAK,OAAO,KAAK;AAAA;AAAA,EAI1D,aAAa,CAAC,OAAyD;AAAA,IACrE,YAAY,MAAM,UAAU,OAAO,QAAQ,SAAS,CAAC,CAAC;AAAA,MAAG,KAAK,aAAa,MAAM,KAAK;AAAA;AAAA,EAIxF,gBAAgB,CAAC,OAAe,UAAoB,SAAwB;AAAA,IAC1E,MAAM,KAAK,KAAK,SAAS;AAAA,KACxB,GAAG,UAAU,WAAW,CAAC,GAAG,YAAY;AAAA;AAAA,EAI3C,MAAM,CAAC,KAAoB;AAAA,IACzB,KAAK,SAAS,EAAE,MAAM;AAAA;AAAA,EAIxB,MAAwB,CAAC,MAAS,KAAuC;AAAA,IACvE,KAAK,SAAS,EAAE,MAAM;AAAA;AAAA,EAQxB,eAAe,CAAC,OAAe,SAAsC;AAAA,IACnE,KAAK,SAAS,EAAE,OAAO,SAAS;AAAA;AAAA,EAGlC,OAAO,CAAC,MAAoB;AAAA,IAC1B,KAAK,QAAQ,EAAE,MAAM,QAAQ,KAAK,CAAC;AAAA;AAAA,EAIrC,OAAO,CAAC,OAAqC;AAAA,IAC3C,KAAK,QAAQ,EAAE,MAAM,QAAQ,MAAM,CAAC;AAAA;AAAA,EAGtC,UAAU,CAAC,OAAsB;AAAA,IAC/B,IAAI,WAAW,KAAK,GAAG;AAAA,MACrB,KAAK,WAAW;AAAA,MAChB,MAAM,IAAI;AAAA,MACV,KAAK,YAAY;AAAA,MACjB;AAAA,IACF;AAAA,IAEA,IAAI,UAAU,SAAS,SAAS;AAAA,MAAM,QAAQ;AAAA,IAC9C,KAAK,QAAQ,EAAE,MAAM,QAAQ,MAAM,OAAO,KAAK,EAAE,CAAC;AAAA;AAAA,EAGpD,YAAqC,CACnC,MACA,OACA,OACA,OACM;AAAA,IACN,KAAK,QAAQ;AAAA,MACX,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA,KAAK,OAAO;AAAA,MACZ,KAAK,OAAO;AAAA,IACd,CAAC;AAAA;AAAA,EAIH,QAAW,CAAC,SAAgD;AAAA,IAC1D,MAAM,QAAQ,KAAK;AAAA,IACnB,IAAI,OAAO,KAAK;AAAA,MACd,OAAO,CAAC,QAAW;AAAA,QACjB,MAAM,SAAS,QAAQ,GAAG;AAAA,QAC1B,UAAW,QAAQ,OAAO,MAAM;AAAA,QAChC,OAAO;AAAA;AAAA,IAEX,OAAO,CAAC,QAAW;AAAA,MACjB,MAAM,SAAS,QAAQ,GAAG;AAAA,MAC1B,OAAO,KAAK;AAAA,MACZ,IAAI,kBAAkB;AAAA,QAAc,OAAO,KAAK,MAAM,OAAO,KAAK,CAAC;AAAA,MACnE,OAAO;AAAA;AAAA;AAGb;AAGA,SAAS,OAAO,CAAC,IAAa,MAAc,OAAqB;AAAA,EAC/D,IAAI,KAAK,WAAW,CAAC,MAAM,MAAM,KAAK,WAAW,CAAC,MAAM;AAAA,IAAI,OAAQ,GAAmB,MAAM,YAAY,MAAM,KAAK;AAAA,EACpH,GAAG,aAAa,MAAM,KAAK;AAAA,EAC3B,IAAI,SAAS,WAAW,WAAW;AAAA,IAAK,GAAwB,QAAQ;AAAA,EACxE,IAAI,SAAS,aAAa,aAAa;AAAA,IAAK,GAAwB,UAAU;AAAA;AAGhF,SAAS,UAAU,CAAC,IAAa,MAAoB;AAAA,EACnD,IAAI,KAAK,WAAW,CAAC,MAAM,MAAM,KAAK,WAAW,CAAC,MAAM;AAAA,IAAI,OAAO,KAAM,GAAmB,MAAM,eAAe,IAAI;AAAA,EACrH,GAAG,gBAAgB,IAAI;AAAA,EACvB,IAAI,SAAS,WAAW,WAAW;AAAA,IAAK,GAAwB,QAAQ;AAAA,EACxE,IAAI,SAAS,aAAa,aAAa;AAAA,IAAK,GAAwB,UAAU;AAAA;AAUhF,IAAI;AAGG,SAAS,iBAAiB,CAAC,GAAqC;AAAA,EACrE,WAAW;AAAA;AAGb,SAAS,MAAM,CAAC,WAAmC;AAAA,EACjD,MAAM,UAAU,IAAI,kBAAkB,SAAS;AAAA,EAC/C,IAAI,aAAa;AAAA,IAAW,MAAM,SAAS,EAAE,gBAAgB,OAAO;AAAA,EAC/D;AAAA,IACH,SAAS,MAAM,SAAS;AAAA,IACxB,IAAI;AAAA,MACF,MAAM,SAAS,EAAE,gBAAgB,OAAO;AAAA,cACxC;AAAA,MACA,SAAS,IAAI,SAAS;AAAA;AAAA;AAAA,EAG1B,OAAO,QAAQ;AAAA;AAIjB,IAAI,QAAQ;AACZ,IAAI,OAAO;AACX,IAAM,cAA8B,CAAC;AAErC,SAAS,KAAK,CAAC,IAAsB;AAAA,EACnC,IAAI,YAAY;AAAA,IAAG;AAAA,EACnB,IAAI;AAAA,IACF,GAAG;AAAA,YACH;AAAA,IACA,IAAI,EAAE,UAAU;AAAA,MAAG,WAAW,QAAQ,YAAY,OAAO,CAAC;AAAA,QAAG,KAAK;AAAA;AAAA;AAItE,SAAS,MAAM,CAAC,WAA0B,QAA8B,MAAyB;AAAA,EAC/F,IAAI,EAAE,kBAAkB;AAAA,IAAU;AAAA,EAC7B,OAAO,KAAK,MAAM,OAAO,SAAS,GAAG,MAAM,YAAY,CAAC,QAAiB,KAAK,MAAM,GAAG,EAAE;AAAA;AAIhG,SAAS,IAAI,CAAC,GAAe,KAAoB;AAAA,EAC/C,IAAI,EAAE;AAAA,IAAS,EAAE,QAAQ,KAAK,EAAE,SAAS,OAAO,EAAE,OAAO,CAAC;AAAA,EACrD;AAAA,YAAQ,GAAG;AAAA;AAGlB,SAAS,aAAa,CAAC,WAAgC;AAAA,EACrD,MAAM,SAAS,EAAE,gBAAgB;AAAA,EACjC,OAAO,WAAW,MAAM,SAAS,EAAE,qBAAqB,CAAC;AAAA;AAM3D,IAAM,aAAa,CAAC,SAA6C,KAAoC;AAErG,IAAM,SAAS,CAAC,MAAqB;AAErC,SAAS,WAAW,CAAC,OAAkC,MAAyC;AAAA,EAC9F,SAAS,IAAI,MAAO,GAAG,IAAI,EAAE;AAAA,IAAQ,IAAI,EAAE,SAAS;AAAA,MAAM,OAAO;AAAA,EACjE;AAAA;AAIF,SAAS,eAAe,CAAC,UAAyB,MAA2B,OAAwC;AAAA,EACnH,MAAM,OAAO,WAAW,IAAI;AAAA,EAC5B,IAAI,CAAC;AAAA,IAAM;AAAA,EACX,YAAY,MAAM,SAAS,MAAM;AAAA,IAC/B,MAAM,SAAS,YAAY,OAAO,IAAI;AAAA,IACtC,IAAI,CAAC;AAAA,MAAQ;AAAA,IACb,OAAO,QAAQ,EAAE,QAAQ,OAAO;AAAA,IAEhC,IAAI,CAAC,OAAO;AAAA,OAAQ,OAAO,cAAc,IAAI,KAAO,IAAI,QAAQ;AAAA,EAClE;AAAA;AAGF,SAAS,mBAAmB,CAAC,UAAyB,MAA2B,OAAwC;AAAA,EACvH,MAAM,OAAO,WAAW,IAAI;AAAA,EAC5B,IAAI,CAAC;AAAA,IAAM;AAAA,EACX,cAAc,SAAS;AAAA,IAAM,YAAY,OAAO,IAAI,GAAG,WAAW,OAAO,QAAQ;AAAA;AAKnF,SAAS,aAAa,CAAC,QAAuB,WAA2C;AAAA,EACvF,WAAW,YAAY,WAAW;AAAA,IAChC,YAAY,MAAM,SAAS,WAAW,SAAS,WAAW,GAAI;AAAA,MAC5D,IAAI,SAAS,OAAO;AAAA,QAAM,OAAO,QAAQ,EAAE,QAAQ,OAAO;AAAA,IAC5D;AAAA,EACF;AAAA;AAIF,SAAS,aAAa,CAAC,WAA2C;AAAA,EAChE,WAAW,YAAY,WAAW;AAAA,IAChC,MAAM,IAAI,kBAAkB,IAAI,QAAQ;AAAA,IACxC,IAAI,CAAC,KAAK,EAAE,SAAS;AAAA,MAAM;AAAA,IAC3B,EAAE,OAAO;AAAA,IACT,IAAI;AAAA,MACF,cAAc,QAAQ;AAAA,MACtB,OAAO,QAAQ;AAAA,MACf,OAAO,KAAK;AAAA,MAEZ,QAAQ,GAAG;AAAA;AAAA,EAEf;AAAA;AAGF,SAAS,gBAAgB,CAAC,WAA0B,OAAsB;AAAA,EACxE,YAAY,KAAK,MAAM;AAAA,IACrB,MAAM,SAAS,EAAE,cAAc,KAAK;AAAA,IAC/B,MAAM,SAAS,EAAE,mBAAmB,KAAK;AAAA,GAC/C;AAAA;AAGH,SAAS,MAAM,CAAC,WAAgC;AAAA,EAC9C,MAAM,MAAM;AAAA,IACV,MAAM,IAAI,kBAAkB,IAAI,SAAS;AAAA,IACzC,MAAM,SAAS,GAAG,OAAO;AAAA,IACzB,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,SAAS,EAAE,aAAa;AAAA,MAAG;AAAA,IACvD,MAAM,OAAO,OAAO,SAAS;AAAA,IAC7B,UAAU,QAAQ,EAAE,MAAM,MAAM,EAAE,QAAQ,WAAW,EAAE,KAAK,EAAE,KAAK;AAAA,IACnE,EAAE,OAAO;AAAA,IACT,iBAAiB,WAAW,KAAK;AAAA,GAClC;AAAA;AAIH,SAAS,cAAc,CACrB,WACA,KACA,OACA,MACA,MACqC;AAAA,EACrC,MAAM,SAAS,EAAE,cAAc;AAAA,EAC/B,OAAO,WAAW,MAAM,SAAS,EAAE,mBAAmB,GAAG,IAAI;AAAA,EAC7D,cAAc,SAAS;AAAA,EACvB,MAAM,OAAO,OAAO,SAAS;AAAA,EAC7B,MAAM,UAAU,QAAQ,EAAE,MAAM,QAAQ,SAAS,cAAc,EAAE,GAAG,KAAK,OAAO,QAAQ,WAAW,KAAK;AAAA,EACxG,IAAI;AAAA,IAAM,KAAK,OAAO;AAAA,EACtB,kBAAkB,IAAI,WAAW,OAAO;AAAA,EACxC,MAAM,QAAQ,KAAK,QAAQ,CAAC,MAAM,OAAO,GAAG,WAAW,KAAK,KAAK,CAAC;AAAA,EAClE,iBAAiB,WAAW,IAAI;AAAA,EAChC,IAAI,CAAC;AAAA,IAAM,MAAM,KAAK,QAAQ,MAAM;AAAA,EACpC,OAAO,EAAE,OAAO,QAAQ;AAAA;AAG1B,SAAS,SAAS,CAAC,MAA2B,KAAuE;AAAA,EACnH,MAAM,SAAU,KAAwC;AAAA,EACxD,IAAI,CAAC,QAAQ;AAAA,IAAQ,OAAO,IAAI;AAAA,EAChC,MAAM,OAAO,KAAK,kBAAkB,IAAI;AAAA,EACxC,IAAI;AAAA,IAAM,OAAO;AAAA,EACjB,IAAI;AAAA,IAAK,MAAM,IAAI,MAAM,SAAS,KAAK,6CAA6C;AAAA,EACpF,MAAM,IAAI,MAAM,SAAS,KAAK,iCAAiC,OAAO,KAAK,IAAI,2BAA2B;AAAA;AAG5G,SAAS,MAAM,CAAC,SAAkB,UAA+B;AAAA,EAC/D,MAAM,IAAI,QAAQ;AAAA,EAClB,MAAM,SAAS,QAAQ,OAAO;AAAA,EAC9B,QAAQ,SAAS;AAAA,EAEjB,IAAI,CAAC,KAAK,CAAC,QAAQ;AAAA,IACjB,gBAAgB,QAAQ;AAAA,IACxB;AAAA,EACF;AAAA,EACA,IAAI;AAAA,IACF,MAAM,MAAM;AAAA,MACV,WAAW,UAAU,CAAC;AAAA,MACtB,gBAAgB,UAAU,EAAE,MAAM,QAAQ,KAAK;AAAA,MAC/C,EAAE,MAAM,QAAQ;AAAA,MAChB,WAAW,QAAQ,eAAe,UAAU,QAAQ,KAAK,QAAQ,OAAO,SAAS,CAAC,EAAE;AAAA,QAClF,OAAO,aAAa,MAAM,QAAQ,MAAM;AAAA,MAC1C,EAAE,WAAW;AAAA,KACd;AAAA,IACD,OAAO,KAAK;AAAA,IACZ,KAAK,GAAG,GAAG;AAAA,IACX,IAAI,CAAC,EAAE,UAAU;AAAA,MACf,kBAAkB,OAAO,QAAQ;AAAA,MACjC,UAAU,QAAQ,QAAQ;AAAA,MAC1B,oBAAoB,UAAU,EAAE,MAAM,QAAQ,KAAK;AAAA,MAEnD,MAAM,UAAU,QAAQ;AAAA,MACxB,QAAQ,OAAO,CAAC;AAAA,MAChB,WAAW,QAAQ,SAAS;AAAA,QAC1B,IAAI;AAAA,UACF,QAAQ,IAAI;AAAA,UACZ,OAAO,YAAY;AAAA,UACnB,QAAQ,UAAU;AAAA;AAAA,MAEtB;AAAA,IACF;AAAA;AAAA;AAIJ,SAAS,UAAU,CAAC,UAAyB,GAAqB;AAAA,EAChE,OAAO,OAAO,UAAU,EAAE,KAAK;AAAA,EAC/B,IAAI,EAAE;AAAA,IAAO,SAAS,QAAQ,EAAE;AAAA;AAGlC,SAAS,YAAY,CAAC,GAAe,GAAwB;AAAA,EAE3D,IAAI,EAAE;AAAA,IAAO,OAAO;AAAA,EACpB,YAAY,KAAK,UAAU,OAAO,QAAQ,EAAE,KAAK,GAAG;AAAA,IAElD,IAAI,CAAC,OAAO,GAAG,EAAE,MAAM,MAAM,KAAK,KAAM,OAAO,UAAU,YAAY,UAAU;AAAA,MAAO,OAAO;AAAA,EAC/F;AAAA,EACA,OAAO;AAAA;AAGT,IAAM,aAAa,CAAC,MAAgB,IAAI,IAAI,CAAC,GAAG,OAAO,KAAK,EAAE,MAAM,GAAG,GAAG,OAAO,KAAK,EAAE,SAAS,CAAC,CAAC;AAEnG,SAAS,MAAM,CAAC,IAAa,OAAqB;AAAA,EAChD,gBAAgB,IAAI,EAAE,EAAG,UAAU,IAAI,KAAK;AAAA,EAC5C,GAAG,iBAAiB,OAAO,CAAC,MAAM;AAAA,IAChC,MAAM,SAAS,gBAAgB,IAAI,EAAE;AAAA,IACrC,IAAI,CAAC;AAAA,MAAQ;AAAA,IACb,MAAM,OAAO,OAAO,UAAU;AAAA,IAC9B,IAAI,MAAM;AAAA,MAAgB,EAAE,eAAe;AAAA,IAC3C,IAAI,MAAM;AAAA,MAAiB,EAAE,gBAAgB;AAAA,IAC7C,MAAM,UAAU,OAAO,OAAO;AAAA,IAC9B,IAAI,CAAC;AAAA,MAAS;AAAA,IACd,MAAM,SAAS,QAAQ,CAAC;AAAA,IACxB,IAAI,OAAO,OAAO,KAAK;AAAA,MAAG,OAAO,UAAW,QAAQ,OAAO,OAAO,MAAM;AAAA,IACxE,OAAO,OAAO,KAAK;AAAA,IACnB,IAAI,kBAAkB;AAAA,MAAc,OAAO,KAAK,MAAM,OAAO,OAAO,KAAK,CAAC;AAAA,GAC3E;AAAA;AAGH,SAAS,MAAM,CACb,GACA,OACA,KACA,OACA,MAAM,OACE;AAAA,EACR,QAAQ,EAAE;AAAA,SACH;AAAA,MACH,EAAE,MAAM,SAAS,eAAe,EAAE,IAAI;AAAA,MACtC,OAAO,CAAC,EAAE,GAAG;AAAA,SACV,WAAW;AAAA,MACd,MAAM,KAAK,OAAO,EAAE,QAAQ,QAAQ,SAAS,gBAAgB,KAAK,EAAE,GAAG,IAAI,SAAS,cAAc,EAAE,GAAG;AAAA,MACvG,YAAY,MAAM,UAAU,OAAO,QAAQ,EAAE,KAAK;AAAA,QAAG,QAAQ,IAAI,MAAM,KAAK;AAAA,MAC5E,gBAAgB,IAAI,IAAI,EAAE,OAAO,QAAQ,EAAE,QAAQ,WAAW,EAAE,WAAW,WAAW,IAAI,IAAM,CAAC;AAAA,MACjG,WAAW,SAAS,WAAW,CAAC;AAAA,QAAG,OAAO,IAAI,KAAK;AAAA,MACnD,MAAM,QAAQ,MAAM,EAAE;AAAA,MACtB,WAAW,SAAS,EAAE;AAAA,QAAU,GAAG,OAAO,GAAG,OAAO,OAAO,OAAO,KAAK,OAAO,KAAK,CAAC;AAAA,MACpF,EAAE,MAAM;AAAA,MACR,EAAE,MAAM,EAAE;AAAA,MACV,OAAO,CAAC,EAAE;AAAA,IACZ;AAAA,SACK,UAAU;AAAA,MACb,EAAE,SAAS,SAAS,cAAc,EAAE;AAAA,MAEpC,MAAM,QACJ,EAAE,SAAS,YACP,QACC,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,OAAO,EAAE,OAAO,OAAO,EAAE,UAAU,MAAM,WAAW,WAAW,QAAQ,MAAM;AAAA,MAChH,OAAO,CAAC,GAAG,EAAE,SAAS,QAAQ,CAAC,MAAM,OAAO,GAAG,OAAO,KAAK,OAAO,GAAG,CAAC,GAAG,EAAE,MAAM;AAAA,IACnF;AAAA,SACK,aAAa;AAAA,MAChB,IAAI,CAAC,EAAE;AAAA,QAAS,OAAO,gBAAgB,GAAG,KAAK,KAAK;AAAA,MACpD,IAAI;AAAA,QACF,OAAO,gBAAgB,GAAG,KAAK,KAAK;AAAA,QACpC,OAAO,KAAK;AAAA,QACZ,OAAO,gBAAgB,GAAG,KAAK,KAAK,KAAK;AAAA;AAAA,IAE7C;AAAA,SACK,QAAQ;AAAA,MACX,IAAI,CAAC;AAAA,QAAW,MAAM,IAAI,MAAM,kEAAkE;AAAA,MAClG,OAAO,UAAW,EAAE,OAAO,UAAU,OAAO,EAAE,OAAO,OAAO,KAAK,KAAK,CAAE;AAAA,IAC1E;AAAA;AAAA;AAIJ,SAAS,eAAe,CAAC,GAAe,KAA+B,OAA0C;AAAA,EAC/G,MAAM,OAAO,UAAU,EAAE,MAAM,GAAG;AAAA,EAClC,IAAI,gBAAgB,SAAS;AAAA,IAC3B,MAAM,WAAoB,EAAE,UAAU;AAAA,MACpC,MAAM,CAAC;AAAA,MACP,QAAQ,SAAS,cAAc,EAAE;AAAA,MACjC;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,IACF;AAAA,IACA,KAAK,KACH,CAAC,aAAa,OAAO,UAAS,QAAQ,GACtC,CAAC,QAAQ;AAAA,MACP,MAAM,SAAS,SAAQ;AAAA,MACvB,SAAQ,SAAS;AAAA,MACjB,IAAI;AAAA,QAAQ,KAAK,QAAQ,GAAG;AAAA,MAEvB,SAAI,CAAC,EAAE;AAAA,QAAS,QAAQ,GAAG;AAAA,KAEpC;AAAA,IACA,OAAO,CAAC,SAAQ,MAAM;AAAA,EACxB;AAAA,EACA,EAAE,WAAW;AAAA,EACb,WAAW,MAAM,CAAC;AAAA,EAClB,gBAAgB,MAAM,EAAE,MAAM,KAAK;AAAA,EACnC,EAAE,MAAM,IAAI;AAAA,EACZ,QAAQ,OAAO,YAAY,eAAe,MAAM,KAAK,OAAO,WAAW,CAAC;AAAA,EACxE,EAAE,UAAU;AAAA,EACZ,OAAO;AAAA;AAIT,SAAS,eAAe,CACtB,GACA,KACA,KACA,OACQ;AAAA,EACR,MAAM,WAAW,EAAE;AAAA,EACnB,EAAE,WAAW;AAAA,EACb,IAAI,UAAU;AAAA,IAEZ,MAAM,UAAU,kBAAkB,IAAI,QAAQ;AAAA,IAC9C,kBAAkB,OAAO,QAAQ;AAAA,IACjC,UAAU,QAAQ,QAAQ;AAAA,IAC1B,oBAAoB,UAAU,EAAE,MAAM,KAAK;AAAA,IAC3C,WAAW,QAAQ,SAAS,QAAQ,CAAC,GAAG;AAAA,MACtC,IAAI;AAAA,QACF,QAAQ,IAAI;AAAA,QACZ,OAAO,YAAY;AAAA,QACnB,QAAQ,UAAU;AAAA;AAAA,IAEtB;AAAA,EACF;AAAA,EACA,EAAE,UAAU,EAAE,MAAM,CAAC,GAAG,QAAQ,SAAS,cAAc,EAAE,GAAG,KAAK,OAAO,QAAQ,WAAW,KAAK;AAAA,EAChG,KAAK,GAAG,GAAG;AAAA,EACX,OAAO,CAAC,EAAE,QAAQ,MAAM;AAAA;AAG1B,SAAS,OAAO,CAAC,GAAkB;AAAA,EACjC,QAAQ,EAAE;AAAA,SACH;AAAA,SACA;AAAA,MACH,OAAO,CAAC,EAAE,GAAI;AAAA,SACX;AAAA,MACH,OAAO,CAAC,GAAG,EAAE,SAAS,QAAQ,OAAO,GAAG,EAAE,MAAO;AAAA,SAC9C;AAAA,MACH,OAAO,CAAC,GAAG,EAAE,QAAS,KAAK,QAAQ,OAAO,GAAG,EAAE,QAAS,MAAM;AAAA,SAC3D;AAAA,MACH,OAAO,UAAU,EAAE,IAAK;AAAA;AAAA;AAI9B,SAAS,IAAI,CAAC,GAAU,GAAmB;AAAA,EACzC,IAAI,EAAE,SAAS,EAAE;AAAA,IAAM,OAAO;AAAA,EAC9B,IAAI,EAAE,SAAS;AAAA,IAAW,OAAO,EAAE,QAAS,EAAe,OAAO,EAAE,QAAS,EAAe;AAAA,EAC5F,IAAI,EAAE,SAAS;AAAA,IAAa,OAAO,EAAE,SAAU,EAAiB,QAAQ,EAAE,QAAS,EAAiB;AAAA,EAEpG,IAAI,EAAE,SAAS;AAAA,IAAU,OAAO,EAAE,SAAU,EAAc,QAAQ,EAAE,UAAW,EAAc;AAAA,EAC7F,OAAO;AAAA;AAGT,SAAS,OAAO,CAAC,GAAgB;AAAA,EAC/B,QAAQ,EAAE;AAAA,SACH;AAAA,MACH,EAAE,SAAS,QAAQ,OAAO;AAAA,MAC1B;AAAA,SACG;AAAA,MAEH,IAAI,EAAE;AAAA,QAAS,EAAE,QAAQ,YAAY;AAAA,MACrC,EAAE,SAAS,QAAQ,OAAO;AAAA,MAC1B;AAAA,SACG;AAAA,MACH,IAAI,CAAC,EAAE,UAAU;AAAA,QACf,IAAI,EAAE;AAAA,UAAS,EAAE,QAAQ,SAAS;AAAA,QAClC;AAAA,MACF;AAAA,MACA,EAAE,SAAS,KAAK,QAAQ,OAAO;AAAA,MAC/B,kBAAkB,OAAO,EAAE,QAAQ;AAAA,MACnC,oBAAoB,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,KAAK;AAAA,MACxD,gBAAgB,EAAE,QAAQ;AAAA,MAC1B;AAAA,SACG;AAAA,MACH,UAAW,QAAQ,EAAE,IAAK;AAAA,MAC1B;AAAA;AAAA;AAIN,SAAS,eAAe,CAAC,GAAwB;AAAA,EAC/C,UAAU,QAAQ,CAAC;AAAA,EAClB,EAAa,SAAS,MAAM;AAAA,EAC7B,MAAM,CAAC,EAAE,QAAQ;AAAA,EACjB,MAAM,IAAI;AAAA,EACV,EAAE,UAAU,WAAW;AAAA,EACvB,QAAQ,EAAE,UAAU,gBAAgB,CAAC;AAAA;AAGvC,SAAS,MAAM,CAAC,QAAc,GAAgB;AAAA,EAC5C,WAAW,QAAQ,QAAQ,CAAC;AAAA,IAAG,OAAO,YAAY,IAAI;AAAA,EACtD,QAAQ,CAAC;AAAA;AAGX,SAAS,KAAK,CACZ,GACA,GACA,OACA,KACA,OACM;AAAA,EACN,QAAQ,EAAE;AAAA,SACH,QAAQ;AAAA,MACX,MAAM,MAAO,EAAE,MAAO,EAAY;AAAA,MAClC,IAAI,IAAI,SAAS,EAAE;AAAA,QAAM,IAAI,OAAO,EAAE;AAAA,MACtC;AAAA,IACF;AAAA,SACK,WAAW;AAAA,MACd,MAAM,MAAM;AAAA,MACZ,MAAM,KAAM,EAAE,MAAM,IAAI;AAAA,MACxB,WAAW,QAAQ,OAAO,KAAK,IAAI,KAAK;AAAA,QAAG,IAAI,EAAE,QAAQ,EAAE;AAAA,UAAQ,WAAW,IAAI,IAAI;AAAA,MACtF,YAAY,MAAM,UAAU,OAAO,QAAQ,EAAE,KAAK,GAAG;AAAA,QACnD,MAAM,OAAO,SAAS,UAAW,GAAwB,QAAQ;AAAA,QACjE,IAAI,IAAI,MAAM,UAAU,SAAU,SAAS,aAAa,SAAS;AAAA,UAAQ,QAAQ,IAAI,MAAM,KAAK;AAAA,MAClG;AAAA,MACA,MAAM,SAAS,gBAAgB,IAAI,EAAE;AAAA,MACrC,OAAO,SAAS,EAAE;AAAA,MAClB,OAAO,YAAY,EAAE;AAAA,MACrB,WAAW,SAAS,WAAW,CAAC;AAAA,QAAG,IAAI,CAAC,OAAO,UAAU,IAAI,KAAK;AAAA,UAAG,OAAO,IAAI,KAAK;AAAA,MACrF,UAAU,IAAI,IAAI,UAAU,EAAE,UAAU,MAAM,OAAO,KAAK,KAAK;AAAA,MAC/D,EAAE,MAAM,EAAE;AAAA,MACV;AAAA,IACF;AAAA,SACK,UAAU;AAAA,MACb,MAAM,MAAM;AAAA,MACZ,MAAM,SAAU,EAAE,SAAS,IAAI;AAAA,MAE/B,MAAM,SAAS,IAAI;AAAA,MACnB,IAAI;AAAA,MACJ,IAAI,QAAQ;AAAA,MACZ,IAAI,QAAQ;AAAA,QACV,OAAO,SAAS;AAAA,QAChB,EAAE,UAAU;AAAA,QACZ,QAAQ;AAAA,QAER,IAAI,CAAC,OAAO,SAAS,CAAC,OAAO,GAAG,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,UACtD,OAAO,QAAQ,EAAE;AAAA,UACjB,IAAI,OAAO,WAAW,MAAM;AAAA,YAC1B,cAAc,CAAC,GAAG,OAAO,SAAS;AAAA,YAClC,cAAc,QAAQ,WAAW;AAAA,UACnC;AAAA,QACF;AAAA,MACF;AAAA,MACA,UAAU,OAAO,YAAa,IAAI,UAAU,EAAE,UAAU,QAAQ,OAAO,KAAK,KAAK;AAAA,MAEjF,IAAI;AAAA,QAAa,cAAc,WAAW;AAAA,MAC1C;AAAA,IACF;AAAA,SACK,aAAa;AAAA,MAChB,MAAM,MAAM;AAAA,MACZ,EAAE,UAAU,IAAI;AAAA,MAChB,IAAI,CAAC,IAAI,UAAU;AAAA,QAEjB,IAAI,EAAE,QAAS;AAAA,UAAQ,EAAE,QAAS,SAAS;AAAA,QAC3C;AAAA,MACF;AAAA,MACA,MAAM,WAAY,EAAE,WAAW,IAAI;AAAA,MAEnC,MAAM,UAAU,EAAE,QAAQ,IAAI,OAAO,aAAa,KAAK,CAAC;AAAA,MACxD,IAAI,EAAE,QAAQ;AAAA,QAAW,EAAE,QAAS,MAAM,EAAE;AAAA,MAC5C,WAAW,UAAU,CAAC;AAAA,MACtB,EAAE,MAAM,QAAQ;AAAA,MAChB,IAAI,SAAS;AAAA,QACX,EAAE,QAAS,OAAO;AAAA,QAClB,cAAc,QAAQ;AAAA,QACtB,OAAO,QAAQ;AAAA,MACjB;AAAA,MACA;AAAA,IACF;AAAA,SACK,QAAQ;AAAA,MAEX,UAAW,QAAS,EAAE,OAAQ,EAAY,IAAM;AAAA,MAChD;AAAA,IACF;AAAA;AAAA;AAIJ,IAAM,QAAQ,CAAC,MAA0B,MAAM,EAAE,SAAS,aAAa,EAAE,SAAS,eAAe,EAAE,MAAM;AAEzG,SAAS,SAAS,CAChB,QACA,KACA,MACA,KACA,OACA,KACA,OACM;AAAA,EACN,IAAI,IAAI,KAAK,CAAC,MAAM,MAAM,CAAC,KAAK,IAAI,KAAK,KAAK,KAAK,CAAC,MAAM,MAAM,CAAC,KAAK,IAAI,GAAG;AAAA,IAC3E,WAAW,QAAQ,KAAK,MAAM,KAAK,OAAO,KAAK,KAAK;AAAA,IACpD;AAAA,EACF;AAAA,EAEA,SAAS,IAAI,EAAG,IAAI,KAAK,QAAQ,KAAK;AAAA,IACpC,MAAM,IAAI,KAAK;AAAA,IACf,MAAM,IAAI,IAAI;AAAA,IACd,IAAI,KAAK,KAAK,GAAG,CAAC,GAAG;AAAA,MACnB,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK;AAAA,MAC7B;AAAA,IACF;AAAA,IACA,MAAM,MAAM,IAAI,QAAQ,CAAC,EAAE,KAAM;AAAA,IACjC,WAAW,QAAQ,OAAO,GAAG,OAAO,KAAK,OAAO,MAAM,MAAM,CAAC;AAAA,MAAG,OAAO,aAAa,MAAM,GAAG;AAAA,IAC7F,IAAI;AAAA,MAAG,OAAO,QAAQ,CAAC;AAAA,EACzB;AAAA,EACA,WAAW,KAAK,IAAI,MAAM,KAAK,MAAM;AAAA,IAAG,OAAO,QAAQ,CAAC;AAAA;AAI1D,SAAS,UAAU,CACjB,QACA,KACA,MACA,KACA,OACA,KACA,OACM;AAAA,EACN,MAAM,QAAQ,IAAI;AAAA,EAClB,WAAW,KAAK;AAAA,IAAK,IAAI,MAAM,CAAC,KAAK;AAAA,MAAM,MAAM,IAAI,MAAM,CAAC,GAAG,CAAC;AAAA,EAChE,MAAM,OAAO,IAAI;AAAA,EACjB,MAAM,UAAU,KAAK,IAAI,CAAC,GAAG,MAAM;AAAA,IACjC,MAAM,MAAM,MAAM,CAAC;AAAA,IACnB,MAAM,IAAI,OAAO,OAAO,MAAM,IAAI,GAAG,IAAI,MAAM,IAAI,EAAE,KAAK,OAAO,IAAI,KAAK;AAAA,IAC1E,IAAI,KAAK,CAAC,KAAK,IAAI,CAAC,KAAK,KAAK,GAAG,CAAC,GAAG;AAAA,MACnC,KAAK,IAAI,CAAC;AAAA,MACV,OAAO;AAAA,IACT;AAAA,IACA;AAAA,GACD;AAAA,EACD,WAAW,KAAK;AAAA,IAAK,IAAI,CAAC,KAAK,IAAI,CAAC;AAAA,MAAG,OAAO,QAAQ,CAAC;AAAA,EACvD,IAAI,MAAM;AAAA,EACV,SAAS,IAAI,KAAK,SAAS,EAAG,KAAK,GAAG,KAAK;AAAA,IACzC,MAAM,IAAI,KAAK;AAAA,IACf,MAAM,IAAI,QAAQ;AAAA,IAClB,IAAI;AAAA,IACJ,IAAI,GAAG;AAAA,MACL,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK;AAAA,MAC7B,QAAQ,QAAQ,CAAC;AAAA,IACnB,EAAO;AAAA,MACL,QAAQ,OAAO,GAAG,OAAO,KAAK,OAAO,MAAM,MAAM,CAAC;AAAA;AAAA,IAEpD,SAAS,IAAI,MAAM,SAAS,EAAG,KAAK,GAAG,KAAK;AAAA,MAC1C,MAAM,OAAO,MAAM;AAAA,MACnB,IAAI,KAAK,eAAe,UAAU,KAAK,gBAAgB;AAAA,QAAK,OAAO,aAAa,MAAM,GAAG;AAAA,MACzF,MAAM;AAAA,IACR;AAAA,EACF;AAAA;AAGF,SAAS,aAAa,CAAC,QAAmC;AAAA,EACxD,IAAI,OAAO,WAAW;AAAA,IAAU,OAAO;AAAA,EACvC,MAAM,QAAQ,SAAS,KAAK,MAAM,IAAI,SAAS,cAAc,MAAM,IAAI,SAAS,eAAe,MAAM;AAAA,EACrG,IAAI,CAAC;AAAA,IAAO,MAAM,IAAI,MAAM,uBAAuB,mBAAmB;AAAA,EACtE,OAAO;AAAA;AAIF,SAAS,KAA8B,CAAC,MAAe,QAA0B,KAAuB;AAAA,EAC7G,MAAM,OAAO,cAAc,MAAM;AAAA,EACjC,MAAM,OAAO,UAAU,MAAM,GAAG;AAAA,EAChC,IAAI,gBAAgB;AAAA,IAAS,MAAM,IAAI,MAAM,wBAAwB,KAAK,6BAA6B;AAAA,EACvG,MAAM,MAAM,KAAK,gBAAgB,GAAG,eAAe,MAAM,KAAK,SAAS,EAAE,KAAK,CAAC;AAAA,EAC/E,QAAQ,KAAK,YAAY,CAAC;AAAA,EAC1B,OAAO;AAAA;AAAA;AAIF,MAAM,gBAAgB,cAAc;AAAA,EACzC,OAAO;AAAA,EACP,cAAc;AAAA,EACd,QAA4B;AAAA,EAI5B,QAAQ;AAAA,EAER;AAAA,EACA,UAAyB;AAAA,EACzB;AAAA,EAEmB,aAAa,GAAS;AAAA,IACvC,MAAM,MAAM,aAAa;AAAA,IACzB,KAAK,QAAQ,IAAI,QAAQ,EAAE;AAAA,IAC3B,MAAM,KAAK,MAAM;AAAA,MACf,MAAM,OAAO,IAAI,QAAQ,EAAE;AAAA,MAC3B,IAAI,SAAS,KAAK;AAAA,QAAO;AAAA,MACzB,KAAK,QAAQ;AAAA,MACb,KAAK,gBAAgB;AAAA;AAAA,IAEvB,KAAK,OAAO,IAAI,UAAU,IAAI,QAAQ,EAAE,IAAI,IAAI,UAAU,EAAE;AAAA;AAAA,EAG3C,OAAO,GAAS;AAAA,IACjC,KAAK,OAAO;AAAA;AAAA,EAGd,OAAO,GAAY;AAAA,IACjB,IAAI,KAAK,SAAS,KAAK,MAAM;AAAA,MAC3B,KAAK,OAAO,KAAK;AAAA,MACjB,MAAM,MAAM,IAAI,IAAI,KAAK,MAAM,SAAS,OAAO;AAAA,MAC/C,KAAK,UAAU,IAAI,WAAW,SAAS,SAAS,IAAI,WAAW;AAAA,IACjE;AAAA,IACA,MAAM,SAAS,KAAK;AAAA,IACpB,IAAI,WAAW;AAAA,MAAM,OAAO;AAAA,IAC5B,MAAM,OAAO,KAAK;AAAA,IAElB,IAAI,KAAK,UAAU,WAAW,WAAW,GAAG,SAAS;AAAA,MAAM,OAAO,SAAS;AAAA,IAC3E,OAAO,SAAS,UAAU,KAAK,WAAW,OAAO,SAAS,GAAG,IAAI,SAAS,GAAG,SAAS;AAAA;AAAA,EAGrE,eAAe,CAAC,GAA4B;AAAA,IAC7D,EAAE,YAAY,GAAG;AAAA,IACjB,EAAE,aAAa,QAAQ,KAAK,IAAI;AAAA,IAChC,IAAI,KAAK,QAAQ,GAAG;AAAA,MAClB,EAAE,aAAa,SAAS,KAAK,WAAW;AAAA,MACxC,EAAE,aAAa,gBAAgB,MAAM;AAAA,IACvC;AAAA,IACA,EAAE,WAAW,KAAK,MAAM,UAAU,KAAK,IAAI;AAAA,IAC3C,EAAE,aAAa;AAAA;AAEnB;",
|
|
8
|
+
"debugId": "085B9300273EBAC364756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/index.js
CHANGED
package/model.js
CHANGED
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
patchIsland,
|
|
9
9
|
setFineHooks,
|
|
10
10
|
setRenderObserver
|
|
11
|
-
} from "./index-
|
|
11
|
+
} from "./index-k290gfdd.js";
|
|
12
12
|
|
|
13
13
|
// runtime/entity-set.ts
|
|
14
14
|
class EntitySet extends Array {
|
|
@@ -478,6 +478,17 @@ function refreshAll(h) {
|
|
|
478
478
|
}
|
|
479
479
|
var textOf = (value) => value === null || value === undefined || value === false ? "" : String(value);
|
|
480
480
|
function setAttr(el, name, value) {
|
|
481
|
+
if (name.charCodeAt(0) === 45 && name.charCodeAt(1) === 45) {
|
|
482
|
+
const style = el.style;
|
|
483
|
+
const text2 = value === null || value === undefined || value === false ? "" : String(value);
|
|
484
|
+
if (style.getPropertyValue(name) === text2)
|
|
485
|
+
return;
|
|
486
|
+
if (text2 === "")
|
|
487
|
+
style.removeProperty(name);
|
|
488
|
+
else
|
|
489
|
+
style.setProperty(name, text2);
|
|
490
|
+
return;
|
|
491
|
+
}
|
|
481
492
|
if (value === null || value === undefined || value === false) {
|
|
482
493
|
if (el.hasAttribute(name))
|
|
483
494
|
el.removeAttribute(name);
|
|
@@ -1454,5 +1465,5 @@ export {
|
|
|
1454
1465
|
requiredIdValue
|
|
1455
1466
|
};
|
|
1456
1467
|
|
|
1457
|
-
//# debugId=
|
|
1468
|
+
//# debugId=1D6B4E24F03EAD3F64756E2164756E21
|
|
1458
1469
|
//# sourceMappingURL=model.js.map
|
package/model.js.map
CHANGED
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
"sources": ["../../../runtime/entity-set.ts", "../../../runtime/fine.ts", "../../../runtime/model.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"// A tracked list of models: the items keep their own state, and the set keeps the list it started\n// from, so it can put it back. On a tracked field it tells its model when it is mutated, without\n// touching the model's own state. `set[i] = x` and `set.length = n` are not observed; the methods\n// below are. `map`, `filter` and `slice` give plain arrays. A set assigned to two models notifies\n// only the last one. `new EntitySet(n)` (holes) is not supported: use `EntitySet.track`. Its membership is\n// tracked like a field: `view` and `for...of` report a read, every mutation above notifies those readers.\n\nimport { $notify, Model, State } from \"./model\";\n\nexport class EntitySet<T extends Model> extends Array<T> {\n static override get [Symbol.species](): ArrayConstructor {\n return Array;\n }\n\n /** Builds a set from server data: `Array.of` and `Array.from` keep their own meaning. */\n static track<T extends Model>(type: new (data?: object) => T, items?: Iterable<object>): EntitySet<T> {\n const set = new EntitySet<T>();\n if (items) for (const item of items) Array.prototype.push.call(set, new type(item));\n return set;\n }\n\n // The items the list held before its first mutation: references only, taken lazily.\n #original: T[] | undefined;\n #owner: Model | undefined;\n #index = 0;\n /** Renders and fine bindings that read the membership, as the model tracker's deps. */\n #subs: object[] | undefined;\n\n /** @internal The model this set belongs to, and the index of the field holding it. */\n $own(owner: Model, index: number): void {\n this.#owner = owner;\n this.#index = index;\n }\n\n /** @internal */\n $watch(dep: object): void {\n const subs = (this.#subs ??= []);\n (dep as { slot: number }).slot = subs.length;\n subs.push(dep);\n }\n\n /** @internal */\n $unwatch(dep: object): void {\n const subs = this.#subs;\n if (subs === undefined || subs.length === 0) return;\n const last = subs.pop() as { slot: number };\n if (last !== dep) {\n const slot = (dep as { slot: number }).slot;\n subs[slot] = last;\n last.slot = slot;\n }\n }\n\n override [Symbol.iterator](): ArrayIterator<T> {\n Model.$reader?.(this as unknown as Model, 0);\n return super[Symbol.iterator]();\n }\n\n /** The items to show: everything but the deleted ones. */\n get view(): T[] {\n Model.$reader?.(this as unknown as Model, 0);\n return this.filter((item) => !item.hasState(State.Deleted));\n }\n\n get hasChanges(): boolean {\n Model.$reader?.(this as unknown as Model, 0);\n if (this.#moved()) return true;\n for (let i = 0; i < this.length; i++) if (this[i]!.hasChanges) return true;\n return false;\n }\n\n get hasErrors(): boolean {\n Model.$reader?.(this as unknown as Model, 0);\n for (let i = 0; i < this.length; i++) if (this[i]!.hasErrors) return true;\n return false;\n }\n\n /** What to send to the server: only the items that changed, each as its own `changes`. */\n get changes(): Record<string, unknown>[] {\n const result: Record<string, unknown>[] = [];\n for (let i = 0; i < this.length; i++) {\n const changes = this[i]!.changes;\n if (changes) result.push(changes);\n }\n return result;\n }\n\n /** Added items leave the set, the others are marked Deleted; a Detached one is left alone. */\n delete(...items: T[]): this {\n let touched = false;\n for (const item of items) {\n if (item.hasState(State.Added)) {\n const at = this.indexOf(item);\n if (at >= 0) {\n this.#snapshot();\n super.splice(at, 1);\n touched = true;\n }\n } else if (!item.hasState(State.Detached)) {\n item.markDeleted();\n touched = true;\n }\n }\n if (touched) this.#notify();\n return this;\n }\n\n revertChanges(): this {\n const original = this.#original;\n let touched = original !== undefined;\n if (original !== undefined) {\n this.#original = undefined;\n super.splice(0, this.length, ...original);\n }\n for (let i = 0; i < this.length; i++)\n if (this[i]!.hasChanges) {\n this[i]!.revertChanges();\n touched = true;\n }\n if (touched) this.#notify();\n return this;\n }\n\n /**\n * Takes the list the server confirmed: a `null` at an index drops that item, as do the deleted ones.\n * Items past the end of a shorter server list are left exactly as they are.\n */\n confirmChanges(items?: readonly (object | null)[]): this {\n let touched = this.#original !== undefined;\n const length = this.length;\n const limit = items ? Math.min(items.length, length) : length;\n let w = 0;\n for (let r = 0; r < length; r++) {\n const item = this[r]!;\n if (r < limit) {\n const confirmed = items?.[r];\n if (confirmed === null || item.hasState(State.Deleted)) continue;\n item.confirmChanges(confirmed);\n }\n this[w++] = item;\n }\n if (w !== length) {\n this.length = w;\n touched = true;\n }\n this.#original = undefined;\n if (touched) this.#notify();\n return this;\n }\n\n override push(...items: T[]): number;\n override push(item?: T): number {\n const count = arguments.length;\n if (count !== 0) {\n this.#snapshot();\n if (count === 1) super.push(item!);\n else super.push(...(Array.prototype.slice.call(arguments) as T[]));\n this.#notify();\n }\n return this.length;\n }\n\n override unshift(...items: T[]): number {\n if (items.length !== 0) {\n this.#snapshot();\n super.unshift(...items);\n this.#notify();\n }\n return this.length;\n }\n\n override pop(): T | undefined {\n if (this.length === 0) return undefined;\n this.#snapshot();\n const item = super.pop();\n this.#notify();\n return item;\n }\n\n override shift(): T | undefined {\n if (this.length === 0) return undefined;\n this.#snapshot();\n const item = super.shift();\n this.#notify();\n return item;\n }\n\n override splice(start: number, deleteCount?: number, ...items: T[]): T[] {\n if (items.length === 0) {\n const length = this.length;\n const from = start < 0 ? Math.max(length + start, 0) : Math.min(start, length);\n if (from >= length || (deleteCount !== undefined && deleteCount <= 0)) return [];\n }\n this.#snapshot();\n const removed =\n deleteCount === undefined && items.length === 0 ? super.splice(start) : super.splice(start, deleteCount!, ...items);\n this.#notify();\n return removed;\n }\n\n override sort(compare?: (a: T, b: T) => number): this {\n this.#snapshot();\n super.sort(compare);\n this.#notify();\n return this;\n }\n\n override reverse(): T[] {\n this.#snapshot();\n super.reverse();\n this.#notify();\n return this;\n }\n\n #snapshot(): void {\n this.#original ??= this.slice();\n }\n\n #moved(): boolean {\n const original = this.#original;\n if (original === undefined) return false;\n if (original.length !== this.length) return true;\n for (let i = 0; i < original.length; i++) if (original[i] !== this[i]) return true;\n return false;\n }\n\n #notify(): void {\n this.#owner?.$touched(this.#index);\n const subs = this.#subs;\n if (subs !== undefined) for (let i = 0; i < subs.length; i++) $notify(subs[i]!, 0);\n }\n}\n",
|
|
6
|
-
"// Fine components (`@fine`): no render pass. A fine component builds its DOM once, and each dynamic expression\n// is a binding: it collects the tracked fields it reads while it runs, and re-runs through the model queue (once\n// per microtask) when one of them changes. A binding is its own dep for the first source it reads.\n\nimport { $inSvg as inSvg, $isFragment, ComponentBase, disposeIsland, FINE, patchIsland, setFineHooks, SVG, type FineRoot, type IApplication, type RenderTreeBuilder, type VNode } from \"./index\";\nimport { $flush, $notify, Model } from \"./model\";\n\nconst TEXT = 0;\nconst ATTR = 1;\nconst REGION = 2;\nconst LIST = 3;\n/** A virtual-DOM subtree (child components, slots, `@cascade`, routes, markup values), patched on change. */\nconst ISLAND = 4;\nconst KIND = 7;\n/** The tracker has it queued; `at` reads 0 then, else -1. */\nconst QUEUED = 8;\n/** `model` is a map of deps: the binding read more than one source. */\nconst MANY = 16;\nconst DEAD = 32;\n/** In its component's `loose` list: its last run read nothing tracked. */\nconst LOOSE = 64;\n/** A row's binding: `read` is shared by the list's rows and takes the row's item (`data.item`). */\nconst ITEM = 128;\n\n// Same bits as the model tracker: fields from the 30th share bit 30, `state` (-1) has bit 31.\nconst bitOf = (index: number): number => (index === -1 ? 1 << 31 : index < 30 ? 1 << index : 1 << 30);\n\ntype Source = { $watch(dep: object): void; $unwatch(dep: object): void };\ntype Dep = { model: Source; owner: Binding; mask: number; slot: number };\n/** Where the fine component was mounted: what an island needs to mount components. */\ntype Ctx = { owner: ComponentBase; app: IApplication | undefined; scope: unknown; loose: Binding[] };\n/** Where bindings are chained: a fine root, a region or a list row. */\ntype Holder = { bindings: unknown; ctx: Ctx };\ntype Region = { bindings: Binding | undefined; ctx: Ctx; start: Comment; item: unknown };\n/** A row's shared reads, from the list: `(item, x) => value`; a handler's gives the handler. */\ntype Reads = readonly ((item: any, x?: any) => any)[];\ntype Row = { bindings: Binding | undefined; ctx: Ctx; head: Node; tail: Node; item: unknown; reads: Reads | undefined };\ntype Island = { ctx: Ctx; tree: VNode[]; build: (b: RenderTreeBuilder) => void };\ntype Build = (parent: Node) => void;\ntype ListState = { build: (parent: Node, item: any) => void; ctx: Ctx; rows: Map<unknown, Row>; order: Row[]; reads: Reads | undefined };\n\n/** The element type of tag `K`. */\nexport type El<K extends string> = K extends keyof HTMLElementTagNameMap ? HTMLElementTagNameMap[K] : HTMLElement;\n\nlet collecting: Binding | undefined;\nlet holder: Holder | undefined;\n\nfunction collect(source: Source, index: number): void {\n const b = collecting!;\n const bit = bitOf(index);\n const own = b.model;\n if (own === source) {\n b.mask |= bit;\n return;\n }\n if (own === undefined) {\n b.model = source;\n b.mask = bit;\n source.$watch(b);\n return;\n }\n let deps: Map<Source, Dep>;\n if ((b.flags & MANY) !== 0) deps = own as Map<Source, Dep>;\n else {\n // The first source moves to a plain dep too, so the map holds one shape.\n const first: Dep = { model: own as Source, owner: b, mask: b.mask, slot: 0 };\n (own as Source).$unwatch(b);\n (own as Source).$watch(first);\n b.model = deps = new Map([[own as Source, first]]);\n b.flags |= MANY;\n }\n let dep = deps.get(source);\n if (dep === undefined) {\n dep = { model: source, owner: b, mask: 0, slot: 0 };\n source.$watch(dep);\n deps.set(source, dep);\n }\n dep.mask |= bit;\n}\n\n/** One dynamic part of a fine component. 8 fields, so one 80-byte JSC cell. */\nclass Binding {\n model: Source | Map<Source, Dep> | undefined = undefined;\n mask = 0;\n slot = 0;\n next: Binding | undefined = undefined;\n\n constructor(\n public flags: number,\n /** TEXT: its Text; ATTR: its element; REGION, LIST and ISLAND: the comment that ends them. */\n public node: Node,\n /** TEXT and ATTR: the value; REGION: builds into its argument; LIST: the items; ISLAND: patches it. */\n public read: (a?: any, b?: any) => unknown,\n /** TEXT: its holder; ATTR: the attribute (ITEM: its row); REGION: its `Region`; LIST: its `ListState`; ISLAND: its `Island`. */\n public data: any,\n ) {}\n\n // The model queue reads these; prototype accessors cost no field.\n get owner(): Binding {\n return this;\n }\n get component(): Binding {\n return this;\n }\n get renders(): number {\n return 0;\n }\n get at(): number {\n return (this.flags & (QUEUED | DEAD)) !== 0 ? 0 : -1;\n }\n set at(value: number) {\n if ((this.flags & DEAD) === 0) this.flags = value < 0 ? this.flags & ~QUEUED : this.flags | QUEUED;\n }\n\n #reset(): void {\n this.mask = 0;\n if ((this.flags & MANY) !== 0) for (const dep of (this.model as Map<Source, Dep>).values()) dep.mask = 0;\n }\n\n // Drops the sources the last run did not read again.\n #sweep(): void {\n const own = this.model;\n if (own === undefined) return this.#loose();\n if ((this.flags & MANY) === 0) {\n if (this.mask === 0) {\n (own as Source).$unwatch(this);\n this.model = undefined;\n this.#loose();\n }\n return;\n }\n const deps = own as Map<Source, Dep>;\n for (const [source, dep] of deps)\n if (dep.mask === 0) {\n source.$unwatch(dep);\n deps.delete(source);\n }\n if (deps.size === 0) {\n this.model = undefined;\n this.flags &= ~MANY;\n this.#loose();\n }\n }\n\n // Nothing tracked tells it about changes: its component re-runs it after each of its handlers.\n #loose(): void {\n if ((this.flags & (LOOSE | DEAD)) !== 0 || holder === undefined) return;\n this.flags |= LOOSE;\n holder.ctx.loose.push(this);\n }\n\n #run(parent?: Node): unknown {\n const prev = collecting;\n const reader = Model.$reader;\n collecting = this;\n Model.$reader = collect as unknown as typeof Model.$reader;\n this.#reset();\n try {\n return (this.flags & ITEM) !== 0 ? this.read(this.data.item, parent) : this.read(parent);\n } finally {\n collecting = prev;\n Model.$reader = reader;\n this.#sweep();\n }\n }\n\n stateHasChanged(): void {\n const flags = this.flags;\n if ((flags & DEAD) !== 0) return;\n switch (flags & KIND) {\n case TEXT: {\n const value = this.#run();\n if ($isFragment(value)) return this.#becomeIsland();\n const text = textOf(value);\n const node = this.node as Text;\n if (node.data !== text) node.data = text;\n return;\n }\n case ATTR:\n return setAttr(this.node as Element, (flags & ITEM) !== 0 ? (this.read as unknown as Named).$n : this.data, this.#run());\n case REGION: {\n const region = this.data as Region;\n disposeAll(region);\n const end = this.node;\n const parent = end.parentNode!;\n while (region.start.nextSibling !== end) parent.removeChild(region.start.nextSibling!);\n const frag = document.createDocumentFragment();\n within(region, () => this.#run(frag));\n parent.insertBefore(frag, end);\n return;\n }\n case LIST:\n return reconcile(this, this.#run() as Iterable<unknown>);\n case ISLAND:\n this.#run();\n return;\n }\n }\n\n // `@expr` gave markup: from now on it renders through the virtual DOM, whatever it gives.\n #becomeIsland(): void {\n const read = this.read;\n const h = this.data as Holder & { item?: unknown };\n const value = (this.flags & ITEM) !== 0 ? () => read(h.item) : read;\n const text = this.node;\n const end = text.parentNode!.insertBefore(document.createComment(\"\"), text.nextSibling);\n text.parentNode!.removeChild(text);\n this.node = end;\n this.flags = (this.flags & ~(KIND | ITEM)) | ISLAND;\n island(this, h.ctx, (b) => {\n const v = value();\n if ($isFragment(v)) (v as (b: RenderTreeBuilder) => void)(b);\n else b.addContent(v);\n });\n this.stateHasChanged();\n }\n\n dispose(): void {\n if ((this.flags & DEAD) !== 0) return;\n const kind = this.flags & KIND;\n if (kind === REGION) disposeAll(this.data as Region);\n else if (kind === LIST) for (const row of (this.data as ListState).order) disposeAll(row);\n else if (kind === ISLAND) {\n disposeIsland((this.data as Island).tree);\n (this.data as Island).tree = [];\n }\n this.#reset();\n this.#sweep();\n this.flags = DEAD;\n }\n}\n\n/** Makes `b` patch a virtual-DOM island built by `build`, before its end comment. */\nfunction island(b: Binding, ctx: Ctx, build: (b: RenderTreeBuilder) => void): void {\n const state: Island = { ctx, tree: [], build };\n b.data = state;\n b.read = () => {\n state.tree = patchIsland(ctx.owner, ctx.app, ctx.scope, b.node, state.tree, build);\n };\n}\n\n/** Re-runs the component's bindings that read nothing tracked; drops the dead ones and those that now track. */\nfunction refreshLoose(ctx: Ctx): void {\n const loose = ctx.loose;\n for (let i = 0; i < loose.length; ) {\n const b = loose[i]!;\n if ((b.flags & DEAD) !== 0 || b.model !== undefined) {\n b.flags &= ~LOOSE;\n loose[i] = loose[loose.length - 1]!;\n loose.pop();\n continue;\n }\n b.stateHasChanged();\n i++;\n }\n}\n\n// Like a render after a vdom handler, what the handler changed shows before it returns.\nfunction afterHandler(ctx: Ctx, result: unknown): void {\n $flush();\n refreshLoose(ctx);\n if (result instanceof Promise) void result.then(() => refreshLoose(ctx));\n}\n\nfunction within(h: Holder, run: () => void): void {\n const prev = holder;\n holder = h;\n try {\n run();\n } finally {\n holder = prev;\n }\n}\n\nfunction track(b: Binding): void {\n const h = holder!;\n b.next = h.bindings as Binding | undefined;\n h.bindings = b;\n b.stateHasChanged();\n}\n\nfunction disposeAll(h: Holder): void {\n for (let b = h.bindings as Binding | undefined; b !== undefined; b = b.next) b.dispose();\n h.bindings = undefined;\n}\n\n/** Re-runs every binding under `h`, rows included: what `stateHasChanged` does for changes nothing tracks. */\nfunction refreshAll(h: Holder): void {\n for (let b = h.bindings as Binding | undefined; b !== undefined; b = b.next) {\n b.stateHasChanged();\n if ((b.flags & KIND) === LIST) for (const row of (b.data as ListState).order) refreshAll(row);\n }\n}\n\nconst textOf = (value: unknown): string => (value === null || value === undefined || value === false ? \"\" : String(value));\n\n/** `null`, `undefined` and `false` remove it, `true` sets it empty; `value` and `checked` follow onto the property. */\nfunction setAttr(el: Element, name: string, value: unknown): void {\n if (value === null || value === undefined || value === false) {\n if (el.hasAttribute(name)) el.removeAttribute(name);\n if (name === \"checked\" && \"checked\" in el) (el as HTMLInputElement).checked = false;\n return;\n }\n const text = value === true ? \"\" : String(value);\n if (el.getAttribute(name) !== text) el.setAttribute(name, text);\n if (name === \"value\" && \"value\" in el && (el as HTMLInputElement).value !== text) (el as HTMLInputElement).value = text;\n else if (name === \"checked\" && \"checked\" in el) (el as HTMLInputElement).checked = true;\n}\n\nfunction removeRange(head: Node, tail: Node): void {\n const parent = head.parentNode!;\n for (let node = head; ; ) {\n const next = node.nextSibling;\n parent.removeChild(node);\n if (node === tail) return;\n node = next!;\n }\n}\n\n// Rows are matched by identity: kept rows keep their nodes and bindings, and only move when out of place.\nfunction reconcile(list: Binding, items: Iterable<unknown>): void {\n const state = list.data as ListState;\n const end = list.node;\n const parent = end.parentNode!;\n const next = Array.isArray(items) ? (items as unknown[]) : [...items];\n const keep = new Set(next);\n for (const [item, row] of state.rows)\n if (!keep.has(item)) {\n disposeAll(row);\n removeRange(row.head, row.tail);\n state.rows.delete(item);\n }\n let cursor: Node = end;\n for (const row of state.order)\n if (row.head.parentNode === parent) {\n cursor = row.head;\n break;\n }\n const order: Row[] = [];\n for (const item of next) {\n let row = state.rows.get(item);\n if (row === undefined) {\n const frag = document.createDocumentFragment();\n const made: Row = { bindings: undefined, ctx: state.ctx, head: frag, tail: frag, item, reads: state.reads };\n within(made, () => state.build(frag, item));\n // A row keeps at least one node, so it always has a place.\n if (frag.firstChild === null) frag.appendChild(document.createComment(\"\"));\n made.head = frag.firstChild!;\n made.tail = frag.lastChild!;\n parent.insertBefore(frag, cursor);\n state.rows.set(item, (row = made));\n } else if (row.head !== cursor) {\n for (let node = row.head; ; ) {\n const after = node.nextSibling!;\n parent.insertBefore(node, cursor);\n if (node === row.tail) break;\n node = after;\n }\n } else cursor = row.tail.nextSibling!;\n order.push(row);\n }\n state.order = order;\n}\n\ntype Named = { $n: string };\n\n/** A template node: text (`\"\"` is a binding's place), `null` a comment (an anchor), or `[tag, attrs | 0, ...children]`. */\ntype Spec = string | null | readonly [string, 0 | readonly string[], ...unknown[]];\n\nfunction make(spec: Spec, svg = false): Node {\n if (spec === null) return document.createComment(\"\");\n if (typeof spec === \"string\") return document.createTextNode(spec);\n const tag = spec[0];\n const el = svg || tag === \"svg\" ? document.createElementNS(SVG, tag) : document.createElement(tag);\n const attrs = spec[1];\n if (attrs !== 0) for (let i = 0; i < attrs.length; i += 2) el.setAttribute(attrs[i]!, attrs[i + 1]!);\n const inner = inSvg(el);\n for (let i = 2; i < spec.length; i++) el.appendChild(make(spec[i] as Spec, inner));\n return el;\n}\n\n// Events that bubble go through one listener on the document: an element only holds its handler and holder.\nconst DELEGATED = new Set([\"beforeinput\", \"click\", \"dblclick\", \"contextmenu\", \"focusin\", \"focusout\", \"input\", \"keydown\", \"keyup\", \"mousedown\", \"mousemove\", \"mouseout\", \"mouseover\", \"mouseup\", \"pointerdown\", \"pointermove\", \"pointerout\", \"pointerover\", \"pointerup\", \"touchend\", \"touchmove\", \"touchstart\"]);\n// Symbols, so another copy of the runtime on the page (another bundle) never runs this one's handlers.\nconst keys = new Map<string, symbol>();\nconst HOLDER = Symbol(\"xzor.fine.holder\");\n\nfunction keyOf(type: string): symbol {\n let key = keys.get(type);\n if (key === undefined) {\n keys.set(type, (key = Symbol(type)));\n document.addEventListener(type, dispatch);\n // The capture phase sees events that do not bubble (dispatched by code) on their way to their target.\n document.addEventListener(type, dispatchAtTarget, true);\n }\n return key;\n}\n\ntype Target = Node & Record<symbol, any>;\n\n// Runs `node`'s handler; whether the event stopped.\nfunction fire(node: Target, e: Event): boolean {\n const handler = node[keys.get(e.type)!];\n if (handler === undefined) return false;\n const h = node[HOLDER] as Holder & Partial<Row>;\n Object.defineProperty(e, \"currentTarget\", { configurable: true, value: node });\n afterHandler(h.ctx, h.reads !== undefined ? handler(h.item)(e) : handler(e));\n return e.cancelBubble;\n}\n\n/** Calls the handlers from the target up, as bubbling would; a row's handler comes from its item. */\nfunction dispatch(e: Event): void {\n for (let node = e.target as Target | null; node !== null && !fire(node, e); node = node.parentNode as Target | null);\n}\n\nfunction dispatchAtTarget(e: Event): void {\n if (!e.bubbles && e.target !== null) fire(e.target as Target, e);\n}\n\nfunction on(el: Element, event: string, handler: (e: any) => unknown, h: Holder): void {\n if (DELEGATED.has(event)) {\n const target = el as unknown as Record<symbol, unknown>;\n target[keyOf(event)] = handler;\n target[HOLDER] = h;\n } else el.addEventListener(event, (e) => afterHandler(h.ctx, handler(e)));\n}\n\nfunction region(start: Comment, end: Comment, build: (a?: any, b?: any) => unknown, item: unknown, flags: number): void {\n const region: Region = { bindings: undefined, ctx: holder!.ctx, start, item };\n track(new Binding(REGION | flags, end, build, region));\n}\n\nfunction list(end: Comment, items: () => Iterable<unknown>, reads: Reads | undefined, build: (parent: Node, item: any) => void): void {\n const state: ListState = { build, ctx: holder!.ctx, rows: new Map(), order: [], reads };\n track(new Binding(LIST, end, items, state));\n}\n\nconst anchor = (parent: Node): Comment => parent.appendChild(document.createComment(\"\"));\n\n/**\n * What generated `@fine` code calls. A run of nodes is a `template` clone; the `...At` calls bind the nodes it\n * has in place, and the `...Item` ones bind a row's nodes to a read its list shares (`reads[i]`, given the item).\n * The others append the node they bind to `parent`.\n */\nexport const fine = {\n /**\n * Builds the nodes of `specs` (a fragment unless they are one element). The first call builds them directly:\n * a component used once keeps no copy. From the second on, calls clone a copy built then.\n */\n template(specs: readonly unknown[]): () => Node {\n let node: Node | undefined;\n let used = false;\n const build = (): Node => {\n const first = specs[0];\n if (specs.length === 1 && Array.isArray(first)) return make(first as unknown as Spec);\n const frag = document.createDocumentFragment();\n for (const spec of specs) frag.appendChild(make(spec as Spec));\n return frag;\n };\n return () => {\n if (node !== undefined) return node.cloneNode(true);\n if (!used) {\n used = true;\n return build();\n }\n node = build();\n return node.cloneNode(true);\n };\n },\n\n el<K extends string>(parent: Node, tag: K): El<K> {\n return parent.appendChild(inSvg(parent) ? document.createElementNS(SVG, tag) : document.createElement(tag)) as El<K>;\n },\n\n /** A handler; afterwards the component re-runs its bindings that read nothing tracked. */\n on(el: Element, event: string, handler: (e: any) => unknown): void {\n const h = holder!;\n // The dispatcher asks a row with shared reads for the handler of its item.\n on(el, event, (h as Partial<Row>).reads !== undefined && DELEGATED.has(event) ? () => handler : handler, h);\n },\n\n /** A row's handler: `reads[i](item)` gives it. */\n onItem(el: Element, event: string, i: number): void {\n const row = holder as Row;\n const read = row.reads![i]!;\n if (DELEGATED.has(event)) on(el, event, read, row);\n else el.addEventListener(event, (e) => afterHandler(row.ctx, read(row.item)(e)));\n },\n\n /** Static text. */\n t(parent: Node, text: string): void {\n parent.appendChild(document.createTextNode(text));\n },\n\n /** Text that follows `read()`; markup (a `RenderFragment`) renders as markup. */\n text(parent: Node, read: () => unknown): void {\n fine.textAt(parent.appendChild(document.createTextNode(\"\")), read);\n },\n\n textAt(node: Text, read: () => unknown): void {\n track(new Binding(TEXT, node, read, holder!));\n },\n\n textItem(node: Text, i: number): void {\n const row = holder as Row;\n track(new Binding(TEXT | ITEM, node, row.reads![i]!, row));\n },\n\n /** Attribute `name` of `el` that follows `read()`; `false`/`null`/`undefined` remove it. */\n attr(el: Element, name: string, read: () => unknown): void {\n track(new Binding(ATTR, el, read, name));\n },\n\n attrItem(el: Element, name: string, i: number): void {\n const row = holder as Row;\n const read = row.reads![i]! as Reads[number] & Named;\n read.$n = name;\n track(new Binding(ATTR | ITEM, el, read, row));\n },\n\n /** `@if`, `@switch`, a `@for` that is not a plain list, `@{ }`: rebuilt whenever what `build` read changes. */\n region(parent: Node, build: Build): void {\n region(anchor(parent), anchor(parent), build, undefined, 0);\n },\n\n /** A region between `end` and the comment before it. */\n regionAt(end: Comment, build: Build): void {\n region(end.previousSibling as Comment, end, build, undefined, 0);\n },\n\n /** A row's region: `reads[i](item, parent)` builds it. */\n regionItem(end: Comment, i: number): void {\n const row = holder as Row;\n region(end.previousSibling as Comment, end, row.reads![i]!, row.item, ITEM);\n },\n\n /** `@for (const item of items)`: one row per item, matched by identity; a row is built once. */\n list<T>(parent: Node, items: () => Iterable<T>, build: (parent: Node, item: T) => void): void {\n list(anchor(parent), items, undefined, build);\n },\n\n /** A list before `end`; its rows' bindings use `reads`, shared by the rows. */\n listAt<T>(end: Comment, items: () => Iterable<T>, reads: readonly ((item: T, x?: any) => any)[], build: (parent: Node, item: T) => void): void {\n list(end, items, reads, build);\n },\n\n /** Child components, slots, `@cascade`, routes: virtual-DOM builder calls, patched when what they read changes. */\n island(parent: Node, build: (b: RenderTreeBuilder) => void): void {\n fine.islandAt(anchor(parent), build);\n },\n\n islandAt(end: Comment, build: (b: RenderTreeBuilder) => void): void {\n const b = new Binding(ISLAND, end, noop, undefined);\n island(b, holder!.ctx, build);\n track(b);\n },\n};\n\nconst noop = (): void => {};\n\nconst FIELDS = Symbol(\"xzor.fine.fields\");\n\n/**\n * Base of `@fine` components. The bundle turns their fields into tracked ones, as it does a model's, so a\n * handler that writes a field updates what reads it. `stateHasChanged()` re-runs every binding.\n */\nexport abstract class FineComponent extends ComponentBase {\n #subs: object[] | undefined;\n\n /** @internal What tracked getters report to; the bundle emits `FineComponent.$reader?.(this, i)`. */\n static get $reader(): ((source: object, index: number) => void) | undefined {\n return Model.$reader as ((source: object, index: number) => void) | undefined;\n }\n\n static same(a: unknown, b: unknown): boolean {\n return Model.same(a, b);\n }\n\n /** @internal Records a class's tracked fields after its base's; returns where they start. */\n static $define(cls: Function, names: string[]): number {\n const counts = cls as unknown as Record<symbol, number | undefined>;\n const at = counts[FIELDS] ?? 0;\n counts[FIELDS] = at + names.length;\n return at;\n }\n\n /** @internal */\n $watch(dep: object): void {\n const subs = (this.#subs ??= []);\n (dep as Dep).slot = subs.length;\n subs.push(dep);\n }\n\n /** @internal */\n $unwatch(dep: object): void {\n const subs = this.#subs;\n if (subs === undefined || subs.length === 0) return;\n const last = subs.pop() as Dep;\n if (last !== dep) {\n subs[(dep as Dep).slot] = last;\n last.slot = (dep as Dep).slot;\n }\n }\n\n /** @internal What a tracked setter reports once it stored a different value. */\n protected $changed(index: number, _previous: unknown): void {\n const subs = this.#subs;\n if (subs !== undefined) for (let i = 0; i < subs.length; i++) $notify(subs[i]!, index);\n }\n}\n\n(FineComponent.prototype as unknown as Record<symbol, boolean>)[FINE] = true;\n\nconst CTX = Symbol(\"xzor.fine.ctx\");\n\nsetFineHooks({\n create(build: Build, owner: ComponentBase, app: IApplication | undefined, scope: unknown): FineRoot {\n const frag = document.createDocumentFragment();\n const start = frag.appendChild(document.createComment(\"\"));\n const ctx: Ctx = { owner, app, scope, loose: [] };\n (owner as unknown as Record<symbol, Ctx>)[CTX] = ctx;\n const root: FineRoot & Holder = { bindings: undefined, ctx, start, end: start };\n // Reads outside a binding subscribe nothing: a fine component is never re-rendered by what it reads.\n const reader = Model.$reader;\n Model.$reader = undefined;\n try {\n within(root, () => build(frag));\n } finally {\n Model.$reader = reader;\n }\n root.end = frag.appendChild(document.createComment(\"\"));\n return root;\n },\n refresh: (root) => refreshAll(root as FineRoot & Holder),\n dispose: (root) => disposeAll(root as FineRoot & Holder),\n handled(owner: ComponentBase, result: unknown): void {\n const ctx = (owner as unknown as Record<symbol, Ctx | undefined>)[CTX];\n if (ctx !== undefined) afterHandler(ctx, result);\n },\n});\n",
|
|
6
|
+
"// Fine components (`@fine`): no render pass. A fine component builds its DOM once, and each dynamic expression\n// is a binding: it collects the tracked fields it reads while it runs, and re-runs through the model queue (once\n// per microtask) when one of them changes. A binding is its own dep for the first source it reads.\n\nimport { $inSvg as inSvg, $isFragment, ComponentBase, disposeIsland, FINE, patchIsland, setFineHooks, SVG, type FineRoot, type IApplication, type RenderTreeBuilder, type VNode } from \"./index\";\nimport { $flush, $notify, Model } from \"./model\";\n\nconst TEXT = 0;\nconst ATTR = 1;\nconst REGION = 2;\nconst LIST = 3;\n/** A virtual-DOM subtree (child components, slots, `@cascade`, routes, markup values), patched on change. */\nconst ISLAND = 4;\nconst KIND = 7;\n/** The tracker has it queued; `at` reads 0 then, else -1. */\nconst QUEUED = 8;\n/** `model` is a map of deps: the binding read more than one source. */\nconst MANY = 16;\nconst DEAD = 32;\n/** In its component's `loose` list: its last run read nothing tracked. */\nconst LOOSE = 64;\n/** A row's binding: `read` is shared by the list's rows and takes the row's item (`data.item`). */\nconst ITEM = 128;\n\n// Same bits as the model tracker: fields from the 30th share bit 30, `state` (-1) has bit 31.\nconst bitOf = (index: number): number => (index === -1 ? 1 << 31 : index < 30 ? 1 << index : 1 << 30);\n\ntype Source = { $watch(dep: object): void; $unwatch(dep: object): void };\ntype Dep = { model: Source; owner: Binding; mask: number; slot: number };\n/** Where the fine component was mounted: what an island needs to mount components. */\ntype Ctx = { owner: ComponentBase; app: IApplication | undefined; scope: unknown; loose: Binding[] };\n/** Where bindings are chained: a fine root, a region or a list row. */\ntype Holder = { bindings: unknown; ctx: Ctx };\ntype Region = { bindings: Binding | undefined; ctx: Ctx; start: Comment; item: unknown };\n/** A row's shared reads, from the list: `(item, x) => value`; a handler's gives the handler. */\ntype Reads = readonly ((item: any, x?: any) => any)[];\ntype Row = { bindings: Binding | undefined; ctx: Ctx; head: Node; tail: Node; item: unknown; reads: Reads | undefined };\ntype Island = { ctx: Ctx; tree: VNode[]; build: (b: RenderTreeBuilder) => void };\ntype Build = (parent: Node) => void;\ntype ListState = { build: (parent: Node, item: any) => void; ctx: Ctx; rows: Map<unknown, Row>; order: Row[]; reads: Reads | undefined };\n\n/** The element type of tag `K`. */\nexport type El<K extends string> = K extends keyof HTMLElementTagNameMap ? HTMLElementTagNameMap[K] : HTMLElement;\n\nlet collecting: Binding | undefined;\nlet holder: Holder | undefined;\n\nfunction collect(source: Source, index: number): void {\n const b = collecting!;\n const bit = bitOf(index);\n const own = b.model;\n if (own === source) {\n b.mask |= bit;\n return;\n }\n if (own === undefined) {\n b.model = source;\n b.mask = bit;\n source.$watch(b);\n return;\n }\n let deps: Map<Source, Dep>;\n if ((b.flags & MANY) !== 0) deps = own as Map<Source, Dep>;\n else {\n // The first source moves to a plain dep too, so the map holds one shape.\n const first: Dep = { model: own as Source, owner: b, mask: b.mask, slot: 0 };\n (own as Source).$unwatch(b);\n (own as Source).$watch(first);\n b.model = deps = new Map([[own as Source, first]]);\n b.flags |= MANY;\n }\n let dep = deps.get(source);\n if (dep === undefined) {\n dep = { model: source, owner: b, mask: 0, slot: 0 };\n source.$watch(dep);\n deps.set(source, dep);\n }\n dep.mask |= bit;\n}\n\n/** One dynamic part of a fine component. 8 fields, so one 80-byte JSC cell. */\nclass Binding {\n model: Source | Map<Source, Dep> | undefined = undefined;\n mask = 0;\n slot = 0;\n next: Binding | undefined = undefined;\n\n constructor(\n public flags: number,\n /** TEXT: its Text; ATTR: its element; REGION, LIST and ISLAND: the comment that ends them. */\n public node: Node,\n /** TEXT and ATTR: the value; REGION: builds into its argument; LIST: the items; ISLAND: patches it. */\n public read: (a?: any, b?: any) => unknown,\n /** TEXT: its holder; ATTR: the attribute (ITEM: its row); REGION: its `Region`; LIST: its `ListState`; ISLAND: its `Island`. */\n public data: any,\n ) {}\n\n // The model queue reads these; prototype accessors cost no field.\n get owner(): Binding {\n return this;\n }\n get component(): Binding {\n return this;\n }\n get renders(): number {\n return 0;\n }\n get at(): number {\n return (this.flags & (QUEUED | DEAD)) !== 0 ? 0 : -1;\n }\n set at(value: number) {\n if ((this.flags & DEAD) === 0) this.flags = value < 0 ? this.flags & ~QUEUED : this.flags | QUEUED;\n }\n\n #reset(): void {\n this.mask = 0;\n if ((this.flags & MANY) !== 0) for (const dep of (this.model as Map<Source, Dep>).values()) dep.mask = 0;\n }\n\n // Drops the sources the last run did not read again.\n #sweep(): void {\n const own = this.model;\n if (own === undefined) return this.#loose();\n if ((this.flags & MANY) === 0) {\n if (this.mask === 0) {\n (own as Source).$unwatch(this);\n this.model = undefined;\n this.#loose();\n }\n return;\n }\n const deps = own as Map<Source, Dep>;\n for (const [source, dep] of deps)\n if (dep.mask === 0) {\n source.$unwatch(dep);\n deps.delete(source);\n }\n if (deps.size === 0) {\n this.model = undefined;\n this.flags &= ~MANY;\n this.#loose();\n }\n }\n\n // Nothing tracked tells it about changes: its component re-runs it after each of its handlers.\n #loose(): void {\n if ((this.flags & (LOOSE | DEAD)) !== 0 || holder === undefined) return;\n this.flags |= LOOSE;\n holder.ctx.loose.push(this);\n }\n\n #run(parent?: Node): unknown {\n const prev = collecting;\n const reader = Model.$reader;\n collecting = this;\n Model.$reader = collect as unknown as typeof Model.$reader;\n this.#reset();\n try {\n return (this.flags & ITEM) !== 0 ? this.read(this.data.item, parent) : this.read(parent);\n } finally {\n collecting = prev;\n Model.$reader = reader;\n this.#sweep();\n }\n }\n\n stateHasChanged(): void {\n const flags = this.flags;\n if ((flags & DEAD) !== 0) return;\n switch (flags & KIND) {\n case TEXT: {\n const value = this.#run();\n if ($isFragment(value)) return this.#becomeIsland();\n const text = textOf(value);\n const node = this.node as Text;\n if (node.data !== text) node.data = text;\n return;\n }\n case ATTR:\n return setAttr(this.node as Element, (flags & ITEM) !== 0 ? (this.read as unknown as Named).$n : this.data, this.#run());\n case REGION: {\n const region = this.data as Region;\n disposeAll(region);\n const end = this.node;\n const parent = end.parentNode!;\n while (region.start.nextSibling !== end) parent.removeChild(region.start.nextSibling!);\n const frag = document.createDocumentFragment();\n within(region, () => this.#run(frag));\n parent.insertBefore(frag, end);\n return;\n }\n case LIST:\n return reconcile(this, this.#run() as Iterable<unknown>);\n case ISLAND:\n this.#run();\n return;\n }\n }\n\n // `@expr` gave markup: from now on it renders through the virtual DOM, whatever it gives.\n #becomeIsland(): void {\n const read = this.read;\n const h = this.data as Holder & { item?: unknown };\n const value = (this.flags & ITEM) !== 0 ? () => read(h.item) : read;\n const text = this.node;\n const end = text.parentNode!.insertBefore(document.createComment(\"\"), text.nextSibling);\n text.parentNode!.removeChild(text);\n this.node = end;\n this.flags = (this.flags & ~(KIND | ITEM)) | ISLAND;\n island(this, h.ctx, (b) => {\n const v = value();\n if ($isFragment(v)) (v as (b: RenderTreeBuilder) => void)(b);\n else b.addContent(v);\n });\n this.stateHasChanged();\n }\n\n dispose(): void {\n if ((this.flags & DEAD) !== 0) return;\n const kind = this.flags & KIND;\n if (kind === REGION) disposeAll(this.data as Region);\n else if (kind === LIST) for (const row of (this.data as ListState).order) disposeAll(row);\n else if (kind === ISLAND) {\n disposeIsland((this.data as Island).tree);\n (this.data as Island).tree = [];\n }\n this.#reset();\n this.#sweep();\n this.flags = DEAD;\n }\n}\n\n/** Makes `b` patch a virtual-DOM island built by `build`, before its end comment. */\nfunction island(b: Binding, ctx: Ctx, build: (b: RenderTreeBuilder) => void): void {\n const state: Island = { ctx, tree: [], build };\n b.data = state;\n b.read = () => {\n state.tree = patchIsland(ctx.owner, ctx.app, ctx.scope, b.node, state.tree, build);\n };\n}\n\n/** Re-runs the component's bindings that read nothing tracked; drops the dead ones and those that now track. */\nfunction refreshLoose(ctx: Ctx): void {\n const loose = ctx.loose;\n for (let i = 0; i < loose.length; ) {\n const b = loose[i]!;\n if ((b.flags & DEAD) !== 0 || b.model !== undefined) {\n b.flags &= ~LOOSE;\n loose[i] = loose[loose.length - 1]!;\n loose.pop();\n continue;\n }\n b.stateHasChanged();\n i++;\n }\n}\n\n// Like a render after a vdom handler, what the handler changed shows before it returns.\nfunction afterHandler(ctx: Ctx, result: unknown): void {\n $flush();\n refreshLoose(ctx);\n if (result instanceof Promise) void result.then(() => refreshLoose(ctx));\n}\n\nfunction within(h: Holder, run: () => void): void {\n const prev = holder;\n holder = h;\n try {\n run();\n } finally {\n holder = prev;\n }\n}\n\nfunction track(b: Binding): void {\n const h = holder!;\n b.next = h.bindings as Binding | undefined;\n h.bindings = b;\n b.stateHasChanged();\n}\n\nfunction disposeAll(h: Holder): void {\n for (let b = h.bindings as Binding | undefined; b !== undefined; b = b.next) b.dispose();\n h.bindings = undefined;\n}\n\n/** Re-runs every binding under `h`, rows included: what `stateHasChanged` does for changes nothing tracks. */\nfunction refreshAll(h: Holder): void {\n for (let b = h.bindings as Binding | undefined; b !== undefined; b = b.next) {\n b.stateHasChanged();\n if ((b.flags & KIND) === LIST) for (const row of (b.data as ListState).order) refreshAll(row);\n }\n}\n\nconst textOf = (value: unknown): string => (value === null || value === undefined || value === false ? \"\" : String(value));\n\n/** `null`, `undefined` and `false` remove it, `true` sets it empty; `value` and `checked` follow onto the property. */\nfunction setAttr(el: Element, name: string, value: unknown): void {\n // `--name`: a custom property from a component's `<style>`; reading first skips a costly same-value write.\n if (name.charCodeAt(0) === 45 && name.charCodeAt(1) === 45) {\n const style = (el as HTMLElement).style;\n const text = value === null || value === undefined || value === false ? \"\" : String(value);\n if (style.getPropertyValue(name) === text) return;\n if (text === \"\") style.removeProperty(name);\n else style.setProperty(name, text);\n return;\n }\n if (value === null || value === undefined || value === false) {\n if (el.hasAttribute(name)) el.removeAttribute(name);\n if (name === \"checked\" && \"checked\" in el) (el as HTMLInputElement).checked = false;\n return;\n }\n const text = value === true ? \"\" : String(value);\n if (el.getAttribute(name) !== text) el.setAttribute(name, text);\n if (name === \"value\" && \"value\" in el && (el as HTMLInputElement).value !== text) (el as HTMLInputElement).value = text;\n else if (name === \"checked\" && \"checked\" in el) (el as HTMLInputElement).checked = true;\n}\n\nfunction removeRange(head: Node, tail: Node): void {\n const parent = head.parentNode!;\n for (let node = head; ; ) {\n const next = node.nextSibling;\n parent.removeChild(node);\n if (node === tail) return;\n node = next!;\n }\n}\n\n// Rows are matched by identity: kept rows keep their nodes and bindings, and only move when out of place.\nfunction reconcile(list: Binding, items: Iterable<unknown>): void {\n const state = list.data as ListState;\n const end = list.node;\n const parent = end.parentNode!;\n const next = Array.isArray(items) ? (items as unknown[]) : [...items];\n const keep = new Set(next);\n for (const [item, row] of state.rows)\n if (!keep.has(item)) {\n disposeAll(row);\n removeRange(row.head, row.tail);\n state.rows.delete(item);\n }\n let cursor: Node = end;\n for (const row of state.order)\n if (row.head.parentNode === parent) {\n cursor = row.head;\n break;\n }\n const order: Row[] = [];\n for (const item of next) {\n let row = state.rows.get(item);\n if (row === undefined) {\n const frag = document.createDocumentFragment();\n const made: Row = { bindings: undefined, ctx: state.ctx, head: frag, tail: frag, item, reads: state.reads };\n within(made, () => state.build(frag, item));\n // A row keeps at least one node, so it always has a place.\n if (frag.firstChild === null) frag.appendChild(document.createComment(\"\"));\n made.head = frag.firstChild!;\n made.tail = frag.lastChild!;\n parent.insertBefore(frag, cursor);\n state.rows.set(item, (row = made));\n } else if (row.head !== cursor) {\n for (let node = row.head; ; ) {\n const after = node.nextSibling!;\n parent.insertBefore(node, cursor);\n if (node === row.tail) break;\n node = after;\n }\n } else cursor = row.tail.nextSibling!;\n order.push(row);\n }\n state.order = order;\n}\n\ntype Named = { $n: string };\n\n/** A template node: text (`\"\"` is a binding's place), `null` a comment (an anchor), or `[tag, attrs | 0, ...children]`. */\ntype Spec = string | null | readonly [string, 0 | readonly string[], ...unknown[]];\n\nfunction make(spec: Spec, svg = false): Node {\n if (spec === null) return document.createComment(\"\");\n if (typeof spec === \"string\") return document.createTextNode(spec);\n const tag = spec[0];\n const el = svg || tag === \"svg\" ? document.createElementNS(SVG, tag) : document.createElement(tag);\n const attrs = spec[1];\n if (attrs !== 0) for (let i = 0; i < attrs.length; i += 2) el.setAttribute(attrs[i]!, attrs[i + 1]!);\n const inner = inSvg(el);\n for (let i = 2; i < spec.length; i++) el.appendChild(make(spec[i] as Spec, inner));\n return el;\n}\n\n// Events that bubble go through one listener on the document: an element only holds its handler and holder.\nconst DELEGATED = new Set([\"beforeinput\", \"click\", \"dblclick\", \"contextmenu\", \"focusin\", \"focusout\", \"input\", \"keydown\", \"keyup\", \"mousedown\", \"mousemove\", \"mouseout\", \"mouseover\", \"mouseup\", \"pointerdown\", \"pointermove\", \"pointerout\", \"pointerover\", \"pointerup\", \"touchend\", \"touchmove\", \"touchstart\"]);\n// Symbols, so another copy of the runtime on the page (another bundle) never runs this one's handlers.\nconst keys = new Map<string, symbol>();\nconst HOLDER = Symbol(\"xzor.fine.holder\");\n\nfunction keyOf(type: string): symbol {\n let key = keys.get(type);\n if (key === undefined) {\n keys.set(type, (key = Symbol(type)));\n document.addEventListener(type, dispatch);\n // The capture phase sees events that do not bubble (dispatched by code) on their way to their target.\n document.addEventListener(type, dispatchAtTarget, true);\n }\n return key;\n}\n\ntype Target = Node & Record<symbol, any>;\n\n// Runs `node`'s handler; whether the event stopped.\nfunction fire(node: Target, e: Event): boolean {\n const handler = node[keys.get(e.type)!];\n if (handler === undefined) return false;\n const h = node[HOLDER] as Holder & Partial<Row>;\n Object.defineProperty(e, \"currentTarget\", { configurable: true, value: node });\n afterHandler(h.ctx, h.reads !== undefined ? handler(h.item)(e) : handler(e));\n return e.cancelBubble;\n}\n\n/** Calls the handlers from the target up, as bubbling would; a row's handler comes from its item. */\nfunction dispatch(e: Event): void {\n for (let node = e.target as Target | null; node !== null && !fire(node, e); node = node.parentNode as Target | null);\n}\n\nfunction dispatchAtTarget(e: Event): void {\n if (!e.bubbles && e.target !== null) fire(e.target as Target, e);\n}\n\nfunction on(el: Element, event: string, handler: (e: any) => unknown, h: Holder): void {\n if (DELEGATED.has(event)) {\n const target = el as unknown as Record<symbol, unknown>;\n target[keyOf(event)] = handler;\n target[HOLDER] = h;\n } else el.addEventListener(event, (e) => afterHandler(h.ctx, handler(e)));\n}\n\nfunction region(start: Comment, end: Comment, build: (a?: any, b?: any) => unknown, item: unknown, flags: number): void {\n const region: Region = { bindings: undefined, ctx: holder!.ctx, start, item };\n track(new Binding(REGION | flags, end, build, region));\n}\n\nfunction list(end: Comment, items: () => Iterable<unknown>, reads: Reads | undefined, build: (parent: Node, item: any) => void): void {\n const state: ListState = { build, ctx: holder!.ctx, rows: new Map(), order: [], reads };\n track(new Binding(LIST, end, items, state));\n}\n\nconst anchor = (parent: Node): Comment => parent.appendChild(document.createComment(\"\"));\n\n/**\n * What generated `@fine` code calls. A run of nodes is a `template` clone; the `...At` calls bind the nodes it\n * has in place, and the `...Item` ones bind a row's nodes to a read its list shares (`reads[i]`, given the item).\n * The others append the node they bind to `parent`.\n */\nexport const fine = {\n /**\n * Builds the nodes of `specs` (a fragment unless they are one element). The first call builds them directly:\n * a component used once keeps no copy. From the second on, calls clone a copy built then.\n */\n template(specs: readonly unknown[]): () => Node {\n let node: Node | undefined;\n let used = false;\n const build = (): Node => {\n const first = specs[0];\n if (specs.length === 1 && Array.isArray(first)) return make(first as unknown as Spec);\n const frag = document.createDocumentFragment();\n for (const spec of specs) frag.appendChild(make(spec as Spec));\n return frag;\n };\n return () => {\n if (node !== undefined) return node.cloneNode(true);\n if (!used) {\n used = true;\n return build();\n }\n node = build();\n return node.cloneNode(true);\n };\n },\n\n el<K extends string>(parent: Node, tag: K): El<K> {\n return parent.appendChild(inSvg(parent) ? document.createElementNS(SVG, tag) : document.createElement(tag)) as El<K>;\n },\n\n /** A handler; afterwards the component re-runs its bindings that read nothing tracked. */\n on(el: Element, event: string, handler: (e: any) => unknown): void {\n const h = holder!;\n // The dispatcher asks a row with shared reads for the handler of its item.\n on(el, event, (h as Partial<Row>).reads !== undefined && DELEGATED.has(event) ? () => handler : handler, h);\n },\n\n /** A row's handler: `reads[i](item)` gives it. */\n onItem(el: Element, event: string, i: number): void {\n const row = holder as Row;\n const read = row.reads![i]!;\n if (DELEGATED.has(event)) on(el, event, read, row);\n else el.addEventListener(event, (e) => afterHandler(row.ctx, read(row.item)(e)));\n },\n\n /** Static text. */\n t(parent: Node, text: string): void {\n parent.appendChild(document.createTextNode(text));\n },\n\n /** Text that follows `read()`; markup (a `RenderFragment`) renders as markup. */\n text(parent: Node, read: () => unknown): void {\n fine.textAt(parent.appendChild(document.createTextNode(\"\")), read);\n },\n\n textAt(node: Text, read: () => unknown): void {\n track(new Binding(TEXT, node, read, holder!));\n },\n\n textItem(node: Text, i: number): void {\n const row = holder as Row;\n track(new Binding(TEXT | ITEM, node, row.reads![i]!, row));\n },\n\n /** Attribute `name` of `el` that follows `read()`; `false`/`null`/`undefined` remove it. */\n attr(el: Element, name: string, read: () => unknown): void {\n track(new Binding(ATTR, el, read, name));\n },\n\n attrItem(el: Element, name: string, i: number): void {\n const row = holder as Row;\n const read = row.reads![i]! as Reads[number] & Named;\n read.$n = name;\n track(new Binding(ATTR | ITEM, el, read, row));\n },\n\n /** `@if`, `@switch`, a `@for` that is not a plain list, `@{ }`: rebuilt whenever what `build` read changes. */\n region(parent: Node, build: Build): void {\n region(anchor(parent), anchor(parent), build, undefined, 0);\n },\n\n /** A region between `end` and the comment before it. */\n regionAt(end: Comment, build: Build): void {\n region(end.previousSibling as Comment, end, build, undefined, 0);\n },\n\n /** A row's region: `reads[i](item, parent)` builds it. */\n regionItem(end: Comment, i: number): void {\n const row = holder as Row;\n region(end.previousSibling as Comment, end, row.reads![i]!, row.item, ITEM);\n },\n\n /** `@for (const item of items)`: one row per item, matched by identity; a row is built once. */\n list<T>(parent: Node, items: () => Iterable<T>, build: (parent: Node, item: T) => void): void {\n list(anchor(parent), items, undefined, build);\n },\n\n /** A list before `end`; its rows' bindings use `reads`, shared by the rows. */\n listAt<T>(end: Comment, items: () => Iterable<T>, reads: readonly ((item: T, x?: any) => any)[], build: (parent: Node, item: T) => void): void {\n list(end, items, reads, build);\n },\n\n /** Child components, slots, `@cascade`, routes: virtual-DOM builder calls, patched when what they read changes. */\n island(parent: Node, build: (b: RenderTreeBuilder) => void): void {\n fine.islandAt(anchor(parent), build);\n },\n\n islandAt(end: Comment, build: (b: RenderTreeBuilder) => void): void {\n const b = new Binding(ISLAND, end, noop, undefined);\n island(b, holder!.ctx, build);\n track(b);\n },\n};\n\nconst noop = (): void => {};\n\nconst FIELDS = Symbol(\"xzor.fine.fields\");\n\n/**\n * Base of `@fine` components. The bundle turns their fields into tracked ones, as it does a model's, so a\n * handler that writes a field updates what reads it. `stateHasChanged()` re-runs every binding.\n */\nexport abstract class FineComponent extends ComponentBase {\n #subs: object[] | undefined;\n\n /** @internal What tracked getters report to; the bundle emits `FineComponent.$reader?.(this, i)`. */\n static get $reader(): ((source: object, index: number) => void) | undefined {\n return Model.$reader as ((source: object, index: number) => void) | undefined;\n }\n\n static same(a: unknown, b: unknown): boolean {\n return Model.same(a, b);\n }\n\n /** @internal Records a class's tracked fields after its base's; returns where they start. */\n static $define(cls: Function, names: string[]): number {\n const counts = cls as unknown as Record<symbol, number | undefined>;\n const at = counts[FIELDS] ?? 0;\n counts[FIELDS] = at + names.length;\n return at;\n }\n\n /** @internal */\n $watch(dep: object): void {\n const subs = (this.#subs ??= []);\n (dep as Dep).slot = subs.length;\n subs.push(dep);\n }\n\n /** @internal */\n $unwatch(dep: object): void {\n const subs = this.#subs;\n if (subs === undefined || subs.length === 0) return;\n const last = subs.pop() as Dep;\n if (last !== dep) {\n subs[(dep as Dep).slot] = last;\n last.slot = (dep as Dep).slot;\n }\n }\n\n /** @internal What a tracked setter reports once it stored a different value. */\n protected $changed(index: number, _previous: unknown): void {\n const subs = this.#subs;\n if (subs !== undefined) for (let i = 0; i < subs.length; i++) $notify(subs[i]!, index);\n }\n}\n\n(FineComponent.prototype as unknown as Record<symbol, boolean>)[FINE] = true;\n\nconst CTX = Symbol(\"xzor.fine.ctx\");\n\nsetFineHooks({\n create(build: Build, owner: ComponentBase, app: IApplication | undefined, scope: unknown): FineRoot {\n const frag = document.createDocumentFragment();\n const start = frag.appendChild(document.createComment(\"\"));\n const ctx: Ctx = { owner, app, scope, loose: [] };\n (owner as unknown as Record<symbol, Ctx>)[CTX] = ctx;\n const root: FineRoot & Holder = { bindings: undefined, ctx, start, end: start };\n // Reads outside a binding subscribe nothing: a fine component is never re-rendered by what it reads.\n const reader = Model.$reader;\n Model.$reader = undefined;\n try {\n within(root, () => build(frag));\n } finally {\n Model.$reader = reader;\n }\n root.end = frag.appendChild(document.createComment(\"\"));\n return root;\n },\n refresh: (root) => refreshAll(root as FineRoot & Holder),\n dispose: (root) => disposeAll(root as FineRoot & Holder),\n handled(owner: ComponentBase, result: unknown): void {\n const ctx = (owner as unknown as Record<symbol, Ctx | undefined>)[CTX];\n if (ctx !== undefined) afterHandler(ctx, result);\n },\n});\n",
|
|
7
7
|
"// xzor models: plain classes whose fields track their own changes, revert and confirm them, and\n// notify listeners as an `EventTarget`. A tracked field is a `#private` slot plus a getter and a\n// setter on the prototype — what the bundle generates from a plain field, and what writing one by\n// hand looks like:\n//\n// class Worker extends Model { constructor(data?: object) { super(data); this.assign(data); }\n// #hours = 0; get hours() { Model.$reader?.(this, 0); return this.#hours; }\n// set hours(v: number) { const p = this.#hours; if (Model.same(p, v)) return; this.#hours = v; this.$changed(0, p); }\n// static { Model.$define(this, [\"hours\"]); } }\n//\n// Importing this module also makes the components that read a model re-render when it changes.\n// `same`/`isLike` and `changes` walk plain object graphs: cyclic ones are not supported.\n\nimport { setRenderObserver, type ComponentBase } from \"./index\";\n\nexport { EntitySet } from \"./entity-set\";\nexport { FineComponent, fine, type El } from \"./fine\";\n\nexport enum State {\n /** Created on the client and never sent. */\n Detached = 1,\n Unchanged = 2,\n Added = 4,\n Deleted = 8,\n Modified = 16,\n}\n\nconst Changed = State.Added | State.Deleted | State.Modified;\n\nexport class ModelChangeEvent extends Event {\n readonly property: string;\n readonly value: unknown;\n readonly previous: unknown;\n /** @internal The property's position in the class's tracked fields, when the model itself raised the event. */\n readonly index: number | undefined;\n\n constructor(property: string, value: unknown, previous: unknown, index?: number) {\n super(\"change\");\n this.property = property;\n this.value = value;\n this.previous = previous;\n this.index = index;\n }\n}\n\n/** What one class tracks; a subclass's fields come after its base's, so an index never moves. */\ntype Meta = {\n names: string[];\n tracked: Set<string>;\n persisted: string[];\n ignored: Set<string>;\n validators: [string, Validator[]][];\n serialized?: string[];\n};\n\n/** `true` when the value is valid, otherwise the message. */\nexport type Validator = (value: any, model?: any) => true | string;\n\n/** One registration, kept only for `change` and `state` so a model knows whether it is watched. */\ntype Watch = {\n type: string;\n callback: EventListenerOrEventListenerObject;\n capture: boolean;\n wrapped?: EventListener;\n};\n\n/** The \"field\" index a read or a change of `state` reports. */\nconst stateIndex = -1;\n\n/** Key of the model's state: not an own property, so it never shows in `Object.keys` or a spread. */\nexport const StateKey = Symbol(\"xzor.state\");\n\nconst meta = Symbol(\"xzor.model.meta\");\nconst empty: Meta = { names: [], tracked: new Set(), persisted: [], ignored: new Set(), validators: [], serialized: [] };\n\n// A class's member decorators all run before its `$define`, which takes these over.\nlet pendingPersist: string[] | undefined;\nlet pendingIgnored: string[] | undefined;\nlet pendingValidators: [string, Validator[]][] | undefined;\n\n// Writes made by `assign`, `revertChanges` and `confirmChanges` are not changes.\nlet silent = 0;\n\nfunction metaOf(model: Model): Meta {\n return (model.constructor as unknown as Record<symbol, Meta | undefined>)[meta] ?? empty;\n}\n\n/** The tracked fields and the persisted getters that are not ignored, in declaration order. */\nfunction serialized(of: Meta): string[] {\n return (of.serialized ??= of.names.concat(of.persisted).filter((name) => !of.ignored.has(name)));\n}\n\nfunction captureOf(options: AddEventListenerOptions | EventListenerOptions | boolean | undefined): boolean {\n return typeof options === \"object\" && options !== null ? options.capture === true : options === true;\n}\n\nexport abstract class Model extends EventTarget {\n /** @internal Set only while a component renders, so a tracked getter can report what it read. */\n static $reader: ((model: Model, index: number) => void) | undefined;\n\n #state: State;\n #originals: Record<string, unknown> | undefined;\n #watched: Watch[] | undefined;\n #subs: Dep[] | undefined;\n\n constructor(data?: object) {\n super();\n const state = (data as { $$?: State } | undefined)?.$$;\n this.#state = state ?? (data ? State.Unchanged : State.Detached);\n }\n\n /** @internal Records the tracked fields of a class, after the ones it inherits; returns where they start. */\n static $define(cls: Function, names: string[]): number {\n const base = (cls as unknown as Record<symbol, Meta | undefined>)[meta];\n const all = base ? base.names.concat(names) : names;\n const own: Meta = {\n names: all,\n tracked: new Set(all),\n persisted: base ? base.persisted.slice() : [],\n ignored: new Set(base?.ignored),\n validators: base ? base.validators.map(([name, list]) => [name, list.slice()]) : [],\n };\n if (pendingValidators) {\n for (const [name, list] of pendingValidators) {\n const known = own.validators.find((entry) => entry[0] === name);\n if (known) known[1].push(...list);\n else own.validators.push([name, list]);\n }\n pendingValidators = undefined;\n }\n if (pendingPersist) {\n for (const name of pendingPersist) own.persisted.push(name);\n pendingPersist = undefined;\n }\n if (pendingIgnored) {\n for (const name of pendingIgnored) own.ignored.add(name);\n pendingIgnored = undefined;\n }\n Object.defineProperty(cls, meta, { value: own });\n return base ? base.names.length : 0;\n }\n\n /** Values a tracked field considers the same: dates by time, arrays and plain objects deeply, models by identity. */\n static same(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) return true;\n if (a === null || b === null || typeof a !== \"object\" || typeof b !== \"object\") return false;\n if (a instanceof Date || b instanceof Date)\n return a instanceof Date && b instanceof Date && a.getTime() === b.getTime();\n if (a instanceof Model || b instanceof Model || \"$own\" in a || \"$own\" in b) return false;\n if (Array.isArray(a) || Array.isArray(b)) {\n if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) return false;\n return a.every((value, i) => Model.same(value, b[i]));\n }\n const left = a as Record<string, unknown>;\n const right = b as Record<string, unknown>;\n const names = Object.keys(left);\n if (names.length !== Object.keys(right).length) return false;\n return names.every((name) => Model.same(left[name], right[name]));\n }\n\n get [StateKey](): State {\n Model.$reader?.(this, stateIndex);\n return this.#state;\n }\n\n set [StateKey](value: State) {\n if (value === this.#state) return;\n this.#state = value;\n const subs = this.#subs;\n if (subs !== undefined) for (let i = 0; i < subs.length; i++) changed(subs[i]!, stateIndex);\n if (!this.#listens(\"state\")) return;\n const depth = silent;\n silent = 0;\n try {\n this.dispatchEvent(new Event(\"state\"));\n } finally {\n silent = depth;\n }\n }\n\n hasState(flags: number): boolean {\n Model.$reader?.(this, stateIndex);\n return (this.#state & flags) !== 0;\n }\n\n get hasChanges(): boolean {\n Model.$reader?.(this, stateIndex);\n if ((this.#state & Changed) !== 0) return true;\n for (const name of metaOf(this).names)\n if (valueHasChanges((this as unknown as Record<string, unknown>)[name])) return true;\n return false;\n }\n\n /** False while Detached or Deleted; otherwise whether a validator fails here or in a nested model or set. */\n get hasErrors(): boolean {\n Model.$reader?.(this, stateIndex);\n if ((this.#state & (State.Detached | State.Deleted)) !== 0) return false;\n const own = metaOf(this);\n const values = this as unknown as Record<string, unknown>;\n for (let i = 0; i < own.validators.length; i++) {\n const [name, list] = own.validators[i]!;\n for (const validate of list) if (typeof validate(values[name], this) === \"string\") return true;\n }\n for (const name of own.names) if (valueHasErrors(values[name])) return true;\n return false;\n }\n\n /** The failures of every validated field, but only once this model changed: a fresh one shows none. */\n get errors(): Record<string, string[]> {\n const result = Object.create(null) as Record<string, string[]>;\n Model.$reader?.(this, stateIndex);\n if ((this.#state & (State.Detached | State.Deleted)) !== 0) return result;\n if (this.#originals === undefined && (this.#state & (State.Added | State.Modified)) === 0) return result;\n const values = this as unknown as Record<string, unknown>;\n const validators = metaOf(this).validators;\n for (let i = 0; i < validators.length; i++) {\n const [name, list] = validators[i]!;\n const messages = (result[name] = [] as string[]);\n for (const validate of list) {\n const message = validate(values[name], this);\n if (typeof message === \"string\") messages.push(message);\n }\n }\n return result;\n }\n\n get hasValidChanges(): boolean {\n return this.hasChanges && !this.hasErrors;\n }\n\n /** What to send to the server: every primitive plus the nested models and sets that changed, or `null`. */\n get changes(): Record<string, unknown> | null {\n if (!this.hasChanges) return null;\n const values = this as unknown as Record<string, unknown>;\n const result: Record<string, unknown> = { $$: this.#state };\n for (const name of serialized(metaOf(this))) {\n const value = values[name];\n if (isSerializable(value)) result[name] = changesOf(value);\n }\n return result;\n }\n\n toJSON(): Record<string, unknown> {\n const values = this as unknown as Record<string, unknown>;\n const result: Record<string, unknown> = { $$: this.#state };\n for (const name of serialized(metaOf(this))) result[name] = values[name];\n return result;\n }\n\n revertChanges(): this {\n const own = metaOf(this);\n const originals = this.#originals;\n const values = this as unknown as Record<string, unknown>;\n if (originals) {\n this.#originals = undefined;\n silent++;\n try {\n for (const name in originals) {\n const previous = values[name];\n const value = originals[name];\n values[name] = value;\n this.#emit(name, value, previous);\n }\n } finally {\n silent--;\n }\n }\n for (const name of own.names) revertValue(values[name]);\n if ((this.#state & State.Added) !== 0) this[StateKey] = State.Detached;\n else if ((this.#state & (State.Deleted | State.Modified)) !== 0) this[StateKey] = State.Unchanged;\n return this;\n }\n\n /** Takes the values the server confirmed as the new originals; nested models and sets confirm theirs. */\n confirmChanges(values?: object): this {\n const own = metaOf(this);\n const data = values as Record<string, unknown> | undefined;\n const target = this as unknown as Record<string, unknown>;\n this.#originals = undefined;\n silent++;\n try {\n for (const name of own.names) {\n const current = target[name] as { confirmChanges?: (values?: object) => unknown } | null;\n const given = data !== undefined && Object.hasOwn(data, name);\n if (current !== null && typeof current === \"object\" && typeof current.confirmChanges === \"function\") {\n current.confirmChanges(given ? (data![name] as object) : undefined);\n } else if (given) {\n const value = data![name];\n if (Model.same(current, value)) continue;\n target[name] = value;\n this.#emit(name, value, current);\n }\n }\n } finally {\n silent--;\n }\n if ((this.#state & (State.Added | State.Modified)) !== 0) this[StateKey] = State.Unchanged;\n return this;\n }\n\n markAdded(): this {\n this[StateKey] = State.Added;\n return this;\n }\n\n markModified(): this {\n if ((this.#state & State.Added) === 0) this[StateKey] = State.Modified;\n return this;\n }\n\n markUnchanged(): this {\n this[StateKey] = State.Unchanged;\n return this;\n }\n\n markDeleted(): this {\n if ((this.#state & State.Detached) === 0) this[StateKey] = State.Deleted;\n return this;\n }\n\n /**\n * Writes construction data without tracking it, taking only the tracked fields of the class.\n * A base constructor may call it before a subclass's fields exist: those are skipped, and the\n * subclass's own `assign` sets them.\n */\n protected assign(data?: object): this {\n const names = metaOf(this).names;\n const target = this as unknown as Record<string, unknown>;\n if (data) {\n const tracked = metaOf(this).tracked;\n const source = data as Record<string, unknown>;\n if (source[\"$$\"] != null) this.#state = source[\"$$\"] as State;\n silent++;\n try {\n for (const name in source)\n if (tracked.has(name))\n try {\n target[name] = source[name];\n } catch (error) {\n if (!(error instanceof TypeError)) throw error; // a subclass slot, not installed yet\n }\n } finally {\n silent--;\n }\n }\n // Reading the fields back must not subscribe a component that is rendering.\n const reader = Model.$reader;\n Model.$reader = undefined;\n try {\n for (let i = 0; i < names.length; i++)\n try {\n attach(target[names[i]!], this, i);\n } catch (error) {\n if (!(error instanceof TypeError)) throw error;\n }\n } finally {\n Model.$reader = reader;\n }\n return this;\n }\n\n override addEventListener(\n type: string,\n callback: EventListenerOrEventListenerObject | null,\n options?: AddEventListenerOptions | boolean,\n ): void {\n if (!callback || (type !== \"change\" && type !== \"state\")) {\n super.addEventListener(type, callback, options);\n return;\n }\n const settings = typeof options === \"object\" && options !== null ? options : undefined;\n if (settings?.signal?.aborted) return;\n const capture = captureOf(options);\n const watched = (this.#watched ??= []);\n for (const known of watched)\n if (known.type === type && known.callback === callback && known.capture === capture) return;\n const watch: Watch = { type, callback, capture };\n watched.push(watch);\n if (settings?.once)\n watch.wrapped = (event) => {\n this.#forget(watch);\n if (typeof callback === \"function\") callback.call(this, event);\n else callback.handleEvent(event);\n };\n super.addEventListener(type, watch.wrapped ?? callback, options);\n settings?.signal?.addEventListener(\"abort\", () => this.#forget(watch), { once: true });\n }\n\n override removeEventListener(\n type: string,\n callback: EventListenerOrEventListenerObject | null,\n options?: EventListenerOptions | boolean,\n ): void {\n let target = callback;\n const watched = this.#watched;\n if (callback && watched) {\n const capture = captureOf(options);\n for (let i = 0; i < watched.length; i++) {\n const watch = watched[i]!;\n if (watch.type === type && watch.callback === callback && watch.capture === capture) {\n watched.splice(i, 1);\n target = watch.wrapped ?? callback;\n break;\n }\n }\n }\n super.removeEventListener(type, target, options);\n }\n\n /** @internal What a tracked setter reports once it has stored a different value. */\n protected $changed(index: number, previous: unknown): void {\n if (silent !== 0) return;\n const name = metaOf(this).names[index]!;\n const originals = (this.#originals ??= Object.create(null) as Record<string, unknown>);\n if (!(name in originals)) originals[name] = previous;\n if ((this.#state & State.Detached) !== 0) this[StateKey] = State.Added;\n else if ((this.#state & State.Unchanged) !== 0) this[StateKey] = State.Modified;\n // The event needs the value, but a write made during a render must not subscribe the renderer.\n const reader = Model.$reader;\n Model.$reader = undefined;\n const value = (this as unknown as Record<string, unknown>)[name];\n Model.$reader = reader;\n attach(value, this, index);\n this.#emit(name, value, previous, index);\n }\n\n /** @internal A set on a tracked field was mutated: it keeps its own state, the model only tells its listeners. */\n $touched(index: number): void {\n const name = metaOf(this).names[index]!;\n const reader = Model.$reader;\n Model.$reader = undefined;\n const value = (this as unknown as Record<string, unknown>)[name];\n Model.$reader = reader;\n this.#emit(name, value, value, index);\n }\n\n // Listeners run outside silent mode, so their own writes are tracked.\n #emit(name: string, value: unknown, previous: unknown, index?: number): void {\n if (!this.#hasListener(\"change\")) {\n // Only rendering components watch: notify them without building an event.\n const subs = this.#subs;\n if (subs === undefined || subs.length === 0) return;\n const at = index ?? metaOf(this).names.indexOf(name);\n for (let i = 0; i < subs.length; i++) changed(subs[i]!, at);\n return;\n }\n const depth = silent;\n silent = 0;\n try {\n this.dispatchEvent(new ModelChangeEvent(name, value, previous, index));\n } finally {\n silent = depth;\n }\n }\n\n /** @internal Subscribes a rendering component's dep to this model's changes. */\n $watch(dep: Dep): void {\n const subs = (this.#subs ??= []);\n dep.slot = subs.length;\n subs.push(dep);\n }\n\n /** @internal Drops a dep by swapping the last one into its slot. */\n $unwatch(dep: Dep): void {\n const subs = this.#subs;\n if (subs === undefined || subs.length === 0) return;\n const last = subs.pop()!;\n if (last !== dep) {\n subs[dep.slot] = last;\n last.slot = dep.slot;\n }\n }\n\n // Components are notified here, not as listeners, so a subscription costs no listener record.\n override dispatchEvent(event: Event): boolean {\n const subs = this.#subs;\n if (subs !== undefined && subs.length !== 0 && event.type === \"change\") {\n const e = event as ModelChangeEvent;\n const index = e.index ?? metaOf(this).names.indexOf(e.property);\n if (index >= 0) for (let i = 0; i < subs.length; i++) changed(subs[i]!, index);\n }\n return super.dispatchEvent(event);\n }\n\n // A model nobody watches never allocates an event.\n #listens(type: string): boolean {\n if (type === \"change\" && this.#subs !== undefined && this.#subs.length !== 0) return true;\n return this.#hasListener(type);\n }\n\n #hasListener(type: string): boolean {\n const watched = this.#watched;\n if (watched === undefined) return false;\n for (let i = 0; i < watched.length; i++) if (watched[i]!.type === type) return true;\n return false;\n }\n\n #forget(watch: Watch): void {\n const watched = this.#watched;\n if (!watched) return;\n const i = watched.indexOf(watch);\n if (i >= 0) watched.splice(i, 1);\n }\n}\n\n/** Serializes a computed getter with the model's own fields. */\nexport function Persist<T extends Model, V>(_getter: () => V, context: ClassGetterDecoratorContext<T, V>): void {\n (pendingPersist ??= []).push(context.name as string);\n}\n\n/** Checks the field with these validators; several `@Validate` on one field add up. */\nexport function Validate(\n ...validators: Validator[]\n): (_member: unknown, context: ClassGetterDecoratorContext | ClassFieldDecoratorContext) => void {\n return (_member, context) => {\n (pendingValidators ??= []).push([context.name as string, validators]);\n };\n}\n\n/** Keeps a member out of `changes` and `toJSON`. */\nexport function Ignore(\n _member: unknown,\n context: ClassGetterDecoratorContext | ClassFieldDecoratorContext,\n): void {\n (pendingIgnored ??= []).push(context.name as string);\n}\n\n/** Leaves a field plain: the bundle does not turn it into a tracked field. */\nexport function Untracked(_value: undefined, _context: ClassFieldDecoratorContext): void {}\n\n/** @see Model.same */\nexport function isLike(a: unknown, b: unknown): boolean {\n return Model.same(a, b);\n}\n\n// A set on a tracked field learns which model and property hold it.\nfunction attach(value: unknown, owner: Model, index: number): void {\n if (value !== null && typeof value === \"object\") {\n const set = value as { $own?: (owner: Model, index: number) => void };\n if (typeof set.$own === \"function\") set.$own(owner, index);\n }\n}\n\n// Models and sets answer `hasChanges`, `changes`, `revertChanges` and `confirmChanges` themselves.\nfunction valueHasChanges(value: unknown): boolean {\n if (value === null || typeof value !== \"object\" || value instanceof Date) return false;\n const changes = (value as { hasChanges?: unknown }).hasChanges;\n if (typeof changes === \"boolean\") return changes;\n if (Array.isArray(value)) return value.some(valueHasChanges);\n return Object.values(value).some(valueHasChanges);\n}\n\nfunction valueHasErrors(value: unknown): boolean {\n if (value === null || typeof value !== \"object\" || value instanceof Date) return false;\n const errors = (value as { hasErrors?: unknown }).hasErrors;\n if (typeof errors === \"boolean\") return errors;\n if (Array.isArray(value)) return value.some(valueHasErrors);\n return Object.values(value).some(valueHasErrors);\n}\n\nfunction isSerializable(value: unknown): boolean {\n if (value === null) return true;\n const type = typeof value;\n if (type === \"string\" || type === \"number\" || type === \"boolean\") return true;\n return value instanceof Date || valueHasChanges(value);\n}\n\nfunction changesOf(value: unknown): unknown {\n if (value === null || typeof value !== \"object\" || value instanceof Date) return value;\n const owner = value as { hasChanges?: unknown; changes?: unknown };\n if (typeof owner.hasChanges === \"boolean\") return owner.changes;\n if (Array.isArray(value)) return value.filter(valueHasChanges).map(changesOf);\n const result: Record<string, unknown> = {};\n for (const [name, nested] of Object.entries(value)) if (isSerializable(nested)) result[name] = changesOf(nested);\n return result;\n}\n\nfunction revertValue(value: unknown): void {\n if (value === null || typeof value !== \"object\") return;\n const owner = value as { hasChanges?: unknown; revertChanges?: () => void };\n if (typeof owner.revertChanges === \"function\") {\n if (owner.hasChanges) owner.revertChanges();\n } else if (Array.isArray(value)) value.forEach(revertValue);\n}\n\nexport const required = (value: any): true | string =>\n value !== undefined && value !== null && (typeof value !== \"string\" || value.trim() !== \"\") ? true : \"Field is required\";\n\n// The original e-mail pattern, minus `.` inside domain labels so it cannot backtrack exponentially.\nconst emailTest = /^((([a-z]|\\d|[!#$%&'*+\\-\\/=?^_`{|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#$%&'*+\\-\\/=?^_`{|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)(((([\\x20\\x09])*(\\x0d\\x0a))?([\\x20\\x09])+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*((([\\x20\\x09])*(\\x0d\\x0a))?([\\x20\\x09])+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.?$/i;\n\nexport const email: Validator = (value) =>\n (value ?? \"\").length <= 254 && emailTest.test(value ?? \"\") ? true : \"Field should be a valid e-mail\";\n\n// Written so each digit has one way to match, to avoid backtracking.\nconst phoneTest = /^(\\+\\s?)?((?<!\\+.*)\\(\\+?\\d+([\\s\\-.]?\\d+)?\\)|\\d)(?:\\d|[\\s\\-.]\\d|[\\s\\-.]?\\(\\d+(?:[\\s\\-.]?\\d+)?\\))*(\\s?(x|ext\\.?)\\s?\\d+)?$/i;\n\n/** A missing phone is valid: pair it with `required`. */\nexport function isValidPhone(value: string | null | undefined): boolean {\n return value == null || phoneTest.test(value);\n}\n\nexport const phone: Validator = (value) => (isValidPhone(value ?? null) ? true : \"Field should be a valid phone\");\n\nexport const maxLength = (length: number): Validator => (value) =>\n `${value}`.length <= length ? true : `Field length is limited to ${length}`;\n\nexport const minLength = (length: number): Validator => (value) =>\n `${value}`.length >= length ? true : `Field min length is ${length} characters`;\n\nexport const requiredIdValue: Validator = (value) => (required(value) === true && value > 0 ? true : \"Field is required\");\n\nexport const nonZero: Validator = (value) => (value > 0 ? true : \"Value must be greater than 0\");\n\nexport const minValue = (min: number, inclusive = true): Validator => (value) =>\n (inclusive ? value >= min : value > min) ? true : `Field must be greater than ${inclusive ? \"or equal to \" : \"\"}${min}`;\n\nexport const maxValue = (max: number, inclusive = true): Validator => (value) =>\n (inclusive ? value <= max : value < max) ? true : `Field must be less than ${inclusive ? \"or equal to \" : \"\"}${max}`;\n\n// Re-rendering: while a component renders, every tracked getter it reads reports itself here. The\n// component keeps one dep per model it read, with a bitmask of the properties (every field from the\n// 30th on shares one bit, and `state` has its own), rebuilt on every render; a change it covers queues one re-render.\n\n/** One (component, model) pair, held by the model in its own subscriber list. */\ntype Dep = {\n model: Model;\n owner: Reads;\n mask: number;\n epoch: number;\n /** Where the model keeps this dep, so dropping it is a swap. */\n slot: number;\n};\n\n/** What one component read, kept on the instance under `reads`. */\ntype Reads = {\n component: ComponentBase;\n /** Almost every component reads one model; the rest go in `more`. */\n first: Dep | undefined;\n more: Map<Model, Dep> | undefined;\n epoch: number;\n renders: number;\n /** `renders` when the component was queued, or -1 when it is not. */\n at: number;\n /** Deps held, and deps touched by the render in progress: equal means nothing to sweep. */\n size: number;\n seen: number;\n};\n\nconst reads = Symbol(\"xzor.model.reads\");\n\ntype Reader = Record<symbol, Reads | undefined>;\n\nconst readsOf = (c: ComponentBase): Reads | undefined => (c as unknown as Reader)[reads];\n\nconst stack: ComponentBase[] = [];\nconst queued: Reads[] = [];\nlet current: ComponentBase | undefined;\nlet currentReads: Reads | undefined;\n\n// Fields from the 30th on share bit 30: they re-render each other's readers, nobody else's. Bit 31 is `state`.\nconst bitOf = (index: number): number => (index === stateIndex ? 1 << 31 : index < 30 ? 1 << index : 1 << 30);\n\nfunction subscribe(own: Reads, model: Model): Dep {\n const dep: Dep = { model, owner: own, mask: 0, epoch: own.epoch, slot: 0 };\n model.$watch(dep);\n own.size++;\n own.seen++;\n return dep;\n}\n\nfunction read(model: Model, index: number): void {\n let own = currentReads;\n if (own === undefined) {\n own = currentReads = {\n component: current!,\n first: undefined,\n more: undefined,\n epoch: 1,\n renders: 1,\n at: -1,\n size: 0,\n seen: 0,\n };\n (current as unknown as Reader)[reads] = own;\n }\n let dep = own.first;\n if (dep === undefined) dep = own.first = subscribe(own, model);\n else if (dep.model !== model) {\n dep = own.more?.get(model);\n if (dep === undefined) {\n dep = subscribe(own, model);\n (own.more ??= new Map()).set(model, dep);\n }\n }\n if (dep.epoch !== own.epoch) {\n dep.epoch = own.epoch;\n dep.mask = 0;\n own.seen++;\n }\n dep.mask |= bitOf(index);\n}\n\nfunction changed(dep: Dep, index: number): void {\n if ((dep.mask & bitOf(index)) === 0) return;\n const own = dep.owner;\n if (own.at < 0) {\n queued.push(own);\n if (queued.length === 1) queueMicrotask(flush);\n }\n // Marking again moves the render this change waits for past one that already happened.\n own.at = own.renders;\n}\n\n// A component that already rendered after it was queued (its own event handler did it) is skipped.\nfunction flush(): void {\n for (const own of queued.splice(0)) {\n const at = own.at;\n own.at = -1;\n if (own.renders === at) own.component.stateHasChanged();\n }\n}\n\n/** @internal The queue models and fine bindings share: queues `dep`'s owner when `index` is in its mask. */\nexport const $notify = changed as (dep: object, index: number) => void;\n/** @internal Runs what is queued now instead of in a microtask. */\nexport const $flush = flush;\n\n// Drops the deps the render that just ended did not read again.\nfunction sweep(own: Reads): void {\n const more = own.more;\n if (more !== undefined) {\n for (const dep of more.values())\n if (dep.epoch !== own.epoch) {\n dep.model.$unwatch(dep);\n more.delete(dep.model);\n own.size--;\n }\n if (more.size === 0) own.more = undefined;\n }\n const first = own.first;\n if (first !== undefined && first.epoch !== own.epoch) {\n first.model.$unwatch(first);\n own.first = undefined;\n own.size--;\n const rest = own.more;\n if (rest !== undefined) {\n for (const [model, dep] of rest) {\n own.first = dep;\n rest.delete(model);\n break;\n }\n if (rest.size === 0) own.more = undefined;\n }\n }\n}\n\nsetRenderObserver({\n begin(component: ComponentBase): void {\n stack.push(component);\n current = component;\n const own = (currentReads = readsOf(component));\n if (own !== undefined) {\n own.epoch++;\n own.renders++;\n own.seen = 0;\n }\n Model.$reader = read;\n },\n\n end(_component: ComponentBase): void {\n const own = currentReads;\n if (own !== undefined && own.seen !== own.size) sweep(own);\n stack.pop();\n current = stack[stack.length - 1];\n currentReads = current === undefined ? undefined : readsOf(current);\n if (current === undefined) Model.$reader = undefined;\n },\n\n dispose(component: ComponentBase): void {\n const own = readsOf(component);\n if (own === undefined) return;\n if (own.first !== undefined) own.first.model.$unwatch(own.first);\n if (own.more !== undefined) for (const dep of own.more.values()) dep.model.$unwatch(dep);\n own.first = own.more = undefined;\n own.size = 0;\n own.renders++; // drops a queued re-render\n },\n});\n"
|
|
8
8
|
],
|
|
9
|
-
"mappings": "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",
|
|
10
|
-
"debugId": "
|
|
9
|
+
"mappings": "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",
|
|
10
|
+
"debugId": "1D6B4E24F03EAD3F64756E2164756E21",
|
|
11
11
|
"names": []
|
|
12
12
|
}
|