@memoized-dom/runtime 0.0.5 → 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/README.md +15 -2
  2. package/dist/access.d.ts +10 -10
  3. package/dist/access.d.ts.map +1 -1
  4. package/dist/async-storage.d.ts +9 -0
  5. package/dist/async-storage.d.ts.map +1 -0
  6. package/dist/chunks/access-CMv8a6Cm.js +1 -0
  7. package/dist/chunks/jsx-dom-C2FcLSgz.js +1 -0
  8. package/dist/chunks/mount-COP9U3A-.js +1 -0
  9. package/dist/chunks/src-CMZZbF4X.js +0 -0
  10. package/dist/cleanup.d.ts +3 -0
  11. package/dist/cleanup.d.ts.map +1 -1
  12. package/dist/cond.d.ts +1 -1
  13. package/dist/cond.d.ts.map +1 -1
  14. package/dist/dirty-reasons.d.ts +12 -5
  15. package/dist/dirty-reasons.d.ts.map +1 -1
  16. package/dist/effect.d.ts.map +1 -1
  17. package/dist/environment.d.ts +60 -0
  18. package/dist/environment.d.ts.map +1 -0
  19. package/dist/events.d.ts +3 -7
  20. package/dist/events.d.ts.map +1 -1
  21. package/dist/hot.d.ts +14 -0
  22. package/dist/hot.d.ts.map +1 -0
  23. package/dist/hot.js +1 -0
  24. package/dist/hydrate.d.ts +19 -0
  25. package/dist/hydrate.d.ts.map +1 -0
  26. package/dist/hydrate.js +1 -0
  27. package/dist/hydration-error.d.ts +8 -0
  28. package/dist/hydration-error.d.ts.map +1 -0
  29. package/dist/hydration.d.ts +123 -0
  30. package/dist/hydration.d.ts.map +1 -0
  31. package/dist/index.d.ts +15 -7
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +1 -1
  34. package/dist/jsx-dom.d.ts.map +1 -1
  35. package/dist/kernel.d.ts +88 -40
  36. package/dist/kernel.d.ts.map +1 -1
  37. package/dist/list-keys.d.ts +40 -0
  38. package/dist/list-keys.d.ts.map +1 -0
  39. package/dist/list-update.d.ts +6 -0
  40. package/dist/list-update.d.ts.map +1 -0
  41. package/dist/list.d.ts +3 -7
  42. package/dist/list.d.ts.map +1 -1
  43. package/dist/mount.d.ts +32 -0
  44. package/dist/mount.d.ts.map +1 -0
  45. package/dist/props.d.ts.map +1 -1
  46. package/dist/refs.d.ts +3 -0
  47. package/dist/refs.d.ts.map +1 -1
  48. package/dist/server.d.ts +2 -0
  49. package/dist/server.d.ts.map +1 -0
  50. package/dist/server.js +1 -0
  51. package/dist/setters.d.ts +2 -0
  52. package/dist/setters.d.ts.map +1 -1
  53. package/dist/state-cells.d.ts +51 -0
  54. package/dist/state-cells.d.ts.map +1 -0
  55. package/dist/testing.d.ts +1 -0
  56. package/dist/testing.d.ts.map +1 -1
  57. package/dist/testing.js +1 -1
  58. package/package.json +55 -28
  59. package/dist/chunks/chunk-BRFV3POR.js +0 -1
package/dist/kernel.d.ts CHANGED
@@ -1,28 +1,5 @@
1
- /**
2
- * @file kernel.ts
3
- * M0 — Runtime kernel of the Analyzed Memoized DOM.
4
- *
5
- * The kernel owns exactly four things (see memoized-dom-paradigm.md §5–§6):
6
- * 1. The entity registry — Map<id, Entity>, O(1) lookup by hierarchical id
7
- * 2. The dirty set — Set<id>, dedupes any number of triggers into one render
8
- * 3. The frame scheduler — batches all dirty marks into one commit per frame
9
- * 4. The commit cycle — re-renders exactly the dirty set, parent-before-child
10
- *
11
- * It knows NOTHING about components, state, or events. Those are compiler
12
- * concerns layered on top. Keep this file focused on entity lifetime.
13
- *
14
- * M4 hardening (benchmark-driven):
15
- * - Entity carries `children` + precomputed `depth`: subtree teardown is
16
- * O(subtree) — was O(registry) per entity, i.e. O(n^2) on mass removal
17
- * (clear-10k took 1510ms before this fix)
18
- * - commit sorts NUMERIC depths, not string paths
19
- * - registeredIds() returns a cached array, rebuilt only on register/unregister
20
- *
21
- * INVARIANT (the M5 compiler guarantees this): parents register BEFORE their
22
- * children, so child links exist. Violations don't corrupt rendering — they
23
- * only orphan children from subtree teardown.
24
- */
25
- import { type DirtyReasonInput, type DirtyReasons } from './dirty-reasons';
1
+ import { type DirtyReasonInput, type DirtyReasons, type DirtyReasonStore } from './dirty-reasons';
2
+ import { type RenderEnvironment } from './environment';
26
3
  export type EntityId = string;
27
4
  export type { DirtyReasonInput, DirtyReasons } from './dirty-reasons';
28
5
  /**
@@ -36,24 +13,97 @@ export interface Entity {
36
13
  id: EntityId;
37
14
  parent: EntityId | null;
38
15
  render: (reasons?: DirtyReasons) => void;
16
+ /** Opaque pull state is conservatively reevaluated once per browser frame. */
17
+ volatile?: boolean;
39
18
  /** Effects drain only after all ordinary render work is complete. */
40
19
  phase?: 'render' | 'effect';
41
20
  depth?: number;
42
21
  children?: Set<EntityId>;
43
22
  }
44
- type Scheduler = (fn: () => void) => void;
45
- /** Swap the scheduling policy (tests, SSR, custom frame loops). */
23
+ export type Scheduler = (fn: () => void) => void;
24
+ /**
25
+ * All mutable kernel bookkeeping for one application/request. Nothing else
26
+ * in the kernel may hold render-affecting state at module scope.
27
+ */
28
+ interface KernelState {
29
+ readonly registry: Map<EntityId, Entity>;
30
+ readonly dirty: Set<EntityId>;
31
+ readonly volatile: Set<EntityId>;
32
+ /** Exact numeric causes per dirty entity until their next render. */
33
+ readonly dirtyReasons: DirtyReasonStore;
34
+ /**
35
+ * Request-owned storage cells for lifted module state (SSR Phase 1.3,
36
+ * proposal Option B). Keyed by canonical linker identity.
37
+ */
38
+ readonly cells: Map<string, unknown>;
39
+ /** Cached id array for the access resolver — null when stale. */
40
+ idsCache: EntityId[] | null;
41
+ /** Monotonic registry generation for resolver caches. */
42
+ generation: number;
43
+ scheduler: Scheduler;
44
+ volatileFrameScheduled: boolean;
45
+ scheduled: boolean;
46
+ inCommit: boolean;
47
+ /** Cycle diagnostics — non-null only while a commit drain runs. */
48
+ renderingEntity: EntityId | null;
49
+ renderCounts: Map<EntityId, number> | null;
50
+ markedBy: Map<EntityId, EntityId> | null;
51
+ /**
52
+ * Named per-runtime stores for kernel-adjacent subsystems (cleanup, prop
53
+ * boxes, access resolver, mount bookkeeping). Modules own their store
54
+ * shapes; the kernel only provides request-scoped storage and lifetime.
55
+ */
56
+ readonly extensions: Map<string, unknown>;
57
+ /** Capability descriptor selecting browser/server behavior. */
58
+ environment: RenderEnvironment;
59
+ }
60
+ /**
61
+ * One isolated application/request runtime. Browser code uses the ambient
62
+ * default; server entry points create, activate, and dispose one per request.
63
+ */
64
+ export interface ApplicationRuntime {
65
+ readonly id: string;
66
+ /**
67
+ * Unregister every entity (draining cleanup hooks) and drop all pending
68
+ * bookkeeping. The handle must not be activated afterwards.
69
+ */
70
+ dispose(): void;
71
+ /** @internal Test/introspection surface. Not part of the paradigm API. */
72
+ readonly state: KernelState;
73
+ }
74
+ /** Create an isolated runtime. Server entry points call this per request. */
75
+ export declare function createApplicationRuntime(id?: string, environment?: Partial<RenderEnvironment>): ApplicationRuntime;
76
+ /** The runtime all kernel operations currently route through. */
77
+ export declare function getActiveApplicationRuntime(): ApplicationRuntime;
78
+ type RuntimeCreatedListener = (runtime: ApplicationRuntime) => void;
79
+ /** Invoke `listener` for every application runtime created from now on. */
80
+ export declare function onRuntimeCreated(listener: RuntimeCreatedListener): () => void;
81
+ /** Route subsequent kernel operations through `runtime`. */
82
+ export declare function setActiveApplicationRuntime(runtime: ApplicationRuntime): ApplicationRuntime;
83
+ /** Scope `fn` to `runtime`, restoring the previous runtime afterwards. */
84
+ export declare function runWithApplicationRuntime<T>(runtime: ApplicationRuntime, fn: () => T): T;
85
+ /** Swap the scheduling policy of the ACTIVE runtime (tests, SSR, hosts). */
46
86
  export declare function setScheduler(fn: Scheduler): void;
