wana
Version:
Easy observable state for React
1 lines • 45.1 kB
Source Map (JSON)
{"version":3,"file":"2f8394f9.mjs","sources":["../../src/batch.ts","../../src/emit.ts","../../src/iterators.ts","../../src/proxy.ts","../../src/observable.ts","../../src/auto.ts","../../src/derive.ts","../../src/o.ts","../../src/when.ts","../../src/watch.ts","../../src/mountAuto.ts"],"sourcesContent":["import queueMicrotask from '@alloc/queue-microtask'\nimport { batchedUpdates } from 'react-batched-updates'\n\ntype Effect = () => void\n\n/** The FIFO queue of async `Auto` updates */\nlet runQueue: Effect[] = []\n\n/** The queue of `withAuto` updates. Sorted by deepest child last */\nconst renderQueue: RenderConfig[] = []\ntype RenderConfig = { depth: number; effect: Effect }\n\nexport interface Batch {\n /**\n * Run the given effect in the next microtask, immediately before\n * rendering any components with stale observations.\n *\n * To avoid infinite loops, the \"run\" step only runs the first 100,000\n * effects in any given microtask. Any remaining effects are scheduled\n * for the next microtask.\n */\n run(effect: Effect): void\n /**\n * The \"render\" step is sorted by `withAuto` depth.\n * After the \"run\" step, all `Auto` objects are updated, and `withAuto`\n * components can render now.\n */\n render(depth: number, effect: Effect): void\n}\n\nexport const batch: Batch = {\n run(effect) {\n runQueue.push(effect)\n flushAsync()\n },\n render(depth, effect) {\n let i = renderQueue.findIndex(other => other.depth > depth)\n if (i < 0) i = renderQueue.length\n renderQueue.splice(i, 0, { depth, effect })\n flushAsync()\n },\n}\n\nlet isQueued = false\nfunction flushAsync() {\n if (!isQueued) {\n isQueued = true\n queueMicrotask(() => {\n isQueued = false\n if (flushSync()) {\n flushAsync()\n }\n })\n }\n}\n\n/**\n * Flush the queue of delayed reactions.\n *\n * Returns `true` if the queue wasn't flushed entirely.\n *\n * Useful when testing `wana`-integrated components/hooks.\n */\nexport function flushSync() {\n batchedUpdates(() => {\n // Run any pending reactions.\n let runs = 0\n for (const effect of runQueue) {\n if (++runs > 1e5) break\n effect()\n }\n\n // Postpone remaining runs until next flush.\n runQueue = runQueue.slice(runs)\n\n // Stale components always rerender after reactions.\n renderQueue.forEach(({ effect }) => effect())\n renderQueue.length = 0\n })\n\n return !!(runQueue.length || renderQueue.length)\n}\n","import { is } from '@alloc/is'\nimport { globals } from './globals'\nimport { noto } from './noto'\nimport { Change, Observable, ObservedSlot, ObserverTarget } from './observable'\nimport { $O, SIZE } from './symbols'\n\nconst { get } = Map.prototype\n\nfunction onChange(observable: Observable, key: any, change: Change) {\n const observers: ObservedSlot = get.call(observable, key)\n if (observers) {\n // Increase the nonce even if no observers exist, because there\n // might be a pending observer (like a \"withAuto\" component).\n observers.nonce++\n observers.onChange(change)\n }\n}\n\nfunction emit(target: ObserverTarget, change: Change) {\n noto(() => {\n const observable = target[$O]!\n if (globals.onChange) {\n globals.onChange(change)\n }\n\n // The \"clear\" op never has a key.\n if (change.op !== 'clear') {\n onChange(observable, change.key, change)\n }\n // When a `Map` object is cleared, notify every key observer.\n else if (is.map(change.oldValue)) {\n change.oldValue.forEach((_, key) => onChange(observable, key, change))\n }\n\n // Size changes always come after a related change,\n // so avoid notifying `$O` observers more than once.\n if (change.key !== SIZE) {\n onChange(observable, $O, change)\n }\n })\n return true\n}\n\nexport const emitAdd = (target: object, key: any, value: any) =>\n emit(target, {\n op: 'add',\n target,\n key,\n value,\n })\n\nexport const emitRemove = (target: object, key: any, oldValue: any) =>\n emit(target, {\n op: 'remove',\n target,\n key,\n oldValue,\n })\n\nexport const emitReplace = (\n target: object,\n key: any,\n value: any,\n oldValue: any\n) =>\n emit(target, {\n op: 'replace',\n target,\n key,\n value,\n oldValue,\n })\n\nexport const emitSplice = (\n target: any[],\n key: number,\n value: readonly any[],\n oldValue: readonly any[]\n) =>\n emit(target, {\n op: 'splice',\n target,\n key,\n value,\n oldValue,\n })\n\nexport const emitClear = (target: object, oldValue: any) =>\n emit(target, {\n op: 'clear',\n target,\n oldValue,\n })\n\nexport const emitDefine = (\n target: object,\n key: keyof any,\n value: PropertyDescriptor,\n oldValue?: PropertyDescriptor\n) =>\n emit(target, {\n op: 'define',\n target,\n key,\n value,\n oldValue,\n })\n","import { observe } from './globals'\nimport { $$, $O } from './symbols'\n\n// These methods observe everything.\nconst observeAll = [\n Symbol.iterator,\n 'entries',\n 'every',\n 'filter',\n 'find',\n 'findIndex',\n 'flat',\n 'flatMap',\n 'forEach',\n 'includes',\n 'indexOf',\n 'join',\n 'keys',\n 'lastIndexOf',\n 'map',\n 'reduce',\n 'reduceRight',\n 'slice',\n 'some',\n 'values',\n]\n\nconst wrapIterators = (ctr: Function) =>\n observeAll.reduce(\n (methods, name) => (\n ctr.prototype[name] &&\n (methods[name] = function(...args: any[]) {\n const self = this[$$]\n observe(self, $O)\n return self[name](...args)\n }),\n methods\n ),\n {} as object\n )\n\nexport const ArrayIterators = wrapIterators(Array)\nexport const MapIterators = wrapIterators(Map)\nexport const SetIterators = wrapIterators(Set)\n","import { is } from '@alloc/is'\nimport {\n emptyArray,\n flop,\n getDescriptor,\n getOwnDescriptor,\n hasOwn,\n nope,\n setHidden,\n} from './common'\nimport {\n emitAdd,\n emitClear,\n emitDefine,\n emitRemove,\n emitReplace,\n emitSplice,\n} from './emit'\nimport { globals, observe } from './globals'\nimport { ArrayIterators, MapIterators, SetIterators } from './iterators'\nimport { noto } from './noto'\nimport { $$, $O, SIZE } from './symbols'\n\nconst ArrayOverrides: any = {\n concat(...args: any[]) {\n const self: any[] = this[$$]\n observe(self, $O)\n args.forEach(arg => {\n arg = arg && arg[$$]\n if (is.array(arg)) {\n observe(arg, $O)\n }\n })\n return noto(() => self.concat(...args))\n },\n copyWithin: flop,\n fill: flop,\n pop() {\n const self: any[] = this[$$]\n const oldLength = self.length\n if (oldLength) {\n const index = oldLength - 1\n const exists = index in self\n const value = self.pop()\n if (exists) emitRemove(self, index, value)\n emitReplace(self, SIZE, index, oldLength)\n return value\n }\n },\n push(...values: any[]): number {\n const self: any[] = this[$$]\n const oldLength = self.length\n if (values.length) {\n const length = self.push(...values)\n emitSplice(self, oldLength, values, emptyArray)\n emitReplace(self, SIZE, length, oldLength)\n return length\n }\n return oldLength\n },\n reverse() {\n const self: any[] = this[$$]\n const oldValue = [...self]\n self.reverse()\n emitSplice(self, 0, [...self], oldValue)\n return this\n },\n shift() {\n const self: any[] = this[$$]\n const oldLength = self.length\n if (oldLength) {\n const exists = 0 in self\n const value = self.shift()\n if (exists) emitRemove(self, 0, value)\n emitReplace(self, SIZE, oldLength - 1, oldLength)\n return value\n }\n },\n sort(compare: (a: any, b: any) => number) {\n const self: any[] = this[$$]\n const oldValue = [...self]\n self.sort(compare)\n emitSplice(self, 0, [...self], oldValue)\n return this\n },\n splice(start: number, removeCount = 0, ...values: any[]): any[] {\n const self: any[] = this[$$]\n const oldLength = self.length\n if (start < 0) {\n start = Math.max(0, start + oldLength)\n } else if (start > oldLength) {\n start = oldLength\n }\n const removed = self.splice(start, removeCount, ...values)\n removeCount = removed.length\n const addCount = values.length\n if (addCount || removeCount) {\n const delta = addCount - removeCount\n emitSplice(self, start, values, [...removed])\n if (delta) emitReplace(self, SIZE, oldLength + delta, oldLength)\n }\n return removed\n },\n unshift(...values: any[]) {\n const self: any[] = this[$$]\n const oldLength = self.length\n if (values.length) {\n const length = self.unshift(...values)\n emitSplice(self, 0, values, emptyArray)\n emitReplace(self, SIZE, length, oldLength)\n return length\n }\n return oldLength\n },\n}\n\nexport const ObjectTraps: ProxyHandler<object> = {\n has: (self, key) => (\n // TODO: Avoid observing \"replace\" events here.\n observe(self, key), Reflect.has(self, key)\n ),\n get(self, key, proxy) {\n if (key === $$) return self\n if (key !== $O) {\n const desc = getDescriptor(self, key)\n const get = desc && desc.get\n if (get) {\n return get.call(proxy)\n }\n // Observe unknown keys and own keys only.\n if (!desc || hasOwn(self, key)) {\n observe(self, key)\n }\n }\n return self[key]\n },\n set(self, key, value, proxy) {\n const desc = getDescriptor(self, key)\n return desc && desc.get\n ? Reflect.set(self, key, value, proxy)\n : setProperty(self, key, value)\n },\n defineProperty(self, key, desc) {\n const prevDesc = getOwnDescriptor(self, key)\n return Reflect.defineProperty(self, key, desc) &&\n (desc.get || (prevDesc && prevDesc.get))\n ? emitDefine(self, key, desc, prevDesc)\n : prevDesc\n ? desc.value === prevDesc.value ||\n emitReplace(self, key, desc.value, prevDesc.value)\n : emitAdd(self, key, desc.value)\n },\n deleteProperty,\n preventExtensions: nope,\n}\n\nexport const ArrayTraps: ProxyHandler<any[]> = {\n has: ObjectTraps.has,\n get(self: any, key: keyof any) {\n if (key === $$) return self\n if (key === 'length') {\n observe(self, SIZE)\n return self[key]\n }\n return (\n ArrayOverrides[key] ||\n (globals.observe && ArrayIterators[key]) ||\n self[key]\n )\n },\n set(self, key, value) {\n if (key === 'length') {\n const oldLength = self.length\n if (value !== oldLength) {\n const oldValues = self.slice(value)\n self.length = value\n emitReplace(self, SIZE, value, oldLength)\n if (value < oldLength) {\n emitSplice(self, value, emptyArray, oldValues)\n }\n }\n } else {\n const oldLength = self.length\n setProperty(self, key, value)\n if (oldLength !== self.length) {\n emitReplace(self, SIZE, self.length, oldLength)\n }\n }\n return true\n },\n deleteProperty,\n preventExtensions: nope,\n}\n\nexport class ObservableMap<K, V> extends Map<K, V> {\n [$$]!: Map<K, V>\n\n constructor(source: Map<K, V>) {\n super()\n setHidden(this, $$, source)\n }\n\n get [$O]() {\n return this[$$][$O]\n }\n\n get size() {\n observe(this[$$], SIZE)\n return this[$$].size\n }\n\n has(key: K) {\n // TODO: Avoid observing \"replace\" events here.\n observe(this[$$], key)\n return this[$$].has(key)\n }\n\n get(key: K) {\n observe(this[$$], key)\n return this[$$].get(key)\n }\n\n set(key: K, value: V) {\n const exists = this[$$].has(key)\n const oldValue = exists ? this[$$].get(key) : void 0\n if (!exists || value !== oldValue) {\n this[$$].set(key, value)\n if (exists) {\n emitReplace(this[$$], key, value, oldValue)\n } else {\n const oldSize = this[$$].size\n emitAdd(this[$$], key, value)\n emitReplace(this[$$], SIZE, oldSize + 1, oldSize)\n }\n }\n return this\n }\n\n delete(key: K) {\n const oldSize = this[$$].size\n const oldValue = this[$$].get(key)\n return (\n this[$$].delete(key) &&\n emitRemove(this[$$], key, oldValue) &&\n emitReplace(this[$$], SIZE, oldSize - 1, oldSize)\n )\n }\n\n clear() {\n const oldSize = this[$$].size\n if (oldSize) {\n const oldValues = new Map(this[$$])\n this[$$].clear()\n emitClear(this[$$], oldValues)\n emitReplace(this[$$], SIZE, 0, oldSize)\n }\n }\n}\n\nexport class ObservableSet<T> extends Set<T> {\n [$$]!: Set<T>\n\n constructor(source: Set<T>) {\n super()\n setHidden(this, $$, source)\n }\n\n get [$O]() {\n return this[$$][$O]\n }\n\n get size() {\n observe(this, SIZE)\n return this[$$].size\n }\n\n has(value: T) {\n observe(this[$$], SIZE)\n return this[$$].has(value)\n }\n\n add(value: T) {\n const oldSize = this[$$].size\n this[$$].add(value)\n if (oldSize !== this[$$].size) {\n emitAdd(this[$$], void 0, value)\n emitReplace(this[$$], SIZE, oldSize + 1, oldSize)\n }\n return this\n }\n\n delete(value: T) {\n const oldSize = this[$$].size\n return (\n this[$$].delete(value) &&\n emitRemove(this[$$], void 0, value) &&\n emitReplace(this[$$], SIZE, oldSize - 1, oldSize)\n )\n }\n\n clear() {\n const oldSize = this[$$].size\n if (oldSize) {\n const oldValues = new Set(this[$$])\n this[$$].clear()\n emitClear(this[$$], oldValues)\n emitReplace(this[$$], SIZE, 0, oldSize)\n }\n }\n}\n\ndefineMethods(ObservableMap, MapIterators)\ndefineMethods(ObservableSet, SetIterators)\n\nfunction defineMethods(Class: any, overrides: { [key: string]: any }) {\n Object.defineProperties(\n Class.prototype,\n Object.getOwnPropertyDescriptors(overrides)\n )\n}\n\nfunction setProperty(self: object, key: any, value: any) {\n const exists = hasOwn(self, key)\n const oldValue = self[key]\n self[key] = value\n return exists\n ? value === oldValue || emitReplace(self, key, value, oldValue)\n : emitAdd(self, key, value)\n}\n\nfunction deleteProperty(self: object, key: any) {\n if (!hasOwn(self, key)) return true\n const oldValue = self[key]\n delete self[key]\n return emitRemove(self, key, oldValue)\n}\n","import { is } from '@alloc/is'\nimport { isDev } from '@alloc/is-dev'\nimport { Disposable } from './common'\nimport { setDebug } from './debug'\nimport { ArrayTraps, ObjectTraps, ObservableMap, ObservableSet } from './proxy'\nimport { $O, $T } from './symbols'\n\n/** Watch the properties of the given observable object */\nexport const shallowChanges = (\n target: ObserverTarget,\n onChange: (change: Change) => void\n) => target[$O]!.observe($O, onChange)\n\n/** Return true if `value` could be made observable or is already observable */\nexport const canMakeObservable = (value: unknown): boolean =>\n is.object(value) &&\n !is.date(value) &&\n !is.regExp(value) &&\n !is.promise(value) &&\n !is.generator(value) &&\n !is.generatorFunction(value) &&\n !is.asyncFunction(value) &&\n !is.weakMap(value) &&\n !is.weakSet(value)\n\n/** A function that can subscribe to observable objects. */\nexport abstract class Observer implements Disposable {\n observed!: ReadonlySet<ObservedSlot>\n onChange: ((change: Change) => void) | null = null\n\n /** The current nonce of our observed values combined */\n get nonce() {\n let nonce = 0\n this.observed.forEach(slot => {\n nonce += slot.nonce\n })\n return nonce\n }\n\n dispose() {\n if (this.onChange) {\n this.onChange = null\n this.observed.forEach(value => value.delete(this))\n }\n }\n}\n\n/** @internal */\nexport class Observable<T extends object = any> extends Map<\n ObservedKey,\n ObservedSlot\n> {\n readonly proxy: T | undefined\n\n constructor(readonly source?: T) {\n super()\n if (isDev) {\n setDebug(this, {\n name: this.constructor.name || 'Unknown',\n })\n }\n if (source) {\n this.proxy = is.map(source)\n ? new ObservableMap(source)\n : is.set(source)\n ? new ObservableSet(source)\n : new Proxy(\n source as any,\n source[$T] || (is.array(source) ? ArrayTraps : ObjectTraps)\n )\n }\n }\n\n /** Return true if at least one observer exists for the given key. */\n has(key: ObservedKey) {\n const observers = super.get(key)\n return !!(observers && observers.size)\n }\n\n /** Return a `Set` of observers for the given key, even if not observed. */\n get(key: ObservedKey): ObservedSlot {\n let observers = super.get(key)\n if (!observers) {\n observers = new ObservedSlot(this, key)\n this.set(key, observers)\n }\n return observers\n }\n\n /** Create an observer for the given key. */\n observe(key: ObservedKey, onChange: (change: Change) => void) {\n const observers = this.get(key)\n const observer: ChangeObserver = {\n onChange,\n dispose() {\n observers.delete(observer)\n },\n }\n observers.add(observer)\n return observer\n }\n}\n\n/** Mutable state with an associated observable */\nexport type ObserverTarget = object & { [$O]?: Observable }\n\n/** Any value acting as an object key */\nexport type ObservedKey = any\n\n/** An observer set with metadata about what's being observed */\nexport class ObservedSlot extends Set<ChangeObserver> {\n nonce = 1\n constructor(readonly owner: Observable, readonly key: ObservedKey) {\n super()\n }\n\n onChange(change: Change) {\n if (this.size) {\n // Clone the observer list to protect against mutations.\n for (const observer of Array.from(this)) {\n if (observer.onChange) {\n observer.onChange(change)\n }\n }\n }\n }\n}\n\n/** An observed mutation of an observable object. */\nexport interface Change<T = any> {\n op: 'add' | 'replace' | 'remove' | 'splice' | 'clear' | 'define'\n target: object\n key?: any\n value?: T\n oldValue?: T\n}\n\n/** The most basic observer of changes. */\nexport interface ChangeObserver extends Disposable {\n onChange: ((change: Change) => void) | null\n}\n","import { is } from '@alloc/is'\nimport { isDev } from '@alloc/is-dev'\nimport { batch } from './batch'\nimport { noop, rethrowError } from './common'\nimport { addDebugAction, getDebug } from './debug'\nimport { globals } from './globals'\nimport { noto } from './noto'\nimport { Change, ObservedSlot, Observer } from './observable'\nimport { $O } from './symbols'\n\n/** Run an effect when its tracked values change. */\nexport function auto(effect: () => void, config?: AutoConfig) {\n const auto = new Auto(config)\n auto.run(effect)\n return auto\n}\n\nexport interface AutoConfig {\n /** When true, react to changes immediately. By default, changes are delayed until the next microtask loop */\n sync?: boolean\n /** By default, rerun the last effect (after any delay) */\n onDirty?: Auto['onDirty']\n /** By default, errors are rethrown */\n onError?: Auto['onError']\n /** Run an effect after an `observer` is activated */\n onCommit?: Auto['onCommit']\n /** Run an effect after being disposed */\n onDispose?: Auto['onDispose']\n}\n\nexport class Auto {\n sync: boolean\n dirty = true\n nonce = 0\n observer: AutoObserver | null = null\n onDirty: (this: Auto) => void\n onError: (this: Auto, error: Error) => void\n onCommit: (observer: AutoObserver) => void\n onDispose: () => void\n\n constructor(config: AutoConfig = {}) {\n this.sync = !!config.sync\n this.onDirty = config.onDirty || this._onDirty\n this.onError = config.onError || rethrowError\n this.onCommit = config.onCommit || noop\n this.onDispose = config.onDispose || noop\n }\n\n run<T extends Function>(compute: T) {\n const observer = this.start(compute)\n try {\n const result = compute()\n this.stop().commit(observer)\n this.nonce = observer.nonce\n return result\n } catch (error: any) {\n this.stop().onError(error)\n }\n }\n\n /** Rerun the last effect and commit its observer */\n rerun() {\n const { observer } = this\n return observer && noto(() => this.run(observer.effect))\n }\n\n /**\n * Replace the current `observer`.\n *\n * Pass a nonce to bail out if observed values have since changed.\n */\n commit(observer: AutoObserver, nonce?: number) {\n if (this.observer) {\n this.observer.dispose()\n }\n\n // Stop observing when changes occur between run and commit.\n if (nonce && nonce != observer.nonce) {\n this.observer = null\n return false\n }\n\n // Attach to the observed values.\n observer.onChange = this._onChange.bind(this)\n observer.observed.forEach(observable => observable.add(observer))\n this.observer = observer\n this.onCommit(observer)\n return true\n }\n\n dispose() {\n if (this.observer) {\n // Stop observing.\n this.observer.dispose()\n // Cancel batched effects.\n this.observer = null\n // Run any side effects.\n this.onDispose()\n }\n }\n\n /**\n * @internal\n * Create an observer and start observing.\n *\n * The given `effect` is used by `rerun` calls made after\n * the new observer is committed.\n */\n start(effect: Function) {\n if (globals.observe) {\n throw Error('Nested tracking is forbidden')\n }\n const observer = new AutoObserver(effect)\n globals.auto = this\n globals.observe = (target, key) => {\n observer.observed.add(target[$O]!.get(key))\n }\n return observer\n }\n\n /**\n * @internal\n * Stop observing and reset the `dirty` flag.\n */\n stop() {\n if (globals.auto == this) {\n globals.auto = globals.observe = null\n }\n this.dirty = false\n return this\n }\n\n /**\n * @internal\n * Replace the current `observer` when appropriate.\n */\n clear() {\n if (!this.dirty) {\n this.dirty = true\n this.onDirty()\n }\n }\n\n protected _onChange(change: Change) {\n if (isDev && getDebug(this)) {\n addDebugAction(this, change)\n }\n // Derived values used by sync reactions are forced to rerun immediately\n // so the reactions can know whether the value actually changed.\n if (this.sync && change.op == 'clear' && is.function(change.target)) {\n change.target()\n }\n this.clear()\n }\n\n protected _onDirty() {\n const { observer, nonce } = this\n const maybeRerun = () =>\n // If the current nonce is not greater, no dependencies have changed.\n observer!.nonce > nonce //\n ? this.rerun()\n : (this.dirty = false)\n\n if (this.sync) {\n maybeRerun()\n } else {\n batch.run(\n // The observer is replaced when the effect is rerun or when disposed.\n () => observer == this.observer && maybeRerun()\n )\n }\n }\n}\n\nexport class AutoObserver extends Observer {\n observed = new Set<ObservedSlot>()\n constructor(readonly effect: Function) {\n super()\n }\n}\n","import { is } from '@alloc/is'\nimport { Auto } from './auto'\nimport { batch } from './batch'\nimport { Disposable, setHidden } from './common'\nimport { emitReplace } from './emit'\nimport { observe } from './globals'\nimport { noto } from './noto'\nimport { Observable } from './observable'\nimport { $O } from './symbols'\n\n/**\n * An observable getter that memoizes its result.\n *\n * The memoization is observed, so when a dependency changes,\n * the memoized value is released and observers are notified.\n */\nexport interface Derived<T = any> extends Disposable {\n /** The underlying observable */\n [$O]?: Observable\n /** The underlying observer */\n auto: Auto\n /** Get the current value */\n (): T\n}\n\n/** @internal */\nexport function derive<T>(\n run: (auto: Auto) => T,\n discard?: (memo: T, oldMemo: T | undefined) => boolean\n): Derived<T> {\n // The memoized result\n let memo: T | undefined\n\n // For being observed\n const observable = new Observable()\n\n // For observing others\n const auto = new Auto({\n onDirty() {\n if (observable.has($O)) {\n batch.run(derived)\n\n // Tell our observers to join the next batch to see if our `memo`\n // value has changed.\n // Avoid mutating the `nonce` of our observers until our getter\n // produces a new value (which may never happen).\n observable.get($O).onChange({\n op: 'clear',\n target: derived,\n oldValue: memo,\n })\n }\n },\n })\n\n // The observable getter\n const derived = () => {\n if (auto.dirty) {\n noto(() => {\n const oldMemo = memo\n const newMemo = run(auto)\n if (newMemo !== oldMemo && !(discard && discard(newMemo, oldMemo))) {\n emitReplace(derived, null, (memo = newMemo), oldMemo)\n }\n })\n }\n observe(derived, $O)\n return memo!\n }\n\n derived.auto = auto\n derived.dispose = () => auto.dispose()\n\n setHidden(derived, $O, observable)\n return derived\n}\n\nexport function isDerived(value: unknown): value is Derived {\n return is.function(value) && !!value[$O]\n}\n\n/** Convert all `Derived<T>` property types into `T` */\nexport type WithDerived<T extends object> = {\n [P in keyof T]: T[P] extends Derived<infer U> ? U : T[P]\n}\n","import { is } from '@alloc/is'\nimport { getOwnDescriptor, setHidden } from './common'\nimport { derive, Derived } from './derive'\nimport { canMakeObservable, Observable, ObserverTarget } from './observable'\nimport { $O } from './symbols'\n\n/**\n * Pass an **object** to receive an observable proxy.\n * Pass a **function** to receive an observable getter.\n * Anything else is returned as-is.\n */\nexport function o<T>(\n value: T\n): T extends () => infer U ? Derived<U> : T extends Function ? Derived : T\n\nexport function o(value: ObserverTarget) {\n let state = value && value[$O]\n if (!state || !getOwnDescriptor(value, $O)) {\n if (!canMakeObservable(value)) {\n return value\n }\n if (is.function(value)) {\n return derive(auto => auto.run(value))\n }\n if (Object.isFrozen(value)) {\n return value\n }\n setHidden(value, $O, (state = new Observable(value)))\n }\n // The proxy does not exist for observable functions.\n return state.proxy || value\n}\n","import { Auto } from './auto'\nimport { noto } from './noto'\n\n/**\n * Create a promise to resolve when the given condition returns true.\n * Any observable access in the condition is tracked.\n */\nexport const when = (condition: () => boolean): Promise<void> =>\n new Promise((resolve, reject) => {\n const auto = new Auto({\n onDirty() {\n if (noto(() => this.run(condition))) {\n this.dispose()\n resolve()\n }\n },\n onError(error) {\n this.dispose()\n reject(error)\n },\n })\n auto.onDirty()\n })\n","import { is } from '@alloc/is'\nimport {\n Change,\n Observable,\n ObservedSlot,\n Observer,\n ObserverTarget,\n} from './observable'\nimport { $O } from './symbols'\n\ntype WatchedState = ObserverTarget & {\n forEach?: (cb: (value: any, key: any, ctx: any) => void) => void\n}\n\ntype ChangeHandler = (change: Change) => void\n\n/**\n * Watch a single property.\n * If its value is observable, watch it recursively.\n */\nexport function watch<P>(\n root: Map<P, any>,\n key: P,\n onChange: (change: Change) => void\n): Watcher\n\nexport function watch<T extends object, P extends string & keyof T>(\n root: T,\n key: P,\n onChange: (change: Change) => void\n): Watcher\n\n/**\n * Watch an observable tree for changes.\n * Only observable objects are searched for watchable values.\n */\nexport function watch(root: object, onChange: ChangeHandler): Watcher\n\nexport function watch(\n root: object & { [$O]?: Observable },\n arg2: unknown,\n arg3?: ChangeHandler\n) {\n return arg3\n ? new Watcher(root, arg3, arg2)\n : new Watcher(root, arg2 as ChangeHandler)\n}\n\n/** An observer of deep changes */\nexport class Watcher extends Observer {\n observed = new Set<ObservedSlot>()\n counts = new Map<object, number>()\n\n constructor(\n readonly root: object,\n onChange: ChangeHandler,\n readonly key?: any\n ) {\n super()\n this.onChange = change => {\n const { op, target, key, value, oldValue } = change\n switch (op) {\n case 'replace':\n if (canWatch(oldValue)) this._unwatch(oldValue)\n case 'add':\n this.watch(value, key, target)\n break\n case 'remove':\n this.unwatch(value, key, target)\n break\n case 'splice':\n value.forEach(this.watch)\n default:\n oldValue.forEach(this.unwatch)\n }\n onChange(change)\n }\n if (key) {\n this.counts.set(root, 1)\n const observable = root[$O] as Observable\n this.observed.add(observable.get(key).add(this))\n this.watch(root[key], key, root)\n } else {\n this._watch(root)\n }\n }\n\n watch = (value: any, key?: any, ctx?: any) => {\n if (canWatch(key) && is.map(ctx)) this._watch(key)\n if (canWatch(value)) this._watch(value)\n }\n\n unwatch = (value: any, key?: any, ctx?: any) => {\n if (canWatch(key) && is.map(ctx)) this._unwatch(key)\n if (canWatch(value)) this._unwatch(value)\n }\n\n dispose() {\n if (this.onChange) {\n super.dispose()\n this.counts.clear()\n }\n }\n\n // Watch every observable in the given object.\n protected _watch(target: WatchedState) {\n const { counts } = this\n const count = counts.get(target) || 0\n counts.set(target, count + 1)\n if (!count) {\n if (target[$O]) {\n this.observed.add(target[$O]!.get($O).add(this))\n }\n if (!target.forEach) {\n target = Object.values(target)\n }\n target.forEach!(this.watch)\n }\n }\n\n // Unwatch every observable in the given object.\n protected _unwatch(target: WatchedState) {\n const { counts } = this\n const count = counts.get(target)\n if (is.undefined(count)) return\n if (count > 1) {\n counts.set(target, count - 1)\n } else {\n counts.delete(target)\n if (target[$O]) {\n const value = target[$O]!.get($O)\n this.observed.delete(value)\n value.delete(this)\n }\n if (!target.forEach) {\n target = Object.values(target)\n }\n target.forEach!(this.unwatch)\n }\n }\n}\n\nexport const canWatch = (value: unknown): value is object =>\n (value as any) && typeof value == 'object'\n","import { Auto, AutoObserver } from './auto'\n\ninterface Props {\n observer?: AutoObserver\n mounted?: boolean\n}\n\n/**\n * Call the returned function to set the \"mounting state\" for the\n * given `Auto` object. Observation is postponed until mounted.\n */\nexport function mountAuto(auto: Auto) {\n let mounted = false\n let observer: AutoObserver\n let nonce = 0\n\n // XXX: Never call this with both `observer` and `mounted` props.\n return (props: Props) => {\n if (props.observer) {\n observer = props.observer\n if (!mounted) {\n nonce = observer.nonce\n }\n // The observer might already be committed.\n else if (observer != auto.observer) {\n auto.commit(observer)\n }\n } else {\n mounted = props.mounted!\n if (observer) {\n if (!mounted) {\n nonce = observer.nonce\n auto.dispose()\n }\n // Reuse the observer if no dependencies have changed.\n else if (!auto.commit(observer, nonce)) {\n auto.clear()\n }\n }\n }\n }\n}\n"],"names":[],"mappings":"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"}