valyrian.js 8.0.13 → 8.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/dist/lib/native-store/index.d.ts +1 -1
  2. package/dist/lib/native-store/index.d.ts.map +1 -1
  3. package/dist/lib/node/index.d.ts +2 -2
  4. package/dist/lib/node/index.d.ts.map +1 -1
  5. package/dist/lib/node/utils/server-storage.d.ts +12 -0
  6. package/dist/lib/node/utils/server-storage.d.ts.map +1 -0
  7. package/dist/lib/node/utils/tree-adapter.d.ts.map +1 -1
  8. package/dist/lib/pulses/index.d.ts +4 -0
  9. package/dist/lib/pulses/index.d.ts.map +1 -1
  10. package/dist/lib/redux-devtools/index.d.ts +15 -0
  11. package/dist/lib/redux-devtools/index.d.ts.map +1 -0
  12. package/dist/lib/request/index.d.ts.map +1 -1
  13. package/dist/lib/translate/index.d.ts +6 -2
  14. package/dist/lib/translate/index.d.ts.map +1 -1
  15. package/dist/native-store/index.js +26 -13
  16. package/dist/native-store/index.js.map +3 -3
  17. package/dist/native-store/index.min.js +1 -1
  18. package/dist/native-store/index.min.js.map +1 -1
  19. package/dist/native-store/index.mjs +26 -13
  20. package/dist/native-store/index.mjs.map +3 -3
  21. package/dist/node/index.js +57 -94
  22. package/dist/node/index.js.map +4 -4
  23. package/dist/node/index.mjs +57 -94
  24. package/dist/node/index.mjs.map +4 -4
  25. package/dist/pulses/index.js +32 -1
  26. package/dist/pulses/index.js.map +2 -2
  27. package/dist/pulses/index.min.js +1 -1
  28. package/dist/pulses/index.min.js.map +1 -1
  29. package/dist/pulses/index.mjs +32 -1
  30. package/dist/pulses/index.mjs.map +2 -2
  31. package/dist/redux-devtools/index.js +81 -0
  32. package/dist/redux-devtools/index.js.map +7 -0
  33. package/dist/redux-devtools/index.min.js +1 -0
  34. package/dist/redux-devtools/index.min.js.map +1 -0
  35. package/dist/redux-devtools/index.mjs +60 -0
  36. package/dist/redux-devtools/index.mjs.map +7 -0
  37. package/dist/request/index.js +20 -7
  38. package/dist/request/index.js.map +2 -2
  39. package/dist/request/index.min.js +1 -1
  40. package/dist/request/index.min.js.map +1 -1
  41. package/dist/request/index.mjs +20 -7
  42. package/dist/request/index.mjs.map +2 -2
  43. package/dist/translate/index.js +36 -26
  44. package/dist/translate/index.js.map +3 -3
  45. package/dist/translate/index.min.js +1 -1
  46. package/dist/translate/index.min.js.map +1 -1
  47. package/dist/translate/index.mjs +36 -26
  48. package/dist/translate/index.mjs.map +3 -3
  49. package/lib/native-store/index.ts +22 -8
  50. package/lib/node/index.ts +4 -4
  51. package/lib/node/utils/server-storage.ts +71 -0
  52. package/lib/node/utils/tree-adapter.ts +25 -1
  53. package/lib/pulses/index.ts +54 -6
  54. package/lib/redux-devtools/index.ts +86 -0
  55. package/lib/request/index.ts +28 -8
  56. package/lib/translate/index.ts +37 -26
  57. package/package.json +14 -14
  58. package/dist/lib/node/utils/session-storage.d.ts +0 -22
  59. package/dist/lib/node/utils/session-storage.d.ts.map +0 -1
  60. package/lib/node/utils/session-storage.ts +0 -120
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../lib/node/utils/tree-adapter.ts", "../../lib/node/index.ts", "../../lib/node/utils/icons.ts", "../../lib/node/utils/inline.ts", "../../lib/node/utils/sw.ts", "../../lib/node/utils/session-storage.ts"],
4
- "sourcesContent": ["/* eslint-disable no-use-before-define */\n/* eslint-disable complexity */\ninterface ChildNodes extends Array<Node | Element | Text | DocumentFragment> {}\n\nexport class Node implements Node {\n // eslint-disable-next-line no-use-before-define\n childNodes: ChildNodes = [];\n baseURI: string = \"\";\n\n tag_name!: string;\n get nodeName(): string {\n return this.tag_name.toLowerCase();\n }\n set nodeName(name: string) {\n this.tag_name = name;\n }\n get tagName(): string {\n return this.tag_name;\n }\n set tagName(name: string) {\n this.tag_name = name;\n }\n\n node_type!: number;\n get nodeType(): number {\n return this.node_type;\n }\n set nodeType(type: number) {\n this.node_type = type;\n }\n\n node_value = \"\";\n attributes: Attr[] = [];\n set textContent(text) {\n this.node_value = String(text);\n }\n get textContent() {\n return this.node_value;\n }\n set nodeValue(text) {\n this.node_value = String(text);\n }\n get nodeValue() {\n return this.node_value;\n }\n\n // eslint-disable-next-line no-use-before-define\n parent_node: Node | null = null;\n get parentNode() {\n return this.parent_node;\n }\n set parentNode(node) {\n this.parent_node = node;\n }\n\n get parentElement(): Element | null {\n return this.parentNode instanceof Element ? this.parentNode : null;\n }\n\n set parentElement(node) {\n this.parentNode = node;\n }\n\n #dataset: Record<string | number, any> = {};\n\n get dataset() {\n return this.#dataset;\n }\n\n set dataset(value) {\n this.#dataset = value;\n }\n\n constructor() {}\n\n appendChild<T extends Node>(node: T): T {\n if (node) {\n node.parentNode && node.parentNode.removeChild(node as Node);\n this.childNodes.push(node);\n node.parentNode = this;\n node.parentElement = this instanceof Element ? this : null;\n }\n return node;\n }\n\n insertBefore<T extends Node>(node: T, child: Node | null): T {\n if (node) {\n node.parentNode && node.parentNode.removeChild(node as Node);\n node.parentNode = this;\n node.parentElement = this instanceof Element ? this : null;\n if (child) {\n const idx = this.childNodes.indexOf(child);\n this.childNodes.splice(idx, 0, node);\n } else {\n this.childNodes.push(node);\n }\n }\n return node;\n }\n\n replaceChild<T extends Node>(node: Node, child: T): T {\n if (node && child && child.parentNode === this) {\n this.insertBefore(node, child);\n child.parentNode && child.parentNode.removeChild(child);\n }\n return child;\n }\n removeChild<T extends Node>(child: T): T {\n if (child && child.parentNode === this) {\n const idx = (this.childNodes as unknown as Node[]).indexOf(child);\n (this.childNodes as unknown as Node[]).splice(idx, 1);\n child.parentNode = null;\n child.parentElement = null;\n }\n return child;\n }\n\n remove(): Node {\n return this.parentNode ? this.parentNode.removeChild(this) : this;\n }\n\n cloneNode(deep?: boolean | undefined): Node {\n if (this.nodeType === 3) {\n return new Text(this.nodeValue);\n }\n\n if (this.nodeType === 1) {\n const node = new Element();\n node.nodeType = this.nodeType;\n this.nodeName = this.nodeName;\n if (this.attributes) {\n for (let i = 0, l = this.attributes.length; i < l; i++) {\n node.setAttribute(this.attributes[i].nodeName, this.attributes[i].nodeValue);\n }\n }\n\n for (const key in this.dataset) {\n node.dataset[key] = this.dataset[key];\n }\n\n if (deep) {\n for (let i = 0, l = this.childNodes.length; i < l; i++) {\n node.appendChild(this.childNodes[i].cloneNode(deep));\n }\n }\n return node;\n }\n\n const node = new Node();\n node.nodeType = this.nodeType;\n node.nodeName = this.nodeName;\n return node;\n }\n\n setAttribute(name: string, value: any) {\n const attr = {\n nodeName: name,\n nodeValue: value\n };\n let idx = -1;\n for (let i = 0, l = this.attributes.length; i < l; i++) {\n if (this.attributes[i].nodeName === name) {\n idx = i;\n break;\n }\n }\n idx === -1 ? this.attributes.push(attr as Attr) : this.attributes.splice(idx, 1, attr as Attr);\n }\n\n getAttribute(name: string) {\n for (let i = 0, l = this.attributes.length; i < l; i++) {\n if (this.attributes[i].nodeName === name) {\n return this.attributes[i].nodeValue;\n }\n }\n }\n\n removeAttribute(name: string) {\n let idx = -1;\n for (let i = 0, l = this.attributes.length; i < l; i++) {\n if (this.attributes[i].nodeName === name) {\n idx = i;\n break;\n }\n }\n if (idx > -1) {\n this.attributes.splice(idx, 1);\n }\n }\n\n getElementById(id: string): Node | null {\n let elementFound;\n for (let i = 0, l = this.childNodes.length; i < l; i++) {\n if (this.childNodes[i].nodeType === 1) {\n if (this.childNodes[i].getAttribute(\"id\") === id) {\n elementFound = this.childNodes[i];\n break;\n }\n elementFound = this.childNodes[i].getElementById(id);\n if (elementFound) {\n break;\n }\n }\n }\n return elementFound || null;\n }\n\n // Not implemented\n // firstChild!: ChildNode | null;\n // isConnected!: boolean;\n // lastChild!: ChildNode | null;\n // nextSibling!: ChildNode | null;\n // ownerDocument!: Document | null;\n // parentElement!: HTMLElement | null;\n // previousSibling!: ChildNode | null;\n // compareDocumentPosition(other: Node): number {\n // throw new Error(\"Method not implemented.\");\n // }\n // contains(other: Node | null): boolean {\n // throw new Error(\"Method not implemented.\");\n // }\n // getRootNode(options?: GetRootNodeOptions | undefined): Node {\n // throw new Error(\"Method not implemented.\");\n // }\n // hasChildNodes(): boolean {\n // throw new Error(\"Method not implemented.\");\n // }\n // isDefaultNamespace(namespace: string | null): boolean {\n // throw new Error(\"Method not implemented.\");\n // }\n // isEqualNode(otherNode: Node | null): boolean {\n // throw new Error(\"Method not implemented.\");\n // }\n // isSameNode(otherNode: Node | null): boolean {\n // throw new Error(\"Method not implemented.\");\n // }\n // lookupNamespaceURI(prefix: string | null): string | null {\n // throw new Error(\"Method not implemented.\");\n // }\n // lookupPrefix(namespace: string | null): string | null {\n // throw new Error(\"Method not implemented.\");\n // }\n // normalize(): void {\n // throw new Error(\"Method not implemented.\");\n // }\n // ATTRIBUTE_NODE!: number;\n // CDATA_SECTION_NODE!: number;\n // COMMENT_NODE!: number;\n // DOCUMENT_FRAGMENT_NODE!: number;\n // DOCUMENT_NODE!: number;\n // DOCUMENT_POSITION_CONTAINED_BY!: number;\n // DOCUMENT_POSITION_CONTAINS!: number;\n // DOCUMENT_POSITION_DISCONNECTED!: number;\n // DOCUMENT_POSITION_FOLLOWING!: number;\n // DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC!: number;\n // DOCUMENT_POSITION_PRECEDING!: number;\n // DOCUMENT_TYPE_NODE!: number;\n // ELEMENT_NODE!: number;\n // ENTITY_NODE!: number;\n // ENTITY_REFERENCE_NODE!: number;\n // NOTATION_NODE!: number;\n // PROCESSING_INSTRUCTION_NODE!: number;\n // TEXT_NODE!: number;\n addEventListener(\n // eslint-disable-next-line no-unused-vars\n type: string,\n // eslint-disable-next-line no-unused-vars\n callback: EventListenerOrEventListenerObject | null,\n // eslint-disable-next-line no-unused-vars\n options?: boolean | AddEventListenerOptions | undefined\n ): void {\n // throw new Error(\"Method not implemented.\");\n }\n // dispatchEvent(event: Event): boolean {\n // throw new Error(\"Method not implemented.\");\n // }\n removeEventListener(\n // eslint-disable-next-line no-unused-vars\n type: string,\n // eslint-disable-next-line no-unused-vars\n callback: EventListenerOrEventListenerObject | null,\n // eslint-disable-next-line no-unused-vars\n options?: boolean | EventListenerOptions | undefined\n ): void {\n // throw new Error(\"Method not implemented.\");\n }\n}\n\nexport class Text extends Node {\n constructor(text: any) {\n super();\n this.nodeType = 3;\n this.nodeName = \"#text\";\n this.node_value = String(text);\n }\n}\n\nfunction updateElementStyles(element: Element, state: Record<string, any>) {\n let str = \"\";\n for (const key in state) {\n const value = state[key];\n if (typeof value !== \"undefined\" && value !== null && String(value).length > 0) {\n str += `${key}: ${state[key]};`;\n }\n }\n if (str.length === 0) {\n element.removeAttribute(\"style\");\n } else {\n element.setAttribute(\"style\", str);\n }\n}\n\nexport class Element extends Node {\n constructor() {\n super();\n this.nodeType = 1;\n this.attributes = [];\n this.childNodes = [];\n }\n\n _style = new Proxy(\n {},\n {\n get: (state: Record<string, any>, prop: string) => state[prop],\n set: (state: Record<string, any>, prop: string, value: any) => {\n state[prop] = value;\n updateElementStyles(this, state);\n return true;\n },\n deleteProperty: (state: Record<string, any>, prop: string) => {\n Reflect.deleteProperty(state, prop);\n updateElementStyles(this, state);\n return true;\n }\n }\n );\n\n get style() {\n return this._style as any;\n }\n\n set style(value: string) {\n if (typeof value === \"string\") {\n // should match pairs like \"color: red; font-size: 12px; background: url(http://example.com/image.png?s=1024x1024&amp;w=is&amp;k=20&amp;c=ASa_AG8uP5Di7azXgJraSA6ME7fbLB0GX4YT_OzCARI=);\"\n const regex = /([^:\\s]+):\\s*((url\\([^)]+\\))|[^;]+(?=(;|$)))/g;\n let match;\n\n while ((match = regex.exec(value)) !== null) {\n this._style[match[1]] = match[2].trim();\n }\n\n return;\n }\n\n throw new Error(\"Cannot set style\");\n }\n\n get className(): string {\n return this.getAttribute(\"class\") || \"\";\n }\n\n set className(value: string | boolean) {\n if (value == null || value === false) {\n this.removeAttribute(\"class\");\n } else {\n this.setAttribute(\"class\", String(value));\n }\n }\n\n classList = {\n toggle: (item: any, force: any) => {\n if (item) {\n const classes = (this.className || \"\").split(\" \");\n const itemIndex = classes.indexOf(item);\n if (force && itemIndex === -1) {\n classes.push(item);\n }\n\n if (!force && itemIndex !== -1) {\n classes.splice(itemIndex, 1);\n }\n\n const final = classes.join(\" \").trim();\n if (final.length) {\n this.className = classes.join(\" \").trim();\n } else {\n this.className = false;\n }\n }\n }\n };\n\n get id(): string {\n return this.getAttribute(\"id\") || \"\";\n }\n\n set id(value: string | boolean) {\n if (value == null || value === false) {\n this.removeAttribute(\"id\");\n } else {\n this.setAttribute(\"id\", String(value));\n }\n }\n\n set textContent(text) {\n this.nodeValue = String(text);\n this.childNodes = this.nodeValue ? [new Text(this.nodeValue)] : [];\n }\n get textContent() {\n return this.nodeValue;\n }\n\n set innerText(text) {\n this.nodeValue = String(text);\n }\n\n get innerText() {\n return this.nodeValue;\n }\n\n get innerHTML() {\n let str = \"\";\n for (let i = 0, l = this.childNodes.length; i < l; i++) {\n // console.log(\"domToHtml\", this.childNodes[i], domToHtml(this.childNodes[i] as Element));\n str += domToHtml(this.childNodes[i] as Element);\n }\n return str;\n }\n\n set innerHTML(html) {\n this.textContent = \"\";\n const result = htmlToDom(html);\n if (result instanceof DocumentFragment) {\n for (let i = 0, l = result.childNodes.length; i < l; i++) {\n this.appendChild(result.childNodes[i]);\n }\n } else {\n this.appendChild(result);\n }\n }\n\n get outerHTML(): string {\n return domToHtml(this);\n }\n}\n\nexport class DocumentFragment extends Element {\n constructor() {\n super();\n this.nodeType = 11;\n this.nodeName = \"#document-fragment\";\n }\n}\n\nexport class Document extends Element {\n constructor() {\n super();\n this.nodeType = 9;\n this.nodeName = \"#document\";\n this.body = this.createElement(\"body\");\n }\n\n body: Element;\n\n createDocumentFragment(): DocumentFragment {\n return new DocumentFragment();\n }\n\n createElement(type: string) {\n const element = new Element();\n element.nodeName = type.toUpperCase();\n return element;\n }\n\n createElementNS(ns: string, type: string) {\n const element = this.createElement(type);\n element.baseURI = ns;\n return element;\n }\n\n createTextNode(text: any) {\n return new Text(text);\n }\n}\n\nconst selfClosingTags = [\n \"area\",\n \"base\",\n \"br\",\n \"col\",\n \"embed\",\n \"hr\",\n \"img\",\n \"input\",\n \"link\",\n \"meta\",\n \"param\",\n \"source\",\n \"track\",\n \"wbr\",\n \"!doctype\"\n];\n\nexport function domToHtml(dom: Element | Text | DocumentFragment): string {\n if (dom.nodeType === 3) {\n return dom.textContent;\n }\n\n if (dom.nodeType === 1) {\n const name = dom.nodeName.toLowerCase();\n let str = \"<\" + name;\n for (let i = 0, l = dom.attributes.length; i < l; i++) {\n str += \" \" + dom.attributes[i].nodeName + '=\"' + dom.attributes[i].nodeValue + '\"';\n }\n\n if (selfClosingTags.indexOf(name) === -1) {\n str += \">\";\n if (dom.childNodes && dom.childNodes.length > 0) {\n for (let i = 0, l = dom.childNodes.length; i < l; i++) {\n const child = domToHtml(dom.childNodes[i] as Element);\n if (child) {\n str += child;\n }\n }\n }\n str += \"</\" + name + \">\";\n } else {\n str += \"/>\";\n }\n\n return str;\n }\n\n return \"\";\n}\n\nexport function domToHyperscript(childNodes: ChildNodes, depth = 1) {\n let spaces = \"\";\n for (let i = 0; i < depth; i++) {\n spaces += \" \";\n }\n\n return childNodes\n .map((item) => {\n if (item.nodeType === 10) {\n return `\\n${spaces}\"<!DOCTYPE html>\"`;\n } else if (item.nodeType === 3) {\n return `\\n${spaces}\"${item.nodeValue}\"`;\n } else {\n let str = `\\n${spaces}v(\"${item.nodeName}\", `;\n\n if (item.attributes) {\n const attrs: Record<string, any> = {};\n for (let i = 0, l = item.attributes.length; i < l; i++) {\n const attr = item.attributes[i];\n attrs[attr.nodeName] = attr.nodeValue;\n }\n str += JSON.stringify(attrs);\n } else {\n str += \"{}\";\n }\n\n str += \", [\";\n if (item.childNodes && item.childNodes.length > 0) {\n str += `${domToHyperscript(item.childNodes as unknown as Element[], depth + 1)}\\n${spaces}`;\n }\n\n str += `])`;\n return str;\n }\n })\n .join(\",\");\n}\n\ninterface ObjectIndexItem {\n tagName: string;\n startsAt: number;\n endsAt: number | null;\n contentStartsAt: number;\n contentEndsAt: number | null;\n attributes: { [key: string]: any };\n children: ObjectIndexItem[];\n nodeValue: string | null;\n}\n\ninterface ObjectIndexItemWithContent extends ObjectIndexItem {\n endsAt: number;\n contentEndsAt: number;\n children: ObjectIndexItemWithContent[];\n}\n\ninterface ObjectIndexList extends Array<ObjectIndexItem> {}\n\nfunction findTexts(item: ObjectIndexItemWithContent, html: string) {\n const newChildren: ObjectIndexItemWithContent[] = [];\n\n // If the item has children\n if (item.children.length) {\n // Search for texts in the children.\n for (let i = 0; i < item.children.length; i++) {\n const child = item.children[i];\n const nextChild = item.children[i + 1];\n\n // If is the first child and the child startsAt is greater than the item contentStartsAt then\n // the content between the item contentStartsAt and the child startsAt is a text child of the item.\n if (i === 0 && child.startsAt > item.contentStartsAt) {\n const childContent = html.substring(item.contentStartsAt, child.startsAt);\n\n const childText: ObjectIndexItemWithContent = {\n tagName: \"#text\",\n startsAt: item.contentStartsAt,\n endsAt: item.contentStartsAt + childContent.length,\n contentStartsAt: item.contentStartsAt,\n contentEndsAt: item.contentStartsAt + childContent.length,\n attributes: {},\n children: [],\n nodeValue: childContent\n };\n\n newChildren.push(childText);\n }\n\n // Add the child to the newChildren array.\n newChildren.push(child);\n\n // If there is a next child and the child endsAt is less than the next child startsAt then\n // the content between the child endsAt and the next child startsAt is a text child of the item.\n if (nextChild && child.endsAt < nextChild.startsAt) {\n const childContent = html.substring(child.endsAt, nextChild.startsAt);\n\n const childText: ObjectIndexItemWithContent = {\n tagName: \"#text\",\n startsAt: child.endsAt,\n endsAt: child.endsAt + childContent.length,\n contentStartsAt: child.endsAt,\n contentEndsAt: child.endsAt + childContent.length,\n attributes: {},\n children: [],\n nodeValue: childContent\n };\n\n newChildren.push(childText);\n }\n\n // If there are no next child and the child endsAt is less than the item contentEndsAt then\n // the content between the child endsAt and the item contentEndsAt is a text child of the item.\n if (!nextChild && child.endsAt < item.contentEndsAt) {\n const childContent = html.substring(child.endsAt, item.contentEndsAt);\n\n const childText: ObjectIndexItemWithContent = {\n tagName: \"#text\",\n startsAt: child.endsAt,\n endsAt: child.endsAt + childContent.length,\n contentStartsAt: child.endsAt,\n contentEndsAt: item.contentEndsAt,\n attributes: {},\n children: [],\n nodeValue: childContent\n };\n\n newChildren.push(childText);\n }\n\n // Find texts in the child.\n findTexts(child, html);\n }\n }\n\n // If the item has no children then set the contents between the item contentStartsAt and the item contentEndsAt\n // as a text child of the item.\n if (!item.children.length) {\n const childContent = html.substring(item.contentStartsAt, item.contentEndsAt);\n\n if (childContent.length) {\n const childText: ObjectIndexItemWithContent = {\n tagName: \"#text\",\n startsAt: item.contentStartsAt,\n endsAt: item.contentEndsAt,\n contentStartsAt: item.contentStartsAt,\n contentEndsAt: item.contentEndsAt,\n attributes: {},\n children: [],\n nodeValue: childContent\n };\n\n newChildren.push(childText);\n }\n }\n\n item.children = newChildren;\n}\n\nfunction convertToDom<T extends Node>(item: ObjectIndexItemWithContent): T {\n let node: T;\n\n if (item.tagName === \"#text\") {\n node = document.createTextNode(item.nodeValue as string) as unknown as T;\n } else {\n node = (item.tagName === \"#document-fragment\"\n ? document.createDocumentFragment()\n : document.createElement(item.tagName)) as unknown as T;\n\n for (const key in item.attributes) {\n node.setAttribute(key, item.attributes[key]);\n }\n\n for (let i = 0; i < item.children.length; i++) {\n const child = convertToDom(item.children[i]);\n node.appendChild(child);\n }\n }\n\n return node;\n}\n\n// eslint-disable-next-line sonarjs/cognitive-complexity\nfunction getObjectIndexTree(html: string): DocumentFragment {\n let item;\n const regex = RegExp(\"<([^>|^!]+)>\", \"g\");\n const items: ObjectIndexList = [];\n\n // Make the initial list of items.\n while ((item = regex.exec(html))) {\n // If is a closing tag\n if (item[0].startsWith(\"</\")) {\n const lastOpenedItem = [...items].reverse().find((item) => item.endsAt === null);\n if (lastOpenedItem) {\n lastOpenedItem.endsAt = item.index + item[0].length;\n lastOpenedItem.contentEndsAt = item.index;\n\n // Find the last opened item again, this will be the parent of the current item.\n const parent = [...items].reverse().find((item) => item.endsAt === null);\n if (parent) {\n // Find the index of the current item in the items array.\n const index = items.indexOf(lastOpenedItem);\n // Remove the last opened item from the items array.\n items.splice(index, 1);\n\n // Add the last opened item as a child of the parent.\n parent.children.push(lastOpenedItem);\n }\n }\n\n continue;\n }\n\n // If is an opening tag\n const element: ObjectIndexItem = {\n tagName: item[1].split(\" \")[0],\n startsAt: item.index,\n endsAt: null,\n contentStartsAt: item.index + item[0].length,\n contentEndsAt: null,\n attributes: {},\n children: [],\n nodeValue: null\n };\n\n // Find the attributes of the tag.\n let string = (item[1] || \"\").substring(element.tagName.length + 1).replace(/\\/$/g, \"\");\n const attributesWithValues = string.match(/\\S+=\"[^\"]+\"/g);\n\n if (attributesWithValues) {\n for (const attribute of attributesWithValues) {\n const [name, ...value] = attribute.trim().split(\"=\");\n string = string.replace(attribute, \"\");\n if (value) {\n element.attributes[name] = value.join(\"=\").replace(/(^\"|\"$)/g, \"\");\n }\n }\n }\n\n const attributesWithBooleanValues = string.match(/\\s\\S+=[^\"]+/g);\n if (attributesWithBooleanValues) {\n for (const attribute of attributesWithBooleanValues) {\n const [name, ...value] = attribute.trim().split(\"=\");\n string = string.replace(attribute, \"\");\n if (value) {\n element.attributes[name] = value.join(\"=\").replace(/(^\"|\"$)/g, \"\");\n }\n }\n }\n\n const attributesWithEmptyValues = string.match(/\\s?\\S+/g);\n if (attributesWithEmptyValues) {\n for (const attribute of attributesWithEmptyValues) {\n const name = attribute.trim();\n element.attributes[name] = true;\n }\n }\n\n // If the tag is self closing\n if (item[0].endsWith(\"/>\")) {\n element.endsAt = element.startsAt + item[0].length;\n element.contentStartsAt = element.contentEndsAt = element.endsAt;\n\n // Find the last opened item, this will be the parent of the current item.\n const parent = [...items].reverse().find((item) => item.endsAt === null);\n if (parent) {\n // Add the last opened item as a child of the parent.\n parent.children.push(element);\n continue;\n }\n }\n\n items.push(element);\n }\n\n const fragmentItem: ObjectIndexItemWithContent = {\n tagName: \"#document-fragment\",\n startsAt: 0,\n endsAt: html.length,\n contentStartsAt: 0,\n contentEndsAt: html.length,\n attributes: {},\n children: items as ObjectIndexItemWithContent[],\n nodeValue: null\n };\n\n findTexts(fragmentItem, html);\n\n return convertToDom<DocumentFragment>(fragmentItem);\n}\n\n// First we create a tree of object indexes from the HTML string.\n// The resulting array is then reordered to match the order of the html string.\n// And to move the children to the correct position in its parents.\n// This resulting array is populated with a object node version of the object index.\n// If the final result have more than 1 node, then return a document fragment node.\n// If the final result have 1 node, then return the node.\n// eslint-disable-next-line complexity\nexport function htmlToDom(html: string): Element | Text | DocumentFragment {\n // Search for the opening and closing tags of the root element.\n // The opening tag could be in the middle of the string, so we need to\n // search for the first opening tag.\n const openingTag = html.match(/<[^>]+>/g);\n\n const document = new Document();\n\n // If the opening tag is not found, return a document fragment node with the html string as text content.\n if (!openingTag) {\n const documentFragment = document.createDocumentFragment();\n documentFragment.appendChild(document.createTextNode(html));\n return documentFragment;\n }\n\n const fragment = getObjectIndexTree(html);\n\n if (fragment.childNodes.length > 1) {\n return fragment;\n }\n\n return fragment.childNodes[0];\n}\n\nexport function htmlToHyperscript(html: string) {\n const domTree = htmlToDom(html);\n const hyperscript = domToHyperscript(domTree instanceof DocumentFragment ? domTree.childNodes : [domTree]);\n return `[${hyperscript}\\n]`;\n}\n\nexport const document = new Document();\n\nconst html = document.createElement(\"html\");\nhtml.appendChild(document.createElement(\"head\"));\nhtml.appendChild(document.body);\n", "import { document, domToHtml, domToHyperscript, htmlToDom, htmlToHyperscript } from \"./utils/tree-adapter\";\nimport { mount, unmount } from \"valyrian.js\";\n\nimport FormData from \"form-data\";\nimport { icons } from \"./utils/icons\";\nimport { inline } from \"./utils/inline\";\nimport { sw } from \"./utils/sw\";\nimport { SessionStorage } from \"./utils/session-storage\";\n\nglobal.FormData = FormData as any;\nglobal.document = document as any;\nglobal.sessionStorage = new SessionStorage();\nglobal.localStorage = new SessionStorage();\n\nfunction render(...args: any[]) {\n const Component = () => args;\n const result = mount(\"div\", Component);\n unmount();\n return result;\n}\n\nexport { domToHtml, domToHyperscript, htmlToDom, htmlToHyperscript, inline, sw, icons, render, SessionStorage };\n", "import fs from \"fs\";\nimport { htmlToHyperscript } from \"./tree-adapter\";\n\nexport interface IconsOptions {\n iconsPath: string | null;\n linksViewPath: string | null;\n logging: boolean;\n\n // favicons options\n path: string;\n appName?: string;\n appDescription?: string;\n developerName?: string;\n developerURL?: string;\n dir?: \"auto\" | \"ltr\" | \"rtl\" | string;\n lang?: string;\n background?: string;\n theme_color?: string;\n display?: \"browser\" | \"standalone\" | string;\n orientation?: \"any\" | \"portrait\" | \"landscape\" | string;\n start_url?: string;\n version?: string;\n icons: {\n android: boolean;\n appleIcon: boolean;\n appleStartup: boolean;\n coast: boolean;\n favicons: boolean;\n firefox: boolean;\n windows: boolean;\n yandex: boolean;\n };\n}\n\nexport async function icons(source: string, configuration?: IconsOptions) {\n const options = {\n ...icons.options,\n ...(configuration || {})\n };\n\n if (options.iconsPath) {\n options.iconsPath = options.iconsPath.replace(/\\/$/gi, \"\") + \"/\";\n }\n\n if (options.linksViewPath) {\n options.linksViewPath = options.linksViewPath.replace(/\\/$/gi, \"\") + \"/\";\n }\n\n const { favicons } = await import(\"favicons\");\n\n try {\n const response = await favicons(source, options);\n\n if (options.iconsPath) {\n for (const i in response.images) {\n fs.writeFileSync(options.iconsPath + response.images[i].name, response.images[i].contents);\n }\n\n for (const i in response.files) {\n fs.writeFileSync(options.iconsPath + response.files[i].name, response.files[i].contents);\n }\n }\n\n if (options.linksViewPath) {\n const html = `\n function Links(){\n return ${htmlToHyperscript(response.html.join(\"\"))};\n }\n \n Links.default = Links;\n module.exports = Links;\n `;\n\n fs.writeFileSync(`${options.linksViewPath}/links.js`, html);\n }\n } catch (err) {\n process.stdout.write((err as any).status + \"\\n\"); // HTTP error code (e.g. `200`) or `null`\n process.stdout.write((err as any).name + \"\\n\"); // Error name e.g. \"API Error\"\n process.stdout.write((err as any).message + \"\\n\"); // Error description e.g. \"An unknown error has occurred\"\n }\n}\n\nicons.options = {\n iconsPath: null,\n linksViewPath: null,\n\n // favicons options\n path: \"\",\n appName: null,\n appDescription: null,\n developerName: null,\n developerURL: null,\n dir: \"auto\",\n lang: \"en-US\",\n background: \"#fff\",\n theme_color: \"#fff\",\n display: \"standalone\",\n orientation: \"any\",\n start_url: \"/\",\n version: \"1.0\",\n logging: false,\n icons: {\n android: true,\n appleIcon: true,\n appleStartup: true,\n coast: false,\n favicons: true,\n firefox: false,\n windows: true,\n yandex: false // Create Yandex browser icon. `boolean`\n }\n} as unknown as IconsOptions;\n", "import * as tsc from \"tsc-prog\";\n\nimport CleanCSS from \"clean-css\";\nimport { PurgeCSS } from \"purgecss\";\nimport esbuild from \"esbuild\";\n/* eslint-disable sonarjs/cognitive-complexity */\nimport fs from \"fs\";\n\n// eslint-disable-next-line complexity\nexport async function inline(\n file: string | { raw: string; map?: string | null; file: string },\n options: Record<string, any> = {}\n) {\n if (typeof file === \"string\") {\n const ext = file.split(\".\").pop();\n if (ext && /(js|cjs|jsx|mjs|ts|tsx)/.test(ext)) {\n if (/(ts|tsx)/.test(ext) && !options.noValidate) {\n const declarationDir = options.declarationDir;\n const emitDeclaration = !!declarationDir;\n\n const tscProgOptions = {\n basePath: process.cwd(), // always required, used for relative paths\n configFilePath: \"tsconfig.json\", // config to inherit from (optional)\n files: [file],\n include: [\"**/*.ts\", \"**/*.js\", \"**/*.tsx\", \"**/*.jsx\", \"**/*.mjs\"],\n exclude: [\"test*/**/*\", \"**/*.test.ts\", \"**/*.spec.ts\", \"dist/**\"],\n pretty: true,\n copyOtherToOutDir: false,\n clean: emitDeclaration ? [declarationDir] : [],\n ...(options.tsc || {}),\n compilerOptions: {\n rootDir: \"./\",\n outDir: \"dist\",\n noEmitOnError: true,\n noEmit: !emitDeclaration,\n declaration: emitDeclaration,\n declarationDir,\n emitDeclarationOnly: emitDeclaration,\n allowJs: true,\n esModuleInterop: true,\n inlineSourceMap: true,\n resolveJsonModule: true,\n removeComments: true,\n ...(options.tsc || {}).compilerOptions\n },\n jsxFactory: \"v\",\n jsxFragment: \"v.fragment\"\n };\n\n // eslint-disable-next-line no-console\n console.log(\"tsc\", tscProgOptions);\n\n tsc.build(tscProgOptions);\n }\n\n const esbuildOptions = {\n entryPoints: [file],\n bundle: \"bundle\" in options ? options.bundle : true,\n sourcemap: \"external\",\n write: false,\n minify: options.compact,\n outdir: \"out\",\n target: \"esnext\",\n jsxFactory: \"v\",\n jsxFragment: \"v.fragment\",\n loader: {\n \".js\": \"jsx\",\n \".cjs\": \"jsx\",\n \".mjs\": \"jsx\",\n \".ts\": \"tsx\"\n },\n ...(options.esbuild || {})\n };\n\n const result = await esbuild.build(esbuildOptions);\n if (result.outputFiles?.length !== 2) {\n throw new Error(result.errors.join(\"\\n\"));\n }\n\n if (options.compact) {\n const terser = await import(\"terser\");\n const result2 = await terser.minify(result.outputFiles[1].text, {\n sourceMap: {\n content: result.outputFiles[0].text.toString()\n },\n compress: {\n booleans_as_integers: false\n },\n output: {\n wrap_func_args: false\n },\n ecma: 2022,\n ...(options.terser || {})\n });\n\n if (!result2.code || !result2.map) {\n throw new Error(\"Unknown error\");\n }\n\n const mapBase64 = Buffer.from(result2.map.toString()).toString(\"base64\");\n const suffix = `//# sourceMappingURL=data:application/json;charset=utf-8;base64,${mapBase64}`;\n return { raw: result2.code, map: suffix, file };\n } else {\n const mapBase64 = Buffer.from(result.outputFiles[0].text.toString()).toString(\"base64\");\n const suffix = `//# sourceMappingURL=data:application/json;charset=utf-8;base64,${mapBase64}`;\n return { raw: result.outputFiles[1].text, map: suffix, file };\n }\n } else if (ext && /(css|scss|styl)/.test(ext)) {\n const result = await new CleanCSS({\n sourceMap: true,\n level: {\n 1: {\n roundingPrecision: \"all=3\"\n },\n 2: {\n restructureRules: true // controls rule restructuring; defaults to false\n }\n },\n ...(options.cleanCss || {})\n }).minify([file]);\n\n return { raw: result.styles, map: null, file };\n } else {\n return { raw: fs.readFileSync(file, \"utf8\"), map: null, file };\n }\n } else if (typeof file === \"object\" && \"raw\" in file) {\n return { map: null, ...file };\n }\n\n throw new Error(`Unknown file type: ${file}`);\n}\n\ninline.uncss = async function (\n renderedHtml: (string | Promise<string>)[],\n css: string,\n options: Record<string, any> = {}\n) {\n const html = await Promise.all(renderedHtml);\n\n const contents = html.map((item) => {\n return {\n raw: item,\n extension: \"html\"\n };\n });\n\n const purgecss = new PurgeCSS();\n\n const output = await purgecss.purge({\n fontFace: true,\n keyframes: true,\n variables: true,\n defaultExtractor: (content) => content.match(/[A-Za-z0-9-_/:@]*[A-Za-z0-9-_/:@/]+/g) || [],\n ...options,\n content: contents,\n css: [{ raw: css }]\n });\n\n const cleanCss = await new CleanCSS({\n sourceMap: false,\n level: {\n 1: {\n roundingPrecision: \"all=3\"\n },\n 2: {\n restructureRules: true // controls rule restructuring; defaults to false\n }\n },\n ...(options.cleanCss || {})\n }).minify(output[0].css);\n\n return cleanCss.styles;\n};\n", "import fs from \"fs\";\nimport path from \"path\";\n\nexport function sw(file: string, options = {}) {\n const swfiletemplate = path.resolve(__dirname, \"./node.sw.js\");\n const swTpl = fs.readFileSync(swfiletemplate, \"utf8\");\n const opt = {\n version: \"1\",\n name: \"Valyrian.js\",\n urls: [\"/\"],\n debug: false,\n logFetch: false,\n offlinePage: \"/offline.html\",\n ...options\n };\n let contents = swTpl\n .replace(\"v1\", `v${opt.version}`)\n .replace(\"Valyrian.js\", opt.name)\n .replace('[\"/\"]', '[\"' + opt.urls.join('\",\"') + '\"]')\n .replace(\"/offline.html\", opt.offlinePage)\n .replace(\"logFetch: false\", opt.logFetch ? \"logFetch: true\" : \"logFetch: false\");\n\n if (!opt.debug) {\n contents = contents.replace(\"console.log\", \"() => {}\");\n }\n\n fs.writeFileSync(file, contents, \"utf8\");\n}\n\n/*\n // On the server side to generate the service worker\n sw(\"sw.js\", {\n version: \"1\",\n name: \"Valyrian.js\",\n urls: [\"/\"],\n debug: false,\n logFetch: false,\n offlinePage: \"/offline.html\"\n });\n\n\n // On the client side\n if (\"serviceWorker\" in navigator) {\n const registration = await navigator.serviceWorker.register(\"/sw.js\");\n registration.addEventListener(\"updatefound\", () => {\n const newWorker = registration.installing as ServiceWorker;\n newWorker.addEventListener(\"statechange\", () => {\n if (newWorker.state === \"installed\") {\n // Notify the user about the new version and ask if they want to update\n if (confirm(\"There is a new version available. Do you want to update?\")) {\n // Send a message to the service worker to skip the waiting\n navigator.serviceWorker.controller.postMessage({ type: \"SKIP_WAITING\" });\n }\n }\n });\n });\n\n navigator.serviceWorker.addEventListener(\"controllerchange\", () => {\n window.location.reload();\n });\n }\n*/\n", "import fs from \"fs\";\nimport path from \"path\";\n\nexport class SessionStorage {\n private storage: { [key: string]: string };\n private limit: number;\n private persist: boolean;\n private filePath: string;\n private directory: string = \".session-storage\";\n\n constructor({ persist = false, filePath = \"./sessionData.json\" }: { persist?: boolean; filePath?: string } = {}) {\n this.storage = {};\n this.limit = 5 * 1024 * 1024; // 5MB storage limit\n this.persist = persist;\n this.filePath = path.resolve(this.directory, filePath);\n\n if (this.persist) {\n if (!fs.existsSync(this.directory)) {\n fs.mkdirSync(this.directory, { recursive: true });\n }\n\n // Load data from file if persistence is enabled\n this.loadFromFile();\n }\n }\n\n // Calculate total size in bytes of stored data\n private getStorageSize(): number {\n return new TextEncoder().encode(JSON.stringify(this.storage)).length;\n }\n\n // Check if storage limit is exceeded\n private checkSizeLimit(): void {\n const size = this.getStorageSize();\n if (size > this.limit) {\n throw new DOMException(\"Storage limit exceeded\", \"QuotaExceededError\");\n }\n }\n\n // Store value under the specified key\n setItem(key: string | null | undefined, value: string | null | undefined): void {\n if (key === null || key === undefined) {\n throw new TypeError(\"Failed to execute 'setItem' on 'Storage': 1 argument required, but only 0 present.\");\n }\n\n if (value === null) {\n value = \"null\"; // Convert null to \"null\"\n } else if (value === undefined) {\n value = \"undefined\"; // Convert undefined to \"undefined\"\n }\n\n this.loadFromFile();\n this.storage[key] = String(value); // Store as string\n this.checkSizeLimit(); // Check storage limit\n this.saveToFile(); // Save to file if persistence is enabled\n }\n\n // Retrieve value stored under the specified key\n getItem(key: string | null | undefined): string | null {\n if (key === null || key === undefined) {\n throw new TypeError(\"Failed to execute 'getItem' on 'Storage': 1 argument required, but only 0 present.\");\n }\n\n this.loadFromFile();\n return this.storage[key] || null; // Return null if key doesn't exist\n }\n\n // Remove the value under the specified key\n removeItem(key: string | null | undefined): void {\n if (key === null || key === undefined) {\n throw new TypeError(\"Failed to execute 'removeItem' on 'Storage': 1 argument required, but only 0 present.\");\n }\n this.loadFromFile();\n Reflect.deleteProperty(this.storage, key); // Remove key from storage\n this.saveToFile(); // Save to file if persistence is enabled\n }\n\n // Clear all stored values\n clear(): void {\n this.storage = {};\n this.saveToFile(); // Save to file if persistence is enabled\n }\n\n // Return the number of stored items\n get length(): number {\n return Object.keys(this.storage).length;\n }\n\n // Return the key at the specified index\n key(index: number): string | null {\n this.loadFromFile();\n const keys = Object.keys(this.storage);\n return keys[index] || null;\n }\n\n // Save data to a file (only if persistence is enabled)\n private saveToFile(): void {\n if (this.persist) {\n try {\n fs.writeFileSync(this.filePath, JSON.stringify(this.storage), \"utf-8\");\n } catch (error) {\n throw new Error(`Error saving data to file: ${(error as any).message}`);\n }\n }\n }\n\n // Load data from a file (only if persistence is enabled)\n private loadFromFile(): void {\n if (this.persist) {\n try {\n if (fs.existsSync(this.filePath)) {\n const data = fs.readFileSync(this.filePath, \"utf-8\");\n this.storage = JSON.parse(data || \"{}\");\n }\n } catch (error) {\n throw new Error(`Error loading data from file: ${(error as any).message}`);\n }\n }\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["node", "html", "item", "document", "html", "fs", "html", "fs", "fs", "path"]
3
+ "sources": ["../../lib/node/utils/tree-adapter.ts", "../../lib/node/index.ts", "../../lib/node/utils/icons.ts", "../../lib/node/utils/inline.ts", "../../lib/node/utils/sw.ts", "../../lib/node/utils/server-storage.ts"],
4
+ "sourcesContent": ["/* eslint-disable no-use-before-define */\n/* eslint-disable complexity */\ninterface ChildNodes extends Array<Node | Element | Text | DocumentFragment> {}\n\nexport class Node implements Node {\n // eslint-disable-next-line no-use-before-define\n childNodes: ChildNodes = [];\n baseURI: string = \"\";\n\n tag_name!: string;\n get nodeName(): string {\n return this.tag_name.toLowerCase();\n }\n set nodeName(name: string) {\n this.tag_name = name;\n }\n get tagName(): string {\n return this.tag_name;\n }\n set tagName(name: string) {\n this.tag_name = name;\n }\n\n node_type!: number;\n get nodeType(): number {\n return this.node_type;\n }\n set nodeType(type: number) {\n this.node_type = type;\n }\n\n node_value = \"\";\n attributes: Attr[] = [];\n set textContent(text) {\n this.node_value = String(text);\n }\n get textContent() {\n return this.node_value;\n }\n set nodeValue(text) {\n this.node_value = String(text);\n }\n get nodeValue() {\n return this.node_value;\n }\n\n // eslint-disable-next-line no-use-before-define\n parent_node: Node | null = null;\n get parentNode() {\n return this.parent_node;\n }\n set parentNode(node) {\n this.parent_node = node;\n }\n\n get parentElement(): Element | null {\n return this.parentNode instanceof Element ? this.parentNode : null;\n }\n\n set parentElement(node) {\n this.parentNode = node;\n }\n\n #dataset: Record<string | number, any> = {};\n\n get dataset() {\n return this.#dataset;\n }\n\n set dataset(value) {\n this.#dataset = value;\n }\n\n constructor() {}\n\n appendChild<T extends Node>(node: T): T {\n if (node) {\n node.parentNode && node.parentNode.removeChild(node as Node);\n this.childNodes.push(node);\n node.parentNode = this;\n node.parentElement = this instanceof Element ? this : null;\n }\n return node;\n }\n\n insertBefore<T extends Node>(node: T, child: Node | null): T {\n if (node) {\n node.parentNode && node.parentNode.removeChild(node as Node);\n node.parentNode = this;\n node.parentElement = this instanceof Element ? this : null;\n if (child) {\n const idx = this.childNodes.indexOf(child);\n this.childNodes.splice(idx, 0, node);\n } else {\n this.childNodes.push(node);\n }\n }\n return node;\n }\n\n replaceChild<T extends Node>(node: Node, child: T): T {\n if (node && child && child.parentNode === this) {\n this.insertBefore(node, child);\n child.parentNode && child.parentNode.removeChild(child);\n }\n return child;\n }\n removeChild<T extends Node>(child: T): T {\n if (child && child.parentNode === this) {\n const idx = (this.childNodes as unknown as Node[]).indexOf(child);\n (this.childNodes as unknown as Node[]).splice(idx, 1);\n child.parentNode = null;\n child.parentElement = null;\n }\n return child;\n }\n\n remove(): Node {\n return this.parentNode ? this.parentNode.removeChild(this) : this;\n }\n\n cloneNode(deep?: boolean | undefined): Node {\n if (this.nodeType === 3) {\n return new Text(this.nodeValue);\n }\n\n if (this.nodeType === 1) {\n const node = new Element();\n node.nodeType = this.nodeType;\n this.nodeName = this.nodeName;\n if (this.attributes) {\n for (let i = 0, l = this.attributes.length; i < l; i++) {\n node.setAttribute(this.attributes[i].nodeName, this.attributes[i].nodeValue);\n }\n }\n\n for (const key in this.dataset) {\n node.dataset[key] = this.dataset[key];\n }\n\n if (deep) {\n for (let i = 0, l = this.childNodes.length; i < l; i++) {\n node.appendChild(this.childNodes[i].cloneNode(deep));\n }\n }\n return node;\n }\n\n const node = new Node();\n node.nodeType = this.nodeType;\n node.nodeName = this.nodeName;\n return node;\n }\n\n setAttribute(name: string, value: any) {\n const attr = {\n nodeName: name,\n nodeValue: value\n };\n let idx = -1;\n for (let i = 0, l = this.attributes.length; i < l; i++) {\n if (this.attributes[i].nodeName === name) {\n idx = i;\n break;\n }\n }\n idx === -1 ? this.attributes.push(attr as Attr) : this.attributes.splice(idx, 1, attr as Attr);\n }\n\n getAttribute(name: string) {\n for (let i = 0, l = this.attributes.length; i < l; i++) {\n if (this.attributes[i].nodeName === name) {\n return this.attributes[i].nodeValue;\n }\n }\n }\n\n removeAttribute(name: string) {\n let idx = -1;\n for (let i = 0, l = this.attributes.length; i < l; i++) {\n if (this.attributes[i].nodeName === name) {\n idx = i;\n break;\n }\n }\n if (idx > -1) {\n this.attributes.splice(idx, 1);\n }\n }\n\n getElementById(id: string): Node | null {\n let elementFound;\n for (let i = 0, l = this.childNodes.length; i < l; i++) {\n if (this.childNodes[i].nodeType === 1) {\n if (this.childNodes[i].getAttribute(\"id\") === id) {\n elementFound = this.childNodes[i];\n break;\n }\n elementFound = this.childNodes[i].getElementById(id);\n if (elementFound) {\n break;\n }\n }\n }\n return elementFound || null;\n }\n\n // Not implemented\n // firstChild!: ChildNode | null;\n // isConnected!: boolean;\n // lastChild!: ChildNode | null;\n // nextSibling!: ChildNode | null;\n // ownerDocument!: Document | null;\n // parentElement!: HTMLElement | null;\n // previousSibling!: ChildNode | null;\n // compareDocumentPosition(other: Node): number {\n // throw new Error(\"Method not implemented.\");\n // }\n // contains(other: Node | null): boolean {\n // throw new Error(\"Method not implemented.\");\n // }\n // getRootNode(options?: GetRootNodeOptions | undefined): Node {\n // throw new Error(\"Method not implemented.\");\n // }\n // hasChildNodes(): boolean {\n // throw new Error(\"Method not implemented.\");\n // }\n // isDefaultNamespace(namespace: string | null): boolean {\n // throw new Error(\"Method not implemented.\");\n // }\n // isEqualNode(otherNode: Node | null): boolean {\n // throw new Error(\"Method not implemented.\");\n // }\n // isSameNode(otherNode: Node | null): boolean {\n // throw new Error(\"Method not implemented.\");\n // }\n // lookupNamespaceURI(prefix: string | null): string | null {\n // throw new Error(\"Method not implemented.\");\n // }\n // lookupPrefix(namespace: string | null): string | null {\n // throw new Error(\"Method not implemented.\");\n // }\n // normalize(): void {\n // throw new Error(\"Method not implemented.\");\n // }\n // ATTRIBUTE_NODE!: number;\n // CDATA_SECTION_NODE!: number;\n // COMMENT_NODE!: number;\n // DOCUMENT_FRAGMENT_NODE!: number;\n // DOCUMENT_NODE!: number;\n // DOCUMENT_POSITION_CONTAINED_BY!: number;\n // DOCUMENT_POSITION_CONTAINS!: number;\n // DOCUMENT_POSITION_DISCONNECTED!: number;\n // DOCUMENT_POSITION_FOLLOWING!: number;\n // DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC!: number;\n // DOCUMENT_POSITION_PRECEDING!: number;\n // DOCUMENT_TYPE_NODE!: number;\n // ELEMENT_NODE!: number;\n // ENTITY_NODE!: number;\n // ENTITY_REFERENCE_NODE!: number;\n // NOTATION_NODE!: number;\n // PROCESSING_INSTRUCTION_NODE!: number;\n // TEXT_NODE!: number;\n addEventListener(\n // eslint-disable-next-line no-unused-vars\n type: string,\n // eslint-disable-next-line no-unused-vars\n callback: EventListenerOrEventListenerObject | null,\n // eslint-disable-next-line no-unused-vars\n options?: boolean | AddEventListenerOptions | undefined\n ): void {\n // throw new Error(\"Method not implemented.\");\n }\n // dispatchEvent(event: Event): boolean {\n // throw new Error(\"Method not implemented.\");\n // }\n removeEventListener(\n // eslint-disable-next-line no-unused-vars\n type: string,\n // eslint-disable-next-line no-unused-vars\n callback: EventListenerOrEventListenerObject | null,\n // eslint-disable-next-line no-unused-vars\n options?: boolean | EventListenerOptions | undefined\n ): void {\n // throw new Error(\"Method not implemented.\");\n }\n}\n\nexport class Text extends Node {\n constructor(text: any) {\n super();\n this.nodeType = 3;\n this.nodeName = \"#text\";\n this.node_value = String(text);\n }\n}\n\nfunction updateElementStyles(element: Element, state: Record<string, any>) {\n let str = \"\";\n for (const key in state) {\n const value = state[key];\n if (typeof value !== \"undefined\" && value !== null && String(value).length > 0) {\n str += `${key}: ${state[key]};`;\n }\n }\n if (str.length === 0) {\n element.removeAttribute(\"style\");\n } else {\n element.setAttribute(\"style\", str);\n }\n}\n\nexport class Element extends Node {\n constructor() {\n super();\n this.nodeType = 1;\n this.attributes = [];\n this.childNodes = [];\n }\n\n _style = new Proxy(\n {},\n {\n get: (state: Record<string, any>, prop: string) => state[prop],\n set: (state: Record<string, any>, prop: string, value: any) => {\n state[prop] = value;\n updateElementStyles(this, state);\n return true;\n },\n deleteProperty: (state: Record<string, any>, prop: string) => {\n Reflect.deleteProperty(state, prop);\n updateElementStyles(this, state);\n return true;\n }\n }\n );\n\n get style() {\n return this._style as any;\n }\n\n set style(value: string) {\n if (typeof value === \"string\") {\n // should match pairs like \"color: red; font-size: 12px; background: url(http://example.com/image.png?s=1024x1024&amp;w=is&amp;k=20&amp;c=ASa_AG8uP5Di7azXgJraSA6ME7fbLB0GX4YT_OzCARI=);\"\n const regex = /([^:\\s]+):\\s*((url\\([^)]+\\))|[^;]+(?=(;|$)))/g;\n let match;\n\n while ((match = regex.exec(value)) !== null) {\n this._style[match[1]] = match[2].trim();\n }\n\n return;\n }\n\n throw new Error(\"Cannot set style\");\n }\n\n get className(): string {\n return this.getAttribute(\"class\") || \"\";\n }\n\n set className(value: string | boolean) {\n if (value == null || value === false) {\n this.removeAttribute(\"class\");\n } else {\n this.setAttribute(\"class\", String(value));\n }\n }\n\n classList = {\n toggle: (item: any, force: any) => {\n if (item) {\n const classes = (this.className || \"\").split(\" \");\n const itemIndex = classes.indexOf(item);\n if (force && itemIndex === -1) {\n classes.push(item);\n }\n\n if (!force && itemIndex !== -1) {\n classes.splice(itemIndex, 1);\n }\n\n const final = classes.join(\" \").trim();\n if (final.length) {\n this.className = classes.join(\" \").trim();\n } else {\n this.className = false;\n }\n }\n }\n };\n\n get id(): string {\n return this.getAttribute(\"id\") || \"\";\n }\n\n set id(value: string | boolean) {\n if (value == null || value === false) {\n this.removeAttribute(\"id\");\n } else {\n this.setAttribute(\"id\", String(value));\n }\n }\n\n set textContent(text) {\n this.nodeValue = String(text);\n this.childNodes = this.nodeValue ? [new Text(this.nodeValue)] : [];\n }\n get textContent() {\n return this.nodeValue;\n }\n\n set innerText(text) {\n this.nodeValue = String(text);\n }\n\n get innerText() {\n return this.nodeValue;\n }\n\n get innerHTML() {\n let str = \"\";\n for (let i = 0, l = this.childNodes.length; i < l; i++) {\n // console.log(\"domToHtml\", this.childNodes[i], domToHtml(this.childNodes[i] as Element));\n str += domToHtml(this.childNodes[i] as Element);\n }\n return str;\n }\n\n set innerHTML(html) {\n this.textContent = \"\";\n const result = htmlToDom(html);\n if (result instanceof DocumentFragment) {\n for (let i = 0, l = result.childNodes.length; i < l; i++) {\n this.appendChild(result.childNodes[i]);\n }\n } else {\n this.appendChild(result);\n }\n }\n\n get outerHTML(): string {\n return domToHtml(this);\n }\n}\n\nexport class DocumentFragment extends Element {\n constructor() {\n super();\n this.nodeType = 11;\n this.nodeName = \"#document-fragment\";\n }\n}\n\nexport class Document extends Element {\n constructor() {\n super();\n this.nodeType = 9;\n this.nodeName = \"#document\";\n this.body = this.createElement(\"body\");\n }\n\n body: Element;\n\n createDocumentFragment(): DocumentFragment {\n return new DocumentFragment();\n }\n\n createElement(type: string) {\n const element = new Element();\n element.nodeName = type.toUpperCase();\n return element;\n }\n\n createElementNS(ns: string, type: string) {\n const element = this.createElement(type);\n element.baseURI = ns;\n return element;\n }\n\n createTextNode(text: any) {\n return new Text(text);\n }\n}\n\nconst ESCAPE_LOOKUP: { [key: string]: string } = {\n \"&\": \"&amp;\",\n \">\": \"&gt;\",\n \"<\": \"&lt;\",\n '\"': \"&quot;\",\n \"'\": \"&#39;\"\n};\n\nconst ESCAPE_REGEX = /[&><\"']/g;\n\nfunction escapeHtml(str: string | any): string {\n if (typeof str !== \"string\") {\n return String(str);\n }\n\n if (ESCAPE_REGEX.test(str) === false) {\n return str;\n }\n\n return str.replace(ESCAPE_REGEX, (match) => ESCAPE_LOOKUP[match]).replace(/&amp;amp;/g, \"&amp;\");\n}\n\nconst selfClosingTags = [\n \"area\",\n \"base\",\n \"br\",\n \"col\",\n \"embed\",\n \"hr\",\n \"img\",\n \"input\",\n \"link\",\n \"meta\",\n \"param\",\n \"source\",\n \"track\",\n \"wbr\",\n \"!doctype\"\n];\n\nexport function domToHtml(dom: Element | Text | DocumentFragment): string {\n if (dom.nodeType === 3) {\n return dom.textContent;\n }\n\n if (dom.nodeType === 1) {\n const name = dom.nodeName.toLowerCase();\n let str = \"<\" + name;\n\n for (let i = 0, l = dom.attributes.length; i < l; i++) {\n const attr = dom.attributes[i];\n str += \" \" + attr.nodeName + '=\"' + escapeHtml(attr.nodeValue) + '\"';\n }\n\n if (selfClosingTags.indexOf(name) === -1) {\n str += \">\";\n if (dom.childNodes && dom.childNodes.length > 0) {\n for (let i = 0, l = dom.childNodes.length; i < l; i++) {\n const child = domToHtml(dom.childNodes[i] as Element);\n if (child) {\n str += child;\n }\n }\n }\n str += \"</\" + name + \">\";\n } else {\n str += \"/>\";\n }\n\n return str;\n }\n\n return \"\";\n}\n\nexport function domToHyperscript(childNodes: ChildNodes, depth = 1) {\n let spaces = \"\";\n for (let i = 0; i < depth; i++) {\n spaces += \" \";\n }\n\n return childNodes\n .map((item) => {\n if (item.nodeType === 10) {\n return `\\n${spaces}\"<!DOCTYPE html>\"`;\n } else if (item.nodeType === 3) {\n return `\\n${spaces}\"${item.nodeValue}\"`;\n } else {\n let str = `\\n${spaces}v(\"${item.nodeName}\", `;\n\n if (item.attributes) {\n const attrs: Record<string, any> = {};\n for (let i = 0, l = item.attributes.length; i < l; i++) {\n const attr = item.attributes[i];\n attrs[attr.nodeName] = attr.nodeValue;\n }\n str += JSON.stringify(attrs);\n } else {\n str += \"{}\";\n }\n\n str += \", [\";\n if (item.childNodes && item.childNodes.length > 0) {\n str += `${domToHyperscript(item.childNodes as unknown as Element[], depth + 1)}\\n${spaces}`;\n }\n\n str += `])`;\n return str;\n }\n })\n .join(\",\");\n}\n\ninterface ObjectIndexItem {\n tagName: string;\n startsAt: number;\n endsAt: number | null;\n contentStartsAt: number;\n contentEndsAt: number | null;\n attributes: { [key: string]: any };\n children: ObjectIndexItem[];\n nodeValue: string | null;\n}\n\ninterface ObjectIndexItemWithContent extends ObjectIndexItem {\n endsAt: number;\n contentEndsAt: number;\n children: ObjectIndexItemWithContent[];\n}\n\ninterface ObjectIndexList extends Array<ObjectIndexItem> {}\n\nfunction findTexts(item: ObjectIndexItemWithContent, html: string) {\n const newChildren: ObjectIndexItemWithContent[] = [];\n\n // If the item has children\n if (item.children.length) {\n // Search for texts in the children.\n for (let i = 0; i < item.children.length; i++) {\n const child = item.children[i];\n const nextChild = item.children[i + 1];\n\n // If is the first child and the child startsAt is greater than the item contentStartsAt then\n // the content between the item contentStartsAt and the child startsAt is a text child of the item.\n if (i === 0 && child.startsAt > item.contentStartsAt) {\n const childContent = html.substring(item.contentStartsAt, child.startsAt);\n\n const childText: ObjectIndexItemWithContent = {\n tagName: \"#text\",\n startsAt: item.contentStartsAt,\n endsAt: item.contentStartsAt + childContent.length,\n contentStartsAt: item.contentStartsAt,\n contentEndsAt: item.contentStartsAt + childContent.length,\n attributes: {},\n children: [],\n nodeValue: childContent\n };\n\n newChildren.push(childText);\n }\n\n // Add the child to the newChildren array.\n newChildren.push(child);\n\n // If there is a next child and the child endsAt is less than the next child startsAt then\n // the content between the child endsAt and the next child startsAt is a text child of the item.\n if (nextChild && child.endsAt < nextChild.startsAt) {\n const childContent = html.substring(child.endsAt, nextChild.startsAt);\n\n const childText: ObjectIndexItemWithContent = {\n tagName: \"#text\",\n startsAt: child.endsAt,\n endsAt: child.endsAt + childContent.length,\n contentStartsAt: child.endsAt,\n contentEndsAt: child.endsAt + childContent.length,\n attributes: {},\n children: [],\n nodeValue: childContent\n };\n\n newChildren.push(childText);\n }\n\n // If there are no next child and the child endsAt is less than the item contentEndsAt then\n // the content between the child endsAt and the item contentEndsAt is a text child of the item.\n if (!nextChild && child.endsAt < item.contentEndsAt) {\n const childContent = html.substring(child.endsAt, item.contentEndsAt);\n\n const childText: ObjectIndexItemWithContent = {\n tagName: \"#text\",\n startsAt: child.endsAt,\n endsAt: child.endsAt + childContent.length,\n contentStartsAt: child.endsAt,\n contentEndsAt: item.contentEndsAt,\n attributes: {},\n children: [],\n nodeValue: childContent\n };\n\n newChildren.push(childText);\n }\n\n // Find texts in the child.\n findTexts(child, html);\n }\n }\n\n // If the item has no children then set the contents between the item contentStartsAt and the item contentEndsAt\n // as a text child of the item.\n if (!item.children.length) {\n const childContent = html.substring(item.contentStartsAt, item.contentEndsAt);\n\n if (childContent.length) {\n const childText: ObjectIndexItemWithContent = {\n tagName: \"#text\",\n startsAt: item.contentStartsAt,\n endsAt: item.contentEndsAt,\n contentStartsAt: item.contentStartsAt,\n contentEndsAt: item.contentEndsAt,\n attributes: {},\n children: [],\n nodeValue: childContent\n };\n\n newChildren.push(childText);\n }\n }\n\n item.children = newChildren;\n}\n\nfunction convertToDom<T extends Node>(item: ObjectIndexItemWithContent): T {\n let node: T;\n\n if (item.tagName === \"#text\") {\n node = document.createTextNode(item.nodeValue as string) as unknown as T;\n } else {\n node = (item.tagName === \"#document-fragment\"\n ? document.createDocumentFragment()\n : document.createElement(item.tagName)) as unknown as T;\n\n for (const key in item.attributes) {\n node.setAttribute(key, item.attributes[key]);\n }\n\n for (let i = 0; i < item.children.length; i++) {\n const child = convertToDom(item.children[i]);\n node.appendChild(child);\n }\n }\n\n return node;\n}\n\n// eslint-disable-next-line sonarjs/cognitive-complexity\nfunction getObjectIndexTree(html: string): DocumentFragment {\n let item;\n const regex = RegExp(\"<([^>|^!]+)>\", \"g\");\n const items: ObjectIndexList = [];\n\n // Make the initial list of items.\n while ((item = regex.exec(html))) {\n // If is a closing tag\n if (item[0].startsWith(\"</\")) {\n const lastOpenedItem = [...items].reverse().find((item) => item.endsAt === null);\n if (lastOpenedItem) {\n lastOpenedItem.endsAt = item.index + item[0].length;\n lastOpenedItem.contentEndsAt = item.index;\n\n // Find the last opened item again, this will be the parent of the current item.\n const parent = [...items].reverse().find((item) => item.endsAt === null);\n if (parent) {\n // Find the index of the current item in the items array.\n const index = items.indexOf(lastOpenedItem);\n // Remove the last opened item from the items array.\n items.splice(index, 1);\n\n // Add the last opened item as a child of the parent.\n parent.children.push(lastOpenedItem);\n }\n }\n\n continue;\n }\n\n // If is an opening tag\n const element: ObjectIndexItem = {\n tagName: item[1].split(\" \")[0],\n startsAt: item.index,\n endsAt: null,\n contentStartsAt: item.index + item[0].length,\n contentEndsAt: null,\n attributes: {},\n children: [],\n nodeValue: null\n };\n\n // Find the attributes of the tag.\n let string = (item[1] || \"\").substring(element.tagName.length + 1).replace(/\\/$/g, \"\");\n const attributesWithValues = string.match(/\\S+=\"[^\"]+\"/g);\n\n if (attributesWithValues) {\n for (const attribute of attributesWithValues) {\n const [name, ...value] = attribute.trim().split(\"=\");\n string = string.replace(attribute, \"\");\n if (value) {\n element.attributes[name] = value.join(\"=\").replace(/(^\"|\"$)/g, \"\");\n }\n }\n }\n\n const attributesWithBooleanValues = string.match(/\\s\\S+=[^\"]+/g);\n if (attributesWithBooleanValues) {\n for (const attribute of attributesWithBooleanValues) {\n const [name, ...value] = attribute.trim().split(\"=\");\n string = string.replace(attribute, \"\");\n if (value) {\n element.attributes[name] = value.join(\"=\").replace(/(^\"|\"$)/g, \"\");\n }\n }\n }\n\n const attributesWithEmptyValues = string.match(/\\s?\\S+/g);\n if (attributesWithEmptyValues) {\n for (const attribute of attributesWithEmptyValues) {\n const name = attribute.trim();\n element.attributes[name] = true;\n }\n }\n\n // If the tag is self closing\n if (item[0].endsWith(\"/>\")) {\n element.endsAt = element.startsAt + item[0].length;\n element.contentStartsAt = element.contentEndsAt = element.endsAt;\n\n // Find the last opened item, this will be the parent of the current item.\n const parent = [...items].reverse().find((item) => item.endsAt === null);\n if (parent) {\n // Add the last opened item as a child of the parent.\n parent.children.push(element);\n continue;\n }\n }\n\n items.push(element);\n }\n\n const fragmentItem: ObjectIndexItemWithContent = {\n tagName: \"#document-fragment\",\n startsAt: 0,\n endsAt: html.length,\n contentStartsAt: 0,\n contentEndsAt: html.length,\n attributes: {},\n children: items as ObjectIndexItemWithContent[],\n nodeValue: null\n };\n\n findTexts(fragmentItem, html);\n\n return convertToDom<DocumentFragment>(fragmentItem);\n}\n\n// First we create a tree of object indexes from the HTML string.\n// The resulting array is then reordered to match the order of the html string.\n// And to move the children to the correct position in its parents.\n// This resulting array is populated with a object node version of the object index.\n// If the final result have more than 1 node, then return a document fragment node.\n// If the final result have 1 node, then return the node.\n// eslint-disable-next-line complexity\nexport function htmlToDom(html: string): Element | Text | DocumentFragment {\n // Search for the opening and closing tags of the root element.\n // The opening tag could be in the middle of the string, so we need to\n // search for the first opening tag.\n const openingTag = html.match(/<[^>]+>/g);\n\n const document = new Document();\n\n // If the opening tag is not found, return a document fragment node with the html string as text content.\n if (!openingTag) {\n const documentFragment = document.createDocumentFragment();\n documentFragment.appendChild(document.createTextNode(html));\n return documentFragment;\n }\n\n const fragment = getObjectIndexTree(html);\n\n if (fragment.childNodes.length > 1) {\n return fragment;\n }\n\n return fragment.childNodes[0];\n}\n\nexport function htmlToHyperscript(html: string) {\n const domTree = htmlToDom(html);\n const hyperscript = domToHyperscript(domTree instanceof DocumentFragment ? domTree.childNodes : [domTree]);\n return `[${hyperscript}\\n]`;\n}\n\nexport const document = new Document();\n\nconst html = document.createElement(\"html\");\nhtml.appendChild(document.createElement(\"head\"));\nhtml.appendChild(document.body);\n", "import { document, domToHtml, domToHyperscript, htmlToDom, htmlToHyperscript } from \"./utils/tree-adapter\";\nimport { mount, unmount } from \"valyrian.js\";\n\nimport FormData from \"form-data\";\nimport { icons } from \"./utils/icons\";\nimport { inline } from \"./utils/inline\";\nimport { sw } from \"./utils/sw\";\nimport { ServerStorage } from \"./utils/server-storage\";\n\nglobal.FormData = FormData as any;\nglobal.document = document as any;\nglobal.sessionStorage = new ServerStorage();\nglobal.localStorage = new ServerStorage();\n\nfunction render(...args: any[]) {\n const Component = () => args;\n const result = mount(\"div\", Component);\n unmount();\n return result;\n}\n\nexport { domToHtml, domToHyperscript, htmlToDom, htmlToHyperscript, inline, sw, icons, render, ServerStorage };\n", "import fs from \"fs\";\nimport { htmlToHyperscript } from \"./tree-adapter\";\n\nexport interface IconsOptions {\n iconsPath: string | null;\n linksViewPath: string | null;\n logging: boolean;\n\n // favicons options\n path: string;\n appName?: string;\n appDescription?: string;\n developerName?: string;\n developerURL?: string;\n dir?: \"auto\" | \"ltr\" | \"rtl\" | string;\n lang?: string;\n background?: string;\n theme_color?: string;\n display?: \"browser\" | \"standalone\" | string;\n orientation?: \"any\" | \"portrait\" | \"landscape\" | string;\n start_url?: string;\n version?: string;\n icons: {\n android: boolean;\n appleIcon: boolean;\n appleStartup: boolean;\n coast: boolean;\n favicons: boolean;\n firefox: boolean;\n windows: boolean;\n yandex: boolean;\n };\n}\n\nexport async function icons(source: string, configuration?: IconsOptions) {\n const options = {\n ...icons.options,\n ...(configuration || {})\n };\n\n if (options.iconsPath) {\n options.iconsPath = options.iconsPath.replace(/\\/$/gi, \"\") + \"/\";\n }\n\n if (options.linksViewPath) {\n options.linksViewPath = options.linksViewPath.replace(/\\/$/gi, \"\") + \"/\";\n }\n\n const { favicons } = await import(\"favicons\");\n\n try {\n const response = await favicons(source, options);\n\n if (options.iconsPath) {\n for (const i in response.images) {\n fs.writeFileSync(options.iconsPath + response.images[i].name, response.images[i].contents);\n }\n\n for (const i in response.files) {\n fs.writeFileSync(options.iconsPath + response.files[i].name, response.files[i].contents);\n }\n }\n\n if (options.linksViewPath) {\n const html = `\n function Links(){\n return ${htmlToHyperscript(response.html.join(\"\"))};\n }\n \n Links.default = Links;\n module.exports = Links;\n `;\n\n fs.writeFileSync(`${options.linksViewPath}/links.js`, html);\n }\n } catch (err) {\n process.stdout.write((err as any).status + \"\\n\"); // HTTP error code (e.g. `200`) or `null`\n process.stdout.write((err as any).name + \"\\n\"); // Error name e.g. \"API Error\"\n process.stdout.write((err as any).message + \"\\n\"); // Error description e.g. \"An unknown error has occurred\"\n }\n}\n\nicons.options = {\n iconsPath: null,\n linksViewPath: null,\n\n // favicons options\n path: \"\",\n appName: null,\n appDescription: null,\n developerName: null,\n developerURL: null,\n dir: \"auto\",\n lang: \"en-US\",\n background: \"#fff\",\n theme_color: \"#fff\",\n display: \"standalone\",\n orientation: \"any\",\n start_url: \"/\",\n version: \"1.0\",\n logging: false,\n icons: {\n android: true,\n appleIcon: true,\n appleStartup: true,\n coast: false,\n favicons: true,\n firefox: false,\n windows: true,\n yandex: false // Create Yandex browser icon. `boolean`\n }\n} as unknown as IconsOptions;\n", "import * as tsc from \"tsc-prog\";\n\nimport CleanCSS from \"clean-css\";\nimport { PurgeCSS } from \"purgecss\";\nimport esbuild from \"esbuild\";\n/* eslint-disable sonarjs/cognitive-complexity */\nimport fs from \"fs\";\n\n// eslint-disable-next-line complexity\nexport async function inline(\n file: string | { raw: string; map?: string | null; file: string },\n options: Record<string, any> = {}\n) {\n if (typeof file === \"string\") {\n const ext = file.split(\".\").pop();\n if (ext && /(js|cjs|jsx|mjs|ts|tsx)/.test(ext)) {\n if (/(ts|tsx)/.test(ext) && !options.noValidate) {\n const declarationDir = options.declarationDir;\n const emitDeclaration = !!declarationDir;\n\n const tscProgOptions = {\n basePath: process.cwd(), // always required, used for relative paths\n configFilePath: \"tsconfig.json\", // config to inherit from (optional)\n files: [file],\n include: [\"**/*.ts\", \"**/*.js\", \"**/*.tsx\", \"**/*.jsx\", \"**/*.mjs\"],\n exclude: [\"test*/**/*\", \"**/*.test.ts\", \"**/*.spec.ts\", \"dist/**\"],\n pretty: true,\n copyOtherToOutDir: false,\n clean: emitDeclaration ? [declarationDir] : [],\n ...(options.tsc || {}),\n compilerOptions: {\n rootDir: \"./\",\n outDir: \"dist\",\n noEmitOnError: true,\n noEmit: !emitDeclaration,\n declaration: emitDeclaration,\n declarationDir,\n emitDeclarationOnly: emitDeclaration,\n allowJs: true,\n esModuleInterop: true,\n inlineSourceMap: true,\n resolveJsonModule: true,\n removeComments: true,\n ...(options.tsc || {}).compilerOptions\n },\n jsxFactory: \"v\",\n jsxFragment: \"v.fragment\"\n };\n\n // eslint-disable-next-line no-console\n console.log(\"tsc\", tscProgOptions);\n\n tsc.build(tscProgOptions);\n }\n\n const esbuildOptions = {\n entryPoints: [file],\n bundle: \"bundle\" in options ? options.bundle : true,\n sourcemap: \"external\",\n write: false,\n minify: options.compact,\n outdir: \"out\",\n target: \"esnext\",\n jsxFactory: \"v\",\n jsxFragment: \"v.fragment\",\n loader: {\n \".js\": \"jsx\",\n \".cjs\": \"jsx\",\n \".mjs\": \"jsx\",\n \".ts\": \"tsx\"\n },\n ...(options.esbuild || {})\n };\n\n const result = await esbuild.build(esbuildOptions);\n if (result.outputFiles?.length !== 2) {\n throw new Error(result.errors.join(\"\\n\"));\n }\n\n if (options.compact) {\n const terser = await import(\"terser\");\n const result2 = await terser.minify(result.outputFiles[1].text, {\n sourceMap: {\n content: result.outputFiles[0].text.toString()\n },\n compress: {\n booleans_as_integers: false\n },\n output: {\n wrap_func_args: false\n },\n ecma: 2022,\n ...(options.terser || {})\n });\n\n if (!result2.code || !result2.map) {\n throw new Error(\"Unknown error\");\n }\n\n const mapBase64 = Buffer.from(result2.map.toString()).toString(\"base64\");\n const suffix = `//# sourceMappingURL=data:application/json;charset=utf-8;base64,${mapBase64}`;\n return { raw: result2.code, map: suffix, file };\n } else {\n const mapBase64 = Buffer.from(result.outputFiles[0].text.toString()).toString(\"base64\");\n const suffix = `//# sourceMappingURL=data:application/json;charset=utf-8;base64,${mapBase64}`;\n return { raw: result.outputFiles[1].text, map: suffix, file };\n }\n } else if (ext && /(css|scss|styl)/.test(ext)) {\n const result = await new CleanCSS({\n sourceMap: true,\n level: {\n 1: {\n roundingPrecision: \"all=3\"\n },\n 2: {\n restructureRules: true // controls rule restructuring; defaults to false\n }\n },\n ...(options.cleanCss || {})\n }).minify([file]);\n\n return { raw: result.styles, map: null, file };\n } else {\n return { raw: fs.readFileSync(file, \"utf8\"), map: null, file };\n }\n } else if (typeof file === \"object\" && \"raw\" in file) {\n return { map: null, ...file };\n }\n\n throw new Error(`Unknown file type: ${file}`);\n}\n\ninline.uncss = async function (\n renderedHtml: (string | Promise<string>)[],\n css: string,\n options: Record<string, any> = {}\n) {\n const html = await Promise.all(renderedHtml);\n\n const contents = html.map((item) => {\n return {\n raw: item,\n extension: \"html\"\n };\n });\n\n const purgecss = new PurgeCSS();\n\n const output = await purgecss.purge({\n fontFace: true,\n keyframes: true,\n variables: true,\n defaultExtractor: (content) => content.match(/[A-Za-z0-9-_/:@]*[A-Za-z0-9-_/:@/]+/g) || [],\n ...options,\n content: contents,\n css: [{ raw: css }]\n });\n\n const cleanCss = await new CleanCSS({\n sourceMap: false,\n level: {\n 1: {\n roundingPrecision: \"all=3\"\n },\n 2: {\n restructureRules: true // controls rule restructuring; defaults to false\n }\n },\n ...(options.cleanCss || {})\n }).minify(output[0].css);\n\n return cleanCss.styles;\n};\n", "import fs from \"fs\";\nimport path from \"path\";\n\nexport function sw(file: string, options = {}) {\n const swfiletemplate = path.resolve(__dirname, \"./node.sw.js\");\n const swTpl = fs.readFileSync(swfiletemplate, \"utf8\");\n const opt = {\n version: \"1\",\n name: \"Valyrian.js\",\n urls: [\"/\"],\n debug: false,\n logFetch: false,\n offlinePage: \"/offline.html\",\n ...options\n };\n let contents = swTpl\n .replace(\"v1\", `v${opt.version}`)\n .replace(\"Valyrian.js\", opt.name)\n .replace('[\"/\"]', '[\"' + opt.urls.join('\",\"') + '\"]')\n .replace(\"/offline.html\", opt.offlinePage)\n .replace(\"logFetch: false\", opt.logFetch ? \"logFetch: true\" : \"logFetch: false\");\n\n if (!opt.debug) {\n contents = contents.replace(\"console.log\", \"() => {}\");\n }\n\n fs.writeFileSync(file, contents, \"utf8\");\n}\n\n/*\n // On the server side to generate the service worker\n sw(\"sw.js\", {\n version: \"1\",\n name: \"Valyrian.js\",\n urls: [\"/\"],\n debug: false,\n logFetch: false,\n offlinePage: \"/offline.html\"\n });\n\n\n // On the client side\n if (\"serviceWorker\" in navigator) {\n const registration = await navigator.serviceWorker.register(\"/sw.js\");\n registration.addEventListener(\"updatefound\", () => {\n const newWorker = registration.installing as ServiceWorker;\n newWorker.addEventListener(\"statechange\", () => {\n if (newWorker.state === \"installed\") {\n // Notify the user about the new version and ask if they want to update\n if (confirm(\"There is a new version available. Do you want to update?\")) {\n // Send a message to the service worker to skip the waiting\n navigator.serviceWorker.controller.postMessage({ type: \"SKIP_WAITING\" });\n }\n }\n });\n });\n\n navigator.serviceWorker.addEventListener(\"controllerchange\", () => {\n window.location.reload();\n });\n }\n*/\n", "import { AsyncLocalStorage } from \"node:async_hooks\";\n\nconst storageContext = new AsyncLocalStorage<Record<string, string>>();\nlet globalStore: Record<string, string> = {};\n\nexport class ServerStorage implements Storage {\n get store(): Record<string, string> {\n return storageContext.getStore() || globalStore;\n }\n\n get length(): number {\n const store = this.store;\n return store ? Object.keys(store).length : 0;\n }\n\n clear(): void {\n const store = this.store;\n if (store) {\n for (const key in store) {\n Reflect.deleteProperty(store, key);\n }\n }\n }\n\n getItem(key: string): string | null {\n const store = this.store;\n return store ? store[key] || null : null;\n }\n\n key(index: number): string | null {\n const store = this.store;\n return store ? Object.keys(store)[index] || null : null;\n }\n\n removeItem(key: string): void {\n const store = this.store;\n if (store) {\n Reflect.deleteProperty(store, key);\n }\n }\n\n setItem(key: string, value: string): void {\n const store = this.store;\n if (store) {\n store[key] = String(value);\n }\n }\n\n static run(callback: () => void) {\n storageContext.run({}, callback);\n }\n\n toJSON(): Record<string, string> {\n const store = this.store;\n return store ? { ...store } : {};\n }\n}\n\n/*\nOn node.js environment, use ServerStorage for session storage.\nAt each request, a new storage context is created using ServerStorage.run method.\nIn browser environment, use the native sessionStorage.\n\nserver.get(\"*\", (req, res) => {\n ServerStorage.run(() => {\n const html = router.go(req.url);\n res.send(html);\n \n });\n});\n*/\n"],
5
+ "mappings": "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",
6
+ "names": ["node", "html", "item", "document", "html", "fs", "html", "fs"]
7
7
  }
