UNPKG

dom-reactive

Version:

A library for working with DOM with syntax similar to Vue.

1 lines 26.5 kB
{"version":3,"file":"index.mjs","sources":["../node_modules/mitt/dist/mitt.mjs","../index.ts"],"sourcesContent":["export default function(n){return{all:n=n||new Map,on:function(t,e){var i=n.get(t);i?i.push(e):n.set(t,[e])},off:function(t,e){var i=n.get(t);i&&(e?i.splice(i.indexOf(e)>>>0,1):n.set(t,[]))},emit:function(t,e){var i=n.get(t);i&&i.slice().map(function(n){n(e)}),(i=n.get(\"*\"))&&i.slice().map(function(n){n(t,e)})}}}\n//# sourceMappingURL=mitt.mjs.map\n","/**\n * @source https://github.com/artemsites/dom\n * @source https://gitverse.ru/artemsites/dom\n *\n * @api:\n * createScope - creating an object in the DOM for working with the library\n * ref - reactive state\n * data-class is an attribute of an HTML element for dynamic class management\n */\nimport mitt from \"mitt\";\n\nexport const emitter = mitt();\n\ntype Wrapper = any;\n\ninterface ComponentInstance {\n [key: string]: any;\n}\n\ninterface State {\n value: any;\n}\n\ndeclare global {\n interface Window {\n [key: string]: any;\n }\n}\n\nlet stateNamesHashes = new Map();\n\nlet createUUID = ()=>{}\nif (window && typeof window.crypto.randomUUID === 'function') {\n createUUID = window.crypto.randomUUID.bind(window.crypto)\n} else {\n createUUID = generateUniqueId\n}\n\nexport function createScope(\n scopeId: string,\n scope: ($wrapper: Element) => ComponentInstance,\n alias: string = \"\"\n) {\n const $wrapper = document.getElementById(scopeId);\n\n if ($wrapper) {\n const scopeInstance = scope($wrapper);\n\n // @note handle data-ref\n handlerRefsInDom($wrapper as Wrapper, scopeInstance);\n\n // @note handle data-click\n handlerClickReactive($wrapper, scopeInstance);\n\n // @note handle data-class\n handlerClassesReactive($wrapper, scopeInstance);\n\n // @note handle input[data-value]\n handlerInputDataValueReactive($wrapper, scopeInstance);\n\n // @note handle data-change\n handlerChangeReactive($wrapper, scopeInstance);\n\n // @note handle data-input\n handlerInputReactive($wrapper, scopeInstance);\n\n if (alias !== \"\") {\n window[alias] = scopeInstance;\n } else {\n window[scopeId] = scopeInstance;\n }\n } else {\n // console.warn(\"Not found wrapper: #\" + scopeId);\n }\n}\n\nexport function createComponent(wrapperClass: string, component: ($wrapper: Element) => {}) {\n const wrappers = document.getElementsByClassName(\n wrapperClass\n ) as HTMLCollection;\n for (let $wrapper of wrappers) {\n if ($wrapper) {\n const componentInstance: ComponentInstance = component($wrapper);\n if (isObject(componentInstance)) {\n // @note handle data-ref\n handlerRefsInDom($wrapper as Wrapper, componentInstance);\n\n // @note handle data-click\n handlerClickReactive($wrapper as Wrapper, componentInstance);\n\n // @note handle data-class\n handlerClassesReactive($wrapper as Wrapper, componentInstance);\n\n // @note handle input[data-value]\n // ! @todo not tested!!!\n handlerInputDataValueReactive(\n $wrapper as Wrapper,\n componentInstance\n );\n\n // @note handle data-change\n handlerChangeReactive($wrapper as Wrapper, componentInstance);\n\n // @note handle data-input\n handlerInputReactive($wrapper, componentInstance);\n }\n } else {\n // console.warn(\"Not found wrapper: .\" + wrapperClass);\n }\n }\n}\n\nexport function ref(defaultValue: any): State {\n const stateNameHash = `state_${createUUID()}`;\n let state: State = { value: defaultValue };\n\n const proxyState = new Proxy<State>(state, {\n set(stateTarget, prop, valueNew) {\n if (prop === \"value\") {\n if (stateTarget[\"value\"] !== valueNew) {\n stateTarget[\"value\"] = valueNew;\n emitter.emit(stateNameHash, stateTarget);\n }\n return true;\n }\n return false;\n },\n });\n\n stateNamesHashes.set(proxyState, stateNameHash);\n\n emitter.emit(stateNameHash, proxyState);\n\n return proxyState;\n}\n\nfunction handlerRefsInDom($wrapper: Wrapper, instance: ComponentInstance) {\n const refsInDomAll = findAllByAttr(\"data-ref\", $wrapper);\n\n refsInDomAll.forEach(($refEl) => {\n const refName = $refEl.getAttribute(\"data-ref\");\n if (refName && instance[refName]) {\n instance[refName].value = $refEl;\n } else {\n // console.warn(\"The data-ref name was not found in: \", $refEl);\n }\n });\n}\n\nfunction handlerInputDataValueReactive(\n $wrapper: Wrapper,\n instance: ComponentInstance\n) {\n const dataValues = findAllByAttr(\"data-value\", $wrapper);\n\n dataValues.forEach(($dataValue) => {\n if ($dataValue instanceof HTMLInputElement) {\n const dataValue: string | null = $dataValue.getAttribute('data-value') || null;\n\n if (dataValue) {\n const jsExpressionWithPrefix: string = dataValue;\n let jsExpression = deleteWordPrefix(jsExpressionWithPrefix);\n const state = instance[jsExpression];\n if (state) {\n $dataValue.value = state.value;\n const stateNameHash = stateNamesHashes.get(state);\n emitter.on(stateNameHash, (newState: any) => {\n $dataValue.value = newState.value;\n });\n }\n }\n }\n });\n}\n\nfunction handlerClickReactive($wrapper: Wrapper, instance: ComponentInstance) {\n const elClicks = findAllByAttr(\"data-click\", $wrapper);\n\n if (elClicks.length) {\n elClicks.forEach(($elOnClick) => {\n let methodNameOnClick = $elOnClick.getAttribute('data-click');\n\n if (methodNameOnClick) {\n // ! Это для убирания префикса например header. - оно пока не мешает в случае если его нет вообще\n const methodNameOnClickWithoutPrefix =\n deleteWordPrefix(methodNameOnClick);\n\n const methodOnClick = instance[methodNameOnClickWithoutPrefix];\n if (methodOnClick) {\n $elOnClick.addEventListener(\"click\", function (e) {\n methodOnClick(e);\n });\n }\n } else {\n // console.warn(\n // \"The name of the data-click method was not found in: \",\n // $elOnClick\n // );\n }\n });\n }\n}\n\nfunction handlerChangeReactive($wrapper: Wrapper, instance: ComponentInstance) {\n const elChanges = findAllByAttr(\"data-change\", $wrapper);\n\n if (elChanges.length) {\n elChanges.forEach(($elOnchange) => {\n if ($elOnchange) {\n let methodNameOnChange = $elOnchange.getAttribute('data-change');\n if (methodNameOnChange) {\n // ! Это для убирания префикса например header. - оно пока не мешает в случае если его нет вообще\n const methodNameOnChangeWithoutPrefix =\n deleteWordPrefix(methodNameOnChange);\n const methodOnChange =\n instance[methodNameOnChangeWithoutPrefix];\n if (methodOnChange) {\n $elOnchange.addEventListener(\"change\", function (e) {\n methodOnChange(e);\n });\n }\n }\n } else {\n // console.warn(\n // \"The name of the data-click method was not found in: \",\n // $elOnchange\n // );\n }\n });\n }\n}\n\nfunction handlerInputReactive($wrapper: Wrapper, instance: ComponentInstance) {\n const elInputs = findAllByAttr(\"data-input\", $wrapper);\n if (elInputs.length) {\n elInputs.forEach(($elOnInput) => {\n if ($elOnInput) {\n let methodNameOnInput = $elOnInput.getAttribute('data-input');\n if (methodNameOnInput) {\n // ! Это для убирания префикса например header. - оно пока не мешает в случае если его нет вообще\n const methodNameOnInputWithoutPrefix =\n deleteWordPrefix(methodNameOnInput);\n const methodOnInput =\n instance[methodNameOnInputWithoutPrefix];\n if (methodOnInput) {\n $elOnInput.addEventListener(\"input\", function (e) {\n methodOnInput(e);\n });\n }\n }\n } else {\n // console.warn(\n // \"The name of the data-click method was not found in: \",\n // $elOnInput\n // );\n }\n });\n }\n}\n\nfunction handlerClassesReactive(\n $wrapper: Wrapper,\n instance: ComponentInstance\n) {\n const elClasses = findAllByAttr(\"data-class\", $wrapper);\n\n elClasses.forEach(($el) => {\n handlerClassesReactiveSubFunc1($el);\n });\n\n function handlerClassesReactiveSubFunc1($el: HTMLElement) {\n let jsonString = $el.getAttribute('data-class');\n if (jsonString) {\n // @todo deletion is necessary in another place so that one component does not delete the data-class of another component.\n // $el.removeAttribute(\"data-class\");\n\n let parsedJson;\n try {\n parsedJson = JSON.parse(jsonString);\n } catch (error) {\n console.error(error);\n throw new Error(\"Error at JSON string: \" + jsonString);\n }\n\n if (Array.isArray(parsedJson)) {\n for (let i in parsedJson) {\n let jsExpressionTernary = parsedJson[i];\n\n const regex = /(.+?)\\s*\\?\\s*(.+?)\\s*:\\s*(.+)/;\n const match = jsExpressionTernary.match(regex);\n\n let jsNameWithPrefix = match[1];\n const classNameTrue = match[2];\n const classNameFalse = match[3];\n const className = [classNameTrue, classNameFalse];\n\n handlerClassesReactiveSubFunc2(\n $el,\n className,\n jsNameWithPrefix\n );\n }\n } else if (isObject(parsedJson)) {\n for (let className in parsedJson) {\n let jsNameWithPrefix = parsedJson[className];\n\n handlerClassesReactiveSubFunc2(\n $el,\n className,\n jsNameWithPrefix\n );\n }\n }\n } else {\n // console.warn(\"The data-class JSON string was not found in: \", $el);\n }\n }\n\n function handlerClassesReactiveSubFunc2(\n $el: HTMLElement,\n className: string | string[],\n jsNameWithPrefix: string\n ) {\n let isRevertVal = false;\n if (jsNameWithPrefix[0] === \"!\") {\n isRevertVal = true;\n jsNameWithPrefix = jsNameWithPrefix.slice(1);\n }\n\n let jsExpression = deleteWordPrefix(jsNameWithPrefix);\n\n const isNotEqualExpression = jsExpression.includes(\"!=\");\n const isEqualExpression = jsExpression.includes(\"==\");\n if (isNotEqualExpression || isEqualExpression) {\n if (isNotEqualExpression) {\n const regex = /!=/;\n const operator = \"!=\";\n splitExpressionAndCompareAndUpdateClassesReactive(\n jsExpression,\n regex,\n operator,\n isRevertVal,\n className,\n $el\n );\n } else if (isEqualExpression) {\n const regex = /==/;\n const operator = \"==\";\n splitExpressionAndCompareAndUpdateClassesReactive(\n jsExpression,\n regex,\n operator,\n isRevertVal,\n className,\n $el\n );\n }\n } else {\n const operator = \"==\";\n const jsName = jsExpression;\n const jsVal = true;\n compareAndUpdateClassesReactive(\n jsName,\n jsVal,\n operator,\n isRevertVal,\n className,\n $el\n );\n }\n }\n\n function splitExpressionAndCompareAndUpdateClassesReactive(\n jsExpression: any,\n regex: any,\n operator: any,\n isRevertVal: any,\n className: any,\n $el: any\n ) {\n const res = splitExpression(jsExpression, regex);\n if (res && res.length === 2) {\n const [jsName, jsVal] = res;\n compareAndUpdateClassesReactive(\n jsName,\n jsVal,\n operator,\n isRevertVal,\n className,\n $el\n );\n }\n }\n\n function compareAndUpdateClassesReactive(\n jsName: any,\n jsVal: any,\n operator: any,\n isRevertVal: any,\n className: any,\n $el: any\n ) {\n const state = instance[jsName];\n if (!state) {\n showWarnIfRefNotFound($wrapper, jsName);\n } else {\n const isTrue = compare(state.value, jsVal, operator);\n\n toggleClass(isTrue, className, $el, isRevertVal);\n const stateNameHash = stateNamesHashes.get(state);\n\n emitter.on(stateNameHash, (newState: any) => {\n const isTrue = compare(newState.value, jsVal, operator);\n toggleClass(isTrue, className, $el, isRevertVal);\n });\n }\n }\n\n function toggleClass(\n value: any,\n className: string | string[],\n where: HTMLElement,\n isRevertVal = false\n ) {\n try {\n const isTrue = (value && !isRevertVal) || (!value && isRevertVal);\n if (typeof className === \"string\") {\n if (isTrue) {\n where.classList.add(className);\n } else {\n where.classList.remove(className);\n }\n } else if (Array.isArray(className)) {\n const [classIfTrue, classIfFalse] = className;\n if (isTrue) {\n where.classList.remove(classIfFalse);\n where.classList.add(classIfTrue);\n } else {\n where.classList.remove(classIfTrue);\n where.classList.add(classIfFalse);\n }\n }\n } catch (error) {\n console.error(error);\n }\n }\n}\n\nfunction showWarnIfRefNotFound($wrapper: Wrapper, jsName: string) {\n const instanceId =\n \"#\" + $wrapper.getAttribute(\"id\") ||\n \".\" + $wrapper.getAttribute(\"class\");\n // console.warn(\n // `Ref ${jsName} is not exists at ${instanceId}. Perhaps the component is located in another component.`\n // );\n}\n\n// ! tools:\nfunction isObject(value: any) {\n return value !== null && typeof value === \"object\";\n}\n\nfunction deleteWordPrefix(strWithprefixWithDot: string) {\n return strWithprefixWithDot.replace(/^\\w+\\./, \"\");\n}\n\nfunction splitExpression(\n expression: string,\n regex: RegExp\n): [string, string] | null {\n const parts = expression.split(regex);\n\n if (parts.length === 2) {\n return [parts[0].trim(), parts[1].trim()];\n }\n\n return null;\n}\n\nfunction compare(value1: any, value2: any, operator: string) {\n switch (operator) {\n case \"!=\":\n return value1 != value2;\n case \"==\":\n return value1 == value2;\n case \"<\":\n return value1 < value2;\n case \">\":\n return value1 > value2;\n case \"<=\":\n return value1 <= value2;\n case \">=\":\n return value1 >= value2;\n default:\n throw new Error(\"Invalid operator\");\n }\n}\n\nfunction findAllByAttr(attr: string, $wrapper: HTMLElement) {\n const els = $wrapper.querySelectorAll(`[${attr}]`) as NodeListOf<\n HTMLElement | HTMLInputElement\n >;\n\n const elsAll = [...Array.from(els)];\n\n if ($wrapper.dataset && $wrapper.getAttribute(attr)) {\n elsAll.push($wrapper);\n }\n\n return elsAll;\n}\n\nfunction generateUniqueId() {\n // 4 - версия UUID\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n const r = Math.random() * 16 | 0;\n const v = c === 'x' ? r : (r & 0x3 | 0x8); // Установка варианта UUID\n return v.toString(16);\n });\n}\n"],"names":["mitt","n","t","e","i","emitter","stateNamesHashes","createUUID","generateUniqueId","createScope","scopeId","scope","alias","$wrapper","scopeInstance","handlerRefsInDom","handlerClickReactive","handlerClassesReactive","handlerInputDataValueReactive","handlerChangeReactive","handlerInputReactive","createComponent","wrapperClass","component","wrappers","componentInstance","isObject","ref","defaultValue","stateNameHash","state","proxyState","stateTarget","prop","valueNew","instance","findAllByAttr","$refEl","refName","$dataValue","dataValue","jsExpression","deleteWordPrefix","newState","elClicks","$elOnClick","methodNameOnClick","methodNameOnClickWithoutPrefix","methodOnClick","elChanges","$elOnchange","methodNameOnChange","methodNameOnChangeWithoutPrefix","methodOnChange","elInputs","$elOnInput","methodNameOnInput","methodNameOnInputWithoutPrefix","methodOnInput","$el","handlerClassesReactiveSubFunc1","jsonString","parsedJson","error","jsExpressionTernary","regex","match","jsNameWithPrefix","classNameTrue","classNameFalse","handlerClassesReactiveSubFunc2","className","isRevertVal","isNotEqualExpression","isEqualExpression","splitExpressionAndCompareAndUpdateClassesReactive","compareAndUpdateClassesReactive","operator","res","splitExpression","jsName","jsVal","showWarnIfRefNotFound","isTrue","compare","toggleClass","value","where","classIfTrue","classIfFalse","strWithprefixWithDot","expression","parts","value1","value2","attr","els","elsAll","c","r"],"mappings":"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","x_google_ignoreList":[0]}