{"version":3,"sources":["../src/index.ts"],"names":["events","res"],"mappings":"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","file":"index.dev.mjs","sourcesContent":["/**\n * FormKit Observer is a utility to wrap a FormKitNode in a dependency tracking observer proxy.\n *\n * @packageDocumentation\n */\n\nimport { has } from '@formkit/utils'\nimport {\n  FormKitNode,\n  isNode,\n  FormKitEventListener,\n  FormKitProps,\n  FormKitLedger,\n} from '@formkit/core'\n\n/**\n * An API-compatible FormKitNode that is able to determine the full dependency\n * tree of nodes and their values.\n * @public\n */\nexport interface FormKitObservedNode extends FormKitNode {\n  _node: FormKitNode\n  deps: FormKitDependencies\n  kill: () => undefined\n  observe: () => void\n  receipts: FormKitObserverReceipts\n  stopObserve: () => FormKitDependencies\n  watch: <T extends FormKitWatchable>(\n    block: T,\n    after?: (value: ReturnType<T>) => void,\n    pos?: 'push' | 'unshift'\n  ) => void\n}\n\n/**\n * The dependent nodes and the events that are required to watch for changes.\n *\n * @public\n */\nexport type FormKitDependencies = Map<FormKitNode, Set<string>> & {\n  active?: boolean\n}\n\n/**\n * A Map of nodes with the values being Maps of eventsName: receipt\n *\n * @public\n */\nexport type FormKitObserverReceipts = Map<\n  FormKitNode,\n  { [index: string]: string[] }\n>\n\n/**\n * A callback to watch for nodes.\n * @public\n */\nexport interface FormKitWatchable<T = unknown> {\n  (node: FormKitObservedNode): T\n}\n\n/**\n * A registry of all revoked observers.\n */\nconst revokedObservers = new WeakSet()\n\n/**\n * Creates the observer.\n * @param node - The {@link @formkit/core#FormKitNode | FormKitNode} to observe.\n * @param dependencies - The dependent nodes and the events that are required to\n * watch for changes.\n * @returns Returns a {@link @formkit/observer#FormKitObservedNode | FormKitObservedNode}.\n * @public\n */\nexport function createObserver(\n  node: FormKitNode,\n  dependencies?: FormKitDependencies\n): FormKitObservedNode {\n  // The dependencies touched during tracking\n  const deps: FormKitDependencies =\n    dependencies || Object.assign(new Map(), { active: false })\n  // A registry of event receipts returned by the event system\n  const receipts: FormKitObserverReceipts = new Map()\n\n  /**\n   * Simple function to add a dependency to the deps map.\n   * @param event - The name of the event type (like commit/input etc)\n   */\n  const addDependency = function (event: string) {\n    if (!deps.active) return\n    if (!deps.has(node)) deps.set(node, new Set())\n    deps.get(node)?.add(event)\n  }\n\n  /**\n   * Proxies the props of a node so we know which ones were messed with, could\n   * potentially be more generalized in the future if we want to support\n   * more sub-objects.\n   * @param props - The props object from a node\n   * @returns\n   */\n  const observeProps = function (props: FormKitProps) {\n    return new Proxy(props, {\n      get(...args) {\n        typeof args[1] === 'string' && addDependency(`prop:${args[1]}`)\n        return Reflect.get(...args)\n      },\n    })\n  }\n\n  /**\n   * Observes the FormKit ledger \"value\".\n   * @param ledger - A formkit ledger counter.\n   */\n  const observeLedger = function (ledger: FormKitLedger) {\n    return new Proxy(ledger, {\n      get(...args) {\n        if (args[1] === 'value') {\n          return (key: string) => {\n            addDependency(`count:${key}`)\n            return ledger.value(key)\n          }\n        }\n        return Reflect.get(...args)\n      },\n    })\n  }\n\n  /**\n   * Return values from our observer proxy first pass through this function\n   * which gives us a chance to listen sub-dependencies and properties.\n   */\n  const observe = function (value: any, property: string | symbol) {\n    if (isNode(value)) {\n      return createObserver(value, deps)\n    }\n    if (property === 'value') addDependency('commit')\n    if (property === '_value') addDependency('input')\n    if (property === 'props') return observeProps(value)\n    if (property === 'ledger') return observeLedger(value)\n    if (property === 'children') {\n      addDependency('child')\n      addDependency('childRemoved')\n    }\n    return value\n  }\n\n  /**\n   * The actual proxy object of the original node.\n   */\n  const {\n    proxy: observed,\n    revoke,\n  }: { proxy: FormKitNode; revoke: () => void } = Proxy.revocable(node, {\n    get(...args) {\n      switch (args[1]) {\n        case '_node':\n          return node\n        case 'deps':\n          return deps\n        case 'watch':\n          return <T extends FormKitWatchable>(\n            block: T,\n            after?: (value: unknown) => void,\n            pos?: 'push' | 'unshift'\n          ) => watch(observed as FormKitObservedNode, block, after, pos)\n        case 'observe':\n          return () => {\n            const old = new Map(deps)\n            deps.clear()\n            deps.active = true\n            return old\n          }\n        case 'stopObserve':\n          return () => {\n            const newDeps = new Map(deps)\n            deps.active = false\n            return newDeps\n          }\n        case 'receipts':\n          return receipts\n        case 'kill':\n          return (): undefined => {\n            removeListeners(receipts)\n            revokedObservers.add(args[2])\n            revoke()\n            return undefined\n          }\n      }\n      const value = Reflect.get(...args)\n      // If we're dealing with a function, we need to sub-call the function\n      // get that return value, and pass it through the same logic.\n      if (typeof value === 'function') {\n        return (...subArgs: any[]) => {\n          const subValue = value(...subArgs)\n          return observe(subValue, args[1])\n        }\n      }\n      return observe(value, args[1])\n    },\n  })\n  return observed as unknown as FormKitObservedNode\n}\n\n/**\n * Given two maps (`toAdd` and `toRemove`), apply the dependencies as event\n * listeners on the underlying nodes.\n * @param node - The node to apply dependencies to.\n * @param deps - A tuple of toAdd and toRemove FormKitDependencies maps.\n * @param callback - The callback to add or remove.\n * @internal\n */\nexport function applyListeners(\n  node: FormKitObservedNode,\n  [toAdd, toRemove]: [FormKitDependencies, FormKitDependencies],\n  callback: FormKitEventListener,\n  pos?: 'unshift' | 'push'\n): void {\n  toAdd.forEach((events, depNode) => {\n    events.forEach((event) => {\n      node.receipts.has(depNode) || node.receipts.set(depNode, {})\n      const events = node.receipts.get(depNode) ?? {}\n      events[event] = events[event] ?? []\n      events[event].push(depNode.on(event, callback, pos))\n      node.receipts.set(depNode, events)\n    })\n  })\n  toRemove.forEach((events, depNode) => {\n    events.forEach((event) => {\n      if (node.receipts.has(depNode)) {\n        const nodeReceipts = node.receipts.get(depNode)\n        if (nodeReceipts && has(nodeReceipts, event)) {\n          nodeReceipts[event].map(depNode.off)\n          delete nodeReceipts[event]\n          node.receipts.set(depNode, nodeReceipts)\n        }\n      }\n    })\n  })\n}\n\n/**\n * Remove all the receipts from the observed node and subtree.\n * @param receipts - The FormKit observer receipts to remove.\n * @public\n */\nexport function removeListeners(receipts: FormKitObserverReceipts): void {\n  receipts.forEach((events, node) => {\n    for (const event in events) {\n      events[event].map(node.off)\n    }\n  })\n  receipts.clear()\n}\n\n/**\n * Observes a chunk of code to dependencies, and then re-calls that chunk of\n * code when those dependencies are manipulated.\n * @param node - The node to observer\n * @param block - The block of code to observe\n * @param after - A function to call after a effect has been run.\n * @public\n */\nfunction watch<T extends FormKitWatchable>(\n  node: FormKitObservedNode,\n  block: T,\n  after?: (value: unknown) => void,\n  pos?: 'push' | 'unshift'\n): void {\n  const doAfterObservation = (res: unknown) => {\n    const newDeps = node.stopObserve()\n    applyListeners(\n      node,\n      diffDeps(oldDeps, newDeps),\n      () => watch(node, block, after, pos),\n      pos\n    )\n    if (after) after(res)\n  }\n  const oldDeps = new Map(node.deps)\n  node.observe()\n  const res = block(node)\n  if (res instanceof Promise) res.then((val) => doAfterObservation(val))\n  else doAfterObservation(res)\n}\n\n/**\n * Determines which nodes should be added as dependencies and which should be\n * removed.\n * @param previous - The previous watcher dependencies.\n * @param current - The new/current watcher dependencies.\n * @returns A tuple of maps: `toAdd` and `toRemove`.\n * @public\n */\nexport function diffDeps(\n  previous: FormKitDependencies,\n  current: FormKitDependencies\n): [FormKitDependencies, FormKitDependencies] {\n  const toAdd: FormKitDependencies = new Map()\n  const toRemove: FormKitDependencies = new Map()\n  current.forEach((events, node) => {\n    if (!previous.has(node)) {\n      toAdd.set(node, events)\n    } else {\n      const eventsToAdd = new Set<string>()\n      const previousEvents = previous.get(node)\n      events.forEach(\n        (event) => !previousEvents?.has(event) && eventsToAdd.add(event)\n      )\n      toAdd.set(node, eventsToAdd)\n    }\n  })\n  previous.forEach((events, node) => {\n    if (!current.has(node)) {\n      toRemove.set(node, events)\n    } else {\n      const eventsToRemove = new Set<string>()\n      const newEvents = current.get(node)\n      events.forEach(\n        (event) => !newEvents?.has(event) && eventsToRemove.add(event)\n      )\n      toRemove.set(node, eventsToRemove)\n    }\n  })\n  return [toAdd, toRemove]\n}\n\n/**\n * Checks if the given node is revoked.\n * @param node - Any observed node to check.\n * @returns A `boolean` indicating if the node is revoked.\n * @public\n */\nexport function isKilled(node: FormKitNode | FormKitObservedNode): boolean {\n  return revokedObservers.has(node)\n}\n"]}