UNPKG

dom-reactive

Version:

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

1 lines 26.7 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: (e) => 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: (e) => {}) {\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 at JSON string: \" + jsonString);\n console.error(error);\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","instanceId","strWithprefixWithDot","expression","parts","value1","value2","attr","els","elsAll","c","r"],"mappings":"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","x_google_ignoreList":[0]}