data-tier
Version:
Tiny and fast two way (MV-VM) data binding framework for browser environments.
1 lines • 2.73 kB
JavaScript
const f=/\s*[,;]\s*/,c=/\s*([=ae]>)\s*/,E={A:"href",ANIMATE:"href",AREA:"href",BASE:"href",DISCARD:"href",IMAGE:"href",LINK:"href",PATTERN:"href",use:"href",INPUT:"value",SELECT:"value",TEXTAREA:"value",IFRAME:"src",IMG:"src",SOURCE:"src"},p=["INPUT","SELECT","TEXTAREA"],T={ATTRIBUTE:1,EVENT:2,METHOD:3,PROPERTY:4},n="abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",i=n.length;class d{constructor(e,t,r,a,n,i,s){this.tieKey=e,this.rawPath=t,this.path=r,this.targetType=a,this.targetKey=n,this.changeEvent=i,this.fParams=s,this.iClasses=null,Object.seal(this)}}function e(n){var i=n.getAttribute("data-tie");if(i){var s=n;var l=[],o={},h=i.trim().split(f),u=h.length;let e=0,t,r,a;for(;e<u;e++)if((t=h[e])&&(r&&(r+=","+t),!(0<t.indexOf("(")&&(r=t).indexOf(")")<0)))try{r?(a=function(e){var[t,r]=e.split(/[()]/),r=r.trim().split(/\s*,\s*/).map(A);if(r.length)return new d(null,null,null,T.METHOD,t,null,r);throw new Error(`method tie parameter MUST have at least one tied argument, '${e}' doesn't`)}(r),r=null):a=function(e,t){var[e,r,a,,n]=e.split(c);var r="a>"===r?T.ATTRIBUTE:"e>"===r?T.EVENT:T.PROPERTY,{tieKey:e,rawPath:i,path:s}=A(e),e=(a=a||function(e){let t=E[e.nodeName];t?"checkbox"===e.type&&(t="checked"):t="textContent";return t}(t),n=n||function(e){let t=null;p.includes(e.nodeName)&&(t="change");return t}(t),new d(e,i,s,r,a,n,null));"classList"===a&&(e.iClasses=Array.from(t.classList));return e}(t,s),a.targetKey in o?console.error(`elements's property '${a.targetKey}' tied more than once; all but first tie dismissed`):(l.push(a),o[a.targetKey]=!0)}catch(e){console.error(`failed to parse one of a multi param parts (${t}), skipping it`,e)}return l.length?l:null}return null}function A(e){var t,[r,a=""]=e.split(":");if(r)return t=a.split(".").filter(Boolean),{tieKey:r,rawPath:a,path:t};throw new Error(`tie key missing in tie parameter '${e}'; expected example: "orders:0.address.apt => title"`)}function t(e,t){if(!e)return e;var r=t,a=r.length;if(!a)return e;let n=e,i=0,s;for(;i<a;i++)if(s=r[i],null===(n=n[s])||void 0===n)return n;return n}function r(a,n,i){if(a){var s=n.length;let e=0,t,r;for(;e<s-1;e++)if((r=a[t=n[e]])&&"object"==typeof r)a=r;else if(null==r)a[t]={},a=a[t];else if("object"!=typeof r)return void console.error("setting deep path MAY NOT override primitives along the way");a[n[e]]=i}}function a(t,r,a){try{t[r].apply(t,a)}catch(e){console.error(`failed to call '${r}' of '${t}' with '${a}'`,e)}}function s(e){let t="",r=e;for(var a=crypto.getRandomValues(new Uint8Array(e));r--;)t+=n.charAt(i*a[r]/256);return t}export{e as extractViewParams,t as getPath,r as setPath,a as callViewMethod,s as getRandomKey,E as DEFAULT_TARGET,p as DEFAULT_EVENTS_CHANGE,T as TARGET_TYPES};