@expressive/mvc 0.85.0 → 0.87.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/state.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { Caught } from "./caught.js";
1
2
  import { capture, event, listener, observer, queued, touch, watch } from "./observable.js";
2
3
  import { Context, join } from "./context.js";
3
4
 
@@ -10,7 +11,6 @@ const STORE = /* @__PURE__ */ new WeakMap();
10
11
  /** States under construction - added on `new`, removed when activated or released.
11
12
  * Also carries work to run at the deadline, which `def` uses to bound its registry. */
12
13
  const PENDING = /* @__PURE__ */ new Set();
13
- /** External lifecycle listeners for any given State class. */
14
14
  const SETUP = /* @__PURE__ */ new WeakMap();
15
15
  /** Parent-child relationships. */
16
16
  const PARENT = /* @__PURE__ */ new WeakMap();
@@ -20,10 +20,23 @@ const UNBIND = /* @__PURE__ */ new WeakMap();
20
20
  const METHODS = /* @__PURE__ */ new WeakMap();
21
21
  /** List of reactive getters defined by a given type. */
22
22
  const GETTERS = /* @__PURE__ */ new WeakMap();
23
+ /** Replacement for a getter captured by live computed properties, for hot patching. */
24
+ const LATEST = /* @__PURE__ */ new WeakMap();
25
+ /** Method implementations replaced by a hot patch. */
26
+ const PAST = /* @__PURE__ */ new WeakSet();
27
+ /** Live instances, tracked once hot patching is enabled. */
28
+ let LIVE;
29
+ /** Bootstrapped subclasses of each class, tracked once hot patching is enabled. */
30
+ const SUBCLASSES = /* @__PURE__ */ new WeakMap();
31
+ /** Event every observer treats as watched, forcing a refresh after a hot patch. */
32
+ const REFRESH = Symbol.for("@expressive/mvc.refresh");
23
33
  /** Stale flags for compute closures awaiting refresh on next access. */
24
34
  const STALE = /* @__PURE__ */ new WeakSet();
25
35
  /** Whether the deadline which drains `PENDING` is already queued for this tick. */
26
36
  let QUEUED = false;
37
+ /** Global list each loaded copy of this module adds its `State` to, on first construction. */
38
+ const COPIES = Symbol.for("@expressive/mvc");
39
+ let ANNOUNCED = false;
27
40
  /** Adopters for managed properties which have held a child State. */
28
41
  const ADOPT = /* @__PURE__ */ new WeakMap();
29
42
  const CHILDREN = /* @__PURE__ */ new WeakMap();
