@xaendar/compiler 0.7.33 → 0.7.35
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/compiler.js +8 -8
- package/package.json +3 -3
package/dist/compiler.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import{indent as b}from"@xaendar/common";var h=(l=>(l[l.Element=0]="Element",l[l.Text=1]="Text",l[l.Interpolation=2]="Interpolation",l[l.If=3]="If",l[l.Else=4]="Else",l[l.ElseIf=5]="ElseIf",l[l.For=6]="For",l[l.Switch=7]="Switch",l[l.Case=8]="Case",l[l.Import=9]="Import",l))(h||{});var x=class{constructor(t=[],r){this._parent=r;for(let o of t)typeof o=="string"?this._identifiers.set(o,"value"):this._identifiers.set(o[0],o[1])}_parent;_identifiers=new Map;_unresolvableIdentifiers=new Array;addIdentifier(t,r="value"){if(this.hasIdentifier(t))throw new Error(`Identifier "${t}" is already declared in this scope.`);this._identifiers.set(t,r)}addUnresolvableIdentifier(t){if(this.hasIdentifier(t))throw new Error(`Identifier "${t}" is already declared in this scope.`);this._unresolvableIdentifiers.push(t)}removeIdentifier(t){this._identifiers.delete(t)}removeUnresolvabledIdentifier(t){this._unresolvableIdentifiers=this._unresolvableIdentifiers.filter(r=>r!==t)}hasIdentifier(t){return this._identifiers.has(t)||(this._parent?.hasIdentifier(t)??!1)}getIdentifierKind(t){return this._identifiers.get(t)??this._parent?.getIdentifierKind(t)}hasUnresolvableIdentifier(t){return this._unresolvableIdentifiers.includes(t)||(this._parent?.hasUnresolvableIdentifier(t)??!1)}};import{indent as F}from"@xaendar/common";import{forEachChild as
|
|
1
|
+
import{indent as b}from"@xaendar/common";var h=(l=>(l[l.Element=0]="Element",l[l.Text=1]="Text",l[l.Interpolation=2]="Interpolation",l[l.If=3]="If",l[l.Else=4]="Else",l[l.ElseIf=5]="ElseIf",l[l.For=6]="For",l[l.Switch=7]="Switch",l[l.Case=8]="Case",l[l.Import=9]="Import",l))(h||{});var x=class{constructor(t=[],r){this._parent=r;for(let o of t)typeof o=="string"?this._identifiers.set(o,"value"):this._identifiers.set(o[0],o[1])}_parent;_identifiers=new Map;_unresolvableIdentifiers=new Array;addIdentifier(t,r="value"){if(this.hasIdentifier(t))throw new Error(`Identifier "${t}" is already declared in this scope.`);this._identifiers.set(t,r)}addUnresolvableIdentifier(t){if(this.hasIdentifier(t))throw new Error(`Identifier "${t}" is already declared in this scope.`);this._unresolvableIdentifiers.push(t)}removeIdentifier(t){this._identifiers.delete(t)}removeUnresolvabledIdentifier(t){this._unresolvableIdentifiers=this._unresolvableIdentifiers.filter(r=>r!==t)}hasIdentifier(t){return this._identifiers.has(t)||(this._parent?.hasIdentifier(t)??!1)}getIdentifierKind(t){return this._identifiers.get(t)??this._parent?.getIdentifierKind(t)}hasUnresolvableIdentifier(t){return this._unresolvableIdentifiers.includes(t)||(this._parent?.hasUnresolvableIdentifier(t)??!1)}};import{indent as F}from"@xaendar/common";import{forEachChild as Ne,isIdentifier as Ie,isPropertyAccessExpression as At,isPropertyAssignment as Lt}from"typescript";var yt=new Set(["undefined","NaN","Infinity","globalThis","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape","Object","Function","Boolean","Symbol","Error","AggregateError","EvalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError","SuppressedError","InternalError","Number","BigInt","Math","Date","Temporal","String","RegExp","Array","TypedArray","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","BigInt64Array","BigUint64Array","Float16Array","Float32Array","Float64Array","Map","Set","WeakMap","WeakSet","ArrayBuffer","SharedArrayBuffer","DataView","Atomics","JSON","WeakRef","FinalizationRegistry","Iterator","AsyncIterator","Promise","GeneratorFunction","AsyncGeneratorFunction","Generator","AsyncGenerator","AsyncFunction","DisposableStack","AsyncDisposableStack","Reflect","Proxy","Intl","WebAssembly","window","document","navigator","location","history","screen","console","performance","crypto","fetch","alert","confirm","prompt","setTimeout","setInterval","clearTimeout","clearInterval","requestAnimationFrame","cancelAnimationFrame","queueMicrotask","structuredClone","URL","URLSearchParams","FormData","Headers","Request","Response","AbortController","AbortSignal","CustomEvent","Event","EventTarget","MutationObserver","IntersectionObserver","ResizeObserver","PerformanceObserver","Worker","SharedWorker","ServiceWorker","Blob","File","FileReader","ReadableStream","WritableStream","TransformStream","TextEncoder","TextDecoder","ImageData","Canvas","Storage","localStorage","sessionStorage","indexedDB","WebSocket","XMLHttpRequest","HTMLElement","HTMLInputElement","HTMLButtonElement","HTMLFormElement","HTMLAnchorElement","HTMLImageElement","HTMLVideoElement","HTMLAudioElement","HTMLCanvasElement","HTMLSelectElement","HTMLTextAreaElement","HTMLDivElement","HTMLSpanElement","HTMLParagraphElement","HTMLHeadingElement","HTMLTableElement","HTMLTableRowElement","HTMLTableCellElement","HTMLUListElement","HTMLOListElement","HTMLLIElement","HTMLLabelElement","HTMLDialogElement","HTMLDetailsElement","HTMLSlotElement","HTMLTemplateElement","SVGElement","SVGSVGElement","Element","Node","NodeList","DocumentFragment","ShadowRoot","Document","Window"]),U="root";function d(e,t,r){return ge(e,e,t,_t(r))}function ge(e,t,r,o){if(Ie(e)&&Le(e,t)){let a=e.text;return r?.hasUnresolvableIdentifier(a)||o.skipResolution?a:o.resolver?`${o.resolver}.${a}`:r?vt(a,r):a}if(!Ae(e,t))return e.getText();let n=e.getSourceFile().text,i="",s=e.getStart();return Ne(e,a=>{i=`${i}${n.slice(s,a.getStart())}${ge(a,e,r,o)}`,s=a.getEnd()}),`${i}${n.slice(s,e.getEnd())}`}function vt(e,t){if(t.hasIdentifier(e)){let r=t.getIdentifierKind(e),o=`context.get('${e}')`;return r==="signal"?`${o}()`:o}return e}function Ae(e,t){if(Ie(e)&&Le(e,t))return!0;let r=!1;return Ne(e,o=>{r||(r=Ae(o,e))}),r}function Le(e,t){return!(At(t)&&t.name===e||Lt(t)&&t.name===e||yt.has(e.text)||!e.text)}function ye(e,t,r){return pe(e.tagName,t,r)}function ae(e="text",t,r){return pe(e,t,r)}function S(e,t,r){return pe(e,t,r)}function pe(e,t,r){return(t!==U?`${t}__${e}${r}`:`${e}${r}`).replace(/-/g,"_")}function _t(e){return{skipResolution:e?.skipResolution??!1,resolver:e?.resolver??"this"}}function ve(e,t,r,o,n){let i=Ot(e.attributes,o),s=Rt(e.events,o),a=ye(e,t,r),c=e.tagName,m={code:[],functionsToProcess:new Map};switch(c){case"svg":m.code.push("context.createElement = createSVGElement");break;case"math":m.code.push("context.createElement = createMATHMLElement")}switch(m.code.push(`const ${a} = _renderElement(${t}, context, ${n}, '${c}',`),i.length?m.code.push(...F(["[",...F(i),"],"])):m.code[m.code.length-1]=`${m.code[m.code.length-1]} [],`,s.length?m.code.push(...F(["[",...F(s),"]"]),");"):m.code[m.code.length-1]=`${m.code[m.code.length-1]} []);`,c){case"svg":case"math":m.code.push("context.createElement = createElement")}return e.children.length&&(m.functionsToProcess.set(`${a}Children`,{fn:{node:e,parentNode:a,context:o,precode:St(c)},args:[a,"parentContext"]}),m.code.push(`this.${a}Children(${a}, context);`)),m}function Ot(e,t){return e?.map(({name:r,value:o})=>{let n=typeof o=="string";return`{ name: '${r}', value: () => ${n?`'${o}'`:d(o.expression,t)}, literal: ${n} },`})}function Rt(e,t){t.addUnresolvableIdentifier("$event");let r=e.map(o=>{let n=!1,i=o.parameters.map(a=>{let c=d(a,t);return!n&&c==="$event"?(n=!0,`($event) => ${c},`):`() => ${c},`}),s=["{",...F([`name: '${o.name}',`,`handler: '${o.handler}',`,"parameters: ["])];return i.length?s.push(...F([...F(i),"]"]),"},"):(s[s.length-1]=`${s[s.length-1]}]`,s.push("},")),s}).flat();return t.removeIdentifier("$event"),r}function St(e){switch(e){case"svg":return"context.createElement = createSVGElement;";case"math":return"context.createElement = createMATHMLElement;";default:return""}}function _e(e,t,r,o){let n={code:[],functionsToProcess:new Map},i=e.iterableSource,s=o.hasIdentifier(i)?i:`this.${i}`,a=ae("items",t,r),c=ae("i",t,r),m=V(e,"$index"),l=V(e,"$first"),E=V(e,"$last"),k=V(e,"$even"),I=V(e,"$odd"),g=new x([e.itemAlias,[m,"signal"],[l,"signal"],[E,"signal"],[k,"signal"],[I,"signal"]],o),R=S("for",t,r);return n.functionsToProcess.set(R,{fn:{precode:`const { vars, update } = _iterationVariables(context, ${a}, ${c}, '${e.itemAlias}', {
|
|
2
2
|
$index: '${m}',
|
|
3
3
|
$first: '${l}',
|
|
4
4
|
$last: '${E}',
|
|
5
5
|
$even: '${k}',
|
|
6
6
|
$odd: '${I}'
|
|
7
7
|
});
|
|
8
|
-
const { ${e.itemAlias}, ${m}, ${l}, ${E}, ${k}, ${I} } = vars;`,node:e,parentNode:R,context:
|
|
9
|
-
${n}(${i.args?.join(", ")}) {`,...b(["const context = new Context(this, parentContext);"])),m&&o.push(b(m)),o.push(...b([...s.children.map((E,k)=>{let I=this._processNode(E,a,k.toString(),c,l??null);if(I){let{code:
|
|
10
|
-
`)}_processNode(t,r,o,n,i){let s=this._states[t.type];if(!s)throw new Error(`[Generator] No transition function for token type ${h[t.type]}`);return s(t,r,o,n,i)}};import{Stack as
|
|
11
|
-
Found character ${e.currentChar.value} at ${e.formattedPosition}`)}let s=i?39:34;for(;r;)e.peek()===s?(e.advance(),r=!1,n={state:"text",tokens:[{type:22,parts:[o]}]}):(e.advance(),o=`${o}${e.currentChar.value}`);return n}function
|
|
8
|
+
const { ${e.itemAlias}, ${m}, ${l}, ${E}, ${k}, ${I} } = vars;`,node:e,parentNode:R,context:g,anchor:"anchor",isForBody:!0},args:[R,"parentContext",a,c,"anchor"]}),n.code.push(`_for(${t}, context, () => ${s}, ${e.itemAlias} => ${d(e.trackExpression,g,{skipResolution:!0})}, this.${R}.bind(this));`),n}function V(e,t){return e.implicitAliases.get(t)??t}import{indent as $}from"@xaendar/common";function Oe(e,t,r,o){let n=new x([],o),i={code:[],functionsToProcess:new Map};i.code.push(`_if(${t}, context, [`);let s=S("if",t,r);i.code.push(...$(["{",...$([`condition: () => ${d(e.conditionNode,o)},`,`block: this.${s}.bind(this)`]),"},"])),i.functionsToProcess.set(s,{fn:{node:e,parentNode:s,context:n,anchor:"anchor"},args:[s,"parentContext","anchor"]});let a=e.alternate,c=0;for(;a?.type===5;){let m=new x([],o),l=S("elseIf",t,`${r}_${c}`),E=a.conditionNode;i.code.push(...$(["{",...$([`condition: () => ${d(E,o)},`,`block: this.${l}.bind(this)`]),"},"])),i.functionsToProcess.set(l,{fn:{node:a,parentNode:t,context:m,anchor:"anchor"},args:[t,"parentContext","anchor"]}),a=a.alternate,c++}if(a){let m=new x([],o),l=S("else",t,r);i.code.push(...$(["{",...$([`block: this.${l}.bind(this)`]),"},"])),i.functionsToProcess.set(l,{fn:{node:a,parentNode:t,context:m,anchor:"anchor"},args:[t,"parentContext","anchor"]})}return i.code.push("]);"),i}import{indent as Re}from"@xaendar/common";function Se(e,t,r,o){let n={code:[],functionsToProcess:new Map};return n.code.push(`_switch(${t}, context, () => ${d(e.expression,o)}, [`),e.children.forEach((i,s)=>{let a=new x([],o),c=i.condition?S("case",t,`${r}_${s}`):S("default",t,r);n.functionsToProcess.set(c,{fn:{node:i,parentNode:c,context:a},args:[c,"parentContext","anchor"]});let m=`this.${c}.bind(this)`;n.code.push(...Re(["{",...Re([`condition: ${i.condition?`[${i.condition.join(", ")}]`:"null"},`,`block: ${m}`]),"},"]))}),n.code.push("])"),n}function ce(e,t,r,o){return{code:[`${e.type===1?`_renderLiteralText(${t}, context, '${e.value}');`:`_renderText(${t}, context, () => ${d(e.expression,o)});`}`]}}function we(e,t,r,o){}var z=class{constructor(t){this._ast=t}_ast;_nodeToProcess=new Map;_states={1:ce,2:ce,0:ve,3:Oe,6:_e,7:Se,9:we};generate(t){this._nodeToProcess.clear();let r=new x,o=["_render() {",...b([`const ${U} = this._root;`,"const context = new Context(this, { createElement: document.createElement.bind(document), get: () => undefined });"])];t&&o.push(b(`${U}.adoptedStyleSheets = [${t}];`));for(let n=0;n<this._ast.length;n++){let i=this._processNode(this._ast[n],U,n.toString(),r,null);if(i){let{code:s,functionsToProcess:a}=i;a?.forEach((c,m)=>this._nodeToProcess.set(m,c)),o.push(...b(s))}}o.push(...b(["return context;"]),"}");for(let[n,i]of this._nodeToProcess.entries()){let{node:s,parentNode:a,context:c,precode:m,anchor:l}=i.fn;o.push(`
|
|
9
|
+
${n}(${i.args?.join(", ")}) {`,...b(["const context = new Context(this, parentContext);"])),m&&o.push(b(m)),o.push(...b([...s.children.map((E,k)=>{let I=this._processNode(E,a,k.toString(),c,l??null);if(I){let{code:g,functionsToProcess:R}=I;return R?.forEach((X,Q)=>this._nodeToProcess.set(Q,X)),g}return""}).flat(),i.fn.isForBody?"return { context, update };":"return context;"]),"}")}return o.join(`
|
|
10
|
+
`)}_processNode(t,r,o,n,i){let s=this._states[t.type];if(!s)throw new Error(`[Generator] No transition function for token type ${h[t.type]}`);return s(t,r,o,n,i)}};import{Stack as $t}from"@xaendar/common";var u=(f=>(f[f.TEXT=0]="TEXT",f[f.TAG_OPEN_NAME=1]="TAG_OPEN_NAME",f[f.TAG_SELF_CLOSE=2]="TAG_SELF_CLOSE",f[f.TAG_OPEN_END=3]="TAG_OPEN_END",f[f.TAG_CLOSE_NAME=4]="TAG_CLOSE_NAME",f[f.ATTRIBUTE=5]="ATTRIBUTE",f[f.ATTRIBUTE_VALUE=6]="ATTRIBUTE_VALUE",f[f.EVENT=7]="EVENT",f[f.EVENT_PAREMETER=8]="EVENT_PAREMETER",f[f.INTERPOLATION_LITERAL=9]="INTERPOLATION_LITERAL",f[f.INTERPOLATION_EXPRESSION=10]="INTERPOLATION_EXPRESSION",f[f.IF=11]="IF",f[f.FOR=12]="FOR",f[f.ELSE=13]="ELSE",f[f.ELSE_IF=14]="ELSE_IF",f[f.SWITCH=15]="SWITCH",f[f.CASE=16]="CASE",f[f.DEFAULT=17]="DEFAULT",f[f.CONDITION=18]="CONDITION",f[f.BLOCK_OPEN=19]="BLOCK_OPEN",f[f.BLOCK_CLOSE=20]="BLOCK_CLOSE",f[f.IMPORT=21]="IMPORT",f[f.IMPORT_PATH=22]="IMPORT_PATH",f[f.EOF=23]="EOF",f))(u||{});function Fe(e,t){let r=!0,o="",n;for(;r;)e.peek()===34?(e.advance(),r=!1,n={state:"tag-body",tokens:[{type:6,parts:[o]}],popState:!0}):(e.advance(),o=`${o}${e.currentChar.value}`);return n}function be(e,t){let r=!0,o="",n;for(;r;)switch(e.peek()){case 32:e.advance(),r=!1,n={state:"tag-body",tokens:[{type:5,parts:[o]}]};break;case 61:if(e.advance(),e.peek()!==34){let{row:s,column:a}=e.position;throw new Error(`Attribute value must start with double quotes '"'.Row ${s} Col ${a}`)}e.advance(),r=!1,n={state:e.peek()===123?"interpolation":"attribute-value",pushState:!0,tokens:[{type:5,parts:[o]}]};break;default:e.advance(),o=`${o}${e.currentChar.value}`}return n}function j(e,t){if(e.skipSpaces(),e.peek()!==40)throw new Error(`Expected '(' but got '${String.fromCharCode(e.peek())}' at row ${e.position.row}, col ${e.position.column}`);e.advance();let r="",o=1;for(;o>0;)switch(e.peek()){case 40:o++,r=me(e,r);break;case 41:if(o--,!o){e.advance();break}r=me(e,r);break;default:r=me(e,r)}return r}function me(e,t){return e.advance(),`${t}${e.currentChar.value}`}function Pe(e,t){let r=j(e,t);return e.skipSpaces(),{state:e.peekMatch("@case")?"flow-control":"flow-control-block",tokens:[{type:18,parts:[r]}],popState:!0}}function $e(e,t){return{state:"flow-control-block",tokens:[{type:18,parts:[j(e,t)]}],popState:!0}}function Me(e,t){let r=!0,o="",n="",i={state:"tag-body",tokens:[]};for(;r;)switch(e.peek()){case 91:case 93:case 123:case 125:case 34:case 39:case 40:o=le(e,o),n?(n===e.currentChar.value||n==="["&&e.currentChar.value==="]"||n==="{"&&e.currentChar.value==="}")&&(n=""):n=e.currentChar.value;break;case 44:n?o=le(e,o):(i.tokens.push({type:8,parts:[o]}),e.advance(),e.skipSpaces(),o="");break;case 41:e.advance(),n||(i.tokens.push({type:8,parts:[o]}),r=!1);default:o=le(e,o)}return i}function le(e,t){return e.advance(),`${t}${e.currentChar.value}`}function Be(e,t){let r=!0,o="",n;for(e.advance();r;)switch(e.peek()){case 32:case 47:case 62:n={state:"tag-body"},r=!1;break;case 40:let i="parameter";e.advance(),e.skipSpaces(),e.peek()===41&&(i="tag-body",e.advance(2)),n={state:i,tokens:[{type:7,parts:[o]}]},r=!1;break;default:e.advance(),o=`${o}${e.currentChar.value}`}return n}function De(e,t){let r;return e.advance(),e.peekMatch("for ")?(e.advance(4),r={state:"flow-control-condition",tokens:[{type:12}],pushState:!0}):e.peekMatch("if ")?(e.advance(2),r={state:"flow-control-condition",tokens:[{type:11}],pushState:!0}):e.peekMatch("else if ")?(e.advance(8),r={state:"flow-control-condition",tokens:[{type:14}],pushState:!0}):e.peekMatch("else ")?(e.advance(5),r={state:"flow-control-block",tokens:[{type:13}]}):e.peekMatch("switch ")?(e.advance(7),r={state:"flow-control-condition",tokens:[{type:15}],pushState:!0}):e.peekMatch("case ")?(e.advance(5),r={state:"case-flow-control-condition",tokens:[{type:16}],pushState:!0}):e.peekMatch("default ")?(e.advance(8),r={state:"flow-control-block",tokens:[{type:17}]}):e.peekMatch("import ")&&(e.advance(7),r={state:"import"}),r}function Ge(e,t){if(e.skipSpaces(),e.peek()!==123)throw new Error(`Expected '{' but got '${String.fromCharCode(e.peek())}' at row ${e.position.row}, col ${e.position.column}`);return e.advance(),{state:"text",tokens:[{type:19}],pushState:!0}}function Ue(e,t){let r=!0,o="",n,i=!1;if(e.skipSpaces(),!e.peekMatch("from"))throw new Error(`Expected from keywork after list of imports at ${e.currentChar}`);switch(e.advance(4),e.skipSpaces(),e.advance(),e.currentChar.code){case 39:i=!0;break;case 34:break;default:throw new Error(`Import statement must start with ' or ".
|
|
11
|
+
Found character ${e.currentChar.value} at ${e.formattedPosition}`)}let s=i?39:34;for(;r;)e.peek()===s?(e.advance(),r=!1,n={state:"text",tokens:[{type:22,parts:[o]}]}):(e.advance(),o=`${o}${e.currentChar.value}`);return n}function He(e,t){let r=!0,o="",n={state:"import-path",tokens:[]};if(e.skipSpaces(),e.advance(),e.currentChar.code!==123)throw new Error(`Expected { after @import at ${e.formattedPosition}`);for(;r;)switch(e.peek()){case 32:e.skipSpaces(),o&&e.peek()!==44&&e.peek()!==125&&(o=`${o} `);break;case 44:Ve(n,e,o),o="";break;case 125:Ve(n,e,o),r=!1;break;default:e.advance(),o=`${o}${e.currentChar.value}`}return n}function Ve(e,t,r){t.advance(),e.tokens.push({type:21,parts:[r]})}function Ke(e,t){let r=!0,o="",n=1,i;for(;r;)switch(e.peek()){case 123:n++,o=fe(e,o);break;case 125:if(n--,n===0){e.advance(),o=o.trimEnd();let s=t.history.pop(),a;switch(s){case"attribute":if(e.peek()!==34)throw new Error(`Interpolation must end with double quotes '"' Found ${String.fromCharCode(e.peek())} at ${e.formattedPosition}`);e.advance(),a="tag-body";break;case"text":a="text"}i={state:a,tokens:[{type:10,parts:[o]}],popState:!0},r=!1}else o=fe(e,o);break;default:o=fe(e,o)}return i}function fe(e,t){return e.advance(1),`${t}${e.currentChar.value}`}function qe(e,t){let r=!0,o="`",n;for(e.advance();r;)switch(e.peek()){case 96:if(o=We(e,o),e.peek()===125){e.advance();let i=t.history.pop(),s;switch(i){case"attribute":if(e.peek()!==34)throw new Error(`Attribute interpolation expression must end with double quotes at ${e.formattedPosition}`);e.advance(),s="tag-body";break;case"text":s="text"}n={state:s,tokens:[{type:9,parts:[o]}],popState:!0},r=!1}else o=`${o}${e.currentChar.value}`;break;default:o=We(e,o)}return n}function We(e,t){return e.advance(),`${t}${e.currentChar.value}`}function Xe(e,t){return e.advance(),e.skipSpaces(),e.peek()===96?{state:"interpolation-literal"}:{state:"interpolation-expression"}}function Qe(e,t){let r=!0,o;for(;r;)switch(e.peek()){case 64:o={state:"event"},r=!1;break;case 32:e.skipSpaces();break;case 62:case 47:o={state:"tag-open-end"},r=!1;break;default:o={state:"attribute"},r=!1}return o}function ze(e,t){let r=!0,o="",n;for(e.advance(2),e.skipSpaces();r;)switch(e.peek()){case 62:e.advance(),n={state:"text",tokens:[{type:4,parts:[o]}]},r=!1;break;case 32:throw new Error("Tag Close Name cannot contains spaces");default:e.advance(),o=`${o}${e.currentChar.value}`}return n}function je(e,t){let r;if(e.peek()===62)e.advance(),r={state:"text",tokens:[{type:3,parts:[]}]};else{e.advance();let o=e.peek();if(o===62)e.advance(),r={state:"text",tokens:[{type:2,parts:[]}]};else throw new Error(`Unexpected character ${o} for closing tag.
|
|
12
12
|
Expected />
|
|
13
|
-
Read of /${String.fromCharCode(o)} at ${e.formattedPosition}`)}return r}function
|
|
14
|
-
`,""));return{node:n}}function Je(e,t,r){if(!Bt(e))throw new Error(Dt(e));if(Mt(e,o=>Je(o,t,r)),r.length)throw new Error(r[0].message)}function Bt(e){switch(e.kind){case p.StringLiteral:case p.NumericLiteral:case p.BigIntLiteral:case p.TrueKeyword:case p.FalseKeyword:case p.NullKeyword:case p.UndefinedKeyword:case p.Identifier:case p.PropertyAccessExpression:case p.ElementAccessExpression:case p.CallExpression:case p.BinaryExpression:case p.EqualsEqualsToken:case p.EqualsEqualsEqualsToken:case p.ExclamationEqualsToken:case p.ExclamationEqualsEqualsToken:case p.LessThanToken:case p.LessThanEqualsToken:case p.GreaterThanToken:case p.GreaterThanEqualsToken:case p.PlusToken:case p.MinusToken:case p.AsteriskToken:case p.SlashToken:case p.PercentToken:case p.AsteriskAsteriskToken:case p.AmpersandAmpersandToken:case p.BarBarToken:case p.QuestionQuestionToken:case p.QuestionDotToken:case p.QuestionToken:case p.ColonToken:case p.AmpersandToken:case p.BarToken:case p.CaretToken:case p.LessThanLessThanToken:case p.GreaterThanGreaterThanToken:case p.GreaterThanGreaterThanGreaterThanToken:case p.InstanceOfKeyword:case p.InKeyword:case p.PrefixUnaryExpression:case p.PostfixUnaryExpression:case p.TypeOfExpression:case p.VoidExpression:case p.ConditionalExpression:case p.ParenthesizedExpression:case p.TemplateExpression:case p.NoSubstitutionTemplateLiteral:case p.TemplateHead:case p.TemplateMiddle:case p.TemplateTail:case p.TemplateSpan:case p.ArrayLiteralExpression:case p.ObjectLiteralExpression:case p.PropertyAssignment:case p.ShorthandPropertyAssignment:case p.SpreadAssignment:case p.SpreadElement:case p.TaggedTemplateExpression:case p.SyntaxList:return!0;default:return!1}}function Dt(e){switch(e.kind){case p.AwaitExpression:return"'await' is not allowed inside template expressions.";case p.YieldExpression:return"'yield' is not allowed inside template expressions.";case p.NewExpression:return"'new' is not allowed inside template expressions.";case p.ArrowFunction:case p.FunctionExpression:return"Function expressions are not allowed inside template expressions.";case p.BinaryExpression:return Gt(e.operatorToken.kind)?"Assignments are not allowed inside template expressions. Use @const to declare local template variables instead.":`'${p[e.kind]}' is not allowed inside template expressions.`;default:return`'${p[e.kind]}' is not allowed inside template expressions.`}}function Gt(e){return e>=p.FirstAssignment&&e<=p.LastAssignment}function K(e,t,r){return e.advance(),{type:2,expression:y(r.parts[0]).node}}function et(e,t,r){e.advance();let o=r.parts[0],n=e.peek();if(n.type===5||n.type===4||n.type===7)return{name:o,value:"true"};if(n.type===10||n.type===9)return{name:o,value:K(e,t,n)};if(n.type!==6)throw new Error(`[Parser] Attribute value missing for ${o} in: ${o}`);return e.advance(),{name:o,value:n.parts[0]}}function tt(e,t,r){e.advance();let o=r.parts[0],[n,i]=o.split("=");if(!n||!i)throw new Error(`[Parser] Invalid event format: ${o}`);let s=new Array;for(;e.peek().type===8;)e.advance(),s.push(y(e.getCurrentToken().value.parts[0]).node);return{name:n,handler:i.replace(/^[""]|[""]$/g,""),parameters:s}}function rt(e,t,r){e.advance();let o=r.parts[0],n=new Array,i=new Array,s=!0;for(;s;){let c=e.peek();switch(c.type){case 5:n.push(et(e,t,c));break;case 7:i.push(tt(e,t,c));break;default:s=!1}}if(e.peek().type===3&&e.advance(),e.peek().type===2)return e.advance(),{type:0,tagName:o,attributes:n,events:i,children:[]};let a=new Array;for(;!Ut(e,o);){let c=t();c&&a.push(c)}return e.advance(),{type:0,tagName:o,attributes:n,events:i,children:a}}function Ut(e,t){let r=e.peek();return r.type===4&&r.parts[0]===t}import{createSourceFile as Vt,isExpressionStatement as Ht,isIdentifier as Kt,ScriptTarget as Wt}from"typescript";function w(e,t){let r=new Array;for(;e.peek().type!==20;){let o=t();o&&r.push(o)}return e.advance(),r}function ot(e,t,r){e.advance();let o=e.peek();if(o.type!==18)throw new Error(`[Parser] Expected CONDITION after FOR, got ${u[o.type]}`);let n=qt(o.parts[0],0);e.advance(2);let i=w(e,t);return{type:6,...n,children:i}}function qt(e,t){let r=Qt(e);if(r.length<2)throw new Error('[Parser] @for requires at least "item of iterable; track expr".');let o=r[0].trim(),n=o.indexOf(" of ");if(n===-1)throw new Error('[Parser] @for expression must be in the form "item of iterable".');let i=o.slice(0,n).trim(),s=o.slice(n+4).trim();if(!nt(i))throw new Error(`[Parser] '${i}' is not a valid item alias.`);let a=y(s),c=r[1].trim();if(!c.startsWith("track "))throw new Error('[Parser] Second section of @for must start with "track".');let m=c.slice(6).trim(),l=y(m),E=new Map;if(r.length>=3&&r[2]!==void 0){let k=r[2].trim(),I=t+e.indexOf(r[2]);Xt(k,I,E)}return{itemAlias:i,iterableExpression:a.node,iterableSource:s,trackExpression:l.node,trackSource:m,implicitAliases:E}}function Xt(e,t,r){let o=e.split(","),n=0,i=new Set(["$index","$last","$first","$even","$odd"]);for(let s of o){let a=s.trim(),c=a.indexOf("=");if(c===-1)throw new Error(`[Parser] Invalid alias declaration '${a}'. Expected '$implicit = alias'.`);n+=s.length+1;let m=a.slice(0,c).trim(),l=a.slice(c+1).trim();if(!(k=>i.has(k))(l))throw new Error(`[Parser] '${l}' is not a known implicit variable. Known variables: ${[...i].join(", ")}.`);if(n+=s.length+1,!nt(m))throw new Error(`[Parser] '${m}' is not a valid alias identifier.`);if(n+=s.length+1,r.has(l))throw new Error(`[Parser] '${l}' is already aliased in this @for expression.`);r.set(l,m),n+=s.length+1}}function Qt(e){let t=new Array,r="",o=0,n;for(let i=0;i<e.length;i++){let s=e[i];if(!(!r&&s===" ")){if(n){r+=s,s===n&&e[i-1]!=="\\"&&(n=null);continue}if(s==='"'||s==="'"||s==="`"){n=s,r+=s;continue}if(s==="("||s==="["||s==="{"){o++,r+=s;continue}if(s===")"||s==="]"||s==="}"){o--,r+=s;continue}if(s===";"&&o===0){t.push(r),r="";continue}r+=s}}return r.trim().length&&t.push(r),t}function nt(e){if(!e.length)return!1;let r=Vt("__id.ts",e,Wt.ESNext,!1).statements[0];return!!r&&Ht(r)&&Kt(r.expression)&&r.expression.text===e}function it(e,t,r){return st(e,t,r)}function zt(e,t,r){switch(r.type){case 14:return st(e,t,r);case 13:e.advance(2);let o=w(e,t);return{type:4,children:o}}}function st(e,t,r){e.advance();let o=e.peek();if(o.type!==18)throw new Error(`[Parser] Expected CONDITION after ${u[r.type]}, got ${u[o.type]}`);e.advance(2);let n=o.parts[0],i=y(n),s=w(e,t);return{type:r.type===11?3:5,condition:n,conditionNode:i.node,children:s,alternate:zt(e,t,e.peek())}}function at(e,t,r){let o=new Array;for(;e.peek().type===21;){e.advance();let n=e.getCurrentToken().value.parts[0],i=jt(n);o.push(i)}return e.advance(),{type:9,specifiers:o,path:e.getCurrentToken().value.parts[0]}}function jt(e){let t=e.trim(),r=t.match(/^\*\s+as\s+([A-Za-z_$][\w$]*)$/);if(r)return{imported:"*",local:r[1]};let o=t.match(/^default\s+as\s+([A-Za-z_$][\w$]*)$/);if(o)return{imported:"default",local:o[1]};let n=t.match(/^([A-Za-z_$][\w$]*)(?:\s+as\s+([A-Za-z_$][\w$]*))?$/);if(n)return{imported:n[1],local:n[2]??n[1]};throw new Error(`[Parser] Invalid import specifier "${e}".`)}function pt(e,t,r){e.advance();let o=e.peek();if(o.type!==18)throw new Error(`[Parser] Expected CONDITION after SWITCH, got ${u[o.type]}`);let n=y(o.parts[0]).node;e.advance(2);let i=new Array;for(;e.peek().type!==20;)switch(e.peek().type){case 16:let a=new Array;do{e.advance();let c=e.peek();if(c.type!==18)throw new Error("[Parser] Expected CONDITION after CASE");a.push(c.parts[0]),e.advance()}while(e.peek().type!==19);e.advance(),i.push({type:8,condition:a,children:w(e,t)});break;case 17:e.advance(2),i.push({type:8,condition:null,children:w(e,t)});break}return e.advance(),{type:7,expression:n,children:i}}function ct(e,t,r){return e.advance(),{type:1,value:r.parts[0]}}var ie=class{_cursor;_states={0:ct,10:K,9:K,1:rt,11:it,12:ot,15:pt,21:at};constructor(t){this._cursor=new ne(t)}parse(){let t=new Array;for(;this._cursor.peek().type!==23;){let r=this.parseNode();r&&t.push(r)}return t}parseNode(){let t=this._cursor.peek();if(t.type===23)return;let r=this._states[t.type];if(!r)throw new Error(`[Parser] No transition function for token type ${u[t.type]}`);return r(this._cursor,this.parseNode.bind(this),t)}};import{indent as Er}from"@xaendar/common";var B=class extends x{_imports=new Array;addImport(t){this._imports.push(t)}getImportBySelector(t){return this._imports.find(r=>r.type==="component"&&r.selectors.includes(t))}};function mt(e,t,r){let o=new Array;if(er(e.tagName)){let n=r.getImportBySelector(e.tagName);if(!n)throw new Error(`[Type Checker] ${e.tagName} selector is not associated to any WebComponent imported in the template`);o.push(...Yt(e,n,r))}else e.attributes.forEach(({value:n})=>{typeof n!="string"&&o.push(`${d(n.expression,r,{resolver:"root"})};`)}),e.events.forEach(({handler:n,parameters:i})=>{let s=new x([],r);s.addUnresolvableIdentifier("$event");let a=i.map(c=>d(c,s,{resolver:"root"})).join(", ");o.push(`root.${n}(${a});`)});return e.children.forEach(n=>o.push(...t(n,r))),o}function Yt(e,t,r){let o=new Array;return e.attributes.forEach(({name:n,value:i})=>{let s=Zt(t,n);if(!s)throw new Error(`[Type Checker] Unknown property "${n}" on <${e.tagName}> (${t.className} has no @Property with this name or alias).`);if(typeof i=="string")return;let a=d(i.expression,r,{resolver:"root"});o.push(s.type?`(${a}) satisfies ${s.type};`:`${a};`)}),e.events.forEach(({name:n,handler:i,parameters:s})=>{let a=Jt(t,n);if(!a)throw new Error(`[Type Checker] Unknown event "${n}" on <${e.tagName}> (${t.className} has no @Event with this name).`);let c=new x([],r);c.addUnresolvableIdentifier("$event");let m=s.map(l=>d(l,c,{resolver:"root"})).join(", ");o.push("{"),o.push(` let $event!: ${a.detailType??"unknown"};`),o.push(` root.${i}(${m});`),o.push("}")}),o}function Zt(e,t){return e.properties.find(r=>(r.alias??r.name)===t)}function Jt(e,t){return e.events.find(r=>r.name===t)}function er(e){return/^[a-z][a-z0-9._\-]*-[a-z0-9._\-]*$/.test(e)}import{indent as tr}from"@xaendar/common";function lt(e,t,r){let o=new B([],r),n=W(e,"$index"),i=W(e,"$first"),s=W(e,"$last"),a=W(e,"$even"),c=W(e,"$odd");[n,i,s,a,c,e.itemAlias].forEach(l=>o.addUnresolvableIdentifier(l));let m=new Array;return m.push(`for (const ${e.itemAlias} of root.${e.iterableSource}) {`),m.push(...tr([`let ${n}!: number;`,`let ${i}!: boolean;`,`let ${s}!: boolean;`,`let ${a}!: boolean;`,`let ${c}!: boolean;`,`${d(e.trackExpression,r,{skipResolution:!0})};`,...e.children.flatMap(l=>t(l,o))])),m.push("}"),m}function W(e,t){return e.implicitAliases.get(t)??t}import{indent as Te}from"@xaendar/common";function ft(e,t,r){let o=new Array,n=d(e.conditionNode,r,{resolver:"root"});o.push(`if (${n}) {`),o.push(...Te(e.children.flatMap(s=>t(s,r)))),o.push("}");let i=e.alternate;for(;i?.type===5;){let s=d(i.conditionNode,r,{resolver:"root"});o.push(`else if (${s}) {`),o.push(...Te(i.children.flatMap(a=>t(a,r)))),o.push("}"),i=i.alternate}return i&&(o.push("else {"),o.push(...Te(i.children.flatMap(s=>t(s,r)))),o.push("}")),o}function dt(e,t,r){let o=e.path,n=ut(o),i=new Array;for(let s of e.specifiers){let{imported:a,local:c}=s;switch(a){case"*":i.push(`let ${c}!: typeof import('${n}');`);break;case"default":i.push(`let ${c}!: typeof import('${n}')['default'];`);break;default:let m=ut(a);i.push(`let ${c}!: typeof import('${n}')['${m}'];`);break}}return i}function ut(e){return e.replace(/\\/g,"\\\\").replace(/'/g,"\\'")}import{indent as Tt}from"@xaendar/common";function xt(e,t,r){let n=[`switch (${d(e.expression,r,{resolver:"root"})}) {`];return e.children.forEach(i=>{i.condition?.length?i.condition.forEach(s=>n.push(` case ${s}:`)):n.push(" default:"),n.push(...Tt(Tt([...i.children.flatMap(s=>t(s,r)),"break;"])))}),n.push("}"),n}function xe(e,t,r){return e.type===2?[`${d(e.expression,r,{resolver:"root"})};`]:[]}import{existsSync as he}from"fs";import{readFile as rr}from"fs/promises";import{resolve as or}from"path";import{createSourceFile as nr,forEachChild as ir,getNameOfDeclaration as ht,isAccessor as sr,isArrayLiteralExpression as ar,isCallExpression as q,isClassDeclaration as pr,isIdentifier as v,isObjectLiteralExpression as Et,isPropertyAccessExpression as Ct,isPropertyAssignment as kt,isStringLiteral as Ee,ScriptTarget as cr,SyntaxKind as Ce}from"typescript";async function Nt(e,t,r=process.cwd()){try{let o=mr(e,r);if(!o)return;let n=await rr(o,"utf8"),i=nr(o,n,cr.Latest,!0),s;return ir(i,a=>{if(!s&&pr(a)){let c=a.name?.text;if(c!==t)return;let m=a.modifiers??[],l=Array.from(m).find(A=>lr(A));if(!l)return;let E=dr(l);if(!E?.length)return;let k=new Array,I=new Array;a.members.forEach(A=>{if(!sr(A))return;let R=A.modifiers??[],X=Array.from(R).find(g=>fr(g));if(X){let g=ht(A),D=g&&v(g)?g.text:void 0;if(D){let G=xr(D,X);G&&k.push(G)}return}let Q=Array.from(R).find(g=>ur(g));if(Q){let g=ht(A),D=g&&v(g)?g.text:void 0;if(D){let G=hr(D,Q);G&&I.push(G)}}}),s={type:"component",className:c,selectors:E,properties:k,events:I}}}),s}catch(o){console.error(`Failed to extract component metadata from ${e}:`,o);return}}function mr(e,t){if(e.startsWith(".")){let r=or(t,e);if(he(`${r}.ts`))return r+".ts";if(he(`${r}/index.ts`))return`${r}/index.ts`;if(he(r))return r}}function lr(e){if(e.kind!==Ce.Decorator)return!1;let t=q(e.expression)?e.expression.expression:e.expression;return v(t)&&t.text==="WebComponent"}function fr(e){if(e.kind!==Ce.Decorator)return!1;let t=e.expression;return q(t)?v(t.expression)&&t.expression.text==="Property":Ct(t)?v(t.expression)&&t.expression.text==="Property"&&v(t.name)&&t.name.text==="required":v(t)&&t.text==="Property"}function ur(e){if(e.kind!==Ce.Decorator)return!1;let t=q(e.expression)?e.expression.expression:e.expression;return v(t)&&t.text==="Event"}function dr(e){try{let t=e.expression;if(!q(t))return[];let r=t.arguments;if(r.length===0)return[];let o=r[0];if(!o||!Et(o))return[];let n=Array.from(o.properties).find(i=>kt(i)&&v(i.name)&&i.name.text==="selector");return Tr(n.initializer)}catch{return[]}}function Tr(e){return Ee(e)?[e.text]:ar(e)?e.elements?.filter(t=>Ee(t)).map(t=>t.text):[]}function xr(e,t){let r={name:e,required:!1},o=t.expression;if(Ct(o)&&v(o.name)&&o.name.text==="required"&&(r.required=!0),q(o)){let n=o.arguments;if(n.length){let i=n[0];if(Et(i)){let s=i.properties?.find(a=>kt(a)&&v(a.name)&&a.name.text==="alias");s&&Ee(s.initializer)&&(r.alias=s.initializer.text)}}}return r}function hr(e,t){return{name:e}}var se=class{constructor(t){this._ast=t}_ast;_context=new B;_states={1:xe,2:xe,0:mt,3:ft,6:lt,7:xt,9:dt};async populateImportMetadata(t){let r=this._ast.filter(o=>o.type===9);await Promise.all(r.flatMap(o=>o.specifiers.filter(({imported:n})=>n!=="*").map(async({imported:n,local:i})=>{let s=n==="default"?i:n,a=await Nt(o.path,s,t);a&&this._context.addImport(a)})))}async generate(t){await this.populateImportMetadata(t);let r=this._ast.flatMap(o=>this._processNode(o,this._context));return["function typeCheck() {",...Er(r),"}"].join(`
|
|
15
|
-
`)}_processNode=(t,r)=>{let o=this._states[t.type];if(!o)throw new Error(`[Type Checker] No transition function for token type ${h[t.type]}`);return o(t,this._processNode,r)}};async function
|
|
13
|
+
Read of /${String.fromCharCode(o)} at ${e.formattedPosition}`)}return r}function Ye(e,t){let r=!0,o="",n;for(e.advance(),e.skipSpaces();r;)switch(e.peek()){case 32:case 47:case 62:n={state:"tag-body",tokens:[{type:1,parts:[o]}]},r=!1;break;default:e.advance(),o=`${o}${e.currentChar.value}`}return n}function Ze(e){return/\S/.test(e)}function Je(e,t){let r=!0,o="",n;for(;r;)switch(e.peek()){case 60:n={state:e.peek(1,{offset:1})===47?"tag-close":"tag-open-name"},r=!1;break;case 123:n={state:"interpolation",pushState:!0},r=!1;break;case 64:n={state:"flow-control"},r=!1;break;case 125:t.history[t.history.length-1]==="flow-control-block"?(e.advance(),n={state:"text",tokens:[{type:20}],popState:!0},r=!1):(e.advance(),o=`${o}${e.currentChar.value}`);break;case 10:case 13:e.advance();break;default:e.advance(),o=`${o}${e.currentChar.value}`}return n.tokens??=Ze(o)?[{type:0,parts:[o]}]:void 0,n}var re=class{constructor(t){this.input=t}input;_currentChar={code:0,index:-1,value:""};get currentChar(){return this._currentChar}_peekCache=new Map;_position={row:0,column:0};get position(){return this._position}get formattedPosition(){return`[Ln ${this._position.row}, Col ${this._position.column}]`}advance(t=1){if(t<1)throw new Error(`${t} is not a valid value. Please enter a number equal or greater than 1`);let r=this._currentChar.index+t;r>=this.input.length?(this._currentChar.code=0,this._currentChar.index=-1,this._currentChar.value="",this.throwEOFError()):([10,13].includes(this._currentChar.code)?(this._position.row++,this._position.column=0):this._position.column++,this._currentChar.index=r,this._currentChar.value=this.input[r],this._currentChar.code=this.input.charCodeAt(r))}peekMatch(t,r){if(typeof t=="string"){let i=this.peek(t.length);for(let s=0;s<t.length;s++)if(i[s]!==t.charCodeAt(s))return!1;return!0}let o=this._currentChar.index+1,n=this.input.slice(o,o+r);return t.test(n)}peek(t,r){let o=this._peekCache,n=typeof t=="number"?t:1,i=(typeof t=="object"?t:r)?.offset??0;return n===1?this.peekOneChar(this._currentChar.index+i+1,o):this.peekMany(n+i,o)}skipSpaces(){for(;this.peek()===32||this.peek()===10||this.peek()===13;)this.advance()}peekMany(t,r){let o=new Array,n=this._currentChar.index+1;for(let i=n;i<n+t;i++)o.push(this.peekOneChar(i,r));return o}peekOneChar(t,r){if(r.has(t))return r.get(t);t>=this.input.length&&this.throwEOFError();let o=this.input.charCodeAt(t);return r.set(t,o),o}throwEOFError(){throw new Error("",{cause:0})}};var oe=class{constructor(t){this.input=t;this._cursor=new re(this.input)}input;_cursor;_state="text";_stack=new $t;_tokens=new Array;_states={text:Je,"tag-open-name":Ye,"tag-body":Qe,"tag-open-end":je,"tag-close":ze,attribute:be,"attribute-value":Fe,event:Be,parameter:Me,"flow-control":De,"flow-control-condition":$e,"case-flow-control-condition":Pe,"flow-control-block":Ge,interpolation:Xe,"interpolation-expression":Ke,"interpolation-literal":qe,import:He,"import-path":Ue};tokenize(){let t=!1;for(;!t;)try{let r=this._states[this._state],{state:o,tokens:n,popState:i,pushState:s}=r(this._cursor,{history:this._stack.values,tokens:[...this._tokens]});n?.length&&this._tokens.push(...n),s&&this._stack.push(this._state),i&&this._stack.pop(),this._state=o}catch(r){if(r.cause===0)t=!0;else throw console.log(`Something went wrong while computing state ${this._state} at ${this._cursor.formattedPosition}`),r}return this._tokens}};var ne=class{constructor(t){this._tokens=t}_tokens;_currentToken={value:{type:23},index:-1};getCurrentToken(){return this._currentToken}advance(t=1){if(t<1)throw new Error(`${t} is not a valid value. Please enter a number equal or greater than 1`);let r=this._currentToken.index+t;r>=this._tokens.length?(this._currentToken.value={type:23},this._currentToken.index=-1):(this._currentToken.index=r,this._currentToken.value=this._tokens[r])}peek(t,r){let o=typeof t=="number"?t:1,n=(typeof t=="object"?t:r)?.offset??0;return o===1?this.peekOneToken(this._currentToken.index+n+1):this.peekMany(o+n)}peekMany(t){let r=new Array,o=this._currentToken.index+1;for(let n=o;n<o+t;n++)r.push(this.peekOneToken(n));return r}peekOneToken(t){return t<this._tokens.length?this._tokens[t]:{type:23}}};import{ScriptTarget as Mt,SyntaxKind as p,createSourceFile as Bt,forEachChild as Dt}from"typescript";function y(e){let t="const x = ",n=Bt("expression.ts",`${t}${e}`,Mt.ESNext,!0).statements[0].declarationList.declarations[0].initializer,i=new Array;if(et(n,t.length,i),i.length)throw new Error(i.reduce((s,a)=>`${s}${a.message}
|
|
14
|
+
`,""));return{node:n}}function et(e,t,r){if(!Gt(e))throw new Error(Ut(e));if(Dt(e,o=>et(o,t,r)),r.length)throw new Error(r[0].message)}function Gt(e){switch(e.kind){case p.StringLiteral:case p.NumericLiteral:case p.BigIntLiteral:case p.TrueKeyword:case p.FalseKeyword:case p.NullKeyword:case p.UndefinedKeyword:case p.Identifier:case p.PropertyAccessExpression:case p.ElementAccessExpression:case p.CallExpression:case p.BinaryExpression:case p.EqualsEqualsToken:case p.EqualsEqualsEqualsToken:case p.ExclamationEqualsToken:case p.ExclamationEqualsEqualsToken:case p.LessThanToken:case p.LessThanEqualsToken:case p.GreaterThanToken:case p.GreaterThanEqualsToken:case p.PlusToken:case p.MinusToken:case p.AsteriskToken:case p.SlashToken:case p.PercentToken:case p.AsteriskAsteriskToken:case p.AmpersandAmpersandToken:case p.BarBarToken:case p.QuestionQuestionToken:case p.QuestionDotToken:case p.QuestionToken:case p.ColonToken:case p.AmpersandToken:case p.BarToken:case p.CaretToken:case p.LessThanLessThanToken:case p.GreaterThanGreaterThanToken:case p.GreaterThanGreaterThanGreaterThanToken:case p.InstanceOfKeyword:case p.InKeyword:case p.PrefixUnaryExpression:case p.PostfixUnaryExpression:case p.TypeOfExpression:case p.VoidExpression:case p.ConditionalExpression:case p.ParenthesizedExpression:case p.TemplateExpression:case p.NoSubstitutionTemplateLiteral:case p.TemplateHead:case p.TemplateMiddle:case p.TemplateTail:case p.TemplateSpan:case p.ArrayLiteralExpression:case p.ObjectLiteralExpression:case p.PropertyAssignment:case p.ShorthandPropertyAssignment:case p.SpreadAssignment:case p.SpreadElement:case p.TaggedTemplateExpression:case p.SyntaxList:return!0;default:return!1}}function Ut(e){switch(e.kind){case p.AwaitExpression:return"'await' is not allowed inside template expressions.";case p.YieldExpression:return"'yield' is not allowed inside template expressions.";case p.NewExpression:return"'new' is not allowed inside template expressions.";case p.ArrowFunction:case p.FunctionExpression:return"Function expressions are not allowed inside template expressions.";case p.BinaryExpression:return Vt(e.operatorToken.kind)?"Assignments are not allowed inside template expressions. Use @const to declare local template variables instead.":`'${p[e.kind]}' is not allowed inside template expressions.`;default:return`'${p[e.kind]}' is not allowed inside template expressions.`}}function Vt(e){return e>=p.FirstAssignment&&e<=p.LastAssignment}function K(e,t,r){return e.advance(),{type:2,expression:y(r.parts[0]).node}}function tt(e,t,r){e.advance();let o=r.parts[0],n=e.peek();if(n.type===5||n.type===4||n.type===7)return{name:o,value:"true"};if(n.type===10||n.type===9)return{name:o,value:K(e,t,n)};if(n.type!==6)throw new Error(`[Parser] Attribute value missing for ${o} in: ${o}`);return e.advance(),{name:o,value:n.parts[0]}}function rt(e,t,r){e.advance();let o=r.parts[0],[n,i]=o.split("=");if(!n||!i)throw new Error(`[Parser] Invalid event format: ${o}`);let s=new Array;for(;e.peek().type===8;)e.advance(),s.push(y(e.getCurrentToken().value.parts[0]).node);return{name:n,handler:i.replace(/^[""]|[""]$/g,""),parameters:s}}function ot(e,t,r){e.advance();let o=r.parts[0],n=new Array,i=new Array,s=!0;for(;s;){let c=e.peek();switch(c.type){case 5:n.push(tt(e,t,c));break;case 7:i.push(rt(e,t,c));break;default:s=!1}}if(e.peek().type===3&&e.advance(),e.peek().type===2)return e.advance(),{type:0,tagName:o,attributes:n,events:i,children:[]};let a=new Array;for(;!Ht(e,o);){let c=t();c&&a.push(c)}return e.advance(),{type:0,tagName:o,attributes:n,events:i,children:a}}function Ht(e,t){let r=e.peek();return r.type===4&&r.parts[0]===t}import{createSourceFile as Kt,isExpressionStatement as Wt,isIdentifier as qt,ScriptTarget as Xt}from"typescript";function w(e,t){let r=new Array;for(;e.peek().type!==20;){let o=t();o&&r.push(o)}return e.advance(),r}function nt(e,t,r){e.advance();let o=e.peek();if(o.type!==18)throw new Error(`[Parser] Expected CONDITION after FOR, got ${u[o.type]}`);let n=Qt(o.parts[0],0);e.advance(2);let i=w(e,t);return{type:6,...n,children:i}}function Qt(e,t){let r=jt(e);if(r.length<2)throw new Error('[Parser] @for requires at least "item of iterable; track expr".');let o=r[0].trim(),n=o.indexOf(" of ");if(n===-1)throw new Error('[Parser] @for expression must be in the form "item of iterable".');let i=o.slice(0,n).trim(),s=o.slice(n+4).trim();if(!it(i))throw new Error(`[Parser] '${i}' is not a valid item alias.`);let a=y(s),c=r[1].trim();if(!c.startsWith("track "))throw new Error('[Parser] Second section of @for must start with "track".');let m=c.slice(6).trim(),l=y(m),E=new Map;if(r.length>=3&&r[2]!==void 0){let k=r[2].trim(),I=t+e.indexOf(r[2]);zt(k,I,E)}return{itemAlias:i,iterableExpression:a.node,iterableSource:s,trackExpression:l.node,trackSource:m,implicitAliases:E}}function zt(e,t,r){let o=e.split(","),n=0,i=new Set(["$index","$last","$first","$even","$odd"]);for(let s of o){let a=s.trim(),c=a.indexOf("=");if(c===-1)throw new Error(`[Parser] Invalid alias declaration '${a}'. Expected '$implicit = alias'.`);n+=s.length+1;let m=a.slice(0,c).trim(),l=a.slice(c+1).trim();if(!(k=>i.has(k))(l))throw new Error(`[Parser] '${l}' is not a known implicit variable. Known variables: ${[...i].join(", ")}.`);if(n+=s.length+1,!it(m))throw new Error(`[Parser] '${m}' is not a valid alias identifier.`);if(n+=s.length+1,r.has(l))throw new Error(`[Parser] '${l}' is already aliased in this @for expression.`);r.set(l,m),n+=s.length+1}}function jt(e){let t=new Array,r="",o=0,n;for(let i=0;i<e.length;i++){let s=e[i];if(!(!r&&s===" ")){if(n){r+=s,s===n&&e[i-1]!=="\\"&&(n=null);continue}if(s==='"'||s==="'"||s==="`"){n=s,r+=s;continue}if(s==="("||s==="["||s==="{"){o++,r+=s;continue}if(s===")"||s==="]"||s==="}"){o--,r+=s;continue}if(s===";"&&o===0){t.push(r),r="";continue}r+=s}}return r.trim().length&&t.push(r),t}function it(e){if(!e.length)return!1;let r=Kt("__id.ts",e,Xt.ESNext,!1).statements[0];return!!r&&Wt(r)&&qt(r.expression)&&r.expression.text===e}function st(e,t,r){return at(e,t,r)}function Yt(e,t,r){switch(r.type){case 14:return at(e,t,r);case 13:e.advance(2);let o=w(e,t);return{type:4,children:o}}}function at(e,t,r){e.advance();let o=e.peek();if(o.type!==18)throw new Error(`[Parser] Expected CONDITION after ${u[r.type]}, got ${u[o.type]}`);e.advance(2);let n=o.parts[0],i=y(n),s=w(e,t);return{type:r.type===11?3:5,condition:n,conditionNode:i.node,children:s,alternate:Yt(e,t,e.peek())}}function pt(e,t,r){let o=new Array;for(;e.peek().type===21;){e.advance();let n=e.getCurrentToken().value.parts[0],i=Zt(n);o.push(i)}return e.advance(),{type:9,specifiers:o,path:e.getCurrentToken().value.parts[0]}}function Zt(e){let t=e.trim(),r=t.match(/^\*\s+as\s+([A-Za-z_$][\w$]*)$/);if(r)return{imported:"*",local:r[1]};let o=t.match(/^default\s+as\s+([A-Za-z_$][\w$]*)$/);if(o)return{imported:"default",local:o[1]};let n=t.match(/^([A-Za-z_$][\w$]*)(?:\s+as\s+([A-Za-z_$][\w$]*))?$/);if(n)return{imported:n[1],local:n[2]??n[1]};throw new Error(`[Parser] Invalid import specifier "${e}".`)}function ct(e,t,r){e.advance();let o=e.peek();if(o.type!==18)throw new Error(`[Parser] Expected CONDITION after SWITCH, got ${u[o.type]}`);let n=y(o.parts[0]).node;e.advance(2);let i=new Array;for(;e.peek().type!==20;)switch(e.peek().type){case 16:let a=new Array;do{e.advance();let c=e.peek();if(c.type!==18)throw new Error("[Parser] Expected CONDITION after CASE");a.push(c.parts[0]),e.advance()}while(e.peek().type!==19);e.advance(),i.push({type:8,condition:a,children:w(e,t)});break;case 17:e.advance(2),i.push({type:8,condition:null,children:w(e,t)});break}return e.advance(),{type:7,expression:n,children:i}}function mt(e,t,r){return e.advance(),{type:1,value:r.parts[0]}}var ie=class{_cursor;_states={0:mt,10:K,9:K,1:ot,11:st,12:nt,15:ct,21:pt};constructor(t){this._cursor=new ne(t)}parse(){let t=new Array;for(;this._cursor.peek().type!==23;){let r=this.parseNode();r&&t.push(r)}return t}parseNode(){let t=this._cursor.peek();if(t.type===23)return;let r=this._states[t.type];if(!r)throw new Error(`[Parser] No transition function for token type ${u[t.type]}`);return r(this._cursor,this.parseNode.bind(this),t)}};import{indent as Ir}from"@xaendar/common";var B=class extends x{_imports=new Array;addImport(t){this._imports.push(t)}getImportBySelector(t){return this._imports.find(r=>r.type==="component"&&r.selectors.includes(t))}};import{indent as Jt}from"@xaendar/common";function lt(e,t,r){let o=new Array;if(nr(e.tagName)){let n=r.getImportBySelector(e.tagName);if(!n)throw new Error(`[Type Checker] ${e.tagName} selector is not associated to any WebComponent imported in the template`);o.push(...er(e,n,r))}else o.push(...or(e,r));return e.children.forEach(n=>o.push(...t(n,r))),o}function er(e,t,r){let o=new Array;return e.attributes.forEach(({name:n,value:i})=>{let s=tr(t,n);if(!s)throw new Error(`[Type Checker] Unknown property "${n}" on <${e.tagName}> (${t.className} has no @Property with this name or alias).`);let a=typeof i=="object"?d(i.expression,r,{resolver:"root"}):"string";o.push(s.type?`(${a}) satisfies ${s.type};`:`${a};`)}),e.events.forEach(({name:n,handler:i,parameters:s})=>{let a=rr(t,n);if(!a)throw new Error(`[Type Checker] Unknown event "${n}" on <${e.tagName}> (${t.className} has no @Event with this name).`);let c=new x([],r);c.addUnresolvableIdentifier("$event");let m=s.map(l=>d(l,c,{resolver:"root"})).join(", ");o.push("{",...Jt([` let $event!: ${a.type};`,` root.${i}(${m});`]),"}")}),o}function tr(e,t){return e.properties.find(r=>(r.alias??r.name)===t)}function rr(e,t){return e.events.find(r=>r.name===t)}function or(e,t){let r=new Array;return e.attributes.forEach(({value:o})=>{typeof o!="string"&&r.push(`${d(o.expression,t,{resolver:"root"})};`)}),e.events.forEach(({handler:o,parameters:n})=>{let i=new x([],t);i.addUnresolvableIdentifier("$event");let s=n.map(a=>d(a,i,{resolver:"root"})).join(", ");r.push(`root.${o}(${s});`)}),r}function nr(e){return/^[a-z][a-z0-9._\-]*-[a-z0-9._\-]*$/.test(e)}import{indent as ir}from"@xaendar/common";function ft(e,t,r){let o=new B([],r),n=W(e,"$index"),i=W(e,"$first"),s=W(e,"$last"),a=W(e,"$even"),c=W(e,"$odd");[n,i,s,a,c,e.itemAlias].forEach(l=>o.addUnresolvableIdentifier(l));let m=new Array;return m.push(`for (const ${e.itemAlias} of root.${e.iterableSource}) {`),m.push(...ir([`let ${n}!: number;`,`let ${i}!: boolean;`,`let ${s}!: boolean;`,`let ${a}!: boolean;`,`let ${c}!: boolean;`,`${d(e.trackExpression,r,{skipResolution:!0})};`,...e.children.flatMap(l=>t(l,o))])),m.push("}"),m}function W(e,t){return e.implicitAliases.get(t)??t}import{indent as Te}from"@xaendar/common";function ut(e,t,r){let o=new Array,n=d(e.conditionNode,r,{resolver:"root"});o.push(`if (${n}) {`),o.push(...Te(e.children.flatMap(s=>t(s,r)))),o.push("}");let i=e.alternate;for(;i?.type===5;){let s=d(i.conditionNode,r,{resolver:"root"});o.push(`else if (${s}) {`),o.push(...Te(i.children.flatMap(a=>t(a,r)))),o.push("}"),i=i.alternate}return i&&(o.push("else {"),o.push(...Te(i.children.flatMap(s=>t(s,r)))),o.push("}")),o}function Tt(e,t,r){let o=e.path,n=dt(o),i=new Array;for(let s of e.specifiers){let{imported:a,local:c}=s;switch(a){case"*":i.push(`let ${c}!: typeof import('${n}');`);break;case"default":i.push(`let ${c}!: typeof import('${n}')['default'];`);break;default:let m=dt(a);i.push(`let ${c}!: typeof import('${n}')['${m}'];`);break}}return i}function dt(e){return e.replace(/\\/g,"\\\\").replace(/'/g,"\\'")}import{indent as xt}from"@xaendar/common";function ht(e,t,r){let n=[`switch (${d(e.expression,r,{resolver:"root"})}) {`];return e.children.forEach(i=>{i.condition?.length?i.condition.forEach(s=>n.push(` case ${s}:`)):n.push(" default:"),n.push(...xt(xt([...i.children.flatMap(s=>t(s,r)),"break;"])))}),n.push("}"),n}function xe(e,t,r){return e.type===2?[`${d(e.expression,r,{resolver:"root"})};`]:[]}import{existsSync as he}from"fs";import{readFile as sr}from"fs/promises";import{resolve as ar}from"path";import{createSourceFile as pr,forEachChild as cr,getNameOfDeclaration as Et,isArrayLiteralExpression as mr,isCallExpression as q,isClassDeclaration as lr,isIdentifier as v,isObjectLiteralExpression as Ct,isPropertyAccessExpression as kt,isPropertyAssignment as Nt,isPropertyDeclaration as Ce,isStringLiteral as Ee,isTypeReferenceNode as fr,ScriptTarget as ur,SyntaxKind as ke}from"typescript";async function It(e,t,r=process.cwd()){try{let o=dr(e,r);if(!o)return;let n=await sr(o,"utf8"),i=pr(o,n,ur.Latest,!0),s;return cr(i,a=>{if(!s&&lr(a)){let c=a.name?.text;if(c!==t)return;let m=a.modifiers??[],l=Array.from(m).find(g=>Tr(g));if(!l)return;let E=Er(l);if(!E?.length)return;let k=new Array,I=new Array;a.members.forEach(g=>{if(!Ce(g))return;let R=g.modifiers??[],X=Array.from(R).find(A=>xr(A));if(X){let A=Et(g),D=A&&v(A)?A.text:void 0;if(D){let G=kr(D,X);G&&k.push(G)}return}let Q=Array.from(R).find(A=>hr(A));if(Q){let A=Et(g),D=A&&v(A)?A.text:void 0;if(D){let G=Nr(D,Q);G&&I.push(G)}}}),s={type:"component",className:c,selectors:E,properties:k,events:I}}}),s}catch(o){console.error(`Failed to extract component metadata from ${e}:`,o);return}}function dr(e,t){if(e.startsWith(".")){let r=ar(t,e);if(he(`${r}.ts`))return r+".ts";if(he(`${r}/index.ts`))return`${r}/index.ts`;if(he(r))return r}}function Tr(e){if(e.kind!==ke.Decorator)return!1;let t=q(e.expression)?e.expression.expression:e.expression;return v(t)&&t.text==="WebComponent"}function xr(e){if(e.kind!==ke.Decorator)return!1;let t=e.expression;return q(t)?v(t.expression)&&t.expression.text==="Property":kt(t)?v(t.expression)&&t.expression.text==="Property"&&v(t.name)&&t.name.text==="required":v(t)&&t.text==="Property"}function hr(e){if(e.kind!==ke.Decorator)return!1;let t=q(e.expression)?e.expression.expression:e.expression;return v(t)&&t.text==="Event"}function Er(e){try{let t=e.expression;if(!q(t))return[];let r=t.arguments;if(r.length===0)return[];let o=r[0];if(!o||!Ct(o))return[];let n=Array.from(o.properties).find(i=>Nt(i)&&v(i.name)&&i.name.text==="selector");return Cr(n.initializer)}catch{return[]}}function Cr(e){return Ee(e)?[e.text]:mr(e)?e.elements?.filter(t=>Ee(t)).map(t=>t.text):[]}function kr(e,t){let r={name:e,required:!1,type:"any"},o=t.expression;if(kt(o)&&v(o.name)&&o.name.text==="required"&&(r.required=!0),q(o)){let n=o.arguments,s=(n.length?n.find(a=>Ct(a)):void 0)?.properties?.find(a=>Nt(a)&&v(a.name)&&a.name.text==="alias");s&&Ee(s.initializer)&&(r.alias=s.initializer.text)}return Ce(t.parent)&&(r.type=gt(t.parent.type)),r}function Nr(e,t){let r={name:e,type:"void"};return Ce(t.parent)&&(r.type=gt(t.parent.type,!0)),r}function gt(e,t=!1){let r=t?"void":"any";if(!e||!fr(e))return r;let o=e.typeArguments;return!o||o.length===0?r:o[0].getText()}var se=class{constructor(t){this._ast=t}_ast;_context=new B;_states={1:xe,2:xe,0:lt,3:ut,6:ft,7:ht,9:Tt};async populateImportMetadata(t){let r=this._ast.filter(o=>o.type===9);await Promise.all(r.flatMap(o=>o.specifiers.filter(({imported:n})=>n!=="*").map(async({imported:n,local:i})=>{let s=n==="default"?i:n,a=await It(o.path,s,t);a&&this._context.addImport(a)})))}async generate(t){await this.populateImportMetadata(t);let r=this._ast.flatMap(o=>this._processNode(o,this._context));return["function typeCheck() {",...Ir(r),"}"].join(`
|
|
15
|
+
`)}_processNode=(t,r)=>{let o=this._states[t.type];if(!o)throw new Error(`[Type Checker] No transition function for token type ${h[t.type]}`);return o(t,this._processNode,r)}};async function Zs(e,t,r){let o=new oe(e).tokenize(),n=new ie(o).parse();return{javascript:new z(n).generate(r),typescript:await new se(n).generate(t)}}export{Zs as compile};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xaendar/compiler",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.35",
|
|
4
4
|
"description": "A library for transpiling Xaendar Templates into JavaScript code",
|
|
5
5
|
"author": "Kaitenjo",
|
|
6
6
|
"license": "MIT",
|
|
@@ -13,8 +13,8 @@
|
|
|
13
13
|
},
|
|
14
14
|
"main": "./dist/compiler.js",
|
|
15
15
|
"dependencies": {
|
|
16
|
-
"@xaendar/common": "0.7.
|
|
17
|
-
"@xaendar/types": "0.7.
|
|
16
|
+
"@xaendar/common": "0.7.35",
|
|
17
|
+
"@xaendar/types": "0.7.35",
|
|
18
18
|
"typescript": "^6.0.3"
|
|
19
19
|
}
|
|
20
20
|
}
|