diff --git a/CHANGELOG.md b/CHANGELOG.md index d5035af..b285a91 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,11 +1,8 @@ - - ## [7.2.11](https://github.com/Masquerade-Circus/valyrian.js/compare/7.2.10...7.2.11) (2023-09-27) - ### Bug Fixes -* fix tree-adapter append replace and remove unexistent child ([992fbd6](https://github.com/Masquerade-Circus/valyrian.js/commit/992fbd6e9cffa5fd94f9eca74562baede4a053cf)) +* fix tree-adapter append replace and remove unexistent child ([992fbd6](https://github.com/Masquerade-Circus/valyrian.js/commit/992fbd6e9cffa5fd94f9eca74562baede4a053cf)) ## [7.2.10](https://github.com/Masquerade-Circus/valyrian.js/compare/7.2.8...7.2.10) (2023-09-27) @@ -680,4 +677,4 @@ ### [0.0.3](https://github.com/Masquerade-Circus/valyrian.js/compare/5.0.3...5.0.4) (2018-04-17) -### [0.0.2](https://github.com/Masquerade-Circus/valyrian.js/compare/5.0.3...5.0.4) (2018-04-17) \ No newline at end of file +### [0.0.2](https://github.com/Masquerade-Circus/valyrian.js/compare/5.0.3...5.0.4) (2018-04-17) diff --git a/dist/dataset/index.d.ts b/dist/dataset/index.d.ts index 18174f7..c709af9 100644 --- a/dist/dataset/index.d.ts +++ b/dist/dataset/index.d.ts @@ -1,4 +1,4 @@ -import { VnodeInterface, VnodeWithDom } from "valyrian.js"; +import { VnodeWithDom } from "valyrian.js"; interface DataSetInterface { data: T[]; reset: (data: T[]) => void; @@ -7,7 +7,7 @@ interface DataSetInterface { delete: (index: number) => void; } interface DataSetHandler { - (data: T, index: number): VnodeInterface; + (data: T, index: number): VnodeWithDom; } export declare class DataSet implements DataSetInterface { #private; diff --git a/dist/dataset/index.d.ts.map b/dist/dataset/index.d.ts.map index 9daba4a..648a538 100644 --- a/dist/dataset/index.d.ts.map +++ b/dist/dataset/index.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/dataset/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAwD,MAAM,aAAa,CAAC;AAEjH,UAAU,gBAAgB,CAAC,CAAC;IAC1B,IAAI,EAAE,CAAC,EAAE,CAAC;IAEV,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC;IAE3B,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC;IAE5B,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC;IAEzC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AACD,UAAU,cAAc,CAAC,CAAC;IAExB,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,cAAc,CAAC;CAC1C;AAoBD,qBAAa,OAAO,CAAC,CAAC,CAAE,YAAW,gBAAgB,CAAC,CAAC,CAAC;;IAQpD,IAAI,IAAI,IAQO,CAAC,EAAE,CAFjB;IAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,EAEjB;gBAqBW,IAAI,GAAE,CAAC,EAAO,EAAE,YAAY,UAAO;IAK/C,kBAAkB,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;IAMlE,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE;IA2Cf,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE;IA4BhB,MAAM,CAAC,KAAK,EAAE,MAAM;IAcpB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;CAgBvC"} \ No newline at end of file +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/dataset/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAqD,MAAM,aAAa,CAAC;AAE9F,UAAU,gBAAgB,CAAC,CAAC;IAC1B,IAAI,EAAE,CAAC,EAAE,CAAC;IAEV,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC;IAE3B,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC;IAE5B,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC;IAEzC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AACD,UAAU,cAAc,CAAC,CAAC;IAExB,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,YAAY,CAAC;CACxC;AAoBD,qBAAa,OAAO,CAAC,CAAC,CAAE,YAAW,gBAAgB,CAAC,CAAC,CAAC;;IAQpD,IAAI,IAAI,IAQO,CAAC,EAAE,CAFjB;IAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,EAEjB;gBAqBW,IAAI,GAAE,CAAC,EAAO,EAAE,YAAY,UAAO;IAK/C,kBAAkB,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;IAMlE,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE;IA2Cf,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE;IA4BhB,MAAM,CAAC,KAAK,EAAE,MAAM;IAcpB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;CAgBvC"} \ No newline at end of file diff --git a/dist/dataset/index.js b/dist/dataset/index.js index 02a081a..7bf8945 100644 --- a/dist/dataset/index.js +++ b/dist/dataset/index.js @@ -102,15 +102,15 @@ var DataSet = class { const oldChild = vnode.children[i]; child.isSVG = oldChild.isSVG; child.dom = oldChild.dom; - (0, import_valyrian.updateAttributes)(child, oldChild); + (0, import_valyrian.updateAttributes)(child, null); vnode.children[i] = child; - (0, import_valyrian.patch)(child, oldChild); + (0, import_valyrian.patch)(child); continue; } child.isSVG = vnode.isSVG || child.tag === "svg"; - child.dom = (0, import_valyrian.createDomElement)(child.tag, child.isSVG); + child.dom = (0, import_valyrian.createElement)(child.tag, child.isSVG); vnode.dom.appendChild(child.dom); - (0, import_valyrian.updateAttributes)(child); + (0, import_valyrian.updateAttributes)(child, null); vnode.children.push(child); (0, import_valyrian.patch)(child); } @@ -135,9 +135,9 @@ var DataSet = class { for (let i = 0, ii = oldLength, l = data.length; i < l; i++, ii++) { const child = handler(this.#data[i], ii); child.isSVG = vnode.isSVG || child.tag === "svg"; - child.dom = (0, import_valyrian.createDomElement)(child.tag, child.isSVG); + child.dom = (0, import_valyrian.createElement)(child.tag, child.isSVG); vnode.dom.appendChild(child.dom); - (0, import_valyrian.updateAttributes)(child); + (0, import_valyrian.updateAttributes)(child, null); vnode.children.push(child); (0, import_valyrian.patch)(child); } @@ -167,8 +167,8 @@ var DataSet = class { newChild.isSVG = this.#vnode.isSVG || newChild.tag === "svg"; newChild.dom = child.dom; this.#vnode.children[index] = newChild; - (0, import_valyrian.updateAttributes)(newChild, child); - (0, import_valyrian.patch)(newChild, child); + (0, import_valyrian.updateAttributes)(newChild, null); + (0, import_valyrian.patch)(newChild); } } }; diff --git a/dist/dataset/index.js.map b/dist/dataset/index.js.map index 6adee23..86393aa 100644 --- a/dist/dataset/index.js.map +++ b/dist/dataset/index.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../lib/dataset/index.ts"], - "sourcesContent": ["import { VnodeInterface, VnodeWithDom, createDomElement, directive, patch, updateAttributes } from \"valyrian.js\";\n\ninterface DataSetInterface {\n data: T[];\n // eslint-disable-next-line no-unused-vars\n reset: (data: T[]) => void;\n // eslint-disable-next-line no-unused-vars\n add: (...data: T[]) => void;\n // eslint-disable-next-line no-unused-vars\n update: (index: number, data: T) => void;\n // eslint-disable-next-line no-unused-vars\n delete: (index: number) => void;\n}\ninterface DataSetHandler {\n // eslint-disable-next-line no-unused-vars\n (data: T, index: number): VnodeInterface;\n}\n\nfunction deepFreeze(obj: any) {\n if (typeof obj === \"object\" && obj !== null && !Object.isFrozen(obj)) {\n if (Array.isArray(obj)) {\n for (let i = 0, l = obj.length; i < l; i++) {\n deepFreeze(obj[i]);\n }\n } else {\n const props = Reflect.ownKeys(obj);\n for (let i = 0, l = props.length; i < l; i++) {\n deepFreeze(obj[props[i]]);\n }\n }\n Object.freeze(obj);\n }\n\n return obj;\n}\n\nexport class DataSet implements DataSetInterface {\n #vnode: VnodeWithDom | null = null;\n // eslint-disable-next-line no-unused-vars\n #handler: DataSetHandler | null = null;\n #data: T[] = [];\n #isFrozen = false;\n #dataProxy: T[] | null = null;\n\n get data() {\n if (this.#dataProxy === null) {\n throw new Error(\"DataSet is not initialized\");\n }\n\n return this.#dataProxy;\n }\n\n set data(data: T[]) {\n throw new Error(\"You need to use the reset method to set the data\");\n }\n\n #setData(data: T[]) {\n if (this.#isFrozen) {\n this.#data = deepFreeze([...data]);\n } else {\n this.#data = data;\n }\n this.#dataProxy = new Proxy(this.#data as T[], {\n set: () => {\n throw new Error(\"You need to use the add, update or delete methods to change the data\");\n },\n get(target: any, prop: string) {\n return target[prop];\n },\n deleteProperty: () => {\n throw new Error(\"You need to use the add, update or delete methods to change the data\");\n }\n }) as T[];\n }\n\n constructor(data: T[] = [], shouldFreeze = true) {\n this.#isFrozen = shouldFreeze;\n this.#setData(data);\n }\n\n setVnodeAndHandler(vnode: VnodeWithDom, handler: DataSetHandler) {\n this.#vnode = vnode;\n this.#handler = handler;\n this.reset(this.#data);\n }\n\n reset(data: T[]) {\n this.#setData(data);\n if (this.#vnode === null || this.#handler === null) {\n return;\n }\n\n const vnode = this.#vnode;\n const handler = this.#handler;\n\n if (data.length === 0) {\n vnode.children = [];\n vnode.dom.textContent = \"\";\n return;\n }\n\n const childrenLength = vnode.children.length;\n for (let i = 0, l = data.length; i < l; i++) {\n const child = handler(this.data[i], i);\n\n if (i < childrenLength) {\n const oldChild = vnode.children[i];\n child.isSVG = oldChild.isSVG;\n child.dom = oldChild.dom;\n updateAttributes(child as VnodeWithDom, oldChild);\n vnode.children[i] = child;\n patch(child as VnodeWithDom, oldChild);\n continue;\n }\n\n child.isSVG = vnode.isSVG || child.tag === \"svg\";\n child.dom = createDomElement(child.tag as string, child.isSVG);\n vnode.dom.appendChild(child.dom);\n updateAttributes(child as VnodeWithDom);\n vnode.children.push(child);\n patch(child as VnodeWithDom);\n }\n\n for (let i = data.length; i < childrenLength; i++) {\n vnode.dom.removeChild(vnode.children[i].dom);\n }\n vnode.children.length = data.length;\n }\n\n add(...data: T[]) {\n if (this.#data) {\n const oldLength = this.#data.length;\n if (this.#isFrozen) {\n this.#setData([...this.#data, ...data]);\n } else {\n this.#data.push(...data);\n }\n\n if (this.#vnode === null || this.#handler === null) {\n return;\n }\n\n const vnode = this.#vnode;\n const handler = this.#handler;\n\n for (let i = 0, ii = oldLength, l = data.length; i < l; i++, ii++) {\n const child = handler(this.#data[i], ii);\n child.isSVG = vnode.isSVG || child.tag === \"svg\";\n child.dom = createDomElement(child.tag as string, child.isSVG);\n vnode.dom.appendChild(child.dom);\n updateAttributes(child as VnodeWithDom);\n vnode.children.push(child);\n patch(child as VnodeWithDom);\n }\n }\n }\n\n delete(index: number) {\n if (this.#data && this.#vnode) {\n const child = this.#vnode.children[index];\n if (this.#isFrozen) {\n this.#setData(this.data.filter((_, i) => i !== index));\n } else {\n this.#data.splice(index, 1);\n }\n\n this.#vnode.dom.removeChild(child.dom);\n this.#vnode.children.splice(index, 1);\n }\n }\n\n update(index: number, item: Partial) {\n if (this.#data && this.#vnode && this.#handler) {\n const child = this.#vnode.children[index];\n if (this.#isFrozen) {\n this.#setData(this.#data.map((d, i) => (i === index ? { ...d, ...item } : d)));\n } else {\n this.#data[index] = { ...this.#data[index], ...item };\n }\n const newChild = this.#handler(this.#data[index], index);\n newChild.isSVG = this.#vnode.isSVG || newChild.tag === \"svg\";\n newChild.dom = child.dom;\n this.#vnode.children[index] = newChild;\n updateAttributes(newChild as VnodeWithDom, child);\n patch(newChild as VnodeWithDom, child);\n }\n }\n}\n\ndirective(\"with-dataset\", (dataSet, vnode) => {\n dataSet.setVnodeAndHandler(vnode as VnodeWithDom, vnode.children[0]);\n return false;\n});\n"], - "mappings": "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", + "sourcesContent": ["import { VnodeWithDom, createElement, directive, patch, updateAttributes } from \"valyrian.js\";\n\ninterface DataSetInterface {\n data: T[];\n // eslint-disable-next-line no-unused-vars\n reset: (data: T[]) => void;\n // eslint-disable-next-line no-unused-vars\n add: (...data: T[]) => void;\n // eslint-disable-next-line no-unused-vars\n update: (index: number, data: T) => void;\n // eslint-disable-next-line no-unused-vars\n delete: (index: number) => void;\n}\ninterface DataSetHandler {\n // eslint-disable-next-line no-unused-vars\n (data: T, index: number): VnodeWithDom;\n}\n\nfunction deepFreeze(obj: any) {\n if (typeof obj === \"object\" && obj !== null && !Object.isFrozen(obj)) {\n if (Array.isArray(obj)) {\n for (let i = 0, l = obj.length; i < l; i++) {\n deepFreeze(obj[i]);\n }\n } else {\n const props = Reflect.ownKeys(obj);\n for (let i = 0, l = props.length; i < l; i++) {\n deepFreeze(obj[props[i]]);\n }\n }\n Object.freeze(obj);\n }\n\n return obj;\n}\n\nexport class DataSet implements DataSetInterface {\n #vnode: VnodeWithDom | null = null;\n // eslint-disable-next-line no-unused-vars\n #handler: DataSetHandler | null = null;\n #data: T[] = [];\n #isFrozen = false;\n #dataProxy: T[] | null = null;\n\n get data() {\n if (this.#dataProxy === null) {\n throw new Error(\"DataSet is not initialized\");\n }\n\n return this.#dataProxy;\n }\n\n set data(data: T[]) {\n throw new Error(\"You need to use the reset method to set the data\");\n }\n\n #setData(data: T[]) {\n if (this.#isFrozen) {\n this.#data = deepFreeze([...data]);\n } else {\n this.#data = data;\n }\n this.#dataProxy = new Proxy(this.#data as T[], {\n set: () => {\n throw new Error(\"You need to use the add, update or delete methods to change the data\");\n },\n get(target: any, prop: string) {\n return target[prop];\n },\n deleteProperty: () => {\n throw new Error(\"You need to use the add, update or delete methods to change the data\");\n }\n }) as T[];\n }\n\n constructor(data: T[] = [], shouldFreeze = true) {\n this.#isFrozen = shouldFreeze;\n this.#setData(data);\n }\n\n setVnodeAndHandler(vnode: VnodeWithDom, handler: DataSetHandler) {\n this.#vnode = vnode;\n this.#handler = handler;\n this.reset(this.#data);\n }\n\n reset(data: T[]) {\n this.#setData(data);\n if (this.#vnode === null || this.#handler === null) {\n return;\n }\n\n const vnode = this.#vnode;\n const handler = this.#handler;\n\n if (data.length === 0) {\n vnode.children = [];\n vnode.dom.textContent = \"\";\n return;\n }\n\n const childrenLength = vnode.children.length;\n for (let i = 0, l = data.length; i < l; i++) {\n const child = handler(this.data[i], i);\n\n if (i < childrenLength) {\n const oldChild = vnode.children[i];\n child.isSVG = oldChild.isSVG;\n child.dom = oldChild.dom;\n updateAttributes(child as VnodeWithDom, null);\n vnode.children[i] = child;\n patch(child as VnodeWithDom);\n continue;\n }\n\n child.isSVG = vnode.isSVG || child.tag === \"svg\";\n child.dom = createElement(child.tag as string, child.isSVG);\n vnode.dom.appendChild(child.dom);\n updateAttributes(child as VnodeWithDom, null);\n vnode.children.push(child);\n patch(child as VnodeWithDom);\n }\n\n for (let i = data.length; i < childrenLength; i++) {\n vnode.dom.removeChild(vnode.children[i].dom);\n }\n vnode.children.length = data.length;\n }\n\n add(...data: T[]) {\n if (this.#data) {\n const oldLength = this.#data.length;\n if (this.#isFrozen) {\n this.#setData([...this.#data, ...data]);\n } else {\n this.#data.push(...data);\n }\n\n if (this.#vnode === null || this.#handler === null) {\n return;\n }\n\n const vnode = this.#vnode;\n const handler = this.#handler;\n\n for (let i = 0, ii = oldLength, l = data.length; i < l; i++, ii++) {\n const child = handler(this.#data[i], ii);\n child.isSVG = vnode.isSVG || child.tag === \"svg\";\n child.dom = createElement(child.tag as string, child.isSVG);\n vnode.dom.appendChild(child.dom);\n updateAttributes(child as VnodeWithDom, null);\n vnode.children.push(child);\n patch(child as VnodeWithDom);\n }\n }\n }\n\n delete(index: number) {\n if (this.#data && this.#vnode) {\n const child = this.#vnode.children[index];\n if (this.#isFrozen) {\n this.#setData(this.data.filter((_, i) => i !== index));\n } else {\n this.#data.splice(index, 1);\n }\n\n this.#vnode.dom.removeChild(child.dom);\n this.#vnode.children.splice(index, 1);\n }\n }\n\n update(index: number, item: Partial) {\n if (this.#data && this.#vnode && this.#handler) {\n const child = this.#vnode.children[index];\n if (this.#isFrozen) {\n this.#setData(this.#data.map((d, i) => (i === index ? { ...d, ...item } : d)));\n } else {\n this.#data[index] = { ...this.#data[index], ...item };\n }\n const newChild = this.#handler(this.#data[index], index);\n newChild.isSVG = this.#vnode.isSVG || newChild.tag === \"svg\";\n newChild.dom = child.dom;\n this.#vnode.children[index] = newChild;\n updateAttributes(newChild as VnodeWithDom, null);\n patch(newChild as VnodeWithDom);\n }\n }\n}\n\ndirective(\"with-dataset\", (dataSet: DataSet, vnode: VnodeWithDom) => {\n dataSet.setVnodeAndHandler(vnode, vnode.children[0]);\n return false;\n});\n"], + "mappings": "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", "names": [] } diff --git a/dist/dataset/index.mjs b/dist/dataset/index.mjs index 12dbbb2..b457f21 100644 --- a/dist/dataset/index.mjs +++ b/dist/dataset/index.mjs @@ -1,5 +1,5 @@ // lib/dataset/index.ts -import { createDomElement, directive, patch, updateAttributes } from "valyrian.js"; +import { createElement, directive, patch, updateAttributes } from "valyrian.js"; function deepFreeze(obj) { if (typeof obj === "object" && obj !== null && !Object.isFrozen(obj)) { if (Array.isArray(obj)) { @@ -78,15 +78,15 @@ var DataSet = class { const oldChild = vnode.children[i]; child.isSVG = oldChild.isSVG; child.dom = oldChild.dom; - updateAttributes(child, oldChild); + updateAttributes(child, null); vnode.children[i] = child; - patch(child, oldChild); + patch(child); continue; } child.isSVG = vnode.isSVG || child.tag === "svg"; - child.dom = createDomElement(child.tag, child.isSVG); + child.dom = createElement(child.tag, child.isSVG); vnode.dom.appendChild(child.dom); - updateAttributes(child); + updateAttributes(child, null); vnode.children.push(child); patch(child); } @@ -111,9 +111,9 @@ var DataSet = class { for (let i = 0, ii = oldLength, l = data.length; i < l; i++, ii++) { const child = handler(this.#data[i], ii); child.isSVG = vnode.isSVG || child.tag === "svg"; - child.dom = createDomElement(child.tag, child.isSVG); + child.dom = createElement(child.tag, child.isSVG); vnode.dom.appendChild(child.dom); - updateAttributes(child); + updateAttributes(child, null); vnode.children.push(child); patch(child); } @@ -143,8 +143,8 @@ var DataSet = class { newChild.isSVG = this.#vnode.isSVG || newChild.tag === "svg"; newChild.dom = child.dom; this.#vnode.children[index] = newChild; - updateAttributes(newChild, child); - patch(newChild, child); + updateAttributes(newChild, null); + patch(newChild); } } }; diff --git a/dist/dataset/index.mjs.map b/dist/dataset/index.mjs.map index 5bb8e01..c358a61 100644 --- a/dist/dataset/index.mjs.map +++ b/dist/dataset/index.mjs.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../lib/dataset/index.ts"], - "sourcesContent": ["import { VnodeInterface, VnodeWithDom, createDomElement, directive, patch, updateAttributes } from \"valyrian.js\";\n\ninterface DataSetInterface {\n data: T[];\n // eslint-disable-next-line no-unused-vars\n reset: (data: T[]) => void;\n // eslint-disable-next-line no-unused-vars\n add: (...data: T[]) => void;\n // eslint-disable-next-line no-unused-vars\n update: (index: number, data: T) => void;\n // eslint-disable-next-line no-unused-vars\n delete: (index: number) => void;\n}\ninterface DataSetHandler {\n // eslint-disable-next-line no-unused-vars\n (data: T, index: number): VnodeInterface;\n}\n\nfunction deepFreeze(obj: any) {\n if (typeof obj === \"object\" && obj !== null && !Object.isFrozen(obj)) {\n if (Array.isArray(obj)) {\n for (let i = 0, l = obj.length; i < l; i++) {\n deepFreeze(obj[i]);\n }\n } else {\n const props = Reflect.ownKeys(obj);\n for (let i = 0, l = props.length; i < l; i++) {\n deepFreeze(obj[props[i]]);\n }\n }\n Object.freeze(obj);\n }\n\n return obj;\n}\n\nexport class DataSet implements DataSetInterface {\n #vnode: VnodeWithDom | null = null;\n // eslint-disable-next-line no-unused-vars\n #handler: DataSetHandler | null = null;\n #data: T[] = [];\n #isFrozen = false;\n #dataProxy: T[] | null = null;\n\n get data() {\n if (this.#dataProxy === null) {\n throw new Error(\"DataSet is not initialized\");\n }\n\n return this.#dataProxy;\n }\n\n set data(data: T[]) {\n throw new Error(\"You need to use the reset method to set the data\");\n }\n\n #setData(data: T[]) {\n if (this.#isFrozen) {\n this.#data = deepFreeze([...data]);\n } else {\n this.#data = data;\n }\n this.#dataProxy = new Proxy(this.#data as T[], {\n set: () => {\n throw new Error(\"You need to use the add, update or delete methods to change the data\");\n },\n get(target: any, prop: string) {\n return target[prop];\n },\n deleteProperty: () => {\n throw new Error(\"You need to use the add, update or delete methods to change the data\");\n }\n }) as T[];\n }\n\n constructor(data: T[] = [], shouldFreeze = true) {\n this.#isFrozen = shouldFreeze;\n this.#setData(data);\n }\n\n setVnodeAndHandler(vnode: VnodeWithDom, handler: DataSetHandler) {\n this.#vnode = vnode;\n this.#handler = handler;\n this.reset(this.#data);\n }\n\n reset(data: T[]) {\n this.#setData(data);\n if (this.#vnode === null || this.#handler === null) {\n return;\n }\n\n const vnode = this.#vnode;\n const handler = this.#handler;\n\n if (data.length === 0) {\n vnode.children = [];\n vnode.dom.textContent = \"\";\n return;\n }\n\n const childrenLength = vnode.children.length;\n for (let i = 0, l = data.length; i < l; i++) {\n const child = handler(this.data[i], i);\n\n if (i < childrenLength) {\n const oldChild = vnode.children[i];\n child.isSVG = oldChild.isSVG;\n child.dom = oldChild.dom;\n updateAttributes(child as VnodeWithDom, oldChild);\n vnode.children[i] = child;\n patch(child as VnodeWithDom, oldChild);\n continue;\n }\n\n child.isSVG = vnode.isSVG || child.tag === \"svg\";\n child.dom = createDomElement(child.tag as string, child.isSVG);\n vnode.dom.appendChild(child.dom);\n updateAttributes(child as VnodeWithDom);\n vnode.children.push(child);\n patch(child as VnodeWithDom);\n }\n\n for (let i = data.length; i < childrenLength; i++) {\n vnode.dom.removeChild(vnode.children[i].dom);\n }\n vnode.children.length = data.length;\n }\n\n add(...data: T[]) {\n if (this.#data) {\n const oldLength = this.#data.length;\n if (this.#isFrozen) {\n this.#setData([...this.#data, ...data]);\n } else {\n this.#data.push(...data);\n }\n\n if (this.#vnode === null || this.#handler === null) {\n return;\n }\n\n const vnode = this.#vnode;\n const handler = this.#handler;\n\n for (let i = 0, ii = oldLength, l = data.length; i < l; i++, ii++) {\n const child = handler(this.#data[i], ii);\n child.isSVG = vnode.isSVG || child.tag === \"svg\";\n child.dom = createDomElement(child.tag as string, child.isSVG);\n vnode.dom.appendChild(child.dom);\n updateAttributes(child as VnodeWithDom);\n vnode.children.push(child);\n patch(child as VnodeWithDom);\n }\n }\n }\n\n delete(index: number) {\n if (this.#data && this.#vnode) {\n const child = this.#vnode.children[index];\n if (this.#isFrozen) {\n this.#setData(this.data.filter((_, i) => i !== index));\n } else {\n this.#data.splice(index, 1);\n }\n\n this.#vnode.dom.removeChild(child.dom);\n this.#vnode.children.splice(index, 1);\n }\n }\n\n update(index: number, item: Partial) {\n if (this.#data && this.#vnode && this.#handler) {\n const child = this.#vnode.children[index];\n if (this.#isFrozen) {\n this.#setData(this.#data.map((d, i) => (i === index ? { ...d, ...item } : d)));\n } else {\n this.#data[index] = { ...this.#data[index], ...item };\n }\n const newChild = this.#handler(this.#data[index], index);\n newChild.isSVG = this.#vnode.isSVG || newChild.tag === \"svg\";\n newChild.dom = child.dom;\n this.#vnode.children[index] = newChild;\n updateAttributes(newChild as VnodeWithDom, child);\n patch(newChild as VnodeWithDom, child);\n }\n }\n}\n\ndirective(\"with-dataset\", (dataSet, vnode) => {\n dataSet.setVnodeAndHandler(vnode as VnodeWithDom, vnode.children[0]);\n return false;\n});\n"], - "mappings": ";AAAA,SAAuC,kBAAkB,WAAW,OAAO,wBAAwB;AAkBnG,SAAS,WAAW,KAAU;AAC5B,MAAI,OAAO,QAAQ,YAAY,QAAQ,QAAQ,CAAC,OAAO,SAAS,GAAG,GAAG;AACpE,QAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,eAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,IAAI,GAAG,KAAK;AAC1C,mBAAW,IAAI,CAAC,CAAC;AAAA,MACnB;AAAA,IACF,OAAO;AACL,YAAM,QAAQ,QAAQ,QAAQ,GAAG;AACjC,eAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,IAAI,GAAG,KAAK;AAC5C,mBAAW,IAAI,MAAM,CAAC,CAAC,CAAC;AAAA,MAC1B;AAAA,IACF;AACA,WAAO,OAAO,GAAG;AAAA,EACnB;AAEA,SAAO;AACT;AAEO,IAAM,UAAN,MAAgD;AAAA,EACrD,SAA8B;AAAA;AAAA,EAE9B,WAAqC;AAAA,EACrC,QAAa,CAAC;AAAA,EACd,YAAY;AAAA,EACZ,aAAyB;AAAA,EAEzB,IAAI,OAAO;AACT,QAAI,KAAK,eAAe,MAAM;AAC5B,YAAM,IAAI,MAAM,4BAA4B;AAAA,IAC9C;AAEA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,KAAK,MAAW;AAClB,UAAM,IAAI,MAAM,kDAAkD;AAAA,EACpE;AAAA,EAEA,SAAS,MAAW;AAClB,QAAI,KAAK,WAAW;AAClB,WAAK,QAAQ,WAAW,CAAC,GAAG,IAAI,CAAC;AAAA,IACnC,OAAO;AACL,WAAK,QAAQ;AAAA,IACf;AACA,SAAK,aAAa,IAAI,MAAM,KAAK,OAAc;AAAA,MAC7C,KAAK,MAAM;AACT,cAAM,IAAI,MAAM,sEAAsE;AAAA,MACxF;AAAA,MACA,IAAI,QAAa,MAAc;AAC7B,eAAO,OAAO,IAAI;AAAA,MACpB;AAAA,MACA,gBAAgB,MAAM;AACpB,cAAM,IAAI,MAAM,sEAAsE;AAAA,MACxF;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,YAAY,OAAY,CAAC,GAAG,eAAe,MAAM;AAC/C,SAAK,YAAY;AACjB,SAAK,SAAS,IAAI;AAAA,EACpB;AAAA,EAEA,mBAAmB,OAAqB,SAA4B;AAClE,SAAK,SAAS;AACd,SAAK,WAAW;AAChB,SAAK,MAAM,KAAK,KAAK;AAAA,EACvB;AAAA,EAEA,MAAM,MAAW;AACf,SAAK,SAAS,IAAI;AAClB,QAAI,KAAK,WAAW,QAAQ,KAAK,aAAa,MAAM;AAClD;AAAA,IACF;AAEA,UAAM,QAAQ,KAAK;AACnB,UAAM,UAAU,KAAK;AAErB,QAAI,KAAK,WAAW,GAAG;AACrB,YAAM,WAAW,CAAC;AAClB,YAAM,IAAI,cAAc;AACxB;AAAA,IACF;AAEA,UAAM,iBAAiB,MAAM,SAAS;AACtC,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,IAAI,GAAG,KAAK;AAC3C,YAAM,QAAQ,QAAQ,KAAK,KAAK,CAAC,GAAG,CAAC;AAErC,UAAI,IAAI,gBAAgB;AACtB,cAAM,WAAW,MAAM,SAAS,CAAC;AACjC,cAAM,QAAQ,SAAS;AACvB,cAAM,MAAM,SAAS;AACrB,yBAAiB,OAAuB,QAAQ;AAChD,cAAM,SAAS,CAAC,IAAI;AACpB,cAAM,OAAuB,QAAQ;AACrC;AAAA,MACF;AAEA,YAAM,QAAQ,MAAM,SAAS,MAAM,QAAQ;AAC3C,YAAM,MAAM,iBAAiB,MAAM,KAAe,MAAM,KAAK;AAC7D,YAAM,IAAI,YAAY,MAAM,GAAG;AAC/B,uBAAiB,KAAqB;AACtC,YAAM,SAAS,KAAK,KAAK;AACzB,YAAM,KAAqB;AAAA,IAC7B;AAEA,aAAS,IAAI,KAAK,QAAQ,IAAI,gBAAgB,KAAK;AACjD,YAAM,IAAI,YAAY,MAAM,SAAS,CAAC,EAAE,GAAG;AAAA,IAC7C;AACA,UAAM,SAAS,SAAS,KAAK;AAAA,EAC/B;AAAA,EAEA,OAAO,MAAW;AAChB,QAAI,KAAK,OAAO;AACd,YAAM,YAAY,KAAK,MAAM;AAC7B,UAAI,KAAK,WAAW;AAClB,aAAK,SAAS,CAAC,GAAG,KAAK,OAAO,GAAG,IAAI,CAAC;AAAA,MACxC,OAAO;AACL,aAAK,MAAM,KAAK,GAAG,IAAI;AAAA,MACzB;AAEA,UAAI,KAAK,WAAW,QAAQ,KAAK,aAAa,MAAM;AAClD;AAAA,MACF;AAEA,YAAM,QAAQ,KAAK;AACnB,YAAM,UAAU,KAAK;AAErB,eAAS,IAAI,GAAG,KAAK,WAAW,IAAI,KAAK,QAAQ,IAAI,GAAG,KAAK,MAAM;AACjE,cAAM,QAAQ,QAAQ,KAAK,MAAM,CAAC,GAAG,EAAE;AACvC,cAAM,QAAQ,MAAM,SAAS,MAAM,QAAQ;AAC3C,cAAM,MAAM,iBAAiB,MAAM,KAAe,MAAM,KAAK;AAC7D,cAAM,IAAI,YAAY,MAAM,GAAG;AAC/B,yBAAiB,KAAqB;AACtC,cAAM,SAAS,KAAK,KAAK;AACzB,cAAM,KAAqB;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,OAAe;AACpB,QAAI,KAAK,SAAS,KAAK,QAAQ;AAC7B,YAAM,QAAQ,KAAK,OAAO,SAAS,KAAK;AACxC,UAAI,KAAK,WAAW;AAClB,aAAK,SAAS,KAAK,KAAK,OAAO,CAAC,GAAG,MAAM,MAAM,KAAK,CAAC;AAAA,MACvD,OAAO;AACL,aAAK,MAAM,OAAO,OAAO,CAAC;AAAA,MAC5B;AAEA,WAAK,OAAO,IAAI,YAAY,MAAM,GAAG;AACrC,WAAK,OAAO,SAAS,OAAO,OAAO,CAAC;AAAA,IACtC;AAAA,EACF;AAAA,EAEA,OAAO,OAAe,MAAkB;AACtC,QAAI,KAAK,SAAS,KAAK,UAAU,KAAK,UAAU;AAC9C,YAAM,QAAQ,KAAK,OAAO,SAAS,KAAK;AACxC,UAAI,KAAK,WAAW;AAClB,aAAK,SAAS,KAAK,MAAM,IAAI,CAAC,GAAG,MAAO,MAAM,QAAQ,EAAE,GAAG,GAAG,GAAG,KAAK,IAAI,CAAE,CAAC;AAAA,MAC/E,OAAO;AACL,aAAK,MAAM,KAAK,IAAI,EAAE,GAAG,KAAK,MAAM,KAAK,GAAG,GAAG,KAAK;AAAA,MACtD;AACA,YAAM,WAAW,KAAK,SAAS,KAAK,MAAM,KAAK,GAAG,KAAK;AACvD,eAAS,QAAQ,KAAK,OAAO,SAAS,SAAS,QAAQ;AACvD,eAAS,MAAM,MAAM;AACrB,WAAK,OAAO,SAAS,KAAK,IAAI;AAC9B,uBAAiB,UAA0B,KAAK;AAChD,YAAM,UAA0B,KAAK;AAAA,IACvC;AAAA,EACF;AACF;AAEA,UAAU,gBAAgB,CAAC,SAAS,UAAU;AAC5C,UAAQ,mBAAmB,OAAuB,MAAM,SAAS,CAAC,CAAC;AACnE,SAAO;AACT,CAAC;", + "sourcesContent": ["import { VnodeWithDom, createElement, directive, patch, updateAttributes } from \"valyrian.js\";\n\ninterface DataSetInterface {\n data: T[];\n // eslint-disable-next-line no-unused-vars\n reset: (data: T[]) => void;\n // eslint-disable-next-line no-unused-vars\n add: (...data: T[]) => void;\n // eslint-disable-next-line no-unused-vars\n update: (index: number, data: T) => void;\n // eslint-disable-next-line no-unused-vars\n delete: (index: number) => void;\n}\ninterface DataSetHandler {\n // eslint-disable-next-line no-unused-vars\n (data: T, index: number): VnodeWithDom;\n}\n\nfunction deepFreeze(obj: any) {\n if (typeof obj === \"object\" && obj !== null && !Object.isFrozen(obj)) {\n if (Array.isArray(obj)) {\n for (let i = 0, l = obj.length; i < l; i++) {\n deepFreeze(obj[i]);\n }\n } else {\n const props = Reflect.ownKeys(obj);\n for (let i = 0, l = props.length; i < l; i++) {\n deepFreeze(obj[props[i]]);\n }\n }\n Object.freeze(obj);\n }\n\n return obj;\n}\n\nexport class DataSet implements DataSetInterface {\n #vnode: VnodeWithDom | null = null;\n // eslint-disable-next-line no-unused-vars\n #handler: DataSetHandler | null = null;\n #data: T[] = [];\n #isFrozen = false;\n #dataProxy: T[] | null = null;\n\n get data() {\n if (this.#dataProxy === null) {\n throw new Error(\"DataSet is not initialized\");\n }\n\n return this.#dataProxy;\n }\n\n set data(data: T[]) {\n throw new Error(\"You need to use the reset method to set the data\");\n }\n\n #setData(data: T[]) {\n if (this.#isFrozen) {\n this.#data = deepFreeze([...data]);\n } else {\n this.#data = data;\n }\n this.#dataProxy = new Proxy(this.#data as T[], {\n set: () => {\n throw new Error(\"You need to use the add, update or delete methods to change the data\");\n },\n get(target: any, prop: string) {\n return target[prop];\n },\n deleteProperty: () => {\n throw new Error(\"You need to use the add, update or delete methods to change the data\");\n }\n }) as T[];\n }\n\n constructor(data: T[] = [], shouldFreeze = true) {\n this.#isFrozen = shouldFreeze;\n this.#setData(data);\n }\n\n setVnodeAndHandler(vnode: VnodeWithDom, handler: DataSetHandler) {\n this.#vnode = vnode;\n this.#handler = handler;\n this.reset(this.#data);\n }\n\n reset(data: T[]) {\n this.#setData(data);\n if (this.#vnode === null || this.#handler === null) {\n return;\n }\n\n const vnode = this.#vnode;\n const handler = this.#handler;\n\n if (data.length === 0) {\n vnode.children = [];\n vnode.dom.textContent = \"\";\n return;\n }\n\n const childrenLength = vnode.children.length;\n for (let i = 0, l = data.length; i < l; i++) {\n const child = handler(this.data[i], i);\n\n if (i < childrenLength) {\n const oldChild = vnode.children[i];\n child.isSVG = oldChild.isSVG;\n child.dom = oldChild.dom;\n updateAttributes(child as VnodeWithDom, null);\n vnode.children[i] = child;\n patch(child as VnodeWithDom);\n continue;\n }\n\n child.isSVG = vnode.isSVG || child.tag === \"svg\";\n child.dom = createElement(child.tag as string, child.isSVG);\n vnode.dom.appendChild(child.dom);\n updateAttributes(child as VnodeWithDom, null);\n vnode.children.push(child);\n patch(child as VnodeWithDom);\n }\n\n for (let i = data.length; i < childrenLength; i++) {\n vnode.dom.removeChild(vnode.children[i].dom);\n }\n vnode.children.length = data.length;\n }\n\n add(...data: T[]) {\n if (this.#data) {\n const oldLength = this.#data.length;\n if (this.#isFrozen) {\n this.#setData([...this.#data, ...data]);\n } else {\n this.#data.push(...data);\n }\n\n if (this.#vnode === null || this.#handler === null) {\n return;\n }\n\n const vnode = this.#vnode;\n const handler = this.#handler;\n\n for (let i = 0, ii = oldLength, l = data.length; i < l; i++, ii++) {\n const child = handler(this.#data[i], ii);\n child.isSVG = vnode.isSVG || child.tag === \"svg\";\n child.dom = createElement(child.tag as string, child.isSVG);\n vnode.dom.appendChild(child.dom);\n updateAttributes(child as VnodeWithDom, null);\n vnode.children.push(child);\n patch(child as VnodeWithDom);\n }\n }\n }\n\n delete(index: number) {\n if (this.#data && this.#vnode) {\n const child = this.#vnode.children[index];\n if (this.#isFrozen) {\n this.#setData(this.data.filter((_, i) => i !== index));\n } else {\n this.#data.splice(index, 1);\n }\n\n this.#vnode.dom.removeChild(child.dom);\n this.#vnode.children.splice(index, 1);\n }\n }\n\n update(index: number, item: Partial) {\n if (this.#data && this.#vnode && this.#handler) {\n const child = this.#vnode.children[index];\n if (this.#isFrozen) {\n this.#setData(this.#data.map((d, i) => (i === index ? { ...d, ...item } : d)));\n } else {\n this.#data[index] = { ...this.#data[index], ...item };\n }\n const newChild = this.#handler(this.#data[index], index);\n newChild.isSVG = this.#vnode.isSVG || newChild.tag === \"svg\";\n newChild.dom = child.dom;\n this.#vnode.children[index] = newChild;\n updateAttributes(newChild as VnodeWithDom, null);\n patch(newChild as VnodeWithDom);\n }\n }\n}\n\ndirective(\"with-dataset\", (dataSet: DataSet, vnode: VnodeWithDom) => {\n dataSet.setVnodeAndHandler(vnode, vnode.children[0]);\n return false;\n});\n"], + "mappings": ";AAAA,SAAuB,eAAe,WAAW,OAAO,wBAAwB;AAkBhF,SAAS,WAAW,KAAU;AAC5B,MAAI,OAAO,QAAQ,YAAY,QAAQ,QAAQ,CAAC,OAAO,SAAS,GAAG,GAAG;AACpE,QAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,eAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,IAAI,GAAG,KAAK;AAC1C,mBAAW,IAAI,CAAC,CAAC;AAAA,MACnB;AAAA,IACF,OAAO;AACL,YAAM,QAAQ,QAAQ,QAAQ,GAAG;AACjC,eAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,IAAI,GAAG,KAAK;AAC5C,mBAAW,IAAI,MAAM,CAAC,CAAC,CAAC;AAAA,MAC1B;AAAA,IACF;AACA,WAAO,OAAO,GAAG;AAAA,EACnB;AAEA,SAAO;AACT;AAEO,IAAM,UAAN,MAAgD;AAAA,EACrD,SAA8B;AAAA;AAAA,EAE9B,WAAqC;AAAA,EACrC,QAAa,CAAC;AAAA,EACd,YAAY;AAAA,EACZ,aAAyB;AAAA,EAEzB,IAAI,OAAO;AACT,QAAI,KAAK,eAAe,MAAM;AAC5B,YAAM,IAAI,MAAM,4BAA4B;AAAA,IAC9C;AAEA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,KAAK,MAAW;AAClB,UAAM,IAAI,MAAM,kDAAkD;AAAA,EACpE;AAAA,EAEA,SAAS,MAAW;AAClB,QAAI,KAAK,WAAW;AAClB,WAAK,QAAQ,WAAW,CAAC,GAAG,IAAI,CAAC;AAAA,IACnC,OAAO;AACL,WAAK,QAAQ;AAAA,IACf;AACA,SAAK,aAAa,IAAI,MAAM,KAAK,OAAc;AAAA,MAC7C,KAAK,MAAM;AACT,cAAM,IAAI,MAAM,sEAAsE;AAAA,MACxF;AAAA,MACA,IAAI,QAAa,MAAc;AAC7B,eAAO,OAAO,IAAI;AAAA,MACpB;AAAA,MACA,gBAAgB,MAAM;AACpB,cAAM,IAAI,MAAM,sEAAsE;AAAA,MACxF;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,YAAY,OAAY,CAAC,GAAG,eAAe,MAAM;AAC/C,SAAK,YAAY;AACjB,SAAK,SAAS,IAAI;AAAA,EACpB;AAAA,EAEA,mBAAmB,OAAqB,SAA4B;AAClE,SAAK,SAAS;AACd,SAAK,WAAW;AAChB,SAAK,MAAM,KAAK,KAAK;AAAA,EACvB;AAAA,EAEA,MAAM,MAAW;AACf,SAAK,SAAS,IAAI;AAClB,QAAI,KAAK,WAAW,QAAQ,KAAK,aAAa,MAAM;AAClD;AAAA,IACF;AAEA,UAAM,QAAQ,KAAK;AACnB,UAAM,UAAU,KAAK;AAErB,QAAI,KAAK,WAAW,GAAG;AACrB,YAAM,WAAW,CAAC;AAClB,YAAM,IAAI,cAAc;AACxB;AAAA,IACF;AAEA,UAAM,iBAAiB,MAAM,SAAS;AACtC,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,IAAI,GAAG,KAAK;AAC3C,YAAM,QAAQ,QAAQ,KAAK,KAAK,CAAC,GAAG,CAAC;AAErC,UAAI,IAAI,gBAAgB;AACtB,cAAM,WAAW,MAAM,SAAS,CAAC;AACjC,cAAM,QAAQ,SAAS;AACvB,cAAM,MAAM,SAAS;AACrB,yBAAiB,OAAuB,IAAI;AAC5C,cAAM,SAAS,CAAC,IAAI;AACpB,cAAM,KAAqB;AAC3B;AAAA,MACF;AAEA,YAAM,QAAQ,MAAM,SAAS,MAAM,QAAQ;AAC3C,YAAM,MAAM,cAAc,MAAM,KAAe,MAAM,KAAK;AAC1D,YAAM,IAAI,YAAY,MAAM,GAAG;AAC/B,uBAAiB,OAAuB,IAAI;AAC5C,YAAM,SAAS,KAAK,KAAK;AACzB,YAAM,KAAqB;AAAA,IAC7B;AAEA,aAAS,IAAI,KAAK,QAAQ,IAAI,gBAAgB,KAAK;AACjD,YAAM,IAAI,YAAY,MAAM,SAAS,CAAC,EAAE,GAAG;AAAA,IAC7C;AACA,UAAM,SAAS,SAAS,KAAK;AAAA,EAC/B;AAAA,EAEA,OAAO,MAAW;AAChB,QAAI,KAAK,OAAO;AACd,YAAM,YAAY,KAAK,MAAM;AAC7B,UAAI,KAAK,WAAW;AAClB,aAAK,SAAS,CAAC,GAAG,KAAK,OAAO,GAAG,IAAI,CAAC;AAAA,MACxC,OAAO;AACL,aAAK,MAAM,KAAK,GAAG,IAAI;AAAA,MACzB;AAEA,UAAI,KAAK,WAAW,QAAQ,KAAK,aAAa,MAAM;AAClD;AAAA,MACF;AAEA,YAAM,QAAQ,KAAK;AACnB,YAAM,UAAU,KAAK;AAErB,eAAS,IAAI,GAAG,KAAK,WAAW,IAAI,KAAK,QAAQ,IAAI,GAAG,KAAK,MAAM;AACjE,cAAM,QAAQ,QAAQ,KAAK,MAAM,CAAC,GAAG,EAAE;AACvC,cAAM,QAAQ,MAAM,SAAS,MAAM,QAAQ;AAC3C,cAAM,MAAM,cAAc,MAAM,KAAe,MAAM,KAAK;AAC1D,cAAM,IAAI,YAAY,MAAM,GAAG;AAC/B,yBAAiB,OAAuB,IAAI;AAC5C,cAAM,SAAS,KAAK,KAAK;AACzB,cAAM,KAAqB;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,OAAe;AACpB,QAAI,KAAK,SAAS,KAAK,QAAQ;AAC7B,YAAM,QAAQ,KAAK,OAAO,SAAS,KAAK;AACxC,UAAI,KAAK,WAAW;AAClB,aAAK,SAAS,KAAK,KAAK,OAAO,CAAC,GAAG,MAAM,MAAM,KAAK,CAAC;AAAA,MACvD,OAAO;AACL,aAAK,MAAM,OAAO,OAAO,CAAC;AAAA,MAC5B;AAEA,WAAK,OAAO,IAAI,YAAY,MAAM,GAAG;AACrC,WAAK,OAAO,SAAS,OAAO,OAAO,CAAC;AAAA,IACtC;AAAA,EACF;AAAA,EAEA,OAAO,OAAe,MAAkB;AACtC,QAAI,KAAK,SAAS,KAAK,UAAU,KAAK,UAAU;AAC9C,YAAM,QAAQ,KAAK,OAAO,SAAS,KAAK;AACxC,UAAI,KAAK,WAAW;AAClB,aAAK,SAAS,KAAK,MAAM,IAAI,CAAC,GAAG,MAAO,MAAM,QAAQ,EAAE,GAAG,GAAG,GAAG,KAAK,IAAI,CAAE,CAAC;AAAA,MAC/E,OAAO;AACL,aAAK,MAAM,KAAK,IAAI,EAAE,GAAG,KAAK,MAAM,KAAK,GAAG,GAAG,KAAK;AAAA,MACtD;AACA,YAAM,WAAW,KAAK,SAAS,KAAK,MAAM,KAAK,GAAG,KAAK;AACvD,eAAS,QAAQ,KAAK,OAAO,SAAS,SAAS,QAAQ;AACvD,eAAS,MAAM,MAAM;AACrB,WAAK,OAAO,SAAS,KAAK,IAAI;AAC9B,uBAAiB,UAA0B,IAAI;AAC/C,YAAM,QAAwB;AAAA,IAChC;AAAA,EACF;AACF;AAEA,UAAU,gBAAgB,CAAC,SAAuB,UAAwB;AACxE,UAAQ,mBAAmB,OAAO,MAAM,SAAS,CAAC,CAAC;AACnD,SAAO;AACT,CAAC;", "names": [] } diff --git a/dist/hooks/index.d.ts.map b/dist/hooks/index.d.ts.map index a05df96..76a6297 100644 --- a/dist/hooks/index.d.ts.map +++ b/dist/hooks/index.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/hooks/index.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,IAAI,GAAG,GAAG,CAAC;AAEvB,MAAM,WAAW,cAAc;IAE7B,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;IAElC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;IAE/C,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,GAAG,CAAC;IAEhC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,GAAG,CAAC;IAE/B,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,GAAG,CAAC;CACnC;AAED,MAAM,WAAW,UAAU;IAEzB,CAAC,cAAc,EAAE,cAAc,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;CAC3D;AAED,eAAO,MAAM,UAAU,YAiEG,CAAC;AAS3B,eAAO,MAAM,QAAQ,YA7EyB,GAAG,EAAE,KAAK,GAqGtD,CAAC;AAGH,eAAO,MAAM,SAAS,YAxGwB,GAAG,EAAE,KAAK,GA4JtD,CAAC;AAEH,eAAO,MAAM,MAAM,YA9J2B,GAAG,EAAE,KAAK,GAqKtD,CAAC;AAEH,eAAO,MAAM,WAAW,YAvKsB,GAAG,EAAE,KAAK,GAqLtD,CAAC;AAEH,eAAO,MAAM,OAAO,YAvL0B,GAAG,EAAE,KAAK,GAuMtD,CAAC"} \ No newline at end of file +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/hooks/index.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,IAAI,GAAG,GAAG,CAAC;AAEvB,MAAM,WAAW,cAAc;IAE7B,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;IAElC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;IAE/C,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,GAAG,CAAC;IAEhC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,GAAG,CAAC;IAE/B,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,GAAG,CAAC;CACnC;AAED,MAAM,WAAW,UAAU;IAEzB,CAAC,cAAc,EAAE,cAAc,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;CAC3D;AASD,eAAO,MAAM,UAAU,YAoCG,CAAC;AAS3B,eAAO,MAAM,QAAQ,YAvDyB,GAAG,EAAE,KAAK,GA8EtD,CAAC;AAGH,eAAO,MAAM,SAAS,YAjFwB,GAAG,EAAE,KAAK,GAqItD,CAAC;AAEH,eAAO,MAAM,MAAM,YAvI2B,GAAG,EAAE,KAAK,GA8ItD,CAAC;AAEH,eAAO,MAAM,WAAW,YAhJsB,GAAG,EAAE,KAAK,GA8JtD,CAAC;AAEH,eAAO,MAAM,OAAO,YAhK0B,GAAG,EAAE,KAAK,GAgLtD,CAAC"} \ No newline at end of file diff --git a/dist/hooks/index.js b/dist/hooks/index.js index 670c1f9..782b362 100644 --- a/dist/hooks/index.js +++ b/dist/hooks/index.js @@ -29,6 +29,7 @@ __export(hooks_exports, { }); module.exports = __toCommonJS(hooks_exports); var import_valyrian = require("valyrian.js"); +var componentToHooksWeakMap = /* @__PURE__ */ new WeakMap(); var createHook = function createHook2({ onCreate, onUpdate: onUpdateHook, @@ -37,42 +38,26 @@ var createHook = function createHook2({ returnValue }) { return (...args) => { - const { component, vnode } = import_valyrian.current; + const component = import_valyrian.current.component; let hook = null; - if (vnode) { - if (!vnode.components) { - vnode.components = []; - } - if (vnode.components.indexOf(component) === -1) { - vnode.hook_calls = -1; - vnode.components.push(component); - if (!component.hooks) { - component.hooks = []; - (0, import_valyrian.onUnmount)(() => Reflect.deleteProperty(component, "hooks")); - } - } - hook = component.hooks[++vnode.hook_calls]; + if (componentToHooksWeakMap.has(component) === false) { + const HookCalls2 = { hooks: [], hook_calls: -1 }; + componentToHooksWeakMap.set(component, HookCalls2); + (0, import_valyrian.onUnmount)(() => componentToHooksWeakMap.delete(component)); + } + const HookCalls = componentToHooksWeakMap.get(component); + (0, import_valyrian.onCleanup)(() => HookCalls.hook_calls = -1); + hook = HookCalls.hooks[++HookCalls.hook_calls]; + if (hook) { + onUpdateHook && onUpdateHook(hook, ...args); } if (!hook) { hook = onCreate(...args); - if (vnode) { - component.hooks.push(hook); - } - if (onRemove) { - (0, import_valyrian.onUnmount)(() => onRemove(hook)); - } - } else { - if (onUpdateHook) { - onUpdateHook(hook, ...args); - } - } - if (onCleanupHook) { - (0, import_valyrian.onCleanup)(() => onCleanupHook(hook)); + HookCalls.hooks.push(hook); + onRemove && (0, import_valyrian.onUnmount)(() => onRemove(hook)); } - if (returnValue) { - return returnValue(hook); - } - return hook; + onCleanupHook && (0, import_valyrian.onCleanup)(() => onCleanupHook(hook)); + return returnValue ? returnValue(hook) : hook; }; }; var updateTimeout; diff --git a/dist/hooks/index.js.map b/dist/hooks/index.js.map index 1f2bca4..bdb3594 100644 --- a/dist/hooks/index.js.map +++ b/dist/hooks/index.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../lib/hooks/index.ts"], - "sourcesContent": ["import { Component, POJOComponent, VnodeWithDom, current, directive, onCleanup, onUnmount, update } from \"valyrian.js\";\n\ninterface CurrentOnPatch {\n component: Component | POJOComponent;\n vnode: VnodeWithDom;\n oldVnode: VnodeWithDom;\n}\n\nexport type Hook = any;\n\nexport interface HookDefinition {\n // eslint-disable-next-line no-unused-vars\n onCreate: (...args: any[]) => any;\n // eslint-disable-next-line no-unused-vars\n onUpdate?: (hook: Hook, ...args: any[]) => any;\n // eslint-disable-next-line no-unused-vars\n onCleanup?: (hook: Hook) => any;\n // eslint-disable-next-line no-unused-vars\n onRemove?: (hook: Hook) => any;\n // eslint-disable-next-line no-unused-vars\n returnValue?: (hook: Hook) => any;\n}\n\nexport interface CreateHook {\n // eslint-disable-next-line no-unused-vars\n (HookDefinition: HookDefinition): (...args: any[]) => any;\n}\n\nexport const createHook = function createHook({\n onCreate,\n onUpdate: onUpdateHook,\n onCleanup: onCleanupHook,\n onRemove,\n returnValue\n}: HookDefinition): Hook {\n return (...args: any[]) => {\n const { component, vnode } = current as CurrentOnPatch;\n\n let hook: any = null;\n\n if (vnode) {\n // Init the components array for the current vnode\n if (!vnode.components) {\n vnode.components = [];\n }\n\n if (vnode.components.indexOf(component) === -1) {\n vnode.hook_calls = -1;\n vnode.components.push(component);\n if (!component.hooks) {\n component.hooks = [];\n onUnmount(() => Reflect.deleteProperty(component, \"hooks\"));\n }\n }\n\n hook = component.hooks[++vnode.hook_calls];\n }\n\n // If the hook doesn't exist, create it\n if (!hook) {\n // create a new hook\n hook = onCreate(...args);\n\n if (vnode) {\n // Add the hook to the component\n component.hooks.push(hook);\n }\n\n // if we have a onRemove hook, add it to the onUnmount set\n if (onRemove) {\n // Add the hook to the onRemove array\n onUnmount(() => onRemove(hook));\n }\n } else {\n if (onUpdateHook) {\n onUpdateHook(hook, ...args);\n }\n }\n\n // If we have an onCleanup function, add it to the cleanup set\n if (onCleanupHook) {\n // Add the hook to the onCleanup set\n onCleanup(() => onCleanupHook(hook));\n }\n\n // If we have a returnValue function, call it and return the result instead of the hook\n if (returnValue) {\n return returnValue(hook);\n }\n\n // Return the hook\n return hook;\n };\n} as unknown as CreateHook;\n\nlet updateTimeout: any;\nfunction delayedUpdate() {\n clearTimeout(updateTimeout);\n updateTimeout = setTimeout(update);\n}\n\n// Use state hook\nexport const useState = createHook({\n onCreate: (value) => {\n function get() {\n return value;\n }\n get.value = value;\n get.toJSON = get.valueOf = get;\n get.toString = () => `${value}`;\n\n function set(newValue: any) {\n // Prevent default event if it exists\n if (current.event) {\n current.event.preventDefault();\n }\n\n if (value !== newValue) {\n value = newValue;\n get.value = newValue;\n delayedUpdate();\n }\n }\n\n return [get, set];\n }\n});\n\n// Effect hook\nexport const useEffect = createHook({\n onCreate: (effect: Function, changes: any[]) => {\n const hook: {\n effect: Function;\n prev: any[];\n onRemove?: Function;\n onCleanup?: Function;\n } = { effect, prev: [] };\n // on unmount\n if (changes === null) {\n hook.onRemove = effect;\n return hook;\n }\n\n // on create\n hook.prev = changes;\n hook.onCleanup = hook.effect();\n return hook;\n },\n onUpdate: (hook, effect, changes) => {\n // on update\n if (typeof changes === \"undefined\") {\n hook.prev = changes;\n if (typeof hook.onCleanup === \"function\") {\n hook.onCleanup();\n }\n hook.onCleanup = hook.effect();\n return;\n }\n\n // on update if there are changes\n if (Array.isArray(changes)) {\n for (let i = 0, l = changes.length; i < l; i++) {\n if (changes[i] !== hook.prev[i]) {\n hook.prev = changes;\n if (typeof hook.onCleanup === \"function\") {\n hook.onCleanup();\n }\n hook.onCleanup = hook.effect();\n return;\n }\n }\n }\n },\n onRemove: (hook) => {\n if (typeof hook.onCleanup === \"function\") {\n hook.onCleanup();\n }\n if (typeof hook.onRemove === \"function\") {\n hook.onRemove();\n }\n }\n});\n\nexport const useRef = createHook({\n onCreate: (initialValue) => {\n directive(\"ref\", (ref, vnode) => {\n ref.current = vnode.dom;\n });\n return { current: initialValue };\n }\n});\n\nexport const useCallback = createHook({\n onCreate: (callback, changes) => {\n callback();\n return { callback, changes };\n },\n onUpdate: (hook, callback, changes) => {\n for (let i = 0, l = changes.length; i < l; i++) {\n if (changes[i] !== hook.changes[i]) {\n hook.changes = changes;\n hook.callback();\n return;\n }\n }\n }\n});\n\nexport const useMemo = createHook({\n onCreate: (callback, changes) => {\n return { callback, changes, value: callback() };\n },\n onUpdate: (hook, callback, changes) => {\n for (let i = 0, l = changes.length; i < l; i++) {\n if (changes[i] !== hook.changes[i]) {\n hook.changes = changes;\n hook.value = callback();\n return;\n }\n }\n },\n returnValue: (hook) => {\n return hook.value;\n }\n});\n"], - "mappings": "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", - "names": ["createHook"] + "sourcesContent": ["import { Component, POJOComponent, current, directive, onCleanup, onUnmount, update } from \"valyrian.js\";\n\nexport type Hook = any;\n\nexport interface HookDefinition {\n // eslint-disable-next-line no-unused-vars\n onCreate: (...args: any[]) => any;\n // eslint-disable-next-line no-unused-vars\n onUpdate?: (hook: Hook, ...args: any[]) => any;\n // eslint-disable-next-line no-unused-vars\n onCleanup?: (hook: Hook) => any;\n // eslint-disable-next-line no-unused-vars\n onRemove?: (hook: Hook) => any;\n // eslint-disable-next-line no-unused-vars\n returnValue?: (hook: Hook) => any;\n}\n\nexport interface CreateHook {\n // eslint-disable-next-line no-unused-vars\n (HookDefinition: HookDefinition): (...args: any[]) => any;\n}\n\ntype HookCalls = {\n hooks: Hook[];\n hook_calls: number;\n};\n\nconst componentToHooksWeakMap = new WeakMap();\n\nexport const createHook = function createHook({\n onCreate,\n onUpdate: onUpdateHook,\n onCleanup: onCleanupHook,\n onRemove,\n returnValue\n}: HookDefinition): Hook {\n return (...args: any[]) => {\n const component = current.component as Component | POJOComponent;\n let hook: any = null;\n\n if (componentToHooksWeakMap.has(component) === false) {\n const HookCalls = { hooks: [], hook_calls: -1 };\n componentToHooksWeakMap.set(component, HookCalls);\n onUnmount(() => componentToHooksWeakMap.delete(component));\n }\n\n const HookCalls = componentToHooksWeakMap.get(component) as HookCalls;\n onCleanup(() => (HookCalls.hook_calls = -1));\n\n hook = HookCalls.hooks[++HookCalls.hook_calls];\n\n if (hook) {\n onUpdateHook && onUpdateHook(hook, ...args);\n }\n\n // If the hook doesn't exist, create it\n if (!hook) {\n hook = onCreate(...args);\n HookCalls.hooks.push(hook);\n onRemove && onUnmount(() => onRemove(hook));\n }\n\n onCleanupHook && onCleanup(() => onCleanupHook(hook));\n return returnValue ? returnValue(hook) : hook;\n };\n} as unknown as CreateHook;\n\nlet updateTimeout: any;\nfunction delayedUpdate() {\n clearTimeout(updateTimeout);\n updateTimeout = setTimeout(update);\n}\n\n// Use state hook\nexport const useState = createHook({\n onCreate: (value) => {\n function get() {\n return value;\n }\n get.value = value;\n get.toJSON = get.valueOf = get;\n get.toString = () => `${value}`;\n\n function set(newValue: any) {\n if (current.event) {\n current.event.preventDefault();\n }\n\n if (value !== newValue) {\n value = newValue;\n get.value = newValue;\n delayedUpdate();\n }\n }\n\n return [get, set];\n }\n});\n\n// Effect hook\nexport const useEffect = createHook({\n onCreate: (effect: Function, changes: any[]) => {\n const hook: {\n effect: Function;\n prev: any[];\n onRemove?: Function;\n onCleanup?: Function;\n } = { effect, prev: [] };\n // on unmount\n if (changes === null) {\n hook.onRemove = effect;\n return hook;\n }\n\n // on create\n hook.prev = changes;\n hook.onCleanup = hook.effect();\n return hook;\n },\n onUpdate: (hook, effect, changes) => {\n // on update\n if (typeof changes === \"undefined\") {\n hook.prev = changes;\n if (typeof hook.onCleanup === \"function\") {\n hook.onCleanup();\n }\n hook.onCleanup = hook.effect();\n return;\n }\n\n // on update if there are changes\n if (Array.isArray(changes)) {\n for (let i = 0, l = changes.length; i < l; i++) {\n if (changes[i] !== hook.prev[i]) {\n hook.prev = changes;\n if (typeof hook.onCleanup === \"function\") {\n hook.onCleanup();\n }\n hook.onCleanup = hook.effect();\n return;\n }\n }\n }\n },\n onRemove: (hook) => {\n if (typeof hook.onCleanup === \"function\") {\n hook.onCleanup();\n }\n if (typeof hook.onRemove === \"function\") {\n hook.onRemove();\n }\n }\n});\n\nexport const useRef = createHook({\n onCreate: (initialValue) => {\n directive(\"ref\", (ref, vnode) => {\n ref.current = vnode.dom;\n });\n return { current: initialValue };\n }\n});\n\nexport const useCallback = createHook({\n onCreate: (callback, changes) => {\n callback();\n return { callback, changes };\n },\n onUpdate: (hook, callback, changes) => {\n for (let i = 0, l = changes.length; i < l; i++) {\n if (changes[i] !== hook.changes[i]) {\n hook.changes = changes;\n hook.callback();\n return;\n }\n }\n }\n});\n\nexport const useMemo = createHook({\n onCreate: (callback, changes) => {\n return { callback, changes, value: callback() };\n },\n onUpdate: (hook, callback, changes) => {\n for (let i = 0, l = changes.length; i < l; i++) {\n if (changes[i] !== hook.changes[i]) {\n hook.changes = changes;\n hook.value = callback();\n return;\n }\n }\n },\n returnValue: (hook) => {\n return hook.value;\n }\n});\n"], + "mappings": "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", + "names": ["createHook", "HookCalls"] } diff --git a/dist/hooks/index.mjs b/dist/hooks/index.mjs index 4a4c1eb..084d90c 100644 --- a/dist/hooks/index.mjs +++ b/dist/hooks/index.mjs @@ -1,5 +1,6 @@ // lib/hooks/index.ts import { current, directive, onCleanup, onUnmount, update } from "valyrian.js"; +var componentToHooksWeakMap = /* @__PURE__ */ new WeakMap(); var createHook = function createHook2({ onCreate, onUpdate: onUpdateHook, @@ -8,42 +9,26 @@ var createHook = function createHook2({ returnValue }) { return (...args) => { - const { component, vnode } = current; + const component = current.component; let hook = null; - if (vnode) { - if (!vnode.components) { - vnode.components = []; - } - if (vnode.components.indexOf(component) === -1) { - vnode.hook_calls = -1; - vnode.components.push(component); - if (!component.hooks) { - component.hooks = []; - onUnmount(() => Reflect.deleteProperty(component, "hooks")); - } - } - hook = component.hooks[++vnode.hook_calls]; + if (componentToHooksWeakMap.has(component) === false) { + const HookCalls2 = { hooks: [], hook_calls: -1 }; + componentToHooksWeakMap.set(component, HookCalls2); + onUnmount(() => componentToHooksWeakMap.delete(component)); + } + const HookCalls = componentToHooksWeakMap.get(component); + onCleanup(() => HookCalls.hook_calls = -1); + hook = HookCalls.hooks[++HookCalls.hook_calls]; + if (hook) { + onUpdateHook && onUpdateHook(hook, ...args); } if (!hook) { hook = onCreate(...args); - if (vnode) { - component.hooks.push(hook); - } - if (onRemove) { - onUnmount(() => onRemove(hook)); - } - } else { - if (onUpdateHook) { - onUpdateHook(hook, ...args); - } - } - if (onCleanupHook) { - onCleanup(() => onCleanupHook(hook)); + HookCalls.hooks.push(hook); + onRemove && onUnmount(() => onRemove(hook)); } - if (returnValue) { - return returnValue(hook); - } - return hook; + onCleanupHook && onCleanup(() => onCleanupHook(hook)); + return returnValue ? returnValue(hook) : hook; }; }; var updateTimeout; diff --git a/dist/hooks/index.mjs.map b/dist/hooks/index.mjs.map index 136bf8e..0df4bb2 100644 --- a/dist/hooks/index.mjs.map +++ b/dist/hooks/index.mjs.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../lib/hooks/index.ts"], - "sourcesContent": ["import { Component, POJOComponent, VnodeWithDom, current, directive, onCleanup, onUnmount, update } from \"valyrian.js\";\n\ninterface CurrentOnPatch {\n component: Component | POJOComponent;\n vnode: VnodeWithDom;\n oldVnode: VnodeWithDom;\n}\n\nexport type Hook = any;\n\nexport interface HookDefinition {\n // eslint-disable-next-line no-unused-vars\n onCreate: (...args: any[]) => any;\n // eslint-disable-next-line no-unused-vars\n onUpdate?: (hook: Hook, ...args: any[]) => any;\n // eslint-disable-next-line no-unused-vars\n onCleanup?: (hook: Hook) => any;\n // eslint-disable-next-line no-unused-vars\n onRemove?: (hook: Hook) => any;\n // eslint-disable-next-line no-unused-vars\n returnValue?: (hook: Hook) => any;\n}\n\nexport interface CreateHook {\n // eslint-disable-next-line no-unused-vars\n (HookDefinition: HookDefinition): (...args: any[]) => any;\n}\n\nexport const createHook = function createHook({\n onCreate,\n onUpdate: onUpdateHook,\n onCleanup: onCleanupHook,\n onRemove,\n returnValue\n}: HookDefinition): Hook {\n return (...args: any[]) => {\n const { component, vnode } = current as CurrentOnPatch;\n\n let hook: any = null;\n\n if (vnode) {\n // Init the components array for the current vnode\n if (!vnode.components) {\n vnode.components = [];\n }\n\n if (vnode.components.indexOf(component) === -1) {\n vnode.hook_calls = -1;\n vnode.components.push(component);\n if (!component.hooks) {\n component.hooks = [];\n onUnmount(() => Reflect.deleteProperty(component, \"hooks\"));\n }\n }\n\n hook = component.hooks[++vnode.hook_calls];\n }\n\n // If the hook doesn't exist, create it\n if (!hook) {\n // create a new hook\n hook = onCreate(...args);\n\n if (vnode) {\n // Add the hook to the component\n component.hooks.push(hook);\n }\n\n // if we have a onRemove hook, add it to the onUnmount set\n if (onRemove) {\n // Add the hook to the onRemove array\n onUnmount(() => onRemove(hook));\n }\n } else {\n if (onUpdateHook) {\n onUpdateHook(hook, ...args);\n }\n }\n\n // If we have an onCleanup function, add it to the cleanup set\n if (onCleanupHook) {\n // Add the hook to the onCleanup set\n onCleanup(() => onCleanupHook(hook));\n }\n\n // If we have a returnValue function, call it and return the result instead of the hook\n if (returnValue) {\n return returnValue(hook);\n }\n\n // Return the hook\n return hook;\n };\n} as unknown as CreateHook;\n\nlet updateTimeout: any;\nfunction delayedUpdate() {\n clearTimeout(updateTimeout);\n updateTimeout = setTimeout(update);\n}\n\n// Use state hook\nexport const useState = createHook({\n onCreate: (value) => {\n function get() {\n return value;\n }\n get.value = value;\n get.toJSON = get.valueOf = get;\n get.toString = () => `${value}`;\n\n function set(newValue: any) {\n // Prevent default event if it exists\n if (current.event) {\n current.event.preventDefault();\n }\n\n if (value !== newValue) {\n value = newValue;\n get.value = newValue;\n delayedUpdate();\n }\n }\n\n return [get, set];\n }\n});\n\n// Effect hook\nexport const useEffect = createHook({\n onCreate: (effect: Function, changes: any[]) => {\n const hook: {\n effect: Function;\n prev: any[];\n onRemove?: Function;\n onCleanup?: Function;\n } = { effect, prev: [] };\n // on unmount\n if (changes === null) {\n hook.onRemove = effect;\n return hook;\n }\n\n // on create\n hook.prev = changes;\n hook.onCleanup = hook.effect();\n return hook;\n },\n onUpdate: (hook, effect, changes) => {\n // on update\n if (typeof changes === \"undefined\") {\n hook.prev = changes;\n if (typeof hook.onCleanup === \"function\") {\n hook.onCleanup();\n }\n hook.onCleanup = hook.effect();\n return;\n }\n\n // on update if there are changes\n if (Array.isArray(changes)) {\n for (let i = 0, l = changes.length; i < l; i++) {\n if (changes[i] !== hook.prev[i]) {\n hook.prev = changes;\n if (typeof hook.onCleanup === \"function\") {\n hook.onCleanup();\n }\n hook.onCleanup = hook.effect();\n return;\n }\n }\n }\n },\n onRemove: (hook) => {\n if (typeof hook.onCleanup === \"function\") {\n hook.onCleanup();\n }\n if (typeof hook.onRemove === \"function\") {\n hook.onRemove();\n }\n }\n});\n\nexport const useRef = createHook({\n onCreate: (initialValue) => {\n directive(\"ref\", (ref, vnode) => {\n ref.current = vnode.dom;\n });\n return { current: initialValue };\n }\n});\n\nexport const useCallback = createHook({\n onCreate: (callback, changes) => {\n callback();\n return { callback, changes };\n },\n onUpdate: (hook, callback, changes) => {\n for (let i = 0, l = changes.length; i < l; i++) {\n if (changes[i] !== hook.changes[i]) {\n hook.changes = changes;\n hook.callback();\n return;\n }\n }\n }\n});\n\nexport const useMemo = createHook({\n onCreate: (callback, changes) => {\n return { callback, changes, value: callback() };\n },\n onUpdate: (hook, callback, changes) => {\n for (let i = 0, l = changes.length; i < l; i++) {\n if (changes[i] !== hook.changes[i]) {\n hook.changes = changes;\n hook.value = callback();\n return;\n }\n }\n },\n returnValue: (hook) => {\n return hook.value;\n }\n});\n"], - "mappings": "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", - "names": ["createHook"] + "sourcesContent": ["import { Component, POJOComponent, current, directive, onCleanup, onUnmount, update } from \"valyrian.js\";\n\nexport type Hook = any;\n\nexport interface HookDefinition {\n // eslint-disable-next-line no-unused-vars\n onCreate: (...args: any[]) => any;\n // eslint-disable-next-line no-unused-vars\n onUpdate?: (hook: Hook, ...args: any[]) => any;\n // eslint-disable-next-line no-unused-vars\n onCleanup?: (hook: Hook) => any;\n // eslint-disable-next-line no-unused-vars\n onRemove?: (hook: Hook) => any;\n // eslint-disable-next-line no-unused-vars\n returnValue?: (hook: Hook) => any;\n}\n\nexport interface CreateHook {\n // eslint-disable-next-line no-unused-vars\n (HookDefinition: HookDefinition): (...args: any[]) => any;\n}\n\ntype HookCalls = {\n hooks: Hook[];\n hook_calls: number;\n};\n\nconst componentToHooksWeakMap = new WeakMap();\n\nexport const createHook = function createHook({\n onCreate,\n onUpdate: onUpdateHook,\n onCleanup: onCleanupHook,\n onRemove,\n returnValue\n}: HookDefinition): Hook {\n return (...args: any[]) => {\n const component = current.component as Component | POJOComponent;\n let hook: any = null;\n\n if (componentToHooksWeakMap.has(component) === false) {\n const HookCalls = { hooks: [], hook_calls: -1 };\n componentToHooksWeakMap.set(component, HookCalls);\n onUnmount(() => componentToHooksWeakMap.delete(component));\n }\n\n const HookCalls = componentToHooksWeakMap.get(component) as HookCalls;\n onCleanup(() => (HookCalls.hook_calls = -1));\n\n hook = HookCalls.hooks[++HookCalls.hook_calls];\n\n if (hook) {\n onUpdateHook && onUpdateHook(hook, ...args);\n }\n\n // If the hook doesn't exist, create it\n if (!hook) {\n hook = onCreate(...args);\n HookCalls.hooks.push(hook);\n onRemove && onUnmount(() => onRemove(hook));\n }\n\n onCleanupHook && onCleanup(() => onCleanupHook(hook));\n return returnValue ? returnValue(hook) : hook;\n };\n} as unknown as CreateHook;\n\nlet updateTimeout: any;\nfunction delayedUpdate() {\n clearTimeout(updateTimeout);\n updateTimeout = setTimeout(update);\n}\n\n// Use state hook\nexport const useState = createHook({\n onCreate: (value) => {\n function get() {\n return value;\n }\n get.value = value;\n get.toJSON = get.valueOf = get;\n get.toString = () => `${value}`;\n\n function set(newValue: any) {\n if (current.event) {\n current.event.preventDefault();\n }\n\n if (value !== newValue) {\n value = newValue;\n get.value = newValue;\n delayedUpdate();\n }\n }\n\n return [get, set];\n }\n});\n\n// Effect hook\nexport const useEffect = createHook({\n onCreate: (effect: Function, changes: any[]) => {\n const hook: {\n effect: Function;\n prev: any[];\n onRemove?: Function;\n onCleanup?: Function;\n } = { effect, prev: [] };\n // on unmount\n if (changes === null) {\n hook.onRemove = effect;\n return hook;\n }\n\n // on create\n hook.prev = changes;\n hook.onCleanup = hook.effect();\n return hook;\n },\n onUpdate: (hook, effect, changes) => {\n // on update\n if (typeof changes === \"undefined\") {\n hook.prev = changes;\n if (typeof hook.onCleanup === \"function\") {\n hook.onCleanup();\n }\n hook.onCleanup = hook.effect();\n return;\n }\n\n // on update if there are changes\n if (Array.isArray(changes)) {\n for (let i = 0, l = changes.length; i < l; i++) {\n if (changes[i] !== hook.prev[i]) {\n hook.prev = changes;\n if (typeof hook.onCleanup === \"function\") {\n hook.onCleanup();\n }\n hook.onCleanup = hook.effect();\n return;\n }\n }\n }\n },\n onRemove: (hook) => {\n if (typeof hook.onCleanup === \"function\") {\n hook.onCleanup();\n }\n if (typeof hook.onRemove === \"function\") {\n hook.onRemove();\n }\n }\n});\n\nexport const useRef = createHook({\n onCreate: (initialValue) => {\n directive(\"ref\", (ref, vnode) => {\n ref.current = vnode.dom;\n });\n return { current: initialValue };\n }\n});\n\nexport const useCallback = createHook({\n onCreate: (callback, changes) => {\n callback();\n return { callback, changes };\n },\n onUpdate: (hook, callback, changes) => {\n for (let i = 0, l = changes.length; i < l; i++) {\n if (changes[i] !== hook.changes[i]) {\n hook.changes = changes;\n hook.callback();\n return;\n }\n }\n }\n});\n\nexport const useMemo = createHook({\n onCreate: (callback, changes) => {\n return { callback, changes, value: callback() };\n },\n onUpdate: (hook, callback, changes) => {\n for (let i = 0, l = changes.length; i < l; i++) {\n if (changes[i] !== hook.changes[i]) {\n hook.changes = changes;\n hook.value = callback();\n return;\n }\n }\n },\n returnValue: (hook) => {\n return hook.value;\n }\n});\n"], + "mappings": "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", + "names": ["createHook", "HookCalls"] } diff --git a/dist/index.d.ts b/dist/index.d.ts index 147f40f..e88875d 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -1,10 +1,5 @@ declare global { var document: Document; - namespace JSX { - interface IntrinsicElements { - [elemName: string]: any; - } - } } interface DefaultRecord extends Record { } @@ -26,7 +21,7 @@ export interface VnodeComponentInterface extends Vnode { export interface Children extends Array { } export interface Directive { - (vnode: VnodeWithDom, oldProps: VnodeProperties | null): void | boolean; + (value: any, vnode: VnodeWithDom, oldProps: VnodeProperties | null): void | boolean; } export declare const isNodeJs: boolean; export declare class Vnode { @@ -45,8 +40,12 @@ export interface VnodeWithDom extends Vnode { export declare const isComponent: (component: unknown) => component is Component; export declare const isVnode: (object?: unknown) => object is Vnode; export declare const isVnodeComponent: (object?: unknown) => object is VnodeComponentInterface; -export declare function domToVnode(dom: any): VnodeWithDom; -export declare function trust(htmlString: string): VnodeWithDom[]; +export declare function v(tagOrComponent: string | Component, props: VnodeProperties, ...children: Children): Vnode; +export declare namespace v { + var fragment: (_: VnodeProperties, ...children: Children) => Children; +} +export declare function domToVnode(dom: any): VnodeWithDom | void; +export declare function trust(htmlString: string): (void | VnodeWithDom)[]; export declare const current: { vnode: Vnode | null; component: ValyrianComponent | null; @@ -60,14 +59,12 @@ export declare const onUnmount: (callback: Function) => false | Set; export declare const directives: Record; export declare function directive(name: string, directive: Directive): void; export declare function setAttribute(name: string, value: any, newVnode: VnodeWithDom): void; +export declare function updateAttributes(newVnode: VnodeWithDom, oldProps: VnodeProperties | null): void; +export declare function createElement(tag: string, isSVG: boolean): DomElement; export declare function patch(newVnode: VnodeWithDom): void; -export declare function update(): void | string; export declare function updateVnode(vnode: VnodeWithDom): string | void; +export declare function update(): void | string; export declare function unmount(): string | void; export declare function mount(dom: string | DomElement, component: any): string | void; -export declare function v(tagOrComponent: string | Component, props: VnodeProperties, ...children: Children): Vnode; -export declare namespace v { - var fragment: (_: VnodeProperties, ...children: Children) => Children; -} export {}; //# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/index.d.ts.map b/dist/index.d.ts.map index b1d1422..8f3f791 100644 --- a/dist/index.d.ts.map +++ b/dist/index.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,CAAC;IACb,IAAI,QAAQ,EAAE,QAAQ,CAAC;IACvB,UAAU,GAAG,CAAC;QACZ,UAAU,iBAAiB;YACzB,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAC;SACzB;KACF;CACF;AAED,UAAU,aAAc,SAAQ,MAAM,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,CAAC;CAAG;AAExE,MAAM,WAAW,eAAgB,SAAQ,aAAa;IACpD,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,UAAW,SAAQ,OAAO,EAAE,aAAa;CAAG;AAE7D,MAAM,WAAW,SAAU,SAAQ,aAAa;IAC9C,CAAC,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,KAAK,GAAG,GAAG,CAAC;CACxD;AAED,MAAM,WAAW,aAAc,SAAQ,aAAa;IAClD,IAAI,EAAE,SAAS,CAAC;CACjB;AAED,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,aAAa,CAAC;AAE1D,MAAM,WAAW,uBAAwB,SAAQ,KAAK;IACpD,GAAG,EAAE,iBAAiB,CAAC;CACxB;AAED,MAAM,WAAW,QAAS,SAAQ,KAAK,CAAC,KAAK,GAAG,uBAAuB,GAAG,iBAAiB,GAAG,GAAG,CAAC;CAAG;AAErG,MAAM,WAAW,SAAS;IACxB,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,eAAe,GAAG,IAAI,GAAG,IAAI,GAAG,OAAO,CAAC;CACzE;AAED,eAAO,MAAM,QAAQ,SAAuF,CAAC;AAE7G,qBAAa,KAAK;IAEP,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,aAAa;IACvC,KAAK,EAAE,IAAI,GAAG,eAAe;IAC7B,QAAQ,EAAE,QAAQ;IAClB,GAAG,CAAC;IACJ,KAAK,CAAC;gBAJN,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,aAAa,EACvC,KAAK,EAAE,IAAI,GAAG,eAAe,EAC7B,QAAQ,EAAE,QAAQ,EAClB,GAAG,CAAC,wBAAY,EAChB,KAAK,CAAC,qBAAS;CAEzB;AAED,MAAM,WAAW,YAAa,SAAQ,KAAK;IACzC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,UAAU,CAAC;IAChB,KAAK,EAAE,eAAe,CAAC;CACxB;AAED,eAAO,MAAM,WAAW,cAAe,OAAO,2BAA4D,CAAC;AAC3G,eAAO,MAAM,OAAO,YAAa,OAAO,oBAA6C,CAAC;AAEtF,eAAO,MAAM,gBAAgB,YAAa,OAAO,sCAEhD,CAAC;AAEF,wBAAgB,UAAU,CAAC,GAAG,EAAE,GAAG,GAAG,YAAY,CA0BjD;AAED,wBAAgB,KAAK,CAAC,UAAU,EAAE,MAAM,kBAIvC;AAMD,eAAO,MAAM,OAAO;;;;CAInB,CAAC;AAEF,eAAO,MAAM,aAAa,aAcxB,CAAC;AAMH,eAAO,MAAM,OAAO,aAAc,QAAQ,0BAA2C,CAAC;AACtF,eAAO,MAAM,QAAQ,aAAc,QAAQ,kBAA8B,CAAC;AAC1E,eAAO,MAAM,SAAS,aAAc,QAAQ,kBAA+B,CAAC;AAC5E,eAAO,MAAM,SAAS,aAAc,QAAQ,0BAA6C,CAAC;AAQ1F,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAyNhD,CAAC;AAEF,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,QAI3D;AA+CD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI,CAKnF;AA+KD,wBAAgB,KAAK,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CA8ElD;AAED,wBAAgB,MAAM,IAAI,IAAI,GAAG,MAAM,CAKtC;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,GAAG,IAAI,CAU9D;AAED,wBAAgB,OAAO,kBAiBtB;AAED,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,EAAE,SAAS,EAAE,GAAG,iBAe7D;AAED,wBAAgB,CAAC,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,QAAQ,EAAE,QAAQ,SAElG;yBAFe,CAAC"} \ No newline at end of file +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/index.js b/dist/index.js index 71818ba..dad15df 100644 --- a/dist/index.js +++ b/dist/index.js @@ -21,6 +21,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru var lib_exports = {}; __export(lib_exports, { Vnode: () => Vnode, + createElement: () => createElement, current: () => current, directive: () => directive, directives: () => directives, @@ -40,6 +41,7 @@ __export(lib_exports, { trust: () => trust, unmount: () => unmount, update: () => update, + updateAttributes: () => updateAttributes, updateVnode: () => updateVnode, v: () => v }); @@ -54,33 +56,42 @@ var Vnode = class { this.isSVG = isSVG; } }; -var isComponent = (component) => typeof component === "function"; +var isComponent = (component) => Boolean(typeof component === "function" || component && typeof component === "object" && "view" in component); var isVnode = (object) => object instanceof Vnode; var isVnodeComponent = (object) => { return isVnode(object) && isComponent(object.tag); }; +function v(tagOrComponent, props, ...children) { + return new Vnode(tagOrComponent, props, children); +} +v.fragment = (_, ...children) => children; function domToVnode(dom) { if (dom.nodeType === 3) { return dom.nodeValue; } - const vnode = new Vnode(dom.nodeName.toLowerCase(), {}, []); - vnode.dom = dom; - dom.props = vnode.props; - for (let i = 0, l = dom.childNodes.length; i < l; i++) { - const childDom = dom.childNodes[i]; - if (childDom.nodeType === 3) { - vnode.children.push(childDom.nodeValue); - } else if (childDom.nodeType === 1) { - const childVnode = domToVnode(childDom); - vnode.children.push(childVnode); + if (dom.nodeType === 1) { + const tag = dom.nodeName.toLowerCase(); + const props = {}; + const children = []; + for (let i = 0, l = dom.childNodes.length; i < l; i++) { + const childDom = dom.childNodes[i]; + if (childDom.nodeType === 3) { + children.push(childDom.nodeValue); + } else if (childDom.nodeType === 1) { + const childVnode = domToVnode(childDom); + children.push(childVnode); + } } + const attributes = dom.attributes; + for (let i = 0, l = attributes.length; i < l; i++) { + const attr = attributes[i]; + props[attr.nodeName] = attr.nodeValue; + } + const vnode = new Vnode(tag, props, children); + vnode.dom = dom; + vnode.isSVG = tag === "svg"; + return vnode; } - const props = vnode.props; - for (let i = 0, l = dom.attributes.length; i < l; i++) { - const attr = dom.attributes[i]; - props[attr.nodeName] = attr.nodeValue; - } - return vnode; } function trust(htmlString) { const div = document.createElement("div"); @@ -124,18 +135,9 @@ var callSet = (set) => { } set.clear(); }; -var directives = { - "v-for"(vnode) { - const set = vnode.props["v-for"]; - const children = vnode.children; - const callback = children[0]; - children.length = set.length; - for (let i = 0, l = set.length; i < l; i++) { - children[i] = callback(set[i], i); - } - }, - "v-if": (vnode) => { - const bool = Boolean(vnode.props["v-if"]); +var handleVIf = (shouldRender) => { + return (value, vnode) => { + const bool = shouldRender !== Boolean(value); if (bool) { const parentNode = vnode.dom?.parentNode; if (parentNode) { @@ -144,17 +146,21 @@ var directives = { } return false; } - }, - "v-show": (vnode) => { - const bool = Boolean(vnode.props["v-show"]); + }; +}; +var directives = { + "v-if": handleVIf(true), + "v-unless": handleVIf(false), + "v-show": (value, vnode) => { + const bool = Boolean(value); vnode.dom.style.display = bool ? "" : "none"; }, - "v-html": (vnode) => { - vnode.children = [trust(vnode.props["v-html"])]; + "v-html": (value, vnode) => { + vnode.children = [trust(value)]; }, // The "v-model" directive binds the value of an input element to a model property - "v-model": (vnode) => { - let [model, property, event] = vnode.props["v-model"]; + "v-model": (val, vnode) => { + let [model, property, event] = val; let value; let handler = (e) => model[property] = e.target.value; if (vnode.tag === "input") { @@ -163,10 +169,10 @@ var directives = { case "checkbox": { if (Array.isArray(model[property])) { handler = (e) => { - const val = e.target.value; - const idx = model[property].indexOf(val); + const val2 = e.target.value; + const idx = model[property].indexOf(val2); if (idx === -1) { - model[property].push(val); + model[property].push(val2); } else { model[property].splice(idx, 1); } @@ -200,17 +206,17 @@ var directives = { event = event || "onclick"; if (vnode.props.multiple) { handler = (e) => { - const val = e.target.value; + const val2 = e.target.value; if (e.ctrlKey) { - const idx = model[property].indexOf(val); + const idx = model[property].indexOf(val2); if (idx === -1) { - model[property].push(val); + model[property].push(val2); } else { model[property].splice(idx, 1); } } else { model[property].splice(0, model[property].length); - model[property].push(val); + model[property].push(val2); } }; vnode.children.forEach((child) => { @@ -243,31 +249,26 @@ var directives = { vnode ); }, - "v-create": (vnode, oldProps) => { + "v-create": (callback, vnode, oldProps) => { if (!oldProps) { - const callback = vnode.props["v-create"]; const cleanup = callback(vnode); if (typeof cleanup === "function") { onCleanup(cleanup); } } }, - "v-update": (vnode, oldProps) => { + "v-update": (callback, vnode, oldProps) => { if (oldProps) { - const callback = vnode.props["v-update"]; const cleanup = callback(vnode, oldProps); if (typeof cleanup === "function") { onCleanup(cleanup); } } }, - "v-cleanup": (vnode) => { - const callback = vnode.props["v-cleanup"]; + "v-cleanup": (callback, vnode) => { onCleanup(() => callback(vnode)); }, - // Frequent used properties - class: (vnode) => { - const value = vnode.props.class; + "v-class": (value, vnode) => { if (typeof value === "string") { vnode.dom.className = value; } else if (Array.isArray(value)) { @@ -280,16 +281,24 @@ var directives = { } } }, - id: (vnode) => { - vnode.dom.id = vnode.props.id; + // Frequent used properties + class(value, vnode) { + if (vnode.dom.className !== value) { + vnode.dom.className = value; + } + }, + className(value, vnode) { + directives.class(value, vnode, null); + }, + id: (value, vnode) => { + vnode.dom.id = value; }, - style: (vnode) => { - const value = vnode.props.style; + style: (value, vnode) => { if (typeof value === "string") { - vnode.dom.style.cssText = value; + vnode.dom.style = value; } else if (typeof value === "object") { + vnode.dom.style = ""; const domStyle = vnode.dom.style; - domStyle.cssText = ""; for (const name in value) { domStyle[name] = value[name]; } @@ -364,7 +373,7 @@ function addProperties(vnode, oldProps) { const vnodeProps = vnode.props; for (const name in vnodeProps) { if (directives[name]) { - if (directives[name](vnode, oldProps) === false) { + if (directives[name](vnodeProps[name], vnode, oldProps) === false) { break; } continue; @@ -382,9 +391,8 @@ function updateAttributes(newVnode, oldProps) { function createElement(tag, isSVG) { return isSVG ? document.createElementNS("http://www.w3.org/2000/svg", tag) : document.createElement(tag); } -function flatTree(newVnode) { +function flatTree(newVnode, children) { current.vnode = newVnode; - const { children } = newVnode; let i = 0; while (i < children.length) { const newChild = children[i]; @@ -401,9 +409,12 @@ function flatTree(newVnode) { newChild.props = {}; } if (typeof newChild.tag !== "string") { - const component = ("view" in newChild.tag ? newChild.tag.view : newChild.tag).bind(newChild.tag); - current.component = component; - children[i] = component(newChild.props, newChild.children); + const component = newChild.tag; + current.component = newChild.tag; + children[i] = ("view" in component ? component.view : component).bind(component)( + newChild.props, + newChild.children + ); continue; } else { newChild.isSVG = newVnode.isSVG || newChild.tag === "svg"; @@ -411,17 +422,22 @@ function flatTree(newVnode) { } i++; } + return children; } -function createNewElement(newChild, newVnode, oldChild) { - if (newChild instanceof Vnode === false) { - const dom2 = document.createTextNode(newChild); - if (oldChild) { - newVnode.dom.replaceChild(dom2, oldChild); - } else { - newVnode.dom.appendChild(dom2); +function handleVFor(newVnode) { + if ("v-for" in newVnode.props) { + const set = newVnode.props["v-for"]; + const children = []; + const callback = newVnode.children[0]; + children.length = set.length; + for (let i = 0, l = set.length; i < l; i++) { + children[i] = callback(set[i], i); } - return; + return children; } + return [...newVnode.children]; +} +function createNewElement(newChild, newVnode, oldChild) { const dom = createElement(newChild.tag, newChild.isSVG); if (oldChild) { newVnode.dom.replaceChild(dom, oldChild); @@ -431,25 +447,30 @@ function createNewElement(newChild, newVnode, oldChild) { newChild.dom = dom; addProperties(newChild, null); newChild.dom.props = newChild.props; - flatTree(newChild); - const children = newChild.children; + if ("v-text" in newChild.props) { + newChild.dom.textContent = newChild.props["v-text"]; + return; + } + const children = flatTree(newChild, handleVFor(newChild)); if (children.length === 0) { newChild.dom.textContent = ""; return; } for (let i = 0, l = children.length; i < l; i++) { + if (children[i] instanceof Vnode === false) { + newChild.dom.appendChild(document.createTextNode(children[i])); + continue; + } createNewElement(children[i], newChild, null); } - children.length = 0; } -function patchKeyed(newVnode) { - const oldTree = newVnode.dom.childNodes; +function patchKeyed(newVnode, children) { + const oldTree = [...Array.from(newVnode.dom.childNodes)]; + const childNodes = newVnode.dom.childNodes; const oldKeyedList = {}; const newKeyedList = {}; - const children = newVnode.children; for (let i = 0, l = oldTree.length; i < l; i++) { - const oldChild = oldTree[i]; - const oldProps = oldChild.props; + const oldProps = oldTree[i].props; if (oldProps) { oldKeyedList[oldProps.key] = i; } @@ -459,67 +480,72 @@ function patchKeyed(newVnode) { } for (let i = 0, l = children.length; i < l; i++) { const newChild = children[i]; - const oldIndex = oldKeyedList[newChild.props.key]; - const oldChild = oldTree[oldIndex]; + const oldChild = oldTree[oldKeyedList[newChild.props.key]]; if (!oldChild) { - createNewElement(newChild, newVnode, null); + createNewElement(newChild, newVnode, childNodes[i]); continue; } newChild.dom = oldChild; - if (newVnode.dom.childNodes[i] !== newChild.dom) { - newVnode.dom.insertBefore(newChild.dom, newVnode.dom.childNodes[i]); + const currentChild = childNodes[i]; + if (!currentChild) { + newVnode.dom.appendChild(oldChild); + } else if (currentChild !== oldChild) { + newVnode.dom.replaceChild(oldChild, currentChild); } - const oldProps = oldChild.props; - newChild.dom = oldChild; - oldChild.props = newChild.props; - if (oldProps && "v-keep" in newChild.props && newChild.props["v-keep"] === oldProps["v-keep"]) { - continue; + if ("v-keep" in newChild.props === false || oldChild.props["v-keep"] !== newChild.props["v-keep"]) { + updateAttributes(newChild, oldChild.props); + oldChild.props = newChild.props; + if ("v-text" in newChild.props) { + if (oldChild.textContent != newChild.props["v-text"]) { + oldChild.textContent = newChild.props["v-text"]; + } + continue; + } + patch(newChild); } - updateAttributes(newChild, oldProps || null); - patch(newChild); } - for (let i = 0, l = oldTree.length; i < l; i++) { - const oldChild = oldTree[i]; - const oldProps = oldChild.props; - if (oldProps && !newKeyedList[oldProps.key]) { - oldChild.remove(); - } + for (let i = children.length, l = childNodes.length; i < l; i++) { + childNodes[i]?.remove(); } } function patch(newVnode) { - flatTree(newVnode); - const children = newVnode.children; + const children = flatTree(newVnode, handleVFor(newVnode)); + const dom = newVnode.dom; if (children.length === 0) { - newVnode.dom.textContent = ""; + if (dom.childNodes.length) { + dom.textContent = ""; + } return; } - const oldDomChildren = newVnode.dom.childNodes; + const oldDomChildren = dom.childNodes; const oldChildrenLength = oldDomChildren.length; if (oldChildrenLength > 0) { const firstOldProps = oldDomChildren[0].props; const firstVnode = children[0]; if (firstOldProps && firstVnode instanceof Vnode && "key" in firstVnode.props && "key" in firstOldProps) { - patchKeyed(newVnode); - children.length = 0; + patchKeyed(newVnode, children); return; } } const childrenLength = children.length; if (oldChildrenLength === 0) { for (let i = 0; i < childrenLength; i++) { + if (children[i] instanceof Vnode === false) { + dom.appendChild(document.createTextNode(children[i])); + continue; + } createNewElement(children[i], newVnode, null); } - children.length = 0; return; } for (let i = 0; i < childrenLength; i++) { const oldChild = oldDomChildren[i]; const newChild = children[i]; - if (!oldChild) { - createNewElement(newChild, newVnode, null); - continue; - } if (newChild instanceof Vnode === false) { + if (!oldChild) { + newVnode.dom.appendChild(document.createTextNode(newChild)); + continue; + } if (oldChild.nodeType !== 3) { newVnode.dom.replaceChild(document.createTextNode(newChild), oldChild); continue; @@ -529,6 +555,10 @@ function patch(newVnode) { } continue; } + if (!oldChild) { + createNewElement(newChild, newVnode, null); + continue; + } if ("v-keep" in newChild.props) { if (oldChild.props && oldChild.props["v-keep"] === newChild.props["v-keep"]) { continue; @@ -546,21 +576,21 @@ function patch(newVnode) { newChild.dom = oldChild; updateAttributes(newChild, oldChild.props || null); oldChild.props = newChild.props; + if ("v-text" in newChild.props) { + if (newChild.dom.textContent != newChild.props["v-text"]) { + newChild.dom.textContent = newChild.props["v-text"]; + } + continue; + } patch(newChild); } for (let i = childrenLength, l = oldDomChildren.length; i < l; i++) { oldDomChildren[i]?.remove(); } - children.length = 0; -} -function update() { - if (mainVnode) { - mainVnode.children = [mainComponent]; - return updateVnode(mainVnode); - } } function updateVnode(vnode) { callSet(onCleanupSet); + vnode.props = vnode.props || {}; patch(vnode); callSet(isMounted ? onUpdateSet : onMountSet); isMounted = true; @@ -570,9 +600,15 @@ function updateVnode(vnode) { return vnode.dom.innerHTML; } } +function update() { + if (mainVnode) { + mainVnode.children = [mainComponent]; + return updateVnode(mainVnode); + } +} function unmount() { if (mainVnode) { - mainComponent = new Vnode(() => null, {}, []); + mainComponent = v(() => null, {}); const result = update(); callSet(onUnmountSet); for (const name in eventListenerNames) { @@ -584,20 +620,19 @@ function unmount() { isMounted = false; current.vnode = null; current.component = null; + current.event = null; return result; } } function mount(dom, component) { const container = typeof dom === "string" ? isNodeJs ? createElement(dom, dom === "svg") : document.querySelector(dom) : dom; - const vnodeComponent = isVnodeComponent(component) ? component : isComponent(component) ? new Vnode(component, {}, []) : new Vnode(() => component, {}, []); - if (mainComponent && mainComponent.tag !== vnodeComponent.tag) { - unmount(); + if (isComponent(component)) { + mainComponent = new Vnode(component, {}, []); + } else if (isVnodeComponent(component)) { + mainComponent = component; + } else { + mainComponent = new Vnode(() => component, {}, []); } - mainComponent = vnodeComponent; mainVnode = domToVnode(container); return update(); } -function v(tagOrComponent, props, ...children) { - return new Vnode(tagOrComponent, props, children); -} -v.fragment = (_, ...children) => children; diff --git a/dist/index.js.map b/dist/index.js.map index d0cbb3d..3e8d7ec 100644 --- a/dist/index.js.map +++ b/dist/index.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../lib/index.ts"], - "sourcesContent": ["declare global {\n var document: Document;\n namespace JSX {\n interface IntrinsicElements {\n [elemName: string]: any;\n }\n }\n}\n\ninterface DefaultRecord extends Record {}\n\nexport interface VnodeProperties extends DefaultRecord {\n key?: string | number;\n}\n\nexport interface DomElement extends Element, DefaultRecord {}\n\nexport interface Component extends DefaultRecord {\n (props: VnodeProperties, children: any[]): Vnode | any;\n}\n\nexport interface POJOComponent extends DefaultRecord {\n view: Component;\n}\n\nexport type ValyrianComponent = Component | POJOComponent;\n\nexport interface VnodeComponentInterface extends Vnode {\n tag: ValyrianComponent;\n}\n\nexport interface Children extends Array {}\n\nexport interface Directive {\n (vnode: VnodeWithDom, oldProps: VnodeProperties | null): void | boolean;\n}\n\nexport const isNodeJs = Boolean(typeof process !== \"undefined\" && process.versions && process.versions.node);\n\nexport class Vnode {\n constructor(\n public tag: string | Component | POJOComponent,\n public props: null | VnodeProperties,\n public children: Children,\n public dom?: DomElement,\n public isSVG?: boolean\n ) {}\n}\n\nexport interface VnodeWithDom extends Vnode {\n tag: string;\n dom: DomElement;\n props: VnodeProperties;\n}\n\nexport const isComponent = (component: unknown): component is Component => typeof component === \"function\";\nexport const isVnode = (object?: unknown): object is Vnode => object instanceof Vnode;\n\nexport const isVnodeComponent = (object?: unknown): object is VnodeComponentInterface => {\n return isVnode(object) && isComponent(object.tag);\n};\n\nexport function domToVnode(dom: any): VnodeWithDom {\n if (dom.nodeType === 3) {\n return dom.nodeValue;\n }\n\n const vnode = new Vnode(dom.nodeName.toLowerCase(), {}, []) as VnodeWithDom;\n vnode.dom = dom;\n dom.props = vnode.props;\n\n for (let i = 0, l = dom.childNodes.length; i < l; i++) {\n const childDom = dom.childNodes[i];\n if (childDom.nodeType === 3) {\n vnode.children.push(childDom.nodeValue);\n } else if (childDom.nodeType === 1) {\n const childVnode = domToVnode(childDom);\n vnode.children.push(childVnode);\n }\n }\n\n const props = vnode.props as VnodeProperties;\n for (let i = 0, l = dom.attributes.length; i < l; i++) {\n const attr = dom.attributes[i];\n props[attr.nodeName] = attr.nodeValue;\n }\n\n return vnode as VnodeWithDom;\n}\n\nexport function trust(htmlString: string) {\n const div = document.createElement(\"div\");\n div.innerHTML = htmlString.trim();\n return Array.from(div.childNodes).map(domToVnode);\n}\n\nlet mainComponent: VnodeComponentInterface | null = null;\nlet mainVnode: VnodeWithDom | null = null;\nlet isMounted = false;\n\nexport const current = {\n vnode: null as Vnode | null,\n component: null as ValyrianComponent | null,\n event: null as Event | null\n};\n\nexport const reservedProps = new Set([\n \"key\",\n \"state\",\n \"v-keep\",\n \"v-text\",\n \"v-if\",\n \"v-for\",\n \"v-show\",\n \"v-class\",\n \"v-html\",\n \"v-model\",\n \"v-create\",\n \"v-update\",\n \"v-cleanup\"\n]);\n\nconst onCleanupSet = new Set();\nconst onMountSet = new Set();\nconst onUpdateSet = new Set();\nconst onUnmountSet = new Set();\nexport const onMount = (callback: Function) => !isMounted && onMountSet.add(callback);\nexport const onUpdate = (callback: Function) => onUpdateSet.add(callback);\nexport const onCleanup = (callback: Function) => onCleanupSet.add(callback);\nexport const onUnmount = (callback: Function) => !isMounted && onUnmountSet.add(callback);\nconst callSet = (set: Set) => {\n for (const callback of set) {\n callback();\n }\n set.clear();\n};\n\nexport const directives: Record = {\n \"v-for\"(vnode: VnodeWithDom) {\n const set = vnode.props[\"v-for\"];\n const children = vnode.children;\n const callback = children[0];\n children.length = set.length;\n\n for (let i = 0, l = set.length; i < l; i++) {\n children[i] = callback(set[i], i);\n }\n },\n\n \"v-if\": (vnode: VnodeWithDom) => {\n const bool = Boolean(vnode.props[\"v-if\"]);\n if (bool) {\n const parentNode = vnode.dom?.parentNode;\n if (parentNode) {\n const newdom = document.createTextNode(\"\");\n parentNode.replaceChild(newdom, vnode.dom);\n }\n\n return false;\n }\n },\n\n \"v-show\": (vnode: VnodeWithDom) => {\n const bool = Boolean(vnode.props[\"v-show\"]);\n (\n vnode.dom as unknown as {\n style: { display: string };\n }\n ).style.display = bool ? \"\" : \"none\";\n },\n\n \"v-html\": (vnode: VnodeWithDom) => {\n vnode.children = [trust(vnode.props[\"v-html\"])];\n },\n\n // The \"v-model\" directive binds the value of an input element to a model property\n \"v-model\": (vnode: VnodeWithDom) => {\n let [model, property, event]: any[] = vnode.props[\"v-model\"];\n let value;\n // This function updates the model property when the input element's value changes\n let handler = (e: Event) => (model[property] = (e.target as DomElement & Record).value);\n if (vnode.tag === \"input\") {\n // If the element is an input, use the \"input\" event by default\n event = event || \"oninput\";\n // Depending on the type of input element, use a different handler function\n switch (vnode.props.type) {\n case \"checkbox\": {\n if (Array.isArray(model[property])) {\n // If the model property is an array, add or remove the value from the array when the checkbox is checked or unchecked\n handler = (e: Event) => {\n const val = (e.target as DomElement & Record).value;\n const idx = model[property].indexOf(val);\n if (idx === -1) {\n model[property].push(val);\n } else {\n model[property].splice(idx, 1);\n }\n };\n // If the value is in the array, set the checkbox to be checked\n value = model[property].indexOf(vnode.dom.value) !== -1;\n } else if (\"value\" in vnode.props) {\n // If the input element has a \"value\" attribute, use it to determine the checked state\n handler = () => {\n if (model[property] === vnode.props.value) {\n model[property] = null;\n } else {\n model[property] = vnode.props.value;\n }\n };\n value = model[property] === vnode.props.value;\n } else {\n // If there is no \"value\" attribute, use a boolean value for the model property\n handler = () => (model[property] = !model[property]);\n value = model[property];\n }\n // Set the \"checked\" attribute on the input element\n // eslint-disable-next-line no-use-before-define\n sharedSetAttribute(\"checked\", value, vnode);\n break;\n }\n case \"radio\": {\n // If the element is a radio button, set the \"checked\" attribute based on the value of the model property\n // eslint-disable-next-line no-use-before-define\n sharedSetAttribute(\"checked\", model[property] === vnode.dom.value, vnode);\n break;\n }\n default: {\n // For all other input types, set the \"value\" attribute based on the value of the model property\n // eslint-disable-next-line no-use-before-define\n sharedSetAttribute(\"value\", model[property], vnode);\n }\n }\n } else if (vnode.tag === \"select\") {\n // If the element is a select element, use the \"click\" event by default\n event = event || \"onclick\";\n if (vnode.props.multiple) {\n // If the select element allows multiple selections, update the model property with an array of selected values\n handler = (e: Event & Record) => {\n const val = (e.target as DomElement & Record).value;\n if (e.ctrlKey) {\n // If the Ctrl key is pressed, add or remove the value from the array\n const idx = model[property].indexOf(val);\n if (idx === -1) {\n model[property].push(val);\n } else {\n model[property].splice(idx, 1);\n }\n } else {\n // If the Ctrl key is not pressed, set the model property to an array with the selected value\n model[property].splice(0, model[property].length);\n model[property].push(val);\n }\n };\n // Set the \"selected\" attribute on the options based on whether they are in the model property array\n vnode.children.forEach((child: VnodeWithDom) => {\n if (child.tag === \"option\") {\n const value = \"value\" in child.props ? child.props.value : child.children.join(\"\").trim();\n child.props.selected = model[property].indexOf(value) !== -1;\n }\n });\n } else {\n // If the select element does not allow multiple selections, set the \"selected\" attribute on the options based on the value of the model property\n vnode.children.forEach((child: VnodeWithDom) => {\n if (child.tag === \"option\") {\n const value = \"value\" in child.props ? child.props.value : child.children.join(\"\").trim();\n child.props.selected = value === model[property];\n }\n });\n }\n } else if (vnode.tag === \"textarea\") {\n // If the element is a textarea, use the \"input\" event by default\n event = event || \"oninput\";\n // Set the textarea's content to the value of the model property\n vnode.children = [model[property]];\n }\n\n // We assume that the prev handler if any will not be changed by the user across patchs\n const prevHandler = vnode.props[event];\n\n // Set the event handler on the element\n // eslint-disable-next-line no-use-before-define\n sharedSetAttribute(\n event,\n (e: Event) => {\n handler(e);\n\n // If the previous handler is defined, call it after the model has been updated\n if (prevHandler) {\n prevHandler(e);\n }\n },\n vnode\n );\n },\n\n \"v-create\": (vnode: VnodeWithDom, oldProps: VnodeProperties | null) => {\n if (!oldProps) {\n const callback = vnode.props[\"v-create\"];\n const cleanup = callback(vnode);\n\n if (typeof cleanup === \"function\") {\n onCleanup(cleanup);\n }\n }\n },\n\n \"v-update\": (vnode: VnodeWithDom, oldProps: VnodeProperties | null) => {\n if (oldProps) {\n const callback = vnode.props[\"v-update\"];\n const cleanup = callback(vnode, oldProps);\n\n if (typeof cleanup === \"function\") {\n onCleanup(cleanup);\n }\n }\n },\n\n \"v-cleanup\": (vnode: VnodeWithDom) => {\n const callback = vnode.props[\"v-cleanup\"];\n onCleanup(() => callback(vnode));\n },\n\n // Frequent used properties\n class: (vnode: VnodeWithDom) => {\n const value = vnode.props.class;\n if (typeof value === \"string\") {\n vnode.dom.className = value;\n } else if (Array.isArray(value)) {\n vnode.dom.className = value.join(\" \");\n } else if (typeof value === \"object\") {\n const classList = vnode.dom.classList;\n for (const name in value) {\n const val = typeof value[name] === \"function\" ? (value[name] as Function)() : value[name];\n classList.toggle(name, val);\n }\n }\n },\n\n id: (vnode: VnodeWithDom) => {\n vnode.dom.id = vnode.props.id;\n },\n\n style: (vnode: VnodeWithDom) => {\n const value = vnode.props.style;\n if (typeof value === \"string\") {\n vnode.dom.style.cssText = value;\n } else if (typeof value === \"object\") {\n const domStyle = vnode.dom.style;\n domStyle.cssText = \"\";\n for (const name in value) {\n domStyle[name] = value[name];\n }\n }\n }\n};\n\nexport function directive(name: string, directive: Directive) {\n const directiveName = `v-${name}`;\n directives[directiveName] = directive;\n reservedProps.add(directiveName);\n}\n\nconst eventListenerNames = new Set();\n\nfunction eventListener(e: Event) {\n current.event = e;\n let dom = e.target as DomElement;\n const name = `on${e.type}`;\n\n while (dom) {\n const oldProps = dom.props;\n if (oldProps && oldProps[name]) {\n oldProps[name](e, dom);\n\n if (!e.defaultPrevented) {\n update();\n }\n return;\n }\n dom = dom.parentNode as DomElement;\n }\n\n current.event = null;\n}\n\nfunction sharedSetAttribute(name: string, value: any, newVnode: VnodeWithDom): void | boolean {\n const newVnodeDom = newVnode.dom;\n if (typeof value === \"function\") {\n if (!eventListenerNames.has(name)) {\n (mainVnode as VnodeWithDom).dom.addEventListener(name.slice(2), eventListener);\n eventListenerNames.add(name);\n }\n return;\n }\n\n if (name in newVnodeDom) {\n newVnodeDom[name] = value;\n return;\n }\n\n if (value === false) {\n newVnodeDom.removeAttribute(name);\n } else {\n newVnodeDom.setAttribute(name, value);\n }\n}\n\nexport function setAttribute(name: string, value: any, newVnode: VnodeWithDom): void {\n if (!reservedProps.has(name)) {\n newVnode.props[name] = value;\n sharedSetAttribute(name, value, newVnode);\n }\n}\n\nfunction removeAttributes(vnode: VnodeWithDom, oldProps: VnodeProperties | null): void {\n if (!oldProps) {\n return;\n }\n\n const vnodeDom = vnode.dom;\n const vnodeProps = vnode.props;\n\n for (const name in oldProps) {\n if (name in vnodeProps === false && !eventListenerNames.has(name) && !reservedProps.has(name)) {\n if (name in vnodeDom) {\n vnodeDom[name] = null;\n } else {\n vnodeDom.removeAttribute(name);\n }\n }\n }\n}\n\nfunction addProperties(vnode: VnodeWithDom, oldProps: VnodeProperties | null) {\n const vnodeProps = vnode.props;\n for (const name in vnodeProps) {\n if (directives[name]) {\n if (directives[name](vnode, oldProps) === false) {\n break;\n }\n continue;\n }\n\n if (reservedProps.has(name)) {\n continue;\n }\n\n sharedSetAttribute(name, vnodeProps[name], vnode);\n }\n}\n\nfunction updateAttributes(newVnode: VnodeWithDom, oldProps: VnodeProperties | null): void {\n removeAttributes(newVnode, oldProps);\n addProperties(newVnode, oldProps);\n}\n\nfunction createElement(tag: string, isSVG: boolean): DomElement {\n return isSVG\n ? document.createElementNS(\"http://www.w3.org/2000/svg\", tag)\n : (document.createElement(tag) as DomElement);\n}\n\nfunction flatTree(newVnode: VnodeWithDom) {\n current.vnode = newVnode;\n const { children } = newVnode;\n let i = 0;\n\n while (i < children.length) {\n const newChild = children[i];\n\n if (newChild == null) {\n children.splice(i, 1);\n continue;\n }\n\n if (Array.isArray(newChild)) {\n children.splice(i, 1, ...newChild);\n continue;\n }\n\n if (newChild instanceof Vnode) {\n if (newChild.props === null) {\n newChild.props = {};\n }\n\n if (typeof newChild.tag !== \"string\") {\n const component = (\"view\" in newChild.tag ? newChild.tag.view : newChild.tag).bind(newChild.tag);\n current.component = component;\n children[i] = component(newChild.props, newChild.children);\n continue;\n } else {\n newChild.isSVG = newVnode.isSVG || newChild.tag === \"svg\";\n }\n }\n\n i++;\n }\n}\n\nfunction createNewElement(newChild: any, newVnode: VnodeWithDom, oldChild: DomElement | null) {\n if (newChild instanceof Vnode === false) {\n const dom = document.createTextNode(newChild);\n if (oldChild) {\n newVnode.dom.replaceChild(dom, oldChild);\n } else {\n newVnode.dom.appendChild(dom);\n }\n return;\n }\n\n const dom = createElement(newChild.tag, newChild.isSVG);\n if (oldChild) {\n newVnode.dom.replaceChild(dom, oldChild);\n } else {\n newVnode.dom.appendChild(dom);\n }\n newChild.dom = dom;\n addProperties(newChild, null);\n newChild.dom.props = newChild.props;\n flatTree(newChild);\n const children = newChild.children;\n if (children.length === 0) {\n newChild.dom.textContent = \"\";\n return;\n }\n\n for (let i = 0, l = children.length; i < l; i++) {\n createNewElement(children[i], newChild, null);\n }\n children.length = 0;\n}\n\nfunction patchKeyed(newVnode: VnodeWithDom) {\n const oldTree = newVnode.dom.childNodes as unknown as DomElement[];\n const oldKeyedList: Record = {};\n const newKeyedList: Record = {};\n const children = newVnode.children;\n\n for (let i = 0, l = oldTree.length; i < l; i++) {\n const oldChild = oldTree[i];\n const oldProps = oldChild.props;\n if (oldProps) {\n oldKeyedList[oldProps.key as string] = i;\n }\n\n if (i < children.length && children[i] instanceof Vnode) {\n newKeyedList[children[i].props.key as string] = i;\n }\n }\n\n for (let i = 0, l = children.length; i < l; i++) {\n const newChild = children[i];\n const oldIndex = oldKeyedList[newChild.props.key];\n const oldChild = oldTree[oldIndex];\n\n if (!oldChild) {\n createNewElement(newChild, newVnode, null);\n continue;\n }\n\n newChild.dom = oldChild;\n if (newVnode.dom.childNodes[i] !== newChild.dom) {\n newVnode.dom.insertBefore(newChild.dom, newVnode.dom.childNodes[i]);\n }\n\n const oldProps = oldChild.props;\n newChild.dom = oldChild as DomElement;\n oldChild.props = newChild.props;\n\n if (oldProps && \"v-keep\" in newChild.props && newChild.props[\"v-keep\"] === oldProps[\"v-keep\"]) {\n continue;\n }\n\n updateAttributes(newChild as VnodeWithDom, oldProps || null);\n patch(newChild);\n }\n\n // Remove any old nodes not in the new tree\n for (let i = 0, l = oldTree.length; i < l; i++) {\n const oldChild = oldTree[i];\n const oldProps = oldChild.props;\n if (oldProps && !newKeyedList[oldProps.key as string]) {\n oldChild.remove();\n }\n }\n}\n\nexport function patch(newVnode: VnodeWithDom): void {\n flatTree(newVnode);\n const children = newVnode.children;\n\n if (children.length === 0) {\n newVnode.dom.textContent = \"\";\n return;\n }\n\n const oldDomChildren = newVnode.dom.childNodes as unknown as DomElement[];\n const oldChildrenLength = oldDomChildren.length;\n if (oldChildrenLength > 0) {\n const firstOldProps = oldDomChildren[0].props;\n const firstVnode = children[0] as VnodeWithDom;\n if (firstOldProps && firstVnode instanceof Vnode && \"key\" in firstVnode.props && \"key\" in firstOldProps) {\n patchKeyed(newVnode);\n children.length = 0;\n return;\n }\n }\n\n const childrenLength = children.length;\n if (oldChildrenLength === 0) {\n for (let i = 0; i < childrenLength; i++) {\n createNewElement(children[i], newVnode, null);\n }\n children.length = 0;\n return;\n }\n\n for (let i = 0; i < childrenLength; i++) {\n const oldChild = oldDomChildren[i];\n const newChild = children[i];\n if (!oldChild) {\n createNewElement(newChild, newVnode, null);\n continue;\n }\n\n if (newChild instanceof Vnode === false) {\n if (oldChild.nodeType !== 3) {\n newVnode.dom.replaceChild(document.createTextNode(newChild), oldChild);\n continue;\n }\n\n if (oldChild.nodeValue != newChild) {\n oldChild.nodeValue = newChild;\n }\n continue;\n }\n\n if (\"v-keep\" in newChild.props) {\n if (oldChild.props && oldChild.props[\"v-keep\"] === newChild.props[\"v-keep\"]) {\n continue;\n }\n\n const nextOldChild = oldDomChildren[i + 1];\n if (nextOldChild && nextOldChild.props && nextOldChild.props[\"v-keep\"] === newChild.props[\"v-keep\"]) {\n oldChild.remove();\n continue;\n }\n }\n\n if (newChild.tag !== oldChild.nodeName.toLowerCase()) {\n createNewElement(newChild, newVnode, oldChild);\n continue;\n }\n\n newChild.dom = oldChild;\n updateAttributes(newChild as VnodeWithDom, oldChild.props || null);\n oldChild.props = newChild.props;\n patch(newChild);\n }\n\n for (let i = childrenLength, l = oldDomChildren.length; i < l; i++) {\n oldDomChildren[i]?.remove();\n }\n\n children.length = 0;\n}\n\nexport function update(): void | string {\n if (mainVnode) {\n mainVnode.children = [mainComponent];\n return updateVnode(mainVnode);\n }\n}\n\nexport function updateVnode(vnode: VnodeWithDom): string | void {\n callSet(onCleanupSet);\n patch(vnode);\n callSet(isMounted ? onUpdateSet : onMountSet);\n isMounted = true;\n current.vnode = null;\n current.component = null;\n if (isNodeJs) {\n return vnode.dom.innerHTML;\n }\n}\n\nexport function unmount() {\n if (mainVnode) {\n mainComponent = new Vnode(() => null, {}, []) as VnodeComponentInterface;\n const result = update();\n callSet(onUnmountSet);\n for (const name in eventListenerNames) {\n mainVnode.dom.removeEventListener(name.slice(2).toLowerCase(), eventListener);\n Reflect.deleteProperty(eventListenerNames, name);\n }\n\n mainComponent = null;\n mainVnode = null;\n isMounted = false;\n current.vnode = null;\n current.component = null;\n return result;\n }\n}\n\nexport function mount(dom: string | DomElement, component: any) {\n const container =\n typeof dom === \"string\" ? (isNodeJs ? createElement(dom, dom === \"svg\") : document.querySelector(dom)) : dom;\n const vnodeComponent = isVnodeComponent(component)\n ? component\n : isComponent(component)\n ? new Vnode(component, {}, [])\n : new Vnode(() => component, {}, []);\n if (mainComponent && mainComponent.tag !== vnodeComponent.tag) {\n unmount();\n }\n\n mainComponent = vnodeComponent as VnodeComponentInterface;\n mainVnode = domToVnode(container);\n return update();\n}\n\nexport function v(tagOrComponent: string | Component, props: VnodeProperties, ...children: Children) {\n return new Vnode(tagOrComponent, props, children);\n}\n\nv.fragment = (_: VnodeProperties, ...children: Children) => children;\n"], - "mappings": "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", - "names": ["value", "directive", "dom"] + "sourcesContent": ["/* eslint-disable sonarjs/cognitive-complexity */\ndeclare global {\n // eslint-disable-next-line vars-on-top, no-var, no-unused-vars\n var document: Document;\n}\n\ninterface DefaultRecord extends Record {}\n\nnamespace JSX {\n interface IntrinsicElements extends DefaultRecord {}\n}\n\nexport interface VnodeProperties extends DefaultRecord {\n key?: string | number;\n}\n\nexport interface DomElement extends Element, DefaultRecord {}\n\nexport interface Component extends DefaultRecord {\n (props: VnodeProperties, children: any[]): Vnode | any;\n}\n\nexport interface POJOComponent extends DefaultRecord {\n view: Component;\n}\n\nexport type ValyrianComponent = Component | POJOComponent;\n\nexport interface VnodeComponentInterface extends Vnode {\n tag: ValyrianComponent;\n}\n\nexport interface Children extends Array {}\n\nexport interface Directive {\n (value: any, vnode: VnodeWithDom, oldProps: VnodeProperties | null): void | boolean;\n}\n\nexport const isNodeJs = Boolean(typeof process !== \"undefined\" && process.versions && process.versions.node);\n\nexport class Vnode {\n constructor(\n public tag: string | Component | POJOComponent,\n public props: null | VnodeProperties,\n public children: Children,\n public dom?: DomElement,\n public isSVG?: boolean\n ) {}\n}\n\nexport interface VnodeWithDom extends Vnode {\n tag: string;\n dom: DomElement;\n props: VnodeProperties;\n}\n\nexport const isComponent = (component: unknown): component is Component =>\n Boolean(typeof component === \"function\" || (component && typeof component === \"object\" && \"view\" in component));\nexport const isVnode = (object?: unknown): object is Vnode => object instanceof Vnode;\n\nexport const isVnodeComponent = (object?: unknown): object is VnodeComponentInterface => {\n return isVnode(object) && isComponent(object.tag);\n};\n\nexport function v(tagOrComponent: string | Component, props: VnodeProperties, ...children: Children) {\n return new Vnode(tagOrComponent, props, children);\n}\n\nv.fragment = (_: VnodeProperties, ...children: Children) => children;\n\nexport function domToVnode(dom: any): VnodeWithDom | void {\n if (dom.nodeType === 3) {\n return dom.nodeValue;\n }\n\n if (dom.nodeType === 1) {\n const tag = dom.nodeName.toLowerCase();\n const props = {} as VnodeProperties;\n const children = [] as Children;\n\n for (let i = 0, l = dom.childNodes.length; i < l; i++) {\n const childDom = dom.childNodes[i];\n if (childDom.nodeType === 3) {\n children.push(childDom.nodeValue);\n } else if (childDom.nodeType === 1) {\n const childVnode = domToVnode(childDom);\n children.push(childVnode);\n }\n }\n\n const attributes = dom.attributes;\n for (let i = 0, l = attributes.length; i < l; i++) {\n const attr = attributes[i];\n props[attr.nodeName] = attr.nodeValue;\n }\n\n const vnode = new Vnode(tag, props, children);\n vnode.dom = dom;\n vnode.isSVG = tag === \"svg\";\n return vnode as VnodeWithDom;\n }\n}\n\nexport function trust(htmlString: string) {\n const div = document.createElement(\"div\");\n div.innerHTML = htmlString.trim();\n return Array.from(div.childNodes).map(domToVnode);\n}\n\nlet mainComponent: VnodeComponentInterface | null = null;\nlet mainVnode: VnodeWithDom | null = null;\nlet isMounted = false;\n\nexport const current = {\n vnode: null as Vnode | null,\n component: null as ValyrianComponent | null,\n event: null as Event | null\n};\n\nexport const reservedProps = new Set([\n \"key\",\n \"state\",\n \"v-keep\",\n \"v-text\",\n \"v-if\",\n \"v-for\",\n \"v-show\",\n \"v-class\",\n \"v-html\",\n \"v-model\",\n \"v-create\",\n \"v-update\",\n \"v-cleanup\"\n]);\n\nconst onCleanupSet = new Set();\nconst onMountSet = new Set();\nconst onUpdateSet = new Set();\nconst onUnmountSet = new Set();\nexport const onMount = (callback: Function) => !isMounted && onMountSet.add(callback);\nexport const onUpdate = (callback: Function) => onUpdateSet.add(callback);\nexport const onCleanup = (callback: Function) => onCleanupSet.add(callback);\nexport const onUnmount = (callback: Function) => !isMounted && onUnmountSet.add(callback);\nconst callSet = (set: Set) => {\n for (const callback of set) {\n callback();\n }\n set.clear();\n};\n\nconst handleVIf = (shouldRender: boolean): Directive => {\n return (value, vnode) => {\n const bool = shouldRender !== Boolean(value);\n if (bool) {\n const parentNode = vnode.dom?.parentNode;\n if (parentNode) {\n const newdom = document.createTextNode(\"\");\n parentNode.replaceChild(newdom, vnode.dom);\n }\n\n return false;\n }\n };\n};\n\nexport const directives: Record = {\n \"v-if\": handleVIf(true),\n \"v-unless\": handleVIf(false),\n\n \"v-show\": (value, vnode) => {\n const bool = Boolean(value);\n (\n vnode.dom as unknown as {\n style: { display: string };\n }\n ).style.display = bool ? \"\" : \"none\";\n },\n\n \"v-html\": (value, vnode) => {\n vnode.children = [trust(value as string)];\n },\n\n // The \"v-model\" directive binds the value of an input element to a model property\n \"v-model\": (val, vnode) => {\n // eslint-disable-next-line prefer-const\n let [model, property, event]: any[] = val as any[];\n let value;\n // This function updates the model property when the input element's value changes\n let handler = (e: Event) => (model[property] = (e.target as DomElement & Record).value);\n if (vnode.tag === \"input\") {\n // If the element is an input, use the \"input\" event by default\n event = event || \"oninput\";\n // Depending on the type of input element, use a different handler function\n switch (vnode.props.type) {\n case \"checkbox\": {\n if (Array.isArray(model[property])) {\n // If the model property is an array, add or remove the value from the array when the checkbox is checked or unchecked\n handler = (e: Event) => {\n const val = (e.target as DomElement & Record).value;\n const idx = model[property].indexOf(val);\n if (idx === -1) {\n model[property].push(val);\n } else {\n model[property].splice(idx, 1);\n }\n };\n // If the value is in the array, set the checkbox to be checked\n value = model[property].indexOf(vnode.dom.value) !== -1;\n } else if (\"value\" in vnode.props) {\n // If the input element has a \"value\" attribute, use it to determine the checked state\n handler = () => {\n if (model[property] === vnode.props.value) {\n model[property] = null;\n } else {\n model[property] = vnode.props.value;\n }\n };\n value = model[property] === vnode.props.value;\n } else {\n // If there is no \"value\" attribute, use a boolean value for the model property\n handler = () => (model[property] = !model[property]);\n value = model[property];\n }\n // Set the \"checked\" attribute on the input element\n // eslint-disable-next-line no-use-before-define\n sharedSetAttribute(\"checked\", value, vnode);\n break;\n }\n case \"radio\": {\n // If the element is a radio button, set the \"checked\" attribute based on the value of the model property\n // eslint-disable-next-line no-use-before-define\n sharedSetAttribute(\"checked\", model[property] === vnode.dom.value, vnode);\n break;\n }\n default: {\n // For all other input types, set the \"value\" attribute based on the value of the model property\n // eslint-disable-next-line no-use-before-define\n sharedSetAttribute(\"value\", model[property], vnode);\n }\n }\n } else if (vnode.tag === \"select\") {\n // If the element is a select element, use the \"click\" event by default\n event = event || \"onclick\";\n if (vnode.props.multiple) {\n // If the select element allows multiple selections, update the model property with an array of selected values\n handler = (e: Event & Record) => {\n const val = (e.target as DomElement & Record).value;\n if (e.ctrlKey) {\n // If the Ctrl key is pressed, add or remove the value from the array\n const idx = model[property].indexOf(val);\n if (idx === -1) {\n model[property].push(val);\n } else {\n model[property].splice(idx, 1);\n }\n } else {\n // If the Ctrl key is not pressed, set the model property to an array with the selected value\n model[property].splice(0, model[property].length);\n model[property].push(val);\n }\n };\n // Set the \"selected\" attribute on the options based on whether they are in the model property array\n vnode.children.forEach((child: VnodeWithDom) => {\n if (child.tag === \"option\") {\n const value = \"value\" in child.props ? child.props.value : child.children.join(\"\").trim();\n child.props.selected = model[property].indexOf(value) !== -1;\n }\n });\n } else {\n // If the select element does not allow multiple selections, set the \"selected\" attribute on the options based on the value of the model property\n vnode.children.forEach((child: VnodeWithDom) => {\n if (child.tag === \"option\") {\n const value = \"value\" in child.props ? child.props.value : child.children.join(\"\").trim();\n child.props.selected = value === model[property];\n }\n });\n }\n } else if (vnode.tag === \"textarea\") {\n // If the element is a textarea, use the \"input\" event by default\n event = event || \"oninput\";\n // Set the textarea's content to the value of the model property\n vnode.children = [model[property]];\n }\n\n // We assume that the prev handler if any will not be changed by the user across patchs\n const prevHandler = vnode.props[event];\n\n // Set the event handler on the element\n // eslint-disable-next-line no-use-before-define\n sharedSetAttribute(\n event,\n (e: Event) => {\n handler(e);\n\n // If the previous handler is defined, call it after the model has been updated\n if (prevHandler) {\n prevHandler(e);\n }\n },\n vnode\n );\n },\n\n \"v-create\": (callback, vnode, oldProps) => {\n if (!oldProps) {\n const cleanup = callback(vnode);\n\n if (typeof cleanup === \"function\") {\n onCleanup(cleanup);\n }\n }\n },\n\n \"v-update\": (callback, vnode, oldProps) => {\n if (oldProps) {\n const cleanup = callback(vnode, oldProps);\n\n if (typeof cleanup === \"function\") {\n onCleanup(cleanup);\n }\n }\n },\n\n \"v-cleanup\": (callback, vnode) => {\n onCleanup(() => callback(vnode));\n },\n\n \"v-class\": (value, vnode) => {\n if (typeof value === \"string\") {\n vnode.dom.className = value;\n } else if (Array.isArray(value)) {\n vnode.dom.className = value.join(\" \");\n } else if (typeof value === \"object\") {\n const classList = vnode.dom.classList;\n for (const name in value) {\n const val = typeof value[name] === \"function\" ? (value[name] as Function)() : value[name];\n classList.toggle(name, val);\n }\n }\n },\n\n // Frequent used properties\n class(value, vnode) {\n if (vnode.dom.className !== value) {\n vnode.dom.className = value;\n }\n },\n\n className(value, vnode) {\n directives.class(value, vnode, null);\n },\n\n id: (value, vnode) => {\n vnode.dom.id = value;\n },\n\n style: (value, vnode) => {\n if (typeof value === \"string\") {\n vnode.dom.style = value;\n } else if (typeof value === \"object\") {\n vnode.dom.style = \"\";\n const domStyle = vnode.dom.style;\n for (const name in value) {\n domStyle[name] = value[name];\n }\n }\n }\n};\n\nexport function directive(name: string, directive: Directive) {\n const directiveName = `v-${name}`;\n directives[directiveName] = directive;\n reservedProps.add(directiveName);\n}\n\nconst eventListenerNames = new Set();\n\nfunction eventListener(e: Event) {\n current.event = e;\n let dom = e.target as DomElement;\n const name = `on${e.type}`;\n\n while (dom) {\n const oldProps = dom.props;\n if (oldProps && oldProps[name]) {\n oldProps[name](e, dom);\n\n if (!e.defaultPrevented) {\n // eslint-disable-next-line no-use-before-define\n update();\n }\n return;\n }\n dom = dom.parentNode as DomElement;\n }\n\n current.event = null;\n}\n\nfunction sharedSetAttribute(name: string, value: any, newVnode: VnodeWithDom): void | boolean {\n const newVnodeDom = newVnode.dom;\n if (typeof value === \"function\") {\n if (!eventListenerNames.has(name)) {\n (mainVnode as VnodeWithDom).dom.addEventListener(name.slice(2), eventListener);\n eventListenerNames.add(name);\n }\n return;\n }\n\n if (name in newVnodeDom) {\n newVnodeDom[name] = value;\n return;\n }\n\n if (value === false) {\n newVnodeDom.removeAttribute(name);\n } else {\n newVnodeDom.setAttribute(name, value);\n }\n}\n\nexport function setAttribute(name: string, value: any, newVnode: VnodeWithDom): void {\n if (!reservedProps.has(name)) {\n newVnode.props[name] = value;\n sharedSetAttribute(name, value, newVnode);\n }\n}\n\nfunction removeAttributes(vnode: VnodeWithDom, oldProps: VnodeProperties | null): void {\n if (!oldProps) {\n return;\n }\n\n const vnodeDom = vnode.dom;\n const vnodeProps = vnode.props;\n\n for (const name in oldProps) {\n if (name in vnodeProps === false && !eventListenerNames.has(name) && !reservedProps.has(name)) {\n if (name in vnodeDom) {\n vnodeDom[name] = null;\n } else {\n vnodeDom.removeAttribute(name);\n }\n }\n }\n}\n\nfunction addProperties(vnode: VnodeWithDom, oldProps: VnodeProperties | null) {\n const vnodeProps = vnode.props;\n for (const name in vnodeProps) {\n if (directives[name]) {\n if (directives[name](vnodeProps[name], vnode, oldProps) === false) {\n break;\n }\n continue;\n }\n\n if (reservedProps.has(name)) {\n continue;\n }\n\n sharedSetAttribute(name, vnodeProps[name], vnode);\n }\n}\n\nexport function updateAttributes(newVnode: VnodeWithDom, oldProps: VnodeProperties | null): void {\n removeAttributes(newVnode, oldProps);\n addProperties(newVnode, oldProps);\n}\n\nexport function createElement(tag: string, isSVG: boolean): DomElement {\n return isSVG\n ? document.createElementNS(\"http://www.w3.org/2000/svg\", tag)\n : (document.createElement(tag) as DomElement);\n}\n\nfunction flatTree(newVnode: VnodeWithDom, children: Children) {\n current.vnode = newVnode;\n let i = 0;\n\n while (i < children.length) {\n const newChild = children[i];\n\n if (newChild == null) {\n children.splice(i, 1);\n continue;\n }\n\n if (Array.isArray(newChild)) {\n children.splice(i, 1, ...newChild);\n continue;\n }\n\n if (newChild instanceof Vnode) {\n if (newChild.props === null) {\n newChild.props = {};\n }\n\n if (typeof newChild.tag !== \"string\") {\n const component = newChild.tag;\n\n current.component = newChild.tag;\n children[i] = (\"view\" in component ? component.view : component).bind(component)(\n newChild.props,\n newChild.children\n );\n continue;\n } else {\n newChild.isSVG = newVnode.isSVG || newChild.tag === \"svg\";\n }\n }\n\n i++;\n }\n\n return children;\n}\n\nfunction handleVFor(newVnode: VnodeWithDom) {\n if (\"v-for\" in newVnode.props) {\n const set = newVnode.props[\"v-for\"];\n const children = [];\n const callback = newVnode.children[0];\n children.length = set.length;\n\n for (let i = 0, l = set.length; i < l; i++) {\n children[i] = callback(set[i], i);\n }\n\n return children;\n }\n return [...newVnode.children];\n}\n\nfunction createNewElement(newChild: VnodeWithDom, newVnode: VnodeWithDom, oldChild: DomElement | null) {\n const dom = createElement(newChild.tag, newChild.isSVG as boolean);\n if (oldChild) {\n newVnode.dom.replaceChild(dom, oldChild);\n } else {\n newVnode.dom.appendChild(dom);\n }\n newChild.dom = dom;\n addProperties(newChild, null);\n newChild.dom.props = newChild.props;\n if (\"v-text\" in newChild.props) {\n newChild.dom.textContent = newChild.props[\"v-text\"];\n return;\n }\n\n const children = flatTree(newChild, handleVFor(newChild));\n if (children.length === 0) {\n newChild.dom.textContent = \"\";\n return;\n }\n\n for (let i = 0, l = children.length; i < l; i++) {\n if (children[i] instanceof Vnode === false) {\n newChild.dom.appendChild(document.createTextNode(children[i]));\n continue;\n }\n createNewElement(children[i], newChild, null);\n }\n}\n\nfunction patchKeyed(newVnode: VnodeWithDom, children: Children) {\n const oldTree = [...Array.from(newVnode.dom.childNodes)] as unknown as DomElement[];\n const childNodes = newVnode.dom.childNodes;\n const oldKeyedList: Record = {};\n const newKeyedList: Record = {};\n\n for (let i = 0, l = oldTree.length; i < l; i++) {\n const oldProps = oldTree[i].props;\n if (oldProps) {\n oldKeyedList[oldProps.key as string] = i;\n }\n\n if (i < children.length && children[i] instanceof Vnode) {\n newKeyedList[children[i].props.key as string] = i;\n }\n }\n\n for (let i = 0, l = children.length; i < l; i++) {\n const newChild = children[i];\n const oldChild = oldTree[oldKeyedList[newChild.props.key as string]];\n\n if (!oldChild) {\n createNewElement(newChild, newVnode, childNodes[i] as DomElement | null);\n continue;\n }\n\n newChild.dom = oldChild;\n const currentChild = childNodes[i];\n if (!currentChild) {\n newVnode.dom.appendChild(oldChild);\n } else if (currentChild !== oldChild) {\n newVnode.dom.replaceChild(oldChild, currentChild);\n }\n\n if (\"v-keep\" in newChild.props === false || oldChild.props[\"v-keep\"] !== newChild.props[\"v-keep\"]) {\n updateAttributes(newChild as VnodeWithDom, oldChild.props);\n oldChild.props = newChild.props;\n\n if (\"v-text\" in newChild.props) {\n // eslint-disable-next-line eqeqeq\n if (oldChild.textContent != newChild.props[\"v-text\"]) {\n oldChild.textContent = newChild.props[\"v-text\"];\n }\n continue;\n }\n // eslint-disable-next-line no-use-before-define\n patch(newChild as VnodeWithDom);\n }\n }\n\n for (let i = children.length, l = childNodes.length; i < l; i++) {\n childNodes[i]?.remove();\n }\n}\n\n// eslint-disable-next-line complexity\nexport function patch(newVnode: VnodeWithDom): void {\n const children = flatTree(newVnode, handleVFor(newVnode));\n\n const dom = newVnode.dom;\n\n if (children.length === 0) {\n if (dom.childNodes.length) {\n dom.textContent = \"\";\n }\n return;\n }\n\n const oldDomChildren = dom.childNodes as unknown as DomElement[];\n const oldChildrenLength = oldDomChildren.length;\n if (oldChildrenLength > 0) {\n const firstOldProps = oldDomChildren[0].props;\n const firstVnode = children[0] as VnodeWithDom;\n if (firstOldProps && firstVnode instanceof Vnode && \"key\" in firstVnode.props && \"key\" in firstOldProps) {\n patchKeyed(newVnode, children);\n return;\n }\n }\n\n const childrenLength = children.length;\n if (oldChildrenLength === 0) {\n for (let i = 0; i < childrenLength; i++) {\n if (children[i] instanceof Vnode === false) {\n dom.appendChild(document.createTextNode(children[i]));\n continue;\n }\n createNewElement(children[i], newVnode, null);\n }\n return;\n }\n\n for (let i = 0; i < childrenLength; i++) {\n const oldChild = oldDomChildren[i];\n const newChild = children[i];\n\n if (newChild instanceof Vnode === false) {\n if (!oldChild) {\n newVnode.dom.appendChild(document.createTextNode(newChild));\n continue;\n }\n\n if (oldChild.nodeType !== 3) {\n newVnode.dom.replaceChild(document.createTextNode(newChild), oldChild);\n continue;\n }\n\n // eslint-disable-next-line eqeqeq\n if (oldChild.nodeValue != newChild) {\n oldChild.nodeValue = newChild;\n }\n continue;\n }\n\n if (!oldChild) {\n createNewElement(newChild, newVnode, null);\n continue;\n }\n\n if (\"v-keep\" in newChild.props) {\n if (oldChild.props && oldChild.props[\"v-keep\"] === newChild.props[\"v-keep\"]) {\n continue;\n }\n\n const nextOldChild = oldDomChildren[i + 1];\n if (nextOldChild && nextOldChild.props && nextOldChild.props[\"v-keep\"] === newChild.props[\"v-keep\"]) {\n oldChild.remove();\n continue;\n }\n }\n\n if (newChild.tag !== oldChild.nodeName.toLowerCase()) {\n createNewElement(newChild, newVnode, oldChild);\n continue;\n }\n\n newChild.dom = oldChild;\n updateAttributes(newChild as VnodeWithDom, oldChild.props || null);\n oldChild.props = newChild.props;\n if (\"v-text\" in newChild.props) {\n // eslint-disable-next-line eqeqeq\n if (newChild.dom.textContent != newChild.props[\"v-text\"]) {\n newChild.dom.textContent = newChild.props[\"v-text\"];\n }\n continue;\n }\n patch(newChild);\n }\n\n for (let i = childrenLength, l = oldDomChildren.length; i < l; i++) {\n oldDomChildren[i]?.remove();\n }\n}\n\nexport function updateVnode(vnode: VnodeWithDom): string | void {\n callSet(onCleanupSet);\n vnode.props = vnode.props || {};\n patch(vnode);\n callSet(isMounted ? onUpdateSet : onMountSet);\n isMounted = true;\n current.vnode = null;\n current.component = null;\n if (isNodeJs) {\n return vnode.dom.innerHTML;\n }\n}\n\nexport function update(): void | string {\n if (mainVnode) {\n mainVnode.children = [mainComponent];\n return updateVnode(mainVnode);\n }\n}\n\nexport function unmount() {\n if (mainVnode) {\n mainComponent = v(() => null, {}) as VnodeComponentInterface;\n const result = update();\n callSet(onUnmountSet);\n for (const name in eventListenerNames) {\n mainVnode.dom.removeEventListener(name.slice(2).toLowerCase(), eventListener);\n Reflect.deleteProperty(eventListenerNames, name);\n }\n\n mainComponent = null;\n mainVnode = null;\n isMounted = false;\n current.vnode = null;\n current.component = null;\n current.event = null;\n return result;\n }\n}\n\nexport function mount(dom: string | DomElement, component: any) {\n const container =\n typeof dom === \"string\" ? (isNodeJs ? createElement(dom, dom === \"svg\") : document.querySelector(dom)) : dom;\n\n if (isComponent(component)) {\n mainComponent = new Vnode(component, {}, []) as VnodeComponentInterface;\n } else if (isVnodeComponent(component)) {\n mainComponent = component;\n } else {\n mainComponent = new Vnode(() => component, {}, []) as VnodeComponentInterface;\n }\n\n mainVnode = domToVnode(container) as VnodeWithDom;\n return update();\n}\n"], + "mappings": "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", + "names": ["val", "value", "directive"] } diff --git a/dist/index.min.js b/dist/index.min.js index cfe5b0c..ebbfcb1 100644 --- a/dist/index.min.js +++ b/dist/index.min.js @@ -1 +1 @@ -(()=>{var e=Boolean("undefined"!=typeof process&&process.versions&&process.versions.node),o=class{constructor(e,o,n,t,s){this.tag=e,this.props=o,this.children=n,this.dom=t,this.isSVG=s}},n=e=>"function"==typeof e,t=e=>e instanceof o,s=e=>t(e)&&n(e.tag);function r(e){if(3===e.nodeType)return e.nodeValue;const n=new o(e.nodeName.toLowerCase(),{},[]);n.dom=e,e.props=n.props;for(let o=0,t=e.childNodes.length;ou.add(e),g=e=>{for(const o of e)o();e.clear()},y={"v-for"(e){const o=e.props["v-for"],n=e.children,t=n[0];n.length=o.length;for(let e=0,s=o.length;e{if(Boolean(e.props["v-if"])){const o=e.dom?.parentNode;if(o){const n=document.createTextNode("");o.replaceChild(n,e.dom)}return!1}},"v-show":e=>{const o=Boolean(e.props["v-show"]);e.dom.style.display=o?"":"none"},"v-html":e=>{e.children=[i(e.props["v-html"])]},"v-model":e=>{let o,[n,t,s]=e.props["v-model"],r=e=>n[t]=e.target.value;if("input"===e.tag)switch(s=s||"oninput",e.props.type){case"checkbox":Array.isArray(n[t])?(r=e=>{const o=e.target.value,s=n[t].indexOf(o);-1===s?n[t].push(o):n[t].splice(s,1)},o=-1!==n[t].indexOf(e.dom.value)):"value"in e.props?(r=()=>{n[t]===e.props.value?n[t]=null:n[t]=e.props.value},o=n[t]===e.props.value):(r=()=>n[t]=!n[t],o=n[t]),N("checked",o,e);break;case"radio":N("checked",n[t]===e.dom.value,e);break;default:N("value",n[t],e)}else"select"===e.tag?(s=s||"onclick",e.props.multiple?(r=e=>{const o=e.target.value;if(e.ctrlKey){const e=n[t].indexOf(o);-1===e?n[t].push(o):n[t].splice(e,1)}else n[t].splice(0,n[t].length),n[t].push(o)},e.children.forEach(e=>{if("option"===e.tag){const o="value"in e.props?e.props.value:e.children.join("").trim();e.props.selected=-1!==n[t].indexOf(o)}})):e.children.forEach(e=>{if("option"===e.tag){const o="value"in e.props?e.props.value:e.children.join("").trim();e.props.selected=o===n[t]}})):"textarea"===e.tag&&(s=s||"oninput",e.children=[n[t]]);const i=e.props[s];N(s,e=>{r(e),i&&i(e)},e)},"v-create":(e,o)=>{if(!o){const o=(0,e.props["v-create"])(e);"function"==typeof o&&h(o)}},"v-update":(e,o)=>{if(o){const n=(0,e.props["v-update"])(e,o);"function"==typeof n&&h(n)}},"v-cleanup":e=>{const o=e.props["v-cleanup"];h(()=>o(e))},class:e=>{const o=e.props.class;if("string"==typeof o)e.dom.className=o;else if(Array.isArray(o))e.dom.className=o.join(" ");else if("object"==typeof o){const n=e.dom.classList;for(const e in o){const t="function"==typeof o[e]?o[e]():o[e];n.toggle(e,t)}}},id:e=>{e.dom.id=e.props.id},style:e=>{const o=e.props.style;if("string"==typeof o)e.dom.style.cssText=o;else if("object"==typeof o){const n=e.dom.style;n.cssText="";for(const e in o)n[e]=o[e]}}};var w=new Set;function k(e){d.event=e;let o=e.target;const n=`on${e.type}`;for(;o;){const t=o.props;if(t&&t[n])return t[n](e,o),void(e.defaultPrevented||A());o=o.parentNode}d.event=null}function N(e,o,n){const t=n.dom;"function"!=typeof o?e in t?t[e]=o:!1===o?t.removeAttribute(e):t.setAttribute(e,o):w.has(e)||(p.dom.addEventListener(e.slice(2),k),w.add(e))}function x(e,o){const n=e.props;for(const t in n)if(y[t]){if(!1===y[t](e,o))break}else a.has(t)||N(t,n[t],e)}function V(e,o){!function(e,o){if(!o)return;const n=e.dom,t=e.props;for(const e in o)e in t!=0||w.has(e)||a.has(e)||(e in n?n[e]=null:n.removeAttribute(e))}(e,o),x(e,o)}function C(e,o){return o?document.createElementNS("http://www.w3.org/2000/svg",e):document.createElement(e)}function b(e){d.vnode=e;const{children:n}=e;let t=0;for(;t0){const s=t[0].props,r=n[0];if(s&&r instanceof o&&"key"in r.props&&"key"in s)return function(e){const n=e.dom.childNodes,t={},s={},r=e.children;for(let e=0,i=n.length;enull,{},[]);const e=A();g(m);for(const e in w)p.dom.removeEventListener(e.slice(2).toLowerCase(),k),Reflect.deleteProperty(w,e);return l=null,p=null,c=!1,d.vnode=null,d.component=null,e}}function j(e,n,...t){return new o(e,n,t)}j.fragment=(e,...o)=>o;var B={Vnode:o,current:d,directive:function(e,o){const n=`v-${e}`;y[n]=o,a.add(n)},directives:y,domToVnode:r,isComponent:n,isNodeJs:e,isVnode:t,isVnodeComponent:s,mount:function(t,i){const c="string"==typeof t?e?C(t,"svg"===t):document.querySelector(t):t,d=s(i)?i:n(i)?new o(i,{},[]):new o(()=>i,{},[]);return l&&l.tag!==d.tag&&E(),l=d,p=r(c),A()},onCleanup:h,onMount:e=>!c&&f.add(e),onUnmount:e=>!c&&m.add(e),onUpdate:e=>v.add(e),patch:T,reservedProps:a,setAttribute:function(e,o,n){a.has(e)||(n.props[e]=o,N(e,o,n))},trust:i,unmount:E,update:A,updateVnode:L,v:j};"undefined"!=typeof module?module.exports=B:self.Valyrian=B})();//# sourceMappingURL=index.min.js.map \ No newline at end of file +(()=>{var e=Boolean("undefined"!=typeof process&&process.versions&&process.versions.node),n=class{constructor(e,n,t,o,s){this.tag=e,this.props=n,this.children=t,this.dom=o,this.isSVG=s}},t=e=>Boolean("function"==typeof e||e&&"object"==typeof e&&"view"in e),o=e=>e instanceof n,s=e=>o(e)&&t(e.tag);function r(e,t,...o){return new n(e,t,o)}function i(e){if(3===e.nodeType)return e.nodeValue;if(1===e.nodeType){const t=e.nodeName.toLowerCase(),o={},s=[];for(let n=0,t=e.childNodes.length;nn;var p=null,c=null,d=!1,a={vnode:null,component:null,event:null},u=new Set(["key","state","v-keep","v-text","v-if","v-for","v-show","v-class","v-html","v-model","v-create","v-update","v-cleanup"]),f=new Set,v=new Set,m=new Set,h=new Set,g=e=>f.add(e),y=e=>{for(const n of e)n();e.clear()},x=e=>(n,t)=>{if(e!==Boolean(n)){const e=t.dom?.parentNode;if(e){const n=document.createTextNode("");e.replaceChild(n,t.dom)}return!1}},N={"v-if":x(!0),"v-unless":x(!1),"v-show":(e,n)=>{const t=Boolean(e);n.dom.style.display=t?"":"none"},"v-html":(e,n)=>{n.children=[l(e)]},"v-model":(e,n)=>{let t,[o,s,r]=e,i=e=>o[s]=e.target.value;if("input"===n.tag)switch(r=r||"oninput",n.props.type){case"checkbox":Array.isArray(o[s])?(i=e=>{const n=e.target.value,t=o[s].indexOf(n);-1===t?o[s].push(n):o[s].splice(t,1)},t=-1!==o[s].indexOf(n.dom.value)):"value"in n.props?(i=()=>{o[s]===n.props.value?o[s]=null:o[s]=n.props.value},t=o[s]===n.props.value):(i=()=>o[s]=!o[s],t=o[s]),C("checked",t,n);break;case"radio":C("checked",o[s]===n.dom.value,n);break;default:C("value",o[s],n)}else"select"===n.tag?(r=r||"onclick",n.props.multiple?(i=e=>{const n=e.target.value;if(e.ctrlKey){const e=o[s].indexOf(n);-1===e?o[s].push(n):o[s].splice(e,1)}else o[s].splice(0,o[s].length),o[s].push(n)},n.children.forEach(e=>{if("option"===e.tag){const n="value"in e.props?e.props.value:e.children.join("").trim();e.props.selected=-1!==o[s].indexOf(n)}})):n.children.forEach(e=>{if("option"===e.tag){const n="value"in e.props?e.props.value:e.children.join("").trim();e.props.selected=n===o[s]}})):"textarea"===n.tag&&(r=r||"oninput",n.children=[o[s]]);const l=n.props[r];C(r,e=>{i(e),l&&l(e)},n)},"v-create":(e,n,t)=>{if(!t){const t=e(n);"function"==typeof t&&g(t)}},"v-update":(e,n,t)=>{if(t){const o=e(n,t);"function"==typeof o&&g(o)}},"v-cleanup":(e,n)=>{g(()=>e(n))},"v-class":(e,n)=>{if("string"==typeof e)n.dom.className=e;else if(Array.isArray(e))n.dom.className=e.join(" ");else if("object"==typeof e){const t=n.dom.classList;for(const n in e){const o="function"==typeof e[n]?e[n]():e[n];t.toggle(n,o)}}},class(e,n){n.dom.className!==e&&(n.dom.className=e)},className(e,n){N.class(e,n,null)},id:(e,n)=>{n.dom.id=e},style:(e,n)=>{if("string"==typeof e)n.dom.style=e;else if("object"==typeof e){n.dom.style="";const t=n.dom.style;for(const n in e)t[n]=e[n]}}};var w=new Set;function k(e){a.event=e;let n=e.target;const t=`on${e.type}`;for(;n;){const o=n.props;if(o&&o[t])return o[t](e,n),void(e.defaultPrevented||G());n=n.parentNode}a.event=null}function C(e,n,t){const o=t.dom;"function"!=typeof n?e in o?o[e]=n:!1===n?o.removeAttribute(e):o.setAttribute(e,n):w.has(e)||(c.dom.addEventListener(e.slice(2),k),w.add(e))}function V(e,n){const t=e.props;for(const o in t)if(N[o]){if(!1===N[o](t[o],e,n))break}else u.has(o)||C(o,t[o],e)}function b(e,n){!function(e,n){if(!n)return;const t=e.dom,o=e.props;for(const e in n)e in o!=0||w.has(e)||u.has(e)||(e in t?t[e]=null:t.removeAttribute(e))}(e,n),V(e,n)}function A(e,n){return n?document.createElementNS("http://www.w3.org/2000/svg",e):document.createElement(e)}function S(e,t){a.vnode=e;let o=0;for(;o0){const o=s[0].props,r=t[0];if(o&&r instanceof n&&"key"in r.props&&"key"in o)return void function(e,t){const o=[...Array.from(e.dom.childNodes)],s=e.dom.childNodes,r={},i={};for(let e=0,s=o.length;er,{},[]),c=i(l),G()},onCleanup:g,onMount:e=>!d&&v.add(e),onUnmount:e=>!d&&h.add(e),onUpdate:e=>m.add(e),patch:L,reservedProps:u,setAttribute:function(e,n,t){u.has(e)||(t.props[e]=n,C(e,n,t))},trust:l,unmount:function(){if(c){p=r(()=>null,{});const e=G();y(h);for(const e in w)c.dom.removeEventListener(e.slice(2).toLowerCase(),k),Reflect.deleteProperty(w,e);return p=null,c=null,d=!1,a.vnode=null,a.component=null,a.event=null,e}},update:G,updateAttributes:b,updateVnode:j,v:r};"undefined"!=typeof module?module.exports=B:self.Valyrian=B})();//# sourceMappingURL=index.min.js.map \ No newline at end of file diff --git a/dist/index.min.js.map b/dist/index.min.js.map index fc5be89..287ff00 100644 --- a/dist/index.min.js.map +++ b/dist/index.min.js.map @@ -1 +1 @@ -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJpc05vZGVKcyIsIkJvb2xlYW4iLCJwcm9jZXNzIiwidmVyc2lvbnMiLCJub2RlIiwiVm5vZGUiLCJjb25zdHJ1Y3RvciIsInRhZyIsInByb3BzIiwiY2hpbGRyZW4iLCJkb20iLCJpc1NWRyIsInRoaXMiLCJpc0NvbXBvbmVudCIsImNvbXBvbmVudCIsImlzVm5vZGUiLCJvYmplY3QiLCJpc1Zub2RlQ29tcG9uZW50IiwiZG9tVG9Wbm9kZSIsIm5vZGVUeXBlIiwibm9kZVZhbHVlIiwidm5vZGUiLCJub2RlTmFtZSIsInRvTG93ZXJDYXNlIiwiaSIsImwiLCJjaGlsZE5vZGVzIiwibGVuZ3RoIiwiY2hpbGREb20iLCJwdXNoIiwiY2hpbGRWbm9kZSIsImF0dHJpYnV0ZXMiLCJhdHRyIiwidHJ1c3QiLCJodG1sU3RyaW5nIiwiZGl2IiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiaW5uZXJIVE1MIiwidHJpbSIsIkFycmF5IiwiZnJvbSIsIm1hcCIsIm1haW5Db21wb25lbnQiLCJtYWluVm5vZGUiLCJpc01vdW50ZWQiLCJjdXJyZW50IiwiZXZlbnQiLCJyZXNlcnZlZFByb3BzIiwiU2V0Iiwib25DbGVhbnVwU2V0Iiwib25Nb3VudFNldCIsIm9uVXBkYXRlU2V0Iiwib25Vbm1vdW50U2V0Iiwib25DbGVhbnVwIiwiY2FsbGJhY2siLCJhZGQiLCJjYWxsU2V0Iiwic2V0IiwiY2xlYXIiLCJkaXJlY3RpdmVzIiwicGFyZW50Tm9kZSIsIm5ld2RvbSIsImNyZWF0ZVRleHROb2RlIiwicmVwbGFjZUNoaWxkIiwiYm9vbCIsInN0eWxlIiwiZGlzcGxheSIsInZhbHVlIiwibW9kZWwiLCJwcm9wZXJ0eSIsImhhbmRsZXIiLCJlIiwidGFyZ2V0IiwidHlwZSIsImlzQXJyYXkiLCJ2YWwiLCJpZHgiLCJpbmRleE9mIiwic3BsaWNlIiwic2hhcmVkU2V0QXR0cmlidXRlIiwibXVsdGlwbGUiLCJjdHJsS2V5IiwiZm9yRWFjaCIsImNoaWxkIiwiam9pbiIsInNlbGVjdGVkIiwicHJldkhhbmRsZXIiLCJvbGRQcm9wcyIsImNsZWFudXAiLCJjbGFzcyIsImNsYXNzTmFtZSIsImNsYXNzTGlzdCIsIm5hbWUiLCJ0b2dnbGUiLCJpZCIsImNzc1RleHQiLCJkb21TdHlsZSIsImV2ZW50TGlzdGVuZXJOYW1lcyIsImV2ZW50TGlzdGVuZXIiLCJkZWZhdWx0UHJldmVudGVkIiwidXBkYXRlIiwibmV3Vm5vZGUiLCJuZXdWbm9kZURvbSIsInJlbW92ZUF0dHJpYnV0ZSIsInNldEF0dHJpYnV0ZSIsImhhcyIsImFkZEV2ZW50TGlzdGVuZXIiLCJzbGljZSIsImFkZFByb3BlcnRpZXMiLCJ2bm9kZVByb3BzIiwidXBkYXRlQXR0cmlidXRlcyIsInZub2RlRG9tIiwicmVtb3ZlQXR0cmlidXRlcyIsImNyZWF0ZUVsZW1lbnROUyIsImZsYXRUcmVlIiwibmV3Q2hpbGQiLCJ2aWV3IiwiYmluZCIsImNyZWF0ZU5ld0VsZW1lbnQiLCJvbGRDaGlsZCIsImFwcGVuZENoaWxkIiwidGV4dENvbnRlbnQiLCJwYXRjaCIsIm9sZERvbUNoaWxkcmVuIiwib2xkQ2hpbGRyZW5MZW5ndGgiLCJmaXJzdE9sZFByb3BzIiwiZmlyc3RWbm9kZSIsIm9sZFRyZWUiLCJvbGRLZXllZExpc3QiLCJuZXdLZXllZExpc3QiLCJrZXkiLCJpbnNlcnRCZWZvcmUiLCJyZW1vdmUiLCJwYXRjaEtleWVkIiwiY2hpbGRyZW5MZW5ndGgiLCJuZXh0T2xkQ2hpbGQiLCJ1cGRhdGVWbm9kZSIsInVubW91bnQiLCJyZXN1bHQiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiUmVmbGVjdCIsImRlbGV0ZVByb3BlcnR5IiwidiIsInRhZ09yQ29tcG9uZW50IiwiZnJhZ21lbnQiLCJfIiwiZGlyZWN0aXZlIiwiZGlyZWN0aXZlTmFtZSIsImNvbnRhaW5lciIsInF1ZXJ5U2VsZWN0b3IiLCJ2bm9kZUNvbXBvbmVudCJdLCJzb3VyY2VzIjpbIi4uL2xpYi9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJkZWNsYXJlIGdsb2JhbCB7XG4gIHZhciBkb2N1bWVudDogRG9jdW1lbnQ7XG4gIG5hbWVzcGFjZSBKU1gge1xuICAgIGludGVyZmFjZSBJbnRyaW5zaWNFbGVtZW50cyB7XG4gICAgICBbZWxlbU5hbWU6IHN0cmluZ106IGFueTtcbiAgICB9XG4gIH1cbn1cblxuaW50ZXJmYWNlIERlZmF1bHRSZWNvcmQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sLCBhbnk+IHt9XG5cbmV4cG9ydCBpbnRlcmZhY2UgVm5vZGVQcm9wZXJ0aWVzIGV4dGVuZHMgRGVmYXVsdFJlY29yZCB7XG4gIGtleT86IHN0cmluZyB8IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEb21FbGVtZW50IGV4dGVuZHMgRWxlbWVudCwgRGVmYXVsdFJlY29yZCB7fVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBvbmVudCBleHRlbmRzIERlZmF1bHRSZWNvcmQge1xuICAocHJvcHM6IFZub2RlUHJvcGVydGllcywgY2hpbGRyZW46IGFueVtdKTogVm5vZGUgfCBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUE9KT0NvbXBvbmVudCBleHRlbmRzIERlZmF1bHRSZWNvcmQge1xuICB2aWV3OiBDb21wb25lbnQ7XG59XG5cbmV4cG9ydCB0eXBlIFZhbHlyaWFuQ29tcG9uZW50ID0gQ29tcG9uZW50IHwgUE9KT0NvbXBvbmVudDtcblxuZXhwb3J0IGludGVyZmFjZSBWbm9kZUNvbXBvbmVudEludGVyZmFjZSBleHRlbmRzIFZub2RlIHtcbiAgdGFnOiBWYWx5cmlhbkNvbXBvbmVudDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDaGlsZHJlbiBleHRlbmRzIEFycmF5PFZub2RlIHwgVm5vZGVDb21wb25lbnRJbnRlcmZhY2UgfCBWYWx5cmlhbkNvbXBvbmVudCB8IGFueT4ge31cblxuZXhwb3J0IGludGVyZmFjZSBEaXJlY3RpdmUge1xuICAodm5vZGU6IFZub2RlV2l0aERvbSwgb2xkUHJvcHM6IFZub2RlUHJvcGVydGllcyB8IG51bGwpOiB2b2lkIHwgYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IGlzTm9kZUpzID0gQm9vbGVhbih0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBwcm9jZXNzLnZlcnNpb25zICYmIHByb2Nlc3MudmVyc2lvbnMubm9kZSk7XG5cbmV4cG9ydCBjbGFzcyBWbm9kZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyB0YWc6IHN0cmluZyB8IENvbXBvbmVudCB8IFBPSk9Db21wb25lbnQsXG4gICAgcHVibGljIHByb3BzOiBudWxsIHwgVm5vZGVQcm9wZXJ0aWVzLFxuICAgIHB1YmxpYyBjaGlsZHJlbjogQ2hpbGRyZW4sXG4gICAgcHVibGljIGRvbT86IERvbUVsZW1lbnQsXG4gICAgcHVibGljIGlzU1ZHPzogYm9vbGVhblxuICApIHt9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVm5vZGVXaXRoRG9tIGV4dGVuZHMgVm5vZGUge1xuICB0YWc6IHN0cmluZztcbiAgZG9tOiBEb21FbGVtZW50O1xuICBwcm9wczogVm5vZGVQcm9wZXJ0aWVzO1xufVxuXG5leHBvcnQgY29uc3QgaXNDb21wb25lbnQgPSAoY29tcG9uZW50OiB1bmtub3duKTogY29tcG9uZW50IGlzIENvbXBvbmVudCA9PiB0eXBlb2YgY29tcG9uZW50ID09PSBcImZ1bmN0aW9uXCI7XG5leHBvcnQgY29uc3QgaXNWbm9kZSA9IChvYmplY3Q/OiB1bmtub3duKTogb2JqZWN0IGlzIFZub2RlID0+IG9iamVjdCBpbnN0YW5jZW9mIFZub2RlO1xuXG5leHBvcnQgY29uc3QgaXNWbm9kZUNvbXBvbmVudCA9IChvYmplY3Q/OiB1bmtub3duKTogb2JqZWN0IGlzIFZub2RlQ29tcG9uZW50SW50ZXJmYWNlID0+IHtcbiAgcmV0dXJuIGlzVm5vZGUob2JqZWN0KSAmJiBpc0NvbXBvbmVudChvYmplY3QudGFnKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBkb21Ub1Zub2RlKGRvbTogYW55KTogVm5vZGVXaXRoRG9tIHtcbiAgaWYgKGRvbS5ub2RlVHlwZSA9PT0gMykge1xuICAgIHJldHVybiBkb20ubm9kZVZhbHVlO1xuICB9XG5cbiAgY29uc3Qgdm5vZGUgPSBuZXcgVm5vZGUoZG9tLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIHt9LCBbXSkgYXMgVm5vZGVXaXRoRG9tO1xuICB2bm9kZS5kb20gPSBkb207XG4gIGRvbS5wcm9wcyA9IHZub2RlLnByb3BzO1xuXG4gIGZvciAobGV0IGkgPSAwLCBsID0gZG9tLmNoaWxkTm9kZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgY29uc3QgY2hpbGREb20gPSBkb20uY2hpbGROb2Rlc1tpXTtcbiAgICBpZiAoY2hpbGREb20ubm9kZVR5cGUgPT09IDMpIHtcbiAgICAgIHZub2RlLmNoaWxkcmVuLnB1c2goY2hpbGREb20ubm9kZVZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKGNoaWxkRG9tLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICBjb25zdCBjaGlsZFZub2RlID0gZG9tVG9Wbm9kZShjaGlsZERvbSk7XG4gICAgICB2bm9kZS5jaGlsZHJlbi5wdXNoKGNoaWxkVm5vZGUpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHByb3BzID0gdm5vZGUucHJvcHMgYXMgVm5vZGVQcm9wZXJ0aWVzO1xuICBmb3IgKGxldCBpID0gMCwgbCA9IGRvbS5hdHRyaWJ1dGVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGNvbnN0IGF0dHIgPSBkb20uYXR0cmlidXRlc1tpXTtcbiAgICBwcm9wc1thdHRyLm5vZGVOYW1lXSA9IGF0dHIubm9kZVZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIHZub2RlIGFzIFZub2RlV2l0aERvbTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRydXN0KGh0bWxTdHJpbmc6IHN0cmluZykge1xuICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICBkaXYuaW5uZXJIVE1MID0gaHRtbFN0cmluZy50cmltKCk7XG4gIHJldHVybiBBcnJheS5mcm9tKGRpdi5jaGlsZE5vZGVzKS5tYXAoZG9tVG9Wbm9kZSk7XG59XG5cbmxldCBtYWluQ29tcG9uZW50OiBWbm9kZUNvbXBvbmVudEludGVyZmFjZSB8IG51bGwgPSBudWxsO1xubGV0IG1haW5Wbm9kZTogVm5vZGVXaXRoRG9tIHwgbnVsbCA9IG51bGw7XG5sZXQgaXNNb3VudGVkID0gZmFsc2U7XG5cbmV4cG9ydCBjb25zdCBjdXJyZW50ID0ge1xuICB2bm9kZTogbnVsbCBhcyBWbm9kZSB8IG51bGwsXG4gIGNvbXBvbmVudDogbnVsbCBhcyBWYWx5cmlhbkNvbXBvbmVudCB8IG51bGwsXG4gIGV2ZW50OiBudWxsIGFzIEV2ZW50IHwgbnVsbFxufTtcblxuZXhwb3J0IGNvbnN0IHJlc2VydmVkUHJvcHMgPSBuZXcgU2V0PHN0cmluZz4oW1xuICBcImtleVwiLFxuICBcInN0YXRlXCIsXG4gIFwidi1rZWVwXCIsXG4gIFwidi10ZXh0XCIsXG4gIFwidi1pZlwiLFxuICBcInYtZm9yXCIsXG4gIFwidi1zaG93XCIsXG4gIFwidi1jbGFzc1wiLFxuICBcInYtaHRtbFwiLFxuICBcInYtbW9kZWxcIixcbiAgXCJ2LWNyZWF0ZVwiLFxuICBcInYtdXBkYXRlXCIsXG4gIFwidi1jbGVhbnVwXCJcbl0pO1xuXG5jb25zdCBvbkNsZWFudXBTZXQgPSBuZXcgU2V0PEZ1bmN0aW9uPigpO1xuY29uc3Qgb25Nb3VudFNldCA9IG5ldyBTZXQ8RnVuY3Rpb24+KCk7XG5jb25zdCBvblVwZGF0ZVNldCA9IG5ldyBTZXQ8RnVuY3Rpb24+KCk7XG5jb25zdCBvblVubW91bnRTZXQgPSBuZXcgU2V0PEZ1bmN0aW9uPigpO1xuZXhwb3J0IGNvbnN0IG9uTW91bnQgPSAoY2FsbGJhY2s6IEZ1bmN0aW9uKSA9PiAhaXNNb3VudGVkICYmIG9uTW91bnRTZXQuYWRkKGNhbGxiYWNrKTtcbmV4cG9ydCBjb25zdCBvblVwZGF0ZSA9IChjYWxsYmFjazogRnVuY3Rpb24pID0+IG9uVXBkYXRlU2V0LmFkZChjYWxsYmFjayk7XG5leHBvcnQgY29uc3Qgb25DbGVhbnVwID0gKGNhbGxiYWNrOiBGdW5jdGlvbikgPT4gb25DbGVhbnVwU2V0LmFkZChjYWxsYmFjayk7XG5leHBvcnQgY29uc3Qgb25Vbm1vdW50ID0gKGNhbGxiYWNrOiBGdW5jdGlvbikgPT4gIWlzTW91bnRlZCAmJiBvblVubW91bnRTZXQuYWRkKGNhbGxiYWNrKTtcbmNvbnN0IGNhbGxTZXQgPSAoc2V0OiBTZXQ8RnVuY3Rpb24+KSA9PiB7XG4gIGZvciAoY29uc3QgY2FsbGJhY2sgb2Ygc2V0KSB7XG4gICAgY2FsbGJhY2soKTtcbiAgfVxuICBzZXQuY2xlYXIoKTtcbn07XG5cbmV4cG9ydCBjb25zdCBkaXJlY3RpdmVzOiBSZWNvcmQ8c3RyaW5nLCBEaXJlY3RpdmU+ID0ge1xuICBcInYtZm9yXCIodm5vZGU6IFZub2RlV2l0aERvbSkge1xuICAgIGNvbnN0IHNldCA9IHZub2RlLnByb3BzW1widi1mb3JcIl07XG4gICAgY29uc3QgY2hpbGRyZW4gPSB2bm9kZS5jaGlsZHJlbjtcbiAgICBjb25zdCBjYWxsYmFjayA9IGNoaWxkcmVuWzBdO1xuICAgIGNoaWxkcmVuLmxlbmd0aCA9IHNldC5sZW5ndGg7XG5cbiAgICBmb3IgKGxldCBpID0gMCwgbCA9IHNldC5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGNoaWxkcmVuW2ldID0gY2FsbGJhY2soc2V0W2ldLCBpKTtcbiAgICB9XG4gIH0sXG5cbiAgXCJ2LWlmXCI6ICh2bm9kZTogVm5vZGVXaXRoRG9tKSA9PiB7XG4gICAgY29uc3QgYm9vbCA9IEJvb2xlYW4odm5vZGUucHJvcHNbXCJ2LWlmXCJdKTtcbiAgICBpZiAoYm9vbCkge1xuICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IHZub2RlLmRvbT8ucGFyZW50Tm9kZTtcbiAgICAgIGlmIChwYXJlbnROb2RlKSB7XG4gICAgICAgIGNvbnN0IG5ld2RvbSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiXCIpO1xuICAgICAgICBwYXJlbnROb2RlLnJlcGxhY2VDaGlsZChuZXdkb20sIHZub2RlLmRvbSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sXG5cbiAgXCJ2LXNob3dcIjogKHZub2RlOiBWbm9kZVdpdGhEb20pID0+IHtcbiAgICBjb25zdCBib29sID0gQm9vbGVhbih2bm9kZS5wcm9wc1tcInYtc2hvd1wiXSk7XG4gICAgKFxuICAgICAgdm5vZGUuZG9tIGFzIHVua25vd24gYXMge1xuICAgICAgICBzdHlsZTogeyBkaXNwbGF5OiBzdHJpbmcgfTtcbiAgICAgIH1cbiAgICApLnN0eWxlLmRpc3BsYXkgPSBib29sID8gXCJcIiA6IFwibm9uZVwiO1xuICB9LFxuXG4gIFwidi1odG1sXCI6ICh2bm9kZTogVm5vZGVXaXRoRG9tKSA9PiB7XG4gICAgdm5vZGUuY2hpbGRyZW4gPSBbdHJ1c3Qodm5vZGUucHJvcHNbXCJ2LWh0bWxcIl0pXTtcbiAgfSxcblxuICAvLyBUaGUgXCJ2LW1vZGVsXCIgZGlyZWN0aXZlIGJpbmRzIHRoZSB2YWx1ZSBvZiBhbiBpbnB1dCBlbGVtZW50IHRvIGEgbW9kZWwgcHJvcGVydHlcbiAgXCJ2LW1vZGVsXCI6ICh2bm9kZTogVm5vZGVXaXRoRG9tKSA9PiB7XG4gICAgbGV0IFttb2RlbCwgcHJvcGVydHksIGV2ZW50XTogYW55W10gPSB2bm9kZS5wcm9wc1tcInYtbW9kZWxcIl07XG4gICAgbGV0IHZhbHVlO1xuICAgIC8vIFRoaXMgZnVuY3Rpb24gdXBkYXRlcyB0aGUgbW9kZWwgcHJvcGVydHkgd2hlbiB0aGUgaW5wdXQgZWxlbWVudCdzIHZhbHVlIGNoYW5nZXNcbiAgICBsZXQgaGFuZGxlciA9IChlOiBFdmVudCkgPT4gKG1vZGVsW3Byb3BlcnR5XSA9IChlLnRhcmdldCBhcyBEb21FbGVtZW50ICYgUmVjb3JkPHN0cmluZywgYW55PikudmFsdWUpO1xuICAgIGlmICh2bm9kZS50YWcgPT09IFwiaW5wdXRcIikge1xuICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgaXMgYW4gaW5wdXQsIHVzZSB0aGUgXCJpbnB1dFwiIGV2ZW50IGJ5IGRlZmF1bHRcbiAgICAgIGV2ZW50ID0gZXZlbnQgfHwgXCJvbmlucHV0XCI7XG4gICAgICAvLyBEZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgaW5wdXQgZWxlbWVudCwgdXNlIGEgZGlmZmVyZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICAgIHN3aXRjaCAodm5vZGUucHJvcHMudHlwZSkge1xuICAgICAgICBjYXNlIFwiY2hlY2tib3hcIjoge1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG1vZGVsW3Byb3BlcnR5XSkpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBtb2RlbCBwcm9wZXJ0eSBpcyBhbiBhcnJheSwgYWRkIG9yIHJlbW92ZSB0aGUgdmFsdWUgZnJvbSB0aGUgYXJyYXkgd2hlbiB0aGUgY2hlY2tib3ggaXMgY2hlY2tlZCBvciB1bmNoZWNrZWRcbiAgICAgICAgICAgIGhhbmRsZXIgPSAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgdmFsID0gKGUudGFyZ2V0IGFzIERvbUVsZW1lbnQgJiBSZWNvcmQ8c3RyaW5nLCBhbnk+KS52YWx1ZTtcbiAgICAgICAgICAgICAgY29uc3QgaWR4ID0gbW9kZWxbcHJvcGVydHldLmluZGV4T2YodmFsKTtcbiAgICAgICAgICAgICAgaWYgKGlkeCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBtb2RlbFtwcm9wZXJ0eV0ucHVzaCh2YWwpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG1vZGVsW3Byb3BlcnR5XS5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIC8vIElmIHRoZSB2YWx1ZSBpcyBpbiB0aGUgYXJyYXksIHNldCB0aGUgY2hlY2tib3ggdG8gYmUgY2hlY2tlZFxuICAgICAgICAgICAgdmFsdWUgPSBtb2RlbFtwcm9wZXJ0eV0uaW5kZXhPZih2bm9kZS5kb20udmFsdWUpICE9PSAtMTtcbiAgICAgICAgICB9IGVsc2UgaWYgKFwidmFsdWVcIiBpbiB2bm9kZS5wcm9wcykge1xuICAgICAgICAgICAgLy8gSWYgdGhlIGlucHV0IGVsZW1lbnQgaGFzIGEgXCJ2YWx1ZVwiIGF0dHJpYnV0ZSwgdXNlIGl0IHRvIGRldGVybWluZSB0aGUgY2hlY2tlZCBzdGF0ZVxuICAgICAgICAgICAgaGFuZGxlciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKG1vZGVsW3Byb3BlcnR5XSA9PT0gdm5vZGUucHJvcHMudmFsdWUpIHtcbiAgICAgICAgICAgICAgICBtb2RlbFtwcm9wZXJ0eV0gPSBudWxsO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG1vZGVsW3Byb3BlcnR5XSA9IHZub2RlLnByb3BzLnZhbHVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdmFsdWUgPSBtb2RlbFtwcm9wZXJ0eV0gPT09IHZub2RlLnByb3BzLnZhbHVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBcInZhbHVlXCIgYXR0cmlidXRlLCB1c2UgYSBib29sZWFuIHZhbHVlIGZvciB0aGUgbW9kZWwgcHJvcGVydHlcbiAgICAgICAgICAgIGhhbmRsZXIgPSAoKSA9PiAobW9kZWxbcHJvcGVydHldID0gIW1vZGVsW3Byb3BlcnR5XSk7XG4gICAgICAgICAgICB2YWx1ZSA9IG1vZGVsW3Byb3BlcnR5XTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gU2V0IHRoZSBcImNoZWNrZWRcIiBhdHRyaWJ1dGUgb24gdGhlIGlucHV0IGVsZW1lbnRcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICAgICAgICBzaGFyZWRTZXRBdHRyaWJ1dGUoXCJjaGVja2VkXCIsIHZhbHVlLCB2bm9kZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInJhZGlvXCI6IHtcbiAgICAgICAgICAvLyBJZiB0aGUgZWxlbWVudCBpcyBhIHJhZGlvIGJ1dHRvbiwgc2V0IHRoZSBcImNoZWNrZWRcIiBhdHRyaWJ1dGUgYmFzZWQgb24gdGhlIHZhbHVlIG9mIHRoZSBtb2RlbCBwcm9wZXJ0eVxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgICAgICAgIHNoYXJlZFNldEF0dHJpYnV0ZShcImNoZWNrZWRcIiwgbW9kZWxbcHJvcGVydHldID09PSB2bm9kZS5kb20udmFsdWUsIHZub2RlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgLy8gRm9yIGFsbCBvdGhlciBpbnB1dCB0eXBlcywgc2V0IHRoZSBcInZhbHVlXCIgYXR0cmlidXRlIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiB0aGUgbW9kZWwgcHJvcGVydHlcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICAgICAgICBzaGFyZWRTZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiLCBtb2RlbFtwcm9wZXJ0eV0sIHZub2RlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodm5vZGUudGFnID09PSBcInNlbGVjdFwiKSB7XG4gICAgICAvLyBJZiB0aGUgZWxlbWVudCBpcyBhIHNlbGVjdCBlbGVtZW50LCB1c2UgdGhlIFwiY2xpY2tcIiBldmVudCBieSBkZWZhdWx0XG4gICAgICBldmVudCA9IGV2ZW50IHx8IFwib25jbGlja1wiO1xuICAgICAgaWYgKHZub2RlLnByb3BzLm11bHRpcGxlKSB7XG4gICAgICAgIC8vIElmIHRoZSBzZWxlY3QgZWxlbWVudCBhbGxvd3MgbXVsdGlwbGUgc2VsZWN0aW9ucywgdXBkYXRlIHRoZSBtb2RlbCBwcm9wZXJ0eSB3aXRoIGFuIGFycmF5IG9mIHNlbGVjdGVkIHZhbHVlc1xuICAgICAgICBoYW5kbGVyID0gKGU6IEV2ZW50ICYgUmVjb3JkPHN0cmluZywgYW55PikgPT4ge1xuICAgICAgICAgIGNvbnN0IHZhbCA9IChlLnRhcmdldCBhcyBEb21FbGVtZW50ICYgUmVjb3JkPHN0cmluZywgYW55PikudmFsdWU7XG4gICAgICAgICAgaWYgKGUuY3RybEtleSkge1xuICAgICAgICAgICAgLy8gSWYgdGhlIEN0cmwga2V5IGlzIHByZXNzZWQsIGFkZCBvciByZW1vdmUgdGhlIHZhbHVlIGZyb20gdGhlIGFycmF5XG4gICAgICAgICAgICBjb25zdCBpZHggPSBtb2RlbFtwcm9wZXJ0eV0uaW5kZXhPZih2YWwpO1xuICAgICAgICAgICAgaWYgKGlkeCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgbW9kZWxbcHJvcGVydHldLnB1c2godmFsKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG1vZGVsW3Byb3BlcnR5XS5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSWYgdGhlIEN0cmwga2V5IGlzIG5vdCBwcmVzc2VkLCBzZXQgdGhlIG1vZGVsIHByb3BlcnR5IHRvIGFuIGFycmF5IHdpdGggdGhlIHNlbGVjdGVkIHZhbHVlXG4gICAgICAgICAgICBtb2RlbFtwcm9wZXJ0eV0uc3BsaWNlKDAsIG1vZGVsW3Byb3BlcnR5XS5sZW5ndGgpO1xuICAgICAgICAgICAgbW9kZWxbcHJvcGVydHldLnB1c2godmFsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8vIFNldCB0aGUgXCJzZWxlY3RlZFwiIGF0dHJpYnV0ZSBvbiB0aGUgb3B0aW9ucyBiYXNlZCBvbiB3aGV0aGVyIHRoZXkgYXJlIGluIHRoZSBtb2RlbCBwcm9wZXJ0eSBhcnJheVxuICAgICAgICB2bm9kZS5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZDogVm5vZGVXaXRoRG9tKSA9PiB7XG4gICAgICAgICAgaWYgKGNoaWxkLnRhZyA9PT0gXCJvcHRpb25cIikge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBcInZhbHVlXCIgaW4gY2hpbGQucHJvcHMgPyBjaGlsZC5wcm9wcy52YWx1ZSA6IGNoaWxkLmNoaWxkcmVuLmpvaW4oXCJcIikudHJpbSgpO1xuICAgICAgICAgICAgY2hpbGQucHJvcHMuc2VsZWN0ZWQgPSBtb2RlbFtwcm9wZXJ0eV0uaW5kZXhPZih2YWx1ZSkgIT09IC0xO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJZiB0aGUgc2VsZWN0IGVsZW1lbnQgZG9lcyBub3QgYWxsb3cgbXVsdGlwbGUgc2VsZWN0aW9ucywgc2V0IHRoZSBcInNlbGVjdGVkXCIgYXR0cmlidXRlIG9uIHRoZSBvcHRpb25zIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiB0aGUgbW9kZWwgcHJvcGVydHlcbiAgICAgICAgdm5vZGUuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQ6IFZub2RlV2l0aERvbSkgPT4ge1xuICAgICAgICAgIGlmIChjaGlsZC50YWcgPT09IFwib3B0aW9uXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gXCJ2YWx1ZVwiIGluIGNoaWxkLnByb3BzID8gY2hpbGQucHJvcHMudmFsdWUgOiBjaGlsZC5jaGlsZHJlbi5qb2luKFwiXCIpLnRyaW0oKTtcbiAgICAgICAgICAgIGNoaWxkLnByb3BzLnNlbGVjdGVkID0gdmFsdWUgPT09IG1vZGVsW3Byb3BlcnR5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodm5vZGUudGFnID09PSBcInRleHRhcmVhXCIpIHtcbiAgICAgIC8vIElmIHRoZSBlbGVtZW50IGlzIGEgdGV4dGFyZWEsIHVzZSB0aGUgXCJpbnB1dFwiIGV2ZW50IGJ5IGRlZmF1bHRcbiAgICAgIGV2ZW50ID0gZXZlbnQgfHwgXCJvbmlucHV0XCI7XG4gICAgICAvLyBTZXQgdGhlIHRleHRhcmVhJ3MgY29udGVudCB0byB0aGUgdmFsdWUgb2YgdGhlIG1vZGVsIHByb3BlcnR5XG4gICAgICB2bm9kZS5jaGlsZHJlbiA9IFttb2RlbFtwcm9wZXJ0eV1dO1xuICAgIH1cblxuICAgIC8vIFdlIGFzc3VtZSB0aGF0IHRoZSBwcmV2IGhhbmRsZXIgaWYgYW55IHdpbGwgbm90IGJlIGNoYW5nZWQgYnkgdGhlIHVzZXIgYWNyb3NzIHBhdGNoc1xuICAgIGNvbnN0IHByZXZIYW5kbGVyID0gdm5vZGUucHJvcHNbZXZlbnRdO1xuXG4gICAgLy8gU2V0IHRoZSBldmVudCBoYW5kbGVyIG9uIHRoZSBlbGVtZW50XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgc2hhcmVkU2V0QXR0cmlidXRlKFxuICAgICAgZXZlbnQsXG4gICAgICAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgaGFuZGxlcihlKTtcblxuICAgICAgICAvLyBJZiB0aGUgcHJldmlvdXMgaGFuZGxlciBpcyBkZWZpbmVkLCBjYWxsIGl0IGFmdGVyIHRoZSBtb2RlbCBoYXMgYmVlbiB1cGRhdGVkXG4gICAgICAgIGlmIChwcmV2SGFuZGxlcikge1xuICAgICAgICAgIHByZXZIYW5kbGVyKGUpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdm5vZGVcbiAgICApO1xuICB9LFxuXG4gIFwidi1jcmVhdGVcIjogKHZub2RlOiBWbm9kZVdpdGhEb20sIG9sZFByb3BzOiBWbm9kZVByb3BlcnRpZXMgfCBudWxsKSA9PiB7XG4gICAgaWYgKCFvbGRQcm9wcykge1xuICAgICAgY29uc3QgY2FsbGJhY2sgPSB2bm9kZS5wcm9wc1tcInYtY3JlYXRlXCJdO1xuICAgICAgY29uc3QgY2xlYW51cCA9IGNhbGxiYWNrKHZub2RlKTtcblxuICAgICAgaWYgKHR5cGVvZiBjbGVhbnVwID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgb25DbGVhbnVwKGNsZWFudXApO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBcInYtdXBkYXRlXCI6ICh2bm9kZTogVm5vZGVXaXRoRG9tLCBvbGRQcm9wczogVm5vZGVQcm9wZXJ0aWVzIHwgbnVsbCkgPT4ge1xuICAgIGlmIChvbGRQcm9wcykge1xuICAgICAgY29uc3QgY2FsbGJhY2sgPSB2bm9kZS5wcm9wc1tcInYtdXBkYXRlXCJdO1xuICAgICAgY29uc3QgY2xlYW51cCA9IGNhbGxiYWNrKHZub2RlLCBvbGRQcm9wcyk7XG5cbiAgICAgIGlmICh0eXBlb2YgY2xlYW51cCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIG9uQ2xlYW51cChjbGVhbnVwKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgXCJ2LWNsZWFudXBcIjogKHZub2RlOiBWbm9kZVdpdGhEb20pID0+IHtcbiAgICBjb25zdCBjYWxsYmFjayA9IHZub2RlLnByb3BzW1widi1jbGVhbnVwXCJdO1xuICAgIG9uQ2xlYW51cCgoKSA9PiBjYWxsYmFjayh2bm9kZSkpO1xuICB9LFxuXG4gIC8vIEZyZXF1ZW50IHVzZWQgcHJvcGVydGllc1xuICBjbGFzczogKHZub2RlOiBWbm9kZVdpdGhEb20pID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IHZub2RlLnByb3BzLmNsYXNzO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHZub2RlLmRvbS5jbGFzc05hbWUgPSB2YWx1ZTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICB2bm9kZS5kb20uY2xhc3NOYW1lID0gdmFsdWUuam9pbihcIiBcIik7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGNvbnN0IGNsYXNzTGlzdCA9IHZub2RlLmRvbS5jbGFzc0xpc3Q7XG4gICAgICBmb3IgKGNvbnN0IG5hbWUgaW4gdmFsdWUpIHtcbiAgICAgICAgY29uc3QgdmFsID0gdHlwZW9mIHZhbHVlW25hbWVdID09PSBcImZ1bmN0aW9uXCIgPyAodmFsdWVbbmFtZV0gYXMgRnVuY3Rpb24pKCkgOiB2YWx1ZVtuYW1lXTtcbiAgICAgICAgY2xhc3NMaXN0LnRvZ2dsZShuYW1lLCB2YWwpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBpZDogKHZub2RlOiBWbm9kZVdpdGhEb20pID0+IHtcbiAgICB2bm9kZS5kb20uaWQgPSB2bm9kZS5wcm9wcy5pZDtcbiAgfSxcblxuICBzdHlsZTogKHZub2RlOiBWbm9kZVdpdGhEb20pID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IHZub2RlLnByb3BzLnN0eWxlO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHZub2RlLmRvbS5zdHlsZS5jc3NUZXh0ID0gdmFsdWU7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGNvbnN0IGRvbVN0eWxlID0gdm5vZGUuZG9tLnN0eWxlO1xuICAgICAgZG9tU3R5bGUuY3NzVGV4dCA9IFwiXCI7XG4gICAgICBmb3IgKGNvbnN0IG5hbWUgaW4gdmFsdWUpIHtcbiAgICAgICAgZG9tU3R5bGVbbmFtZV0gPSB2YWx1ZVtuYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBkaXJlY3RpdmUobmFtZTogc3RyaW5nLCBkaXJlY3RpdmU6IERpcmVjdGl2ZSkge1xuICBjb25zdCBkaXJlY3RpdmVOYW1lID0gYHYtJHtuYW1lfWA7XG4gIGRpcmVjdGl2ZXNbZGlyZWN0aXZlTmFtZV0gPSBkaXJlY3RpdmU7XG4gIHJlc2VydmVkUHJvcHMuYWRkKGRpcmVjdGl2ZU5hbWUpO1xufVxuXG5jb25zdCBldmVudExpc3RlbmVyTmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuZnVuY3Rpb24gZXZlbnRMaXN0ZW5lcihlOiBFdmVudCkge1xuICBjdXJyZW50LmV2ZW50ID0gZTtcbiAgbGV0IGRvbSA9IGUudGFyZ2V0IGFzIERvbUVsZW1lbnQ7XG4gIGNvbnN0IG5hbWUgPSBgb24ke2UudHlwZX1gO1xuXG4gIHdoaWxlIChkb20pIHtcbiAgICBjb25zdCBvbGRQcm9wcyA9IGRvbS5wcm9wcztcbiAgICBpZiAob2xkUHJvcHMgJiYgb2xkUHJvcHNbbmFtZV0pIHtcbiAgICAgIG9sZFByb3BzW25hbWVdKGUsIGRvbSk7XG5cbiAgICAgIGlmICghZS5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgIHVwZGF0ZSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkb20gPSBkb20ucGFyZW50Tm9kZSBhcyBEb21FbGVtZW50O1xuICB9XG5cbiAgY3VycmVudC5ldmVudCA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIHNoYXJlZFNldEF0dHJpYnV0ZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIG5ld1Zub2RlOiBWbm9kZVdpdGhEb20pOiB2b2lkIHwgYm9vbGVhbiB7XG4gIGNvbnN0IG5ld1Zub2RlRG9tID0gbmV3Vm5vZGUuZG9tO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBpZiAoIWV2ZW50TGlzdGVuZXJOYW1lcy5oYXMobmFtZSkpIHtcbiAgICAgIChtYWluVm5vZGUgYXMgVm5vZGVXaXRoRG9tKS5kb20uYWRkRXZlbnRMaXN0ZW5lcihuYW1lLnNsaWNlKDIpLCBldmVudExpc3RlbmVyKTtcbiAgICAgIGV2ZW50TGlzdGVuZXJOYW1lcy5hZGQobmFtZSk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChuYW1lIGluIG5ld1Zub2RlRG9tKSB7XG4gICAgbmV3Vm5vZGVEb21bbmFtZV0gPSB2YWx1ZTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAodmFsdWUgPT09IGZhbHNlKSB7XG4gICAgbmV3Vm5vZGVEb20ucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICB9IGVsc2Uge1xuICAgIG5ld1Zub2RlRG9tLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldEF0dHJpYnV0ZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIG5ld1Zub2RlOiBWbm9kZVdpdGhEb20pOiB2b2lkIHtcbiAgaWYgKCFyZXNlcnZlZFByb3BzLmhhcyhuYW1lKSkge1xuICAgIG5ld1Zub2RlLnByb3BzW25hbWVdID0gdmFsdWU7XG4gICAgc2hhcmVkU2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlLCBuZXdWbm9kZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVtb3ZlQXR0cmlidXRlcyh2bm9kZTogVm5vZGVXaXRoRG9tLCBvbGRQcm9wczogVm5vZGVQcm9wZXJ0aWVzIHwgbnVsbCk6IHZvaWQge1xuICBpZiAoIW9sZFByb3BzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgdm5vZGVEb20gPSB2bm9kZS5kb207XG4gIGNvbnN0IHZub2RlUHJvcHMgPSB2bm9kZS5wcm9wcztcblxuICBmb3IgKGNvbnN0IG5hbWUgaW4gb2xkUHJvcHMpIHtcbiAgICBpZiAobmFtZSBpbiB2bm9kZVByb3BzID09PSBmYWxzZSAmJiAhZXZlbnRMaXN0ZW5lck5hbWVzLmhhcyhuYW1lKSAmJiAhcmVzZXJ2ZWRQcm9wcy5oYXMobmFtZSkpIHtcbiAgICAgIGlmIChuYW1lIGluIHZub2RlRG9tKSB7XG4gICAgICAgIHZub2RlRG9tW25hbWVdID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZub2RlRG9tLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkUHJvcGVydGllcyh2bm9kZTogVm5vZGVXaXRoRG9tLCBvbGRQcm9wczogVm5vZGVQcm9wZXJ0aWVzIHwgbnVsbCkge1xuICBjb25zdCB2bm9kZVByb3BzID0gdm5vZGUucHJvcHM7XG4gIGZvciAoY29uc3QgbmFtZSBpbiB2bm9kZVByb3BzKSB7XG4gICAgaWYgKGRpcmVjdGl2ZXNbbmFtZV0pIHtcbiAgICAgIGlmIChkaXJlY3RpdmVzW25hbWVdKHZub2RlLCBvbGRQcm9wcykgPT09IGZhbHNlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHJlc2VydmVkUHJvcHMuaGFzKG5hbWUpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBzaGFyZWRTZXRBdHRyaWJ1dGUobmFtZSwgdm5vZGVQcm9wc1tuYW1lXSwgdm5vZGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUF0dHJpYnV0ZXMobmV3Vm5vZGU6IFZub2RlV2l0aERvbSwgb2xkUHJvcHM6IFZub2RlUHJvcGVydGllcyB8IG51bGwpOiB2b2lkIHtcbiAgcmVtb3ZlQXR0cmlidXRlcyhuZXdWbm9kZSwgb2xkUHJvcHMpO1xuICBhZGRQcm9wZXJ0aWVzKG5ld1Zub2RlLCBvbGRQcm9wcyk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQodGFnOiBzdHJpbmcsIGlzU1ZHOiBib29sZWFuKTogRG9tRWxlbWVudCB7XG4gIHJldHVybiBpc1NWR1xuICAgID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgdGFnKVxuICAgIDogKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKSBhcyBEb21FbGVtZW50KTtcbn1cblxuZnVuY3Rpb24gZmxhdFRyZWUobmV3Vm5vZGU6IFZub2RlV2l0aERvbSkge1xuICBjdXJyZW50LnZub2RlID0gbmV3Vm5vZGU7XG4gIGNvbnN0IHsgY2hpbGRyZW4gfSA9IG5ld1Zub2RlO1xuICBsZXQgaSA9IDA7XG5cbiAgd2hpbGUgKGkgPCBjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICBjb25zdCBuZXdDaGlsZCA9IGNoaWxkcmVuW2ldO1xuXG4gICAgaWYgKG5ld0NoaWxkID09IG51bGwpIHtcbiAgICAgIGNoaWxkcmVuLnNwbGljZShpLCAxKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KG5ld0NoaWxkKSkge1xuICAgICAgY2hpbGRyZW4uc3BsaWNlKGksIDEsIC4uLm5ld0NoaWxkKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChuZXdDaGlsZCBpbnN0YW5jZW9mIFZub2RlKSB7XG4gICAgICBpZiAobmV3Q2hpbGQucHJvcHMgPT09IG51bGwpIHtcbiAgICAgICAgbmV3Q2hpbGQucHJvcHMgPSB7fTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBuZXdDaGlsZC50YWcgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgY29uc3QgY29tcG9uZW50ID0gKFwidmlld1wiIGluIG5ld0NoaWxkLnRhZyA/IG5ld0NoaWxkLnRhZy52aWV3IDogbmV3Q2hpbGQudGFnKS5iaW5kKG5ld0NoaWxkLnRhZyk7XG4gICAgICAgIGN1cnJlbnQuY29tcG9uZW50ID0gY29tcG9uZW50O1xuICAgICAgICBjaGlsZHJlbltpXSA9IGNvbXBvbmVudChuZXdDaGlsZC5wcm9wcywgbmV3Q2hpbGQuY2hpbGRyZW4pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld0NoaWxkLmlzU1ZHID0gbmV3Vm5vZGUuaXNTVkcgfHwgbmV3Q2hpbGQudGFnID09PSBcInN2Z1wiO1xuICAgICAgfVxuICAgIH1cblxuICAgIGkrKztcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVOZXdFbGVtZW50KG5ld0NoaWxkOiBhbnksIG5ld1Zub2RlOiBWbm9kZVdpdGhEb20sIG9sZENoaWxkOiBEb21FbGVtZW50IHwgbnVsbCkge1xuICBpZiAobmV3Q2hpbGQgaW5zdGFuY2VvZiBWbm9kZSA9PT0gZmFsc2UpIHtcbiAgICBjb25zdCBkb20gPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShuZXdDaGlsZCk7XG4gICAgaWYgKG9sZENoaWxkKSB7XG4gICAgICBuZXdWbm9kZS5kb20ucmVwbGFjZUNoaWxkKGRvbSwgb2xkQ2hpbGQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdWbm9kZS5kb20uYXBwZW5kQ2hpbGQoZG9tKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZG9tID0gY3JlYXRlRWxlbWVudChuZXdDaGlsZC50YWcsIG5ld0NoaWxkLmlzU1ZHKTtcbiAgaWYgKG9sZENoaWxkKSB7XG4gICAgbmV3Vm5vZGUuZG9tLnJlcGxhY2VDaGlsZChkb20sIG9sZENoaWxkKTtcbiAgfSBlbHNlIHtcbiAgICBuZXdWbm9kZS5kb20uYXBwZW5kQ2hpbGQoZG9tKTtcbiAgfVxuICBuZXdDaGlsZC5kb20gPSBkb207XG4gIGFkZFByb3BlcnRpZXMobmV3Q2hpbGQsIG51bGwpO1xuICBuZXdDaGlsZC5kb20ucHJvcHMgPSBuZXdDaGlsZC5wcm9wcztcbiAgZmxhdFRyZWUobmV3Q2hpbGQpO1xuICBjb25zdCBjaGlsZHJlbiA9IG5ld0NoaWxkLmNoaWxkcmVuO1xuICBpZiAoY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG4gICAgbmV3Q2hpbGQuZG9tLnRleHRDb250ZW50ID0gXCJcIjtcbiAgICByZXR1cm47XG4gIH1cblxuICBmb3IgKGxldCBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGNyZWF0ZU5ld0VsZW1lbnQoY2hpbGRyZW5baV0sIG5ld0NoaWxkLCBudWxsKTtcbiAgfVxuICBjaGlsZHJlbi5sZW5ndGggPSAwO1xufVxuXG5mdW5jdGlvbiBwYXRjaEtleWVkKG5ld1Zub2RlOiBWbm9kZVdpdGhEb20pIHtcbiAgY29uc3Qgb2xkVHJlZSA9IG5ld1Zub2RlLmRvbS5jaGlsZE5vZGVzIGFzIHVua25vd24gYXMgRG9tRWxlbWVudFtdO1xuICBjb25zdCBvbGRLZXllZExpc3Q6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcbiAgY29uc3QgbmV3S2V5ZWRMaXN0OiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG4gIGNvbnN0IGNoaWxkcmVuID0gbmV3Vm5vZGUuY2hpbGRyZW47XG5cbiAgZm9yIChsZXQgaSA9IDAsIGwgPSBvbGRUcmVlLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGNvbnN0IG9sZENoaWxkID0gb2xkVHJlZVtpXTtcbiAgICBjb25zdCBvbGRQcm9wcyA9IG9sZENoaWxkLnByb3BzO1xuICAgIGlmIChvbGRQcm9wcykge1xuICAgICAgb2xkS2V5ZWRMaXN0W29sZFByb3BzLmtleSBhcyBzdHJpbmddID0gaTtcbiAgICB9XG5cbiAgICBpZiAoaSA8IGNoaWxkcmVuLmxlbmd0aCAmJiBjaGlsZHJlbltpXSBpbnN0YW5jZW9mIFZub2RlKSB7XG4gICAgICBuZXdLZXllZExpc3RbY2hpbGRyZW5baV0ucHJvcHMua2V5IGFzIHN0cmluZ10gPSBpO1xuICAgIH1cbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgY29uc3QgbmV3Q2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICBjb25zdCBvbGRJbmRleCA9IG9sZEtleWVkTGlzdFtuZXdDaGlsZC5wcm9wcy5rZXldO1xuICAgIGNvbnN0IG9sZENoaWxkID0gb2xkVHJlZVtvbGRJbmRleF07XG5cbiAgICBpZiAoIW9sZENoaWxkKSB7XG4gICAgICBjcmVhdGVOZXdFbGVtZW50KG5ld0NoaWxkLCBuZXdWbm9kZSwgbnVsbCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBuZXdDaGlsZC5kb20gPSBvbGRDaGlsZDtcbiAgICBpZiAobmV3Vm5vZGUuZG9tLmNoaWxkTm9kZXNbaV0gIT09IG5ld0NoaWxkLmRvbSkge1xuICAgICAgbmV3Vm5vZGUuZG9tLmluc2VydEJlZm9yZShuZXdDaGlsZC5kb20sIG5ld1Zub2RlLmRvbS5jaGlsZE5vZGVzW2ldKTtcbiAgICB9XG5cbiAgICBjb25zdCBvbGRQcm9wcyA9IG9sZENoaWxkLnByb3BzO1xuICAgIG5ld0NoaWxkLmRvbSA9IG9sZENoaWxkIGFzIERvbUVsZW1lbnQ7XG4gICAgb2xkQ2hpbGQucHJvcHMgPSBuZXdDaGlsZC5wcm9wcztcblxuICAgIGlmIChvbGRQcm9wcyAmJiBcInYta2VlcFwiIGluIG5ld0NoaWxkLnByb3BzICYmIG5ld0NoaWxkLnByb3BzW1widi1rZWVwXCJdID09PSBvbGRQcm9wc1tcInYta2VlcFwiXSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdXBkYXRlQXR0cmlidXRlcyhuZXdDaGlsZCBhcyBWbm9kZVdpdGhEb20sIG9sZFByb3BzIHx8IG51bGwpO1xuICAgIHBhdGNoKG5ld0NoaWxkKTtcbiAgfVxuXG4gIC8vIFJlbW92ZSBhbnkgb2xkIG5vZGVzIG5vdCBpbiB0aGUgbmV3IHRyZWVcbiAgZm9yIChsZXQgaSA9IDAsIGwgPSBvbGRUcmVlLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGNvbnN0IG9sZENoaWxkID0gb2xkVHJlZVtpXTtcbiAgICBjb25zdCBvbGRQcm9wcyA9IG9sZENoaWxkLnByb3BzO1xuICAgIGlmIChvbGRQcm9wcyAmJiAhbmV3S2V5ZWRMaXN0W29sZFByb3BzLmtleSBhcyBzdHJpbmddKSB7XG4gICAgICBvbGRDaGlsZC5yZW1vdmUoKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhdGNoKG5ld1Zub2RlOiBWbm9kZVdpdGhEb20pOiB2b2lkIHtcbiAgZmxhdFRyZWUobmV3Vm5vZGUpO1xuICBjb25zdCBjaGlsZHJlbiA9IG5ld1Zub2RlLmNoaWxkcmVuO1xuXG4gIGlmIChjaGlsZHJlbi5sZW5ndGggPT09IDApIHtcbiAgICBuZXdWbm9kZS5kb20udGV4dENvbnRlbnQgPSBcIlwiO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG9sZERvbUNoaWxkcmVuID0gbmV3Vm5vZGUuZG9tLmNoaWxkTm9kZXMgYXMgdW5rbm93biBhcyBEb21FbGVtZW50W107XG4gIGNvbnN0IG9sZENoaWxkcmVuTGVuZ3RoID0gb2xkRG9tQ2hpbGRyZW4ubGVuZ3RoO1xuICBpZiAob2xkQ2hpbGRyZW5MZW5ndGggPiAwKSB7XG4gICAgY29uc3QgZmlyc3RPbGRQcm9wcyA9IG9sZERvbUNoaWxkcmVuWzBdLnByb3BzO1xuICAgIGNvbnN0IGZpcnN0Vm5vZGUgPSBjaGlsZHJlblswXSBhcyBWbm9kZVdpdGhEb207XG4gICAgaWYgKGZpcnN0T2xkUHJvcHMgJiYgZmlyc3RWbm9kZSBpbnN0YW5jZW9mIFZub2RlICYmIFwia2V5XCIgaW4gZmlyc3RWbm9kZS5wcm9wcyAmJiBcImtleVwiIGluIGZpcnN0T2xkUHJvcHMpIHtcbiAgICAgIHBhdGNoS2V5ZWQobmV3Vm5vZGUpO1xuICAgICAgY2hpbGRyZW4ubGVuZ3RoID0gMDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBjb25zdCBjaGlsZHJlbkxlbmd0aCA9IGNoaWxkcmVuLmxlbmd0aDtcbiAgaWYgKG9sZENoaWxkcmVuTGVuZ3RoID09PSAwKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbkxlbmd0aDsgaSsrKSB7XG4gICAgICBjcmVhdGVOZXdFbGVtZW50KGNoaWxkcmVuW2ldLCBuZXdWbm9kZSwgbnVsbCk7XG4gICAgfVxuICAgIGNoaWxkcmVuLmxlbmd0aCA9IDA7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbkxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgb2xkQ2hpbGQgPSBvbGREb21DaGlsZHJlbltpXTtcbiAgICBjb25zdCBuZXdDaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgIGlmICghb2xkQ2hpbGQpIHtcbiAgICAgIGNyZWF0ZU5ld0VsZW1lbnQobmV3Q2hpbGQsIG5ld1Zub2RlLCBudWxsKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChuZXdDaGlsZCBpbnN0YW5jZW9mIFZub2RlID09PSBmYWxzZSkge1xuICAgICAgaWYgKG9sZENoaWxkLm5vZGVUeXBlICE9PSAzKSB7XG4gICAgICAgIG5ld1Zub2RlLmRvbS5yZXBsYWNlQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobmV3Q2hpbGQpLCBvbGRDaGlsZCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAob2xkQ2hpbGQubm9kZVZhbHVlICE9IG5ld0NoaWxkKSB7XG4gICAgICAgIG9sZENoaWxkLm5vZGVWYWx1ZSA9IG5ld0NoaWxkO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKFwidi1rZWVwXCIgaW4gbmV3Q2hpbGQucHJvcHMpIHtcbiAgICAgIGlmIChvbGRDaGlsZC5wcm9wcyAmJiBvbGRDaGlsZC5wcm9wc1tcInYta2VlcFwiXSA9PT0gbmV3Q2hpbGQucHJvcHNbXCJ2LWtlZXBcIl0pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5leHRPbGRDaGlsZCA9IG9sZERvbUNoaWxkcmVuW2kgKyAxXTtcbiAgICAgIGlmIChuZXh0T2xkQ2hpbGQgJiYgbmV4dE9sZENoaWxkLnByb3BzICYmIG5leHRPbGRDaGlsZC5wcm9wc1tcInYta2VlcFwiXSA9PT0gbmV3Q2hpbGQucHJvcHNbXCJ2LWtlZXBcIl0pIHtcbiAgICAgICAgb2xkQ2hpbGQucmVtb3ZlKCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChuZXdDaGlsZC50YWcgIT09IG9sZENoaWxkLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIGNyZWF0ZU5ld0VsZW1lbnQobmV3Q2hpbGQsIG5ld1Zub2RlLCBvbGRDaGlsZCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBuZXdDaGlsZC5kb20gPSBvbGRDaGlsZDtcbiAgICB1cGRhdGVBdHRyaWJ1dGVzKG5ld0NoaWxkIGFzIFZub2RlV2l0aERvbSwgb2xkQ2hpbGQucHJvcHMgfHwgbnVsbCk7XG4gICAgb2xkQ2hpbGQucHJvcHMgPSBuZXdDaGlsZC5wcm9wcztcbiAgICBwYXRjaChuZXdDaGlsZCk7XG4gIH1cblxuICBmb3IgKGxldCBpID0gY2hpbGRyZW5MZW5ndGgsIGwgPSBvbGREb21DaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBvbGREb21DaGlsZHJlbltpXT8ucmVtb3ZlKCk7XG4gIH1cblxuICBjaGlsZHJlbi5sZW5ndGggPSAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlKCk6IHZvaWQgfCBzdHJpbmcge1xuICBpZiAobWFpblZub2RlKSB7XG4gICAgbWFpblZub2RlLmNoaWxkcmVuID0gW21haW5Db21wb25lbnRdO1xuICAgIHJldHVybiB1cGRhdGVWbm9kZShtYWluVm5vZGUpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVWbm9kZSh2bm9kZTogVm5vZGVXaXRoRG9tKTogc3RyaW5nIHwgdm9pZCB7XG4gIGNhbGxTZXQob25DbGVhbnVwU2V0KTtcbiAgcGF0Y2godm5vZGUpO1xuICBjYWxsU2V0KGlzTW91bnRlZCA/IG9uVXBkYXRlU2V0IDogb25Nb3VudFNldCk7XG4gIGlzTW91bnRlZCA9IHRydWU7XG4gIGN1cnJlbnQudm5vZGUgPSBudWxsO1xuICBjdXJyZW50LmNvbXBvbmVudCA9IG51bGw7XG4gIGlmIChpc05vZGVKcykge1xuICAgIHJldHVybiB2bm9kZS5kb20uaW5uZXJIVE1MO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1bm1vdW50KCkge1xuICBpZiAobWFpblZub2RlKSB7XG4gICAgbWFpbkNvbXBvbmVudCA9IG5ldyBWbm9kZSgoKSA9PiBudWxsLCB7fSwgW10pIGFzIFZub2RlQ29tcG9uZW50SW50ZXJmYWNlO1xuICAgIGNvbnN0IHJlc3VsdCA9IHVwZGF0ZSgpO1xuICAgIGNhbGxTZXQob25Vbm1vdW50U2V0KTtcbiAgICBmb3IgKGNvbnN0IG5hbWUgaW4gZXZlbnRMaXN0ZW5lck5hbWVzKSB7XG4gICAgICBtYWluVm5vZGUuZG9tLnJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZS5zbGljZSgyKS50b0xvd2VyQ2FzZSgpLCBldmVudExpc3RlbmVyKTtcbiAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoZXZlbnRMaXN0ZW5lck5hbWVzLCBuYW1lKTtcbiAgICB9XG5cbiAgICBtYWluQ29tcG9uZW50ID0gbnVsbDtcbiAgICBtYWluVm5vZGUgPSBudWxsO1xuICAgIGlzTW91bnRlZCA9IGZhbHNlO1xuICAgIGN1cnJlbnQudm5vZGUgPSBudWxsO1xuICAgIGN1cnJlbnQuY29tcG9uZW50ID0gbnVsbDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtb3VudChkb206IHN0cmluZyB8IERvbUVsZW1lbnQsIGNvbXBvbmVudDogYW55KSB7XG4gIGNvbnN0IGNvbnRhaW5lciA9XG4gICAgdHlwZW9mIGRvbSA9PT0gXCJzdHJpbmdcIiA/IChpc05vZGVKcyA/IGNyZWF0ZUVsZW1lbnQoZG9tLCBkb20gPT09IFwic3ZnXCIpIDogZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihkb20pKSA6IGRvbTtcbiAgY29uc3Qgdm5vZGVDb21wb25lbnQgPSBpc1Zub2RlQ29tcG9uZW50KGNvbXBvbmVudClcbiAgICA/IGNvbXBvbmVudFxuICAgIDogaXNDb21wb25lbnQoY29tcG9uZW50KVxuICAgID8gbmV3IFZub2RlKGNvbXBvbmVudCwge30sIFtdKVxuICAgIDogbmV3IFZub2RlKCgpID0+IGNvbXBvbmVudCwge30sIFtdKTtcbiAgaWYgKG1haW5Db21wb25lbnQgJiYgbWFpbkNvbXBvbmVudC50YWcgIT09IHZub2RlQ29tcG9uZW50LnRhZykge1xuICAgIHVubW91bnQoKTtcbiAgfVxuXG4gIG1haW5Db21wb25lbnQgPSB2bm9kZUNvbXBvbmVudCBhcyBWbm9kZUNvbXBvbmVudEludGVyZmFjZTtcbiAgbWFpblZub2RlID0gZG9tVG9Wbm9kZShjb250YWluZXIpO1xuICByZXR1cm4gdXBkYXRlKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2KHRhZ09yQ29tcG9uZW50OiBzdHJpbmcgfCBDb21wb25lbnQsIHByb3BzOiBWbm9kZVByb3BlcnRpZXMsIC4uLmNoaWxkcmVuOiBDaGlsZHJlbikge1xuICByZXR1cm4gbmV3IFZub2RlKHRhZ09yQ29tcG9uZW50LCBwcm9wcywgY2hpbGRyZW4pO1xufVxuXG52LmZyYWdtZW50ID0gKF86IFZub2RlUHJvcGVydGllcywgLi4uY2hpbGRyZW46IENoaWxkcmVuKSA9PiBjaGlsZHJlbjtcbiJdLCJtYXBwaW5ncyI6Ik1BcUNPLElBQU1BLEVBQVdDLFFBQTJCLG9CQUFaQyxTQUEyQkEsUUFBUUMsVUFBWUQsUUFBUUMsU0FBU0MsTUFFMUZDLEVBQU4sTUFDTCxXQUFBQyxDQUNTQyxFQUNBQyxFQUNBQyxFQUNBQyxFQUNBQyxHQUpBQyxLQUFBTCxNQUNBSyxLQUFBSixRQUNBSSxLQUFBSCxXQUNBRyxLQUFBRixNQUNBRSxLQUFBRCxPQUNOLEdBU1FFLEVBQWVDLEdBQW9FLG1CQUFkQSxFQUNyRUMsRUFBV0MsR0FBc0NBLGFBQWtCWCxFQUVuRVksRUFBb0JELEdBQ3hCRCxFQUFRQyxJQUFXSCxFQUFZRyxFQUFPVCxLQUd4QyxTQUFTVyxFQUFXUixHQUN6QixHQUFxQixJQUFqQkEsRUFBSVMsU0FDTixPQUFPVCxFQUFJVSxVQUdiLE1BQU1DLEVBQVEsSUFBSWhCLEVBQU1LLEVBQUlZLFNBQVNDLGNBQWUsQ0FBQyxFQUFHLElBQ3hERixFQUFNWCxJQUFNQSxFQUNaQSxFQUFJRixNQUFRYSxFQUFNYixNQUVsQixRQUFTZ0IsRUFBSSxFQUFHQyxFQUFJZixFQUFJZ0IsV0FBV0MsT0FBUUgsRUFBSUMsRUFBR0QsSUFBSyxDQUNyRCxNQUFNSSxFQUFXbEIsRUFBSWdCLFdBQVdGLEdBQ2hDLEdBQTBCLElBQXRCSSxFQUFTVCxTQUNYRSxFQUFNWixTQUFTb0IsS0FBS0QsRUFBU1IsZ0JBQy9CLEdBQWlDLElBQXRCUSxFQUFTVCxTQUFnQixDQUNsQyxNQUFNVyxFQUFhWixFQUFXVSxHQUM5QlAsRUFBTVosU0FBU29CLEtBQUtDLEVBQ3RCLENBQ0YsQ0FFQSxNQUFNdEIsRUFBUWEsRUFBTWIsTUFD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 \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJpc05vZGVKcyIsIkJvb2xlYW4iLCJwcm9jZXNzIiwidmVyc2lvbnMiLCJub2RlIiwiVm5vZGUiLCJjb25zdHJ1Y3RvciIsInRhZyIsInByb3BzIiwiY2hpbGRyZW4iLCJkb20iLCJpc1NWRyIsInRoaXMiLCJpc0NvbXBvbmVudCIsImNvbXBvbmVudCIsImlzVm5vZGUiLCJvYmplY3QiLCJpc1Zub2RlQ29tcG9uZW50IiwidiIsInRhZ09yQ29tcG9uZW50IiwiZG9tVG9Wbm9kZSIsIm5vZGVUeXBlIiwibm9kZVZhbHVlIiwibm9kZU5hbWUiLCJ0b0xvd2VyQ2FzZSIsImkiLCJsIiwiY2hpbGROb2RlcyIsImxlbmd0aCIsImNoaWxkRG9tIiwicHVzaCIsImNoaWxkVm5vZGUiLCJhdHRyaWJ1dGVzIiwiYXR0ciIsInZub2RlIiwidHJ1c3QiLCJodG1sU3RyaW5nIiwiZGl2IiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiaW5uZXJIVE1MIiwidHJpbSIsIkFycmF5IiwiZnJvbSIsIm1hcCIsImZyYWdtZW50IiwiXyIsIm1haW5Db21wb25lbnQiLCJtYWluVm5vZGUiLCJpc01vdW50ZWQiLCJjdXJyZW50IiwiZXZlbnQiLCJyZXNlcnZlZFByb3BzIiwiU2V0Iiwib25DbGVhbnVwU2V0Iiwib25Nb3VudFNldCIsIm9uVXBkYXRlU2V0Iiwib25Vbm1vdW50U2V0Iiwib25DbGVhbnVwIiwiY2FsbGJhY2siLCJhZGQiLCJjYWxsU2V0Iiwic2V0IiwiY2xlYXIiLCJoYW5kbGVWSWYiLCJzaG91bGRSZW5kZXIiLCJ2YWx1ZSIsInBhcmVudE5vZGUiLCJuZXdkb20iLCJjcmVhdGVUZXh0Tm9kZSIsInJlcGxhY2VDaGlsZCIsImRpcmVjdGl2ZXMiLCJib29sIiwic3R5bGUiLCJkaXNwbGF5IiwidmFsIiwibW9kZWwiLCJwcm9wZXJ0eSIsImhhbmRsZXIiLCJlIiwidGFyZ2V0IiwidHlwZSIsImlzQXJyYXkiLCJpZHgiLCJpbmRleE9mIiwic3BsaWNlIiwic2hhcmVkU2V0QXR0cmlidXRlIiwibXVsdGlwbGUiLCJjdHJsS2V5IiwiZm9yRWFjaCIsImNoaWxkIiwiam9pbiIsInNlbGVjdGVkIiwicHJldkhhbmRsZXIiLCJvbGRQcm9wcyIsImNsZWFudXAiLCJjbGFzc05hbWUiLCJjbGFzc0xpc3QiLCJuYW1lIiwidG9nZ2xlIiwiY2xhc3MiLCJpZCIsImRvbVN0eWxlIiwiZXZlbnRMaXN0ZW5lck5hbWVzIiwiZXZlbnRMaXN0ZW5lciIsImRlZmF1bHRQcmV2ZW50ZWQiLCJ1cGRhdGUiLCJuZXdWbm9kZSIsIm5ld1Zub2RlRG9tIiwicmVtb3ZlQXR0cmlidXRlIiwic2V0QXR0cmlidXRlIiwiaGFzIiwiYWRkRXZlbnRMaXN0ZW5lciIsInNsaWNlIiwiYWRkUHJvcGVydGllcyIsInZub2RlUHJvcHMiLCJ1cGRhdGVBdHRyaWJ1dGVzIiwidm5vZGVEb20iLCJyZW1vdmVBdHRyaWJ1dGVzIiwiY3JlYXRlRWxlbWVudE5TIiwiZmxhdFRyZWUiLCJuZXdDaGlsZCIsInZpZXciLCJiaW5kIiwiaGFuZGxlVkZvciIsImNyZWF0ZU5ld0VsZW1lbnQiLCJvbGRDaGlsZCIsImFwcGVuZENoaWxkIiwidGV4dENvbnRlbnQiLCJwYXRjaCIsIm9sZERvbUNoaWxkcmVuIiwib2xkQ2hpbGRyZW5MZW5ndGgiLCJmaXJzdE9sZFByb3BzIiwiZmlyc3RWbm9kZSIsIm9sZFRyZWUiLCJvbGRLZXllZExpc3QiLCJuZXdLZXllZExpc3QiLCJrZXkiLCJjdXJyZW50Q2hpbGQiLCJyZW1vdmUiLCJwYXRjaEtleWVkIiwiY2hpbGRyZW5MZW5ndGgiLCJuZXh0T2xkQ2hpbGQiLCJ1cGRhdGVWbm9kZSIsImRpcmVjdGl2ZSIsImRpcmVjdGl2ZU5hbWUiLCJjb250YWluZXIiLCJxdWVyeVNlbGVjdG9yIiwicmVzdWx0IiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsIlJlZmxlY3QiLCJkZWxldGVQcm9wZXJ0eSJdLCJzb3VyY2VzIjpbIi4uL2xpYi9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBzb25hcmpzL2NvZ25pdGl2ZS1jb21wbGV4aXR5ICovXG5kZWNsYXJlIGdsb2JhbCB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB2YXJzLW9uLXRvcCwgbm8tdmFyLCBuby11bnVzZWQtdmFyc1xuICB2YXIgZG9jdW1lbnQ6IERvY3VtZW50O1xufVxuXG5pbnRlcmZhY2UgRGVmYXVsdFJlY29yZCBleHRlbmRzIFJlY29yZDxzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2wsIGFueT4ge31cblxubmFtZXNwYWNlIEpTWCB7XG4gIGludGVyZmFjZSBJbnRyaW5zaWNFbGVtZW50cyBleHRlbmRzIERlZmF1bHRSZWNvcmQge31cbn1cblxuZXhwb3J0IGludGVyZmFjZSBWbm9kZVByb3BlcnRpZXMgZXh0ZW5kcyBEZWZhdWx0UmVjb3JkIHtcbiAga2V5Pzogc3RyaW5nIHwgbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERvbUVsZW1lbnQgZXh0ZW5kcyBFbGVtZW50LCBEZWZhdWx0UmVjb3JkIHt9XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50IGV4dGVuZHMgRGVmYXVsdFJlY29yZCB7XG4gIChwcm9wczogVm5vZGVQcm9wZXJ0aWVzLCBjaGlsZHJlbjogYW55W10pOiBWbm9kZSB8IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQT0pPQ29tcG9uZW50IGV4dGVuZHMgRGVmYXVsdFJlY29yZCB7XG4gIHZpZXc6IENvbXBvbmVudDtcbn1cblxuZXhwb3J0IHR5cGUgVmFseXJpYW5Db21wb25lbnQgPSBDb21wb25lbnQgfCBQT0pPQ29tcG9uZW50O1xuXG5leHBvcnQgaW50ZXJmYWNlIFZub2RlQ29tcG9uZW50SW50ZXJmYWNlIGV4dGVuZHMgVm5vZGUge1xuICB0YWc6IFZhbHlyaWFuQ29tcG9uZW50O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENoaWxkcmVuIGV4dGVuZHMgQXJyYXk8Vm5vZGUgfCBWbm9kZUNvbXBvbmVudEludGVyZmFjZSB8IFZhbHlyaWFuQ29tcG9uZW50IHwgYW55PiB7fVxuXG5leHBvcnQgaW50ZXJmYWNlIERpcmVjdGl2ZSB7XG4gICh2YWx1ZTogYW55LCB2bm9kZTogVm5vZGVXaXRoRG9tLCBvbGRQcm9wczogVm5vZGVQcm9wZXJ0aWVzIHwgbnVsbCk6IHZvaWQgfCBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgaXNOb2RlSnMgPSBCb29sZWFuKHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiICYmIHByb2Nlc3MudmVyc2lvbnMgJiYgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlKTtcblxuZXhwb3J0IGNsYXNzIFZub2RlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHRhZzogc3RyaW5nIHwgQ29tcG9uZW50IHwgUE9KT0NvbXBvbmVudCxcbiAgICBwdWJsaWMgcHJvcHM6IG51bGwgfCBWbm9kZVByb3BlcnRpZXMsXG4gICAgcHVibGljIGNoaWxkcmVuOiBDaGlsZHJlbixcbiAgICBwdWJsaWMgZG9tPzogRG9tRWxlbWVudCxcbiAgICBwdWJsaWMgaXNTVkc/OiBib29sZWFuXG4gICkge31cbn1cblxuZXhwb3J0IGludGVyZmFjZSBWbm9kZVdpdGhEb20gZXh0ZW5kcyBWbm9kZSB7XG4gIHRhZzogc3RyaW5nO1xuICBkb206IERvbUVsZW1lbnQ7XG4gIHByb3BzOiBWbm9kZVByb3BlcnRpZXM7XG59XG5cbmV4cG9ydCBjb25zdCBpc0NvbXBvbmVudCA9IChjb21wb25lbnQ6IHVua25vd24pOiBjb21wb25lbnQgaXMgQ29tcG9uZW50ID0+XG4gIEJvb2xlYW4odHlwZW9mIGNvbXBvbmVudCA9PT0gXCJmdW5jdGlvblwiIHx8IChjb21wb25lbnQgJiYgdHlwZW9mIGNvbXBvbmVudCA9PT0gXCJvYmplY3RcIiAmJiBcInZpZXdcIiBpbiBjb21wb25lbnQpKTtcbmV4cG9ydCBjb25zdCBpc1Zub2RlID0gKG9iamVjdD86IHVua25vd24pOiBvYmplY3QgaXMgVm5vZGUgPT4gb2JqZWN0IGluc3RhbmNlb2YgVm5vZGU7XG5cbmV4cG9ydCBjb25zdCBpc1Zub2RlQ29tcG9uZW50ID0gKG9iamVjdD86IHVua25vd24pOiBvYmplY3QgaXMgVm5vZGVDb21wb25lbnRJbnRlcmZhY2UgPT4ge1xuICByZXR1cm4gaXNWbm9kZShvYmplY3QpICYmIGlzQ29tcG9uZW50KG9iamVjdC50YWcpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHYodGFnT3JDb21wb25lbnQ6IHN0cmluZyB8IENvbXBvbmVudCwgcHJvcHM6IFZub2RlUHJvcGVydGllcywgLi4uY2hpbGRyZW46IENoaWxkcmVuKSB7XG4gIHJldHVybiBuZXcgVm5vZGUodGFnT3JDb21wb25lbnQsIHByb3BzLCBjaGlsZHJlbik7XG59XG5cbnYuZnJhZ21lbnQgPSAoXzogVm5vZGVQcm9wZXJ0aWVzLCAuLi5jaGlsZHJlbjogQ2hpbGRyZW4pID0+IGNoaWxkcmVuO1xuXG5leHBvcnQgZnVuY3Rpb24gZG9tVG9Wbm9kZShkb206IGFueSk6IFZub2RlV2l0aERvbSB8IHZvaWQge1xuICBpZiAoZG9tLm5vZGVUeXBlID09PSAzKSB7XG4gICAgcmV0dXJuIGRvbS5ub2RlVmFsdWU7XG4gIH1cblxuICBpZiAoZG9tLm5vZGVUeXBlID09PSAxKSB7XG4gICAgY29uc3QgdGFnID0gZG9tLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgcHJvcHMgPSB7fSBhcyBWbm9kZVByb3BlcnRpZXM7XG4gICAgY29uc3QgY2hpbGRyZW4gPSBbXSBhcyBDaGlsZHJlbjtcblxuICAgIGZvciAobGV0IGkgPSAwLCBsID0gZG9tLmNoaWxkTm9kZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBjb25zdCBjaGlsZERvbSA9IGRvbS5jaGlsZE5vZGVzW2ldO1xuICAgICAgaWYgKGNoaWxkRG9tLm5vZGVUeXBlID09PSAzKSB7XG4gICAgICAgIGNoaWxkcmVuLnB1c2goY2hpbGREb20ubm9kZVZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoY2hpbGREb20ubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgY29uc3QgY2hpbGRWbm9kZSA9IGRvbVRvVm5vZGUoY2hpbGREb20pO1xuICAgICAgICBjaGlsZHJlbi5wdXNoKGNoaWxkVm5vZGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBkb20uYXR0cmlidXRlcztcbiAgICBmb3IgKGxldCBpID0gMCwgbCA9IGF0dHJpYnV0ZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBjb25zdCBhdHRyID0gYXR0cmlidXRlc1tpXTtcbiAgICAgIHByb3BzW2F0dHIubm9kZU5hbWVdID0gYXR0ci5ub2RlVmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3Qgdm5vZGUgPSBuZXcgVm5vZGUodGFnLCBwcm9wcywgY2hpbGRyZW4pO1xuICAgIHZub2RlLmRvbSA9IGRvbTtcbiAgICB2bm9kZS5pc1NWRyA9IHRhZyA9PT0gXCJzdmdcIjtcbiAgICByZXR1cm4gdm5vZGUgYXMgVm5vZGVXaXRoRG9tO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cnVzdChodG1sU3RyaW5nOiBzdHJpbmcpIHtcbiAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgZGl2LmlubmVySFRNTCA9IGh0bWxTdHJpbmcudHJpbSgpO1xuICByZXR1cm4gQXJyYXkuZnJvbShkaXYuY2hpbGROb2RlcykubWFwKGRvbVRvVm5vZGUpO1xufVxuXG5sZXQgbWFpbkNvbXBvbmVudDogVm5vZGVDb21wb25lbnRJbnRlcmZhY2UgfCBudWxsID0gbnVsbDtcbmxldCBtYWluVm5vZGU6IFZub2RlV2l0aERvbSB8IG51bGwgPSBudWxsO1xubGV0IGlzTW91bnRlZCA9IGZhbHNlO1xuXG5leHBvcnQgY29uc3QgY3VycmVudCA9IHtcbiAgdm5vZGU6IG51bGwgYXMgVm5vZGUgfCBudWxsLFxuICBjb21wb25lbnQ6IG51bGwgYXMgVmFseXJpYW5Db21wb25lbnQgfCBudWxsLFxuICBldmVudDogbnVsbCBhcyBFdmVudCB8IG51bGxcbn07XG5cbmV4cG9ydCBjb25zdCByZXNlcnZlZFByb3BzID0gbmV3IFNldDxzdHJpbmc+KFtcbiAgXCJrZXlcIixcbiAgXCJzdGF0ZVwiLFxuICBcInYta2VlcFwiLFxuICBcInYtdGV4dFwiLFxuICBcInYtaWZcIixcbiAgXCJ2LWZvclwiLFxuICBcInYtc2hvd1wiLFxuICBcInYtY2xhc3NcIixcbiAgXCJ2LWh0bWxcIixcbiAgXCJ2LW1vZGVsXCIsXG4gIFwidi1jcmVhdGVcIixcbiAgXCJ2LXVwZGF0ZVwiLFxuICBcInYtY2xlYW51cFwiXG5dKTtcblxuY29uc3Qgb25DbGVhbnVwU2V0ID0gbmV3IFNldDxGdW5jdGlvbj4oKTtcbmNvbnN0IG9uTW91bnRTZXQgPSBuZXcgU2V0PEZ1bmN0aW9uPigpO1xuY29uc3Qgb25VcGRhdGVTZXQgPSBuZXcgU2V0PEZ1bmN0aW9uPigpO1xuY29uc3Qgb25Vbm1vdW50U2V0ID0gbmV3IFNldDxGdW5jdGlvbj4oKTtcbmV4cG9ydCBjb25zdCBvbk1vdW50ID0gKGNhbGxiYWNrOiBGdW5jdGlvbikgPT4gIWlzTW91bnRlZCAmJiBvbk1vdW50U2V0LmFkZChjYWxsYmFjayk7XG5leHBvcnQgY29uc3Qgb25VcGRhdGUgPSAoY2FsbGJhY2s6IEZ1bmN0aW9uKSA9PiBvblVwZGF0ZVNldC5hZGQoY2FsbGJhY2spO1xuZXhwb3J0IGNvbnN0IG9uQ2xlYW51cCA9IChjYWxsYmFjazogRnVuY3Rpb24pID0+IG9uQ2xlYW51cFNldC5hZGQoY2FsbGJhY2spO1xuZXhwb3J0IGNvbnN0IG9uVW5tb3VudCA9IChjYWxsYmFjazogRnVuY3Rpb24pID0+ICFpc01vdW50ZWQgJiYgb25Vbm1vdW50U2V0LmFkZChjYWxsYmFjayk7XG5jb25zdCBjYWxsU2V0ID0gKHNldDogU2V0PEZ1bmN0aW9uPikgPT4ge1xuICBmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIHNldCkge1xuICAgIGNhbGxiYWNrKCk7XG4gIH1cbiAgc2V0LmNsZWFyKCk7XG59O1xuXG5jb25zdCBoYW5kbGVWSWYgPSAoc2hvdWxkUmVuZGVyOiBib29sZWFuKTogRGlyZWN0aXZlID0+IHtcbiAgcmV0dXJuICh2YWx1ZSwgdm5vZGUpID0+IHtcbiAgICBjb25zdCBib29sID0gc2hvdWxkUmVuZGVyICE9PSBCb29sZWFuKHZhbHVlKTtcbiAgICBpZiAoYm9vbCkge1xuICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IHZub2RlLmRvbT8ucGFyZW50Tm9kZTtcbiAgICAgIGlmIChwYXJlbnROb2RlKSB7XG4gICAgICAgIGNvbnN0IG5ld2RvbSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiXCIpO1xuICAgICAgICBwYXJlbnROb2RlLnJlcGxhY2VDaGlsZChuZXdkb20sIHZub2RlLmRvbSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgZGlyZWN0aXZlczogUmVjb3JkPHN0cmluZywgRGlyZWN0aXZlPiA9IHtcbiAgXCJ2LWlmXCI6IGhhbmRsZVZJZih0cnVlKSxcbiAgXCJ2LXVubGVzc1wiOiBoYW5kbGVWSWYoZmFsc2UpLFxuXG4gIFwidi1zaG93XCI6ICh2YWx1ZSwgdm5vZGUpID0+IHtcbiAgICBjb25zdCBib29sID0gQm9vbGVhbih2YWx1ZSk7XG4gICAgKFxuICAgICAgdm5vZGUuZG9tIGFzIHVua25vd24gYXMge1xuICAgICAgICBzdHlsZTogeyBkaXNwbGF5OiBzdHJpbmcgfTtcbiAgICAgIH1cbiAgICApLnN0eWxlLmRpc3BsYXkgPSBib29sID8gXCJcIiA6IFwibm9uZVwiO1xuICB9LFxuXG4gIFwidi1odG1sXCI6ICh2YWx1ZSwgdm5vZGUpID0+IHtcbiAgICB2bm9kZS5jaGlsZHJlbiA9IFt0cnVzdCh2YWx1ZSBhcyBzdHJpbmcpXTtcbiAgfSxcblxuICAvLyBUaGUgXCJ2LW1vZGVsXCIgZGlyZWN0aXZlIGJpbmRzIHRoZSB2YWx1ZSBvZiBhbiBpbnB1dCBlbGVtZW50IHRvIGEgbW9kZWwgcHJvcGVydHlcbiAgXCJ2LW1vZGVsXCI6ICh2YWwsIHZub2RlKSA9PiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICAgIGxldCBbbW9kZWwsIHByb3BlcnR5LCBldmVudF06IGFueVtdID0gdmFsIGFzIGFueVtdO1xuICAgIGxldCB2YWx1ZTtcbiAgICAvLyBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIG1vZGVsIHByb3BlcnR5IHdoZW4gdGhlIGlucHV0IGVsZW1lbnQncyB2YWx1ZSBjaGFuZ2VzXG4gICAgbGV0IGhhbmRsZXIgPSAoZTogRXZlbnQpID0+IChtb2RlbFtwcm9wZXJ0eV0gPSAoZS50YXJnZXQgYXMgRG9tRWxlbWVudCAmIFJlY29yZDxzdHJpbmcsIGFueT4pLnZhbHVlKTtcbiAgICBpZiAodm5vZGUudGFnID09PSBcImlucHV0XCIpIHtcbiAgICAgIC8vIElmIHRoZSBlbGVtZW50IGlzIGFuIGlucHV0LCB1c2UgdGhlIFwiaW5wdXRcIiBldmVudCBieSBkZWZhdWx0XG4gICAgICBldmVudCA9IGV2ZW50IHx8IFwib25pbnB1dFwiO1xuICAgICAgLy8gRGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIGlucHV0IGVsZW1lbnQsIHVzZSBhIGRpZmZlcmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAgICBzd2l0Y2ggKHZub2RlLnByb3BzLnR5cGUpIHtcbiAgICAgICAgY2FzZSBcImNoZWNrYm94XCI6IHtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShtb2RlbFtwcm9wZXJ0eV0pKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgbW9kZWwgcHJvcGVydHkgaXMgYW4gYXJyYXksIGFkZCBvciByZW1vdmUgdGhlIHZhbHVlIGZyb20gdGhlIGFycmF5IHdoZW4gdGhlIGNoZWNrYm94IGlzIGNoZWNrZWQgb3IgdW5jaGVja2VkXG4gICAgICAgICAgICBoYW5kbGVyID0gKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbCA9IChlLnRhcmdldCBhcyBEb21FbGVtZW50ICYgUmVjb3JkPHN0cmluZywgYW55PikudmFsdWU7XG4gICAgICAgICAgICAgIGNvbnN0IGlkeCA9IG1vZGVsW3Byb3BlcnR5XS5pbmRleE9mKHZhbCk7XG4gICAgICAgICAgICAgIGlmIChpZHggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgbW9kZWxbcHJvcGVydHldLnB1c2godmFsKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtb2RlbFtwcm9wZXJ0eV0uc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvLyBJZiB0aGUgdmFsdWUgaXMgaW4gdGhlIGFycmF5LCBzZXQgdGhlIGNoZWNrYm94IHRvIGJlIGNoZWNrZWRcbiAgICAgICAgICAgIHZhbHVlID0gbW9kZWxbcHJvcGVydHldLmluZGV4T2Yodm5vZGUuZG9tLnZhbHVlKSAhPT0gLTE7XG4gICAgICAgICAgfSBlbHNlIGlmIChcInZhbHVlXCIgaW4gdm5vZGUucHJvcHMpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBpbnB1dCBlbGVtZW50IGhhcyBhIFwidmFsdWVcIiBhdHRyaWJ1dGUsIHVzZSBpdCB0byBkZXRlcm1pbmUgdGhlIGNoZWNrZWQgc3RhdGVcbiAgICAgICAgICAgIGhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChtb2RlbFtwcm9wZXJ0eV0gPT09IHZub2RlLnByb3BzLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgbW9kZWxbcHJvcGVydHldID0gbnVsbDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtb2RlbFtwcm9wZXJ0eV0gPSB2bm9kZS5wcm9wcy52YWx1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHZhbHVlID0gbW9kZWxbcHJvcGVydHldID09PSB2bm9kZS5wcm9wcy52YWx1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gXCJ2YWx1ZVwiIGF0dHJpYnV0ZSwgdXNlIGEgYm9vbGVhbiB2YWx1ZSBmb3IgdGhlIG1vZGVsIHByb3BlcnR5XG4gICAgICAgICAgICBoYW5kbGVyID0gKCkgPT4gKG1vZGVsW3Byb3BlcnR5XSA9ICFtb2RlbFtwcm9wZXJ0eV0pO1xuICAgICAgICAgICAgdmFsdWUgPSBtb2RlbFtwcm9wZXJ0eV07XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFNldCB0aGUgXCJjaGVja2VkXCIgYXR0cmlidXRlIG9uIHRoZSBpbnB1dCBlbGVtZW50XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgICAgICAgc2hhcmVkU2V0QXR0cmlidXRlKFwiY2hlY2tlZFwiLCB2YWx1ZSwgdm5vZGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJyYWRpb1wiOiB7XG4gICAgICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgaXMgYSByYWRpbyBidXR0b24sIHNldCB0aGUgXCJjaGVja2VkXCIgYXR0cmlidXRlIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiB0aGUgbW9kZWwgcHJvcGVydHlcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICAgICAgICBzaGFyZWRTZXRBdHRyaWJ1dGUoXCJjaGVja2VkXCIsIG1vZGVsW3Byb3BlcnR5XSA9PT0gdm5vZGUuZG9tLnZhbHVlLCB2bm9kZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIC8vIEZvciBhbGwgb3RoZXIgaW5wdXQgdHlwZXMsIHNldCB0aGUgXCJ2YWx1ZVwiIGF0dHJpYnV0ZSBiYXNlZCBvbiB0aGUgdmFsdWUgb2YgdGhlIG1vZGVsIHByb3BlcnR5XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgICAgICAgc2hhcmVkU2V0QXR0cmlidXRlKFwidmFsdWVcIiwgbW9kZWxbcHJvcGVydHldLCB2bm9kZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHZub2RlLnRhZyA9PT0gXCJzZWxlY3RcIikge1xuICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgaXMgYSBzZWxlY3QgZWxlbWVudCwgdXNlIHRoZSBcImNsaWNrXCIgZXZlbnQgYnkgZGVmYXVsdFxuICAgICAgZXZlbnQgPSBldmVudCB8fCBcIm9uY2xpY2tcIjtcbiAgICAgIGlmICh2bm9kZS5wcm9wcy5tdWx0aXBsZSkge1xuICAgICAgICAvLyBJZiB0aGUgc2VsZWN0IGVsZW1lbnQgYWxsb3dzIG11bHRpcGxlIHNlbGVjdGlvbnMsIHVwZGF0ZSB0aGUgbW9kZWwgcHJvcGVydHkgd2l0aCBhbiBhcnJheSBvZiBzZWxlY3RlZCB2YWx1ZXNcbiAgICAgICAgaGFuZGxlciA9IChlOiBFdmVudCAmIFJlY29yZDxzdHJpbmcsIGFueT4pID0+IHtcbiAgICAgICAgICBjb25zdCB2YWwgPSAoZS50YXJnZXQgYXMgRG9tRWxlbWVudCAmIFJlY29yZDxzdHJpbmcsIGFueT4pLnZhbHVlO1xuICAgICAgICAgIGlmIChlLmN0cmxLZXkpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBDdHJsIGtleSBpcyBwcmVzc2VkLCBhZGQgb3IgcmVtb3ZlIHRoZSB2YWx1ZSBmcm9tIHRoZSBhcnJheVxuICAgICAgICAgICAgY29uc3QgaWR4ID0gbW9kZWxbcHJvcGVydHldLmluZGV4T2YodmFsKTtcbiAgICAgICAgICAgIGlmIChpZHggPT09IC0xKSB7XG4gICAgICAgICAgICAgIG1vZGVsW3Byb3BlcnR5XS5wdXNoKHZhbCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBtb2RlbFtwcm9wZXJ0eV0uc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBDdHJsIGtleSBpcyBub3QgcHJlc3NlZCwgc2V0IHRoZSBtb2RlbCBwcm9wZXJ0eSB0byBhbiBhcnJheSB3aXRoIHRoZSBzZWxlY3RlZCB2YWx1ZVxuICAgICAgICAgICAgbW9kZWxbcHJvcGVydHldLnNwbGljZSgwLCBtb2RlbFtwcm9wZXJ0eV0ubGVuZ3RoKTtcbiAgICAgICAgICAgIG1vZGVsW3Byb3BlcnR5XS5wdXNoKHZhbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvLyBTZXQgdGhlIFwic2VsZWN0ZWRcIiBhdHRyaWJ1dGUgb24gdGhlIG9wdGlvbnMgYmFzZWQgb24gd2hldGhlciB0aGV5IGFyZSBpbiB0aGUgbW9kZWwgcHJvcGVydHkgYXJyYXlcbiAgICAgICAgdm5vZGUuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQ6IFZub2RlV2l0aERvbSkgPT4ge1xuICAgICAgICAgIGlmIChjaGlsZC50YWcgPT09IFwib3B0aW9uXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gXCJ2YWx1ZVwiIGluIGNoaWxkLnByb3BzID8gY2hpbGQucHJvcHMudmFsdWUgOiBjaGlsZC5jaGlsZHJlbi5qb2luKFwiXCIpLnRyaW0oKTtcbiAgICAgICAgICAgIGNoaWxkLnByb3BzLnNlbGVjdGVkID0gbW9kZWxbcHJvcGVydHldLmluZGV4T2YodmFsdWUpICE9PSAtMTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSWYgdGhlIHNlbGVjdCBlbGVtZW50IGRvZXMgbm90IGFsbG93IG11bHRpcGxlIHNlbGVjdGlvbnMsIHNldCB0aGUgXCJzZWxlY3RlZFwiIGF0dHJpYnV0ZSBvbiB0aGUgb3B0aW9ucyBiYXNlZCBvbiB0aGUgdmFsdWUgb2YgdGhlIG1vZGVsIHByb3BlcnR5XG4gICAgICAgIHZub2RlLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkOiBWbm9kZVdpdGhEb20pID0+IHtcbiAgICAgICAgICBpZiAoY2hpbGQudGFnID09PSBcIm9wdGlvblwiKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IFwidmFsdWVcIiBpbiBjaGlsZC5wcm9wcyA/IGNoaWxkLnByb3BzLnZhbHVlIDogY2hpbGQuY2hpbGRyZW4uam9pbihcIlwiKS50cmltKCk7XG4gICAgICAgICAgICBjaGlsZC5wcm9wcy5zZWxlY3RlZCA9IHZhbHVlID09PSBtb2RlbFtwcm9wZXJ0eV07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHZub2RlLnRhZyA9PT0gXCJ0ZXh0YXJlYVwiKSB7XG4gICAgICAvLyBJZiB0aGUgZWxlbWVudCBpcyBhIHRleHRhcmVhLCB1c2UgdGhlIFwiaW5wdXRcIiBldmVudCBieSBkZWZhdWx0XG4gICAgICBldmVudCA9IGV2ZW50IHx8IFwib25pbnB1dFwiO1xuICAgICAgLy8gU2V0IHRoZSB0ZXh0YXJlYSdzIGNvbnRlbnQgdG8gdGhlIHZhbHVlIG9mIHRoZSBtb2RlbCBwcm9wZXJ0eVxuICAgICAgdm5vZGUuY2hpbGRyZW4gPSBbbW9kZWxbcHJvcGVydHldXTtcbiAgICB9XG5cbiAgICAvLyBXZSBhc3N1bWUgdGhhdCB0aGUgcHJldiBoYW5kbGVyIGlmIGFueSB3aWxsIG5vdCBiZSBjaGFuZ2VkIGJ5IHRoZSB1c2VyIGFjcm9zcyBwYXRjaHNcbiAgICBjb25zdCBwcmV2SGFuZGxlciA9IHZub2RlLnByb3BzW2V2ZW50XTtcblxuICAgIC8vIFNldCB0aGUgZXZlbnQgaGFuZGxlciBvbiB0aGUgZWxlbWVudFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgIHNoYXJlZFNldEF0dHJpYnV0ZShcbiAgICAgIGV2ZW50LFxuICAgICAgKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgIGhhbmRsZXIoZSk7XG5cbiAgICAgICAgLy8gSWYgdGhlIHByZXZpb3VzIGhhbmRsZXIgaXMgZGVmaW5lZCwgY2FsbCBpdCBhZnRlciB0aGUgbW9kZWwgaGFzIGJlZW4gdXBkYXRlZFxuICAgICAgICBpZiAocHJldkhhbmRsZXIpIHtcbiAgICAgICAgICBwcmV2SGFuZGxlcihlKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHZub2RlXG4gICAgKTtcbiAgfSxcblxuICBcInYtY3JlYXRlXCI6IChjYWxsYmFjaywgdm5vZGUsIG9sZFByb3BzKSA9PiB7XG4gICAgaWYgKCFvbGRQcm9wcykge1xuICAgICAgY29uc3QgY2xlYW51cCA9IGNhbGxiYWNrKHZub2RlKTtcblxuICAgICAgaWYgKHR5cGVvZiBjbGVhbnVwID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgb25DbGVhbnVwKGNsZWFudXApO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBcInYtdXBkYXRlXCI6IChjYWxsYmFjaywgdm5vZGUsIG9sZFByb3BzKSA9PiB7XG4gICAgaWYgKG9sZFByb3BzKSB7XG4gICAgICBjb25zdCBjbGVhbnVwID0gY2FsbGJhY2sodm5vZGUsIG9sZFByb3BzKTtcblxuICAgICAgaWYgKHR5cGVvZiBjbGVhbnVwID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgb25DbGVhbnVwKGNsZWFudXApO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBcInYtY2xlYW51cFwiOiAoY2FsbGJhY2ssIHZub2RlKSA9PiB7XG4gICAgb25DbGVhbnVwKCgpID0+IGNhbGxiYWNrKHZub2RlKSk7XG4gIH0sXG5cbiAgXCJ2LWNsYXNzXCI6ICh2YWx1ZSwgdm5vZGUpID0+IHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICB2bm9kZS5kb20uY2xhc3NOYW1lID0gdmFsdWU7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgdm5vZGUuZG9tLmNsYXNzTmFtZSA9IHZhbHVlLmpvaW4oXCIgXCIpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBjb25zdCBjbGFzc0xpc3QgPSB2bm9kZS5kb20uY2xhc3NMaXN0O1xuICAgICAgZm9yIChjb25zdCBuYW1lIGluIHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHZhbCA9IHR5cGVvZiB2YWx1ZVtuYW1lXSA9PT0gXCJmdW5jdGlvblwiID8gKHZhbHVlW25hbWVdIGFzIEZ1bmN0aW9uKSgpIDogdmFsdWVbbmFtZV07XG4gICAgICAgIGNsYXNzTGlzdC50b2dnbGUobmFtZSwgdmFsKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgLy8gRnJlcXVlbnQgdXNlZCBwcm9wZXJ0aWVzXG4gIGNsYXNzKHZhbHVlLCB2bm9kZSkge1xuICAgIGlmICh2bm9kZS5kb20uY2xhc3NOYW1lICE9PSB2YWx1ZSkge1xuICAgICAgdm5vZGUuZG9tLmNsYXNzTmFtZSA9IHZhbHVlO1xuICAgIH1cbiAgfSxcblxuICBjbGFzc05hbWUodmFsdWUsIHZub2RlKSB7XG4gICAgZGlyZWN0aXZlcy5jbGFzcyh2YWx1ZSwgdm5vZGUsIG51bGwpO1xuICB9LFxuXG4gIGlkOiAodmFsdWUsIHZub2RlKSA9PiB7XG4gICAgdm5vZGUuZG9tLmlkID0gdmFsdWU7XG4gIH0sXG5cbiAgc3R5bGU6ICh2YWx1ZSwgdm5vZGUpID0+IHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICB2bm9kZS5kb20uc3R5bGUgPSB2YWx1ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgdm5vZGUuZG9tLnN0eWxlID0gXCJcIjtcbiAgICAgIGNvbnN0IGRvbVN0eWxlID0gdm5vZGUuZG9tLnN0eWxlO1xuICAgICAgZm9yIChjb25zdCBuYW1lIGluIHZhbHVlKSB7XG4gICAgICAgIGRvbVN0eWxlW25hbWVdID0gdmFsdWVbbmFtZV07XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZGlyZWN0aXZlKG5hbWU6IHN0cmluZywgZGlyZWN0aXZlOiBEaXJlY3RpdmUpIHtcbiAgY29uc3QgZGlyZWN0aXZlTmFtZSA9IGB2LSR7bmFtZX1gO1xuICBkaXJlY3RpdmVzW2RpcmVjdGl2ZU5hbWVdID0gZGlyZWN0aXZlO1xuICByZXNlcnZlZFByb3BzLmFkZChkaXJlY3RpdmVOYW1lKTtcbn1cblxuY29uc3QgZXZlbnRMaXN0ZW5lck5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbmZ1bmN0aW9uIGV2ZW50TGlzdGVuZXIoZTogRXZlbnQpIHtcbiAgY3VycmVudC5ldmVudCA9IGU7XG4gIGxldCBkb20gPSBlLnRhcmdldCBhcyBEb21FbGVtZW50O1xuICBjb25zdCBuYW1lID0gYG9uJHtlLnR5cGV9YDtcblxuICB3aGlsZSAoZG9tKSB7XG4gICAgY29uc3Qgb2xkUHJvcHMgPSBkb20ucHJvcHM7XG4gICAgaWYgKG9sZFByb3BzICYmIG9sZFByb3BzW25hbWVdKSB7XG4gICAgICBvbGRQcm9wc1tuYW1lXShlLCBkb20pO1xuXG4gICAgICBpZiAoIWUuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICAgICAgdXBkYXRlKCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGRvbSA9IGRvbS5wYXJlbnROb2RlIGFzIERvbUVsZW1lbnQ7XG4gIH1cblxuICBjdXJyZW50LmV2ZW50ID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gc2hhcmVkU2V0QXR0cmlidXRlKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSwgbmV3Vm5vZGU6IFZub2RlV2l0aERvbSk6IHZvaWQgfCBib29sZWFuIHtcbiAgY29uc3QgbmV3Vm5vZGVEb20gPSBuZXdWbm9kZS5kb207XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGlmICghZXZlbnRMaXN0ZW5lck5hbWVzLmhhcyhuYW1lKSkge1xuICAgICAgKG1haW5Wbm9kZSBhcyBWbm9kZVdpdGhEb20pLmRvbS5hZGRFdmVudExpc3RlbmVyKG5hbWUuc2xpY2UoMiksIGV2ZW50TGlzdGVuZXIpO1xuICAgICAgZXZlbnRMaXN0ZW5lck5hbWVzLmFkZChuYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKG5hbWUgaW4gbmV3Vm5vZGVEb20pIHtcbiAgICBuZXdWbm9kZURvbVtuYW1lXSA9IHZhbHVlO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICBuZXdWbm9kZURvbS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gIH0gZWxzZSB7XG4gICAgbmV3Vm5vZGVEb20uc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0QXR0cmlidXRlKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSwgbmV3Vm5vZGU6IFZub2RlV2l0aERvbSk6IHZvaWQge1xuICBpZiAoIXJlc2VydmVkUHJvcHMuaGFzKG5hbWUpKSB7XG4gICAgbmV3Vm5vZGUucHJvcHNbbmFtZV0gPSB2YWx1ZTtcbiAgICBzaGFyZWRTZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUsIG5ld1Zub2RlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZW1vdmVBdHRyaWJ1dGVzKHZub2RlOiBWbm9kZVdpdGhEb20sIG9sZFByb3BzOiBWbm9kZVByb3BlcnRpZXMgfCBudWxsKTogdm9pZCB7XG4gIGlmICghb2xkUHJvcHMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB2bm9kZURvbSA9IHZub2RlLmRvbTtcbiAgY29uc3Qgdm5vZGVQcm9wcyA9IHZub2RlLnByb3BzO1xuXG4gIGZvciAoY29uc3QgbmFtZSBpbiBvbGRQcm9wcykge1xuICAgIGlmIChuYW1lIGluIHZub2RlUHJvcHMgPT09IGZhbHNlICYmICFldmVudExpc3RlbmVyTmFtZXMuaGFzKG5hbWUpICYmICFyZXNlcnZlZFByb3BzLmhhcyhuYW1lKSkge1xuICAgICAgaWYgKG5hbWUgaW4gdm5vZGVEb20pIHtcbiAgICAgICAgdm5vZGVEb21bbmFtZV0gPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdm5vZGVEb20ucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhZGRQcm9wZXJ0aWVzKHZub2RlOiBWbm9kZVdpdGhEb20sIG9sZFByb3BzOiBWbm9kZVByb3BlcnRpZXMgfCBudWxsKSB7XG4gIGNvbnN0IHZub2RlUHJvcHMgPSB2bm9kZS5wcm9wcztcbiAgZm9yIChjb25zdCBuYW1lIGluIHZub2RlUHJvcHMpIHtcbiAgICBpZiAoZGlyZWN0aXZlc1tuYW1lXSkge1xuICAgICAgaWYgKGRpcmVjdGl2ZXNbbmFtZV0odm5vZGVQcm9wc1tuYW1lXSwgdm5vZGUsIG9sZFByb3BzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAocmVzZXJ2ZWRQcm9wcy5oYXMobmFtZSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHNoYXJlZFNldEF0dHJpYnV0ZShuYW1lLCB2bm9kZVByb3BzW25hbWVdLCB2bm9kZSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUF0dHJpYnV0ZXMobmV3Vm5vZGU6IFZub2RlV2l0aERvbSwgb2xkUHJvcHM6IFZub2RlUHJvcGVydGllcyB8IG51bGwpOiB2b2lkIHtcbiAgcmVtb3ZlQXR0cmlidXRlcyhuZXdWbm9kZSwgb2xkUHJvcHMpO1xuICBhZGRQcm9wZXJ0aWVzKG5ld1Zub2RlLCBvbGRQcm9wcyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbGVtZW50KHRhZzogc3RyaW5nLCBpc1NWRzogYm9vbGVhbik6IERvbUVsZW1lbnQge1xuICByZXR1cm4gaXNTVkdcbiAgICA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIHRhZylcbiAgICA6IChkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZykgYXMgRG9tRWxlbWVudCk7XG59XG5cbmZ1bmN0aW9uIGZsYXRUcmVlKG5ld1Zub2RlOiBWbm9kZVdpdGhEb20sIGNoaWxkcmVuOiBDaGlsZHJlbikge1xuICBjdXJyZW50LnZub2RlID0gbmV3Vm5vZGU7XG4gIGxldCBpID0gMDtcblxuICB3aGlsZSAoaSA8IGNoaWxkcmVuLmxlbmd0aCkge1xuICAgIGNvbnN0IG5ld0NoaWxkID0gY2hpbGRyZW5baV07XG5cbiAgICBpZiAobmV3Q2hpbGQgPT0gbnVsbCkge1xuICAgICAgY2hpbGRyZW4uc3BsaWNlKGksIDEpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkobmV3Q2hpbGQpKSB7XG4gICAgICBjaGlsZHJlbi5zcGxpY2UoaSwgMSwgLi4ubmV3Q2hpbGQpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKG5ld0NoaWxkIGluc3RhbmNlb2YgVm5vZGUpIHtcbiAgICAgIGlmIChuZXdDaGlsZC5wcm9wcyA9PT0gbnVsbCkge1xuICAgICAgICBuZXdDaGlsZC5wcm9wcyA9IHt9O1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIG5ld0NoaWxkLnRhZyAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICBjb25zdCBjb21wb25lbnQgPSBuZXdDaGlsZC50YWc7XG5cbiAgICAgICAgY3VycmVudC5jb21wb25lbnQgPSBuZXdDaGlsZC50YWc7XG4gICAgICAgIGNoaWxkcmVuW2ldID0gKFwidmlld1wiIGluIGNvbXBvbmVudCA/IGNvbXBvbmVudC52aWV3IDogY29tcG9uZW50KS5iaW5kKGNvbXBvbmVudCkoXG4gICAgICAgICAgbmV3Q2hpbGQucHJvcHMsXG4gICAgICAgICAgbmV3Q2hpbGQuY2hpbGRyZW5cbiAgICAgICAgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXdDaGlsZC5pc1NWRyA9IG5ld1Zub2RlLmlzU1ZHIHx8IG5ld0NoaWxkLnRhZyA9PT0gXCJzdmdcIjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpKys7XG4gIH1cblxuICByZXR1cm4gY2hpbGRyZW47XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVZGb3IobmV3Vm5vZGU6IFZub2RlV2l0aERvbSkge1xuICBpZiAoXCJ2LWZvclwiIGluIG5ld1Zub2RlLnByb3BzKSB7XG4gICAgY29uc3Qgc2V0ID0gbmV3Vm5vZGUucHJvcHNbXCJ2LWZvclwiXTtcbiAgICBjb25zdCBjaGlsZHJlbiA9IFtdO1xuICAgIGNvbnN0IGNhbGxiYWNrID0gbmV3Vm5vZGUuY2hpbGRyZW5bMF07XG4gICAgY2hpbGRyZW4ubGVuZ3RoID0gc2V0Lmxlbmd0aDtcblxuICAgIGZvciAobGV0IGkgPSAwLCBsID0gc2V0Lmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgY2hpbGRyZW5baV0gPSBjYWxsYmFjayhzZXRbaV0sIGkpO1xuICAgIH1cblxuICAgIHJldHVybiBjaGlsZHJlbjtcbiAgfVxuICByZXR1cm4gWy4uLm5ld1Zub2RlLmNoaWxkcmVuXTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTmV3RWxlbWVudChuZXdDaGlsZDogVm5vZGVXaXRoRG9tLCBuZXdWbm9kZTogVm5vZGVXaXRoRG9tLCBvbGRDaGlsZDogRG9tRWxlbWVudCB8IG51bGwpIHtcbiAgY29uc3QgZG9tID0gY3JlYXRlRWxlbWVudChuZXdDaGlsZC50YWcsIG5ld0NoaWxkLmlzU1ZHIGFzIGJvb2xlYW4pO1xuICBpZiAob2xkQ2hpbGQpIHtcbiAgICBuZXdWbm9kZS5kb20ucmVwbGFjZUNoaWxkKGRvbSwgb2xkQ2hpbGQpO1xuICB9IGVsc2Uge1xuICAgIG5ld1Zub2RlLmRvbS5hcHBlbmRDaGlsZChkb20pO1xuICB9XG4gIG5ld0NoaWxkLmRvbSA9IGRvbTtcbiAgYWRkUHJvcGVydGllcyhuZXdDaGlsZCwgbnVsbCk7XG4gIG5ld0NoaWxkLmRvbS5wcm9wcyA9IG5ld0NoaWxkLnByb3BzO1xuICBpZiAoXCJ2LXRleHRcIiBpbiBuZXdDaGlsZC5wcm9wcykge1xuICAgIG5ld0NoaWxkLmRvbS50ZXh0Q29udGVudCA9IG5ld0NoaWxkLnByb3BzW1widi10ZXh0XCJdO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGNoaWxkcmVuID0gZmxhdFRyZWUobmV3Q2hpbGQsIGhhbmRsZVZGb3IobmV3Q2hpbGQpKTtcbiAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xuICAgIG5ld0NoaWxkLmRvbS50ZXh0Q29udGVudCA9IFwiXCI7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBpZiAoY2hpbGRyZW5baV0gaW5zdGFuY2VvZiBWbm9kZSA9PT0gZmFsc2UpIHtcbiAgICAgIG5ld0NoaWxkLmRvbS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjaGlsZHJlbltpXSkpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNyZWF0ZU5ld0VsZW1lbnQoY2hpbGRyZW5baV0sIG5ld0NoaWxkLCBudWxsKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXRjaEtleWVkKG5ld1Zub2RlOiBWbm9kZVdpdGhEb20sIGNoaWxkcmVuOiBDaGlsZHJlbikge1xuICBjb25zdCBvbGRUcmVlID0gWy4uLkFycmF5LmZyb20obmV3Vm5vZGUuZG9tLmNoaWxkTm9kZXMpXSBhcyB1bmtub3duIGFzIERvbUVsZW1lbnRbXTtcbiAgY29uc3QgY2hpbGROb2RlcyA9IG5ld1Zub2RlLmRvbS5jaGlsZE5vZGVzO1xuICBjb25zdCBvbGRLZXllZExpc3Q6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcbiAgY29uc3QgbmV3S2V5ZWRMaXN0OiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG5cbiAgZm9yIChsZXQgaSA9IDAsIGwgPSBvbGRUcmVlLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGNvbnN0IG9sZFByb3BzID0gb2xkVHJlZVtpXS5wcm9wcztcbiAgICBpZiAob2xkUHJvcHMpIHtcbiAgICAgIG9sZEtleWVkTGlzdFtvbGRQcm9wcy5rZXkgYXMgc3RyaW5nXSA9IGk7XG4gICAgfVxuXG4gICAgaWYgKGkgPCBjaGlsZHJlbi5sZW5ndGggJiYgY2hpbGRyZW5baV0gaW5zdGFuY2VvZiBWbm9kZSkge1xuICAgICAgbmV3S2V5ZWRMaXN0W2NoaWxkcmVuW2ldLnByb3BzLmtleSBhcyBzdHJpbmddID0gaTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGxldCBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGNvbnN0IG5ld0NoaWxkID0gY2hpbGRyZW5baV07XG4gICAgY29uc3Qgb2xkQ2hpbGQgPSBvbGRUcmVlW29sZEtleWVkTGlzdFtuZXdDaGlsZC5wcm9wcy5rZXkgYXMgc3RyaW5nXV07XG5cbiAgICBpZiAoIW9sZENoaWxkKSB7XG4gICAgICBjcmVhdGVOZXdFbGVtZW50KG5ld0NoaWxkLCBuZXdWbm9kZSwgY2hpbGROb2Rlc1tpXSBhcyBEb21FbGVtZW50IHwgbnVsbCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBuZXdDaGlsZC5kb20gPSBvbGRDaGlsZDtcbiAgICBjb25zdCBjdXJyZW50Q2hpbGQgPSBjaGlsZE5vZGVzW2ldO1xuICAgIGlmICghY3VycmVudENoaWxkKSB7XG4gICAgICBuZXdWbm9kZS5kb20uYXBwZW5kQ2hpbGQob2xkQ2hpbGQpO1xuICAgIH0gZWxzZSBpZiAoY3VycmVudENoaWxkICE9PSBvbGRDaGlsZCkge1xuICAgICAgbmV3Vm5vZGUuZG9tLnJlcGxhY2VDaGlsZChvbGRDaGlsZCwgY3VycmVudENoaWxkKTtcbiAgICB9XG5cbiAgICBpZiAoXCJ2LWtlZXBcIiBpbiBuZXdDaGlsZC5wcm9wcyA9PT0gZmFsc2UgfHwgb2xkQ2hpbGQucHJvcHNbXCJ2LWtlZXBcIl0gIT09IG5ld0NoaWxkLnByb3BzW1widi1rZWVwXCJdKSB7XG4gICAgICB1cGRhdGVBdHRyaWJ1dGVzKG5ld0NoaWxkIGFzIFZub2RlV2l0aERvbSwgb2xkQ2hpbGQucHJvcHMpO1xuICAgICAgb2xkQ2hpbGQucHJvcHMgPSBuZXdDaGlsZC5wcm9wcztcblxuICAgICAgaWYgKFwidi10ZXh0XCIgaW4gbmV3Q2hpbGQucHJvcHMpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcVxuICAgICAgICBpZiAob2xkQ2hpbGQudGV4dENvbnRlbnQgIT0gbmV3Q2hpbGQucHJvcHNbXCJ2LXRleHRcIl0pIHtcbiAgICAgICAgICBvbGRDaGlsZC50ZXh0Q29udGVudCA9IG5ld0NoaWxkLnByb3BzW1widi10ZXh0XCJdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgICBwYXRjaChuZXdDaGlsZCBhcyBWbm9kZVdpdGhEb20pO1xuICAgIH1cbiAgfVxuXG4gIGZvciAobGV0IGkgPSBjaGlsZHJlbi5sZW5ndGgsIGwgPSBjaGlsZE5vZGVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGNoaWxkTm9kZXNbaV0/LnJlbW92ZSgpO1xuICB9XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG5leHBvcnQgZnVuY3Rpb24gcGF0Y2gobmV3Vm5vZGU6IFZub2RlV2l0aERvbSk6IHZvaWQge1xuICBjb25zdCBjaGlsZHJlbiA9IGZsYXRUcmVlKG5ld1Zub2RlLCBoYW5kbGVWRm9yKG5ld1Zub2RlKSk7XG5cbiAgY29uc3QgZG9tID0gbmV3Vm5vZGUuZG9tO1xuXG4gIGlmIChjaGlsZHJlbi5sZW5ndGggPT09IDApIHtcbiAgICBpZiAoZG9tLmNoaWxkTm9kZXMubGVuZ3RoKSB7XG4gICAgICBkb20udGV4dENvbnRlbnQgPSBcIlwiO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBvbGREb21DaGlsZHJlbiA9IGRvbS5jaGlsZE5vZGVzIGFzIHVua25vd24gYXMgRG9tRWxlbWVudFtdO1xuICBjb25zdCBvbGRDaGlsZHJlbkxlbmd0aCA9IG9sZERvbUNoaWxkcmVuLmxlbmd0aDtcbiAgaWYgKG9sZENoaWxkcmVuTGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGZpcnN0T2xkUHJvcHMgPSBvbGREb21DaGlsZHJlblswXS5wcm9wcztcbiAgICBjb25zdCBmaXJzdFZub2RlID0gY2hpbGRyZW5bMF0gYXMgVm5vZGVXaXRoRG9tO1xuICAgIGlmIChmaXJzdE9sZFByb3BzICYmIGZpcnN0Vm5vZGUgaW5zdGFuY2VvZiBWbm9kZSAmJiBcImtleVwiIGluIGZpcnN0Vm5vZGUucHJvcHMgJiYgXCJrZXlcIiBpbiBmaXJzdE9sZFByb3BzKSB7XG4gICAgICBwYXRjaEtleWVkKG5ld1Zub2RlLCBjaGlsZHJlbik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgY29uc3QgY2hpbGRyZW5MZW5ndGggPSBjaGlsZHJlbi5sZW5ndGg7XG4gIGlmIChvbGRDaGlsZHJlbkxlbmd0aCA9PT0gMCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW5MZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGNoaWxkcmVuW2ldIGluc3RhbmNlb2YgVm5vZGUgPT09IGZhbHNlKSB7XG4gICAgICAgIGRvbS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjaGlsZHJlbltpXSkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNyZWF0ZU5ld0VsZW1lbnQoY2hpbGRyZW5baV0sIG5ld1Zub2RlLCBudWxsKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbkxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgb2xkQ2hpbGQgPSBvbGREb21DaGlsZHJlbltpXTtcbiAgICBjb25zdCBuZXdDaGlsZCA9IGNoaWxkcmVuW2ldO1xuXG4gICAgaWYgKG5ld0NoaWxkIGluc3RhbmNlb2YgVm5vZGUgPT09IGZhbHNlKSB7XG4gICAgICBpZiAoIW9sZENoaWxkKSB7XG4gICAgICAgIG5ld1Zub2RlLmRvbS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShuZXdDaGlsZCkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9sZENoaWxkLm5vZGVUeXBlICE9PSAzKSB7XG4gICAgICAgIG5ld1Zub2RlLmRvbS5yZXBsYWNlQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobmV3Q2hpbGQpLCBvbGRDaGlsZCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG4gICAgICBpZiAob2xkQ2hpbGQubm9kZVZhbHVlICE9IG5ld0NoaWxkKSB7XG4gICAgICAgIG9sZENoaWxkLm5vZGVWYWx1ZSA9IG5ld0NoaWxkO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKCFvbGRDaGlsZCkge1xuICAgICAgY3JlYXRlTmV3RWxlbWVudChuZXdDaGlsZCwgbmV3Vm5vZGUsIG51bGwpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKFwidi1rZWVwXCIgaW4gbmV3Q2hpbGQucHJvcHMpIHtcbiAgICAgIGlmIChvbGRDaGlsZC5wcm9wcyAmJiBvbGRDaGlsZC5wcm9wc1tcInYta2VlcFwiXSA9PT0gbmV3Q2hpbGQucHJvcHNbXCJ2LWtlZXBcIl0pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5leHRPbGRDaGlsZCA9IG9sZERvbUNoaWxkcmVuW2kgKyAxXTtcbiAgICAgIGlmIChuZXh0T2xkQ2hpbGQgJiYgbmV4dE9sZENoaWxkLnByb3BzICYmIG5leHRPbGRDaGlsZC5wcm9wc1tcInYta2VlcFwiXSA9PT0gbmV3Q2hpbGQucHJvcHNbXCJ2LWtlZXBcIl0pIHtcbiAgICAgICAgb2xkQ2hpbGQucmVtb3ZlKCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChuZXdDaGlsZC50YWcgIT09IG9sZENoaWxkLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIGNyZWF0ZU5ld0VsZW1lbnQobmV3Q2hpbGQsIG5ld1Zub2RlLCBvbGRDaGlsZCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBuZXdDaGlsZC5kb20gPSBvbGRDaGlsZDtcbiAgICB1cGRhdGVBdHRyaWJ1dGVzKG5ld0NoaWxkIGFzIFZub2RlV2l0aERvbSwgb2xkQ2hpbGQucHJvcHMgfHwgbnVsbCk7XG4gICAgb2xkQ2hpbGQucHJvcHMgPSBuZXdDaGlsZC5wcm9wcztcbiAgICBpZiAoXCJ2LXRleHRcIiBpbiBuZXdDaGlsZC5wcm9wcykge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcVxuICAgICAgaWYgKG5ld0NoaWxkLmRvbS50ZXh0Q29udGVudCAhPSBuZXdDaGlsZC5wcm9wc1tcInYtdGV4dFwiXSkge1xuICAgICAgICBuZXdDaGlsZC5kb20udGV4dENvbnRlbnQgPSBuZXdDaGlsZC5wcm9wc1tcInYtdGV4dFwiXTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBwYXRjaChuZXdDaGlsZCk7XG4gIH1cblxuICBmb3IgKGxldCBpID0gY2hpbGRyZW5MZW5ndGgsIGwgPSBvbGREb21DaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBvbGREb21DaGlsZHJlbltpXT8ucmVtb3ZlKCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVZub2RlKHZub2RlOiBWbm9kZVdpdGhEb20pOiBzdHJpbmcgfCB2b2lkIHtcbiAgY2FsbFNldChvbkNsZWFudXBTZXQpO1xuICB2bm9kZS5wcm9wcyA9IHZub2RlLnByb3BzIHx8IHt9O1xuICBwYXRjaCh2bm9kZSk7XG4gIGNhbGxTZXQoaXNNb3VudGVkID8gb25VcGRhdGVTZXQgOiBvbk1vdW50U2V0KTtcbiAgaXNNb3VudGVkID0gdHJ1ZTtcbiAgY3VycmVudC52bm9kZSA9IG51bGw7XG4gIGN1cnJlbnQuY29tcG9uZW50ID0gbnVsbDtcbiAgaWYgKGlzTm9kZUpzKSB7XG4gICAgcmV0dXJuIHZub2RlLmRvbS5pbm5lckhUTUw7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZSgpOiB2b2lkIHwgc3RyaW5nIHtcbiAgaWYgKG1haW5Wbm9kZSkge1xuICAgIG1haW5Wbm9kZS5jaGlsZHJlbiA9IFttYWluQ29tcG9uZW50XTtcbiAgICByZXR1cm4gdXBkYXRlVm5vZGUobWFpblZub2RlKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdW5tb3VudCgpIHtcbiAgaWYgKG1haW5Wbm9kZSkge1xuICAgIG1haW5Db21wb25lbnQgPSB2KCgpID0+IG51bGwsIHt9KSBhcyBWbm9kZUNvbXBvbmVudEludGVyZmFjZTtcbiAgICBjb25zdCByZXN1bHQgPSB1cGRhdGUoKTtcbiAgICBjYWxsU2V0KG9uVW5tb3VudFNldCk7XG4gICAgZm9yIChjb25zdCBuYW1lIGluIGV2ZW50TGlzdGVuZXJOYW1lcykge1xuICAgICAgbWFpblZub2RlLmRvbS5yZW1vdmVFdmVudExpc3RlbmVyKG5hbWUuc2xpY2UoMikudG9Mb3dlckNhc2UoKSwgZXZlbnRMaXN0ZW5lcik7XG4gICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KGV2ZW50TGlzdGVuZXJOYW1lcywgbmFtZSk7XG4gICAgfVxuXG4gICAgbWFpbkNvbXBvbmVudCA9IG51bGw7XG4gICAgbWFpblZub2RlID0gbnVsbDtcbiAgICBpc01vdW50ZWQgPSBmYWxzZTtcbiAgICBjdXJyZW50LnZub2RlID0gbnVsbDtcbiAgICBjdXJyZW50LmNvbXBvbmVudCA9IG51bGw7XG4gICAgY3VycmVudC5ldmVudCA9IG51bGw7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbW91bnQoZG9tOiBzdHJpbmcgfCBEb21FbGVtZW50LCBjb21wb25lbnQ6IGFueSkge1xuICBjb25zdCBjb250YWluZXIgPVxuICAgIHR5cGVvZiBkb20gPT09IFwic3RyaW5nXCIgPyAoaXNOb2RlSnMgPyBjcmVhdGVFbGVtZW50KGRvbSwgZG9tID09PSBcInN2Z1wiKSA6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZG9tKSkgOiBkb207XG5cbiAgaWYgKGlzQ29tcG9uZW50KGNvbXBvbmVudCkpIHtcbiAgICBtYWluQ29tcG9uZW50ID0gbmV3IFZub2RlKGNvbXBvbmVudCwge30sIFtdKSBhcyBWbm9kZUNvbXBvbmVudEludGVyZmFjZTtcbiAgfSBlbHNlIGlmIChpc1Zub2RlQ29tcG9uZW50KGNvbXBvbmVudCkpIHtcbiAgICBtYWluQ29tcG9uZW50ID0gY29tcG9uZW50O1xuICB9IGVsc2Uge1xuICAgIG1haW5Db21wb25lbnQgPSBuZXcgVm5vZGUoKCkgPT4gY29tcG9uZW50LCB7fSwgW10pIGFzIFZub2RlQ29tcG9uZW50SW50ZXJmYWNlO1xuICB9XG5cbiAgbWFpblZub2RlID0gZG9tVG9Wbm9kZShjb250YWluZXIpIGFzIFZub2RlV2l0aERvbTtcbiAgcmV0dXJuIHVwZGF0ZSgpO1xufVxuIl0sIm1hcHBpbmdzIjoiTUFzQ08sSUFBTUEsRUFBV0MsUUFBMkIsb0JBQVpDLFNBQTJCQSxRQUFRQyxVQUFZRCxRQUFRQyxTQUFTQyxNQUUxRkMsRUFBTixNQUNMLFdBQUFDLENBQ1NDLEVBQ0FDLEVBQ0FDLEVBQ0FDLEVBQ0FDLEdBSkFDLEtBQUFMLE1BQ0FLLEtBQUFKLFFBQ0FJLEtBQUFILFdBQ0FHLEtBQUFGLE1BQ0FFLEtBQUFELE9BQ04sR0FTUUUsRUFBZUMsR0FDMUJiLFFBQTZCLG1CQUFkYSxHQUE2QkEsR0FBa0MsaUJBQWRBLEdBQTBCLFNBQVVBLEdB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 \ No newline at end of file diff --git a/dist/index.mjs b/dist/index.mjs index cbc7397..c589a91 100644 --- a/dist/index.mjs +++ b/dist/index.mjs @@ -9,33 +9,42 @@ var Vnode = class { this.isSVG = isSVG; } }; -var isComponent = (component) => typeof component === "function"; +var isComponent = (component) => Boolean(typeof component === "function" || component && typeof component === "object" && "view" in component); var isVnode = (object) => object instanceof Vnode; var isVnodeComponent = (object) => { return isVnode(object) && isComponent(object.tag); }; +function v(tagOrComponent, props, ...children) { + return new Vnode(tagOrComponent, props, children); +} +v.fragment = (_, ...children) => children; function domToVnode(dom) { if (dom.nodeType === 3) { return dom.nodeValue; } - const vnode = new Vnode(dom.nodeName.toLowerCase(), {}, []); - vnode.dom = dom; - dom.props = vnode.props; - for (let i = 0, l = dom.childNodes.length; i < l; i++) { - const childDom = dom.childNodes[i]; - if (childDom.nodeType === 3) { - vnode.children.push(childDom.nodeValue); - } else if (childDom.nodeType === 1) { - const childVnode = domToVnode(childDom); - vnode.children.push(childVnode); + if (dom.nodeType === 1) { + const tag = dom.nodeName.toLowerCase(); + const props = {}; + const children = []; + for (let i = 0, l = dom.childNodes.length; i < l; i++) { + const childDom = dom.childNodes[i]; + if (childDom.nodeType === 3) { + children.push(childDom.nodeValue); + } else if (childDom.nodeType === 1) { + const childVnode = domToVnode(childDom); + children.push(childVnode); + } } + const attributes = dom.attributes; + for (let i = 0, l = attributes.length; i < l; i++) { + const attr = attributes[i]; + props[attr.nodeName] = attr.nodeValue; + } + const vnode = new Vnode(tag, props, children); + vnode.dom = dom; + vnode.isSVG = tag === "svg"; + return vnode; } - const props = vnode.props; - for (let i = 0, l = dom.attributes.length; i < l; i++) { - const attr = dom.attributes[i]; - props[attr.nodeName] = attr.nodeValue; - } - return vnode; } function trust(htmlString) { const div = document.createElement("div"); @@ -79,18 +88,9 @@ var callSet = (set) => { } set.clear(); }; -var directives = { - "v-for"(vnode) { - const set = vnode.props["v-for"]; - const children = vnode.children; - const callback = children[0]; - children.length = set.length; - for (let i = 0, l = set.length; i < l; i++) { - children[i] = callback(set[i], i); - } - }, - "v-if": (vnode) => { - const bool = Boolean(vnode.props["v-if"]); +var handleVIf = (shouldRender) => { + return (value, vnode) => { + const bool = shouldRender !== Boolean(value); if (bool) { const parentNode = vnode.dom?.parentNode; if (parentNode) { @@ -99,17 +99,21 @@ var directives = { } return false; } - }, - "v-show": (vnode) => { - const bool = Boolean(vnode.props["v-show"]); + }; +}; +var directives = { + "v-if": handleVIf(true), + "v-unless": handleVIf(false), + "v-show": (value, vnode) => { + const bool = Boolean(value); vnode.dom.style.display = bool ? "" : "none"; }, - "v-html": (vnode) => { - vnode.children = [trust(vnode.props["v-html"])]; + "v-html": (value, vnode) => { + vnode.children = [trust(value)]; }, // The "v-model" directive binds the value of an input element to a model property - "v-model": (vnode) => { - let [model, property, event] = vnode.props["v-model"]; + "v-model": (val, vnode) => { + let [model, property, event] = val; let value; let handler = (e) => model[property] = e.target.value; if (vnode.tag === "input") { @@ -118,10 +122,10 @@ var directives = { case "checkbox": { if (Array.isArray(model[property])) { handler = (e) => { - const val = e.target.value; - const idx = model[property].indexOf(val); + const val2 = e.target.value; + const idx = model[property].indexOf(val2); if (idx === -1) { - model[property].push(val); + model[property].push(val2); } else { model[property].splice(idx, 1); } @@ -155,17 +159,17 @@ var directives = { event = event || "onclick"; if (vnode.props.multiple) { handler = (e) => { - const val = e.target.value; + const val2 = e.target.value; if (e.ctrlKey) { - const idx = model[property].indexOf(val); + const idx = model[property].indexOf(val2); if (idx === -1) { - model[property].push(val); + model[property].push(val2); } else { model[property].splice(idx, 1); } } else { model[property].splice(0, model[property].length); - model[property].push(val); + model[property].push(val2); } }; vnode.children.forEach((child) => { @@ -198,31 +202,26 @@ var directives = { vnode ); }, - "v-create": (vnode, oldProps) => { + "v-create": (callback, vnode, oldProps) => { if (!oldProps) { - const callback = vnode.props["v-create"]; const cleanup = callback(vnode); if (typeof cleanup === "function") { onCleanup(cleanup); } } }, - "v-update": (vnode, oldProps) => { + "v-update": (callback, vnode, oldProps) => { if (oldProps) { - const callback = vnode.props["v-update"]; const cleanup = callback(vnode, oldProps); if (typeof cleanup === "function") { onCleanup(cleanup); } } }, - "v-cleanup": (vnode) => { - const callback = vnode.props["v-cleanup"]; + "v-cleanup": (callback, vnode) => { onCleanup(() => callback(vnode)); }, - // Frequent used properties - class: (vnode) => { - const value = vnode.props.class; + "v-class": (value, vnode) => { if (typeof value === "string") { vnode.dom.className = value; } else if (Array.isArray(value)) { @@ -235,16 +234,24 @@ var directives = { } } }, - id: (vnode) => { - vnode.dom.id = vnode.props.id; + // Frequent used properties + class(value, vnode) { + if (vnode.dom.className !== value) { + vnode.dom.className = value; + } + }, + className(value, vnode) { + directives.class(value, vnode, null); + }, + id: (value, vnode) => { + vnode.dom.id = value; }, - style: (vnode) => { - const value = vnode.props.style; + style: (value, vnode) => { if (typeof value === "string") { - vnode.dom.style.cssText = value; + vnode.dom.style = value; } else if (typeof value === "object") { + vnode.dom.style = ""; const domStyle = vnode.dom.style; - domStyle.cssText = ""; for (const name in value) { domStyle[name] = value[name]; } @@ -319,7 +326,7 @@ function addProperties(vnode, oldProps) { const vnodeProps = vnode.props; for (const name in vnodeProps) { if (directives[name]) { - if (directives[name](vnode, oldProps) === false) { + if (directives[name](vnodeProps[name], vnode, oldProps) === false) { break; } continue; @@ -337,9 +344,8 @@ function updateAttributes(newVnode, oldProps) { function createElement(tag, isSVG) { return isSVG ? document.createElementNS("http://www.w3.org/2000/svg", tag) : document.createElement(tag); } -function flatTree(newVnode) { +function flatTree(newVnode, children) { current.vnode = newVnode; - const { children } = newVnode; let i = 0; while (i < children.length) { const newChild = children[i]; @@ -356,9 +362,12 @@ function flatTree(newVnode) { newChild.props = {}; } if (typeof newChild.tag !== "string") { - const component = ("view" in newChild.tag ? newChild.tag.view : newChild.tag).bind(newChild.tag); - current.component = component; - children[i] = component(newChild.props, newChild.children); + const component = newChild.tag; + current.component = newChild.tag; + children[i] = ("view" in component ? component.view : component).bind(component)( + newChild.props, + newChild.children + ); continue; } else { newChild.isSVG = newVnode.isSVG || newChild.tag === "svg"; @@ -366,17 +375,22 @@ function flatTree(newVnode) { } i++; } + return children; } -function createNewElement(newChild, newVnode, oldChild) { - if (newChild instanceof Vnode === false) { - const dom2 = document.createTextNode(newChild); - if (oldChild) { - newVnode.dom.replaceChild(dom2, oldChild); - } else { - newVnode.dom.appendChild(dom2); +function handleVFor(newVnode) { + if ("v-for" in newVnode.props) { + const set = newVnode.props["v-for"]; + const children = []; + const callback = newVnode.children[0]; + children.length = set.length; + for (let i = 0, l = set.length; i < l; i++) { + children[i] = callback(set[i], i); } - return; + return children; } + return [...newVnode.children]; +} +function createNewElement(newChild, newVnode, oldChild) { const dom = createElement(newChild.tag, newChild.isSVG); if (oldChild) { newVnode.dom.replaceChild(dom, oldChild); @@ -386,25 +400,30 @@ function createNewElement(newChild, newVnode, oldChild) { newChild.dom = dom; addProperties(newChild, null); newChild.dom.props = newChild.props; - flatTree(newChild); - const children = newChild.children; + if ("v-text" in newChild.props) { + newChild.dom.textContent = newChild.props["v-text"]; + return; + } + const children = flatTree(newChild, handleVFor(newChild)); if (children.length === 0) { newChild.dom.textContent = ""; return; } for (let i = 0, l = children.length; i < l; i++) { + if (children[i] instanceof Vnode === false) { + newChild.dom.appendChild(document.createTextNode(children[i])); + continue; + } createNewElement(children[i], newChild, null); } - children.length = 0; } -function patchKeyed(newVnode) { - const oldTree = newVnode.dom.childNodes; +function patchKeyed(newVnode, children) { + const oldTree = [...Array.from(newVnode.dom.childNodes)]; + const childNodes = newVnode.dom.childNodes; const oldKeyedList = {}; const newKeyedList = {}; - const children = newVnode.children; for (let i = 0, l = oldTree.length; i < l; i++) { - const oldChild = oldTree[i]; - const oldProps = oldChild.props; + const oldProps = oldTree[i].props; if (oldProps) { oldKeyedList[oldProps.key] = i; } @@ -414,67 +433,72 @@ function patchKeyed(newVnode) { } for (let i = 0, l = children.length; i < l; i++) { const newChild = children[i]; - const oldIndex = oldKeyedList[newChild.props.key]; - const oldChild = oldTree[oldIndex]; + const oldChild = oldTree[oldKeyedList[newChild.props.key]]; if (!oldChild) { - createNewElement(newChild, newVnode, null); + createNewElement(newChild, newVnode, childNodes[i]); continue; } newChild.dom = oldChild; - if (newVnode.dom.childNodes[i] !== newChild.dom) { - newVnode.dom.insertBefore(newChild.dom, newVnode.dom.childNodes[i]); + const currentChild = childNodes[i]; + if (!currentChild) { + newVnode.dom.appendChild(oldChild); + } else if (currentChild !== oldChild) { + newVnode.dom.replaceChild(oldChild, currentChild); } - const oldProps = oldChild.props; - newChild.dom = oldChild; - oldChild.props = newChild.props; - if (oldProps && "v-keep" in newChild.props && newChild.props["v-keep"] === oldProps["v-keep"]) { - continue; + if ("v-keep" in newChild.props === false || oldChild.props["v-keep"] !== newChild.props["v-keep"]) { + updateAttributes(newChild, oldChild.props); + oldChild.props = newChild.props; + if ("v-text" in newChild.props) { + if (oldChild.textContent != newChild.props["v-text"]) { + oldChild.textContent = newChild.props["v-text"]; + } + continue; + } + patch(newChild); } - updateAttributes(newChild, oldProps || null); - patch(newChild); } - for (let i = 0, l = oldTree.length; i < l; i++) { - const oldChild = oldTree[i]; - const oldProps = oldChild.props; - if (oldProps && !newKeyedList[oldProps.key]) { - oldChild.remove(); - } + for (let i = children.length, l = childNodes.length; i < l; i++) { + childNodes[i]?.remove(); } } function patch(newVnode) { - flatTree(newVnode); - const children = newVnode.children; + const children = flatTree(newVnode, handleVFor(newVnode)); + const dom = newVnode.dom; if (children.length === 0) { - newVnode.dom.textContent = ""; + if (dom.childNodes.length) { + dom.textContent = ""; + } return; } - const oldDomChildren = newVnode.dom.childNodes; + const oldDomChildren = dom.childNodes; const oldChildrenLength = oldDomChildren.length; if (oldChildrenLength > 0) { const firstOldProps = oldDomChildren[0].props; const firstVnode = children[0]; if (firstOldProps && firstVnode instanceof Vnode && "key" in firstVnode.props && "key" in firstOldProps) { - patchKeyed(newVnode); - children.length = 0; + patchKeyed(newVnode, children); return; } } const childrenLength = children.length; if (oldChildrenLength === 0) { for (let i = 0; i < childrenLength; i++) { + if (children[i] instanceof Vnode === false) { + dom.appendChild(document.createTextNode(children[i])); + continue; + } createNewElement(children[i], newVnode, null); } - children.length = 0; return; } for (let i = 0; i < childrenLength; i++) { const oldChild = oldDomChildren[i]; const newChild = children[i]; - if (!oldChild) { - createNewElement(newChild, newVnode, null); - continue; - } if (newChild instanceof Vnode === false) { + if (!oldChild) { + newVnode.dom.appendChild(document.createTextNode(newChild)); + continue; + } if (oldChild.nodeType !== 3) { newVnode.dom.replaceChild(document.createTextNode(newChild), oldChild); continue; @@ -484,6 +508,10 @@ function patch(newVnode) { } continue; } + if (!oldChild) { + createNewElement(newChild, newVnode, null); + continue; + } if ("v-keep" in newChild.props) { if (oldChild.props && oldChild.props["v-keep"] === newChild.props["v-keep"]) { continue; @@ -501,21 +529,21 @@ function patch(newVnode) { newChild.dom = oldChild; updateAttributes(newChild, oldChild.props || null); oldChild.props = newChild.props; + if ("v-text" in newChild.props) { + if (newChild.dom.textContent != newChild.props["v-text"]) { + newChild.dom.textContent = newChild.props["v-text"]; + } + continue; + } patch(newChild); } for (let i = childrenLength, l = oldDomChildren.length; i < l; i++) { oldDomChildren[i]?.remove(); } - children.length = 0; -} -function update() { - if (mainVnode) { - mainVnode.children = [mainComponent]; - return updateVnode(mainVnode); - } } function updateVnode(vnode) { callSet(onCleanupSet); + vnode.props = vnode.props || {}; patch(vnode); callSet(isMounted ? onUpdateSet : onMountSet); isMounted = true; @@ -525,9 +553,15 @@ function updateVnode(vnode) { return vnode.dom.innerHTML; } } +function update() { + if (mainVnode) { + mainVnode.children = [mainComponent]; + return updateVnode(mainVnode); + } +} function unmount() { if (mainVnode) { - mainComponent = new Vnode(() => null, {}, []); + mainComponent = v(() => null, {}); const result = update(); callSet(onUnmountSet); for (const name in eventListenerNames) { @@ -539,25 +573,25 @@ function unmount() { isMounted = false; current.vnode = null; current.component = null; + current.event = null; return result; } } function mount(dom, component) { const container = typeof dom === "string" ? isNodeJs ? createElement(dom, dom === "svg") : document.querySelector(dom) : dom; - const vnodeComponent = isVnodeComponent(component) ? component : isComponent(component) ? new Vnode(component, {}, []) : new Vnode(() => component, {}, []); - if (mainComponent && mainComponent.tag !== vnodeComponent.tag) { - unmount(); + if (isComponent(component)) { + mainComponent = new Vnode(component, {}, []); + } else if (isVnodeComponent(component)) { + mainComponent = component; + } else { + mainComponent = new Vnode(() => component, {}, []); } - mainComponent = vnodeComponent; mainVnode = domToVnode(container); return update(); } -function v(tagOrComponent, props, ...children) { - return new Vnode(tagOrComponent, props, children); -} -v.fragment = (_, ...children) => children; export { Vnode, + createElement, current, directive, directives, @@ -577,6 +611,7 @@ export { trust, unmount, update, + updateAttributes, updateVnode, v }; diff --git a/dist/index.mjs.map b/dist/index.mjs.map index 28e45dc..1664bfb 100644 --- a/dist/index.mjs.map +++ b/dist/index.mjs.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../lib/index.ts"], - "sourcesContent": ["declare global {\n var document: Document;\n namespace JSX {\n interface IntrinsicElements {\n [elemName: string]: any;\n }\n }\n}\n\ninterface DefaultRecord extends Record {}\n\nexport interface VnodeProperties extends DefaultRecord {\n key?: string | number;\n}\n\nexport interface DomElement extends Element, DefaultRecord {}\n\nexport interface Component extends DefaultRecord {\n (props: VnodeProperties, children: any[]): Vnode | any;\n}\n\nexport interface POJOComponent extends DefaultRecord {\n view: Component;\n}\n\nexport type ValyrianComponent = Component | POJOComponent;\n\nexport interface VnodeComponentInterface extends Vnode {\n tag: ValyrianComponent;\n}\n\nexport interface Children extends Array {}\n\nexport interface Directive {\n (vnode: VnodeWithDom, oldProps: VnodeProperties | null): void | boolean;\n}\n\nexport const isNodeJs = Boolean(typeof process !== \"undefined\" && process.versions && process.versions.node);\n\nexport class Vnode {\n constructor(\n public tag: string | Component | POJOComponent,\n public props: null | VnodeProperties,\n public children: Children,\n public dom?: DomElement,\n public isSVG?: boolean\n ) {}\n}\n\nexport interface VnodeWithDom extends Vnode {\n tag: string;\n dom: DomElement;\n props: VnodeProperties;\n}\n\nexport const isComponent = (component: unknown): component is Component => typeof component === \"function\";\nexport const isVnode = (object?: unknown): object is Vnode => object instanceof Vnode;\n\nexport const isVnodeComponent = (object?: unknown): object is VnodeComponentInterface => {\n return isVnode(object) && isComponent(object.tag);\n};\n\nexport function domToVnode(dom: any): VnodeWithDom {\n if (dom.nodeType === 3) {\n return dom.nodeValue;\n }\n\n const vnode = new Vnode(dom.nodeName.toLowerCase(), {}, []) as VnodeWithDom;\n vnode.dom = dom;\n dom.props = vnode.props;\n\n for (let i = 0, l = dom.childNodes.length; i < l; i++) {\n const childDom = dom.childNodes[i];\n if (childDom.nodeType === 3) {\n vnode.children.push(childDom.nodeValue);\n } else if (childDom.nodeType === 1) {\n const childVnode = domToVnode(childDom);\n vnode.children.push(childVnode);\n }\n }\n\n const props = vnode.props as VnodeProperties;\n for (let i = 0, l = dom.attributes.length; i < l; i++) {\n const attr = dom.attributes[i];\n props[attr.nodeName] = attr.nodeValue;\n }\n\n return vnode as VnodeWithDom;\n}\n\nexport function trust(htmlString: string) {\n const div = document.createElement(\"div\");\n div.innerHTML = htmlString.trim();\n return Array.from(div.childNodes).map(domToVnode);\n}\n\nlet mainComponent: VnodeComponentInterface | null = null;\nlet mainVnode: VnodeWithDom | null = null;\nlet isMounted = false;\n\nexport const current = {\n vnode: null as Vnode | null,\n component: null as ValyrianComponent | null,\n event: null as Event | null\n};\n\nexport const reservedProps = new Set([\n \"key\",\n \"state\",\n \"v-keep\",\n \"v-text\",\n \"v-if\",\n \"v-for\",\n \"v-show\",\n \"v-class\",\n \"v-html\",\n \"v-model\",\n \"v-create\",\n \"v-update\",\n \"v-cleanup\"\n]);\n\nconst onCleanupSet = new Set();\nconst onMountSet = new Set();\nconst onUpdateSet = new Set();\nconst onUnmountSet = new Set();\nexport const onMount = (callback: Function) => !isMounted && onMountSet.add(callback);\nexport const onUpdate = (callback: Function) => onUpdateSet.add(callback);\nexport const onCleanup = (callback: Function) => onCleanupSet.add(callback);\nexport const onUnmount = (callback: Function) => !isMounted && onUnmountSet.add(callback);\nconst callSet = (set: Set) => {\n for (const callback of set) {\n callback();\n }\n set.clear();\n};\n\nexport const directives: Record = {\n \"v-for\"(vnode: VnodeWithDom) {\n const set = vnode.props[\"v-for\"];\n const children = vnode.children;\n const callback = children[0];\n children.length = set.length;\n\n for (let i = 0, l = set.length; i < l; i++) {\n children[i] = callback(set[i], i);\n }\n },\n\n \"v-if\": (vnode: VnodeWithDom) => {\n const bool = Boolean(vnode.props[\"v-if\"]);\n if (bool) {\n const parentNode = vnode.dom?.parentNode;\n if (parentNode) {\n const newdom = document.createTextNode(\"\");\n parentNode.replaceChild(newdom, vnode.dom);\n }\n\n return false;\n }\n },\n\n \"v-show\": (vnode: VnodeWithDom) => {\n const bool = Boolean(vnode.props[\"v-show\"]);\n (\n vnode.dom as unknown as {\n style: { display: string };\n }\n ).style.display = bool ? \"\" : \"none\";\n },\n\n \"v-html\": (vnode: VnodeWithDom) => {\n vnode.children = [trust(vnode.props[\"v-html\"])];\n },\n\n // The \"v-model\" directive binds the value of an input element to a model property\n \"v-model\": (vnode: VnodeWithDom) => {\n let [model, property, event]: any[] = vnode.props[\"v-model\"];\n let value;\n // This function updates the model property when the input element's value changes\n let handler = (e: Event) => (model[property] = (e.target as DomElement & Record).value);\n if (vnode.tag === \"input\") {\n // If the element is an input, use the \"input\" event by default\n event = event || \"oninput\";\n // Depending on the type of input element, use a different handler function\n switch (vnode.props.type) {\n case \"checkbox\": {\n if (Array.isArray(model[property])) {\n // If the model property is an array, add or remove the value from the array when the checkbox is checked or unchecked\n handler = (e: Event) => {\n const val = (e.target as DomElement & Record).value;\n const idx = model[property].indexOf(val);\n if (idx === -1) {\n model[property].push(val);\n } else {\n model[property].splice(idx, 1);\n }\n };\n // If the value is in the array, set the checkbox to be checked\n value = model[property].indexOf(vnode.dom.value) !== -1;\n } else if (\"value\" in vnode.props) {\n // If the input element has a \"value\" attribute, use it to determine the checked state\n handler = () => {\n if (model[property] === vnode.props.value) {\n model[property] = null;\n } else {\n model[property] = vnode.props.value;\n }\n };\n value = model[property] === vnode.props.value;\n } else {\n // If there is no \"value\" attribute, use a boolean value for the model property\n handler = () => (model[property] = !model[property]);\n value = model[property];\n }\n // Set the \"checked\" attribute on the input element\n // eslint-disable-next-line no-use-before-define\n sharedSetAttribute(\"checked\", value, vnode);\n break;\n }\n case \"radio\": {\n // If the element is a radio button, set the \"checked\" attribute based on the value of the model property\n // eslint-disable-next-line no-use-before-define\n sharedSetAttribute(\"checked\", model[property] === vnode.dom.value, vnode);\n break;\n }\n default: {\n // For all other input types, set the \"value\" attribute based on the value of the model property\n // eslint-disable-next-line no-use-before-define\n sharedSetAttribute(\"value\", model[property], vnode);\n }\n }\n } else if (vnode.tag === \"select\") {\n // If the element is a select element, use the \"click\" event by default\n event = event || \"onclick\";\n if (vnode.props.multiple) {\n // If the select element allows multiple selections, update the model property with an array of selected values\n handler = (e: Event & Record) => {\n const val = (e.target as DomElement & Record).value;\n if (e.ctrlKey) {\n // If the Ctrl key is pressed, add or remove the value from the array\n const idx = model[property].indexOf(val);\n if (idx === -1) {\n model[property].push(val);\n } else {\n model[property].splice(idx, 1);\n }\n } else {\n // If the Ctrl key is not pressed, set the model property to an array with the selected value\n model[property].splice(0, model[property].length);\n model[property].push(val);\n }\n };\n // Set the \"selected\" attribute on the options based on whether they are in the model property array\n vnode.children.forEach((child: VnodeWithDom) => {\n if (child.tag === \"option\") {\n const value = \"value\" in child.props ? child.props.value : child.children.join(\"\").trim();\n child.props.selected = model[property].indexOf(value) !== -1;\n }\n });\n } else {\n // If the select element does not allow multiple selections, set the \"selected\" attribute on the options based on the value of the model property\n vnode.children.forEach((child: VnodeWithDom) => {\n if (child.tag === \"option\") {\n const value = \"value\" in child.props ? child.props.value : child.children.join(\"\").trim();\n child.props.selected = value === model[property];\n }\n });\n }\n } else if (vnode.tag === \"textarea\") {\n // If the element is a textarea, use the \"input\" event by default\n event = event || \"oninput\";\n // Set the textarea's content to the value of the model property\n vnode.children = [model[property]];\n }\n\n // We assume that the prev handler if any will not be changed by the user across patchs\n const prevHandler = vnode.props[event];\n\n // Set the event handler on the element\n // eslint-disable-next-line no-use-before-define\n sharedSetAttribute(\n event,\n (e: Event) => {\n handler(e);\n\n // If the previous handler is defined, call it after the model has been updated\n if (prevHandler) {\n prevHandler(e);\n }\n },\n vnode\n );\n },\n\n \"v-create\": (vnode: VnodeWithDom, oldProps: VnodeProperties | null) => {\n if (!oldProps) {\n const callback = vnode.props[\"v-create\"];\n const cleanup = callback(vnode);\n\n if (typeof cleanup === \"function\") {\n onCleanup(cleanup);\n }\n }\n },\n\n \"v-update\": (vnode: VnodeWithDom, oldProps: VnodeProperties | null) => {\n if (oldProps) {\n const callback = vnode.props[\"v-update\"];\n const cleanup = callback(vnode, oldProps);\n\n if (typeof cleanup === \"function\") {\n onCleanup(cleanup);\n }\n }\n },\n\n \"v-cleanup\": (vnode: VnodeWithDom) => {\n const callback = vnode.props[\"v-cleanup\"];\n onCleanup(() => callback(vnode));\n },\n\n // Frequent used properties\n class: (vnode: VnodeWithDom) => {\n const value = vnode.props.class;\n if (typeof value === \"string\") {\n vnode.dom.className = value;\n } else if (Array.isArray(value)) {\n vnode.dom.className = value.join(\" \");\n } else if (typeof value === \"object\") {\n const classList = vnode.dom.classList;\n for (const name in value) {\n const val = typeof value[name] === \"function\" ? (value[name] as Function)() : value[name];\n classList.toggle(name, val);\n }\n }\n },\n\n id: (vnode: VnodeWithDom) => {\n vnode.dom.id = vnode.props.id;\n },\n\n style: (vnode: VnodeWithDom) => {\n const value = vnode.props.style;\n if (typeof value === \"string\") {\n vnode.dom.style.cssText = value;\n } else if (typeof value === \"object\") {\n const domStyle = vnode.dom.style;\n domStyle.cssText = \"\";\n for (const name in value) {\n domStyle[name] = value[name];\n }\n }\n }\n};\n\nexport function directive(name: string, directive: Directive) {\n const directiveName = `v-${name}`;\n directives[directiveName] = directive;\n reservedProps.add(directiveName);\n}\n\nconst eventListenerNames = new Set();\n\nfunction eventListener(e: Event) {\n current.event = e;\n let dom = e.target as DomElement;\n const name = `on${e.type}`;\n\n while (dom) {\n const oldProps = dom.props;\n if (oldProps && oldProps[name]) {\n oldProps[name](e, dom);\n\n if (!e.defaultPrevented) {\n update();\n }\n return;\n }\n dom = dom.parentNode as DomElement;\n }\n\n current.event = null;\n}\n\nfunction sharedSetAttribute(name: string, value: any, newVnode: VnodeWithDom): void | boolean {\n const newVnodeDom = newVnode.dom;\n if (typeof value === \"function\") {\n if (!eventListenerNames.has(name)) {\n (mainVnode as VnodeWithDom).dom.addEventListener(name.slice(2), eventListener);\n eventListenerNames.add(name);\n }\n return;\n }\n\n if (name in newVnodeDom) {\n newVnodeDom[name] = value;\n return;\n }\n\n if (value === false) {\n newVnodeDom.removeAttribute(name);\n } else {\n newVnodeDom.setAttribute(name, value);\n }\n}\n\nexport function setAttribute(name: string, value: any, newVnode: VnodeWithDom): void {\n if (!reservedProps.has(name)) {\n newVnode.props[name] = value;\n sharedSetAttribute(name, value, newVnode);\n }\n}\n\nfunction removeAttributes(vnode: VnodeWithDom, oldProps: VnodeProperties | null): void {\n if (!oldProps) {\n return;\n }\n\n const vnodeDom = vnode.dom;\n const vnodeProps = vnode.props;\n\n for (const name in oldProps) {\n if (name in vnodeProps === false && !eventListenerNames.has(name) && !reservedProps.has(name)) {\n if (name in vnodeDom) {\n vnodeDom[name] = null;\n } else {\n vnodeDom.removeAttribute(name);\n }\n }\n }\n}\n\nfunction addProperties(vnode: VnodeWithDom, oldProps: VnodeProperties | null) {\n const vnodeProps = vnode.props;\n for (const name in vnodeProps) {\n if (directives[name]) {\n if (directives[name](vnode, oldProps) === false) {\n break;\n }\n continue;\n }\n\n if (reservedProps.has(name)) {\n continue;\n }\n\n sharedSetAttribute(name, vnodeProps[name], vnode);\n }\n}\n\nfunction updateAttributes(newVnode: VnodeWithDom, oldProps: VnodeProperties | null): void {\n removeAttributes(newVnode, oldProps);\n addProperties(newVnode, oldProps);\n}\n\nfunction createElement(tag: string, isSVG: boolean): DomElement {\n return isSVG\n ? document.createElementNS(\"http://www.w3.org/2000/svg\", tag)\n : (document.createElement(tag) as DomElement);\n}\n\nfunction flatTree(newVnode: VnodeWithDom) {\n current.vnode = newVnode;\n const { children } = newVnode;\n let i = 0;\n\n while (i < children.length) {\n const newChild = children[i];\n\n if (newChild == null) {\n children.splice(i, 1);\n continue;\n }\n\n if (Array.isArray(newChild)) {\n children.splice(i, 1, ...newChild);\n continue;\n }\n\n if (newChild instanceof Vnode) {\n if (newChild.props === null) {\n newChild.props = {};\n }\n\n if (typeof newChild.tag !== \"string\") {\n const component = (\"view\" in newChild.tag ? newChild.tag.view : newChild.tag).bind(newChild.tag);\n current.component = component;\n children[i] = component(newChild.props, newChild.children);\n continue;\n } else {\n newChild.isSVG = newVnode.isSVG || newChild.tag === \"svg\";\n }\n }\n\n i++;\n }\n}\n\nfunction createNewElement(newChild: any, newVnode: VnodeWithDom, oldChild: DomElement | null) {\n if (newChild instanceof Vnode === false) {\n const dom = document.createTextNode(newChild);\n if (oldChild) {\n newVnode.dom.replaceChild(dom, oldChild);\n } else {\n newVnode.dom.appendChild(dom);\n }\n return;\n }\n\n const dom = createElement(newChild.tag, newChild.isSVG);\n if (oldChild) {\n newVnode.dom.replaceChild(dom, oldChild);\n } else {\n newVnode.dom.appendChild(dom);\n }\n newChild.dom = dom;\n addProperties(newChild, null);\n newChild.dom.props = newChild.props;\n flatTree(newChild);\n const children = newChild.children;\n if (children.length === 0) {\n newChild.dom.textContent = \"\";\n return;\n }\n\n for (let i = 0, l = children.length; i < l; i++) {\n createNewElement(children[i], newChild, null);\n }\n children.length = 0;\n}\n\nfunction patchKeyed(newVnode: VnodeWithDom) {\n const oldTree = newVnode.dom.childNodes as unknown as DomElement[];\n const oldKeyedList: Record = {};\n const newKeyedList: Record = {};\n const children = newVnode.children;\n\n for (let i = 0, l = oldTree.length; i < l; i++) {\n const oldChild = oldTree[i];\n const oldProps = oldChild.props;\n if (oldProps) {\n oldKeyedList[oldProps.key as string] = i;\n }\n\n if (i < children.length && children[i] instanceof Vnode) {\n newKeyedList[children[i].props.key as string] = i;\n }\n }\n\n for (let i = 0, l = children.length; i < l; i++) {\n const newChild = children[i];\n const oldIndex = oldKeyedList[newChild.props.key];\n const oldChild = oldTree[oldIndex];\n\n if (!oldChild) {\n createNewElement(newChild, newVnode, null);\n continue;\n }\n\n newChild.dom = oldChild;\n if (newVnode.dom.childNodes[i] !== newChild.dom) {\n newVnode.dom.insertBefore(newChild.dom, newVnode.dom.childNodes[i]);\n }\n\n const oldProps = oldChild.props;\n newChild.dom = oldChild as DomElement;\n oldChild.props = newChild.props;\n\n if (oldProps && \"v-keep\" in newChild.props && newChild.props[\"v-keep\"] === oldProps[\"v-keep\"]) {\n continue;\n }\n\n updateAttributes(newChild as VnodeWithDom, oldProps || null);\n patch(newChild);\n }\n\n // Remove any old nodes not in the new tree\n for (let i = 0, l = oldTree.length; i < l; i++) {\n const oldChild = oldTree[i];\n const oldProps = oldChild.props;\n if (oldProps && !newKeyedList[oldProps.key as string]) {\n oldChild.remove();\n }\n }\n}\n\nexport function patch(newVnode: VnodeWithDom): void {\n flatTree(newVnode);\n const children = newVnode.children;\n\n if (children.length === 0) {\n newVnode.dom.textContent = \"\";\n return;\n }\n\n const oldDomChildren = newVnode.dom.childNodes as unknown as DomElement[];\n const oldChildrenLength = oldDomChildren.length;\n if (oldChildrenLength > 0) {\n const firstOldProps = oldDomChildren[0].props;\n const firstVnode = children[0] as VnodeWithDom;\n if (firstOldProps && firstVnode instanceof Vnode && \"key\" in firstVnode.props && \"key\" in firstOldProps) {\n patchKeyed(newVnode);\n children.length = 0;\n return;\n }\n }\n\n const childrenLength = children.length;\n if (oldChildrenLength === 0) {\n for (let i = 0; i < childrenLength; i++) {\n createNewElement(children[i], newVnode, null);\n }\n children.length = 0;\n return;\n }\n\n for (let i = 0; i < childrenLength; i++) {\n const oldChild = oldDomChildren[i];\n const newChild = children[i];\n if (!oldChild) {\n createNewElement(newChild, newVnode, null);\n continue;\n }\n\n if (newChild instanceof Vnode === false) {\n if (oldChild.nodeType !== 3) {\n newVnode.dom.replaceChild(document.createTextNode(newChild), oldChild);\n continue;\n }\n\n if (oldChild.nodeValue != newChild) {\n oldChild.nodeValue = newChild;\n }\n continue;\n }\n\n if (\"v-keep\" in newChild.props) {\n if (oldChild.props && oldChild.props[\"v-keep\"] === newChild.props[\"v-keep\"]) {\n continue;\n }\n\n const nextOldChild = oldDomChildren[i + 1];\n if (nextOldChild && nextOldChild.props && nextOldChild.props[\"v-keep\"] === newChild.props[\"v-keep\"]) {\n oldChild.remove();\n continue;\n }\n }\n\n if (newChild.tag !== oldChild.nodeName.toLowerCase()) {\n createNewElement(newChild, newVnode, oldChild);\n continue;\n }\n\n newChild.dom = oldChild;\n updateAttributes(newChild as VnodeWithDom, oldChild.props || null);\n oldChild.props = newChild.props;\n patch(newChild);\n }\n\n for (let i = childrenLength, l = oldDomChildren.length; i < l; i++) {\n oldDomChildren[i]?.remove();\n }\n\n children.length = 0;\n}\n\nexport function update(): void | string {\n if (mainVnode) {\n mainVnode.children = [mainComponent];\n return updateVnode(mainVnode);\n }\n}\n\nexport function updateVnode(vnode: VnodeWithDom): string | void {\n callSet(onCleanupSet);\n patch(vnode);\n callSet(isMounted ? onUpdateSet : onMountSet);\n isMounted = true;\n current.vnode = null;\n current.component = null;\n if (isNodeJs) {\n return vnode.dom.innerHTML;\n }\n}\n\nexport function unmount() {\n if (mainVnode) {\n mainComponent = new Vnode(() => null, {}, []) as VnodeComponentInterface;\n const result = update();\n callSet(onUnmountSet);\n for (const name in eventListenerNames) {\n mainVnode.dom.removeEventListener(name.slice(2).toLowerCase(), eventListener);\n Reflect.deleteProperty(eventListenerNames, name);\n }\n\n mainComponent = null;\n mainVnode = null;\n isMounted = false;\n current.vnode = null;\n current.component = null;\n return result;\n }\n}\n\nexport function mount(dom: string | DomElement, component: any) {\n const container =\n typeof dom === \"string\" ? (isNodeJs ? createElement(dom, dom === \"svg\") : document.querySelector(dom)) : dom;\n const vnodeComponent = isVnodeComponent(component)\n ? component\n : isComponent(component)\n ? new Vnode(component, {}, [])\n : new Vnode(() => component, {}, []);\n if (mainComponent && mainComponent.tag !== vnodeComponent.tag) {\n unmount();\n }\n\n mainComponent = vnodeComponent as VnodeComponentInterface;\n mainVnode = domToVnode(container);\n return update();\n}\n\nexport function v(tagOrComponent: string | Component, props: VnodeProperties, ...children: Children) {\n return new Vnode(tagOrComponent, props, children);\n}\n\nv.fragment = (_: VnodeProperties, ...children: Children) => children;\n"], - "mappings": ";AAqCO,IAAM,WAAW,QAAQ,OAAO,YAAY,eAAe,QAAQ,YAAY,QAAQ,SAAS,IAAI;AAEpG,IAAM,QAAN,MAAY;AAAA,EACjB,YACS,KACA,OACA,UACA,KACA,OACP;AALO;AACA;AACA;AACA;AACA;AAAA,EACN;AACL;AAQO,IAAM,cAAc,CAAC,cAA+C,OAAO,cAAc;AACzF,IAAM,UAAU,CAAC,WAAsC,kBAAkB;AAEzE,IAAM,mBAAmB,CAAC,WAAwD;AACvF,SAAO,QAAQ,MAAM,KAAK,YAAY,OAAO,GAAG;AAClD;AAEO,SAAS,WAAW,KAAwB;AACjD,MAAI,IAAI,aAAa,GAAG;AACtB,WAAO,IAAI;AAAA,EACb;AAEA,QAAM,QAAQ,IAAI,MAAM,IAAI,SAAS,YAAY,GAAG,CAAC,GAAG,CAAC,CAAC;AAC1D,QAAM,MAAM;AACZ,MAAI,QAAQ,MAAM;AAElB,WAAS,IAAI,GAAG,IAAI,IAAI,WAAW,QAAQ,IAAI,GAAG,KAAK;AACrD,UAAM,WAAW,IAAI,WAAW,CAAC;AACjC,QAAI,SAAS,aAAa,GAAG;AAC3B,YAAM,SAAS,KAAK,SAAS,SAAS;AAAA,IACxC,WAAW,SAAS,aAAa,GAAG;AAClC,YAAM,aAAa,WAAW,QAAQ;AACtC,YAAM,SAAS,KAAK,UAAU;AAAA,IAChC;AAAA,EACF;AAEA,QAAM,QAAQ,MAAM;AACpB,WAAS,IAAI,GAAG,IAAI,IAAI,WAAW,QAAQ,IAAI,GAAG,KAAK;AACrD,UAAM,OAAO,IAAI,WAAW,CAAC;AAC7B,UAAM,KAAK,QAAQ,IAAI,KAAK;AAAA,EAC9B;AAEA,SAAO;AACT;AAEO,SAAS,MAAM,YAAoB;AACxC,QAAM,MAAM,SAAS,cAAc,KAAK;AACxC,MAAI,YAAY,WAAW,KAAK;AAChC,SAAO,MAAM,KAAK,IAAI,UAAU,EAAE,IAAI,UAAU;AAClD;AAEA,IAAI,gBAAgD;AACpD,IAAI,YAAiC;AACrC,IAAI,YAAY;AAET,IAAM,UAAU;AAAA,EACrB,OAAO;AAAA,EACP,WAAW;AAAA,EACX,OAAO;AACT;AAEO,IAAM,gBAAgB,oBAAI,IAAY;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,eAAe,oBAAI,IAAc;AACvC,IAAM,aAAa,oBAAI,IAAc;AACrC,IAAM,cAAc,oBAAI,IAAc;AACtC,IAAM,eAAe,oBAAI,IAAc;AAChC,IAAM,UAAU,CAAC,aAAuB,CAAC,aAAa,WAAW,IAAI,QAAQ;AAC7E,IAAM,WAAW,CAAC,aAAuB,YAAY,IAAI,QAAQ;AACjE,IAAM,YAAY,CAAC,aAAuB,aAAa,IAAI,QAAQ;AACnE,IAAM,YAAY,CAAC,aAAuB,CAAC,aAAa,aAAa,IAAI,QAAQ;AACxF,IAAM,UAAU,CAAC,QAAuB;AACtC,aAAW,YAAY,KAAK;AAC1B,aAAS;AAAA,EACX;AACA,MAAI,MAAM;AACZ;AAEO,IAAM,aAAwC;AAAA,EACnD,QAAQ,OAAqB;AAC3B,UAAM,MAAM,MAAM,MAAM,OAAO;AAC/B,UAAM,WAAW,MAAM;AACvB,UAAM,WAAW,SAAS,CAAC;AAC3B,aAAS,SAAS,IAAI;AAEtB,aAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,IAAI,GAAG,KAAK;AAC1C,eAAS,CAAC,IAAI,SAAS,IAAI,CAAC,GAAG,CAAC;AAAA,IAClC;AAAA,EACF;AAAA,EAEA,QAAQ,CAAC,UAAwB;AAC/B,UAAM,OAAO,QAAQ,MAAM,MAAM,MAAM,CAAC;AACxC,QAAI,MAAM;AACR,YAAM,aAAa,MAAM,KAAK;AAC9B,UAAI,YAAY;AACd,cAAM,SAAS,SAAS,eAAe,EAAE;AACzC,mBAAW,aAAa,QAAQ,MAAM,GAAG;AAAA,MAC3C;AAEA,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,UAAU,CAAC,UAAwB;AACjC,UAAM,OAAO,QAAQ,MAAM,MAAM,QAAQ,CAAC;AAC1C,IACE,MAAM,IAGN,MAAM,UAAU,OAAO,KAAK;AAAA,EAChC;AAAA,EAEA,UAAU,CAAC,UAAwB;AACjC,UAAM,WAAW,CAAC,MAAM,MAAM,MAAM,QAAQ,CAAC,CAAC;AAAA,EAChD;AAAA;AAAA,EAGA,WAAW,CAAC,UAAwB;AAClC,QAAI,CAAC,OAAO,UAAU,KAAK,IAAW,MAAM,MAAM,SAAS;AAC3D,QAAI;AAEJ,QAAI,UAAU,CAAC,MAAc,MAAM,QAAQ,IAAK,EAAE,OAA4C;AAC9F,QAAI,MAAM,QAAQ,SAAS;AAEzB,cAAQ,SAAS;AAEjB,cAAQ,MAAM,MAAM,MAAM;AAAA,QACxB,KAAK,YAAY;AACf,cAAI,MAAM,QAAQ,MAAM,QAAQ,CAAC,GAAG;AAElC,sBAAU,CAAC,MAAa;AACtB,oBAAM,MAAO,EAAE,OAA4C;AAC3D,oBAAM,MAAM,MAAM,QAAQ,EAAE,QAAQ,GAAG;AACvC,kBAAI,QAAQ,IAAI;AACd,sBAAM,QAAQ,EAAE,KAAK,GAAG;AAAA,cAC1B,OAAO;AACL,sBAAM,QAAQ,EAAE,OAAO,KAAK,CAAC;AAAA,cAC/B;AAAA,YACF;AAEA,oBAAQ,MAAM,QAAQ,EAAE,QAAQ,MAAM,IAAI,KAAK,MAAM;AAAA,UACvD,WAAW,WAAW,MAAM,OAAO;AAEjC,sBAAU,MAAM;AACd,kBAAI,MAAM,QAAQ,MAAM,MAAM,MAAM,OAAO;AACzC,sBAAM,QAAQ,IAAI;AAAA,cACpB,OAAO;AACL,sBAAM,QAAQ,IAAI,MAAM,MAAM;AAAA,cAChC;AAAA,YACF;AACA,oBAAQ,MAAM,QAAQ,MAAM,MAAM,MAAM;AAAA,UAC1C,OAAO;AAEL,sBAAU,MAAO,MAAM,QAAQ,IAAI,CAAC,MAAM,QAAQ;AAClD,oBAAQ,MAAM,QAAQ;AAAA,UACxB;AAGA,6BAAmB,WAAW,OAAO,KAAK;AAC1C;AAAA,QACF;AAAA,QACA,KAAK,SAAS;AAGZ,6BAAmB,WAAW,MAAM,QAAQ,MAAM,MAAM,IAAI,OAAO,KAAK;AACxE;AAAA,QACF;AAAA,QACA,SAAS;AAGP,6BAAmB,SAAS,MAAM,QAAQ,GAAG,KAAK;AAAA,QACpD;AAAA,MACF;AAAA,IACF,WAAW,MAAM,QAAQ,UAAU;AAEjC,cAAQ,SAAS;AACjB,UAAI,MAAM,MAAM,UAAU;AAExB,kBAAU,CAAC,MAAmC;AAC5C,gBAAM,MAAO,EAAE,OAA4C;AAC3D,cAAI,EAAE,SAAS;AAEb,kBAAM,MAAM,MAAM,QAAQ,EAAE,QAAQ,GAAG;AACvC,gBAAI,QAAQ,IAAI;AACd,oBAAM,QAAQ,EAAE,KAAK,GAAG;AAAA,YAC1B,OAAO;AACL,oBAAM,QAAQ,EAAE,OAAO,KAAK,CAAC;AAAA,YAC/B;AAAA,UACF,OAAO;AAEL,kBAAM,QAAQ,EAAE,OAAO,GAAG,MAAM,QAAQ,EAAE,MAAM;AAChD,kBAAM,QAAQ,EAAE,KAAK,GAAG;AAAA,UAC1B;AAAA,QACF;AAEA,cAAM,SAAS,QAAQ,CAAC,UAAwB;AAC9C,cAAI,MAAM,QAAQ,UAAU;AAC1B,kBAAMA,SAAQ,WAAW,MAAM,QAAQ,MAAM,MAAM,QAAQ,MAAM,SAAS,KAAK,EAAE,EAAE,KAAK;AACxF,kBAAM,MAAM,WAAW,MAAM,QAAQ,EAAE,QAAQA,MAAK,MAAM;AAAA,UAC5D;AAAA,QACF,CAAC;AAAA,MACH,OAAO;AAEL,cAAM,SAAS,QAAQ,CAAC,UAAwB;AAC9C,cAAI,MAAM,QAAQ,UAAU;AAC1B,kBAAMA,SAAQ,WAAW,MAAM,QAAQ,MAAM,MAAM,QAAQ,MAAM,SAAS,KAAK,EAAE,EAAE,KAAK;AACxF,kBAAM,MAAM,WAAWA,WAAU,MAAM,QAAQ;AAAA,UACjD;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,WAAW,MAAM,QAAQ,YAAY;AAEnC,cAAQ,SAAS;AAEjB,YAAM,WAAW,CAAC,MAAM,QAAQ,CAAC;AAAA,IACnC;AAGA,UAAM,cAAc,MAAM,MAAM,KAAK;AAIrC;AAAA,MACE;AAAA,MACA,CAAC,MAAa;AACZ,gBAAQ,CAAC;AAGT,YAAI,aAAa;AACf,sBAAY,CAAC;AAAA,QACf;AAAA,MACF;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YAAY,CAAC,OAAqB,aAAqC;AACrE,QAAI,CAAC,UAAU;AACb,YAAM,WAAW,MAAM,MAAM,UAAU;AACvC,YAAM,UAAU,SAAS,KAAK;AAE9B,UAAI,OAAO,YAAY,YAAY;AACjC,kBAAU,OAAO;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YAAY,CAAC,OAAqB,aAAqC;AACrE,QAAI,UAAU;AACZ,YAAM,WAAW,MAAM,MAAM,UAAU;AACvC,YAAM,UAAU,SAAS,OAAO,QAAQ;AAExC,UAAI,OAAO,YAAY,YAAY;AACjC,kBAAU,OAAO;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,aAAa,CAAC,UAAwB;AACpC,UAAM,WAAW,MAAM,MAAM,WAAW;AACxC,cAAU,MAAM,SAAS,KAAK,CAAC;AAAA,EACjC;AAAA;AAAA,EAGA,OAAO,CAAC,UAAwB;AAC9B,UAAM,QAAQ,MAAM,MAAM;AAC1B,QAAI,OAAO,UAAU,UAAU;AAC7B,YAAM,IAAI,YAAY;AAAA,IACxB,WAAW,MAAM,QAAQ,KAAK,GAAG;AAC/B,YAAM,IAAI,YAAY,MAAM,KAAK,GAAG;AAAA,IACtC,WAAW,OAAO,UAAU,UAAU;AACpC,YAAM,YAAY,MAAM,IAAI;AAC5B,iBAAW,QAAQ,OAAO;AACxB,cAAM,MAAM,OAAO,MAAM,IAAI,MAAM,aAAc,MAAM,IAAI,EAAe,IAAI,MAAM,IAAI;AACxF,kBAAU,OAAO,MAAM,GAAG;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,IAAI,CAAC,UAAwB;AAC3B,UAAM,IAAI,KAAK,MAAM,MAAM;AAAA,EAC7B;AAAA,EAEA,OAAO,CAAC,UAAwB;AAC9B,UAAM,QAAQ,MAAM,MAAM;AAC1B,QAAI,OAAO,UAAU,UAAU;AAC7B,YAAM,IAAI,MAAM,UAAU;AAAA,IAC5B,WAAW,OAAO,UAAU,UAAU;AACpC,YAAM,WAAW,MAAM,IAAI;AAC3B,eAAS,UAAU;AACnB,iBAAW,QAAQ,OAAO;AACxB,iBAAS,IAAI,IAAI,MAAM,IAAI;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,UAAU,MAAcC,YAAsB;AAC5D,QAAM,gBAAgB,KAAK,IAAI;AAC/B,aAAW,aAAa,IAAIA;AAC5B,gBAAc,IAAI,aAAa;AACjC;AAEA,IAAM,qBAAqB,oBAAI,IAAY;AAE3C,SAAS,cAAc,GAAU;AAC/B,UAAQ,QAAQ;AAChB,MAAI,MAAM,EAAE;AACZ,QAAM,OAAO,KAAK,EAAE,IAAI;AAExB,SAAO,KAAK;AACV,UAAM,WAAW,IAAI;AACrB,QAAI,YAAY,SAAS,IAAI,GAAG;AAC9B,eAAS,IAAI,EAAE,GAAG,GAAG;AAErB,UAAI,CAAC,EAAE,kBAAkB;AACvB,eAAO;AAAA,MACT;AACA;AAAA,IACF;AACA,UAAM,IAAI;AAAA,EACZ;AAEA,UAAQ,QAAQ;AAClB;AAEA,SAAS,mBAAmB,MAAc,OAAY,UAAwC;AAC5F,QAAM,cAAc,SAAS;AAC7B,MAAI,OAAO,UAAU,YAAY;AAC/B,QAAI,CAAC,mBAAmB,IAAI,IAAI,GAAG;AACjC,MAAC,UAA2B,IAAI,iBAAiB,KAAK,MAAM,CAAC,GAAG,aAAa;AAC7E,yBAAmB,IAAI,IAAI;AAAA,IAC7B;AACA;AAAA,EACF;AAEA,MAAI,QAAQ,aAAa;AACvB,gBAAY,IAAI,IAAI;AACpB;AAAA,EACF;AAEA,MAAI,UAAU,OAAO;AACnB,gBAAY,gBAAgB,IAAI;AAAA,EAClC,OAAO;AACL,gBAAY,aAAa,MAAM,KAAK;AAAA,EACtC;AACF;AAEO,SAAS,aAAa,MAAc,OAAY,UAA8B;AACnF,MAAI,CAAC,cAAc,IAAI,IAAI,GAAG;AAC5B,aAAS,MAAM,IAAI,IAAI;AACvB,uBAAmB,MAAM,OAAO,QAAQ;AAAA,EAC1C;AACF;AAEA,SAAS,iBAAiB,OAAqB,UAAwC;AACrF,MAAI,CAAC,UAAU;AACb;AAAA,EACF;AAEA,QAAM,WAAW,MAAM;AACvB,QAAM,aAAa,MAAM;AAEzB,aAAW,QAAQ,UAAU;AAC3B,QAAI,QAAQ,eAAe,SAAS,CAAC,mBAAmB,IAAI,IAAI,KAAK,CAAC,cAAc,IAAI,IAAI,GAAG;AAC7F,UAAI,QAAQ,UAAU;AACpB,iBAAS,IAAI,IAAI;AAAA,MACnB,OAAO;AACL,iBAAS,gBAAgB,IAAI;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,cAAc,OAAqB,UAAkC;AAC5E,QAAM,aAAa,MAAM;AACzB,aAAW,QAAQ,YAAY;AAC7B,QAAI,WAAW,IAAI,GAAG;AACpB,UAAI,WAAW,IAAI,EAAE,OAAO,QAAQ,MAAM,OAAO;AAC/C;AAAA,MACF;AACA;AAAA,IACF;AAEA,QAAI,cAAc,IAAI,IAAI,GAAG;AAC3B;AAAA,IACF;AAEA,uBAAmB,MAAM,WAAW,IAAI,GAAG,KAAK;AAAA,EAClD;AACF;AAEA,SAAS,iBAAiB,UAAwB,UAAwC;AACxF,mBAAiB,UAAU,QAAQ;AACnC,gBAAc,UAAU,QAAQ;AAClC;AAEA,SAAS,cAAc,KAAa,OAA4B;AAC9D,SAAO,QACH,SAAS,gBAAgB,8BAA8B,GAAG,IACzD,SAAS,cAAc,GAAG;AACjC;AAEA,SAAS,SAAS,UAAwB;AACxC,UAAQ,QAAQ;AAChB,QAAM,EAAE,SAAS,IAAI;AACrB,MAAI,IAAI;AAER,SAAO,IAAI,SAAS,QAAQ;AAC1B,UAAM,WAAW,SAAS,CAAC;AAE3B,QAAI,YAAY,MAAM;AACpB,eAAS,OAAO,GAAG,CAAC;AACpB;AAAA,IACF;AAEA,QAAI,MAAM,QAAQ,QAAQ,GAAG;AAC3B,eAAS,OAAO,GAAG,GAAG,GAAG,QAAQ;AACjC;AAAA,IACF;AAEA,QAAI,oBAAoB,OAAO;AAC7B,UAAI,SAAS,UAAU,MAAM;AAC3B,iBAAS,QAAQ,CAAC;AAAA,MACpB;AAEA,UAAI,OAAO,SAAS,QAAQ,UAAU;AACpC,cAAM,aAAa,UAAU,SAAS,MAAM,SAAS,IAAI,OAAO,SAAS,KAAK,KAAK,SAAS,GAAG;AAC/F,gBAAQ,YAAY;AACpB,iBAAS,CAAC,IAAI,UAAU,SAAS,OAAO,SAAS,QAAQ;AACzD;AAAA,MACF,OAAO;AACL,iBAAS,QAAQ,SAAS,SAAS,SAAS,QAAQ;AAAA,MACtD;AAAA,IACF;AAEA;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,UAAe,UAAwB,UAA6B;AAC5F,MAAI,oBAAoB,UAAU,OAAO;AACvC,UAAMC,OAAM,SAAS,eAAe,QAAQ;AAC5C,QAAI,UAAU;AACZ,eAAS,IAAI,aAAaA,MAAK,QAAQ;AAAA,IACzC,OAAO;AACL,eAAS,IAAI,YAAYA,IAAG;AAAA,IAC9B;AACA;AAAA,EACF;AAEA,QAAM,MAAM,cAAc,SAAS,KAAK,SAAS,KAAK;AACtD,MAAI,UAAU;AACZ,aAAS,IAAI,aAAa,KAAK,QAAQ;AAAA,EACzC,OAAO;AACL,aAAS,IAAI,YAAY,GAAG;AAAA,EAC9B;AACA,WAAS,MAAM;AACf,gBAAc,UAAU,IAAI;AAC5B,WAAS,IAAI,QAAQ,SAAS;AAC9B,WAAS,QAAQ;AACjB,QAAM,WAAW,SAAS;AAC1B,MAAI,SAAS,WAAW,GAAG;AACzB,aAAS,IAAI,cAAc;AAC3B;AAAA,EACF;AAEA,WAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,IAAI,GAAG,KAAK;AAC/C,qBAAiB,SAAS,CAAC,GAAG,UAAU,IAAI;AAAA,EAC9C;AACA,WAAS,SAAS;AACpB;AAEA,SAAS,WAAW,UAAwB;AAC1C,QAAM,UAAU,SAAS,IAAI;AAC7B,QAAM,eAAuC,CAAC;AAC9C,QAAM,eAAuC,CAAC;AAC9C,QAAM,WAAW,SAAS;AAE1B,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,IAAI,GAAG,KAAK;AAC9C,UAAM,WAAW,QAAQ,CAAC;AAC1B,UAAM,WAAW,SAAS;AAC1B,QAAI,UAAU;AACZ,mBAAa,SAAS,GAAa,IAAI;AAAA,IACzC;AAEA,QAAI,IAAI,SAAS,UAAU,SAAS,CAAC,aAAa,OAAO;AACvD,mBAAa,SAAS,CAAC,EAAE,MAAM,GAAa,IAAI;AAAA,IAClD;AAAA,EACF;AAEA,WAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,IAAI,GAAG,KAAK;AAC/C,UAAM,WAAW,SAAS,CAAC;AAC3B,UAAM,WAAW,aAAa,SAAS,MAAM,GAAG;AAChD,UAAM,WAAW,QAAQ,QAAQ;AAEjC,QAAI,CAAC,UAAU;AACb,uBAAiB,UAAU,UAAU,IAAI;AACzC;AAAA,IACF;AAEA,aAAS,MAAM;AACf,QAAI,SAAS,IAAI,WAAW,CAAC,MAAM,SAAS,KAAK;AAC/C,eAAS,IAAI,aAAa,SAAS,KAAK,SAAS,IAAI,WAAW,CAAC,CAAC;AAAA,IACpE;AAEA,UAAM,WAAW,SAAS;AAC1B,aAAS,MAAM;AACf,aAAS,QAAQ,SAAS;AAE1B,QAAI,YAAY,YAAY,SAAS,SAAS,SAAS,MAAM,QAAQ,MAAM,SAAS,QAAQ,GAAG;AAC7F;AAAA,IACF;AAEA,qBAAiB,UAA0B,YAAY,IAAI;AAC3D,UAAM,QAAQ;AAAA,EAChB;AAGA,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,IAAI,GAAG,KAAK;AAC9C,UAAM,WAAW,QAAQ,CAAC;AAC1B,UAAM,WAAW,SAAS;AAC1B,QAAI,YAAY,CAAC,aAAa,SAAS,GAAa,GAAG;AACrD,eAAS,OAAO;AAAA,IAClB;AAAA,EACF;AACF;AAEO,SAAS,MAAM,UAA8B;AAClD,WAAS,QAAQ;AACjB,QAAM,WAAW,SAAS;AAE1B,MAAI,SAAS,WAAW,GAAG;AACzB,aAAS,IAAI,cAAc;AAC3B;AAAA,EACF;AAEA,QAAM,iBAAiB,SAAS,IAAI;AACpC,QAAM,oBAAoB,eAAe;AACzC,MAAI,oBAAoB,GAAG;AACzB,UAAM,gBAAgB,eAAe,CAAC,EAAE;AACxC,UAAM,aAAa,SAAS,CAAC;AAC7B,QAAI,iBAAiB,sBAAsB,SAAS,SAAS,WAAW,SAAS,SAAS,eAAe;AACvG,iBAAW,QAAQ;AACnB,eAAS,SAAS;AAClB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,iBAAiB,SAAS;AAChC,MAAI,sBAAsB,GAAG;AAC3B,aAAS,IAAI,GAAG,IAAI,gBAAgB,KAAK;AACvC,uBAAiB,SAAS,CAAC,GAAG,UAAU,IAAI;AAAA,IAC9C;AACA,aAAS,SAAS;AAClB;AAAA,EACF;AAEA,WAAS,IAAI,GAAG,IAAI,gBAAgB,KAAK;AACvC,UAAM,WAAW,eAAe,CAAC;AACjC,UAAM,WAAW,SAAS,CAAC;AAC3B,QAAI,CAAC,UAAU;AACb,uBAAiB,UAAU,UAAU,IAAI;AACzC;AAAA,IACF;AAEA,QAAI,oBAAoB,UAAU,OAAO;AACvC,UAAI,SAAS,aAAa,GAAG;AAC3B,iBAAS,IAAI,aAAa,SAAS,eAAe,QAAQ,GAAG,QAAQ;AACrE;AAAA,MACF;AAEA,UAAI,SAAS,aAAa,UAAU;AAClC,iBAAS,YAAY;AAAA,MACvB;AACA;AAAA,IACF;AAEA,QAAI,YAAY,SAAS,OAAO;AAC9B,UAAI,SAAS,SAAS,SAAS,MAAM,QAAQ,MAAM,SAAS,MAAM,QAAQ,GAAG;AAC3E;AAAA,MACF;AAEA,YAAM,eAAe,eAAe,IAAI,CAAC;AACzC,UAAI,gBAAgB,aAAa,SAAS,aAAa,MAAM,QAAQ,MAAM,SAAS,MAAM,QAAQ,GAAG;AACnG,iBAAS,OAAO;AAChB;AAAA,MACF;AAAA,IACF;AAEA,QAAI,SAAS,QAAQ,SAAS,SAAS,YAAY,GAAG;AACpD,uBAAiB,UAAU,UAAU,QAAQ;AAC7C;AAAA,IACF;AAEA,aAAS,MAAM;AACf,qBAAiB,UAA0B,SAAS,SAAS,IAAI;AACjE,aAAS,QAAQ,SAAS;AAC1B,UAAM,QAAQ;AAAA,EAChB;AAEA,WAAS,IAAI,gBAAgB,IAAI,eAAe,QAAQ,IAAI,GAAG,KAAK;AAClE,mBAAe,CAAC,GAAG,OAAO;AAAA,EAC5B;AAEA,WAAS,SAAS;AACpB;AAEO,SAAS,SAAwB;AACtC,MAAI,WAAW;AACb,cAAU,WAAW,CAAC,aAAa;AACnC,WAAO,YAAY,SAAS;AAAA,EAC9B;AACF;AAEO,SAAS,YAAY,OAAoC;AAC9D,UAAQ,YAAY;AACpB,QAAM,KAAK;AACX,UAAQ,YAAY,cAAc,UAAU;AAC5C,cAAY;AACZ,UAAQ,QAAQ;AAChB,UAAQ,YAAY;AACpB,MAAI,UAAU;AACZ,WAAO,MAAM,IAAI;AAAA,EACnB;AACF;AAEO,SAAS,UAAU;AACxB,MAAI,WAAW;AACb,oBAAgB,IAAI,MAAM,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC;AAC5C,UAAM,SAAS,OAAO;AACtB,YAAQ,YAAY;AACpB,eAAW,QAAQ,oBAAoB;AACrC,gBAAU,IAAI,oBAAoB,KAAK,MAAM,CAAC,EAAE,YAAY,GAAG,aAAa;AAC5E,cAAQ,eAAe,oBAAoB,IAAI;AAAA,IACjD;AAEA,oBAAgB;AAChB,gBAAY;AACZ,gBAAY;AACZ,YAAQ,QAAQ;AAChB,YAAQ,YAAY;AACpB,WAAO;AAAA,EACT;AACF;AAEO,SAAS,MAAM,KAA0B,WAAgB;AAC9D,QAAM,YACJ,OAAO,QAAQ,WAAY,WAAW,cAAc,KAAK,QAAQ,KAAK,IAAI,SAAS,cAAc,GAAG,IAAK;AAC3G,QAAM,iBAAiB,iBAAiB,SAAS,IAC7C,YACA,YAAY,SAAS,IACrB,IAAI,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC,IAC3B,IAAI,MAAM,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;AACrC,MAAI,iBAAiB,cAAc,QAAQ,eAAe,KAAK;AAC7D,YAAQ;AAAA,EACV;AAEA,kBAAgB;AAChB,cAAY,WAAW,SAAS;AAChC,SAAO,OAAO;AAChB;AAEO,SAAS,EAAE,gBAAoC,UAA2B,UAAoB;AACnG,SAAO,IAAI,MAAM,gBAAgB,OAAO,QAAQ;AAClD;AAEA,EAAE,WAAW,CAAC,MAAuB,aAAuB;", - "names": ["value", "directive", "dom"] + "sourcesContent": ["/* eslint-disable sonarjs/cognitive-complexity */\ndeclare global {\n // eslint-disable-next-line vars-on-top, no-var, no-unused-vars\n var document: Document;\n}\n\ninterface DefaultRecord extends Record {}\n\nnamespace JSX {\n interface IntrinsicElements extends DefaultRecord {}\n}\n\nexport interface VnodeProperties extends DefaultRecord {\n key?: string | number;\n}\n\nexport interface DomElement extends Element, DefaultRecord {}\n\nexport interface Component extends DefaultRecord {\n (props: VnodeProperties, children: any[]): Vnode | any;\n}\n\nexport interface POJOComponent extends DefaultRecord {\n view: Component;\n}\n\nexport type ValyrianComponent = Component | POJOComponent;\n\nexport interface VnodeComponentInterface extends Vnode {\n tag: ValyrianComponent;\n}\n\nexport interface Children extends Array {}\n\nexport interface Directive {\n (value: any, vnode: VnodeWithDom, oldProps: VnodeProperties | null): void | boolean;\n}\n\nexport const isNodeJs = Boolean(typeof process !== \"undefined\" && process.versions && process.versions.node);\n\nexport class Vnode {\n constructor(\n public tag: string | Component | POJOComponent,\n public props: null | VnodeProperties,\n public children: Children,\n public dom?: DomElement,\n public isSVG?: boolean\n ) {}\n}\n\nexport interface VnodeWithDom extends Vnode {\n tag: string;\n dom: DomElement;\n props: VnodeProperties;\n}\n\nexport const isComponent = (component: unknown): component is Component =>\n Boolean(typeof component === \"function\" || (component && typeof component === \"object\" && \"view\" in component));\nexport const isVnode = (object?: unknown): object is Vnode => object instanceof Vnode;\n\nexport const isVnodeComponent = (object?: unknown): object is VnodeComponentInterface => {\n return isVnode(object) && isComponent(object.tag);\n};\n\nexport function v(tagOrComponent: string | Component, props: VnodeProperties, ...children: Children) {\n return new Vnode(tagOrComponent, props, children);\n}\n\nv.fragment = (_: VnodeProperties, ...children: Children) => children;\n\nexport function domToVnode(dom: any): VnodeWithDom | void {\n if (dom.nodeType === 3) {\n return dom.nodeValue;\n }\n\n if (dom.nodeType === 1) {\n const tag = dom.nodeName.toLowerCase();\n const props = {} as VnodeProperties;\n const children = [] as Children;\n\n for (let i = 0, l = dom.childNodes.length; i < l; i++) {\n const childDom = dom.childNodes[i];\n if (childDom.nodeType === 3) {\n children.push(childDom.nodeValue);\n } else if (childDom.nodeType === 1) {\n const childVnode = domToVnode(childDom);\n children.push(childVnode);\n }\n }\n\n const attributes = dom.attributes;\n for (let i = 0, l = attributes.length; i < l; i++) {\n const attr = attributes[i];\n props[attr.nodeName] = attr.nodeValue;\n }\n\n const vnode = new Vnode(tag, props, children);\n vnode.dom = dom;\n vnode.isSVG = tag === \"svg\";\n return vnode as VnodeWithDom;\n }\n}\n\nexport function trust(htmlString: string) {\n const div = document.createElement(\"div\");\n div.innerHTML = htmlString.trim();\n return Array.from(div.childNodes).map(domToVnode);\n}\n\nlet mainComponent: VnodeComponentInterface | null = null;\nlet mainVnode: VnodeWithDom | null = null;\nlet isMounted = false;\n\nexport const current = {\n vnode: null as Vnode | null,\n component: null as ValyrianComponent | null,\n event: null as Event | null\n};\n\nexport const reservedProps = new Set([\n \"key\",\n \"state\",\n \"v-keep\",\n \"v-text\",\n \"v-if\",\n \"v-for\",\n \"v-show\",\n \"v-class\",\n \"v-html\",\n \"v-model\",\n \"v-create\",\n \"v-update\",\n \"v-cleanup\"\n]);\n\nconst onCleanupSet = new Set();\nconst onMountSet = new Set();\nconst onUpdateSet = new Set();\nconst onUnmountSet = new Set();\nexport const onMount = (callback: Function) => !isMounted && onMountSet.add(callback);\nexport const onUpdate = (callback: Function) => onUpdateSet.add(callback);\nexport const onCleanup = (callback: Function) => onCleanupSet.add(callback);\nexport const onUnmount = (callback: Function) => !isMounted && onUnmountSet.add(callback);\nconst callSet = (set: Set) => {\n for (const callback of set) {\n callback();\n }\n set.clear();\n};\n\nconst handleVIf = (shouldRender: boolean): Directive => {\n return (value, vnode) => {\n const bool = shouldRender !== Boolean(value);\n if (bool) {\n const parentNode = vnode.dom?.parentNode;\n if (parentNode) {\n const newdom = document.createTextNode(\"\");\n parentNode.replaceChild(newdom, vnode.dom);\n }\n\n return false;\n }\n };\n};\n\nexport const directives: Record = {\n \"v-if\": handleVIf(true),\n \"v-unless\": handleVIf(false),\n\n \"v-show\": (value, vnode) => {\n const bool = Boolean(value);\n (\n vnode.dom as unknown as {\n style: { display: string };\n }\n ).style.display = bool ? \"\" : \"none\";\n },\n\n \"v-html\": (value, vnode) => {\n vnode.children = [trust(value as string)];\n },\n\n // The \"v-model\" directive binds the value of an input element to a model property\n \"v-model\": (val, vnode) => {\n // eslint-disable-next-line prefer-const\n let [model, property, event]: any[] = val as any[];\n let value;\n // This function updates the model property when the input element's value changes\n let handler = (e: Event) => (model[property] = (e.target as DomElement & Record).value);\n if (vnode.tag === \"input\") {\n // If the element is an input, use the \"input\" event by default\n event = event || \"oninput\";\n // Depending on the type of input element, use a different handler function\n switch (vnode.props.type) {\n case \"checkbox\": {\n if (Array.isArray(model[property])) {\n // If the model property is an array, add or remove the value from the array when the checkbox is checked or unchecked\n handler = (e: Event) => {\n const val = (e.target as DomElement & Record).value;\n const idx = model[property].indexOf(val);\n if (idx === -1) {\n model[property].push(val);\n } else {\n model[property].splice(idx, 1);\n }\n };\n // If the value is in the array, set the checkbox to be checked\n value = model[property].indexOf(vnode.dom.value) !== -1;\n } else if (\"value\" in vnode.props) {\n // If the input element has a \"value\" attribute, use it to determine the checked state\n handler = () => {\n if (model[property] === vnode.props.value) {\n model[property] = null;\n } else {\n model[property] = vnode.props.value;\n }\n };\n value = model[property] === vnode.props.value;\n } else {\n // If there is no \"value\" attribute, use a boolean value for the model property\n handler = () => (model[property] = !model[property]);\n value = model[property];\n }\n // Set the \"checked\" attribute on the input element\n // eslint-disable-next-line no-use-before-define\n sharedSetAttribute(\"checked\", value, vnode);\n break;\n }\n case \"radio\": {\n // If the element is a radio button, set the \"checked\" attribute based on the value of the model property\n // eslint-disable-next-line no-use-before-define\n sharedSetAttribute(\"checked\", model[property] === vnode.dom.value, vnode);\n break;\n }\n default: {\n // For all other input types, set the \"value\" attribute based on the value of the model property\n // eslint-disable-next-line no-use-before-define\n sharedSetAttribute(\"value\", model[property], vnode);\n }\n }\n } else if (vnode.tag === \"select\") {\n // If the element is a select element, use the \"click\" event by default\n event = event || \"onclick\";\n if (vnode.props.multiple) {\n // If the select element allows multiple selections, update the model property with an array of selected values\n handler = (e: Event & Record) => {\n const val = (e.target as DomElement & Record).value;\n if (e.ctrlKey) {\n // If the Ctrl key is pressed, add or remove the value from the array\n const idx = model[property].indexOf(val);\n if (idx === -1) {\n model[property].push(val);\n } else {\n model[property].splice(idx, 1);\n }\n } else {\n // If the Ctrl key is not pressed, set the model property to an array with the selected value\n model[property].splice(0, model[property].length);\n model[property].push(val);\n }\n };\n // Set the \"selected\" attribute on the options based on whether they are in the model property array\n vnode.children.forEach((child: VnodeWithDom) => {\n if (child.tag === \"option\") {\n const value = \"value\" in child.props ? child.props.value : child.children.join(\"\").trim();\n child.props.selected = model[property].indexOf(value) !== -1;\n }\n });\n } else {\n // If the select element does not allow multiple selections, set the \"selected\" attribute on the options based on the value of the model property\n vnode.children.forEach((child: VnodeWithDom) => {\n if (child.tag === \"option\") {\n const value = \"value\" in child.props ? child.props.value : child.children.join(\"\").trim();\n child.props.selected = value === model[property];\n }\n });\n }\n } else if (vnode.tag === \"textarea\") {\n // If the element is a textarea, use the \"input\" event by default\n event = event || \"oninput\";\n // Set the textarea's content to the value of the model property\n vnode.children = [model[property]];\n }\n\n // We assume that the prev handler if any will not be changed by the user across patchs\n const prevHandler = vnode.props[event];\n\n // Set the event handler on the element\n // eslint-disable-next-line no-use-before-define\n sharedSetAttribute(\n event,\n (e: Event) => {\n handler(e);\n\n // If the previous handler is defined, call it after the model has been updated\n if (prevHandler) {\n prevHandler(e);\n }\n },\n vnode\n );\n },\n\n \"v-create\": (callback, vnode, oldProps) => {\n if (!oldProps) {\n const cleanup = callback(vnode);\n\n if (typeof cleanup === \"function\") {\n onCleanup(cleanup);\n }\n }\n },\n\n \"v-update\": (callback, vnode, oldProps) => {\n if (oldProps) {\n const cleanup = callback(vnode, oldProps);\n\n if (typeof cleanup === \"function\") {\n onCleanup(cleanup);\n }\n }\n },\n\n \"v-cleanup\": (callback, vnode) => {\n onCleanup(() => callback(vnode));\n },\n\n \"v-class\": (value, vnode) => {\n if (typeof value === \"string\") {\n vnode.dom.className = value;\n } else if (Array.isArray(value)) {\n vnode.dom.className = value.join(\" \");\n } else if (typeof value === \"object\") {\n const classList = vnode.dom.classList;\n for (const name in value) {\n const val = typeof value[name] === \"function\" ? (value[name] as Function)() : value[name];\n classList.toggle(name, val);\n }\n }\n },\n\n // Frequent used properties\n class(value, vnode) {\n if (vnode.dom.className !== value) {\n vnode.dom.className = value;\n }\n },\n\n className(value, vnode) {\n directives.class(value, vnode, null);\n },\n\n id: (value, vnode) => {\n vnode.dom.id = value;\n },\n\n style: (value, vnode) => {\n if (typeof value === \"string\") {\n vnode.dom.style = value;\n } else if (typeof value === \"object\") {\n vnode.dom.style = \"\";\n const domStyle = vnode.dom.style;\n for (const name in value) {\n domStyle[name] = value[name];\n }\n }\n }\n};\n\nexport function directive(name: string, directive: Directive) {\n const directiveName = `v-${name}`;\n directives[directiveName] = directive;\n reservedProps.add(directiveName);\n}\n\nconst eventListenerNames = new Set();\n\nfunction eventListener(e: Event) {\n current.event = e;\n let dom = e.target as DomElement;\n const name = `on${e.type}`;\n\n while (dom) {\n const oldProps = dom.props;\n if (oldProps && oldProps[name]) {\n oldProps[name](e, dom);\n\n if (!e.defaultPrevented) {\n // eslint-disable-next-line no-use-before-define\n update();\n }\n return;\n }\n dom = dom.parentNode as DomElement;\n }\n\n current.event = null;\n}\n\nfunction sharedSetAttribute(name: string, value: any, newVnode: VnodeWithDom): void | boolean {\n const newVnodeDom = newVnode.dom;\n if (typeof value === \"function\") {\n if (!eventListenerNames.has(name)) {\n (mainVnode as VnodeWithDom).dom.addEventListener(name.slice(2), eventListener);\n eventListenerNames.add(name);\n }\n return;\n }\n\n if (name in newVnodeDom) {\n newVnodeDom[name] = value;\n return;\n }\n\n if (value === false) {\n newVnodeDom.removeAttribute(name);\n } else {\n newVnodeDom.setAttribute(name, value);\n }\n}\n\nexport function setAttribute(name: string, value: any, newVnode: VnodeWithDom): void {\n if (!reservedProps.has(name)) {\n newVnode.props[name] = value;\n sharedSetAttribute(name, value, newVnode);\n }\n}\n\nfunction removeAttributes(vnode: VnodeWithDom, oldProps: VnodeProperties | null): void {\n if (!oldProps) {\n return;\n }\n\n const vnodeDom = vnode.dom;\n const vnodeProps = vnode.props;\n\n for (const name in oldProps) {\n if (name in vnodeProps === false && !eventListenerNames.has(name) && !reservedProps.has(name)) {\n if (name in vnodeDom) {\n vnodeDom[name] = null;\n } else {\n vnodeDom.removeAttribute(name);\n }\n }\n }\n}\n\nfunction addProperties(vnode: VnodeWithDom, oldProps: VnodeProperties | null) {\n const vnodeProps = vnode.props;\n for (const name in vnodeProps) {\n if (directives[name]) {\n if (directives[name](vnodeProps[name], vnode, oldProps) === false) {\n break;\n }\n continue;\n }\n\n if (reservedProps.has(name)) {\n continue;\n }\n\n sharedSetAttribute(name, vnodeProps[name], vnode);\n }\n}\n\nexport function updateAttributes(newVnode: VnodeWithDom, oldProps: VnodeProperties | null): void {\n removeAttributes(newVnode, oldProps);\n addProperties(newVnode, oldProps);\n}\n\nexport function createElement(tag: string, isSVG: boolean): DomElement {\n return isSVG\n ? document.createElementNS(\"http://www.w3.org/2000/svg\", tag)\n : (document.createElement(tag) as DomElement);\n}\n\nfunction flatTree(newVnode: VnodeWithDom, children: Children) {\n current.vnode = newVnode;\n let i = 0;\n\n while (i < children.length) {\n const newChild = children[i];\n\n if (newChild == null) {\n children.splice(i, 1);\n continue;\n }\n\n if (Array.isArray(newChild)) {\n children.splice(i, 1, ...newChild);\n continue;\n }\n\n if (newChild instanceof Vnode) {\n if (newChild.props === null) {\n newChild.props = {};\n }\n\n if (typeof newChild.tag !== \"string\") {\n const component = newChild.tag;\n\n current.component = newChild.tag;\n children[i] = (\"view\" in component ? component.view : component).bind(component)(\n newChild.props,\n newChild.children\n );\n continue;\n } else {\n newChild.isSVG = newVnode.isSVG || newChild.tag === \"svg\";\n }\n }\n\n i++;\n }\n\n return children;\n}\n\nfunction handleVFor(newVnode: VnodeWithDom) {\n if (\"v-for\" in newVnode.props) {\n const set = newVnode.props[\"v-for\"];\n const children = [];\n const callback = newVnode.children[0];\n children.length = set.length;\n\n for (let i = 0, l = set.length; i < l; i++) {\n children[i] = callback(set[i], i);\n }\n\n return children;\n }\n return [...newVnode.children];\n}\n\nfunction createNewElement(newChild: VnodeWithDom, newVnode: VnodeWithDom, oldChild: DomElement | null) {\n const dom = createElement(newChild.tag, newChild.isSVG as boolean);\n if (oldChild) {\n newVnode.dom.replaceChild(dom, oldChild);\n } else {\n newVnode.dom.appendChild(dom);\n }\n newChild.dom = dom;\n addProperties(newChild, null);\n newChild.dom.props = newChild.props;\n if (\"v-text\" in newChild.props) {\n newChild.dom.textContent = newChild.props[\"v-text\"];\n return;\n }\n\n const children = flatTree(newChild, handleVFor(newChild));\n if (children.length === 0) {\n newChild.dom.textContent = \"\";\n return;\n }\n\n for (let i = 0, l = children.length; i < l; i++) {\n if (children[i] instanceof Vnode === false) {\n newChild.dom.appendChild(document.createTextNode(children[i]));\n continue;\n }\n createNewElement(children[i], newChild, null);\n }\n}\n\nfunction patchKeyed(newVnode: VnodeWithDom, children: Children) {\n const oldTree = [...Array.from(newVnode.dom.childNodes)] as unknown as DomElement[];\n const childNodes = newVnode.dom.childNodes;\n const oldKeyedList: Record = {};\n const newKeyedList: Record = {};\n\n for (let i = 0, l = oldTree.length; i < l; i++) {\n const oldProps = oldTree[i].props;\n if (oldProps) {\n oldKeyedList[oldProps.key as string] = i;\n }\n\n if (i < children.length && children[i] instanceof Vnode) {\n newKeyedList[children[i].props.key as string] = i;\n }\n }\n\n for (let i = 0, l = children.length; i < l; i++) {\n const newChild = children[i];\n const oldChild = oldTree[oldKeyedList[newChild.props.key as string]];\n\n if (!oldChild) {\n createNewElement(newChild, newVnode, childNodes[i] as DomElement | null);\n continue;\n }\n\n newChild.dom = oldChild;\n const currentChild = childNodes[i];\n if (!currentChild) {\n newVnode.dom.appendChild(oldChild);\n } else if (currentChild !== oldChild) {\n newVnode.dom.replaceChild(oldChild, currentChild);\n }\n\n if (\"v-keep\" in newChild.props === false || oldChild.props[\"v-keep\"] !== newChild.props[\"v-keep\"]) {\n updateAttributes(newChild as VnodeWithDom, oldChild.props);\n oldChild.props = newChild.props;\n\n if (\"v-text\" in newChild.props) {\n // eslint-disable-next-line eqeqeq\n if (oldChild.textContent != newChild.props[\"v-text\"]) {\n oldChild.textContent = newChild.props[\"v-text\"];\n }\n continue;\n }\n // eslint-disable-next-line no-use-before-define\n patch(newChild as VnodeWithDom);\n }\n }\n\n for (let i = children.length, l = childNodes.length; i < l; i++) {\n childNodes[i]?.remove();\n }\n}\n\n// eslint-disable-next-line complexity\nexport function patch(newVnode: VnodeWithDom): void {\n const children = flatTree(newVnode, handleVFor(newVnode));\n\n const dom = newVnode.dom;\n\n if (children.length === 0) {\n if (dom.childNodes.length) {\n dom.textContent = \"\";\n }\n return;\n }\n\n const oldDomChildren = dom.childNodes as unknown as DomElement[];\n const oldChildrenLength = oldDomChildren.length;\n if (oldChildrenLength > 0) {\n const firstOldProps = oldDomChildren[0].props;\n const firstVnode = children[0] as VnodeWithDom;\n if (firstOldProps && firstVnode instanceof Vnode && \"key\" in firstVnode.props && \"key\" in firstOldProps) {\n patchKeyed(newVnode, children);\n return;\n }\n }\n\n const childrenLength = children.length;\n if (oldChildrenLength === 0) {\n for (let i = 0; i < childrenLength; i++) {\n if (children[i] instanceof Vnode === false) {\n dom.appendChild(document.createTextNode(children[i]));\n continue;\n }\n createNewElement(children[i], newVnode, null);\n }\n return;\n }\n\n for (let i = 0; i < childrenLength; i++) {\n const oldChild = oldDomChildren[i];\n const newChild = children[i];\n\n if (newChild instanceof Vnode === false) {\n if (!oldChild) {\n newVnode.dom.appendChild(document.createTextNode(newChild));\n continue;\n }\n\n if (oldChild.nodeType !== 3) {\n newVnode.dom.replaceChild(document.createTextNode(newChild), oldChild);\n continue;\n }\n\n // eslint-disable-next-line eqeqeq\n if (oldChild.nodeValue != newChild) {\n oldChild.nodeValue = newChild;\n }\n continue;\n }\n\n if (!oldChild) {\n createNewElement(newChild, newVnode, null);\n continue;\n }\n\n if (\"v-keep\" in newChild.props) {\n if (oldChild.props && oldChild.props[\"v-keep\"] === newChild.props[\"v-keep\"]) {\n continue;\n }\n\n const nextOldChild = oldDomChildren[i + 1];\n if (nextOldChild && nextOldChild.props && nextOldChild.props[\"v-keep\"] === newChild.props[\"v-keep\"]) {\n oldChild.remove();\n continue;\n }\n }\n\n if (newChild.tag !== oldChild.nodeName.toLowerCase()) {\n createNewElement(newChild, newVnode, oldChild);\n continue;\n }\n\n newChild.dom = oldChild;\n updateAttributes(newChild as VnodeWithDom, oldChild.props || null);\n oldChild.props = newChild.props;\n if (\"v-text\" in newChild.props) {\n // eslint-disable-next-line eqeqeq\n if (newChild.dom.textContent != newChild.props[\"v-text\"]) {\n newChild.dom.textContent = newChild.props[\"v-text\"];\n }\n continue;\n }\n patch(newChild);\n }\n\n for (let i = childrenLength, l = oldDomChildren.length; i < l; i++) {\n oldDomChildren[i]?.remove();\n }\n}\n\nexport function updateVnode(vnode: VnodeWithDom): string | void {\n callSet(onCleanupSet);\n vnode.props = vnode.props || {};\n patch(vnode);\n callSet(isMounted ? onUpdateSet : onMountSet);\n isMounted = true;\n current.vnode = null;\n current.component = null;\n if (isNodeJs) {\n return vnode.dom.innerHTML;\n }\n}\n\nexport function update(): void | string {\n if (mainVnode) {\n mainVnode.children = [mainComponent];\n return updateVnode(mainVnode);\n }\n}\n\nexport function unmount() {\n if (mainVnode) {\n mainComponent = v(() => null, {}) as VnodeComponentInterface;\n const result = update();\n callSet(onUnmountSet);\n for (const name in eventListenerNames) {\n mainVnode.dom.removeEventListener(name.slice(2).toLowerCase(), eventListener);\n Reflect.deleteProperty(eventListenerNames, name);\n }\n\n mainComponent = null;\n mainVnode = null;\n isMounted = false;\n current.vnode = null;\n current.component = null;\n current.event = null;\n return result;\n }\n}\n\nexport function mount(dom: string | DomElement, component: any) {\n const container =\n typeof dom === \"string\" ? (isNodeJs ? createElement(dom, dom === \"svg\") : document.querySelector(dom)) : dom;\n\n if (isComponent(component)) {\n mainComponent = new Vnode(component, {}, []) as VnodeComponentInterface;\n } else if (isVnodeComponent(component)) {\n mainComponent = component;\n } else {\n mainComponent = new Vnode(() => component, {}, []) as VnodeComponentInterface;\n }\n\n mainVnode = domToVnode(container) as VnodeWithDom;\n return update();\n}\n"], + "mappings": "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", + "names": ["val", "value", "directive"] } diff --git a/dist/node/index.js b/dist/node/index.js index 858bf64..2e48576 100644 --- a/dist/node/index.js +++ b/dist/node/index.js @@ -126,6 +126,9 @@ var Node = class _Node { } return child; } + remove() { + return this.parentNode ? this.parentNode.removeChild(this) : this; + } cloneNode(deep) { if (this.nodeType === 3) { return new Text(this.nodeValue); @@ -323,10 +326,20 @@ var Element = class extends Node { } throw new Error("Cannot set style"); } + get className() { + return this.getAttribute("class") || ""; + } + set className(value) { + if (value == null || value === false) { + this.removeAttribute("class"); + } else { + this.setAttribute("class", String(value)); + } + } classList = { toggle: (item, force) => { if (item) { - const classes = (this.getAttribute("class") || "").split(" "); + const classes = (this.className || "").split(" "); const itemIndex = classes.indexOf(item); if (force && itemIndex === -1) { classes.push(item); @@ -336,13 +349,23 @@ var Element = class extends Node { } const final = classes.join(" ").trim(); if (final.length) { - this.setAttribute("class", classes.join(" ").trim()); + this.className = classes.join(" ").trim(); } else { - this.removeAttribute("class"); + this.className = false; } } } }; + get id() { + return this.getAttribute("id") || ""; + } + set id(value) { + if (value == null || value === false) { + this.removeAttribute("id"); + } else { + this.setAttribute("id", String(value)); + } + } set textContent(text) { this.nodeValue = String(text); this.childNodes = this.nodeValue ? [new Text(this.nodeValue)] : []; diff --git a/dist/node/index.js.map b/dist/node/index.js.map index 7ecbc3b..c155d15 100644 --- a/dist/node/index.js.map +++ b/dist/node/index.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../lib/node/index.ts", "../../lib/node/utils/tree-adapter.ts", "../../lib/node/utils/icons.ts", "../../lib/node/utils/inline.ts", "../../lib/node/utils/sw.ts"], - "sourcesContent": ["import { document, domToHtml, domToHyperscript, htmlToDom, htmlToHyperscript } from \"./utils/tree-adapter\";\nimport { mount, unmount } from \"valyrian.js\";\n\nimport FormData from \"form-data\";\n// import fetch from \"node-fetch\";\nimport { icons } from \"./utils/icons\";\nimport { inline } from \"./utils/inline\";\nimport { sw } from \"./utils/sw\";\n\nglobal.FormData = FormData as any;\nglobal.document = document as any;\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 };\n", "/* eslint-disable no-use-before-define */\n/* eslint-disable complexity */\ninterface ChildNodes extends Array {}\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 constructor() {}\n\n appendChild(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 }\n return node;\n }\n\n insertBefore(node: T, child: Node | null): T {\n if (node) {\n node.parentNode && node.parentNode.removeChild(node as Node);\n node.parentNode = this;\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(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(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 }\n return child;\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 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) {\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, prop: string) => state[prop],\n set: (state: Record, prop: string, value: any) => {\n state[prop] = value;\n updateElementStyles(this, state);\n return true;\n },\n deleteProperty: (state: Record, 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&w=is&k=20&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 classList = {\n toggle: (item: any, force: any) => {\n if (item) {\n const classes = (this.getAttribute(\"class\") || \"\").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.setAttribute(\"class\", classes.join(\" \").trim());\n } else {\n this.removeAttribute(\"class\");\n }\n }\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 }\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): 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 += \"\";\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}\"\"`;\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 = {};\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 {}\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(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(\" 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(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", "import fs from \"fs\";\nimport { htmlToHyperscript } from \"./tree-adapter\";\n\ninterface 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\";\n lang?: string;\n background?: string;\n theme_color?: string;\n display?: \"browser\" | \"standalone\";\n orientation?: \"any\" | \"portrait\" | \"landscape\";\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 = {}\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\ninline.uncss = async function (\n renderedHtml: (string | Promise)[],\n css: string,\n options: Record = {}\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.tpl\");\n const swTpl = fs.readFileSync(swfiletemplate, \"utf8\");\n const opt = Object.assign(\n {\n version: \"v1::\",\n name: \"Valyrian.js\",\n urls: [\"/\"],\n debug: false\n },\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\n if (!opt.debug) {\n contents = contents.replace(\"console.log\", \"() => {}\");\n }\n\n fs.writeFileSync(file, contents, \"utf8\");\n}\n"], - "mappings": "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", + "sourcesContent": ["import { document, domToHtml, domToHyperscript, htmlToDom, htmlToHyperscript } from \"./utils/tree-adapter\";\nimport { mount, unmount } from \"valyrian.js\";\n\nimport FormData from \"form-data\";\n// import fetch from \"node-fetch\";\nimport { icons } from \"./utils/icons\";\nimport { inline } from \"./utils/inline\";\nimport { sw } from \"./utils/sw\";\n\nglobal.FormData = FormData as any;\nglobal.document = document as any;\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 };\n", "/* eslint-disable no-use-before-define */\n/* eslint-disable complexity */\ninterface ChildNodes extends Array {}\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 constructor() {}\n\n appendChild(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 }\n return node;\n }\n\n insertBefore(node: T, child: Node | null): T {\n if (node) {\n node.parentNode && node.parentNode.removeChild(node as Node);\n node.parentNode = this;\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(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(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 }\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 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) {\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, prop: string) => state[prop],\n set: (state: Record, prop: string, value: any) => {\n state[prop] = value;\n updateElementStyles(this, state);\n return true;\n },\n deleteProperty: (state: Record, 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&w=is&k=20&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 }\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): 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 += \"\";\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}\"\"`;\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 = {};\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 {}\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(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(\" 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(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", "import fs from \"fs\";\nimport { htmlToHyperscript } from \"./tree-adapter\";\n\ninterface 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\";\n lang?: string;\n background?: string;\n theme_color?: string;\n display?: \"browser\" | \"standalone\";\n orientation?: \"any\" | \"portrait\" | \"landscape\";\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 = {}\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\ninline.uncss = async function (\n renderedHtml: (string | Promise)[],\n css: string,\n options: Record = {}\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.tpl\");\n const swTpl = fs.readFileSync(swfiletemplate, \"utf8\");\n const opt = Object.assign(\n {\n version: \"v1::\",\n name: \"Valyrian.js\",\n urls: [\"/\"],\n debug: false\n },\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\n if (!opt.debug) {\n contents = contents.replace(\"console.log\", \"() => {}\");\n }\n\n fs.writeFileSync(file, contents, \"utf8\");\n}\n"], + "mappings": "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", "names": ["node", "item", "document", "fs", "import_fs", "esbuild", "CleanCSS", "fs", "import_fs", "path", "fs", "FormData"] } diff --git a/dist/node/index.mjs b/dist/node/index.mjs index a9d0b1e..daf350f 100644 --- a/dist/node/index.mjs +++ b/dist/node/index.mjs @@ -83,6 +83,9 @@ var Node = class _Node { } return child; } + remove() { + return this.parentNode ? this.parentNode.removeChild(this) : this; + } cloneNode(deep) { if (this.nodeType === 3) { return new Text(this.nodeValue); @@ -280,10 +283,20 @@ var Element = class extends Node { } throw new Error("Cannot set style"); } + get className() { + return this.getAttribute("class") || ""; + } + set className(value) { + if (value == null || value === false) { + this.removeAttribute("class"); + } else { + this.setAttribute("class", String(value)); + } + } classList = { toggle: (item, force) => { if (item) { - const classes = (this.getAttribute("class") || "").split(" "); + const classes = (this.className || "").split(" "); const itemIndex = classes.indexOf(item); if (force && itemIndex === -1) { classes.push(item); @@ -293,13 +306,23 @@ var Element = class extends Node { } const final = classes.join(" ").trim(); if (final.length) { - this.setAttribute("class", classes.join(" ").trim()); + this.className = classes.join(" ").trim(); } else { - this.removeAttribute("class"); + this.className = false; } } } }; + get id() { + return this.getAttribute("id") || ""; + } + set id(value) { + if (value == null || value === false) { + this.removeAttribute("id"); + } else { + this.setAttribute("id", String(value)); + } + } set textContent(text) { this.nodeValue = String(text); this.childNodes = this.nodeValue ? [new Text(this.nodeValue)] : []; diff --git a/dist/node/index.mjs.map b/dist/node/index.mjs.map index 698726d..2fffeda 100644 --- a/dist/node/index.mjs.map +++ b/dist/node/index.mjs.map @@ -1,7 +1,7 @@ { "version": 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"], - "sourcesContent": ["/* eslint-disable no-use-before-define */\n/* eslint-disable complexity */\ninterface ChildNodes extends Array {}\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 constructor() {}\n\n appendChild(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 }\n return node;\n }\n\n insertBefore(node: T, child: Node | null): T {\n if (node) {\n node.parentNode && node.parentNode.removeChild(node as Node);\n node.parentNode = this;\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(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(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 }\n return child;\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 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) {\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, prop: string) => state[prop],\n set: (state: Record, prop: string, value: any) => {\n state[prop] = value;\n updateElementStyles(this, state);\n return true;\n },\n deleteProperty: (state: Record, 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&w=is&k=20&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 classList = {\n toggle: (item: any, force: any) => {\n if (item) {\n const classes = (this.getAttribute(\"class\") || \"\").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.setAttribute(\"class\", classes.join(\" \").trim());\n } else {\n this.removeAttribute(\"class\");\n }\n }\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 }\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): 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 += \"\";\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}\"\"`;\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 = {};\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 {}\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(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(\" 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(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", "import { document, domToHtml, domToHyperscript, htmlToDom, htmlToHyperscript } from \"./utils/tree-adapter\";\nimport { mount, unmount } from \"valyrian.js\";\n\nimport FormData from \"form-data\";\n// import fetch from \"node-fetch\";\nimport { icons } from \"./utils/icons\";\nimport { inline } from \"./utils/inline\";\nimport { sw } from \"./utils/sw\";\n\nglobal.FormData = FormData as any;\nglobal.document = document as any;\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 };\n", "import fs from \"fs\";\nimport { htmlToHyperscript } from \"./tree-adapter\";\n\ninterface 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\";\n lang?: string;\n background?: string;\n theme_color?: string;\n display?: \"browser\" | \"standalone\";\n orientation?: \"any\" | \"portrait\" | \"landscape\";\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 = {}\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\ninline.uncss = async function (\n renderedHtml: (string | Promise)[],\n css: string,\n options: Record = {}\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.tpl\");\n const swTpl = fs.readFileSync(swfiletemplate, \"utf8\");\n const opt = Object.assign(\n {\n version: \"v1::\",\n name: \"Valyrian.js\",\n urls: [\"/\"],\n debug: false\n },\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\n if (!opt.debug) {\n contents = contents.replace(\"console.log\", \"() => {}\");\n }\n\n fs.writeFileSync(file, contents, \"utf8\");\n}\n"], - "mappings": ";AAIO,IAAM,OAAN,MAAM,MAAqB;AAAA;AAAA,EAEhC,aAAyB,CAAC;AAAA,EAC1B,UAAkB;AAAA,EAElB;AAAA,EACA,IAAI,WAAmB;AACrB,WAAO,KAAK,SAAS,YAAY;AAAA,EACnC;AAAA,EACA,IAAI,SAAS,MAAc;AACzB,SAAK,WAAW;AAAA,EAClB;AAAA,EACA,IAAI,UAAkB;AACpB,WAAO,KAAK;AAAA,EACd;AAAA,EACA,IAAI,QAAQ,MAAc;AACxB,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA;AAAA,EACA,IAAI,WAAmB;AACrB,WAAO,KAAK;AAAA,EACd;AAAA,EACA,IAAI,SAAS,MAAc;AACzB,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,aAAa;AAAA,EACb,aAAqB,CAAC;AAAA,EACtB,IAAI,YAAY,MAAM;AACpB,SAAK,aAAa,OAAO,IAAI;AAAA,EAC/B;AAAA,EACA,IAAI,cAAc;AAChB,WAAO,KAAK;AAAA,EACd;AAAA,EACA,IAAI,UAAU,MAAM;AAClB,SAAK,aAAa,OAAO,IAAI;AAAA,EAC/B;AAAA,EACA,IAAI,YAAY;AACd,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,cAA2B;AAAA,EAC3B,IAAI,aAAa;AACf,WAAO,KAAK;AAAA,EACd;AAAA,EACA,IAAI,WAAW,MAAM;AACnB,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,cAAc;AAAA,EAAC;AAAA,EAEf,YAA4B,MAAY;AACtC,QAAI,MAAM;AACR,WAAK,cAAc,KAAK,WAAW,YAAY,IAAY;AAC3D,WAAK,WAAW,KAAK,IAAI;AACzB,WAAK,aAAa;AAAA,IACpB;AACA,WAAO;AAAA,EACT;AAAA,EAEA,aAA6B,MAAS,OAAuB;AAC3D,QAAI,MAAM;AACR,WAAK,cAAc,KAAK,WAAW,YAAY,IAAY;AAC3D,WAAK,aAAa;AAClB,UAAI,OAAO;AACT,cAAM,MAAM,KAAK,WAAW,QAAQ,KAAK;AACzC,aAAK,WAAW,OAAO,KAAK,GAAG,IAAI;AAAA,MACrC,OAAO;AACL,aAAK,WAAW,KAAK,IAAI;AAAA,MAC3B;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,aAA6B,MAAY,OAAa;AACpD,QAAI,QAAQ,SAAS,MAAM,eAAe,MAAM;AAC9C,WAAK,aAAa,MAAM,KAAK;AAC7B,YAAM,cAAc,MAAM,WAAW,YAAY,KAAK;AAAA,IACxD;AACA,WAAO;AAAA,EACT;AAAA,EACA,YAA4B,OAAa;AACvC,QAAI,SAAS,MAAM,eAAe,MAAM;AACtC,YAAM,MAAO,KAAK,WAAiC,QAAQ,KAAK;AAChE,MAAC,KAAK,WAAiC,OAAO,KAAK,CAAC;AACpD,YAAM,aAAa;AAAA,IACrB;AACA,WAAO;AAAA,EACT;AAAA,EACA,UAAU,MAAkC;AAC1C,QAAI,KAAK,aAAa,GAAG;AACvB,aAAO,IAAI,KAAK,KAAK,SAAS;AAAA,IAChC;AAEA,QAAI,KAAK,aAAa,GAAG;AACvB,YAAMA,QAAO,IAAI,QAAQ;AACzB,MAAAA,MAAK,WAAW,KAAK;AACrB,WAAK,WAAW,KAAK;AACrB,UAAI,KAAK,YAAY;AACnB,iBAAS,IAAI,GAAG,IAAI,KAAK,WAAW,QAAQ,IAAI,GAAG,KAAK;AACtD,UAAAA,MAAK,aAAa,KAAK,WAAW,CAAC,EAAE,UAAU,KAAK,WAAW,CAAC,EAAE,SAAS;AAAA,QAC7E;AAAA,MACF;AACA,UAAI,MAAM;AACR,iBAAS,IAAI,GAAG,IAAI,KAAK,WAAW,QAAQ,IAAI,GAAG,KAAK;AACtD,UAAAA,MAAK,YAAY,KAAK,WAAW,CAAC,EAAE,UAAU,IAAI,CAAC;AAAA,QACrD;AAAA,MACF;AACA,aAAOA;AAAA,IACT;AAEA,UAAM,OAAO,IAAI,MAAK;AACtB,SAAK,WAAW,KAAK;AACrB,SAAK,WAAW,KAAK;AACrB,WAAO;AAAA,EACT;AAAA,EAEA,aAAa,MAAc,OAAY;AACrC,UAAM,OAAO;AAAA,MACX,UAAU;AAAA,MACV,WAAW;AAAA,IACb;AACA,QAAI,MAAM;AACV,aAAS,IAAI,GAAG,IAAI,KAAK,WAAW,QAAQ,IAAI,GAAG,KAAK;AACtD,UAAI,KAAK,WAAW,CAAC,EAAE,aAAa,MAAM;AACxC,cAAM;AACN;AAAA,MACF;AAAA,IACF;AACA,YAAQ,KAAK,KAAK,WAAW,KAAK,IAAY,IAAI,KAAK,WAAW,OAAO,KAAK,GAAG,IAAY;AAAA,EAC/F;AAAA,EAEA,aAAa,MAAc;AACzB,aAAS,IAAI,GAAG,IAAI,KAAK,WAAW,QAAQ,IAAI,GAAG,KAAK;AACtD,UAAI,KAAK,WAAW,CAAC,EAAE,aAAa,MAAM;AACxC,eAAO,KAAK,WAAW,CAAC,EAAE;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,gBAAgB,MAAc;AAC5B,QAAI,MAAM;AACV,aAAS,IAAI,GAAG,IAAI,KAAK,WAAW,QAAQ,IAAI,GAAG,KAAK;AACtD,UAAI,KAAK,WAAW,CAAC,EAAE,aAAa,MAAM;AACxC,cAAM;AACN;AAAA,MACF;AAAA,IACF;AACA,QAAI,MAAM,IAAI;AACZ,WAAK,WAAW,OAAO,KAAK,CAAC;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,eAAe,IAAyB;AACtC,QAAI;AACJ,aAAS,IAAI,GAAG,IAAI,KAAK,WAAW,QAAQ,IAAI,GAAG,KAAK;AACtD,UAAI,KAAK,WAAW,CAAC,EAAE,aAAa,GAAG;AACrC,YAAI,KAAK,WAAW,CAAC,EAAE,aAAa,IAAI,MAAM,IAAI;AAChD,yBAAe,KAAK,WAAW,CAAC;AAChC;AAAA,QACF;AACA,uBAAe,KAAK,WAAW,CAAC,EAAE,eAAe,EAAE;AACnD,YAAI,cAAc;AAChB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,WAAO,gBAAgB;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0DA,iBAEE,MAEA,UAEA,SACM;AAAA,EAER;AAAA;AAAA;AAAA;AAAA,EAIA,oBAEE,MAEA,UAEA,SACM;AAAA,EAER;AACF;AAEO,IAAM,OAAN,cAAmB,KAAK;AAAA,EAC7B,YAAY,MAAW;AACrB,UAAM;AACN,SAAK,WAAW;AAChB,SAAK,WAAW;AAChB,SAAK,aAAa,OAAO,IAAI;AAAA,EAC/B;AACF;AAEA,SAAS,oBAAoB,SAAkB,OAA4B;AACzE,MAAI,MAAM;AACV,aAAW,OAAO,OAAO;AACvB,UAAM,QAAQ,MAAM,GAAG;AACvB,QAAI,OAAO,UAAU,eAAe,UAAU,QAAQ,OAAO,KAAK,EAAE,SAAS,GAAG;AAC9E,aAAO,GAAG,GAAG,KAAK,MAAM,GAAG,CAAC;AAAA,IAC9B;AAAA,EACF;AACA,MAAI,IAAI,WAAW,GAAG;AACpB,YAAQ,gBAAgB,OAAO;AAAA,EACjC,OAAO;AACL,YAAQ,aAAa,SAAS,GAAG;AAAA,EACnC;AACF;AAEO,IAAM,UAAN,cAAsB,KAAK;AAAA,EAChC,cAAc;AACZ,UAAM;AACN,SAAK,WAAW;AAChB,SAAK,aAAa,CAAC;AACnB,SAAK,aAAa,CAAC;AAAA,EACrB;AAAA,EAEA,SAAS,IAAI;AAAA,IACX,CAAC;AAAA,IACD;AAAA,MACE,KAAK,CAAC,OAA4B,SAAiB,MAAM,IAAI;AAAA,MAC7D,KAAK,CAAC,OAA4B,MAAc,UAAe;AAC7D,cAAM,IAAI,IAAI;AACd,4BAAoB,MAAM,KAAK;AAC/B,eAAO;AAAA,MACT;AAAA,MACA,gBAAgB,CAAC,OAA4B,SAAiB;AAC5D,gBAAQ,eAAe,OAAO,IAAI;AAClC,4BAAoB,MAAM,KAAK;AAC/B,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAAA,EAEA,IAAI,QAAQ;AACV,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,MAAM,OAAe;AACvB,QAAI,OAAO,UAAU,UAAU;AAE7B,YAAM,QAAQ;AACd,UAAI;AAEJ,cAAQ,QAAQ,MAAM,KAAK,KAAK,OAAO,MAAM;AAC3C,aAAK,OAAO,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,EAAE,KAAK;AAAA,MACxC;AAEA;AAAA,IACF;AAEA,UAAM,IAAI,MAAM,kBAAkB;AAAA,EACpC;AAAA,EAEA,YAAY;AAAA,IACV,QAAQ,CAAC,MAAW,UAAe;AACjC,UAAI,MAAM;AACR,cAAM,WAAW,KAAK,aAAa,OAAO,KAAK,IAAI,MAAM,GAAG;AAC5D,cAAM,YAAY,QAAQ,QAAQ,IAAI;AACtC,YAAI,SAAS,cAAc,IAAI;AAC7B,kBAAQ,KAAK,IAAI;AAAA,QACnB;AAEA,YAAI,CAAC,SAAS,cAAc,IAAI;AAC9B,kBAAQ,OAAO,WAAW,CAAC;AAAA,QAC7B;AAEA,cAAM,QAAQ,QAAQ,KAAK,GAAG,EAAE,KAAK;AACrC,YAAI,MAAM,QAAQ;AAChB,eAAK,aAAa,SAAS,QAAQ,KAAK,GAAG,EAAE,KAAK,CAAC;AAAA,QACrD,OAAO;AACL,eAAK,gBAAgB,OAAO;AAAA,QAC9B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,IAAI,YAAY,MAAM;AACpB,SAAK,YAAY,OAAO,IAAI;AAC5B,SAAK,aAAa,KAAK,YAAY,CAAC,IAAI,KAAK,KAAK,SAAS,CAAC,IAAI,CAAC;AAAA,EACnE;AAAA,EACA,IAAI,cAAc;AAChB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,UAAU,MAAM;AAClB,SAAK,YAAY,OAAO,IAAI;AAAA,EAC9B;AAAA,EAEA,IAAI,YAAY;AACd,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,YAAY;AACd,QAAI,MAAM;AACV,aAAS,IAAI,GAAG,IAAI,KAAK,WAAW,QAAQ,IAAI,GAAG,KAAK;AAEtD,aAAO,UAAU,KAAK,WAAW,CAAC,CAAY;AAAA,IAChD;AACA,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,UAAU,MAAM;AAClB,SAAK,cAAc;AACnB,UAAM,SAAS,UAAU,IAAI;AAC7B,QAAI,kBAAkB,kBAAkB;AACtC,eAAS,IAAI,GAAG,IAAI,OAAO,WAAW,QAAQ,IAAI,GAAG,KAAK;AACxD,aAAK,YAAY,OAAO,WAAW,CAAC,CAAC;AAAA,MACvC;AAAA,IACF,OAAO;AACL,WAAK,YAAY,MAAM;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,IAAI,YAAoB;AACtB,WAAO,UAAU,IAAI;AAAA,EACvB;AACF;AAEO,IAAM,mBAAN,cAA+B,QAAQ;AAAA,EAC5C,cAAc;AACZ,UAAM;AACN,SAAK,WAAW;AAChB,SAAK,WAAW;AAAA,EAClB;AACF;AAEO,IAAM,WAAN,cAAuB,QAAQ;AAAA,EACpC,cAAc;AACZ,UAAM;AACN,SAAK,WAAW;AAChB,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,yBAA2C;AACzC,WAAO,IAAI,iBAAiB;AAAA,EAC9B;AAAA,EAEA,cAAc,MAAc;AAC1B,UAAM,UAAU,IAAI,QAAQ;AAC5B,YAAQ,WAAW,KAAK,YAAY;AACpC,WAAO;AAAA,EACT;AAAA,EAEA,gBAAgB,IAAY,MAAc;AACxC,UAAM,UAAU,KAAK,cAAc,IAAI;AACvC,YAAQ,UAAU;AAClB,WAAO;AAAA,EACT;AAAA,EAEA,eAAe,MAAW;AACxB,WAAO,IAAI,KAAK,IAAI;AAAA,EACtB;AACF;AAEA,IAAM,kBAAkB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,UAAU,KAAsB;AAC9C,MAAI,IAAI,aAAa,GAAG;AACtB,WAAO,IAAI;AAAA,EACb;AAEA,MAAI,IAAI,aAAa,GAAG;AACtB,UAAM,OAAO,IAAI,SAAS,YAAY;AACtC,QAAI,MAAM,MAAM;AAChB,aAAS,IAAI,GAAG,IAAI,IAAI,WAAW,QAAQ,IAAI,GAAG,KAAK;AACrD,aAAO,MAAM,IAAI,WAAW,CAAC,EAAE,WAAW,OAAO,IAAI,WAAW,CAAC,EAAE,YAAY;AAAA,IACjF;AAEA,QAAI,gBAAgB,QAAQ,IAAI,MAAM,IAAI;AACxC,aAAO;AACP,UAAI,IAAI,cAAc,IAAI,WAAW,SAAS,GAAG;AAC/C,iBAAS,IAAI,GAAG,IAAI,IAAI,WAAW,QAAQ,IAAI,GAAG,KAAK;AACrD,gBAAM,QAAQ,UAAU,IAAI,WAAW,CAAC,CAAY;AACpD,cAAI,OAAO;AACT,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AACA,aAAO,OAAO,OAAO;AAAA,IACvB,OAAO;AACL,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,SAAS,iBAAiB,YAAwB,QAAQ,GAAG;AAClE,MAAI,SAAS;AACb,WAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,cAAU;AAAA,EACZ;AAEA,SAAO,WACJ,IAAI,CAAC,SAAS;AACb,QAAI,KAAK,aAAa,IAAI;AACxB,aAAO;AAAA,EAAK,MAAM;AAAA,IACpB,WAAW,KAAK,aAAa,GAAG;AAC9B,aAAO;AAAA,EAAK,MAAM,IAAI,KAAK,SAAS;AAAA,IACtC,OAAO;AACL,UAAI,MAAM;AAAA,EAAK,MAAM,MAAM,KAAK,QAAQ;AAExC,UAAI,KAAK,YAAY;AACnB,cAAM,QAA6B,CAAC;AACpC,iBAAS,IAAI,GAAG,IAAI,KAAK,WAAW,QAAQ,IAAI,GAAG,KAAK;AACtD,gBAAM,OAAO,KAAK,WAAW,CAAC;AAC9B,gBAAM,KAAK,QAAQ,IAAI,KAAK;AAAA,QAC9B;AACA,eAAO,KAAK,UAAU,KAAK;AAAA,MAC7B,OAAO;AACL,eAAO;AAAA,MACT;AAEA,aAAO;AACP,UAAI,KAAK,cAAc,KAAK,WAAW,SAAS,GAAG;AACjD,eAAO,GAAG,iBAAiB,KAAK,YAAoC,QAAQ,CAAC,CAAC;AAAA,EAAK,MAAM;AAAA,MAC3F;AAEA,aAAO;AACP,aAAO;AAAA,IACT;AAAA,EACF,CAAC,EACA,KAAK,GAAG;AACb;AAqBA,SAAS,UAAU,MAAkC,MAAc;AACjE,QAAM,cAA4C,CAAC;AAGnD,MAAI,KAAK,SAAS,QAAQ;AAExB,aAAS,IAAI,GAAG,IAAI,KAAK,SAAS,QAAQ,KAAK;AAC7C,YAAM,QAAQ,KAAK,SAAS,CAAC;AAC7B,YAAM,YAAY,KAAK,SAAS,IAAI,CAAC;AAIrC,UAAI,MAAM,KAAK,MAAM,WAAW,KAAK,iBAAiB;AACpD,cAAM,eAAe,KAAK,UAAU,KAAK,iBAAiB,MAAM,QAAQ;AAExE,cAAM,YAAwC;AAAA,UAC5C,SAAS;AAAA,UACT,UAAU,KAAK;AAAA,UACf,QAAQ,KAAK,kBAAkB,aAAa;AAAA,UAC5C,iBAAiB,KAAK;AAAA,UACtB,eAAe,KAAK,kBAAkB,aAAa;AAAA,UACnD,YAAY,CAAC;AAAA,UACb,UAAU,CAAC;AAAA,UACX,WAAW;AAAA,QACb;AAEA,oBAAY,KAAK,SAAS;AAAA,MAC5B;AAGA,kBAAY,KAAK,KAAK;AAItB,UAAI,aAAa,MAAM,SAAS,UAAU,UAAU;AAClD,cAAM,eAAe,KAAK,UAAU,MAAM,QAAQ,UAAU,QAAQ;AAEpE,cAAM,YAAwC;AAAA,UAC5C,SAAS;AAAA,UACT,UAAU,MAAM;AAAA,UAChB,QAAQ,MAAM,SAAS,aAAa;AAAA,UACpC,iBAAiB,MAAM;AAAA,UACvB,eAAe,MAAM,SAAS,aAAa;AAAA,UAC3C,YAAY,CAAC;AAAA,UACb,UAAU,CAAC;AAAA,UACX,WAAW;AAAA,QACb;AAEA,oBAAY,KAAK,SAAS;AAAA,MAC5B;AAIA,UAAI,CAAC,aAAa,MAAM,SAAS,KAAK,eAAe;AACnD,cAAM,eAAe,KAAK,UAAU,MAAM,QAAQ,KAAK,aAAa;AAEpE,cAAM,YAAwC;AAAA,UAC5C,SAAS;AAAA,UACT,UAAU,MAAM;AAAA,UAChB,QAAQ,MAAM,SAAS,aAAa;AAAA,UACpC,iBAAiB,MAAM;AAAA,UACvB,eAAe,KAAK;AAAA,UACpB,YAAY,CAAC;AAAA,UACb,UAAU,CAAC;AAAA,UACX,WAAW;AAAA,QACb;AAEA,oBAAY,KAAK,SAAS;AAAA,MAC5B;AAGA,gBAAU,OAAO,IAAI;AAAA,IACvB;AAAA,EACF;AAIA,MAAI,CAAC,KAAK,SAAS,QAAQ;AACzB,UAAM,eAAe,KAAK,UAAU,KAAK,iBAAiB,KAAK,aAAa;AAE5E,QAAI,aAAa,QAAQ;AACvB,YAAM,YAAwC;AAAA,QAC5C,SAAS;AAAA,QACT,UAAU,KAAK;AAAA,QACf,QAAQ,KAAK;AAAA,QACb,iBAAiB,KAAK;AAAA,QACtB,eAAe,KAAK;AAAA,QACpB,YAAY,CAAC;AAAA,QACb,UAAU,CAAC;AAAA,QACX,WAAW;AAAA,MACb;AAEA,kBAAY,KAAK,SAAS;AAAA,IAC5B;AAAA,EACF;AAEA,OAAK,WAAW;AAClB;AAEA,SAAS,aAA6B,MAAqC;AACzE,MAAI;AAEJ,MAAI,KAAK,YAAY,SAAS;AAC5B,WAAO,SAAS,eAAe,KAAK,SAAmB;AAAA,EACzD,OAAO;AACL,WAAQ,KAAK,YAAY,uBACrB,SAAS,uBAAuB,IAChC,SAAS,cAAc,KAAK,OAAO;AAEvC,eAAW,OAAO,KAAK,YAAY;AACjC,WAAK,aAAa,KAAK,KAAK,WAAW,GAAG,CAAC;AAAA,IAC7C;AAEA,aAAS,IAAI,GAAG,IAAI,KAAK,SAAS,QAAQ,KAAK;AAC7C,YAAM,QAAQ,aAAa,KAAK,SAAS,CAAC,CAAC;AAC3C,WAAK,YAAY,KAAK;AAAA,IACxB;AAAA,EACF;AAEA,SAAO;AACT;AAGA,SAAS,mBAAmB,MAAgC;AAC1D,MAAI;AACJ,QAAM,QAAQ,OAAO,gBAAgB,GAAG;AACxC,QAAM,QAAyB,CAAC;AAGhC,SAAQ,OAAO,MAAM,KAAK,IAAI,GAAI;AAEhC,QAAI,KAAK,CAAC,EAAE,WAAW,IAAI,GAAG;AAC5B,YAAM,iBAAiB,CAAC,GAAG,KAAK,EAAE,QAAQ,EAAE,KAAK,CAACC,UAASA,MAAK,WAAW,IAAI;AAC/E,UAAI,gBAAgB;AAClB,uBAAe,SAAS,KAAK,QAAQ,KAAK,CAAC,EAAE;AAC7C,uBAAe,gBAAgB,KAAK;AAGpC,cAAM,SAAS,CAAC,GAAG,KAAK,EAAE,QAAQ,EAAE,KAAK,CAACA,UAASA,MAAK,WAAW,IAAI;AACvE,YAAI,QAAQ;AAEV,gBAAM,QAAQ,MAAM,QAAQ,cAAc;AAE1C,gBAAM,OAAO,OAAO,CAAC;AAGrB,iBAAO,SAAS,KAAK,cAAc;AAAA,QACrC;AAAA,MACF;AAEA;AAAA,IACF;AAGA,UAAM,UAA2B;AAAA,MAC/B,SAAS,KAAK,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC;AAAA,MAC7B,UAAU,KAAK;AAAA,MACf,QAAQ;AAAA,MACR,iBAAiB,KAAK,QAAQ,KAAK,CAAC,EAAE;AAAA,MACtC,eAAe;AAAA,MACf,YAAY,CAAC;AAAA,MACb,UAAU,CAAC;AAAA,MACX,WAAW;AAAA,IACb;AAGA,QAAI,UAAU,KAAK,CAAC,KAAK,IAAI,UAAU,QAAQ,QAAQ,SAAS,CAAC,EAAE,QAAQ,QAAQ,EAAE;AACrF,UAAM,uBAAuB,OAAO,MAAM,cAAc;AAExD,QAAI,sBAAsB;AACxB,iBAAW,aAAa,sBAAsB;AAC5C,cAAM,CAAC,MAAM,GAAG,KAAK,IAAI,UAAU,KAAK,EAAE,MAAM,GAAG;AACnD,iBAAS,OAAO,QAAQ,WAAW,EAAE;AACrC,YAAI,OAAO;AACT,kBAAQ,WAAW,IAAI,IAAI,MAAM,KAAK,GAAG,EAAE,QAAQ,YAAY,EAAE;AAAA,QACnE;AAAA,MACF;AAAA,IACF;AAEA,UAAM,8BAA8B,OAAO,MAAM,cAAc;AAC/D,QAAI,6BAA6B;AAC/B,iBAAW,aAAa,6BAA6B;AACnD,cAAM,CAAC,MAAM,GAAG,KAAK,IAAI,UAAU,KAAK,EAAE,MAAM,GAAG;AACnD,iBAAS,OAAO,QAAQ,WAAW,EAAE;AACrC,YAAI,OAAO;AACT,kBAAQ,WAAW,IAAI,IAAI,MAAM,KAAK,GAAG,EAAE,QAAQ,YAAY,EAAE;AAAA,QACnE;AAAA,MACF;AAAA,IACF;AAEA,UAAM,4BAA4B,OAAO,MAAM,SAAS;AACxD,QAAI,2BAA2B;AAC7B,iBAAW,aAAa,2BAA2B;AACjD,cAAM,OAAO,UAAU,KAAK;AAC5B,gBAAQ,WAAW,IAAI,IAAI;AAAA,MAC7B;AAAA,IACF;AAGA,QAAI,KAAK,CAAC,EAAE,SAAS,IAAI,GAAG;AAC1B,cAAQ,SAAS,QAAQ,WAAW,KAAK,CAAC,EAAE;AAC5C,cAAQ,kBAAkB,QAAQ,gBAAgB,QAAQ;AAG1D,YAAM,SAAS,CAAC,GAAG,KAAK,EAAE,QAAQ,EAAE,KAAK,CAACA,UAASA,MAAK,WAAW,IAAI;AACvE,UAAI,QAAQ;AAEV,eAAO,SAAS,KAAK,OAAO;AAC5B;AAAA,MACF;AAAA,IACF;AAEA,UAAM,KAAK,OAAO;AAAA,EACpB;AAEA,QAAM,eAA2C;AAAA,IAC/C,SAAS;AAAA,IACT,UAAU;AAAA,IACV,QAAQ,KAAK;AAAA,IACb,iBAAiB;AAAA,IACjB,eAAe,KAAK;AAAA,IACpB,YAAY,CAAC;AAAA,IACb,UAAU;AAAA,IACV,WAAW;AAAA,EACb;AAEA,YAAU,cAAc,IAAI;AAE5B,SAAO,aAA+B,YAAY;AACpD;AASO,SAAS,UAAU,MAAiD;AAIzE,QAAM,aAAa,KAAK,MAAM,UAAU;AAExC,QAAMC,YAAW,IAAI,SAAS;AAG9B,MAAI,CAAC,YAAY;AACf,UAAM,mBAAmBA,UAAS,uBAAuB;AACzD,qBAAiB,YAAYA,UAAS,eAAe,IAAI,CAAC;AAC1D,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,mBAAmB,IAAI;AAExC,MAAI,SAAS,WAAW,SAAS,GAAG;AAClC,WAAO;AAAA,EACT;AAEA,SAAO,SAAS,WAAW,CAAC;AAC9B;AAEO,SAAS,kBAAkB,MAAc;AAC9C,QAAM,UAAU,UAAU,IAAI;AAC9B,QAAM,cAAc,iBAAiB,mBAAmB,mBAAmB,QAAQ,aAAa,CAAC,OAAO,CAAC;AACzG,SAAO,IAAI,WAAW;AAAA;AACxB;AAEO,IAAM,WAAW,IAAI,SAAS;;;AClyBrC,SAAS,OAAO,eAAe;AAE/B,OAAO,cAAc;;;ACHrB,OAAO,QAAQ;AAkCf,eAAsB,MAAM,QAAgB,eAA8B;AACxE,QAAM,UAAU;AAAA,IACd,GAAG,MAAM;AAAA,IACT,GAAI,iBAAiB,CAAC;AAAA,EACxB;AAEA,MAAI,QAAQ,WAAW;AACrB,YAAQ,YAAY,QAAQ,UAAU,QAAQ,SAAS,EAAE,IAAI;AAAA,EAC/D;AAEA,MAAI,QAAQ,eAAe;AACzB,YAAQ,gBAAgB,QAAQ,cAAc,QAAQ,SAAS,EAAE,IAAI;AAAA,EACvE;AAEA,QAAM,EAAE,SAAS,IAAI,MAAM,OAAO,UAAU;AAE5C,MAAI;AACF,UAAM,WAAW,MAAM,SAAS,QAAQ,OAAO;AAE/C,QAAI,QAAQ,WAAW;AACrB,iBAAW,KAAK,SAAS,QAAQ;AAC/B,WAAG,cAAc,QAAQ,YAAY,SAAS,OAAO,CAAC,EAAE,MAAM,SAAS,OAAO,CAAC,EAAE,QAAQ;AAAA,MAC3F;AAEA,iBAAW,KAAK,SAAS,OAAO;AAC9B,WAAG,cAAc,QAAQ,YAAY,SAAS,MAAM,CAAC,EAAE,MAAM,SAAS,MAAM,CAAC,EAAE,QAAQ;AAAA,MACzF;AAAA,IACF;AAEA,QAAI,QAAQ,eAAe;AACzB,YAAM,OAAO;AAAA;AAAA,aAEN,kBAAkB,SAAS,KAAK,KAAK,EAAE,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAOhD,SAAG,cAAc,GAAG,QAAQ,aAAa,aAAa,IAAI;AAAA,IAC5D;AAAA,EACF,SAAS,KAAK;AACZ,YAAQ,OAAO,MAAO,IAAY,SAAS,IAAI;AAC/C,YAAQ,OAAO,MAAO,IAAY,OAAO,IAAI;AAC7C,YAAQ,OAAO,MAAO,IAAY,UAAU,IAAI;AAAA,EAClD;AACF;AAEA,MAAM,UAAU;AAAA,EACd,WAAW;AAAA,EACX,eAAe;AAAA;AAAA,EAGf,MAAM;AAAA,EACN,SAAS;AAAA,EACT,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,cAAc;AAAA,EACd,KAAK;AAAA,EACL,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,WAAW;AAAA,EACX,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AAAA,IACL,SAAS;AAAA,IACT,WAAW;AAAA,IACX,cAAc;AAAA,IACd,OAAO;AAAA,IACP,UAAU;AAAA,IACV,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAQ;AAAA;AAAA,EACV;AACF;;;AC/GA,YAAY,SAAS;AAErB,OAAO,cAAc;AACrB,SAAS,gBAAgB;AACzB,OAAO,aAAa;AAEpB,OAAOC,SAAQ;AAGf,eAAsB,OACpB,MACA,UAA+B,CAAC,GAChC;AACA,MAAI,OAAO,SAAS,UAAU;AAC5B,UAAM,MAAM,KAAK,MAAM,GAAG,EAAE,IAAI;AAChC,QAAI,OAAO,0BAA0B,KAAK,GAAG,GAAG;AAC9C,UAAI,WAAW,KAAK,GAAG,KAAK,CAAC,QAAQ,YAAY;AAC/C,cAAM,iBAAiB,QAAQ;AAC/B,cAAM,kBAAkB,CAAC,CAAC;AAE1B,cAAM,iBAAiB;AAAA,UACrB,UAAU,QAAQ,IAAI;AAAA;AAAA,UACtB,gBAAgB;AAAA;AAAA,UAChB,OAAO,CAAC,IAAI;AAAA,UACZ,SAAS,CAAC,WAAW,WAAW,YAAY,YAAY,UAAU;AAAA,UAClE,SAAS,CAAC,cAAc,gBAAgB,gBAAgB,SAAS;AAAA,UACjE,QAAQ;AAAA,UACR,mBAAmB;AAAA,UACnB,OAAO,kBAAkB,CAAC,cAAc,IAAI,CAAC;AAAA,UAC7C,GAAI,QAAQ,OAAO,CAAC;AAAA,UACpB,iBAAiB;AAAA,YACf,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,eAAe;AAAA,YACf,QAAQ,CAAC;AAAA,YACT,aAAa;AAAA,YACb;AAAA,YACA,qBAAqB;AAAA,YACrB,SAAS;AAAA,YACT,iBAAiB;AAAA,YACjB,iBAAiB;AAAA,YACjB,mBAAmB;AAAA,YACnB,gBAAgB;AAAA,YAChB,IAAI,QAAQ,OAAO,CAAC,GAAG;AAAA,UACzB;AAAA,UACA,YAAY;AAAA,UACZ,aAAa;AAAA,QACf;AAGA,gBAAQ,IAAI,OAAO,cAAc;AAEjC,QAAI,UAAM,cAAc;AAAA,MAC1B;AAEA,YAAM,iBAAiB;AAAA,QACrB,aAAa,CAAC,IAAI;AAAA,QAClB,QAAQ,YAAY,UAAU,QAAQ,SAAS;AAAA,QAC/C,WAAW;AAAA,QACX,OAAO;AAAA,QACP,QAAQ,QAAQ;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,aAAa;AAAA,QACb,QAAQ;AAAA,UACN,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,OAAO;AAAA,QACT;AAAA,QACA,GAAI,QAAQ,WAAW,CAAC;AAAA,MAC1B;AAEA,YAAM,SAAS,MAAM,QAAQ,MAAM,cAAc;AACjD,UAAI,OAAO,aAAa,WAAW,GAAG;AACpC,cAAM,IAAI,MAAM,OAAO,OAAO,KAAK,IAAI,CAAC;AAAA,MAC1C;AAEA,UAAI,QAAQ,SAAS;AACnB,cAAM,SAAS,MAAM,OAAO,QAAQ;AACpC,cAAM,UAAU,MAAM,OAAO,OAAO,OAAO,YAAY,CAAC,EAAE,MAAM;AAAA,UAC9D,WAAW;AAAA,YACT,SAAS,OAAO,YAAY,CAAC,EAAE,KAAK,SAAS;AAAA,UAC/C;AAAA,UACA,UAAU;AAAA,YACR,sBAAsB;AAAA,UACxB;AAAA,UACA,QAAQ;AAAA,YACN,gBAAgB;AAAA,UAClB;AAAA,UACA,MAAM;AAAA,UACN,GAAI,QAAQ,UAAU,CAAC;AAAA,QACzB,CAAC;AAED,YAAI,CAAC,QAAQ,QAAQ,CAAC,QAAQ,KAAK;AACjC,gBAAM,IAAI,MAAM,eAAe;AAAA,QACjC;AAEA,cAAM,YAAY,OAAO,KAAK,QAAQ,IAAI,SAAS,CAAC,EAAE,SAAS,QAAQ;AACvE,cAAM,SAAS,mEAAmE,SAAS;AAC3F,eAAO,EAAE,KAAK,QAAQ,MAAM,KAAK,QAAQ,KAAK;AAAA,MAChD,OAAO;AACL,cAAM,YAAY,OAAO,KAAK,OAAO,YAAY,CAAC,EAAE,KAAK,SAAS,CAAC,EAAE,SAAS,QAAQ;AACtF,cAAM,SAAS,mEAAmE,SAAS;AAC3F,eAAO,EAAE,KAAK,OAAO,YAAY,CAAC,EAAE,MAAM,KAAK,QAAQ,KAAK;AAAA,MAC9D;AAAA,IACF,WAAW,OAAO,kBAAkB,KAAK,GAAG,GAAG;AAC7C,YAAM,SAAS,MAAM,IAAI,SAAS;AAAA,QAChC,WAAW;AAAA,QACX,OAAO;AAAA,UACL,GAAG;AAAA,YACD,mBAAmB;AAAA,UACrB;AAAA,UACA,GAAG;AAAA,YACD,kBAAkB;AAAA;AAAA,UACpB;AAAA,QACF;AAAA,QACA,GAAI,QAAQ,YAAY,CAAC;AAAA,MAC3B,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC;AAEhB,aAAO,EAAE,KAAK,OAAO,QAAQ,KAAK,MAAM,KAAK;AAAA,IAC/C,OAAO;AACL,aAAO,EAAE,KAAKA,IAAG,aAAa,MAAM,MAAM,GAAG,KAAK,MAAM,KAAK;AAAA,IAC/D;AAAA,EACF,WAAW,OAAO,SAAS,YAAY,SAAS,MAAM;AACpD,WAAO,EAAE,KAAK,MAAM,GAAG,KAAK;AAAA,EAC9B;AACF;AAEA,OAAO,QAAQ,eACb,cACA,KACA,UAA+B,CAAC,GAChC;AACA,QAAM,OAAO,MAAM,QAAQ,IAAI,YAAY;AAE3C,QAAM,WAAW,KAAK,IAAI,CAAC,SAAS;AAClC,WAAO;AAAA,MACL,KAAK;AAAA,MACL,WAAW;AAAA,IACb;AAAA,EACF,CAAC;AAED,QAAM,WAAW,IAAI,SAAS;AAE9B,QAAM,SAAS,MAAM,SAAS,MAAM;AAAA,IAClC,UAAU;AAAA,IACV,WAAW;AAAA,IACX,WAAW;AAAA,IACX,kBAAkB,CAAC,YAAY,QAAQ,MAAM,sCAAsC,KAAK,CAAC;AAAA,IACzF,GAAG;AAAA,IACH,SAAS;AAAA,IACT,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,EACpB,CAAC;AAED,QAAM,WAAW,MAAM,IAAI,SAAS;AAAA,IAClC,WAAW;AAAA,IACX,OAAO;AAAA,MACL,GAAG;AAAA,QACD,mBAAmB;AAAA,MACrB;AAAA,MACA,GAAG;AAAA,QACD,kBAAkB;AAAA;AAAA,MACpB;AAAA,IACF;AAAA,IACA,GAAI,QAAQ,YAAY,CAAC;AAAA,EAC3B,CAAC,EAAE,OAAO,OAAO,CAAC,EAAE,GAAG;AAEvB,SAAO,SAAS;AAClB;;;AC1KA,OAAOC,SAAQ;AACf,OAAO,UAAU;AAEV,SAAS,GAAG,MAAc,UAAU,CAAC,GAAG;AAC7C,QAAM,iBAAiB,KAAK,QAAQ,WAAW,eAAe;AAC9D,QAAM,QAAQA,IAAG,aAAa,gBAAgB,MAAM;AACpD,QAAM,MAAM,OAAO;AAAA,IACjB;AAAA,MACE,SAAS;AAAA,MACT,MAAM;AAAA,MACN,MAAM,CAAC,GAAG;AAAA,MACV,OAAO;AAAA,IACT;AAAA,IACA;AAAA,EACF;AACA,MAAI,WAAW,MACZ,QAAQ,QAAQ,MAAM,IAAI,UAAU,IAAI,EACxC,QAAQ,eAAe,IAAI,IAAI,EAC/B,QAAQ,SAAS,OAAO,IAAI,KAAK,KAAK,KAAK,IAAI,IAAI;AAEtD,MAAI,CAAC,IAAI,OAAO;AACd,eAAW,SAAS,QAAQ,eAAe,UAAU;AAAA,EACvD;AAEA,EAAAA,IAAG,cAAc,MAAM,UAAU,MAAM;AACzC;;;AHhBA,OAAO,WAAW;AAClB,OAAO,WAAW;AAElB,SAAS,UAAU,MAAa;AAC9B,QAAM,YAAY,MAAM;AACxB,QAAM,SAAS,MAAM,OAAO,SAAS;AACrC,UAAQ;AACR,SAAO;AACT;", + "sourcesContent": ["/* eslint-disable no-use-before-define */\n/* eslint-disable complexity */\ninterface ChildNodes extends Array {}\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 constructor() {}\n\n appendChild(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 }\n return node;\n }\n\n insertBefore(node: T, child: Node | null): T {\n if (node) {\n node.parentNode && node.parentNode.removeChild(node as Node);\n node.parentNode = this;\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(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(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 }\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 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) {\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, prop: string) => state[prop],\n set: (state: Record, prop: string, value: any) => {\n state[prop] = value;\n updateElementStyles(this, state);\n return true;\n },\n deleteProperty: (state: Record, 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&w=is&k=20&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 }\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): 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 += \"\";\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}\"\"`;\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 = {};\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 {}\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(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(\" 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(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", "import { document, domToHtml, domToHyperscript, htmlToDom, htmlToHyperscript } from \"./utils/tree-adapter\";\nimport { mount, unmount } from \"valyrian.js\";\n\nimport FormData from \"form-data\";\n// import fetch from \"node-fetch\";\nimport { icons } from \"./utils/icons\";\nimport { inline } from \"./utils/inline\";\nimport { sw } from \"./utils/sw\";\n\nglobal.FormData = FormData as any;\nglobal.document = document as any;\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 };\n", "import fs from \"fs\";\nimport { htmlToHyperscript } from \"./tree-adapter\";\n\ninterface 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\";\n lang?: string;\n background?: string;\n theme_color?: string;\n display?: \"browser\" | \"standalone\";\n orientation?: \"any\" | \"portrait\" | \"landscape\";\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 = {}\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\ninline.uncss = async function (\n renderedHtml: (string | Promise)[],\n css: string,\n options: Record = {}\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.tpl\");\n const swTpl = fs.readFileSync(swfiletemplate, \"utf8\");\n const opt = Object.assign(\n {\n version: \"v1::\",\n name: \"Valyrian.js\",\n urls: [\"/\"],\n debug: false\n },\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\n if (!opt.debug) {\n contents = contents.replace(\"console.log\", \"() => {}\");\n }\n\n fs.writeFileSync(file, contents, \"utf8\");\n}\n"], + "mappings": "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", "names": ["node", "item", "document", "fs", "fs"] } diff --git a/dist/node/utils/tree-adapter.d.ts b/dist/node/utils/tree-adapter.d.ts index 0efef1f..78c7e6d 100644 --- a/dist/node/utils/tree-adapter.d.ts +++ b/dist/node/utils/tree-adapter.d.ts @@ -25,6 +25,7 @@ export declare class Node implements Node { insertBefore(node: T, child: Node | null): T; replaceChild(node: Node, child: T): T; removeChild(child: T): T; + remove(): Node; cloneNode(deep?: boolean | undefined): Node; setAttribute(name: string, value: any): void; getAttribute(name: string): string | null | undefined; @@ -41,9 +42,13 @@ export declare class Element extends Node { _style: Record; get style(): string; set style(value: string); + get className(): string; + set className(value: string | boolean); classList: { toggle: (item: any, force: any) => void; }; + get id(): string; + set id(value: string | boolean); set textContent(text: string); get textContent(): string; set innerText(text: string); diff --git a/dist/node/utils/tree-adapter.d.ts.map b/dist/node/utils/tree-adapter.d.ts.map index b3094eb..2e122ba 100644 --- a/dist/node/utils/tree-adapter.d.ts.map +++ b/dist/node/utils/tree-adapter.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"tree-adapter.d.ts","sourceRoot":"","sources":["../../../lib/node/utils/tree-adapter.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"tree-adapter.d.ts","sourceRoot":"","sources":["../../../lib/node/utils/tree-adapter.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/router/index.d.ts.map b/dist/router/index.d.ts.map index 78307eb..9359d22 100644 --- a/dist/router/index.d.ts.map +++ b/dist/router/index.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/router/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/router/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/router/index.js b/dist/router/index.js index e49a0ea..8ad0bd3 100644 --- a/dist/router/index.js +++ b/dist/router/index.js @@ -218,8 +218,9 @@ function mountRouter(elementContainer, router) { window.addEventListener("popstate", onPopStateGoToRoute2, false); onPopStateGoToRoute2(); } - (0, import_valyrian.directive)("route", (url, vnode, oldnode) => { - (0, import_valyrian.setAttribute)("href", url, vnode, oldnode); - (0, import_valyrian.setAttribute)("onclick", router.getOnClickHandler(url), vnode, oldnode); + (0, import_valyrian.directive)("route", (vnode) => { + const url = vnode.props["v-route"]; + (0, import_valyrian.setAttribute)("href", url, vnode); + (0, import_valyrian.setAttribute)("onclick", router.getOnClickHandler(url), vnode); }); } diff --git a/dist/router/index.js.map b/dist/router/index.js.map index 613c69f..2288379 100644 --- a/dist/router/index.js.map +++ b/dist/router/index.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../lib/router/index.ts"], - "sourcesContent": ["/* eslint-disable no-use-before-define */\nimport {\n Component,\n POJOComponent,\n VnodeComponentInterface,\n VnodeWithDom,\n directive,\n isComponent,\n isNodeJs,\n isVnodeComponent,\n mount,\n setAttribute,\n v\n} from \"valyrian.js\";\n\ninterface Request {\n params: Record;\n query: Record;\n url: string;\n path: string;\n matches: string[];\n // eslint-disable-next-line no-unused-vars\n redirect: (path: string, parentComponent?: Component | POJOComponent | VnodeComponentInterface) => false;\n}\n\ninterface Middleware {\n // eslint-disable-next-line no-unused-vars\n (req: Request, res?: any):\n | Promise\n | any\n | Component\n | POJOComponent\n | VnodeComponentInterface;\n}\n\ninterface Middlewares extends Array {}\n\ninterface Path {\n method: string;\n path: string;\n middlewares: Middlewares;\n params: string[];\n regexp: RegExp;\n}\n\ninterface RouterInterface {\n paths: Path[];\n container: Element | string | null;\n query: Record;\n options: Record;\n url: string;\n path: string;\n params: Record;\n matches: string[];\n pathPrefix: string;\n // eslint-disable-next-line no-unused-vars\n add(method: string, ...args: Middlewares): Router;\n // eslint-disable-next-line no-unused-vars\n use(...args: (string | Middleware | Router)[]): Router;\n\n routes(): string[];\n // eslint-disable-next-line no-unused-vars\n go(path: string, parentComponent?: Component | POJOComponent | VnodeComponentInterface): Promise;\n}\n\ninterface RedirectFunction {\n // eslint-disable-next-line no-unused-vars\n (\n path: string,\n parentComponent?: Component | POJOComponent | VnodeComponentInterface,\n preventPushState?: boolean\n ): Promise;\n}\n\nfunction flat(array: any) {\n return Array.isArray(array) ? array.flat(Infinity) : [array];\n}\n\nfunction getPathWithoutPrefix(path: string, prefix: string) {\n return getPathWithoutLastSlash(path.replace(new RegExp(`^${prefix}`), \"\"));\n}\n\nfunction getPathWithoutLastSlash(path: string) {\n let pathWithoutLastSlash = path.replace(/\\/$/, \"\");\n if (pathWithoutLastSlash === \"\") {\n pathWithoutLastSlash = \"/\";\n }\n return pathWithoutLastSlash;\n}\n\nconst addPath = ({\n router,\n method,\n path,\n middlewares\n}: {\n router: Router;\n method: string;\n path: string;\n middlewares: Middleware[];\n}): void => {\n if (!method || !path || !Array.isArray(middlewares) || middlewares.length === 0) {\n throw new Error(`Invalid route input: ${method} ${path} ${middlewares}`);\n }\n\n // Trim trailing slashes from the path\n const realpath = path.replace(/(\\S)(\\/+)$/, \"$1\");\n\n // Find the express-like params in the path\n const params = (realpath.match(/:(\\w+)?/gi) || [])\n // Set the names of the params found\n .map((param) => param.slice(1));\n\n // Generate a regular expression to match the path\n const regexpPath = \"^\" + realpath.replace(/:(\\w+)/gi, \"([^\\\\/\\\\s]+)\") + \"$\";\n\n router.paths.push({\n method,\n path: realpath,\n middlewares: flat(middlewares),\n params,\n regexp: new RegExp(regexpPath, \"i\")\n });\n};\n\n// Parse a query string into an object\nfunction parseQuery(queryParts?: string): Record {\n // Split the query string into an array of name-value pairs\n const parts = queryParts ? queryParts.split(\"&\") : [];\n const query: Record = {};\n\n // Iterate over the name-value pairs and add them to the query object\n for (const nameValue of parts) {\n const [name, value] = nameValue.split(\"=\", 2);\n query[name] = value || \"\";\n }\n\n return query;\n}\n\n// Search for middlewares that match a given path\nfunction searchMiddlewares(router: RouterInterface, path: string): Middlewares {\n const middlewares: Middlewares = [];\n const params: Record = {};\n const matches = [];\n\n // Search for middlewares\n for (const item of router.paths) {\n const match = item.regexp.exec(path);\n\n // If we found middlewares\n if (Array.isArray(match)) {\n middlewares.push(...item.middlewares);\n match.shift();\n\n // Parse params\n for (const [index, key] of item.params.entries()) {\n params[key] = match[index];\n }\n\n // Add remaining matches to the array\n matches.push(...match);\n\n if (item.method === \"add\") {\n router.path = getPathWithoutPrefix(item.path, router.pathPrefix);\n break;\n }\n }\n }\n\n router.params = params;\n router.matches = matches;\n\n return middlewares;\n}\n\nasync function searchComponent(\n router: RouterInterface,\n middlewares: Middlewares\n): Promise {\n // Define request object with default values\n const request: Request = {\n params: router.params,\n query: router.query,\n url: router.url,\n path: router.path,\n matches: router.matches,\n redirect: (path: string, parentComponent?: Component | POJOComponent | VnodeComponentInterface) => {\n router.go(path, parentComponent);\n // Return false to stop the middleware chain\n return false;\n }\n };\n\n // Initialize response variable\n let response;\n\n // Iterate through middlewares\n for (const middleware of middlewares) {\n // Invoke middleware and update response\n response = await middleware(request, response);\n\n // Return response if it's a valid component\n if (response !== undefined && (isComponent(response) || isVnodeComponent(response))) {\n return response;\n }\n\n // Return false if response is explicitly false to stop the middleware chain\n if (response === false) {\n return false;\n }\n }\n}\n\nexport class Router implements RouterInterface {\n paths: Path[] = [];\n container: Element | string | null = null;\n query: Record = {};\n options: Record = {};\n url: string = \"\";\n path: string = \"\";\n params: Record = {};\n matches: string[] = [];\n pathPrefix: string = \"\";\n\n constructor(pathPrefix: string = \"\") {\n this.pathPrefix = pathPrefix;\n }\n\n add(path: string, ...middlewares: Middlewares): Router {\n const pathWithoutLastSlash = getPathWithoutLastSlash(`${this.pathPrefix}${path}`);\n addPath({ router: this, method: \"add\", path: pathWithoutLastSlash, middlewares });\n return this;\n }\n\n use(...middlewares: Middlewares | Router[] | string[]): Router {\n const path = getPathWithoutLastSlash(\n `${this.pathPrefix}${typeof middlewares[0] === \"string\" ? middlewares.shift() : \"/\"}`\n );\n\n for (const item of middlewares) {\n if (item instanceof Router) {\n const subrouter = item as Router;\n for (const subpath of subrouter.paths) {\n addPath({\n router: this,\n method: subpath.method,\n path: `${path}${subpath.path}`.replace(/^\\/\\//, \"/\"),\n middlewares: subpath.middlewares\n });\n }\n continue;\n }\n\n if (typeof item === \"function\") {\n addPath({ router: this, method: \"use\", path: `${path}.*`, middlewares: [item as Middleware] });\n }\n }\n\n return this;\n }\n\n routes(): string[] {\n return this.paths.filter((path) => path.method === \"add\").map((path) => path.path);\n }\n\n async go(\n path: string,\n parentComponent?: Component | POJOComponent | VnodeComponentInterface,\n preventPushState = false\n ): Promise {\n if (!path) {\n throw new Error(\"router.url.required\");\n }\n\n const constructedPath = getPathWithoutLastSlash(`${this.pathPrefix}${path}`);\n const parts = constructedPath.split(\"?\", 2);\n this.url = constructedPath;\n this.query = parseQuery(parts[1]);\n\n const middlewares = searchMiddlewares(this as RouterInterface, parts[0].replace(/(.+)\\/$/, \"$1\").split(\"#\")[0]);\n let component = await searchComponent(this as RouterInterface, middlewares);\n\n if (component === false) {\n return;\n }\n\n if (!component) {\n throw new Error(`The url ${constructedPath} requested wasn't found`);\n }\n\n if (isComponent(parentComponent) || isVnodeComponent(parentComponent)) {\n const childComponent = isVnodeComponent(component) ? component : v(component as Component, {});\n if (isVnodeComponent(parentComponent)) {\n parentComponent.children.push(childComponent);\n component = parentComponent;\n } else {\n component = v(parentComponent, {}, childComponent) as VnodeComponentInterface;\n }\n }\n\n if (!isNodeJs && !preventPushState) {\n window.history.pushState(null, \"\", constructedPath);\n }\n\n if (this.container) {\n return mount(this.container, component);\n }\n }\n\n getOnClickHandler(url: string) {\n return (e: MouseEvent) => {\n if (typeof url === \"string\" && url.length > 0) {\n this.go(url);\n }\n e.preventDefault();\n };\n }\n}\n\nlet localRedirect: RedirectFunction;\n\nexport function redirect(\n url: string,\n parentComponent?: Component | POJOComponent | VnodeComponentInterface,\n preventPushState = false\n): Promise {\n if (!localRedirect) {\n throw new Error(\"router.redirect.not.found\");\n }\n return localRedirect(url, parentComponent, preventPushState);\n}\n\nexport function mountRouter(elementContainer: string | any, router: Router): void {\n router.container = elementContainer;\n localRedirect = router.go.bind(router);\n\n if (!isNodeJs) {\n function onPopStateGoToRoute(): void {\n const pathWithoutPrefix = getPathWithoutPrefix(document.location.pathname, router.pathPrefix);\n (router as unknown as Router).go(pathWithoutPrefix, undefined, true);\n }\n window.addEventListener(\"popstate\", onPopStateGoToRoute, false);\n onPopStateGoToRoute();\n }\n\n directive(\"route\", (url: string, vnode: VnodeWithDom, oldnode?: VnodeWithDom): void => {\n setAttribute(\"href\", url, vnode, oldnode);\n setAttribute(\"onclick\", router.getOnClickHandler(url), vnode, oldnode);\n });\n}\n"], - "mappings": "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", + "sourcesContent": ["/* eslint-disable no-use-before-define */\nimport {\n Component,\n POJOComponent,\n VnodeComponentInterface,\n VnodeWithDom,\n directive,\n isComponent,\n isNodeJs,\n isVnodeComponent,\n mount,\n setAttribute,\n v\n} from \"valyrian.js\";\n\ninterface Request {\n params: Record;\n query: Record;\n url: string;\n path: string;\n matches: string[];\n // eslint-disable-next-line no-unused-vars\n redirect: (path: string, parentComponent?: Component | POJOComponent | VnodeComponentInterface) => false;\n}\n\ninterface Middleware {\n // eslint-disable-next-line no-unused-vars\n (req: Request, res?: any):\n | Promise\n | any\n | Component\n | POJOComponent\n | VnodeComponentInterface;\n}\n\ninterface Middlewares extends Array {}\n\ninterface Path {\n method: string;\n path: string;\n middlewares: Middlewares;\n params: string[];\n regexp: RegExp;\n}\n\ninterface RouterInterface {\n paths: Path[];\n container: Element | string | null;\n query: Record;\n options: Record;\n url: string;\n path: string;\n params: Record;\n matches: string[];\n pathPrefix: string;\n // eslint-disable-next-line no-unused-vars\n add(method: string, ...args: Middlewares): Router;\n // eslint-disable-next-line no-unused-vars\n use(...args: (string | Middleware | Router)[]): Router;\n\n routes(): string[];\n // eslint-disable-next-line no-unused-vars\n go(path: string, parentComponent?: Component | POJOComponent | VnodeComponentInterface): Promise;\n}\n\ninterface RedirectFunction {\n // eslint-disable-next-line no-unused-vars\n (\n path: string,\n parentComponent?: Component | POJOComponent | VnodeComponentInterface,\n preventPushState?: boolean\n ): Promise;\n}\n\nfunction flat(array: any) {\n return Array.isArray(array) ? array.flat(Infinity) : [array];\n}\n\nfunction getPathWithoutPrefix(path: string, prefix: string) {\n return getPathWithoutLastSlash(path.replace(new RegExp(`^${prefix}`), \"\"));\n}\n\nfunction getPathWithoutLastSlash(path: string) {\n let pathWithoutLastSlash = path.replace(/\\/$/, \"\");\n if (pathWithoutLastSlash === \"\") {\n pathWithoutLastSlash = \"/\";\n }\n return pathWithoutLastSlash;\n}\n\nconst addPath = ({\n router,\n method,\n path,\n middlewares\n}: {\n router: Router;\n method: string;\n path: string;\n middlewares: Middleware[];\n}): void => {\n if (!method || !path || !Array.isArray(middlewares) || middlewares.length === 0) {\n throw new Error(`Invalid route input: ${method} ${path} ${middlewares}`);\n }\n\n // Trim trailing slashes from the path\n const realpath = path.replace(/(\\S)(\\/+)$/, \"$1\");\n\n // Find the express-like params in the path\n const params = (realpath.match(/:(\\w+)?/gi) || [])\n // Set the names of the params found\n .map((param) => param.slice(1));\n\n // Generate a regular expression to match the path\n const regexpPath = \"^\" + realpath.replace(/:(\\w+)/gi, \"([^\\\\/\\\\s]+)\") + \"$\";\n\n router.paths.push({\n method,\n path: realpath,\n middlewares: flat(middlewares),\n params,\n regexp: new RegExp(regexpPath, \"i\")\n });\n};\n\n// Parse a query string into an object\nfunction parseQuery(queryParts?: string): Record {\n // Split the query string into an array of name-value pairs\n const parts = queryParts ? queryParts.split(\"&\") : [];\n const query: Record = {};\n\n // Iterate over the name-value pairs and add them to the query object\n for (const nameValue of parts) {\n const [name, value] = nameValue.split(\"=\", 2);\n query[name] = value || \"\";\n }\n\n return query;\n}\n\n// Search for middlewares that match a given path\nfunction searchMiddlewares(router: RouterInterface, path: string): Middlewares {\n const middlewares: Middlewares = [];\n const params: Record = {};\n const matches = [];\n\n // Search for middlewares\n for (const item of router.paths) {\n const match = item.regexp.exec(path);\n\n // If we found middlewares\n if (Array.isArray(match)) {\n middlewares.push(...item.middlewares);\n match.shift();\n\n // Parse params\n for (const [index, key] of item.params.entries()) {\n params[key] = match[index];\n }\n\n // Add remaining matches to the array\n matches.push(...match);\n\n if (item.method === \"add\") {\n router.path = getPathWithoutPrefix(item.path, router.pathPrefix);\n break;\n }\n }\n }\n\n router.params = params;\n router.matches = matches;\n\n return middlewares;\n}\n\nasync function searchComponent(\n router: RouterInterface,\n middlewares: Middlewares\n): Promise {\n // Define request object with default values\n const request: Request = {\n params: router.params,\n query: router.query,\n url: router.url,\n path: router.path,\n matches: router.matches,\n redirect: (path: string, parentComponent?: Component | POJOComponent | VnodeComponentInterface) => {\n router.go(path, parentComponent);\n // Return false to stop the middleware chain\n return false;\n }\n };\n\n // Initialize response variable\n let response;\n\n // Iterate through middlewares\n for (const middleware of middlewares) {\n // Invoke middleware and update response\n response = await middleware(request, response);\n\n // Return response if it's a valid component\n if (response !== undefined && (isComponent(response) || isVnodeComponent(response))) {\n return response;\n }\n\n // Return false if response is explicitly false to stop the middleware chain\n if (response === false) {\n return false;\n }\n }\n}\n\nexport class Router implements RouterInterface {\n paths: Path[] = [];\n container: Element | string | null = null;\n query: Record = {};\n options: Record = {};\n url: string = \"\";\n path: string = \"\";\n params: Record = {};\n matches: string[] = [];\n pathPrefix: string = \"\";\n\n constructor(pathPrefix: string = \"\") {\n this.pathPrefix = pathPrefix;\n }\n\n add(path: string, ...middlewares: Middlewares): Router {\n const pathWithoutLastSlash = getPathWithoutLastSlash(`${this.pathPrefix}${path}`);\n addPath({ router: this, method: \"add\", path: pathWithoutLastSlash, middlewares });\n return this;\n }\n\n use(...middlewares: Middlewares | Router[] | string[]): Router {\n const path = getPathWithoutLastSlash(\n `${this.pathPrefix}${typeof middlewares[0] === \"string\" ? middlewares.shift() : \"/\"}`\n );\n\n for (const item of middlewares) {\n if (item instanceof Router) {\n const subrouter = item as Router;\n for (const subpath of subrouter.paths) {\n addPath({\n router: this,\n method: subpath.method,\n path: `${path}${subpath.path}`.replace(/^\\/\\//, \"/\"),\n middlewares: subpath.middlewares\n });\n }\n continue;\n }\n\n if (typeof item === \"function\") {\n addPath({ router: this, method: \"use\", path: `${path}.*`, middlewares: [item as Middleware] });\n }\n }\n\n return this;\n }\n\n routes(): string[] {\n return this.paths.filter((path) => path.method === \"add\").map((path) => path.path);\n }\n\n async go(\n path: string,\n parentComponent?: Component | POJOComponent | VnodeComponentInterface,\n preventPushState = false\n ): Promise {\n if (!path) {\n throw new Error(\"router.url.required\");\n }\n\n const constructedPath = getPathWithoutLastSlash(`${this.pathPrefix}${path}`);\n const parts = constructedPath.split(\"?\", 2);\n this.url = constructedPath;\n this.query = parseQuery(parts[1]);\n\n const middlewares = searchMiddlewares(this as RouterInterface, parts[0].replace(/(.+)\\/$/, \"$1\").split(\"#\")[0]);\n let component = await searchComponent(this as RouterInterface, middlewares);\n\n if (component === false) {\n return;\n }\n\n if (!component) {\n throw new Error(`The url ${constructedPath} requested wasn't found`);\n }\n\n if (isComponent(parentComponent) || isVnodeComponent(parentComponent)) {\n const childComponent = isVnodeComponent(component) ? component : v(component as Component, {});\n if (isVnodeComponent(parentComponent)) {\n parentComponent.children.push(childComponent);\n component = parentComponent;\n } else {\n component = v(parentComponent, {}, childComponent) as VnodeComponentInterface;\n }\n }\n\n if (!isNodeJs && !preventPushState) {\n window.history.pushState(null, \"\", constructedPath);\n }\n\n if (this.container) {\n return mount(this.container, component);\n }\n }\n\n getOnClickHandler(url: string) {\n return (e: MouseEvent) => {\n if (typeof url === \"string\" && url.length > 0) {\n this.go(url);\n }\n e.preventDefault();\n };\n }\n}\n\nlet localRedirect: RedirectFunction;\n\nexport function redirect(\n url: string,\n parentComponent?: Component | POJOComponent | VnodeComponentInterface,\n preventPushState = false\n): Promise {\n if (!localRedirect) {\n throw new Error(\"router.redirect.not.found\");\n }\n return localRedirect(url, parentComponent, preventPushState);\n}\n\nexport function mountRouter(elementContainer: string | any, router: Router): void {\n router.container = elementContainer;\n localRedirect = router.go.bind(router);\n\n if (!isNodeJs) {\n function onPopStateGoToRoute(): void {\n const pathWithoutPrefix = getPathWithoutPrefix(document.location.pathname, router.pathPrefix);\n (router as unknown as Router).go(pathWithoutPrefix, undefined, true);\n }\n window.addEventListener(\"popstate\", onPopStateGoToRoute, false);\n onPopStateGoToRoute();\n }\n\n directive(\"route\", (vnode: VnodeWithDom): void => {\n const url = vnode.props[\"v-route\"];\n setAttribute(\"href\", url, vnode);\n setAttribute(\"onclick\", router.getOnClickHandler(url), vnode);\n });\n}\n"], + "mappings": "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", "names": ["onPopStateGoToRoute"] } diff --git a/dist/router/index.mjs b/dist/router/index.mjs index f82355d..fefe219 100644 --- a/dist/router/index.mjs +++ b/dist/router/index.mjs @@ -200,9 +200,10 @@ function mountRouter(elementContainer, router) { window.addEventListener("popstate", onPopStateGoToRoute2, false); onPopStateGoToRoute2(); } - directive("route", (url, vnode, oldnode) => { - setAttribute("href", url, vnode, oldnode); - setAttribute("onclick", router.getOnClickHandler(url), vnode, oldnode); + directive("route", (vnode) => { + const url = vnode.props["v-route"]; + setAttribute("href", url, vnode); + setAttribute("onclick", router.getOnClickHandler(url), vnode); }); } export { diff --git a/dist/router/index.mjs.map b/dist/router/index.mjs.map index eb9051f..3221feb 100644 --- a/dist/router/index.mjs.map +++ b/dist/router/index.mjs.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../lib/router/index.ts"], - "sourcesContent": ["/* eslint-disable no-use-before-define */\nimport {\n Component,\n POJOComponent,\n VnodeComponentInterface,\n VnodeWithDom,\n directive,\n isComponent,\n isNodeJs,\n isVnodeComponent,\n mount,\n setAttribute,\n v\n} from \"valyrian.js\";\n\ninterface Request {\n params: Record;\n query: Record;\n url: string;\n path: string;\n matches: string[];\n // eslint-disable-next-line no-unused-vars\n redirect: (path: string, parentComponent?: Component | POJOComponent | VnodeComponentInterface) => false;\n}\n\ninterface Middleware {\n // eslint-disable-next-line no-unused-vars\n (req: Request, res?: any):\n | Promise\n | any\n | Component\n | POJOComponent\n | VnodeComponentInterface;\n}\n\ninterface Middlewares extends Array {}\n\ninterface Path {\n method: string;\n path: string;\n middlewares: Middlewares;\n params: string[];\n regexp: RegExp;\n}\n\ninterface RouterInterface {\n paths: Path[];\n container: Element | string | null;\n query: Record;\n options: Record;\n url: string;\n path: string;\n params: Record;\n matches: string[];\n pathPrefix: string;\n // eslint-disable-next-line no-unused-vars\n add(method: string, ...args: Middlewares): Router;\n // eslint-disable-next-line no-unused-vars\n use(...args: (string | Middleware | Router)[]): Router;\n\n routes(): string[];\n // eslint-disable-next-line no-unused-vars\n go(path: string, parentComponent?: Component | POJOComponent | VnodeComponentInterface): Promise;\n}\n\ninterface RedirectFunction {\n // eslint-disable-next-line no-unused-vars\n (\n path: string,\n parentComponent?: Component | POJOComponent | VnodeComponentInterface,\n preventPushState?: boolean\n ): Promise;\n}\n\nfunction flat(array: any) {\n return Array.isArray(array) ? array.flat(Infinity) : [array];\n}\n\nfunction getPathWithoutPrefix(path: string, prefix: string) {\n return getPathWithoutLastSlash(path.replace(new RegExp(`^${prefix}`), \"\"));\n}\n\nfunction getPathWithoutLastSlash(path: string) {\n let pathWithoutLastSlash = path.replace(/\\/$/, \"\");\n if (pathWithoutLastSlash === \"\") {\n pathWithoutLastSlash = \"/\";\n }\n return pathWithoutLastSlash;\n}\n\nconst addPath = ({\n router,\n method,\n path,\n middlewares\n}: {\n router: Router;\n method: string;\n path: string;\n middlewares: Middleware[];\n}): void => {\n if (!method || !path || !Array.isArray(middlewares) || middlewares.length === 0) {\n throw new Error(`Invalid route input: ${method} ${path} ${middlewares}`);\n }\n\n // Trim trailing slashes from the path\n const realpath = path.replace(/(\\S)(\\/+)$/, \"$1\");\n\n // Find the express-like params in the path\n const params = (realpath.match(/:(\\w+)?/gi) || [])\n // Set the names of the params found\n .map((param) => param.slice(1));\n\n // Generate a regular expression to match the path\n const regexpPath = \"^\" + realpath.replace(/:(\\w+)/gi, \"([^\\\\/\\\\s]+)\") + \"$\";\n\n router.paths.push({\n method,\n path: realpath,\n middlewares: flat(middlewares),\n params,\n regexp: new RegExp(regexpPath, \"i\")\n });\n};\n\n// Parse a query string into an object\nfunction parseQuery(queryParts?: string): Record {\n // Split the query string into an array of name-value pairs\n const parts = queryParts ? queryParts.split(\"&\") : [];\n const query: Record = {};\n\n // Iterate over the name-value pairs and add them to the query object\n for (const nameValue of parts) {\n const [name, value] = nameValue.split(\"=\", 2);\n query[name] = value || \"\";\n }\n\n return query;\n}\n\n// Search for middlewares that match a given path\nfunction searchMiddlewares(router: RouterInterface, path: string): Middlewares {\n const middlewares: Middlewares = [];\n const params: Record = {};\n const matches = [];\n\n // Search for middlewares\n for (const item of router.paths) {\n const match = item.regexp.exec(path);\n\n // If we found middlewares\n if (Array.isArray(match)) {\n middlewares.push(...item.middlewares);\n match.shift();\n\n // Parse params\n for (const [index, key] of item.params.entries()) {\n params[key] = match[index];\n }\n\n // Add remaining matches to the array\n matches.push(...match);\n\n if (item.method === \"add\") {\n router.path = getPathWithoutPrefix(item.path, router.pathPrefix);\n break;\n }\n }\n }\n\n router.params = params;\n router.matches = matches;\n\n return middlewares;\n}\n\nasync function searchComponent(\n router: RouterInterface,\n middlewares: Middlewares\n): Promise {\n // Define request object with default values\n const request: Request = {\n params: router.params,\n query: router.query,\n url: router.url,\n path: router.path,\n matches: router.matches,\n redirect: (path: string, parentComponent?: Component | POJOComponent | VnodeComponentInterface) => {\n router.go(path, parentComponent);\n // Return false to stop the middleware chain\n return false;\n }\n };\n\n // Initialize response variable\n let response;\n\n // Iterate through middlewares\n for (const middleware of middlewares) {\n // Invoke middleware and update response\n response = await middleware(request, response);\n\n // Return response if it's a valid component\n if (response !== undefined && (isComponent(response) || isVnodeComponent(response))) {\n return response;\n }\n\n // Return false if response is explicitly false to stop the middleware chain\n if (response === false) {\n return false;\n }\n }\n}\n\nexport class Router implements RouterInterface {\n paths: Path[] = [];\n container: Element | string | null = null;\n query: Record = {};\n options: Record = {};\n url: string = \"\";\n path: string = \"\";\n params: Record = {};\n matches: string[] = [];\n pathPrefix: string = \"\";\n\n constructor(pathPrefix: string = \"\") {\n this.pathPrefix = pathPrefix;\n }\n\n add(path: string, ...middlewares: Middlewares): Router {\n const pathWithoutLastSlash = getPathWithoutLastSlash(`${this.pathPrefix}${path}`);\n addPath({ router: this, method: \"add\", path: pathWithoutLastSlash, middlewares });\n return this;\n }\n\n use(...middlewares: Middlewares | Router[] | string[]): Router {\n const path = getPathWithoutLastSlash(\n `${this.pathPrefix}${typeof middlewares[0] === \"string\" ? middlewares.shift() : \"/\"}`\n );\n\n for (const item of middlewares) {\n if (item instanceof Router) {\n const subrouter = item as Router;\n for (const subpath of subrouter.paths) {\n addPath({\n router: this,\n method: subpath.method,\n path: `${path}${subpath.path}`.replace(/^\\/\\//, \"/\"),\n middlewares: subpath.middlewares\n });\n }\n continue;\n }\n\n if (typeof item === \"function\") {\n addPath({ router: this, method: \"use\", path: `${path}.*`, middlewares: [item as Middleware] });\n }\n }\n\n return this;\n }\n\n routes(): string[] {\n return this.paths.filter((path) => path.method === \"add\").map((path) => path.path);\n }\n\n async go(\n path: string,\n parentComponent?: Component | POJOComponent | VnodeComponentInterface,\n preventPushState = false\n ): Promise {\n if (!path) {\n throw new Error(\"router.url.required\");\n }\n\n const constructedPath = getPathWithoutLastSlash(`${this.pathPrefix}${path}`);\n const parts = constructedPath.split(\"?\", 2);\n this.url = constructedPath;\n this.query = parseQuery(parts[1]);\n\n const middlewares = searchMiddlewares(this as RouterInterface, parts[0].replace(/(.+)\\/$/, \"$1\").split(\"#\")[0]);\n let component = await searchComponent(this as RouterInterface, middlewares);\n\n if (component === false) {\n return;\n }\n\n if (!component) {\n throw new Error(`The url ${constructedPath} requested wasn't found`);\n }\n\n if (isComponent(parentComponent) || isVnodeComponent(parentComponent)) {\n const childComponent = isVnodeComponent(component) ? component : v(component as Component, {});\n if (isVnodeComponent(parentComponent)) {\n parentComponent.children.push(childComponent);\n component = parentComponent;\n } else {\n component = v(parentComponent, {}, childComponent) as VnodeComponentInterface;\n }\n }\n\n if (!isNodeJs && !preventPushState) {\n window.history.pushState(null, \"\", constructedPath);\n }\n\n if (this.container) {\n return mount(this.container, component);\n }\n }\n\n getOnClickHandler(url: string) {\n return (e: MouseEvent) => {\n if (typeof url === \"string\" && url.length > 0) {\n this.go(url);\n }\n e.preventDefault();\n };\n }\n}\n\nlet localRedirect: RedirectFunction;\n\nexport function redirect(\n url: string,\n parentComponent?: Component | POJOComponent | VnodeComponentInterface,\n preventPushState = false\n): Promise {\n if (!localRedirect) {\n throw new Error(\"router.redirect.not.found\");\n }\n return localRedirect(url, parentComponent, preventPushState);\n}\n\nexport function mountRouter(elementContainer: string | any, router: Router): void {\n router.container = elementContainer;\n localRedirect = router.go.bind(router);\n\n if (!isNodeJs) {\n function onPopStateGoToRoute(): void {\n const pathWithoutPrefix = getPathWithoutPrefix(document.location.pathname, router.pathPrefix);\n (router as unknown as Router).go(pathWithoutPrefix, undefined, true);\n }\n window.addEventListener(\"popstate\", onPopStateGoToRoute, false);\n onPopStateGoToRoute();\n }\n\n directive(\"route\", (url: string, vnode: VnodeWithDom, oldnode?: VnodeWithDom): void => {\n setAttribute(\"href\", url, vnode, oldnode);\n setAttribute(\"onclick\", router.getOnClickHandler(url), vnode, oldnode);\n });\n}\n"], - "mappings": "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", + "sourcesContent": ["/* eslint-disable no-use-before-define */\nimport {\n Component,\n POJOComponent,\n VnodeComponentInterface,\n VnodeWithDom,\n directive,\n isComponent,\n isNodeJs,\n isVnodeComponent,\n mount,\n setAttribute,\n v\n} from \"valyrian.js\";\n\ninterface Request {\n params: Record;\n query: Record;\n url: string;\n path: string;\n matches: string[];\n // eslint-disable-next-line no-unused-vars\n redirect: (path: string, parentComponent?: Component | POJOComponent | VnodeComponentInterface) => false;\n}\n\ninterface Middleware {\n // eslint-disable-next-line no-unused-vars\n (req: Request, res?: any):\n | Promise\n | any\n | Component\n | POJOComponent\n | VnodeComponentInterface;\n}\n\ninterface Middlewares extends Array {}\n\ninterface Path {\n method: string;\n path: string;\n middlewares: Middlewares;\n params: string[];\n regexp: RegExp;\n}\n\ninterface RouterInterface {\n paths: Path[];\n container: Element | string | null;\n query: Record;\n options: Record;\n url: string;\n path: string;\n params: Record;\n matches: string[];\n pathPrefix: string;\n // eslint-disable-next-line no-unused-vars\n add(method: string, ...args: Middlewares): Router;\n // eslint-disable-next-line no-unused-vars\n use(...args: (string | Middleware | Router)[]): Router;\n\n routes(): string[];\n // eslint-disable-next-line no-unused-vars\n go(path: string, parentComponent?: Component | POJOComponent | VnodeComponentInterface): Promise;\n}\n\ninterface RedirectFunction {\n // eslint-disable-next-line no-unused-vars\n (\n path: string,\n parentComponent?: Component | POJOComponent | VnodeComponentInterface,\n preventPushState?: boolean\n ): Promise;\n}\n\nfunction flat(array: any) {\n return Array.isArray(array) ? array.flat(Infinity) : [array];\n}\n\nfunction getPathWithoutPrefix(path: string, prefix: string) {\n return getPathWithoutLastSlash(path.replace(new RegExp(`^${prefix}`), \"\"));\n}\n\nfunction getPathWithoutLastSlash(path: string) {\n let pathWithoutLastSlash = path.replace(/\\/$/, \"\");\n if (pathWithoutLastSlash === \"\") {\n pathWithoutLastSlash = \"/\";\n }\n return pathWithoutLastSlash;\n}\n\nconst addPath = ({\n router,\n method,\n path,\n middlewares\n}: {\n router: Router;\n method: string;\n path: string;\n middlewares: Middleware[];\n}): void => {\n if (!method || !path || !Array.isArray(middlewares) || middlewares.length === 0) {\n throw new Error(`Invalid route input: ${method} ${path} ${middlewares}`);\n }\n\n // Trim trailing slashes from the path\n const realpath = path.replace(/(\\S)(\\/+)$/, \"$1\");\n\n // Find the express-like params in the path\n const params = (realpath.match(/:(\\w+)?/gi) || [])\n // Set the names of the params found\n .map((param) => param.slice(1));\n\n // Generate a regular expression to match the path\n const regexpPath = \"^\" + realpath.replace(/:(\\w+)/gi, \"([^\\\\/\\\\s]+)\") + \"$\";\n\n router.paths.push({\n method,\n path: realpath,\n middlewares: flat(middlewares),\n params,\n regexp: new RegExp(regexpPath, \"i\")\n });\n};\n\n// Parse a query string into an object\nfunction parseQuery(queryParts?: string): Record {\n // Split the query string into an array of name-value pairs\n const parts = queryParts ? queryParts.split(\"&\") : [];\n const query: Record = {};\n\n // Iterate over the name-value pairs and add them to the query object\n for (const nameValue of parts) {\n const [name, value] = nameValue.split(\"=\", 2);\n query[name] = value || \"\";\n }\n\n return query;\n}\n\n// Search for middlewares that match a given path\nfunction searchMiddlewares(router: RouterInterface, path: string): Middlewares {\n const middlewares: Middlewares = [];\n const params: Record = {};\n const matches = [];\n\n // Search for middlewares\n for (const item of router.paths) {\n const match = item.regexp.exec(path);\n\n // If we found middlewares\n if (Array.isArray(match)) {\n middlewares.push(...item.middlewares);\n match.shift();\n\n // Parse params\n for (const [index, key] of item.params.entries()) {\n params[key] = match[index];\n }\n\n // Add remaining matches to the array\n matches.push(...match);\n\n if (item.method === \"add\") {\n router.path = getPathWithoutPrefix(item.path, router.pathPrefix);\n break;\n }\n }\n }\n\n router.params = params;\n router.matches = matches;\n\n return middlewares;\n}\n\nasync function searchComponent(\n router: RouterInterface,\n middlewares: Middlewares\n): Promise {\n // Define request object with default values\n const request: Request = {\n params: router.params,\n query: router.query,\n url: router.url,\n path: router.path,\n matches: router.matches,\n redirect: (path: string, parentComponent?: Component | POJOComponent | VnodeComponentInterface) => {\n router.go(path, parentComponent);\n // Return false to stop the middleware chain\n return false;\n }\n };\n\n // Initialize response variable\n let response;\n\n // Iterate through middlewares\n for (const middleware of middlewares) {\n // Invoke middleware and update response\n response = await middleware(request, response);\n\n // Return response if it's a valid component\n if (response !== undefined && (isComponent(response) || isVnodeComponent(response))) {\n return response;\n }\n\n // Return false if response is explicitly false to stop the middleware chain\n if (response === false) {\n return false;\n }\n }\n}\n\nexport class Router implements RouterInterface {\n paths: Path[] = [];\n container: Element | string | null = null;\n query: Record = {};\n options: Record = {};\n url: string = \"\";\n path: string = \"\";\n params: Record = {};\n matches: string[] = [];\n pathPrefix: string = \"\";\n\n constructor(pathPrefix: string = \"\") {\n this.pathPrefix = pathPrefix;\n }\n\n add(path: string, ...middlewares: Middlewares): Router {\n const pathWithoutLastSlash = getPathWithoutLastSlash(`${this.pathPrefix}${path}`);\n addPath({ router: this, method: \"add\", path: pathWithoutLastSlash, middlewares });\n return this;\n }\n\n use(...middlewares: Middlewares | Router[] | string[]): Router {\n const path = getPathWithoutLastSlash(\n `${this.pathPrefix}${typeof middlewares[0] === \"string\" ? middlewares.shift() : \"/\"}`\n );\n\n for (const item of middlewares) {\n if (item instanceof Router) {\n const subrouter = item as Router;\n for (const subpath of subrouter.paths) {\n addPath({\n router: this,\n method: subpath.method,\n path: `${path}${subpath.path}`.replace(/^\\/\\//, \"/\"),\n middlewares: subpath.middlewares\n });\n }\n continue;\n }\n\n if (typeof item === \"function\") {\n addPath({ router: this, method: \"use\", path: `${path}.*`, middlewares: [item as Middleware] });\n }\n }\n\n return this;\n }\n\n routes(): string[] {\n return this.paths.filter((path) => path.method === \"add\").map((path) => path.path);\n }\n\n async go(\n path: string,\n parentComponent?: Component | POJOComponent | VnodeComponentInterface,\n preventPushState = false\n ): Promise {\n if (!path) {\n throw new Error(\"router.url.required\");\n }\n\n const constructedPath = getPathWithoutLastSlash(`${this.pathPrefix}${path}`);\n const parts = constructedPath.split(\"?\", 2);\n this.url = constructedPath;\n this.query = parseQuery(parts[1]);\n\n const middlewares = searchMiddlewares(this as RouterInterface, parts[0].replace(/(.+)\\/$/, \"$1\").split(\"#\")[0]);\n let component = await searchComponent(this as RouterInterface, middlewares);\n\n if (component === false) {\n return;\n }\n\n if (!component) {\n throw new Error(`The url ${constructedPath} requested wasn't found`);\n }\n\n if (isComponent(parentComponent) || isVnodeComponent(parentComponent)) {\n const childComponent = isVnodeComponent(component) ? component : v(component as Component, {});\n if (isVnodeComponent(parentComponent)) {\n parentComponent.children.push(childComponent);\n component = parentComponent;\n } else {\n component = v(parentComponent, {}, childComponent) as VnodeComponentInterface;\n }\n }\n\n if (!isNodeJs && !preventPushState) {\n window.history.pushState(null, \"\", constructedPath);\n }\n\n if (this.container) {\n return mount(this.container, component);\n }\n }\n\n getOnClickHandler(url: string) {\n return (e: MouseEvent) => {\n if (typeof url === \"string\" && url.length > 0) {\n this.go(url);\n }\n e.preventDefault();\n };\n }\n}\n\nlet localRedirect: RedirectFunction;\n\nexport function redirect(\n url: string,\n parentComponent?: Component | POJOComponent | VnodeComponentInterface,\n preventPushState = false\n): Promise {\n if (!localRedirect) {\n throw new Error(\"router.redirect.not.found\");\n }\n return localRedirect(url, parentComponent, preventPushState);\n}\n\nexport function mountRouter(elementContainer: string | any, router: Router): void {\n router.container = elementContainer;\n localRedirect = router.go.bind(router);\n\n if (!isNodeJs) {\n function onPopStateGoToRoute(): void {\n const pathWithoutPrefix = getPathWithoutPrefix(document.location.pathname, router.pathPrefix);\n (router as unknown as Router).go(pathWithoutPrefix, undefined, true);\n }\n window.addEventListener(\"popstate\", onPopStateGoToRoute, false);\n onPopStateGoToRoute();\n }\n\n directive(\"route\", (vnode: VnodeWithDom): void => {\n const url = vnode.props[\"v-route\"];\n setAttribute(\"href\", url, vnode);\n setAttribute(\"onclick\", router.getOnClickHandler(url), vnode);\n });\n}\n"], + "mappings": "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", "names": ["onPopStateGoToRoute"] } diff --git a/dist/signal/index.d.ts b/dist/signal/index.d.ts index 327070e..e9a80a4 100644 --- a/dist/signal/index.d.ts +++ b/dist/signal/index.d.ts @@ -1,20 +1,9 @@ -interface GetterInterface { - (): any; -} -interface SetterInterface { - (value: any): void; -} -interface SubscribeInterface { - (callback: Function): void; -} -interface SubscriptionsInterface extends Array { -} -export interface SignalInterface extends Array { - 0: GetterInterface; - 1: SetterInterface; - 2: SubscribeInterface; - 3: SubscriptionsInterface; -} -export declare function Signal(initialValue: any): SignalInterface; +type getter = () => any; +type setter = (newValue: any) => void; +type unsubscribe = () => void; +type subscribe = (callback: () => void) => unsubscribe; +type subscriptions = Set<() => void>; +type signal = [getter, setter, subscribe, subscriptions]; +export declare function Signal(initialValue: T): signal; export {}; //# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/signal/index.d.ts.map b/dist/signal/index.d.ts.map index 64d34f5..1a28ad9 100644 --- a/dist/signal/index.d.ts.map +++ b/dist/signal/index.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/signal/index.ts"],"names":[],"mappings":"AAEA,UAAU,eAAe;IACvB,IAAI,GAAG,CAAC;CACT;AAED,UAAU,eAAe;IACvB,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI,CAAC;CACpB;AAED,UAAU,kBAAkB;IAC1B,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;CAC5B;AAED,UAAU,sBAAuB,SAAQ,KAAK,CAAC,QAAQ,CAAC;CAAG;AAE3D,MAAM,WAAW,eAAgB,SAAQ,KAAK,CAAC,GAAG,CAAC;IACjD,CAAC,EAAE,eAAe,CAAC;IACnB,CAAC,EAAE,eAAe,CAAC;IACnB,CAAC,EAAE,kBAAkB,CAAC;IACtB,CAAC,EAAE,sBAAsB,CAAC;CAC3B;AAGD,wBAAgB,MAAM,CAAC,YAAY,EAAE,GAAG,GAAG,eAAe,CAwIzD"} \ No newline at end of file +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/signal/index.ts"],"names":[],"mappings":"AAEA,KAAK,MAAM,GAAG,MAAM,GAAG,CAAC;AACxB,KAAK,MAAM,GAAG,CAAC,QAAQ,EAAE,GAAG,KAAK,IAAI,CAAC;AACtC,KAAK,WAAW,GAAG,MAAM,IAAI,CAAC;AAC9B,KAAK,SAAS,GAAG,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,WAAW,CAAC;AACvD,KAAK,aAAa,GAAG,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;AACrC,KAAK,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;AAUzD,wBAAgB,MAAM,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,GAAG,MAAM,CAoEjD"} \ No newline at end of file diff --git a/dist/signal/index.js b/dist/signal/index.js index 087e446..6c0b6dd 100644 --- a/dist/signal/index.js +++ b/dist/signal/index.js @@ -24,72 +24,53 @@ __export(signal_exports, { }); module.exports = __toCommonJS(signal_exports); var import_valyrian = require("valyrian.js"); +var componentToSignalsWeakMap = /* @__PURE__ */ new WeakMap(); function Signal(initialValue) { - const { vnode, component } = { ...import_valyrian.current }; - if (vnode && component) { - if (!vnode.components) { - vnode.components = []; + if (import_valyrian.current.component) { + if (componentToSignalsWeakMap.has(import_valyrian.current.component) === false) { + const SignalCalls2 = { signals: [], signal_calls: -1 }; + componentToSignalsWeakMap.set(import_valyrian.current.component, SignalCalls2); + (0, import_valyrian.onUnmount)(() => componentToSignalsWeakMap.delete(import_valyrian.current.component)); } - if (vnode.components.indexOf(component) === -1) { - vnode.signal_calls = -1; - vnode.components.push(component); - if (!component.signals) { - component.signals = []; - (0, import_valyrian.onUnmount)(() => Reflect.deleteProperty(component, "signals")); - } - } - const signal2 = component.signals[++vnode.signal_calls]; + const SignalCalls = componentToSignalsWeakMap.get(import_valyrian.current.component); + (0, import_valyrian.onCleanup)(() => SignalCalls.signal_calls = -1); + const signal2 = SignalCalls.signals[++SignalCalls.signal_calls]; if (signal2) { - signal2[3].length = 0; - return signal2; + const fakeSubscribe = () => { + }; + return [signal2[0], signal2[1], fakeSubscribe, signal2[3]]; } } let value = initialValue; - const subscriptions = []; + const subscribers = /* @__PURE__ */ new Set(); const subscribe = (callback) => { - if (subscriptions.indexOf(callback) === -1) { - subscriptions.push(callback); - } - }; - const vnodesToUpdate = []; - const updateVnodes = () => { - const vnodesToUpdateCopy = vnodesToUpdate.filter((vnode2, index, self) => { - return self.findIndex((v2) => v2.dom === vnode2.dom) === index; - }); - for (let i = 0, l = vnodesToUpdateCopy.length; i < l; i++) { - const vnode2 = vnodesToUpdateCopy[i]; - const newVnode = (0, import_valyrian.v)(vnode2.tag, vnode2.props, ...vnode2.initialChildren); - newVnode.dom = vnode2.dom; - newVnode.isSVG = vnode2.isSVG; - (0, import_valyrian.updateVnode)(newVnode, vnode2); - } + subscribers.add(callback); + return () => subscribers.delete(callback); }; - function get() { - const { vnode: vnode2 } = import_valyrian.current; - if (vnode2 && vnodesToUpdate.indexOf(vnode2) === -1) { - if (!vnode2.initialChildren) { - vnode2.initialChildren = [...vnode2.children]; - } - vnodesToUpdate.push(vnode2); + const domToVnodesToUpdate = /* @__PURE__ */ new Map(); + const updateVnodes = () => domToVnodesToUpdate.forEach((vnode) => (0, import_valyrian.updateVnode)(vnode)); + const getValue = () => { + if (import_valyrian.current.vnode) { + const vnode = import_valyrian.current.vnode; + domToVnodesToUpdate.set(vnode.dom, vnode); subscribe(updateVnodes); } return value; - } - const set = (newValue) => { + }; + const setValue = (newValue) => { if (import_valyrian.current.event) { import_valyrian.current.event.preventDefault(); } - if (newValue === value) { + if (value === newValue) { return; } value = newValue; - for (let i = 0, l = subscriptions.length; i < l; i++) { - subscriptions[i](value); - } + subscribers.forEach((subscriber) => subscriber()); }; - const signal = [get, set, subscribe, subscriptions]; - if (vnode && component) { - component.signals.push(signal); + const signal = [getValue, setValue, subscribe, subscribers]; + if (import_valyrian.current.component) { + const SignalCalls = componentToSignalsWeakMap.get(import_valyrian.current.component); + SignalCalls.signals.push(signal); } return signal; } diff --git a/dist/signal/index.js.map b/dist/signal/index.js.map index 42b4978..9c3ee84 100644 --- a/dist/signal/index.js.map +++ b/dist/signal/index.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../lib/signal/index.ts"], - "sourcesContent": ["import { VnodeWithDom, current, onUnmount, updateVnode, v } from \"valyrian.js\";\n\ninterface GetterInterface {\n (): any;\n}\n\ninterface SetterInterface {\n (value: any): void;\n}\n\ninterface SubscribeInterface {\n (callback: Function): void;\n}\n\ninterface SubscriptionsInterface extends Array {}\n\nexport interface SignalInterface extends Array {\n 0: GetterInterface;\n 1: SetterInterface;\n 2: SubscribeInterface;\n 3: SubscriptionsInterface;\n}\n\n// eslint-disable-next-line sonarjs/cognitive-complexity\nexport function Signal(initialValue: any): SignalInterface {\n // Create a copy of the current context object\n const { vnode, component } = { ...current };\n\n // Check if the context object has a vnode property\n if (vnode && component) {\n // Is first call\n if (!vnode.components) {\n // Set the components property to an empty array\n vnode.components = [];\n }\n\n // Check if the components array of the vnode object does not contain the component object\n if (vnode.components.indexOf(component) === -1) {\n // Set the calls property to -1\n vnode.signal_calls = -1;\n // Add the component to the components array\n vnode.components.push(component);\n\n // Check if the component object has a signals property\n if (!component.signals) {\n // Set the signals property of the component object to an empty array\n component.signals = [];\n // Add a function to the cleanup stack that removes the signals property from the component object\n onUnmount(() => Reflect.deleteProperty(component, \"signals\"));\n }\n }\n\n // Assign the signal variable to the signal stored at the index of the vnode object's calls property in the vnode's signals array\n const signal: SignalInterface = component.signals[++vnode.signal_calls];\n\n // If a signal has already been assigned to the signal variable, return it\n if (signal) {\n // Remove all subscriptions because we come from a new render\n signal[3].length = 0;\n\n // Return the signal\n return signal;\n }\n }\n\n // Declare a variable to store the current value of the Signal\n let value = initialValue;\n\n // Create an array to store functions that have subscribed to changes to the Signal's value\n const subscriptions: SubscriptionsInterface = [];\n\n // Define a function that allows other parts of the code to subscribe to changes to the Signal's value\n const subscribe = (callback: Function) => {\n // Add the callback function to the subscriptions array if it is not already in the array\n if (subscriptions.indexOf(callback) === -1) {\n subscriptions.push(callback);\n }\n };\n\n // Set the vnodes to update when the Signal's value changes\n const vnodesToUpdate: Array = [];\n\n // This is the function that will be called when the Signal's value changes\n const updateVnodes = () => {\n // Create a copy of the vnodesToUpdate array and filter out any duplicate vnodes\n const vnodesToUpdateCopy = vnodesToUpdate.filter((vnode, index, self) => {\n return self.findIndex((v) => v.dom === vnode.dom) === index;\n });\n\n // Loop through the vnodesToUpdate array\n for (let i = 0, l = vnodesToUpdateCopy.length; i < l; i++) {\n const vnode2 = vnodesToUpdateCopy[i];\n // If it does, create a new vnode object based on the original vnode, its children, and its DOM and SVG properties\n const newVnode = v(vnode2.tag, vnode2.props, ...vnode2.initialChildren) as VnodeWithDom;\n newVnode.dom = vnode2.dom; // Set the new vnode object's DOM property to the old vnode object's DOM property\n newVnode.isSVG = vnode2.isSVG; // Set the new vnode object's isSVG property to the old vnode object's isSVG property\n\n // Update the vnode object\n updateVnode(newVnode, vnode2);\n }\n };\n\n // Define a function that returns the current value of the Signal\n function get() {\n // Get the current vnode from the context object\n const { vnode: vnode2 } = current;\n\n // If we have a current vnode, it means that a get function is being called from within a component\n // so we subscribe the vnode to be updated when the Signal's value changes\n if (vnode2 && vnodesToUpdate.indexOf(vnode2) === -1) {\n // We set the initialChildren to a copy of the vnode's children array\n // This is the case when the vnode is a component that has not been rendered yet and we need the initial children\n // because they could have the components that are using the Signal\n if (!vnode2.initialChildren) {\n vnode2.initialChildren = [...vnode2.children];\n }\n\n // Add the vnode to the vnodesToUpdate array\n vnodesToUpdate.push(vnode2);\n\n // Subscribe the updateVnodes function to the Signal\n subscribe(updateVnodes);\n }\n\n // Return the current value of the Signal\n return value;\n }\n\n // Define a function that allows the value of the Signal to be updated and notifies any subscribed functions of the change\n const set = (newValue: any) => {\n // If we have a current event on going, prevent the default action\n if (current.event) {\n current.event.preventDefault();\n }\n\n // Just return if the new value is the same as the current value\n if (newValue === value) {\n return;\n }\n\n // Update the value of the Signal\n value = newValue;\n\n // Call each subscribed function with the new value of the Signal as an argument\n for (let i = 0, l = subscriptions.length; i < l; i++) {\n subscriptions[i](value);\n }\n };\n\n // Assign the signal variable an array containing the get, set, and subscribe functions\n const signal: SignalInterface = [get, set, subscribe, subscriptions];\n\n // If the context object has a vnode property, add the signal to the vnode's signals array\n // and add the subscriptions array to the vnode's subscriptions array\n if (vnode && component) {\n component.signals.push(signal);\n }\n\n // Return the signal\n return signal;\n}\n"], - "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAAiE;AAwB1D,SAAS,OAAO,cAAoC;AAEzD,QAAM,EAAE,OAAO,UAAU,IAAI,EAAE,GAAG,wBAAQ;AAG1C,MAAI,SAAS,WAAW;AAEtB,QAAI,CAAC,MAAM,YAAY;AAErB,YAAM,aAAa,CAAC;AAAA,IACtB;AAGA,QAAI,MAAM,WAAW,QAAQ,SAAS,MAAM,IAAI;AAE9C,YAAM,eAAe;AAErB,YAAM,WAAW,KAAK,SAAS;AAG/B,UAAI,CAAC,UAAU,SAAS;AAEtB,kBAAU,UAAU,CAAC;AAErB,uCAAU,MAAM,QAAQ,eAAe,WAAW,SAAS,CAAC;AAAA,MAC9D;AAAA,IACF;AAGA,UAAMA,UAA0B,UAAU,QAAQ,EAAE,MAAM,YAAY;AAGtE,QAAIA,SAAQ;AAEV,MAAAA,QAAO,CAAC,EAAE,SAAS;AAGnB,aAAOA;AAAA,IACT;AAAA,EACF;AAGA,MAAI,QAAQ;AAGZ,QAAM,gBAAwC,CAAC;AAG/C,QAAM,YAAY,CAAC,aAAuB;AAExC,QAAI,cAAc,QAAQ,QAAQ,MAAM,IAAI;AAC1C,oBAAc,KAAK,QAAQ;AAAA,IAC7B;AAAA,EACF;AAGA,QAAM,iBAAsC,CAAC;AAG7C,QAAM,eAAe,MAAM;AAEzB,UAAM,qBAAqB,eAAe,OAAO,CAACC,QAAO,OAAO,SAAS;AACvE,aAAO,KAAK,UAAU,CAACC,OAAMA,GAAE,QAAQD,OAAM,GAAG,MAAM;AAAA,IACxD,CAAC;AAGD,aAAS,IAAI,GAAG,IAAI,mBAAmB,QAAQ,IAAI,GAAG,KAAK;AACzD,YAAM,SAAS,mBAAmB,CAAC;AAEnC,YAAM,eAAW,mBAAE,OAAO,KAAK,OAAO,OAAO,GAAG,OAAO,eAAe;AACtE,eAAS,MAAM,OAAO;AACtB,eAAS,QAAQ,OAAO;AAGxB,uCAAY,UAAU,MAAM;AAAA,IAC9B;AAAA,EACF;AAGA,WAAS,MAAM;AAEb,UAAM,EAAE,OAAO,OAAO,IAAI;AAI1B,QAAI,UAAU,eAAe,QAAQ,MAAM,MAAM,IAAI;AAInD,UAAI,CAAC,OAAO,iBAAiB;AAC3B,eAAO,kBAAkB,CAAC,GAAG,OAAO,QAAQ;AAAA,MAC9C;AAGA,qBAAe,KAAK,MAAM;AAG1B,gBAAU,YAAY;AAAA,IACxB;AAGA,WAAO;AAAA,EACT;AAGA,QAAM,MAAM,CAAC,aAAkB;AAE7B,QAAI,wBAAQ,OAAO;AACjB,8BAAQ,MAAM,eAAe;AAAA,IAC/B;AAGA,QAAI,aAAa,OAAO;AACtB;AAAA,IACF;AAGA,YAAQ;AAGR,aAAS,IAAI,GAAG,IAAI,cAAc,QAAQ,IAAI,GAAG,KAAK;AACpD,oBAAc,CAAC,EAAE,KAAK;AAAA,IACxB;AAAA,EACF;AAGA,QAAM,SAA0B,CAAC,KAAK,KAAK,WAAW,aAAa;AAInE,MAAI,SAAS,WAAW;AACtB,cAAU,QAAQ,KAAK,MAAM;AAAA,EAC/B;AAGA,SAAO;AACT;", - "names": ["signal", "vnode", "v"] + "sourcesContent": ["import { updateVnode, current, VnodeWithDom, onCleanup, POJOComponent, Component, onUnmount } from \"valyrian.js\";\n\ntype getter = () => any;\ntype setter = (newValue: any) => void;\ntype unsubscribe = () => void;\ntype subscribe = (callback: () => void) => unsubscribe;\ntype subscriptions = Set<() => void>;\ntype signal = [getter, setter, subscribe, subscriptions];\n\ntype SignalCalls = {\n signals: signal[];\n signal_calls: number;\n};\n\nconst componentToSignalsWeakMap = new WeakMap();\n\n// Signal is a generic function that creates a reactive state with a getter, setter, and subscribe mechanism.\nexport function Signal(initialValue: T): signal {\n if (current.component) {\n if (componentToSignalsWeakMap.has(current.component) === false) {\n const SignalCalls = { signals: [], signal_calls: -1 };\n componentToSignalsWeakMap.set(current.component, SignalCalls);\n onUnmount(() => componentToSignalsWeakMap.delete(current.component as Component | POJOComponent));\n }\n\n const SignalCalls = componentToSignalsWeakMap.get(current.component) as SignalCalls;\n onCleanup(() => (SignalCalls.signal_calls = -1));\n\n const signal = SignalCalls.signals[++SignalCalls.signal_calls];\n\n if (signal) {\n // Return the signal if it already exists.\n // But without the subscribe function. This is to prevent the subscribe function from being called multiple times.\n const fakeSubscribe = (() => {}) as unknown as subscribe;\n return [signal[0], signal[1], fakeSubscribe, signal[3]];\n }\n }\n\n // The current value of the signal is stored in a closure to maintain state.\n let value: T = initialValue;\n // Subscribers is a Set of functions to be called whenever the value changes.\n const subscribers: subscriptions = new Set();\n\n // subscribe is a function that allows a subscriber to listen to changes in the signal's value.\n // It returns an unsubscribe function to stop listening to changes.\n const subscribe = (callback: () => void) => {\n subscribers.add(callback);\n return () => subscribers.delete(callback);\n };\n\n const domToVnodesToUpdate: Map = new Map();\n const updateVnodes = () => domToVnodesToUpdate.forEach((vnode) => updateVnode(vnode));\n\n // getValue is a function that returns the current value of the signal.\n const getValue = () => {\n if (current.vnode) {\n const vnode = current.vnode as VnodeWithDom;\n domToVnodesToUpdate.set(vnode.dom, vnode);\n subscribe(updateVnodes);\n }\n return value;\n };\n\n // setValue is a function that updates the value of the signal and notifies subscribers.\n const setValue = (newValue: any) => {\n if (current.event) {\n current.event.preventDefault();\n }\n\n if (value === newValue) {\n return;\n }\n value = newValue;\n // Notify all subscribers by invoking their callback functions.\n subscribers.forEach((subscriber) => subscriber());\n };\n\n const signal: signal = [getValue, setValue, subscribe, subscribers];\n\n if (current.component) {\n const SignalCalls = componentToSignalsWeakMap.get(current.component) as SignalCalls;\n SignalCalls.signals.push(signal);\n }\n\n return signal;\n}\n"], + "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAAmG;AAcnG,IAAM,4BAA4B,oBAAI,QAAgD;AAG/E,SAAS,OAAU,cAAyB;AACjD,MAAI,wBAAQ,WAAW;AACrB,QAAI,0BAA0B,IAAI,wBAAQ,SAAS,MAAM,OAAO;AAC9D,YAAMA,eAAc,EAAE,SAAS,CAAC,GAAG,cAAc,GAAG;AACpD,gCAA0B,IAAI,wBAAQ,WAAWA,YAAW;AAC5D,qCAAU,MAAM,0BAA0B,OAAO,wBAAQ,SAAsC,CAAC;AAAA,IAClG;AAEA,UAAM,cAAc,0BAA0B,IAAI,wBAAQ,SAAS;AACnE,mCAAU,MAAO,YAAY,eAAe,EAAG;AAE/C,UAAMC,UAAS,YAAY,QAAQ,EAAE,YAAY,YAAY;AAE7D,QAAIA,SAAQ;AAGV,YAAM,gBAAiB,MAAM;AAAA,MAAC;AAC9B,aAAO,CAACA,QAAO,CAAC,GAAGA,QAAO,CAAC,GAAG,eAAeA,QAAO,CAAC,CAAC;AAAA,IACxD;AAAA,EACF;AAGA,MAAI,QAAW;AAEf,QAAM,cAA6B,oBAAI,IAAI;AAI3C,QAAM,YAAY,CAAC,aAAyB;AAC1C,gBAAY,IAAI,QAAQ;AACxB,WAAO,MAAM,YAAY,OAAO,QAAQ;AAAA,EAC1C;AAEA,QAAM,sBAA+C,oBAAI,IAAI;AAC7D,QAAM,eAAe,MAAM,oBAAoB,QAAQ,CAAC,cAAU,6BAAY,KAAK,CAAC;AAGpF,QAAM,WAAW,MAAM;AACrB,QAAI,wBAAQ,OAAO;AACjB,YAAM,QAAQ,wBAAQ;AACtB,0BAAoB,IAAI,MAAM,KAAK,KAAK;AACxC,gBAAU,YAAY;AAAA,IACxB;AACA,WAAO;AAAA,EACT;AAGA,QAAM,WAAW,CAAC,aAAkB;AAClC,QAAI,wBAAQ,OAAO;AACjB,8BAAQ,MAAM,eAAe;AAAA,IAC/B;AAEA,QAAI,UAAU,UAAU;AACtB;AAAA,IACF;AACA,YAAQ;AAER,gBAAY,QAAQ,CAAC,eAAe,WAAW,CAAC;AAAA,EAClD;AAEA,QAAM,SAAiB,CAAC,UAAU,UAAU,WAAW,WAAW;AAElE,MAAI,wBAAQ,WAAW;AACrB,UAAM,cAAc,0BAA0B,IAAI,wBAAQ,SAAS;AACnE,gBAAY,QAAQ,KAAK,MAAM;AAAA,EACjC;AAEA,SAAO;AACT;", + "names": ["SignalCalls", "signal"] } diff --git a/dist/signal/index.mjs b/dist/signal/index.mjs index fdfc8ec..9dbc023 100644 --- a/dist/signal/index.mjs +++ b/dist/signal/index.mjs @@ -1,71 +1,52 @@ // lib/signal/index.ts -import { current, onUnmount, updateVnode, v } from "valyrian.js"; +import { updateVnode, current, onCleanup, onUnmount } from "valyrian.js"; +var componentToSignalsWeakMap = /* @__PURE__ */ new WeakMap(); function Signal(initialValue) { - const { vnode, component } = { ...current }; - if (vnode && component) { - if (!vnode.components) { - vnode.components = []; - } - if (vnode.components.indexOf(component) === -1) { - vnode.signal_calls = -1; - vnode.components.push(component); - if (!component.signals) { - component.signals = []; - onUnmount(() => Reflect.deleteProperty(component, "signals")); - } - } - const signal2 = component.signals[++vnode.signal_calls]; + if (current.component) { + if (componentToSignalsWeakMap.has(current.component) === false) { + const SignalCalls2 = { signals: [], signal_calls: -1 }; + componentToSignalsWeakMap.set(current.component, SignalCalls2); + onUnmount(() => componentToSignalsWeakMap.delete(current.component)); + } + const SignalCalls = componentToSignalsWeakMap.get(current.component); + onCleanup(() => SignalCalls.signal_calls = -1); + const signal2 = SignalCalls.signals[++SignalCalls.signal_calls]; if (signal2) { - signal2[3].length = 0; - return signal2; + const fakeSubscribe = () => { + }; + return [signal2[0], signal2[1], fakeSubscribe, signal2[3]]; } } let value = initialValue; - const subscriptions = []; + const subscribers = /* @__PURE__ */ new Set(); const subscribe = (callback) => { - if (subscriptions.indexOf(callback) === -1) { - subscriptions.push(callback); - } - }; - const vnodesToUpdate = []; - const updateVnodes = () => { - const vnodesToUpdateCopy = vnodesToUpdate.filter((vnode2, index, self) => { - return self.findIndex((v2) => v2.dom === vnode2.dom) === index; - }); - for (let i = 0, l = vnodesToUpdateCopy.length; i < l; i++) { - const vnode2 = vnodesToUpdateCopy[i]; - const newVnode = v(vnode2.tag, vnode2.props, ...vnode2.initialChildren); - newVnode.dom = vnode2.dom; - newVnode.isSVG = vnode2.isSVG; - updateVnode(newVnode, vnode2); - } + subscribers.add(callback); + return () => subscribers.delete(callback); }; - function get() { - const { vnode: vnode2 } = current; - if (vnode2 && vnodesToUpdate.indexOf(vnode2) === -1) { - if (!vnode2.initialChildren) { - vnode2.initialChildren = [...vnode2.children]; - } - vnodesToUpdate.push(vnode2); + const domToVnodesToUpdate = /* @__PURE__ */ new Map(); + const updateVnodes = () => domToVnodesToUpdate.forEach((vnode) => updateVnode(vnode)); + const getValue = () => { + if (current.vnode) { + const vnode = current.vnode; + domToVnodesToUpdate.set(vnode.dom, vnode); subscribe(updateVnodes); } return value; - } - const set = (newValue) => { + }; + const setValue = (newValue) => { if (current.event) { current.event.preventDefault(); } - if (newValue === value) { + if (value === newValue) { return; } value = newValue; - for (let i = 0, l = subscriptions.length; i < l; i++) { - subscriptions[i](value); - } + subscribers.forEach((subscriber) => subscriber()); }; - const signal = [get, set, subscribe, subscriptions]; - if (vnode && component) { - component.signals.push(signal); + const signal = [getValue, setValue, subscribe, subscribers]; + if (current.component) { + const SignalCalls = componentToSignalsWeakMap.get(current.component); + SignalCalls.signals.push(signal); } return signal; } diff --git a/dist/signal/index.mjs.map b/dist/signal/index.mjs.map index fc66c92..4f52262 100644 --- a/dist/signal/index.mjs.map +++ b/dist/signal/index.mjs.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../lib/signal/index.ts"], - "sourcesContent": ["import { VnodeWithDom, current, onUnmount, updateVnode, v } from \"valyrian.js\";\n\ninterface GetterInterface {\n (): any;\n}\n\ninterface SetterInterface {\n (value: any): void;\n}\n\ninterface SubscribeInterface {\n (callback: Function): void;\n}\n\ninterface SubscriptionsInterface extends Array {}\n\nexport interface SignalInterface extends Array {\n 0: GetterInterface;\n 1: SetterInterface;\n 2: SubscribeInterface;\n 3: SubscriptionsInterface;\n}\n\n// eslint-disable-next-line sonarjs/cognitive-complexity\nexport function Signal(initialValue: any): SignalInterface {\n // Create a copy of the current context object\n const { vnode, component } = { ...current };\n\n // Check if the context object has a vnode property\n if (vnode && component) {\n // Is first call\n if (!vnode.components) {\n // Set the components property to an empty array\n vnode.components = [];\n }\n\n // Check if the components array of the vnode object does not contain the component object\n if (vnode.components.indexOf(component) === -1) {\n // Set the calls property to -1\n vnode.signal_calls = -1;\n // Add the component to the components array\n vnode.components.push(component);\n\n // Check if the component object has a signals property\n if (!component.signals) {\n // Set the signals property of the component object to an empty array\n component.signals = [];\n // Add a function to the cleanup stack that removes the signals property from the component object\n onUnmount(() => Reflect.deleteProperty(component, \"signals\"));\n }\n }\n\n // Assign the signal variable to the signal stored at the index of the vnode object's calls property in the vnode's signals array\n const signal: SignalInterface = component.signals[++vnode.signal_calls];\n\n // If a signal has already been assigned to the signal variable, return it\n if (signal) {\n // Remove all subscriptions because we come from a new render\n signal[3].length = 0;\n\n // Return the signal\n return signal;\n }\n }\n\n // Declare a variable to store the current value of the Signal\n let value = initialValue;\n\n // Create an array to store functions that have subscribed to changes to the Signal's value\n const subscriptions: SubscriptionsInterface = [];\n\n // Define a function that allows other parts of the code to subscribe to changes to the Signal's value\n const subscribe = (callback: Function) => {\n // Add the callback function to the subscriptions array if it is not already in the array\n if (subscriptions.indexOf(callback) === -1) {\n subscriptions.push(callback);\n }\n };\n\n // Set the vnodes to update when the Signal's value changes\n const vnodesToUpdate: Array = [];\n\n // This is the function that will be called when the Signal's value changes\n const updateVnodes = () => {\n // Create a copy of the vnodesToUpdate array and filter out any duplicate vnodes\n const vnodesToUpdateCopy = vnodesToUpdate.filter((vnode, index, self) => {\n return self.findIndex((v) => v.dom === vnode.dom) === index;\n });\n\n // Loop through the vnodesToUpdate array\n for (let i = 0, l = vnodesToUpdateCopy.length; i < l; i++) {\n const vnode2 = vnodesToUpdateCopy[i];\n // If it does, create a new vnode object based on the original vnode, its children, and its DOM and SVG properties\n const newVnode = v(vnode2.tag, vnode2.props, ...vnode2.initialChildren) as VnodeWithDom;\n newVnode.dom = vnode2.dom; // Set the new vnode object's DOM property to the old vnode object's DOM property\n newVnode.isSVG = vnode2.isSVG; // Set the new vnode object's isSVG property to the old vnode object's isSVG property\n\n // Update the vnode object\n updateVnode(newVnode, vnode2);\n }\n };\n\n // Define a function that returns the current value of the Signal\n function get() {\n // Get the current vnode from the context object\n const { vnode: vnode2 } = current;\n\n // If we have a current vnode, it means that a get function is being called from within a component\n // so we subscribe the vnode to be updated when the Signal's value changes\n if (vnode2 && vnodesToUpdate.indexOf(vnode2) === -1) {\n // We set the initialChildren to a copy of the vnode's children array\n // This is the case when the vnode is a component that has not been rendered yet and we need the initial children\n // because they could have the components that are using the Signal\n if (!vnode2.initialChildren) {\n vnode2.initialChildren = [...vnode2.children];\n }\n\n // Add the vnode to the vnodesToUpdate array\n vnodesToUpdate.push(vnode2);\n\n // Subscribe the updateVnodes function to the Signal\n subscribe(updateVnodes);\n }\n\n // Return the current value of the Signal\n return value;\n }\n\n // Define a function that allows the value of the Signal to be updated and notifies any subscribed functions of the change\n const set = (newValue: any) => {\n // If we have a current event on going, prevent the default action\n if (current.event) {\n current.event.preventDefault();\n }\n\n // Just return if the new value is the same as the current value\n if (newValue === value) {\n return;\n }\n\n // Update the value of the Signal\n value = newValue;\n\n // Call each subscribed function with the new value of the Signal as an argument\n for (let i = 0, l = subscriptions.length; i < l; i++) {\n subscriptions[i](value);\n }\n };\n\n // Assign the signal variable an array containing the get, set, and subscribe functions\n const signal: SignalInterface = [get, set, subscribe, subscriptions];\n\n // If the context object has a vnode property, add the signal to the vnode's signals array\n // and add the subscriptions array to the vnode's subscriptions array\n if (vnode && component) {\n component.signals.push(signal);\n }\n\n // Return the signal\n return signal;\n}\n"], - "mappings": ";AAAA,SAAuB,SAAS,WAAW,aAAa,SAAS;AAwB1D,SAAS,OAAO,cAAoC;AAEzD,QAAM,EAAE,OAAO,UAAU,IAAI,EAAE,GAAG,QAAQ;AAG1C,MAAI,SAAS,WAAW;AAEtB,QAAI,CAAC,MAAM,YAAY;AAErB,YAAM,aAAa,CAAC;AAAA,IACtB;AAGA,QAAI,MAAM,WAAW,QAAQ,SAAS,MAAM,IAAI;AAE9C,YAAM,eAAe;AAErB,YAAM,WAAW,KAAK,SAAS;AAG/B,UAAI,CAAC,UAAU,SAAS;AAEtB,kBAAU,UAAU,CAAC;AAErB,kBAAU,MAAM,QAAQ,eAAe,WAAW,SAAS,CAAC;AAAA,MAC9D;AAAA,IACF;AAGA,UAAMA,UAA0B,UAAU,QAAQ,EAAE,MAAM,YAAY;AAGtE,QAAIA,SAAQ;AAEV,MAAAA,QAAO,CAAC,EAAE,SAAS;AAGnB,aAAOA;AAAA,IACT;AAAA,EACF;AAGA,MAAI,QAAQ;AAGZ,QAAM,gBAAwC,CAAC;AAG/C,QAAM,YAAY,CAAC,aAAuB;AAExC,QAAI,cAAc,QAAQ,QAAQ,MAAM,IAAI;AAC1C,oBAAc,KAAK,QAAQ;AAAA,IAC7B;AAAA,EACF;AAGA,QAAM,iBAAsC,CAAC;AAG7C,QAAM,eAAe,MAAM;AAEzB,UAAM,qBAAqB,eAAe,OAAO,CAACC,QAAO,OAAO,SAAS;AACvE,aAAO,KAAK,UAAU,CAACC,OAAMA,GAAE,QAAQD,OAAM,GAAG,MAAM;AAAA,IACxD,CAAC;AAGD,aAAS,IAAI,GAAG,IAAI,mBAAmB,QAAQ,IAAI,GAAG,KAAK;AACzD,YAAM,SAAS,mBAAmB,CAAC;AAEnC,YAAM,WAAW,EAAE,OAAO,KAAK,OAAO,OAAO,GAAG,OAAO,eAAe;AACtE,eAAS,MAAM,OAAO;AACtB,eAAS,QAAQ,OAAO;AAGxB,kBAAY,UAAU,MAAM;AAAA,IAC9B;AAAA,EACF;AAGA,WAAS,MAAM;AAEb,UAAM,EAAE,OAAO,OAAO,IAAI;AAI1B,QAAI,UAAU,eAAe,QAAQ,MAAM,MAAM,IAAI;AAInD,UAAI,CAAC,OAAO,iBAAiB;AAC3B,eAAO,kBAAkB,CAAC,GAAG,OAAO,QAAQ;AAAA,MAC9C;AAGA,qBAAe,KAAK,MAAM;AAG1B,gBAAU,YAAY;AAAA,IACxB;AAGA,WAAO;AAAA,EACT;AAGA,QAAM,MAAM,CAAC,aAAkB;AAE7B,QAAI,QAAQ,OAAO;AACjB,cAAQ,MAAM,eAAe;AAAA,IAC/B;AAGA,QAAI,aAAa,OAAO;AACtB;AAAA,IACF;AAGA,YAAQ;AAGR,aAAS,IAAI,GAAG,IAAI,cAAc,QAAQ,IAAI,GAAG,KAAK;AACpD,oBAAc,CAAC,EAAE,KAAK;AAAA,IACxB;AAAA,EACF;AAGA,QAAM,SAA0B,CAAC,KAAK,KAAK,WAAW,aAAa;AAInE,MAAI,SAAS,WAAW;AACtB,cAAU,QAAQ,KAAK,MAAM;AAAA,EAC/B;AAGA,SAAO;AACT;", - "names": ["signal", "vnode", "v"] + "sourcesContent": ["import { updateVnode, current, VnodeWithDom, onCleanup, POJOComponent, Component, onUnmount } from \"valyrian.js\";\n\ntype getter = () => any;\ntype setter = (newValue: any) => void;\ntype unsubscribe = () => void;\ntype subscribe = (callback: () => void) => unsubscribe;\ntype subscriptions = Set<() => void>;\ntype signal = [getter, setter, subscribe, subscriptions];\n\ntype SignalCalls = {\n signals: signal[];\n signal_calls: number;\n};\n\nconst componentToSignalsWeakMap = new WeakMap();\n\n// Signal is a generic function that creates a reactive state with a getter, setter, and subscribe mechanism.\nexport function Signal(initialValue: T): signal {\n if (current.component) {\n if (componentToSignalsWeakMap.has(current.component) === false) {\n const SignalCalls = { signals: [], signal_calls: -1 };\n componentToSignalsWeakMap.set(current.component, SignalCalls);\n onUnmount(() => componentToSignalsWeakMap.delete(current.component as Component | POJOComponent));\n }\n\n const SignalCalls = componentToSignalsWeakMap.get(current.component) as SignalCalls;\n onCleanup(() => (SignalCalls.signal_calls = -1));\n\n const signal = SignalCalls.signals[++SignalCalls.signal_calls];\n\n if (signal) {\n // Return the signal if it already exists.\n // But without the subscribe function. This is to prevent the subscribe function from being called multiple times.\n const fakeSubscribe = (() => {}) as unknown as subscribe;\n return [signal[0], signal[1], fakeSubscribe, signal[3]];\n }\n }\n\n // The current value of the signal is stored in a closure to maintain state.\n let value: T = initialValue;\n // Subscribers is a Set of functions to be called whenever the value changes.\n const subscribers: subscriptions = new Set();\n\n // subscribe is a function that allows a subscriber to listen to changes in the signal's value.\n // It returns an unsubscribe function to stop listening to changes.\n const subscribe = (callback: () => void) => {\n subscribers.add(callback);\n return () => subscribers.delete(callback);\n };\n\n const domToVnodesToUpdate: Map = new Map();\n const updateVnodes = () => domToVnodesToUpdate.forEach((vnode) => updateVnode(vnode));\n\n // getValue is a function that returns the current value of the signal.\n const getValue = () => {\n if (current.vnode) {\n const vnode = current.vnode as VnodeWithDom;\n domToVnodesToUpdate.set(vnode.dom, vnode);\n subscribe(updateVnodes);\n }\n return value;\n };\n\n // setValue is a function that updates the value of the signal and notifies subscribers.\n const setValue = (newValue: any) => {\n if (current.event) {\n current.event.preventDefault();\n }\n\n if (value === newValue) {\n return;\n }\n value = newValue;\n // Notify all subscribers by invoking their callback functions.\n subscribers.forEach((subscriber) => subscriber());\n };\n\n const signal: signal = [getValue, setValue, subscribe, subscribers];\n\n if (current.component) {\n const SignalCalls = componentToSignalsWeakMap.get(current.component) as SignalCalls;\n SignalCalls.signals.push(signal);\n }\n\n return signal;\n}\n"], + "mappings": ";AAAA,SAAS,aAAa,SAAuB,WAAqC,iBAAiB;AAcnG,IAAM,4BAA4B,oBAAI,QAAgD;AAG/E,SAAS,OAAU,cAAyB;AACjD,MAAI,QAAQ,WAAW;AACrB,QAAI,0BAA0B,IAAI,QAAQ,SAAS,MAAM,OAAO;AAC9D,YAAMA,eAAc,EAAE,SAAS,CAAC,GAAG,cAAc,GAAG;AACpD,gCAA0B,IAAI,QAAQ,WAAWA,YAAW;AAC5D,gBAAU,MAAM,0BAA0B,OAAO,QAAQ,SAAsC,CAAC;AAAA,IAClG;AAEA,UAAM,cAAc,0BAA0B,IAAI,QAAQ,SAAS;AACnE,cAAU,MAAO,YAAY,eAAe,EAAG;AAE/C,UAAMC,UAAS,YAAY,QAAQ,EAAE,YAAY,YAAY;AAE7D,QAAIA,SAAQ;AAGV,YAAM,gBAAiB,MAAM;AAAA,MAAC;AAC9B,aAAO,CAACA,QAAO,CAAC,GAAGA,QAAO,CAAC,GAAG,eAAeA,QAAO,CAAC,CAAC;AAAA,IACxD;AAAA,EACF;AAGA,MAAI,QAAW;AAEf,QAAM,cAA6B,oBAAI,IAAI;AAI3C,QAAM,YAAY,CAAC,aAAyB;AAC1C,gBAAY,IAAI,QAAQ;AACxB,WAAO,MAAM,YAAY,OAAO,QAAQ;AAAA,EAC1C;AAEA,QAAM,sBAA+C,oBAAI,IAAI;AAC7D,QAAM,eAAe,MAAM,oBAAoB,QAAQ,CAAC,UAAU,YAAY,KAAK,CAAC;AAGpF,QAAM,WAAW,MAAM;AACrB,QAAI,QAAQ,OAAO;AACjB,YAAM,QAAQ,QAAQ;AACtB,0BAAoB,IAAI,MAAM,KAAK,KAAK;AACxC,gBAAU,YAAY;AAAA,IACxB;AACA,WAAO;AAAA,EACT;AAGA,QAAM,WAAW,CAAC,aAAkB;AAClC,QAAI,QAAQ,OAAO;AACjB,cAAQ,MAAM,eAAe;AAAA,IAC/B;AAEA,QAAI,UAAU,UAAU;AACtB;AAAA,IACF;AACA,YAAQ;AAER,gBAAY,QAAQ,CAAC,eAAe,WAAW,CAAC;AAAA,EAClD;AAEA,QAAM,SAAiB,CAAC,UAAU,UAAU,WAAW,WAAW;AAElE,MAAI,QAAQ,WAAW;AACrB,UAAM,cAAc,0BAA0B,IAAI,QAAQ,SAAS;AACnE,gBAAY,QAAQ,KAAK,MAAM;AAAA,EACjC;AAEA,SAAO;AACT;", + "names": ["SignalCalls", "signal"] } diff --git a/lib/dataset/index.ts b/lib/dataset/index.ts index 04c3b5e..600c914 100644 --- a/lib/dataset/index.ts +++ b/lib/dataset/index.ts @@ -1,4 +1,4 @@ -import { VnodeInterface, VnodeWithDom, createDomElement, directive, patch, updateAttributes } from "valyrian.js"; +import { VnodeWithDom, createElement, directive, patch, updateAttributes } from "valyrian.js"; interface DataSetInterface { data: T[]; @@ -13,7 +13,7 @@ interface DataSetInterface { } interface DataSetHandler { // eslint-disable-next-line no-unused-vars - (data: T, index: number): VnodeInterface; + (data: T, index: number): VnodeWithDom; } function deepFreeze(obj: any) { @@ -107,16 +107,16 @@ export class DataSet implements DataSetInterface { const oldChild = vnode.children[i]; child.isSVG = oldChild.isSVG; child.dom = oldChild.dom; - updateAttributes(child as VnodeWithDom, oldChild); + updateAttributes(child as VnodeWithDom, null); vnode.children[i] = child; - patch(child as VnodeWithDom, oldChild); + patch(child as VnodeWithDom); continue; } child.isSVG = vnode.isSVG || child.tag === "svg"; - child.dom = createDomElement(child.tag as string, child.isSVG); + child.dom = createElement(child.tag as string, child.isSVG); vnode.dom.appendChild(child.dom); - updateAttributes(child as VnodeWithDom); + updateAttributes(child as VnodeWithDom, null); vnode.children.push(child); patch(child as VnodeWithDom); } @@ -146,9 +146,9 @@ export class DataSet implements DataSetInterface { for (let i = 0, ii = oldLength, l = data.length; i < l; i++, ii++) { const child = handler(this.#data[i], ii); child.isSVG = vnode.isSVG || child.tag === "svg"; - child.dom = createDomElement(child.tag as string, child.isSVG); + child.dom = createElement(child.tag as string, child.isSVG); vnode.dom.appendChild(child.dom); - updateAttributes(child as VnodeWithDom); + updateAttributes(child as VnodeWithDom, null); vnode.children.push(child); patch(child as VnodeWithDom); } @@ -181,13 +181,13 @@ export class DataSet implements DataSetInterface { newChild.isSVG = this.#vnode.isSVG || newChild.tag === "svg"; newChild.dom = child.dom; this.#vnode.children[index] = newChild; - updateAttributes(newChild as VnodeWithDom, child); - patch(newChild as VnodeWithDom, child); + updateAttributes(newChild as VnodeWithDom, null); + patch(newChild as VnodeWithDom); } } } -directive("with-dataset", (dataSet, vnode) => { - dataSet.setVnodeAndHandler(vnode as VnodeWithDom, vnode.children[0]); +directive("with-dataset", (dataSet: DataSet, vnode: VnodeWithDom) => { + dataSet.setVnodeAndHandler(vnode, vnode.children[0]); return false; }); diff --git a/lib/hooks/index.ts b/lib/hooks/index.ts index d1bccb8..481735f 100644 --- a/lib/hooks/index.ts +++ b/lib/hooks/index.ts @@ -1,10 +1,4 @@ -import { Component, POJOComponent, VnodeWithDom, current, directive, onCleanup, onUnmount, update } from "valyrian.js"; - -interface CurrentOnPatch { - component: Component | POJOComponent; - vnode: VnodeWithDom; - oldVnode: VnodeWithDom; -} +import { Component, POJOComponent, current, directive, onCleanup, onUnmount, update } from "valyrian.js"; export type Hook = any; @@ -26,6 +20,13 @@ export interface CreateHook { (HookDefinition: HookDefinition): (...args: any[]) => any; } +type HookCalls = { + hooks: Hook[]; + hook_calls: number; +}; + +const componentToHooksWeakMap = new WeakMap(); + export const createHook = function createHook({ onCreate, onUpdate: onUpdateHook, @@ -34,62 +35,33 @@ export const createHook = function createHook({ returnValue }: HookDefinition): Hook { return (...args: any[]) => { - const { component, vnode } = current as CurrentOnPatch; - + const component = current.component as Component | POJOComponent; let hook: any = null; - if (vnode) { - // Init the components array for the current vnode - if (!vnode.components) { - vnode.components = []; - } + if (componentToHooksWeakMap.has(component) === false) { + const HookCalls = { hooks: [], hook_calls: -1 }; + componentToHooksWeakMap.set(component, HookCalls); + onUnmount(() => componentToHooksWeakMap.delete(component)); + } - if (vnode.components.indexOf(component) === -1) { - vnode.hook_calls = -1; - vnode.components.push(component); - if (!component.hooks) { - component.hooks = []; - onUnmount(() => Reflect.deleteProperty(component, "hooks")); - } - } + const HookCalls = componentToHooksWeakMap.get(component) as HookCalls; + onCleanup(() => (HookCalls.hook_calls = -1)); + + hook = HookCalls.hooks[++HookCalls.hook_calls]; - hook = component.hooks[++vnode.hook_calls]; + if (hook) { + onUpdateHook && onUpdateHook(hook, ...args); } // If the hook doesn't exist, create it if (!hook) { - // create a new hook hook = onCreate(...args); - - if (vnode) { - // Add the hook to the component - component.hooks.push(hook); - } - - // if we have a onRemove hook, add it to the onUnmount set - if (onRemove) { - // Add the hook to the onRemove array - onUnmount(() => onRemove(hook)); - } - } else { - if (onUpdateHook) { - onUpdateHook(hook, ...args); - } + HookCalls.hooks.push(hook); + onRemove && onUnmount(() => onRemove(hook)); } - // If we have an onCleanup function, add it to the cleanup set - if (onCleanupHook) { - // Add the hook to the onCleanup set - onCleanup(() => onCleanupHook(hook)); - } - - // If we have a returnValue function, call it and return the result instead of the hook - if (returnValue) { - return returnValue(hook); - } - - // Return the hook - return hook; + onCleanupHook && onCleanup(() => onCleanupHook(hook)); + return returnValue ? returnValue(hook) : hook; }; } as unknown as CreateHook; @@ -110,7 +82,6 @@ export const useState = createHook({ get.toString = () => `${value}`; function set(newValue: any) { - // Prevent default event if it exists if (current.event) { current.event.preventDefault(); } diff --git a/lib/index.ts b/lib/index.ts index 731620b..eb219ee 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -1,14 +1,15 @@ +/* eslint-disable sonarjs/cognitive-complexity */ declare global { + // eslint-disable-next-line vars-on-top, no-var, no-unused-vars var document: Document; - namespace JSX { - interface IntrinsicElements { - [elemName: string]: any; - } - } } interface DefaultRecord extends Record {} +namespace JSX { + interface IntrinsicElements extends DefaultRecord {} +} + export interface VnodeProperties extends DefaultRecord { key?: string | number; } @@ -32,7 +33,7 @@ export interface VnodeComponentInterface extends Vnode { export interface Children extends Array {} export interface Directive { - (vnode: VnodeWithDom, oldProps: VnodeProperties | null): void | boolean; + (value: any, vnode: VnodeWithDom, oldProps: VnodeProperties | null): void | boolean; } export const isNodeJs = Boolean(typeof process !== "undefined" && process.versions && process.versions.node); @@ -53,39 +54,51 @@ export interface VnodeWithDom extends Vnode { props: VnodeProperties; } -export const isComponent = (component: unknown): component is Component => typeof component === "function"; +export const isComponent = (component: unknown): component is Component => + Boolean(typeof component === "function" || (component && typeof component === "object" && "view" in component)); export const isVnode = (object?: unknown): object is Vnode => object instanceof Vnode; export const isVnodeComponent = (object?: unknown): object is VnodeComponentInterface => { return isVnode(object) && isComponent(object.tag); }; -export function domToVnode(dom: any): VnodeWithDom { +export function v(tagOrComponent: string | Component, props: VnodeProperties, ...children: Children) { + return new Vnode(tagOrComponent, props, children); +} + +v.fragment = (_: VnodeProperties, ...children: Children) => children; + +export function domToVnode(dom: any): VnodeWithDom | void { if (dom.nodeType === 3) { return dom.nodeValue; } - const vnode = new Vnode(dom.nodeName.toLowerCase(), {}, []) as VnodeWithDom; - vnode.dom = dom; - dom.props = vnode.props; + if (dom.nodeType === 1) { + const tag = dom.nodeName.toLowerCase(); + const props = {} as VnodeProperties; + const children = [] as Children; + + for (let i = 0, l = dom.childNodes.length; i < l; i++) { + const childDom = dom.childNodes[i]; + if (childDom.nodeType === 3) { + children.push(childDom.nodeValue); + } else if (childDom.nodeType === 1) { + const childVnode = domToVnode(childDom); + children.push(childVnode); + } + } - for (let i = 0, l = dom.childNodes.length; i < l; i++) { - const childDom = dom.childNodes[i]; - if (childDom.nodeType === 3) { - vnode.children.push(childDom.nodeValue); - } else if (childDom.nodeType === 1) { - const childVnode = domToVnode(childDom); - vnode.children.push(childVnode); + const attributes = dom.attributes; + for (let i = 0, l = attributes.length; i < l; i++) { + const attr = attributes[i]; + props[attr.nodeName] = attr.nodeValue; } - } - const props = vnode.props as VnodeProperties; - for (let i = 0, l = dom.attributes.length; i < l; i++) { - const attr = dom.attributes[i]; - props[attr.nodeName] = attr.nodeValue; + const vnode = new Vnode(tag, props, children); + vnode.dom = dom; + vnode.isSVG = tag === "svg"; + return vnode as VnodeWithDom; } - - return vnode as VnodeWithDom; } export function trust(htmlString: string) { @@ -135,20 +148,9 @@ const callSet = (set: Set) => { set.clear(); }; -export const directives: Record = { - "v-for"(vnode: VnodeWithDom) { - const set = vnode.props["v-for"]; - const children = vnode.children; - const callback = children[0]; - children.length = set.length; - - for (let i = 0, l = set.length; i < l; i++) { - children[i] = callback(set[i], i); - } - }, - - "v-if": (vnode: VnodeWithDom) => { - const bool = Boolean(vnode.props["v-if"]); +const handleVIf = (shouldRender: boolean): Directive => { + return (value, vnode) => { + const bool = shouldRender !== Boolean(value); if (bool) { const parentNode = vnode.dom?.parentNode; if (parentNode) { @@ -158,10 +160,15 @@ export const directives: Record = { return false; } - }, + }; +}; + +export const directives: Record = { + "v-if": handleVIf(true), + "v-unless": handleVIf(false), - "v-show": (vnode: VnodeWithDom) => { - const bool = Boolean(vnode.props["v-show"]); + "v-show": (value, vnode) => { + const bool = Boolean(value); ( vnode.dom as unknown as { style: { display: string }; @@ -169,13 +176,14 @@ export const directives: Record = { ).style.display = bool ? "" : "none"; }, - "v-html": (vnode: VnodeWithDom) => { - vnode.children = [trust(vnode.props["v-html"])]; + "v-html": (value, vnode) => { + vnode.children = [trust(value as string)]; }, // The "v-model" directive binds the value of an input element to a model property - "v-model": (vnode: VnodeWithDom) => { - let [model, property, event]: any[] = vnode.props["v-model"]; + "v-model": (val, vnode) => { + // eslint-disable-next-line prefer-const + let [model, property, event]: any[] = val as any[]; let value; // This function updates the model property when the input element's value changes let handler = (e: Event) => (model[property] = (e.target as DomElement & Record).value); @@ -293,9 +301,8 @@ export const directives: Record = { ); }, - "v-create": (vnode: VnodeWithDom, oldProps: VnodeProperties | null) => { + "v-create": (callback, vnode, oldProps) => { if (!oldProps) { - const callback = vnode.props["v-create"]; const cleanup = callback(vnode); if (typeof cleanup === "function") { @@ -304,9 +311,8 @@ export const directives: Record = { } }, - "v-update": (vnode: VnodeWithDom, oldProps: VnodeProperties | null) => { + "v-update": (callback, vnode, oldProps) => { if (oldProps) { - const callback = vnode.props["v-update"]; const cleanup = callback(vnode, oldProps); if (typeof cleanup === "function") { @@ -315,14 +321,11 @@ export const directives: Record = { } }, - "v-cleanup": (vnode: VnodeWithDom) => { - const callback = vnode.props["v-cleanup"]; + "v-cleanup": (callback, vnode) => { onCleanup(() => callback(vnode)); }, - // Frequent used properties - class: (vnode: VnodeWithDom) => { - const value = vnode.props.class; + "v-class": (value, vnode) => { if (typeof value === "string") { vnode.dom.className = value; } else if (Array.isArray(value)) { @@ -336,17 +339,27 @@ export const directives: Record = { } }, - id: (vnode: VnodeWithDom) => { - vnode.dom.id = vnode.props.id; + // Frequent used properties + class(value, vnode) { + if (vnode.dom.className !== value) { + vnode.dom.className = value; + } + }, + + className(value, vnode) { + directives.class(value, vnode, null); }, - style: (vnode: VnodeWithDom) => { - const value = vnode.props.style; + id: (value, vnode) => { + vnode.dom.id = value; + }, + + style: (value, vnode) => { if (typeof value === "string") { - vnode.dom.style.cssText = value; + vnode.dom.style = value; } else if (typeof value === "object") { + vnode.dom.style = ""; const domStyle = vnode.dom.style; - domStyle.cssText = ""; for (const name in value) { domStyle[name] = value[name]; } @@ -373,6 +386,7 @@ function eventListener(e: Event) { oldProps[name](e, dom); if (!e.defaultPrevented) { + // eslint-disable-next-line no-use-before-define update(); } return; @@ -435,7 +449,7 @@ function addProperties(vnode: VnodeWithDom, oldProps: VnodeProperties | null) { const vnodeProps = vnode.props; for (const name in vnodeProps) { if (directives[name]) { - if (directives[name](vnode, oldProps) === false) { + if (directives[name](vnodeProps[name], vnode, oldProps) === false) { break; } continue; @@ -449,20 +463,19 @@ function addProperties(vnode: VnodeWithDom, oldProps: VnodeProperties | null) { } } -function updateAttributes(newVnode: VnodeWithDom, oldProps: VnodeProperties | null): void { +export function updateAttributes(newVnode: VnodeWithDom, oldProps: VnodeProperties | null): void { removeAttributes(newVnode, oldProps); addProperties(newVnode, oldProps); } -function createElement(tag: string, isSVG: boolean): DomElement { +export function createElement(tag: string, isSVG: boolean): DomElement { return isSVG ? document.createElementNS("http://www.w3.org/2000/svg", tag) : (document.createElement(tag) as DomElement); } -function flatTree(newVnode: VnodeWithDom) { +function flatTree(newVnode: VnodeWithDom, children: Children) { current.vnode = newVnode; - const { children } = newVnode; let i = 0; while (i < children.length) { @@ -484,9 +497,13 @@ function flatTree(newVnode: VnodeWithDom) { } if (typeof newChild.tag !== "string") { - const component = ("view" in newChild.tag ? newChild.tag.view : newChild.tag).bind(newChild.tag); - current.component = component; - children[i] = component(newChild.props, newChild.children); + const component = newChild.tag; + + current.component = newChild.tag; + children[i] = ("view" in component ? component.view : component).bind(component)( + newChild.props, + newChild.children + ); continue; } else { newChild.isSVG = newVnode.isSVG || newChild.tag === "svg"; @@ -495,20 +512,28 @@ function flatTree(newVnode: VnodeWithDom) { i++; } + + return children; } -function createNewElement(newChild: any, newVnode: VnodeWithDom, oldChild: DomElement | null) { - if (newChild instanceof Vnode === false) { - const dom = document.createTextNode(newChild); - if (oldChild) { - newVnode.dom.replaceChild(dom, oldChild); - } else { - newVnode.dom.appendChild(dom); +function handleVFor(newVnode: VnodeWithDom) { + if ("v-for" in newVnode.props) { + const set = newVnode.props["v-for"]; + const children = []; + const callback = newVnode.children[0]; + children.length = set.length; + + for (let i = 0, l = set.length; i < l; i++) { + children[i] = callback(set[i], i); } - return; + + return children; } + return [...newVnode.children]; +} - const dom = createElement(newChild.tag, newChild.isSVG); +function createNewElement(newChild: VnodeWithDom, newVnode: VnodeWithDom, oldChild: DomElement | null) { + const dom = createElement(newChild.tag, newChild.isSVG as boolean); if (oldChild) { newVnode.dom.replaceChild(dom, oldChild); } else { @@ -517,28 +542,34 @@ function createNewElement(newChild: any, newVnode: VnodeWithDom, oldChild: DomEl newChild.dom = dom; addProperties(newChild, null); newChild.dom.props = newChild.props; - flatTree(newChild); - const children = newChild.children; + if ("v-text" in newChild.props) { + newChild.dom.textContent = newChild.props["v-text"]; + return; + } + + const children = flatTree(newChild, handleVFor(newChild)); if (children.length === 0) { newChild.dom.textContent = ""; return; } for (let i = 0, l = children.length; i < l; i++) { + if (children[i] instanceof Vnode === false) { + newChild.dom.appendChild(document.createTextNode(children[i])); + continue; + } createNewElement(children[i], newChild, null); } - children.length = 0; } -function patchKeyed(newVnode: VnodeWithDom) { - const oldTree = newVnode.dom.childNodes as unknown as DomElement[]; +function patchKeyed(newVnode: VnodeWithDom, children: Children) { + const oldTree = [...Array.from(newVnode.dom.childNodes)] as unknown as DomElement[]; + const childNodes = newVnode.dom.childNodes; const oldKeyedList: Record = {}; const newKeyedList: Record = {}; - const children = newVnode.children; for (let i = 0, l = oldTree.length; i < l; i++) { - const oldChild = oldTree[i]; - const oldProps = oldChild.props; + const oldProps = oldTree[i].props; if (oldProps) { oldKeyedList[oldProps.key as string] = i; } @@ -550,58 +581,62 @@ function patchKeyed(newVnode: VnodeWithDom) { for (let i = 0, l = children.length; i < l; i++) { const newChild = children[i]; - const oldIndex = oldKeyedList[newChild.props.key]; - const oldChild = oldTree[oldIndex]; + const oldChild = oldTree[oldKeyedList[newChild.props.key as string]]; if (!oldChild) { - createNewElement(newChild, newVnode, null); + createNewElement(newChild, newVnode, childNodes[i] as DomElement | null); continue; } newChild.dom = oldChild; - if (newVnode.dom.childNodes[i] !== newChild.dom) { - newVnode.dom.insertBefore(newChild.dom, newVnode.dom.childNodes[i]); + const currentChild = childNodes[i]; + if (!currentChild) { + newVnode.dom.appendChild(oldChild); + } else if (currentChild !== oldChild) { + newVnode.dom.replaceChild(oldChild, currentChild); } - const oldProps = oldChild.props; - newChild.dom = oldChild as DomElement; - oldChild.props = newChild.props; + if ("v-keep" in newChild.props === false || oldChild.props["v-keep"] !== newChild.props["v-keep"]) { + updateAttributes(newChild as VnodeWithDom, oldChild.props); + oldChild.props = newChild.props; - if (oldProps && "v-keep" in newChild.props && newChild.props["v-keep"] === oldProps["v-keep"]) { - continue; + if ("v-text" in newChild.props) { + // eslint-disable-next-line eqeqeq + if (oldChild.textContent != newChild.props["v-text"]) { + oldChild.textContent = newChild.props["v-text"]; + } + continue; + } + // eslint-disable-next-line no-use-before-define + patch(newChild as VnodeWithDom); } - - updateAttributes(newChild as VnodeWithDom, oldProps || null); - patch(newChild); } - // Remove any old nodes not in the new tree - for (let i = 0, l = oldTree.length; i < l; i++) { - const oldChild = oldTree[i]; - const oldProps = oldChild.props; - if (oldProps && !newKeyedList[oldProps.key as string]) { - oldChild.remove(); - } + for (let i = children.length, l = childNodes.length; i < l; i++) { + childNodes[i]?.remove(); } } +// eslint-disable-next-line complexity export function patch(newVnode: VnodeWithDom): void { - flatTree(newVnode); - const children = newVnode.children; + const children = flatTree(newVnode, handleVFor(newVnode)); + + const dom = newVnode.dom; if (children.length === 0) { - newVnode.dom.textContent = ""; + if (dom.childNodes.length) { + dom.textContent = ""; + } return; } - const oldDomChildren = newVnode.dom.childNodes as unknown as DomElement[]; + const oldDomChildren = dom.childNodes as unknown as DomElement[]; const oldChildrenLength = oldDomChildren.length; if (oldChildrenLength > 0) { const firstOldProps = oldDomChildren[0].props; const firstVnode = children[0] as VnodeWithDom; if (firstOldProps && firstVnode instanceof Vnode && "key" in firstVnode.props && "key" in firstOldProps) { - patchKeyed(newVnode); - children.length = 0; + patchKeyed(newVnode, children); return; } } @@ -609,32 +644,42 @@ export function patch(newVnode: VnodeWithDom): void { const childrenLength = children.length; if (oldChildrenLength === 0) { for (let i = 0; i < childrenLength; i++) { + if (children[i] instanceof Vnode === false) { + dom.appendChild(document.createTextNode(children[i])); + continue; + } createNewElement(children[i], newVnode, null); } - children.length = 0; return; } for (let i = 0; i < childrenLength; i++) { const oldChild = oldDomChildren[i]; const newChild = children[i]; - if (!oldChild) { - createNewElement(newChild, newVnode, null); - continue; - } if (newChild instanceof Vnode === false) { + if (!oldChild) { + newVnode.dom.appendChild(document.createTextNode(newChild)); + continue; + } + if (oldChild.nodeType !== 3) { newVnode.dom.replaceChild(document.createTextNode(newChild), oldChild); continue; } + // eslint-disable-next-line eqeqeq if (oldChild.nodeValue != newChild) { oldChild.nodeValue = newChild; } continue; } + if (!oldChild) { + createNewElement(newChild, newVnode, null); + continue; + } + if ("v-keep" in newChild.props) { if (oldChild.props && oldChild.props["v-keep"] === newChild.props["v-keep"]) { continue; @@ -655,25 +700,24 @@ export function patch(newVnode: VnodeWithDom): void { newChild.dom = oldChild; updateAttributes(newChild as VnodeWithDom, oldChild.props || null); oldChild.props = newChild.props; + if ("v-text" in newChild.props) { + // eslint-disable-next-line eqeqeq + if (newChild.dom.textContent != newChild.props["v-text"]) { + newChild.dom.textContent = newChild.props["v-text"]; + } + continue; + } patch(newChild); } for (let i = childrenLength, l = oldDomChildren.length; i < l; i++) { oldDomChildren[i]?.remove(); } - - children.length = 0; -} - -export function update(): void | string { - if (mainVnode) { - mainVnode.children = [mainComponent]; - return updateVnode(mainVnode); - } } export function updateVnode(vnode: VnodeWithDom): string | void { callSet(onCleanupSet); + vnode.props = vnode.props || {}; patch(vnode); callSet(isMounted ? onUpdateSet : onMountSet); isMounted = true; @@ -684,9 +728,16 @@ export function updateVnode(vnode: VnodeWithDom): string | void { } } +export function update(): void | string { + if (mainVnode) { + mainVnode.children = [mainComponent]; + return updateVnode(mainVnode); + } +} + export function unmount() { if (mainVnode) { - mainComponent = new Vnode(() => null, {}, []) as VnodeComponentInterface; + mainComponent = v(() => null, {}) as VnodeComponentInterface; const result = update(); callSet(onUnmountSet); for (const name in eventListenerNames) { @@ -699,6 +750,7 @@ export function unmount() { isMounted = false; current.vnode = null; current.component = null; + current.event = null; return result; } } @@ -706,22 +758,15 @@ export function unmount() { export function mount(dom: string | DomElement, component: any) { const container = typeof dom === "string" ? (isNodeJs ? createElement(dom, dom === "svg") : document.querySelector(dom)) : dom; - const vnodeComponent = isVnodeComponent(component) - ? component - : isComponent(component) - ? new Vnode(component, {}, []) - : new Vnode(() => component, {}, []); - if (mainComponent && mainComponent.tag !== vnodeComponent.tag) { - unmount(); + + if (isComponent(component)) { + mainComponent = new Vnode(component, {}, []) as VnodeComponentInterface; + } else if (isVnodeComponent(component)) { + mainComponent = component; + } else { + mainComponent = new Vnode(() => component, {}, []) as VnodeComponentInterface; } - mainComponent = vnodeComponent as VnodeComponentInterface; - mainVnode = domToVnode(container); + mainVnode = domToVnode(container) as VnodeWithDom; return update(); } - -export function v(tagOrComponent: string | Component, props: VnodeProperties, ...children: Children) { - return new Vnode(tagOrComponent, props, children); -} - -v.fragment = (_: VnodeProperties, ...children: Children) => children; diff --git a/lib/interfaces.ts.bak b/lib/interfaces.ts.bak deleted file mode 100644 index f9c38f1..0000000 --- a/lib/interfaces.ts.bak +++ /dev/null @@ -1,141 +0,0 @@ -/* eslint-disable no-use-before-define */ -/* eslint-disable no-unused-vars */ -declare module "valyrian.js" { - interface DefaultRecord extends Record {} - - // The VnodeProperties interface represents properties that can be passed to a virtual node. - export interface VnodeProperties extends DefaultRecord { - // A unique key for the virtual node, which can be a string or a number. - // This is useful for optimizing updates in a list of nodes. - key?: string | number; - // A state object that is associated with the virtual node. - state?: any; - } - - // The DomElement interface extends the Element interface with an index signature. - // This allows for any additional properties to be added to DOM elements. - export interface DomElement extends Element, DefaultRecord {} - - // The VnodeInterface represents a virtual node. It has a number of optional fields, - // including a tag, props, children, and a DOM element. - export interface VnodeInterface extends DefaultRecord { - // The constructor for the virtual node. It takes a tag, props, and children as arguments. - // The tag can be a string, a component, or a POJO component. - // eslint-disable-next-line no-unused-vars - new (tag: string | Component | POJOComponent, props: VnodeProperties, children: Children): VnodeInterface; - // The tag for the virtual node. It can be a string, a component, or a POJO component. - tag: string | Component | POJOComponent; - // The props for the virtual node. - props: VnodeProperties; - // The children for the virtual node. - children: Children; - // A boolean indicating whether the virtual node is an SVG element. - isSVG?: boolean; - // The DOM element that corresponds to the virtual node. - dom?: DomElement; - // A boolean indicating whether the virtual node has been processed in the keyed diffing algorithm. - processed?: boolean; - } - - // The VnodeWithDom interface represents a virtual node that has a DOM element associated with it. - export interface VnodeWithDom extends VnodeInterface { - dom: DomElement; - } - - // The Component interface represents a function that returns a virtual node or a list of virtual nodes. - // It can also have additional properties. - export interface Component extends DefaultRecord { - // The function that returns a virtual node or a list of virtual nodes. - // It can take props and children as arguments. - // eslint-disable-next-line no-unused-vars - (props?: VnodeProperties | null, ...children: any[]): VnodeInterface | Children | any; - } - - // The POJOComponent interface represents a "plain old JavaScript object" (POJO) component. - // It has a view function that returns a virtual node or a list of virtual nodes, - // as well as optional props and children. - // It can be used also to identify class instance components. - export interface POJOComponent extends DefaultRecord { - // The view function that returns a virtual node or a list of virtual nodes. - view: Component; - // The props for the component. - props?: VnodeProperties | null; - // The children for the component. - children?: any[]; - } - - // The VnodeComponentInterface represents a virtual node that has a component as its tag. - // It has props and children, just like a regular virtual node. - export interface VnodeComponentInterface extends VnodeInterface { - tag: Component | POJOComponent; - props: VnodeProperties; - children: Children; - } - - // The Children interface represents a list of virtual nodes or other values. - export interface Children extends Array {} - - // The Directive interface represents a function that can be applied to a virtual node. - // It receives the value, virtual node, and old virtual node as arguments, and can return a boolean value. - // If only the virtual node is passed, it means its the on create phase for the v-node. - // If the old virtual node is also passed, it means its the on update phase for the v-node. - export interface Directive { - // eslint-disable-next-line no-unused-vars - (value: any, vnode: VnodeWithDom, oldVnode?: VnodeWithDom): void | boolean; - } - - // The Directives interface is a mapping of directive names to Directive functions. - export interface Directives extends Record {} - - // The ReservedProps interface is a mapping of reserved prop names to the value `true`. - // These prop names cannot be used as custom prop names. - export interface ReservedProps extends Record {} - - // The Current interface represents the current component and virtual node that are being processed. - export interface Current { - // The current component. It can be a component, a POJO component, or null. - component: Component | POJOComponent | null; - // The current virtual node. It must have a DOM element associated with it. - vnode: VnodeWithDom | null; - // The old virtual node. It must have a DOM element associated with it. - oldVnode?: VnodeWithDom | null; - // The current event. It can be an event or null. - event: Event | null; - } - - // The V function is the main function for creating virtual nodes. - // It takes a tag or component, props, and children as arguments, and returns a virtual node. - export interface V { - // eslint-disable-next-line no-unused-vars, no-use-before-define - (tagOrComponent: string | Component | POJOComponent, props: VnodeProperties | null, ...children: Children): - | VnodeInterface - | VnodeComponentInterface; - // eslint-disable-next-line no-unused-vars, no-use-before-define - fragment(_: any, ...children: Children): Children; - } - - export let isNodeJs: boolean; - export function createDomElement(tag: string, isSVG?: boolean): DomElement; - export const Vnode: VnodeInterface; - export function isComponent(component: any): component is Component; - export const isVnode: (object?: unknown | VnodeInterface) => object is VnodeInterface; - export const isVnodeComponent: (object?: unknown | VnodeComponentInterface) => object is VnodeComponentInterface; - export function domToVnode(dom: any): VnodeWithDom; - export function trust(htmlString: string): any; - export const current: Current; - export const reservedProps: Record; - export function onMount(callback: any): void; - export function onUpdate(callback: any): void; - export function onCleanup(callback: any): void; - export function onUnmount(callback: any): void; - export const directives: Directives; - export function directive(name: string, directive: Directive): void; - export function setAttribute(name: string, value: any, newVnode: VnodeWithDom, oldVnode?: VnodeWithDom): void; - export function updateAttributes(newVnode: VnodeWithDom, oldVnode?: VnodeWithDom): void; - export function patch(newVnode: VnodeWithDom, oldVnode?: VnodeWithDom): void; - export function update(): void | string; - export function updateVnode(vnode: VnodeWithDom, oldVnode: VnodeWithDom): string | void; - export function unmount(): string | void; - export function mount(dom: any, component: any): string | void; - export const v: V; -} diff --git a/lib/node/utils/tree-adapter.ts b/lib/node/utils/tree-adapter.ts index d8d359d..fa7e96b 100644 --- a/lib/node/utils/tree-adapter.ts +++ b/lib/node/utils/tree-adapter.ts @@ -93,6 +93,11 @@ export class Node implements Node { } return child; } + + remove(): Node { + return this.parentNode ? this.parentNode.removeChild(this) : this; + } + cloneNode(deep?: boolean | undefined): Node { if (this.nodeType === 3) { return new Text(this.nodeValue); @@ -324,10 +329,22 @@ export class Element extends Node { throw new Error("Cannot set style"); } + get className(): string { + return this.getAttribute("class") || ""; + } + + set className(value: string | boolean) { + if (value == null || value === false) { + this.removeAttribute("class"); + } else { + this.setAttribute("class", String(value)); + } + } + classList = { toggle: (item: any, force: any) => { if (item) { - const classes = (this.getAttribute("class") || "").split(" "); + const classes = (this.className || "").split(" "); const itemIndex = classes.indexOf(item); if (force && itemIndex === -1) { classes.push(item); @@ -339,14 +356,26 @@ export class Element extends Node { const final = classes.join(" ").trim(); if (final.length) { - this.setAttribute("class", classes.join(" ").trim()); + this.className = classes.join(" ").trim(); } else { - this.removeAttribute("class"); + this.className = false; } } } }; + get id(): string { + return this.getAttribute("id") || ""; + } + + set id(value: string | boolean) { + if (value == null || value === false) { + this.removeAttribute("id"); + } else { + this.setAttribute("id", String(value)); + } + } + set textContent(text) { this.nodeValue = String(text); this.childNodes = this.nodeValue ? [new Text(this.nodeValue)] : []; diff --git a/lib/router/index.ts b/lib/router/index.ts index c052170..0e9e5dd 100644 --- a/lib/router/index.ts +++ b/lib/router/index.ts @@ -344,8 +344,9 @@ export function mountRouter(elementContainer: string | any, router: Router): voi onPopStateGoToRoute(); } - directive("route", (url: string, vnode: VnodeWithDom, oldnode?: VnodeWithDom): void => { - setAttribute("href", url, vnode, oldnode); - setAttribute("onclick", router.getOnClickHandler(url), vnode, oldnode); + directive("route", (vnode: VnodeWithDom): void => { + const url = vnode.props["v-route"]; + setAttribute("href", url, vnode); + setAttribute("onclick", router.getOnClickHandler(url), vnode); }); } diff --git a/lib/signal/index.ts b/lib/signal/index.ts index 7eb541a..397abab 100644 --- a/lib/signal/index.ts +++ b/lib/signal/index.ts @@ -1,161 +1,86 @@ -import { VnodeWithDom, current, onUnmount, updateVnode, v } from "valyrian.js"; - -interface GetterInterface { - (): any; -} - -interface SetterInterface { - (value: any): void; -} - -interface SubscribeInterface { - (callback: Function): void; -} - -interface SubscriptionsInterface extends Array {} - -export interface SignalInterface extends Array { - 0: GetterInterface; - 1: SetterInterface; - 2: SubscribeInterface; - 3: SubscriptionsInterface; -} - -// eslint-disable-next-line sonarjs/cognitive-complexity -export function Signal(initialValue: any): SignalInterface { - // Create a copy of the current context object - const { vnode, component } = { ...current }; - - // Check if the context object has a vnode property - if (vnode && component) { - // Is first call - if (!vnode.components) { - // Set the components property to an empty array - vnode.components = []; +import { updateVnode, current, VnodeWithDom, onCleanup, POJOComponent, Component, onUnmount } from "valyrian.js"; + +type getter = () => any; +type setter = (newValue: any) => void; +type unsubscribe = () => void; +type subscribe = (callback: () => void) => unsubscribe; +type subscriptions = Set<() => void>; +type signal = [getter, setter, subscribe, subscriptions]; + +type SignalCalls = { + signals: signal[]; + signal_calls: number; +}; + +const componentToSignalsWeakMap = new WeakMap(); + +// Signal is a generic function that creates a reactive state with a getter, setter, and subscribe mechanism. +export function Signal(initialValue: T): signal { + if (current.component) { + if (componentToSignalsWeakMap.has(current.component) === false) { + const SignalCalls = { signals: [], signal_calls: -1 }; + componentToSignalsWeakMap.set(current.component, SignalCalls); + onUnmount(() => componentToSignalsWeakMap.delete(current.component as Component | POJOComponent)); } - // Check if the components array of the vnode object does not contain the component object - if (vnode.components.indexOf(component) === -1) { - // Set the calls property to -1 - vnode.signal_calls = -1; - // Add the component to the components array - vnode.components.push(component); - - // Check if the component object has a signals property - if (!component.signals) { - // Set the signals property of the component object to an empty array - component.signals = []; - // Add a function to the cleanup stack that removes the signals property from the component object - onUnmount(() => Reflect.deleteProperty(component, "signals")); - } - } + const SignalCalls = componentToSignalsWeakMap.get(current.component) as SignalCalls; + onCleanup(() => (SignalCalls.signal_calls = -1)); - // Assign the signal variable to the signal stored at the index of the vnode object's calls property in the vnode's signals array - const signal: SignalInterface = component.signals[++vnode.signal_calls]; + const signal = SignalCalls.signals[++SignalCalls.signal_calls]; - // If a signal has already been assigned to the signal variable, return it if (signal) { - // Remove all subscriptions because we come from a new render - signal[3].length = 0; - - // Return the signal - return signal; + // Return the signal if it already exists. + // But without the subscribe function. This is to prevent the subscribe function from being called multiple times. + const fakeSubscribe = (() => {}) as unknown as subscribe; + return [signal[0], signal[1], fakeSubscribe, signal[3]]; } } - // Declare a variable to store the current value of the Signal - let value = initialValue; - - // Create an array to store functions that have subscribed to changes to the Signal's value - const subscriptions: SubscriptionsInterface = []; + // The current value of the signal is stored in a closure to maintain state. + let value: T = initialValue; + // Subscribers is a Set of functions to be called whenever the value changes. + const subscribers: subscriptions = new Set(); - // Define a function that allows other parts of the code to subscribe to changes to the Signal's value - const subscribe = (callback: Function) => { - // Add the callback function to the subscriptions array if it is not already in the array - if (subscriptions.indexOf(callback) === -1) { - subscriptions.push(callback); - } + // subscribe is a function that allows a subscriber to listen to changes in the signal's value. + // It returns an unsubscribe function to stop listening to changes. + const subscribe = (callback: () => void) => { + subscribers.add(callback); + return () => subscribers.delete(callback); }; - // Set the vnodes to update when the Signal's value changes - const vnodesToUpdate: Array = []; - - // This is the function that will be called when the Signal's value changes - const updateVnodes = () => { - // Create a copy of the vnodesToUpdate array and filter out any duplicate vnodes - const vnodesToUpdateCopy = vnodesToUpdate.filter((vnode, index, self) => { - return self.findIndex((v) => v.dom === vnode.dom) === index; - }); - - // Loop through the vnodesToUpdate array - for (let i = 0, l = vnodesToUpdateCopy.length; i < l; i++) { - const vnode2 = vnodesToUpdateCopy[i]; - // If it does, create a new vnode object based on the original vnode, its children, and its DOM and SVG properties - const newVnode = v(vnode2.tag, vnode2.props, ...vnode2.initialChildren) as VnodeWithDom; - newVnode.dom = vnode2.dom; // Set the new vnode object's DOM property to the old vnode object's DOM property - newVnode.isSVG = vnode2.isSVG; // Set the new vnode object's isSVG property to the old vnode object's isSVG property - - // Update the vnode object - updateVnode(newVnode, vnode2); - } - }; + const domToVnodesToUpdate: Map = new Map(); + const updateVnodes = () => domToVnodesToUpdate.forEach((vnode) => updateVnode(vnode)); - // Define a function that returns the current value of the Signal - function get() { - // Get the current vnode from the context object - const { vnode: vnode2 } = current; - - // If we have a current vnode, it means that a get function is being called from within a component - // so we subscribe the vnode to be updated when the Signal's value changes - if (vnode2 && vnodesToUpdate.indexOf(vnode2) === -1) { - // We set the initialChildren to a copy of the vnode's children array - // This is the case when the vnode is a component that has not been rendered yet and we need the initial children - // because they could have the components that are using the Signal - if (!vnode2.initialChildren) { - vnode2.initialChildren = [...vnode2.children]; - } - - // Add the vnode to the vnodesToUpdate array - vnodesToUpdate.push(vnode2); - - // Subscribe the updateVnodes function to the Signal + // getValue is a function that returns the current value of the signal. + const getValue = () => { + if (current.vnode) { + const vnode = current.vnode as VnodeWithDom; + domToVnodesToUpdate.set(vnode.dom, vnode); subscribe(updateVnodes); } - - // Return the current value of the Signal return value; - } + }; - // Define a function that allows the value of the Signal to be updated and notifies any subscribed functions of the change - const set = (newValue: any) => { - // If we have a current event on going, prevent the default action + // setValue is a function that updates the value of the signal and notifies subscribers. + const setValue = (newValue: any) => { if (current.event) { current.event.preventDefault(); } - // Just return if the new value is the same as the current value - if (newValue === value) { + if (value === newValue) { return; } - - // Update the value of the Signal value = newValue; - - // Call each subscribed function with the new value of the Signal as an argument - for (let i = 0, l = subscriptions.length; i < l; i++) { - subscriptions[i](value); - } + // Notify all subscribers by invoking their callback functions. + subscribers.forEach((subscriber) => subscriber()); }; - // Assign the signal variable an array containing the get, set, and subscribe functions - const signal: SignalInterface = [get, set, subscribe, subscriptions]; + const signal: signal = [getValue, setValue, subscribe, subscribers]; - // If the context object has a vnode property, add the signal to the vnode's signals array - // and add the subscriptions array to the vnode's subscriptions array - if (vnode && component) { - component.signals.push(signal); + if (current.component) { + const SignalCalls = componentToSignalsWeakMap.get(current.component) as SignalCalls; + SignalCalls.signals.push(signal); } - // Return the signal return signal; } diff --git a/test/directives_test.js b/test/directives_test.js index f50f0e8..f7ff664 100644 --- a/test/directives_test.js +++ b/test/directives_test.js @@ -22,13 +22,13 @@ describe("Directives", () => { it("should be able to get the vnode", () => { let newVnode; - let oldVnode; + let oldProps; const app = () =>
; - directive("test2", (v, vnode) => { + directive("test2", (v, vnode, old) => { newVnode = vnode; - oldVnode = vnode.dom.oldProps; + oldProps = old; }); mount("div", app); @@ -46,7 +46,7 @@ describe("Directives", () => { isSVG: false }); - expect(oldVnode).toEqual({ + expect(oldProps).toEqual({ "v-test2": true }); }); @@ -54,8 +54,8 @@ describe("Directives", () => { it("should be able to identify if this is first render or update", () => { const app = () =>
; - directive("render", (v, vnode) => { - if (!vnode.dom.oldProps) { + directive("render", (v, vnode, oldProps) => { + if (!oldProps) { vnode.children = ["First render, vnode created"]; } else { vnode.children = ["Second render, vnode updated"]; diff --git a/test/hyperscript_test.js b/test/hyperscript_test.js index 2e5f11c..21a478c 100644 --- a/test/hyperscript_test.js +++ b/test/hyperscript_test.js @@ -8,17 +8,14 @@ describe("Hyperscript", () => { it("should create a div element", () => { expect(v("div")).toEqual({ tag: "div", - props: {}, - children: [], - isSVG: false + children: [] }); }); it("should create a div element with a text child", () => { expect(v("div", null, "Hello")).toEqual({ tag: "div", - props: {}, - isSVG: false, + props: null, children: ["Hello"] }); }); @@ -26,13 +23,10 @@ describe("Hyperscript", () => { it("should create a div element with an element child", () => { expect(v("div", null, v("span"))).toEqual({ tag: "div", - props: {}, - isSVG: false, + props: null, children: [ { tag: "span", - props: {}, - isSVG: false, children: [] } ] @@ -42,8 +36,7 @@ describe("Hyperscript", () => { it("should create a div element with comma separated children", () => { expect(v("div", null, "Hello ", "world")).toEqual({ tag: "div", - props: {}, - isSVG: false, + props: null, children: ["Hello ", "world"] }); }); @@ -51,8 +44,7 @@ describe("Hyperscript", () => { it("should create a div element with array of children", () => { expect(v("div", null, ["Hello ", "world"])).toEqual({ tag: "div", - props: {}, - isSVG: false, + props: null, children: [["Hello ", "world"]] }); }); @@ -60,14 +52,12 @@ describe("Hyperscript", () => { it("should create a div element with mixed array of children and comma separated children", () => { expect(v("div", null, ["Hello ", "world"], v("span", null, "Whats up"))).toEqual({ tag: "div", - props: {}, - isSVG: false, + props: null, children: [ ["Hello ", "world"], { tag: "span", - props: {}, - isSVG: false, + props: null, children: ["Whats up"] } ] @@ -77,8 +67,7 @@ describe("Hyperscript", () => { it("should create a div element with mixed nested arrays of children ", () => { expect(v("div", null, ["Hello ", "world", ["Only", ["for", "this", ["time"]]]])).toEqual({ tag: "div", - props: {}, - isSVG: false, + props: null, children: [["Hello ", "world", ["Only", ["for", "this", ["time"]]]]] }); }); @@ -90,7 +79,6 @@ describe("Hyperscript", () => { id: "unique", class: "unique" }, - isSVG: false, children: [] }); }); @@ -115,8 +103,7 @@ describe("Hyperscript", () => { expect(v("div", null, [null, "Hello", , 1, date, { hello: "world" }, ["Hello"]])).toEqual({ tag: "div", - props: {}, - isSVG: false, + props: null, children: [[null, "Hello", undefined, 1, date, { hello: "world" }, ["Hello"]]] }); }); diff --git a/test/keyed_test.js b/test/keyed_test.js index 0ac3f2d..1812a86 100644 --- a/test/keyed_test.js +++ b/test/keyed_test.js @@ -4,7 +4,7 @@ import { mount, update, v } from "valyrian.js"; import expect from "expect"; -describe.skip("Keyed lists", () => { +describe("Keyed lists", () => { const set = [1, 2, 3, 4, 5]; const tests = [ { name: "Removed at the end", set: [1, 2, 3, 4] }, // Removed at the end diff --git a/test/mount_n_update_test.js b/test/mount_n_update_test.js index f953dc6..1e09973 100644 --- a/test/mount_n_update_test.js +++ b/test/mount_n_update_test.js @@ -90,7 +90,7 @@ describe("Mount and update", () => { ); }); - it.skip("Mount with class component", () => { + it("Mount with class component", () => { class Component { constructor() { this.id = "example"; @@ -105,7 +105,7 @@ describe("Mount and update", () => { const result = {}; - result.before = mount("body", ComponentInstance.view); + result.before = mount("body", ComponentInstance); ComponentInstance.world = "John Doe"; result.after = update(); @@ -125,7 +125,7 @@ describe("Mount and update", () => { }; const result = {}; - result.before = mount("body", Component.view); + result.before = mount("body", Component); Component.world = "John Doe"; result.after = update(); result.afteragain = update(); @@ -240,7 +240,7 @@ describe("Mount and update", () => { }); it("should fail silently if try to update before mount", () => { - const Component = () =>
Hello world
; + unmount(); update(); }); diff --git a/test/node_test.js b/test/node_test.js index f5d6600..6c94ee1 100644 --- a/test/node_test.js +++ b/test/node_test.js @@ -189,7 +189,7 @@ span.hello{display: inline-block} return /* @__PURE__ */ v("button", null, "Hello"); }`); - expect(component2).toMatch(`function(){return b("button",null,"Hello")}`); + expect(component2).toMatch(/function\(\)\{return \w\("button",null,"Hello"\)\}/); }); it("should convert jsx to hyperscript by default", async () => { @@ -201,6 +201,6 @@ span.hello{display: inline-block} return /* @__PURE__ */ v("button", null, "Hello"); }`); - expect(component2).toMatch(`function(){return b("button",null,"Hello")}`); + expect(component2).toMatch(/function\(\)\{return \w\("button",null,"Hello"\)\}/); }); }); diff --git a/test/signals_test.js b/test/signals_test.js index 58d24a6..7ed8f56 100644 --- a/test/signals_test.js +++ b/test/signals_test.js @@ -59,8 +59,8 @@ describe("Signal", () => { expect(div.innerHTML).toEqual("
1
"); expect(componentCalls).toEqual(2); increment(); - expect(componentCalls).toEqual(3); expect(div.innerHTML).toEqual("
2
"); + expect(componentCalls).toEqual(3); res = update(); expect(res).toEqual("
2
"); }); @@ -283,7 +283,7 @@ describe("Signal", () => { it("should handle change of components", async () => { let change = false; - const Counter = () => { + function Counter() { const [count, setCount] = Signal(0); const [name] = Signal("Hello"); const interval = setInterval(() => setCount(count() + 1), 10); @@ -293,9 +293,9 @@ describe("Signal", () => { {count()} {name()}
); - }; + } - const OtherCounter = () => { + function OtherCounter() { const [count, setCount] = Signal(10); const [name] = Signal("World"); const interval = setInterval(() => setCount(count() + 1), 10); @@ -305,7 +305,7 @@ describe("Signal", () => { {count()} {name()}
); - }; + } function Component() { return change ? : ; @@ -329,9 +329,38 @@ describe("Signal", () => { unmount(); }); - it("should handle a component with a v-for directive", () => { + it("should handle the update from different children", () => { const [count, setCount] = Signal(0); - const [items, setItems] = Signal([1, 2, 3]); + function Child({ id }) { + return
{count()}
; + } + function Child2({ id }) { + return
{count()}
; + } + function Component() { + return ( +
+
+ +
+
+ +
+
+ ); + } + const div = document.createElement("div"); + const result = mount(div, Component); + expect(result).toEqual('
0
0
'); + setCount(1); + expect(div.innerHTML).toEqual('
1
1
'); + setCount(2); + expect(div.innerHTML).toEqual('
2
2
'); + }); + + it("should handle a component with a v-for directive", () => { + const [count, setCount] = Signal(0, "count"); + const [items, setItems] = Signal([1, 2, 3], "items"); let mainComponentCalls = 0; let itemComponentCalls = 0; function Item({ item }) { @@ -354,24 +383,31 @@ describe("Signal", () => { setCount(1); expect(div.innerHTML).toEqual("
1
2
3 1
"); expect(mainComponentCalls).toEqual(1); - expect(itemComponentCalls).toEqual(4); // Only the third item component should be called again + expect(itemComponentCalls).toEqual(6); // All item components should be called again setItems([1, 2, 3, 4]); expect(div.innerHTML).toEqual("
1
2
3 1
4
"); expect(mainComponentCalls).toEqual(2); - expect(itemComponentCalls).toEqual(8); // All item components should be called again plus the new one + expect(itemComponentCalls).toEqual(10); // All item components should be called again plus the new one setCount(2); expect(div.innerHTML).toEqual("
1
2
3 2
4
"); expect(mainComponentCalls).toEqual(2); - expect(itemComponentCalls).toEqual(9); // Only the third item component should be called again + expect(itemComponentCalls).toEqual(14); // All item components should be called again setCount(3); + expect(div.innerHTML).toEqual("
1
2
3 3
4
"); expect(mainComponentCalls).toEqual(2); - expect(itemComponentCalls).toEqual(10); // Only the third item component should be called again + expect(itemComponentCalls).toEqual(18); // All item components should be called again setItems([1, 2, 3, 4]); + expect(div.innerHTML).toEqual("
1
2
3 3
4
"); expect(mainComponentCalls).toEqual(3); - expect(itemComponentCalls).toEqual(14); // All item components should be called again + expect(itemComponentCalls).toEqual(22); // All item components should be called again setCount(4); + expect(div.innerHTML).toEqual("
1
2
3 4
4
"); expect(mainComponentCalls).toEqual(3); - expect(itemComponentCalls).toEqual(15); //Only the third item component should be called again + expect(itemComponentCalls).toEqual(26); // All item components should be called again + setItems([1, 2, 3]); + expect(div.innerHTML).toEqual("
1
2
3 4
"); + expect(mainComponentCalls).toEqual(4); + expect(itemComponentCalls).toEqual(29); // All item components should be called again }); it("should handle a component with a v-for directive and child components", () => { @@ -413,42 +449,20 @@ describe("Signal", () => { expect(mainComponentCalls).toEqual(2); expect(itemComponentCalls).toEqual(9); // Only the third item component should be called again setCount(3); + expect(div.innerHTML).toEqual("
1
2
3 3
4
"); expect(mainComponentCalls).toEqual(2); expect(itemComponentCalls).toEqual(10); // Only the third item component should be called again setItems([1, 2, 3, 4]); + expect(div.innerHTML).toEqual("
1
2
3 3
4
"); expect(mainComponentCalls).toEqual(3); expect(itemComponentCalls).toEqual(14); // All item components should be called again setCount(4); + expect(div.innerHTML).toEqual("
1
2
3 4
4
"); expect(mainComponentCalls).toEqual(3); expect(itemComponentCalls).toEqual(15); //Only the third item component should be called again - }); - - it("should handle the update from different children", () => { - const [count, setCount] = Signal(0); - function Child({ id }) { - return
{count()}
; - } - function Child2({ id }) { - return
{count()}
; - } - function Component() { - return ( -
-
- -
-
- -
-
- ); - } - const div = document.createElement("div"); - const result = mount(div, Component); - expect(result).toEqual('
0
0
'); - setCount(1); - expect(div.innerHTML).toEqual('
1
1
'); - setCount(2); - expect(div.innerHTML).toEqual('
2
2
'); + setItems([1, 2, 3]); + expect(div.innerHTML).toEqual("
1
2
3 4
"); + expect(mainComponentCalls).toEqual(4); + expect(itemComponentCalls).toEqual(18); // All item components should be called again }); });