@xaendar/compiler 0.9.25 → 0.9.27

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
@@ -1,4 +1,4 @@
1
- import{indent as V,slice as mr}from"@xaendar/common";var g=(f=>(f[f.Element=0]="Element",f[f.Attribute=1]="Attribute",f[f.Event=2]="Event",f[f.Text=3]="Text",f[f.Interpolation=4]="Interpolation",f[f.If=5]="If",f[f.Else=6]="Else",f[f.ElseIf=7]="ElseIf",f[f.For=8]="For",f[f.Switch=9]="Switch",f[f.Case=10]="Case",f[f.Import=11]="Import",f))(g||{});var N=class e{parent;_identifiers=new Map;_unresolvableIdentifiers=new Map;constructor(n,t){if(n instanceof e?this.parent=n:t=n,t?.length)for(let r=0;r<t.length;r++){let o=t[r];typeof o=="string"?this._identifiers.set(o,"value"):this._identifiers.set(o[0],o[1])}}addIdentifier(n,t="value"){if(this.hasIdentifier(n))throw new Error(`Identifier "${n}" is already declared in this scope.`);this._identifiers.set(n,t)}addUnresolvableIdentifier(n,t="value"){if(this.hasIdentifier(n))throw new Error(`Identifier "${n}" is already declared in this scope.`);this._unresolvableIdentifiers.set(n,t)}removeIdentifier(n){this._identifiers.delete(n)}removeUnresolvabledIdentifier(n){this._unresolvableIdentifiers.delete(n)}hasIdentifier(n){return this._identifiers.has(n)||(this.parent?.hasIdentifier(n)??!1)}getIdentifierKind(n){return this._identifiers.get(n)??this.parent?.getIdentifierKind(n)}hasUnresolvableIdentifier(n){return this._unresolvableIdentifiers.has(n)||(this.parent?.hasUnresolvableIdentifier(n)??!1)}};import{indent as G}from"@xaendar/common";import{slice as Ge}from"@xaendar/common";import{forEachChild as Ve,isIdentifier as Ue,isPropertyAccessExpression as nr,isPropertyAssignment as or}from"typescript";var ir=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"]),Z="root";function x(e,n,t){return He(e,e,n,ar(t))}function He(e,n,t,r){if(Ue(e)&&Ke(e,n)){let a=e.text;if(t.hasUnresolvableIdentifier(a))return{expression:a};let c=sr(a,t);return c||(r.resolver?{expression:`${r.resolver}.${a}`}:{expression:a})}if(!We(e,n))return{expression:e.getText()};let o=e.getSourceFile().text,i={expression:""},s=e.getStart();return Ve(e,a=>{let{expression:c,reactive:p}=He(a,e,t,r);i={expression:`${i}${Ge(o,s,a.getStart())}${c}`,reactive:i.reactive||p},s=a.getEnd()}),{expression:`${i.expression}${Ge(o,s,e.getEnd())}`,reactive:i.reactive}}function sr(e,n){if(n.hasIdentifier(e)){let t=n.getIdentifierKind(e),r=`context.get('${e}')`;return t==="signal"?{expression:`${r}()`,reactive:!0}:{expression:r,reactive:!1}}}function We(e,n){if(Ue(e)&&Ke(e,n))return!0;let t=!1;return Ve(e,r=>{t||(t=We(r,e))}),t}function Ke(e,n){return!(nr(n)&&n.name===e||or(n)&&n.name===e||ir.has(e.text)||!e.text)}function qe(e,n,t){return xe(e.tagName,n,t)}function he(e="text",n,t){return xe(e,n,t)}function P(e,n,t){return xe(e,n,t)}function xe(e,n,t){return(n!==Z?`${n}__${e}${t}`:`${e}${t}`).replace(/-/g,"_")}function ar(e){return{resolver:e?.resolver??"this",emitReactive:e?.emitReactive??!1}}function Qe(e,n,t,r,o){let i=pr(e.attributes,r),s=cr(e.events,r),a=qe(e,n,t),c=e.tagName,p={code:[],functionsToProcess:new Map};switch(c){case"svg":p.code.push("context.createElement = createSVGElement");break;case"math":p.code.push("context.createElement = createMATHMLElement")}switch(p.code.push(`const ${a} = _renderElement(${n}, context, ${o}, '${c}',`),i.length?p.code.push(...G(["[",...G(i),"],"])):p.code[p.code.length-1]=`${p.code[p.code.length-1]} [],`,s.length?p.code.push(...G(["[",...G(s),"]"]),");"):p.code[p.code.length-1]=`${p.code[p.code.length-1]} []);`,c){case"svg":case"math":p.code.push("context.createElement = createElement")}return e.children.length&&(p.functionsToProcess.set(`${a}Children`,{fn:{node:e,parentNode:a,context:r,precode:lr(c)},args:[a,"parentContext"]}),p.code.push(`this.${a}Children(${a}, context);`)),p}function pr(e,n){return e?.map(({name:t,value:r})=>{if(typeof r=="string")return`{ name: '${t}', value: () => '${r}', reactive: false },`;{let{expression:o,reactive:i}=x(r.expression,n);return`{ name: '${t}', value: () => ${o}, reactive: ${i} },`}})}function cr(e,n){n.addUnresolvableIdentifier("$event");let t=e.map(r=>{let o=!1,i=r.parameters.map(a=>{let c=x(a,n).expression;return!o&&c==="$event"?(o=!0,`($event) => ${c},`):`() => ${c},`}),s=["{",...G([`name: '${r.name}',`,`handler: '${r.handler}',`,"parameters: ["])];return i.length?s.push(...G([...G(i),"]"]),"},"):(s[s.length-1]=`${s[s.length-1]}]`,s.push("},")),s}).flat();return n.removeIdentifier("$event"),t}function lr(e){switch(e){case"svg":return"context.createElement = createSVGElement;";case"math":return"context.createElement = createMATHMLElement;";default:return""}}function Xe(e,n,t,r){let o={code:[],functionsToProcess:new Map},i=e.iterableSource,s=r.hasIdentifier(i)?i:`this.${i}`,a=he("items",n,t),c=he("i",n,t),p=ee(e,"$index"),u=ee(e,"$first"),d=ee(e,"$last"),f=ee(e,"$even"),y=ee(e,"$odd"),b=new N(r);b.addUnresolvableIdentifier(e.itemAlias);let w=[p,u,d,f,y];for(let E=0;E<w.length;E++)b.addUnresolvableIdentifier(w[E],"signal");let S=P("for",n,t);return o.functionsToProcess.set(S,{fn:{precode:`const { vars, update } = _iterationVariables(context, ${a}, ${c}, '${e.itemAlias}', {
1
+ import{indent as V,slice as mr}from"@xaendar/common";var g=(f=>(f[f.Element=0]="Element",f[f.Attribute=1]="Attribute",f[f.Event=2]="Event",f[f.Text=3]="Text",f[f.Interpolation=4]="Interpolation",f[f.If=5]="If",f[f.Else=6]="Else",f[f.ElseIf=7]="ElseIf",f[f.For=8]="For",f[f.Switch=9]="Switch",f[f.Case=10]="Case",f[f.Import=11]="Import",f))(g||{});var N=class e{parent;_identifiers=new Map;_unresolvableIdentifiers=new Map;constructor(n,t){if(n instanceof e?this.parent=n:t=n,t?.length)for(let r=0;r<t.length;r++){let o=t[r];typeof o=="string"?this._identifiers.set(o,"value"):this._identifiers.set(o[0],o[1])}}addIdentifier(n,t="value"){if(this.hasIdentifier(n))throw new Error(`Identifier "${n}" is already declared in this scope.`);this._identifiers.set(n,t)}addUnresolvableIdentifier(n,t="value"){if(this.hasIdentifier(n))throw new Error(`Identifier "${n}" is already declared in this scope.`);this._unresolvableIdentifiers.set(n,t)}removeIdentifier(n){this._identifiers.delete(n)}removeUnresolvabledIdentifier(n){this._unresolvableIdentifiers.delete(n)}hasIdentifier(n){return this._identifiers.has(n)||(this.parent?.hasIdentifier(n)??!1)}getIdentifierKind(n){return this._identifiers.get(n)??this.parent?.getIdentifierKind(n)}hasUnresolvableIdentifier(n){return this._unresolvableIdentifiers.has(n)||(this.parent?.hasUnresolvableIdentifier(n)??!1)}};import{indent as G}from"@xaendar/common";import{slice as Ge}from"@xaendar/common";import{forEachChild as Ve,isIdentifier as Ue,isPropertyAccessExpression as nr,isPropertyAssignment as or}from"typescript";var ir=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"]),Z="root";function x(e,n,t){return He(e,e,n,ar(t))}function He(e,n,t,r){if(Ue(e)&&Ke(e,n)){let a=e.text;if(t.hasUnresolvableIdentifier(a))return{expression:a};let c=sr(a,t);return c||(r.resolver?{expression:`${r.resolver}.${a}`}:{expression:a})}if(!We(e,n))return{expression:e.getText()};let o=e.getSourceFile().text,i={expression:""},s=e.getStart();return Ve(e,a=>{let{expression:c,reactive:p}=He(a,e,t,r);i={expression:`${i.expression}${Ge(o,s,a.getStart())}${c}`,reactive:i.reactive||p},s=a.getEnd()}),{expression:`${i.expression}${Ge(o,s,e.getEnd())}`,reactive:i.reactive}}function sr(e,n){if(n.hasIdentifier(e)){let t=n.getIdentifierKind(e),r=`context.get('${e}')`;return t==="signal"?{expression:`${r}()`,reactive:!0}:{expression:r,reactive:!1}}}function We(e,n){if(Ue(e)&&Ke(e,n))return!0;let t=!1;return Ve(e,r=>{t||(t=We(r,e))}),t}function Ke(e,n){return!(nr(n)&&n.name===e||or(n)&&n.name===e||ir.has(e.text)||!e.text)}function qe(e,n,t){return xe(e.tagName,n,t)}function he(e="text",n,t){return xe(e,n,t)}function P(e,n,t){return xe(e,n,t)}function xe(e,n,t){return(n!==Z?`${n}__${e}${t}`:`${e}${t}`).replace(/-/g,"_")}function ar(e){return{resolver:e?.resolver??"this",emitReactive:e?.emitReactive??!1}}function Qe(e,n,t,r,o){let i=pr(e.attributes,r),s=cr(e.events,r),a=qe(e,n,t),c=e.tagName,p={code:[],functionsToProcess:new Map};switch(c){case"svg":p.code.push("context.createElement = createSVGElement");break;case"math":p.code.push("context.createElement = createMATHMLElement")}switch(p.code.push(`const ${a} = _renderElement(${n}, context, ${o}, '${c}',`),i.length?p.code.push(...G(["[",...G(i),"],"])):p.code[p.code.length-1]=`${p.code[p.code.length-1]} [],`,s.length?p.code.push(...G(["[",...G(s),"]"]),");"):p.code[p.code.length-1]=`${p.code[p.code.length-1]} []);`,c){case"svg":case"math":p.code.push("context.createElement = createElement")}return e.children.length&&(p.functionsToProcess.set(`${a}Children`,{fn:{node:e,parentNode:a,context:r,precode:lr(c)},args:[a,"parentContext"]}),p.code.push(`this.${a}Children(${a}, context);`)),p}function pr(e,n){return e?.map(({name:t,value:r})=>{if(typeof r=="string")return`{ name: '${t}', value: () => '${r}', reactive: false },`;{let{expression:o,reactive:i}=x(r.expression,n);return`{ name: '${t}', value: () => ${o}, reactive: ${i} },`}})}function cr(e,n){n.addUnresolvableIdentifier("$event");let t=e.map(r=>{let o=!1,i=r.parameters.map(a=>{let c=x(a,n).expression;return!o&&c==="$event"?(o=!0,`($event) => ${c},`):`() => ${c},`}),s=["{",...G([`name: '${r.name}',`,`handler: '${r.handler}',`,"parameters: ["])];return i.length?s.push(...G([...G(i),"]"]),"},"):(s[s.length-1]=`${s[s.length-1]}]`,s.push("},")),s}).flat();return n.removeIdentifier("$event"),t}function lr(e){switch(e){case"svg":return"context.createElement = createSVGElement;";case"math":return"context.createElement = createMATHMLElement;";default:return""}}function Xe(e,n,t,r){let o={code:[],functionsToProcess:new Map},i=e.iterableSource,s=r.hasIdentifier(i)?i:`this.${i}`,a=he("items",n,t),c=he("i",n,t),p=ee(e,"$index"),u=ee(e,"$first"),d=ee(e,"$last"),f=ee(e,"$even"),y=ee(e,"$odd"),b=new N(r);b.addUnresolvableIdentifier(e.itemAlias);let w=[p,u,d,f,y];for(let E=0;E<w.length;E++)b.addUnresolvableIdentifier(w[E],"signal");let S=P("for",n,t);return o.functionsToProcess.set(S,{fn:{precode:`const { vars, update } = _iterationVariables(context, ${a}, ${c}, '${e.itemAlias}', {
2
2
  $index: '${p}',