47
- /** Restore the environment default (microtask). */
48
- export declare function resetScheduler(): void;
49
- /** Current registry generation (see above). Introspection/resolver only. */
50
- export declare function registryGeneration(): number;
87
+ /** The capability descriptor of the ACTIVE runtime. */
88
+ export declare function getActiveEnvironment(): RenderEnvironment;
51
89
  /**
52
- * M5.6: registry-change listeners push-based notification so the access
53
- * resolver can keep wildcard expansions incrementally updated instead of
54
- * re-matching every pattern against every id on every commit. Listeners
55
- * run synchronously; they must be cheap (a few regex tests).
90
+ * Whether detached DOM templates may be cloned for new instances. False in
91
+ * hydrate mode: row factories must claim their server nodes through the
92
+ * document instead of cloning a template built from the first claim.
56
93
  */
94
+ export declare function canReuseTemplate(): boolean;
95
+ /**
96
+ * Run `run` in an overridden render environment (mode, document, hydration).
97
+ * Restores the previous environment afterwards.
98
+ */
99
+ export declare function runWithRenderEnvironment<T>(overrides: Partial<RenderEnvironment>, run: () => T): T;
100
+ /**
101
+ * Per-runtime named storage for kernel-adjacent subsystems. The first call
102
+ * creates the store; every later call inside the same runtime returns the
103
+ * same instance, so concurrent runtimes never share module state.
104
+ */
105
+ export declare function getExtensionStore<T>(key: string, create: () => T): T;
106
+ export declare function resetScheduler(): void;
57
107
  type RegistryListener = (id: EntityId, kind: 'add' | 'remove') => void;
58
108
  /**
59
109
  * Lifecycle features install their disposer lazily on first use. Keeping the
@@ -63,6 +113,8 @@ type RegistryListener = (id: EntityId, kind: 'add' | 'remove') => void;
63
113
  export type EntityDisposeHook = (id: EntityId) => readonly unknown[] | void;
64
114
  export declare function onEntityDispose(fn: EntityDisposeHook): void;
65
115
  export declare function onRegistryChange(fn: RegistryListener): void;
116
+ /** Current registry generation (introspection/resolver only). */
117
+ export declare function registryGeneration(): number;
66
118
  export declare function register(entity: Entity): void;
67
119
  /**
68
120
  * Unregister an entity and ALL its descendants — O(subtree), not O(registry).
@@ -80,11 +132,6 @@ export declare function getEntity(id: EntityId): Entity | undefined;
80
132
  * whose lexical dependencies belong to the callback caller.
81
133
  */
82
134
  export declare function renderDescendants(id: EntityId): void;
83
- /**
84
- * Live entity ids for the access-table resolver. Cached — the array is
85
- * rebuilt only when the registry mutates, so per-event cost is zero.
86
- * Callers MUST NOT mutate the returned array.
87
- */
88
135
  export declare function registeredIds(): readonly EntityId[];
89
136
  /**
90
137
  * Mark one entity dirty and schedule a commit.
@@ -125,5 +172,6 @@ export declare function commit(): void;
125
172
  export declare function _internals(): {
126
173
  registry: ReadonlyMap<EntityId, Entity>;
127
174
  dirtySet: ReadonlySet<EntityId>;
175
+ volatileSet: ReadonlySet<EntityId>;
128
176
  };
129
177
  //# sourceMappingURL=kernel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"kernel.d.ts","sourceRoot":"","sources":["../src/kernel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAIL,KAAK,gBAAgB,EACrB,KAAK,YAAY,EAClB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC;AAC9B,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEtE;;;;;;GAMG;AACH,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,QAAQ,CAAC;IACb,MAAM,EAAE,QAAQ,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,YAAY,KAAK,IAAI,CAAC;IACzC,qEAAqE;IACrE,KAAK,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;CAC1B;AAWD,KAAK,SAAS,GAAG,CAAC,EAAE,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;AAS1C,mEAAmE;AACnE,wBAAgB,YAAY,CAAC,EAAE,EAAE,SAAS,GAAG,IAAI,CAEhD;AAED,mDAAmD;AACnD,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAwBD,4EAA4E;AAC5E,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED;;;;;GAKG;AACH,KAAK,gBAAgB,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,GAAG,QAAQ,KAAK,IAAI,CAAC;AAGvE;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,EAAE,EAAE,QAAQ,KAAK,SAAS,OAAO,EAAE,GAAG,IAAI,CAAC;AAG5E,wBAAgB,eAAe,CAAC,EAAE,EAAE,iBAAiB,GAAG,IAAI,CAE3D;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,gBAAgB,GAAG,IAAI,CAE3D;AAMD,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAgB7C;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI,CAgDpD;AAED,mEAAmE;AACnE,wBAAgB,UAAU,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI,CAE7C;AAED,wBAAgB,GAAG,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAEzC;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,CAE1D;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI,CA8BpD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,SAAS,QAAQ,EAAE,CAGnD;AAKD;;;;;GAKG;AACH,wBAAgB,SAAS,CACvB,EAAE,EAAE,QAAQ,EACZ,MAAM,CAAC,EAAE,gBAAgB,GACxB,IAAI,CAQN;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI,CAM1C;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI,CAWnD;AAcD;;;;;;;;;;;;GAYG;AACH,wBAAgB,MAAM,IAAI,IAAI,CA8C7B;AAKD,wBAAgB,UAAU,IAAI;IAC5B,QAAQ,EAAE,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACxC,QAAQ,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;CACjC,CAEA"}
1
+ {"version":3,"file":"kernel.d.ts","sourceRoot":"","sources":["../src/kernel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * list-keys.ts — Phase 0 hydration-safe keyed-list identity encoding.
3
+ *
4
+ * List row identity embeds the user-provided key into an entity id segment
5
+ * (`<idPrefix>/Row[<encoded>]`). The historical encoding was `String(key)`:
6
+ *
7
+ * - `1`, `"1"`, `1n` and `true`/`"true"` collapsed into identical ids;
8
+ * - raw string keys injected protocol-significant characters (`/` splits
9
+ * id segments, `]` closes the row marker, `%` pre-empts future escapes).
10
+ *
11
+ * The contract below is the hydration-safe replacement. Every PRIMITIVE key
12
+ * encodes deterministically with an explicit type tag, so server and client
13
+ * builds of one graph derive identical identity from identical data:
14
+ *
15
+ * number → `n:<canonical digits>` (String(number); -0 encodes as `0`,
16
+ * SameValueZero makes that equivalent)
17
+ * bigint → `g:<decimal digits>`
18
+ * boolean → `t` | `f`
19
+ * string → `s:<escaped>` (every code point outside
20
+ * A–Z a–z 0–9 _ . ~ - becomes
21
+ * uppercase percent-escape UTF-8)
22
+ *
23
+ * NON-primitive keys (objects, symbols, functions, null, undefined) return
24
+ * `null` here and fall back to process-local synthetic ids. DECLARED SSR
25
+ * LIMITATION: such keys cannot survive a server→client transfer; hydration
26
+ * requires stable primitive keys. This is a documented diagnostic boundary,
27
+ * not silent cross-request sharing.
28
+ */
29
+ /**
30
+ * Encode a list key for embedding in an entity id / hydration marker.
31
+ * Returns `null` when the key is not a hydration-stable primitive.
32
+ */
33
+ export declare function encodeListKey(key: unknown): string | null;
34
+ /**
35
+ * Inverse of `encodeListKey`. Returns `undefined` for input this contract
36
+ * did not produce (including synthetic `#N` segments, which were never
37
+ * hydration-stable).
38
+ */
39
+ export declare function decodeListKey(encoded: string): unknown;
40
+ //# sourceMappingURL=list-keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-keys.d.ts","sourceRoot":"","sources":["../src/list-keys.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAuBH;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAmBzD;AAWD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAkBtD"}
@@ -0,0 +1,6 @@
1
+ import type { DirtyReasons } from './dirty-reasons';
2
+ export declare function listStructureReason(source: string): string;
3
+ export declare function listStructureReaderKey(source: string): string;
4
+ export declare function isStructuralListUpdate(reasons: DirtyReasons, source: string): boolean;
5
+ export declare function retainedRowNeedsSync<T>(previous: T, next: T, previousIndex: number, nextIndex: number, indexSensitive: boolean): boolean;
6
+ //# sourceMappingURL=list-update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-update.d.ts","sourceRoot":"","sources":["../src/list-update.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAapD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,MAAM,GACb,OAAO,CAaT;AAED,wBAAgB,oBAAoB,CAAC,CAAC,EACpC,QAAQ,EAAE,CAAC,EACX,IAAI,EAAE,CAAC,EACP,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,OAAO,GACtB,OAAO,CAET"}
package/dist/list.d.ts CHANGED
@@ -55,17 +55,13 @@ export interface ListEntry {
55
55
  }
