{
  "version": 3,
  "sources": ["../index.ts", "../src/ifUnless.ts", "../src/ConditionalBindingHandler.ts", "../src/with.ts", "../src/else.ts", "../src/index.ts"],
  "sourcesContent": ["export * from './src'\n", "import { unwrap } from '@tko/observable'\n\nimport ConditionalBindingHandler from './ConditionalBindingHandler'\n\n/**\n * For the `if:` binding.\n */\nexport class IfBindingHandler extends ConditionalBindingHandler {\n  ifCondition: any\n  constructor(...args: [any]) {\n    super(...args)\n    this.ifCondition = this.computed(() => !!unwrap(this.value))\n    this.computed('render')\n  }\n\n  shouldDisplayIf() {\n    return this.ifCondition()\n  }\n\n  override get bindingContext() {\n    return this.ifCondition.isActive()\n      ? this.$context.extend(() => {\n          // Ensure that this context is dependant upon the conditional, so the\n          // order of binding application is: conditional before its children.\n          // See https://github.com/knockout/knockout/pull/2226\n          this.ifCondition()\n          return null\n        })\n      : this.$context\n  }\n\n  override renderStatus() {\n    let shouldDisplay = this.shouldDisplayIf()\n\n    if (this.elseChainIsAlreadySatisfied) {\n      shouldDisplay = false\n      // needsRefresh = isFirstRender || this.didDisplayOnLastUpdate FIXME\n      this.completesElseChain(true)\n    } else {\n      this.completesElseChain(shouldDisplay)\n    }\n    return { shouldDisplay }\n  }\n}\n\nexport class UnlessBindingHandler extends IfBindingHandler {\n  override shouldDisplayIf() {\n    return !super.shouldDisplayIf()\n  }\n}\n", "import { cloneNodes, virtualElements, cleanNode, domData } from '@tko/utils'\n\nimport { dependencyDetection, observable } from '@tko/observable'\n\nimport type { Observable } from '@tko/observable'\n\nimport { applyBindingsToDescendants, AsyncBindingHandler } from '@tko/bind'\n\nimport type { BindingContext } from '@tko/bind'\n\n//todo signature of renderStatus but be discussed\nexport type RenderStatusKeys = 'shouldDisplay'\n\n/**\n * Create a DOMbinding that controls DOM nodes presence\n *\n * Covers e.g.\n *\n * 1. DOM Nodes contents\n *\n * <div data-bind='if: x'>\n * <!-- else --> ... an optional 'if'\n * </div>\n *\n * 2. Virtual elements\n *\n * <!-- ko if: x -->\n * <!-- else -->\n * <!-- /ko -->\n *\n * 3. Else binding\n * <div data-bind='if: x'></div>\n * <div data-bind='else'></div>\n *\n * Requires `renderStatus` and `get bindingContext` to be overloaded,\n * and this.computed('render') must be called in the child constructor.\n */\nexport default class ConditionalBindingHandler extends AsyncBindingHandler {\n  get bindingContext(): BindingContext {\n    throw new Error('bindingContext() must be implemented in the child class')\n  }\n  completesElseChain: Observable\n  hasElse: boolean\n  ifElseNodes?: any\n  constructor(params) {\n    super(params)\n    this.hasElse = this.detectElse(this.$element)\n    const elseChainSatisfied = (this.completesElseChain = observable())\n    domData.set(this.$element, 'conditional', { elseChainSatisfied })\n  }\n\n  getIfElseNodes() {\n    if (this.ifElseNodes) {\n      return this.ifElseNodes\n    }\n    if (dependencyDetection.getDependenciesCount() || this.hasElse) {\n      return this.cloneIfElseNodes(this.$element, this.hasElse)\n    }\n  }\n\n  renderStatus(): Record<RenderStatusKeys, any> {\n    throw new Error('renderStatus() must be implemented in the child class')\n  }\n\n  render() {\n    const isFirstRender = !this.ifElseNodes\n    const { shouldDisplay } = this.renderStatus()\n\n    // Save the nodes before we possibly remove them from the DOM.\n    this.ifElseNodes = this.getIfElseNodes() || {}\n\n    if (shouldDisplay) {\n      const useOriginalNodes = isFirstRender && !this.hasElse\n      this.renderAndApplyBindings(this.ifElseNodes.ifNodes, useOriginalNodes)\n    } else if (this.hasElse) {\n      this.renderAndApplyBindings(this.ifElseNodes.elseNodes)\n    } else {\n      virtualElements.emptyNode(this.$element)\n    }\n  }\n\n  async renderAndApplyBindings(nodes: ArrayLike<Node>, useOriginalNodes?: boolean) {\n    if (!useOriginalNodes) {\n      virtualElements.setDomNodeChildren(this.$element, cloneNodes(nodes))\n    }\n    const bound = await applyBindingsToDescendants(this.bindingContext, this.$element)\n    this.completeBinding(bound)\n  }\n\n  /**\n   * This may be truthy for the `else` binding.\n   */\n  get elseChainIsAlreadySatisfied() {\n    return false\n  }\n\n  /**\n   * Test a node for whether it represents an 'else' condition.\n   * @param  {HTMLElement}  node to be tested\n   * @return {Boolean}      true when\n   *\n   * Matches <!-- else -->\n   */\n  isElseNode(node) {\n    return node.nodeType === Node.COMMENT_NODE && node.nodeValue.trim().toLowerCase() === 'else'\n  }\n\n  detectElse(element) {\n    const children = virtualElements.childNodes(element)\n    for (let i = 0, j = children.length; i < j; ++i) {\n      if (this.isElseNode(children[i])) {\n        return true\n      }\n    }\n    return false\n  }\n\n  /**\n   * Clone the nodes, returning `ifNodes`, `elseNodes`\n   * @param  {HTMLElement} element The nodes to be cloned\n   * @param  {boolean}    hasElse short-circuit to speed up the inner-loop.\n   * @return {object}         Containing the cloned nodes.\n   */\n  cloneIfElseNodes(element, hasElse) {\n    const children = virtualElements.childNodes(element)\n    const ifNodes = new Array()\n    const elseNodes = new Array()\n    let target = ifNodes\n\n    for (let i = 0, j = children.length; i < j; ++i) {\n      if (hasElse && this.isElseNode(children[i])) {\n        target = elseNodes\n        hasElse = false\n      } else {\n        target.push(cleanNode(children[i].cloneNode(true)))\n      }\n    }\n\n    return { ifNodes, elseNodes }\n  }\n\n  override get controlsDescendants() {\n    return true\n  }\n  static override get allowVirtualElements() {\n    return true\n  }\n}\n", "import { options } from '@tko/utils'\n\nimport { unwrap } from '@tko/observable'\n\nimport ConditionalBindingHandler from './ConditionalBindingHandler'\n\n/**\n * The following fails somewhere in the `limit` functions of Observables i.e.\n * it's an issue related to async/deferUpdates.\n */\nexport class WithBindingHandler extends ConditionalBindingHandler {\n  asOption: any\n  conditional: any\n  constructor(...args: [any]) {\n    super(...args)\n    this.asOption = this.allBindings.get('as')\n\n    // If given `as`, reduce the condition to a boolean, so it does not\n    // change & refresh when the value is updated.\n    const conditionalFn =\n      this.asOption && !options.createChildContextWithAs ? () => Boolean(unwrap(this.value)) : () => unwrap(this.value)\n    this.conditional = this.computed(conditionalFn)\n\n    this.computed('render')\n  }\n\n  override get bindingContext() {\n    if (!this.asOption) {\n      return this.$context.createChildContext(this.valueAccessor)\n    }\n    return options.createChildContextWithAs\n      ? this.$context.createChildContext(this.value, this.asOption)\n      : this.$context.extend({ [this.asOption]: this.value })\n  }\n\n  override renderStatus() {\n    const shouldDisplay = Boolean(this.conditional())\n    return { shouldDisplay }\n  }\n}\n", "import { virtualElements, domData } from '@tko/utils'\n\nimport { unwrap } from '@tko/observable'\n\nimport { IfBindingHandler } from './ifUnless'\n\n/**\n * The `else` binding\n * (not to be mistaken for `<!-- else -->` inside if bindings.\n */\nexport class ElseBindingHandler extends IfBindingHandler {\n  _elseChain: any\n\n  override shouldDisplayIf() {\n    return super.shouldDisplayIf() || this.value === undefined\n  }\n\n  /**\n   * Return any conditional that precedes the given node.\n   * @return {object}      { elseChainSatisfied: observable }\n   */\n  override get elseChainIsAlreadySatisfied() {\n    if (!this._elseChain) {\n      this._elseChain = this.readElseChain()\n    }\n    return unwrap(this._elseChain.elseChainSatisfied)\n  }\n\n  readElseChain() {\n    let node: ChildNode | null = this.$element\n    do {\n      node = node.previousSibling\n    } while (node && node.nodeType !== Node.ELEMENT_NODE && node.nodeType !== Node.COMMENT_NODE)\n\n    if (!node) {\n      return false\n    }\n\n    if (node.nodeType === Node.COMMENT_NODE) {\n      node = virtualElements.previousSibling(node)\n    }\n\n    return domData.get(node as Node, 'conditional') || {}\n  }\n}\n", "import { IfBindingHandler, UnlessBindingHandler } from './ifUnless'\n\nimport { WithBindingHandler } from './with'\n\nimport { ElseBindingHandler } from './else'\n\nexport const bindings = {\n  if: IfBindingHandler,\n  with: WithBindingHandler,\n  ifnot: UnlessBindingHandler,\n  unless: UnlessBindingHandler,\n  else: ElseBindingHandler,\n  elseif: ElseBindingHandler\n}\n"],
  "mappings": "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",
  "names": ["import_observable", "import_utils", "import_observable", "import_utils", "import_observable"]
}
