@xaendar/compiler 0.9.8 → 0.9.10

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.
Files changed (2) hide show
  1. package/dist/compiler.js +2 -2
  2. package/package.json +3 -3
package/dist/compiler.js CHANGED
@@ -14,7 +14,7 @@ Found character ${e.currentChar.value}`}let s=i?39:34;for(;t;)e.peek()===s?(e.ad
14
14
  ---> ${N}${_}${S}`}}return this._tokens}withTokenSpans(n,t){return n.map(r=>({...r,span:r.span??t}))}};import{slice as lr}from"@xaendar/common";var ce=class extends M{constructor(t,r){super(t);this._tokens=r}_tokens;_currentToken={value:{type:24},index:-1};getCurrentToken(){return this._currentToken}advance(t=1){if(t<1)throw`${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:24},this._currentToken.index=-1):(this._currentToken.index=r,this._currentToken.value=this._tokens[r])}peek(t,r){let o=typeof t=="number"?t:1,i=(typeof t=="object"?t:r)?.offset??0;return o===1?this.peekOneToken(this._currentToken.index+i+1):this.peekMany(o+i)}peekMany(t){let r=new Array,o=this._currentToken.index+1;for(let i=o;i<o+t;i++)r.push(this.peekOneToken(i));return r}peekOneToken(t){return t<this._tokens.length?this._tokens[t]:{type:24}}};import{ScriptTarget as jt,SyntaxKind as m,createSourceFile as zt,forEachChild as Yt}from"typescript";function R(e){let n="const x = ",o=zt("expression.ts",`${n}${e}`,jt.ESNext,!0).statements[0].declarationList.declarations[0].initializer,i=new Array;if(ft(o,n.length,i),i.length)throw i.reduce((s,a)=>`${s}${a.message}
15
15
  `,"");return{node:o}}function ft(e,n,t){if(!Zt(e))throw Jt(e);if(Yt(e,r=>ft(r,n,t)),t.length)throw t[0].message}function Zt(e){switch(e.kind){case m.StringLiteral:case m.NumericLiteral:case m.BigIntLiteral:case m.TrueKeyword:case m.FalseKeyword:case m.NullKeyword:case m.UndefinedKeyword:case m.Identifier:case m.PropertyAccessExpression:case m.ElementAccessExpression:case m.CallExpression:case m.BinaryExpression:case m.EqualsEqualsToken:case m.EqualsEqualsEqualsToken:case m.ExclamationEqualsToken:case m.ExclamationEqualsEqualsToken:case m.LessThanToken:case m.LessThanEqualsToken:case m.GreaterThanToken:case m.GreaterThanEqualsToken:case m.PlusToken:case m.MinusToken:case m.AsteriskToken:case m.SlashToken:case m.PercentToken:case m.AsteriskAsteriskToken:case m.AmpersandAmpersandToken:case m.BarBarToken:case m.QuestionQuestionToken:case m.QuestionDotToken:case m.QuestionToken:case m.ColonToken:case m.AmpersandToken:case m.BarToken:case m.CaretToken:case m.LessThanLessThanToken:case m.GreaterThanGreaterThanToken:case m.GreaterThanGreaterThanGreaterThanToken:case m.InstanceOfKeyword:case m.InKeyword:case m.PrefixUnaryExpression:case m.PostfixUnaryExpression:case m.TypeOfExpression:case m.VoidExpression:case m.ConditionalExpression:case m.ParenthesizedExpression:case m.TemplateExpression:case m.NoSubstitutionTemplateLiteral:case m.TemplateHead:case m.TemplateMiddle:case m.TemplateTail:case m.TemplateSpan:case m.ArrayLiteralExpression:case m.ObjectLiteralExpression:case m.PropertyAssignment:case m.ShorthandPropertyAssignment:case m.SpreadAssignment:case m.SpreadElement:case m.TaggedTemplateExpression:case m.SyntaxList:return!0;default:return!1}}function Jt(e){switch(e.kind){case m.AwaitExpression:return"'await' is not allowed inside template expressions.";case m.YieldExpression:return"'yield' is not allowed inside template expressions.";case m.NewExpression:return"'new' is not allowed inside template expressions.";case m.ArrowFunction:case m.FunctionExpression:return"Function expressions are not allowed inside template expressions.";case m.BinaryExpression:return er(e.operatorToken.kind)?"Assignments are not allowed inside template expressions. Use @const to declare local template variables instead.":`'${m[e.kind]}' is not allowed inside template expressions.`;default:return`'${m[e.kind]}' is not allowed inside template expressions.`}}function er(e){return e>=m.FirstAssignment&&e<=m.LastAssignment}function Z(e,n,t){let r=t.span.start;return e.advance(),{type:4,expression:R(t.parts[0]).node,span:{start:r,end:e.getCurrentToken().value.span.end}}}function ut(e,n,t){let r=t.span.start;e.advance();let o=t.parts[0],i=e.peek();if(i.type===5||i.type===4||i.type===7)return{type:1,name:o,value:"true",span:{start:r,end:e.getCurrentToken().value.span.end}};if(i.type===11||i.type===10){let s=Z(e,n,i);return{type:1,name:o,value:s,span:{start:r,end:e.getCurrentToken().value.span.end}}}if(i.type!==6)throw`Attribute value missing for ${o} in: ${o}`;return e.advance(),{type:1,name:o,value:i.parts[0],span:{start:r,end:e.getCurrentToken().value.span.end}}}function dt(e,n,t){let r=t.span.start;e.advance();let o=t.parts[0],i=e.peek();if(i.type!==8)throw`Invalid event format for ${o}`;e.advance();let s=e.getCurrentToken().value.span.end,a=new Array;for(;e.peek().type===9;)e.advance(),a.push(R(e.getCurrentToken().value.parts[0]).node),s=e.getCurrentToken().value.span.end;return{type:2,name:o,handler:i.parts[0],parameters:a,span:{start:r,end:s}}}function Tt(e,n,t){e.advance();let r=t.parts[0],o=new Array,i=new Array,s=!0;for(;s;){let p=e.peek();switch(p.type){case 5:o.push(ut(e,n,p));break;case 7:i.push(dt(e,n,p));break;default:s=!1}}let a=e.peek().type;switch(a){case 3:e.advance();break;case 2:return e.advance(),{type:0,tagName:r,attributes:o,events:i,children:[]};default:throw new Error(`Unexpected State ${a}`)}let c=new Array;for(;!tr(e,r);){let p=n();p&&c.push(p)}return e.advance(),{type:0,tagName:r,attributes:o,events:i,children:c}}function tr(e,n){let t=e.peek();switch(t.type){case 24:throw new Error(`Expected closing tag ${n}`);case 4:return t.parts[0]===n;default:return!1}}import{slice as J}from"@xaendar/common";import{createSourceFile as rr,isExpressionStatement as nr,isIdentifier as or,ScriptTarget as ir}from"typescript";function B(e,n){let t=new Array;for(;e.peek().type!==21;){let r=n();r&&t.push(r)}return e.advance(),t}function ht(e,n,t){e.advance();let r=e.peek();if(r.type!==19)throw`Expected CONDITION after FOR, got ${T[r.type]}`;let o=sr(r.parts[0],0);e.advance(2);let i=B(e,n);return{type:8,...o,children:i}}function sr(e,n){let t=pr(e);if(t.length<2)throw'@for requires at least "item of iterable; track expr".';let r=t[0].trim(),o=r.indexOf(" of ");if(o===-1)throw'@for expression must be in the form "item of iterable".';let i=J(r,0,o).trim(),s=J(r,o+4).trim();if(!xt(i))throw`'${i}' is not a valid item alias.`;let a=R(s),c=t[1].trim();if(!c.startsWith("track "))throw'Second section of @for must start with "track".';let p=J(c,6).trim(),u=R(p),d=new Map;if(t.length>=3&&t[2]!==void 0){let f=t[2].trim(),N=n+e.indexOf(t[2]);ar(f,N,d)}return{itemAlias:i,iterableExpression:a.node,iterableSource:s,trackExpression:u.node,trackSource:p,implicitAliases:d}}function ar(e,n,t){let r=e.split(","),o=0,i=new Set(["$index","$last","$first","$even","$odd"]);for(let s=0;s<r.length;s++){let a=r[s],c=a.trim(),p=c.indexOf("=");if(p===-1)throw`Invalid alias declaration '${c}'. Expected '$implicit = alias'.`;o+=a.length+1;let u=J(c,0,p).trim(),d=J(c,p+1).trim();if(!(N=>i.has(N))(d))throw`'${d}' is not a known implicit variable. Known variables: ${[...i].join(", ")}.`;if(o+=a.length+1,!xt(u))throw`'${u}' is not a valid alias identifier.`;if(o+=a.length+1,t.has(d))throw`'${d}' is already aliased in this @for expression.`;t.set(d,u),o+=a.length+1}}function pr(e){let n=new Array,t="",r=0,o;for(let i=0;i<e.length;i++){let s=e[i];if(!(!t&&s===" ")){if(o){t+=s,s===o&&e[i-1]!=="\\"&&(o=null);continue}if(s==='"'||s==="'"||s==="`"){o=s,t+=s;continue}if(s==="("||s==="["||s==="{"){r++,t+=s;continue}if(s===")"||s==="]"||s==="}"){r--,t+=s;continue}if(s===";"&&r===0){n.push(t),t="";continue}t+=s}}return t.trim().length&&n.push(t),n}function xt(e){if(!e.length)return!1;let t=rr("__id.ts",e,ir.ESNext,!1).statements[0];return!!t&&nr(t)&&or(t.expression)&&t.expression.text===e}function Et(e,n,t){return Ct(e,n,t)}function cr(e,n,t){switch(t.type){case 15:return Ct(e,n,t);case 14:let r=t.span.start;e.advance(2);let o=B(e,n);return{type:6,children:o,span:{start:r,end:e.getCurrentToken().value.span.end}}}}function Ct(e,n,t){let r=t.span.start;e.advance();let o=e.peek();if(o.type!==19)throw`Expected CONDITION after ${T[t.type]}, got ${T[o.type]}`;e.advance(2);let i=o.parts[0],s=R(i),a=B(e,n),c=null,p=e.peek();return(p.type===15||p.type===14)&&(c=cr(e,n,p)),{type:t.type===12?5:7,condition:i,conditionNode:s.node,children:a,alternate:c,span:{start:r,end:e.getCurrentToken().value.span.end}}}function kt(e,n,t){let r=new Array;for(;e.peek().type===22;){e.advance();let o=e.getCurrentToken().value.parts[0],i=mr(o);r.push(i)}return e.advance(),{type:11,specifiers:r,path:e.getCurrentToken().value.parts[0]}}function mr(e){let n=e.trim(),t=n.match(/^\*\s+as\s+([A-Za-z_$][\w$]*)$/);if(t)return{imported:"*",local:t[1]};let r=n.match(/^default\s+as\s+([A-Za-z_$][\w$]*)$/);if(r)return{imported:"default",local:r[1]};let o=n.match(/^([A-Za-z_$][\w$]*)(?:\s+as\s+([A-Za-z_$][\w$]*))?$/);if(o)return{imported:o[1],local:o[2]??o[1]};throw`Invalid import specifier "${e}".`}function gt(e,n,t){e.advance();let r=e.peek();if(r.type!==19)throw`Expected CONDITION after SWITCH, got ${T[r.type]}`;let o=R(r.parts[0]).node;e.advance(2);let i=new Array;for(;e.peek().type!==21;){let s=e.peek();switch(s.type){case 17:let a=s.span.start,c=new Array;do{e.advance();let f=e.peek();if(f.type!==19)throw"Expected CONDITION after CASE";c.push(f.parts[0]),e.advance()}while(e.peek().type!==20);e.advance();let p=B(e,n);i.push({type:10,condition:c,children:p,span:{start:a,end:e.getCurrentToken().value.span.end}});break;case 18:let u=s.span.start;e.advance(2);let d=B(e,n);i.push({type:10,condition:null,children:d,span:{start:u,end:e.getCurrentToken().value.span.end}});break}}return e.advance(),{type:9,expression:o,children:i}}function Nt(e,n,t){return e.advance(),{type:3,value:t.parts[0]}}var me=class{constructor(n,t){this._input=n;this._cursor=new ce(this._input,t)}_input;_cursor;_states={0:Nt,11:Z,10:Z,1:Tt,12:Et,13:ht,16:gt,22:kt};parse(){let n=new Array;for(;this._cursor.peek().type!==24;){let t=this.parseNode();t&&n.push(t)}return n}parseNode(){let n=this._cursor.peek();if(n.type===24)return;let t=n.span.start;try{let r=this._states[n.type];if(!r)throw`No transition function for token type ${T[n.type]}`;let o=r(this._cursor,this.parseNode.bind(this),n),i=this._cursor.getCurrentToken().value,s="span"in i?i.span.end:n.span.end;return{...o,span:o.span??{start:t,end:s}}}catch(r){let o=r instanceof Error?r.message:r,i=this._cursor.peek(),s=i.type!==24?i.span.end:void 0;throw`${this._cursor.getPositionFromCharacterIndex(t+1)} - ${o}
16
16
  ---> ${lr(this._input,t,s)}`}}};import{slice as wr}from"@xaendar/common";var j=class extends g{_imports=new Array;addImport(n){this._imports.push(n)}getImportBySelector(n){return this._imports.find(t=>t.type==="component"&&t.selectors.includes(n))}};function A(e,n){return{text:e,span:n}}function I(...e){let n="",t=new Array;for(let r of e)if(typeof r=="string")n=`${n}${r}`;else{let o=n.length;n=`${n}${r.text}`,t.push({columnStart:o,columnEnd:n.length,original:r.span})}return t.length?{text:n,mappings:t}:{text:n}}function h(e){return{text:e}}function y(e){return e.map(n=>({text:" ".repeat(2)+n.text,mappings:n.mappings?.map(t=>({...t,columnStart:t.columnStart+2,columnEnd:t.columnEnd+2}))}))}function Lt(e,n,t){let r=new Array;if(hr(e.tagName)){let i=t.getImportBySelector(e.tagName);if(!i)throw new Error(`${e.tagName} selector is not associated to any WebComponent imported in the template`,{cause:e.span});r.push(...fr(e,i,t))}else r.push(...Tr(e,t));let o=e.children;for(let i=0;i<o.length;i++)r.push(...n(o[i],t));return r}function fr(e,n,t){let r=new Array,o=new Set(n.properties.filter(a=>a.required).map(a=>a.alias??a.name)),i=e.attributes;for(let a=0;a<i.length;a++){let{name:c,value:p}=i[a],u=ur(n,c);u&&(o.delete(u.alias??u.name),r.push(h("{"),...y(typeof p=="object"?[I("(",A(x(p.expression,t,{resolver:"root"}),p.span),`) satisfies ${u.type};`)]:[h("let x!: string"),h(`x satisfies ${u.type};`)]),h("}")))}if(o.size)throw new Error(`${e.tagName} is missing the following required properties:
17
- ${Array.from(o.values()).join(`
18
- `)}`,{cause:e.span});let s=e.events;for(let a=0;a<s.length;a++){let{name:c,handler:p,parameters:u}=s[a],d=dr(n,c);if(!d)throw new Error(`Unknown event "${c}" on <${e.tagName}> (${n.className} has no @Event with this name).`,{cause:e.span});let f=new g([],t);f.addUnresolvableIdentifier("$event");let N=u.map(_=>x(_,f,{resolver:"root"})).join(", ");r.push(h("{")),d.type!=="void"&&r.push(...y([h(`let $event!: CustomEvent<${d.type}>;`)])),r.push(...y([I(A(`root.${p}(${N});`,s[a].span))])),r.push(h("}"))}return r}function ur(e,n){return e.properties.find(t=>(t.alias??t.name)===n)}function dr(e,n){return e.events.find(t=>t.name===n)}function Tr(e,n){let t=new Array,r=e.attributes;for(let i=0;i<r.length;i++){let{value:s}=r[i];typeof s!="string"&&t.push(I(A(`${x(s.expression,n,{resolver:"root"})};`,s.span)))}let o=e.events;for(let i=0;i<o.length;i++){let{handler:s,parameters:a}=o[i],c=new g([],n);c.addUnresolvableIdentifier("$event");let p=a.map(u=>x(u,c,{resolver:"root"})).join(", ");t.push(I(A(`root.${s}(${p});`,o[i].span)))}return t}function hr(e){return/^[a-z][a-z0-9._\-]*-[a-z0-9._\-]*$/.test(e)}function At(e,n,t){let r=new j([],t),o=ee(e,"$index"),i=ee(e,"$first"),s=ee(e,"$last"),a=ee(e,"$even"),c=ee(e,"$odd"),p=[o,i,s,a,c,e.itemAlias];for(let d=0;d<p.length;d++)r.addUnresolvableIdentifier(p[d]);let u=new Array;return u.push(I(`for (const ${e.itemAlias} of root.`,A(e.iterableSource,e.span),") {")),u.push(...y([h(`let ${o}!: number;`),h(`let ${i}!: boolean;`),h(`let ${s}!: boolean;`),h(`let ${a}!: boolean;`),h(`let ${c}!: boolean;`),I(A(`${x(e.trackExpression,t,{skipResolution:!0})};`,e.span)),...e.children.flatMap(d=>n(d,r))])),u.push(h("}")),u}function ee(e,n){return e.implicitAliases.get(n)??n}function It(e,n,t){let r=new Array,o=x(e.conditionNode,t,{resolver:"root"});r.push(I("if (",A(o,e.span),") {")),r.push(...y(e.children.flatMap(s=>n(s,t)))),r.push(h("}"));let i=e.alternate;for(;i?.type===7;){let s=x(i.conditionNode,t,{resolver:"root"});r.push(I("else if (",A(s,i.span),") {")),r.push(...y(i.children.flatMap(a=>n(a,t)))),r.push(h("}")),i=i.alternate}return i&&(r.push(h("else {")),r.push(...y(i.children.flatMap(s=>n(s,t)))),r.push(h("}"))),r}function vt(e,n,t){let r=e.path,o=yt(r),i=new Array;for(let s=0;s<e.specifiers.length;s++){let{imported:a,local:c}=e.specifiers[s];switch(a){case"*":i.push(h(`let ${c}!: typeof import('${o}');`));break;case"default":i.push(h(`let ${c}!: typeof import('${o}')['default'];`));break;default:let p=yt(a);i.push(h(`let ${c}!: typeof import('${o}')['${p}'];`));break}}return i}function yt(e){return e.replace(/\\/g,"\\\\").replace(/'/g,"\\'")}function _t(e,n,t){let r=x(e.expression,t,{resolver:"root"}),o=[I("switch (",A(r,e.span),") {")],i=e.children;for(let s=0;s<i.length;s++){let a=i[s],c=a.condition;if(c?.length)for(let p=0;p<c.length;p++)o.push(h(` case ${c[p]}:`));else o.push(h(" default:"));o.push(...y(y([...a.children.flatMap(p=>n(p,t)),h("break;")])))}return o.push(h("}")),o}function Le(e,n,t){return e.type===4?[I(A(`${x(e.expression,t,{resolver:"root"})};`,e.span))]:[]}import{existsSync as Ae}from"fs";import{readFile as xr}from"fs/promises";import{resolve as Er}from"path";import{createSourceFile as Cr,getNameOfDeclaration as St,isArrayLiteralExpression as kr,isCallExpression as te,isClassDeclaration as gr,isDecorator as Nr,isIdentifier as D,isObjectLiteralExpression as bt,isPropertyAccessExpression as Lr,isPropertyAssignment as Ot,isPropertyDeclaration as ye,isStringLiteral as Ie,isTypeReferenceNode as Ar,ScriptTarget as Ir,SyntaxKind as Rt}from"typescript";async function Ft(e,n,t=process.cwd()){try{let r=yr(e,t);if(!r)return;let o=await xr(r,"utf8"),i=Cr(r,o,Ir.Latest,!0),s,a=i.statements;for(let c=0;c<a.length;c++){let p=a[c];if(!s&&gr(p)){let u=p.name?.text;if(u!==n)continue;let d=p.modifiers??[],f=Array.from(d).find(v=>vr(v));if(!f)continue;let N=br(f);if(!N?.length)continue;let _=new Array,S=new Array,H=p.members;for(let v=0;v<H.length;v++){let re=H[v];if(!ye(re))continue;let ve=re.modifiers??[],_e=!1,Se=Array.from(ve).find(b=>{let P=_r(b);return _e=!!P.required,P.decorator});if(Se){let b=St(re),P=b&&D(b)?b.text:void 0;if(P){let l=Rr(P,Se,_e);l&&_.push(l)}continue}let be=Array.from(ve).find(b=>Sr(b));if(be){let b=St(re),P=b&&D(b)?b.text:void 0;if(P){let l=Fr(P,be);l&&S.push(l)}}}s={type:"component",className:u,selectors:N,properties:_,events:S}}}return s}catch(r){console.error(`Failed to extract component metadata from ${e}:`,r);return}}function yr(e,n){if(e.startsWith(".")){let t=Er(n,e);if(Ae(`${t}.ts`))return t+".ts";if(Ae(`${t}/index.ts`))return`${t}/index.ts`;if(Ae(t))return t}}function vr(e){if(e.kind!==Rt.Decorator)return!1;let n=te(e.expression)?e.expression.expression:e.expression;return D(n)&&n.text==="WebComponent"}function _r(e){if(!Nr(e))return{decorator:!1};let n=e.expression;if(!te(n))return{decorator:!1};let t=n.expression;return D(t)&&t.text==="Property"?{decorator:!0}:Lr(t)&&D(t.expression)&&t.expression.text==="Property"&&t.name.text==="required"?{decorator:!0,required:!0}:{decorator:!1}}function Sr(e){if(e.kind!==Rt.Decorator)return!1;let n=te(e.expression)?e.expression.expression:e.expression;return D(n)&&n.text==="Event"}function br(e){try{let n=e.expression;if(!te(n))return[];let t=n.arguments;if(t.length===0)return[];let r=t[0];if(!r||!bt(r))return[];let o=Array.from(r.properties).find(i=>Ot(i)&&D(i.name)&&i.name.text==="selector");return Or(o.initializer)}catch{return[]}}function Or(e){return Ie(e)?[e.text]:kr(e)?e.elements?.filter(n=>Ie(n)).map(n=>n.text):[]}function Rr(e,n,t){let r=n.expression,o={name:e,required:t,type:ye(n.parent)?wt(n.parent.type):"any"};if(te(r)){let i=r.arguments,a=(i.length?i.find(c=>bt(c)):void 0)?.properties?.find(c=>Ot(c)&&D(c.name)&&c.name.text==="alias");a&&Ie(a.initializer)&&(o.alias=a.initializer.text)}return o}function Fr(e,n){let t={name:e,type:"void"};return ye(n.parent)&&(t.type=wt(n.parent.type,!0)),t}function wt(e,n=!1){let t=n?"void":"any";if(!e||!Ar(e))return t;let r=e.typeArguments;return!r||r.length===0?t:r[0].getText()}var le=class{constructor(n,t){this._input=n;this._ast=t}_input;_ast;_context=new j;_states={3:Le,4:Le,0:Lt,5:It,8:At,9:_t,11:vt};async populateImportMetadata(n){let t=this._ast.filter(r=>r.type===11);await Promise.all(t.flatMap(r=>r.specifiers.filter(({imported:o})=>o!=="*").map(async({imported:o,local:i})=>{let s=o==="default"?i:o,a=await Ft(r.path,s,n);a&&this._context.addImport(a)})))}async generate(n){try{await this.populateImportMetadata(n);let t=this._ast.flatMap(o=>this._processNode(o,this._context)),r=[h("function typeCheck() {"),...y(t),h("}")];return{text:r.map(o=>o.text).join(`
17
+ \u25CF ${Array.from(o.values()).join(`
18
+ \u25CF `)}`,{cause:e.span});let s=e.events;for(let a=0;a<s.length;a++){let{name:c,handler:p,parameters:u}=s[a],d=dr(n,c);if(!d)throw new Error(`Unknown event "${c}" on <${e.tagName}> (${n.className} has no @Event with this name).`,{cause:e.span});let f=new g([],t);f.addUnresolvableIdentifier("$event");let N=u.map(_=>x(_,f,{resolver:"root"})).join(", ");r.push(h("{")),d.type!=="void"&&r.push(...y([h(`let $event!: CustomEvent<${d.type}>;`)])),r.push(...y([I(A(`root.${p}(${N});`,s[a].span))])),r.push(h("}"))}return r}function ur(e,n){return e.properties.find(t=>(t.alias??t.name)===n)}function dr(e,n){return e.events.find(t=>t.name===n)}function Tr(e,n){let t=new Array,r=e.attributes;for(let i=0;i<r.length;i++){let{value:s}=r[i];typeof s!="string"&&t.push(I(A(`${x(s.expression,n,{resolver:"root"})};`,s.span)))}let o=e.events;for(let i=0;i<o.length;i++){let{handler:s,parameters:a}=o[i],c=new g([],n);c.addUnresolvableIdentifier("$event");let p=a.map(u=>x(u,c,{resolver:"root"})).join(", ");t.push(I(A(`root.${s}(${p});`,o[i].span)))}return t}function hr(e){return/^[a-z][a-z0-9._\-]*-[a-z0-9._\-]*$/.test(e)}function At(e,n,t){let r=new j([],t),o=ee(e,"$index"),i=ee(e,"$first"),s=ee(e,"$last"),a=ee(e,"$even"),c=ee(e,"$odd"),p=[o,i,s,a,c,e.itemAlias];for(let d=0;d<p.length;d++)r.addUnresolvableIdentifier(p[d]);let u=new Array;return u.push(I(`for (const ${e.itemAlias} of root.`,A(e.iterableSource,e.span),") {")),u.push(...y([h(`let ${o}!: number;`),h(`let ${i}!: boolean;`),h(`let ${s}!: boolean;`),h(`let ${a}!: boolean;`),h(`let ${c}!: boolean;`),I(A(`${x(e.trackExpression,t,{skipResolution:!0})};`,e.span)),...e.children.flatMap(d=>n(d,r))])),u.push(h("}")),u}function ee(e,n){return e.implicitAliases.get(n)??n}function It(e,n,t){let r=new Array,o=x(e.conditionNode,t,{resolver:"root"});r.push(I("if (",A(o,e.span),") {")),r.push(...y(e.children.flatMap(s=>n(s,t)))),r.push(h("}"));let i=e.alternate;for(;i?.type===7;){let s=x(i.conditionNode,t,{resolver:"root"});r.push(I("else if (",A(s,i.span),") {")),r.push(...y(i.children.flatMap(a=>n(a,t)))),r.push(h("}")),i=i.alternate}return i&&(r.push(h("else {")),r.push(...y(i.children.flatMap(s=>n(s,t)))),r.push(h("}"))),r}function vt(e,n,t){let r=e.path,o=yt(r),i=new Array;for(let s=0;s<e.specifiers.length;s++){let{imported:a,local:c}=e.specifiers[s];switch(a){case"*":i.push(h(`let ${c}!: typeof import('${o}');`));break;case"default":i.push(h(`let ${c}!: typeof import('${o}')['default'];`));break;default:let p=yt(a);i.push(h(`let ${c}!: typeof import('${o}')['${p}'];`));break}}return i}function yt(e){return e.replace(/\\/g,"\\\\").replace(/'/g,"\\'")}function _t(e,n,t){let r=x(e.expression,t,{resolver:"root"}),o=[I("switch (",A(r,e.span),") {")],i=e.children;for(let s=0;s<i.length;s++){let a=i[s],c=a.condition;if(c?.length)for(let p=0;p<c.length;p++)o.push(h(` case ${c[p]}:`));else o.push(h(" default:"));o.push(...y(y([...a.children.flatMap(p=>n(p,t)),h("break;")])))}return o.push(h("}")),o}function Le(e,n,t){return e.type===4?[I(A(`${x(e.expression,t,{resolver:"root"})};`,e.span))]:[]}import{existsSync as Ae}from"fs";import{readFile as xr}from"fs/promises";import{resolve as Er}from"path";import{createSourceFile as Cr,getNameOfDeclaration as St,isArrayLiteralExpression as kr,isCallExpression as te,isClassDeclaration as gr,isDecorator as Nr,isIdentifier as D,isObjectLiteralExpression as bt,isPropertyAccessExpression as Lr,isPropertyAssignment as Ot,isPropertyDeclaration as ye,isStringLiteral as Ie,isTypeReferenceNode as Ar,ScriptTarget as Ir,SyntaxKind as Rt}from"typescript";async function Ft(e,n,t=process.cwd()){try{let r=yr(e,t);if(!r)return;let o=await xr(r,"utf8"),i=Cr(r,o,Ir.Latest,!0),s,a=i.statements;for(let c=0;c<a.length;c++){let p=a[c];if(!s&&gr(p)){let u=p.name?.text;if(u!==n)continue;let d=p.modifiers??[],f=Array.from(d).find(v=>vr(v));if(!f)continue;let N=br(f);if(!N?.length)continue;let _=new Array,S=new Array,H=p.members;for(let v=0;v<H.length;v++){let re=H[v];if(!ye(re))continue;let ve=re.modifiers??[],_e=!1,Se=Array.from(ve).find(b=>{let P=_r(b);return _e=!!P.required,P.decorator});if(Se){let b=St(re),P=b&&D(b)?b.text:void 0;if(P){let l=Rr(P,Se,_e);l&&_.push(l)}continue}let be=Array.from(ve).find(b=>Sr(b));if(be){let b=St(re),P=b&&D(b)?b.text:void 0;if(P){let l=Fr(P,be);l&&S.push(l)}}}s={type:"component",className:u,selectors:N,properties:_,events:S}}}return s}catch(r){console.error(`Failed to extract component metadata from ${e}:`,r);return}}function yr(e,n){if(e.startsWith(".")){let t=Er(n,e);if(Ae(`${t}.ts`))return t+".ts";if(Ae(`${t}/index.ts`))return`${t}/index.ts`;if(Ae(t))return t}}function vr(e){if(e.kind!==Rt.Decorator)return!1;let n=te(e.expression)?e.expression.expression:e.expression;return D(n)&&n.text==="WebComponent"}function _r(e){if(!Nr(e))return{decorator:!1};let n=e.expression;if(!te(n))return{decorator:!1};let t=n.expression;return D(t)&&t.text==="Property"?{decorator:!0}:Lr(t)&&D(t.expression)&&t.expression.text==="Property"&&t.name.text==="required"?{decorator:!0,required:!0}:{decorator:!1}}function Sr(e){if(e.kind!==Rt.Decorator)return!1;let n=te(e.expression)?e.expression.expression:e.expression;return D(n)&&n.text==="Event"}function br(e){try{let n=e.expression;if(!te(n))return[];let t=n.arguments;if(t.length===0)return[];let r=t[0];if(!r||!bt(r))return[];let o=Array.from(r.properties).find(i=>Ot(i)&&D(i.name)&&i.name.text==="selector");return Or(o.initializer)}catch{return[]}}function Or(e){return Ie(e)?[e.text]:kr(e)?e.elements?.filter(n=>Ie(n)).map(n=>n.text):[]}function Rr(e,n,t){let r=n.expression,o={name:e,required:t,type:ye(n.parent)?wt(n.parent.type):"any"};if(te(r)){let i=r.arguments,a=(i.length?i.find(c=>bt(c)):void 0)?.properties?.find(c=>Ot(c)&&D(c.name)&&c.name.text==="alias");a&&Ie(a.initializer)&&(o.alias=a.initializer.text)}return o}function Fr(e,n){let t={name:e,type:"void"};return ye(n.parent)&&(t.type=wt(n.parent.type,!0)),t}function wt(e,n=!1){let t=n?"void":"any";if(!e||!Ar(e))return t;let r=e.typeArguments;return!r||r.length===0?t:r[0].getText()}var le=class{constructor(n,t){this._input=n;this._ast=t}_input;_ast;_context=new j;_states={3:Le,4:Le,0:Lt,5:It,8:At,9:_t,11:vt};async populateImportMetadata(n){let t=this._ast.filter(r=>r.type===11);await Promise.all(t.flatMap(r=>r.specifiers.filter(({imported:o})=>o!=="*").map(async({imported:o,local:i})=>{let s=o==="default"?i:o,a=await Ft(r.path,s,n);a&&this._context.addImport(a)})))}async generate(n){try{await this.populateImportMetadata(n);let t=this._ast.flatMap(o=>this._processNode(o,this._context)),r=[h("function typeCheck() {"),...y(t),h("}")];return{text:r.map(o=>o.text).join(`
19
19
  `),mappingTable:this.buildMappingTable(r)}}catch(t){let r,o;if(t instanceof Error){let i=t.cause;o=i&&typeof i=="object"&&"start"in i&&"end"in i?i:void 0,r=t.message}else r=t;throw o?`${new M(this._input).getPositionFromCharacterIndex(o.start+1)} - ${r}
20
20
  ---> ${wr(this._input,o.start,o.end)}}`:r}}buildMappingTable(n){let t=new Map;return n.forEach((r,o)=>{r.mappings&&t.set(o,r.mappings)}),t}_processNode=(n,t)=>{let r=this._states[n.type];if(!r)throw new Error(`No transition function for token type ${C[n.type]}`,{cause:n.span});return r(n,this._processNode,t)}};async function wa(e,n,t){let r=new pe(e).tokenize(),o=new me(e,r).parse();return{javascript:new ne(e,o).generate(t),typescript:await new le(e,o).generate(n)}}function Pa(e,n){let t=e.get(n.line);if(t){let r=t.find(o=>n.character>=o.columnStart&&n.character<o.columnEnd);return r?r.original:t.reduce((o,i)=>{let s=Math.min(Math.abs(n.character-i.columnStart),Math.abs(n.character-i.columnEnd)),a=Math.min(Math.abs(n.character-o.columnStart),Math.abs(n.character-o.columnEnd));return s<a?i:o}).original}}export{M as Cursor,wa as compile,Pa as resolveTemplateSpan};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xaendar/compiler",
3
- "version": "0.9.8",
3
+ "version": "0.9.10",
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.9.8",
17
- "@xaendar/types": "0.9.8",
16
+ "@xaendar/common": "0.9.10",
17
+ "@xaendar/types": "0.9.10",
18
18
  "typescript": "^6.0.3"
19
19
  }
20
20
  }