56
56
  export type KeyFn<T> = (item: T, index: number) => unknown;
57
57
  export interface ListRegion<T> {
58
- /**
59
- * Reconcile collection identity and order. Compiler-proven topology-only
60
- * writes may pass `false`: retained rows whose item reference is unchanged
61
- * then skip content replay while inserted/replaced items still synchronize.
62
- */
63
- reconcile(items: readonly T[], syncRetained?: boolean): void;
58
+ /** Reconcile collection identity, order, and retained row content. */
59
+ reconcile(items: readonly T[], structuralOnly?: boolean): void;
64
60
  /** Re-sync one retained row through the region's O(1) key cache. */
65
61
  refreshKey(key: unknown): void;
66
62
  size(): number;
67
63
  /** Remove retained nodes and unregister every entity owned by the region. */
68
64
  dispose(): void;
69
65
  }
70
- export declare function createListRegion<T>(parent: Node, idPrefix: EntityId, create: (item: T, rowId: EntityId, index: number) => ListEntry, key?: KeyFn<T>, trackRowIds?: boolean): ListRegion<T>;
66
+ export declare function createListRegion<T>(parent: Node, idPrefix: EntityId, create: (item: T, rowId: EntityId, index: number) => ListEntry, key?: KeyFn<T>, trackRowIds?: boolean, indexSensitive?: boolean): ListRegion<T>;
71
67
  //# sourceMappingURL=list.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../src/list.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,EAAyC,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEhF,MAAM,WAAW,SAAS;IACxB,4EAA4E;IAC5E,KAAK,EAAE,IAAI,GAAG,SAAS,IAAI,EAAE,CAAC;IAC9B,kEAAkE;IAClE,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrD,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,MAAM,MAAM,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;AAK3D,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B;;;;OAIG;IACH,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE,YAAY,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7D,oEAAoE;IACpE,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/B,IAAI,IAAI,MAAM,CAAC;IACf,6EAA6E;IAC7E,OAAO,IAAI,IAAI,CAAC;CACjB;AAiDD,wBAAgB,gBAAgB,CAAC,CAAC,EAChC,MAAM,EAAE,IAAI,EACZ,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,KAAK,SAAS,EAC9D,GAAG,GAAE,KAAK,CAAC,CAAC,CAAe,EAC3B,WAAW,UAAO,GACjB,UAAU,CAAC,CAAC,CAAC,CAiWf"}
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../src/list.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,EAA+D,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAC;AAKtG,MAAM,WAAW,SAAS;IACxB,4EAA4E;IAC5E,KAAK,EAAE,IAAI,GAAG,SAAS,IAAI,EAAE,CAAC;IAC9B,kEAAkE;IAClE,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrD,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,MAAM,MAAM,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;AAK3D,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,sEAAsE;IACtE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE,cAAc,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/D,oEAAoE;IACpE,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/B,IAAI,IAAI,MAAM,CAAC;IACf,6EAA6E;IAC7E,OAAO,IAAI,IAAI,CAAC;CACjB;AAiDD,wBAAgB,gBAAgB,CAAC,CAAC,EAChC,MAAM,EAAE,IAAI,EACZ,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,KAAK,SAAS,EAC9D,GAAG,GAAE,KAAK,CAAC,CAAC,CAAe,EAC3B,WAAW,UAAO,EAClB,cAAc,UAAO,GACpB,UAAU,CAAC,CAAC,CAAC,CA+qBf"}
@@ -0,0 +1,32 @@
1
+ /** Authored zero-argument component reference accepted by the browser entry. */
2
+ export type MountableComponent = () => unknown;
3
+ export type MountTarget = string | Element;
4
+ export interface RootMountContext {
5
+ readonly mode: 'create' | 'hydrate';
6
+ readonly host: Element;
7
+ }
8
+ export interface RootFactoryDefinition {
9
+ id: string;
10
+ create(context: RootMountContext): Node;
11
+ }
12
+ export interface MountedApplication {
13
+ readonly host: Element;
14
+ readonly rootId: string;
15
+ readonly nodes: readonly Node[];
16
+ readonly mounted: boolean;
17
+ unmount(): void;
18
+ }
19
+ export interface MountStore {
20
+ readonly mountedHosts: WeakMap<Element, MountedApplication>;
21
+ readonly mountedRoots: Map<string, MountedApplication>;
22
+ }
23
+ export declare function mountStore(): MountStore;
24
+ /** Compiler-emitted root metadata. Application code should call mount(). */
25
+ export declare function registerRootFactory(component: Function, definition: RootFactoryDefinition): void;
26
+ export declare function removeNodes(nodes: readonly Node[]): void;
27
+ export declare function resolveHost(target: MountTarget): Element;
28
+ /** Mount one compiled application root into an ordinary DOM host. */
29
+ export declare function mount(target: MountTarget, component: MountableComponent): MountedApplication;
30
+ /** Hydration entry support; intentionally absent from the public client barrel. */
31
+ export declare function rootFactoryFor(component: MountableComponent): RootFactoryDefinition | undefined;
32
+ //# sourceMappingURL=mount.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mount.d.ts","sourceRoot":"","sources":["../src/mount.ts"],"names":[],"mappings":"AAOA,gFAAgF;AAChF,MAAM,MAAM,kBAAkB,GAAG,MAAM,OAAO,CAAC;AAC/C,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3C,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAAC;CACzC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,OAAO,IAAI,IAAI,CAAC;CACjB;AAOD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;IAC5D,QAAQ,CAAC,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;CACxD;AACD,wBAAgB,UAAU,IAAI,UAAU,CAKvC;AAED,4EAA4E;AAC5E,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,QAAQ,EACnB,UAAU,EAAE,qBAAqB,GAChC,IAAI,CAEN;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,GAAG,IAAI,CAExD;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAOxD;AAED,qEAAqE;AACrE,wBAAgB,KAAK,CACnB,MAAM,EAAE,WAAW,EACnB,SAAS,EAAE,kBAAkB,GAC5B,kBAAkB,CA6DpB;AAED,mFAAmF;AACnF,wBAAgB,cAAc,CAC5B,SAAS,EAAE,kBAAkB,GAC5B,qBAAqB,GAAG,SAAS,CAEnC"}
@@ -1 +1 @@
1
- {"version":3,"file":"props.d.ts","sourceRoot":"","sources":["../src/props.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAA+B,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAC;AAItE,iEAAiE;AACjE,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,IAAI,CAEhE;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,OAAO,EAAE,GAAG,IAAI,CAgBrE;AAED,uCAAuC;AACvC,wBAAgB,SAAS,CAAC,EAAE,EAAE,QAAQ,GAAG,SAAS,OAAO,EAAE,GAAG,SAAS,CAEtE"}
1
+ {"version":3,"file":"props.d.ts","sourceRoot":"","sources":["../src/props.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAkD,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAC;AAMzF,iEAAiE;AACjE,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,IAAI,CAEhE;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,OAAO,EAAE,GAAG,IAAI,CAgBrE;AAED,uCAAuC;AACvC,wBAAgB,SAAS,CAAC,EAAE,EAAE,QAAQ,GAAG,SAAS,OAAO,EAAE,GAAG,SAAS,CAEtE"}
package/dist/refs.d.ts CHANGED
@@ -3,6 +3,9 @@
3
3
  *
4
4
  * Assignable refs are compiled into this callback contract, so the runtime
5
5
  * never needs to understand source l-values or allocate JSX/ref objects.
6
+ *
7
+ * Ref invocation is capability-gated (SSR slice 1.2): server environments
8
+ * record ownership without handing over nodes.
6
9
  */
7
10
  export type RefCallback<T extends Node = Node> = (node: T) => void | (() => void);
8
11
  export type RefValue<T extends Node = Node> = RefCallback<T> | readonly RefValue<T>[] | null | undefined | false;
@@ -1 +1 @@
1
- {"version":3,"file":"refs.d.ts","sourceRoot":"","sources":["../src/refs.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,IAAI,GAAG,IAAI,IAAI,CAC/C,IAAI,EAAE,CAAC,KACJ,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;AACzB,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,IAAI,GAAG,IAAI,IACtC,WAAW,CAAC,CAAC,CAAC,GACd,SAAS,QAAQ,CAAC,CAAC,CAAC,EAAE,GACtB,IAAI,GACJ,SAAS,GACT,KAAK,CAAC;AAEV,iFAAiF;AACjF,wBAAgB,QAAQ,CAAC,CAAC,SAAS,IAAI,EACrC,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,GACjB,MAAM,IAAI,CA0BZ"}
1
+ {"version":3,"file":"refs.d.ts","sourceRoot":"","sources":["../src/refs.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,IAAI,GAAG,IAAI,IAAI,CAC/C,IAAI,EAAE,CAAC,KACJ,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;AACzB,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,IAAI,GAAG,IAAI,IACtC,WAAW,CAAC,CAAC,CAAC,GACd,SAAS,QAAQ,CAAC,CAAC,CAAC,EAAE,GACtB,IAAI,GACJ,SAAS,GACT,KAAK,CAAC;AAEV,iFAAiF;AACjF,wBAAgB,QAAQ,CAAC,CAAC,SAAS,IAAI,EACrC,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,GACjB,MAAM,IAAI,CAkCZ"}
@@ -0,0 +1,2 @@
1
+ export * from './index';
2
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AASA,cAAc,SAAS,CAAC"}
package/dist/server.js ADDED
@@ -0,0 +1 @@
1
+ import{C as e,D as t,E as n,O as r,S as i,T as a,_ as o,a as s,b as c,c as l,d as u,f as d,g as f,i as p,l as m,o as h,r as g,s as _,t as v,u as y,v as b,w as x,x as S,y as C}from"./chunks/jsx-dom-C2FcLSgz.js";import{a as w,c as T,i as E,l as D,n as O,o as k,r as A,s as j,t as M}from"./chunks/access-CMv8a6Cm.js";import{A as N,C as P,D as F,E as I,F as L,M as R,N as z,O as B,P as V,S as H,T as U,_ as W,a as G,b as K,c as q,d as J,f as Y,g as X,h as Z,i as Q,j as $,k as ee,l as te,m as ne,n as re,o as ie,p as ae,r as oe,s as se,u as ce,v as le,w as ue,x as de,y as fe}from"./chunks/src-CMZZbF4X.js";import{r as pe,t as me}from"./chunks/mount-COP9U3A-.js";import{AsyncLocalStorage as he}from"node:async_hooks";r(()=>new he);export{g as canReuseTemplate,se as classValue,ue as cleanup,ee as clearEventLog,p as commit,N as commitStructuralWrites,$ as commitWrites,R as commitWritesWithPayload,ae as computedChanged,s as createApplicationRuntime,Q as createCondRegion,ce as createDelegatedEventBinding,Y as createListRegion,t as createStorage,T as decodeListKey,U as defineStateCell,ne as effectAssignmentChanged,D as encodeListKey,h as getActiveApplicationRuntime,_ as getActiveEnvironment,l as getEntity,z as getEventLog,m as getExtensionStore,M as getRootId,V as handle,y as has,O as installAccessTable,A as isOpaque,L as isStructuralListUpdate,u as markDirty,d as markDirtySubtree,me as mount,P as mountRef,G as patchDomProps,I as readCell,f as register,de as registerConditionalEffect,H as registerEffect,re as registerProps,pe as registerRootFactory,o as registeredIds,b as renderDescendants,E as resetAccessTable,C as resetScheduler,w as resolveStaticWrites,k as resolveWrites,v as rootNodes,c as runWithApplicationRuntime,S as runWithRenderEnvironment,i as setActiveApplicationRuntime,Z as setAttr,F as setCell,X as setClass,W as setClassName,q as setClassValue,J as setDelegatedEvent,ie as setDomValue,le as setProp,oe as setProps,e as setScheduler,fe as setStyle,te as setStyleValue,K as setText,x as undirty,j as uninstallAccessTable,a as unregister,n as unregisterSubtree,B as updateCell};
package/dist/setters.d.ts CHANGED
@@ -46,4 +46,6 @@ export declare function setStyle($: SlotCache, key: string, el: HTMLElement, pro
46
46
  * an in-place change.
47
47
  */
48
48
  export declare function computedChanged(prev: unknown, next: unknown): boolean;
49
+ /** Equal plain assignments inside effects do not create feedback work. */
50
+ export declare function effectAssignmentChanged(prev: unknown, next: unknown): boolean;
49
51
  //# sourceMappingURL=setters.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"setters.d.ts","sourceRoot":"","sources":["../src/setters.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEhD,sFAAsF;AACtF,wBAAgB,OAAO,CACrB,CAAC,EAAE,SAAS,EACZ,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,OAAO,GACb,IAAI,CAIN;AAED,yCAAyC;AACzC,wBAAgB,YAAY,CAC1B,CAAC,EAAE,SAAS,EACZ,GAAG,EAAE,MAAM,EACX,EAAE,EAAE,WAAW,EACf,KAAK,EAAE,MAAM,GACZ,IAAI,CAIN;AAED,kDAAkD;AAClD,wBAAgB,QAAQ,CACtB,CAAC,EAAE,SAAS,EACZ,GAAG,EAAE,MAAM,EACX,EAAE,EAAE,WAAW,EACf,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,OAAO,GACZ,IAAI,CAIN;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CACrB,CAAC,EAAE,SAAS,EACZ,GAAG,EAAE,MAAM,EACX,EAAE,EAAE,OAAO,EACX,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,GACb,IAAI,CAMN;AAED;;;GAGG;AACH,wBAAgB,OAAO,CACrB,CAAC,EAAE,SAAS,EACZ,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,GACb,IAAI,CAIN;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CACtB,CAAC,EAAE,SAAS,EACZ,GAAG,EAAE,MAAM,EACX,EAAE,EAAE,WAAW,EACf,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC/B,IAAI,CAKN;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAYrE"}
1
+ {"version":3,"file":"setters.d.ts","sourceRoot":"","sources":["../src/setters.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEhD,sFAAsF;AACtF,wBAAgB,OAAO,CACrB,CAAC,EAAE,SAAS,EACZ,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,OAAO,GACb,IAAI,CAIN;AAED,yCAAyC;AACzC,wBAAgB,YAAY,CAC1B,CAAC,EAAE,SAAS,EACZ,GAAG,EAAE,MAAM,EACX,EAAE,EAAE,WAAW,EACf,KAAK,EAAE,MAAM,GACZ,IAAI,CAIN;AAED,kDAAkD;AAClD,wBAAgB,QAAQ,CACtB,CAAC,EAAE,SAAS,EACZ,GAAG,EAAE,MAAM,EACX,EAAE,EAAE,WAAW,EACf,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,OAAO,GACZ,IAAI,CAIN;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CACrB,CAAC,EAAE,SAAS,EACZ,GAAG,EAAE,MAAM,EACX,EAAE,EAAE,OAAO,EACX,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,GACb,IAAI,CAMN;AAED;;;GAGG;AACH,wBAAgB,OAAO,CACrB,CAAC,EAAE,SAAS,EACZ,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,GACb,IAAI,CAIN;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CACtB,CAAC,EAAE,SAAS,EACZ,GAAG,EAAE,MAAM,EACX,EAAE,EAAE,WAAW,EACf,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC/B,IAAI,CAKN;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAYrE;AAED,0EAA0E;AAC1E,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAE7E"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * state-cells.ts - SSR Phase 1.3 (proposal Option B) storage primitive.
3
+ *
4
+ * Module-level reactive state (`export let count = 0`) compiles today to
5
+ * ordinary ESM bindings, which are singletons: two concurrent server requests
6
+ * would share one memory cell. State cells give the compiler a lowering
7
+ * target where the STORAGE is owned by each application runtime while the
8
+ * canonical linker identity stays stable for invalidation routing.
9
+ *
10
+ * Authored:
11
+ * export let count = 0;
12
+ * export const store = { items: [] };
13
+ * export function inc() { count++; store.items.push(count); }
14
+ *
15
+ * Lowered shape the compiler emits (owning module passes its authored
16
+ * default; importing modules reference the same canonical key):
17
+ * const _c_count = _MD.defineStateCell('./src/state.ts#count', 0);
18
+ * const _c_store = _MD.defineStateCell('./src/state.ts#store', () => ({ items: [] }));
19
+ * export function inc() {
20
+ * _MD.updateCell(_c_count, (c) => c + 1);
21
+ * _MD.readCell(_c_store).items.push(_MD.readCell(_c_count));
22
+ * }
23
+ *
24
+ * Values initialize lazily per application runtime from the recorded
25
+ * default. Factory initials produce a FRESH value for every request, so
26
+ * mutated object stores never share instances across requests. Writes
27
+ * invalidate readers through the existing access table by canonical key,
28
+ * so computed entities, effects, and component updates need no changes.
29
+ */
30
+ export interface StateCell {
31
+ /** Canonical linker identity, e.g. './src/state.ts#count'. */
32
+ readonly key: string;
33
+ }
34
+ /**
35
+ * Declare a cell under a canonical identity. The module that OWNS the state
36
+ * passes its authored default - a value, or a factory for object state so
37
+ * each request gets a fresh instance. Importing modules call it with the
38
+ * same key and no initial.
39
+ */
40
+ export declare function defineStateCell<T>(key: string, initial?: T | (() => T)): StateCell;
41
+ /** Read this request's value of the cell. Initializes from the default once. */
42
+ export declare function readCell<T>(cell: StateCell): T;
43
+ /**
44
+ * Write this request's value and route invalidation through the access
45
+ * table under the cell's canonical key — identical routing to an ordinary
46
+ * authored state write.
47
+ */
48
+ export declare function setCell<T>(cell: StateCell, value: T): void;
49
+ /** Functional write; receives the request's current value. */
50
+ export declare function updateCell<T>(cell: StateCell, change: (current: T) => T): void;
51
+ //# sourceMappingURL=state-cells.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-cells.d.ts","sourceRoot":"","sources":["../src/state-cells.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAKH,MAAM,WAAW,SAAS;IACxB,8DAA8D;IAC9D,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAUD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAC/B,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GACtB,SAAS,CAGX;AAkBD,gFAAgF;AAChF,wBAAgB,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,GAAG,CAAC,CAE9C;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAG1D;AAED,8DAA8D;AAC9D,wBAAgB,UAAU,CAAC,CAAC,EAC1B,IAAI,EAAE,SAAS,EACf,MAAM,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,GACxB,IAAI,CAEN"}
package/dist/testing.d.ts CHANGED
@@ -7,4 +7,5 @@
7
7
  export * from './index';
8
8
  export { _internals } from './kernel';
9
9
  export { _propsBox } from './props';
10
+ export { listStructureReason } from './list-update';
10
11
  //# sourceMappingURL=testing.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC"}
package/dist/testing.js CHANGED
@@ -1 +1 @@
1
- import{A as z,B as A,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W as r,a as p,b as e,c as t,d as x,e as f,f as m,g as n,h as s,i as _,j as a,k as i,l,m as B,n as o,o as b,p as c,q as d,r as g,s as h,t as j,u as k,v as q,w as u,x as v,y as w,z as y}from"./chunks/chunk-BRFV3POR.js";export{o as _internals,r as _propsBox,O as classValue,b as cleanup,G as clearEventLog,B as commit,H as commitWrites,I as commitWritesWithPayload,w as computedChanged,T as createCondRegion,N as createDelegatedEventBinding,K as createListRegion,n as getEntity,F as getEventLog,C as getRootId,J as handle,m as has,y as installAccessTable,A as isOpaque,a as markDirty,l as markDirtySubtree,c as mountRef,R as patchDomProps,t as register,g as registerConditionalEffect,d as registerEffect,U as registerProps,_ as registeredIds,s as renderDescendants,z as resetAccessTable,e as resetScheduler,D as resolveStaticWrites,E as resolveWrites,L as rootNodes,q as setAttr,k as setClass,j as setClassName,P as setClassValue,M as setDelegatedEvent,S as setDomValue,u as setProp,V as setProps,p as setScheduler,v as setStyle,Q as setStyleValue,h as setText,i as undirty,f as unregister,x as unregisterSubtree};
1
+ import{C as e,D as t,E as n,S as r,T as i,_ as a,a as o,b as s,c,d as l,f as u,g as d,i as f,l as p,n as m,o as h,r as g,s as _,t as v,u as y,v as b,w as x,x as S,y as C}from"./chunks/jsx-dom-C2FcLSgz.js";import{a as w,c as T,i as E,l as D,n as O,o as k,r as A,s as j,t as M}from"./chunks/access-CMv8a6Cm.js";import{A as N,C as P,D as F,E as I,F as L,I as R,M as z,N as B,O as V,P as H,S as U,T as W,_ as G,a as K,b as q,c as J,d as Y,f as X,g as Z,h as Q,i as $,j as ee,k as te,l as ne,m as re,n as ie,o as ae,p as oe,r as se,s as ce,t as le,u as ue,v as de,w as fe,x as pe,y as me}from"./chunks/src-CMZZbF4X.js";import{r as he,t as ge}from"./chunks/mount-COP9U3A-.js";export{m as _internals,le as _propsBox,g as canReuseTemplate,ce as classValue,fe as cleanup,te as clearEventLog,f as commit,N as commitStructuralWrites,ee as commitWrites,z as commitWritesWithPayload,oe as computedChanged,o as createApplicationRuntime,$ as createCondRegion,ue as createDelegatedEventBinding,X as createListRegion,t as createStorage,T as decodeListKey,W as defineStateCell,re as effectAssignmentChanged,D as encodeListKey,h as getActiveApplicationRuntime,_ as getActiveEnvironment,c as getEntity,B as getEventLog,p as getExtensionStore,M as getRootId,H as handle,y as has,O as installAccessTable,A as isOpaque,L as isStructuralListUpdate,R as listStructureReason,l as markDirty,u as markDirtySubtree,ge as mount,P as mountRef,K as patchDomProps,I as readCell,d as register,pe as registerConditionalEffect,U as registerEffect,ie as registerProps,he as registerRootFactory,a as registeredIds,b as renderDescendants,E as resetAccessTable,C as resetScheduler,w as resolveStaticWrites,k as resolveWrites,v as rootNodes,s as runWithApplicationRuntime,S as runWithRenderEnvironment,r as setActiveApplicationRuntime,Q as setAttr,F as setCell,Z as setClass,G as setClassName,J as setClassValue,Y as setDelegatedEvent,ae as setDomValue,de as setProp,se as setProps,e as setScheduler,me as setStyle,ne as setStyleValue,q as setText,x as undirty,j as uninstallAccessTable,i as unregister,n as unregisterSubtree,V as updateCell};
package/package.json CHANGED
@@ -1,28 +1,55 @@
1
- {
2
- "name": "@memoized-dom/runtime",
3
- "version": "0.0.5",
4
- "description": "Dependency-free runtime for compiler-analyzed memoized DOM updates",
5
- "type": "module",
6
- "sideEffects": false,
7
- "files": [
8
- "dist"
9
- ],
10
- "exports": {
11
- ".": {
12
- "types": "./dist/index.d.ts",
13
- "import": "./dist/index.js",
14
- "default": "./dist/index.js"
15
- },
16
- "./testing": {
17
- "types": "./dist/testing.d.ts",
18
- "import": "./dist/testing.js",
19
- "default": "./dist/testing.js"
20
- }
21
- },
22
- "scripts": {
23
- "build": "bun run ./scripts/clean.ts && esbuild ./src/index.ts ./src/testing.ts --bundle --outdir=./dist --platform=browser --format=esm --target=es2022 --minify --splitting --entry-names=[name] --chunk-names=chunks/[name]-[hash] && tsc -p tsconfig.build.json"
24
- },
25
- "publishConfig": {
26
- "access": "public"
27
- }
28
- }
1
+ {
2
+ "name": "@memoized-dom/runtime",
3
+ "version": "0.0.7",
4
+ "description": "Dependency-free runtime for compiler-analyzed memoized DOM updates",
5
+ "type": "module",
6
+ "sideEffects": [
7
+ "./dist/server.js"
8
+ ],
9
+ "files": [
10
+ "dist"
11
+ ],
12
+ "exports": {
13
+ ".": {
14
+ "browser": {
15
+ "types": "./dist/index.d.ts",
16
+ "import": "./dist/index.js",
17
+ "default": "./dist/index.js"
18
+ },
19
+ "types": "./dist/index.d.ts",
20
+ "import": "./dist/server.js",
21
+ "default": "./dist/server.js"
22
+ },
23
+ "./client": {
24
+ "types": "./dist/index.d.ts",
25
+ "import": "./dist/index.js",
26
+ "default": "./dist/index.js"
27
+ },
28
+ "./server": {
29
+ "types": "./dist/server.d.ts",
30
+ "import": "./dist/server.js",
31
+ "default": "./dist/server.js"
32
+ },
33
+ "./hydrate": {
34
+ "types": "./dist/hydrate.d.ts",
35
+ "import": "./dist/hydrate.js",
36
+ "default": "./dist/hydrate.js"
37
+ },
38
+ "./hot": {
39
+ "types": "./dist/hot.d.ts",
40
+ "import": "./dist/hot.js",
41
+ "default": "./dist/hot.js"
42
+ },
43
+ "./testing": {
44
+ "types": "./dist/testing.d.ts",
45
+ "import": "./dist/testing.js",
46
+ "default": "./dist/testing.js"
47
+ }
48
+ },
49
+ "scripts": {
50
+ "build": "bun run ./scripts/clean.ts && rolldown -c rolldown.config.ts && tsc -p tsconfig.build.json"
51
+ },
52
+ "publishConfig": {
53
+ "access": "public"
54
+ }
55
+ }
@@ -1 +0,0 @@
1
- var C=new Map;function Se(e,t,n){if(n===void 0||Array.isArray(n)&&n.length===0){C.size!==0&&C.delete(e);return}if(!t){typeof n=="number"?C.set(e,n):n.length===1?C.set(e,n[0]):C.set(e,new Set(n));return}let r=C.get(e);if(r===void 0)return;let o=typeof n=="number"?[n]:n;if(typeof r=="number"){o.some(i=>i!==r)&&C.set(e,new Set([r,...o]));return}for(let i of o)r.add(i)}function De(e){if(C.size===0)return null;let t=C.get(e)??null;return C.delete(e),t}function F(e){C.size!==0&&C.delete(e)}var x=new Map,T=new Set,Ae=typeof queueMicrotask=="function"?queueMicrotask:e=>Promise.resolve().then(e),fe=Ae;function st(e){fe=e}function dt(){fe=Ae}function lt(e){let t=0;for(let n=0;n<e.length;n++)e.charCodeAt(n)===47&&t++;return t}var Z=null,Ne=0;var Le=[],le=[];function Me(e){le.includes(e)||le.push(e)}function J(e){Le.push(e)}function Pe(e,t){for(let n of Le)n(e,t)}function X(e){let t=e.parent!==null?x.get(e.parent):void 0;e.depth=e.depth??(t&&t.depth!==void 0?t.depth+1:lt(e.id)),x.set(e.id,e),t&&(t.children??=new Set).add(e.id),Z=null,Ne++,Pe(e.id,"add")}function S(e){let t=x.get(e);if(!t)return;t.parent!==null&&x.get(t.parent)?.children?.delete(e);let n=[e],r=[],o=[];for(;n.length>0;){let i=n.pop(),s=x.get(i);if(s&&(r.push(i),s.children))for(let d of s.children)n.push(d)}r.reverse();for(let i of r)x.delete(i),T.delete(i),F(i),Pe(i,"remove");for(let i of r)for(let s of le){let d=s(i);d!==void 0&&o.push(...d)}if(Z=null,Ne++,o.length===1)throw o[0];if(o.length>1)throw new AggregateError(o,`[memo-dom] ${o.length} cleanup disposers failed while unregistering '${e}'`)}function ct(e){S(e)}function H(e){return x.has(e)}function ae(e){return x.get(e)}function ft(e){let t=o=>{if(o.children!==void 0)for(let i of o.children){let s=x.get(i);s!==void 0&&(s.phase!=="effect"&&(s.render(),W(i)),t(s))}},n=o=>{if(o.children!==void 0)for(let i of o.children){let s=x.get(i);s!==void 0&&(s.phase==="effect"&&(s.render(),W(i)),n(s))}},r=x.get(e);r!==void 0&&(t(r),n(r))}function ue(){return Z??=[...x.keys()],Z}function L(e,t){if(!x.has(e))return;let n=T.has(e);(t!==void 0||n)&&Se(e,n,t),T.add(e),Oe()}function W(e){T.size!==0&&T.delete(e)&&F(e)}function M(e){let t=e+"/",n=!1;for(let r of x.keys())(r===e||r.startsWith(t))&&(T.add(r),F(r),n=!0);n&&Oe()}var ce=!1,G=!1;function Oe(){ce||G||(ce=!0,fe(We))}function We(){if(ce=!1,!G){G=!0;try{for(let e=0;e<100&&T.size>0;e++){let t=[];for(let o of T){let i=x.get(o);i?t.push(i):(T.delete(o),F(o))}let r=t.some(o=>o.phase!=="effect")?t.filter(o=>o.phase!=="effect"):t;r.sort((o,i)=>(o.depth??0)-(i.depth??0));for(let o of r)T.delete(o.id)&&o.render(De(o.id))}if(T.size>0)throw new Error("[memo-dom] commit cascade exceeded 100 passes \u2014 an update is dirtying its own readers (cycle)")}finally{G=!1}}}function dn(){return{registry:x,dirtySet:T}}var Q=new Map,pe=new Set,$e=!1;function at(){$e||($e=!0,Me(ut))}function Y(e,t){if(typeof t!="function")throw new TypeError("[memo-dom] cleanup(disposer) requires a function");if(pe.has(e))throw new Error(`[memo-dom] cannot register cleanup while '${e}' is being unregistered`);at();let n=Q.get(e);return n===void 0&&(n=[],Q.set(e,n)),n.push(t),t}function ut(e){let t=Q.get(e);if(t===void 0)return[];Q.delete(e),pe.add(e);let n=[];try{for(let r=t.length-1;r>=0;r--)try{t[r]()}catch(o){n.push(o)}}finally{pe.delete(e)}return n}function pt(e,t){let n=[],r=!0;try{ze(e,t,n)}catch(o){let i=Ve(n);throw i.length>0?new AggregateError([o,...i],"[memo-dom] ref setup and rollback failed"):o}return()=>{if(!r)return;r=!1;let o=Ve(n);if(o.length===1)throw o[0];if(o.length>1)throw new AggregateError(o,"[memo-dom] multiple ref cleanups failed")}}function ze(e,t,n){if(t==null||t===!1)return;if(Array.isArray(t)){for(let o of t)ze(e,o,n);return}if(typeof t!="function")throw new TypeError("[memo-dom] ref value must be a callback, an assignable JSX target, or an array of refs");let r=t(e);if(r!=null){if(typeof r!="function")throw new TypeError("[memo-dom] ref callback must return a cleanup function or nothing");n.push(r)}}function Ve(e){let t=[];for(let n=e.length-1;n>=0;n--)try{e[n]()}catch(r){t.push(r)}return e.length=0,t}function Be(e,t,n){let r;H(e)&&S(e),X({id:e,parent:t,phase:"effect",render(){let o=r;r=void 0,o?.();let i=n();if(i!==void 0&&typeof i!="function")throw new TypeError(`[memo-dom] effect '${e}' must return a cleanup function or undefined`);r=typeof i=="function"?i:void 0}}),Y(e,()=>{let o=r;r=void 0,o?.()}),L(e)}function yt(e,t,n,r){let o=`${e}/$active`,i=!1;H(e)&&S(e),X({id:e,parent:t,phase:"effect",render(){let s=!!n();s!==i&&(i=s,i?Be(o,e,r):S(o))}}),Y(e,()=>{i=!1,H(o)&&S(o)}),L(e)}function gt(e,t,n,r){e[t]!==r&&(e[t]=r,n.data=r==null||typeof r=="boolean"?"":String(r))}function ht(e,t,n,r){e[t]!==r&&(e[t]=r,n.className=r)}function mt(e,t,n,r,o){e[t]!==o&&(e[t]=o,n.classList.toggle(r,o))}function Et(e,t,n,r,o){e[t]!==o&&(e[t]=o,o==null||o===!1?n.removeAttribute(r):o===!0?n.setAttribute(r,""):n.setAttribute(r,String(o)))}function wt(e,t,n,r,o){e[t]!==o&&(e[t]=o,n[r]=o)}function bt(e,t,n,r,o){e[t]!==o&&(e[t]=o,o==null?n.style.removeProperty(r):n.style.setProperty(r,o))}function xt(e,t){if(Array.isArray(e)&&Array.isArray(t)){if(e===t||e.length!==t.length)return!0;for(let n=0;n<e.length;n++)if(!Object.is(e[n],t[n])||ye(e[n]))return!0;return!1}return ye(e)||ye(t)?!0:!Object.is(e,t)}function ye(e){return typeof e=="object"&&e!==null||typeof e=="function"}var ge="",$=new Map,P=new Map,ee=new Map,he=new Set,me=[],V=new Map,K=0,te=new Map,ne=new Map;function kt(){V=new Map;let e=ue();for(let[t,n]of P){let r=new Set;for(let o of n)for(let i of e)o.test(i)&&r.add(i);V.set(t,r)}}J((e,t)=>{if(P.size===0)return;let n=!1;if(t==="add")for(let[r,o]of P){let i=V.get(r);if(i){for(let s of o)if(s.test(e)){i.add(e),n=!0;break}}}else for(let r of V.values())r.delete(e)&&(n=!0);n&&K++});function vt(e){if(!e.includes("*"))return null;let t=e.split("*").map(n=>n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join("[^/]*");return new RegExp(`^${t}$`)}function Rt(e,t){ge=t;let n=new Set;for(let[r,o]of Object.entries(e.readers))for(let i of o){let s=`${r}${i}`;if(n.has(s))continue;n.add(s);let d=vt(i);if(d===null){let l=$.get(r)??[];l.includes(i)||l.push(i),$.set(r,l)}else{let l=P.get(r)??[];l.some(a=>a.source===d.source)||l.push(d),P.set(r,l)}}for(let[r,o]of Object.entries(e.params??{})){let i=ee.get(r)??[];for(let s of o)i.includes(s.pattern)||i.push(s.pattern);ee.set(r,i)}for(let r of e.opaque??[])he.add(r);me=[...new Set([...$.keys(),...P.keys()])],te.clear(),ne.clear(),kt(),K++}function It(){ge="",$=new Map,P=new Map,ee=new Map,he=new Set,me=[],V=new Map,te.clear(),ne.clear(),K++}function Ee(e){return he.has(e)}function re(){return ge}function we(e){return e.some(Ee)?"root-subtree":je(e)}function be(e,t,n){if(e.some(Ee))return"root-subtree";if(n){let r=new Set,o=!0;for(let i of e){let s=ee.get(i);if(s===void 0||s.length===0){o=!1;break}for(let d of s){let l=!1,a=d.replace(/\{([^}]+)\}/g,(m,p)=>{let D=p.trim();if(!D.startsWith("payload."))return l=!0,"";let b=n;for(let k of D.slice(8).split(".")){if(b===null||typeof b!="object")return l=!0,"";b=b[k]}return b==null?(l=!0,""):String(b)});if(l){o=!1;break}r.add(a)}if(!o)break;for(let d of $.get(i)??[])r.add(d)}if(o&&r.size>0)return[...r]}return je(e)}function je(e){let t=e.length===1?e[0]:e.join(" "),n=ne.get(t);if(n!==void 0&&n.v===K)return n.result;let r=new Set,o=new Set;for(let s of e){let d=te.get(s);if(d===void 0){d=[];for(let l of me)(l===s||l.startsWith(`${s}.`)||s.startsWith(`${l}.`))&&d.push(l);te.set(s,d)}for(let l of d)o.add(l)}for(let s of o){for(let d of $.get(s)??[])r.add(d);for(let d of V.get(s)??[])r.add(d)}let i=[...r];return ne.set(t,{v:K,result:i}),i}var Ct=1e3,_=[];function Tt(){return _}function St(){_.length=0}function Fe(e){let t=we(e);if(t==="root-subtree"){M(re());return}for(let n of t)L(n)}function Dt(e,t){let n=be(e,[],t);if(n==="root-subtree"){M(re());return}for(let r of n)L(r)}function At(e,t,n){return r=>{n(r),_.push({origin:e,writes:t,at:Date.now()}),_.length>Ct&&_.shift(),Fe(t)}}var Nt=e=>e,Lt=[],Mt=[],Pt=[];function Ot(e){let t=e.length,n=Lt,r=Mt,o=Pt;n.length=t,o.length=t,r.length=0;for(let s=0;s<t;s++)n[s]=!1,o[s]=-1;for(let s=0;s<t;s++){let d=e[s];if(d<0)continue;let l=0,a=r.length;for(;l<a;){let m=l+a>>1;e[r[m]]<d?l=m+1:a=m}r[l]=s,l>0&&(o[s]=r[l-1])}let i=r.length>0?r[r.length-1]:-1;for(;i>=0;)n[i]=!0,i=o[i];return n}function Wt(e,t,n,r=Nt,o=!0){let i=document.createComment(`list:${t}`);e.appendChild(i);let s=new Map,d=new Map,l=0,a=[],m=[],p=[],D=new Map,b=[],k=[],z=[];function de(y,E,u,v){if(y.updateProps?.(E,v),y.update!==void 0)y.update(),u!==null&&W(u);else if(u!==null){let N=ae(u);N&&(N.render(),W(u))}}function Ye(y){let E=typeof y;if(E==="string"||E==="number"||E==="boolean"||E==="bigint")return`${t}/Row[${String(y)}]`;let u=d.get(y);return u===void 0&&(u=`#${++l}`,d.set(y,u)),`${t}/Row[${u}]`}function et(y,E=!0){if(y.length===a.length){let f=!0;for(let c=0;c<y.length;c++)if(y[c]!==a[c]){f=!1;break}if(f){if(!E)return;for(let c=0;c<y.length;c++)de(m[c],y[c],o?p[c]??null:null,c);return}}let u=s,v=u.size===0;D.clear();let N=D,O=k,R=b,B=y.length;O.length=o?B:0,R.length=B,z.length=v?0:B;let q=!1,ve=0,Re=!0,Ie=-1;for(let f=0;f<y.length;f++){let c=y[f],w=r(c,f);if(N.has(w))throw new Error(`[memo-dom] duplicate list key: ${String(w)}`);let h=v?void 0:u.get(w);if(h!==void 0){ve++,u.delete(w);let g=h.pos;z[f]=g,g<=Ie?Re=!1:Ie=g,h.pos=f,(E||c!==a[g])&&de(h.e,c,h.id,f)}else{let g=o?Ye(w):t;h={e:n(c,g,f),id:o?g:null,pos:f},v||(z[f]=-1),q=!0}N.set(w,h),R[f]=h.e,o&&(O[f]=h.id)}if(!v&&ve===0&&(B===0||q)){for(let[,g]of u)g.e.dispose?.();let f=!1,c;for(let g of m){let I=g.nodes;if(c=Array.isArray(I)?I[0]:I,c!==void 0)break}if(c!==void 0&&c.parentNode===e&&i.parentNode===e&&typeof document.createRange=="function"){let g=document.createRange();g.setStartBefore(c),g.setEndBefore(i),g.deleteContents(),f=!0}for(let[g,I]of u){if(!f){let A=I.e.nodes;if(Array.isArray(A))for(let U of A)U.parentNode?.removeChild(U);else A.parentNode?.removeChild(A)}for(let A of I.e.entities)S(A);d.delete(g)}if(u.clear(),B!==0){let g=document.createDocumentFragment();for(let I=0;I<R.length;I++){let A=R[I].nodes;if(Array.isArray(A))for(let U of A)g.appendChild(U);else g.appendChild(A)}e.insertBefore(g,i)}s=N,D=u;let w=m;m=R,b=w;let h=p;p=O,k=h,b.length=0,k.length=0,a=y.slice();return}if(v&&q){let f=document.createDocumentFragment();for(let h=0;h<R.length;h++){let g=R[h].nodes;if(Array.isArray(g))for(let I of g)f.appendChild(I);else f.appendChild(g)}e.insertBefore(f,i),s=N,D=u;let c=m;m=R,b=c;let w=p;p=O,k=w,b.length=0,k.length=0,a=y.slice();return}if(!q&&u.size===0&&Re){s=N,D=u;let f=m;m=R,b=f;let c=p;p=O,k=c,b.length=0,k.length=0,a=y.slice();return}for(let[f,c]of u){c.e.dispose?.();let w=c.e.nodes;if(Array.isArray(w))for(let h of w)h.parentNode?.removeChild(h);else w.parentNode?.removeChild(w);for(let h of c.e.entities)S(h);d.delete(f)}u.clear();let rt=Ot(z),Ce=i,j=null,Te=()=>{if(j===null)return;let f=document.createDocumentFragment();for(let c=j.length-1;c>=0;c--){let w=j[c].nodes;if(Array.isArray(w))for(let h of w)f.appendChild(h);else f.appendChild(w)}e.insertBefore(f,Ce),j=null};for(let f=R.length-1;f>=0;f--){let c=R[f];z[f]===-1||!rt[f]?(j??=[]).push(c):(Te(),Ce=Array.isArray(c.nodes)?c.nodes[0]:c.nodes)}Te(),s=N,D=u;let ot=m;m=R,b=ot;let it=p;p=O,k=it,b.length=0,k.length=0,a=y.slice()}function tt(y){let E=s.get(y);E!==void 0&&de(E.e,a[E.pos],E.id,E.pos)}function nt(){for(let[y,E]of s){E.e.dispose?.();let u=E.e.nodes;if(Array.isArray(u))for(let v of u)v.parentNode?.removeChild(v);else u.parentNode?.removeChild(u);for(let v of E.e.entities)S(v);d.delete(y)}s.clear(),D.clear(),a=[],m.length=0,p.length=0,b.length=0,k.length=0,i.parentNode?.removeChild(i)}return{reconcile:et,refreshKey:tt,size:()=>s.size,dispose:nt}}function $t(e){return e.nodeType===Node.DOCUMENT_FRAGMENT_NODE?Array.from(e.childNodes):[e]}var He=new Map,Ke=new Map;function Vt(e,t,n){let r=t;r[e.handler]=n,r[e.rootKey]=e.root}function zt(e,t){let n=Bt(t);return jt(e,n),{root:e,handler:n.handler,rootKey:n.root}}function Bt(e){let t=Ke.get(e);if(t!==void 0)return t;let n=Ht(e);return t=He.get(n),t===void 0&&(t={handler:Symbol(`memo-dom:${n}:handler`),root:Symbol(`memo-dom:${n}:root`),roots:new WeakSet,type:n},He.set(n,t)),Ke.set(e,t),t}function jt(e,t){t.roots.has(e)||(t.roots.add(e),e.addEventListener(t.type,n=>{n.bubbles&&_e(e,t,n)}),e.addEventListener(t.type,n=>{n.bubbles||_e(e,t,n)},!0))}function _e(e,t,n){let r=typeof n.composedPath=="function"?n.composedPath():Ft(n.target,e);for(let o of r){let i=o;if(i[t.root]===e){let s=i[t.handler];s!==void 0&&s.call(o,n)===!1&&n.preventDefault()}if(o===e||n.cancelBubble)break}}function Ft(e,t){let n=[],r=e;for(;r!==null&&(n.push(r),r!==t);)r="parentNode"in r?r.parentNode:null;return n}function Ht(e){let t=e.startsWith("on")?e.slice(2).toLowerCase():e.toLowerCase();return t==="doubleclick"?"dblclick":t}var oe=new WeakMap,Kt=new Set(["animation-iteration-count","border-image-outset","border-image-slice","border-image-width","column-count","flex","flex-grow","flex-shrink","font-weight","grid-column","grid-row","line-height","opacity","order","orphans","scale","tab-size","widows","z-index","zoom"]);function ie(e){let t=[];return qe(e,t),t.join(" ")}function xe(e,t){let n=ie(t);e.namespaceURI==="http://www.w3.org/2000/svg"?n===""?e.removeAttribute("class"):e.setAttribute("class",n):e.className=n}function ke(e,t){let n=e.style;if(n===void 0)return;if(typeof t=="string"){let i=oe.get(e);if(i?.size===1&&i.get("$cssText")===t)return;n.cssText=t,oe.set(e,new Map([["$cssText",t]]));return}let r=new Map;if(t!==null&&typeof t=="object")for(let[i,s]of Object.entries(t)){if(s==null)continue;let d=_t(i);r.set(d,qt(d,s))}let o=oe.get(e)??new Map;o.has("$cssText")&&(n.cssText="");for(let i of o.keys())i!=="$cssText"&&!r.has(i)&&n.removeProperty(i);for(let[i,s]of r)o.get(i)!==s&&n.setProperty(i,s);oe.set(e,r)}function qe(e,t){if(e==null||e===!1||e===!0)return;if(Array.isArray(e)){for(let r of e)qe(r,t);return}if(typeof e=="object"){for(let[r,o]of Object.entries(e))o&&t.push(r);return}let n=String(e).trim();n!==""&&t.push(n)}function _t(e){return e.startsWith("--")||e.includes("-")?e:e.replace(/^ms([A-Z])/,"ms-$1").replace(/[A-Z]/g,t=>`-${t.toLowerCase()}`)}function qt(e,t){return typeof t=="number"&&t!==0&&!e.startsWith("--")&&!Kt.has(e)?`${t}px`:String(t)}var Ue=new WeakMap,Ge=new WeakMap,Ut=new Set(["innerHTML","checked","value","selected","disabled","hidden","multiple","required","readOnly","muted","open","controls","loop","autoFocus","autoPlay","tabIndex"]),Ze={className:"class",htmlFor:"for",readOnly:"readonly",autoFocus:"autofocus",autoPlay:"autoplay",tabIndex:"tabindex",crossOrigin:"crossorigin"},Gt={className:"class",clipPath:"clip-path",clipRule:"clip-rule",colorInterpolation:"color-interpolation",colorInterpolationFilters:"color-interpolation-filters",dominantBaseline:"dominant-baseline",fillOpacity:"fill-opacity",fillRule:"fill-rule",floodColor:"flood-color",floodOpacity:"flood-opacity",fontFamily:"font-family",fontSize:"font-size",markerEnd:"marker-end",markerMid:"marker-mid",markerStart:"marker-start",stopColor:"stop-color",stopOpacity:"stop-opacity",strokeDasharray:"stroke-dasharray",strokeDashoffset:"stroke-dashoffset",strokeLinecap:"stroke-linecap",strokeLinejoin:"stroke-linejoin",strokeMiterlimit:"stroke-miterlimit",strokeOpacity:"stroke-opacity",strokeWidth:"stroke-width",textAnchor:"text-anchor",vectorEffect:"vector-effect",xlinkHref:"xlink:href"},Zt={doubleclick:"dblclick"};function Jt(e,t,n,r=[]){let o=t!==null&&typeof t=="object"?t:{},i=Ue.get(e)??new Map,s=new Set(r);for(let l of i.keys())Object.prototype.hasOwnProperty.call(o,l)||Je(e,l,null,i,n,s);for(let[l,a]of Object.entries(o))Je(e,l,a,i,n,s);let d=new Map;for(let[l,a]of Object.entries(o))d.set(l,Qe(l,a));Ue.set(e,d)}function Xe(e,t,n){if(t==="class"||t==="className"){xe(e,n);return}if(t==="style"){ke(e,n);return}Yt(e,t,n)}function Je(e,t,n,r,o,i){if(t==="key"||t==="children"||t==="ref")return;if(/^on[A-Z]/.test(t)){Xt(e,t,typeof n=="function"?n:null,o,i.has(t));return}let s=Qe(t,n);Object.is(r.get(t),s)||Xe(e,t,n)}function Qe(e,t){return e==="class"||e==="className"?ie(t):e==="style"?Symbol("style-snapshot"):t==null||typeof t=="string"||typeof t=="number"||typeof t=="boolean"?t:String(t)}function Xt(e,t,n,r,o){let i=Ge.get(e);i===void 0&&(i=new Map,Ge.set(e,i));let s=i.get(t);if(s?.source===n||(s!==void 0&&(e.removeEventListener(s.type,s.listener),i.delete(t)),n===null))return;let d=Qt(t),l=o?n:function(m){let p=n.call(this,m);return M(r),p!==null&&typeof p=="object"&&"then"in p&&typeof p.then=="function"&&p.then(()=>{M(r)}),p};e.addEventListener(d,l),i.set(t,{source:n,listener:l,type:d})}function Qt(e){let t=e.slice(2).toLowerCase();return Zt[t]??t}function Yt(e,t,n){let r=e.namespaceURI!=="http://www.w3.org/2000/svg";if(r&&Ut.has(t)){if(t==="tabIndex"&&n==null){e.removeAttribute("tabindex");return}e[t]=n??en(t);return}let o=r?Ze[t]??t:Gt[t]??Ze[t]??t;n==null||n===!1?e.removeAttribute(o):n===!0?e.setAttribute(o,""):!r&&t==="xlinkHref"?e.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",String(n)):e.setAttribute(o,String(n))}function en(e){return e==="value"||e==="innerHTML"?"":!1}function tn(e,t,n,r){let o=document.createComment(`when:${t}`);e.appendChild(o);let i=-1,s=null;function d(){let a=n();if(a===i){s?.update();return}if(s!==null){s.dispose?.();for(let p of s.nodes)p.parentNode?.removeChild(p);s=null}let m=r[a]??null;if(m!==null){s=m();for(let p=s.nodes.length-1;p>=0;p--)o.parentNode.insertBefore(s.nodes[p],o)}i=a}function l(){if(s!==null){s.dispose?.();for(let a of s.nodes)a.parentNode?.removeChild(a);s=null}o.parentNode?.removeChild(o),i=-1}return d(),{update:d,index:()=>i,dispose:l}}var se=new Map;function nn(e,t){se.set(e,t)}function rn(e,t){let n=se.get(e);if(n===void 0)return;let r=n.length!==t.length;if(!r){for(let o=0;o<t.length;o++)if(!Object.is(n[o],t[o])){r=!0;break}}if(r){n.length=t.length;for(let o=0;o<t.length;o++)n[o]=t[o];L(e)}}function Nn(e){return se.get(e)}J((e,t)=>{t==="remove"&&se.delete(e)});export{st as a,dt as b,X as c,S as d,ct as e,H as f,ae as g,ft as h,ue as i,L as j,W as k,M as l,We as m,dn as n,Y as o,pt as p,Be as q,yt as r,gt as s,ht as t,mt as u,Et as v,wt as w,bt as x,xt as y,Rt as z,It as A,Ee as B,re as C,we as D,be as E,Tt as F,St as G,Fe as H,Dt as I,At as J,Wt as K,$t as L,Vt as M,zt as N,ie as O,xe as P,ke as Q,Jt as R,Xe as S,tn as T,nn as U,rn as V,Nn as W};