-
Notifications
You must be signed in to change notification settings - Fork 1
/
templiteral.cjs.min.js
1 lines (1 loc) · 4.17 KB
/
templiteral.cjs.min.js
1
"use strict";Object.defineProperty(exports,"__esModule",{value:true});const valuePattern=/---!{.*?(}!---)/gi;const eventPattern=/^\(.*\)$/gi;const propPattern=/^\[.*\]$/;const sanitizePattern=/^this\./;const startSeparator=/---!\{/gi;const endSeparator=/\}!---/gi;class ContentNode{constructor(t,e){this.node=t;this.compiler=e;this.base=t.nodeValue||"";this.indicies=this.base.match(valuePattern).map(t=>+t.replace(startSeparator,"").replace(endSeparator,""));this.indicies.forEach(t=>this.compiler.partIndicies.set(t,this))}set value(t){const e=this.base.replace(valuePattern,t);this.value!==e?this.node.nodeValue=e:null}get value(){return this.node.nodeValue}setValue(t=[]){this.node.nodeValue=this.base.replace(/---!{*.}!---/g,e=>t[+e.replace(startSeparator,"").replace(endSeparator,"")])}update(t){this.node.nodeValue=this.base.replace(/---!{*.}!---/g,e=>{const s=t[+e.replace(startSeparator,"").replace(endSeparator,"")];return s===null?"":s})}}class AttributeNode{constructor(t,e,s,n,a){this.node=t;this.boundAttrs=e;this.boundEvents=s;this.context=n;this.compiler=a;this.boundAttrs.forEach(t=>{t.base=t.value;const e=t.base.match(valuePattern)||[];this.indicies=e.map(t=>+t.replace(startSeparator,"").replace(endSeparator,""));this.indicies.forEach(t=>this.compiler.partIndicies.set(t,this))});this.addListeners()}addListeners(){this.boundEvents.forEach((t,e)=>{const s=t.split(/;/);const n=s.filter(t=>t.match(sanitizePattern));const a=n.join("; ");if(t.match(sanitizePattern)){const t=new Function(a).bind(this.context);this.node.addEventListener(e,t);this.node._boundEvents=t}if(n.length<s.length){console.warn("Inline functions not allowed inside of event bindings. Unsafe functions have been removed from node",this.node)}})}updateProperty(t,e){const s=t.name.replace(/\[|\]/g,"");this.node[s]=e;if(e&&e!=="false"){this.node.setAttribute(s,e)}else{this.node.removeAttribute(s)}}update(t){this.boundAttrs.forEach(e=>{const s=e.base.match(/---!{*.}!---/g)||[];const n=s.map(t=>+t.replace("---!{","").replace("}!---",""));let a=e.base;if(n.length===1){a=a.replace(`---!{${n[0]}}!---`,t[n[0]])}else if(n.length>1){for(let e=0;e<n.length;e+=1){const s=t[n[e]]||"";a=a.replace(`---!{${n[e]}}!---`,s)}}e.value=a;if(e.name.match(propPattern)){if(n.length===1){a=t[n[0]]}this.updateProperty(e,a)}})}}class Fragment{constructor(t,e,s,n){this.strings=t;this.values=e;this.oldValues=e.map((t,e)=>`---!{${e}}!---`);this.context=n;this.location=s;this.parts=[];this.partIndicies=new Map;this.eventHandlers=[];this._init()}_setParts(){for(let t=0;t<this.parts.length;t+=1){const e=this.parts[t];if(e instanceof ContentNode){e.setValue(this.values,this.oldValues[t])}else if(e instanceof AttributeNode){e.update(this.values,this.oldValues)}}}_init(){const t=this.strings.map((t,e)=>`${t?t:""}${this.values[e]!==undefined?"---!{"+e+"}!---":""}`).join("");const e=document.createElement("template");e.innerHTML=t;const s=document.importNode(e.content,true);const n=document.createTreeWalker(s,133,null,false);this._walk(n,this.parts,true);this._setParts(s)}_walk(t,e,s){while(t.nextNode()){const{currentNode:n}=t;if(!n.__templiteralCompiler){switch(n.nodeType){case 1:{const{attributes:t}=n;if(t.length){const a=new Map;const i=new Map;for(let e=0;e<t.length;e+=1){const r=t[e];if(r.value.match(valuePattern)||r.name.match(propPattern)){a.set(r.name,r)}if(s&&r.name.match(eventPattern)){const t=r.name.substring(1,r.name.length-1);i.set(t,r.value);this.eventHandlers.push({eventName:t,currentNode:n})}}if(a.size>=1||i.size>=1){const t=new AttributeNode(n,a,i,this.context,this);e.push(t)}}break}case 3:{if(n.textContent&&n.textContent.match(valuePattern)){const t=new ContentNode(n,this);e.push(t)}break}}}else{this.templiteralParts.add(n)}}}update(t){this.oldValues=this.values;this.values=t;for(let e=0;e<t.length;e+=1){if(t[e]!==this.oldValues[e]){this.partIndicies.get(e).update(t)}}}}class Template extends Fragment{constructor(t,e,s,n){super(t,e,s,n)}_setParts(t){super._setParts();this.location.appendChild(t)}}const templateCache=new WeakMap;function templiteral(t=this,e=this){t.shadowRoot?t=t.shadowRoot:null;return(s,...n)=>{let a=templateCache.get(t);if(a){a.update(n)}else{a=new Template(s,n,t,e);templateCache.set(t,a)}return a}}exports.templiteral=templiteral;