@dlightjs/view-generator
Advanced tools
Comparing version 1.0.0-alpha.3 to 1.0.0-alpha.4
@@ -1,2 +0,2 @@ | ||
var B=Object.defineProperty;var $=(m,t,e)=>t in m?B(m,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):m[t]=e;var O=(m,t,e)=>($(m,typeof t!="symbol"?t+"":t,e),e);import{createErrorHandler as W}from"@dlightjs/error-handler";var g=W("ViewGenerator",{1:"Element prop in HTML should be a function or an identifier",2:"Unrecognized HTML common prop",3:"Do prop only accepts function or arrow function"},{},{1:'ExpressionNode only supports prop as ["element", "do"]'});var K=process.env.NODE_ENV==="development",v=class{viewParticle;config;t;traverse;className;importMap;subViewPropMap;viewGenerator;constructor(t,e){this.viewParticle=t,this.config=e,this.t=e.babelApi.types,this.traverse=e.babelApi.traverse,this.className=e.className,this.importMap=e.importMap,this.subViewPropMap=e.subViewPropMap,this.viewGenerator=new x(e)}initStatements=[];addInitStatement(...t){this.initStatements.push(...t)}classProperties=[];addStaticClassProperty(t,e){this.classProperties.push(this.t.classProperty(this.t.identifier(t),e,void 0,void 0,void 0,!0))}updateStatements={};addUpdateStatements(t,e){if(!t||t.length===0)return;let i=v.calcDependencyNum(t);this.updateStatements[i]||(this.updateStatements[i]=[]),this.updateStatements[i].push(e)}addUpdateStatementsWithoutDep(t){this.updateStatements[0]||(this.updateStatements[0]=[]),this.updateStatements[0].push(t)}generate(){let t=this.run();return[this.initStatements,this.updateStatements,this.classProperties,t]}generateChildren(t,e=!0){this.viewGenerator.nodeIdx=this.nodeIdx,this.viewGenerator.templateIdx=this.templateIdx;let[i,r,s,n]=this.viewGenerator.generateChildren(t);return this.nodeIdx=this.viewGenerator.nodeIdx,this.templateIdx=this.viewGenerator.templateIdx,this.classProperties.push(...s),e&&this.mergeStatements(r),[i,n,r]}mergeStatements(t){Object.entries(t).forEach(([e,i])=>{this.updateStatements[Number(e)]||(this.updateStatements[Number(e)]=[]),this.updateStatements[Number(e)].push(...i)})}generateChild(t,e=!0){this.viewGenerator.nodeIdx=this.nodeIdx,this.viewGenerator.templateIdx=this.templateIdx;let[i,r,s,n]=this.viewGenerator.generateChild(t);return this.nodeIdx=this.viewGenerator.nodeIdx,this.templateIdx=this.viewGenerator.templateIdx,this.classProperties.push(...s),e&&this.mergeStatements(r),[i,n,r]}geneUpdateBody(t){return this.t.blockStatement([...Object.entries(t).filter(([e])=>e!=="0").map(([e,i])=>this.t.ifStatement(this.t.binaryExpression("&",this.t.identifier("changed"),this.t.numericLiteral(Number(e))),this.t.blockStatement(i))),...t[0]??[]])}generateReturnStatement(t){return this.t.returnStatement(this.t.arrayExpression(t.map(e=>this.t.identifier(e))))}run(){return""}nodeIdx=-1;generateNodeName(t){return`${v.prefixMap.node}${t??++this.nodeIdx}`}templateIdx=-1;generateTemplateName(){return`${v.prefixMap.template}${++this.templateIdx}`}static calcDependencyNum(t){return!t||t.length===0?0:(t=[...new Set(t)],t.reduce((e,i)=>e+(1<<i),0))}valueWrapper(t){return this.t.file(this.t.program([this.t.isStatement(t)?t:this.t.expressionStatement(t)]))}static statementsCollector(){let t=[];return[t,(...i)=>{i.forEach(r=>{Array.isArray(r)?t.push(...r):t.push(r)})}]}},u=v;O(u,"prefixMap",K?{template:"$template",node:"$node"}:{template:"$t",node:"$n"});var f=class extends u{alterPropViews(t){return t&&Object.fromEntries(Object.entries(t).map(([e,i])=>[e,this.alterPropView(i)]))}declarePropView(t){let[e,i,r]=this.generateChildren(t,!1);i.length>0&&e.push(this.t.expressionStatement(this.t.assignmentExpression("=",this.t.memberExpression(this.t.identifier(i[0]),this.t.identifier("_$updateFunc")),this.t.arrowFunctionExpression([this.t.identifier("changed")],this.geneUpdateBody(r)))),this.generateReturnStatement(i));let s=this.generateNodeName(),n=this.t.variableDeclaration("const",[this.t.variableDeclarator(this.t.identifier(s),this.t.newExpression(this.t.identifier(this.importMap.PropView),[this.t.arrowFunctionExpression([],this.t.blockStatement(e))]))]);this.addInitStatement(n);let a=this.t.identifier(s);return this.addUpdateStatements(f.reverseDependencyIndexArr(r),this.t.expressionStatement(this.t.callExpression(this.t.memberExpression(a,this.t.identifier("update")),[this.t.identifier("changed")]))),s}alterPropView(t){if(!t)return t;let{value:e,viewPropMap:i}=t;if(!i)return{...t,value:e};let r=e;return this.traverse(this.valueWrapper(e),{StringLiteral:s=>{let n=s.node.value,a=i[n];if(!a)return;let h=this.t.identifier(this.declarePropView(a));e===s.node&&(r=h),s.replaceWith(h),s.skip()}}),{...t,value:r}}static reverseDependencyIndexArr(t){let e=Object.keys(t).map(Number).reduce((r,s)=>r|s,0),i=[];for(let r=0;r<String(e).length;r++)e&1<<r&&i.push(r);return i}};var w=class extends f{addDo(t,e){return!this.t.isFunctionExpression(e)&&!this.t.isArrowFunctionExpression(e)?g.throw1():this.t.expressionStatement(this.t.callExpression(e,[this.t.identifier(t)]))}};var E=class extends w{setElement(t,e,i=!1){let r=i?this.t.memberExpression(this.t.identifier(t),this.t.identifier("_$el")):this.t.identifier(t);return this.isOnlyMemberExpression(e)?this.assignHTMLElement(r,e):this.assignHTMLFunctionElement(r,e)}assignHTMLElement(t,e){return this.t.ifStatement(this.t.binaryExpression("===",this.t.unaryExpression("typeof",e,!0),this.t.stringLiteral("function")),this.t.expressionStatement(this.t.callExpression(e,[t])),this.t.expressionStatement(this.t.assignmentExpression("=",e,t)))}assignHTMLFunctionElement(t,e){return!this.t.isFunctionExpression(e)&&!this.t.isArrowFunctionExpression(e)?g.throw1():this.t.expressionStatement(this.t.callExpression(e,[t]))}isOnlyMemberExpression(t){if(!this.t.isMemberExpression(t))return!1;for(;t.property;)if(this.t.isMemberExpression(t.property)){t=t.property;continue}else{if(this.t.isIdentifier(t.property))break;return!1}return!0}};var y=class extends E{forwardProps(t){return this.t.expressionStatement(this.t.callExpression(this.t.memberExpression(this.t.thisExpression(),this.t.identifier("_$addForwardProps")),[this.t.identifier(t)]))}};var I=class extends y{run(){let{content:t,props:e}=this.viewParticle;t=this.alterPropView(t),e=this.alterPropViews(e);let{tag:i,children:r}=this.viewParticle,s=this.generateNodeName();if(this.addInitStatement(this.declareCompNode(s,i,t,e,r)),t){let{value:n,dependencyIndexArr:a}=t;a&&a.length>0&&this.addUpdateStatements(a,this.setCompContent(s,n))}return e&&Object.entries(e).forEach(([n,{value:a,dependencyIndexArr:h}])=>{if(n==="do"){let o=this.addDo(s,a);this.addInitStatement(o),this.addUpdateStatements(h,o);return}if(n==="element"){let o=this.setElement(s,a,!0);this.addInitStatement(o),this.addUpdateStatements(h,o);return}n!=="forwardProps"&&h&&h.length>0&&this.addUpdateStatements(h,this.setCompProp(s,n,a))}),s}generateCompProps(t){return!t||Object.keys(t).length===0?this.t.nullLiteral():this.t.objectExpression(Object.entries(t).map(([e,{value:i}])=>this.t.objectProperty(this.t.identifier(e),i)))}declareCompNode(t,e,i,r,s){let n=!1;return r&&("forwardProps"in r&&(n=!0),r=Object.fromEntries(Object.entries(r).filter(([a])=>!["do","element","forwardProps"].includes(a)))),this.t.variableDeclaration("const",[this.t.variableDeclarator(this.t.identifier(t),this.t.newExpression(e,[this.generateCompProps(r),i?.value??this.t.nullLiteral(),s&&s.length>0?this.t.identifier(this.declarePropView(s)):this.t.nullLiteral(),n?this.t.identifier("this"):this.t.nullLiteral()]))])}setCompContent(t,e){return this.t.expressionStatement(this.t.callExpression(this.t.memberExpression(this.t.identifier(t),this.t.identifier("_$setContent")),[e]))}setCompProp(t,e,i){return this.t.expressionStatement(this.t.callExpression(this.t.memberExpression(this.t.identifier(t),this.t.identifier("_$setProp")),[this.t.stringLiteral(e),i]))}};var q={textContent:["*"],innerHTML:["*"],accept:["form","input"],acceptCharset:["form"],accesskey:["*"],action:["form"],align:["caption","col","colgroup","hr","iframe","img","table","tbody","td","tfoot","th","thead","tr"],allow:["iframe"],alt:["area","img","input"],async:["script"],autocapitalize:["*"],autocomplete:["form","input","select","textarea"],autofocus:["button","input","select","textarea"],autoplay:["audio","video"],background:["body","table","td","th"],bgColor:["body","col","colgroup","marquee","table","tbody","tfoot","td","th","tr"],border:["img","object","table"],buffered:["audio","video"],capture:["input"],charset:["meta"],checked:["input"],cite:["blockquote","del","ins","q"],class:["*"],color:["font","hr"],cols:["textarea"],colSpan:["td","th"],content:["meta"],contentEditable:["*"],contextmenu:["*"],controls:["audio","video"],coords:["area"],crossOrigin:["audio","img","link","script","video"],csp:["iframe"],data:["object"],dateTime:["del","ins","time"],decoding:["img"],default:["track"],defer:["script"],dir:["*"],dirname:["input","textarea"],disabled:["button","fieldset","input","optgroup","option","select","textarea"],download:["a","area"],draggable:["*"],enctype:["form"],enterKeyHint:["textarea","contenteditable"],for:["label","output"],form:["button","fieldset","input","label","meter","object","output","progress","select","textarea"],formAction:["input","button"],formEnctype:["button","input"],formMethod:["button","input"],formNoValidate:["button","input"],formTarget:["button","input"],headers:["td","th"],height:["canvas","embed","iframe","img","input","object","video"],hidden:["*"],high:["meter"],href:["a","area","base","link"],hreflang:["a","link"],httpEquiv:["meta"],id:["*"],integrity:["link","script"],intrinsicSize:["img"],inputMode:["textarea","contenteditable"],ismap:["img"],itemProp:["*"],kind:["track"],label:["optgroup","option","track"],lang:["*"],language:["script"],loading:["img","iframe"],list:["input"],loop:["audio","marquee","video"],low:["meter"],manifest:["html"],max:["input","meter","progress"],maxLength:["input","textarea"],minLength:["input","textarea"],media:["a","area","link","source","style"],method:["form"],min:["input","meter"],multiple:["input","select"],muted:["audio","video"],name:["button","form","fieldset","iframe","input","object","output","select","textarea","map","meta","param"],noValidate:["form"],open:["details","dialog"],optimum:["meter"],pattern:["input"],ping:["a","area"],placeholder:["input","textarea"],playsInline:["video"],poster:["video"],preload:["audio","video"],readonly:["input","textarea"],referrerPolicy:["a","area","iframe","img","link","script"],rel:["a","area","link"],required:["input","select","textarea"],reversed:["ol"],role:["*"],rows:["textarea"],rowSpan:["td","th"],sandbox:["iframe"],scope:["th"],scoped:["style"],selected:["option"],shape:["a","area"],size:["input","select"],sizes:["link","img","source"],slot:["*"],span:["col","colgroup"],spellcheck:["*"],src:["audio","embed","iframe","img","input","script","source","track","video"],srcdoc:["iframe"],srclang:["track"],srcset:["img","source"],start:["ol"],step:["input"],style:["*"],summary:["table"],tabIndex:["*"],target:["a","area","base","form"],title:["*"],translate:["*"],type:["button","input","embed","object","ol","script","source","style","menu","link"],usemap:["img","input","object"],value:["button","data","input","li","meter","option","progress","param","text"],width:["canvas","embed","iframe","img","input","object","video"],wrap:["textarea"]},U=Object.entries(q).reduce((m,[t,e])=>(e.forEach(i=>{m[i]||(m[i]=[]),m[i].push(t)}),m),{});function F(m,t){return U["*"].includes(t)||U[m]?.includes(t)}var b=class extends y{addHTMLProp(t,e,i,r,s){if(s&&s.length>0){let n=this.setDynamicHTMLProp(t,e,i,r);return this.addUpdateStatements(s,n),n}return this.setStaticHTMLProp(t,e,i,r)}insertNode(t,e,i){return this.t.expressionStatement(this.t.callExpression(this.t.identifier(this.importMap.insertNode),[this.t.identifier(t),this.t.identifier(e),this.t.numericLiteral(i)]))}setHTMLStyle(t,e){return this.t.expressionStatement(this.t.callExpression(this.t.identifier(this.importMap.setStyle),[this.t.identifier(t),e]))}setHTMLDataset(t,e){return this.t.expressionStatement(this.t.callExpression(this.t.identifier(this.importMap.setDataset),[this.t.identifier(t),e]))}setHTMLProp(t,e,i){return this.t.expressionStatement(this.t.assignmentExpression("=",this.t.memberExpression(this.t.identifier(t),this.t.identifier(e)),i))}setHTMLAttr(t,e,i){return this.t.expressionStatement(this.t.callExpression(this.t.memberExpression(this.t.identifier(t),this.t.identifier("setAttribute")),[this.t.stringLiteral(e),i]))}setHTMLEvent(t,e,i){return this.t.expressionStatement(this.t.callExpression(this.t.memberExpression(this.t.identifier(t),this.t.identifier("addEventListener")),[this.t.stringLiteral(e),i]))}setEvent(t,e,i){return this.t.expressionStatement(this.t.callExpression(this.t.identifier(this.importMap.setEvent),[this.t.identifier(t),this.t.stringLiteral(e),i]))}setCachedProp(t,e,i){return this.t.expressionStatement(this.t.callExpression(this.t.identifier(this.importMap.setHTMLProp),[this.t.identifier(t),this.t.stringLiteral(e),i]))}setCachedAttr(t,e,i){return this.t.expressionStatement(this.t.callExpression(this.t.identifier(this.importMap.setHTMLAttr),[this.t.identifier(t),this.t.stringLiteral(e),i]))}setHTMLPropObject(t,e){return this.t.expressionStatement(this.t.callExpression(this.t.identifier(this.importMap.setHTMLProps),[this.t.identifier(t),e]))}setHTMLAttrObject(t,e){return this.t.expressionStatement(this.t.callExpression(this.t.identifier(this.importMap.setHTMLAttrs),[this.t.identifier(t),e]))}commonHTMLPropKeys=["style","dataset","element","prop","attr","forwardProps"];addCommonHTMLProp(t,e,i){return e==="style"?this.setHTMLStyle(t,i):e==="dataset"?this.setHTMLDataset(t,i):e==="element"?this.setElement(t,i):e==="prop"?this.setHTMLPropObject(t,i):e==="attr"?this.setHTMLAttrObject(t,i):e==="forwardProps"?this.forwardProps(t):g.throw2()}setStaticHTMLProp(t,e,i,r){if(this.commonHTMLPropKeys.includes(i))return this.addCommonHTMLProp(t,i,r);if(i.startsWith("on")){let s=i.slice(2).toLowerCase();return this.setHTMLEvent(t,s,r)}return F(e,i)?(i==="class"?i="className":i==="for"&&(i="htmlFor"),this.setHTMLProp(t,i,r)):this.setHTMLAttr(t,i,r)}setDynamicHTMLProp(t,e,i,r){if(this.commonHTMLPropKeys.includes(i))return this.addCommonHTMLProp(t,i,r);if(i.startsWith("on")){let s=i.slice(2).toLowerCase();return this.setEvent(t,s,r)}return F(e,i)?(i==="class"?i="className":i==="for"&&(i="htmlFor"),this.setCachedProp(t,i,r)):this.setCachedAttr(t,i,r)}};var N=class extends b{run(){let{tag:t,props:e,children:i}=this.viewParticle,r=this.generateNodeName();if(this.addInitStatement(this.declareHTMLNode(r,t)),e){let s=this.t.isStringLiteral(t)?t.value:"ANY";Object.entries(e).forEach(([n,{value:a,dependencyIndexArr:h}])=>{this.addInitStatement(this.addHTMLProp(r,s,n,a,h))})}if(i){let s=[];i.forEach((n,a)=>{let[h,o]=this.generateChild(n);s.push(o),this.addInitStatement(...h),n.type==="html"?this.addInitStatement(this.appendChild(r,o)):this.addInitStatement(this.insertNode(r,o,a))}),this.addInitStatement(this.setHTMLNodes(r,s))}return r}declareHTMLNode(t,e){return this.t.variableDeclaration("const",[this.t.variableDeclarator(this.t.identifier(t),this.t.callExpression(this.t.identifier(this.importMap.createElement),[e]))])}setHTMLNodes(t,e){return this.t.expressionStatement(this.t.assignmentExpression("=",this.t.memberExpression(this.t.identifier(t),this.t.identifier("_$nodes")),this.t.arrayExpression(e.map(i=>this.t.identifier(i)))))}appendChild(t,e){return this.t.expressionStatement(this.t.callExpression(this.t.memberExpression(this.t.identifier(t),this.t.identifier("appendChild")),[this.t.identifier(e)]))}};var S=class extends b{run(){let{template:t,mutableParticles:e,props:i}=this.viewParticle,r=this.generateNodeName(),s=this.addTemplate(t);this.addInitStatement(this.declareTemplateNode(r,s));let n=[];i.forEach(({path:o})=>{n.push(o)}),e.forEach(({path:o})=>{n.push(o.slice(0,-1))});let[a,h]=this.insertElements(n,r);return this.addInitStatement(...a),i.forEach(({tag:o,path:p,key:d,value:l,dependencyIndexArr:c})=>{let P=h[p.join(".")];this.addInitStatement(this.addHTMLProp(P,o,d,l,c))}),e.forEach(o=>{let p=o.path,d=h[p.slice(0,-1).join(".")],[l,c]=this.generateChild(o);this.addInitStatement(...l),this.addInitStatement(this.insertNode(d,c,p[p.length-1]))}),r}addTemplate(t){let e=this.generateTemplateName();return this.addStaticClassProperty(e,this.t.callExpression(this.t.identifier(this.importMap.createTemplate),[this.t.stringLiteral(t)])),e}declareTemplateNode(t,e){return this.t.variableDeclaration("const",[this.t.variableDeclarator(this.t.identifier(t),this.t.callExpression(this.t.memberExpression(this.t.identifier(this.className),this.t.identifier(e)),[]))])}insertElement(t,e,i){let r=this.generateNodeName();if(e.length===0)return this.t.variableDeclaration("const",[this.t.variableDeclarator(this.t.identifier(r),Array.from({length:i}).reduce(p=>this.t.memberExpression(p,this.t.identifier("nextSibling")),this.t.identifier(t)))]);let s=p=>this.t.memberExpression(p,this.t.identifier("firstChild")),n=p=>this.t.memberExpression(s(p),this.t.identifier("nextSibling")),a=p=>this.t.memberExpression(n(p),this.t.identifier("nextSibling")),h=(p,d)=>this.t.memberExpression(this.t.memberExpression(p,this.t.identifier("childNodes")),this.t.numericLiteral(d),!0),o=p=>this.t.memberExpression(p,this.t.identifier("nextSibling"));return this.t.variableDeclaration("const",[this.t.variableDeclarator(this.t.identifier(r),e.reduce((p,d,l)=>{if(l===0&&i>0)for(let c=0;c<i;c++)p=o(p);return d===0?s(p):d===1?n(p):d===2?a(p):h(p,d)},this.t.identifier(t)))])}insertElements(t,e){let[i,r]=b.statementsCollector(),s={[e]:[]};S.pathWithCommonPrefix(t).forEach(h=>{let o=S.findBestNodeAndPath(s,h,e),[,p,d]=o,l=o[0];(p.length!==0||d!==0)&&(r(this.insertElement(l,p,d)),l=this.generateNodeName(this.nodeIdx),s[l]=h)});let a=Object.fromEntries(Object.entries(s).map(([h,o])=>[o.join("."),h]));return[i,a]}static pathWithCommonPrefix(t){let e=[...t];t.forEach(s=>{t.forEach(n=>{if(s!==n){for(let a=0;a<s.length;a++)if(s[a]!==n[a]){a!==0&&e.push(s.slice(0,a));break}}})});let i=e.sort((s,n)=>s.length!==n.length?s.length-n.length:s[0]-n[0]);return[...new Set(i.map(s=>s.join(".")))].map(s=>s.split(".").filter(Boolean).map(Number))}static findBestNodeAndPath(t,e,i){let r=0,s,n;return Object.entries(t).forEach(([a,h])=>{let o=0,p=h.length;for(let d=0;d<p;d++)h[d]===e[d]&&o++;if(o===p-1){let d=e[p-1]-h[p-1];d>0&&d<=3&&(n=[a,o,d])}o===h.length&&o>r&&(s=a,r=o)}),s?[s,e.slice(r),0]:n?[n[0],e.slice(n[1]+1),n[2]]:[i,e,0]}};var C=class extends u{run(){let{item:t,array:e,key:i,children:r}=this.viewParticle,s=this.generateNodeName();return this.addInitStatement(this.declareForNode(s,e.value,t,r,u.calcDependencyNum(e.dependencyIndexArr),i)),this.addUpdateStatements(e.dependencyIndexArr,this.updateForNode(s,e.value,t,i)),this.addUpdateStatementsWithoutDep(this.updateForNodeItem(s)),s}declareForNode(t,e,i,r,s,n){let[a,h,o]=this.generateChildren(r,!1);return Object.keys(o).length>0&&a.push(this.t.expressionStatement(this.t.assignmentExpression("=",this.t.memberExpression(this.t.identifier(h[0]),this.t.identifier("_$updateFunc")),this.t.arrowFunctionExpression([this.t.identifier("changed"),i],this.geneUpdateBody(o))))),a.push(this.generateReturnStatement(h)),this.t.variableDeclaration("const",[this.t.variableDeclarator(this.t.identifier(t),this.t.newExpression(this.t.identifier(this.importMap.ForNode),[e,this.t.arrowFunctionExpression([i],this.t.blockStatement(a)),this.t.numericLiteral(s),...this.getForKeyStatement(e,i,n)]))])}getForKeyStatement(t,e,i){return i?[this.t.callExpression(this.t.memberExpression(t,this.t.identifier("map")),[this.t.arrowFunctionExpression([e],i)])]:[]}updateForNode(t,e,i,r){return this.t.expressionStatement(this.t.callExpression(this.t.memberExpression(this.t.identifier(t),this.t.identifier("updateArray")),[e,...this.getForKeyStatement(e,i,r)]))}updateForNodeItem(t){return this.t.expressionStatement(this.t.callExpression(this.t.memberExpression(this.t.identifier(t),this.t.identifier("update")),[this.t.identifier("changed")]))}};var M=class extends u{run(){let{branches:t}=this.viewParticle,e=t.flatMap(({condition:r})=>r.dependencyIndexArr??[]),i=this.generateNodeName();return this.addInitStatement(this.declareIfNode(i,t,u.calcDependencyNum(e))),this.addUpdateStatements(e,this.updateIfNodeCond(i)),this.addUpdateStatementsWithoutDep(this.updateIfNode(i)),i}geneUpdateFunc(t,e){return this.t.expressionStatement(this.t.assignmentExpression("=",this.t.memberExpression(this.t.identifier(t),this.t.identifier("_$updateFunc")),this.t.arrowFunctionExpression([this.t.identifier("changed")],this.geneUpdateBody(e))))}geneCondIdx(t,e){return this.t.expressionStatement(this.t.assignmentExpression("=",this.t.memberExpression(this.t.identifier(t),this.t.identifier("cond")),this.t.numericLiteral(e)))}geneCondCheck(t){return this.t.ifStatement(this.t.binaryExpression("===",this.t.memberExpression(this.t.identifier("$thisIf"),this.t.identifier("cond")),this.t.numericLiteral(t)),this.t.returnStatement())}geneIfStatement(t,e,i){return this.t.ifStatement(t,this.t.blockStatement(e),i)}declareIfNode(t,e,i){let r=!1,s=e.reverse().reduce((n,{condition:a,children:h},o)=>{let[p,d,l]=this.generateChildren(h,!1);return p.unshift(this.geneCondCheck(e.length-o-1)),Object.keys(l).length>0&&p.push(this.geneUpdateFunc(d[0],l)),p.push(this.geneCondIdx("$thisIf",e.length-o-1)),p.push(this.generateReturnStatement(d)),o===0&&this.t.isBooleanLiteral(a.value,{value:!0})?(r=!0,this.t.blockStatement(p)):this.geneIfStatement(a.value,p,n)},void 0);return r||(s.alternate=this.t.blockStatement([this.geneCondIdx("$thisIf",-1),this.t.returnStatement(this.t.arrayExpression([]))])),this.t.variableDeclaration("const",[this.t.variableDeclarator(this.t.identifier(t),this.t.newExpression(this.t.identifier(this.importMap.IfNode),[this.t.arrowFunctionExpression([this.t.identifier("$thisIf")],this.t.blockStatement([s])),this.t.numericLiteral(i)]))])}updateIfNodeCond(t){return this.t.expressionStatement(this.t.callExpression(this.t.memberExpression(this.t.identifier(t),this.t.identifier("updateCond")),[]))}updateIfNode(t){return this.t.expressionStatement(this.t.callExpression(this.t.memberExpression(this.t.identifier(t),this.t.identifier("update")),[this.t.identifier("changed")]))}};var L=class extends f{run(){let{props:t}=this.viewParticle;t=this.alterPropViews(t);let{children:e}=this.viewParticle,i=this.generateNodeName();return this.addInitStatement(this.declareEnvNode(i,t)),this.addInitStatement(this.geneEnvChildren(i,e)),Object.entries(t).forEach(([r,{dependencyIndexArr:s,value:n}])=>{s&&this.addUpdateStatements(s,this.updateEnvNode(i,r,n))}),i}generateEnvs(t){return this.t.objectExpression(Object.entries(t).map(([e,{value:i}])=>this.t.objectProperty(this.t.identifier(e),i)))}declareEnvNode(t,e){return this.t.variableDeclaration("const",[this.t.variableDeclarator(this.t.identifier(t),this.t.newExpression(this.t.identifier(this.importMap.EnvNode),[this.generateEnvs(e)]))])}geneEnvChildren(t,e){let[i,r]=this.generateChildren(e);return this.addInitStatement(...i),this.t.expressionStatement(this.t.callExpression(this.t.memberExpression(this.t.identifier(t),this.t.identifier("initNodes")),[this.t.arrayExpression(r.map(s=>this.t.identifier(s)))]))}updateEnvNode(t,e,i){return this.t.expressionStatement(this.t.callExpression(this.t.memberExpression(this.t.identifier(t),this.t.identifier("updateEnv")),[this.t.stringLiteral(e),i]))}};var V=class extends u{run(){let{content:t}=this.viewParticle,e=this.generateNodeName();return this.addInitStatement(this.declareTextNode(e,t.value)),t.dependencyIndexArr&&t.dependencyIndexArr.length>0&&this.addUpdateStatements(t.dependencyIndexArr,this.updateTextNode(e,t.value)),e}declareTextNode(t,e){return this.t.variableDeclaration("const",[this.t.variableDeclarator(this.t.identifier(t),this.t.callExpression(this.t.identifier(this.importMap.createTextNode),[e]))])}updateTextNode(t,e){return this.t.expressionStatement(this.t.callExpression(this.t.identifier(this.importMap.updateText),[this.t.identifier(t),e]))}};var T=class extends E{run(){let{content:t,props:e}=this.viewParticle;t=this.alterPropView(t),e=this.alterPropViews(e);let i=this.generateNodeName();return this.addInitStatement(this.declareExpNode(i,t.value)),t.dependencyIndexArr&&t.dependencyIndexArr.length>0&&this.addUpdateStatements(t.dependencyIndexArr,this.updateExpNode(i)),e&&Object.entries(e).forEach(([r,{value:s,dependencyIndexArr:n}])=>{let a=this.setExpProp(i,r,s);a&&(this.addInitStatement(a),n=[...n??[],...t.dependencyIndexArr??[]],n.length>0&&this.addUpdateStatements(n,a))}),i}setExpProp(t,e,i){return e==="element"?this.setElement(t,i,!0):e==="do"?this.addDo(t,i):g.warn1()}declareExpNode(t,e){return this.t.variableDeclaration("const",[this.t.variableDeclarator(this.t.identifier(t),this.t.newExpression(this.t.identifier(this.importMap.ExpNode),[this.t.arrowFunctionExpression([],e)]))])}updateExpNode(t){return this.t.expressionStatement(this.t.callExpression(this.t.memberExpression(this.t.identifier(t),this.t.identifier("update")),[]))}};var D=class extends f{run(){let{props:t}=this.viewParticle;t=this.alterPropViews(t);let{tag:e}=this.viewParticle,i=this.generateNodeName();this.addInitStatement(this.declareSubviewNode(i,e,t??{}));let r=this.subViewPropMap[e]??[];return t&&Object.entries(t).forEach(([s,{value:n,dependencyIndexArr:a}])=>{if(!a||a.length===0)return;let o=1<<r.indexOf(s);this.addUpdateStatements(a,this.updateProp(i,o,s,n))}),this.addUpdateStatementsWithoutDep(this.updateSubView(i)),i}genePropNode(t){return this.t.objectExpression(Object.entries(t).map(([e,i])=>this.t.objectProperty(this.t.identifier(e),i.value)))}declareSubviewNode(t,e,i){return this.t.variableDeclaration("const",[this.t.variableDeclarator(this.t.identifier(t),this.t.callExpression(this.t.memberExpression(this.t.thisExpression(),this.t.identifier(e)),[this.genePropNode(i)]))])}updateProp(t,e,i,r){return this.t.expressionStatement(this.t.optionalCallExpression(this.t.memberExpression(this.t.identifier(t),this.t.identifier("updateProp")),[this.t.numericLiteral(e),this.t.objectExpression([this.t.objectProperty(this.t.identifier(i),r)])],!0))}updateSubView(t){return this.t.expressionStatement(this.t.optionalCallExpression(this.t.memberExpression(this.t.identifier(t),this.t.identifier("update")),[this.t.identifier("changed")],!0))}};var R=class{config;t;constructor(t){this.config=t,this.t=t.babelApi.types,this.templateIdx=t.templateIdx}generateChildren(t){let e=[],i=[],r={},s=[];return t.forEach(n=>{let[a,h,o,p]=this.generateChild(n);e.push(...a),Object.entries(h).forEach(([d,l])=>{r[Number(d)]||(r[Number(d)]=[]),r[Number(d)].push(...l)}),i.push(...o),s.push(p)}),[e,r,i,s]}nodeIdx=-1;templateIdx=-1;generateChild(t){let{type:e}=t,i=R.generatorMap[e];if(!i)throw new Error(`Unknown view particle type: ${e}`);let r=new i(t,this.config);r.nodeIdx=this.nodeIdx,r.templateIdx=this.templateIdx;let s=r.generate();return this.nodeIdx=r.nodeIdx,this.templateIdx=r.templateIdx,s}},x=R;O(x,"generatorMap",{comp:I,html:N,template:S,for:C,if:M,env:L,text:V,exp:T,subview:D});var j=class extends x{generate(t){let e=[],i=[],r={},s=[];return t.forEach(a=>{let[h,o,p,d]=this.generateChild(a);i.push(...h),Object.entries(o).forEach(([l,c])=>{r[Number(l)]||(r[Number(l)]=[]),r[Number(l)].push(...c)}),e.push(...p),s.push(d)}),[this.t.blockStatement([...i,...this.geneUpdate(r),this.geneReturn(s)]),e,this.templateIdx]}geneUpdate(t){return Object.keys(t).length===0?[]:[this.t.expressionStatement(this.t.assignmentExpression("=",this.t.memberExpression(this.t.thisExpression(),this.t.identifier("_$update"),!1),this.t.arrowFunctionExpression([this.t.identifier("changed")],this.t.blockStatement([...Object.entries(t).filter(([e])=>e!=="0").map(([e,i])=>this.t.ifStatement(this.t.binaryExpression("&",this.t.identifier("changed"),this.t.numericLiteral(Number(e))),this.t.blockStatement(i))),...t[0]??[]]))))]}geneReturn(t){return this.t.returnStatement(this.t.arrayExpression(t.map(e=>this.t.identifier(e))))}};var H=class extends x{generate(t,e,i){let r=[],s=[],n={},a={},h=[],o=this.templateIdx;return t.forEach(d=>{let[l,c,P,G]=this.generateChild(d);s.push(...l),Object.entries(c).forEach(([k,A])=>{n[Number(k)]||(n[Number(k)]=[]),n[Number(k)].push(...A)}),r.push(...P),h.push(G)}),this.templateIdx=o,this.nodeIdx=-1,e.forEach(d=>{let[,l]=this.generateChild(d);Object.entries(l).forEach(([c,P])=>{a[Number(c)]||(a[Number(c)]=[]),a[Number(c)].push(...P)})}),[this.t.blockStatement([...s,this.geneReturn(h,n,a,i)]),r,this.templateIdx]}geneUpdateBody(t,e){let i=[this.t.identifier("changed")];if(e&&i.push(this.t.identifier("$subviewProps")),e){let s=e.properties.filter(n=>this.t.isObjectProperty(n));Object.entries(t).forEach(([n,a])=>{let h=Number(n);s.forEach((o,p)=>{h&1<<p&&a.unshift(this.t.expressionStatement(this.t.assignmentExpression("=",this.t.objectPattern([o]),this.t.identifier("$subviewProps"))))})})}let r=e?[]:t[0]??[];return this.t.arrowFunctionExpression(i,this.t.blockStatement([...Object.entries(t).filter(([s])=>s!=="0").map(([s,n])=>this.t.ifStatement(this.t.binaryExpression("&",this.t.identifier("changed"),this.t.numericLiteral(Number(s))),this.t.blockStatement(n))),...r]))}geneReturn(t,e,i,r){let s=Object.keys(e).length>0?[this.t.objectProperty(this.t.identifier("update"),this.geneUpdateBody(e))]:[],n=Object.keys(i).filter(a=>a!=="0").length>0?[this.t.objectProperty(this.t.identifier("updateProp"),this.geneUpdateBody(i,r))]:[];return this.t.returnStatement(this.t.objectExpression([this.t.objectProperty(this.t.identifier("_$dlNodeType"),this.t.numericLiteral(5)),...s,...n,this.t.objectProperty(this.t.identifier("_$nodes"),this.t.arrayExpression(t.map(a=>this.t.identifier(a))))]))}};function Jt(m,t){return new j(t).generate(m)}function Qt(m,t,e,i){return new H(i).generate(m,t,e)}export{Qt as generateSubView,Jt as generateView}; | ||
var B=Object.defineProperty;var $=(m,t,e)=>t in m?B(m,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):m[t]=e;var O=(m,t,e)=>($(m,typeof t!="symbol"?t+"":t,e),e);import{createErrorHandler as W}from"@dlightjs/error-handler";var g=W("ViewGenerator",{1:"Element prop in HTML should be a function or an identifier",2:"Unrecognized HTML common prop",3:"Do prop only accepts function or arrow function"},{},{1:'ExpressionNode only supports prop as ["element", "do"]'});var K=process.env.NODE_ENV==="development",v=class{viewParticle;config;t;traverse;className;importMap;subViewPropMap;viewGenerator;constructor(t,e){this.viewParticle=t,this.config=e,this.t=e.babelApi.types,this.traverse=e.babelApi.traverse,this.className=e.className,this.importMap=e.importMap,this.subViewPropMap=e.subViewPropMap,this.viewGenerator=new x(e)}initStatements=[];addInitStatement(...t){this.initStatements.push(...t)}classProperties=[];addStaticClassProperty(t,e){this.classProperties.push(this.t.classProperty(this.t.identifier(t),e,void 0,void 0,void 0,!0))}updateStatements={};addUpdateStatements(t,e){if(!t||t.length===0)return;let i=v.calcDependencyNum(t);this.updateStatements[i]||(this.updateStatements[i]=[]),this.updateStatements[i].push(e)}addUpdateStatementsWithoutDep(t){this.updateStatements[0]||(this.updateStatements[0]=[]),this.updateStatements[0].push(t)}generate(){let t=this.run();return[this.initStatements,this.updateStatements,this.classProperties,t]}generateChildren(t,e=!0){this.viewGenerator.nodeIdx=this.nodeIdx,this.viewGenerator.templateIdx=this.templateIdx;let[i,r,s,n]=this.viewGenerator.generateChildren(t);return this.nodeIdx=this.viewGenerator.nodeIdx,this.templateIdx=this.viewGenerator.templateIdx,this.classProperties.push(...s),e&&this.mergeStatements(r),[i,n,r]}mergeStatements(t){Object.entries(t).forEach(([e,i])=>{this.updateStatements[Number(e)]||(this.updateStatements[Number(e)]=[]),this.updateStatements[Number(e)].push(...i)})}generateChild(t,e=!0){this.viewGenerator.nodeIdx=this.nodeIdx,this.viewGenerator.templateIdx=this.templateIdx;let[i,r,s,n]=this.viewGenerator.generateChild(t);return this.nodeIdx=this.viewGenerator.nodeIdx,this.templateIdx=this.viewGenerator.templateIdx,this.classProperties.push(...s),e&&this.mergeStatements(r),[i,n,r]}geneUpdateBody(t){return this.t.blockStatement([...Object.entries(t).filter(([e])=>e!=="0").map(([e,i])=>this.t.ifStatement(this.t.binaryExpression("&",this.t.identifier("changed"),this.t.numericLiteral(Number(e))),this.t.blockStatement(i))),...t[0]??[]])}generateReturnStatement(t){return this.t.returnStatement(this.t.arrayExpression(t.map(e=>this.t.identifier(e))))}run(){return""}nodeIdx=-1;generateNodeName(t){return`${v.prefixMap.node}${t??++this.nodeIdx}`}templateIdx=-1;generateTemplateName(){return`${v.prefixMap.template}${++this.templateIdx}`}static calcDependencyNum(t){return!t||t.length===0?0:(t=[...new Set(t)],t.reduce((e,i)=>e+(1<<i),0))}valueWrapper(t){return this.t.file(this.t.program([this.t.isStatement(t)?t:this.t.expressionStatement(t)]))}static statementsCollector(){let t=[];return[t,(...i)=>{i.forEach(r=>{Array.isArray(r)?t.push(...r):t.push(r)})}]}},u=v;O(u,"prefixMap",K?{template:"$template",node:"$node"}:{template:"$t",node:"$n"});var f=class extends u{alterPropViews(t){return t&&Object.fromEntries(Object.entries(t).map(([e,i])=>[e,this.alterPropView(i)]))}declarePropView(t){let[e,i,r]=this.generateChildren(t,!1);i.length>0&&(Object.keys(r).length>0&&e.push(this.t.expressionStatement(this.t.assignmentExpression("=",this.t.memberExpression(this.t.identifier(i[0]),this.t.identifier("_$updateFunc")),this.t.arrowFunctionExpression([this.t.identifier("changed")],this.geneUpdateBody(r))))),e.push(this.generateReturnStatement(i)));let s=this.generateNodeName(),n=this.t.variableDeclaration("const",[this.t.variableDeclarator(this.t.identifier(s),this.t.newExpression(this.t.identifier(this.importMap.PropView),[this.t.arrowFunctionExpression([],this.t.blockStatement(e))]))]);this.addInitStatement(n);let a=this.t.identifier(s);return this.addUpdateStatements(f.reverseDependencyIndexArr(r),this.t.expressionStatement(this.t.callExpression(this.t.memberExpression(a,this.t.identifier("update")),[this.t.identifier("changed")]))),s}alterPropView(t){if(!t)return t;let{value:e,viewPropMap:i}=t;if(!i)return{...t,value:e};let r=e;return this.traverse(this.valueWrapper(e),{StringLiteral:s=>{let n=s.node.value,a=i[n];if(!a)return;let h=this.t.identifier(this.declarePropView(a));e===s.node&&(r=h),s.replaceWith(h),s.skip()}}),{...t,value:r}}static reverseDependencyIndexArr(t){let e=Object.keys(t).map(Number).reduce((r,s)=>r|s,0),i=[];for(let r=0;r<String(e).length;r++)e&1<<r&&i.push(r);return i}};var w=class extends f{addDo(t,e){return!this.t.isFunctionExpression(e)&&!this.t.isArrowFunctionExpression(e)?g.throw1():this.t.expressionStatement(this.t.callExpression(e,[this.t.identifier(t)]))}};var E=class extends w{setElement(t,e,i=!1){let r=i?this.t.memberExpression(this.t.identifier(t),this.t.identifier("_$el")):this.t.identifier(t);return this.isOnlyMemberExpression(e)?this.assignHTMLElement(r,e):this.assignHTMLFunctionElement(r,e)}assignHTMLElement(t,e){return this.t.ifStatement(this.t.binaryExpression("===",this.t.unaryExpression("typeof",e,!0),this.t.stringLiteral("function")),this.t.expressionStatement(this.t.callExpression(e,[t])),this.t.expressionStatement(this.t.assignmentExpression("=",e,t)))}assignHTMLFunctionElement(t,e){return!this.t.isFunctionExpression(e)&&!this.t.isArrowFunctionExpression(e)?g.throw1():this.t.expressionStatement(this.t.callExpression(e,[t]))}isOnlyMemberExpression(t){if(!this.t.isMemberExpression(t))return!1;for(;t.property;)if(this.t.isMemberExpression(t.property)){t=t.property;continue}else{if(this.t.isIdentifier(t.property))break;return!1}return!0}};var y=class extends E{forwardProps(t){return this.t.expressionStatement(this.t.callExpression(this.t.memberExpression(this.t.thisExpression(),this.t.identifier("_$addForwardProps")),[this.t.identifier(t)]))}};var I=class extends y{run(){let{content:t,props:e}=this.viewParticle;t=this.alterPropView(t),e=this.alterPropViews(e);let{tag:i,children:r}=this.viewParticle,s=this.generateNodeName();if(this.addInitStatement(this.declareCompNode(s,i,t,e,r)),t){let{value:n,dependencyIndexArr:a}=t;a&&a.length>0&&this.addUpdateStatements(a,this.setCompContent(s,n))}return e&&Object.entries(e).forEach(([n,{value:a,dependencyIndexArr:h}])=>{if(n==="do"){let o=this.addDo(s,a);this.addInitStatement(o),this.addUpdateStatements(h,o);return}if(n==="element"){let o=this.setElement(s,a,!0);this.addInitStatement(o),this.addUpdateStatements(h,o);return}n!=="forwardProps"&&h&&h.length>0&&this.addUpdateStatements(h,this.setCompProp(s,n,a))}),s}generateCompProps(t){return!t||Object.keys(t).length===0?this.t.nullLiteral():this.t.objectExpression(Object.entries(t).map(([e,{value:i}])=>this.t.objectProperty(this.t.identifier(e),i)))}declareCompNode(t,e,i,r,s){let n=!1;return r&&("forwardProps"in r&&(n=!0),r=Object.fromEntries(Object.entries(r).filter(([a])=>!["do","element","forwardProps"].includes(a)))),this.t.variableDeclaration("const",[this.t.variableDeclarator(this.t.identifier(t),this.t.newExpression(e,[this.generateCompProps(r),i?.value??this.t.nullLiteral(),s&&s.length>0?this.t.identifier(this.declarePropView(s)):this.t.nullLiteral(),n?this.t.identifier("this"):this.t.nullLiteral()]))])}setCompContent(t,e){return this.t.expressionStatement(this.t.callExpression(this.t.memberExpression(this.t.identifier(t),this.t.identifier("_$setContent")),[e]))}setCompProp(t,e,i){return this.t.expressionStatement(this.t.callExpression(this.t.memberExpression(this.t.identifier(t),this.t.identifier("_$setProp")),[this.t.stringLiteral(e),i]))}};var q={textContent:["*"],innerHTML:["*"],accept:["form","input"],acceptCharset:["form"],accesskey:["*"],action:["form"],align:["caption","col","colgroup","hr","iframe","img","table","tbody","td","tfoot","th","thead","tr"],allow:["iframe"],alt:["area","img","input"],async:["script"],autocapitalize:["*"],autocomplete:["form","input","select","textarea"],autofocus:["button","input","select","textarea"],autoplay:["audio","video"],background:["body","table","td","th"],bgColor:["body","col","colgroup","marquee","table","tbody","tfoot","td","th","tr"],border:["img","object","table"],buffered:["audio","video"],capture:["input"],charset:["meta"],checked:["input"],cite:["blockquote","del","ins","q"],class:["*"],color:["font","hr"],cols:["textarea"],colSpan:["td","th"],content:["meta"],contentEditable:["*"],contextmenu:["*"],controls:["audio","video"],coords:["area"],crossOrigin:["audio","img","link","script","video"],csp:["iframe"],data:["object"],dateTime:["del","ins","time"],decoding:["img"],default:["track"],defer:["script"],dir:["*"],dirname:["input","textarea"],disabled:["button","fieldset","input","optgroup","option","select","textarea"],download:["a","area"],draggable:["*"],enctype:["form"],enterKeyHint:["textarea","contenteditable"],for:["label","output"],form:["button","fieldset","input","label","meter","object","output","progress","select","textarea"],formAction:["input","button"],formEnctype:["button","input"],formMethod:["button","input"],formNoValidate:["button","input"],formTarget:["button","input"],headers:["td","th"],height:["canvas","embed","iframe","img","input","object","video"],hidden:["*"],high:["meter"],href:["a","area","base","link"],hreflang:["a","link"],httpEquiv:["meta"],id:["*"],integrity:["link","script"],intrinsicSize:["img"],inputMode:["textarea","contenteditable"],ismap:["img"],itemProp:["*"],kind:["track"],label:["optgroup","option","track"],lang:["*"],language:["script"],loading:["img","iframe"],list:["input"],loop:["audio","marquee","video"],low:["meter"],manifest:["html"],max:["input","meter","progress"],maxLength:["input","textarea"],minLength:["input","textarea"],media:["a","area","link","source","style"],method:["form"],min:["input","meter"],multiple:["input","select"],muted:["audio","video"],name:["button","form","fieldset","iframe","input","object","output","select","textarea","map","meta","param"],noValidate:["form"],open:["details","dialog"],optimum:["meter"],pattern:["input"],ping:["a","area"],placeholder:["input","textarea"],playsInline:["video"],poster:["video"],preload:["audio","video"],readonly:["input","textarea"],referrerPolicy:["a","area","iframe","img","link","script"],rel:["a","area","link"],required:["input","select","textarea"],reversed:["ol"],role:["*"],rows:["textarea"],rowSpan:["td","th"],sandbox:["iframe"],scope:["th"],scoped:["style"],selected:["option"],shape:["a","area"],size:["input","select"],sizes:["link","img","source"],slot:["*"],span:["col","colgroup"],spellcheck:["*"],src:["audio","embed","iframe","img","input","script","source","track","video"],srcdoc:["iframe"],srclang:["track"],srcset:["img","source"],start:["ol"],step:["input"],style:["*"],summary:["table"],tabIndex:["*"],target:["a","area","base","form"],title:["*"],translate:["*"],type:["button","input","embed","object","ol","script","source","style","menu","link"],usemap:["img","input","object"],value:["button","data","input","li","meter","option","progress","param","text"],width:["canvas","embed","iframe","img","input","object","video"],wrap:["textarea"]},U=Object.entries(q).reduce((m,[t,e])=>(e.forEach(i=>{m[i]||(m[i]=[]),m[i].push(t)}),m),{});function F(m,t){return U["*"].includes(t)||U[m]?.includes(t)}var b=class extends y{addHTMLProp(t,e,i,r,s){if(s&&s.length>0){let n=this.setDynamicHTMLProp(t,e,i,r);return this.addUpdateStatements(s,n),n}return this.setStaticHTMLProp(t,e,i,r)}insertNode(t,e,i){return this.t.expressionStatement(this.t.callExpression(this.t.identifier(this.importMap.insertNode),[this.t.identifier(t),this.t.identifier(e),this.t.numericLiteral(i)]))}setHTMLStyle(t,e){return this.t.expressionStatement(this.t.callExpression(this.t.identifier(this.importMap.setStyle),[this.t.identifier(t),e]))}setHTMLDataset(t,e){return this.t.expressionStatement(this.t.callExpression(this.t.identifier(this.importMap.setDataset),[this.t.identifier(t),e]))}setHTMLProp(t,e,i){return this.t.expressionStatement(this.t.assignmentExpression("=",this.t.memberExpression(this.t.identifier(t),this.t.identifier(e)),i))}setHTMLAttr(t,e,i){return this.t.expressionStatement(this.t.callExpression(this.t.memberExpression(this.t.identifier(t),this.t.identifier("setAttribute")),[this.t.stringLiteral(e),i]))}setHTMLEvent(t,e,i){return this.t.expressionStatement(this.t.callExpression(this.t.memberExpression(this.t.identifier(t),this.t.identifier("addEventListener")),[this.t.stringLiteral(e),i]))}setEvent(t,e,i){return this.t.expressionStatement(this.t.callExpression(this.t.identifier(this.importMap.setEvent),[this.t.identifier(t),this.t.stringLiteral(e),i]))}setCachedProp(t,e,i){return this.t.expressionStatement(this.t.callExpression(this.t.identifier(this.importMap.setHTMLProp),[this.t.identifier(t),this.t.stringLiteral(e),i]))}setCachedAttr(t,e,i){return this.t.expressionStatement(this.t.callExpression(this.t.identifier(this.importMap.setHTMLAttr),[this.t.identifier(t),this.t.stringLiteral(e),i]))}setHTMLPropObject(t,e){return this.t.expressionStatement(this.t.callExpression(this.t.identifier(this.importMap.setHTMLProps),[this.t.identifier(t),e]))}setHTMLAttrObject(t,e){return this.t.expressionStatement(this.t.callExpression(this.t.identifier(this.importMap.setHTMLAttrs),[this.t.identifier(t),e]))}commonHTMLPropKeys=["style","dataset","element","prop","attr","forwardProps"];addCommonHTMLProp(t,e,i){return e==="style"?this.setHTMLStyle(t,i):e==="dataset"?this.setHTMLDataset(t,i):e==="element"?this.setElement(t,i):e==="prop"?this.setHTMLPropObject(t,i):e==="attr"?this.setHTMLAttrObject(t,i):e==="forwardProps"?this.forwardProps(t):g.throw2()}setStaticHTMLProp(t,e,i,r){if(this.commonHTMLPropKeys.includes(i))return this.addCommonHTMLProp(t,i,r);if(i.startsWith("on")){let s=i.slice(2).toLowerCase();return this.setHTMLEvent(t,s,r)}return F(e,i)?(i==="class"?i="className":i==="for"&&(i="htmlFor"),this.setHTMLProp(t,i,r)):this.setHTMLAttr(t,i,r)}setDynamicHTMLProp(t,e,i,r){if(this.commonHTMLPropKeys.includes(i))return this.addCommonHTMLProp(t,i,r);if(i.startsWith("on")){let s=i.slice(2).toLowerCase();return this.setEvent(t,s,r)}return F(e,i)?(i==="class"?i="className":i==="for"&&(i="htmlFor"),this.setCachedProp(t,i,r)):this.setCachedAttr(t,i,r)}};var N=class extends b{run(){let{tag:t,props:e,children:i}=this.viewParticle,r=this.generateNodeName();if(this.addInitStatement(this.declareHTMLNode(r,t)),e){let s=this.t.isStringLiteral(t)?t.value:"ANY";Object.entries(e).forEach(([n,{value:a,dependencyIndexArr:h}])=>{this.addInitStatement(this.addHTMLProp(r,s,n,a,h))})}if(i){let s=[];i.forEach((n,a)=>{let[h,o]=this.generateChild(n);s.push(o),this.addInitStatement(...h),n.type==="html"?this.addInitStatement(this.appendChild(r,o)):this.addInitStatement(this.insertNode(r,o,a))}),this.addInitStatement(this.setHTMLNodes(r,s))}return r}declareHTMLNode(t,e){return this.t.variableDeclaration("const",[this.t.variableDeclarator(this.t.identifier(t),this.t.callExpression(this.t.identifier(this.importMap.createElement),[e]))])}setHTMLNodes(t,e){return this.t.expressionStatement(this.t.assignmentExpression("=",this.t.memberExpression(this.t.identifier(t),this.t.identifier("_$nodes")),this.t.arrayExpression(e.map(i=>this.t.identifier(i)))))}appendChild(t,e){return this.t.expressionStatement(this.t.callExpression(this.t.memberExpression(this.t.identifier(t),this.t.identifier("appendChild")),[this.t.identifier(e)]))}};var S=class extends b{run(){let{template:t,mutableParticles:e,props:i}=this.viewParticle,r=this.generateNodeName(),s=this.addTemplate(t);this.addInitStatement(this.declareTemplateNode(r,s));let n=[];i.forEach(({path:o})=>{n.push(o)}),e.forEach(({path:o})=>{n.push(o.slice(0,-1))});let[a,h]=this.insertElements(n,r);return this.addInitStatement(...a),i.forEach(({tag:o,path:p,key:d,value:l,dependencyIndexArr:c})=>{let P=h[p.join(".")];this.addInitStatement(this.addHTMLProp(P,o,d,l,c))}),e.forEach(o=>{let p=o.path,d=h[p.slice(0,-1).join(".")],[l,c]=this.generateChild(o);this.addInitStatement(...l),this.addInitStatement(this.insertNode(d,c,p[p.length-1]))}),r}addTemplate(t){let e=this.generateTemplateName();return this.addStaticClassProperty(e,this.t.callExpression(this.t.identifier(this.importMap.createTemplate),[this.t.stringLiteral(t)])),e}declareTemplateNode(t,e){return this.t.variableDeclaration("const",[this.t.variableDeclarator(this.t.identifier(t),this.t.callExpression(this.t.memberExpression(this.t.identifier(this.className),this.t.identifier(e)),[]))])}insertElement(t,e,i){let r=this.generateNodeName();if(e.length===0)return this.t.variableDeclaration("const",[this.t.variableDeclarator(this.t.identifier(r),Array.from({length:i}).reduce(p=>this.t.memberExpression(p,this.t.identifier("nextSibling")),this.t.identifier(t)))]);let s=p=>this.t.memberExpression(p,this.t.identifier("firstChild")),n=p=>this.t.memberExpression(s(p),this.t.identifier("nextSibling")),a=p=>this.t.memberExpression(n(p),this.t.identifier("nextSibling")),h=(p,d)=>this.t.memberExpression(this.t.memberExpression(p,this.t.identifier("childNodes")),this.t.numericLiteral(d),!0),o=p=>this.t.memberExpression(p,this.t.identifier("nextSibling"));return this.t.variableDeclaration("const",[this.t.variableDeclarator(this.t.identifier(r),e.reduce((p,d,l)=>{if(l===0&&i>0)for(let c=0;c<i;c++)p=o(p);return d===0?s(p):d===1?n(p):d===2?a(p):h(p,d)},this.t.identifier(t)))])}insertElements(t,e){let[i,r]=b.statementsCollector(),s={[e]:[]};S.pathWithCommonPrefix(t).forEach(h=>{let o=S.findBestNodeAndPath(s,h,e),[,p,d]=o,l=o[0];(p.length!==0||d!==0)&&(r(this.insertElement(l,p,d)),l=this.generateNodeName(this.nodeIdx),s[l]=h)});let a=Object.fromEntries(Object.entries(s).map(([h,o])=>[o.join("."),h]));return[i,a]}static pathWithCommonPrefix(t){let e=[...t];t.forEach(s=>{t.forEach(n=>{if(s!==n){for(let a=0;a<s.length;a++)if(s[a]!==n[a]){a!==0&&e.push(s.slice(0,a));break}}})});let i=e.sort((s,n)=>s.length!==n.length?s.length-n.length:s[0]-n[0]);return[...new Set(i.map(s=>s.join(".")))].map(s=>s.split(".").filter(Boolean).map(Number))}static findBestNodeAndPath(t,e,i){let r=0,s,n;return Object.entries(t).forEach(([a,h])=>{let o=0,p=h.length;for(let d=0;d<p;d++)h[d]===e[d]&&o++;if(o===p-1){let d=e[p-1]-h[p-1];d>0&&d<=3&&(n=[a,o,d])}o===h.length&&o>r&&(s=a,r=o)}),s?[s,e.slice(r),0]:n?[n[0],e.slice(n[1]+1),n[2]]:[i,e,0]}};var C=class extends u{run(){let{item:t,array:e,key:i,children:r}=this.viewParticle,s=this.generateNodeName();return this.addInitStatement(this.declareForNode(s,e.value,t,r,u.calcDependencyNum(e.dependencyIndexArr),i)),this.addUpdateStatements(e.dependencyIndexArr,this.updateForNode(s,e.value,t,i)),this.addUpdateStatementsWithoutDep(this.updateForNodeItem(s)),s}declareForNode(t,e,i,r,s,n){let[a,h,o]=this.generateChildren(r,!1);return Object.keys(o).length>0&&a.push(this.t.expressionStatement(this.t.assignmentExpression("=",this.t.memberExpression(this.t.identifier(h[0]),this.t.identifier("_$updateFunc")),this.t.arrowFunctionExpression([this.t.identifier("changed"),i],this.geneUpdateBody(o))))),a.push(this.generateReturnStatement(h)),this.t.variableDeclaration("const",[this.t.variableDeclarator(this.t.identifier(t),this.t.newExpression(this.t.identifier(this.importMap.ForNode),[e,this.t.arrowFunctionExpression([i],this.t.blockStatement(a)),this.t.numericLiteral(s),...this.getForKeyStatement(e,i,n)]))])}getForKeyStatement(t,e,i){return i?[this.t.callExpression(this.t.memberExpression(t,this.t.identifier("map")),[this.t.arrowFunctionExpression([e],i)])]:[]}updateForNode(t,e,i,r){return this.t.expressionStatement(this.t.callExpression(this.t.memberExpression(this.t.identifier(t),this.t.identifier("updateArray")),[e,...this.getForKeyStatement(e,i,r)]))}updateForNodeItem(t){return this.t.expressionStatement(this.t.callExpression(this.t.memberExpression(this.t.identifier(t),this.t.identifier("update")),[this.t.identifier("changed")]))}};var M=class extends u{run(){let{branches:t}=this.viewParticle,e=t.flatMap(({condition:r})=>r.dependencyIndexArr??[]),i=this.generateNodeName();return this.addInitStatement(this.declareIfNode(i,t,u.calcDependencyNum(e))),this.addUpdateStatements(e,this.updateIfNodeCond(i)),this.addUpdateStatementsWithoutDep(this.updateIfNode(i)),i}geneUpdateFunc(t,e){return this.t.expressionStatement(this.t.assignmentExpression("=",this.t.memberExpression(this.t.identifier(t),this.t.identifier("_$updateFunc")),this.t.arrowFunctionExpression([this.t.identifier("changed")],this.geneUpdateBody(e))))}geneCondIdx(t,e){return this.t.expressionStatement(this.t.assignmentExpression("=",this.t.memberExpression(this.t.identifier(t),this.t.identifier("cond")),this.t.numericLiteral(e)))}geneCondCheck(t){return this.t.ifStatement(this.t.binaryExpression("===",this.t.memberExpression(this.t.identifier("$thisIf"),this.t.identifier("cond")),this.t.numericLiteral(t)),this.t.returnStatement())}geneIfStatement(t,e,i){return this.t.ifStatement(t,this.t.blockStatement(e),i)}declareIfNode(t,e,i){let r=!1,s=e.reverse().reduce((n,{condition:a,children:h},o)=>{let[p,d,l]=this.generateChildren(h,!1);return p.unshift(this.geneCondCheck(e.length-o-1)),Object.keys(l).length>0&&p.push(this.geneUpdateFunc(d[0],l)),p.push(this.geneCondIdx("$thisIf",e.length-o-1)),p.push(this.generateReturnStatement(d)),o===0&&this.t.isBooleanLiteral(a.value,{value:!0})?(r=!0,this.t.blockStatement(p)):this.geneIfStatement(a.value,p,n)},void 0);return r||(s.alternate=this.t.blockStatement([this.geneCondIdx("$thisIf",-1),this.t.returnStatement(this.t.arrayExpression([]))])),this.t.variableDeclaration("const",[this.t.variableDeclarator(this.t.identifier(t),this.t.newExpression(this.t.identifier(this.importMap.IfNode),[this.t.arrowFunctionExpression([this.t.identifier("$thisIf")],this.t.blockStatement([s])),this.t.numericLiteral(i)]))])}updateIfNodeCond(t){return this.t.expressionStatement(this.t.callExpression(this.t.memberExpression(this.t.identifier(t),this.t.identifier("updateCond")),[]))}updateIfNode(t){return this.t.expressionStatement(this.t.callExpression(this.t.memberExpression(this.t.identifier(t),this.t.identifier("update")),[this.t.identifier("changed")]))}};var L=class extends f{run(){let{props:t}=this.viewParticle;t=this.alterPropViews(t);let{children:e}=this.viewParticle,i=this.generateNodeName();return this.addInitStatement(this.declareEnvNode(i,t)),this.addInitStatement(this.geneEnvChildren(i,e)),Object.entries(t).forEach(([r,{dependencyIndexArr:s,value:n}])=>{s&&this.addUpdateStatements(s,this.updateEnvNode(i,r,n))}),i}generateEnvs(t){return this.t.objectExpression(Object.entries(t).map(([e,{value:i}])=>this.t.objectProperty(this.t.identifier(e),i)))}declareEnvNode(t,e){return this.t.variableDeclaration("const",[this.t.variableDeclarator(this.t.identifier(t),this.t.newExpression(this.t.identifier(this.importMap.EnvNode),[this.generateEnvs(e)]))])}geneEnvChildren(t,e){let[i,r]=this.generateChildren(e);return this.addInitStatement(...i),this.t.expressionStatement(this.t.callExpression(this.t.memberExpression(this.t.identifier(t),this.t.identifier("initNodes")),[this.t.arrayExpression(r.map(s=>this.t.identifier(s)))]))}updateEnvNode(t,e,i){return this.t.expressionStatement(this.t.callExpression(this.t.memberExpression(this.t.identifier(t),this.t.identifier("updateEnv")),[this.t.stringLiteral(e),i]))}};var V=class extends u{run(){let{content:t}=this.viewParticle,e=this.generateNodeName();return this.addInitStatement(this.declareTextNode(e,t.value)),t.dependencyIndexArr&&t.dependencyIndexArr.length>0&&this.addUpdateStatements(t.dependencyIndexArr,this.updateTextNode(e,t.value)),e}declareTextNode(t,e){return this.t.variableDeclaration("const",[this.t.variableDeclarator(this.t.identifier(t),this.t.callExpression(this.t.identifier(this.importMap.createTextNode),[e]))])}updateTextNode(t,e){return this.t.expressionStatement(this.t.callExpression(this.t.identifier(this.importMap.updateText),[this.t.identifier(t),e]))}};var T=class extends E{run(){let{content:t,props:e}=this.viewParticle;t=this.alterPropView(t),e=this.alterPropViews(e);let i=this.generateNodeName();return this.addInitStatement(this.declareExpNode(i,t.value)),t.dependencyIndexArr&&t.dependencyIndexArr.length>0&&this.addUpdateStatements(t.dependencyIndexArr,this.updateExpNode(i)),e&&Object.entries(e).forEach(([r,{value:s,dependencyIndexArr:n}])=>{let a=this.setExpProp(i,r,s);a&&(this.addInitStatement(a),n=[...n??[],...t.dependencyIndexArr??[]],n.length>0&&this.addUpdateStatements(n,a))}),i}setExpProp(t,e,i){return e==="element"?this.setElement(t,i,!0):e==="do"?this.addDo(t,i):g.warn1()}declareExpNode(t,e){return this.t.variableDeclaration("const",[this.t.variableDeclarator(this.t.identifier(t),this.t.newExpression(this.t.identifier(this.importMap.ExpNode),[this.t.arrowFunctionExpression([],e)]))])}updateExpNode(t){return this.t.expressionStatement(this.t.callExpression(this.t.memberExpression(this.t.identifier(t),this.t.identifier("update")),[]))}};var j=class extends f{run(){let{props:t}=this.viewParticle;t=this.alterPropViews(t);let{tag:e}=this.viewParticle,i=this.generateNodeName();this.addInitStatement(this.declareSubviewNode(i,e,t??{}));let r=this.subViewPropMap[e]??[];return t&&Object.entries(t).forEach(([s,{value:n,dependencyIndexArr:a}])=>{if(!a||a.length===0)return;let o=1<<r.indexOf(s);this.addUpdateStatements(a,this.updateProp(i,o,s,n))}),this.addUpdateStatementsWithoutDep(this.updateSubView(i)),i}genePropNode(t){return this.t.objectExpression(Object.entries(t).map(([e,i])=>this.t.objectProperty(this.t.identifier(e),i.value)))}declareSubviewNode(t,e,i){return this.t.variableDeclaration("const",[this.t.variableDeclarator(this.t.identifier(t),this.t.callExpression(this.t.memberExpression(this.t.thisExpression(),this.t.identifier(e)),[this.genePropNode(i)]))])}updateProp(t,e,i,r){return this.t.expressionStatement(this.t.optionalCallExpression(this.t.memberExpression(this.t.identifier(t),this.t.identifier("updateProp")),[this.t.numericLiteral(e),this.t.objectExpression([this.t.objectProperty(this.t.identifier(i),r)])],!0))}updateSubView(t){return this.t.expressionStatement(this.t.optionalCallExpression(this.t.memberExpression(this.t.identifier(t),this.t.identifier("update")),[this.t.identifier("changed")],!0))}};var R=class{config;t;constructor(t){this.config=t,this.t=t.babelApi.types,this.templateIdx=t.templateIdx}generateChildren(t){let e=[],i=[],r={},s=[];return t.forEach(n=>{let[a,h,o,p]=this.generateChild(n);e.push(...a),Object.entries(h).forEach(([d,l])=>{r[Number(d)]||(r[Number(d)]=[]),r[Number(d)].push(...l)}),i.push(...o),s.push(p)}),[e,r,i,s]}nodeIdx=-1;templateIdx=-1;generateChild(t){let{type:e}=t,i=R.generatorMap[e];if(!i)throw new Error(`Unknown view particle type: ${e}`);let r=new i(t,this.config);r.nodeIdx=this.nodeIdx,r.templateIdx=this.templateIdx;let s=r.generate();return this.nodeIdx=r.nodeIdx,this.templateIdx=r.templateIdx,s}},x=R;O(x,"generatorMap",{comp:I,html:N,template:S,for:C,if:M,env:L,text:V,exp:T,subview:j});var D=class extends x{generate(t){let e=[],i=[],r={},s=[];return t.forEach(a=>{let[h,o,p,d]=this.generateChild(a);i.push(...h),Object.entries(o).forEach(([l,c])=>{r[Number(l)]||(r[Number(l)]=[]),r[Number(l)].push(...c)}),e.push(...p),s.push(d)}),[this.t.blockStatement([...i,...this.geneUpdate(r),this.geneReturn(s)]),e,this.templateIdx]}geneUpdate(t){return Object.keys(t).length===0?[]:[this.t.expressionStatement(this.t.assignmentExpression("=",this.t.memberExpression(this.t.thisExpression(),this.t.identifier("_$update"),!1),this.t.arrowFunctionExpression([this.t.identifier("changed")],this.t.blockStatement([...Object.entries(t).filter(([e])=>e!=="0").map(([e,i])=>this.t.ifStatement(this.t.binaryExpression("&",this.t.identifier("changed"),this.t.numericLiteral(Number(e))),this.t.blockStatement(i))),...t[0]??[]]))))]}geneReturn(t){return this.t.returnStatement(this.t.arrayExpression(t.map(e=>this.t.identifier(e))))}};var H=class extends x{generate(t,e,i){let r=[],s=[],n={},a={},h=[],o=this.templateIdx;return t.forEach(d=>{let[l,c,P,G]=this.generateChild(d);s.push(...l),Object.entries(c).forEach(([k,A])=>{n[Number(k)]||(n[Number(k)]=[]),n[Number(k)].push(...A)}),r.push(...P),h.push(G)}),this.templateIdx=o,this.nodeIdx=-1,e.forEach(d=>{let[,l]=this.generateChild(d);Object.entries(l).forEach(([c,P])=>{a[Number(c)]||(a[Number(c)]=[]),a[Number(c)].push(...P)})}),[this.t.blockStatement([...s,this.geneReturn(h,n,a,i)]),r,this.templateIdx]}geneUpdateBody(t,e){let i=[this.t.identifier("changed")];if(e&&i.push(this.t.identifier("$subviewProps")),e){let s=e.properties.filter(n=>this.t.isObjectProperty(n));Object.entries(t).forEach(([n,a])=>{let h=Number(n);s.forEach((o,p)=>{h&1<<p&&a.unshift(this.t.expressionStatement(this.t.assignmentExpression("=",this.t.objectPattern([o]),this.t.identifier("$subviewProps"))))})})}let r=e?[]:t[0]??[];return this.t.arrowFunctionExpression(i,this.t.blockStatement([...Object.entries(t).filter(([s])=>s!=="0").map(([s,n])=>this.t.ifStatement(this.t.binaryExpression("&",this.t.identifier("changed"),this.t.numericLiteral(Number(s))),this.t.blockStatement(n))),...r]))}geneReturn(t,e,i,r){let s=Object.keys(e).length>0?[this.t.objectProperty(this.t.identifier("update"),this.geneUpdateBody(e))]:[],n=Object.keys(i).filter(a=>a!=="0").length>0?[this.t.objectProperty(this.t.identifier("updateProp"),this.geneUpdateBody(i,r))]:[];return this.t.returnStatement(this.t.objectExpression([this.t.objectProperty(this.t.identifier("_$dlNodeType"),this.t.numericLiteral(5)),...s,...n,this.t.objectProperty(this.t.identifier("_$nodes"),this.t.arrayExpression(t.map(a=>this.t.identifier(a))))]))}};function Jt(m,t){return new D(t).generate(m)}function Qt(m,t,e,i){return new H(i).generate(m,t,e)}export{Qt as generateSubView,Jt as generateView}; | ||
//# sourceMappingURL=index.js.map |
{ | ||
"name": "@dlightjs/view-generator", | ||
"version": "1.0.0-alpha.3", | ||
"version": "1.0.0-alpha.4", | ||
"description": "DLight View Generator given different types of reactivity units", | ||
@@ -5,0 +5,0 @@ "author": { |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
308279