3
3
  $first: '${u}',
4
4
  $last: '${d}',
@@ -15,7 +15,7 @@ Found character ${e.currentChar.value}`}let s=i?39:34;for(;t;)e.peek()===s?(e.ad
15
15
  `,"");return{node:o}}function kt(e,n,t){if(!gr(e))throw kr(e);if(Cr(e,r=>kt(r,n,t)),t.length)throw t[0].message}function gr(e){switch(e.kind){case l.StringLiteral:case l.NumericLiteral:case l.BigIntLiteral:case l.TrueKeyword:case l.FalseKeyword:case l.NullKeyword:case l.UndefinedKeyword:case l.Identifier:case l.PropertyAccessExpression:case l.ElementAccessExpression:case l.CallExpression:case l.BinaryExpression:case l.EqualsEqualsToken:case l.EqualsEqualsEqualsToken:case l.ExclamationEqualsToken:case l.ExclamationEqualsEqualsToken:case l.LessThanToken:case l.LessThanEqualsToken:case l.GreaterThanToken:case l.GreaterThanEqualsToken:case l.PlusToken:case l.MinusToken:case l.AsteriskToken:case l.SlashToken:case l.PercentToken:case l.AsteriskAsteriskToken:case l.AmpersandAmpersandToken:case l.BarBarToken:case l.QuestionQuestionToken:case l.QuestionDotToken:case l.QuestionToken:case l.ColonToken:case l.AmpersandToken:case l.BarToken:case l.CaretToken:case l.LessThanLessThanToken:case l.GreaterThanGreaterThanToken:case l.GreaterThanGreaterThanGreaterThanToken:case l.InstanceOfKeyword:case l.InKeyword:case l.PrefixUnaryExpression:case l.PostfixUnaryExpression:case l.TypeOfExpression:case l.VoidExpression:case l.ConditionalExpression:case l.ParenthesizedExpression:case l.TemplateExpression:case l.NoSubstitutionTemplateLiteral:case l.TemplateHead:case l.TemplateMiddle:case l.TemplateTail:case l.TemplateSpan:case l.ArrayLiteralExpression:case l.ObjectLiteralExpression:case l.PropertyAssignment:case l.ShorthandPropertyAssignment:case l.SpreadAssignment:case l.SpreadElement:case l.TaggedTemplateExpression:case l.SyntaxList:return!0;default:return!1}}function kr(e){switch(e.kind){case l.AwaitExpression:return"'await' is not allowed inside template expressions.";case l.YieldExpression:return"'yield' is not allowed inside template expressions.";case l.NewExpression:return"'new' is not allowed inside template expressions.";case l.ArrowFunction:case l.FunctionExpression:return"Function expressions are not allowed inside template expressions.";case l.BinaryExpression:return Nr(e.operatorToken.kind)?"Assignments are not allowed inside template expressions. Use @const to declare local template variables instead.":`'${l[e.kind]}' is not allowed inside template expressions.`;default:return`'${l[e.kind]}' is not allowed inside template expressions.`}}function Nr(e){return e>=l.FirstAssignment&&e<=l.LastAssignment}function te(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 Nt(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=te(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 yt(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 At(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(Nt(e,n,p));break;case 7:i.push(yt(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(;!yr(e,r);){let p=n();p&&c.push(p)}return e.advance(),{type:0,tagName:r,attributes:o,events:i,children:c}}function yr(e,n){let t=e.peek();switch(t.type){case 24:throw new Error(`Expected closing tag ${n} while file is over`);case 4:let r=t.parts[0];if(r===n)return!0;throw`Expected closing tag ${n}, found ${r}`;default:return!1}}import{slice as re}from"@xaendar/common";import{createSourceFile as Ar,isExpressionStatement as Lr,isIdentifier as Ir,ScriptTarget as vr}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 Lt(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=_r(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=re(r,0,o).trim(),s=re(r,o+4).trim();if(!It(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=re(c,6).trim(),u=R(p),d=new Map;if(t.length>=3&&t[2]!==void 0){let f=t[2].trim(),y=n+e.indexOf(t[2]);br(f,y,d)}return{itemAlias:i,iterableExpression:a.node,iterableSource:s,trackExpression:u.node,trackSource:p,implicitAliases:d}}function br(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=re(c,0,p).trim(),d=re(c,p+1).trim();if(!(y=>i.has(y))(d))throw`'${d}' is not a known implicit variable. Known variables: ${[...i].join(", ")}.`;if(o+=a.length+1,!It(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 _r(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 It(e){if(!e.length)return!1;let t=Ar("__id.ts",e,vr.ESNext,!1).statements[0];return!!t&&Lr(t)&&Ir(t.expression)&&t.expression.text===e}function vt(e,n,t){return St(e,n,t)}function Or(e,n,t){switch(t.type){case 15:return St(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 St(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=Or(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 bt(e,n,t){let r=new Array;for(;e.peek().type===22;){e.advance();let o=e.getCurrentToken().value.parts[0],i=Rr(o);r.push(i)}return e.advance(),{type:11,specifiers:r,path:e.getCurrentToken().value.parts[0]}}function Rr(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 _t(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 Ot(e,n,t){return e.advance(),{type:3,value:t.parts[0]}}var me=class{constructor(n,t){this._input=n;this._cursor=new le(this._input,t)}_input;_cursor;_states={0:Ot,11:te,10:te,1:At,12:vt,13:Lt,16:_t,22:bt};thrown=!1;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 of 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){if(this.thrown)throw r;this.thrown=!0;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
  ---> ${wr(this._input,t,s)}`}}};import{slice as sn}from"@xaendar/common";var z=class extends N{_imports=new Array;addImport(n){this._imports.push(n)}getImportBySelector(n){return this._imports.find(t=>t.type==="component"&&t.selectors.includes(n))}};function L(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 v(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 Rt(e,n,t){let r=new Array;if(Pr(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(...$r(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.entries().filter(([a,c])=>c.required).map(([a])=>a)),i=e.attributes;for(let a=0;a<i.length;a++){let{name:c,value:p}=i[a],u=n.properties.get(c);u&&(o.delete(c),r.push(h("{"),...v(typeof p=="object"?[I("(",L(x(p.expression,t,{resolver:"root"}).expression,p.span),`) satisfies ${u.type};`)]:[h("let x!: string;"),I(L(`x satisfies ${u.type};`,i[a].span))]),h("}")))}if(o.size)throw new Error(`${e.tagName} is missing the following required properties:
17
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=n.events.get(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 N(t);f.addUnresolvableIdentifier("$event");let y=u.map(b=>x(b,f,{resolver:"root"}).expression).join(", ");r.push(h("{")),d.type!=="void"&&r.push(...v([h(`let $event!: CustomEvent<${d.type}>;`)])),r.push(...v([I(L(`root.${p}(${y});`,s[a].span))])),r.push(h("}"))}return r}function $r(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(L(`${x(s.expression,n,{resolver:"root"}).expression};`,s.span)))}let o=e.events;for(let i=0;i<o.length;i++){let{handler:s,parameters:a}=o[i],c=new N(n);c.addUnresolvableIdentifier("$event");let p=a.map(u=>x(u,c,{resolver:"root"}).expression).join(", ");t.push(I(L(`root.${s}(${p});`,o[i].span)))}return t}function Pr(e){return/^[a-z][a-z0-9._\-]*-[a-z0-9._\-]*$/.test(e)}function wt(e,n,t){let r=new z(t),o=ne(e,"$index"),i=ne(e,"$first"),s=ne(e,"$last"),a=ne(e,"$even"),c=ne(e,"$odd");r.addUnresolvableIdentifier(e.itemAlias);let p=[o,i,s,a,c];for(let d=0;d<p.length;d++)r.addUnresolvableIdentifier(p[d],"signal");let u=new Array;return u.push(I(`for (const ${e.itemAlias} of root.`,L(e.iterableSource,e.span),") {")),u.push(...v([h(`let ${o}!: number;`),h(`let ${i}!: boolean;`),h(`let ${s}!: boolean;`),h(`let ${a}!: boolean;`),h(`let ${c}!: boolean;`),I(L(`${x(e.trackExpression,t).expression};`,e.span)),...e.children.flatMap(d=>n(d,r))])),u.push(h("}")),u}function ne(e,n){return e.implicitAliases.get(n)??n}function Ft(e,n,t){let r=new Array,o=x(e.conditionNode,t,{resolver:"root"});r.push(I("if (",L(o.expression,e.span),") {")),r.push(...v(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 (",L(s.expression,i.span),") {")),r.push(...v(i.children.flatMap(a=>n(a,t)))),r.push(h("}")),i=i.alternate}return i&&(r.push(h("else {")),r.push(...v(i.children.flatMap(s=>n(s,t)))),r.push(h("}"))),r}function $t(e,n,t){let{expression:r}=x(e.expression,t,{resolver:"root"}),o=[I("switch (",L(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(...v(v([...a.children.flatMap(p=>n(p,t)),h("break;")])))}return o.push(h("}")),o}function ve(e,n,t){return e.type===4?[I(L(`${x(e.expression,t,{resolver:"root"}).expression};`,e.span))]:[]}import{slice as Ur}from"@xaendar/common";import{existsSync as Se}from"fs";import{readFile as Hr}from"fs/promises";import{resolve as Wr}from"path";import{createSourceFile as Kr,getNameOfDeclaration as Mt,isArrayLiteralExpression as qr,isCallExpression as ue,isDecorator as Qr,isIdentifier as H,isObjectLiteralExpression as Dt,isPropertyAccessExpression as Xr,isPropertyAssignment as Bt,isPropertyDeclaration as _e,isStringLiteral as be,isTypeReferenceNode as jr,ScriptTarget as zr,SyntaxKind as Yr}from"typescript";import{getDecorators as Mr,isCallExpression as Dr,isClassDeclaration as Br,isIdentifier as Pt,isPropertyAccessExpression as Gr}from"typescript";function fe(e,n){let t=0,r,o=e.statements;for(;t<o.length&&!r;){let i=o[t];if(Br(i)&&i.name?.text===n){let s=Vr(i);s&&(r={klass:i,decorator:s})}t++}return r}function Vr(e){let n=Mr(e);if(!n?.length)return;let t=0,r;for(;t<n.length&&!r;){let o=n[t];if(!Dr(o.expression)){t++;continue}let i=o.expression.expression;Pt(i)&&i.text==="WebComponent"&&(r=o),Gr(i)&&Pt(i.name)&&i.name.text==="WebComponent"&&(r=o),t++}return r}async function Gt(e,n,t=process.cwd()){let r=Jr(e,t);if(!r)return;let o=await Hr(r,"utf8"),i=Kr(r,o,zr.Latest,!0),s,a=0,c=fe(i,n);if(!c)return;let{klass:p,decorator:u}=c,d=tn(u);if(!d?.length)return;let f=new Map,y=new Map,b=p.members;for(let S=0;S<b.length;S++){let E=b[S];if(!_e(E))continue;let we=E.modifiers??[],Fe=!1,$e=Array.from(we).find(_=>{let M=Zr(_);return Fe=!!M.required,M.decorator});if($e){let _=Mt(E);if(_&&H(_)){let M=_.text,W=nn(_,M,$e,Fe);if(W){let m=W.alias??M,Me=f.get(m);if(!Me)f.set(m,W);else{let{start:De,end:tr}=Me.span,{line:rr,character:Be}=i.getLineAndCharacterOfPosition(De);throw`Failed to extract metadata from an imported component in the template - ${r}
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=n.events.get(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 N(t);f.addUnresolvableIdentifier("$event");let y=u.map(b=>x(b,f,{resolver:"root"}).expression).join(", ");r.push(h("{")),d.type!=="void"&&r.push(...v([h(`let $event!: CustomEvent<${d.type}>;`)])),r.push(...v([I(L(`root.${p}(${y});`,s[a].span))])),r.push(h("}"))}return r}function $r(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(L(`${x(s.expression,n,{resolver:"root"}).expression};`,s.span)))}let o=e.events;for(let i=0;i<o.length;i++){let{handler:s,parameters:a}=o[i],c=new N(n);c.addUnresolvableIdentifier("$event");let p=a.map(u=>x(u,c,{resolver:"root"}).expression).join(", ");t.push(I(L(`root.${s}(${p});`,o[i].span)))}return t}function Pr(e){return/^[a-z][a-z0-9._\-]*-[a-z0-9._\-]*$/.test(e)}function wt(e,n,t){let r=new z(t),o=ne(e,"$index"),i=ne(e,"$first"),s=ne(e,"$last"),a=ne(e,"$even"),c=ne(e,"$odd");r.addUnresolvableIdentifier(e.itemAlias);let p=[o,i,s,a,c];for(let d=0;d<p.length;d++)r.addUnresolvableIdentifier(p[d],"signal");let u=new Array;return u.push(I(`for (const ${e.itemAlias} of root.`,L(e.iterableSource,e.span),") {")),u.push(...v([h(`let ${o}!: Signal<number>;`),h(`let ${i}!: Signal<boolean>;`),h(`let ${s}!: Signal<boolean>;`),h(`let ${a}!: Signal<boolean>;`),h(`let ${c}!: Signal<boolean>;`),I(L(`${x(e.trackExpression,r).expression};`,e.span)),...e.children.flatMap(d=>n(d,r))])),u.push(h("}")),u}function ne(e,n){return e.implicitAliases.get(n)??n}function Ft(e,n,t){let r=new Array,o=x(e.conditionNode,t,{resolver:"root"});r.push(I("if (",L(o.expression,e.span),") {")),r.push(...v(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 (",L(s.expression,i.span),") {")),r.push(...v(i.children.flatMap(a=>n(a,t)))),r.push(h("}")),i=i.alternate}return i&&(r.push(h("else {")),r.push(...v(i.children.flatMap(s=>n(s,t)))),r.push(h("}"))),r}function $t(e,n,t){let{expression:r}=x(e.expression,t,{resolver:"root"}),o=[I("switch (",L(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(...v(v([...a.children.flatMap(p=>n(p,t)),h("break;")])))}return o.push(h("}")),o}function ve(e,n,t){return e.type===4?[I(L(`${x(e.expression,t,{resolver:"root"}).expression};`,e.span))]:[]}import{slice as Ur}from"@xaendar/common";import{existsSync as Se}from"fs";import{readFile as Hr}from"fs/promises";import{resolve as Wr}from"path";import{createSourceFile as Kr,getNameOfDeclaration as Mt,isArrayLiteralExpression as qr,isCallExpression as ue,isDecorator as Qr,isIdentifier as H,isObjectLiteralExpression as Dt,isPropertyAccessExpression as Xr,isPropertyAssignment as Bt,isPropertyDeclaration as _e,isStringLiteral as be,isTypeReferenceNode as jr,ScriptTarget as zr,SyntaxKind as Yr}from"typescript";import{getDecorators as Mr,isCallExpression as Dr,isClassDeclaration as Br,isIdentifier as Pt,isPropertyAccessExpression as Gr}from"typescript";function fe(e,n){let t=0,r,o=e.statements;for(;t<o.length&&!r;){let i=o[t];if(Br(i)&&i.name?.text===n){let s=Vr(i);s&&(r={klass:i,decorator:s})}t++}return r}function Vr(e){let n=Mr(e);if(!n?.length)return;let t=0,r;for(;t<n.length&&!r;){let o=n[t];if(!Dr(o.expression)){t++;continue}let i=o.expression.expression;Pt(i)&&i.text==="WebComponent"&&(r=o),Gr(i)&&Pt(i.name)&&i.name.text==="WebComponent"&&(r=o),t++}return r}async function Gt(e,n,t=process.cwd()){let r=Jr(e,t);if(!r)return;let o=await Hr(r,"utf8"),i=Kr(r,o,zr.Latest,!0),s,a=0,c=fe(i,n);if(!c)return;let{klass:p,decorator:u}=c,d=tn(u);if(!d?.length)return;let f=new Map,y=new Map,b=p.members;for(let S=0;S<b.length;S++){let E=b[S];if(!_e(E))continue;let we=E.modifiers??[],Fe=!1,$e=Array.from(we).find(_=>{let M=Zr(_);return Fe=!!M.required,M.decorator});if($e){let _=Mt(E);if(_&&H(_)){let M=_.text,W=nn(_,M,$e,Fe);if(W){let m=W.alias??M,Me=f.get(m);if(!Me)f.set(m,W);else{let{start:De,end:tr}=Me.span,{line:rr,character:Be}=i.getLineAndCharacterOfPosition(De);throw`Failed to extract metadata from an imported component in the template - ${r}
19
19
  [Ln ${rr+1}, Col ${Be+1}] - A property identified by name ${m} was already defined
20
20
  ---> ${Ur(o,De-Be,tr)}`}}}continue}let Pe=Array.from(we).find(_=>en(_));if(Pe){let _=Mt(E),M=_&&H(_)?_.text:void 0;if(M){let W=on(Pe);W&&y.set(M,W)}}}let w=new Map;return f.entries().forEach(([S,E])=>w.set(S,{name:E.name,required:E.required,type:E.type,alias:E.alias})),s={type:"component",className:n,selectors:d,properties:w,events:y},s}function Jr(e,n){if(e.startsWith(".")){let t=Wr(n,e);if(Se(`${t}.ts`))return t+".ts";if(Se(`${t}/index.ts`))return`${t}/index.ts`;if(Se(t))return t}}function Zr(e){if(!Qr(e))return{decorator:!1};let n=e.expression;if(!ue(n))return{decorator:!1};let t=n.expression;return H(t)&&t.text==="Property"?{decorator:!0}:Xr(t)&&H(t.expression)&&t.expression.text==="Property"&&t.name.text==="required"?{decorator:!0,required:!0}:{decorator:!1}}function en(e){if(e.kind!==Yr.Decorator)return!1;let n=ue(e.expression)?e.expression.expression:e.expression;return H(n)&&n.text==="Event"}function tn(e){try{let n=e.expression;if(!ue(n))return[];let t=n.arguments;if(t.length===0)return[];let r=t[0];if(!r||!Dt(r))return[];let o=Array.from(r.properties).find(i=>Bt(i)&&H(i.name)&&i.name.text==="selector");return rn(o.initializer)}catch{return[]}}function rn(e){return be(e)?[e.text]:qr(e)?e.elements?.filter(n=>be(n)).map(n=>n.text):[]}function nn(e,n,t,r){let o=t.expression,i={name:n,required:r,type:_e(t.parent)?Vt(t.parent.type):"any",span:{start:e.getStart(),end:e.getEnd()}};if(ue(o)){let s=o.arguments,c=(s.length?s.find(p=>Dt(p)):void 0)?.properties?.find(p=>Bt(p)&&H(p.name)&&p.name.text==="alias");if(c&&be(c.initializer)){let p=c.initializer;i.alias=p.text,i.span={start:p.getStart(),end:p.getEnd()}}}return i}function on(e){let n={type:"void"};return _e(e.parent)&&(n.type=Vt(e.parent.type,!0)),n}function Vt(e,n=!1){let t=n?"void":"any";if(!e||!jr(e))return t;let r=e.typeArguments;return!r||r.length===0?t:r[0].getText()}var de=class{constructor(n,t){this._input=n;this._ast=t}_input;_ast;_context=new z;_states={3:ve,4:ve,0:Rt,5:Ft,8:wt,9:$t,11:()=>[]};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 Gt(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() {"),...v(t),h("}")];return{text:r.map(o=>o.text).join(`
21
21
  `),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 D(this._input).getPositionFromCharacterIndex(o.start+1)} - ${r}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xaendar/compiler",
3
- "version": "0.9.25",
3
+ "version": "0.9.27",
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.25",
17
- "@xaendar/types": "0.9.25",
16
+ "@xaendar/common": "0.9.27",
17
+ "@xaendar/types": "0.9.27",
18
18
  "typescript": "^6.0.3",
19
19
  "type-fest": "^5.9.0"
20
20
  }