compomint
Version:
A lightweight JavaScript component engine for building web applications with a focus on component-based architecture and template system.
3 lines (2 loc) • 28.3 kB
JavaScript
const e=function(e){if(e.firstElementChild)return e.firstElementChild;const t=e.childNodes;for(let e=0,n=t.length;e<n;e++)if(t[e]instanceof Element)return t[e];return null},t=function(e){return e.childElementCount||Array.prototype.filter.call(e.childNodes,(function(e){return e instanceof Element})).length},n=function(e){for(let t=0;t<e.childNodes.length;t++){const r=e.childNodes[t];8===r.nodeType||3===r.nodeType&&!/\S/.test(r.nodeValue||"")?(e.removeChild(r),t--):1===r.nodeType&&n(r)}},r=new DOMParser,o=function(e){if("number"==typeof e||!isNaN(Number(e)))return document.createTextNode(String(e));if("string"!=typeof e)return document.createTextNode("");try{const t=r.parseFromString(e,"text/html").body;if(1===t.childNodes.length)return t.firstChild;{const e=document.createDocumentFragment();for(;t.firstChild;)e.appendChild(t.firstChild);return e}}catch(t){return document.createTextNode(e)}};"function"!=typeof Object.assign&&Object.defineProperty(Object,"assign",{value:function(e,...t){if(null==e)throw new TypeError("Cannot convert undefined or null to object");const n=Object(e);for(let e=0,r=t.length;e<r;e++){const r=t[e];if(null!=r)for(let e in r)Object.prototype.hasOwnProperty.call(r,e)&&(n[e]=r[e])}return n},writable:!0,configurable:!0}),[Element.prototype,CharacterData.prototype,DocumentType.prototype].forEach((function(e){e&&!e.hasOwnProperty("remove")&&Object.defineProperty(e,"remove",{configurable:!0,enumerable:!0,writable:!0,value:function(){null!==this.parentNode&&this.parentNode.removeChild(this)}})})),"isConnected"in window.Node.prototype||Object.defineProperty(window.Node.prototype,"isConnected",{get:function(){return document.body.contains(this)}});const a={},c={},l=a.tools=a.tools||{},i=a.configs=Object.assign({printExecTime:!1,debug:!1,throwError:!0},a.configs),s=a.tmplCache=a.tmplCache||new Map;s.has("anonymous")||s.set("anonymous",{elements:new Set});const p="content"in document.createElement("template"),d=/(.)^/,f={"'":"\\'","\\":"\\\\","\r":"\\r","\n":"\\n","\t":"\\t","\u2028":"\u2028","\u2029":"\u2029","><":"><","<":"<",">":">"},u=/\>( |\n)+\<|\>( |\n)+|( |\n)+\<|\\|'|\r|\n|\t|\u2028|\u2029/g;a.templateEngine=((n,r)=>({rules:{style:{pattern:/(\<style id=[\s\S]+?\>[\s\S]+?\<\/style\>)/g,exec:function(e){var t;const n=document.createElement("template");n.innerHTML=e;const r=(n.content||n).querySelector("style");if(!r||!r.id)return"";const o=document.getElementById(r.id);return o&&(null===(t=o.parentNode)||void 0===t||t.removeChild(o)),document.head.appendChild(r),""}},commentArea:{pattern:/##\*([\s\S]+?)##/g,exec:function(e){return""}},preEvaluate:{pattern:/##!([\s\S]+?)##/g,exec:function(e,t){try{new Function("compomint","tmplId",e)(r,t)}catch(e){if(n.throwError)throw console.error(`Template preEvaluate error in "${t}", ${e.name}: ${e.message}`),e;console.warn(`Template preEvaluate error in "${t}", ${e.name}: ${e.message}`)}return""}},interpolate:{pattern:/##=([\s\S]+?)##/g,exec:function(e){return`';\n{let __t, interpolate=${e};\n__p+=((__t=(typeof (interpolate)=='function' ? (interpolate)() : (interpolate)))==null ? '' : String(__t) );};\n__p+='`}},escape:{pattern:/##-([\s\S]+?)##/g,exec:function(e){return`';\n{let __t, escape=${e};\n__p+=((__t=(compomint.tools.escapeHtml.escape(typeof (escape)=='function' ? (escape)() : (escape))))==null ? '' : String(__t) );};\n__p+='`}},elementProps:{pattern:/data-co-props="##:([\s\S]+?)##"/g,exec:function(e){return`';\n{const eventId = (__lazyScope.elementPropsArray.length);\n__p+='data-co-props="'+eventId+'"';\n\n__lazyScope.elementPropsArray[eventId] = ${e}};\n__p+='`},lazyExec:function(e,t,n,r){t.elementPropsArray.forEach((function(e,t){if(!e)return;const n=r.querySelector(`[data-co-props="${t}"]`);n&&(delete n.dataset.coProps,Object.keys(e).forEach((function(t){n.setAttribute(t,String(e[t]))})))}))}},namedElement:{pattern:/data-co-named-element="##:([\s\S]+?)##"/g,exec:function(e){return`';\nconst eventId = (__lazyScope.namedElementArray.length);\n__p+='data-co-named-element="'+eventId+'"';\n\n__lazyScope.namedElementArray[eventId] = ${e};\n__p+='`},lazyExec:function(e,t,r,o){t.namedElementArray.forEach((function(e,t){const a=o.querySelector(`[data-co-named-element="${t}"]`);a?(delete a.dataset.coNamedElement,r[e]=a):n.debug&&console.warn(`Named element target not found for ID ${t} in template ${r.tmplId}`)}))}},elementRef:{pattern:/data-co-element-ref="##:([\s\S]+?)##"/g,exec:function(e){return`';\n{const eventId = (__lazyScope.elementRefArray.length);\n__p+='data-co-element-ref="'+eventId+'"';\nvar ${e} = null;\n__lazyScope.elementRefArray[eventId] = function(target) {${e} = target;}};\n__p+='`},lazyExec:function(e,t,r,o){t.elementRefArray.forEach((function(e,t){const a=o.querySelector(`[data-co-element-ref="${t}"]`);a?(delete a.dataset.coElementRef,e.call(a,a)):n.debug&&console.warn(`Element ref target not found for ID ${t} in template ${r.tmplId}`)}))}},elementLoad:{pattern:/data-co-load="##:([\s\S]+?)##"/g,exec:function(e){const t=e.split("::");return`';\n{const eventId = (__lazyScope.elementLoadArray.length);\n__p+='data-co-load="'+eventId+'"';\n__lazyScope.elementLoadArray[eventId] = {loadFunc: ${t[0]}, customData: ${t[1]}};}\n__p+='`},lazyExec:function(e,t,o,a){t.elementLoadArray.forEach((function(t,c){const l=a.querySelector(`[data-co-load="${c}"]`);if(l){delete l.dataset.coLoad;try{if("function"==typeof t.loadFunc){const n=[l,l,{data:e,element:l,customData:t.customData,component:o,compomint:r}];t.loadFunc.call(...n)}}catch(e){if(console.error(`Error executing elementLoad function for ID ${c} in template ${o.tmplId}:`,e,t.loadFunc),n.throwError)throw e}}else n.debug&&console.warn(`Element load target not found for ID ${c} in template ${o.tmplId}`)}))}},event:{pattern:/data-co-event="##:([\s\S]+?)##"/g,exec:function(e){const t=e.split(":::");let n="';\n{const eventId = (__lazyScope.eventArray.length);\n__p+='data-co-event=\"'+eventId+'\"';\n";const r=[];for(let e=0,n=t.length;e<n;e++){const n=t[e].split("::");r.push(`{eventFunc: ${n[0]}, $parent: this, customData: ${n[1]}}`)}return n+=`__lazyScope.eventArray[eventId] = [${r.join(",")}];}\n__p+='`,n},lazyExec:function(e,t,r,o){const a=this,c=a.attacher;c&&t.eventArray.forEach((function(l,i){const s=o.querySelector(`[data-co-event="${i}"]`);if(s){delete s.dataset.coEvent;for(let n=0,i=l.length;n<i;n++){const i=l[n];i.eventFunc&&(Array.isArray(i.eventFunc)?i.eventFunc.forEach((function(n){c(a,e,t,r,o,s,n,i)})):c(a,e,t,r,o,s,i.eventFunc,i))}}else n.debug&&console.warn(`Event target not found for ID ${i} in template ${r.tmplId}`)}))},trigger:function(e,t){const n=new Event(t,{bubbles:!0,cancelable:!0});e.dispatchEvent(n)},attacher:function(o,a,c,l,i,s,p,d){const f=o.trigger,u=e(i),m=1===t(i)?u:null;if(!p)return;const y=[s,null,{data:a,customData:d.customData,element:s,componentElement:m||(null==u?void 0:u.parentElement),component:l,compomint:r}];if("function"==typeof p){const e=function(e){e.stopPropagation(),y[1]=e;try{p.call(...y)}catch(e){if(console.error(`Error in event handler for template ${l.tmplId}:`,e,p),n.throwError)throw e}};return s.addEventListener("click",e),d.element=s,void(d.eventFunc=e)}if(h=p,"[object Object]"!==Object.prototype.toString.call(h))return;var h;const g=p,E=g.triggerName;E&&(l.trigger=l.trigger||{},l.trigger[E]={}),Object.keys(g).forEach((function(e){const t=g[e];if("load"===e){y[1]=s;try{t.call(...y)}catch(e){if(console.error(`Error in 'load' event handler for template ${l.tmplId}:`,e,t),n.throwError)throw e}return}if("namedElement"===e)return void(l[t]=s);if("triggerName"===e)return;const r=function(r){r.stopPropagation(),y[1]=r;try{t.call(...y)}catch(r){if(console.error(`Error in '${e}' event handler for template ${l.tmplId}:`,r,t),n.throwError)throw r}};s.addEventListener(e,r),d.element=s,p[e]=r,E&&f&&(l.trigger[E][e]=function(){f(s,e)})}))}},element:{pattern:/##%([\s\S]+?)##/g,exec:function(e){const t=e.split("::");return`';\n{\nconst elementId = (__lazyScope.elementArray.length);\n__p+='<template data-co-tmpl-element-id="'+elementId+'"></template>';\n__lazyScope.elementArray[elementId] = {childTarget: ${t[0]}, nonblocking: ${t[1]||!1}};};\n__p+='`},lazyExec:function(e,t,r,a){t.elementArray.forEach((function(e,t){const c=e.childTarget,l=e.nonblocking,i=a.querySelector(`template[data-co-tmpl-element-id="${t}"]`);if(!i)return void(n.debug&&console.warn(`Element insertion placeholder not found for ID ${t} in template ${r.tmplId}`));if(!i.parentNode)return void(n.debug&&console.warn(`Element insertion placeholder for ID ${t} in template ${r.tmplId} has no parent.`));const s=function(){if(i&&i.parentNode)try{if(c instanceof Array){const e=document.createDocumentFragment();c.forEach((function(a){if(!a)return;const c=a.element||a;let l=null;if("string"==typeof c||"number"==typeof c)l=o(c);else if("function"==typeof c)l=o(c());else{if(!(c instanceof Node))return void(n.debug&&console.warn(`Invalid item type in element array for ID ${t}, template ${r.tmplId}:`,c));l=c}if(a.beforeAppendTo)try{a.beforeAppendTo()}catch(e){console.error("Error in beforeAppendTo (array item):",e)}l&&e.appendChild(l)})),i.parentNode.replaceChild(e,i),c.forEach((function(e){e&&e.afterAppendTo&&setTimeout((()=>{try{e.afterAppendTo()}catch(e){console.error("Error in afterAppendTo (array item):",e)}}),0)}))}else if("string"==typeof c||"number"==typeof c)i.parentNode.replaceChild(o(c),i);else if("function"==typeof c)i.parentNode.replaceChild(o(c()),i);else if(c&&(c.element||c)instanceof Node){const e=c,t=e.element||e;if(e.beforeAppendTo)try{e.beforeAppendTo()}catch(e){console.error("Error in beforeAppendTo:",e)}i.parentNode.replaceChild(t,i),e.afterAppendTo&&setTimeout((()=>{try{e.afterAppendTo&&e.afterAppendTo()}catch(e){console.error("Error in afterAppendTo:",e)}}),0),e.tmplId&&(e.parentComponent=r)}else n.debug&&console.warn(`Invalid target for element insertion ID ${t}, template ${r.tmplId}:`,c),i.parentNode.removeChild(i)}catch(e){if(console.error(`Error during element insertion for ID ${t}, template ${r.tmplId}:`,e),n.throwError)throw e;if(i&&i.parentNode)try{i.parentNode.removeChild(i)}catch(e){}}else n.debug&&console.warn(`Placeholder for ID ${t} removed before insertion in template ${r.tmplId}.`)};void 0===l||!1===l?s():setTimeout(s,"number"==typeof l?l:0)}))}},lazyEvaluate:{pattern:/###([\s\S]+?)##/g,exec:function(e){return`';\n__lazyScope.lazyEvaluateArray.push(function(data) {${e}});\n__p+='`},lazyExec:function(r,o,a,c){const l=e(c),i=1===t(c)?l:null;o.lazyEvaluateArray.forEach((function(e,t){try{e.call(i||c,r)}catch(r){if(console.error(`Error in lazyEvaluate block ${t} for template ${a.tmplId}:`,r,e),n.throwError)throw r}}))}},evaluate:{pattern:/##([\s\S]+?)##/g,exec:e=>"';\n"+e+"\n__p+='"},escapeSyntax:{pattern:/#\\#([\s\S]+?)#\\#/g,exec:function(e){return`'+\n'##${e}##'+\n'`}}},keys:{dataKeyName:"data",statusKeyName:"status",componentKeyName:"component",i18nKeyName:"i18n"}}))(i,a);const m=function(){const e={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},t=Object.keys(e).reduce(((t,n)=>(t[e[n]]=n,t)),{}),n=function(e){const t=function(t){return e[t]},n=`(?:${Object.keys(e).join("|").replace(/\\/g,"\\\\")})`,r=RegExp(n),o=RegExp(n,"g");return function(e){return e=null==e?"":`${e}`,r.test(e)?e.replace(o,t):e}};return{escape:n(e),unescape:n(t)}}();l.escapeHtml=m;const y=function(e){const t=[],n=[],r={},o={};return Object.keys(e).forEach((function(a){const c=e[a];if(c&&"object"==typeof c&&c.pattern instanceof RegExp&&"function"==typeof c.exec&&(t.push((c.pattern||d).source),n.push(c.exec)),c&&"object"==typeof c&&"function"==typeof c.lazyExec){const e=`${a}Array`;r[e]=c.lazyExec,o[e]=[]}})),{templateRules:e,pattern:new RegExp(t.join("|"),"g"),exec:n,lazyExecKeys:Object.keys(o),lazyExec:r,lazyScopeSeed:JSON.stringify(o)}},h=function(e){return f[e]||f[e.replace(/[ \n]/g,"")]||""},g=y(a.templateEngine.rules),E=a.template=function(r,o,p){let d=a.templateEngine,f=g;p&&(d={rules:Object.assign({},d.rules,p.rules||{}),keys:Object.assign({},d.keys,p.keys||{})},f=y(d.rules));const E=`\n/* tmplId: ${r} */\n//# sourceURL=http://tmpl//${r.split("-").join("//")}.js\n// if (__debugger) {\n// debugger;\n// }\nlet __p='';\n__p+='${function(e,t,n){i.printExecTime&&console.time(`tmpl: ${e}`);let r=0,o="";return t.replace(n.pattern,(function(...a){const c=a[0],l=a[a.length-2];let s;o+=t.slice(r,l).replace(u,h);let p=null;if(a.slice(1,-2).some((function(e,t){return void 0!==e&&(s=e,p=t,!0)})),void 0!==s&&null!==p)try{o+=n.exec[p].call(n.templateRules,s,e)}catch(t){if(console.error(`Error executing template rule index ${p} for match "${s}" in template "${e}":`,t),i.throwError)throw t;o+=""}else o+=c.replace(u,h);return r=l+c.length,c})),o+=t.slice(r).replace(u,h),i.printExecTime&&console.timeEnd(`tmpl: ${e}`),o}(r,o,f)}';\nreturn __p;`;let b=null;try{b=new Function(d.keys.dataKeyName,d.keys.statusKeyName,d.keys.componentKeyName,d.keys.i18nKeyName,"compomint","tmpl","__lazyScope","__debugger",E)}catch(e){if(i.throwError){console.error(`Template compilation error in "${r}", ${e.name}: ${e.message}`);try{new Function(d.keys.dataKeyName,d.keys.statusKeyName,d.keys.componentKeyName,d.keys.i18nKeyName,"compomint","tmpl","__lazyScope","__debugger",E)}catch(e){}throw e}return()=>({})}const v=function(...o){let s,p,u,m;const y=o[0];y&&"object"==typeof y&&(y.$wrapperElement||y.$callback||y.$baseComponent)?(s=Object.assign({},y),p=s.$wrapperElement,delete s.$wrapperElement,u=s.$callback,delete s.$callback,m=s.$baseComponent,delete s.$baseComponent):(s=y,"function"==typeof o[1]?(p=void 0,u=o[1],m=o[2]):(p=o[1],u=o[2],m=o[3]));const h=d.keys.dataKeyName,g=d.keys.statusKeyName,E=JSON.parse(f.lazyScopeSeed),v=Object.assign(m||{},{tmplId:r,element:null,status:m&&m.status||{},replace:function(e){const t=this;t.element&&t.element instanceof Node&&t.element.parentElement?t.element.parentElement.replaceChild(e.element||e,t.element):i.debug&&console.warn(`Cannot replace template "${r}": element not in DOM.`)},remove:function(e=!1){const t=this;if(t.beforeRemove)try{t.beforeRemove()}catch(e){console.error("Error in beforeRemove:",e)}E.eventArray&&E.eventArray.forEach((function(e){e.forEach((function(e){e.element&&("function"==typeof e.eventFunc?e.element.removeEventListener("click",e.eventFunc):Object.keys(e.eventFunc).forEach((function(t){e.element.removeEventListener(t,e.eventFunc[t])})),Object.keys(e).forEach((t=>delete e[t])))}))}));const n=t.element instanceof Node?t.element.parentElement:null,o=t.element;if(n)if(e){const e=document.createElement("template");n.replaceChild(e,t.element),t.element=e}else n.removeChild(t.element);else i.debug&&console.warn(`Cannot remove template "${r}": element not in DOM.`);if(t.afterRemove)try{t.afterRemove()}catch(e){console.error("Error in afterRemove:",e)}return o},appendTo:function(e){const t=this;if(t.beforeAppendTo)try{t.beforeAppendTo()}catch(e){console.error("Error in beforeAppendTo:",e)}return e&&t.element instanceof Node?e.appendChild(t.element):i.debug&&console.warn(`Cannot append template "${r}": parentElement or scope.element is missing or not a Node.`),t.afterAppendTo&&setTimeout((()=>{try{t.afterAppendTo()}catch(e){console.error("Error in afterAppendTo:",e)}}),0),t},release:function(){},render:function(e){return this},refresh:function(e){return this},reflash:function(e){return this}});v._id||(v._id=l.genId(r)),v[h]=s,null==v[g]&&(v[g]={});const $=p instanceof Element,T=document.createElement("template");i.printExecTime&&console.time(`render: ${r}`);let _=null,A=null;try{A=s?b.call(p||null,s,v[g],v,a.i18n[r],a,c,E,i.debug):`<template data-co-empty-template="${r}"></template>`}catch(e){if(i.throwError){console.error(`Runtime error during render of "${r}":`,e.message),console.log("--- Data ---",s,"------------");try{b.call(p||null,s,v[g],v,a.i18n[r],E,!0)}catch(e){}throw e}return console.warn(`Render failed for "${r}". Returning scope with comment node.`),v.element=document.createComment(`Render Error: ${r}`),v}i.printExecTime&&console.timeEnd(`render: ${r}`),T.innerHTML=A;let N=T.content||T;if("TEMPLATE"==N.tagName&&!T.content){const e=Array.from(N.childNodes);N=document.createDocumentFragment(),e.forEach((e=>N.appendChild(e)))}if($&&p){for(;p.firstChild;)p.removeChild(p.firstChild);v.wrapperElement=p}if((N.querySelector?N.querySelector("style"):null)&&N.querySelector){const e=document.createElement(r);try{const t=e.attachShadow({mode:"open"});for(;N.firstChild;)t.appendChild(N.firstChild);N=e}catch(e){console.error(`Failed to attach shadow DOM for template "${r}":`,e)}}if(N.firstChild&&8==N.firstChild.nodeType)_=N.firstChild;else if(1==t(N)){if(_=e(N),$&&p&&_){if(v.beforeAppendTo)try{v.beforeAppendTo()}catch(e){console.error("Error in beforeAppendTo:",e)}p.appendChild(_),v.afterAppendTo&&setTimeout((()=>{try{v.afterAppendTo()}catch(e){console.error("Error in afterAppendTo:",e)}}),0)}}else if($&&p){if(v.beforeAppendTo)try{v.beforeAppendTo()}catch(e){console.error("Error in beforeAppendTo:",e)}p.appendChild(N),v.afterAppendTo&&setTimeout((()=>{try{v.afterAppendTo()}catch(e){console.error("Error in afterAppendTo:",e)}}),0),_=p}else _=N;if(s&&s.$props&&_ instanceof Element)for(const e in s.$props)try{const t=s.$props[e];if(e.startsWith("data-")){const n=e.substring(5).replace(/-([a-z])/g,(e=>e[1].toUpperCase()));_.dataset[n]=String(t)}else e in _?_[e]=t:_.setAttribute(e,String(t))}catch(t){console.error(`Error applying prop "${e}" to element in template "${r}":`,t)}_ instanceof Node&&_.normalize&&_.normalize(),_ instanceof Node&&n(_),v.element=_;const w=f.lazyExec;if(s&&f.lazyExecKeys.forEach((function(e){if(E[e]&&E[e].length>0)try{w[e].call(d.rules[e.slice(0,-5)],s,E,v,N)}catch(t){if(i.throwError)throw console.error(`Error during lazy execution of "${e}" for template "${r}":`,t),t}})),l.liveReloadSupport)try{l.liveReloadSupport(v)}catch(e){console.error("Error in liveReloadSupport:",e)}if(u)try{u.call(p||null,v)}catch(e){if(console.error(`Error in template callback for "${r}":`,e),i.throwError)throw e}return v.release=function(){const e=this,t=Object.getOwnPropertyNames(e),n=[g,"_id"];for(let r=0;r<t.length;r++){const o=t[r];"function"==typeof e[o]||n.includes(o)||delete e[o]}},v.render=function(e){const t=this,n=t.element,r=n instanceof Node?n.parentElement:null,o=t.wrapperElement,c=a.tmpl(t.tmplId);if(!c)return console.error(`Cannot re-render: Template function for "${t.tmplId}" not found.`),t;const l={beforeAppendTo:t.beforeAppendTo,afterAppendTo:t.afterAppendTo,beforeRemove:t.beforeRemove,afterRemove:t.afterRemove,beforeRefresh:t.beforeRefresh,afterRefresh:t.afterRefresh};if(t.beforeRemove)try{t.beforeRemove()}catch(e){console.error("Error in beforeRemove during render:",e)}let s;if(o)s=c(e,o,void 0,t);else if(r&&n instanceof Node)if(s=c(e,void 0,void 0,t),s.element instanceof Node){if(s.beforeAppendTo)try{s.beforeAppendTo()}catch(e){console.error("Error in beforeAppendTo during render:",e)}r.replaceChild(s.element,n),s.afterAppendTo&&setTimeout((()=>{try{s.afterAppendTo()}catch(e){console.error("Error in afterAppendTo during render:",e)}}),0)}else i.debug&&console.warn(`Re-render of "${t.tmplId}" resulted in no element or target was missing.`);else s=c(e,void 0,void 0,t);if(t.afterRemove)try{t.afterRemove()}catch(e){console.error("Error in afterRemove during render:",e)}return Object.assign(s,l),s},v.refresh=function(e){const t=this,n=t[h];if(t.beforeRefresh)try{t.beforeRefresh()}catch(e){console.error("Error in beforeRefresh:",e)}const r=Object.assign({},n||{},e),o=t.render(r);if(t.afterRefresh)try{t.afterRefresh()}catch(e){console.error("Error in afterRefresh:",e)}return o},v.reflash=v.refresh,v};if(Object.defineProperty(v,"name",{value:`render_${r}`,writable:!1}),r){const e=i.debug?{renderingFunc:v,source:m.escape(`function ${r}_source (${d.keys.dataKeyName}, ${d.keys.statusKeyName}, ${d.keys.componentKeyName}, ${d.keys.i18nKeyName}, __lazyScope, __debugger) {\n${E}\n}`),templateText:m.escape(o)}:{renderingFunc:v};s.set(r,e);const t=r.split("-");if(t.length>1){const n=t[0];let r=c[n];r||(c[n]=r={});r[t.slice(1).map(((e,t)=>0===t?e:e.charAt(0).toUpperCase()+e.slice(1))).join("")]=e.renderingFunc}}return v};a.remapTmpl=function(e){Object.keys(e).forEach((function(t){const n=e[t],r=s.get(t);r?(s.set(n,r),i.debug&&console.log(`Remapped template "${t}" to "${n}"`)):i.debug&&console.warn(`Cannot remap template: Old key "${t}" not found in cache.`)}))},a.tmpl=function(e){const t=s.get(e);return t?t.renderingFunc:null};const b=function(e){let t;if(e instanceof Element)return e.tagName,e;if("string"!=typeof e&&(i.debug&&console.warn("safeTemplate received non-string/non-element source:",e),e=""),t=document.createElement("template"),p){const n=e.replace(/<(?!template|\/template|body|\/body|html|\/html|head|\/head|style|\/style|script|\/script|link|\/link|meta|\/meta|!--)/gi,"<");t.innerHTML=n}else{const n=e.replace(/<(?!template|\/template|body|\/body|html|\/html|head|\/head|style|\/style|script|\/script|link|\/link|meta|\/meta|!--)/gi,"<").replace(/<template/g,'<script type="template"').replace(/<\/template>/g,"<\/script>");t.innerHTML=n}return t},v=a.addTmpl=function(e,t,n){let r=t instanceof Element?t.innerHTML:String(t);return r=m.unescape(r.replace(/<!---|--->/gi,"")),E(e,r,n)},$=a.addTmpls=function(e,t,n){"boolean"!=typeof t&&null==n?(n=t,t=!1):t=!!t;const r=b(e);return(r.content||r).querySelectorAll('template[id], script[type="text/template"][id], script[type="text/compomint"][id]').forEach((e=>{const r=e.id;r&&(void 0!==e.dataset.coLoadScript?v(r,e,n)({}):v(r,e,n),t&&e.parentNode&&e.parentNode.removeChild(e))})),r};a.addTmplByUrl=function(e,t,n){n||"function"!=typeof t||(n=t,t={});const r={loadScript:!0,loadStyle:!0,loadLink:!0,templateEngine:void 0},o=Object.assign({},r,t),a=e=>{e.forEach((e=>{var t;if(e){if(e.id){const n=document.getElementById(e.id);n&&(null===(t=n.parentNode)||void 0===t||t.removeChild(n))}"SCRIPT"===e.tagName||"LINK"===e.tagName||"STYLE"===e.tagName?document.head.appendChild(e):document.body.appendChild(e)}}))},c=e=>new Promise(((t,n)=>{const r="string"==typeof(c=e)?{url:c,option:o}:c&&"object"==typeof c&&c.url?{url:c.url,option:Object.assign({},o,c.option)}:(console.error("Invalid import data format in addTmplByUrl:",c),null);var c;if(!r)return void t();const l=r.url,i=r.option;if(l.endsWith(".js")){const e=N("script",{async:!0,src:l});e.addEventListener("load",(()=>t())),e.addEventListener("error",(()=>{console.error(`Failed to load script: ${l}`),n(new Error(`Failed to load script: ${l}`))})),document.head.appendChild(e)}else if(l.endsWith(".css")){const e=N("link",{type:"text/css",rel:"stylesheet",href:l});e.addEventListener("load",(()=>t())),e.addEventListener("error",(()=>{console.error(`Failed to load stylesheet: ${l}`),n(new Error(`Failed to load stylesheet: ${l}`))})),document.head.appendChild(e)}else T(l,null,((e,r)=>{if(200===r||0===r)try{((e,t)=>{const n=b(e);$(n,!1,t.templateEngine);const r=n.content||n;if(t.loadLink){const e=r.querySelectorAll('link[rel="stylesheet"]');a(e)}if(t.loadStyle){const e=r.querySelectorAll("style[id]");a(e)}if(t.loadScript){const e=r.querySelectorAll('script:not([type]), script[type="text/javascript"], script[type="module"]'),t=Array.from(e).filter((e=>{let t=e.parentNode;for(;t;){if("TEMPLATE"===t.nodeName||"SCRIPT"===t.nodeName&&t.type.includes("template"))return!1;t=t.parentNode}return!0})).map((e=>{const t=document.createElement("script");return e.getAttributeNames().forEach((n=>t.setAttribute(n,e.getAttribute(n)))),e.innerHTML&&(t.textContent=e.innerHTML),t}));a(t)}})(e,i),t()}catch(e){console.error(`Error processing imported HTML from ${l}:`,e),n(new Error(`Error processing imported HTML from ${l}: ${e}`))}else console.error(`Failed to fetch template file: ${l} (Status: ${r})`),n(new Error(`Failed to fetch template file: ${l} (Status: ${r})`))}))}));if(null==e)return n?void n():Promise.resolve();const l=Array.isArray(e)?0===e.length?Promise.resolve():Promise.all(e.map(c)).then((()=>{})).catch((e=>{throw console.error("Error loading resources in addTmplByUrl:",e),e})):c(e).catch((e=>{throw console.error("Error loading resource in addTmplByUrl:",e),e}));return n?void l.then((()=>n())).catch((e=>{console.error("Error in addTmplByUrl callback mode:",e),n()})):l};const T=function(e,t,n){const r=new XMLHttpRequest;r.onreadystatechange=function(){r.readyState==XMLHttpRequest.DONE&&(200==r.status||0===r.status?n(r.responseText,r.status,r):(404==r.status?console.error(`Error 404: Not Found - ${e}`):r.status>=400?console.error(`HTTP Error ${r.status} for ${e}`):console.error(`Request failed for ${e}`,r.statusText),n(null,r.status,r)))},r.onerror=function(){console.error(`Network error requesting ${e}`),n(null,0,r)},r.ontimeout=function(){console.error(`Request timed out for ${e}`),n(null,408,r)};try{const n=t&&t.method||"GET";if(r.open(n,e,!0),t){t.timeout&&(r.timeout=t.timeout);const e=t.headers;e&&Object.keys(e).forEach((t=>{r.setRequestHeader(t,e[t])})),r.send(t.body||null)}else r.send()}catch(t){console.error(`Error sending request to ${e}:`,t),n(null,0,r)}};a.i18n={},a.addI18n=function(e,t){if(!e||"string"!=typeof e||!t||"object"!=typeof t)return void console.error("Invalid arguments for addI18n:",e,t);const n=e.split(".");let r=a.i18n;const o=n.length-1;n.forEach((function(n,c){if(n)if(o===c){Object.keys(t).some((e=>Array.isArray(t[e])))?(r[n]||(r[n]=[]),Object.keys(t).filter((e=>Array.isArray(t[e]))).forEach((o=>{t[o].forEach(((t,o)=>{r[n][o]||(r[n][o]={}),t instanceof Object&&!Array.isArray(t)&&Object.keys(t).forEach((n=>{a.addI18n(e+"."+o+"."+n,t[n])}))}))}))):(r[n]||(r[n]=function(n){const r=document.documentElement.lang||"en";let o=t[r];return null==o&&(o=n,i.debug&&console.warn(`i18n: Label key ["${e}"] for lang "${r}" is missing. Using default: "${n}"`)),null!=o?String(o):""}),Object.keys(t).filter((e=>t[e]instanceof Object&&!Array.isArray(t[e]))).forEach((n=>{a.addI18n(e+"."+n,t[n])})))}else r[n]&&"function"!=typeof r[n]||(r[n]={}),r=r[n]}))},a.addI18ns=function(e){const t=new Map;function n(e){if(t.has(e))return t.get(e);const n=e.split(".");let r=a.i18n;for(let e=0;e<n.length-1;e++)r[n[e]]||(r[n[e]]={}),r=r[n[e]];return t.set(e,r),r}function r(e){for(const t in e){const n=typeof e[t];if("string"!==n&&"number"!==n&&"boolean"!==n)return!1}return!0}!function e(t,o=""){for(const c in t){const l=t[c],i=o?o+"."+c:c;if(Array.isArray(l)){const e=n(i),t=i.split(".").pop();e[t]||(e[t]=[]);for(let n=0;n<l.length;n++){const r=l[n];if(e[t][n]||(e[t][n]={}),r&&"object"==typeof r)for(const e in r){const t=r[e];if(t&&"object"==typeof t){const r=i+"."+n+"."+e;a.addI18n(r,t)}}}}else l&&"object"==typeof l?r(l)?a.addI18n(i,l):e(l,i):a.addI18n(i,l)}}(e)};let _=0;l.genId=function(e){return _++,e+_};const A=l.applyElementProps=function(e,t){return Object.keys(t).forEach((function(n){const r=t[n],o="class"===n?"className":n;try{"style"===n&&"object"==typeof r&&null!==r?Object.assign(e.style,r):"dataset"===n&&"object"==typeof r&&null!==r?Object.assign(e.dataset,r):n.startsWith("on")&&"function"==typeof r?e[n.toLowerCase()]=r:o in e?e[o]=r:e.setAttribute(n,String(r))}catch(t){console.error(`Error setting attribute/property "${n}" on <${e.tagName}>:`,t)}})),e},N=l.genElement=function(e,t={},...n){const r=document.createElement(e);let o={};return"string"==typeof t||t instanceof Node?n.unshift(t):Array.isArray(t)?n=t.concat(n):o=t,A(r,o),n.forEach((e=>{"string"==typeof e?r.appendChild(document.createTextNode(e)):e instanceof Node&&r.appendChild(e)})),r};l.props=function(...e){if(!e||0===e.length)return"";const t=Object.assign({},...e),n=[];return Object.keys(t).forEach((function(e){const r=t[e];if(r||0===r){const t=String(r).replace(/"/g,""");n.push(`${e}="${t}"`)}})),n.join(" ")},(e=>{e("co-Ele","<##=data[0]##></##=data[0]##>###compomint.tools.applyElementProps(this, data[1]);##"),e("co-Element","##\n data.tag = data.tag || 'div';\n ##\n <##=data.tag##\n ##=data.id ? 'id=\"' + (data.id === true ? component._id : data.id) + '\"' : ''##\n data-co-props=\"##:data.props##\"\n data-co-event=\"##:data.event##\">\n ##if (typeof data.content === \"string\") {##\n ##=data.content##\n ##} else {##\n ##%data.content##\n ##}##\n </##=data.tag##>")})(v);export{a as compomint,c as tmpl};
//# sourceMappingURL=compomint.esm.min.js.map