@@ -56,7 +69,7 @@ var State = class State {
56
69
  set(arg1, arg2) {
57
70
  const self = this.is;
58
71
  if (typeof arg1 == "function") return listener(self, (key) => {
59
- if (typeof key == "string" || typeof key == "number" || typeof key == "symbol") return arg1.call(self, key, self);
72
+ if (typeof key == "string" || typeof key == "number" || typeof key == "symbol" && key !== REFRESH) return arg1.call(self, key, self);
60
73
  });
61
74
  if (typeof arg2 == "function") return callback(self, arg2, arg1);
62
75
  if (arg1 && typeof arg1 == "object") assign(self, arg1, arg2 === true);
@@ -127,13 +140,20 @@ function callback(self, cb, select) {
127
140
  function init(state, ...args) {
128
141
  const T = state.constructor;
129
142
  if (T === State) throw new Error("Cannot create base State.");
143
+ if (!ANNOUNCED) {
144
+ ANNOUNCED = true;
145
+ (globalThis[COPIES] ||= []).push(State);
146
+ }
130
147
  const { before, after } = bootstrap(T);
131
148
  ID.set(state, `${T}-${uid()}`);
132
149
  STORE.set(state, {});
150
+ LIVE?.add(new WeakRef(state));
133
151
  function observe() {
134
152
  for (const key in state) {
135
153
  const desc = Object.getOwnPropertyDescriptor(state, key) || {};
136
- if ("value" in desc && desc.configurable) apply(state, key, desc, true);
154
+ if (!("value" in desc) || !desc.configurable) continue;
155
+ if (key[0] == "_") unmanaged(state, key, desc.value);
156
+ else apply(state, key, desc, true);
137
157
  }
138
158
  }
139
159
  function register() {
@@ -161,10 +181,7 @@ function init(state, ...args) {
161
181
  for (let i = 0; i < queue.length; i++) {
162
182
  const arg = queue[i];
163
183
  const out = typeof arg == "function" ? arg.call(state, state) : arg;
164
- if (out instanceof Promise) out.catch((err) => {
165
- console.error(`Async error in constructor for ${state}:`);
166
- console.error(err);
167
- });
184
+ if (out instanceof Promise) out.catch((err) => report(new Caught.Init(state, err)));
168
185
  else if (Array.isArray(out)) queue.splice(i + 1, 0, ...out);
169
186
  else if (typeof out == "function") listener(state, out, null);
170
187
  else if (typeof out == "object") assign(state, out, true);
@@ -180,12 +197,22 @@ function init(state, ...args) {
180
197
  queueMicrotask(() => {
181
198
  QUEUED = false;
182
199
  for (const item of PENDING) if (typeof item == "function") item();
183
- else console.warn(`${item} was constructed but never activated.`);
200
+ else report(new Caught.Inactive(item));
184
201
  PENDING.clear();
185
202
  });
186
203
  }
187
204
  PENDING.add(state);
188
205
  }
206
+ function unmanaged(state, key, value) {
207
+ define(state, key, {
208
+ configurable: true,
209
+ enumerable: false,
210
+ get: () => value,
211
+ set: (next) => {
212
+ value = next;
213
+ }
214
+ });
215
+ }
189
216
  /**
190
217
  * Apply instructions and inherited event listeners. Ensure class metadata is ready.
191
218
  *
@@ -218,36 +245,15 @@ function bootstrap(T) {
218
245
  continue;
219
246
  }
220
247
  for (const setupType of onType) setupType(type);
248
+ if (LIVE) {
249
+ const parent = Object.getPrototypeOf(type);
250
+ let children = SUBCLASSES.get(parent);
251
+ if (!children) SUBCLASSES.set(parent, children = /* @__PURE__ */ new Set());
252
+ children.add(type);
253
+ }
221
254
  METHODS.set(type, keys = new Map(keys));
222
255
  GETTERS.set(type, getters = new Map(getters));
223
- for (const [key, desc] of Object.entries(Object.getOwnPropertyDescriptors(type.prototype))) {
224
- if (key == "constructor" || !desc.configurable) continue;
225
- if (typeof desc.get == "function") {
226
- if (desc.configurable && typeof desc.set != "function") getters.set(key, desc.get);
227
- continue;
228
- }
229
- const { value } = desc;
230
- if (typeof value !== "function") continue;
231
- function bind(original) {
232
- const { is } = this;
233
- if (is.hasOwnProperty(key) && !original) return value;
234
- const fn = original || value;
235
- const bound = fn.bind(is);
236
- UNBIND.set(bound, fn);
237
- define(is, key, {
238
- value: bound,
239
- writable: true,
240
- configurable: true
241
- });
242
- return bound;
243
- }
244
- UNBIND.set(bind, value);
245
- keys.set(key, bind);
246
- define(type.prototype, key, {
247
- get: bind,
248
- set: bind
249
- });
250
- }
256
+ classify(type, keys, getters);
251
257
  }
252
258
  if (getters.size) before.add((self) => getters.forEach(compute, self));
253
259
  return {
@@ -255,6 +261,50 @@ function bootstrap(T) {
255
261
  after
256
262
  };
257
263
  }
264
+ /** Bind own configurable methods of a type and collect its reactive getters. */
265
+ function classify(type, keys, getters) {
266
+ for (const [key, desc] of Object.entries(Object.getOwnPropertyDescriptors(type.prototype))) {
267
+ if (key == "constructor" || !desc.configurable) continue;
268
+ const { get, set } = desc;
269
+ if (key[0] == "_" && (get || set)) {
270
+ define(type.prototype, key, {
271
+ ...desc,
272
+ get: get && function() {
273
+ return get.call(this.is || this);
274
+ },
275
+ set: set && function(value) {
276
+ set.call(this.is || this, value);
277
+ }
278
+ });
279
+ continue;
280
+ }
281
+ if (typeof get == "function") {
282
+ if (typeof set != "function") getters.set(key, get);
283
+ continue;
284
+ }
285
+ const { value } = desc;
286
+ if (typeof value !== "function") continue;
287
+ function bind(original) {
288
+ const { is } = this;
289
+ if (is.hasOwnProperty(key) && !original) return value;
290
+ const fn = original || value;
291
+ const bound = fn.bind(is);
292
+ UNBIND.set(bound, fn);
293
+ define(is, key, {
294
+ value: bound,
295
+ writable: true,
296
+ configurable: true
297
+ });
298
+ return bound;
299
+ }
300
+ UNBIND.set(bind, value);
301
+ keys.set(key, bind);
302
+ define(type.prototype, key, {
303
+ get: bind,
304
+ set: bind
305
+ });
306
+ }
307
+ }
258
308
  /**
259
309
  * Install a reactive computed property on a state instance, derived from a prototype
260
310
  * getter or an arity-bearing `set` factory.
@@ -283,11 +333,13 @@ function compute(getter, key) {
283
333
  const run = (initial) => {
284
334
  let next;
285
335
  try {
286
- next = getter.call(proxy, proxy);
336
+ next = latest(getter).call(proxy, proxy);
287
337
  } catch (err) {
288
- console.warn(`An exception was thrown while ${initial ? "initializing" : "refreshing"} ${this}.${key}.`);
289
- if (initial) throw err;
290
- console.error(err);
338
+ if (initial) {
339
+ console.warn(`An exception was thrown while initializing ${this}.${key}.`);
340
+ throw err;
341
+ }
342
+ if (!(err instanceof Promise)) report(new Caught.Getter(this, key, err));
291
343
  }
292
344
  update(this, key, next, !isAsync);
293
345
  };
@@ -453,7 +505,7 @@ function access(state, property, required) {
453
505
  });
454
506
  }
455
507
  function assign(state, data, silent) {
456
- if (!silent) event(state);
508
+ if (!silent && observer(state) !== null) event(state);
457
509
  const methods = METHODS.get(state.constructor);
458
510
  const getters = GETTERS.get(state.constructor);
459
511
  for (const key in data) {
@@ -463,7 +515,7 @@ function assign(state, data, silent) {
463
515
  else if (key in state && key !== "is") {
464
516
  const set = (Object.getOwnPropertyDescriptor(state, key) || {}).set;
465
517
  if (set) set.call(state, data[key], silent);
466
- else state[key] = data[key];
518
+ else Reflect.set(state, key, data[key]);
467
519
  }
468
520
  }
469
521
  }
@@ -472,12 +524,12 @@ function assign(state, data, silent) {
472
524
  *
473
525
  * This is used internally to update properties, but can also be used to update properties which are not managed by state, or to update values without triggering setters.
474
526
  *
475
- * If `silent` is true, the update will not dispatch events and will return `false` instead of throwing if state is destroyed.
527
+ * A destroyed state reports the write - thrown to the writer unless a `catch` handler takes it - and returns `false`; `silent` skips both, and dispatch.
476
528
  */
477
529
  function update(state, key, value, silent, own) {
478
530
  if (observer(state) === null) {
479
- if (silent) return false;
480
- throw new Error(`Tried to update ${state}.${String(key)} but state is destroyed.`);
531
+ if (!silent) report(new Caught.Destroyed(state, String(key)), true);
532
+ return false;
481
533
  }
482
534
  const store = STORE.get(state);
483
535
  if (value instanceof State) value = value.is;
@@ -488,6 +540,41 @@ function update(state, key, value, silent, own) {
488
540
  return true;
489
541
  }
490
542
  /**
543
+ * Pass a caught error along `catch` handlers - most-derived class first, last registered
544
+ * first - until one returns nothing. Passed off the end, a warning logs and anything
545
+ * else is thrown - to the caller when `sync`, else uncaught. So is a handler's throw,
546
+ * and one wrapping an error a handler already threw escapes that error unreported.
547
+ */
548
+ function report(caught, sync) {
549
+ const handlers = /* @__PURE__ */ new Set();
550
+ let error = caught;
551
+ if (caught.cause instanceof Caught) return escape(caught.cause);
552
+ for (let T = caught.state.constructor;; T = Object.getPrototypeOf(T)) {
553
+ for (const handler of [...SETUP.get(T) || []].reverse()) if (typeof handler == "object" && handler.catch) handlers.add(handler.catch);
554
+ if (T === State) break;
555
+ }
556
+ try {
557
+ for (const handler of handlers) if (!(error = handler.call(caught.state, error))) return;
558
+ } catch (err) {
559
+ if (sync) throw err;
560
+ return escape(err);
561
+ }
562
+ if (error.warning) console.warn(error);
563
+ else if (sync) throw error;
564
+ else escape(error);
565
+ }
566
+ function escape(err) {
567
+ queueMicrotask(() => {
568
+ throw err;
569
+ });
570
+ }
571
+ /** Error thrown by a handler replaying in dispatch, attributed to the State which queued it. */
572
+ function fault(err, owner) {
573
+ const state = owner instanceof State ? owner : owner && PARENT.get(owner);
574
+ if (state) report(new Caught.Effect(state, err));
575
+ else escape(err);
576
+ }
577
+ /**
491
578
  * Hand a value stored by an owning writer to that property's adopter,
492
579
  * creating one the first time a State is stored there. A property which has
493
580
  * held a State keeps its adopter, so a later non-State value releases the
@@ -506,6 +593,106 @@ function adopt(state, key, value) {
506
593
  }
507
594
  claim(value);
508
595
  }
596
+ /** Resolve a getter to its latest hot-patched replacement. */
597
+ function latest(getter) {
598
+ for (let next; next = LATEST.get(getter);) getter = next;
599
+ return getter;
600
+ }
601
+ /** Begin tracking live instances, so a hot patch can reach them. */
602
+ function track() {
603
+ LIVE ||= /* @__PURE__ */ new Set();
604
+ }
605
+ /**
606
+ * Move the members of `next` onto `prev`, which keeps its identity. Returns the
607
+ * live instances of `prev`, each needing a refresh.
608
+ */
609
+ function patch(prev, next, own) {
610
+ const proto = prev.prototype;
611
+ const incoming = Object.getOwnPropertyDescriptors(next.prototype);
612
+ const keys = METHODS.get(prev);
613
+ const getters = GETTERS.get(prev);
614
+ const methods = /* @__PURE__ */ new Map();
615
+ const knownKeys = new Set(keys?.keys());
616
+ const knownGetters = new Set(getters?.keys());
617
+ let setup = SETUP.get(prev);
618
+ for (const handler of own) setup.delete(handler);
619
+ for (const handler of handlers(next)) {
620
+ if (!setup) SETUP.set(prev, setup = /* @__PURE__ */ new Set());
621
+ setup.add(handler);
622
+ }
623
+ for (const key of Reflect.ownKeys(next)) {
624
+ if (key == "prototype" || key == "length" || key == "name") continue;
625
+ if (Object.getOwnPropertyDescriptor(prev, key)?.configurable !== false) define(prev, key, Object.getOwnPropertyDescriptor(next, key));
626
+ }
627
+ const removed = /* @__PURE__ */ new Set();
628
+ for (const key of Object.getOwnPropertyNames(proto)) if (key != "constructor" && !(key in incoming)) {
629
+ const bind = keys?.get(key);
630
+ if (bind && Object.getOwnPropertyDescriptor(proto, key).get === bind) {
631
+ PAST.add(UNBIND.get(bind));
632
+ keys.delete(key);
633
+ }
634
+ removed.add(key);
635
+ Reflect.deleteProperty(proto, key);
636
+ getters?.delete(key);
637
+ }
638
+ for (const [key, desc] of Object.entries(incoming)) {
639
+ if (key == "constructor") continue;
640
+ const current = Object.getOwnPropertyDescriptor(proto, key);
641
+ if (typeof desc.value == "function") methods.set(key, desc.value);
642
+ if (current?.configurable === false) {
643
+ if (current.writable) proto[key] = desc.value;
644
+ continue;
645
+ }
646
+ if (current?.get && keys?.get(key) === current.get) PAST.add(UNBIND.get(current.get));
647
+ const getter = getters?.get(key);
648
+ if (getter) LATEST.set(getter, desc.get);
649
+ define(proto, key, {
650
+ ...desc,
651
+ configurable: true
652
+ });
653
+ }
654
+ if (keys) {
655
+ for (let T = prev;; T = Object.getPrototypeOf(T)) {
656
+ for (const handler of SETUP.get(T) || []) if (typeof handler == "object" && handler.type) handler.type(prev);
657
+ if (T === State) break;
658
+ }
659
+ classify(prev, keys, getters);
660
+ }
661
+ const live = [];
662
+ for (const ref of LIVE) {
663
+ const state = ref.deref();
664
+ if (!state) LIVE.delete(ref);
665
+ else if (state instanceof prev) live.push(state);
666
+ }
667
+ const descendants = new Set([prev, ...live.map((state) => state.constructor)]);
668
+ for (const type of descendants) for (const child of SUBCLASSES.get(type) || []) descendants.add(child);
669
+ descendants.delete(prev);
670
+ for (const type of descendants) {
671
+ const inherit = METHODS.get(type);
672
+ const computed = GETTERS.get(type);
673
+ for (const [key, bind] of keys) if (!knownKeys.has(key) && !inherit.has(key)) inherit.set(key, bind);
674
+ for (const [key, get] of getters) if (!knownGetters.has(key) && !computed.has(key)) computed.set(key, get);
675
+ for (const key of removed) if (!(key in type.prototype)) {
676
+ inherit.delete(key);
677
+ computed.delete(key);
678
+ }
679
+ }
680
+ for (const state of live) {
681
+ for (const [key, value] of methods) {
682
+ const desc = Object.getOwnPropertyDescriptor(state, key);
683
+ if (!desc) continue;
684
+ if (desc.set) desc.set.call(state, value);
685
+ else if (PAST.has(UNBIND.get(desc.value))) delete state[key];
686
+ }
687
+ for (const key of removed) if (PAST.has(UNBIND.get(Object.getOwnPropertyDescriptor(state, key)?.value))) delete state[key];
688
+ for (const [key, get] of GETTERS.get(state.constructor)) if (!knownGetters.has(key) && get === getters.get(key)) compute.call(state, get, key);
689
+ }
690
+ return live;
691
+ }
692
+ /** Lifecycle handlers registered on a class itself. */
693
+ function handlers(type) {
694
+ return [...SETUP.get(type) || []];
695
+ }
509
696
  /** Random alphanumberic of length 6; always starts with a letter. */
510
697
  function uid() {
511
698
  return (.278 + Math.random() * .722).toString(36).substring(2, 8).toUpperCase();
@@ -521,5 +708,5 @@ function parent(child, value) {
521
708
  }
522
709
 
523
710
  //#endregion
524
- export { PENDING, STORE, State, access, apply, children, compute, event, parent, uid, unbind, update };
711
+ export { PENDING, STORE, State, access, apply, children, compute, event, fault, handlers, parent, patch, track, trailing, uid, unbind, update };
525
712
  //# sourceMappingURL=state.js.map
package/dist/state.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"state.js","names":[],"sources":["../src/state.ts"],"sourcesContent":["import { Context, join } from './context';\nimport {\n capture,\n event,\n listener,\n Observer,\n observer,\n queued,\n touch,\n watch\n} from './observable';\n\nconst define = Object.defineProperty;\n\n/** Register for all active states via string identifiers (usually unique). */\nconst ID = new WeakMap<State, string>();\n\n/** Internal state assigned to states. */\nconst STORE = new WeakMap<State, Record<string | number | symbol, unknown>>();\n\n/** States under construction - added on `new`, removed when activated or released.\n * Also carries work to run at the deadline, which `def` uses to bound its registry. */\nconst PENDING = new Set<State | (() => void)>();\n\n/** External lifecycle listeners for any given State class. */\nconst SETUP = new WeakMap<State.Extends, Set<State.Init<any> | State.On<any>>>();\n\n/** Parent-child relationships. */\nconst PARENT = new WeakMap<object, State | null>();\n\n/** Reference bound instance methods, or their getter, to real one. */\nconst UNBIND = new WeakMap<any, any>();\n\n/** List of methods defined by a given type. */\nconst METHODS = new WeakMap<Function, Map<string, (value: any) => void>>();\n\n/** List of reactive getters defined by a given type. */\nconst GETTERS = new WeakMap<Function, Map<string, () => unknown>>();\n\n/** Stale flags for compute closures awaiting refresh on next access. */\nconst STALE = new WeakSet<() => void>();\n\n/** Whether the deadline which drains `PENDING` is already queued for this tick. */\nlet QUEUED = false;\n\n/** Adopters for managed properties which have held a child State. */\nconst ADOPT = new WeakMap<State, Map<unknown, (value: unknown) => void>>();\nconst CHILDREN = new WeakMap<State, Set<(child: State) => void>>();\n\ndeclare namespace State {\n /** Any type of State, using own class constructor as its identifier. */\n type Extends<T extends State = State> = (abstract new (...args: any[]) => T) &\n typeof State;\n\n /** A State constructor which may be instanciated. */\n type Type<T extends State = State> = (new (...args: State.Args<T>) => T) &\n Omit<typeof State, never>;\n\n /** State constructor arguments */\n type Args<T extends State = any> = (Args<T> | Init<T> | Assign<T> | void)[];\n\n /**\n * Value of `static global`. A boolean opts a State in or out of the\n * process-global root; a resolver decides at activation, receiving the\n * instance and returning whether it registers - use it to make the choice\n * conditional (e.g. per environment). A bare literal (`= true` / `= false`)\n * seals the choice for subclasses; widen a subclass's `static global` type to\n * `State.Global` to permit a resolver or a later override.\n */\n type Global<T extends State = any> = boolean | ((self: T) => boolean);\n\n /**\n * State constructor callback - runs during activation, in argument order,\n * before the `new()` lifecycle hook (so it may configure state `new()`\n * will observe). Returned function will run when state is destroyed.\n */\n type Init<T extends State = State> = (\n this: T,\n thisArg: T\n ) => Promise<void> | (() => void) | Args<T> | Assign<T> | void;\n\n /**\n * Lifecycle handlers for `State.on`, keyed by when they run. A bare `Init`\n * function passed to `on` is sugar for `{ before }`.\n */\n interface On<T extends State = State> {\n /**\n * Per-class setup, run once when the class is first bootstrapped - before\n * its members are classified and bound. Receives the class, so a handler\n * may inspect or reshape the prototype first. A handler registered on a\n * base class runs for each subclass too.\n */\n type?(type: State.Extends<T>): void;\n\n /**\n * Per-instance setup, run in the `prepare` phase before `observe` and the\n * `new()` hook. Equivalent to passing a bare function to `on`. May return a\n * cleanup, constructor args, or an assign overlay.\n */\n before?(this: T, thisArg: T): void | (() => void) | Promise<void> | Args<T> | Assign<T>;\n\n /**\n * Per-instance setup, run at the `new()` slot - after own values are\n * observed and constructor args applied. May return a cleanup function.\n */\n after?(this: T, self: T): void | (() => void);\n }\n\n /** Object overlay to override values and methods on a state. */\n type Assign<T> = Record<string, unknown> & {\n [K in Field<T>]?: T[K] extends (...args: infer A) => infer R\n ? (this: T, ...args: A) => R\n : T[K];\n };\n\n /** Subset of `keyof T` not defined by base State. **/\n type Field<T> = Exclude<keyof T, keyof State>;\n\n /** Any valid key for state, including but not limited to Field<T>. */\n type Event<T = State> = Field<T> | number | symbol | (string & {});\n\n /** Any event signal dispatched to listeners, including lifecycle meta events. */\n type Signal<T = State> = Event<T> | true | false | null;\n\n /** Export/Import compatible value for a given property in a State. */\n type Export<R> = R extends State\n ? Values<R>\n : R extends { get(): infer T }\n ? T\n : R;\n\n /**\n * Values from current state of given state.\n * Differs from `Values` as values here will drill\n * into \"real\" values held by exotics like ref.Object.\n */\n type Values<T> = { [P in Field<T>]: Export<T[P]> };\n\n /** Object comperable to data found in T. */\n type Partial<T> = { [P in Field<T>]?: Export<T[P]> };\n\n /** Value for a property applied by a state. */\n type Value<T extends State, K extends State.Event<T>> = K extends keyof T\n ? Export<T[K]>\n : unknown;\n\n type Setter<T> = (value: T, previous: T) => T | void;\n\n /** Descriptor config for a managed property. */\n type Apply<T = any> = {\n value?: T;\n get?: ((source: State) => T) | boolean;\n set?: Setter<T> | boolean;\n enumerable?: boolean;\n // destroy?: () => void;\n };\n\n /** Descriptor config for set() overload - enforces type when key is a known field. */\n type Define<T, K> = K extends Field<T> ? Apply<T[K] | Export<T[K]>> : Apply;\n\n type OnEvent<T extends State> = (\n this: T,\n key: Signal<T>,\n source: T\n ) => void | (() => void) | null;\n\n /** Exotic value, where actual value is contained within. */\n type Ref<T = any> = {\n (next: T): void;\n current: T | null;\n };\n\n /**\n * A callback function which is subscribed to parent and updates when accessed properties change.\n *\n * @param current - Current state of this state. This is a proxy which detects properties which\n * where accessed, and thus depended upon to stay current.\n *\n * @param update - Set of properties which have changed, and events fired, since last update.\n *\n * @returns A callback function which will be called when this effect is stale.\n */\n type Effect<T> = (\n this: T,\n current: T,\n update: readonly State.Event<T>[] | undefined\n ) => EffectCallback | Promise<void> | null | void;\n\n /**\n * A callback function returned by effect. Will be called when effect is stale.\n *\n * @param update - `true` if update is pending, `false` effect has been cancelled, `null` if state is destroyed.\n */\n type EffectCallback = (update: boolean | null) => void;\n\n /**\n * A list of keys updated, or events fired, since last update.\n * This may be awaited to get full list (same array) when update is settled.\n */\n type Updated<T extends State> = readonly Event<T>[] &\n PromiseLike<readonly Event<T>[]>;\n}\n\nabstract class State {\n /**\n * Whether an instance activated with no enclosing context registers itself\n * to the process-global root, where `get()` can resolve it from anywhere.\n * `false` (the default) keeps a context-less instance fully functional but\n * private - not injectable, though it can still read declared globals. Opt in\n * with `static readonly global = true`; a resolver (see {@link State.Global})\n * makes the choice conditional. It must be declared per class - a subclass\n * that would inherit a global without its own declaration throws on\n * activation, so an accidental global (a forgotten `Provider`, an extended\n * global) cannot leak into the shared root.\n */\n static readonly global: State.Global = false;\n\n /**\n * Loopback to instance of this state. This is useful when in a subscribed context,\n * to keep write access to `this` after a destructure. You can use it to read variables silently as well.\n **/\n declare is: this;\n\n constructor(...args: State.Args) {\n define(this, 'is', { value: this });\n init(this, args, this.new);\n }\n\n /**\n * Optional lifecycle hook called during State initialization.\n * Can return a cleanup function to run when state is destroyed.\n *\n * It is recommended you protect this method.\n */\n protected new?(): void | (() => void);\n\n /**\n * Pull current values from state. Flattens all states and exotic values recursively.\n *\n * @returns Object with all values from this state.\n **/\n get(): State.Values<this>;\n\n /**\n * Run a function to run automatically when accessed values change.\n *\n * @param effect Function to run, and whenever accessed values change.\n * If effect returns a function, it will be called when a change occurs (syncronously),\n * effect is cancelled, or parent state is destroyed.\n * @returns Function to cancel listener.\n */\n get(effect: State.Effect<this>): () => void;\n\n /**\n * Get value of a property. Will fetch underlying value from exotic values like ref.Object.\n *\n * Any value which implements `get()` (with no arguments) will be treated as such.\n *\n * @param key - Property to get value of.\n * @param required - If true, will throw an error if property is not available.\n * @returns Value of property.\n */\n get<T extends State.Event<this>>(\n key: T,\n required?: boolean\n ): State.Value<this, T>;\n\n /**\n * Check if state is destroyed.\n *\n * @param status - `null` to check if state is destroyed.\n * @returns `true` if state is destroyed, `false` otherwise.\n */\n get(status: null): boolean;\n\n /**\n * Callback when state is to be destroyed.\n *\n * @param callback - Function to call when state is destroyed.\n * @returns Function to cancel listener.\n */\n get(status: null, callback: () => void): () => void;\n\n /** Fetch State of type from context. Throws if not found. */\n get<T extends State>(type: State.Type<T>, required?: true): T;\n\n /** Fetch a State from context. Undefined if not found. */\n get<T extends State>(type: State.Type<T>, required: boolean): T | undefined;\n\n /**\n * Subscribe to State becoming available in context.\n *\n * Will search both up and downstream by default.\n * Normally you can ignore this because State you expect is rarely both.\n *\n * Specify downstream if you only want to watch for State in children, which can be useful if you expect multiple of the same State in different branches of the tree.\n *\n * @param type - Type of State to watch for.\n * @param callback - Function to call when State is found. Will be called immediately if State is already available.\n * @param downstream - If true, will only watch for State in children, if false will only for parents.\n * @returns Function to cancel listener.\n */\n get<T extends State>(\n type: State.Type<T>,\n callback: Context.Expect<T>,\n downstream?: boolean\n ): () => void;\n\n get(\n arg1?: State.Effect<this> | State.Type | string | null,\n arg2?: boolean | Context.Expect | (() => void),\n arg3?: boolean\n ) {\n const self = this.is;\n\n if (arg1 === undefined) return values(self);\n if (State.is(arg1)) return Context.get(self).get(arg1, arg2, arg3, self);\n if (typeof arg1 == 'function') return watch(self, unbind(arg1));\n if (typeof arg2 == 'function') return callback(self, arg2, arg1);\n if (arg1 === null) return observer(self) === null;\n return access(self, arg1, arg2);\n }\n\n /**\n * Get update in progress.\n *\n * @returns Promise which resolves object with updated values, `undefined` if there no update is pending.\n **/\n set(): State.Updated<this>;\n\n /**\n * Merge argument with current state, updating one or more properties at once.\n * Properties which are not managed by this state will be ignored.\n *\n * @param assign - Object with properties to update.\n * @param silent - If true, listeners will not be notified. If state is destroyed, will squash update without throwing.\n * @returns Array of keys updated, syncronously contains keys updated immediately and may be resolved (to itself) when all updates are settled.\n */\n set(assign?: State.Assign<this>, silent?: boolean): State.Updated<this>;\n\n /**\n * Call a function when update occurs.\n *\n * Given function is called for every assignment (which changes value) or explicit `set`.\n *\n * To run logic on final value only, callback may return a function. The same\n * function for one or more events will be called only once when update is settled.\n *\n * Return `null` from callback to stop listening.\n *\n * @param callback - Function to call when update occurs.\n * @returns Function to remove listener. Will return `true` if removed, `false` if inactive already.\n */\n set(callback: State.OnEvent<this>): () => boolean;\n\n /**\n * Push an update. This will not change the value of associated property.\n *\n * Useful where a property value internally has changed, but the object is the same.\n * For example: An array has pushed a new value, or a nested property is updated.\n *\n * You can also use this to dispatch arbitrary events.\n * Symbols are recommended as non-property events, however you can use any string.\n * If doing so, be sure to avoid collisions using property names. An easy way to do this is\n * to prefix an event with \"!\" and/or use dash-case. e.g. `set(\"!event\")` or `set(\"my-event\")`.\n *\n * @param key - Property or event to dispatch.\n * @returns Promise resolves an array of keys updated.\n */\n set(key: State.Event<this>): State.Updated<this>;\n\n /**\n * Declare an end to updates. This event is final and will freeze state.\n * This event can be watched for as well, to run cleanup logic and internally will remove all listeners.\n *\n * @param status - `null` to end updates.\n */\n set(status: null): void;\n\n /**\n * Register a callback for a specific property or event.\n *\n * Callback receives the key, current value, and source instance.\n *\n * @param event - Property or event to watch. If `null`, will callback on destroy.\n * @param callback - Function to call when event occurs.\n * @returns Function to remove listener.\n */\n set<K extends State.Event<this>>(\n event: K | null,\n callback: State.OnEvent<this>\n ): () => boolean;\n\n /**\n * Define or update a managed property using a descriptor config.\n * If the property already is managed, config will only accept value.\n * If the property does not exist, it will be created and made reactive.\n *\n * @param key - Property to define or update.\n * @param config - Descriptor config with value, get, set, enumerable, and/or destroy.\n * @returns Promise resolves an array of keys updated.\n */\n set<K extends State.Event<this>>(\n key: K,\n config: State.Define<this, K>\n ): State.Updated<this>;\n\n set(\n arg1?: State.OnEvent<this> | State.Assign<this> | State.Event<this> | null,\n arg2?: unknown\n ) {\n const self = this.is;\n\n if (typeof arg1 == 'function')\n return listener(self, (key) => {\n if (\n typeof key == 'string' ||\n typeof key == 'number' ||\n typeof key == 'symbol'\n )\n return arg1.call(self, key, self);\n });\n\n if (typeof arg2 == 'function')\n return callback(self, arg2, arg1 as State.Signal);\n\n if (arg1 && typeof arg1 == 'object') assign(self, arg1, arg2 === true);\n else if (arg2) apply(self, arg1 as string, arg2);\n else event(self, arg1);\n\n return queued(self) as State.Updated<this>;\n }\n\n /**\n * Iterate over managed properties in this instance of State.\n * Yeilds the key and current value for each property.\n */\n [Symbol.iterator](): Iterator<[string, unknown]> {\n return Object.entries(STORE.get(this.is)!)[Symbol.iterator]();\n }\n\n /**\n * Create and activate a new instance of this state.\n *\n * **Important** - Unlike `new this(...)` - this method also activates state.\n *\n * @param args - arguments sent to constructor\n */\n static new<T extends State>(this: State.Type<T>, ...args: State.Args<T>): T {\n const instance = new this(...args);\n event(instance);\n return instance;\n }\n\n /**\n * Static equivalent of `x instanceof this`.\n * Determines if provided class is a subtype of this one.\n * If so, language server will make available all static\n * methods and properties of this class.\n */\n static is<T extends State.Extends>(this: T, maybe: unknown): maybe is T {\n return (\n maybe === this ||\n (typeof maybe == 'function' && maybe.prototype instanceof this)\n );\n }\n\n /**\n * Register a lifecycle handler for this State and its subclasses.\n *\n * A bare function is per-instance setup run in the `prepare` phase (sugar for\n * `{ before }`); if it returns a function, that runs when the instance is\n * destroyed. Pass a {@link State.On} object to hook by cadence - `type`\n * (per-class, at bootstrap), `before` (per-instance, before `new()`), and\n * `after` (per-instance, at the `new()` slot).\n *\n * @returns Function to remove the handler.\n */\n static on<T extends State>(\n this: State.Extends<T>,\n handler: State.Init<T> | State.On<T>\n ) {\n let setup = SETUP.get(this);\n\n if (!setup) SETUP.set(this, (setup = new Set()));\n\n setup.add(handler);\n\n return () => setup.delete(handler);\n }\n}\n\ndefine(State.prototype, 'toString', {\n value() {\n return ID.get(this.is);\n }\n});\n\ndefine(State, 'toString', {\n value() {\n return this.name;\n }\n});\n\n/** Register a user OnEvent callback, preserving `this` and `source`. */\nfunction callback<T extends State>(\n self: T,\n cb: Function,\n select?: Observer.Signal | Set<Observer.Signal>\n) {\n return listener(self, (key) => cb.call(self, key, self), select);\n}\n\n/**\n * Apply state arguemnts, run callbacks and observe properties.\n * Accumulate and handle cleanup events.\n **/\nfunction init(state: State, ...args: State.Args) {\n const T = state.constructor as State.Extends;\n\n if (T === State) throw new Error('Cannot create base State.');\n\n const { before, after } = bootstrap(T);\n\n ID.set(state, `${T}-${uid()}`);\n STORE.set(state, {});\n\n function observe() {\n for (const key in state) {\n const desc: PropertyDescriptor = Object.getOwnPropertyDescriptor(state, key) || {};\n\n if ('value' in desc && desc.configurable) apply(state, key, desc, true);\n }\n }\n\n function register() {\n if (Context.get(state) !== Context.root) return;\n\n const type = state.constructor as typeof State;\n const g = type.global;\n\n if (!(typeof g == 'function' ? g(state) : g)) return;\n\n if (!Object.prototype.hasOwnProperty.call(type, 'global'))\n throw new Error(\n `${state} would register as a global by inheritance alone - re-declare \\`static global\\` on ${type.name} (\\`true\\` to keep it, \\`false\\` to opt out).`\n );\n\n return Context.root.add(state);\n }\n\n listener(state, (key) => {\n const rest = trailing(state);\n\n PENDING.delete(state);\n\n if (key === null) return null;\n\n parent(state, null);\n\n const queue = [...before, observe, ...args, ...after, register];\n\n capture((release) => {\n listener(state, () => release(null), null);\n\n for (let i = 0; i < queue.length; i++) {\n const arg = queue[i];\n const out = typeof arg == 'function' ? arg.call(state, state) : arg;\n\n if (out instanceof Promise)\n out.catch((err) => {\n console.error(`Async error in constructor for ${state}:`);\n console.error(err);\n });\n else if (Array.isArray(out)) queue.splice(i + 1, 0, ...out);\n else if (typeof out == 'function') listener(state, out, null);\n else if (typeof out == 'object') assign(state, out, true);\n }\n });\n\n let end = rest.length;\n\n while (end-- > 0 && PENDING.has(rest[end]));\n\n for (let i = 0; i < end; i++) PENDING.delete(rest[i]);\n\n return null;\n });\n\n if (!QUEUED) {\n QUEUED = true;\n\n queueMicrotask(() => {\n QUEUED = false;\n\n for (const item of PENDING)\n if (typeof item == 'function') item();\n else console.warn(`${item} was constructed but never activated.`);\n\n PENDING.clear();\n });\n }\n\n PENDING.add(state);\n}\n\n/**\n * Apply instructions and inherited event listeners. Ensure class metadata is ready.\n *\n * @param T - State class to bootstrap.\n * @return Array of init functions to run on instance, in order of class hierarchy.\n */\nfunction bootstrap(T: State.Extends) {\n const chain = [] as State.Extends[];\n const before = new Set<State.Init>();\n const after = new Set<State.Init>();\n const onType = new Set<NonNullable<State.On['type']>>();\n let keys = new Map<string, (value: any) => void>();\n let getters = new Map<string, () => unknown>();\n\n while (true) {\n chain.unshift(T);\n if (T === State) break;\n T = Object.getPrototypeOf(T);\n }\n\n for (const type of chain) {\n for (const handler of SETUP.get(type) || [])\n if (typeof handler == 'function') before.add(handler);\n else {\n if (handler.before) before.add(handler.before);\n if (handler.after) after.add(handler.after);\n if (handler.type) onType.add(handler.type);\n }\n\n if (type === State) continue;\n\n if (METHODS.has(type)) {\n keys = METHODS.get(type)!;\n getters = GETTERS.get(type)!;\n continue;\n }\n\n for (const setupType of onType) setupType(type);\n\n METHODS.set(type, (keys = new Map(keys)));\n GETTERS.set(type, (getters = new Map(getters)));\n\n for (const [key, desc] of Object.entries(\n Object.getOwnPropertyDescriptors(type.prototype)\n )) {\n if (key == 'constructor' || !desc.configurable) continue;\n\n if (typeof desc.get == 'function') {\n if (desc.configurable && typeof desc.set != 'function')\n getters.set(key, desc.get);\n\n continue;\n }\n\n const { value } = desc;\n\n if (typeof value !== 'function') continue;\n\n function bind(this: State, original?: Function) {\n const { is } = this;\n\n if (is.hasOwnProperty(key) && !original) return value as Function;\n\n const fn = original || value;\n const bound = fn.bind(is);\n\n UNBIND.set(bound, fn);\n define(is, key, { value: bound, writable: true, configurable: true });\n\n return bound;\n }\n\n UNBIND.set(bind, value);\n\n keys.set(key, bind);\n define(type.prototype, key, { get: bind, set: bind });\n }\n }\n\n if (getters.size)\n before.add((self) => getters.forEach(compute, self));\n\n return { before, after };\n}\n\n/**\n * Install a reactive computed property on a state instance, derived from a prototype\n * getter or an arity-bearing `set` factory.\n *\n * The getter is invoked with the tracking proxy as both `this` and its first argument;\n * reads of managed properties through it create subscriptions. Result is cached and\n * emits a keyed event when stale.\n */\nfunction compute(this: State, getter: (self: any) => unknown, key: string) {\n const store = STORE.get(this)!;\n let reset: (() => void) | undefined;\n let isAsync: boolean;\n let proxy: any;\n\n const connect = () => {\n reset = watch(\n this,\n (current) => {\n proxy = current;\n\n if (!(key in store) || STALE.delete(run)) run(!reset);\n\n return (didUpdate) => {\n if (didUpdate) {\n STALE.add(run);\n event(this, key, true);\n }\n };\n },\n false\n );\n };\n\n const run = (initial?: boolean) => {\n let next: unknown;\n\n try {\n next = getter.call(proxy, proxy);\n } catch (err) {\n console.warn(\n `An exception was thrown while ${initial ? 'initializing' : 'refreshing'\n } ${this}.${key}.`\n );\n\n if (initial) throw err;\n\n console.error(err);\n }\n\n update(this, key, next, !isAsync);\n };\n\n apply(\n this,\n key,\n {\n enumerable: true,\n set: false,\n get: () => {\n if (!proxy) {\n if (observer(this) === null) return store[key];\n\n connect();\n isAsync = true;\n }\n\n if (STALE.delete(run)) run();\n\n return access(this, key, !proxy);\n }\n },\n true\n );\n}\n\n/**\n * Define or update a managed property using a descriptor config.\n * If the property already is managed, config will only accept value.\n * If the property does not exist, it will be created and made reactive.\n *\n * @param state - State to apply property to.\n * @param key - Property to define or update.\n * @param config - Descriptor config with value, get, set, enumerable, and/or destroy.\n * @param silent - If an update does occur, listeners will not be refreshed automatically.\n */\nfunction apply(\n state: State,\n key: string,\n config: State.Apply,\n silent?: boolean\n) {\n const desc = Object.getOwnPropertyDescriptor(state, key);\n\n if (desc && 'get' in desc) {\n if (Object.keys(config).some((k) => k != 'value'))\n throw new Error(`Property ${key} on ${state} is already defined.`);\n if ('value' in config) update(state, key, config.value, silent);\n return;\n }\n\n function set(value: unknown, silent?: boolean) {\n update(state, key, value, silent, true);\n }\n\n define(state, key, {\n configurable: true,\n enumerable: config.enumerable !== false,\n get(this: State) {\n const value =\n typeof config.get == 'function'\n ? config.get(this)\n : access(state, key, config.get);\n\n return touch(this, key, value);\n },\n set(next: any, silent?: boolean) {\n if (config.set === false)\n throw new Error(`${state}.${String(key)} is read-only.`);\n\n if (typeof config.set == 'function')\n try {\n const output = config.set(next, STORE.get(state)![key]);\n if (output !== undefined) next = output;\n } catch (err: unknown) {\n if (err === false) return;\n if (err === true) {\n set(next, true);\n return;\n }\n throw err;\n }\n\n set(next, silent);\n }\n });\n\n if ('value' in config) set(config.value, silent);\n}\n\nfunction provides(ctx: Context, value: State) {\n while (ctx = ctx.parent!) {\n const entries = ctx.provide.get(value.constructor as State.Extends);\n if (entries) for (const [state] of entries) if (state === value) return true;\n }\n}\n\nfunction child(state: State) {\n let cleanup: (() => void) | undefined;\n const ctx = Context.get(state);\n\n function reset() {\n if (cleanup) cleanup();\n cleanup = undefined;\n }\n\n listener(state, reset, null);\n\n return (value: unknown) => {\n reset();\n\n if (!(value instanceof State)) return;\n\n if (parent(value, state)) {\n const remove = join(state, value);\n cleanup = () => {\n cancel();\n remove();\n event(value, null);\n };\n const cancel = listener(state, cleanup, null);\n } else if (!provides(ctx, value)) {\n cleanup = join(state, value);\n }\n\n event(value);\n\n CHILDREN.get(state)?.forEach((cb) => cb(value));\n };\n}\n\n/**\n * Pending States constructed after this one - in a parent, the products of\n * its own initializers, until the last one it kept.\n */\nfunction trailing(state: State) {\n const rest: State[] = [];\n let seen = false;\n\n for (const item of PENDING)\n if (!seen) seen = item === state;\n else if (item instanceof State) rest.push(item);\n\n return rest;\n}\n\n/**\n * Report States adopted by a parent - those already held, then each one\n * claimed later. Returns a callback to stop watching.\n */\nfunction children(state: State, callback: (child: State) => void) {\n const store = STORE.get(state)!;\n const keys = ADOPT.get(state);\n\n if (keys)\n for (const key of keys.keys()) {\n const value = store[key as string];\n if (value instanceof State) callback(value);\n }\n\n let set = CHILDREN.get(state);\n\n if (!set) CHILDREN.set(state, (set = new Set()));\n\n set.add(callback);\n\n return () => set!.delete(callback);\n}\n\n/** Currently accumulating export. Stores real values of placeholder properties such as ref() or child states. */\nlet EXPORT: Map<any, any> | undefined;\n\nfunction values<T extends State>(state: T): State.Values<T> {\n const values = {} as any;\n let notRecursive;\n\n if (!EXPORT) {\n notRecursive = true;\n EXPORT = new Map();\n }\n\n EXPORT.set(state, values);\n\n for (let [key, value] of state) {\n if (EXPORT.has(value)) value = EXPORT.get(value);\n else if (\n value &&\n typeof value == 'object' &&\n 'get' in value &&\n typeof value.get === 'function'\n )\n value = value.get();\n\n values[key] = value;\n }\n\n if (notRecursive) EXPORT = undefined;\n\n return Object.freeze(values);\n}\n\nfunction access(state: State, property: string, required?: boolean) {\n const store = STORE.get(state)!;\n\n if (property in store || required === false) {\n const value = store[property];\n\n if (value !== undefined || !required) return value;\n }\n\n if (METHODS.get(state.constructor)!.has(property))\n return unbind((state as any)[property]);\n\n if (observer(state) === null) return undefined;\n\n const error = new Error(`${state}.${property} is not yet available.`);\n const promise = new Promise<any>((resolve, reject) => {\n listener(state, (key) => {\n if (key === property) {\n resolve(store[key]);\n return null;\n }\n\n if (key === null) {\n reject(new Error(`${state} is destroyed.`));\n }\n });\n });\n\n throw Object.assign(promise, {\n toString: () => String(error),\n name: 'Suspense',\n message: error.message,\n stack: error.stack\n });\n}\n\nfunction assign(state: State, data: State.Assign<State>, silent?: boolean) {\n if (!silent) event(state);\n\n const methods = METHODS.get(state.constructor)!;\n const getters = GETTERS.get(state.constructor);\n\n for (const key in data) {\n const bind = methods.get(key);\n\n if (bind) bind.call(state, data[key]);\n else if (getters?.has(key)) continue;\n else if (key in state && key !== 'is') {\n const desc: PropertyDescriptor = Object.getOwnPropertyDescriptor(state, key) || {};\n const set = desc.set as (value: any, silent?: boolean) => void;\n\n if (set) {\n set.call(state, data[key], silent);\n } else {\n (state as any)[key] = data[key];\n }\n }\n }\n}\n\n/**\n * Update a property on a state instance and notify listeners.\n *\n * This is used internally to update properties, but can also be used to update properties which are not managed by state, or to update values without triggering setters.\n *\n * If `silent` is true, the update will not dispatch events and will return `false` instead of throwing if state is destroyed.\n */\nfunction update<T>(\n state: State,\n key: State.Event<T>,\n value: T,\n silent?: boolean,\n own?: boolean\n) {\n if (observer(state) === null) {\n if (silent) return false;\n throw new Error(\n `Tried to update ${state}.${String(key)} but state is destroyed.`\n );\n }\n\n const store = STORE.get(state)!;\n\n if (value instanceof State) value = value.is as T;\n\n if (key in store && value === store[key]) return false;\n\n store[key] = value;\n\n if (!silent) event(state, key);\n\n if (own) adopt(state, key, value);\n\n return true;\n}\n\n/**\n * Hand a value stored by an owning writer to that property's adopter,\n * creating one the first time a State is stored there. A property which has\n * held a State keeps its adopter, so a later non-State value releases the\n * previous child.\n */\nfunction adopt(state: State, key: unknown, value: unknown) {\n let keys = ADOPT.get(state);\n\n if (!keys) {\n if (!(value instanceof State)) return;\n ADOPT.set(state, (keys = new Map()));\n }\n\n let claim = keys.get(key);\n\n if (!claim) {\n if (!(value instanceof State)) return;\n keys.set(key, (claim = child(state)));\n }\n\n claim(value);\n}\n\n/** Random alphanumberic of length 6; always starts with a letter. */\nfunction uid() {\n return (0.278 + Math.random() * 0.722)\n .toString(36)\n .substring(2, 8)\n .toUpperCase();\n}\n\nfunction unbind<T extends Function>(fn: T): T;\nfunction unbind<T extends Function>(fn?: T): T | undefined;\nfunction unbind(fn?: Function) {\n return UNBIND.get(fn) || fn;\n}\n\n/**\n * Read or claim a parent for a given child. In read mode (one argument) returns\n * the current parent, or `undefined` if never assigned. In write mode assigns\n * only if unclaimed and returns whether the assignment applied - `true` means\n * this call freshly claimed it, `false` means it was already parented.\n */\nfunction parent(child: object): State | null | undefined;\nfunction parent(child: object, value: State | null): boolean;\nfunction parent(child: object, value?: State | null) {\n if (arguments.length < 2) return PARENT.get(child as State);\n if (PARENT.has(child as State)) return false;\n PARENT.set(child as State, value ?? null);\n return true;\n}\n\nexport { event, unbind, State, parent, children, PENDING, STORE, uid, access, update, apply, compute };\n"],"mappings":";;;;AAYA,MAAM,SAAS,OAAO;;AAGtB,MAAM,qBAAK,IAAI,SAAwB;;AAGvC,MAAM,wBAAQ,IAAI,SAA2D;;;AAI7E,MAAM,0BAAU,IAAI,KAA2B;;AAG/C,MAAM,wBAAQ,IAAI,SAA8D;;AAGhF,MAAM,yBAAS,IAAI,SAA+B;;AAGlD,MAAM,yBAAS,IAAI,SAAmB;;AAGtC,MAAM,0BAAU,IAAI,SAAsD;;AAG1E,MAAM,0BAAU,IAAI,SAA+C;;AAGnE,MAAM,wBAAQ,IAAI,SAAqB;;AAGvC,IAAI,SAAS;;AAGb,MAAM,wBAAQ,IAAI,SAAwD;AAC1E,MAAM,2BAAW,IAAI,SAA6C;AA4JlE,IAAe,QAAf,MAAe,MAAM;;;;;;;;;;;;CAYnB,OAAgB,SAAuB;CAQvC,YAAY,GAAG,MAAkB;AAC/B,SAAO,MAAM,MAAM,EAAE,OAAO,MAAM,CAAC;AACnC,OAAK,MAAM,MAAM,KAAK,IAAI;;CAmF5B,IACE,MACA,MACA,MACA;EACA,MAAM,OAAO,KAAK;AAElB,MAAI,SAAS,OAAW,QAAO,OAAO,KAAK;AAC3C,MAAI,MAAM,GAAG,KAAK,CAAE,QAAO,QAAQ,IAAI,KAAK,CAAC,IAAI,MAAM,MAAM,MAAM,KAAK;AACxE,MAAI,OAAO,QAAQ,WAAY,QAAO,MAAM,MAAM,OAAO,KAAK,CAAC;AAC/D,MAAI,OAAO,QAAQ,WAAY,QAAO,SAAS,MAAM,MAAM,KAAK;AAChE,MAAI,SAAS,KAAM,QAAO,SAAS,KAAK,KAAK;AAC7C,SAAO,OAAO,MAAM,MAAM,KAAK;;CAuFjC,IACE,MACA,MACA;EACA,MAAM,OAAO,KAAK;AAElB,MAAI,OAAO,QAAQ,WACjB,QAAO,SAAS,OAAO,QAAQ;AAC7B,OACE,OAAO,OAAO,YACd,OAAO,OAAO,YACd,OAAO,OAAO,SAEd,QAAO,KAAK,KAAK,MAAM,KAAK,KAAK;IACnC;AAEJ,MAAI,OAAO,QAAQ,WACjB,QAAO,SAAS,MAAM,MAAM,KAAqB;AAEnD,MAAI,QAAQ,OAAO,QAAQ,SAAU,QAAO,MAAM,MAAM,SAAS,KAAK;WAC7D,KAAM,OAAM,MAAM,MAAgB,KAAK;MAC3C,OAAM,MAAM,KAAK;AAEtB,SAAO,OAAO,KAAK;;;;;;CAOrB,CAAC,OAAO,YAAyC;AAC/C,SAAO,OAAO,QAAQ,MAAM,IAAI,KAAK,GAAG,CAAE,CAAC,OAAO,WAAW;;;;;;;;;CAU/D,OAAO,IAA0C,GAAG,MAAwB;EAC1E,MAAM,WAAW,IAAI,KAAK,GAAG,KAAK;AAClC,QAAM,SAAS;AACf,SAAO;;;;;;;;CAST,OAAO,GAAqC,OAA4B;AACtE,SACE,UAAU,QACT,OAAO,SAAS,cAAc,MAAM,qBAAqB;;;;;;;;;;;;;CAe9D,OAAO,GAEL,SACA;EACA,IAAI,QAAQ,MAAM,IAAI,KAAK;AAE3B,MAAI,CAAC,MAAO,OAAM,IAAI,MAAO,wBAAQ,IAAI,KAAK,CAAE;AAEhD,QAAM,IAAI,QAAQ;AAElB,eAAa,MAAM,OAAO,QAAQ;;;AAItC,OAAO,MAAM,WAAW,YAAY,EAClC,QAAQ;AACN,QAAO,GAAG,IAAI,KAAK,GAAG;GAEzB,CAAC;AAEF,OAAO,OAAO,YAAY,EACxB,QAAQ;AACN,QAAO,KAAK;GAEf,CAAC;;AAGF,SAAS,SACP,MACA,IACA,QACA;AACA,QAAO,SAAS,OAAO,QAAQ,GAAG,KAAK,MAAM,KAAK,KAAK,EAAE,OAAO;;;;;;AAOlE,SAAS,KAAK,OAAc,GAAG,MAAkB;CAC/C,MAAM,IAAI,MAAM;AAEhB,KAAI,MAAM,MAAO,OAAM,IAAI,MAAM,4BAA4B;CAE7D,MAAM,EAAE,QAAQ,UAAU,UAAU,EAAE;AAEtC,IAAG,IAAI,OAAO,GAAG,EAAE,GAAG,KAAK,GAAG;AAC9B,OAAM,IAAI,OAAO,EAAE,CAAC;CAEpB,SAAS,UAAU;AACjB,OAAK,MAAM,OAAO,OAAO;GACvB,MAAM,OAA2B,OAAO,yBAAyB,OAAO,IAAI,IAAI,EAAE;AAElF,OAAI,WAAW,QAAQ,KAAK,aAAc,OAAM,OAAO,KAAK,MAAM,KAAK;;;CAI3E,SAAS,WAAW;AAClB,MAAI,QAAQ,IAAI,MAAM,KAAK,QAAQ,KAAM;EAEzC,MAAM,OAAO,MAAM;EACnB,MAAM,IAAI,KAAK;AAEf,MAAI,EAAE,OAAO,KAAK,aAAa,EAAE,MAAM,GAAG,GAAI;AAE9C,MAAI,CAAC,OAAO,UAAU,eAAe,KAAK,MAAM,SAAS,CACvD,OAAM,IAAI,MACR,GAAG,MAAM,qFAAqF,KAAK,KAAK,+CACzG;AAEH,SAAO,QAAQ,KAAK,IAAI,MAAM;;AAGhC,UAAS,QAAQ,QAAQ;EACvB,MAAM,OAAO,SAAS,MAAM;AAE5B,UAAQ,OAAO,MAAM;AAErB,MAAI,QAAQ,KAAM,QAAO;AAEzB,SAAO,OAAO,KAAK;EAEnB,MAAM,QAAQ;GAAC,GAAG;GAAQ;GAAS,GAAG;GAAM,GAAG;GAAO;GAAS;AAE/D,WAAS,YAAY;AACnB,YAAS,aAAa,QAAQ,KAAK,EAAE,KAAK;AAE1C,QAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;IACrC,MAAM,MAAM,MAAM;IAClB,MAAM,MAAM,OAAO,OAAO,aAAa,IAAI,KAAK,OAAO,MAAM,GAAG;AAEhE,QAAI,eAAe,QACjB,KAAI,OAAO,QAAQ;AACjB,aAAQ,MAAM,kCAAkC,MAAM,GAAG;AACzD,aAAQ,MAAM,IAAI;MAClB;aACK,MAAM,QAAQ,IAAI,CAAE,OAAM,OAAO,IAAI,GAAG,GAAG,GAAG,IAAI;aAClD,OAAO,OAAO,WAAY,UAAS,OAAO,KAAK,KAAK;aACpD,OAAO,OAAO,SAAU,QAAO,OAAO,KAAK,KAAK;;IAE3D;EAEF,IAAI,MAAM,KAAK;AAEf,SAAO,QAAQ,KAAK,QAAQ,IAAI,KAAK,KAAK;AAE1C,OAAK,IAAI,IAAI,GAAG,IAAI,KAAK,IAAK,SAAQ,OAAO,KAAK,GAAG;AAErD,SAAO;GACP;AAEF,KAAI,CAAC,QAAQ;AACX,WAAS;AAET,uBAAqB;AACnB,YAAS;AAET,QAAK,MAAM,QAAQ,QACjB,KAAI,OAAO,QAAQ,WAAY,OAAM;OAChC,SAAQ,KAAK,GAAG,KAAK,uCAAuC;AAEnE,WAAQ,OAAO;IACf;;AAGJ,SAAQ,IAAI,MAAM;;;;;;;;AASpB,SAAS,UAAU,GAAkB;CACnC,MAAM,QAAQ,EAAE;CAChB,MAAM,yBAAS,IAAI,KAAiB;CACpC,MAAM,wBAAQ,IAAI,KAAiB;CACnC,MAAM,yBAAS,IAAI,KAAoC;CACvD,IAAI,uBAAO,IAAI,KAAmC;CAClD,IAAI,0BAAU,IAAI,KAA4B;AAE9C,QAAO,MAAM;AACX,QAAM,QAAQ,EAAE;AAChB,MAAI,MAAM,MAAO;AACjB,MAAI,OAAO,eAAe,EAAE;;AAG9B,MAAK,MAAM,QAAQ,OAAO;AACxB,OAAK,MAAM,WAAW,MAAM,IAAI,KAAK,IAAI,EAAE,CACzC,KAAI,OAAO,WAAW,WAAY,QAAO,IAAI,QAAQ;OAChD;AACH,OAAI,QAAQ,OAAQ,QAAO,IAAI,QAAQ,OAAO;AAC9C,OAAI,QAAQ,MAAO,OAAM,IAAI,QAAQ,MAAM;AAC3C,OAAI,QAAQ,KAAM,QAAO,IAAI,QAAQ,KAAK;;AAG9C,MAAI,SAAS,MAAO;AAEpB,MAAI,QAAQ,IAAI,KAAK,EAAE;AACrB,UAAO,QAAQ,IAAI,KAAK;AACxB,aAAU,QAAQ,IAAI,KAAK;AAC3B;;AAGF,OAAK,MAAM,aAAa,OAAQ,WAAU,KAAK;AAE/C,UAAQ,IAAI,MAAO,OAAO,IAAI,IAAI,KAAK,CAAE;AACzC,UAAQ,IAAI,MAAO,UAAU,IAAI,IAAI,QAAQ,CAAE;AAE/C,OAAK,MAAM,CAAC,KAAK,SAAS,OAAO,QAC/B,OAAO,0BAA0B,KAAK,UAAU,CACjD,EAAE;AACD,OAAI,OAAO,iBAAiB,CAAC,KAAK,aAAc;AAEhD,OAAI,OAAO,KAAK,OAAO,YAAY;AACjC,QAAI,KAAK,gBAAgB,OAAO,KAAK,OAAO,WAC1C,SAAQ,IAAI,KAAK,KAAK,IAAI;AAE5B;;GAGF,MAAM,EAAE,UAAU;AAElB,OAAI,OAAO,UAAU,WAAY;GAEjC,SAAS,KAAkB,UAAqB;IAC9C,MAAM,EAAE,OAAO;AAEf,QAAI,GAAG,eAAe,IAAI,IAAI,CAAC,SAAU,QAAO;IAEhD,MAAM,KAAK,YAAY;IACvB,MAAM,QAAQ,GAAG,KAAK,GAAG;AAEzB,WAAO,IAAI,OAAO,GAAG;AACrB,WAAO,IAAI,KAAK;KAAE,OAAO;KAAO,UAAU;KAAM,cAAc;KAAM,CAAC;AAErE,WAAO;;AAGT,UAAO,IAAI,MAAM,MAAM;AAEvB,QAAK,IAAI,KAAK,KAAK;AACnB,UAAO,KAAK,WAAW,KAAK;IAAE,KAAK;IAAM,KAAK;IAAM,CAAC;;;AAIzD,KAAI,QAAQ,KACV,QAAO,KAAK,SAAS,QAAQ,QAAQ,SAAS,KAAK,CAAC;AAEtD,QAAO;EAAE;EAAQ;EAAO;;;;;;;;;;AAW1B,SAAS,QAAqB,QAAgC,KAAa;CACzE,MAAM,QAAQ,MAAM,IAAI,KAAK;CAC7B,IAAI;CACJ,IAAI;CACJ,IAAI;CAEJ,MAAM,gBAAgB;AACpB,UAAQ,MACN,OACC,YAAY;AACX,WAAQ;AAER,OAAI,EAAE,OAAO,UAAU,MAAM,OAAO,IAAI,CAAE,KAAI,CAAC,MAAM;AAErD,WAAQ,cAAc;AACpB,QAAI,WAAW;AACb,WAAM,IAAI,IAAI;AACd,WAAM,MAAM,KAAK,KAAK;;;KAI5B,MACD;;CAGH,MAAM,OAAO,YAAsB;EACjC,IAAI;AAEJ,MAAI;AACF,UAAO,OAAO,KAAK,OAAO,MAAM;WACzB,KAAK;AACZ,WAAQ,KACN,iCAAiC,UAAU,iBAAiB,aAC3D,GAAG,KAAK,GAAG,IAAI,GACjB;AAED,OAAI,QAAS,OAAM;AAEnB,WAAQ,MAAM,IAAI;;AAGpB,SAAO,MAAM,KAAK,MAAM,CAAC,QAAQ;;AAGnC,OACE,MACA,KACA;EACE,YAAY;EACZ,KAAK;EACL,WAAW;AACT,OAAI,CAAC,OAAO;AACV,QAAI,SAAS,KAAK,KAAK,KAAM,QAAO,MAAM;AAE1C,aAAS;AACT,cAAU;;AAGZ,OAAI,MAAM,OAAO,IAAI,CAAE,MAAK;AAE5B,UAAO,OAAO,MAAM,KAAK,CAAC,MAAM;;EAEnC,EACD,KACD;;;;;;;;;;;;AAaH,SAAS,MACP,OACA,KACA,QACA,QACA;CACA,MAAM,OAAO,OAAO,yBAAyB,OAAO,IAAI;AAExD,KAAI,QAAQ,SAAS,MAAM;AACzB,MAAI,OAAO,KAAK,OAAO,CAAC,MAAM,MAAM,KAAK,QAAQ,CAC/C,OAAM,IAAI,MAAM,YAAY,IAAI,MAAM,MAAM,sBAAsB;AACpE,MAAI,WAAW,OAAQ,QAAO,OAAO,KAAK,OAAO,OAAO,OAAO;AAC/D;;CAGF,SAAS,IAAI,OAAgB,QAAkB;AAC7C,SAAO,OAAO,KAAK,OAAO,QAAQ,KAAK;;AAGzC,QAAO,OAAO,KAAK;EACjB,cAAc;EACd,YAAY,OAAO,eAAe;EAClC,MAAiB;GACf,MAAM,QACJ,OAAO,OAAO,OAAO,aACjB,OAAO,IAAI,KAAK,GAChB,OAAO,OAAO,KAAK,OAAO,IAAI;AAEpC,UAAO,MAAM,MAAM,KAAK,MAAM;;EAEhC,IAAI,MAAW,QAAkB;AAC/B,OAAI,OAAO,QAAQ,MACjB,OAAM,IAAI,MAAM,GAAG,MAAM,GAAG,OAAO,IAAI,CAAC,gBAAgB;AAE1D,OAAI,OAAO,OAAO,OAAO,WACvB,KAAI;IACF,MAAM,SAAS,OAAO,IAAI,MAAM,MAAM,IAAI,MAAM,CAAE,KAAK;AACvD,QAAI,WAAW,OAAW,QAAO;YAC1B,KAAc;AACrB,QAAI,QAAQ,MAAO;AACnB,QAAI,QAAQ,MAAM;AAChB,SAAI,MAAM,KAAK;AACf;;AAEF,UAAM;;AAGV,OAAI,MAAM,OAAO;;EAEpB,CAAC;AAEF,KAAI,WAAW,OAAQ,KAAI,OAAO,OAAO,OAAO;;AAGlD,SAAS,SAAS,KAAc,OAAc;AAC5C,QAAO,MAAM,IAAI,QAAS;EACxB,MAAM,UAAU,IAAI,QAAQ,IAAI,MAAM,YAA6B;AACnE,MAAI,SAAS;QAAK,MAAM,CAAC,UAAU,QAAS,KAAI,UAAU,MAAO,QAAO;;;;AAI5E,SAAS,MAAM,OAAc;CAC3B,IAAI;CACJ,MAAM,MAAM,QAAQ,IAAI,MAAM;CAE9B,SAAS,QAAQ;AACf,MAAI,QAAS,UAAS;AACtB,YAAU;;AAGZ,UAAS,OAAO,OAAO,KAAK;AAE5B,SAAQ,UAAmB;AACzB,SAAO;AAEP,MAAI,EAAE,iBAAiB,OAAQ;AAE/B,MAAI,OAAO,OAAO,MAAM,EAAE;GACxB,MAAM,SAAS,KAAK,OAAO,MAAM;AACjC,mBAAgB;AACd,YAAQ;AACR,YAAQ;AACR,UAAM,OAAO,KAAK;;GAEpB,MAAM,SAAS,SAAS,OAAO,SAAS,KAAK;aACpC,CAAC,SAAS,KAAK,MAAM,CAC9B,WAAU,KAAK,OAAO,MAAM;AAG9B,QAAM,MAAM;AAEZ,WAAS,IAAI,MAAM,EAAE,SAAS,OAAO,GAAG,MAAM,CAAC;;;;;;;AAQnD,SAAS,SAAS,OAAc;CAC9B,MAAM,OAAgB,EAAE;CACxB,IAAI,OAAO;AAEX,MAAK,MAAM,QAAQ,QACjB,KAAI,CAAC,KAAM,QAAO,SAAS;UAClB,gBAAgB,MAAO,MAAK,KAAK,KAAK;AAEjD,QAAO;;;;;;AAOT,SAAS,SAAS,OAAc,UAAkC;CAChE,MAAM,QAAQ,MAAM,IAAI,MAAM;CAC9B,MAAM,OAAO,MAAM,IAAI,MAAM;AAE7B,KAAI,KACF,MAAK,MAAM,OAAO,KAAK,MAAM,EAAE;EAC7B,MAAM,QAAQ,MAAM;AACpB,MAAI,iBAAiB,MAAO,UAAS,MAAM;;CAG/C,IAAI,MAAM,SAAS,IAAI,MAAM;AAE7B,KAAI,CAAC,IAAK,UAAS,IAAI,OAAQ,sBAAM,IAAI,KAAK,CAAE;AAEhD,KAAI,IAAI,SAAS;AAEjB,cAAa,IAAK,OAAO,SAAS;;;AAIpC,IAAI;AAEJ,SAAS,OAAwB,OAA2B;CAC1D,MAAM,SAAS,EAAE;CACjB,IAAI;AAEJ,KAAI,CAAC,QAAQ;AACX,iBAAe;AACf,2BAAS,IAAI,KAAK;;AAGpB,QAAO,IAAI,OAAO,OAAO;AAEzB,MAAK,IAAI,CAAC,KAAK,UAAU,OAAO;AAC9B,MAAI,OAAO,IAAI,MAAM,CAAE,SAAQ,OAAO,IAAI,MAAM;WAE9C,SACA,OAAO,SAAS,YAChB,SAAS,SACT,OAAO,MAAM,QAAQ,WAErB,SAAQ,MAAM,KAAK;AAErB,SAAO,OAAO;;AAGhB,KAAI,aAAc,UAAS;AAE3B,QAAO,OAAO,OAAO,OAAO;;AAG9B,SAAS,OAAO,OAAc,UAAkB,UAAoB;CAClE,MAAM,QAAQ,MAAM,IAAI,MAAM;AAE9B,KAAI,YAAY,SAAS,aAAa,OAAO;EAC3C,MAAM,QAAQ,MAAM;AAEpB,MAAI,UAAU,UAAa,CAAC,SAAU,QAAO;;AAG/C,KAAI,QAAQ,IAAI,MAAM,YAAY,CAAE,IAAI,SAAS,CAC/C,QAAO,OAAQ,MAAc,UAAU;AAEzC,KAAI,SAAS,MAAM,KAAK,KAAM,QAAO;CAErC,MAAM,wBAAQ,IAAI,MAAM,GAAG,MAAM,GAAG,SAAS,wBAAwB;CACrE,MAAM,UAAU,IAAI,SAAc,SAAS,WAAW;AACpD,WAAS,QAAQ,QAAQ;AACvB,OAAI,QAAQ,UAAU;AACpB,YAAQ,MAAM,KAAK;AACnB,WAAO;;AAGT,OAAI,QAAQ,KACV,wBAAO,IAAI,MAAM,GAAG,MAAM,gBAAgB,CAAC;IAE7C;GACF;AAEF,OAAM,OAAO,OAAO,SAAS;EAC3B,gBAAgB,OAAO,MAAM;EAC7B,MAAM;EACN,SAAS,MAAM;EACf,OAAO,MAAM;EACd,CAAC;;AAGJ,SAAS,OAAO,OAAc,MAA2B,QAAkB;AACzE,KAAI,CAAC,OAAQ,OAAM,MAAM;CAEzB,MAAM,UAAU,QAAQ,IAAI,MAAM,YAAY;CAC9C,MAAM,UAAU,QAAQ,IAAI,MAAM,YAAY;AAE9C,MAAK,MAAM,OAAO,MAAM;EACtB,MAAM,OAAO,QAAQ,IAAI,IAAI;AAE7B,MAAI,KAAM,MAAK,KAAK,OAAO,KAAK,KAAK;WAC5B,SAAS,IAAI,IAAI,CAAE;WACnB,OAAO,SAAS,QAAQ,MAAM;GAErC,MAAM,OAD2B,OAAO,yBAAyB,OAAO,IAAI,IAAI,EAAE,EACjE;AAEjB,OAAI,IACF,KAAI,KAAK,OAAO,KAAK,MAAM,OAAO;OAElC,CAAC,MAAc,OAAO,KAAK;;;;;;;;;;;AAanC,SAAS,OACP,OACA,KACA,OACA,QACA,KACA;AACA,KAAI,SAAS,MAAM,KAAK,MAAM;AAC5B,MAAI,OAAQ,QAAO;AACnB,QAAM,IAAI,MACR,mBAAmB,MAAM,GAAG,OAAO,IAAI,CAAC,0BACzC;;CAGH,MAAM,QAAQ,MAAM,IAAI,MAAM;AAE9B,KAAI,iBAAiB,MAAO,SAAQ,MAAM;AAE1C,KAAI,OAAO,SAAS,UAAU,MAAM,KAAM,QAAO;AAEjD,OAAM,OAAO;AAEb,KAAI,CAAC,OAAQ,OAAM,OAAO,IAAI;AAE9B,KAAI,IAAK,OAAM,OAAO,KAAK,MAAM;AAEjC,QAAO;;;;;;;;AAST,SAAS,MAAM,OAAc,KAAc,OAAgB;CACzD,IAAI,OAAO,MAAM,IAAI,MAAM;AAE3B,KAAI,CAAC,MAAM;AACT,MAAI,EAAE,iBAAiB,OAAQ;AAC/B,QAAM,IAAI,OAAQ,uBAAO,IAAI,KAAK,CAAE;;CAGtC,IAAI,QAAQ,KAAK,IAAI,IAAI;AAEzB,KAAI,CAAC,OAAO;AACV,MAAI,EAAE,iBAAiB,OAAQ;AAC/B,OAAK,IAAI,KAAM,QAAQ,MAAM,MAAM,CAAE;;AAGvC,OAAM,MAAM;;;AAId,SAAS,MAAM;AACb,SAAQ,OAAQ,KAAK,QAAQ,GAAG,MAC7B,SAAS,GAAG,CACZ,UAAU,GAAG,EAAE,CACf,aAAa;;AAKlB,SAAS,OAAO,IAAe;AAC7B,QAAO,OAAO,IAAI,GAAG,IAAI;;AAW3B,SAAS,OAAO,OAAe,OAAsB;AACnD,KAAI,UAAU,SAAS,EAAG,QAAO,OAAO,IAAI,MAAe;AAC3D,KAAI,OAAO,IAAI,MAAe,CAAE,QAAO;AACvC,QAAO,IAAI,OAAgB,SAAS,KAAK;AACzC,QAAO"}
1
+ {"version":3,"file":"state.js","names":[],"sources":["../src/state.ts"],"sourcesContent":["import { Context, join } from './context';\nimport { Caught } from './caught';\nimport {\n capture,\n event,\n listener,\n Observer,\n observer,\n queued,\n touch,\n watch\n} from './observable';\n\nconst define = Object.defineProperty;\n\n/** Register for all active states via string identifiers (usually unique). */\nconst ID = new WeakMap<State, string>();\n\n/** Internal state assigned to states. */\nconst STORE = new WeakMap<State, Record<string | number | symbol, unknown>>();\n\n/** States under construction - added on `new`, removed when activated or released.\n * Also carries work to run at the deadline, which `def` uses to bound its registry. */\nconst PENDING = new Set<State | (() => void)>();\n\n/** External lifecycle listeners for any given State class. */\ntype Handler = State.Init<any> | State.On<any>;\n\nconst SETUP = new WeakMap<State.Extends, Set<Handler>>();\n\n/** Parent-child relationships. */\nconst PARENT = new WeakMap<object, State | null>();\n\n/** Reference bound instance methods, or their getter, to real one. */\nconst UNBIND = new WeakMap<any, any>();\n\n/** List of methods defined by a given type. */\nconst METHODS = new WeakMap<Function, Map<string, (value: any) => void>>();\n\n/** List of reactive getters defined by a given type. */\nconst GETTERS = new WeakMap<Function, Map<string, () => unknown>>();\n\n/** Replacement for a getter captured by live computed properties, for hot patching. */\nconst LATEST = new WeakMap<Function, Function>();\n\n/** Method implementations replaced by a hot patch. */\nconst PAST = new WeakSet<Function>();\n\n/** Live instances, tracked once hot patching is enabled. */\nlet LIVE: Set<WeakRef<State>> | undefined;\n\n/** Bootstrapped subclasses of each class, tracked once hot patching is enabled. */\nconst SUBCLASSES = new WeakMap<Function, Set<State.Extends>>();\n\n/** Event every observer treats as watched, forcing a refresh after a hot patch. */\nconst REFRESH = Symbol.for('@expressive/mvc.refresh');\n\n/** Stale flags for compute closures awaiting refresh on next access. */\nconst STALE = new WeakSet<() => void>();\n\n/** Whether the deadline which drains `PENDING` is already queued for this tick. */\nlet QUEUED = false;\n\n/** Global list each loaded copy of this module adds its `State` to, on first construction. */\nconst COPIES = Symbol.for('@expressive/mvc');\n\nlet ANNOUNCED = false;\n\n/** Adopters for managed properties which have held a child State. */\nconst ADOPT = new WeakMap<State, Map<unknown, (value: unknown) => void>>();\nconst CHILDREN = new WeakMap<State, Set<(child: State) => void>>();\n\ndeclare namespace State {\n /** Any type of State, using own class constructor as its identifier. */\n type Extends<T extends State = State> = (abstract new (...args: any[]) => T) &\n typeof State;\n\n /** A State constructor which may be instanciated. */\n type Type<T extends State = State> = (new (...args: State.Args<T>) => T) &\n Omit<typeof State, never>;\n\n /** State constructor arguments */\n type Args<T extends State = any> = (Args<T> | Init<T> | Assign<T> | void)[];\n\n /**\n * Value of `static global`. A boolean opts a State in or out of the\n * process-global root; a resolver decides at activation, receiving the\n * instance and returning whether it registers - use it to make the choice\n * conditional (e.g. per environment). A bare literal (`= true` / `= false`)\n * seals the choice for subclasses; widen a subclass's `static global` type to\n * `State.Global` to permit a resolver or a later override.\n */\n type Global<T extends State = any> = boolean | ((self: T) => boolean);\n\n /**\n * State constructor callback - runs during activation, in argument order,\n * before the `new()` lifecycle hook (so it may configure state `new()`\n * will observe). Returned function will run when state is destroyed.\n */\n type Init<T extends State = State> = (\n this: T,\n thisArg: T\n ) => Promise<void> | (() => void) | Args<T> | Assign<T> | void;\n\n /**\n * Lifecycle handlers for `State.on`, keyed by when they run. A bare `Init`\n * function passed to `on` is sugar for `{ before }`.\n */\n interface On<T extends State = State> {\n /**\n * Per-class setup, run once when the class is first bootstrapped - before\n * its members are classified and bound. Receives the class, so a handler\n * may inspect or reshape the prototype first. A handler registered on a\n * base class runs for each subclass too.\n */\n type?(type: State.Extends<T>): void;\n\n /**\n * Per-instance setup, run in the `prepare` phase before `observe` and the\n * `new()` hook. Equivalent to passing a bare function to `on`. May return a\n * cleanup, constructor args, or an assign overlay.\n */\n before?(this: T, thisArg: T): void | (() => void) | Promise<void> | Args<T> | Assign<T>;\n\n /**\n * Per-instance setup, run at the `new()` slot - after own values are\n * observed and constructor args applied. May return a cleanup function.\n */\n after?(this: T, self: T): void | (() => void);\n\n /**\n * Receives a `Caught` mvc reports for this State or a subclass - most-derived\n * class first, last registered first. Return it (or a replacement) to pass it\n * on; return nothing to handle it; throw to let it escape uncaught. Passed off\n * the end, a warning logs and anything else is thrown - to the writer for a\n * destroyed write, else uncaught.\n */\n catch?(this: T, error: Caught): Caught | void;\n }\n\n /** Object overlay to override values and methods on a state. */\n type Assign<T> = Record<string, unknown> & {\n [K in Property<T>]?: T[K] extends (...args: infer A) => infer R\n ? (this: T, ...args: A) => R\n : T[K];\n };\n\n /** Subset of `keyof T` not defined by base State. **/\n type Property<T> = Exclude<keyof T, keyof State>;\n\n /** Managed subset of Property<T> - excludes unmanaged `_` keys. **/\n type Field<T> = Exclude<Property<T>, `_${string}`>;\n\n /** Any valid key for state, including but not limited to Field<T>. */\n type Event<T = State> = Field<T> | number | symbol | (string & {});\n\n /** Any event signal dispatched to listeners, including lifecycle meta events. */\n type Signal<T = State> = Event<T> | true | false | null;\n\n /** Export/Import compatible value for a given property in a State. */\n type Export<R> = R extends State\n ? Values<R>\n : R extends { get(): infer T }\n ? T\n : R;\n\n /**\n * Values from current state of given state.\n * Differs from `Values` as values here will drill\n * into \"real\" values held by exotics like ref.Object.\n */\n type Values<T> = { [P in Field<T>]: Export<T[P]> };\n\n /** Object comperable to data found in T. */\n type Partial<T> = { [P in Field<T>]?: Export<T[P]> };\n\n /** Value for a property applied by a state. */\n type Value<T extends State, K extends State.Event<T>> = K extends keyof T\n ? Export<T[K]>\n : unknown;\n\n type Setter<T> = (value: T, previous: T) => T | void;\n\n /** Descriptor config for a managed property. */\n type Apply<T = any> = {\n value?: T;\n get?: ((source: State) => T) | boolean;\n set?: Setter<T> | boolean;\n enumerable?: boolean;\n // destroy?: () => void;\n };\n\n /** Descriptor config for set() overload - enforces type when key is a known field. */\n type Define<T, K> = K extends Field<T> ? Apply<T[K] | Export<T[K]>> : Apply;\n\n type OnEvent<T extends State> = (\n this: T,\n key: Signal<T>,\n source: T\n ) => void | (() => void) | null;\n\n /** Exotic value, where actual value is contained within. */\n type Ref<T = any> = {\n (next: T): void;\n current: T | null;\n };\n\n /**\n * A callback function which is subscribed to parent and updates when accessed properties change.\n *\n * @param current - Current state of this state. This is a proxy which detects properties which\n * where accessed, and thus depended upon to stay current.\n *\n * @param update - Set of properties which have changed, and events fired, since last update.\n *\n * @returns A callback function which will be called when this effect is stale.\n */\n type Effect<T> = (\n this: T,\n current: T,\n update: readonly State.Event<T>[] | undefined\n ) => EffectCallback | Promise<void> | null | void;\n\n /**\n * A callback function returned by effect. Will be called when effect is stale.\n *\n * @param update - `true` if update is pending, `false` effect has been cancelled, `null` if state is destroyed.\n */\n type EffectCallback = (update: boolean | null) => void;\n\n /**\n * A list of keys updated, or events fired, since last update.\n * This may be awaited to get full list (same array) when update is settled.\n */\n type Updated<T extends State> = readonly Event<T>[] &\n PromiseLike<readonly Event<T>[]>;\n}\n\nabstract class State {\n /**\n * Whether an instance activated with no enclosing context registers itself\n * to the process-global root, where `get()` can resolve it from anywhere.\n * `false` (the default) keeps a context-less instance fully functional but\n * private - not injectable, though it can still read declared globals. Opt in\n * with `static readonly global = true`; a resolver (see {@link State.Global})\n * makes the choice conditional. It must be declared per class - a subclass\n * that would inherit a global without its own declaration throws on\n * activation, so an accidental global (a forgotten `Provider`, an extended\n * global) cannot leak into the shared root.\n */\n static readonly global: State.Global = false;\n\n /**\n * Loopback to instance of this state. This is useful when in a subscribed context,\n * to keep write access to `this` after a destructure. You can use it to read variables silently as well.\n **/\n declare is: this;\n\n constructor(...args: State.Args) {\n define(this, 'is', { value: this });\n init(this, args, this.new);\n }\n\n /**\n * Optional lifecycle hook called during State initialization.\n * Can return a cleanup function to run when state is destroyed.\n *\n * It is recommended you protect this method.\n */\n protected new?(): void | (() => void);\n\n /**\n * Pull current values from state. Flattens all states and exotic values recursively.\n *\n * @returns Object with all values from this state.\n **/\n get(): State.Values<this>;\n\n /**\n * Run a function to run automatically when accessed values change.\n *\n * @param effect Function to run, and whenever accessed values change.\n * If effect returns a function, it will be called when a change occurs (syncronously),\n * effect is cancelled, or parent state is destroyed.\n * @returns Function to cancel listener.\n */\n get(effect: State.Effect<this>): () => void;\n\n /**\n * Get value of a property. Will fetch underlying value from exotic values like ref.Object.\n *\n * Any value which implements `get()` (with no arguments) will be treated as such.\n *\n * @param key - Property to get value of.\n * @param required - If true, will throw an error if property is not available.\n * @returns Value of property.\n */\n get<T extends State.Event<this>>(\n key: T,\n required?: boolean\n ): State.Value<this, T>;\n\n /**\n * Check if state is destroyed.\n *\n * @param status - `null` to check if state is destroyed.\n * @returns `true` if state is destroyed, `false` otherwise.\n */\n get(status: null): boolean;\n\n /**\n * Callback when state is to be destroyed.\n *\n * @param callback - Function to call when state is destroyed.\n * @returns Function to cancel listener.\n */\n get(status: null, callback: () => void): () => void;\n\n /** Fetch State of type from context. Throws if not found. */\n get<T extends State>(type: State.Type<T>, required?: true): T;\n\n /** Fetch a State from context. Undefined if not found. */\n get<T extends State>(type: State.Type<T>, required: boolean): T | undefined;\n\n /**\n * Subscribe to State becoming available in context.\n *\n * Will search both up and downstream by default.\n * Normally you can ignore this because State you expect is rarely both.\n *\n * Specify downstream if you only want to watch for State in children, which can be useful if you expect multiple of the same State in different branches of the tree.\n *\n * @param type - Type of State to watch for.\n * @param callback - Function to call when State is found. Will be called immediately if State is already available.\n * @param downstream - If true, will only watch for State in children, if false will only for parents.\n * @returns Function to cancel listener.\n */\n get<T extends State>(\n type: State.Type<T>,\n callback: Context.Expect<T>,\n downstream?: boolean\n ): () => void;\n\n get(\n arg1?: State.Effect<this> | State.Type | string | null,\n arg2?: boolean | Context.Expect | (() => void),\n arg3?: boolean\n ) {\n const self = this.is;\n\n if (arg1 === undefined) return values(self);\n if (State.is(arg1)) return Context.get(self).get(arg1, arg2, arg3, self);\n if (typeof arg1 == 'function') return watch(self, unbind(arg1));\n if (typeof arg2 == 'function') return callback(self, arg2, arg1);\n if (arg1 === null) return observer(self) === null;\n return access(self, arg1, arg2);\n }\n\n /**\n * Get update in progress.\n *\n * @returns Promise which resolves object with updated values, `undefined` if there no update is pending.\n **/\n set(): State.Updated<this>;\n\n /**\n * Merge argument with current state, updating one or more properties at once.\n * Properties which are not managed by this state will be ignored.\n *\n * @param assign - Object with properties to update.\n * @param silent - If true, listeners will not be notified. If state is destroyed, drops the update without reporting it.\n * @returns Array of keys updated, syncronously contains keys updated immediately and may be resolved (to itself) when all updates are settled.\n */\n set(assign?: State.Assign<this>, silent?: boolean): State.Updated<this>;\n\n /**\n * Call a function when update occurs.\n *\n * Given function is called for every assignment (which changes value) or explicit `set`.\n *\n * To run logic on final value only, callback may return a function. The same\n * function for one or more events will be called only once when update is settled.\n *\n * Return `null` from callback to stop listening.\n *\n * @param callback - Function to call when update occurs.\n * @returns Function to remove listener. Will return `true` if removed, `false` if inactive already.\n */\n set(callback: State.OnEvent<this>): () => boolean;\n\n /**\n * Push an update. This will not change the value of associated property.\n *\n * Useful where a property value internally has changed, but the object is the same.\n * For example: An array has pushed a new value, or a nested property is updated.\n *\n * You can also use this to dispatch arbitrary events.\n * Symbols are recommended as non-property events, however you can use any string.\n * If doing so, be sure to avoid collisions using property names. An easy way to do this is\n * to prefix an event with \"!\" and/or use dash-case. e.g. `set(\"!event\")` or `set(\"my-event\")`.\n *\n * @param key - Property or event to dispatch.\n * @returns Promise resolves an array of keys updated.\n */\n set(key: State.Event<this>): State.Updated<this>;\n\n /**\n * Declare an end to updates. This event is final and will freeze state.\n * This event can be watched for as well, to run cleanup logic and internally will remove all listeners.\n *\n * @param status - `null` to end updates.\n */\n set(status: null): void;\n\n /**\n * Register a callback for a specific property or event.\n *\n * Callback receives the key, current value, and source instance.\n *\n * @param event - Property or event to watch. If `null`, will callback on destroy.\n * @param callback - Function to call when event occurs.\n * @returns Function to remove listener.\n */\n set<K extends State.Event<this>>(\n event: K | null,\n callback: State.OnEvent<this>\n ): () => boolean;\n\n /**\n * Define or update a managed property using a descriptor config.\n * If the property already is managed, config will only accept value.\n * If the property does not exist, it will be created and made reactive.\n *\n * @param key - Property to define or update.\n * @param config - Descriptor config with value, get, set, enumerable, and/or destroy.\n * @returns Promise resolves an array of keys updated.\n */\n set<K extends State.Event<this>>(\n key: K,\n config: State.Define<this, K>\n ): State.Updated<this>;\n\n set(\n arg1?: State.OnEvent<this> | State.Assign<this> | State.Event<this> | null,\n arg2?: unknown\n ) {\n const self = this.is;\n\n if (typeof arg1 == 'function')\n return listener(self, (key) => {\n if (\n typeof key == 'string' ||\n typeof key == 'number' ||\n typeof key == 'symbol' && key !== REFRESH\n )\n return arg1.call(self, key, self);\n });\n\n if (typeof arg2 == 'function')\n return callback(self, arg2, arg1 as State.Signal);\n\n if (arg1 && typeof arg1 == 'object') assign(self, arg1, arg2 === true);\n else if (arg2) apply(self, arg1 as string, arg2);\n else event(self, arg1);\n\n return queued(self) as State.Updated<this>;\n }\n\n /**\n * Iterate over managed properties in this instance of State.\n * Yeilds the key and current value for each property.\n */\n [Symbol.iterator](): Iterator<[string, unknown]> {\n return Object.entries(STORE.get(this.is)!)[Symbol.iterator]();\n }\n\n /**\n * Create and activate a new instance of this state.\n *\n * **Important** - Unlike `new this(...)` - this method also activates state.\n *\n * @param args - arguments sent to constructor\n */\n static new<T extends State>(this: State.Type<T>, ...args: State.Args<T>): T {\n const instance = new this(...args);\n event(instance);\n return instance;\n }\n\n /**\n * Static equivalent of `x instanceof this`.\n * Determines if provided class is a subtype of this one.\n * If so, language server will make available all static\n * methods and properties of this class.\n */\n static is<T extends State.Extends>(this: T, maybe: unknown): maybe is T {\n return (\n maybe === this ||\n (typeof maybe == 'function' && maybe.prototype instanceof this)\n );\n }\n\n /**\n * Register a lifecycle handler for this State and its subclasses.\n *\n * A bare function is per-instance setup run in the `prepare` phase (sugar for\n * `{ before }`); if it returns a function, that runs when the instance is\n * destroyed. Pass a {@link State.On} object to hook by cadence - `type`\n * (per-class, at bootstrap), `before` (per-instance, before `new()`), and\n * `after` (per-instance, at the `new()` slot).\n *\n * @returns Function to remove the handler.\n */\n static on<T extends State>(\n this: State.Extends<T>,\n handler: State.Init<T> | State.On<T>\n ) {\n let setup = SETUP.get(this);\n\n if (!setup) SETUP.set(this, (setup = new Set()));\n\n setup.add(handler);\n\n return () => setup.delete(handler);\n }\n}\n\ndefine(State.prototype, 'toString', {\n value() {\n return ID.get(this.is);\n }\n});\n\ndefine(State, 'toString', {\n value() {\n return this.name;\n }\n});\n\n/** Register a user OnEvent callback, preserving `this` and `source`. */\nfunction callback<T extends State>(\n self: T,\n cb: Function,\n select?: Observer.Signal | Set<Observer.Signal>\n) {\n return listener(self, (key) => cb.call(self, key, self), select);\n}\n\n/**\n * Apply state arguemnts, run callbacks and observe properties.\n * Accumulate and handle cleanup events.\n **/\nfunction init(state: State, ...args: State.Args) {\n const T = state.constructor as State.Extends;\n\n if (T === State) throw new Error('Cannot create base State.');\n\n if (!ANNOUNCED) {\n ANNOUNCED = true;\n ((globalThis as { [COPIES]?: unknown[] })[COPIES] ||= []).push(State);\n }\n\n const { before, after } = bootstrap(T);\n\n ID.set(state, `${T}-${uid()}`);\n STORE.set(state, {});\n LIVE?.add(new WeakRef(state));\n\n function observe() {\n for (const key in state) {\n const desc: PropertyDescriptor = Object.getOwnPropertyDescriptor(state, key) || {};\n\n if (!('value' in desc) || !desc.configurable) continue;\n\n if (key[0] == '_') unmanaged(state, key, desc.value);\n else apply(state, key, desc, true);\n }\n }\n\n function register() {\n if (Context.get(state) !== Context.root) return;\n\n const type = state.constructor as typeof State;\n const g = type.global;\n\n if (!(typeof g == 'function' ? g(state) : g)) return;\n\n if (!Object.prototype.hasOwnProperty.call(type, 'global'))\n throw new Error(\n `${state} would register as a global by inheritance alone - re-declare \\`static global\\` on ${type.name} (\\`true\\` to keep it, \\`false\\` to opt out).`\n );\n\n return Context.root.add(state);\n }\n\n listener(state, (key) => {\n const rest = trailing(state);\n\n PENDING.delete(state);\n\n if (key === null) return null;\n\n parent(state, null);\n\n const queue = [...before, observe, ...args, ...after, register];\n\n capture((release) => {\n listener(state, () => release(null), null);\n\n for (let i = 0; i < queue.length; i++) {\n const arg = queue[i];\n const out = typeof arg == 'function' ? arg.call(state, state) : arg;\n\n if (out instanceof Promise)\n out.catch((err) => report(new Caught.Init(state, err)));\n else if (Array.isArray(out)) queue.splice(i + 1, 0, ...out);\n else if (typeof out == 'function') listener(state, out, null);\n else if (typeof out == 'object') assign(state, out, true);\n }\n });\n\n let end = rest.length;\n\n while (end-- > 0 && PENDING.has(rest[end]));\n\n for (let i = 0; i < end; i++) PENDING.delete(rest[i]);\n\n return null;\n });\n\n if (!QUEUED) {\n QUEUED = true;\n\n queueMicrotask(() => {\n QUEUED = false;\n\n for (const item of PENDING)\n if (typeof item == 'function') item();\n else report(new Caught.Inactive(item));\n\n PENDING.clear();\n });\n }\n\n PENDING.add(state);\n}\n\nfunction unmanaged(state: State, key: string, value: unknown) {\n define(state, key, {\n configurable: true,\n enumerable: false,\n get: () => value,\n set: (next) => { value = next }\n });\n}\n\n/**\n * Apply instructions and inherited event listeners. Ensure class metadata is ready.\n *\n * @param T - State class to bootstrap.\n * @return Array of init functions to run on instance, in order of class hierarchy.\n */\nfunction bootstrap(T: State.Extends) {\n const chain = [] as State.Extends[];\n const before = new Set<State.Init>();\n const after = new Set<State.Init>();\n const onType = new Set<NonNullable<State.On['type']>>();\n let keys = new Map<string, (value: any) => void>();\n let getters = new Map<string, () => unknown>();\n\n while (true) {\n chain.unshift(T);\n if (T === State) break;\n T = Object.getPrototypeOf(T);\n }\n\n for (const type of chain) {\n for (const handler of SETUP.get(type) || [])\n if (typeof handler == 'function') before.add(handler);\n else {\n if (handler.before) before.add(handler.before);\n if (handler.after) after.add(handler.after);\n if (handler.type) onType.add(handler.type);\n }\n\n if (type === State) continue;\n\n if (METHODS.has(type)) {\n keys = METHODS.get(type)!;\n getters = GETTERS.get(type)!;\n continue;\n }\n\n for (const setupType of onType) setupType(type);\n\n if (LIVE) {\n const parent = Object.getPrototypeOf(type);\n let children = SUBCLASSES.get(parent);\n\n if (!children) SUBCLASSES.set(parent, (children = new Set()));\n children.add(type);\n }\n\n METHODS.set(type, (keys = new Map(keys)));\n GETTERS.set(type, (getters = new Map(getters)));\n\n classify(type, keys, getters);\n }\n\n if (getters.size)\n before.add((self) => getters.forEach(compute, self));\n\n return { before, after };\n}\n\n/** Bind own configurable methods of a type and collect its reactive getters. */\nfunction classify(\n type: State.Extends,\n keys: Map<string, (value: any) => void>,\n getters: Map<string, () => unknown>\n) {\n for (const [key, desc] of Object.entries(\n Object.getOwnPropertyDescriptors(type.prototype)\n )) {\n if (key == 'constructor' || !desc.configurable) continue;\n\n const { get, set } = desc;\n\n if (key[0] == '_' && (get || set)) {\n define(type.prototype, key, {\n ...desc,\n get: get && function (this: State) { return get.call(this.is || this) },\n set: set && function (this: State, value: unknown) { set.call(this.is || this, value) }\n });\n\n continue;\n }\n\n if (typeof get == 'function') {\n if (typeof set != 'function') getters.set(key, get);\n\n continue;\n }\n\n const { value } = desc;\n\n if (typeof value !== 'function') continue;\n\n function bind(this: State, original?: Function) {\n const { is } = this;\n\n if (is.hasOwnProperty(key) && !original) return value as Function;\n\n const fn = original || value;\n const bound = fn.bind(is);\n\n UNBIND.set(bound, fn);\n define(is, key, { value: bound, writable: true, configurable: true });\n\n return bound;\n }\n\n UNBIND.set(bind, value);\n\n keys.set(key, bind);\n define(type.prototype, key, { get: bind, set: bind });\n }\n}\n\n/**\n * Install a reactive computed property on a state instance, derived from a prototype\n * getter or an arity-bearing `set` factory.\n *\n * The getter is invoked with the tracking proxy as both `this` and its first argument;\n * reads of managed properties through it create subscriptions. Result is cached and\n * emits a keyed event when stale.\n */\nfunction compute(this: State, getter: (self: any) => unknown, key: string) {\n const store = STORE.get(this)!;\n let reset: (() => void) | undefined;\n let isAsync: boolean;\n let proxy: any;\n\n const connect = () => {\n reset = watch(\n this,\n (current) => {\n proxy = current;\n\n if (!(key in store) || STALE.delete(run)) run(!reset);\n\n return (didUpdate) => {\n if (didUpdate) {\n STALE.add(run);\n event(this, key, true);\n }\n };\n },\n false\n );\n };\n\n const run = (initial?: boolean) => {\n let next: unknown;\n\n try {\n next = latest(getter).call(proxy, proxy);\n } catch (err) {\n if (initial) {\n console.warn(`An exception was thrown while initializing ${this}.${key}.`);\n throw err;\n }\n\n if (!(err instanceof Promise)) report(new Caught.Getter(this, key, err));\n }\n\n update(this, key, next, !isAsync);\n };\n\n apply(\n this,\n key,\n {\n enumerable: true,\n set: false,\n get: () => {\n if (!proxy) {\n if (observer(this) === null) return store[key];\n\n connect();\n isAsync = true;\n }\n\n if (STALE.delete(run)) run();\n\n return access(this, key, !proxy);\n }\n },\n true\n );\n}\n\n/**\n * Define or update a managed property using a descriptor config.\n * If the property already is managed, config will only accept value.\n * If the property does not exist, it will be created and made reactive.\n *\n * @param state - State to apply property to.\n * @param key - Property to define or update.\n * @param config - Descriptor config with value, get, set, enumerable, and/or destroy.\n * @param silent - If an update does occur, listeners will not be refreshed automatically.\n */\nfunction apply(\n state: State,\n key: string,\n config: State.Apply,\n silent?: boolean\n) {\n const desc = Object.getOwnPropertyDescriptor(state, key);\n\n if (desc && 'get' in desc) {\n if (Object.keys(config).some((k) => k != 'value'))\n throw new Error(`Property ${key} on ${state} is already defined.`);\n if ('value' in config) update(state, key, config.value, silent);\n return;\n }\n\n function set(value: unknown, silent?: boolean) {\n update(state, key, value, silent, true);\n }\n\n define(state, key, {\n configurable: true,\n enumerable: config.enumerable !== false,\n get(this: State) {\n const value =\n typeof config.get == 'function'\n ? config.get(this)\n : access(state, key, config.get);\n\n return touch(this, key, value);\n },\n set(next: any, silent?: boolean) {\n if (config.set === false)\n throw new Error(`${state}.${String(key)} is read-only.`);\n\n if (typeof config.set == 'function')\n try {\n const output = config.set(next, STORE.get(state)![key]);\n if (output !== undefined) next = output;\n } catch (err: unknown) {\n if (err === false) return;\n if (err === true) {\n set(next, true);\n return;\n }\n throw err;\n }\n\n set(next, silent);\n }\n });\n\n if ('value' in config) set(config.value, silent);\n}\n\nfunction provides(ctx: Context, value: State) {\n while (ctx = ctx.parent!) {\n const entries = ctx.provide.get(value.constructor as State.Extends);\n if (entries) for (const [state] of entries) if (state === value) return true;\n }\n}\n\nfunction child(state: State) {\n let cleanup: (() => void) | undefined;\n const ctx = Context.get(state);\n\n function reset() {\n if (cleanup) cleanup();\n cleanup = undefined;\n }\n\n listener(state, reset, null);\n\n return (value: unknown) => {\n reset();\n\n if (!(value instanceof State)) return;\n\n if (parent(value, state)) {\n const remove = join(state, value);\n cleanup = () => {\n cancel();\n remove();\n event(value, null);\n };\n const cancel = listener(state, cleanup, null);\n } else if (!provides(ctx, value)) {\n cleanup = join(state, value);\n }\n\n event(value);\n\n CHILDREN.get(state)?.forEach((cb) => cb(value));\n };\n}\n\n/**\n * Pending States constructed after this one - in a parent, the products of\n * its own initializers, until the last one it kept.\n */\nfunction trailing(state: State) {\n const rest: State[] = [];\n let seen = false;\n\n for (const item of PENDING)\n if (!seen) seen = item === state;\n else if (item instanceof State) rest.push(item);\n\n return rest;\n}\n\n/**\n * Report States adopted by a parent - those already held, then each one\n * claimed later. Returns a callback to stop watching.\n */\nfunction children(state: State, callback: (child: State) => void) {\n const store = STORE.get(state)!;\n const keys = ADOPT.get(state);\n\n if (keys)\n for (const key of keys.keys()) {\n const value = store[key as string];\n if (value instanceof State) callback(value);\n }\n\n let set = CHILDREN.get(state);\n\n if (!set) CHILDREN.set(state, (set = new Set()));\n\n set.add(callback);\n\n return () => set!.delete(callback);\n}\n\n/** Currently accumulating export. Stores real values of placeholder properties such as ref() or child states. */\nlet EXPORT: Map<any, any> | undefined;\n\nfunction values<T extends State>(state: T): State.Values<T> {\n const values = {} as any;\n let notRecursive;\n\n if (!EXPORT) {\n notRecursive = true;\n EXPORT = new Map();\n }\n\n EXPORT.set(state, values);\n\n for (let [key, value] of state) {\n if (EXPORT.has(value)) value = EXPORT.get(value);\n else if (\n value &&\n typeof value == 'object' &&\n 'get' in value &&\n typeof value.get === 'function'\n )\n value = value.get();\n\n values[key] = value;\n }\n\n if (notRecursive) EXPORT = undefined;\n\n return Object.freeze(values);\n}\n\nfunction access(state: State, property: string, required?: boolean) {\n const store = STORE.get(state)!;\n\n if (property in store || required === false) {\n const value = store[property];\n\n if (value !== undefined || !required) return value;\n }\n\n if (METHODS.get(state.constructor)!.has(property))\n return unbind((state as any)[property]);\n\n if (observer(state) === null) return undefined;\n\n const error = new Error(`${state}.${property} is not yet available.`);\n const promise = new Promise<any>((resolve, reject) => {\n listener(state, (key) => {\n if (key === property) {\n resolve(store[key]);\n return null;\n }\n\n if (key === null) {\n reject(new Error(`${state} is destroyed.`));\n }\n });\n });\n\n throw Object.assign(promise, {\n toString: () => String(error),\n name: 'Suspense',\n message: error.message,\n stack: error.stack\n });\n}\n\nfunction assign(state: State, data: State.Assign<State>, silent?: boolean) {\n if (!silent && observer(state) !== null) event(state);\n\n const methods = METHODS.get(state.constructor)!;\n const getters = GETTERS.get(state.constructor);\n\n for (const key in data) {\n const bind = methods.get(key);\n\n if (bind) bind.call(state, data[key]);\n else if (getters?.has(key)) continue;\n else if (key in state && key !== 'is') {\n const desc: PropertyDescriptor = Object.getOwnPropertyDescriptor(state, key) || {};\n const set = desc.set as (value: any, silent?: boolean) => void;\n\n if (set) {\n set.call(state, data[key], silent);\n } else {\n Reflect.set(state, key, data[key]);\n }\n }\n }\n}\n\n/**\n * Update a property on a state instance and notify listeners.\n *\n * This is used internally to update properties, but can also be used to update properties which are not managed by state, or to update values without triggering setters.\n *\n * A destroyed state reports the write - thrown to the writer unless a `catch` handler takes it - and returns `false`; `silent` skips both, and dispatch.\n */\nfunction update<T>(\n state: State,\n key: State.Event<T>,\n value: T,\n silent?: boolean,\n own?: boolean\n) {\n if (observer(state) === null) {\n if (!silent) report(new Caught.Destroyed(state, String(key)), true);\n return false;\n }\n\n const store = STORE.get(state)!;\n\n if (value instanceof State) value = value.is as T;\n\n if (key in store && value === store[key]) return false;\n\n store[key] = value;\n\n if (!silent) event(state, key);\n\n if (own) adopt(state, key, value);\n\n return true;\n}\n\n/**\n * Pass a caught error along `catch` handlers - most-derived class first, last registered\n * first - until one returns nothing. Passed off the end, a warning logs and anything\n * else is thrown - to the caller when `sync`, else uncaught. So is a handler's throw,\n * and one wrapping an error a handler already threw escapes that error unreported.\n */\nfunction report(caught: Caught, sync?: boolean) {\n const handlers = new Set<NonNullable<State.On['catch']>>();\n let error: Caught | void = caught;\n\n if (caught.cause instanceof Caught) return escape(caught.cause);\n\n for (let T = caught.state.constructor as State.Extends; ; T = Object.getPrototypeOf(T)) {\n for (const handler of [...(SETUP.get(T) || [])].reverse())\n if (typeof handler == 'object' && handler.catch) handlers.add(handler.catch);\n\n if (T === State) break;\n }\n\n try {\n for (const handler of handlers) if (!(error = handler.call(caught.state, error))) return;\n } catch (err) {\n if (sync) throw err;\n return escape(err);\n }\n\n if (error.warning) console.warn(error);\n else if (sync) throw error;\n else escape(error);\n}\n\nfunction escape(err: unknown) {\n queueMicrotask(() => {\n throw err;\n });\n}\n\n/** Error thrown by a handler replaying in dispatch, attributed to the State which queued it. */\nfunction fault(err: unknown, owner?: object) {\n const state = owner instanceof State ? owner : owner && PARENT.get(owner);\n\n if (state) report(new Caught.Effect(state, err));\n else escape(err);\n}\n\n/**\n * Hand a value stored by an owning writer to that property's adopter,\n * creating one the first time a State is stored there. A property which has\n * held a State keeps its adopter, so a later non-State value releases the\n * previous child.\n */\nfunction adopt(state: State, key: unknown, value: unknown) {\n let keys = ADOPT.get(state);\n\n if (!keys) {\n if (!(value instanceof State)) return;\n ADOPT.set(state, (keys = new Map()));\n }\n\n let claim = keys.get(key);\n\n if (!claim) {\n if (!(value instanceof State)) return;\n keys.set(key, (claim = child(state)));\n }\n\n claim(value);\n}\n\n/** Resolve a getter to its latest hot-patched replacement. */\nfunction latest(getter: Function) {\n for (let next; (next = LATEST.get(getter)); ) getter = next;\n return getter;\n}\n\n/** Begin tracking live instances, so a hot patch can reach them. */\nfunction track() {\n LIVE ||= new Set();\n}\n\n/**\n * Move the members of `next` onto `prev`, which keeps its identity. Returns the\n * live instances of `prev`, each needing a refresh.\n */\nfunction patch(prev: State.Extends, next: State.Extends, own: Handler[]): State[] {\n const proto = prev.prototype;\n const incoming = Object.getOwnPropertyDescriptors(next.prototype);\n const keys = METHODS.get(prev);\n const getters = GETTERS.get(prev);\n const methods = new Map<string, Function>();\n const knownKeys = new Set(keys?.keys());\n const knownGetters = new Set(getters?.keys());\n\n let setup = SETUP.get(prev);\n\n for (const handler of own) setup!.delete(handler);\n\n for (const handler of handlers(next)) {\n if (!setup) SETUP.set(prev, (setup = new Set()));\n setup.add(handler);\n }\n\n for (const key of Reflect.ownKeys(next)) {\n if (key == 'prototype' || key == 'length' || key == 'name') continue;\n\n if (Object.getOwnPropertyDescriptor(prev, key)?.configurable !== false)\n define(prev, key, Object.getOwnPropertyDescriptor(next, key)!);\n }\n\n const removed = new Set<string>();\n\n for (const key of Object.getOwnPropertyNames(proto))\n if (key != 'constructor' && !(key in incoming)) {\n const bind = keys?.get(key);\n\n if (bind && Object.getOwnPropertyDescriptor(proto, key)!.get === bind) {\n PAST.add(UNBIND.get(bind));\n keys!.delete(key);\n }\n\n removed.add(key);\n Reflect.deleteProperty(proto, key);\n getters?.delete(key);\n }\n\n for (const [key, desc] of Object.entries(incoming)) {\n if (key == 'constructor') continue;\n\n const current = Object.getOwnPropertyDescriptor(proto, key);\n\n if (typeof desc.value == 'function') methods.set(key, desc.value);\n\n if (current?.configurable === false) {\n if (current.writable) (proto as any)[key] = desc.value;\n continue;\n }\n\n if (current?.get && keys?.get(key) === current.get) PAST.add(UNBIND.get(current.get));\n\n const getter = getters?.get(key);\n\n if (getter) LATEST.set(getter, desc.get!);\n\n define(proto, key, { ...desc, configurable: true });\n }\n\n if (keys) {\n for (let T: State.Extends = prev; ; T = Object.getPrototypeOf(T)) {\n for (const handler of SETUP.get(T) || [])\n if (typeof handler == 'object' && handler.type) handler.type(prev);\n\n if (T === State) break;\n }\n\n classify(prev, keys, getters!);\n }\n\n const live: State[] = [];\n\n for (const ref of LIVE!) {\n const state = ref.deref();\n\n if (!state) LIVE!.delete(ref);\n else if (state instanceof prev) live.push(state);\n }\n\n const descendants = new Set([prev, ...live.map((state) => state.constructor as State.Extends)]);\n\n for (const type of descendants) for (const child of SUBCLASSES.get(type) || []) descendants.add(child);\n\n descendants.delete(prev);\n\n for (const type of descendants) {\n const inherit = METHODS.get(type)!;\n const computed = GETTERS.get(type)!;\n\n for (const [key, bind] of keys!) if (!knownKeys.has(key) && !inherit.has(key)) inherit.set(key, bind);\n for (const [key, get] of getters!) if (!knownGetters.has(key) && !computed.has(key)) computed.set(key, get);\n for (const key of removed)\n if (!(key in type.prototype)) {\n inherit.delete(key);\n computed.delete(key);\n }\n }\n\n for (const state of live) {\n for (const [key, value] of methods) {\n const desc = Object.getOwnPropertyDescriptor(state, key);\n\n if (!desc) continue;\n\n if (desc.set) desc.set.call(state, value);\n else if (PAST.has(UNBIND.get(desc.value))) delete (state as any)[key];\n }\n\n for (const key of removed)\n if (PAST.has(UNBIND.get(Object.getOwnPropertyDescriptor(state, key)?.value))) delete (state as any)[key];\n\n for (const [key, get] of GETTERS.get(state.constructor)!)\n if (!knownGetters.has(key) && get === getters!.get(key)) compute.call(state, get, key);\n }\n\n return live;\n}\n\n/** Lifecycle handlers registered on a class itself. */\nfunction handlers(type: State.Extends): Handler[] {\n return [...(SETUP.get(type) || [])];\n}\n\n/** Random alphanumberic of length 6; always starts with a letter. */\nfunction uid() {\n return (0.278 + Math.random() * 0.722)\n .toString(36)\n .substring(2, 8)\n .toUpperCase();\n}\n\nfunction unbind<T extends Function>(fn: T): T;\nfunction unbind<T extends Function>(fn?: T): T | undefined;\nfunction unbind(fn?: Function) {\n return UNBIND.get(fn) || fn;\n}\n\n/**\n * Read or claim a parent for a given child. In read mode (one argument) returns\n * the current parent, or `undefined` if never assigned. In write mode assigns\n * only if unclaimed and returns whether the assignment applied - `true` means\n * this call freshly claimed it, `false` means it was already parented.\n */\nfunction parent(child: object): State | null | undefined;\nfunction parent(child: object, value: State | null): boolean;\nfunction parent(child: object, value?: State | null) {\n if (arguments.length < 2) return PARENT.get(child as State);\n if (PARENT.has(child as State)) return false;\n PARENT.set(child as State, value ?? null);\n return true;\n}\n\nexport { event, unbind, State, parent, children, trailing, PENDING, STORE, uid, access, update, apply, compute, fault, patch, track, handlers };\n"],"mappings":"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"}