{"version":3,"sources":["jsdelivr-header.js","/npm/page-parser-tree@0.4.0/src/index.js"],"names":[],"mappings":"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","file":"/npm/page-parser-tree@0.4.0/js/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/page-parser-tree@0.4.0/js/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/* @flow */\n\nimport LiveSet from 'live-set';\nimport type { LiveSetController, LiveSetSubscription } from 'live-set';\nimport liveSetMerge from 'live-set/merge';\nimport liveSetFlatMapR from 'live-set/flatMapR';\nimport Scheduler from 'live-set/Scheduler';\nimport { TagTree } from 'tag-tree';\nimport type { TagTreeController, TagTreeNode } from 'tag-tree';\n\nimport type { NodeTagPair, ElementContext } from './internalTypes';\n\nimport watcherFinderMerger from './watcherFinderMerger';\nimport createTransformer from './createTransformer';\n\nexport type Selector =\n  | string\n  | {| $filter: (el: HTMLElement) => boolean |}\n  | {| $map: (el: HTMLElement) => ?HTMLElement |}\n  | {|\n      $watch: {|\n        attributeFilter: string[],\n        cond: string | ((el: HTMLElement) => boolean)\n      |}\n    |}\n  | {| $or: Array<Array<Selector>> |}\n  | {| $log: string |};\n\nexport type Watcher = {|\n  sources: Array<string | null>,\n  tag: string,\n  selectors: Array<Selector>\n|};\n\nexport type Finder = {|\n  fn(root: HTMLElement): Array<HTMLElement> | NodeList<HTMLElement>,\n  interval?: ?number | ((elementCount: number, timeRunning: number) => number)\n|};\n\nexport type TagOptions = {|\n  ownedBy?: ?$ReadOnlyArray<string>\n|};\n\nexport type PageParserTreeOptions = {|\n  logError?: ?(err: Error, el: void | HTMLElement) => void,\n  tags: { [tag: string]: TagOptions },\n  watchers: $ReadOnlyArray<Watcher>,\n  finders: { [tag: string]: Finder }\n|};\n\nfunction makeTagOptions(options: PageParserTreeOptions) {\n  const map = new Map();\n  const list = [];\n  Object.keys(options.tags).forEach(tag => {\n    const tagOptions = options.tags[tag];\n    const { ownedBy } = tagOptions;\n    list.push({ tag, ownedBy });\n    map.set(tag, tagOptions);\n  });\n  Object.keys(options.finders)\n    .concat(options.watchers.map(w => w.tag))\n    .forEach(tag => {\n      if (!map.has(tag)) {\n        map.set(tag, { ownedBy: [] });\n        list.push({ tag });\n      }\n    });\n  return { map, list };\n}\n\nexport default class PageParserTree {\n  tree: TagTree<HTMLElement>;\n  _scheduler = new Scheduler();\n  _treeController: TagTreeController<HTMLElement>;\n\n  _rootMatchedSet: LiveSet<ElementContext>;\n  _ecSources: Map<\n    string,\n    {\n      liveSet: LiveSet<LiveSet<ElementContext>>,\n      controller: LiveSetController<LiveSet<ElementContext>>,\n      ecSet: LiveSet<ElementContext>\n    }\n  >;\n\n  _logError: (err: Error, el: void | HTMLElement) => void;\n  _options: PageParserTreeOptions;\n  _tagOptions: Map<string, TagOptions>;\n  _tagsList: Array<{| tag: string, ownedBy?: ?$ReadOnlyArray<string> |}>;\n  _subscriptions: Array<LiveSetSubscription> = [];\n\n  constructor(root: Document | HTMLElement, options: PageParserTreeOptions) {\n    let rootEl;\n    if (root.nodeType === Node.DOCUMENT_NODE) {\n      rootEl = ((root: any): Document).documentElement;\n      if (!rootEl) throw new Error('missing documentElement');\n    } else {\n      rootEl = (root: any);\n    }\n\n    this._options = options;\n    this._logError =\n      options.logError ||\n      function(err) {\n        setTimeout(() => {\n          throw err;\n        }, 0);\n      };\n\n    const { map: tagOptionsMap, list: tags } = makeTagOptions(this._options);\n    this._tagOptions = tagOptionsMap;\n    this._tagsList = tags;\n\n    this.tree = new TagTree({\n      root: rootEl,\n      tags,\n      executor: controller => {\n        this._treeController = controller;\n      }\n    });\n    this._rootMatchedSet = LiveSet.constant(\n      new Set([\n        {\n          el: this.tree.getValue(),\n          parents: [{ tag: null, node: this.tree }]\n        }\n      ]),\n      { scheduler: this._scheduler }\n    );\n\n    this._setupWatchersAndFinders();\n  }\n\n  _setupWatchersAndFinders() {\n    const tagsWithWatchers = new Set();\n    this._options.watchers.forEach(watcher => {\n      tagsWithWatchers.add(watcher.tag);\n    });\n\n    this._ecSources = new Map(\n      this._tagsList.map(({ tag }) => {\n        const tagOptions = this._tagOptions.get(tag);\n        if (!tagOptions) throw new Error();\n        const ownedBy = new Set(tagOptions.ownedBy || []);\n\n        const { liveSet, controller } = LiveSet.active(null, {\n          scheduler: this._scheduler\n        });\n        const combinedWatcherSet = tagsWithWatchers.has(tag)\n          ? liveSetFlatMapR(liveSet, s => s)\n          : null;\n        const finder = this._options.finders[tag];\n        const ecsToTag = finder\n          ? watcherFinderMerger(\n              this._scheduler,\n              this.tree,\n              tag,\n              tagOptions,\n              combinedWatcherSet,\n              finder,\n              this._logError\n            )\n          : combinedWatcherSet ||\n            LiveSet.constant(new Set(), { scheduler: this._scheduler });\n\n        const elementsToNodes: Map<\n          HTMLElement,\n          TagTreeNode<HTMLElement>\n        > = new Map();\n\n        function findParentNode(\n          taggedParents: NodeTagPair[]\n        ): TagTreeNode<HTMLElement> {\n          let parentNode;\n          for (let i = taggedParents.length - 1; i >= 0; i--) {\n            if (\n              taggedParents[i].tag == null ||\n              ownedBy.has(taggedParents[i].tag)\n            ) {\n              parentNode = taggedParents[i].node;\n              break;\n            }\n          }\n          if (!parentNode) throw new Error();\n          return parentNode;\n        }\n\n        const ecSet = new LiveSet({\n          scheduler: this._scheduler,\n          read() {\n            throw new Error();\n          },\n          listen: (setValues, controller) => {\n            const m: Map<ElementContext, ElementContext> = new Map();\n\n            const cb = (ec: ElementContext): ElementContext => {\n              const { el, parents } = ec;\n              const parentNode = findParentNode(parents);\n              const node = this._treeController.addTaggedValue(\n                parentNode,\n                tag,\n                el\n              );\n              if (elementsToNodes.has(el)) {\n                this._logError(\n                  new Error(\n                    `PageParserTree(${tag}) watcher received element twice`\n                  ),\n                  el\n                );\n              }\n              elementsToNodes.set(el, node);\n\n              const newParents = ec.parents.concat([{ tag, node }]);\n              return { el, parents: newParents };\n            };\n\n            return ecsToTag.subscribe({\n              start: () => {\n                const s = new Set();\n                ecsToTag.values().forEach(value => {\n                  const newValue = cb(value);\n                  m.set(value, newValue);\n                  s.add(newValue);\n                });\n                setValues(s);\n              },\n              next: changes => {\n                const ecsRemovedInNotification = new Set();\n                if (changes.length > 1) {\n                  changes.forEach(change => {\n                    if (change.type === 'remove') {\n                      ecsRemovedInNotification.add(change.value);\n                    }\n                  });\n                }\n\n                changes.forEach(change => {\n                  if (change.type === 'add') {\n                    // Don't process adds of elements that are removed by a later\n                    // change in this notification.\n                    if (ecsRemovedInNotification.has(change.value)) return;\n                    const newValue = cb(change.value);\n                    m.set(change.value, newValue);\n                    controller.add(newValue);\n                  } else if (change.type === 'remove') {\n                    const newValue = m.get(change.value);\n                    if (!newValue) return;\n                    m.delete(change.value);\n                    controller.remove(newValue);\n\n                    const node = elementsToNodes.get(newValue.el);\n                    if (!node)\n                      throw new Error(\n                        'Should not happen: received removal of unseen element'\n                      );\n                    elementsToNodes.delete(newValue.el);\n                    const nodeParent = node.getParent();\n\n                    // The node might have already been removed from the tree if it\n                    // is owned by a node that was just removed.\n                    if (nodeParent && nodeParent.ownsNode(node)) {\n                      this._treeController.removeTaggedNode(\n                        nodeParent,\n                        tag,\n                        node\n                      );\n                    }\n                  }\n                });\n              },\n              error(err) {\n                controller.error(err);\n              },\n              complete() {\n                controller.end();\n              }\n            });\n          }\n        });\n\n        this._subscriptions.push(ecSet.subscribe({}));\n\n        return [tag, { liveSet, controller, ecSet }];\n      })\n    );\n\n    this._options.watchers.forEach(({ sources, selectors, tag }) => {\n      const sourceSets = sources.map(tag => {\n        if (!tag) return this._rootMatchedSet;\n        const entry = this._ecSources.get(tag);\n        if (!entry) throw new Error('Unknown source: ' + tag);\n        return entry.ecSet;\n      });\n      const sourceSet =\n        sourceSets.length === 1 ? sourceSets[0] : liveSetMerge(sourceSets);\n      const transformer = createTransformer(this._scheduler, selectors);\n\n      const ecEntry = this._ecSources.get(tag);\n      if (!ecEntry) throw new Error();\n      ecEntry.controller.add(transformer(sourceSet));\n    });\n\n    this._scheduler.flush();\n  }\n\n  _dumpWithoutEnd() {\n    this._subscriptions.forEach(sub => {\n      sub.unsubscribe();\n    });\n    this._subscriptions.length = 0;\n    this.tree.getOwned().forEach((liveSet, tag) => {\n      liveSet.values().forEach(node => {\n        this._treeController.removeTaggedNode(this.tree, tag, node);\n      });\n    });\n  }\n\n  dump() {\n    this._dumpWithoutEnd();\n    this._treeController.end();\n  }\n\n  // Intended for use with hot module replacement.\n  replaceOptions(options: PageParserTreeOptions) {\n    const tagErrStr = 'replaceOptions does not support tag changes';\n    const { map: tagOptionsMap } = makeTagOptions(options);\n    if (this._tagOptions.size !== tagOptionsMap.size) {\n      throw new Error(tagErrStr);\n    }\n    this._tagOptions.forEach((oldOptions, tag) => {\n      const newOptions = tagOptionsMap.get(tag);\n      if (!newOptions) throw new Error(tagErrStr);\n      const oldOwnedBy = oldOptions.ownedBy || [];\n      const newOwnedBy = new Set(newOptions.ownedBy || []);\n      if (oldOwnedBy.length !== newOwnedBy.size) throw new Error(tagErrStr);\n      oldOwnedBy.forEach(tag => {\n        if (!newOwnedBy.has(tag)) throw new Error(tagErrStr);\n      });\n    });\n\n    this._dumpWithoutEnd();\n    this._options = options;\n    this._setupWatchersAndFinders();\n  }\n}\n"]}