@ngcompass/engine
Advanced tools
+2
-2
@@ -1,3 +0,3 @@ | ||
| 'use strict';var ast=require('@ngcompass/ast'),common=require('@ngcompass/common'),k=require('typescript'),child_process=require('child_process'),fs=require('fs'),module$1=require('module'),Kt=require('os'),R=require('path'),url=require('url'),Ut=require('v8'),planner=require('@ngcompass/planner'),Xt=require('p-limit'),promises=require('fs/promises'),lruCache=require('lru-cache'),Q=require('process');var _documentCurrentScript=typeof document!=='undefined'?document.currentScript:null;function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var k__default=/*#__PURE__*/_interopDefault(k);var Kt__default=/*#__PURE__*/_interopDefault(Kt);var R__namespace=/*#__PURE__*/_interopNamespace(R);var Ut__default=/*#__PURE__*/_interopDefault(Ut);var Xt__default=/*#__PURE__*/_interopDefault(Xt);var Q__default=/*#__PURE__*/_interopDefault(Q);var Pr=(e,t,r)=>({name:e,streamType:"AngularClass",handle:t,meta:r}),br=(e,t,r)=>({name:e,streamType:"AnyAngularClass",handle:t,meta:r}),vr=(e,t)=>({name:e,streamType:"DecoratedProperty",handle:t}),Ar=(e,t,r)=>({name:e,streamType:"TemplateExpression",handle:t,meta:r}),Fr=(e,t,r)=>({name:e,streamType:"TemplateAttribute",handle:t,meta:r}),Nr=(e,t,r)=>({name:e,streamType:"CallExpression",handle:t,meta:r}),_r=(e,t,r)=>({name:e,streamType:"NewExpression",handle:t,meta:r}),Rr=(e,t,r)=>({name:e,streamType:"TemplateBlock",handle:t,meta:r}),Ir=(e,t,r)=>({name:e,streamType:"Template",handle:t,meta:r});var tt={AngularClass:"ClassDeclaration",AnyAngularClass:"ClassDeclaration",DecoratedProperty:"PropertyDefinition",TemplateExpression:"__template_expression__",TemplateAttribute:"__template_attribute__",TemplateBlock:"__template_block__",Template:"__template_analysis__",CallExpression:"CallExpression",NewExpression:"NewExpression"};function ke(e,t){let r=new Map;for(let o of e){let a=tt[o.streamType];if(!a||a.startsWith("__"))continue;let i=t[o.streamType];if(!i)continue;let n={ruleName:o.name,filter:i,handle:o.handle.bind(o)},s=r.get(a);s?s.push(n):r.set(a,[n]);}return r}var rt=2,at=80,Te=6e4,st=2,it=5;var te=(e,t,r,o,a,i,n)=>{if(t.length!==0)for(let s of e)for(let l=0;l<t.length;l++){let u=t[l],f=i?performance.now():0;try{let m=u.handle(s,r);if(m){let g=o.get(u.name)??[];Array.isArray(m)?g.push(...m):g.push(m),o.set(u.name,g);}}catch(m){n?.record(common.createInfrastructureError("RuleExecutionError",{cause:`Rule ${u.name} failed on template node: ${m instanceof Error?m.message:String(m)}`,recoverable:true,phase:"engine",details:{ruleName:u.name,errorName:m instanceof Error?m.name:void 0}}));}if(i){let m=performance.now()-f,g=a.get(u.name);g&&(g.totalMs+=m,g.invocations++);}}},Or=(e,t,r)=>{let{program:o}=t;if(!o)return {results:e.map(p=>({ruleName:p.name,failures:[]})),performance:{traversalMs:0,nodesVisited:0,ruleTimings:[],cacheStats:{hits:0,misses:0},budgetViolations:[],hasBudgetViolations:false}};let a=performance.now(),i=ke(e,{AngularClass:ast.toAngularClassStream,AnyAngularClass:ast.toAnyAngularClassStream,DecoratedProperty:ast.toDecoratedPropertyStream,CallExpression:ast.toCallExpressionStream,NewExpression:ast.toNewExpressionStream}),n=e.filter(p=>p.streamType==="TemplateExpression"),s=e.filter(p=>p.streamType==="TemplateAttribute"),l=e.filter(p=>p.streamType==="TemplateBlock"),u=e.filter(p=>p.streamType==="Template"),f=new Map,m=new Map,g=r?.collectRuleTimings??common.isDebugEnabled(),y=0;for(let p of e)m.set(p.name,{ruleName:p.name,totalMs:0,invocations:0});if(ast.resetComponentCacheStats(),ast.walkProgram(o,p=>{if(!p?.type)return;y++;let d=i.get(p.type);if(d)for(let S=0;S<d.length;S++){let c=d[S],E=g?performance.now():0;try{let P=c.filter(p);if(P!==null){let b=c.handle(P,t);if(b){let A=f.get(c.ruleName)??[];Array.isArray(b)?A.push(...b):A.push(b),f.set(c.ruleName,A);}}}catch(P){r?.errorCollector?.record(common.createInfrastructureError("RuleExecutionError",{cause:`Rule ${c.ruleName} failed: ${P instanceof Error?P.message:String(P)}`,recoverable:true,phase:"engine",details:{ruleName:c.ruleName,errorName:P instanceof Error?P.name:void 0}}));}if(g){let P=performance.now()-E,b=m.get(c.ruleName);b&&(b.totalMs+=P,b.invocations++);}}}),t.template&&(n.length>0||s.length>0||l.length>0||u.length>0)){let p=ast.analyzeTemplate(t.template),d=t.templateFilePath&&t.templateFileContent&&t.templateLocator?{...t,filePath:t.templateFilePath,fileContent:t.templateFileContent,locator:t.templateLocator}:t;te(p.expressions,n,d,f,m,g,r?.errorCollector),te(p.attributes,s,d,f,m,g,r?.errorCollector),te(p.blocks,l,d,f,m,g,r?.errorCollector),te([p],u,d,f,m,g,r?.errorCollector);}let C=[];for(let p of e)C.push({ruleName:p.name,failures:f.get(p.name)??[]});let w=performance.now()-a,h=[],x=t.typeChecker?5:2;if(w>x&&h.push(`Total traversal time ${w.toFixed(2)}ms exceeds budget ${x}ms`),g)for(let p of m.values()){if(p.invocations===0)continue;let d=p.totalMs/p.invocations;d>1&&h.push(`Rule ${p.ruleName} averages ${d.toFixed(2)}ms per invocation (threshold: 1ms)`);}return {results:C,performance:{traversalMs:w,nodesVisited:y,ruleTimings:Array.from(m.values()),cacheStats:ast.getComponentCacheStats(),budgetViolations:h,hasBudgetViolations:h.length>0}}};var re=class{context;constructor(t){this.context=t;}async build(t,r,o){let a,i,n,s,l,[u,f]=await Promise.all([this.context.readFile(t),this.context.getProgram(t)]),m=new common.Locator(u);this.context.getTypeChecker&&(a=await this.context.getTypeChecker(t)),o&&(i=await this.context.getTemplate(t));let g=this.context.getProjectContext?.(),y=this.context.getAngularTypes?.();o&&!i&&g&&(n=this.resolveExternalTemplatePath(t,g))&&(i=await this.context.getTemplate(n),l=new common.Locator(s=await this.context.readFile(n)));let C=g?await this.buildCrossRef(t,i,g):void 0;return {filePath:t,fileContent:u,locator:m,program:f,typeChecker:a,template:i,templateFilePath:n,templateFileContent:s,templateLocator:l,options:r,project:g,crossRef:C,angularTypes:y}}resolveExternalTemplatePath(t,r){let o=t.endsWith(".component.ts")?t:r.templateToComponent.get(t);if(o)return r.componentGraph.get(o)?.templatePath}async buildCrossRef(t,r,o){let a,i,n,s=t.endsWith(".component.ts")?t:o.templateToComponent.get(t);if(!s)return;let l=o.componentGraph.get(s),u=l?.templatePath,f=l?.stylePaths??[],m=l?.specPath;try{let y=await this.getComponentSourceFile(s);y&&(a=(function(C){let w=new Set;for(let h of C.statements)if(k__default.default.isClassDeclaration(h))for(let x of h.members){let p=k__default.default.canHaveModifiers(x)?k__default.default.getModifiers(x):void 0;if(p&&p.some(S=>S.kind===k__default.default.SyntaxKind.PrivateKeyword||S.kind===k__default.default.SyntaxKind.ProtectedKeyword))continue;let d=x.name;d&&!k__default.default.isPrivateIdentifier(d)&&(k__default.default.isIdentifier(d)||k__default.default.isStringLiteral(d))&&w.add(d.text);}return w})(y),i=(function(C){let w=new Set;for(let h of C.statements)if(k__default.default.isClassDeclaration(h))for(let x of h.members){if(!k__default.default.isPropertyDeclaration(x)||!x.initializer||!x.name||k__default.default.isPrivateIdentifier(x.name))continue;let p=(function(d){let S=k__default.default.isAsExpression(d)||k__default.default.isSatisfiesExpression(d)?d.expression:d;if(!k__default.default.isCallExpression(S))return;let c=S.expression;return k__default.default.isIdentifier(c)?c.text:k__default.default.isPropertyAccessExpression(c)?k__default.default.isIdentifier(c.expression)&&yt.has(c.expression.text)?c.expression.text:c.name.text:void 0})(x.initializer);p&&ht.has(p)&&(k__default.default.isIdentifier(x.name)||k__default.default.isStringLiteral(x.name))&&w.add(x.name.text);}return w})(y));}catch{}let g=r;if(!g&&u)try{g=await this.context.getTemplate(u);}catch{}if(g)try{n=(function(y){let C=new Set,w=/\{\{([\s\S]*?)\}\}/g;for(let h of y.rootNodes)(function x(p){if(p&&typeof p=="object"){if(Array.isArray(p.attrs))for(let d of p.attrs){if((typeof d.name=="string"?d.name:"").startsWith("("))continue;let S=d.value;typeof S=="string"&&S&&ve(S,C);}if(typeof p.value=="string"&&p.value){let d;for(w.lastIndex=0;(d=w.exec(p.value))!==null;)ve(d[1],C);}if(Array.isArray(p.children))for(let d of p.children)x(d);}})(h);return C})(g);}catch{}return {componentPath:s,templatePath:u,stylePaths:f,specPath:m,publicMembers:a,signalMembers:i,templateReferences:n}}async getComponentSourceFile(t){let r=this.context.getTsSourceFile?.(t);if(r)return r;let o=await this.context.readFile(t);return k__default.default.createSourceFile(t,o,k__default.default.ScriptTarget.Latest,true)}},ht=new Set(["signal","computed","linkedSignal","input","model","toSignal","viewChild","viewChildren","contentChild","contentChildren"]),yt=new Set(["input","viewChild","contentChild"]),be=/\b([a-zA-Z_$][a-zA-Z0-9_$]*)\b/g;function ve(e,t){let r;for(be.lastIndex=0;(r=be.exec(e))!==null;)t.add(r[1]);}var Tt=new Set([".css",".scss",".sass",".less"]),U=e=>{let t=new lruCache.LRUCache({max:128}),r=new lruCache.LRUCache({max:64}),o=new lruCache.LRUCache({max:64}),a=new lruCache.LRUCache({max:64}),i=s=>{let l=t.get(s);if(l)return l;let u=Et(e,s);return t.set(s,u),u},n=s=>{let l=r.get(s);if(l)return l;let u=i(s).then(f=>ast.parseTs(f,s).program);return r.set(s,u),u};return {rootDir:e,readFile:i,getProgram:n,getTemplate:s=>{let l=o.get(s);if(l)return l;let u=Pt(s,i,n);return o.set(s,u),u},getStyle:s=>{let l=a.get(s);if(l)return l;let u=R__namespace.extname(s).toLowerCase();if(!Tt.has(u)){let m=Promise.resolve(void 0);return a.set(s,m),m}let f=i(s).then(m=>ast.parseCss(m,s));return a.set(s,f),f},evict:s=>{t.delete(s),r.delete(s),o.delete(s),a.delete(s);},dispose:()=>{t.clear(),r.clear(),o.clear(),a.clear();}}},Et=async(e,t)=>{try{return await promises.readFile(R__namespace.resolve(e,t),"utf-8")}catch(r){let o=r instanceof Error?r.message:String(r);throw Error(`Cannot read file: ${t}. ${o}`)}},Pt=async(e,t,r)=>{let o=await bt(e,t,r);if(o&&o.content)return ast.parseHtml(o.content,o.startOffset)},bt=async(e,t,r)=>{let o=R__namespace.extname(e);if(o===".html")return {content:await t(e),startOffset:0};if(o===".ts"){let a=ast.extractTemplateFromProgram(await r(e));return a.content?a:null}return null};var Y=(e,t,r)=>{let o=performance.now()-t,a=e.flatMap(l=>l.failures),i=new Set(a.map(l=>l.filePath)),n=0,s=0;for(let l of a)vt(l.severity)?n++:At(l.severity)&&s++;return {totalFiles:i.size,totalErrors:n,totalWarnings:s,duration:o,cacheHitRate:r}},vt=e=>e==="error",At=e=>e==="warn";var G=(e,t,r,o,a)=>{let i=0,n=0;for(let s of r)for(let l of s.failures)l.severity==="error"?i++:l.severity==="warn"&&n++;return {filePath:e,taskCount:t,issueCount:i+n,errorCount:i,warningCount:n,duration:o,typeAware:a}},pe=e=>!!e&&typeof e=="object"&&e.kind==="file-progress",ue=e=>!!e&&typeof e=="object"&&e.kind==="file-progress"&&typeof e.filePath=="string"&&typeof e.taskCount=="number"&&typeof e.issueCount=="number"&&typeof e.errorCount=="number"&&typeof e.warningCount=="number"&&typeof e.duration=="number";var Ae=()=>{throw Error("[ngcompass] Rule executor not configured. Call configureRuleExecutor(executeBatchedNewEngineRules, isNewEngineRule) before running analysis.")},Fe=()=>false,Ft=(e,t)=>{Ae=e,Fe=t;},Ne=()=>Ae,_e=()=>Fe;var q=async(e,t,r)=>{if(e.length===0)return [];let o=e[0].filePath,a=new re(t),i=new Map,n=[];for(let s of e){if(!_e()(s.ruleName)){common.debug("engine",`Skipping task ${s.taskId}: Rule "${s.ruleName}" not registered in engine.`),n.push({ruleName:s.ruleName,taskId:s.taskId,failures:[]});continue}let l=It(s,r);if(l===null){n.push({ruleName:s.ruleName,taskId:s.taskId,failures:[]});continue}let u=i.get(l)??Rt(s.options);u.ruleNames.push(s.ruleName),u.taskIds.push(s.taskId),u.severities.set(s.ruleName,s.severity),i.set(l,u);}for(let s of i.values()){let l=await Mt(s,e,o,a,r);n.push(...l);}return n},Rt=e=>({options:e,ruleNames:[],taskIds:[],severities:new Map}),It=(e,t)=>{try{return common.stableSerialize(e.options||{})}catch(r){let o=r instanceof common.SerializationError?r.message:String(r);return common.debug("engine",`Skipping task ${e.taskId}: failed to serialize options \u2014 ${o}`),t?.record(common.createInfrastructureError("SerializationError",{cause:o,phase:"engine",recoverable:true})),null}},Mt=async(e,t,r,o,a)=>{try{let i=new Set(e.taskIds),n=t.some(u=>i.has(u.taskId)&&u.inputs.template?.needsAst),s=await o.build(r,e.options,n),l=Ne()(e.ruleNames,s);return $t(e,l)}catch(i){let n=i instanceof Error?i.message:String(i);return common.debug("engine",`Failed to execute batch for ${r}: ${n}`),a?.record(common.createInfrastructureError("ParseError",{filePath:r,cause:n,phase:"engine",recoverable:true})),e.ruleNames.map((s,l)=>({ruleName:s,failures:[],taskId:e.taskIds[l]}))}},$t=(e,t)=>{let r=new Map;for(let a=0;a<e.ruleNames.length;a++){let i=e.ruleNames[a],n=r.get(i);n?n.ids.push(e.taskIds[a]):r.set(i,{ids:[e.taskIds[a]],cursor:0});}let o=[];for(let a of t){let i=e.severities.get(a.ruleName),n=i?{...a,failures:a.failures.map(l=>({...l,severity:i}))}:a,s=r.get(a.ruleName);s&&s.cursor<s.ids.length?o.push({...n,taskId:s.ids[s.cursor++]}):o.push(n);}return o};function de(e,t,r,o){let a=performance.now(),i=(function(h,x,p){var d;let S=new Set;for(let E of h)S.add(R__namespace.resolve(x,E));let c=(d=x).endsWith(R__namespace.sep)?d:d+R__namespace.sep;for(let E of p.getSourceFiles())!E.isDeclarationFile&&E.fileName.startsWith(c)&&S.add(E.fileName);return S})(t,r,e),{importGraph:n,reverseImportGraph:s,externalDeps:l}=(function(h,x){let p=h.getCompilerOptions(),d=k__default.default.createModuleResolutionCache(h.getCurrentDirectory(),k__default.default.sys.useCaseSensitiveFileNames?P=>P:P=>P.toLowerCase(),p),S=new Map,c=new Map,E=new Map;for(let P of x)S.set(P,new Set),c.set(P,new Set);for(let P of h.getSourceFiles()){if(P.isDeclarationFile||!x.has(P.fileName))continue;let b=P.fileName;for(let A of (function(I){let v=[];return k__default.default.forEachChild(I,function _(T){k__default.default.isImportDeclaration(T)&&k__default.default.isStringLiteral(T.moduleSpecifier)||k__default.default.isExportDeclaration(T)&&T.moduleSpecifier&&k__default.default.isStringLiteral(T.moduleSpecifier)?v.push(T.moduleSpecifier.text):(k__default.default.isCallExpression(T)&&T.expression.kind===k__default.default.SyntaxKind.ImportKeyword&&T.arguments.length>0&&k__default.default.isStringLiteralLike(T.arguments[0])&&v.push(T.arguments[0].text),k__default.default.forEachChild(T,_));}),v})(P)){let I=k__default.default.resolveModuleName(A,b,p,k__default.default.sys,d),v=I.resolvedModule?.resolvedFileName;if(v&&x.has(v)){S.get(b).add(v);let _=c.get(v);_||(_=new Set,c.set(v,_)),_.add(b);}else {let _=(function(T){if(T.startsWith(".")||R__namespace.isAbsolute(T))return null;if(T.startsWith("@")){let M=T.indexOf("/",1);if(M===-1)return null;let $=T.indexOf("/",M+1);return $===-1?T:T.slice(0,$)}let W=T.indexOf("/");return W===-1?T:T.slice(0,W)})(A);if(_){let T=E.get(b);T||(T=new Set,E.set(b,T)),T.add(_);}}}}return {importGraph:S,reverseImportGraph:c,externalDeps:E}})(e,i),u=(function(h,x){let p=new Set;for(let d of h.getSourceFiles()){if(d.isDeclarationFile||!x.has(d.fileName))continue;let{statements:S}=d;S.length!==0&&S.every(c=>k__default.default.isExportDeclaration(c)&&c.moduleSpecifier!=null)&&p.add(d.fileName);}return p})(e,i),f=o??(function(h,x){let p=new Map,d=[".scss",".sass",".css",".less"];for(let S of h){if(!S.endsWith(".component.ts"))continue;let c=R__namespace.dirname(S),E=R__namespace.basename(S,".ts"),P=R__namespace.join(c,E+".html"),b=h.has(P)?P:void 0,A=[];for(let _ of d){let T=R__namespace.join(c,E+_);h.has(T)&&A.push(T);}if(!b||A.length===0){let _=(function(T,W,M,$){let ee,Ce=T.getSourceFile(W);if(!Ce)return {templatePath:void 0,stylePaths:[]};let Se=(function(O){for(let z of O.statements){if(!k__default.default.isClassDeclaration(z))continue;let D=k__default.default.canHaveDecorators(z)?k__default.default.getDecorators(z):void 0;if(D)for(let j of D){let B=j.expression;if(!k__default.default.isCallExpression(B)||!k__default.default.isIdentifier(B.expression)||B.expression.text!=="Component")continue;let ce=B.arguments[0];if(ce&&k__default.default.isObjectLiteralExpression(ce))return ce}}})(Ce);if(!Se)return {templatePath:void 0,stylePaths:[]};let le=[];for(let O of Se.properties){if(!k__default.default.isPropertyAssignment(O)||!k__default.default.isIdentifier(O.name))continue;let z=O.name.text;if(z==="templateUrl"){let D=fe(O.initializer);if(D){let j=R__namespace.resolve(M,D);$.has(j)&&(ee=j);}continue}if(z==="styleUrl"){let D=fe(O.initializer);if(D){let j=R__namespace.resolve(M,D);$.has(j)&&le.push(j);}continue}if(z==="styleUrls"&&k__default.default.isArrayLiteralExpression(O.initializer))for(let D of O.initializer.elements){let j=fe(D);if(!j)continue;let B=R__namespace.resolve(M,j);$.has(B)&&le.push(B);}}return {templatePath:ee,stylePaths:le}})(x,S,c,h);!b&&_.templatePath&&(b=_.templatePath),A.length===0&&_.stylePaths.length>0&&A.push(..._.stylePaths);}let I=R__namespace.join(c,E+".spec.ts"),v=h.has(I)?I:void 0;p.set(S,{tsPath:S,templatePath:b,stylePaths:A,specPath:v});}return p})(i,e),m=(function(h){let x=new Map;for(let[p,d]of h)d.templatePath&&x.set(d.templatePath,p);return x})(f),{ngModuleMap:g,standaloneComponents:y,classToFile:C}=(function(h,x){let p=new Map,d=new Set,S=(function(c,E){let P=new Map;for(let b of c.getSourceFiles())if(!b.isDeclarationFile&&E.has(b.fileName))for(let A of b.statements){if(!k__default.default.isClassDeclaration(A)||!A.name)continue;(k__default.default.canHaveModifiers(A)?k__default.default.getModifiers(A):void 0)?.some(v=>v.kind===k__default.default.SyntaxKind.ExportKeyword)&&P.set(A.name.text,b.fileName);}return P})(h,x);for(let c of h.getSourceFiles())if(!c.isDeclarationFile&&x.has(c.fileName))for(let E of c.statements){if(!k__default.default.isClassDeclaration(E))continue;let P=k__default.default.canHaveDecorators(E)?k__default.default.getDecorators(E):void 0;if(P?.length)for(let b of P){let A=(function(_){let T=_.expression;if(!k__default.default.isCallExpression(T))return;let W=T.expression;if(!k__default.default.isIdentifier(W))return;let M=T.arguments[0],$=M&&k__default.default.isObjectLiteralExpression(M)?M:void 0;return {name:W.text,arg:$}})(b);if(!A)continue;let{name:I,arg:v}=A;if(I==="NgModule"){v&&p.set(c.fileName,{filePath:c.fileName,declarations:new Set(K(v,"declarations")),imports:new Set(K(v,"imports")),exports:new Set(K(v,"exports")),providers:new Set(K(v,"providers")),isStandalone:false});break}if(I==="Component"){v&&Ie(v,"standalone")&&(d.add(c.fileName),p.set(c.fileName,{filePath:c.fileName,declarations:new Set,imports:new Set(v?K(v,"imports"):[]),exports:new Set,providers:new Set(v?K(v,"providers"):[]),isStandalone:true}));break}if(I==="Directive"||I==="Pipe"){v&&Ie(v,"standalone")&&d.add(c.fileName);break}}}return {ngModuleMap:p,standaloneComponents:d,classToFile:S}})(e,i),w=(function(h){let x=0;for(let p of h.values())x+=p.size;return x})(n);return common.debug("engine",`ProjectContext built in ${(performance.now()-a).toFixed(2)}ms \u2014 ${i.size} files, ${w} import edges, ${u.size} barrels, ${l.size} files with ext deps, ${f.size} components, ${m.size} template\u2194component links, ${g.size} NgModules/standalone, ${y.size} standalone`),{importGraph:n,reverseImportGraph:s,ngModuleMap:g,standaloneComponents:y,classToFile:C,componentGraph:f,projectFiles:i,rootDir:r,barrelFiles:u,externalDeps:l,templateToComponent:m}}function fe(e){if(k__default.default.isStringLiteralLike(e)||k__default.default.isNoSubstitutionTemplateLiteral(e))return e.text}function K(e,t){for(let r of e.properties){if(!k__default.default.isPropertyAssignment(r)||!k__default.default.isIdentifier(r.name)||r.name.text!==t)continue;let o=r.initializer;if(!k__default.default.isArrayLiteralExpression(o))break;let a=[];for(let i of o.elements)a.push(...(function n(s){return k__default.default.isIdentifier(s)?[s.text]:k__default.default.isPropertyAccessExpression(s)||k__default.default.isCallExpression(s)?n(s.expression):[]})(i));return a}return []}function Ie(e,t){for(let r of e.properties)if(k__default.default.isPropertyAssignment(r)&&k__default.default.isIdentifier(r.name)&&r.name.text===t)return r.initializer.kind===k__default.default.SyntaxKind.TrueKeyword;return false}var jt=new Set(["Signal","WritableSignal","InputSignal","ModelSignal","OutputEmitterRef"]),Lt=new Set(["WritableSignal","InputSignal","ModelSignal"]),Wt=new Set(["Subject","BehaviorSubject","ReplaySubject","AsyncSubject"]);function ge(e){if(!e)return Ot;let t=new Map,r=(a,i)=>{if(!a)return false;let n=t.get(i);n||(n=new WeakMap,t.set(i,n));let s=n.get(a);if(s!==void 0)return s;let l=(function(u,f){let m=u.getDeclarations();if(!m||m.length===0)return false;let g=`/node_modules/${f}/`;for(let y of m)if(y.getSourceFile().fileName.replace(Me,"/").includes(g))return true;return false})(a,i);return n.set(a,l),l},o=(a,i,n)=>{if(!a)return false;let s=a.aliasSymbol??a.symbol;return !!s&&!!i.has(s.name)&&r(s,n)};return {isFromPackage:r,isFromAngularCore:a=>r(a,"@angular/core"),isSignal:a=>o(a,jt,"@angular/core"),isWritableSignal:a=>o(a,Lt,"@angular/core"),isObservable:a=>{if(!a)return false;let i=a.aliasSymbol??a.symbol;return !!i&&i.name==="Observable"&&r(i,"rxjs")},isSubjectLike:a=>o(a,Wt,"rxjs"),isHttpClient:a=>{if(!a)return false;let i=a.aliasSymbol??a.symbol;return !!i&&i.name==="HttpClient"&&r(i,"@angular/common")},isInjectionToken:a=>{if(!a)return false;let i=a.aliasSymbol??a.symbol;return !!i&&i.name==="InjectionToken"&&r(i,"@angular/core")},isEventEmitter:a=>{if(!a)return false;let i=a.aliasSymbol??a.symbol;return !!i&&i.name==="EventEmitter"&&r(i,"@angular/core")},isChangeDetectorRef:a=>{if(!a)return false;let i=a.aliasSymbol??a.symbol;return !!i&&i.name==="ChangeDetectorRef"&&r(i,"@angular/core")},isInjectableClass:a=>!!a&&(!!(function(i){let n=i.getDeclarations()?.[0];if(!n||!k__default.default.isClassDeclaration(n)||!k__default.default.canHaveDecorators(n))return false;let s=k__default.default.getDecorators(n);if(!s)return false;for(let l of s){let u=l.expression,f=k__default.default.isCallExpression(u)?u.expression:u;if(k__default.default.isIdentifier(f)&&f.text==="Injectable")return true}return false})(a)||(function(i){let n=i.getDeclarations();if(!n||n.length===0)return false;for(let s of n)if(s.getSourceFile().fileName.replace(Me,"/").includes("/node_modules/@angular/"))return true;return false})(a))}}var Me=/\\/g,Ot={isFromPackage:()=>false,isFromAngularCore:()=>false,isSignal:()=>false,isWritableSignal:()=>false,isObservable:()=>false,isSubjectLike:()=>false,isHttpClient:()=>false,isInjectionToken:()=>false,isEventEmitter:()=>false,isChangeDetectorRef:()=>false,isInjectableClass:()=>false};var he=(e,t=[],r,o={})=>{var a;let i,n,s,l=U(e);common.debug("engine","Initializing Type-Aware Context (ts.createProgram)...");let u=performance.now(),{program:f}=(function(C,w,h,x){var p;let d,S,c=h?.tsconfigRootDir?R__namespace.default.resolve(C,h.tsconfigRootDir):C,E=h?.project?R__namespace.default.resolve(c,h.project):k__default.default.findConfigFile(c,k__default.default.sys.fileExists,"tsconfig.json");if(!E)return {program:void 0};let P=k__default.default.readConfigFile(E,k__default.default.sys.readFile),b=k__default.default.parseJsonConfigFileContent(P.config,k__default.default.sys,c),A=(x.programRootFiles??w).filter(ye),I=A.length>0?A:b.fileNames,v={...b.options,...zt},_=k__default.default.createProgram({rootNames:I,options:v,host:(p=v,d=k__default.default.createCompilerHost(p,true),S=k__default.default.createModuleResolutionCache(d.getCurrentDirectory(),T=>d.getCanonicalFileName(T),p),d.resolveModuleNameLiterals=(T,W,M,$)=>T.map(ee=>k__default.default.resolveModuleName(ee.text,W,$,d,S,M)),d)});return common.debug("engine",`Program rootNames: ${I.length} (tsconfig had ${b.fileNames.length})`),{program:_}})(e,t,r,o);f?(function(C,w){let h=0,x=0;for(let d of C.getSourceFiles())d.isDeclarationFile||Bt.test(d.fileName)?h++:x++;let p=(process.memoryUsage().heapUsed/1048576).toFixed(0);common.debug("engine",`Program diagnostics: ${x} project file(s), ${h} lib/declaration file(s), built in ${w.toFixed(0)}ms, heapUsed ${p}MB`);})(f,performance.now()-u):common.debug("engine","Could not find tsconfig.json; TypeChecker and ProjectContext will be unavailable.");let m=f?.getTypeChecker();m&&(a=m,i=new WeakMap,n=a.getTypeAtLocation.bind(a),a.getTypeAtLocation=C=>{let w=i.get(C);if(w)return w;let h=n(C);return i.set(C,h),h});let g=ge(f);if(f&&o.buildProjectContext!==false)try{s=de(f,t,e);}catch(C){let w=C instanceof Error?C.message:String(C);common.debug("engine",`ProjectContext build failed (non-fatal): ${w}`);}else f&&common.debug("engine","Skipping ProjectContext build for type-checker-only chunk");let y=f;return {...l,getTypeChecker:C=>Promise.resolve(m),getProjectContext:()=>s,getTsSourceFile:C=>y?.getSourceFile(C),getAngularTypes:()=>g,warmup:()=>(common.debug("engine",`Type-aware context ready: ${y?`ts.Program with ${y.getSourceFiles().length} source files`:"no tsconfig found, TypeChecker unavailable"}`),Promise.resolve()),dispose:()=>{s=void 0,m=void 0,g=void 0,y=void 0,l.dispose();}}},ye=e=>(e.endsWith(".ts")||e.endsWith(".tsx"))&&!e.endsWith(".d.ts"),zt={skipLibCheck:true,skipDefaultLibCheck:true,noEmit:true,declaration:false,declarationMap:false,sourceMap:false,inlineSourceMap:false,incremental:false,composite:false},Bt=/[\\/]node_modules[\\/]/;var De=()=>{let e=globalThis.gc;return typeof e=="function"&&(e(),true)},Ht=()=>{let{heapUsed:e}=process.memoryUsage(),{heap_size_limit:t}=Ut__default.default.getHeapStatistics();return {usedBytes:e,limitBytes:t}},je=()=>{let{usedBytes:e,limitBytes:t}=Ht();return t>0?e/t:0},se=e=>!(je()<e)&&De();var Ue=async(e,t,r,o,a,i)=>{let n,{Worker:s}=await import('worker_threads'),l=o??Math.max(2,Kt__default.default.cpus().length),u=await Jt();if(!u)return common.debug("workers","Execution worker not found, falling back to local execution."),Oe(e,t,r,a??l,i);let f=Qt(e,l),m=[],g=0,y=()=>{g++,common.debug("workers",`Worker progress: ${g}/${l} complete`);},C=f.map(x=>Zt(s,u,t,x,m,y,i));try{n=await Promise.all(C);}catch(x){var w;return await Promise.allSettled(m.map(p=>p.terminate())),common.debug("workers",`Worker execution failed, retrying locally with one file batch at a time: ${(w=x)instanceof Error?w.message:String(w)}`),Oe(e,t,r,1,i)}let h=n.flat();return common.Ok({results:h,parseErrors:[],stats:Y(h,r)})},Zt=(e,t,r,o,a,i,n)=>new Promise((s,l)=>{let u=false,f=new e(t,{workerData:{rootDir:r,tasks:o}});a.push(f);let m=()=>{clearTimeout(g),f.removeAllListeners();},g=setTimeout(()=>{u||(u=true,m(),i(),f.terminate(),l(Error(`Worker timed out after ${6e4/1e3}s`)));},6e4);f.on("message",y=>{pe(y)?n?.(y):u||(u=true,m(),y.errors&&y.errors.length>0&&y.errors.forEach(C=>{common.debug("workers",`Worker failed task ${C.task.taskId}: ${C.error}`);}),i(),s(y.results));}),f.on("error",y=>{u||(u=true,m(),i(),l(y instanceof Error?y:Error(String(y))));}),f.on("exit",y=>{if(u||y===0)return;u=true,m();let C=common.createInfrastructureError("WorkerCrash",{cause:`Worker exited with code ${y}`,phase:"engine",recoverable:true,details:{exitCode:y}});common.debug("workers",`Worker crashed: ${C.cause}`),l(Error(C.cause));});}),Oe=async(e,t,r,o,a)=>{let i=U(t),n=Xt__default.default(o),s=planner.groupTasksByFile(e),l=(await Promise.all(Array.from(s.values()).map(u=>n(async()=>{let f=u[0]?.filePath,m=performance.now(),g=await q(u,i);return f&&(i.evict(f),a?.(G(f,u.length,g,performance.now()-m))),g})))).flat();return common.Ok({results:l,parseErrors:[],stats:Y(l,r)})},Jt=async()=>{let e=R.dirname(url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href))));try{let t=module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href))).resolve("@ngcompass/rules/execution-worker");if(fs.existsSync(t))return t}catch{}return [R.join(e,"..","..","rules","dist","execution-worker.js"),R.join(e,"..","..","rules","dist","execution-worker.cjs")].find(t=>fs.existsSync(t))??null},Qt=(e,t)=>{let r=Array.from(planner.groupTasksByFile(e).values()).sort((i,n)=>n.length-i.length),o=Array.from({length:t},()=>[]),a=Array(t).fill(0);for(let i of r){let n=0,s=a[0];for(let l=1;l<t;l++)a[l]<s&&(s=a[l],n=l);o[n].push(...i),a[n]+=i.length;}return o};var xe=Number.MAX_SAFE_INTEGER;function Ve(e){if(!e||typeof e!="object"||typeof e.ruleName!="string"||!Array.isArray(e.failures))return false;for(let t of e.failures)if(!t||typeof t!="object"||typeof t.filePath!="string"||typeof t.line!="number"||typeof t.column!="number"||typeof t.severity!="string")return false;return true}var Ka=async(e,t)=>{try{if(e.precomputedAnalysis){if((function(c){if(!c||typeof c!="object"||!Array.isArray(c.results)||!Array.isArray(c.parseErrors)||!c.stats||typeof c.stats!="object")return !1;let E=c.stats;return typeof E.totalFiles=="number"&&typeof E.totalErrors=="number"&&typeof E.totalWarnings=="number"&&typeof E.duration=="number"})(e.precomputedAnalysis))return common.debug("engine","Returning precomputed analysis from cache (global hash match)"),common.Ok(e.precomputedAnalysis);common.debug("engine","Precomputed analysis failed schema validation \u2014 discarding stale cache entry and re-running analysis");}let r=performance.now(),{tasks:o,skippedTasks:a,cachedResults:i}=e,n=Kt__default.default.cpus().length,s=Math.max(1,Math.min(4,n-1)),l=Math.max(1,Math.min(t.maxWorkers??s,n)),u=t.parallelThreshold??150,f=o.filter(c=>!!c.needsTypeChecker||!!c.needsProjectContext),m=o.filter(c=>!c.needsTypeChecker&&!c.needsProjectContext);if(common.debug("engine",`workerTasks: ${m.length}, typeAwareTasks: ${f.length}`),f.length>0&&!t.skipTypeCheck){let c=planner.groupTasksByFile(f).size;dr(c,t.onNotice);}let g=o.length+a.length,y=a.length,C=c=>{y=Math.min(y+c,g),t.onProgress?.(y,g);};a.length>0&&t.onProgress?.(y,g);let w=[];if(m.length>0)if(m.length>u){common.debug("engine",`Running analysis on ${m.length} syntax-only tasks using workers (max: ${l})...`);let c=await Ue(m,t.rootDir,r,l,void 0,t.onFileProgress);if(!c.ok)return c;w=c.data.results,C(m.length);}else common.debug("engine",`Running analysis on ${m.length} syntax-only tasks locally with batching (concurrency: ${l})...`),w=await Xe(m,t.rootDir,l,!1,t.errorCollector,void 0,void 0,!0,void 0,C,t.onFileProgress);if(f.length>0&&!t.skipTypeCheck){let c=mr(t.typeAwareFileConcurrency,l),E=await cr(f,t.rootDir,c,t,C,t.onFileProgress);w=[...w,...E];}else f.length>0&&t.skipTypeCheck&&common.debug("engine",`Skipping ${f.length} type-aware tasks (--skip-type-check)`);let h=await Er(a,i,t.cache),x=[...w,...h],p=o.length+a.length,d=p>0?h.length/p:void 0,S={results:x,parseErrors:[],stats:Y(x,r,d)};if(t.cache&&e.globalHash&&S.results.length<=2e4){common.debug("engine","Caching full analysis result for global hash..."),t.debug&&(common.debug("engine",`Analysis Results: ${S.results.length} items`),S.results.length>0&&common.debug("engine",`Sample item keys: ${Object.keys(S.results[0]).join(", ")}`));try{await t.cache.analysis.set(e.globalHash,S);}catch(c){let E=c instanceof Error?c.message:String(c);common.debug("engine",`Failed to cache analysis result: ${E}`),t.errorCollector?.record(common.createInfrastructureError("IOError",{cause:`Failed to write analysis cache: ${E}`,phase:"engine",recoverable:!0}));}}else t.cache&&e.globalHash&&common.debug("engine",`Skipping full analysis cache: ${S.results.length} results exceeds 20000 result safety limit`);return common.Ok(S)}catch(r){return common.Err(r instanceof Error?r:Error(String(r)))}},Xe=async(e,t,r,o,a,i,n,s=true,l,u,f)=>{let m=o?he(t,i??[],n,{buildProjectContext:s,programRootFiles:l}):U(t);o&&(await m.warmup(),common.debug("engine",`Phase 1 complete \u2014 TypeScript Program ready. Starting Phase 2: ${r} concurrent file batches.`));let g=planner.groupTasksByFile(e);common.debug("engine",`Grouped ${e.length} tasks into ${g.size} file batches`);let y=Xt__default.default(r),C=await Promise.all(Array.from(g.values()).map(w=>y(async()=>{let h=w[0]?.filePath,x=performance.now();try{let p=await q(w,m);return m.evict(h),u?.(w.length),h&&f?.(G(h,w.length,p,performance.now()-x,o)),p}catch(p){let d=p instanceof Error?p.message:String(p);return m.evict(h),u?.(w.length),h&&f?.(G(h,w.length,[],performance.now()-x,o)),a?.record(common.createInfrastructureError("IOError",{filePath:h,cause:`Batch execution failed: ${d}`,phase:"engine",recoverable:true})),[]}})));return m.dispose(),C.flat().filter(w=>w!==null)},cr=async(e,t,r,o,a,i)=>{let n=planner.groupTasksByFile(e);if(Ze(e).length===0)return common.debug("engine",`Type-aware: no TypeScript roots among ${n.size} files; nothing to type-check`),[];let s=e.some(f=>!!f.needsProjectContext),l=Array.from(n.entries()),u=[];for(let f=0;f<l.length;f+=xe){let m=l.slice(f,f+xe),g=Je(Math.floor(f/xe)+1,m,s),y=o.files&&o.files.length>0?o.files:void 0;common.debug("engine",`Type-aware chunk ${g.index}: ${g.tasks.length} tasks across ${g.files.length} files`),u=[...u,...await pr(g,t,y,r,o,i)],a?.(g.tasks.length);}return u},pr=async(e,t,r,o,a,i)=>{let n=[],s=new Set,l=e;for(;l;){let u=l,f=ur(r,u);try{let m=await yr(u.tasks,t,f,u.programRootFiles,u.buildProjectContext,o,a,i);n.push(...m),se(.8);break}catch(m){let g=m instanceof J?m:void 0;if(g)for(let w of(n.push(...g.partialResults),g.completedFiles))s.add(w);let y=Ye(e,s);if(!y)return n;let C=!!g&&g.completedFiles.size>0;if(o!==1&&C)l=y;else {let w=y.files[0];s.add(w),fr(w,t,m,a),l=Ye(e,s);}se(.8);}}return n},ur=(e,t)=>t.buildProjectContext&&e?e:t.files,mr=(e,t)=>Math.max(1,Math.min(e==null||Number.isNaN(e)?1:Math.floor(e),t,8)),Ze=e=>{let t=new Set;for(let r of e){let o=r.inputs.typescript.path;ye(o)&&t.add(o);}return [...t]},Je=(e,t,r)=>{let o=t.flatMap(([,a])=>a);return {index:e,tasks:o,files:t.map(([a])=>a),programRootFiles:Ze(o),buildProjectContext:r}},Ye=(e,t)=>{if(t.size===0)return e;let r=Array.from(planner.groupTasksByFile(e.tasks).entries()).filter(([o])=>!t.has(o));return r.length===0?null:Je(e.index,r,e.buildProjectContext)},fr=(e,t,r,o)=>{let a=r instanceof J?r.reason:"crash",i=R.relative(t,e)||e,n=`Skipped ${i} (${a==="timeout"?"type-check timed out":"type-check failed"})`;o.onFileSkipped?.(e),o.onNotice?.(n),o.errorCollector?.record(common.createInfrastructureError("WorkerCrash",{filePath:e,cause:n,phase:"engine",recoverable:true}));},dr=(e,t)=>{if(!t)return;let r=Ut__default.default.getHeapStatistics().heap_size_limit/1073741824;if(r>=4||e<600)return;let o=r.toFixed(1),a=e.toLocaleString();t(`Large type-aware workload: ${a} files on a ${o} GB heap built into a single TypeScript program. If analysis runs out of memory, raise it with NODE_OPTIONS=--max-old-space-size=8192 or run with --skip-type-check.`);},gr=["--max-old-space-size","--max-semi-space-size"],ie="--max-old-space-size",qe=e=>e.split("_").join("-"),hr=(e,t)=>{let r=[],o=t!==void 0&&qe(t).includes(ie);for(let i=0;i<e.length;i++){let n=e[i];if(n==="--expose-gc")continue;let s=qe(n),l=gr.find(u=>s===u||s.startsWith(`${u}=`));l&&(r.push(n),(s===ie||s.startsWith(`${ie}=`))&&(o=true),s===l&&i+1<e.length&&r.push(e[++i]));}let a=["--expose-gc",...r];return o||a.push(`${ie}=4096`),a},J=class extends Error{reason;partialResults;completedFiles;constructor(t,r,o,a){super(t),this.name="TypeAwareChildFailure",this.reason=r,this.partialResults=o,this.completedFiles=a;}},oe=(e,t,r)=>e!==void 0?e:t===0?3e4:Math.min(3e4,Math.max(1e3,8*r)),yr=async(e,t,r,o,a,i,n,s)=>{let l=await xr();return l?new Promise((u,f)=>{let m,g,y=child_process.fork(l,[],{cwd:t,execArgv:hr(process.execArgv,process.env.NODE_OPTIONS),stdio:["ignore","pipe","pipe","ipc"]}),C=false,w=0,h=0,x=[],p=new Set,d=(c,E)=>{C||(C=true,clearTimeout(m),y.kill(),f(new J(c,E,x.slice(),p)));},S=(c,E)=>{clearTimeout(m),m=setTimeout(()=>{let P=g?` while analyzing "${g}"`:"";d(`Type-aware ${E} exceeded ${c/1e3}s${P}`,"timeout");},c);};S(6e5,"program build"),y.stdout?.on("data",c=>common.debug("engine",`[type-aware-child] ${String(c).trim()}`)),y.stderr?.on("data",c=>common.debug("engine",`[type-aware-child:stderr] ${String(c).trim()}`)),y.on("message",c=>{if(wr(c))return void S(oe(n.typeAwarePerFileTimeoutMs,w,h),"file analysis");if(Cr(c)){g=c.filePath,S(oe(n.typeAwarePerFileTimeoutMs,w,h),"file analysis");return}if(ue(c)){w++,h=Math.max(h,c.duration),s?.(c),S(oe(n.typeAwarePerFileTimeoutMs,w,h),"file analysis");return}if(kr(c)){x.push(...c.results),p.add(c.filePath),g===c.filePath&&(g=void 0),S(oe(n.typeAwarePerFileTimeoutMs,w,h),"file analysis");return}if(Sr(c)){if(C)return;C=true,clearTimeout(m),u(x);return}Tr(c)&&d(c.error,"reported");}),y.on("error",c=>{d(c.message,"spawn");}),y.on("exit",c=>{d(`Type-aware child process exited before completion with code ${c}`,"crash");}),y.send({rootDir:t,tasks:e,files:r,programRootFiles:o,parserOptions:n.parserOptions,buildProjectContext:a,fileConcurrency:i});}):(common.debug("engine","Type-aware child worker not found; falling back to in-process execution"),Xe(e,t,i,true,n.errorCollector,r,n.parserOptions,a,o,void 0,s))},xr=async()=>{let e=R.dirname(url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href))));try{let t=module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href))).resolve("@ngcompass/rules/type-aware-worker");if(fs.existsSync(t))return t}catch{}for(let t of [R.join(e,"..","..","rules","dist","type-aware-worker.js"),R.join(e,"..","..","rules","dist","type-aware-worker.cjs")])if(fs.existsSync(t))return t;return null},wr=e=>!!e&&typeof e=="object"&&e.kind==="ready",Cr=e=>!!e&&typeof e=="object"&&e.kind==="file-start"&&typeof e.filePath=="string",Sr=e=>!!e&&typeof e=="object"&&e.kind==="complete",kr=e=>!!e&&typeof e=="object"&&e.kind==="file-result"&&typeof e.filePath=="string"&&Array.isArray(e.results),Tr=e=>!!e&&typeof e=="object"&&e.kind==="error"&&typeof e.error=="string",Er=async(e,t,r)=>{if(e.length===0)return [];common.debug("engine",`Retrieving results for ${e.length} skipped tasks...`);let o=[],a=[];if(t)for(let i of e){let n=t.get(i.taskId);n&&Ve(n)?o.push(n):a.push(i);}else a.push(...e);if(a.length>0&&r){common.debug("engine",`Fetching ${a.length} results from cache service...`);let i=a.map(s=>s.taskId),n=await r.results.getMany(i);for(let s of a){let l=n.get(s.taskId);l&&Ve(l)&&o.push(l);}}return common.debug("engine",`Retrieved ${o.length} results from cache`),o};var Qe=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],et=class{frameIndex=0;interval=null;message="";start(t){this.message=t,this.interval||(this.frameIndex=0,Q__default.default.stderr.write("\x1B[?25l"),this.interval=setInterval(()=>{Q__default.default.stderr.write(`\r${Qe[this.frameIndex]} ${this.message}`),this.frameIndex=(this.frameIndex+1)%Qe.length;},80));}update(t){this.message=t;}stop(t){this.interval&&(clearInterval(this.interval),this.interval=null),Q__default.default.stderr.write("\r\x1B[K"),t&&Q__default.default.stderr.write(t+` | ||
| `),Q__default.default.stderr.write("\x1B[?25h");}};exports.BUDGET_MS_PER_FILE_WITHOUT_TYPES=st;exports.BUDGET_MS_PER_FILE_WITH_TYPES=it;exports.MIN_WORKER_COUNT=rt;exports.RuleContextFactory=re;exports.SPINNER_FRAME_INTERVAL_MS=at;exports.STREAM_TO_NODE_TYPE=tt;exports.Spinner=et;exports.WORKER_TIMEOUT_MS=Te;exports.buildFileProgress=G;exports.buildProjectContext=de;exports.buildVisitorMap=ke;exports.calculateStats=Y;exports.computeAdaptiveFileBudget=oe;exports.configureRuleExecutor=Ft;exports.createAnalysisContext=U;exports.createAngularTypeIndex=ge;exports.createAnyAngularClassRule=br;exports.createCallExpressionRule=Nr;exports.createComponentRule=Pr;exports.createDecoratedPropertyRule=vr;exports.createNewExpressionRule=_r;exports.createTemplateAttributeRule=Fr;exports.createTemplateBlockRule=Rr;exports.createTemplateExpressionRule=Ar;exports.createTemplateRule=Ir;exports.createTypeAwareAnalysisContext=he;exports.executeBatchedTasks=q;exports.getHeapPressureRatio=je;exports.isAnalysisFileProgress=ue;exports.isWorkerFileProgress=pe;exports.requestGarbageCollection=De;exports.requestGarbageCollectionUnderPressure=se;exports.resolveChildExecArgv=hr;exports.runAnalysis=Ka;exports.runAnalysisParallel=Ue;exports.runSinglePassAnalysis=Or;//# sourceMappingURL=index.cjs.map | ||
| 'use strict';var ast=require('@ngcompass/ast'),common=require('@ngcompass/common'),k=require('typescript'),child_process=require('child_process'),fs=require('fs'),module$1=require('module'),Vt=require('os'),R=require('path'),url=require('url'),Ht=require('v8'),planner=require('@ngcompass/planner'),Zt=require('p-limit'),promises=require('fs/promises'),lruCache=require('lru-cache'),Q=require('process');var _documentCurrentScript=typeof document!=='undefined'?document.currentScript:null;function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var k__default=/*#__PURE__*/_interopDefault(k);var Vt__default=/*#__PURE__*/_interopDefault(Vt);var R__namespace=/*#__PURE__*/_interopNamespace(R);var Ht__default=/*#__PURE__*/_interopDefault(Ht);var Zt__default=/*#__PURE__*/_interopDefault(Zt);var Q__default=/*#__PURE__*/_interopDefault(Q);var br=(e,t,r)=>({name:e,streamType:"AngularClass",handle:t,meta:r}),vr=(e,t,r)=>({name:e,streamType:"AnyAngularClass",handle:t,meta:r}),Ar=(e,t)=>({name:e,streamType:"DecoratedProperty",handle:t}),Fr=(e,t,r)=>({name:e,streamType:"TemplateExpression",handle:t,meta:r}),Nr=(e,t,r)=>({name:e,streamType:"TemplateAttribute",handle:t,meta:r}),Ir=(e,t,r)=>({name:e,streamType:"CallExpression",handle:t,meta:r}),Rr=(e,t,r)=>({name:e,streamType:"NewExpression",handle:t,meta:r}),_r=(e,t,r)=>({name:e,streamType:"ImportDeclaration",handle:t,meta:r}),Mr=(e,t,r)=>({name:e,streamType:"TemplateBlock",handle:t,meta:r}),$r=(e,t,r)=>({name:e,streamType:"Template",handle:t,meta:r});var tt={AngularClass:"ClassDeclaration",AnyAngularClass:"ClassDeclaration",DecoratedProperty:"PropertyDefinition",TemplateExpression:"__template_expression__",TemplateAttribute:"__template_attribute__",TemplateBlock:"__template_block__",Template:"__template_analysis__",CallExpression:"CallExpression",NewExpression:"NewExpression",ImportDeclaration:"ImportDeclaration"};function ke(e,t){let r=new Map;for(let i of e){let a=tt[i.streamType];if(!a||a.startsWith("__"))continue;let o=t[i.streamType];if(!o)continue;let n={ruleName:i.name,filter:o,handle:i.handle.bind(i)},s=r.get(a);s?s.push(n):r.set(a,[n]);}return r}var rt=2,at=80,Te=6e4,st=2,ot=5;var te=(e,t,r,i,a,o,n)=>{if(t.length!==0)for(let s of e)for(let l=0;l<t.length;l++){let u=t[l],f=o?performance.now():0;try{let m=u.handle(s,r);if(m){let d=i.get(u.name)??[];Array.isArray(m)?d.push(...m):d.push(m),i.set(u.name,d);}}catch(m){n?.record(common.createInfrastructureError("RuleExecutionError",{cause:`Rule ${u.name} failed on template node: ${m instanceof Error?m.message:String(m)}`,recoverable:true,phase:"engine",details:{ruleName:u.name,errorName:m instanceof Error?m.name:void 0}}));}if(o){let m=performance.now()-f,d=a.get(u.name);d&&(d.totalMs+=m,d.invocations++);}}},Br=(e,t,r)=>{let{program:i}=t;if(!i)return {results:e.map(p=>({ruleName:p.name,failures:[]})),performance:{traversalMs:0,nodesVisited:0,ruleTimings:[],cacheStats:{hits:0,misses:0},budgetViolations:[],hasBudgetViolations:false}};let a=performance.now(),o=ke(e,{AngularClass:ast.toAngularClassStream,AnyAngularClass:ast.toAnyAngularClassStream,DecoratedProperty:ast.toDecoratedPropertyStream,CallExpression:ast.toCallExpressionStream,NewExpression:ast.toNewExpressionStream,ImportDeclaration:ast.toImportDeclarationStream}),n=e.filter(p=>p.streamType==="TemplateExpression"),s=e.filter(p=>p.streamType==="TemplateAttribute"),l=e.filter(p=>p.streamType==="TemplateBlock"),u=e.filter(p=>p.streamType==="Template"),f=new Map,m=new Map,d=r?.collectRuleTimings??common.isDebugEnabled(),y=0;for(let p of e)m.set(p.name,{ruleName:p.name,totalMs:0,invocations:0});if(ast.resetComponentCacheStats(),ast.walkProgram(i,p=>{if(!p?.type)return;y++;let g=o.get(p.type);if(g)for(let S=0;S<g.length;S++){let c=g[S],P=d?performance.now():0;try{let E=c.filter(p);if(E!==null){let b=c.handle(E,t);if(b){let A=f.get(c.ruleName)??[];Array.isArray(b)?A.push(...b):A.push(b),f.set(c.ruleName,A);}}}catch(E){r?.errorCollector?.record(common.createInfrastructureError("RuleExecutionError",{cause:`Rule ${c.ruleName} failed: ${E instanceof Error?E.message:String(E)}`,recoverable:true,phase:"engine",details:{ruleName:c.ruleName,errorName:E instanceof Error?E.name:void 0}}));}if(d){let E=performance.now()-P,b=m.get(c.ruleName);b&&(b.totalMs+=E,b.invocations++);}}}),t.template&&(n.length>0||s.length>0||l.length>0||u.length>0)){let p=ast.analyzeTemplate(t.template),g=t.templateFilePath&&t.templateFileContent&&t.templateLocator?{...t,filePath:t.templateFilePath,fileContent:t.templateFileContent,locator:t.templateLocator}:t;te(p.expressions,n,g,f,m,d,r?.errorCollector),te(p.attributes,s,g,f,m,d,r?.errorCollector),te(p.blocks,l,g,f,m,d,r?.errorCollector),te([p],u,g,f,m,d,r?.errorCollector);}let C=[];for(let p of e)C.push({ruleName:p.name,failures:f.get(p.name)??[]});let x=performance.now()-a,h=[],w=t.typeChecker?5:2;if(x>w&&h.push(`Total traversal time ${x.toFixed(2)}ms exceeds budget ${w}ms`),d)for(let p of m.values()){if(p.invocations===0)continue;let g=p.totalMs/p.invocations;g>1&&h.push(`Rule ${p.ruleName} averages ${g.toFixed(2)}ms per invocation (threshold: 1ms)`);}return {results:C,performance:{traversalMs:x,nodesVisited:y,ruleTimings:Array.from(m.values()),cacheStats:ast.getComponentCacheStats(),budgetViolations:h,hasBudgetViolations:h.length>0}}};var re=class{context;constructor(t){this.context=t;}async build(t,r,i){let a,o,n,s,l,[u,f]=await Promise.all([this.context.readFile(t),this.context.getProgram(t)]),m=new common.Locator(u);this.context.getTypeChecker&&(a=await this.context.getTypeChecker(t)),i&&(o=await this.context.getTemplate(t));let d=this.context.getProjectContext?.(),y=this.context.getAngularTypes?.(),C=this.context.getTsSourceFile?.(t);i&&!o&&d&&(n=this.resolveExternalTemplatePath(t,d))&&(o=await this.context.getTemplate(n),l=new common.Locator(s=await this.context.readFile(n)));let x=d?await this.buildCrossRef(t,o,d):void 0;return {filePath:t,fileContent:u,sourceFile:C,locator:m,program:f,typeChecker:a,template:o,templateFilePath:n,templateFileContent:s,templateLocator:l,options:r,project:d,crossRef:x,angularTypes:y}}resolveExternalTemplatePath(t,r){let i=t.endsWith(".component.ts")?t:r.templateToComponent.get(t);if(i)return r.componentGraph.get(i)?.templatePath}async buildCrossRef(t,r,i){let a,o,n,s=t.endsWith(".component.ts")?t:i.templateToComponent.get(t);if(!s)return;let l=i.componentGraph.get(s),u=l?.templatePath,f=l?.stylePaths??[],m=l?.specPath;try{let y=await this.getComponentSourceFile(s);y&&(a=(function(C){let x=new Set;for(let h of C.statements)if(k__default.default.isClassDeclaration(h))for(let w of h.members){let p=k__default.default.canHaveModifiers(w)?k__default.default.getModifiers(w):void 0;if(p&&p.some(S=>S.kind===k__default.default.SyntaxKind.PrivateKeyword||S.kind===k__default.default.SyntaxKind.ProtectedKeyword))continue;let g=w.name;g&&!k__default.default.isPrivateIdentifier(g)&&(k__default.default.isIdentifier(g)||k__default.default.isStringLiteral(g))&&x.add(g.text);}return x})(y),o=(function(C){let x=new Set;for(let h of C.statements)if(k__default.default.isClassDeclaration(h))for(let w of h.members){if(!k__default.default.isPropertyDeclaration(w)||!w.initializer||!w.name||k__default.default.isPrivateIdentifier(w.name))continue;let p=(function(g){let S=k__default.default.isAsExpression(g)||k__default.default.isSatisfiesExpression(g)?g.expression:g;if(!k__default.default.isCallExpression(S))return;let c=S.expression;return k__default.default.isIdentifier(c)?c.text:k__default.default.isPropertyAccessExpression(c)?k__default.default.isIdentifier(c.expression)&&xt.has(c.expression.text)?c.expression.text:c.name.text:void 0})(w.initializer);p&&yt.has(p)&&(k__default.default.isIdentifier(w.name)||k__default.default.isStringLiteral(w.name))&&x.add(w.name.text);}return x})(y));}catch{}let d=r;if(!d&&u)try{d=await this.context.getTemplate(u);}catch{}if(d)try{n=(function(y){let C=new Set,x=/\{\{([\s\S]*?)\}\}/g;for(let h of y.rootNodes)(function w(p){if(p&&typeof p=="object"){if(Array.isArray(p.attrs))for(let g of p.attrs){if((typeof g.name=="string"?g.name:"").startsWith("("))continue;let S=g.value;typeof S=="string"&&S&&ve(S,C);}if(typeof p.value=="string"&&p.value){let g;for(x.lastIndex=0;(g=x.exec(p.value))!==null;)ve(g[1],C);}if(Array.isArray(p.children))for(let g of p.children)w(g);}})(h);return C})(d);}catch{}return {componentPath:s,templatePath:u,stylePaths:f,specPath:m,publicMembers:a,signalMembers:o,templateReferences:n}}async getComponentSourceFile(t){let r=this.context.getTsSourceFile?.(t);if(r)return r;let i=await this.context.readFile(t);return k__default.default.createSourceFile(t,i,k__default.default.ScriptTarget.Latest,true)}},yt=new Set(["signal","computed","linkedSignal","input","model","toSignal","viewChild","viewChildren","contentChild","contentChildren"]),xt=new Set(["input","viewChild","contentChild"]),be=/\b([a-zA-Z_$][a-zA-Z0-9_$]*)\b/g;function ve(e,t){let r;for(be.lastIndex=0;(r=be.exec(e))!==null;)t.add(r[1]);}var Pt=new Set([".css",".scss",".sass",".less"]),U=e=>{let t=new lruCache.LRUCache({max:128}),r=new lruCache.LRUCache({max:64}),i=new lruCache.LRUCache({max:64}),a=new lruCache.LRUCache({max:64}),o=s=>{let l=t.get(s);if(l)return l;let u=Et(e,s);return t.set(s,u),u},n=s=>{let l=r.get(s);if(l)return l;let u=o(s).then(f=>ast.parseTs(f,s).program);return r.set(s,u),u};return {rootDir:e,readFile:o,getProgram:n,getTemplate:s=>{let l=i.get(s);if(l)return l;let u=bt(s,o,n);return i.set(s,u),u},getStyle:s=>{let l=a.get(s);if(l)return l;let u=R__namespace.extname(s).toLowerCase();if(!Pt.has(u)){let m=Promise.resolve(void 0);return a.set(s,m),m}let f=o(s).then(m=>ast.parseCss(m,s));return a.set(s,f),f},evict:s=>{t.delete(s),r.delete(s),i.delete(s),a.delete(s);},dispose:()=>{t.clear(),r.clear(),i.clear(),a.clear();}}},Et=async(e,t)=>{try{return await promises.readFile(R__namespace.resolve(e,t),"utf-8")}catch(r){let i=r instanceof Error?r.message:String(r);throw Error(`Cannot read file: ${t}. ${i}`)}},bt=async(e,t,r)=>{let i=await vt(e,t,r);if(i&&i.content)return ast.parseHtml(i.content,i.startOffset)},vt=async(e,t,r)=>{let i=R__namespace.extname(e);if(i===".html")return {content:await t(e),startOffset:0};if(i===".ts"){let a=ast.extractTemplateFromProgram(await r(e));return a.content?a:null}return null};var Y=(e,t,r)=>{let i=performance.now()-t,a=e.flatMap(l=>l.failures),o=new Set(a.map(l=>l.filePath)),n=0,s=0;for(let l of a)At(l.severity)?n++:Ft(l.severity)&&s++;return {totalFiles:o.size,totalErrors:n,totalWarnings:s,duration:i,cacheHitRate:r}},At=e=>e==="error",Ft=e=>e==="warn";var G=(e,t,r,i,a)=>{let o=0,n=0;for(let s of r)for(let l of s.failures)l.severity==="error"?o++:l.severity==="warn"&&n++;return {filePath:e,taskCount:t,issueCount:o+n,errorCount:o,warningCount:n,duration:i,typeAware:a}},pe=e=>!!e&&typeof e=="object"&&e.kind==="file-progress",ue=e=>!!e&&typeof e=="object"&&e.kind==="file-progress"&&typeof e.filePath=="string"&&typeof e.taskCount=="number"&&typeof e.issueCount=="number"&&typeof e.errorCount=="number"&&typeof e.warningCount=="number"&&typeof e.duration=="number";var Ae=()=>{throw Error("[ngcompass] Rule executor not configured. Call configureRuleExecutor(executeBatchedNewEngineRules, isNewEngineRule) before running analysis.")},Fe=()=>false,Nt=(e,t)=>{Ae=e,Fe=t;},Ne=()=>Ae,Ie=()=>Fe;var q=async(e,t,r)=>{if(e.length===0)return [];let i=e[0].filePath,a=new re(t),o=new Map,n=[];for(let s of e){if(!Ie()(s.ruleName)){common.debug("engine",`Skipping task ${s.taskId}: Rule "${s.ruleName}" not registered in engine.`),n.push({ruleName:s.ruleName,taskId:s.taskId,failures:[]});continue}let l=Mt(s,r);if(l===null){n.push({ruleName:s.ruleName,taskId:s.taskId,failures:[]});continue}let u=o.get(l)??_t(s.options);u.ruleNames.push(s.ruleName),u.taskIds.push(s.taskId),u.severities.set(s.ruleName,s.severity),o.set(l,u);}for(let s of o.values()){let l=await $t(s,e,i,a,r);n.push(...l);}return n},_t=e=>({options:e,ruleNames:[],taskIds:[],severities:new Map}),Mt=(e,t)=>{try{return common.stableSerialize(e.options||{})}catch(r){let i=r instanceof common.SerializationError?r.message:String(r);return common.debug("engine",`Skipping task ${e.taskId}: failed to serialize options \u2014 ${i}`),t?.record(common.createInfrastructureError("SerializationError",{cause:i,phase:"engine",recoverable:true})),null}},$t=async(e,t,r,i,a)=>{try{let o=new Set(e.taskIds),n=t.some(u=>o.has(u.taskId)&&u.inputs.template?.needsAst),s=await i.build(r,e.options,n),l=Ne()(e.ruleNames,s);return Dt(e,l)}catch(o){let n=o instanceof Error?o.message:String(o);return common.debug("engine",`Failed to execute batch for ${r}: ${n}`),a?.record(common.createInfrastructureError("ParseError",{filePath:r,cause:n,phase:"engine",recoverable:true})),e.ruleNames.map((s,l)=>({ruleName:s,failures:[],taskId:e.taskIds[l]}))}},Dt=(e,t)=>{let r=new Map;for(let a=0;a<e.ruleNames.length;a++){let o=e.ruleNames[a],n=r.get(o);n?n.ids.push(e.taskIds[a]):r.set(o,{ids:[e.taskIds[a]],cursor:0});}let i=[];for(let a of t){let o=e.severities.get(a.ruleName),n=o?{...a,failures:a.failures.map(l=>({...l,severity:o}))}:a,s=r.get(a.ruleName);s&&s.cursor<s.ids.length?i.push({...n,taskId:s.ids[s.cursor++]}):i.push(n);}return i};function ge(e,t,r,i){let a=performance.now(),o=(function(h,w,p){var g;let S=new Set;for(let P of h)S.add(R__namespace.resolve(w,P));let c=(g=w).endsWith(R__namespace.sep)?g:g+R__namespace.sep;for(let P of p.getSourceFiles())!P.isDeclarationFile&&P.fileName.startsWith(c)&&S.add(P.fileName);return S})(t,r,e),{importGraph:n,reverseImportGraph:s,externalDeps:l}=(function(h,w){let p=h.getCompilerOptions(),g=k__default.default.createModuleResolutionCache(h.getCurrentDirectory(),k__default.default.sys.useCaseSensitiveFileNames?E=>E:E=>E.toLowerCase(),p),S=new Map,c=new Map,P=new Map;for(let E of w)S.set(E,new Set),c.set(E,new Set);for(let E of h.getSourceFiles()){if(E.isDeclarationFile||!w.has(E.fileName))continue;let b=E.fileName;for(let A of (function(_){let v=[];return k__default.default.forEachChild(_,function I(T){k__default.default.isImportDeclaration(T)&&k__default.default.isStringLiteral(T.moduleSpecifier)||k__default.default.isExportDeclaration(T)&&T.moduleSpecifier&&k__default.default.isStringLiteral(T.moduleSpecifier)?v.push(T.moduleSpecifier.text):(k__default.default.isCallExpression(T)&&T.expression.kind===k__default.default.SyntaxKind.ImportKeyword&&T.arguments.length>0&&k__default.default.isStringLiteralLike(T.arguments[0])&&v.push(T.arguments[0].text),k__default.default.forEachChild(T,I));}),v})(E)){let _=k__default.default.resolveModuleName(A,b,p,k__default.default.sys,g),v=_.resolvedModule?.resolvedFileName;if(v&&w.has(v)){S.get(b).add(v);let I=c.get(v);I||(I=new Set,c.set(v,I)),I.add(b);}else {let I=(function(T){if(T.startsWith(".")||R__namespace.isAbsolute(T))return null;if(T.startsWith("@")){let M=T.indexOf("/",1);if(M===-1)return null;let $=T.indexOf("/",M+1);return $===-1?T:T.slice(0,$)}let W=T.indexOf("/");return W===-1?T:T.slice(0,W)})(A);if(I){let T=P.get(b);T||(T=new Set,P.set(b,T)),T.add(I);}}}}return {importGraph:S,reverseImportGraph:c,externalDeps:P}})(e,o),u=(function(h,w){let p=new Set;for(let g of h.getSourceFiles()){if(g.isDeclarationFile||!w.has(g.fileName))continue;let{statements:S}=g;S.length!==0&&S.every(c=>k__default.default.isExportDeclaration(c)&&c.moduleSpecifier!=null)&&p.add(g.fileName);}return p})(e,o),f=i??(function(h,w){let p=new Map,g=[".scss",".sass",".css",".less"];for(let S of h){if(!S.endsWith(".component.ts"))continue;let c=R__namespace.dirname(S),P=R__namespace.basename(S,".ts"),E=R__namespace.join(c,P+".html"),b=h.has(E)?E:void 0,A=[];for(let I of g){let T=R__namespace.join(c,P+I);h.has(T)&&A.push(T);}if(!b||A.length===0){let I=(function(T,W,M,$){let ee,Ce=T.getSourceFile(W);if(!Ce)return {templatePath:void 0,stylePaths:[]};let Se=(function(O){for(let z of O.statements){if(!k__default.default.isClassDeclaration(z))continue;let D=k__default.default.canHaveDecorators(z)?k__default.default.getDecorators(z):void 0;if(D)for(let j of D){let B=j.expression;if(!k__default.default.isCallExpression(B)||!k__default.default.isIdentifier(B.expression)||B.expression.text!=="Component")continue;let ce=B.arguments[0];if(ce&&k__default.default.isObjectLiteralExpression(ce))return ce}}})(Ce);if(!Se)return {templatePath:void 0,stylePaths:[]};let le=[];for(let O of Se.properties){if(!k__default.default.isPropertyAssignment(O)||!k__default.default.isIdentifier(O.name))continue;let z=O.name.text;if(z==="templateUrl"){let D=fe(O.initializer);if(D){let j=R__namespace.resolve(M,D);$.has(j)&&(ee=j);}continue}if(z==="styleUrl"){let D=fe(O.initializer);if(D){let j=R__namespace.resolve(M,D);$.has(j)&&le.push(j);}continue}if(z==="styleUrls"&&k__default.default.isArrayLiteralExpression(O.initializer))for(let D of O.initializer.elements){let j=fe(D);if(!j)continue;let B=R__namespace.resolve(M,j);$.has(B)&&le.push(B);}}return {templatePath:ee,stylePaths:le}})(w,S,c,h);!b&&I.templatePath&&(b=I.templatePath),A.length===0&&I.stylePaths.length>0&&A.push(...I.stylePaths);}let _=R__namespace.join(c,P+".spec.ts"),v=h.has(_)?_:void 0;p.set(S,{tsPath:S,templatePath:b,stylePaths:A,specPath:v});}return p})(o,e),m=(function(h){let w=new Map;for(let[p,g]of h)g.templatePath&&w.set(g.templatePath,p);return w})(f),{ngModuleMap:d,standaloneComponents:y,classToFile:C}=(function(h,w){let p=new Map,g=new Set,S=(function(c,P){let E=new Map;for(let b of c.getSourceFiles())if(!b.isDeclarationFile&&P.has(b.fileName))for(let A of b.statements){if(!k__default.default.isClassDeclaration(A)||!A.name)continue;(k__default.default.canHaveModifiers(A)?k__default.default.getModifiers(A):void 0)?.some(v=>v.kind===k__default.default.SyntaxKind.ExportKeyword)&&E.set(A.name.text,b.fileName);}return E})(h,w);for(let c of h.getSourceFiles())if(!c.isDeclarationFile&&w.has(c.fileName))for(let P of c.statements){if(!k__default.default.isClassDeclaration(P))continue;let E=k__default.default.canHaveDecorators(P)?k__default.default.getDecorators(P):void 0;if(E?.length)for(let b of E){let A=(function(I){let T=I.expression;if(!k__default.default.isCallExpression(T))return;let W=T.expression;if(!k__default.default.isIdentifier(W))return;let M=T.arguments[0],$=M&&k__default.default.isObjectLiteralExpression(M)?M:void 0;return {name:W.text,arg:$}})(b);if(!A)continue;let{name:_,arg:v}=A;if(_==="NgModule"){v&&p.set(c.fileName,{filePath:c.fileName,declarations:new Set(K(v,"declarations")),imports:new Set(K(v,"imports")),exports:new Set(K(v,"exports")),providers:new Set(K(v,"providers")),isStandalone:false});break}if(_==="Component"){v&&_e(v,"standalone")&&(g.add(c.fileName),p.set(c.fileName,{filePath:c.fileName,declarations:new Set,imports:new Set(v?K(v,"imports"):[]),exports:new Set,providers:new Set(v?K(v,"providers"):[]),isStandalone:true}));break}if(_==="Directive"||_==="Pipe"){v&&_e(v,"standalone")&&g.add(c.fileName);break}}}return {ngModuleMap:p,standaloneComponents:g,classToFile:S}})(e,o),x=(function(h){let w=0;for(let p of h.values())w+=p.size;return w})(n);return common.debug("engine",`ProjectContext built in ${(performance.now()-a).toFixed(2)}ms \u2014 ${o.size} files, ${x} import edges, ${u.size} barrels, ${l.size} files with ext deps, ${f.size} components, ${m.size} template\u2194component links, ${d.size} NgModules/standalone, ${y.size} standalone`),{importGraph:n,reverseImportGraph:s,ngModuleMap:d,standaloneComponents:y,classToFile:C,componentGraph:f,projectFiles:o,rootDir:r,barrelFiles:u,externalDeps:l,templateToComponent:m}}function fe(e){if(k__default.default.isStringLiteralLike(e)||k__default.default.isNoSubstitutionTemplateLiteral(e))return e.text}function K(e,t){for(let r of e.properties){if(!k__default.default.isPropertyAssignment(r)||!k__default.default.isIdentifier(r.name)||r.name.text!==t)continue;let i=r.initializer;if(!k__default.default.isArrayLiteralExpression(i))break;let a=[];for(let o of i.elements)a.push(...(function n(s){return k__default.default.isIdentifier(s)?[s.text]:k__default.default.isPropertyAccessExpression(s)||k__default.default.isCallExpression(s)?n(s.expression):[]})(o));return a}return []}function _e(e,t){for(let r of e.properties)if(k__default.default.isPropertyAssignment(r)&&k__default.default.isIdentifier(r.name)&&r.name.text===t)return r.initializer.kind===k__default.default.SyntaxKind.TrueKeyword;return false}var Lt=new Set(["Signal","WritableSignal","InputSignal","ModelSignal","OutputEmitterRef"]),Wt=new Set(["WritableSignal","InputSignal","ModelSignal"]),Ot=new Set(["Subject","BehaviorSubject","ReplaySubject","AsyncSubject"]);function de(e){if(!e)return zt;let t=new Map,r=(a,o)=>{if(!a)return false;let n=t.get(o);n||(n=new WeakMap,t.set(o,n));let s=n.get(a);if(s!==void 0)return s;let l=(function(u,f){let m=u.getDeclarations();if(!m||m.length===0)return false;let d=`/node_modules/${f}/`;for(let y of m)if(y.getSourceFile().fileName.replace(Me,"/").includes(d))return true;return false})(a,o);return n.set(a,l),l},i=(a,o,n)=>{if(!a)return false;let s=a.aliasSymbol??a.symbol;return !!s&&!!o.has(s.name)&&r(s,n)};return {isFromPackage:r,isFromAngularCore:a=>r(a,"@angular/core"),isSignal:a=>i(a,Lt,"@angular/core"),isWritableSignal:a=>i(a,Wt,"@angular/core"),isObservable:a=>{if(!a)return false;let o=a.aliasSymbol??a.symbol;return !!o&&o.name==="Observable"&&r(o,"rxjs")},isSubjectLike:a=>i(a,Ot,"rxjs"),isHttpClient:a=>{if(!a)return false;let o=a.aliasSymbol??a.symbol;return !!o&&o.name==="HttpClient"&&r(o,"@angular/common")},isInjectionToken:a=>{if(!a)return false;let o=a.aliasSymbol??a.symbol;return !!o&&o.name==="InjectionToken"&&r(o,"@angular/core")},isEventEmitter:a=>{if(!a)return false;let o=a.aliasSymbol??a.symbol;return !!o&&o.name==="EventEmitter"&&r(o,"@angular/core")},isChangeDetectorRef:a=>{if(!a)return false;let o=a.aliasSymbol??a.symbol;return !!o&&o.name==="ChangeDetectorRef"&&r(o,"@angular/core")},isInjectableClass:a=>!!a&&(!!(function(o){let n=o.getDeclarations()?.[0];if(!n||!k__default.default.isClassDeclaration(n)||!k__default.default.canHaveDecorators(n))return false;let s=k__default.default.getDecorators(n);if(!s)return false;for(let l of s){let u=l.expression,f=k__default.default.isCallExpression(u)?u.expression:u;if(k__default.default.isIdentifier(f)&&f.text==="Injectable")return true}return false})(a)||(function(o){let n=o.getDeclarations();if(!n||n.length===0)return false;for(let s of n)if(s.getSourceFile().fileName.replace(Me,"/").includes("/node_modules/@angular/"))return true;return false})(a))}}var Me=/\\/g,zt={isFromPackage:()=>false,isFromAngularCore:()=>false,isSignal:()=>false,isWritableSignal:()=>false,isObservable:()=>false,isSubjectLike:()=>false,isHttpClient:()=>false,isInjectionToken:()=>false,isEventEmitter:()=>false,isChangeDetectorRef:()=>false,isInjectableClass:()=>false};var he=(e,t=[],r,i={})=>{var a;let o,n,s,l=U(e);common.debug("engine","Initializing Type-Aware Context (ts.createProgram)...");let u=performance.now(),{program:f}=(function(C,x,h,w){var p;let g,S,c=h?.tsconfigRootDir?R__namespace.default.resolve(C,h.tsconfigRootDir):C,P=h?.project?R__namespace.default.resolve(c,h.project):k__default.default.findConfigFile(c,k__default.default.sys.fileExists,"tsconfig.json");if(!P)return {program:void 0};let E=k__default.default.readConfigFile(P,k__default.default.sys.readFile),b=k__default.default.parseJsonConfigFileContent(E.config,k__default.default.sys,c),A=(w.programRootFiles??x).filter(ye),_=A.length>0?A:b.fileNames,v={...b.options,...Bt},I=k__default.default.createProgram({rootNames:_,options:v,host:(p=v,g=k__default.default.createCompilerHost(p,true),S=k__default.default.createModuleResolutionCache(g.getCurrentDirectory(),T=>g.getCanonicalFileName(T),p),g.resolveModuleNameLiterals=(T,W,M,$)=>T.map(ee=>k__default.default.resolveModuleName(ee.text,W,$,g,S,M)),g)});return common.debug("engine",`Program rootNames: ${_.length} (tsconfig had ${b.fileNames.length})`),{program:I}})(e,t,r,i);f?(function(C,x){let h=0,w=0;for(let g of C.getSourceFiles())g.isDeclarationFile||Ut.test(g.fileName)?h++:w++;let p=(process.memoryUsage().heapUsed/1048576).toFixed(0);common.debug("engine",`Program diagnostics: ${w} project file(s), ${h} lib/declaration file(s), built in ${x.toFixed(0)}ms, heapUsed ${p}MB`);})(f,performance.now()-u):common.debug("engine","Could not find tsconfig.json; TypeChecker and ProjectContext will be unavailable.");let m=f?.getTypeChecker();m&&(a=m,o=new WeakMap,n=a.getTypeAtLocation.bind(a),a.getTypeAtLocation=C=>{let x=o.get(C);if(x)return x;let h=n(C);return o.set(C,h),h});let d=de(f);if(f&&i.buildProjectContext!==false)try{s=ge(f,t,e);}catch(C){let x=C instanceof Error?C.message:String(C);common.debug("engine",`ProjectContext build failed (non-fatal): ${x}`);}else f&&common.debug("engine","Skipping ProjectContext build for type-checker-only chunk");let y=f;return {...l,getTypeChecker:C=>Promise.resolve(m),getProjectContext:()=>s,getTsSourceFile:C=>y?.getSourceFile(C),getAngularTypes:()=>d,warmup:()=>(common.debug("engine",`Type-aware context ready: ${y?`ts.Program with ${y.getSourceFiles().length} source files`:"no tsconfig found, TypeChecker unavailable"}`),Promise.resolve()),dispose:()=>{s=void 0,m=void 0,d=void 0,y=void 0,l.dispose();}}},ye=e=>(e.endsWith(".ts")||e.endsWith(".tsx"))&&!e.endsWith(".d.ts"),Bt={skipLibCheck:true,skipDefaultLibCheck:true,noEmit:true,declaration:false,declarationMap:false,sourceMap:false,inlineSourceMap:false,incremental:false,composite:false},Ut=/[\\/]node_modules[\\/]/;var De=()=>{let e=globalThis.gc;return typeof e=="function"&&(e(),true)},Gt=()=>{let{heapUsed:e}=process.memoryUsage(),{heap_size_limit:t}=Ht__default.default.getHeapStatistics();return {usedBytes:e,limitBytes:t}},je=()=>{let{usedBytes:e,limitBytes:t}=Gt();return t>0?e/t:0},se=e=>!(je()<e)&&De();var Ue=async(e,t,r,i,a,o)=>{let n,{Worker:s}=await import('worker_threads'),l=i??Math.max(2,Vt__default.default.cpus().length),u=await Qt();if(!u)return common.debug("workers","Execution worker not found, falling back to local execution."),Oe(e,t,r,a??l,o);let f=er(e,l),m=[],d=0,y=()=>{d++,common.debug("workers",`Worker progress: ${d}/${l} complete`);},C=f.map(w=>Jt(s,u,t,w,m,y,o));try{n=await Promise.all(C);}catch(w){var x;return await Promise.allSettled(m.map(p=>p.terminate())),common.debug("workers",`Worker execution failed, retrying locally with one file batch at a time: ${(x=w)instanceof Error?x.message:String(x)}`),Oe(e,t,r,1,o)}let h=n.flat();return common.Ok({results:h,parseErrors:[],stats:Y(h,r)})},Jt=(e,t,r,i,a,o,n)=>new Promise((s,l)=>{let u=false,f=new e(t,{workerData:{rootDir:r,tasks:i}});a.push(f);let m=()=>{clearTimeout(d),f.removeAllListeners();},d=setTimeout(()=>{u||(u=true,m(),o(),f.terminate(),l(Error(`Worker timed out after ${6e4/1e3}s`)));},6e4);f.on("message",y=>{pe(y)?n?.(y):u||(u=true,m(),y.errors&&y.errors.length>0&&y.errors.forEach(C=>{common.debug("workers",`Worker failed task ${C.task.taskId}: ${C.error}`);}),o(),s(y.results));}),f.on("error",y=>{u||(u=true,m(),o(),l(y instanceof Error?y:Error(String(y))));}),f.on("exit",y=>{if(u||y===0)return;u=true,m();let C=common.createInfrastructureError("WorkerCrash",{cause:`Worker exited with code ${y}`,phase:"engine",recoverable:true,details:{exitCode:y}});common.debug("workers",`Worker crashed: ${C.cause}`),l(Error(C.cause));});}),Oe=async(e,t,r,i,a)=>{let o=U(t),n=Zt__default.default(i),s=planner.groupTasksByFile(e),l=(await Promise.all(Array.from(s.values()).map(u=>n(async()=>{let f=u[0]?.filePath,m=performance.now(),d=await q(u,o);return f&&(o.evict(f),a?.(G(f,u.length,d,performance.now()-m))),d})))).flat();return common.Ok({results:l,parseErrors:[],stats:Y(l,r)})},Qt=async()=>{let e=R.dirname(url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href))));try{let t=module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href))).resolve("@ngcompass/rules/execution-worker");if(fs.existsSync(t))return t}catch{}return [R.join(e,"..","..","rules","dist","execution-worker.js"),R.join(e,"..","..","rules","dist","execution-worker.cjs")].find(t=>fs.existsSync(t))??null},er=(e,t)=>{let r=Array.from(planner.groupTasksByFile(e).values()).sort((o,n)=>n.length-o.length),i=Array.from({length:t},()=>[]),a=Array(t).fill(0);for(let o of r){let n=0,s=a[0];for(let l=1;l<t;l++)a[l]<s&&(s=a[l],n=l);i[n].push(...o),a[n]+=o.length;}return i};var xe=Number.MAX_SAFE_INTEGER;function Ve(e){if(!e||typeof e!="object"||typeof e.ruleName!="string"||!Array.isArray(e.failures))return false;for(let t of e.failures)if(!t||typeof t!="object"||typeof t.filePath!="string"||typeof t.line!="number"||typeof t.column!="number"||typeof t.severity!="string")return false;return true}var Ya=async(e,t)=>{try{if(e.precomputedAnalysis){if((function(c){if(!c||typeof c!="object"||!Array.isArray(c.results)||!Array.isArray(c.parseErrors)||!c.stats||typeof c.stats!="object")return !1;let P=c.stats;return typeof P.totalFiles=="number"&&typeof P.totalErrors=="number"&&typeof P.totalWarnings=="number"&&typeof P.duration=="number"})(e.precomputedAnalysis))return common.debug("engine","Returning precomputed analysis from cache (global hash match)"),common.Ok(e.precomputedAnalysis);common.debug("engine","Precomputed analysis failed schema validation \u2014 discarding stale cache entry and re-running analysis");}let r=performance.now(),{tasks:i,skippedTasks:a,cachedResults:o}=e,n=Vt__default.default.cpus().length,s=Math.max(1,Math.min(4,n-1)),l=Math.max(1,Math.min(t.maxWorkers??s,n)),u=t.parallelThreshold??150,f=i.filter(c=>!!c.needsTypeChecker||!!c.needsProjectContext),m=i.filter(c=>!c.needsTypeChecker&&!c.needsProjectContext);if(common.debug("engine",`workerTasks: ${m.length}, typeAwareTasks: ${f.length}`),f.length>0&&!t.skipTypeCheck){let c=planner.groupTasksByFile(f).size;dr(c,t.onNotice);}let d=i.length+a.length,y=a.length,C=c=>{y=Math.min(y+c,d),t.onProgress?.(y,d);};a.length>0&&t.onProgress?.(y,d);let x=[];if(m.length>0)if(m.length>u){common.debug("engine",`Running analysis on ${m.length} syntax-only tasks using workers (max: ${l})...`);let c=await Ue(m,t.rootDir,r,l,void 0,t.onFileProgress);if(!c.ok)return c;x=c.data.results,C(m.length);}else common.debug("engine",`Running analysis on ${m.length} syntax-only tasks locally with batching (concurrency: ${l})...`),x=await Xe(m,t.rootDir,l,!1,t.errorCollector,void 0,void 0,!0,void 0,C,t.onFileProgress);if(f.length>0&&!t.skipTypeCheck){let c=fr(t.typeAwareFileConcurrency,l),P=await pr(f,t.rootDir,c,t,C,t.onFileProgress);x=[...x,...P];}else f.length>0&&t.skipTypeCheck&&common.debug("engine",`Skipping ${f.length} type-aware tasks (--skip-type-check)`);let h=await Er(a,o,t.cache),w=[...x,...h],p=i.length+a.length,g=p>0?h.length/p:void 0,S={results:w,parseErrors:[],stats:Y(w,r,g)};if(t.cache&&e.globalHash&&S.results.length<=2e4){common.debug("engine","Caching full analysis result for global hash..."),t.debug&&(common.debug("engine",`Analysis Results: ${S.results.length} items`),S.results.length>0&&common.debug("engine",`Sample item keys: ${Object.keys(S.results[0]).join(", ")}`));try{await t.cache.analysis.set(e.globalHash,S);}catch(c){let P=c instanceof Error?c.message:String(c);common.debug("engine",`Failed to cache analysis result: ${P}`),t.errorCollector?.record(common.createInfrastructureError("IOError",{cause:`Failed to write analysis cache: ${P}`,phase:"engine",recoverable:!0}));}}else t.cache&&e.globalHash&&common.debug("engine",`Skipping full analysis cache: ${S.results.length} results exceeds 20000 result safety limit`);return common.Ok(S)}catch(r){return common.Err(r instanceof Error?r:Error(String(r)))}},Xe=async(e,t,r,i,a,o,n,s=true,l,u,f)=>{let m=i?he(t,o??[],n,{buildProjectContext:s,programRootFiles:l}):U(t);i&&(await m.warmup(),common.debug("engine",`Phase 1 complete \u2014 TypeScript Program ready. Starting Phase 2: ${r} concurrent file batches.`));let d=planner.groupTasksByFile(e);common.debug("engine",`Grouped ${e.length} tasks into ${d.size} file batches`);let y=Zt__default.default(r),C=await Promise.all(Array.from(d.values()).map(x=>y(async()=>{let h=x[0]?.filePath,w=performance.now();try{let p=await q(x,m);return m.evict(h),u?.(x.length),h&&f?.(G(h,x.length,p,performance.now()-w,i)),p}catch(p){let g=p instanceof Error?p.message:String(p);return m.evict(h),u?.(x.length),h&&f?.(G(h,x.length,[],performance.now()-w,i)),a?.record(common.createInfrastructureError("IOError",{filePath:h,cause:`Batch execution failed: ${g}`,phase:"engine",recoverable:true})),[]}})));return m.dispose(),C.flat().filter(x=>x!==null)},pr=async(e,t,r,i,a,o)=>{let n=planner.groupTasksByFile(e);if(Ze(e).length===0)return common.debug("engine",`Type-aware: no TypeScript roots among ${n.size} files; nothing to type-check`),[];let s=e.some(f=>!!f.needsProjectContext),l=Array.from(n.entries()),u=[];for(let f=0;f<l.length;f+=xe){let m=l.slice(f,f+xe),d=Je(Math.floor(f/xe)+1,m,s),y=i.files&&i.files.length>0?i.files:void 0;common.debug("engine",`Type-aware chunk ${d.index}: ${d.tasks.length} tasks across ${d.files.length} files`),u=[...u,...await ur(d,t,y,r,i,o)],a?.(d.tasks.length);}return u},ur=async(e,t,r,i,a,o)=>{let n=[],s=new Set,l=e;for(;l;){let u=l,f=mr(r,u);try{let m=await xr(u.tasks,t,f,u.programRootFiles,u.buildProjectContext,i,a,o);n.push(...m),se(.8);break}catch(m){let d=m instanceof J?m:void 0;if(d)for(let x of(n.push(...d.partialResults),d.completedFiles))s.add(x);let y=Ye(e,s);if(!y)return n;let C=!!d&&d.completedFiles.size>0;if(i!==1&&C)l=y;else {let x=y.files[0];s.add(x),gr(x,t,m,a),l=Ye(e,s);}se(.8);}}return n},mr=(e,t)=>t.buildProjectContext&&e?e:t.files,fr=(e,t)=>Math.max(1,Math.min(e==null||Number.isNaN(e)?1:Math.floor(e),t,8)),Ze=e=>{let t=new Set;for(let r of e){let i=r.inputs.typescript.path;ye(i)&&t.add(i);}return [...t]},Je=(e,t,r)=>{let i=t.flatMap(([,a])=>a);return {index:e,tasks:i,files:t.map(([a])=>a),programRootFiles:Ze(i),buildProjectContext:r}},Ye=(e,t)=>{if(t.size===0)return e;let r=Array.from(planner.groupTasksByFile(e.tasks).entries()).filter(([i])=>!t.has(i));return r.length===0?null:Je(e.index,r,e.buildProjectContext)},gr=(e,t,r,i)=>{let a=r instanceof J?r.reason:"crash",o=R.relative(t,e)||e,n=`Skipped ${o} (${a==="timeout"?"type-check timed out":"type-check failed"})`;i.onFileSkipped?.(e),i.onNotice?.(n),i.errorCollector?.record(common.createInfrastructureError("WorkerCrash",{filePath:e,cause:n,phase:"engine",recoverable:true}));},dr=(e,t)=>{if(!t)return;let r=Ht__default.default.getHeapStatistics().heap_size_limit/1073741824;if(r>=4||e<600)return;let i=r.toFixed(1),a=e.toLocaleString();t(`Large type-aware workload: ${a} files on a ${i} GB heap built into a single TypeScript program. If analysis runs out of memory, raise it with NODE_OPTIONS=--max-old-space-size=8192 or run with --skip-type-check.`);},hr=["--max-old-space-size","--max-semi-space-size"],oe="--max-old-space-size",qe=e=>e.split("_").join("-"),yr=(e,t)=>{let r=[],i=t!==void 0&&qe(t).includes(oe);for(let o=0;o<e.length;o++){let n=e[o];if(n==="--expose-gc")continue;let s=qe(n),l=hr.find(u=>s===u||s.startsWith(`${u}=`));l&&(r.push(n),(s===oe||s.startsWith(`${oe}=`))&&(i=true),s===l&&o+1<e.length&&r.push(e[++o]));}let a=["--expose-gc",...r];return i||a.push(`${oe}=4096`),a},J=class extends Error{reason;partialResults;completedFiles;constructor(t,r,i,a){super(t),this.name="TypeAwareChildFailure",this.reason=r,this.partialResults=i,this.completedFiles=a;}},ie=(e,t,r)=>e!==void 0?e:t===0?3e4:Math.min(3e4,Math.max(1e3,8*r)),xr=async(e,t,r,i,a,o,n,s)=>{let l=await wr();return l?new Promise((u,f)=>{let m,d,y=child_process.fork(l,[],{cwd:t,execArgv:yr(process.execArgv,process.env.NODE_OPTIONS),stdio:["ignore","pipe","pipe","ipc"]}),C=false,x=0,h=0,w=[],p=new Set,g=(c,P)=>{C||(C=true,clearTimeout(m),y.kill(),f(new J(c,P,w.slice(),p)));},S=(c,P)=>{clearTimeout(m),m=setTimeout(()=>{let E=d?` while analyzing "${d}"`:"";g(`Type-aware ${P} exceeded ${c/1e3}s${E}`,"timeout");},c);};S(6e5,"program build"),y.stdout?.on("data",c=>common.debug("engine",`[type-aware-child] ${String(c).trim()}`)),y.stderr?.on("data",c=>common.debug("engine",`[type-aware-child:stderr] ${String(c).trim()}`)),y.on("message",c=>{if(Cr(c))return void S(ie(n.typeAwarePerFileTimeoutMs,x,h),"file analysis");if(Sr(c)){d=c.filePath,S(ie(n.typeAwarePerFileTimeoutMs,x,h),"file analysis");return}if(ue(c)){x++,h=Math.max(h,c.duration),s?.(c),S(ie(n.typeAwarePerFileTimeoutMs,x,h),"file analysis");return}if(Tr(c)){w.push(...c.results),p.add(c.filePath),d===c.filePath&&(d=void 0),S(ie(n.typeAwarePerFileTimeoutMs,x,h),"file analysis");return}if(kr(c)){if(C)return;C=true,clearTimeout(m),u(w);return}Pr(c)&&g(c.error,"reported");}),y.on("error",c=>{g(c.message,"spawn");}),y.on("exit",c=>{g(`Type-aware child process exited before completion with code ${c}`,"crash");}),y.send({rootDir:t,tasks:e,files:r,programRootFiles:i,parserOptions:n.parserOptions,buildProjectContext:a,fileConcurrency:o});}):(common.debug("engine","Type-aware child worker not found; falling back to in-process execution"),Xe(e,t,o,true,n.errorCollector,r,n.parserOptions,a,i,void 0,s))},wr=async()=>{let e=R.dirname(url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href))));try{let t=module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href))).resolve("@ngcompass/rules/type-aware-worker");if(fs.existsSync(t))return t}catch{}for(let t of [R.join(e,"..","..","rules","dist","type-aware-worker.js"),R.join(e,"..","..","rules","dist","type-aware-worker.cjs")])if(fs.existsSync(t))return t;return null},Cr=e=>!!e&&typeof e=="object"&&e.kind==="ready",Sr=e=>!!e&&typeof e=="object"&&e.kind==="file-start"&&typeof e.filePath=="string",kr=e=>!!e&&typeof e=="object"&&e.kind==="complete",Tr=e=>!!e&&typeof e=="object"&&e.kind==="file-result"&&typeof e.filePath=="string"&&Array.isArray(e.results),Pr=e=>!!e&&typeof e=="object"&&e.kind==="error"&&typeof e.error=="string",Er=async(e,t,r)=>{if(e.length===0)return [];common.debug("engine",`Retrieving results for ${e.length} skipped tasks...`);let i=[],a=[];if(t)for(let o of e){let n=t.get(o.taskId);n&&Ve(n)?i.push(n):a.push(o);}else a.push(...e);if(a.length>0&&r){common.debug("engine",`Fetching ${a.length} results from cache service...`);let o=a.map(s=>s.taskId),n=await r.results.getMany(o);for(let s of a){let l=n.get(s.taskId);l&&Ve(l)&&i.push(l);}}return common.debug("engine",`Retrieved ${i.length} results from cache`),i};var Qe=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],et=class{frameIndex=0;interval=null;message="";start(t){this.message=t,this.interval||(this.frameIndex=0,Q__default.default.stderr.write("\x1B[?25l"),this.interval=setInterval(()=>{Q__default.default.stderr.write(`\r${Qe[this.frameIndex]} ${this.message}`),this.frameIndex=(this.frameIndex+1)%Qe.length;},80));}update(t){this.message=t;}stop(t){this.interval&&(clearInterval(this.interval),this.interval=null),Q__default.default.stderr.write("\r\x1B[K"),t&&Q__default.default.stderr.write(t+` | ||
| `),Q__default.default.stderr.write("\x1B[?25h");}};exports.BUDGET_MS_PER_FILE_WITHOUT_TYPES=st;exports.BUDGET_MS_PER_FILE_WITH_TYPES=ot;exports.MIN_WORKER_COUNT=rt;exports.RuleContextFactory=re;exports.SPINNER_FRAME_INTERVAL_MS=at;exports.STREAM_TO_NODE_TYPE=tt;exports.Spinner=et;exports.WORKER_TIMEOUT_MS=Te;exports.buildFileProgress=G;exports.buildProjectContext=ge;exports.buildVisitorMap=ke;exports.calculateStats=Y;exports.computeAdaptiveFileBudget=ie;exports.configureRuleExecutor=Nt;exports.createAnalysisContext=U;exports.createAngularTypeIndex=de;exports.createAnyAngularClassRule=vr;exports.createCallExpressionRule=Ir;exports.createComponentRule=br;exports.createDecoratedPropertyRule=Ar;exports.createImportDeclarationRule=_r;exports.createNewExpressionRule=Rr;exports.createTemplateAttributeRule=Nr;exports.createTemplateBlockRule=Mr;exports.createTemplateExpressionRule=Fr;exports.createTemplateRule=$r;exports.createTypeAwareAnalysisContext=he;exports.executeBatchedTasks=q;exports.getHeapPressureRatio=je;exports.isAnalysisFileProgress=ue;exports.isWorkerFileProgress=pe;exports.requestGarbageCollection=De;exports.requestGarbageCollectionUnderPressure=se;exports.resolveChildExecArgv=yr;exports.runAnalysis=Ya;exports.runAnalysisParallel=Ue;exports.runSinglePassAnalysis=Br;//# sourceMappingURL=index.cjs.map | ||
| //# sourceMappingURL=index.cjs.map |
+4
-3
| import { RuleContext, RuleFailure, RuleMetadata, InfrastructureErrorCollector, RuleResult, TemplateAst, StyleAst, ProjectContext, AngularTypeIndex, WorkerFileProgress, ParserOptions, Result, AnalysisResult, ComponentFiles } from '@ngcompass/common'; | ||
| import { AnyAngularClassNode, CallExpression, AngularClassNode, DecoratedPropertyNode, NewExpression, TemplateAttributeNode, TemplateBlockNode, TemplateExpressionNode, TemplateAnalysis } from '@ngcompass/ast'; | ||
| import { AnyAngularClassNode, CallExpression, AngularClassNode, DecoratedPropertyNode, ImportDeclaration, NewExpression, TemplateAttributeNode, TemplateBlockNode, TemplateExpressionNode, TemplateAnalysis } from '@ngcompass/ast'; | ||
| import { Program } from 'oxc-parser'; | ||
@@ -8,3 +8,3 @@ import ts, { TypeChecker } from 'typescript'; | ||
| type StreamType = 'AngularClass' | 'AnyAngularClass' | 'DecoratedProperty' | 'TemplateExpression' | 'TemplateAttribute' | 'TemplateBlock' | 'Template' | 'CallExpression' | 'NewExpression'; | ||
| type StreamType = 'AngularClass' | 'AnyAngularClass' | 'DecoratedProperty' | 'TemplateExpression' | 'TemplateAttribute' | 'TemplateBlock' | 'Template' | 'CallExpression' | 'NewExpression' | 'ImportDeclaration'; | ||
| interface RuleHandler<TNode> { | ||
@@ -23,2 +23,3 @@ readonly name: string; | ||
| declare const createNewExpressionRule: (name: string, handler: (node: NewExpression, context: RuleContext) => RuleFailure | RuleFailure[] | null, meta?: Partial<RuleMetadata>) => RuleHandler<NewExpression>; | ||
| declare const createImportDeclarationRule: (name: string, handler: (node: ImportDeclaration, context: RuleContext) => RuleFailure | RuleFailure[] | null, meta?: Partial<RuleMetadata>) => RuleHandler<ImportDeclaration>; | ||
| declare const createTemplateBlockRule: (name: string, handler: (node: TemplateBlockNode, context: RuleContext) => RuleFailure | RuleFailure[] | null, meta?: Partial<RuleMetadata>) => RuleHandler<TemplateBlockNode>; | ||
@@ -176,2 +177,2 @@ declare const createTemplateRule: (name: string, handler: (node: TemplateAnalysis, context: RuleContext) => RuleFailure | RuleFailure[] | null, meta?: Partial<RuleMetadata>) => RuleHandler<TemplateAnalysis>; | ||
| export { type AnalysisContext, type AnalysisFileProgress, type AnalysisOptions, BUDGET_MS_PER_FILE_WITHOUT_TYPES, BUDGET_MS_PER_FILE_WITH_TYPES, type BatchRuleExecutorFn, type ExecutionContext, MIN_WORKER_COUNT, type PerformanceReport, type RuleCheckerFn, RuleContextFactory, type RuleHandler, SPINNER_FRAME_INTERVAL_MS, STREAM_TO_NODE_TYPE, Spinner, type StreamType, type TypeAwareAnalysisContext, type TypeAwareAnalysisContextOptions, type VisitorEntry, type VisitorMap, WORKER_TIMEOUT_MS, buildFileProgress, buildProjectContext, buildVisitorMap, calculateStats, computeAdaptiveFileBudget, configureRuleExecutor, createAnalysisContext, createAngularTypeIndex, createAnyAngularClassRule, createCallExpressionRule, createComponentRule, createDecoratedPropertyRule, createNewExpressionRule, createTemplateAttributeRule, createTemplateBlockRule, createTemplateExpressionRule, createTemplateRule, createTypeAwareAnalysisContext, executeBatchedTasks, getHeapPressureRatio, isAnalysisFileProgress, isWorkerFileProgress, requestGarbageCollection, requestGarbageCollectionUnderPressure, resolveChildExecArgv, runAnalysis, runAnalysisParallel, runSinglePassAnalysis }; | ||
| export { type AnalysisContext, type AnalysisFileProgress, type AnalysisOptions, BUDGET_MS_PER_FILE_WITHOUT_TYPES, BUDGET_MS_PER_FILE_WITH_TYPES, type BatchRuleExecutorFn, type ExecutionContext, MIN_WORKER_COUNT, type PerformanceReport, type RuleCheckerFn, RuleContextFactory, type RuleHandler, SPINNER_FRAME_INTERVAL_MS, STREAM_TO_NODE_TYPE, Spinner, type StreamType, type TypeAwareAnalysisContext, type TypeAwareAnalysisContextOptions, type VisitorEntry, type VisitorMap, WORKER_TIMEOUT_MS, buildFileProgress, buildProjectContext, buildVisitorMap, calculateStats, computeAdaptiveFileBudget, configureRuleExecutor, createAnalysisContext, createAngularTypeIndex, createAnyAngularClassRule, createCallExpressionRule, createComponentRule, createDecoratedPropertyRule, createImportDeclarationRule, createNewExpressionRule, createTemplateAttributeRule, createTemplateBlockRule, createTemplateExpressionRule, createTemplateRule, createTypeAwareAnalysisContext, executeBatchedTasks, getHeapPressureRatio, isAnalysisFileProgress, isWorkerFileProgress, requestGarbageCollection, requestGarbageCollectionUnderPressure, resolveChildExecArgv, runAnalysis, runAnalysisParallel, runSinglePassAnalysis }; |
+4
-3
| import { RuleContext, RuleFailure, RuleMetadata, InfrastructureErrorCollector, RuleResult, TemplateAst, StyleAst, ProjectContext, AngularTypeIndex, WorkerFileProgress, ParserOptions, Result, AnalysisResult, ComponentFiles } from '@ngcompass/common'; | ||
| import { AnyAngularClassNode, CallExpression, AngularClassNode, DecoratedPropertyNode, NewExpression, TemplateAttributeNode, TemplateBlockNode, TemplateExpressionNode, TemplateAnalysis } from '@ngcompass/ast'; | ||
| import { AnyAngularClassNode, CallExpression, AngularClassNode, DecoratedPropertyNode, ImportDeclaration, NewExpression, TemplateAttributeNode, TemplateBlockNode, TemplateExpressionNode, TemplateAnalysis } from '@ngcompass/ast'; | ||
| import { Program } from 'oxc-parser'; | ||
@@ -8,3 +8,3 @@ import ts, { TypeChecker } from 'typescript'; | ||
| type StreamType = 'AngularClass' | 'AnyAngularClass' | 'DecoratedProperty' | 'TemplateExpression' | 'TemplateAttribute' | 'TemplateBlock' | 'Template' | 'CallExpression' | 'NewExpression'; | ||
| type StreamType = 'AngularClass' | 'AnyAngularClass' | 'DecoratedProperty' | 'TemplateExpression' | 'TemplateAttribute' | 'TemplateBlock' | 'Template' | 'CallExpression' | 'NewExpression' | 'ImportDeclaration'; | ||
| interface RuleHandler<TNode> { | ||
@@ -23,2 +23,3 @@ readonly name: string; | ||
| declare const createNewExpressionRule: (name: string, handler: (node: NewExpression, context: RuleContext) => RuleFailure | RuleFailure[] | null, meta?: Partial<RuleMetadata>) => RuleHandler<NewExpression>; | ||
| declare const createImportDeclarationRule: (name: string, handler: (node: ImportDeclaration, context: RuleContext) => RuleFailure | RuleFailure[] | null, meta?: Partial<RuleMetadata>) => RuleHandler<ImportDeclaration>; | ||
| declare const createTemplateBlockRule: (name: string, handler: (node: TemplateBlockNode, context: RuleContext) => RuleFailure | RuleFailure[] | null, meta?: Partial<RuleMetadata>) => RuleHandler<TemplateBlockNode>; | ||
@@ -176,2 +177,2 @@ declare const createTemplateRule: (name: string, handler: (node: TemplateAnalysis, context: RuleContext) => RuleFailure | RuleFailure[] | null, meta?: Partial<RuleMetadata>) => RuleHandler<TemplateAnalysis>; | ||
| export { type AnalysisContext, type AnalysisFileProgress, type AnalysisOptions, BUDGET_MS_PER_FILE_WITHOUT_TYPES, BUDGET_MS_PER_FILE_WITH_TYPES, type BatchRuleExecutorFn, type ExecutionContext, MIN_WORKER_COUNT, type PerformanceReport, type RuleCheckerFn, RuleContextFactory, type RuleHandler, SPINNER_FRAME_INTERVAL_MS, STREAM_TO_NODE_TYPE, Spinner, type StreamType, type TypeAwareAnalysisContext, type TypeAwareAnalysisContextOptions, type VisitorEntry, type VisitorMap, WORKER_TIMEOUT_MS, buildFileProgress, buildProjectContext, buildVisitorMap, calculateStats, computeAdaptiveFileBudget, configureRuleExecutor, createAnalysisContext, createAngularTypeIndex, createAnyAngularClassRule, createCallExpressionRule, createComponentRule, createDecoratedPropertyRule, createNewExpressionRule, createTemplateAttributeRule, createTemplateBlockRule, createTemplateExpressionRule, createTemplateRule, createTypeAwareAnalysisContext, executeBatchedTasks, getHeapPressureRatio, isAnalysisFileProgress, isWorkerFileProgress, requestGarbageCollection, requestGarbageCollectionUnderPressure, resolveChildExecArgv, runAnalysis, runAnalysisParallel, runSinglePassAnalysis }; | ||
| export { type AnalysisContext, type AnalysisFileProgress, type AnalysisOptions, BUDGET_MS_PER_FILE_WITHOUT_TYPES, BUDGET_MS_PER_FILE_WITH_TYPES, type BatchRuleExecutorFn, type ExecutionContext, MIN_WORKER_COUNT, type PerformanceReport, type RuleCheckerFn, RuleContextFactory, type RuleHandler, SPINNER_FRAME_INTERVAL_MS, STREAM_TO_NODE_TYPE, Spinner, type StreamType, type TypeAwareAnalysisContext, type TypeAwareAnalysisContextOptions, type VisitorEntry, type VisitorMap, WORKER_TIMEOUT_MS, buildFileProgress, buildProjectContext, buildVisitorMap, calculateStats, computeAdaptiveFileBudget, configureRuleExecutor, createAnalysisContext, createAngularTypeIndex, createAnyAngularClassRule, createCallExpressionRule, createComponentRule, createDecoratedPropertyRule, createImportDeclarationRule, createNewExpressionRule, createTemplateAttributeRule, createTemplateBlockRule, createTemplateExpressionRule, createTemplateRule, createTypeAwareAnalysisContext, executeBatchedTasks, getHeapPressureRatio, isAnalysisFileProgress, isWorkerFileProgress, requestGarbageCollection, requestGarbageCollectionUnderPressure, resolveChildExecArgv, runAnalysis, runAnalysisParallel, runSinglePassAnalysis }; |
+2
-2
@@ -1,3 +0,3 @@ | ||
| import {toNewExpressionStream,toCallExpressionStream,toDecoratedPropertyStream,toAnyAngularClassStream,toAngularClassStream,resetComponentCacheStats,walkProgram,analyzeTemplate,getComponentCacheStats,parseCss,parseHtml,extractTemplateFromProgram,parseTs}from'@ngcompass/ast';import {isDebugEnabled,createInfrastructureError,Locator,debug,stableSerialize,SerializationError,Ok,Err}from'@ngcompass/common';import k from'typescript';import {fork}from'child_process';import {existsSync}from'fs';import {createRequire}from'module';import Kt from'os';import*as R from'path';import R__default,{dirname,join,relative}from'path';import {fileURLToPath}from'url';import Ut from'v8';import {groupTasksByFile}from'@ngcompass/planner';import Xt from'p-limit';import {readFile}from'fs/promises';import {LRUCache}from'lru-cache';import Q from'process';var Pr=(e,t,r)=>({name:e,streamType:"AngularClass",handle:t,meta:r}),br=(e,t,r)=>({name:e,streamType:"AnyAngularClass",handle:t,meta:r}),vr=(e,t)=>({name:e,streamType:"DecoratedProperty",handle:t}),Ar=(e,t,r)=>({name:e,streamType:"TemplateExpression",handle:t,meta:r}),Fr=(e,t,r)=>({name:e,streamType:"TemplateAttribute",handle:t,meta:r}),Nr=(e,t,r)=>({name:e,streamType:"CallExpression",handle:t,meta:r}),_r=(e,t,r)=>({name:e,streamType:"NewExpression",handle:t,meta:r}),Rr=(e,t,r)=>({name:e,streamType:"TemplateBlock",handle:t,meta:r}),Ir=(e,t,r)=>({name:e,streamType:"Template",handle:t,meta:r});var tt={AngularClass:"ClassDeclaration",AnyAngularClass:"ClassDeclaration",DecoratedProperty:"PropertyDefinition",TemplateExpression:"__template_expression__",TemplateAttribute:"__template_attribute__",TemplateBlock:"__template_block__",Template:"__template_analysis__",CallExpression:"CallExpression",NewExpression:"NewExpression"};function ke(e,t){let r=new Map;for(let o of e){let a=tt[o.streamType];if(!a||a.startsWith("__"))continue;let i=t[o.streamType];if(!i)continue;let n={ruleName:o.name,filter:i,handle:o.handle.bind(o)},s=r.get(a);s?s.push(n):r.set(a,[n]);}return r}var rt=2,at=80,Te=6e4,st=2,it=5;var te=(e,t,r,o,a,i,n)=>{if(t.length!==0)for(let s of e)for(let l=0;l<t.length;l++){let u=t[l],f=i?performance.now():0;try{let m=u.handle(s,r);if(m){let g=o.get(u.name)??[];Array.isArray(m)?g.push(...m):g.push(m),o.set(u.name,g);}}catch(m){n?.record(createInfrastructureError("RuleExecutionError",{cause:`Rule ${u.name} failed on template node: ${m instanceof Error?m.message:String(m)}`,recoverable:true,phase:"engine",details:{ruleName:u.name,errorName:m instanceof Error?m.name:void 0}}));}if(i){let m=performance.now()-f,g=a.get(u.name);g&&(g.totalMs+=m,g.invocations++);}}},Or=(e,t,r)=>{let{program:o}=t;if(!o)return {results:e.map(p=>({ruleName:p.name,failures:[]})),performance:{traversalMs:0,nodesVisited:0,ruleTimings:[],cacheStats:{hits:0,misses:0},budgetViolations:[],hasBudgetViolations:false}};let a=performance.now(),i=ke(e,{AngularClass:toAngularClassStream,AnyAngularClass:toAnyAngularClassStream,DecoratedProperty:toDecoratedPropertyStream,CallExpression:toCallExpressionStream,NewExpression:toNewExpressionStream}),n=e.filter(p=>p.streamType==="TemplateExpression"),s=e.filter(p=>p.streamType==="TemplateAttribute"),l=e.filter(p=>p.streamType==="TemplateBlock"),u=e.filter(p=>p.streamType==="Template"),f=new Map,m=new Map,g=r?.collectRuleTimings??isDebugEnabled(),y=0;for(let p of e)m.set(p.name,{ruleName:p.name,totalMs:0,invocations:0});if(resetComponentCacheStats(),walkProgram(o,p=>{if(!p?.type)return;y++;let d=i.get(p.type);if(d)for(let S=0;S<d.length;S++){let c=d[S],E=g?performance.now():0;try{let P=c.filter(p);if(P!==null){let b=c.handle(P,t);if(b){let A=f.get(c.ruleName)??[];Array.isArray(b)?A.push(...b):A.push(b),f.set(c.ruleName,A);}}}catch(P){r?.errorCollector?.record(createInfrastructureError("RuleExecutionError",{cause:`Rule ${c.ruleName} failed: ${P instanceof Error?P.message:String(P)}`,recoverable:true,phase:"engine",details:{ruleName:c.ruleName,errorName:P instanceof Error?P.name:void 0}}));}if(g){let P=performance.now()-E,b=m.get(c.ruleName);b&&(b.totalMs+=P,b.invocations++);}}}),t.template&&(n.length>0||s.length>0||l.length>0||u.length>0)){let p=analyzeTemplate(t.template),d=t.templateFilePath&&t.templateFileContent&&t.templateLocator?{...t,filePath:t.templateFilePath,fileContent:t.templateFileContent,locator:t.templateLocator}:t;te(p.expressions,n,d,f,m,g,r?.errorCollector),te(p.attributes,s,d,f,m,g,r?.errorCollector),te(p.blocks,l,d,f,m,g,r?.errorCollector),te([p],u,d,f,m,g,r?.errorCollector);}let C=[];for(let p of e)C.push({ruleName:p.name,failures:f.get(p.name)??[]});let w=performance.now()-a,h=[],x=t.typeChecker?5:2;if(w>x&&h.push(`Total traversal time ${w.toFixed(2)}ms exceeds budget ${x}ms`),g)for(let p of m.values()){if(p.invocations===0)continue;let d=p.totalMs/p.invocations;d>1&&h.push(`Rule ${p.ruleName} averages ${d.toFixed(2)}ms per invocation (threshold: 1ms)`);}return {results:C,performance:{traversalMs:w,nodesVisited:y,ruleTimings:Array.from(m.values()),cacheStats:getComponentCacheStats(),budgetViolations:h,hasBudgetViolations:h.length>0}}};var re=class{context;constructor(t){this.context=t;}async build(t,r,o){let a,i,n,s,l,[u,f]=await Promise.all([this.context.readFile(t),this.context.getProgram(t)]),m=new Locator(u);this.context.getTypeChecker&&(a=await this.context.getTypeChecker(t)),o&&(i=await this.context.getTemplate(t));let g=this.context.getProjectContext?.(),y=this.context.getAngularTypes?.();o&&!i&&g&&(n=this.resolveExternalTemplatePath(t,g))&&(i=await this.context.getTemplate(n),l=new Locator(s=await this.context.readFile(n)));let C=g?await this.buildCrossRef(t,i,g):void 0;return {filePath:t,fileContent:u,locator:m,program:f,typeChecker:a,template:i,templateFilePath:n,templateFileContent:s,templateLocator:l,options:r,project:g,crossRef:C,angularTypes:y}}resolveExternalTemplatePath(t,r){let o=t.endsWith(".component.ts")?t:r.templateToComponent.get(t);if(o)return r.componentGraph.get(o)?.templatePath}async buildCrossRef(t,r,o){let a,i,n,s=t.endsWith(".component.ts")?t:o.templateToComponent.get(t);if(!s)return;let l=o.componentGraph.get(s),u=l?.templatePath,f=l?.stylePaths??[],m=l?.specPath;try{let y=await this.getComponentSourceFile(s);y&&(a=(function(C){let w=new Set;for(let h of C.statements)if(k.isClassDeclaration(h))for(let x of h.members){let p=k.canHaveModifiers(x)?k.getModifiers(x):void 0;if(p&&p.some(S=>S.kind===k.SyntaxKind.PrivateKeyword||S.kind===k.SyntaxKind.ProtectedKeyword))continue;let d=x.name;d&&!k.isPrivateIdentifier(d)&&(k.isIdentifier(d)||k.isStringLiteral(d))&&w.add(d.text);}return w})(y),i=(function(C){let w=new Set;for(let h of C.statements)if(k.isClassDeclaration(h))for(let x of h.members){if(!k.isPropertyDeclaration(x)||!x.initializer||!x.name||k.isPrivateIdentifier(x.name))continue;let p=(function(d){let S=k.isAsExpression(d)||k.isSatisfiesExpression(d)?d.expression:d;if(!k.isCallExpression(S))return;let c=S.expression;return k.isIdentifier(c)?c.text:k.isPropertyAccessExpression(c)?k.isIdentifier(c.expression)&&yt.has(c.expression.text)?c.expression.text:c.name.text:void 0})(x.initializer);p&&ht.has(p)&&(k.isIdentifier(x.name)||k.isStringLiteral(x.name))&&w.add(x.name.text);}return w})(y));}catch{}let g=r;if(!g&&u)try{g=await this.context.getTemplate(u);}catch{}if(g)try{n=(function(y){let C=new Set,w=/\{\{([\s\S]*?)\}\}/g;for(let h of y.rootNodes)(function x(p){if(p&&typeof p=="object"){if(Array.isArray(p.attrs))for(let d of p.attrs){if((typeof d.name=="string"?d.name:"").startsWith("("))continue;let S=d.value;typeof S=="string"&&S&&ve(S,C);}if(typeof p.value=="string"&&p.value){let d;for(w.lastIndex=0;(d=w.exec(p.value))!==null;)ve(d[1],C);}if(Array.isArray(p.children))for(let d of p.children)x(d);}})(h);return C})(g);}catch{}return {componentPath:s,templatePath:u,stylePaths:f,specPath:m,publicMembers:a,signalMembers:i,templateReferences:n}}async getComponentSourceFile(t){let r=this.context.getTsSourceFile?.(t);if(r)return r;let o=await this.context.readFile(t);return k.createSourceFile(t,o,k.ScriptTarget.Latest,true)}},ht=new Set(["signal","computed","linkedSignal","input","model","toSignal","viewChild","viewChildren","contentChild","contentChildren"]),yt=new Set(["input","viewChild","contentChild"]),be=/\b([a-zA-Z_$][a-zA-Z0-9_$]*)\b/g;function ve(e,t){let r;for(be.lastIndex=0;(r=be.exec(e))!==null;)t.add(r[1]);}var Tt=new Set([".css",".scss",".sass",".less"]),U=e=>{let t=new LRUCache({max:128}),r=new LRUCache({max:64}),o=new LRUCache({max:64}),a=new LRUCache({max:64}),i=s=>{let l=t.get(s);if(l)return l;let u=Et(e,s);return t.set(s,u),u},n=s=>{let l=r.get(s);if(l)return l;let u=i(s).then(f=>parseTs(f,s).program);return r.set(s,u),u};return {rootDir:e,readFile:i,getProgram:n,getTemplate:s=>{let l=o.get(s);if(l)return l;let u=Pt(s,i,n);return o.set(s,u),u},getStyle:s=>{let l=a.get(s);if(l)return l;let u=R.extname(s).toLowerCase();if(!Tt.has(u)){let m=Promise.resolve(void 0);return a.set(s,m),m}let f=i(s).then(m=>parseCss(m,s));return a.set(s,f),f},evict:s=>{t.delete(s),r.delete(s),o.delete(s),a.delete(s);},dispose:()=>{t.clear(),r.clear(),o.clear(),a.clear();}}},Et=async(e,t)=>{try{return await readFile(R.resolve(e,t),"utf-8")}catch(r){let o=r instanceof Error?r.message:String(r);throw Error(`Cannot read file: ${t}. ${o}`)}},Pt=async(e,t,r)=>{let o=await bt(e,t,r);if(o&&o.content)return parseHtml(o.content,o.startOffset)},bt=async(e,t,r)=>{let o=R.extname(e);if(o===".html")return {content:await t(e),startOffset:0};if(o===".ts"){let a=extractTemplateFromProgram(await r(e));return a.content?a:null}return null};var Y=(e,t,r)=>{let o=performance.now()-t,a=e.flatMap(l=>l.failures),i=new Set(a.map(l=>l.filePath)),n=0,s=0;for(let l of a)vt(l.severity)?n++:At(l.severity)&&s++;return {totalFiles:i.size,totalErrors:n,totalWarnings:s,duration:o,cacheHitRate:r}},vt=e=>e==="error",At=e=>e==="warn";var G=(e,t,r,o,a)=>{let i=0,n=0;for(let s of r)for(let l of s.failures)l.severity==="error"?i++:l.severity==="warn"&&n++;return {filePath:e,taskCount:t,issueCount:i+n,errorCount:i,warningCount:n,duration:o,typeAware:a}},pe=e=>!!e&&typeof e=="object"&&e.kind==="file-progress",ue=e=>!!e&&typeof e=="object"&&e.kind==="file-progress"&&typeof e.filePath=="string"&&typeof e.taskCount=="number"&&typeof e.issueCount=="number"&&typeof e.errorCount=="number"&&typeof e.warningCount=="number"&&typeof e.duration=="number";var Ae=()=>{throw Error("[ngcompass] Rule executor not configured. Call configureRuleExecutor(executeBatchedNewEngineRules, isNewEngineRule) before running analysis.")},Fe=()=>false,Ft=(e,t)=>{Ae=e,Fe=t;},Ne=()=>Ae,_e=()=>Fe;var q=async(e,t,r)=>{if(e.length===0)return [];let o=e[0].filePath,a=new re(t),i=new Map,n=[];for(let s of e){if(!_e()(s.ruleName)){debug("engine",`Skipping task ${s.taskId}: Rule "${s.ruleName}" not registered in engine.`),n.push({ruleName:s.ruleName,taskId:s.taskId,failures:[]});continue}let l=It(s,r);if(l===null){n.push({ruleName:s.ruleName,taskId:s.taskId,failures:[]});continue}let u=i.get(l)??Rt(s.options);u.ruleNames.push(s.ruleName),u.taskIds.push(s.taskId),u.severities.set(s.ruleName,s.severity),i.set(l,u);}for(let s of i.values()){let l=await Mt(s,e,o,a,r);n.push(...l);}return n},Rt=e=>({options:e,ruleNames:[],taskIds:[],severities:new Map}),It=(e,t)=>{try{return stableSerialize(e.options||{})}catch(r){let o=r instanceof SerializationError?r.message:String(r);return debug("engine",`Skipping task ${e.taskId}: failed to serialize options \u2014 ${o}`),t?.record(createInfrastructureError("SerializationError",{cause:o,phase:"engine",recoverable:true})),null}},Mt=async(e,t,r,o,a)=>{try{let i=new Set(e.taskIds),n=t.some(u=>i.has(u.taskId)&&u.inputs.template?.needsAst),s=await o.build(r,e.options,n),l=Ne()(e.ruleNames,s);return $t(e,l)}catch(i){let n=i instanceof Error?i.message:String(i);return debug("engine",`Failed to execute batch for ${r}: ${n}`),a?.record(createInfrastructureError("ParseError",{filePath:r,cause:n,phase:"engine",recoverable:true})),e.ruleNames.map((s,l)=>({ruleName:s,failures:[],taskId:e.taskIds[l]}))}},$t=(e,t)=>{let r=new Map;for(let a=0;a<e.ruleNames.length;a++){let i=e.ruleNames[a],n=r.get(i);n?n.ids.push(e.taskIds[a]):r.set(i,{ids:[e.taskIds[a]],cursor:0});}let o=[];for(let a of t){let i=e.severities.get(a.ruleName),n=i?{...a,failures:a.failures.map(l=>({...l,severity:i}))}:a,s=r.get(a.ruleName);s&&s.cursor<s.ids.length?o.push({...n,taskId:s.ids[s.cursor++]}):o.push(n);}return o};function de(e,t,r,o){let a=performance.now(),i=(function(h,x,p){var d;let S=new Set;for(let E of h)S.add(R.resolve(x,E));let c=(d=x).endsWith(R.sep)?d:d+R.sep;for(let E of p.getSourceFiles())!E.isDeclarationFile&&E.fileName.startsWith(c)&&S.add(E.fileName);return S})(t,r,e),{importGraph:n,reverseImportGraph:s,externalDeps:l}=(function(h,x){let p=h.getCompilerOptions(),d=k.createModuleResolutionCache(h.getCurrentDirectory(),k.sys.useCaseSensitiveFileNames?P=>P:P=>P.toLowerCase(),p),S=new Map,c=new Map,E=new Map;for(let P of x)S.set(P,new Set),c.set(P,new Set);for(let P of h.getSourceFiles()){if(P.isDeclarationFile||!x.has(P.fileName))continue;let b=P.fileName;for(let A of (function(I){let v=[];return k.forEachChild(I,function _(T){k.isImportDeclaration(T)&&k.isStringLiteral(T.moduleSpecifier)||k.isExportDeclaration(T)&&T.moduleSpecifier&&k.isStringLiteral(T.moduleSpecifier)?v.push(T.moduleSpecifier.text):(k.isCallExpression(T)&&T.expression.kind===k.SyntaxKind.ImportKeyword&&T.arguments.length>0&&k.isStringLiteralLike(T.arguments[0])&&v.push(T.arguments[0].text),k.forEachChild(T,_));}),v})(P)){let I=k.resolveModuleName(A,b,p,k.sys,d),v=I.resolvedModule?.resolvedFileName;if(v&&x.has(v)){S.get(b).add(v);let _=c.get(v);_||(_=new Set,c.set(v,_)),_.add(b);}else {let _=(function(T){if(T.startsWith(".")||R.isAbsolute(T))return null;if(T.startsWith("@")){let M=T.indexOf("/",1);if(M===-1)return null;let $=T.indexOf("/",M+1);return $===-1?T:T.slice(0,$)}let W=T.indexOf("/");return W===-1?T:T.slice(0,W)})(A);if(_){let T=E.get(b);T||(T=new Set,E.set(b,T)),T.add(_);}}}}return {importGraph:S,reverseImportGraph:c,externalDeps:E}})(e,i),u=(function(h,x){let p=new Set;for(let d of h.getSourceFiles()){if(d.isDeclarationFile||!x.has(d.fileName))continue;let{statements:S}=d;S.length!==0&&S.every(c=>k.isExportDeclaration(c)&&c.moduleSpecifier!=null)&&p.add(d.fileName);}return p})(e,i),f=o??(function(h,x){let p=new Map,d=[".scss",".sass",".css",".less"];for(let S of h){if(!S.endsWith(".component.ts"))continue;let c=R.dirname(S),E=R.basename(S,".ts"),P=R.join(c,E+".html"),b=h.has(P)?P:void 0,A=[];for(let _ of d){let T=R.join(c,E+_);h.has(T)&&A.push(T);}if(!b||A.length===0){let _=(function(T,W,M,$){let ee,Ce=T.getSourceFile(W);if(!Ce)return {templatePath:void 0,stylePaths:[]};let Se=(function(O){for(let z of O.statements){if(!k.isClassDeclaration(z))continue;let D=k.canHaveDecorators(z)?k.getDecorators(z):void 0;if(D)for(let j of D){let B=j.expression;if(!k.isCallExpression(B)||!k.isIdentifier(B.expression)||B.expression.text!=="Component")continue;let ce=B.arguments[0];if(ce&&k.isObjectLiteralExpression(ce))return ce}}})(Ce);if(!Se)return {templatePath:void 0,stylePaths:[]};let le=[];for(let O of Se.properties){if(!k.isPropertyAssignment(O)||!k.isIdentifier(O.name))continue;let z=O.name.text;if(z==="templateUrl"){let D=fe(O.initializer);if(D){let j=R.resolve(M,D);$.has(j)&&(ee=j);}continue}if(z==="styleUrl"){let D=fe(O.initializer);if(D){let j=R.resolve(M,D);$.has(j)&&le.push(j);}continue}if(z==="styleUrls"&&k.isArrayLiteralExpression(O.initializer))for(let D of O.initializer.elements){let j=fe(D);if(!j)continue;let B=R.resolve(M,j);$.has(B)&&le.push(B);}}return {templatePath:ee,stylePaths:le}})(x,S,c,h);!b&&_.templatePath&&(b=_.templatePath),A.length===0&&_.stylePaths.length>0&&A.push(..._.stylePaths);}let I=R.join(c,E+".spec.ts"),v=h.has(I)?I:void 0;p.set(S,{tsPath:S,templatePath:b,stylePaths:A,specPath:v});}return p})(i,e),m=(function(h){let x=new Map;for(let[p,d]of h)d.templatePath&&x.set(d.templatePath,p);return x})(f),{ngModuleMap:g,standaloneComponents:y,classToFile:C}=(function(h,x){let p=new Map,d=new Set,S=(function(c,E){let P=new Map;for(let b of c.getSourceFiles())if(!b.isDeclarationFile&&E.has(b.fileName))for(let A of b.statements){if(!k.isClassDeclaration(A)||!A.name)continue;(k.canHaveModifiers(A)?k.getModifiers(A):void 0)?.some(v=>v.kind===k.SyntaxKind.ExportKeyword)&&P.set(A.name.text,b.fileName);}return P})(h,x);for(let c of h.getSourceFiles())if(!c.isDeclarationFile&&x.has(c.fileName))for(let E of c.statements){if(!k.isClassDeclaration(E))continue;let P=k.canHaveDecorators(E)?k.getDecorators(E):void 0;if(P?.length)for(let b of P){let A=(function(_){let T=_.expression;if(!k.isCallExpression(T))return;let W=T.expression;if(!k.isIdentifier(W))return;let M=T.arguments[0],$=M&&k.isObjectLiteralExpression(M)?M:void 0;return {name:W.text,arg:$}})(b);if(!A)continue;let{name:I,arg:v}=A;if(I==="NgModule"){v&&p.set(c.fileName,{filePath:c.fileName,declarations:new Set(K(v,"declarations")),imports:new Set(K(v,"imports")),exports:new Set(K(v,"exports")),providers:new Set(K(v,"providers")),isStandalone:false});break}if(I==="Component"){v&&Ie(v,"standalone")&&(d.add(c.fileName),p.set(c.fileName,{filePath:c.fileName,declarations:new Set,imports:new Set(v?K(v,"imports"):[]),exports:new Set,providers:new Set(v?K(v,"providers"):[]),isStandalone:true}));break}if(I==="Directive"||I==="Pipe"){v&&Ie(v,"standalone")&&d.add(c.fileName);break}}}return {ngModuleMap:p,standaloneComponents:d,classToFile:S}})(e,i),w=(function(h){let x=0;for(let p of h.values())x+=p.size;return x})(n);return debug("engine",`ProjectContext built in ${(performance.now()-a).toFixed(2)}ms \u2014 ${i.size} files, ${w} import edges, ${u.size} barrels, ${l.size} files with ext deps, ${f.size} components, ${m.size} template\u2194component links, ${g.size} NgModules/standalone, ${y.size} standalone`),{importGraph:n,reverseImportGraph:s,ngModuleMap:g,standaloneComponents:y,classToFile:C,componentGraph:f,projectFiles:i,rootDir:r,barrelFiles:u,externalDeps:l,templateToComponent:m}}function fe(e){if(k.isStringLiteralLike(e)||k.isNoSubstitutionTemplateLiteral(e))return e.text}function K(e,t){for(let r of e.properties){if(!k.isPropertyAssignment(r)||!k.isIdentifier(r.name)||r.name.text!==t)continue;let o=r.initializer;if(!k.isArrayLiteralExpression(o))break;let a=[];for(let i of o.elements)a.push(...(function n(s){return k.isIdentifier(s)?[s.text]:k.isPropertyAccessExpression(s)||k.isCallExpression(s)?n(s.expression):[]})(i));return a}return []}function Ie(e,t){for(let r of e.properties)if(k.isPropertyAssignment(r)&&k.isIdentifier(r.name)&&r.name.text===t)return r.initializer.kind===k.SyntaxKind.TrueKeyword;return false}var jt=new Set(["Signal","WritableSignal","InputSignal","ModelSignal","OutputEmitterRef"]),Lt=new Set(["WritableSignal","InputSignal","ModelSignal"]),Wt=new Set(["Subject","BehaviorSubject","ReplaySubject","AsyncSubject"]);function ge(e){if(!e)return Ot;let t=new Map,r=(a,i)=>{if(!a)return false;let n=t.get(i);n||(n=new WeakMap,t.set(i,n));let s=n.get(a);if(s!==void 0)return s;let l=(function(u,f){let m=u.getDeclarations();if(!m||m.length===0)return false;let g=`/node_modules/${f}/`;for(let y of m)if(y.getSourceFile().fileName.replace(Me,"/").includes(g))return true;return false})(a,i);return n.set(a,l),l},o=(a,i,n)=>{if(!a)return false;let s=a.aliasSymbol??a.symbol;return !!s&&!!i.has(s.name)&&r(s,n)};return {isFromPackage:r,isFromAngularCore:a=>r(a,"@angular/core"),isSignal:a=>o(a,jt,"@angular/core"),isWritableSignal:a=>o(a,Lt,"@angular/core"),isObservable:a=>{if(!a)return false;let i=a.aliasSymbol??a.symbol;return !!i&&i.name==="Observable"&&r(i,"rxjs")},isSubjectLike:a=>o(a,Wt,"rxjs"),isHttpClient:a=>{if(!a)return false;let i=a.aliasSymbol??a.symbol;return !!i&&i.name==="HttpClient"&&r(i,"@angular/common")},isInjectionToken:a=>{if(!a)return false;let i=a.aliasSymbol??a.symbol;return !!i&&i.name==="InjectionToken"&&r(i,"@angular/core")},isEventEmitter:a=>{if(!a)return false;let i=a.aliasSymbol??a.symbol;return !!i&&i.name==="EventEmitter"&&r(i,"@angular/core")},isChangeDetectorRef:a=>{if(!a)return false;let i=a.aliasSymbol??a.symbol;return !!i&&i.name==="ChangeDetectorRef"&&r(i,"@angular/core")},isInjectableClass:a=>!!a&&(!!(function(i){let n=i.getDeclarations()?.[0];if(!n||!k.isClassDeclaration(n)||!k.canHaveDecorators(n))return false;let s=k.getDecorators(n);if(!s)return false;for(let l of s){let u=l.expression,f=k.isCallExpression(u)?u.expression:u;if(k.isIdentifier(f)&&f.text==="Injectable")return true}return false})(a)||(function(i){let n=i.getDeclarations();if(!n||n.length===0)return false;for(let s of n)if(s.getSourceFile().fileName.replace(Me,"/").includes("/node_modules/@angular/"))return true;return false})(a))}}var Me=/\\/g,Ot={isFromPackage:()=>false,isFromAngularCore:()=>false,isSignal:()=>false,isWritableSignal:()=>false,isObservable:()=>false,isSubjectLike:()=>false,isHttpClient:()=>false,isInjectionToken:()=>false,isEventEmitter:()=>false,isChangeDetectorRef:()=>false,isInjectableClass:()=>false};var he=(e,t=[],r,o={})=>{var a;let i,n,s,l=U(e);debug("engine","Initializing Type-Aware Context (ts.createProgram)...");let u=performance.now(),{program:f}=(function(C,w,h,x){var p;let d,S,c=h?.tsconfigRootDir?R__default.resolve(C,h.tsconfigRootDir):C,E=h?.project?R__default.resolve(c,h.project):k.findConfigFile(c,k.sys.fileExists,"tsconfig.json");if(!E)return {program:void 0};let P=k.readConfigFile(E,k.sys.readFile),b=k.parseJsonConfigFileContent(P.config,k.sys,c),A=(x.programRootFiles??w).filter(ye),I=A.length>0?A:b.fileNames,v={...b.options,...zt},_=k.createProgram({rootNames:I,options:v,host:(p=v,d=k.createCompilerHost(p,true),S=k.createModuleResolutionCache(d.getCurrentDirectory(),T=>d.getCanonicalFileName(T),p),d.resolveModuleNameLiterals=(T,W,M,$)=>T.map(ee=>k.resolveModuleName(ee.text,W,$,d,S,M)),d)});return debug("engine",`Program rootNames: ${I.length} (tsconfig had ${b.fileNames.length})`),{program:_}})(e,t,r,o);f?(function(C,w){let h=0,x=0;for(let d of C.getSourceFiles())d.isDeclarationFile||Bt.test(d.fileName)?h++:x++;let p=(process.memoryUsage().heapUsed/1048576).toFixed(0);debug("engine",`Program diagnostics: ${x} project file(s), ${h} lib/declaration file(s), built in ${w.toFixed(0)}ms, heapUsed ${p}MB`);})(f,performance.now()-u):debug("engine","Could not find tsconfig.json; TypeChecker and ProjectContext will be unavailable.");let m=f?.getTypeChecker();m&&(a=m,i=new WeakMap,n=a.getTypeAtLocation.bind(a),a.getTypeAtLocation=C=>{let w=i.get(C);if(w)return w;let h=n(C);return i.set(C,h),h});let g=ge(f);if(f&&o.buildProjectContext!==false)try{s=de(f,t,e);}catch(C){let w=C instanceof Error?C.message:String(C);debug("engine",`ProjectContext build failed (non-fatal): ${w}`);}else f&&debug("engine","Skipping ProjectContext build for type-checker-only chunk");let y=f;return {...l,getTypeChecker:C=>Promise.resolve(m),getProjectContext:()=>s,getTsSourceFile:C=>y?.getSourceFile(C),getAngularTypes:()=>g,warmup:()=>(debug("engine",`Type-aware context ready: ${y?`ts.Program with ${y.getSourceFiles().length} source files`:"no tsconfig found, TypeChecker unavailable"}`),Promise.resolve()),dispose:()=>{s=void 0,m=void 0,g=void 0,y=void 0,l.dispose();}}},ye=e=>(e.endsWith(".ts")||e.endsWith(".tsx"))&&!e.endsWith(".d.ts"),zt={skipLibCheck:true,skipDefaultLibCheck:true,noEmit:true,declaration:false,declarationMap:false,sourceMap:false,inlineSourceMap:false,incremental:false,composite:false},Bt=/[\\/]node_modules[\\/]/;var De=()=>{let e=globalThis.gc;return typeof e=="function"&&(e(),true)},Ht=()=>{let{heapUsed:e}=process.memoryUsage(),{heap_size_limit:t}=Ut.getHeapStatistics();return {usedBytes:e,limitBytes:t}},je=()=>{let{usedBytes:e,limitBytes:t}=Ht();return t>0?e/t:0},se=e=>!(je()<e)&&De();var Ue=async(e,t,r,o,a,i)=>{let n,{Worker:s}=await import('worker_threads'),l=o??Math.max(2,Kt.cpus().length),u=await Jt();if(!u)return debug("workers","Execution worker not found, falling back to local execution."),Oe(e,t,r,a??l,i);let f=Qt(e,l),m=[],g=0,y=()=>{g++,debug("workers",`Worker progress: ${g}/${l} complete`);},C=f.map(x=>Zt(s,u,t,x,m,y,i));try{n=await Promise.all(C);}catch(x){var w;return await Promise.allSettled(m.map(p=>p.terminate())),debug("workers",`Worker execution failed, retrying locally with one file batch at a time: ${(w=x)instanceof Error?w.message:String(w)}`),Oe(e,t,r,1,i)}let h=n.flat();return Ok({results:h,parseErrors:[],stats:Y(h,r)})},Zt=(e,t,r,o,a,i,n)=>new Promise((s,l)=>{let u=false,f=new e(t,{workerData:{rootDir:r,tasks:o}});a.push(f);let m=()=>{clearTimeout(g),f.removeAllListeners();},g=setTimeout(()=>{u||(u=true,m(),i(),f.terminate(),l(Error(`Worker timed out after ${6e4/1e3}s`)));},6e4);f.on("message",y=>{pe(y)?n?.(y):u||(u=true,m(),y.errors&&y.errors.length>0&&y.errors.forEach(C=>{debug("workers",`Worker failed task ${C.task.taskId}: ${C.error}`);}),i(),s(y.results));}),f.on("error",y=>{u||(u=true,m(),i(),l(y instanceof Error?y:Error(String(y))));}),f.on("exit",y=>{if(u||y===0)return;u=true,m();let C=createInfrastructureError("WorkerCrash",{cause:`Worker exited with code ${y}`,phase:"engine",recoverable:true,details:{exitCode:y}});debug("workers",`Worker crashed: ${C.cause}`),l(Error(C.cause));});}),Oe=async(e,t,r,o,a)=>{let i=U(t),n=Xt(o),s=groupTasksByFile(e),l=(await Promise.all(Array.from(s.values()).map(u=>n(async()=>{let f=u[0]?.filePath,m=performance.now(),g=await q(u,i);return f&&(i.evict(f),a?.(G(f,u.length,g,performance.now()-m))),g})))).flat();return Ok({results:l,parseErrors:[],stats:Y(l,r)})},Jt=async()=>{let e=dirname(fileURLToPath(import.meta.url));try{let t=createRequire(import.meta.url).resolve("@ngcompass/rules/execution-worker");if(existsSync(t))return t}catch{}return [join(e,"..","..","rules","dist","execution-worker.js"),join(e,"..","..","rules","dist","execution-worker.cjs")].find(t=>existsSync(t))??null},Qt=(e,t)=>{let r=Array.from(groupTasksByFile(e).values()).sort((i,n)=>n.length-i.length),o=Array.from({length:t},()=>[]),a=Array(t).fill(0);for(let i of r){let n=0,s=a[0];for(let l=1;l<t;l++)a[l]<s&&(s=a[l],n=l);o[n].push(...i),a[n]+=i.length;}return o};var xe=Number.MAX_SAFE_INTEGER;function Ve(e){if(!e||typeof e!="object"||typeof e.ruleName!="string"||!Array.isArray(e.failures))return false;for(let t of e.failures)if(!t||typeof t!="object"||typeof t.filePath!="string"||typeof t.line!="number"||typeof t.column!="number"||typeof t.severity!="string")return false;return true}var Ka=async(e,t)=>{try{if(e.precomputedAnalysis){if((function(c){if(!c||typeof c!="object"||!Array.isArray(c.results)||!Array.isArray(c.parseErrors)||!c.stats||typeof c.stats!="object")return !1;let E=c.stats;return typeof E.totalFiles=="number"&&typeof E.totalErrors=="number"&&typeof E.totalWarnings=="number"&&typeof E.duration=="number"})(e.precomputedAnalysis))return debug("engine","Returning precomputed analysis from cache (global hash match)"),Ok(e.precomputedAnalysis);debug("engine","Precomputed analysis failed schema validation \u2014 discarding stale cache entry and re-running analysis");}let r=performance.now(),{tasks:o,skippedTasks:a,cachedResults:i}=e,n=Kt.cpus().length,s=Math.max(1,Math.min(4,n-1)),l=Math.max(1,Math.min(t.maxWorkers??s,n)),u=t.parallelThreshold??150,f=o.filter(c=>!!c.needsTypeChecker||!!c.needsProjectContext),m=o.filter(c=>!c.needsTypeChecker&&!c.needsProjectContext);if(debug("engine",`workerTasks: ${m.length}, typeAwareTasks: ${f.length}`),f.length>0&&!t.skipTypeCheck){let c=groupTasksByFile(f).size;dr(c,t.onNotice);}let g=o.length+a.length,y=a.length,C=c=>{y=Math.min(y+c,g),t.onProgress?.(y,g);};a.length>0&&t.onProgress?.(y,g);let w=[];if(m.length>0)if(m.length>u){debug("engine",`Running analysis on ${m.length} syntax-only tasks using workers (max: ${l})...`);let c=await Ue(m,t.rootDir,r,l,void 0,t.onFileProgress);if(!c.ok)return c;w=c.data.results,C(m.length);}else debug("engine",`Running analysis on ${m.length} syntax-only tasks locally with batching (concurrency: ${l})...`),w=await Xe(m,t.rootDir,l,!1,t.errorCollector,void 0,void 0,!0,void 0,C,t.onFileProgress);if(f.length>0&&!t.skipTypeCheck){let c=mr(t.typeAwareFileConcurrency,l),E=await cr(f,t.rootDir,c,t,C,t.onFileProgress);w=[...w,...E];}else f.length>0&&t.skipTypeCheck&&debug("engine",`Skipping ${f.length} type-aware tasks (--skip-type-check)`);let h=await Er(a,i,t.cache),x=[...w,...h],p=o.length+a.length,d=p>0?h.length/p:void 0,S={results:x,parseErrors:[],stats:Y(x,r,d)};if(t.cache&&e.globalHash&&S.results.length<=2e4){debug("engine","Caching full analysis result for global hash..."),t.debug&&(debug("engine",`Analysis Results: ${S.results.length} items`),S.results.length>0&&debug("engine",`Sample item keys: ${Object.keys(S.results[0]).join(", ")}`));try{await t.cache.analysis.set(e.globalHash,S);}catch(c){let E=c instanceof Error?c.message:String(c);debug("engine",`Failed to cache analysis result: ${E}`),t.errorCollector?.record(createInfrastructureError("IOError",{cause:`Failed to write analysis cache: ${E}`,phase:"engine",recoverable:!0}));}}else t.cache&&e.globalHash&&debug("engine",`Skipping full analysis cache: ${S.results.length} results exceeds 20000 result safety limit`);return Ok(S)}catch(r){return Err(r instanceof Error?r:Error(String(r)))}},Xe=async(e,t,r,o,a,i,n,s=true,l,u,f)=>{let m=o?he(t,i??[],n,{buildProjectContext:s,programRootFiles:l}):U(t);o&&(await m.warmup(),debug("engine",`Phase 1 complete \u2014 TypeScript Program ready. Starting Phase 2: ${r} concurrent file batches.`));let g=groupTasksByFile(e);debug("engine",`Grouped ${e.length} tasks into ${g.size} file batches`);let y=Xt(r),C=await Promise.all(Array.from(g.values()).map(w=>y(async()=>{let h=w[0]?.filePath,x=performance.now();try{let p=await q(w,m);return m.evict(h),u?.(w.length),h&&f?.(G(h,w.length,p,performance.now()-x,o)),p}catch(p){let d=p instanceof Error?p.message:String(p);return m.evict(h),u?.(w.length),h&&f?.(G(h,w.length,[],performance.now()-x,o)),a?.record(createInfrastructureError("IOError",{filePath:h,cause:`Batch execution failed: ${d}`,phase:"engine",recoverable:true})),[]}})));return m.dispose(),C.flat().filter(w=>w!==null)},cr=async(e,t,r,o,a,i)=>{let n=groupTasksByFile(e);if(Ze(e).length===0)return debug("engine",`Type-aware: no TypeScript roots among ${n.size} files; nothing to type-check`),[];let s=e.some(f=>!!f.needsProjectContext),l=Array.from(n.entries()),u=[];for(let f=0;f<l.length;f+=xe){let m=l.slice(f,f+xe),g=Je(Math.floor(f/xe)+1,m,s),y=o.files&&o.files.length>0?o.files:void 0;debug("engine",`Type-aware chunk ${g.index}: ${g.tasks.length} tasks across ${g.files.length} files`),u=[...u,...await pr(g,t,y,r,o,i)],a?.(g.tasks.length);}return u},pr=async(e,t,r,o,a,i)=>{let n=[],s=new Set,l=e;for(;l;){let u=l,f=ur(r,u);try{let m=await yr(u.tasks,t,f,u.programRootFiles,u.buildProjectContext,o,a,i);n.push(...m),se(.8);break}catch(m){let g=m instanceof J?m:void 0;if(g)for(let w of(n.push(...g.partialResults),g.completedFiles))s.add(w);let y=Ye(e,s);if(!y)return n;let C=!!g&&g.completedFiles.size>0;if(o!==1&&C)l=y;else {let w=y.files[0];s.add(w),fr(w,t,m,a),l=Ye(e,s);}se(.8);}}return n},ur=(e,t)=>t.buildProjectContext&&e?e:t.files,mr=(e,t)=>Math.max(1,Math.min(e==null||Number.isNaN(e)?1:Math.floor(e),t,8)),Ze=e=>{let t=new Set;for(let r of e){let o=r.inputs.typescript.path;ye(o)&&t.add(o);}return [...t]},Je=(e,t,r)=>{let o=t.flatMap(([,a])=>a);return {index:e,tasks:o,files:t.map(([a])=>a),programRootFiles:Ze(o),buildProjectContext:r}},Ye=(e,t)=>{if(t.size===0)return e;let r=Array.from(groupTasksByFile(e.tasks).entries()).filter(([o])=>!t.has(o));return r.length===0?null:Je(e.index,r,e.buildProjectContext)},fr=(e,t,r,o)=>{let a=r instanceof J?r.reason:"crash",i=relative(t,e)||e,n=`Skipped ${i} (${a==="timeout"?"type-check timed out":"type-check failed"})`;o.onFileSkipped?.(e),o.onNotice?.(n),o.errorCollector?.record(createInfrastructureError("WorkerCrash",{filePath:e,cause:n,phase:"engine",recoverable:true}));},dr=(e,t)=>{if(!t)return;let r=Ut.getHeapStatistics().heap_size_limit/1073741824;if(r>=4||e<600)return;let o=r.toFixed(1),a=e.toLocaleString();t(`Large type-aware workload: ${a} files on a ${o} GB heap built into a single TypeScript program. If analysis runs out of memory, raise it with NODE_OPTIONS=--max-old-space-size=8192 or run with --skip-type-check.`);},gr=["--max-old-space-size","--max-semi-space-size"],ie="--max-old-space-size",qe=e=>e.split("_").join("-"),hr=(e,t)=>{let r=[],o=t!==void 0&&qe(t).includes(ie);for(let i=0;i<e.length;i++){let n=e[i];if(n==="--expose-gc")continue;let s=qe(n),l=gr.find(u=>s===u||s.startsWith(`${u}=`));l&&(r.push(n),(s===ie||s.startsWith(`${ie}=`))&&(o=true),s===l&&i+1<e.length&&r.push(e[++i]));}let a=["--expose-gc",...r];return o||a.push(`${ie}=4096`),a},J=class extends Error{reason;partialResults;completedFiles;constructor(t,r,o,a){super(t),this.name="TypeAwareChildFailure",this.reason=r,this.partialResults=o,this.completedFiles=a;}},oe=(e,t,r)=>e!==void 0?e:t===0?3e4:Math.min(3e4,Math.max(1e3,8*r)),yr=async(e,t,r,o,a,i,n,s)=>{let l=await xr();return l?new Promise((u,f)=>{let m,g,y=fork(l,[],{cwd:t,execArgv:hr(process.execArgv,process.env.NODE_OPTIONS),stdio:["ignore","pipe","pipe","ipc"]}),C=false,w=0,h=0,x=[],p=new Set,d=(c,E)=>{C||(C=true,clearTimeout(m),y.kill(),f(new J(c,E,x.slice(),p)));},S=(c,E)=>{clearTimeout(m),m=setTimeout(()=>{let P=g?` while analyzing "${g}"`:"";d(`Type-aware ${E} exceeded ${c/1e3}s${P}`,"timeout");},c);};S(6e5,"program build"),y.stdout?.on("data",c=>debug("engine",`[type-aware-child] ${String(c).trim()}`)),y.stderr?.on("data",c=>debug("engine",`[type-aware-child:stderr] ${String(c).trim()}`)),y.on("message",c=>{if(wr(c))return void S(oe(n.typeAwarePerFileTimeoutMs,w,h),"file analysis");if(Cr(c)){g=c.filePath,S(oe(n.typeAwarePerFileTimeoutMs,w,h),"file analysis");return}if(ue(c)){w++,h=Math.max(h,c.duration),s?.(c),S(oe(n.typeAwarePerFileTimeoutMs,w,h),"file analysis");return}if(kr(c)){x.push(...c.results),p.add(c.filePath),g===c.filePath&&(g=void 0),S(oe(n.typeAwarePerFileTimeoutMs,w,h),"file analysis");return}if(Sr(c)){if(C)return;C=true,clearTimeout(m),u(x);return}Tr(c)&&d(c.error,"reported");}),y.on("error",c=>{d(c.message,"spawn");}),y.on("exit",c=>{d(`Type-aware child process exited before completion with code ${c}`,"crash");}),y.send({rootDir:t,tasks:e,files:r,programRootFiles:o,parserOptions:n.parserOptions,buildProjectContext:a,fileConcurrency:i});}):(debug("engine","Type-aware child worker not found; falling back to in-process execution"),Xe(e,t,i,true,n.errorCollector,r,n.parserOptions,a,o,void 0,s))},xr=async()=>{let e=dirname(fileURLToPath(import.meta.url));try{let t=createRequire(import.meta.url).resolve("@ngcompass/rules/type-aware-worker");if(existsSync(t))return t}catch{}for(let t of [join(e,"..","..","rules","dist","type-aware-worker.js"),join(e,"..","..","rules","dist","type-aware-worker.cjs")])if(existsSync(t))return t;return null},wr=e=>!!e&&typeof e=="object"&&e.kind==="ready",Cr=e=>!!e&&typeof e=="object"&&e.kind==="file-start"&&typeof e.filePath=="string",Sr=e=>!!e&&typeof e=="object"&&e.kind==="complete",kr=e=>!!e&&typeof e=="object"&&e.kind==="file-result"&&typeof e.filePath=="string"&&Array.isArray(e.results),Tr=e=>!!e&&typeof e=="object"&&e.kind==="error"&&typeof e.error=="string",Er=async(e,t,r)=>{if(e.length===0)return [];debug("engine",`Retrieving results for ${e.length} skipped tasks...`);let o=[],a=[];if(t)for(let i of e){let n=t.get(i.taskId);n&&Ve(n)?o.push(n):a.push(i);}else a.push(...e);if(a.length>0&&r){debug("engine",`Fetching ${a.length} results from cache service...`);let i=a.map(s=>s.taskId),n=await r.results.getMany(i);for(let s of a){let l=n.get(s.taskId);l&&Ve(l)&&o.push(l);}}return debug("engine",`Retrieved ${o.length} results from cache`),o};var Qe=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],et=class{frameIndex=0;interval=null;message="";start(t){this.message=t,this.interval||(this.frameIndex=0,Q.stderr.write("\x1B[?25l"),this.interval=setInterval(()=>{Q.stderr.write(`\r${Qe[this.frameIndex]} ${this.message}`),this.frameIndex=(this.frameIndex+1)%Qe.length;},80));}update(t){this.message=t;}stop(t){this.interval&&(clearInterval(this.interval),this.interval=null),Q.stderr.write("\r\x1B[K"),t&&Q.stderr.write(t+` | ||
| `),Q.stderr.write("\x1B[?25h");}};export{st as BUDGET_MS_PER_FILE_WITHOUT_TYPES,it as BUDGET_MS_PER_FILE_WITH_TYPES,rt as MIN_WORKER_COUNT,re as RuleContextFactory,at as SPINNER_FRAME_INTERVAL_MS,tt as STREAM_TO_NODE_TYPE,et as Spinner,Te as WORKER_TIMEOUT_MS,G as buildFileProgress,de as buildProjectContext,ke as buildVisitorMap,Y as calculateStats,oe as computeAdaptiveFileBudget,Ft as configureRuleExecutor,U as createAnalysisContext,ge as createAngularTypeIndex,br as createAnyAngularClassRule,Nr as createCallExpressionRule,Pr as createComponentRule,vr as createDecoratedPropertyRule,_r as createNewExpressionRule,Fr as createTemplateAttributeRule,Rr as createTemplateBlockRule,Ar as createTemplateExpressionRule,Ir as createTemplateRule,he as createTypeAwareAnalysisContext,q as executeBatchedTasks,je as getHeapPressureRatio,ue as isAnalysisFileProgress,pe as isWorkerFileProgress,De as requestGarbageCollection,se as requestGarbageCollectionUnderPressure,hr as resolveChildExecArgv,Ka as runAnalysis,Ue as runAnalysisParallel,Or as runSinglePassAnalysis};//# sourceMappingURL=index.js.map | ||
| import {toImportDeclarationStream,toNewExpressionStream,toCallExpressionStream,toDecoratedPropertyStream,toAnyAngularClassStream,toAngularClassStream,resetComponentCacheStats,walkProgram,analyzeTemplate,getComponentCacheStats,parseCss,parseHtml,extractTemplateFromProgram,parseTs}from'@ngcompass/ast';import {isDebugEnabled,createInfrastructureError,Locator,debug,stableSerialize,SerializationError,Ok,Err}from'@ngcompass/common';import k from'typescript';import {fork}from'child_process';import {existsSync}from'fs';import {createRequire}from'module';import Vt from'os';import*as R from'path';import R__default,{dirname,join,relative}from'path';import {fileURLToPath}from'url';import Ht from'v8';import {groupTasksByFile}from'@ngcompass/planner';import Zt from'p-limit';import {readFile}from'fs/promises';import {LRUCache}from'lru-cache';import Q from'process';var br=(e,t,r)=>({name:e,streamType:"AngularClass",handle:t,meta:r}),vr=(e,t,r)=>({name:e,streamType:"AnyAngularClass",handle:t,meta:r}),Ar=(e,t)=>({name:e,streamType:"DecoratedProperty",handle:t}),Fr=(e,t,r)=>({name:e,streamType:"TemplateExpression",handle:t,meta:r}),Nr=(e,t,r)=>({name:e,streamType:"TemplateAttribute",handle:t,meta:r}),Ir=(e,t,r)=>({name:e,streamType:"CallExpression",handle:t,meta:r}),Rr=(e,t,r)=>({name:e,streamType:"NewExpression",handle:t,meta:r}),_r=(e,t,r)=>({name:e,streamType:"ImportDeclaration",handle:t,meta:r}),Mr=(e,t,r)=>({name:e,streamType:"TemplateBlock",handle:t,meta:r}),$r=(e,t,r)=>({name:e,streamType:"Template",handle:t,meta:r});var tt={AngularClass:"ClassDeclaration",AnyAngularClass:"ClassDeclaration",DecoratedProperty:"PropertyDefinition",TemplateExpression:"__template_expression__",TemplateAttribute:"__template_attribute__",TemplateBlock:"__template_block__",Template:"__template_analysis__",CallExpression:"CallExpression",NewExpression:"NewExpression",ImportDeclaration:"ImportDeclaration"};function ke(e,t){let r=new Map;for(let i of e){let a=tt[i.streamType];if(!a||a.startsWith("__"))continue;let o=t[i.streamType];if(!o)continue;let n={ruleName:i.name,filter:o,handle:i.handle.bind(i)},s=r.get(a);s?s.push(n):r.set(a,[n]);}return r}var rt=2,at=80,Te=6e4,st=2,ot=5;var te=(e,t,r,i,a,o,n)=>{if(t.length!==0)for(let s of e)for(let l=0;l<t.length;l++){let u=t[l],f=o?performance.now():0;try{let m=u.handle(s,r);if(m){let d=i.get(u.name)??[];Array.isArray(m)?d.push(...m):d.push(m),i.set(u.name,d);}}catch(m){n?.record(createInfrastructureError("RuleExecutionError",{cause:`Rule ${u.name} failed on template node: ${m instanceof Error?m.message:String(m)}`,recoverable:true,phase:"engine",details:{ruleName:u.name,errorName:m instanceof Error?m.name:void 0}}));}if(o){let m=performance.now()-f,d=a.get(u.name);d&&(d.totalMs+=m,d.invocations++);}}},Br=(e,t,r)=>{let{program:i}=t;if(!i)return {results:e.map(p=>({ruleName:p.name,failures:[]})),performance:{traversalMs:0,nodesVisited:0,ruleTimings:[],cacheStats:{hits:0,misses:0},budgetViolations:[],hasBudgetViolations:false}};let a=performance.now(),o=ke(e,{AngularClass:toAngularClassStream,AnyAngularClass:toAnyAngularClassStream,DecoratedProperty:toDecoratedPropertyStream,CallExpression:toCallExpressionStream,NewExpression:toNewExpressionStream,ImportDeclaration:toImportDeclarationStream}),n=e.filter(p=>p.streamType==="TemplateExpression"),s=e.filter(p=>p.streamType==="TemplateAttribute"),l=e.filter(p=>p.streamType==="TemplateBlock"),u=e.filter(p=>p.streamType==="Template"),f=new Map,m=new Map,d=r?.collectRuleTimings??isDebugEnabled(),y=0;for(let p of e)m.set(p.name,{ruleName:p.name,totalMs:0,invocations:0});if(resetComponentCacheStats(),walkProgram(i,p=>{if(!p?.type)return;y++;let g=o.get(p.type);if(g)for(let S=0;S<g.length;S++){let c=g[S],P=d?performance.now():0;try{let E=c.filter(p);if(E!==null){let b=c.handle(E,t);if(b){let A=f.get(c.ruleName)??[];Array.isArray(b)?A.push(...b):A.push(b),f.set(c.ruleName,A);}}}catch(E){r?.errorCollector?.record(createInfrastructureError("RuleExecutionError",{cause:`Rule ${c.ruleName} failed: ${E instanceof Error?E.message:String(E)}`,recoverable:true,phase:"engine",details:{ruleName:c.ruleName,errorName:E instanceof Error?E.name:void 0}}));}if(d){let E=performance.now()-P,b=m.get(c.ruleName);b&&(b.totalMs+=E,b.invocations++);}}}),t.template&&(n.length>0||s.length>0||l.length>0||u.length>0)){let p=analyzeTemplate(t.template),g=t.templateFilePath&&t.templateFileContent&&t.templateLocator?{...t,filePath:t.templateFilePath,fileContent:t.templateFileContent,locator:t.templateLocator}:t;te(p.expressions,n,g,f,m,d,r?.errorCollector),te(p.attributes,s,g,f,m,d,r?.errorCollector),te(p.blocks,l,g,f,m,d,r?.errorCollector),te([p],u,g,f,m,d,r?.errorCollector);}let C=[];for(let p of e)C.push({ruleName:p.name,failures:f.get(p.name)??[]});let x=performance.now()-a,h=[],w=t.typeChecker?5:2;if(x>w&&h.push(`Total traversal time ${x.toFixed(2)}ms exceeds budget ${w}ms`),d)for(let p of m.values()){if(p.invocations===0)continue;let g=p.totalMs/p.invocations;g>1&&h.push(`Rule ${p.ruleName} averages ${g.toFixed(2)}ms per invocation (threshold: 1ms)`);}return {results:C,performance:{traversalMs:x,nodesVisited:y,ruleTimings:Array.from(m.values()),cacheStats:getComponentCacheStats(),budgetViolations:h,hasBudgetViolations:h.length>0}}};var re=class{context;constructor(t){this.context=t;}async build(t,r,i){let a,o,n,s,l,[u,f]=await Promise.all([this.context.readFile(t),this.context.getProgram(t)]),m=new Locator(u);this.context.getTypeChecker&&(a=await this.context.getTypeChecker(t)),i&&(o=await this.context.getTemplate(t));let d=this.context.getProjectContext?.(),y=this.context.getAngularTypes?.(),C=this.context.getTsSourceFile?.(t);i&&!o&&d&&(n=this.resolveExternalTemplatePath(t,d))&&(o=await this.context.getTemplate(n),l=new Locator(s=await this.context.readFile(n)));let x=d?await this.buildCrossRef(t,o,d):void 0;return {filePath:t,fileContent:u,sourceFile:C,locator:m,program:f,typeChecker:a,template:o,templateFilePath:n,templateFileContent:s,templateLocator:l,options:r,project:d,crossRef:x,angularTypes:y}}resolveExternalTemplatePath(t,r){let i=t.endsWith(".component.ts")?t:r.templateToComponent.get(t);if(i)return r.componentGraph.get(i)?.templatePath}async buildCrossRef(t,r,i){let a,o,n,s=t.endsWith(".component.ts")?t:i.templateToComponent.get(t);if(!s)return;let l=i.componentGraph.get(s),u=l?.templatePath,f=l?.stylePaths??[],m=l?.specPath;try{let y=await this.getComponentSourceFile(s);y&&(a=(function(C){let x=new Set;for(let h of C.statements)if(k.isClassDeclaration(h))for(let w of h.members){let p=k.canHaveModifiers(w)?k.getModifiers(w):void 0;if(p&&p.some(S=>S.kind===k.SyntaxKind.PrivateKeyword||S.kind===k.SyntaxKind.ProtectedKeyword))continue;let g=w.name;g&&!k.isPrivateIdentifier(g)&&(k.isIdentifier(g)||k.isStringLiteral(g))&&x.add(g.text);}return x})(y),o=(function(C){let x=new Set;for(let h of C.statements)if(k.isClassDeclaration(h))for(let w of h.members){if(!k.isPropertyDeclaration(w)||!w.initializer||!w.name||k.isPrivateIdentifier(w.name))continue;let p=(function(g){let S=k.isAsExpression(g)||k.isSatisfiesExpression(g)?g.expression:g;if(!k.isCallExpression(S))return;let c=S.expression;return k.isIdentifier(c)?c.text:k.isPropertyAccessExpression(c)?k.isIdentifier(c.expression)&&xt.has(c.expression.text)?c.expression.text:c.name.text:void 0})(w.initializer);p&&yt.has(p)&&(k.isIdentifier(w.name)||k.isStringLiteral(w.name))&&x.add(w.name.text);}return x})(y));}catch{}let d=r;if(!d&&u)try{d=await this.context.getTemplate(u);}catch{}if(d)try{n=(function(y){let C=new Set,x=/\{\{([\s\S]*?)\}\}/g;for(let h of y.rootNodes)(function w(p){if(p&&typeof p=="object"){if(Array.isArray(p.attrs))for(let g of p.attrs){if((typeof g.name=="string"?g.name:"").startsWith("("))continue;let S=g.value;typeof S=="string"&&S&&ve(S,C);}if(typeof p.value=="string"&&p.value){let g;for(x.lastIndex=0;(g=x.exec(p.value))!==null;)ve(g[1],C);}if(Array.isArray(p.children))for(let g of p.children)w(g);}})(h);return C})(d);}catch{}return {componentPath:s,templatePath:u,stylePaths:f,specPath:m,publicMembers:a,signalMembers:o,templateReferences:n}}async getComponentSourceFile(t){let r=this.context.getTsSourceFile?.(t);if(r)return r;let i=await this.context.readFile(t);return k.createSourceFile(t,i,k.ScriptTarget.Latest,true)}},yt=new Set(["signal","computed","linkedSignal","input","model","toSignal","viewChild","viewChildren","contentChild","contentChildren"]),xt=new Set(["input","viewChild","contentChild"]),be=/\b([a-zA-Z_$][a-zA-Z0-9_$]*)\b/g;function ve(e,t){let r;for(be.lastIndex=0;(r=be.exec(e))!==null;)t.add(r[1]);}var Pt=new Set([".css",".scss",".sass",".less"]),U=e=>{let t=new LRUCache({max:128}),r=new LRUCache({max:64}),i=new LRUCache({max:64}),a=new LRUCache({max:64}),o=s=>{let l=t.get(s);if(l)return l;let u=Et(e,s);return t.set(s,u),u},n=s=>{let l=r.get(s);if(l)return l;let u=o(s).then(f=>parseTs(f,s).program);return r.set(s,u),u};return {rootDir:e,readFile:o,getProgram:n,getTemplate:s=>{let l=i.get(s);if(l)return l;let u=bt(s,o,n);return i.set(s,u),u},getStyle:s=>{let l=a.get(s);if(l)return l;let u=R.extname(s).toLowerCase();if(!Pt.has(u)){let m=Promise.resolve(void 0);return a.set(s,m),m}let f=o(s).then(m=>parseCss(m,s));return a.set(s,f),f},evict:s=>{t.delete(s),r.delete(s),i.delete(s),a.delete(s);},dispose:()=>{t.clear(),r.clear(),i.clear(),a.clear();}}},Et=async(e,t)=>{try{return await readFile(R.resolve(e,t),"utf-8")}catch(r){let i=r instanceof Error?r.message:String(r);throw Error(`Cannot read file: ${t}. ${i}`)}},bt=async(e,t,r)=>{let i=await vt(e,t,r);if(i&&i.content)return parseHtml(i.content,i.startOffset)},vt=async(e,t,r)=>{let i=R.extname(e);if(i===".html")return {content:await t(e),startOffset:0};if(i===".ts"){let a=extractTemplateFromProgram(await r(e));return a.content?a:null}return null};var Y=(e,t,r)=>{let i=performance.now()-t,a=e.flatMap(l=>l.failures),o=new Set(a.map(l=>l.filePath)),n=0,s=0;for(let l of a)At(l.severity)?n++:Ft(l.severity)&&s++;return {totalFiles:o.size,totalErrors:n,totalWarnings:s,duration:i,cacheHitRate:r}},At=e=>e==="error",Ft=e=>e==="warn";var G=(e,t,r,i,a)=>{let o=0,n=0;for(let s of r)for(let l of s.failures)l.severity==="error"?o++:l.severity==="warn"&&n++;return {filePath:e,taskCount:t,issueCount:o+n,errorCount:o,warningCount:n,duration:i,typeAware:a}},pe=e=>!!e&&typeof e=="object"&&e.kind==="file-progress",ue=e=>!!e&&typeof e=="object"&&e.kind==="file-progress"&&typeof e.filePath=="string"&&typeof e.taskCount=="number"&&typeof e.issueCount=="number"&&typeof e.errorCount=="number"&&typeof e.warningCount=="number"&&typeof e.duration=="number";var Ae=()=>{throw Error("[ngcompass] Rule executor not configured. Call configureRuleExecutor(executeBatchedNewEngineRules, isNewEngineRule) before running analysis.")},Fe=()=>false,Nt=(e,t)=>{Ae=e,Fe=t;},Ne=()=>Ae,Ie=()=>Fe;var q=async(e,t,r)=>{if(e.length===0)return [];let i=e[0].filePath,a=new re(t),o=new Map,n=[];for(let s of e){if(!Ie()(s.ruleName)){debug("engine",`Skipping task ${s.taskId}: Rule "${s.ruleName}" not registered in engine.`),n.push({ruleName:s.ruleName,taskId:s.taskId,failures:[]});continue}let l=Mt(s,r);if(l===null){n.push({ruleName:s.ruleName,taskId:s.taskId,failures:[]});continue}let u=o.get(l)??_t(s.options);u.ruleNames.push(s.ruleName),u.taskIds.push(s.taskId),u.severities.set(s.ruleName,s.severity),o.set(l,u);}for(let s of o.values()){let l=await $t(s,e,i,a,r);n.push(...l);}return n},_t=e=>({options:e,ruleNames:[],taskIds:[],severities:new Map}),Mt=(e,t)=>{try{return stableSerialize(e.options||{})}catch(r){let i=r instanceof SerializationError?r.message:String(r);return debug("engine",`Skipping task ${e.taskId}: failed to serialize options \u2014 ${i}`),t?.record(createInfrastructureError("SerializationError",{cause:i,phase:"engine",recoverable:true})),null}},$t=async(e,t,r,i,a)=>{try{let o=new Set(e.taskIds),n=t.some(u=>o.has(u.taskId)&&u.inputs.template?.needsAst),s=await i.build(r,e.options,n),l=Ne()(e.ruleNames,s);return Dt(e,l)}catch(o){let n=o instanceof Error?o.message:String(o);return debug("engine",`Failed to execute batch for ${r}: ${n}`),a?.record(createInfrastructureError("ParseError",{filePath:r,cause:n,phase:"engine",recoverable:true})),e.ruleNames.map((s,l)=>({ruleName:s,failures:[],taskId:e.taskIds[l]}))}},Dt=(e,t)=>{let r=new Map;for(let a=0;a<e.ruleNames.length;a++){let o=e.ruleNames[a],n=r.get(o);n?n.ids.push(e.taskIds[a]):r.set(o,{ids:[e.taskIds[a]],cursor:0});}let i=[];for(let a of t){let o=e.severities.get(a.ruleName),n=o?{...a,failures:a.failures.map(l=>({...l,severity:o}))}:a,s=r.get(a.ruleName);s&&s.cursor<s.ids.length?i.push({...n,taskId:s.ids[s.cursor++]}):i.push(n);}return i};function ge(e,t,r,i){let a=performance.now(),o=(function(h,w,p){var g;let S=new Set;for(let P of h)S.add(R.resolve(w,P));let c=(g=w).endsWith(R.sep)?g:g+R.sep;for(let P of p.getSourceFiles())!P.isDeclarationFile&&P.fileName.startsWith(c)&&S.add(P.fileName);return S})(t,r,e),{importGraph:n,reverseImportGraph:s,externalDeps:l}=(function(h,w){let p=h.getCompilerOptions(),g=k.createModuleResolutionCache(h.getCurrentDirectory(),k.sys.useCaseSensitiveFileNames?E=>E:E=>E.toLowerCase(),p),S=new Map,c=new Map,P=new Map;for(let E of w)S.set(E,new Set),c.set(E,new Set);for(let E of h.getSourceFiles()){if(E.isDeclarationFile||!w.has(E.fileName))continue;let b=E.fileName;for(let A of (function(_){let v=[];return k.forEachChild(_,function I(T){k.isImportDeclaration(T)&&k.isStringLiteral(T.moduleSpecifier)||k.isExportDeclaration(T)&&T.moduleSpecifier&&k.isStringLiteral(T.moduleSpecifier)?v.push(T.moduleSpecifier.text):(k.isCallExpression(T)&&T.expression.kind===k.SyntaxKind.ImportKeyword&&T.arguments.length>0&&k.isStringLiteralLike(T.arguments[0])&&v.push(T.arguments[0].text),k.forEachChild(T,I));}),v})(E)){let _=k.resolveModuleName(A,b,p,k.sys,g),v=_.resolvedModule?.resolvedFileName;if(v&&w.has(v)){S.get(b).add(v);let I=c.get(v);I||(I=new Set,c.set(v,I)),I.add(b);}else {let I=(function(T){if(T.startsWith(".")||R.isAbsolute(T))return null;if(T.startsWith("@")){let M=T.indexOf("/",1);if(M===-1)return null;let $=T.indexOf("/",M+1);return $===-1?T:T.slice(0,$)}let W=T.indexOf("/");return W===-1?T:T.slice(0,W)})(A);if(I){let T=P.get(b);T||(T=new Set,P.set(b,T)),T.add(I);}}}}return {importGraph:S,reverseImportGraph:c,externalDeps:P}})(e,o),u=(function(h,w){let p=new Set;for(let g of h.getSourceFiles()){if(g.isDeclarationFile||!w.has(g.fileName))continue;let{statements:S}=g;S.length!==0&&S.every(c=>k.isExportDeclaration(c)&&c.moduleSpecifier!=null)&&p.add(g.fileName);}return p})(e,o),f=i??(function(h,w){let p=new Map,g=[".scss",".sass",".css",".less"];for(let S of h){if(!S.endsWith(".component.ts"))continue;let c=R.dirname(S),P=R.basename(S,".ts"),E=R.join(c,P+".html"),b=h.has(E)?E:void 0,A=[];for(let I of g){let T=R.join(c,P+I);h.has(T)&&A.push(T);}if(!b||A.length===0){let I=(function(T,W,M,$){let ee,Ce=T.getSourceFile(W);if(!Ce)return {templatePath:void 0,stylePaths:[]};let Se=(function(O){for(let z of O.statements){if(!k.isClassDeclaration(z))continue;let D=k.canHaveDecorators(z)?k.getDecorators(z):void 0;if(D)for(let j of D){let B=j.expression;if(!k.isCallExpression(B)||!k.isIdentifier(B.expression)||B.expression.text!=="Component")continue;let ce=B.arguments[0];if(ce&&k.isObjectLiteralExpression(ce))return ce}}})(Ce);if(!Se)return {templatePath:void 0,stylePaths:[]};let le=[];for(let O of Se.properties){if(!k.isPropertyAssignment(O)||!k.isIdentifier(O.name))continue;let z=O.name.text;if(z==="templateUrl"){let D=fe(O.initializer);if(D){let j=R.resolve(M,D);$.has(j)&&(ee=j);}continue}if(z==="styleUrl"){let D=fe(O.initializer);if(D){let j=R.resolve(M,D);$.has(j)&&le.push(j);}continue}if(z==="styleUrls"&&k.isArrayLiteralExpression(O.initializer))for(let D of O.initializer.elements){let j=fe(D);if(!j)continue;let B=R.resolve(M,j);$.has(B)&&le.push(B);}}return {templatePath:ee,stylePaths:le}})(w,S,c,h);!b&&I.templatePath&&(b=I.templatePath),A.length===0&&I.stylePaths.length>0&&A.push(...I.stylePaths);}let _=R.join(c,P+".spec.ts"),v=h.has(_)?_:void 0;p.set(S,{tsPath:S,templatePath:b,stylePaths:A,specPath:v});}return p})(o,e),m=(function(h){let w=new Map;for(let[p,g]of h)g.templatePath&&w.set(g.templatePath,p);return w})(f),{ngModuleMap:d,standaloneComponents:y,classToFile:C}=(function(h,w){let p=new Map,g=new Set,S=(function(c,P){let E=new Map;for(let b of c.getSourceFiles())if(!b.isDeclarationFile&&P.has(b.fileName))for(let A of b.statements){if(!k.isClassDeclaration(A)||!A.name)continue;(k.canHaveModifiers(A)?k.getModifiers(A):void 0)?.some(v=>v.kind===k.SyntaxKind.ExportKeyword)&&E.set(A.name.text,b.fileName);}return E})(h,w);for(let c of h.getSourceFiles())if(!c.isDeclarationFile&&w.has(c.fileName))for(let P of c.statements){if(!k.isClassDeclaration(P))continue;let E=k.canHaveDecorators(P)?k.getDecorators(P):void 0;if(E?.length)for(let b of E){let A=(function(I){let T=I.expression;if(!k.isCallExpression(T))return;let W=T.expression;if(!k.isIdentifier(W))return;let M=T.arguments[0],$=M&&k.isObjectLiteralExpression(M)?M:void 0;return {name:W.text,arg:$}})(b);if(!A)continue;let{name:_,arg:v}=A;if(_==="NgModule"){v&&p.set(c.fileName,{filePath:c.fileName,declarations:new Set(K(v,"declarations")),imports:new Set(K(v,"imports")),exports:new Set(K(v,"exports")),providers:new Set(K(v,"providers")),isStandalone:false});break}if(_==="Component"){v&&_e(v,"standalone")&&(g.add(c.fileName),p.set(c.fileName,{filePath:c.fileName,declarations:new Set,imports:new Set(v?K(v,"imports"):[]),exports:new Set,providers:new Set(v?K(v,"providers"):[]),isStandalone:true}));break}if(_==="Directive"||_==="Pipe"){v&&_e(v,"standalone")&&g.add(c.fileName);break}}}return {ngModuleMap:p,standaloneComponents:g,classToFile:S}})(e,o),x=(function(h){let w=0;for(let p of h.values())w+=p.size;return w})(n);return debug("engine",`ProjectContext built in ${(performance.now()-a).toFixed(2)}ms \u2014 ${o.size} files, ${x} import edges, ${u.size} barrels, ${l.size} files with ext deps, ${f.size} components, ${m.size} template\u2194component links, ${d.size} NgModules/standalone, ${y.size} standalone`),{importGraph:n,reverseImportGraph:s,ngModuleMap:d,standaloneComponents:y,classToFile:C,componentGraph:f,projectFiles:o,rootDir:r,barrelFiles:u,externalDeps:l,templateToComponent:m}}function fe(e){if(k.isStringLiteralLike(e)||k.isNoSubstitutionTemplateLiteral(e))return e.text}function K(e,t){for(let r of e.properties){if(!k.isPropertyAssignment(r)||!k.isIdentifier(r.name)||r.name.text!==t)continue;let i=r.initializer;if(!k.isArrayLiteralExpression(i))break;let a=[];for(let o of i.elements)a.push(...(function n(s){return k.isIdentifier(s)?[s.text]:k.isPropertyAccessExpression(s)||k.isCallExpression(s)?n(s.expression):[]})(o));return a}return []}function _e(e,t){for(let r of e.properties)if(k.isPropertyAssignment(r)&&k.isIdentifier(r.name)&&r.name.text===t)return r.initializer.kind===k.SyntaxKind.TrueKeyword;return false}var Lt=new Set(["Signal","WritableSignal","InputSignal","ModelSignal","OutputEmitterRef"]),Wt=new Set(["WritableSignal","InputSignal","ModelSignal"]),Ot=new Set(["Subject","BehaviorSubject","ReplaySubject","AsyncSubject"]);function de(e){if(!e)return zt;let t=new Map,r=(a,o)=>{if(!a)return false;let n=t.get(o);n||(n=new WeakMap,t.set(o,n));let s=n.get(a);if(s!==void 0)return s;let l=(function(u,f){let m=u.getDeclarations();if(!m||m.length===0)return false;let d=`/node_modules/${f}/`;for(let y of m)if(y.getSourceFile().fileName.replace(Me,"/").includes(d))return true;return false})(a,o);return n.set(a,l),l},i=(a,o,n)=>{if(!a)return false;let s=a.aliasSymbol??a.symbol;return !!s&&!!o.has(s.name)&&r(s,n)};return {isFromPackage:r,isFromAngularCore:a=>r(a,"@angular/core"),isSignal:a=>i(a,Lt,"@angular/core"),isWritableSignal:a=>i(a,Wt,"@angular/core"),isObservable:a=>{if(!a)return false;let o=a.aliasSymbol??a.symbol;return !!o&&o.name==="Observable"&&r(o,"rxjs")},isSubjectLike:a=>i(a,Ot,"rxjs"),isHttpClient:a=>{if(!a)return false;let o=a.aliasSymbol??a.symbol;return !!o&&o.name==="HttpClient"&&r(o,"@angular/common")},isInjectionToken:a=>{if(!a)return false;let o=a.aliasSymbol??a.symbol;return !!o&&o.name==="InjectionToken"&&r(o,"@angular/core")},isEventEmitter:a=>{if(!a)return false;let o=a.aliasSymbol??a.symbol;return !!o&&o.name==="EventEmitter"&&r(o,"@angular/core")},isChangeDetectorRef:a=>{if(!a)return false;let o=a.aliasSymbol??a.symbol;return !!o&&o.name==="ChangeDetectorRef"&&r(o,"@angular/core")},isInjectableClass:a=>!!a&&(!!(function(o){let n=o.getDeclarations()?.[0];if(!n||!k.isClassDeclaration(n)||!k.canHaveDecorators(n))return false;let s=k.getDecorators(n);if(!s)return false;for(let l of s){let u=l.expression,f=k.isCallExpression(u)?u.expression:u;if(k.isIdentifier(f)&&f.text==="Injectable")return true}return false})(a)||(function(o){let n=o.getDeclarations();if(!n||n.length===0)return false;for(let s of n)if(s.getSourceFile().fileName.replace(Me,"/").includes("/node_modules/@angular/"))return true;return false})(a))}}var Me=/\\/g,zt={isFromPackage:()=>false,isFromAngularCore:()=>false,isSignal:()=>false,isWritableSignal:()=>false,isObservable:()=>false,isSubjectLike:()=>false,isHttpClient:()=>false,isInjectionToken:()=>false,isEventEmitter:()=>false,isChangeDetectorRef:()=>false,isInjectableClass:()=>false};var he=(e,t=[],r,i={})=>{var a;let o,n,s,l=U(e);debug("engine","Initializing Type-Aware Context (ts.createProgram)...");let u=performance.now(),{program:f}=(function(C,x,h,w){var p;let g,S,c=h?.tsconfigRootDir?R__default.resolve(C,h.tsconfigRootDir):C,P=h?.project?R__default.resolve(c,h.project):k.findConfigFile(c,k.sys.fileExists,"tsconfig.json");if(!P)return {program:void 0};let E=k.readConfigFile(P,k.sys.readFile),b=k.parseJsonConfigFileContent(E.config,k.sys,c),A=(w.programRootFiles??x).filter(ye),_=A.length>0?A:b.fileNames,v={...b.options,...Bt},I=k.createProgram({rootNames:_,options:v,host:(p=v,g=k.createCompilerHost(p,true),S=k.createModuleResolutionCache(g.getCurrentDirectory(),T=>g.getCanonicalFileName(T),p),g.resolveModuleNameLiterals=(T,W,M,$)=>T.map(ee=>k.resolveModuleName(ee.text,W,$,g,S,M)),g)});return debug("engine",`Program rootNames: ${_.length} (tsconfig had ${b.fileNames.length})`),{program:I}})(e,t,r,i);f?(function(C,x){let h=0,w=0;for(let g of C.getSourceFiles())g.isDeclarationFile||Ut.test(g.fileName)?h++:w++;let p=(process.memoryUsage().heapUsed/1048576).toFixed(0);debug("engine",`Program diagnostics: ${w} project file(s), ${h} lib/declaration file(s), built in ${x.toFixed(0)}ms, heapUsed ${p}MB`);})(f,performance.now()-u):debug("engine","Could not find tsconfig.json; TypeChecker and ProjectContext will be unavailable.");let m=f?.getTypeChecker();m&&(a=m,o=new WeakMap,n=a.getTypeAtLocation.bind(a),a.getTypeAtLocation=C=>{let x=o.get(C);if(x)return x;let h=n(C);return o.set(C,h),h});let d=de(f);if(f&&i.buildProjectContext!==false)try{s=ge(f,t,e);}catch(C){let x=C instanceof Error?C.message:String(C);debug("engine",`ProjectContext build failed (non-fatal): ${x}`);}else f&&debug("engine","Skipping ProjectContext build for type-checker-only chunk");let y=f;return {...l,getTypeChecker:C=>Promise.resolve(m),getProjectContext:()=>s,getTsSourceFile:C=>y?.getSourceFile(C),getAngularTypes:()=>d,warmup:()=>(debug("engine",`Type-aware context ready: ${y?`ts.Program with ${y.getSourceFiles().length} source files`:"no tsconfig found, TypeChecker unavailable"}`),Promise.resolve()),dispose:()=>{s=void 0,m=void 0,d=void 0,y=void 0,l.dispose();}}},ye=e=>(e.endsWith(".ts")||e.endsWith(".tsx"))&&!e.endsWith(".d.ts"),Bt={skipLibCheck:true,skipDefaultLibCheck:true,noEmit:true,declaration:false,declarationMap:false,sourceMap:false,inlineSourceMap:false,incremental:false,composite:false},Ut=/[\\/]node_modules[\\/]/;var De=()=>{let e=globalThis.gc;return typeof e=="function"&&(e(),true)},Gt=()=>{let{heapUsed:e}=process.memoryUsage(),{heap_size_limit:t}=Ht.getHeapStatistics();return {usedBytes:e,limitBytes:t}},je=()=>{let{usedBytes:e,limitBytes:t}=Gt();return t>0?e/t:0},se=e=>!(je()<e)&&De();var Ue=async(e,t,r,i,a,o)=>{let n,{Worker:s}=await import('worker_threads'),l=i??Math.max(2,Vt.cpus().length),u=await Qt();if(!u)return debug("workers","Execution worker not found, falling back to local execution."),Oe(e,t,r,a??l,o);let f=er(e,l),m=[],d=0,y=()=>{d++,debug("workers",`Worker progress: ${d}/${l} complete`);},C=f.map(w=>Jt(s,u,t,w,m,y,o));try{n=await Promise.all(C);}catch(w){var x;return await Promise.allSettled(m.map(p=>p.terminate())),debug("workers",`Worker execution failed, retrying locally with one file batch at a time: ${(x=w)instanceof Error?x.message:String(x)}`),Oe(e,t,r,1,o)}let h=n.flat();return Ok({results:h,parseErrors:[],stats:Y(h,r)})},Jt=(e,t,r,i,a,o,n)=>new Promise((s,l)=>{let u=false,f=new e(t,{workerData:{rootDir:r,tasks:i}});a.push(f);let m=()=>{clearTimeout(d),f.removeAllListeners();},d=setTimeout(()=>{u||(u=true,m(),o(),f.terminate(),l(Error(`Worker timed out after ${6e4/1e3}s`)));},6e4);f.on("message",y=>{pe(y)?n?.(y):u||(u=true,m(),y.errors&&y.errors.length>0&&y.errors.forEach(C=>{debug("workers",`Worker failed task ${C.task.taskId}: ${C.error}`);}),o(),s(y.results));}),f.on("error",y=>{u||(u=true,m(),o(),l(y instanceof Error?y:Error(String(y))));}),f.on("exit",y=>{if(u||y===0)return;u=true,m();let C=createInfrastructureError("WorkerCrash",{cause:`Worker exited with code ${y}`,phase:"engine",recoverable:true,details:{exitCode:y}});debug("workers",`Worker crashed: ${C.cause}`),l(Error(C.cause));});}),Oe=async(e,t,r,i,a)=>{let o=U(t),n=Zt(i),s=groupTasksByFile(e),l=(await Promise.all(Array.from(s.values()).map(u=>n(async()=>{let f=u[0]?.filePath,m=performance.now(),d=await q(u,o);return f&&(o.evict(f),a?.(G(f,u.length,d,performance.now()-m))),d})))).flat();return Ok({results:l,parseErrors:[],stats:Y(l,r)})},Qt=async()=>{let e=dirname(fileURLToPath(import.meta.url));try{let t=createRequire(import.meta.url).resolve("@ngcompass/rules/execution-worker");if(existsSync(t))return t}catch{}return [join(e,"..","..","rules","dist","execution-worker.js"),join(e,"..","..","rules","dist","execution-worker.cjs")].find(t=>existsSync(t))??null},er=(e,t)=>{let r=Array.from(groupTasksByFile(e).values()).sort((o,n)=>n.length-o.length),i=Array.from({length:t},()=>[]),a=Array(t).fill(0);for(let o of r){let n=0,s=a[0];for(let l=1;l<t;l++)a[l]<s&&(s=a[l],n=l);i[n].push(...o),a[n]+=o.length;}return i};var xe=Number.MAX_SAFE_INTEGER;function Ve(e){if(!e||typeof e!="object"||typeof e.ruleName!="string"||!Array.isArray(e.failures))return false;for(let t of e.failures)if(!t||typeof t!="object"||typeof t.filePath!="string"||typeof t.line!="number"||typeof t.column!="number"||typeof t.severity!="string")return false;return true}var Ya=async(e,t)=>{try{if(e.precomputedAnalysis){if((function(c){if(!c||typeof c!="object"||!Array.isArray(c.results)||!Array.isArray(c.parseErrors)||!c.stats||typeof c.stats!="object")return !1;let P=c.stats;return typeof P.totalFiles=="number"&&typeof P.totalErrors=="number"&&typeof P.totalWarnings=="number"&&typeof P.duration=="number"})(e.precomputedAnalysis))return debug("engine","Returning precomputed analysis from cache (global hash match)"),Ok(e.precomputedAnalysis);debug("engine","Precomputed analysis failed schema validation \u2014 discarding stale cache entry and re-running analysis");}let r=performance.now(),{tasks:i,skippedTasks:a,cachedResults:o}=e,n=Vt.cpus().length,s=Math.max(1,Math.min(4,n-1)),l=Math.max(1,Math.min(t.maxWorkers??s,n)),u=t.parallelThreshold??150,f=i.filter(c=>!!c.needsTypeChecker||!!c.needsProjectContext),m=i.filter(c=>!c.needsTypeChecker&&!c.needsProjectContext);if(debug("engine",`workerTasks: ${m.length}, typeAwareTasks: ${f.length}`),f.length>0&&!t.skipTypeCheck){let c=groupTasksByFile(f).size;dr(c,t.onNotice);}let d=i.length+a.length,y=a.length,C=c=>{y=Math.min(y+c,d),t.onProgress?.(y,d);};a.length>0&&t.onProgress?.(y,d);let x=[];if(m.length>0)if(m.length>u){debug("engine",`Running analysis on ${m.length} syntax-only tasks using workers (max: ${l})...`);let c=await Ue(m,t.rootDir,r,l,void 0,t.onFileProgress);if(!c.ok)return c;x=c.data.results,C(m.length);}else debug("engine",`Running analysis on ${m.length} syntax-only tasks locally with batching (concurrency: ${l})...`),x=await Xe(m,t.rootDir,l,!1,t.errorCollector,void 0,void 0,!0,void 0,C,t.onFileProgress);if(f.length>0&&!t.skipTypeCheck){let c=fr(t.typeAwareFileConcurrency,l),P=await pr(f,t.rootDir,c,t,C,t.onFileProgress);x=[...x,...P];}else f.length>0&&t.skipTypeCheck&&debug("engine",`Skipping ${f.length} type-aware tasks (--skip-type-check)`);let h=await Er(a,o,t.cache),w=[...x,...h],p=i.length+a.length,g=p>0?h.length/p:void 0,S={results:w,parseErrors:[],stats:Y(w,r,g)};if(t.cache&&e.globalHash&&S.results.length<=2e4){debug("engine","Caching full analysis result for global hash..."),t.debug&&(debug("engine",`Analysis Results: ${S.results.length} items`),S.results.length>0&&debug("engine",`Sample item keys: ${Object.keys(S.results[0]).join(", ")}`));try{await t.cache.analysis.set(e.globalHash,S);}catch(c){let P=c instanceof Error?c.message:String(c);debug("engine",`Failed to cache analysis result: ${P}`),t.errorCollector?.record(createInfrastructureError("IOError",{cause:`Failed to write analysis cache: ${P}`,phase:"engine",recoverable:!0}));}}else t.cache&&e.globalHash&&debug("engine",`Skipping full analysis cache: ${S.results.length} results exceeds 20000 result safety limit`);return Ok(S)}catch(r){return Err(r instanceof Error?r:Error(String(r)))}},Xe=async(e,t,r,i,a,o,n,s=true,l,u,f)=>{let m=i?he(t,o??[],n,{buildProjectContext:s,programRootFiles:l}):U(t);i&&(await m.warmup(),debug("engine",`Phase 1 complete \u2014 TypeScript Program ready. Starting Phase 2: ${r} concurrent file batches.`));let d=groupTasksByFile(e);debug("engine",`Grouped ${e.length} tasks into ${d.size} file batches`);let y=Zt(r),C=await Promise.all(Array.from(d.values()).map(x=>y(async()=>{let h=x[0]?.filePath,w=performance.now();try{let p=await q(x,m);return m.evict(h),u?.(x.length),h&&f?.(G(h,x.length,p,performance.now()-w,i)),p}catch(p){let g=p instanceof Error?p.message:String(p);return m.evict(h),u?.(x.length),h&&f?.(G(h,x.length,[],performance.now()-w,i)),a?.record(createInfrastructureError("IOError",{filePath:h,cause:`Batch execution failed: ${g}`,phase:"engine",recoverable:true})),[]}})));return m.dispose(),C.flat().filter(x=>x!==null)},pr=async(e,t,r,i,a,o)=>{let n=groupTasksByFile(e);if(Ze(e).length===0)return debug("engine",`Type-aware: no TypeScript roots among ${n.size} files; nothing to type-check`),[];let s=e.some(f=>!!f.needsProjectContext),l=Array.from(n.entries()),u=[];for(let f=0;f<l.length;f+=xe){let m=l.slice(f,f+xe),d=Je(Math.floor(f/xe)+1,m,s),y=i.files&&i.files.length>0?i.files:void 0;debug("engine",`Type-aware chunk ${d.index}: ${d.tasks.length} tasks across ${d.files.length} files`),u=[...u,...await ur(d,t,y,r,i,o)],a?.(d.tasks.length);}return u},ur=async(e,t,r,i,a,o)=>{let n=[],s=new Set,l=e;for(;l;){let u=l,f=mr(r,u);try{let m=await xr(u.tasks,t,f,u.programRootFiles,u.buildProjectContext,i,a,o);n.push(...m),se(.8);break}catch(m){let d=m instanceof J?m:void 0;if(d)for(let x of(n.push(...d.partialResults),d.completedFiles))s.add(x);let y=Ye(e,s);if(!y)return n;let C=!!d&&d.completedFiles.size>0;if(i!==1&&C)l=y;else {let x=y.files[0];s.add(x),gr(x,t,m,a),l=Ye(e,s);}se(.8);}}return n},mr=(e,t)=>t.buildProjectContext&&e?e:t.files,fr=(e,t)=>Math.max(1,Math.min(e==null||Number.isNaN(e)?1:Math.floor(e),t,8)),Ze=e=>{let t=new Set;for(let r of e){let i=r.inputs.typescript.path;ye(i)&&t.add(i);}return [...t]},Je=(e,t,r)=>{let i=t.flatMap(([,a])=>a);return {index:e,tasks:i,files:t.map(([a])=>a),programRootFiles:Ze(i),buildProjectContext:r}},Ye=(e,t)=>{if(t.size===0)return e;let r=Array.from(groupTasksByFile(e.tasks).entries()).filter(([i])=>!t.has(i));return r.length===0?null:Je(e.index,r,e.buildProjectContext)},gr=(e,t,r,i)=>{let a=r instanceof J?r.reason:"crash",o=relative(t,e)||e,n=`Skipped ${o} (${a==="timeout"?"type-check timed out":"type-check failed"})`;i.onFileSkipped?.(e),i.onNotice?.(n),i.errorCollector?.record(createInfrastructureError("WorkerCrash",{filePath:e,cause:n,phase:"engine",recoverable:true}));},dr=(e,t)=>{if(!t)return;let r=Ht.getHeapStatistics().heap_size_limit/1073741824;if(r>=4||e<600)return;let i=r.toFixed(1),a=e.toLocaleString();t(`Large type-aware workload: ${a} files on a ${i} GB heap built into a single TypeScript program. If analysis runs out of memory, raise it with NODE_OPTIONS=--max-old-space-size=8192 or run with --skip-type-check.`);},hr=["--max-old-space-size","--max-semi-space-size"],oe="--max-old-space-size",qe=e=>e.split("_").join("-"),yr=(e,t)=>{let r=[],i=t!==void 0&&qe(t).includes(oe);for(let o=0;o<e.length;o++){let n=e[o];if(n==="--expose-gc")continue;let s=qe(n),l=hr.find(u=>s===u||s.startsWith(`${u}=`));l&&(r.push(n),(s===oe||s.startsWith(`${oe}=`))&&(i=true),s===l&&o+1<e.length&&r.push(e[++o]));}let a=["--expose-gc",...r];return i||a.push(`${oe}=4096`),a},J=class extends Error{reason;partialResults;completedFiles;constructor(t,r,i,a){super(t),this.name="TypeAwareChildFailure",this.reason=r,this.partialResults=i,this.completedFiles=a;}},ie=(e,t,r)=>e!==void 0?e:t===0?3e4:Math.min(3e4,Math.max(1e3,8*r)),xr=async(e,t,r,i,a,o,n,s)=>{let l=await wr();return l?new Promise((u,f)=>{let m,d,y=fork(l,[],{cwd:t,execArgv:yr(process.execArgv,process.env.NODE_OPTIONS),stdio:["ignore","pipe","pipe","ipc"]}),C=false,x=0,h=0,w=[],p=new Set,g=(c,P)=>{C||(C=true,clearTimeout(m),y.kill(),f(new J(c,P,w.slice(),p)));},S=(c,P)=>{clearTimeout(m),m=setTimeout(()=>{let E=d?` while analyzing "${d}"`:"";g(`Type-aware ${P} exceeded ${c/1e3}s${E}`,"timeout");},c);};S(6e5,"program build"),y.stdout?.on("data",c=>debug("engine",`[type-aware-child] ${String(c).trim()}`)),y.stderr?.on("data",c=>debug("engine",`[type-aware-child:stderr] ${String(c).trim()}`)),y.on("message",c=>{if(Cr(c))return void S(ie(n.typeAwarePerFileTimeoutMs,x,h),"file analysis");if(Sr(c)){d=c.filePath,S(ie(n.typeAwarePerFileTimeoutMs,x,h),"file analysis");return}if(ue(c)){x++,h=Math.max(h,c.duration),s?.(c),S(ie(n.typeAwarePerFileTimeoutMs,x,h),"file analysis");return}if(Tr(c)){w.push(...c.results),p.add(c.filePath),d===c.filePath&&(d=void 0),S(ie(n.typeAwarePerFileTimeoutMs,x,h),"file analysis");return}if(kr(c)){if(C)return;C=true,clearTimeout(m),u(w);return}Pr(c)&&g(c.error,"reported");}),y.on("error",c=>{g(c.message,"spawn");}),y.on("exit",c=>{g(`Type-aware child process exited before completion with code ${c}`,"crash");}),y.send({rootDir:t,tasks:e,files:r,programRootFiles:i,parserOptions:n.parserOptions,buildProjectContext:a,fileConcurrency:o});}):(debug("engine","Type-aware child worker not found; falling back to in-process execution"),Xe(e,t,o,true,n.errorCollector,r,n.parserOptions,a,i,void 0,s))},wr=async()=>{let e=dirname(fileURLToPath(import.meta.url));try{let t=createRequire(import.meta.url).resolve("@ngcompass/rules/type-aware-worker");if(existsSync(t))return t}catch{}for(let t of [join(e,"..","..","rules","dist","type-aware-worker.js"),join(e,"..","..","rules","dist","type-aware-worker.cjs")])if(existsSync(t))return t;return null},Cr=e=>!!e&&typeof e=="object"&&e.kind==="ready",Sr=e=>!!e&&typeof e=="object"&&e.kind==="file-start"&&typeof e.filePath=="string",kr=e=>!!e&&typeof e=="object"&&e.kind==="complete",Tr=e=>!!e&&typeof e=="object"&&e.kind==="file-result"&&typeof e.filePath=="string"&&Array.isArray(e.results),Pr=e=>!!e&&typeof e=="object"&&e.kind==="error"&&typeof e.error=="string",Er=async(e,t,r)=>{if(e.length===0)return [];debug("engine",`Retrieving results for ${e.length} skipped tasks...`);let i=[],a=[];if(t)for(let o of e){let n=t.get(o.taskId);n&&Ve(n)?i.push(n):a.push(o);}else a.push(...e);if(a.length>0&&r){debug("engine",`Fetching ${a.length} results from cache service...`);let o=a.map(s=>s.taskId),n=await r.results.getMany(o);for(let s of a){let l=n.get(s.taskId);l&&Ve(l)&&i.push(l);}}return debug("engine",`Retrieved ${i.length} results from cache`),i};var Qe=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],et=class{frameIndex=0;interval=null;message="";start(t){this.message=t,this.interval||(this.frameIndex=0,Q.stderr.write("\x1B[?25l"),this.interval=setInterval(()=>{Q.stderr.write(`\r${Qe[this.frameIndex]} ${this.message}`),this.frameIndex=(this.frameIndex+1)%Qe.length;},80));}update(t){this.message=t;}stop(t){this.interval&&(clearInterval(this.interval),this.interval=null),Q.stderr.write("\r\x1B[K"),t&&Q.stderr.write(t+` | ||
| `),Q.stderr.write("\x1B[?25h");}};export{st as BUDGET_MS_PER_FILE_WITHOUT_TYPES,ot as BUDGET_MS_PER_FILE_WITH_TYPES,rt as MIN_WORKER_COUNT,re as RuleContextFactory,at as SPINNER_FRAME_INTERVAL_MS,tt as STREAM_TO_NODE_TYPE,et as Spinner,Te as WORKER_TIMEOUT_MS,G as buildFileProgress,ge as buildProjectContext,ke as buildVisitorMap,Y as calculateStats,ie as computeAdaptiveFileBudget,Nt as configureRuleExecutor,U as createAnalysisContext,de as createAngularTypeIndex,vr as createAnyAngularClassRule,Ir as createCallExpressionRule,br as createComponentRule,Ar as createDecoratedPropertyRule,_r as createImportDeclarationRule,Rr as createNewExpressionRule,Nr as createTemplateAttributeRule,Mr as createTemplateBlockRule,Fr as createTemplateExpressionRule,$r as createTemplateRule,he as createTypeAwareAnalysisContext,q as executeBatchedTasks,je as getHeapPressureRatio,ue as isAnalysisFileProgress,pe as isWorkerFileProgress,De as requestGarbageCollection,se as requestGarbageCollectionUnderPressure,yr as resolveChildExecArgv,Ya as runAnalysis,Ue as runAnalysisParallel,Br as runSinglePassAnalysis};//# sourceMappingURL=index.js.map | ||
| //# sourceMappingURL=index.js.map |
+5
-5
| { | ||
| "name": "@ngcompass/engine", | ||
| "version": "0.2.0-beta", | ||
| "version": "0.2.1-beta", | ||
| "description": "Rule execution engine for ngcompass", | ||
@@ -27,6 +27,6 @@ "sideEffects": false, | ||
| "p-limit": "^6.1.0", | ||
| "@ngcompass/common": "0.2.0-beta", | ||
| "@ngcompass/ast": "0.2.0-beta", | ||
| "@ngcompass/cache": "0.2.0-beta", | ||
| "@ngcompass/planner": "0.2.0-beta" | ||
| "@ngcompass/common": "0.2.1-beta", | ||
| "@ngcompass/planner": "0.2.1-beta", | ||
| "@ngcompass/ast": "0.2.1-beta", | ||
| "@ngcompass/cache": "0.2.1-beta" | ||
| }, | ||
@@ -33,0 +33,0 @@ "peerDependencies": { |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
411821
0.65%464
0.87%+ Added
+ Added
+ Added
+ Added
+ Added
- Removed
- Removed
- Removed
- Removed
- Removed
Updated
Updated
Updated