@@ -169,17 +169,48 @@ function createStore(initialState, pulses, immutable = false) {
169
169
  return pulseMethod;
170
170
  }
171
171
  syncState(localState);
172
+ const listeners = {};
173
+ const trigger = (event, ...args) => {
174
+ if (listeners[event]) {
175
+ listeners[event].forEach((callback) => callback(...args));
176
+ }
177
+ };
172
178
  const pulsesProxy = new Proxy(boundPulses, {
173
179
  get: (pulses2, prop) => {
174
180
  if (prop === "state") {
175
181
  return proxyState;
176
182
  }
183
+ if (prop === "on") {
184
+ return (event, callback) => {
185
+ if (!listeners[event]) {
186
+ listeners[event] = [];
187
+ }
188
+ listeners[event].push(callback);
189
+ };
190
+ }
191
+ if (prop === "off") {
192
+ return (event, callback) => {
193
+ if (listeners[event]) {
194
+ listeners[event] = listeners[event].filter((cb) => cb !== callback);
195
+ }
196
+ };
197
+ }
177
198
  if (!(prop in pulses2)) {
178
199
  throw new Error(`Pulse '${prop}' does not exist`);
179
200
  }
180
201
  const pulseMethod = pulses2[prop];
181
202
  if (typeof pulseMethod === "function") {
182
- return pulseMethod.bind(pulsesProxy);
203
+ return (...args) => {
204
+ const result = pulseMethod.apply(pulsesProxy, args);
205
+ if (result instanceof Promise) {
206
+ return result.then((r) => {
207
+ trigger("pulse", prop, args);
208
+ return r;
209
+ });
210
+ }
211
+ trigger("pulse", prop, args);
212
+ return result;
213
+ };
183
214
  }
184
215
  return pulseMethod;
185
216
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../lib/pulses/index.ts"],
4
- "sourcesContent": ["/* eslint-disable no-console */\nimport { updateVnode, VnodeWithDom, current, DomElement } from \"valyrian.js\";\nimport { deepCloneUnfreeze, deepFreeze, hasChanged } from \"valyrian.js/utils\";\n\ntype State = Record<string, any>;\n\nexport type Pulse<StateType, TReturn = unknown> = (state: StateType, ...args: any[]) => TReturn | Promise<TReturn>;\n\nexport type Pulses<StateType> = Record<string, Pulse<StateType, any> & { $flush?: () => Promise<void> }>;\n\ntype ProxyState<StateType> = StateType & { [key: string]: any };\n\nconst effectStack: Function[] = [];\n\ntype StorePulses<PulsesType extends Pulses<any>> = {\n [K in keyof PulsesType]: PulsesType[K] extends (state: any, ...args: infer Args) => infer R\n ? (...args: Args) => R\n : never;\n};\n\n/** Funci\u00F3n auxiliar para registrar la suscripci\u00F3n al nodo DOM.\n * Retorna true si se agreg\u00F3 la suscripci\u00F3n, o false si se encontr\u00F3 un nodo padre ya suscrito.\n */\nfunction registerDomSubscription(subscribers: Set<Function>, domWithVnodesToUpdate: WeakSet<DomElement>): void {\n const currentVnode = current.vnode as VnodeWithDom;\n if (!currentVnode || domWithVnodesToUpdate.has(currentVnode.dom)) {\n return;\n }\n\n let hasParent = false;\n let parent = currentVnode.dom.parentElement as DomElement;\n while (parent) {\n if (domWithVnodesToUpdate.has(parent)) {\n hasParent = true;\n break;\n }\n parent = parent.parentElement as DomElement;\n }\n\n // Si no hay nodo padre registrado, se crea la suscripci\u00F3n.\n if (!hasParent) {\n const dom = currentVnode.dom;\n const subscription = () => {\n updateVnode(dom.vnode);\n if (!dom.parentElement) {\n subscribers.delete(subscription);\n domWithVnodesToUpdate.delete(dom);\n }\n };\n subscribers.add(subscription);\n domWithVnodesToUpdate.add(dom);\n }\n}\n\nfunction createStore<StateType extends State, PulsesType extends Pulses<StateType>>(\n initialState: StateType | (() => StateType) | null,\n pulses: PulsesType,\n immutable = false\n): StorePulses<PulsesType> & { state: ProxyState<StateType> } {\n const subscribers = new Set<Function>();\n const domWithVnodesToUpdate = new WeakSet<DomElement>();\n\n const boundPulses: Pulses<StateType> = {};\n for (const key in pulses) {\n if (typeof pulses[key] !== \"function\") {\n throw new Error(`Pulse '${key}' must be a function`);\n }\n if (key === \"state\") {\n throw new Error(`A pulse cannot be named 'state'`);\n }\n boundPulses[key] = getPulseMethod(key);\n }\n\n const localState: StateType =\n (typeof initialState === \"function\" ? initialState() : initialState) || ({} as StateType);\n\n function isMutable() {\n if (immutable) {\n throw new Error(\"You need to call a pulse to modify the state\");\n }\n }\n\n let currentState: StateType | null = null;\n let pulseCallCount = 0;\n\n const proxyState = new Proxy(localState, {\n get: (state, prop: string) => {\n // If we are in a pulse, we return the value of the cloned state.\n if (currentState) {\n return currentState[prop];\n }\n\n const currentEffect = effectStack[effectStack.length - 1];\n if (currentEffect && !subscribers.has(currentEffect)) {\n subscribers.add(currentEffect);\n }\n\n registerDomSubscription(subscribers, domWithVnodesToUpdate);\n\n return state[prop];\n },\n set: (state, prop: string, value: any) => {\n isMutable();\n Reflect.set(state, prop, value);\n return true;\n },\n deleteProperty: (state, prop: string) => {\n isMutable();\n Reflect.deleteProperty(state, prop);\n return true;\n }\n });\n\n function syncState(newState: StateType) {\n for (const key in newState) {\n localState[key] = immutable ? deepFreeze(newState[key]) : newState[key];\n }\n for (const key in localState) {\n if (!(key in newState)) {\n Reflect.deleteProperty(localState, key);\n }\n }\n }\n\n let debounceTimeout: ReturnType<typeof setTimeout> | null = null;\n function debouncedUpdate() {\n if (debounceTimeout) {\n clearTimeout(debounceTimeout);\n }\n debounceTimeout = setTimeout(() => subscribers.forEach((subscriber) => subscriber()), 0);\n }\n\n function setState(newState: StateType, flush = false) {\n pulseCallCount--;\n if (!hasChanged(localState, newState)) {\n return;\n }\n if (pulseCallCount > 0 && !flush) {\n return;\n }\n syncState(newState);\n currentState = null;\n debouncedUpdate();\n }\n\n function getPulseMethod(key: string) {\n function pulseMethod(this: Pulse<StateType, any> & { $flush: () => Promise<void> }, ...args: any[]) {\n pulseCallCount++;\n if (currentState === null) {\n currentState = deepCloneUnfreeze(localState);\n }\n\n const $flush = async () => {\n setState(currentState as StateType, true);\n currentState = deepCloneUnfreeze(localState);\n await new Promise((resolve) => setTimeout(resolve, 0));\n };\n\n Reflect.set(this, \"$flush\", $flush);\n const emptyFlush = async () => {};\n\n try {\n const pulseResult = pulses[key].apply(this, [currentState, ...args]);\n if (pulseResult instanceof Promise) {\n return pulseResult\n .then((resolvedValue) => {\n setState(currentState as StateType);\n Reflect.set(this, \"$flush\", emptyFlush);\n return resolvedValue;\n })\n .catch((error) => {\n console.error(`Error in pulse '${key}':`, error);\n Reflect.set(this, \"$flush\", emptyFlush);\n throw error;\n });\n } else {\n setState(currentState);\n Reflect.set(this, \"$flush\", emptyFlush);\n return pulseResult;\n }\n } catch (error) {\n console.error(`Error in pulse '${key}':`, error);\n Reflect.set(this, \"$flush\", emptyFlush);\n throw error;\n }\n }\n\n return pulseMethod;\n }\n\n syncState(localState);\n\n const pulsesProxy = new Proxy(boundPulses, {\n get: (pulses, prop: string) => {\n if (prop === \"state\") {\n return proxyState;\n }\n if (!(prop in pulses)) {\n throw new Error(`Pulse '${prop}' does not exist`);\n }\n const pulseMethod = pulses[prop];\n\n if (typeof pulseMethod === \"function\") {\n return pulseMethod.bind(pulsesProxy);\n }\n\n return pulseMethod;\n }\n });\n\n return pulsesProxy as StorePulses<PulsesType> & { state: ProxyState<StateType> };\n}\n\nexport function createPulseStore<StateType extends State, PulsesType extends Pulses<StateType>>(\n initialState: StateType,\n pulses: PulsesType\n): StorePulses<PulsesType> & { state: ProxyState<StateType> } {\n return createStore(initialState, pulses, true);\n}\n\nexport function createMutableStore<StateType extends State, PulsesType extends Pulses<StateType>>(\n initialState: StateType,\n pulses: PulsesType\n): StorePulses<PulsesType> & { state: ProxyState<StateType> } {\n console.warn(\n \"Warning: You are working with a mutable state. This can lead to unpredictable behavior. All state changes made outside of a pulse will not trigger a re-render.\"\n );\n return createStore(initialState, pulses, false);\n}\n\nexport function createEffect(effect: Function) {\n const runEffect = () => {\n try {\n effectStack.push(runEffect);\n effect();\n } finally {\n effectStack.pop();\n }\n };\n runEffect();\n}\n\nexport function createPulse<T>(initialValue: T): [() => T, (newValue: T | ((current: T) => T)) => void, () => void] {\n let value = initialValue;\n const subscribers = new Set<Function>();\n const domWithVnodesToUpdate = new WeakSet<DomElement>();\n\n const runSubscribers = () => {\n subscribers.forEach((subscriber) => subscriber());\n };\n\n const read = (): T => {\n const currentEffect = effectStack[effectStack.length - 1];\n if (currentEffect && !subscribers.has(currentEffect)) {\n subscribers.add(currentEffect);\n }\n registerDomSubscription(subscribers, domWithVnodesToUpdate);\n return value;\n };\n\n const write = (newValue: T | ((current: T) => T)): void => {\n const resolvedValue = typeof newValue === \"function\" ? (newValue as (current: T) => T)(value) : newValue;\n if (!hasChanged(value, resolvedValue)) {\n return;\n }\n value = resolvedValue;\n runSubscribers();\n };\n\n return [read, write, runSubscribers];\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,sBAA+D;AAC/D,mBAA0D;AAU1D,IAAM,cAA0B,CAAC;AAWjC,SAAS,wBAAwB,aAA4B,uBAAkD;AAC7G,QAAM,eAAe,wBAAQ;AAC7B,MAAI,CAAC,gBAAgB,sBAAsB,IAAI,aAAa,GAAG,GAAG;AAChE;AAAA,EACF;AAEA,MAAI,YAAY;AAChB,MAAI,SAAS,aAAa,IAAI;AAC9B,SAAO,QAAQ;AACb,QAAI,sBAAsB,IAAI,MAAM,GAAG;AACrC,kBAAY;AACZ;AAAA,IACF;AACA,aAAS,OAAO;AAAA,EAClB;AAGA,MAAI,CAAC,WAAW;AACd,UAAM,MAAM,aAAa;AACzB,UAAM,eAAe,MAAM;AACzB,uCAAY,IAAI,KAAK;AACrB,UAAI,CAAC,IAAI,eAAe;AACtB,oBAAY,OAAO,YAAY;AAC/B,8BAAsB,OAAO,GAAG;AAAA,MAClC;AAAA,IACF;AACA,gBAAY,IAAI,YAAY;AAC5B,0BAAsB,IAAI,GAAG;AAAA,EAC/B;AACF;AAEA,SAAS,YACP,cACA,QACA,YAAY,OACgD;AAC5D,QAAM,cAAc,oBAAI,IAAc;AACtC,QAAM,wBAAwB,oBAAI,QAAoB;AAEtD,QAAM,cAAiC,CAAC;AACxC,aAAW,OAAO,QAAQ;AACxB,QAAI,OAAO,OAAO,GAAG,MAAM,YAAY;AACrC,YAAM,IAAI,MAAM,UAAU,GAAG,sBAAsB;AAAA,IACrD;AACA,QAAI,QAAQ,SAAS;AACnB,YAAM,IAAI,MAAM,iCAAiC;AAAA,IACnD;AACA,gBAAY,GAAG,IAAI,eAAe,GAAG;AAAA,EACvC;AAEA,QAAM,cACH,OAAO,iBAAiB,aAAa,aAAa,IAAI,iBAAkB,CAAC;AAE5E,WAAS,YAAY;AACnB,QAAI,WAAW;AACb,YAAM,IAAI,MAAM,8CAA8C;AAAA,IAChE;AAAA,EACF;AAEA,MAAI,eAAiC;AACrC,MAAI,iBAAiB;AAErB,QAAM,aAAa,IAAI,MAAM,YAAY;AAAA,IACvC,KAAK,CAAC,OAAO,SAAiB;AAE5B,UAAI,cAAc;AAChB,eAAO,aAAa,IAAI;AAAA,MAC1B;AAEA,YAAM,gBAAgB,YAAY,YAAY,SAAS,CAAC;AACxD,UAAI,iBAAiB,CAAC,YAAY,IAAI,aAAa,GAAG;AACpD,oBAAY,IAAI,aAAa;AAAA,MAC/B;AAEA,8BAAwB,aAAa,qBAAqB;AAE1D,aAAO,MAAM,IAAI;AAAA,IACnB;AAAA,IACA,KAAK,CAAC,OAAO,MAAc,UAAe;AACxC,gBAAU;AACV,cAAQ,IAAI,OAAO,MAAM,KAAK;AAC9B,aAAO;AAAA,IACT;AAAA,IACA,gBAAgB,CAAC,OAAO,SAAiB;AACvC,gBAAU;AACV,cAAQ,eAAe,OAAO,IAAI;AAClC,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AAED,WAAS,UAAU,UAAqB;AACtC,eAAW,OAAO,UAAU;AAC1B,iBAAW,GAAG,IAAI,gBAAY,yBAAW,SAAS,GAAG,CAAC,IAAI,SAAS,GAAG;AAAA,IACxE;AACA,eAAW,OAAO,YAAY;AAC5B,UAAI,EAAE,OAAO,WAAW;AACtB,gBAAQ,eAAe,YAAY,GAAG;AAAA,MACxC;AAAA,IACF;AAAA,EACF;AAEA,MAAI,kBAAwD;AAC5D,WAAS,kBAAkB;AACzB,QAAI,iBAAiB;AACnB,mBAAa,eAAe;AAAA,IAC9B;AACA,sBAAkB,WAAW,MAAM,YAAY,QAAQ,CAAC,eAAe,WAAW,CAAC,GAAG,CAAC;AAAA,EACzF;AAEA,WAAS,SAAS,UAAqB,QAAQ,OAAO;AACpD;AACA,QAAI,KAAC,yBAAW,YAAY,QAAQ,GAAG;AACrC;AAAA,IACF;AACA,QAAI,iBAAiB,KAAK,CAAC,OAAO;AAChC;AAAA,IACF;AACA,cAAU,QAAQ;AAClB,mBAAe;AACf,oBAAgB;AAAA,EAClB;AAEA,WAAS,eAAe,KAAa;AACnC,aAAS,eAA8E,MAAa;AAClG;AACA,UAAI,iBAAiB,MAAM;AACzB,2BAAe,gCAAkB,UAAU;AAAA,MAC7C;AAEA,YAAM,SAAS,YAAY;AACzB,iBAAS,cAA2B,IAAI;AACxC,2BAAe,gCAAkB,UAAU;AAC3C,cAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,CAAC,CAAC;AAAA,MACvD;AAEA,cAAQ,IAAI,MAAM,UAAU,MAAM;AAClC,YAAM,aAAa,YAAY;AAAA,MAAC;AAEhC,UAAI;AACF,cAAM,cAAc,OAAO,GAAG,EAAE,MAAM,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC;AACnE,YAAI,uBAAuB,SAAS;AAClC,iBAAO,YACJ,KAAK,CAAC,kBAAkB;AACvB,qBAAS,YAAyB;AAClC,oBAAQ,IAAI,MAAM,UAAU,UAAU;AACtC,mBAAO;AAAA,UACT,CAAC,EACA,MAAM,CAAC,UAAU;AAChB,oBAAQ,MAAM,mBAAmB,GAAG,MAAM,KAAK;AAC/C,oBAAQ,IAAI,MAAM,UAAU,UAAU;AACtC,kBAAM;AAAA,UACR,CAAC;AAAA,QACL,OAAO;AACL,mBAAS,YAAY;AACrB,kBAAQ,IAAI,MAAM,UAAU,UAAU;AACtC,iBAAO;AAAA,QACT;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ,MAAM,mBAAmB,GAAG,MAAM,KAAK;AAC/C,gBAAQ,IAAI,MAAM,UAAU,UAAU;AACtC,cAAM;AAAA,MACR;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,YAAU,UAAU;AAEpB,QAAM,cAAc,IAAI,MAAM,aAAa;AAAA,IACzC,KAAK,CAACA,SAAQ,SAAiB;AAC7B,UAAI,SAAS,SAAS;AACpB,eAAO;AAAA,MACT;AACA,UAAI,EAAE,QAAQA,UAAS;AACrB,cAAM,IAAI,MAAM,UAAU,IAAI,kBAAkB;AAAA,MAClD;AACA,YAAM,cAAcA,QAAO,IAAI;AAE/B,UAAI,OAAO,gBAAgB,YAAY;AACrC,eAAO,YAAY,KAAK,WAAW;AAAA,MACrC;AAEA,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAEO,SAAS,iBACd,cACA,QAC4D;AAC5D,SAAO,YAAY,cAAc,QAAQ,IAAI;AAC/C;AAEO,SAAS,mBACd,cACA,QAC4D;AAC5D,UAAQ;AAAA,IACN;AAAA,EACF;AACA,SAAO,YAAY,cAAc,QAAQ,KAAK;AAChD;AAEO,SAAS,aAAa,QAAkB;AAC7C,QAAM,YAAY,MAAM;AACtB,QAAI;AACF,kBAAY,KAAK,SAAS;AAC1B,aAAO;AAAA,IACT,UAAE;AACA,kBAAY,IAAI;AAAA,IAClB;AAAA,EACF;AACA,YAAU;AACZ;AAEO,SAAS,YAAe,cAAqF;AAClH,MAAI,QAAQ;AACZ,QAAM,cAAc,oBAAI,IAAc;AACtC,QAAM,wBAAwB,oBAAI,QAAoB;AAEtD,QAAM,iBAAiB,MAAM;AAC3B,gBAAY,QAAQ,CAAC,eAAe,WAAW,CAAC;AAAA,EAClD;AAEA,QAAM,OAAO,MAAS;AACpB,UAAM,gBAAgB,YAAY,YAAY,SAAS,CAAC;AACxD,QAAI,iBAAiB,CAAC,YAAY,IAAI,aAAa,GAAG;AACpD,kBAAY,IAAI,aAAa;AAAA,IAC/B;AACA,4BAAwB,aAAa,qBAAqB;AAC1D,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,CAAC,aAA4C;AACzD,UAAM,gBAAgB,OAAO,aAAa,aAAc,SAA+B,KAAK,IAAI;AAChG,QAAI,KAAC,yBAAW,OAAO,aAAa,GAAG;AACrC;AAAA,IACF;AACA,YAAQ;AACR,mBAAe;AAAA,EACjB;AAEA,SAAO,CAAC,MAAM,OAAO,cAAc;AACrC;",
4
+ "sourcesContent": ["/* eslint-disable no-console */\nimport { updateVnode, VnodeWithDom, current, DomElement } from \"valyrian.js\";\nimport { deepCloneUnfreeze, deepFreeze, hasChanged } from \"valyrian.js/utils\";\n\ntype State = Record<string, any>;\n\nexport type Pulse<StateType, TReturn = unknown> = (state: StateType, ...args: any[]) => TReturn | Promise<TReturn>;\n\nexport type Pulses<StateType> = Record<string, Pulse<StateType, any> & { $flush?: () => Promise<void> }>;\n\ntype ProxyState<StateType> = StateType & { [key: string]: any };\n\nconst effectStack: Function[] = [];\n\ntype StorePulses<PulsesType extends Pulses<any>> = {\n [K in keyof PulsesType]: PulsesType[K] extends (state: any, ...args: infer Args) => infer R\n ? (...args: Args) => R\n : never;\n};\n\n/** Funci\u00F3n auxiliar para registrar la suscripci\u00F3n al nodo DOM.\n * Retorna true si se agreg\u00F3 la suscripci\u00F3n, o false si se encontr\u00F3 un nodo padre ya suscrito.\n */\nfunction registerDomSubscription(subscribers: Set<Function>, domWithVnodesToUpdate: WeakSet<DomElement>): void {\n const currentVnode = current.vnode as VnodeWithDom;\n if (!currentVnode || domWithVnodesToUpdate.has(currentVnode.dom)) {\n return;\n }\n\n let hasParent = false;\n let parent = currentVnode.dom.parentElement as DomElement;\n while (parent) {\n if (domWithVnodesToUpdate.has(parent)) {\n hasParent = true;\n break;\n }\n parent = parent.parentElement as DomElement;\n }\n\n // Si no hay nodo padre registrado, se crea la suscripci\u00F3n.\n if (!hasParent) {\n const dom = currentVnode.dom;\n const subscription = () => {\n updateVnode(dom.vnode);\n if (!dom.parentElement) {\n subscribers.delete(subscription);\n domWithVnodesToUpdate.delete(dom);\n }\n };\n subscribers.add(subscription);\n domWithVnodesToUpdate.add(dom);\n }\n}\n\nfunction createStore<StateType extends State, PulsesType extends Pulses<StateType>>(\n initialState: StateType | (() => StateType) | null,\n pulses: PulsesType,\n immutable = false\n): StorePulses<PulsesType> & {\n state: ProxyState<StateType>;\n on: (event: string, callback: Function) => void;\n off: (event: string, callback: Function) => void;\n} {\n const subscribers = new Set<Function>();\n const domWithVnodesToUpdate = new WeakSet<DomElement>();\n\n const boundPulses: Pulses<StateType> = {};\n for (const key in pulses) {\n if (typeof pulses[key] !== \"function\") {\n throw new Error(`Pulse '${key}' must be a function`);\n }\n if (key === \"state\") {\n throw new Error(`A pulse cannot be named 'state'`);\n }\n boundPulses[key] = getPulseMethod(key);\n }\n\n const localState: StateType =\n (typeof initialState === \"function\" ? initialState() : initialState) || ({} as StateType);\n\n function isMutable() {\n if (immutable) {\n throw new Error(\"You need to call a pulse to modify the state\");\n }\n }\n\n let currentState: StateType | null = null;\n let pulseCallCount = 0;\n\n const proxyState = new Proxy(localState, {\n get: (state, prop: string) => {\n // If we are in a pulse, we return the value of the cloned state.\n if (currentState) {\n return currentState[prop];\n }\n\n const currentEffect = effectStack[effectStack.length - 1];\n if (currentEffect && !subscribers.has(currentEffect)) {\n subscribers.add(currentEffect);\n }\n\n registerDomSubscription(subscribers, domWithVnodesToUpdate);\n\n return state[prop];\n },\n set: (state, prop: string, value: any) => {\n isMutable();\n Reflect.set(state, prop, value);\n return true;\n },\n deleteProperty: (state, prop: string) => {\n isMutable();\n Reflect.deleteProperty(state, prop);\n return true;\n }\n });\n\n function syncState(newState: StateType) {\n for (const key in newState) {\n localState[key] = immutable ? deepFreeze(newState[key]) : newState[key];\n }\n for (const key in localState) {\n if (!(key in newState)) {\n Reflect.deleteProperty(localState, key);\n }\n }\n }\n\n let debounceTimeout: ReturnType<typeof setTimeout> | null = null;\n function debouncedUpdate() {\n if (debounceTimeout) {\n clearTimeout(debounceTimeout);\n }\n debounceTimeout = setTimeout(() => subscribers.forEach((subscriber) => subscriber()), 0);\n }\n\n function setState(newState: StateType, flush = false) {\n pulseCallCount--;\n if (!hasChanged(localState, newState)) {\n return;\n }\n if (pulseCallCount > 0 && !flush) {\n return;\n }\n syncState(newState);\n currentState = null;\n debouncedUpdate();\n }\n\n function getPulseMethod(key: string) {\n function pulseMethod(this: Pulse<StateType, any> & { $flush: () => Promise<void> }, ...args: any[]) {\n pulseCallCount++;\n if (currentState === null) {\n currentState = deepCloneUnfreeze(localState);\n }\n\n const $flush = async () => {\n setState(currentState as StateType, true);\n currentState = deepCloneUnfreeze(localState);\n await new Promise((resolve) => setTimeout(resolve, 0));\n };\n\n Reflect.set(this, \"$flush\", $flush);\n const emptyFlush = async () => {};\n\n try {\n const pulseResult = pulses[key].apply(this, [currentState, ...args] as any);\n if (pulseResult instanceof Promise) {\n return pulseResult\n .then((resolvedValue) => {\n setState(currentState as StateType);\n Reflect.set(this, \"$flush\", emptyFlush);\n return resolvedValue;\n })\n .catch((error) => {\n console.error(`Error in pulse '${key}':`, error);\n Reflect.set(this, \"$flush\", emptyFlush);\n throw error;\n });\n } else {\n setState(currentState);\n Reflect.set(this, \"$flush\", emptyFlush);\n return pulseResult;\n }\n } catch (error) {\n console.error(`Error in pulse '${key}':`, error);\n Reflect.set(this, \"$flush\", emptyFlush);\n throw error;\n }\n }\n\n return pulseMethod;\n }\n\n syncState(localState);\n\n const listeners: Record<string, Function[]> = {};\n const trigger = (event: string, ...args: any[]) => {\n if (listeners[event]) {\n listeners[event].forEach((callback) => callback(...args));\n }\n };\n\n const pulsesProxy = new Proxy(boundPulses, {\n get: (pulses, prop: string) => {\n if (prop === \"state\") {\n return proxyState;\n }\n if (prop === \"on\") {\n return (event: string, callback: Function) => {\n if (!listeners[event]) {\n listeners[event] = [];\n }\n listeners[event].push(callback);\n };\n }\n if (prop === \"off\") {\n return (event: string, callback: Function) => {\n if (listeners[event]) {\n listeners[event] = listeners[event].filter((cb) => cb !== callback);\n }\n };\n }\n if (!(prop in pulses)) {\n throw new Error(`Pulse '${prop}' does not exist`);\n }\n const pulseMethod = pulses[prop];\n\n if (typeof pulseMethod === \"function\") {\n return (...args: any[]) => {\n const result = pulseMethod.apply(pulsesProxy, args as any);\n if (result instanceof Promise) {\n return result.then((r) => {\n trigger(\"pulse\", prop, args);\n return r;\n });\n }\n trigger(\"pulse\", prop, args);\n return result;\n };\n }\n\n return pulseMethod;\n }\n });\n\n return pulsesProxy as StorePulses<PulsesType> & {\n state: ProxyState<StateType>;\n on: (event: string, callback: Function) => void;\n off: (event: string, callback: Function) => void;\n };\n}\n\nexport function createPulseStore<StateType extends State, PulsesType extends Pulses<StateType>>(\n initialState: StateType,\n pulses: PulsesType\n): StorePulses<PulsesType> & {\n state: ProxyState<StateType>;\n on: (event: string, callback: Function) => void;\n off: (event: string, callback: Function) => void;\n} {\n return createStore(initialState, pulses, true);\n}\n\nexport function createMutableStore<StateType extends State, PulsesType extends Pulses<StateType>>(\n initialState: StateType,\n pulses: PulsesType\n): StorePulses<PulsesType> & {\n state: ProxyState<StateType>;\n on: (event: string, callback: Function) => void;\n off: (event: string, callback: Function) => void;\n} {\n console.warn(\n \"Warning: You are working with a mutable state. This can lead to unpredictable behavior. All state changes made outside of a pulse will not trigger a re-render.\"\n );\n return createStore(initialState, pulses, false);\n}\n\nexport function createEffect(effect: Function) {\n const runEffect = () => {\n try {\n effectStack.push(runEffect);\n effect();\n } finally {\n effectStack.pop();\n }\n };\n runEffect();\n}\n\nexport function createPulse<T>(initialValue: T): [() => T, (newValue: T | ((current: T) => T)) => void, () => void] {\n let value = initialValue;\n const subscribers = new Set<Function>();\n const domWithVnodesToUpdate = new WeakSet<DomElement>();\n\n const runSubscribers = () => {\n subscribers.forEach((subscriber) => subscriber());\n };\n\n const read = (): T => {\n const currentEffect = effectStack[effectStack.length - 1];\n if (currentEffect && !subscribers.has(currentEffect)) {\n subscribers.add(currentEffect);\n }\n registerDomSubscription(subscribers, domWithVnodesToUpdate);\n return value;\n };\n\n const write = (newValue: T | ((current: T) => T)): void => {\n const resolvedValue = typeof newValue === \"function\" ? (newValue as (current: T) => T)(value) : newValue;\n if (!hasChanged(value, resolvedValue)) {\n return;\n }\n value = resolvedValue;\n runSubscribers();\n };\n\n return [read, write, runSubscribers];\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["pulses"]
7
7
  }
@@ -1 +1 @@
1
- (()=>{"use strict";var e=Object.defineProperty,t=Object.getOwnPropertyDescriptor,n=Object.getOwnPropertyNames,r=Object.prototype.hasOwnProperty,o={};((t,n)=>{for(var r in n)e(t,r,{get:n[r],enumerable:!0})})(o,{createEffect:()=>p,createMutableStore:()=>h,createPulse:()=>y,createPulseStore:()=>d});var s,l=(s=o,((o,s,l,a)=>{if(s&&"object"==typeof s||"function"==typeof s)for(let c of n(s))r.call(o,c)||c===l||e(o,c,{get:()=>s[c],enumerable:!(a=t(s,c))||a.enumerable});return o})(e({},"__esModule",{value:!0}),s)),a=require("valyrian.js"),c=require("valyrian.js/utils"),u=[];function i(e,t){const n=a.current.vnode;if(!n||t.has(n.dom))return;let r=!1,o=n.dom.parentElement;for(;o;){if(t.has(o)){r=!0;break}o=o.parentElement}if(!r){const r=n.dom,o=()=>{(0,a.updateVnode)(r.vnode),r.parentElement||(e.delete(o),t.delete(r))};e.add(o),t.add(r)}}function f(e,t,n=!1){const r=new Set,o=new WeakSet,s={};for(const e in t){if("function"!=typeof t[e])throw new Error(`Pulse '${e}' must be a function`);if("state"===e)throw new Error("A pulse cannot be named 'state'");s[e]=m(e)}const l=("function"==typeof e?e():e)||{};function a(){if(n)throw new Error("You need to call a pulse to modify the state")}let f=null,d=0;const h=new Proxy(l,{get:(e,t)=>{if(f)return f[t];const n=u[u.length-1];return n&&!r.has(n)&&r.add(n),i(r,o),e[t]},set:(e,t,n)=>(a(),Reflect.set(e,t,n),!0),deleteProperty:(e,t)=>(a(),Reflect.deleteProperty(e,t),!0)});function p(e){for(const t in e)l[t]=n?(0,c.deepFreeze)(e[t]):e[t];for(const t in l)t in e||Reflect.deleteProperty(l,t)}let y=null;function w(e,t=!1){d--,(0,c.hasChanged)(l,e)&&(d>0&&!t||(p(e),f=null,y&&clearTimeout(y),y=setTimeout(()=>r.forEach(e=>e()),0)))}function m(e){return function(...n){d++,null===f&&(f=(0,c.deepCloneUnfreeze)(l)),Reflect.set(this,"$flush",async()=>{w(f,!0),f=(0,c.deepCloneUnfreeze)(l),await new Promise(e=>setTimeout(e,0))});const r=async()=>{};try{const o=t[e].apply(this,[f,...n]);return o instanceof Promise?o.then(e=>(w(f),Reflect.set(this,"$flush",r),e)).catch(t=>{throw console.error(`Error in pulse '${e}':`,t),Reflect.set(this,"$flush",r),t}):(w(f),Reflect.set(this,"$flush",r),o)}catch(t){throw console.error(`Error in pulse '${e}':`,t),Reflect.set(this,"$flush",r),t}}}p(l);const b=new Proxy(s,{get:(e,t)=>{if("state"===t)return h;if(!(t in e))throw new Error(`Pulse '${t}' does not exist`);const n=e[t];return"function"==typeof n?n.bind(b):n}});return b}function d(e,t){return f(e,t,!0)}function h(e,t){return console.warn("Warning: You are working with a mutable state. This can lead to unpredictable behavior. All state changes made outside of a pulse will not trigger a re-render."),f(e,t,!1)}function p(e){const t=()=>{try{u.push(t),e()}finally{u.pop()}};t()}function y(e){let t=e;const n=new Set,r=new WeakSet,o=()=>{n.forEach(e=>e())};return[()=>{const e=u[u.length-1];return e&&!n.has(e)&&n.add(e),i(n,r),t},e=>{const n="function"==typeof e?e(t):e;(0,c.hasChanged)(t,n)&&(t=n,o())},o]}"undefined"!=typeof module?module.exports=l:self.ValyrianPulses=l})();//# sourceMappingURL=index.min.js.map
1
+ (()=>{"use strict";var e=Object.defineProperty,t=Object.getOwnPropertyDescriptor,n=Object.getOwnPropertyNames,r=Object.prototype.hasOwnProperty,o={};((t,n)=>{for(var r in n)e(t,r,{get:n[r],enumerable:!0})})(o,{createEffect:()=>d,createMutableStore:()=>p,createPulse:()=>y,createPulseStore:()=>h});var s,l=(s=o,((o,s,l,u)=>{if(s&&"object"==typeof s||"function"==typeof s)for(let a of n(s))r.call(o,a)||a===l||e(o,a,{get:()=>s[a],enumerable:!(u=t(s,a))||u.enumerable});return o})(e({},"__esModule",{value:!0}),s)),u=require("valyrian.js"),a=require("valyrian.js/utils"),c=[];function i(e,t){const n=u.current.vnode;if(!n||t.has(n.dom))return;let r=!1,o=n.dom.parentElement;for(;o;){if(t.has(o)){r=!0;break}o=o.parentElement}if(!r){const r=n.dom,o=()=>{(0,u.updateVnode)(r.vnode),r.parentElement||(e.delete(o),t.delete(r))};e.add(o),t.add(r)}}function f(e,t,n=!1){const r=new Set,o=new WeakSet,s={};for(const e in t){if("function"!=typeof t[e])throw new Error(`Pulse '${e}' must be a function`);if("state"===e)throw new Error("A pulse cannot be named 'state'");s[e]=m(e)}const l=("function"==typeof e?e():e)||{};function u(){if(n)throw new Error("You need to call a pulse to modify the state")}let f=null,h=0;const p=new Proxy(l,{get:(e,t)=>{if(f)return f[t];const n=c[c.length-1];return n&&!r.has(n)&&r.add(n),i(r,o),e[t]},set:(e,t,n)=>(u(),Reflect.set(e,t,n),!0),deleteProperty:(e,t)=>(u(),Reflect.deleteProperty(e,t),!0)});function d(e){for(const t in e)l[t]=n?(0,a.deepFreeze)(e[t]):e[t];for(const t in l)t in e||Reflect.deleteProperty(l,t)}let y=null;function w(e,t=!1){h--,(0,a.hasChanged)(l,e)&&(h>0&&!t||(d(e),f=null,y&&clearTimeout(y),y=setTimeout(()=>r.forEach(e=>e()),0)))}function m(e){return function(...n){h++,null===f&&(f=(0,a.deepCloneUnfreeze)(l)),Reflect.set(this,"$flush",async()=>{w(f,!0),f=(0,a.deepCloneUnfreeze)(l),await new Promise(e=>setTimeout(e,0))});const r=async()=>{};try{const o=t[e].apply(this,[f,...n]);return o instanceof Promise?o.then(e=>(w(f),Reflect.set(this,"$flush",r),e)).catch(t=>{throw console.error(`Error in pulse '${e}':`,t),Reflect.set(this,"$flush",r),t}):(w(f),Reflect.set(this,"$flush",r),o)}catch(t){throw console.error(`Error in pulse '${e}':`,t),Reflect.set(this,"$flush",r),t}}}d(l);const P={},b=(e,...t)=>{P[e]&&P[e].forEach(e=>e(...t))},g=new Proxy(s,{get:(e,t)=>{if("state"===t)return p;if("on"===t)return(e,t)=>{P[e]||(P[e]=[]),P[e].push(t)};if("off"===t)return(e,t)=>{P[e]&&(P[e]=P[e].filter(e=>e!==t))};if(!(t in e))throw new Error(`Pulse '${t}' does not exist`);const n=e[t];return"function"==typeof n?(...e)=>{const r=n.apply(g,e);return r instanceof Promise?r.then(n=>(b("pulse",t,e),n)):(b("pulse",t,e),r)}:n}});return g}function h(e,t){return f(e,t,!0)}function p(e,t){return console.warn("Warning: You are working with a mutable state. This can lead to unpredictable behavior. All state changes made outside of a pulse will not trigger a re-render."),f(e,t,!1)}function d(e){const t=()=>{try{c.push(t),e()}finally{c.pop()}};t()}function y(e){let t=e;const n=new Set,r=new WeakSet,o=()=>{n.forEach(e=>e())};return[()=>{const e=c[c.length-1];return e&&!n.has(e)&&n.add(e),i(n,r),t},e=>{const n="function"==typeof e?e(t):e;(0,a.hasChanged)(t,n)&&(t=n,o())},o]}"undefined"!=typeof module?module.exports=l:self.ValyrianPulses=l})();//# sourceMappingURL=index.min.js.map
@@ -1 +1 @@
1
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJpbmRleF9leHBvcnRzIiwiX19leHBvcnQiLCJjcmVhdGVFZmZlY3QiLCJjcmVhdGVNdXRhYmxlU3RvcmUiLCJjcmVhdGVQdWxzZSIsImNyZWF0ZVB1bHNlU3RvcmUiLCJfX0VYUE9SVFNfXyIsImltcG9ydF92YWx5cmlhbiIsInJlcXVpcmUiLCJpbXBvcnRfdXRpbHMiLCJlZmZlY3RTdGFjayIsInJlZ2lzdGVyRG9tU3Vic2NyaXB0aW9uIiwic3Vic2NyaWJlcnMiLCJkb21XaXRoVm5vZGVzVG9VcGRhdGUiLCJjdXJyZW50Vm5vZGUiLCJjdXJyZW50Iiwidm5vZGUiLCJoYXMiLCJkb20iLCJoYXNQYXJlbnQiLCJwYXJlbnQiLCJwYXJlbnRFbGVtZW50Iiwic3Vic2NyaXB0aW9uIiwidXBkYXRlVm5vZGUiLCJkZWxldGUiLCJhZGQiLCJjcmVhdGVTdG9yZSIsImluaXRpYWxTdGF0ZSIsInB1bHNlcyIsImltbXV0YWJsZSIsIlNldCIsIldlYWtTZXQiLCJib3VuZFB1bHNlcyIsImtleSIsIkVycm9yIiwiZ2V0UHVsc2VNZXRob2QiLCJsb2NhbFN0YXRlIiwiaXNNdXRhYmxlIiwiY3VycmVudFN0YXRlIiwicHVsc2VDYWxsQ291bnQiLCJwcm94eVN0YXRlIiwiUHJveHkiLCJnZXQiLCJzdGF0ZSIsInByb3AiLCJjdXJyZW50RWZmZWN0IiwibGVuZ3RoIiwic2V0IiwidmFsdWUiLCJSZWZsZWN0IiwiZGVsZXRlUHJvcGVydHkiLCJzeW5jU3RhdGUiLCJuZXdTdGF0ZSIsImRlZXBGcmVlemUiLCJkZWJvdW5jZVRpbWVvdXQiLCJzZXRTdGF0ZSIsImZsdXNoIiwiaGFzQ2hhbmdlZCIsImNsZWFyVGltZW91dCIsInNldFRpbWVvdXQiLCJmb3JFYWNoIiwic3Vic2NyaWJlciIsImFyZ3MiLCJkZWVwQ2xvbmVVbmZyZWV6ZSIsInRoaXMiLCJhc3luYyIsIlByb21pc2UiLCJyZXNvbHZlIiwiZW1wdHlGbHVzaCIsInB1bHNlUmVzdWx0IiwiYXBwbHkiLCJ0aGVuIiwicmVzb2x2ZWRWYWx1ZSIsImNhdGNoIiwiZXJyb3IiLCJjb25zb2xlIiwicHVsc2VzUHJveHkiLCJwdWxzZU1ldGhvZCIsImJpbmQiLCJ3YXJuIiwiZWZmZWN0IiwicnVuRWZmZWN0IiwicHVzaCIsInBvcCIsImluaXRpYWxWYWx1ZSIsInJ1blN1YnNjcmliZXJzIiwibmV3VmFsdWUiXSwic291cmNlcyI6WyIuLi8uLi9saWIvcHVsc2VzL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbmltcG9ydCB7IHVwZGF0ZVZub2RlLCBWbm9kZVdpdGhEb20sIGN1cnJlbnQsIERvbUVsZW1lbnQgfSBmcm9tIFwidmFseXJpYW4uanNcIjtcbmltcG9ydCB7IGRlZXBDbG9uZVVuZnJlZXplLCBkZWVwRnJlZXplLCBoYXNDaGFuZ2VkIH0gZnJvbSBcInZhbHlyaWFuLmpzL3V0aWxzXCI7XG5cbnR5cGUgU3RhdGUgPSBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuXG5leHBvcnQgdHlwZSBQdWxzZTxTdGF0ZVR5cGUsIFRSZXR1cm4gPSB1bmtub3duPiA9IChzdGF0ZTogU3RhdGVUeXBlLCAuLi5hcmdzOiBhbnlbXSkgPT4gVFJldHVybiB8IFByb21pc2U8VFJldHVybj47XG5cbmV4cG9ydCB0eXBlIFB1bHNlczxTdGF0ZVR5cGU+ID0gUmVjb3JkPHN0cmluZywgUHVsc2U8U3RhdGVUeXBlLCBhbnk+ICYgeyAkZmx1c2g/OiAoKSA9PiBQcm9taXNlPHZvaWQ+IH0+O1xuXG50eXBlIFByb3h5U3RhdGU8U3RhdGVUeXBlPiA9IFN0YXRlVHlwZSAmIHsgW2tleTogc3RyaW5nXTogYW55IH07XG5cbmNvbnN0IGVmZmVjdFN0YWNrOiBGdW5jdGlvbltdID0gW107XG5cbnR5cGUgU3RvcmVQdWxzZXM8UHVsc2VzVHlwZSBleHRlbmRzIFB1bHNlczxhbnk+PiA9IHtcbiAgW0sgaW4ga2V5b2YgUHVsc2VzVHlwZV06IFB1bHNlc1R5cGVbS10gZXh0ZW5kcyAoc3RhdGU6IGFueSwgLi4uYXJnczogaW5mZXIgQXJncykgPT4gaW5mZXIgUlxuICAgID8gKC4uLmFyZ3M6IEFyZ3MpID0+IFJcbiAgICA6IG5ldmVyO1xufTtcblxuLyoqIEZ1bmNpw7NuIGF1eGlsaWFyIHBhcmEgcmVnaXN0cmFyIGxhIHN1c2NyaXBjacOzbiBhbCBub2RvIERPTS5cbiAqICBSZXRvcm5hIHRydWUgc2kgc2UgYWdyZWfDsyBsYSBzdXNjcmlwY2nDs24sIG8gZmFsc2Ugc2kgc2UgZW5jb250csOzIHVuIG5vZG8gcGFkcmUgeWEgc3VzY3JpdG8uXG4gKi9cbmZ1bmN0aW9uIHJlZ2lzdGVyRG9tU3Vic2NyaXB0aW9uKHN1YnNjcmliZXJzOiBTZXQ8RnVuY3Rpb24+LCBkb21XaXRoVm5vZGVzVG9VcGRhdGU6IFdlYWtTZXQ8RG9tRWxlbWVudD4pOiB2b2lkIHtcbiAgY29uc3QgY3VycmVudFZub2RlID0gY3VycmVudC52bm9kZSBhcyBWbm9kZVdpdGhEb207XG4gIGlmICghY3VycmVudFZub2RlIHx8IGRvbVdpdGhWbm9kZXNUb1VwZGF0ZS5oYXMoY3VycmVudFZub2RlLmRvbSkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgaGFzUGFyZW50ID0gZmFsc2U7XG4gIGxldCBwYXJlbnQgPSBjdXJyZW50Vm5vZGUuZG9tLnBhcmVudEVsZW1lbnQgYXMgRG9tRWxlbWVudDtcbiAgd2hpbGUgKHBhcmVudCkge1xuICAgIGlmIChkb21XaXRoVm5vZGVzVG9VcGRhdGUuaGFzKHBhcmVudCkpIHtcbiAgICAgIGhhc1BhcmVudCA9IHRydWU7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgcGFyZW50ID0gcGFyZW50LnBhcmVudEVsZW1lbnQgYXMgRG9tRWxlbWVudDtcbiAgfVxuXG4gIC8vIFNpIG5vIGhheSBub2RvIHBhZHJlIHJlZ2lzdHJhZG8sIHNlIGNyZWEgbGEgc3VzY3JpcGNpw7NuLlxuICBpZiAoIWhhc1BhcmVudCkge1xuICAgIGNvbnN0IGRvbSA9IGN1cnJlbnRWbm9kZS5kb207XG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gKCkgPT4ge1xuICAgICAgdXBkYXRlVm5vZGUoZG9tLnZub2RlKTtcbiAgICAgIGlmICghZG9tLnBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgc3Vic2NyaWJlcnMuZGVsZXRlKHN1YnNjcmlwdGlvbik7XG4gICAgICAgIGRvbVdpdGhWbm9kZXNUb1VwZGF0ZS5kZWxldGUoZG9tKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHN1YnNjcmliZXJzLmFkZChzdWJzY3JpcHRpb24pO1xuICAgIGRvbVdpdGhWbm9kZXNUb1VwZGF0ZS5hZGQoZG9tKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVTdG9yZTxTdGF0ZVR5cGUgZXh0ZW5kcyBTdGF0ZSwgUHVsc2VzVHlwZSBleHRlbmRzIFB1bHNlczxTdGF0ZVR5cGU+PihcbiAgaW5pdGlhbFN0YXRlOiBTdGF0ZVR5cGUgfCAoKCkgPT4gU3RhdGVUeXBlKSB8IG51bGwsXG4gIHB1bHNlczogUHVsc2VzVHlwZSxcbiAgaW1tdXRhYmxlID0gZmFsc2Vcbik6IFN0b3JlUHVsc2VzPFB1bHNlc1R5cGU+ICYgeyBzdGF0ZTogUHJveHlTdGF0ZTxTdGF0ZVR5cGU+IH0ge1xuICBjb25zdCBzdWJzY3JpYmVycyA9IG5ldyBTZXQ8RnVuY3Rpb24+KCk7XG4gIGNvbnN0IGRvbVdpdGhWbm9kZXNUb1VwZGF0ZSA9IG5ldyBXZWFrU2V0PERvbUVsZW1lbnQ+KCk7XG5cbiAgY29uc3QgYm91bmRQdWxzZXM6IFB1bHNlczxTdGF0ZVR5cGU+ID0ge307XG4gIGZvciAoY29uc3Qga2V5IGluIHB1bHNlcykge1xuICAgIGlmICh0eXBlb2YgcHVsc2VzW2tleV0gIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQdWxzZSAnJHtrZXl9JyBtdXN0IGJlIGEgZnVuY3Rpb25gKTtcbiAgICB9XG4gICAgaWYgKGtleSA9PT0gXCJzdGF0ZVwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEEgcHVsc2UgY2Fubm90IGJlIG5hbWVkICdzdGF0ZSdgKTtcbiAgICB9XG4gICAgYm91bmRQdWxzZXNba2V5XSA9IGdldFB1bHNlTWV0aG9kKGtleSk7XG4gIH1cblxuICBjb25zdCBsb2NhbFN0YXRlOiBTdGF0ZVR5cGUgPVxuICAgICh0eXBlb2YgaW5pdGlhbFN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyBpbml0aWFsU3RhdGUoKSA6IGluaXRpYWxTdGF0ZSkgfHwgKHt9IGFzIFN0YXRlVHlwZSk7XG5cbiAgZnVuY3Rpb24gaXNNdXRhYmxlKCkge1xuICAgIGlmIChpbW11dGFibGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIllvdSBuZWVkIHRvIGNhbGwgYSBwdWxzZSB0byBtb2RpZnkgdGhlIHN0YXRlXCIpO1xuICAgIH1cbiAgfVxuXG4gIGxldCBjdXJyZW50U3RhdGU6IFN0YXRlVHlwZSB8IG51bGwgPSBudWxsO1xuICBsZXQgcHVsc2VDYWxsQ291bnQgPSAwO1xuXG4gIGNvbnN0IHByb3h5U3RhdGUgPSBuZXcgUHJveHkobG9jYWxTdGF0ZSwge1xuICAgIGdldDogKHN0YXRlLCBwcm9wOiBzdHJpbmcpID0+IHtcbiAgICAgIC8vIElmIHdlIGFyZSBpbiBhIHB1bHNlLCB3ZSByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBjbG9uZWQgc3RhdGUuXG4gICAgICBpZiAoY3VycmVudFN0YXRlKSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50U3RhdGVbcHJvcF07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGN1cnJlbnRFZmZlY3QgPSBlZmZlY3RTdGFja1tlZmZlY3RTdGFjay5sZW5ndGggLSAxXTtcbiAgICAgIGlmIChjdXJyZW50RWZmZWN0ICYmICFzdWJzY3JpYmVycy5oYXMoY3VycmVudEVmZmVjdCkpIHtcbiAgICAgICAgc3Vic2NyaWJlcnMuYWRkKGN1cnJlbnRFZmZlY3QpO1xuICAgICAgfVxuXG4gICAgICByZWdpc3RlckRvbVN1YnNjcmlwdGlvbihzdWJzY3JpYmVycywgZG9tV2l0aFZub2Rlc1RvVXBkYXRlKTtcblxuICAgICAgcmV0dXJuIHN0YXRlW3Byb3BdO1xuICAgIH0sXG4gICAgc2V0OiAoc3RhdGUsIHByb3A6IHN0cmluZywgdmFsdWU6IGFueSkgPT4ge1xuICAgICAgaXNNdXRhYmxlKCk7XG4gICAgICBSZWZsZWN0LnNldChzdGF0ZSwgcHJvcCwgdmFsdWUpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICBkZWxldGVQcm9wZXJ0eTogKHN0YXRlLCBwcm9wOiBzdHJpbmcpID0+IHtcbiAgICAgIGlzTXV0YWJsZSgpO1xuICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShzdGF0ZSwgcHJvcCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIHN5bmNTdGF0ZShuZXdTdGF0ZTogU3RhdGVUeXBlKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gbmV3U3RhdGUpIHtcbiAgICAgIGxvY2FsU3RhdGVba2V5XSA9IGltbXV0YWJsZSA/IGRlZXBGcmVlemUobmV3U3RhdGVba2V5XSkgOiBuZXdTdGF0ZVtrZXldO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBsb2NhbFN0YXRlKSB7XG4gICAgICBpZiAoIShrZXkgaW4gbmV3U3RhdGUpKSB7XG4gICAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkobG9jYWxTdGF0ZSwga2V5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBsZXQgZGVib3VuY2VUaW1lb3V0OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICBmdW5jdGlvbiBkZWJvdW5jZWRVcGRhdGUoKSB7XG4gICAgaWYgKGRlYm91bmNlVGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KGRlYm91bmNlVGltZW91dCk7XG4gICAgfVxuICAgIGRlYm91bmNlVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gc3Vic2NyaWJlcnMuZm9yRWFjaCgoc3Vic2NyaWJlcikgPT4gc3Vic2NyaWJlcigpKSwgMCk7XG4gIH1cblxuICBmdW5jdGlvbiBzZXRTdGF0ZShuZXdTdGF0ZTogU3RhdGVUeXBlLCBmbHVzaCA9IGZhbHNlKSB7XG4gICAgcHVsc2VDYWxsQ291bnQtLTtcbiAgICBpZiAoIWhhc0NoYW5nZWQobG9jYWxTdGF0ZSwgbmV3U3RhdGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChwdWxzZUNhbGxDb3VudCA+IDAgJiYgIWZsdXNoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN5bmNTdGF0ZShuZXdTdGF0ZSk7XG4gICAgY3VycmVudFN0YXRlID0gbnVsbDtcbiAgICBkZWJvdW5jZWRVcGRhdGUoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFB1bHNlTWV0aG9kKGtleTogc3RyaW5nKSB7XG4gICAgZnVuY3Rpb24gcHVsc2VNZXRob2QodGhpczogUHVsc2U8U3RhdGVUeXBlLCBhbnk+ICYgeyAkZmx1c2g6ICgpID0+IFByb21pc2U8dm9pZD4gfSwgLi4uYXJnczogYW55W10pIHtcbiAgICAgIHB1bHNlQ2FsbENvdW50Kys7XG4gICAgICBpZiAoY3VycmVudFN0YXRlID09PSBudWxsKSB7XG4gICAgICAgIGN1cnJlbnRTdGF0ZSA9IGRlZXBDbG9uZVVuZnJlZXplKGxvY2FsU3RhdGUpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCAkZmx1c2ggPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIHNldFN0YXRlKGN1cnJlbnRTdGF0ZSBhcyBTdGF0ZVR5cGUsIHRydWUpO1xuICAgICAgICBjdXJyZW50U3RhdGUgPSBkZWVwQ2xvbmVVbmZyZWV6ZShsb2NhbFN0YXRlKTtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMCkpO1xuICAgICAgfTtcblxuICAgICAgUmVmbGVjdC5zZXQodGhpcywgXCIkZmx1c2hcIiwgJGZsdXNoKTtcbiAgICAgIGNvbnN0IGVtcHR5Rmx1c2ggPSBhc3luYyAoKSA9PiB7fTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcHVsc2VSZXN1bHQgPSBwdWxzZXNba2V5XS5hcHBseSh0aGlzLCBbY3VycmVudFN0YXRlLCAuLi5hcmdzXSk7XG4gICAgICAgIGlmIChwdWxzZVJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICByZXR1cm4gcHVsc2VSZXN1bHRcbiAgICAgICAgICAgIC50aGVuKChyZXNvbHZlZFZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgIHNldFN0YXRlKGN1cnJlbnRTdGF0ZSBhcyBTdGF0ZVR5cGUpO1xuICAgICAgICAgICAgICBSZWZsZWN0LnNldCh0aGlzLCBcIiRmbHVzaFwiLCBlbXB0eUZsdXNoKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVkVmFsdWU7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciBpbiBwdWxzZSAnJHtrZXl9JzpgLCBlcnJvcik7XG4gICAgICAgICAgICAgIFJlZmxlY3Quc2V0KHRoaXMsIFwiJGZsdXNoXCIsIGVtcHR5Rmx1c2gpO1xuICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldFN0YXRlKGN1cnJlbnRTdGF0ZSk7XG4gICAgICAgICAgUmVmbGVjdC5zZXQodGhpcywgXCIkZmx1c2hcIiwgZW1wdHlGbHVzaCk7XG4gICAgICAgICAgcmV0dXJuIHB1bHNlUmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciBpbiBwdWxzZSAnJHtrZXl9JzpgLCBlcnJvcik7XG4gICAgICAgIFJlZmxlY3Quc2V0KHRoaXMsIFwiJGZsdXNoXCIsIGVtcHR5Rmx1c2gpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcHVsc2VNZXRob2Q7XG4gIH1cblxuICBzeW5jU3RhdGUobG9jYWxTdGF0ZSk7XG5cbiAgY29uc3QgcHVsc2VzUHJveHkgPSBuZXcgUHJveHkoYm91bmRQdWxzZXMsIHtcbiAgICBnZXQ6IChwdWxzZXMsIHByb3A6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKHByb3AgPT09IFwic3RhdGVcIikge1xuICAgICAgICByZXR1cm4gcHJveHlTdGF0ZTtcbiAgICAgIH1cbiAgICAgIGlmICghKHByb3AgaW4gcHVsc2VzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFB1bHNlICcke3Byb3B9JyBkb2VzIG5vdCBleGlzdGApO1xuICAgICAgfVxuICAgICAgY29uc3QgcHVsc2VNZXRob2QgPSBwdWxzZXNbcHJvcF07XG5cbiAgICAgIGlmICh0eXBlb2YgcHVsc2VNZXRob2QgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gcHVsc2VNZXRob2QuYmluZChwdWxzZXNQcm94eSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwdWxzZU1ldGhvZDtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBwdWxzZXNQcm94eSBhcyBTdG9yZVB1bHNlczxQdWxzZXNUeXBlPiAmIHsgc3RhdGU6IFByb3h5U3RhdGU8U3RhdGVUeXBlPiB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUHVsc2VTdG9yZTxTdGF0ZVR5cGUgZXh0ZW5kcyBTdGF0ZSwgUHVsc2VzVHlwZSBleHRlbmRzIFB1bHNlczxTdGF0ZVR5cGU+PihcbiAgaW5pdGlhbFN0YXRlOiBTdGF0ZVR5cGUsXG4gIHB1bHNlczogUHVsc2VzVHlwZVxuKTogU3RvcmVQdWxzZXM8UHVsc2VzVHlwZT4gJiB7IHN0YXRlOiBQcm94eVN0YXRlPFN0YXRlVHlwZT4gfSB7XG4gIHJldHVybiBjcmVhdGVTdG9yZShpbml0aWFsU3RhdGUsIHB1bHNlcywgdHJ1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNdXRhYmxlU3RvcmU8U3RhdGVUeXBlIGV4dGVuZHMgU3RhdGUsIFB1bHNlc1R5cGUgZXh0ZW5kcyBQdWxzZXM8U3RhdGVUeXBlPj4oXG4gIGluaXRpYWxTdGF0ZTogU3RhdGVUeXBlLFxuICBwdWxzZXM6IFB1bHNlc1R5cGVcbik6IFN0b3JlUHVsc2VzPFB1bHNlc1R5cGU+ICYgeyBzdGF0ZTogUHJveHlTdGF0ZTxTdGF0ZVR5cGU+IH0ge1xuICBjb25zb2xlLndhcm4oXG4gICAgXCJXYXJuaW5nOiBZb3UgYXJlIHdvcmtpbmcgd2l0aCBhIG11dGFibGUgc3RhdGUuIFRoaXMgY2FuIGxlYWQgdG8gdW5wcmVkaWN0YWJsZSBiZWhhdmlvci4gQWxsIHN0YXRlIGNoYW5nZXMgbWFkZSBvdXRzaWRlIG9mIGEgcHVsc2Ugd2lsbCBub3QgdHJpZ2dlciBhIHJlLXJlbmRlci5cIlxuICApO1xuICByZXR1cm4gY3JlYXRlU3RvcmUoaW5pdGlhbFN0YXRlLCBwdWxzZXMsIGZhbHNlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVmZmVjdChlZmZlY3Q6IEZ1bmN0aW9uKSB7XG4gIGNvbnN0IHJ1bkVmZmVjdCA9ICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgZWZmZWN0U3RhY2sucHVzaChydW5FZmZlY3QpO1xuICAgICAgZWZmZWN0KCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGVmZmVjdFN0YWNrLnBvcCgpO1xuICAgIH1cbiAgfTtcbiAgcnVuRWZmZWN0KCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQdWxzZTxUPihpbml0aWFsVmFsdWU6IFQpOiBbKCkgPT4gVCwgKG5ld1ZhbHVlOiBUIHwgKChjdXJyZW50OiBUKSA9PiBUKSkgPT4gdm9pZCwgKCkgPT4gdm9pZF0ge1xuICBsZXQgdmFsdWUgPSBpbml0aWFsVmFsdWU7XG4gIGNvbnN0IHN1YnNjcmliZXJzID0gbmV3IFNldDxGdW5jdGlvbj4oKTtcbiAgY29uc3QgZG9tV2l0aFZub2Rlc1RvVXBkYXRlID0gbmV3IFdlYWtTZXQ8RG9tRWxlbWVudD4oKTtcblxuICBjb25zdCBydW5TdWJzY3JpYmVycyA9ICgpID0+IHtcbiAgICBzdWJzY3JpYmVycy5mb3JFYWNoKChzdWJzY3JpYmVyKSA9PiBzdWJzY3JpYmVyKCkpO1xuICB9O1xuXG4gIGNvbnN0IHJlYWQgPSAoKTogVCA9PiB7XG4gICAgY29uc3QgY3VycmVudEVmZmVjdCA9IGVmZmVjdFN0YWNrW2VmZmVjdFN0YWNrLmxlbmd0aCAtIDFdO1xuICAgIGlmIChjdXJyZW50RWZmZWN0ICYmICFzdWJzY3JpYmVycy5oYXMoY3VycmVudEVmZmVjdCkpIHtcbiAgICAgIHN1YnNjcmliZXJzLmFkZChjdXJyZW50RWZmZWN0KTtcbiAgICB9XG4gICAgcmVnaXN0ZXJEb21TdWJzY3JpcHRpb24oc3Vic2NyaWJlcnMsIGRvbVdpdGhWbm9kZXNUb1VwZGF0ZSk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9O1xuXG4gIGNvbnN0IHdyaXRlID0gKG5ld1ZhbHVlOiBUIHwgKChjdXJyZW50OiBUKSA9PiBUKSk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHJlc29sdmVkVmFsdWUgPSB0eXBlb2YgbmV3VmFsdWUgPT09IFwiZnVuY3Rpb25cIiA/IChuZXdWYWx1ZSBhcyAoY3VycmVudDogVCkgPT4gVCkodmFsdWUpIDogbmV3VmFsdWU7XG4gICAgaWYgKCFoYXNDaGFuZ2VkKHZhbHVlLCByZXNvbHZlZFZhbHVlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YWx1ZSA9IHJlc29sdmVkVmFsdWU7XG4gICAgcnVuU3Vic2NyaWJlcnMoKTtcbiAgfTtcblxuICByZXR1cm4gW3JlYWQsIHdyaXRlLCBydW5TdWJzY3JpYmVyc107XG59XG4iXSwibWFwcGluZ3MiOiJnSkFBQUEsRUFBQSxHLHlEQUFBQyxDQUFBRCxFQUFBLENBQUFFLGFBQUEsSUFBQUEsRUFBQUMsbUJBQUEsSUFBQUEsRUFBQUMsWUFBQSxJQUFBQSxFQUFBQyxpQkFBQSxJQUFBQSxJQUFBLEksRUFBQUMsRyxFQUFBTixFLDBNQUNBTyxFQUErREMsUUFBQSxlQUMvREMsRUFB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
1
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJpbmRleF9leHBvcnRzIiwiX19leHBvcnQiLCJjcmVhdGVFZmZlY3QiLCJjcmVhdGVNdXRhYmxlU3RvcmUiLCJjcmVhdGVQdWxzZSIsImNyZWF0ZVB1bHNlU3RvcmUiLCJfX0VYUE9SVFNfXyIsImltcG9ydF92YWx5cmlhbiIsInJlcXVpcmUiLCJpbXBvcnRfdXRpbHMiLCJlZmZlY3RTdGFjayIsInJlZ2lzdGVyRG9tU3Vic2NyaXB0aW9uIiwic3Vic2NyaWJlcnMiLCJkb21XaXRoVm5vZGVzVG9VcGRhdGUiLCJjdXJyZW50Vm5vZGUiLCJjdXJyZW50Iiwidm5vZGUiLCJoYXMiLCJkb20iLCJoYXNQYXJlbnQiLCJwYXJlbnQiLCJwYXJlbnRFbGVtZW50Iiwic3Vic2NyaXB0aW9uIiwidXBkYXRlVm5vZGUiLCJkZWxldGUiLCJhZGQiLCJjcmVhdGVTdG9yZSIsImluaXRpYWxTdGF0ZSIsInB1bHNlcyIsImltbXV0YWJsZSIsIlNldCIsIldlYWtTZXQiLCJib3VuZFB1bHNlcyIsImtleSIsIkVycm9yIiwiZ2V0UHVsc2VNZXRob2QiLCJsb2NhbFN0YXRlIiwiaXNNdXRhYmxlIiwiY3VycmVudFN0YXRlIiwicHVsc2VDYWxsQ291bnQiLCJwcm94eVN0YXRlIiwiUHJveHkiLCJnZXQiLCJzdGF0ZSIsInByb3AiLCJjdXJyZW50RWZmZWN0IiwibGVuZ3RoIiwic2V0IiwidmFsdWUiLCJSZWZsZWN0IiwiZGVsZXRlUHJvcGVydHkiLCJzeW5jU3RhdGUiLCJuZXdTdGF0ZSIsImRlZXBGcmVlemUiLCJkZWJvdW5jZVRpbWVvdXQiLCJzZXRTdGF0ZSIsImZsdXNoIiwiaGFzQ2hhbmdlZCIsImNsZWFyVGltZW91dCIsInNldFRpbWVvdXQiLCJmb3JFYWNoIiwic3Vic2NyaWJlciIsImFyZ3MiLCJkZWVwQ2xvbmVVbmZyZWV6ZSIsInRoaXMiLCJhc3luYyIsIlByb21pc2UiLCJyZXNvbHZlIiwiZW1wdHlGbHVzaCIsInB1bHNlUmVzdWx0IiwiYXBwbHkiLCJ0aGVuIiwicmVzb2x2ZWRWYWx1ZSIsImNhdGNoIiwiZXJyb3IiLCJjb25zb2xlIiwibGlzdGVuZXJzIiwidHJpZ2dlciIsImV2ZW50IiwiY2FsbGJhY2siLCJwdWxzZXNQcm94eSIsInB1c2giLCJmaWx0ZXIiLCJjYiIsInB1bHNlTWV0aG9kIiwicmVzdWx0IiwiciIsIndhcm4iLCJlZmZlY3QiLCJydW5FZmZlY3QiLCJwb3AiLCJpbml0aWFsVmFsdWUiLCJydW5TdWJzY3JpYmVycyIsIm5ld1ZhbHVlIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL3B1bHNlcy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG5pbXBvcnQgeyB1cGRhdGVWbm9kZSwgVm5vZGVXaXRoRG9tLCBjdXJyZW50LCBEb21FbGVtZW50IH0gZnJvbSBcInZhbHlyaWFuLmpzXCI7XG5pbXBvcnQgeyBkZWVwQ2xvbmVVbmZyZWV6ZSwgZGVlcEZyZWV6ZSwgaGFzQ2hhbmdlZCB9IGZyb20gXCJ2YWx5cmlhbi5qcy91dGlsc1wiO1xuXG50eXBlIFN0YXRlID0gUmVjb3JkPHN0cmluZywgYW55PjtcblxuZXhwb3J0IHR5cGUgUHVsc2U8U3RhdGVUeXBlLCBUUmV0dXJuID0gdW5rbm93bj4gPSAoc3RhdGU6IFN0YXRlVHlwZSwgLi4uYXJnczogYW55W10pID0+IFRSZXR1cm4gfCBQcm9taXNlPFRSZXR1cm4+O1xuXG5leHBvcnQgdHlwZSBQdWxzZXM8U3RhdGVUeXBlPiA9IFJlY29yZDxzdHJpbmcsIFB1bHNlPFN0YXRlVHlwZSwgYW55PiAmIHsgJGZsdXNoPzogKCkgPT4gUHJvbWlzZTx2b2lkPiB9PjtcblxudHlwZSBQcm94eVN0YXRlPFN0YXRlVHlwZT4gPSBTdGF0ZVR5cGUgJiB7IFtrZXk6IHN0cmluZ106IGFueSB9O1xuXG5jb25zdCBlZmZlY3RTdGFjazogRnVuY3Rpb25bXSA9IFtdO1xuXG50eXBlIFN0b3JlUHVsc2VzPFB1bHNlc1R5cGUgZXh0ZW5kcyBQdWxzZXM8YW55Pj4gPSB7XG4gIFtLIGluIGtleW9mIFB1bHNlc1R5cGVdOiBQdWxzZXNUeXBlW0tdIGV4dGVuZHMgKHN0YXRlOiBhbnksIC4uLmFyZ3M6IGluZmVyIEFyZ3MpID0+IGluZmVyIFJcbiAgICA/ICguLi5hcmdzOiBBcmdzKSA9PiBSXG4gICAgOiBuZXZlcjtcbn07XG5cbi8qKiBGdW5jacOzbiBhdXhpbGlhciBwYXJhIHJlZ2lzdHJhciBsYSBzdXNjcmlwY2nDs24gYWwgbm9kbyBET00uXG4gKiAgUmV0b3JuYSB0cnVlIHNpIHNlIGFncmVnw7MgbGEgc3VzY3JpcGNpw7NuLCBvIGZhbHNlIHNpIHNlIGVuY29udHLDsyB1biBub2RvIHBhZHJlIHlhIHN1c2NyaXRvLlxuICovXG5mdW5jdGlvbiByZWdpc3RlckRvbVN1YnNjcmlwdGlvbihzdWJzY3JpYmVyczogU2V0PEZ1bmN0aW9uPiwgZG9tV2l0aFZub2Rlc1RvVXBkYXRlOiBXZWFrU2V0PERvbUVsZW1lbnQ+KTogdm9pZCB7XG4gIGNvbnN0IGN1cnJlbnRWbm9kZSA9IGN1cnJlbnQudm5vZGUgYXMgVm5vZGVXaXRoRG9tO1xuICBpZiAoIWN1cnJlbnRWbm9kZSB8fCBkb21XaXRoVm5vZGVzVG9VcGRhdGUuaGFzKGN1cnJlbnRWbm9kZS5kb20pKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IGhhc1BhcmVudCA9IGZhbHNlO1xuICBsZXQgcGFyZW50ID0gY3VycmVudFZub2RlLmRvbS5wYXJlbnRFbGVtZW50IGFzIERvbUVsZW1lbnQ7XG4gIHdoaWxlIChwYXJlbnQpIHtcbiAgICBpZiAoZG9tV2l0aFZub2Rlc1RvVXBkYXRlLmhhcyhwYXJlbnQpKSB7XG4gICAgICBoYXNQYXJlbnQgPSB0cnVlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnRFbGVtZW50IGFzIERvbUVsZW1lbnQ7XG4gIH1cblxuICAvLyBTaSBubyBoYXkgbm9kbyBwYWRyZSByZWdpc3RyYWRvLCBzZSBjcmVhIGxhIHN1c2NyaXBjacOzbi5cbiAgaWYgKCFoYXNQYXJlbnQpIHtcbiAgICBjb25zdCBkb20gPSBjdXJyZW50Vm5vZGUuZG9tO1xuICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9ICgpID0+IHtcbiAgICAgIHVwZGF0ZVZub2RlKGRvbS52bm9kZSk7XG4gICAgICBpZiAoIWRvbS5wYXJlbnRFbGVtZW50KSB7XG4gICAgICAgIHN1YnNjcmliZXJzLmRlbGV0ZShzdWJzY3JpcHRpb24pO1xuICAgICAgICBkb21XaXRoVm5vZGVzVG9VcGRhdGUuZGVsZXRlKGRvbSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBzdWJzY3JpYmVycy5hZGQoc3Vic2NyaXB0aW9uKTtcbiAgICBkb21XaXRoVm5vZGVzVG9VcGRhdGUuYWRkKGRvbSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlU3RvcmU8U3RhdGVUeXBlIGV4dGVuZHMgU3RhdGUsIFB1bHNlc1R5cGUgZXh0ZW5kcyBQdWxzZXM8U3RhdGVUeXBlPj4oXG4gIGluaXRpYWxTdGF0ZTogU3RhdGVUeXBlIHwgKCgpID0+IFN0YXRlVHlwZSkgfCBudWxsLFxuICBwdWxzZXM6IFB1bHNlc1R5cGUsXG4gIGltbXV0YWJsZSA9IGZhbHNlXG4pOiBTdG9yZVB1bHNlczxQdWxzZXNUeXBlPiAmIHtcbiAgc3RhdGU6IFByb3h5U3RhdGU8U3RhdGVUeXBlPjtcbiAgb246IChldmVudDogc3RyaW5nLCBjYWxsYmFjazogRnVuY3Rpb24pID0+IHZvaWQ7XG4gIG9mZjogKGV2ZW50OiBzdHJpbmcsIGNhbGxiYWNrOiBGdW5jdGlvbikgPT4gdm9pZDtcbn0ge1xuICBjb25zdCBzdWJzY3JpYmVycyA9IG5ldyBTZXQ8RnVuY3Rpb24+KCk7XG4gIGNvbnN0IGRvbVdpdGhWbm9kZXNUb1VwZGF0ZSA9IG5ldyBXZWFrU2V0PERvbUVsZW1lbnQ+KCk7XG5cbiAgY29uc3QgYm91bmRQdWxzZXM6IFB1bHNlczxTdGF0ZVR5cGU+ID0ge307XG4gIGZvciAoY29uc3Qga2V5IGluIHB1bHNlcykge1xuICAgIGlmICh0eXBlb2YgcHVsc2VzW2tleV0gIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQdWxzZSAnJHtrZXl9JyBtdXN0IGJlIGEgZnVuY3Rpb25gKTtcbiAgICB9XG4gICAgaWYgKGtleSA9PT0gXCJzdGF0ZVwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEEgcHVsc2UgY2Fubm90IGJlIG5hbWVkICdzdGF0ZSdgKTtcbiAgICB9XG4gICAgYm91bmRQdWxzZXNba2V5XSA9IGdldFB1bHNlTWV0aG9kKGtleSk7XG4gIH1cblxuICBjb25zdCBsb2NhbFN0YXRlOiBTdGF0ZVR5cGUgPVxuICAgICh0eXBlb2YgaW5pdGlhbFN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyBpbml0aWFsU3RhdGUoKSA6IGluaXRpYWxTdGF0ZSkgfHwgKHt9IGFzIFN0YXRlVHlwZSk7XG5cbiAgZnVuY3Rpb24gaXNNdXRhYmxlKCkge1xuICAgIGlmIChpbW11dGFibGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIllvdSBuZWVkIHRvIGNhbGwgYSBwdWxzZSB0byBtb2RpZnkgdGhlIHN0YXRlXCIpO1xuICAgIH1cbiAgfVxuXG4gIGxldCBjdXJyZW50U3RhdGU6IFN0YXRlVHlwZSB8IG51bGwgPSBudWxsO1xuICBsZXQgcHVsc2VDYWxsQ291bnQgPSAwO1xuXG4gIGNvbnN0IHByb3h5U3RhdGUgPSBuZXcgUHJveHkobG9jYWxTdGF0ZSwge1xuICAgIGdldDogKHN0YXRlLCBwcm9wOiBzdHJpbmcpID0+IHtcbiAgICAgIC8vIElmIHdlIGFyZSBpbiBhIHB1bHNlLCB3ZSByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBjbG9uZWQgc3RhdGUuXG4gICAgICBpZiAoY3VycmVudFN0YXRlKSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50U3RhdGVbcHJvcF07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGN1cnJlbnRFZmZlY3QgPSBlZmZlY3RTdGFja1tlZmZlY3RTdGFjay5sZW5ndGggLSAxXTtcbiAgICAgIGlmIChjdXJyZW50RWZmZWN0ICYmICFzdWJzY3JpYmVycy5oYXMoY3VycmVudEVmZmVjdCkpIHtcbiAgICAgICAgc3Vic2NyaWJlcnMuYWRkKGN1cnJlbnRFZmZlY3QpO1xuICAgICAgfVxuXG4gICAgICByZWdpc3RlckRvbVN1YnNjcmlwdGlvbihzdWJzY3JpYmVycywgZG9tV2l0aFZub2Rlc1RvVXBkYXRlKTtcblxuICAgICAgcmV0dXJuIHN0YXRlW3Byb3BdO1xuICAgIH0sXG4gICAgc2V0OiAoc3RhdGUsIHByb3A6IHN0cmluZywgdmFsdWU6IGFueSkgPT4ge1xuICAgICAgaXNNdXRhYmxlKCk7XG4gICAgICBSZWZsZWN0LnNldChzdGF0ZSwgcHJvcCwgdmFsdWUpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICBkZWxldGVQcm9wZXJ0eTogKHN0YXRlLCBwcm9wOiBzdHJpbmcpID0+IHtcbiAgICAgIGlzTXV0YWJsZSgpO1xuICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShzdGF0ZSwgcHJvcCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIHN5bmNTdGF0ZShuZXdTdGF0ZTogU3RhdGVUeXBlKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gbmV3U3RhdGUpIHtcbiAgICAgIGxvY2FsU3RhdGVba2V5XSA9IGltbXV0YWJsZSA/IGRlZXBGcmVlemUobmV3U3RhdGVba2V5XSkgOiBuZXdTdGF0ZVtrZXldO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBsb2NhbFN0YXRlKSB7XG4gICAgICBpZiAoIShrZXkgaW4gbmV3U3RhdGUpKSB7XG4gICAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkobG9jYWxTdGF0ZSwga2V5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBsZXQgZGVib3VuY2VUaW1lb3V0OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICBmdW5jdGlvbiBkZWJvdW5jZWRVcGRhdGUoKSB7XG4gICAgaWYgKGRlYm91bmNlVGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KGRlYm91bmNlVGltZW91dCk7XG4gICAgfVxuICAgIGRlYm91bmNlVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gc3Vic2NyaWJlcnMuZm9yRWFjaCgoc3Vic2NyaWJlcikgPT4gc3Vic2NyaWJlcigpKSwgMCk7XG4gIH1cblxuICBmdW5jdGlvbiBzZXRTdGF0ZShuZXdTdGF0ZTogU3RhdGVUeXBlLCBmbHVzaCA9IGZhbHNlKSB7XG4gICAgcHVsc2VDYWxsQ291bnQtLTtcbiAgICBpZiAoIWhhc0NoYW5nZWQobG9jYWxTdGF0ZSwgbmV3U3RhdGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChwdWxzZUNhbGxDb3VudCA+IDAgJiYgIWZsdXNoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN5bmNTdGF0ZShuZXdTdGF0ZSk7XG4gICAgY3VycmVudFN0YXRlID0gbnVsbDtcbiAgICBkZWJvdW5jZWRVcGRhdGUoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFB1bHNlTWV0aG9kKGtleTogc3RyaW5nKSB7XG4gICAgZnVuY3Rpb24gcHVsc2VNZXRob2QodGhpczogUHVsc2U8U3RhdGVUeXBlLCBhbnk+ICYgeyAkZmx1c2g6ICgpID0+IFByb21pc2U8dm9pZD4gfSwgLi4uYXJnczogYW55W10pIHtcbiAgICAgIHB1bHNlQ2FsbENvdW50Kys7XG4gICAgICBpZiAoY3VycmVudFN0YXRlID09PSBudWxsKSB7XG4gICAgICAgIGN1cnJlbnRTdGF0ZSA9IGRlZXBDbG9uZVVuZnJlZXplKGxvY2FsU3RhdGUpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCAkZmx1c2ggPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIHNldFN0YXRlKGN1cnJlbnRTdGF0ZSBhcyBTdGF0ZVR5cGUsIHRydWUpO1xuICAgICAgICBjdXJyZW50U3RhdGUgPSBkZWVwQ2xvbmVVbmZyZWV6ZShsb2NhbFN0YXRlKTtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMCkpO1xuICAgICAgfTtcblxuICAgICAgUmVmbGVjdC5zZXQodGhpcywgXCIkZmx1c2hcIiwgJGZsdXNoKTtcbiAgICAgIGNvbnN0IGVtcHR5Rmx1c2ggPSBhc3luYyAoKSA9PiB7fTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcHVsc2VSZXN1bHQgPSBwdWxzZXNba2V5XS5hcHBseSh0aGlzLCBbY3VycmVudFN0YXRlLCAuLi5hcmdzXSBhcyBhbnkpO1xuICAgICAgICBpZiAocHVsc2VSZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgcmV0dXJuIHB1bHNlUmVzdWx0XG4gICAgICAgICAgICAudGhlbigocmVzb2x2ZWRWYWx1ZSkgPT4ge1xuICAgICAgICAgICAgICBzZXRTdGF0ZShjdXJyZW50U3RhdGUgYXMgU3RhdGVUeXBlKTtcbiAgICAgICAgICAgICAgUmVmbGVjdC5zZXQodGhpcywgXCIkZmx1c2hcIiwgZW1wdHlGbHVzaCk7XG4gICAgICAgICAgICAgIHJldHVybiByZXNvbHZlZFZhbHVlO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgaW4gcHVsc2UgJyR7a2V5fSc6YCwgZXJyb3IpO1xuICAgICAgICAgICAgICBSZWZsZWN0LnNldCh0aGlzLCBcIiRmbHVzaFwiLCBlbXB0eUZsdXNoKTtcbiAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZXRTdGF0ZShjdXJyZW50U3RhdGUpO1xuICAgICAgICAgIFJlZmxlY3Quc2V0KHRoaXMsIFwiJGZsdXNoXCIsIGVtcHR5Rmx1c2gpO1xuICAgICAgICAgIHJldHVybiBwdWxzZVJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgaW4gcHVsc2UgJyR7a2V5fSc6YCwgZXJyb3IpO1xuICAgICAgICBSZWZsZWN0LnNldCh0aGlzLCBcIiRmbHVzaFwiLCBlbXB0eUZsdXNoKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHB1bHNlTWV0aG9kO1xuICB9XG5cbiAgc3luY1N0YXRlKGxvY2FsU3RhdGUpO1xuXG4gIGNvbnN0IGxpc3RlbmVyczogUmVjb3JkPHN0cmluZywgRnVuY3Rpb25bXT4gPSB7fTtcbiAgY29uc3QgdHJpZ2dlciA9IChldmVudDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgIGlmIChsaXN0ZW5lcnNbZXZlbnRdKSB7XG4gICAgICBsaXN0ZW5lcnNbZXZlbnRdLmZvckVhY2goKGNhbGxiYWNrKSA9PiBjYWxsYmFjayguLi5hcmdzKSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHB1bHNlc1Byb3h5ID0gbmV3IFByb3h5KGJvdW5kUHVsc2VzLCB7XG4gICAgZ2V0OiAocHVsc2VzLCBwcm9wOiBzdHJpbmcpID0+IHtcbiAgICAgIGlmIChwcm9wID09PSBcInN0YXRlXCIpIHtcbiAgICAgICAgcmV0dXJuIHByb3h5U3RhdGU7XG4gICAgICB9XG4gICAgICBpZiAocHJvcCA9PT0gXCJvblwiKSB7XG4gICAgICAgIHJldHVybiAoZXZlbnQ6IHN0cmluZywgY2FsbGJhY2s6IEZ1bmN0aW9uKSA9PiB7XG4gICAgICAgICAgaWYgKCFsaXN0ZW5lcnNbZXZlbnRdKSB7XG4gICAgICAgICAgICBsaXN0ZW5lcnNbZXZlbnRdID0gW107XG4gICAgICAgICAgfVxuICAgICAgICAgIGxpc3RlbmVyc1tldmVudF0ucHVzaChjYWxsYmFjayk7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAocHJvcCA9PT0gXCJvZmZcIikge1xuICAgICAgICByZXR1cm4gKGV2ZW50OiBzdHJpbmcsIGNhbGxiYWNrOiBGdW5jdGlvbikgPT4ge1xuICAgICAgICAgIGlmIChsaXN0ZW5lcnNbZXZlbnRdKSB7XG4gICAgICAgICAgICBsaXN0ZW5lcnNbZXZlbnRdID0gbGlzdGVuZXJzW2V2ZW50XS5maWx0ZXIoKGNiKSA9PiBjYiAhPT0gY2FsbGJhY2spO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmICghKHByb3AgaW4gcHVsc2VzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFB1bHNlICcke3Byb3B9JyBkb2VzIG5vdCBleGlzdGApO1xuICAgICAgfVxuICAgICAgY29uc3QgcHVsc2VNZXRob2QgPSBwdWxzZXNbcHJvcF07XG5cbiAgICAgIGlmICh0eXBlb2YgcHVsc2VNZXRob2QgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gcHVsc2VNZXRob2QuYXBwbHkocHVsc2VzUHJveHksIGFyZ3MgYXMgYW55KTtcbiAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC50aGVuKChyKSA9PiB7XG4gICAgICAgICAgICAgIHRyaWdnZXIoXCJwdWxzZVwiLCBwcm9wLCBhcmdzKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdHJpZ2dlcihcInB1bHNlXCIsIHByb3AsIGFyZ3MpO1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwdWxzZU1ldGhvZDtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBwdWxzZXNQcm94eSBhcyBTdG9yZVB1bHNlczxQdWxzZXNUeXBlPiAmIHtcbiAgICBzdGF0ZTogUHJveHlTdGF0ZTxTdGF0ZVR5cGU+O1xuICAgIG9uOiAoZXZlbnQ6IHN0cmluZywgY2FsbGJhY2s6IEZ1bmN0aW9uKSA9PiB2b2lkO1xuICAgIG9mZjogKGV2ZW50OiBzdHJpbmcsIGNhbGxiYWNrOiBGdW5jdGlvbikgPT4gdm9pZDtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVB1bHNlU3RvcmU8U3RhdGVUeXBlIGV4dGVuZHMgU3RhdGUsIFB1bHNlc1R5cGUgZXh0ZW5kcyBQdWxzZXM8U3RhdGVUeXBlPj4oXG4gIGluaXRpYWxTdGF0ZTogU3RhdGVUeXBlLFxuICBwdWxzZXM6IFB1bHNlc1R5cGVcbik6IFN0b3JlUHVsc2VzPFB1bHNlc1R5cGU+ICYge1xuICBzdGF0ZTogUHJveHlTdGF0ZTxTdGF0ZVR5cGU+O1xuICBvbjogKGV2ZW50OiBzdHJpbmcsIGNhbGxiYWNrOiBGdW5jdGlvbikgPT4gdm9pZDtcbiAgb2ZmOiAoZXZlbnQ6IHN0cmluZywgY2FsbGJhY2s6IEZ1bmN0aW9uKSA9PiB2b2lkO1xufSB7XG4gIHJldHVybiBjcmVhdGVTdG9yZShpbml0aWFsU3RhdGUsIHB1bHNlcywgdHJ1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNdXRhYmxlU3RvcmU8U3RhdGVUeXBlIGV4dGVuZHMgU3RhdGUsIFB1bHNlc1R5cGUgZXh0ZW5kcyBQdWxzZXM8U3RhdGVUeXBlPj4oXG4gIGluaXRpYWxTdGF0ZTogU3RhdGVUeXBlLFxuICBwdWxzZXM6IFB1bHNlc1R5cGVcbik6IFN0b3JlUHVsc2VzPFB1bHNlc1R5cGU+ICYge1xuICBzdGF0ZTogUHJveHlTdGF0ZTxTdGF0ZVR5cGU+O1xuICBvbjogKGV2ZW50OiBzdHJpbmcsIGNhbGxiYWNrOiBGdW5jdGlvbikgPT4gdm9pZDtcbiAgb2ZmOiAoZXZlbnQ6IHN0cmluZywgY2FsbGJhY2s6IEZ1bmN0aW9uKSA9PiB2b2lkO1xufSB7XG4gIGNvbnNvbGUud2FybihcbiAgICBcIldhcm5pbmc6IFlvdSBhcmUgd29ya2luZyB3aXRoIGEgbXV0YWJsZSBzdGF0ZS4gVGhpcyBjYW4gbGVhZCB0byB1bnByZWRpY3RhYmxlIGJlaGF2aW9yLiBBbGwgc3RhdGUgY2hhbmdlcyBtYWRlIG91dHNpZGUgb2YgYSBwdWxzZSB3aWxsIG5vdCB0cmlnZ2VyIGEgcmUtcmVuZGVyLlwiXG4gICk7XG4gIHJldHVybiBjcmVhdGVTdG9yZShpbml0aWFsU3RhdGUsIHB1bHNlcywgZmFsc2UpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRWZmZWN0KGVmZmVjdDogRnVuY3Rpb24pIHtcbiAgY29uc3QgcnVuRWZmZWN0ID0gKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBlZmZlY3RTdGFjay5wdXNoKHJ1bkVmZmVjdCk7XG4gICAgICBlZmZlY3QoKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgZWZmZWN0U3RhY2sucG9wKCk7XG4gICAgfVxuICB9O1xuICBydW5FZmZlY3QoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVB1bHNlPFQ+KGluaXRpYWxWYWx1ZTogVCk6IFsoKSA9PiBULCAobmV3VmFsdWU6IFQgfCAoKGN1cnJlbnQ6IFQpID0+IFQpKSA9PiB2b2lkLCAoKSA9PiB2b2lkXSB7XG4gIGxldCB2YWx1ZSA9IGluaXRpYWxWYWx1ZTtcbiAgY29uc3Qgc3Vic2NyaWJlcnMgPSBuZXcgU2V0PEZ1bmN0aW9uPigpO1xuICBjb25zdCBkb21XaXRoVm5vZGVzVG9VcGRhdGUgPSBuZXcgV2Vha1NldDxEb21FbGVtZW50PigpO1xuXG4gIGNvbnN0IHJ1blN1YnNjcmliZXJzID0gKCkgPT4ge1xuICAgIHN1YnNjcmliZXJzLmZvckVhY2goKHN1YnNjcmliZXIpID0+IHN1YnNjcmliZXIoKSk7XG4gIH07XG5cbiAgY29uc3QgcmVhZCA9ICgpOiBUID0+IHtcbiAgICBjb25zdCBjdXJyZW50RWZmZWN0ID0gZWZmZWN0U3RhY2tbZWZmZWN0U3RhY2subGVuZ3RoIC0gMV07XG4gICAgaWYgKGN1cnJlbnRFZmZlY3QgJiYgIXN1YnNjcmliZXJzLmhhcyhjdXJyZW50RWZmZWN0KSkge1xuICAgICAgc3Vic2NyaWJlcnMuYWRkKGN1cnJlbnRFZmZlY3QpO1xuICAgIH1cbiAgICByZWdpc3RlckRvbVN1YnNjcmlwdGlvbihzdWJzY3JpYmVycywgZG9tV2l0aFZub2Rlc1RvVXBkYXRlKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG5cbiAgY29uc3Qgd3JpdGUgPSAobmV3VmFsdWU6IFQgfCAoKGN1cnJlbnQ6IFQpID0+IFQpKTogdm9pZCA9PiB7XG4gICAgY29uc3QgcmVzb2x2ZWRWYWx1ZSA9IHR5cGVvZiBuZXdWYWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gKG5ld1ZhbHVlIGFzIChjdXJyZW50OiBUKSA9PiBUKSh2YWx1ZSkgOiBuZXdWYWx1ZTtcbiAgICBpZiAoIWhhc0NoYW5nZWQodmFsdWUsIHJlc29sdmVkVmFsdWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhbHVlID0gcmVzb2x2ZWRWYWx1ZTtcbiAgICBydW5TdWJzY3JpYmVycygpO1xuICB9O1xuXG4gIHJldHVybiBbcmVhZCwgd3JpdGUsIHJ1blN1YnNjcmliZXJzXTtcbn1cbiJdLCJtYXBwaW5ncyI6ImdKQUFBQSxFQUFBLEcseURBQUFDLENBQUFELEVBQUEsQ0FBQUUsYUFBQSxJQUFBQSxFQUFBQyxtQkFBQSxJQUFBQSxFQUFBQyxZQUFBLElBQUFBLEVBQUFDLGlCQUFBLElBQUFBLElBQUEsSSxFQUFBQyxHLEVBQUFOLEUsME1BQ0FPLEVBQStEQyxRQUFBLGVBQy9EQyxFQUEwREQsUUFBQSxxQkFVcERFLEVBQTBCLEdBV2hDLFNBQVNDLEVBQXdCQyxFQUE0QkMsR0FDM0QsTUFBTUMsRUFBZVAsRUFBQVEsUUFBUUMsTUFDN0IsSUFBS0YsR0FBZ0JELEVBQXNCSSxJQUFJSCxFQUFhSSxLQUMxRCxPQUdGLElBQUlDLEdBQVksRUFDWkMsRUFBU04sRUFBYUksSUFBSUcsY0FDOUIsS0FBT0QsR0FBUSxDQUNiLEdBQUlQLEVBQXNCSSxJQUFJRyxHQUFTLENBQ3JDRCxHQUFZLEVBQ1osS0FDRixDQUNBQyxFQUFTQSxFQUFPQyxhQUNsQixDQUdB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
@@ -142,17 +142,48 @@ function createStore(initialState, pulses, immutable = false) {
142
142
  return pulseMethod;
143
143
  }
144
144
  syncState(localState);
145
+ const listeners = {};
146
+ const trigger = (event, ...args) => {
147
+ if (listeners[event]) {
148
+ listeners[event].forEach((callback) => callback(...args));
149
+ }
150
+ };
145
151
  const pulsesProxy = new Proxy(boundPulses, {
146
152
  get: (pulses2, prop) => {
147
153
  if (prop === "state") {
148
154
  return proxyState;
149
155
  }
156
+ if (prop === "on") {
157
+ return (event, callback) => {
158
+ if (!listeners[event]) {
159
+ listeners[event] = [];
160
+ }
161
+ listeners[event].push(callback);
162
+ };
163
+ }
164
+ if (prop === "off") {
165
+ return (event, callback) => {
166
+ if (listeners[event]) {
167
+ listeners[event] = listeners[event].filter((cb) => cb !== callback);
168
+ }
169
+ };
170
+ }
150
171
  if (!(prop in pulses2)) {
151
172
  throw new Error(`Pulse '${prop}' does not exist`);
152
173
  }
153
174
  const pulseMethod = pulses2[prop];
154
175
  if (typeof pulseMethod === "function") {
155
- return pulseMethod.bind(pulsesProxy);
176
+ return (...args) => {
177
+ const result = pulseMethod.apply(pulsesProxy, args);
178
+ if (result instanceof Promise) {
179
+ return result.then((r) => {
180
+ trigger("pulse", prop, args);
181
+ return r;
182
+ });
183
+ }
184
+ trigger("pulse", prop, args);
185
+ return result;
186
+ };
156
187
  }
157
188
  return pulseMethod;
158
189
  }