UNPKG

wana

Version:

Easy observable state for React

1 lines 74.9 kB
{"version":3,"file":"wana.mjs","sources":["../src/common.ts","../src/globals.ts","../src/symbols.ts","../src/shims.ts","../src/batch.ts","../src/debug.ts","../src/noto.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/no.ts","../src/mountAuto.ts","../src/ui/useDerived.ts","../src/ui/useO.ts","../src/ui/common.ts","../src/ui/useAuto.ts","../src/ui/AutoContext.tsx","../src/ui/withAuto.tsx","../src/ui/useChanges.ts","../src/ui/useEffects.tsx","../src/ui/useBinding.ts"],"sourcesContent":["export interface Disposable {\n  /** Release any memory that would otherwise leak */\n  dispose: () => void\n}\n\nexport type Falsy = false | null | undefined\n\nexport const emptyArray: readonly any[] = Object.freeze([])\n\nexport const setHidden = (obj: any, key: any, value: any) =>\n  Object.defineProperty(obj, key, { value, configurable: true })\n\nexport function rethrowError(error: Error) {\n  throw error\n}\n\nexport const noop = () => {}\n\nexport const nope = () => false\n\nexport const flop: any = () => {\n  throw Error('Not yet implemented')\n}\n\nexport const hasOwn = Function.call.bind({}.hasOwnProperty) as (\n  obj: object,\n  key: keyof any\n) => boolean\n\nexport const getOwnDescriptor = Object.getOwnPropertyDescriptor\n\nexport function getDescriptor(self: object, key: any) {\n  let desc: PropertyDescriptor | undefined\n  let proto = self\n  do {\n    if ((desc = getOwnDescriptor(proto, key))) {\n      return desc\n    }\n  } while ((proto = Object.getPrototypeOf(proto)))\n}\n","import { Auto } from './auto'\nimport { Change, ObserverTarget } from './observable'\n\ntype OnRender = (\n  auto: Auto,\n  depth: number,\n  component: React.FunctionComponent<any>\n) => void\n\ntype Globals = {\n  /** Notify the current observer. */\n  observe: ((target: ObserverTarget, key: any) => void) | null\n  /** The `Auto` object for the current `withAuto` component being rendered. */\n  auto: Auto | null\n  /** For debugging re-renders. Only called in development. */\n  onRender: OnRender | null\n  /** For spying on every change event. */\n  onChange: ((change: Change) => void) | null\n}\n\nexport const globals: Globals = {\n  observe: null,\n  auto: null,\n  onRender: null,\n  onChange: null,\n}\n\n/** Tell the current observer to track the given object/key pair  */\nexport const observe = (target: ObserverTarget, key: any) =>\n  !!globals.observe && (globals.observe(target, key), true)\n","/** For accessing the proxied state */\nexport const $$ = Symbol.for('wana:state')\n\n/** For storing observers and the observable proxy */\nexport const $O = Symbol.for('wana:observable')\n\n/** For observing \"size\" changes */\nexport const SIZE = Symbol.for('wana:size')\n\n/** For injecting custom proxy traps */\nexport const $T = Symbol.for('wana:traps')\n","import { setHidden } from './common'\nimport { globals, observe } from './globals'\nimport { $$, $O } from './symbols'\n\nexport const shims: Array<[Function, string[]]> = [\n  [Object, ['keys', 'values', 'entries']],\n  [Array, ['from']],\n]\n\nshims.forEach(([namespace, keys]) =>\n  keys.forEach(key => {\n    const fn = namespace[key]\n    const shim = (...args: any[]) => {\n      const target = args[0] && args[0][$$]\n      if (target) {\n        observe(target, $O)\n        args[0] = target\n      }\n      return fn(...args)\n    }\n    setHidden(shim, 'name', fn.name)\n    Object.defineProperty(namespace, key, {\n      get: () => (globals.observe ? shim : fn),\n    })\n  })\n)\n","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 { globals } from './globals'\n\nlet nextDebugId = 1\n\nconst $D = Symbol.for('wana:debug')\n\ninterface DebugState {\n  name: string\n  actions?: any[]\n  renders?: number\n}\n\n/** Get the `Auto` object for the current `withAuto` component being rendered. */\nexport function getCurrentAuto() {\n  return globals.auto\n}\n\n/**\n * Get the `DebugState` object of the `target` object.\n *\n * Returns `undefined` if target was never passed to `setDebug`.\n */\nexport function getDebug(target: object): DebugState {\n  return target[$D]\n}\n\n/**\n * Set the `DebugState` object of the `target` object.\n */\nexport function setDebug<T>(target: T, debug: DebugState) {\n  debug.name += '#' + nextDebugId++\n  target[$D] = debug\n  return target\n}\n\n/** Safely add an action to a `DebugState` object */\nexport function addDebugAction(target: any, action: any) {\n  const debug = getDebug(target)\n  if (debug && debug.actions) {\n    debug.actions.push(action)\n  }\n}\n","import { globals } from './globals'\n\n/** Run an effect without any observable tracking */\nexport function noto<T>(effect: () => T): T {\n  const { auto, observe } = globals\n  globals.auto = null\n  globals.observe = null\n  try {\n    return effect()\n  } finally {\n    globals.auto = auto\n    globals.observe = observe\n  }\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 = {\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) {\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 { is } from '@alloc/is'\nimport { setHidden } from './common'\nimport { noto } from './noto'\nimport { $$ } from './symbols'\n\n/**\n * Get the original object from an observable proxy,\n * or wrap a function to disable observation inside it.\n *\n * Read `no` as \"non-observable\", essentially the reverse of the `o` function.\n */\nexport function no<T>(value: T): T {\n  if (is.function(value)) {\n    if (value[$$]) return value\n    const fn = function(this: any, ...args: any[]) {\n      return noto(value.bind(this, ...args))\n    }\n    setHidden(fn, 'name', value.name)\n    setHidden(fn, $$, value)\n    return fn as any\n  }\n  return (value && value[$$]) || value\n}\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","import { useMemo } from 'react'\nimport { useLayoutEffect } from 'react-layout-effect'\nimport { emptyArray, Falsy } from '../common'\nimport { derive, Derived } from '../derive'\nimport { mountAuto } from '../mountAuto'\n\n/**\n * Create an observable getter that is managed by React.\n * This lets you memoize an expensive combination of observable values.\n *\n * If the `compute` argument changes over the course of a component's lifetime,\n * its value should be added to the `deps` array.\n *\n * When `deps` are changed, the derived state is reset. This is useful when\n * the `compute` function is using a variable from another function scope.\n */\nexport function useDerived<T>(\n  compute: () => T,\n  deps?: readonly any[]\n): Derived<T>\n\nexport function useDerived<T>(\n  compute: (() => T) | Falsy,\n  deps?: readonly any[]\n): Derived<T> | null\n\nexport function useDerived<T>(\n  compute: () => T,\n  discard: (memo: T, oldMemo: T | undefined) => boolean,\n  deps?: readonly any[]\n): Derived<T>\n\nexport function useDerived<T>(\n  compute: (() => T) | Falsy,\n  discard: (memo: T, oldMemo: T | undefined) => boolean,\n  deps?: readonly any[]\n): Derived<T> | null\n\nexport function useDerived<T>(\n  compute: (() => T) | Falsy,\n  discardOrDeps?:\n    | ((memo: T, oldMemo: T | undefined) => boolean)\n    | readonly any[],\n  deps?: readonly any[]\n) {\n  let discard: ((memo: T, oldMemo: T | undefined) => boolean) | undefined\n  if (typeof discardOrDeps == 'function') {\n    discard = discardOrDeps\n  } else {\n    deps = discardOrDeps\n  }\n\n  const [derived, setState] = useMemo(() => {\n    if (!compute) {\n      return [null, null]\n    }\n    const derived = derive(auto => {\n      const observer = auto.start(compute)\n      try {\n        var result = compute()\n      } finally {\n        auto.stop()\n      }\n      setState({ observer })\n      return result\n    }, discard)\n    const setState = mountAuto(derived.auto)\n    return [derived, setState]\n  }, deps || emptyArray)\n\n  useLayoutEffect(() => {\n    if (setState) {\n      setState({ mounted: true })\n      return () => setState({ mounted: false })\n    }\n  }, [setState])\n\n  return derived\n}\n","import { is } from '@alloc/is'\nimport { useMemoOne as useMemo } from 'use-memo-one'\nimport { emptyArray, getOwnDescriptor } from '../common'\nimport { Derived, isDerived, WithDerived } from '../derive'\nimport { noto } from '../noto'\nimport { o } from '../o'\nimport { useDerived } from './useDerived'\n\nexport function useO<T extends object>(\n  state: Exclude<T, Function>,\n  deps?: readonly any[]\n): WithDerived<T>\n\n/**\n * Create an observable getter that is managed by React.\n * This lets you memoize an expensive combination of observable values.\n */\nexport function useO<T>(\n  create: () => () => T,\n  deps?: readonly any[]\n): Derived<T>\n\n/** Create observable component state. */\nexport function useO<T>(\n  create: () => Exclude<T, Function>,\n  deps?: readonly any[]\n): T\n\n/** Memoize an object and return its observable proxy. Non-objects are returned as-is. */\nexport function useO<T>(state: T, deps?: readonly any[]): T\n\n/** @internal */\nexport function useO(state: any, deps?: readonly any[]) {\n  const result = useMemo<any>(\n    () => convertDerived(is.function(state) ? noto(state) : state),\n    deps || emptyArray\n  )\n  // Beware: Never switch between observable getter and observable object.\n  return is.function(result) ? useDerived(result, [result]) : o(result)\n}\n\n// Convert observable getters into property getters.\n// This is *not* responsible for disposal.\nfunction convertDerived(state: any) {\n  if (is.plainObject(state)) {\n    for (const key in state) {\n      const desc = getOwnDescriptor(state, key)!\n      if (isDerived(desc.value) && desc.configurable) {\n        Object.defineProperty(state, key, {\n          get: desc.value,\n        })\n      }\n    }\n  }\n  return state\n}\n","import { useEffect, useMemo, useState } from 'react'\nimport { useMemoOne } from 'use-memo-one'\nimport { emptyArray } from '../common'\n\n/** This lets a component determine if its render has been reconciled. */\nexport const RenderAction = ({ useAction }: { useAction: () => void }) => (\n  useAction(), null\n)\n\n/** Return a function that re-renders this component, if still mounted */\nexport function useForceUpdate() {\n  const update = useState<any>()[1]\n  const mounted = useMemo(makeMountedRef, [])\n  useEffect(mounted.unmount, emptyArray)\n  return () => {\n    if (mounted.current) {\n      update({})\n    }\n  }\n}\n\nfunction makeMountedRef() {\n  const mounted = {\n    current: true,\n    unmount: () => () => {\n      mounted.current = false\n    },\n  }\n  return mounted\n}\n\nexport const useConstant = <T>(create: () => T) =>\n  useMemoOne(create, emptyArray)\n\nexport const useDispose = (dispose: () => void) =>\n  useEffect(() => dispose, emptyArray)\n","import { is } from '@alloc/is'\nimport { useEffect } from 'react'\nimport { batchedUpdates } from 'react-batched-updates'\nimport { Auto } from '../auto'\nimport { no } from '../no'\nimport { useConstant, useDispose } from './common'\nimport { useDerived } from './useDerived'\n\ntype Deps = readonly any[]\ntype EffectReturn = void | (() => void | undefined)\n\n/** Wrap a `useEffect` call with magic observable tracking */\nexport function useAuto(effect: () => EffectReturn, deps?: Deps): Auto\n\n/**\n * Combine a `useEffect` call with an `Auto` instance that invokes an\n * unobserved side `effect` when the `compute` function returns a new value.\n */\nexport function useAuto<T>(\n  compute: () => T,\n  effect: (value: T) => EffectReturn,\n  deps?: Deps\n): Auto\n\n/** @internal */\nexport function useAuto(\n  computeOrEffect: () => unknown,\n  effectOrDeps?: Function | Deps,\n  deps?: Deps\n) {\n  const auto = useConstant(() => new Auto())\n  useDispose(() => auto.dispose())\n\n  let effect: () => EffectReturn\n  if (is.function(effectOrDeps)) {\n    const compute = useDerived(computeOrEffect, deps)\n    effect = () => no(effectOrDeps as any)(compute())\n  } else {\n    effect = computeOrEffect as any\n    deps = effectOrDeps as any\n  }\n\n  useEffect(\n    () =>\n      batchedUpdates(() => {\n        auto.run(effect)\n      }),\n    deps\n  )\n  return auto\n}\n","import * as React from 'react'\nimport { ReactNode } from 'react'\n\nconst context = React.createContext({ depth: 0 })\nconst { Provider } = context\n\nexport type AutoContextProps = {\n  depth: number\n  children: ReactNode\n}\n\n/** The provided state is assumed to be constant (except for children). */\nexport const AutoContext = ({ children, ...props }: AutoContextProps) => (\n  <Provider value={React.useRef(props).current}>{children}</Provider>\n)\n\n/** @internal */\nexport const useAutoContext = () => React.useContext(context)\n","import { isDev } from '@alloc/is-dev'\nimport * as React from 'react'\nimport { forwardRef, ReactElement, Ref, RefAttributes, useMemo } from 'react'\nimport { useLayoutEffect } from 'react-layout-effect'\nimport { Auto, AutoObserver } from '../auto'\nimport { batch } from '../batch'\nimport { addDebugAction, getDebug, setDebug } from '../debug'\nimport { globals } from '../globals'\nimport { AutoContext, useAutoContext } from './AutoContext'\nimport { RenderAction, useDispose, useForceUpdate } from './common'\n\ninterface Component<P = any> {\n  (props: P): ReactElement | null\n  displayName?: string\n}\n\ninterface RefForwardingComponent<T = any, P = any> {\n  (props: P, ref: Ref<T>): ReactElement | null\n  displayName?: string\n}\n\ntype RefForwardingAuto<T extends RefForwardingComponent> = T &\n  ((\n    props: T extends RefForwardingComponent<infer U, infer P>\n      ? P & RefAttributes<U>\n      : never\n  ) => ReactElement | null)\n\n/** Wrap a component with magic observable tracking */\nexport function withAuto<T extends Component>(render: T): T\n\n/** Wrap a component with `forwardRef` and magic observable tracking */\nexport function withAuto<T extends RefForwardingComponent>(\n  render: T\n): RefForwardingAuto<T>\n\n/** @internal */\nexport function withAuto(render: any) {\n  let component: React.FunctionComponent<any> = (props, ref) => {\n    const { auto, depth, commit } = useAutoRender(component)\n\n    // Subscribe to observables as early as possible, because\n    // we don't want effects to trigger the previous observer.\n    useLayoutEffect(() => commit(observer, nonce))\n\n    // Track which observable state is used during render.\n    const observer = auto.start(render)\n    try {\n      var content = render(props, ref)\n    } finally {\n      auto.stop()\n    }\n\n    // Cache the nonce for cancellation purposes.\n    const { nonce } = observer\n\n    // React might discard this render without telling us, but we can\n    // detect that with our first child's render phase.\n    const recon = (\n      <RenderAction\n        useAction={() => {\n          auto.nonce = nonce\n        }}\n      />\n    )\n\n    return (\n      <AutoContext depth={depth + 1}>\n        {recon}\n        {content}\n      </AutoContext>\n    )\n  }\n  if (render.length > 1) {\n    // Bind its component name to the ref forwarder.\n    Object.defineProperty(component, 'displayName', {\n      get: () => component.displayName,\n    })\n    component = forwardRef(component as any)\n  }\n  if (/^[A-Z]/.test(render.name)) {\n    component.displayName = render.name\n  }\n  if (isDev) {\n    Object.defineProperty(component, '__render', {\n      value: render,\n    })\n  }\n  return component\n}\n\nfunction useAutoRender(component: React.FunctionComponent<any>) {\n  const { depth } = useAutoContext()\n\n  const forceUpdate = useForceUpdate()\n  const auto = useMemo(() => {\n    const auto = new Auto({\n      onDirty() {\n        if (isDev) {\n          addDebugAction(auto, 'dirty')\n        }\n        const { observer } = auto\n        // If no observer exists, our `component` is either unmounted\n        // or its first render is not committed yet. In the latter case,\n        // the reconciled nonce will soon be validated in a layout effect.\n        if (!observer) {\n          return\n        }\n        // The `dirty` flag is reset when our `component` rerenders,\n        // which means this `onDirty` function can be called again,\n        // before this batched update is ever processed.\n        batch.render(depth, () => {\n          // When the observer changes before the batch can be flushed,\n          // we bail out to avoid using the nonce of a value no longer observed.\n          if (observer == auto.observer) {\n            if (observer.nonce > auto.nonce) {\n              if (isDev) {\n                addDebugAction(auto, 'batch')\n              }\n              forceUpdate()\n            } else {\n              auto.dirty = false\n            }\n          }\n        })\n      },\n    })\n    if (isDev) {\n      setDebug(auto, {\n        name: component.displayName || 'Anonymous',\n        actions: ['init'],\n        renders: 0,\n      })\n    }\n    return auto\n  }, [])\n\n  if (isDev) {\n    getDebug(auto).renders!++\n    if (globals.onRender) {\n      globals.onRender(auto, depth, component)\n    }\n  }\n\n  useDispose(() => auto.dispose())\n  return {\n    auto,\n    depth,\n    commit(observer: AutoObserver, nonce: number) {\n      if (isDev) {\n        getDebug(auto).actions = []\n      }\n      // The `nonce` from the render phase will force an update\n      // if any observed values have changed since then.\n      if (!auto.commit(observer, nonce)) {\n        if (isDev) {\n          addDebugAction(auto, 'dirty')\n        }\n        forceUpdate()\n      } else if (isDev) {\n        addDebugAction(auto, 'observe')\n      }\n    },\n  }\n}\n","import { useLayoutEffect } from 'react-layout-effect'\nimport { useMemoOne as useMemo } from 'use-memo-one'\nimport { emptyArray } from '../common'\nimport { no } from '../no'\nimport { Change, ChangeObserver, ObserverTarget } from '../observable'\nimport { $O } from '../symbols'\n\n/** Listen for shallow changes to an observable object. */\nexport function useChanges(\n  target: ObserverTarget,\n  onChange: (change: Change) => void,\n  deps?: readonly any[]\n) {\n  const observable = target[$O]\n  if (!observable) {\n    throw Error('Expected an observable object')\n  }\n\n  const observer = useMemo<ChangeObserver>(\n    () => ({ onChange } as any),\n    emptyArray\n  )\n\n  useLayoutEffect(() => {\n    observer.onChange = no(onChange)\n  }, deps)\n\n  useLayoutEffect(() => {\n    const observers = observable.get($O)\n    observers.add(observer)\n    return () => {\n      observers.delete(observer)\n    }\n  }, [observable])\n}\n","import { is } from '@alloc/is'\nimport { useMemo, useRef } from 'react'\nimport { useLayoutEffect } from 'react-layout-effect'\nimport { noop } from '../common'\nimport { no } from '../no'\nimport { Change } from '../observable'\nimport { SIZE } from '../symbols'\nimport { useChanges } from './useChanges'\n\ntype Deps = readonly any[]\ntype UnmountFn = () => undefined | void\n\ntype Source<T = any> =\n  | { [key: string]: T }\n  | ReadonlyArray<T>\n  | ReadonlySet<T>\n  | ReadonlyMap<any, T>\n\ntype Effect<T extends Source> = T extends Source<infer U>\n  ? T extends ReadonlyMap<infer P, U>\n    ? (value: U, key: P) => UnmountFn | void\n    : T extends ReadonlyArray<U> | ReadonlySet<U>\n    ? (value: U) => UnmountFn | void\n    : (value: U, key: string) => UnmountFn | void\n  : never\n\n/**\n * Create a layout effect for every key of your `values` object.\n *\n * Values are passed to your `effect` function as they are added and replaced.\n * The `effect` can return a cleanup function to call for removed values.\n *\n * Map objects use their keys\n */\nexport function useEffects<T extends Source>(\n  source: T,\n  effect: Effect<T>,\n  deps?: Deps\n) {\n  const unmountFns = useMemo(() => new Map<any, UnmountFn>(), [])\n\n  type UsedEffect = (value: any, key?: any) => UnmountFn | void\n  const usedEffect = useRef<UsedEffect>(effect)\n  useLayoutEffect(() => {\n    usedEffect.current = effect\n  }, deps)\n\n  const target = no(source)\n  const isValueBased = is.array(target) || is.set(target)\n\n  // Process the initial values.\n  useLayoutEffect(() => {\n    if (is.function(target.forEach)) {\n      target.forEach(mount)\n    } else {\n      Object.keys(target).forEach(key => mount(target[key], key))\n    }\n    return () => unmountFns.forEach(unmount => unmount())\n  }, [source])\n\n  // Subscribe to changes.\n  useChanges(source, onChange)\n\n  function mount(value: any, key?: any) {\n    const cacheKey = isValueBased ? value : key\n    if (!(is.array(target) && unmountFns.has(cacheKey))) {\n      const effect = usedEffect.current\n      const unmount = isValueBased ? effect(value) : effect(value, key)\n      unmountFns.set(cacheKey, unmount || noop)\n    }\n  }\n\n  function onChange({ op, key, value, oldValue }: Change) {\n    if (key == SIZE) return\n    if (op == 'clear') {\n      unmountFns.forEach(unmount => unmount())\n      unmountFns.clear()\n    } else if (op == 'splice') {\n      if (is.array(target)) {\n        oldValue.forEach((value: any) => {\n          if (!target.includes(value)) {\n            unmountFns.get(value)!()\n            unmountFns.delete(value)\n          }\n        })\n        value.forEach((value: any) => {\n          if (!unmountFns.has(value)) {\n            mount(value)\n          }\n        })\n      }\n    } else {\n      if (op != 'add') {\n        const cacheKey = isValueBased ? oldValue : key\n        if (!(is.array(target) && target.includes(cacheKey))) {\n          unmountFns.get(cacheKey)!()\n          unmountFns.delete(cacheKey)\n        }\n      }\n      if (op != 'remove') {\n        const cacheKey = isValueBased ? value : key\n        if (!(is.array(target) && unmountFns.has(cacheKey))) {\n          mount(value, key)\n        }\n      }\n    }\n  }\n}\n","import { is } from '@alloc/is'\nimport { useLayoutEffect } from 'react-layout-effect'\nimport { Derived } from '../derive'\nimport { Observable } from '../observable'\nimport { $O, SIZE } from '../symbols'\nimport { useForceUpdate } from './common'\n\n/**\n * An alternative to `withAuto` that re-renders the caller\n * when the given observable value is changed.\n *\n * If you pass an object without a key, the entire object\n * is observed.\n *\n * ⚠️ This hook has performance drawbacks! It cannot automatically\n * batch React updates, so you need to wrap changes with `batchedUpdates`\n * to avoid multiple re-renders. It also cannot wait for ancestor\n * components to re-render first, which also leads to excessive re-renders.\n */\nexport function useBinding<T extends object, P extends keyof T>(\n  target: T extends ReadonlyMap<any, any> ? never : T,\n  key: P\n): T[P]\nexport function useBinding<K, V>(\n  target: ReadonlyMap<K, V>,\n  key: K\n): V | undefined\nexport function useBinding<T>(target: Derived<T>): T\nexport function useBinding<T extends object>(target: T): T\nexport function useBinding(\n  target: Record<string, any> & { [$O]?: Observable },\n  key?: any\n) {\n  const observable = target[$O]\n  const forceUpdate = useForceUpdate()\n  useLayoutEffect(\n    () =>\n      observable?.observe(resolveKey(target, key), change => {\n        // Ignore \"clear\" event from a derived getter, which only serves\n        // as a signal to check its nonce in the next batch. Since we don't\n        // use batching in this hook, just wait for a \"replace\" event.\n        if (change.op == 'clear' && is.function(target)) return\n        forceUpdate()\n      }).dispose,\n    [observable, key]\n  )\n\n  // Return the current value.\n  return key\n    ? is.map(target)\n      ? target.get(key)\n      : target[key]\n    : is.function(target)\n    ? target()\n    : target\n}\n\nconst resolveKey = (target: any, key: any = $O) =>\n  (key == 'length' && is.array(target)) || (key == 'size' && is.set(target))\n    ? SIZE\n    : key\n"],"names":["useMemo"],"mappings":"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"}