🚀 Socket Launch Week Day 5:Introducing Repository Access Permissions and Custom Roles.Learn more
Sign In

@ngcompass/engine

Package Overview
Dependencies
Maintainers
1
Versions
12
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@ngcompass/engine - npm Package Compare versions

Comparing version
0.1.9-beta
to
0.2.0-beta
+2
-2
dist/index.cjs

@@ -1,3 +0,3 @@

'use strict';var ast=require('@ngcompass/ast'),common=require('@ngcompass/common'),C=require('typescript'),child_process=require('child_process'),fs=require('fs'),promises=require('fs/promises'),module$1=require('module'),re=require('os'),$=require('path'),url=require('url'),Ue=require('v8'),planner=require('@ngcompass/planner'),ye=require('p-limit'),lruCache=require('lru-cache'),Z=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 C__default=/*#__PURE__*/_interopDefault(C);var re__default=/*#__PURE__*/_interopDefault(re);var $__namespace=/*#__PURE__*/_interopNamespace($);var Ue__default=/*#__PURE__*/_interopDefault(Ue);var ye__default=/*#__PURE__*/_interopDefault(ye);var Z__default=/*#__PURE__*/_interopDefault(Z);var fr=(e,t,r)=>({name:e,streamType:"AngularClass",handle:t,meta:r}),gr=(e,t,r)=>({name:e,streamType:"AnyAngularClass",handle:t,meta:r}),hr=(e,t)=>({name:e,streamType:"DecoratedProperty",handle:t}),dr=(e,t,r)=>({name:e,streamType:"TemplateExpression",handle:t,meta:r}),yr=(e,t,r)=>({name:e,streamType:"TemplateAttribute",handle:t,meta:r}),xr=(e,t,r)=>({name:e,streamType:"CallExpression",handle:t,meta:r}),wr=(e,t,r)=>({name:e,streamType:"NewExpression",handle:t,meta:r}),kr=(e,t,r)=>({name:e,streamType:"TemplateBlock",handle:t,meta:r}),Sr=(e,t,r)=>({name:e,streamType:"Template",handle:t,meta:r});var Je={AngularClass:"ClassDeclaration",AnyAngularClass:"ClassDeclaration",DecoratedProperty:"PropertyDefinition",TemplateExpression:"__template_expression__",TemplateAttribute:"__template_attribute__",TemplateBlock:"__template_block__",Template:"__template_analysis__",CallExpression:"CallExpression",NewExpression:"NewExpression"};function Ce(e,t){let r=new Map;for(let s of e){let n=Je[s.streamType];if(!n||n.startsWith("__"))continue;let a=t[s.streamType];if(!a)continue;let i={ruleName:s.name,filter:a,handle:s.handle.bind(s)},o=r.get(n);o?o.push(i):r.set(n,[i]);}return r}var Xe=2,Ze=80,Te=6e4,Qe=2,et=5;var Q=(e,t,r,s,n,a,i)=>{if(t.length!==0)for(let o of e)for(let l=0;l<t.length;l++){let u=t[l],g=a?performance.now():0;try{let p=u.handle(o,r);if(p){let m=s.get(u.name)??[];Array.isArray(p)?m.push(...p):m.push(p),s.set(u.name,m);}}catch(p){i?.record(common.createInfrastructureError("RuleExecutionError",{cause:`Rule ${u.name} failed on template node: ${p instanceof Error?p.message:String(p)}`,recoverable:true,phase:"engine",details:{ruleName:u.name,errorName:p instanceof Error?p.name:void 0}}));}if(a){let p=performance.now()-g,m=n.get(u.name);m&&(m.totalMs+=p,m.invocations++);}}},Ar=(e,t,r)=>{let{program:s}=t;if(!s)return {results:e.map(c=>({ruleName:c.name,failures:[]})),performance:{traversalMs:0,nodesVisited:0,ruleTimings:[],cacheStats:{hits:0,misses:0},budgetViolations:[],hasBudgetViolations:false}};let n=performance.now(),a=Ce(e,{AngularClass:ast.toAngularClassStream,AnyAngularClass:ast.toAnyAngularClassStream,DecoratedProperty:ast.toDecoratedPropertyStream,CallExpression:ast.toCallExpressionStream,NewExpression:ast.toNewExpressionStream}),i=e.filter(c=>c.streamType==="TemplateExpression"),o=e.filter(c=>c.streamType==="TemplateAttribute"),l=e.filter(c=>c.streamType==="TemplateBlock"),u=e.filter(c=>c.streamType==="Template"),g=new Map,p=new Map,m=r?.collectRuleTimings??common.isDebugEnabled(),d=0;for(let c of e)p.set(c.name,{ruleName:c.name,totalMs:0,invocations:0});if(ast.resetComponentCacheStats(),ast.walkProgram(s,c=>{if(!c?.type)return;d++;let h=a.get(c.type);if(h)for(let S=0;S<h.length;S++){let f=h[S],E=m?performance.now():0;try{let b=f.filter(c);if(b!==null){let v=f.handle(b,t);if(v){let F=g.get(f.ruleName)??[];Array.isArray(v)?F.push(...v):F.push(v),g.set(f.ruleName,F);}}}catch(b){r?.errorCollector?.record(common.createInfrastructureError("RuleExecutionError",{cause:`Rule ${f.ruleName} failed: ${b instanceof Error?b.message:String(b)}`,recoverable:true,phase:"engine",details:{ruleName:f.ruleName,errorName:b instanceof Error?b.name:void 0}}));}if(m){let b=performance.now()-E,v=p.get(f.ruleName);v&&(v.totalMs+=b,v.invocations++);}}}),t.template&&(i.length>0||o.length>0||l.length>0||u.length>0)){let c=ast.analyzeTemplate(t.template),h=t.templateFilePath&&t.templateFileContent&&t.templateLocator?{...t,filePath:t.templateFilePath,fileContent:t.templateFileContent,locator:t.templateLocator}:t;Q(c.expressions,i,h,g,p,m,r?.errorCollector),Q(c.attributes,o,h,g,p,m,r?.errorCollector),Q(c.blocks,l,h,g,p,m,r?.errorCollector),Q([c],u,h,g,p,m,r?.errorCollector);}let w=[];for(let c of e)w.push({ruleName:c.name,failures:g.get(c.name)??[]});let k=performance.now()-n,y=[],x=t.typeChecker?5:2;if(k>x&&y.push(`Total traversal time ${k.toFixed(2)}ms exceeds budget ${x}ms`),m)for(let c of p.values()){if(c.invocations===0)continue;let h=c.totalMs/c.invocations;h>1&&y.push(`Rule ${c.ruleName} averages ${h.toFixed(2)}ms per invocation (threshold: 1ms)`);}return {results:w,performance:{traversalMs:k,nodesVisited:d,ruleTimings:Array.from(p.values()),cacheStats:ast.getComponentCacheStats(),budgetViolations:y,hasBudgetViolations:y.length>0}}};var ee=class{context;constructor(t){this.context=t;}async build(t,r,s){let n,a,i,o,l,[u,g]=await Promise.all([this.context.readFile(t),this.context.getProgram(t)]),p=new common.Locator(u);this.context.getTypeChecker&&(n=await this.context.getTypeChecker(t)),s&&(a=await this.context.getTemplate(t));let m=this.context.getProjectContext?.(),d=this.context.getAngularTypes?.();s&&!a&&m&&(i=this.resolveExternalTemplatePath(t,m))&&(a=await this.context.getTemplate(i),l=new common.Locator(o=await this.context.readFile(i)));let w=m?await this.buildCrossRef(t,a,m):void 0;return {filePath:t,fileContent:u,locator:p,program:g,typeChecker:n,template:a,templateFilePath:i,templateFileContent:o,templateLocator:l,options:r,project:m,crossRef:w,angularTypes:d}}resolveExternalTemplatePath(t,r){let s=t.endsWith(".component.ts")?t:r.templateToComponent.get(t);if(s)return r.componentGraph.get(s)?.templatePath}async buildCrossRef(t,r,s){let n,a,i,o=t.endsWith(".component.ts")?t:s.templateToComponent.get(t);if(!o)return;let l=s.componentGraph.get(o),u=l?.templatePath,g=l?.stylePaths??[],p=l?.specPath;try{let d=await this.getComponentSourceFile(o);d&&(n=(function(w){let k=new Set;for(let y of w.statements)if(C__default.default.isClassDeclaration(y))for(let x of y.members){let c=C__default.default.canHaveModifiers(x)?C__default.default.getModifiers(x):void 0;if(c&&c.some(S=>S.kind===C__default.default.SyntaxKind.PrivateKeyword||S.kind===C__default.default.SyntaxKind.ProtectedKeyword))continue;let h=x.name;h&&!C__default.default.isPrivateIdentifier(h)&&(C__default.default.isIdentifier(h)||C__default.default.isStringLiteral(h))&&k.add(h.text);}return k})(d),a=(function(w){let k=new Set;for(let y of w.statements)if(C__default.default.isClassDeclaration(y))for(let x of y.members){if(!C__default.default.isPropertyDeclaration(x)||!x.initializer||!x.name||C__default.default.isPrivateIdentifier(x.name))continue;let c=(function(h){let S=C__default.default.isAsExpression(h)||C__default.default.isSatisfiesExpression(h)?h.expression:h;if(!C__default.default.isCallExpression(S))return;let f=S.expression;return C__default.default.isIdentifier(f)?f.text:C__default.default.isPropertyAccessExpression(f)?C__default.default.isIdentifier(f.expression)&&f.expression.text==="input"?"input":f.name.text:void 0})(x.initializer);c&&ut.has(c)&&(C__default.default.isIdentifier(x.name)||C__default.default.isStringLiteral(x.name))&&k.add(x.name.text);}return k})(d));}catch{}let m=r;if(!m&&u)try{m=await this.context.getTemplate(u);}catch{}if(m)try{i=(function(d){let w=new Set,k=/\{\{([\s\S]*?)\}\}/g;for(let y of d.rootNodes)(function x(c){if(c&&typeof c=="object"){if(Array.isArray(c.attrs))for(let h of c.attrs){if((typeof h.name=="string"?h.name:"").startsWith("("))continue;let S=h.value;typeof S=="string"&&S&&ve(S,w);}if(typeof c.value=="string"&&c.value){let h;for(k.lastIndex=0;(h=k.exec(c.value))!==null;)ve(h[1],w);}if(Array.isArray(c.children))for(let h of c.children)x(h);}})(y);return w})(m);}catch{}return {componentPath:o,templatePath:u,stylePaths:g,specPath:p,publicMembers:n,signalMembers:a,templateReferences:i}}async getComponentSourceFile(t){let r=this.context.getTsSourceFile?.(t);if(r)return r;let s=await this.context.readFile(t);return C__default.default.createSourceFile(t,s,C__default.default.ScriptTarget.Latest,true)}},ut=new Set(["signal","computed","linkedSignal","input","model","toSignal"]),Pe=/\b([a-zA-Z_$][a-zA-Z0-9_$]*)\b/g;function ve(e,t){let r;for(Pe.lastIndex=0;(r=Pe.exec(e))!==null;)t.add(r[1]);}var yt=new Set([".css",".scss",".sass",".less"]),B=e=>{let t=new lruCache.LRUCache({max:128}),r=new lruCache.LRUCache({max:64}),s=new lruCache.LRUCache({max:64}),n=new lruCache.LRUCache({max:64}),a=o=>{let l=t.get(o);if(l)return l;let u=xt(e,o);return t.set(o,u),u},i=o=>{let l=r.get(o);if(l)return l;let u=a(o).then(g=>ast.parseTs(g,o).program);return r.set(o,u),u};return {rootDir:e,readFile:a,getProgram:i,getTemplate:o=>{let l=s.get(o);if(l)return l;let u=wt(o,a,i);return s.set(o,u),u},getStyle:o=>{let l=n.get(o);if(l)return l;let u=$__namespace.extname(o).toLowerCase();if(!yt.has(u)){let p=Promise.resolve(void 0);return n.set(o,p),p}let g=a(o).then(p=>ast.parseCss(p,o));return n.set(o,g),g},evict:o=>{t.delete(o),r.delete(o),s.delete(o),n.delete(o);},dispose:()=>{t.clear(),r.clear(),s.clear(),n.clear();}}},xt=async(e,t)=>{try{return await promises.readFile($__namespace.resolve(e,t),"utf-8")}catch(r){let s=r instanceof Error?r.message:String(r);throw Error(`Cannot read file: ${t}. ${s}`)}},wt=async(e,t,r)=>{let s=await kt(e,t,r);if(s&&s.content)return ast.parseHtml(s.content,s.startOffset)},kt=async(e,t,r)=>{let s=$__namespace.extname(e);if(s===".html")return {content:await t(e),startOffset:0};if(s===".ts"){let n=ast.extractTemplateFromProgram(await r(e));return n.content?n:null}return null};var Y=(e,t,r)=>{let s=performance.now()-t,n=e.flatMap(l=>l.failures),a=new Set(n.map(l=>l.filePath)),i=0,o=0;for(let l of n)St(l.severity)?i++:Ct(l.severity)&&o++;return {totalFiles:a.size,totalErrors:i,totalWarnings:o,duration:s,cacheHitRate:r}},St=e=>e==="error",Ct=e=>e==="warn";var U=(e,t,r,s,n)=>{let a=0,i=0;for(let o of r)for(let l of o.failures)l.severity==="error"?a++:l.severity==="warn"&&i++;return {filePath:e,taskCount:t,issueCount:a+i,errorCount:a,warningCount:i,duration:s,typeAware:n}},se=e=>!!e&&typeof e=="object"&&e.kind==="file-progress",ie=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,Tt=(e,t)=>{Ae=e,Fe=t;},Me=()=>Ae,Ne=()=>Fe;var q=async(e,t,r)=>{if(e.length===0)return [];let s=e[0].filePath,n=new ee(t),a=new Map,i=[];for(let o of e){if(!Ne()(o.ruleName)){common.debug("engine",`Skipping task ${o.taskId}: Rule "${o.ruleName}" not registered in engine.`),i.push({ruleName:o.ruleName,taskId:o.taskId,failures:[]});continue}let l=vt(o,r);if(l===null){i.push({ruleName:o.ruleName,taskId:o.taskId,failures:[]});continue}let u=a.get(l)??Pt(o.options);u.ruleNames.push(o.ruleName),u.taskIds.push(o.taskId),u.severities.set(o.ruleName,o.severity),a.set(l,u);}for(let o of a.values()){let l=await At(o,e,s,n,r);i.push(...l);}return i},Pt=e=>({options:e,ruleNames:[],taskIds:[],severities:new Map}),vt=(e,t)=>{try{return common.stableSerialize(e.options||{})}catch(r){let s=r instanceof common.SerializationError?r.message:String(r);return common.debug("engine",`Skipping task ${e.taskId}: failed to serialize options \u2014 ${s}`),t?.record(common.createInfrastructureError("SerializationError",{cause:s,phase:"engine",recoverable:true})),null}},At=async(e,t,r,s,n)=>{try{let a=new Set(e.taskIds),i=t.some(u=>a.has(u.taskId)&&u.inputs.template?.needsAst),o=await s.build(r,e.options,i),l=Me()(e.ruleNames,o);return Ft(e,l)}catch(a){let i=a instanceof Error?a.message:String(a);return common.debug("engine",`Failed to execute batch for ${r}: ${i}`),n?.record(common.createInfrastructureError("ParseError",{filePath:r,cause:i,phase:"engine",recoverable:true})),e.ruleNames.map((o,l)=>({ruleName:o,failures:[],taskId:e.taskIds[l]}))}},Ft=(e,t)=>{let r=new Map;for(let n=0;n<e.ruleNames.length;n++){let a=e.ruleNames[n],i=r.get(a);i?i.ids.push(e.taskIds[n]):r.set(a,{ids:[e.taskIds[n]],cursor:0});}let s=[];for(let n of t){let a=e.severities.get(n.ruleName),i=a?{...n,failures:n.failures.map(l=>({...l,severity:a}))}:n,o=r.get(n.ruleName);o&&o.cursor<o.ids.length?s.push({...i,taskId:o.ids[o.cursor++]}):s.push(i);}return s};function pe(e,t,r,s){let n=performance.now(),a=(function(y,x,c){var h;let S=new Set;for(let E of y)S.add($__namespace.resolve(x,E));let f=(h=x).endsWith($__namespace.sep)?h:h+$__namespace.sep;for(let E of c.getSourceFiles())!E.isDeclarationFile&&E.fileName.startsWith(f)&&S.add(E.fileName);return S})(t,r,e),{importGraph:i,reverseImportGraph:o,externalDeps:l}=(function(y,x){let c=y.getCompilerOptions(),h=C__default.default.createModuleResolutionCache(y.getCurrentDirectory(),C__default.default.sys.useCaseSensitiveFileNames?b=>b:b=>b.toLowerCase(),c),S=new Map,f=new Map,E=new Map;for(let b of x)S.set(b,new Set),f.set(b,new Set);for(let b of y.getSourceFiles()){if(b.isDeclarationFile||!x.has(b.fileName))continue;let v=b.fileName;for(let F of (function(I){let A=[];return C__default.default.forEachChild(I,function N(T){C__default.default.isImportDeclaration(T)&&C__default.default.isStringLiteral(T.moduleSpecifier)||C__default.default.isExportDeclaration(T)&&T.moduleSpecifier&&C__default.default.isStringLiteral(T.moduleSpecifier)?A.push(T.moduleSpecifier.text):(C__default.default.isCallExpression(T)&&T.expression.kind===C__default.default.SyntaxKind.ImportKeyword&&T.arguments.length>0&&C__default.default.isStringLiteralLike(T.arguments[0])&&A.push(T.arguments[0].text),C__default.default.forEachChild(T,N));}),A})(b)){let I=C__default.default.resolveModuleName(F,v,c,C__default.default.sys,h),A=I.resolvedModule?.resolvedFileName;if(A&&x.has(A)){S.get(v).add(A);let N=f.get(A);N||(N=new Set,f.set(A,N)),N.add(v);}else {let N=(function(T){if(T.startsWith(".")||$__namespace.isAbsolute(T))return null;if(T.startsWith("@")){let _=T.indexOf("/",1);if(_===-1)return null;let W=T.indexOf("/",_+1);return W===-1?T:T.slice(0,W)}let z=T.indexOf("/");return z===-1?T:T.slice(0,z)})(F);if(N){let T=E.get(v);T||(T=new Set,E.set(v,T)),T.add(N);}}}}return {importGraph:S,reverseImportGraph:f,externalDeps:E}})(e,a),u=(function(y,x){let c=new Set;for(let h of y.getSourceFiles()){if(h.isDeclarationFile||!x.has(h.fileName))continue;let{statements:S}=h;S.length!==0&&S.every(f=>C__default.default.isExportDeclaration(f)&&f.moduleSpecifier!=null)&&c.add(h.fileName);}return c})(e,a),g=s??(function(y,x){let c=new Map,h=[".scss",".sass",".css",".less"];for(let S of y){if(!S.endsWith(".component.ts"))continue;let f=$__namespace.dirname(S),E=$__namespace.basename(S,".ts"),b=$__namespace.join(f,E+".html"),v=y.has(b)?b:void 0,F=[];for(let N of h){let T=$__namespace.join(f,E+N);y.has(T)&&F.push(T);}if(!v||F.length===0){let N=(function(T,z,_,W){let we,ke=T.getSourceFile(z);if(!ke)return {templatePath:void 0,stylePaths:[]};let Se=(function(j){for(let L of j.statements){if(!C__default.default.isClassDeclaration(L))continue;let R=C__default.default.canHaveDecorators(L)?C__default.default.getDecorators(L):void 0;if(R)for(let D of R){let O=D.expression;if(!C__default.default.isCallExpression(O)||!C__default.default.isIdentifier(O.expression)||O.expression.text!=="Component")continue;let oe=O.arguments[0];if(oe&&C__default.default.isObjectLiteralExpression(oe))return oe}}})(ke);if(!Se)return {templatePath:void 0,stylePaths:[]};let ne=[];for(let j of Se.properties){if(!C__default.default.isPropertyAssignment(j)||!C__default.default.isIdentifier(j.name))continue;let L=j.name.text;if(L==="templateUrl"){let R=ce(j.initializer);if(R){let D=$__namespace.resolve(_,R);W.has(D)&&(we=D);}continue}if(L==="styleUrl"){let R=ce(j.initializer);if(R){let D=$__namespace.resolve(_,R);W.has(D)&&ne.push(D);}continue}if(L==="styleUrls"&&C__default.default.isArrayLiteralExpression(j.initializer))for(let R of j.initializer.elements){let D=ce(R);if(!D)continue;let O=$__namespace.resolve(_,D);W.has(O)&&ne.push(O);}}return {templatePath:we,stylePaths:ne}})(x,S,f,y);!v&&N.templatePath&&(v=N.templatePath),F.length===0&&N.stylePaths.length>0&&F.push(...N.stylePaths);}let I=$__namespace.join(f,E+".spec.ts"),A=y.has(I)?I:void 0;c.set(S,{tsPath:S,templatePath:v,stylePaths:F,specPath:A});}return c})(a,e),p=(function(y){let x=new Map;for(let[c,h]of y)h.templatePath&&x.set(h.templatePath,c);return x})(g),{ngModuleMap:m,standaloneComponents:d,classToFile:w}=(function(y,x){let c=new Map,h=new Set,S=(function(f,E){let b=new Map;for(let v of f.getSourceFiles())if(!v.isDeclarationFile&&E.has(v.fileName))for(let F of v.statements){if(!C__default.default.isClassDeclaration(F)||!F.name)continue;(C__default.default.canHaveModifiers(F)?C__default.default.getModifiers(F):void 0)?.some(A=>A.kind===C__default.default.SyntaxKind.ExportKeyword)&&b.set(F.name.text,v.fileName);}return b})(y,x);for(let f of y.getSourceFiles())if(!f.isDeclarationFile&&x.has(f.fileName))for(let E of f.statements){if(!C__default.default.isClassDeclaration(E))continue;let b=C__default.default.canHaveDecorators(E)?C__default.default.getDecorators(E):void 0;if(b?.length)for(let v of b){let F=(function(N){let T=N.expression;if(!C__default.default.isCallExpression(T))return;let z=T.expression;if(!C__default.default.isIdentifier(z))return;let _=T.arguments[0],W=_&&C__default.default.isObjectLiteralExpression(_)?_:void 0;return {name:z.text,arg:W}})(v);if(!F)continue;let{name:I,arg:A}=F;if(I==="NgModule"){A&&c.set(f.fileName,{filePath:f.fileName,declarations:new Set(K(A,"declarations")),imports:new Set(K(A,"imports")),exports:new Set(K(A,"exports")),providers:new Set(K(A,"providers")),isStandalone:false});break}if(I==="Component"){A&&Ie(A,"standalone")&&(h.add(f.fileName),c.set(f.fileName,{filePath:f.fileName,declarations:new Set,imports:new Set(A?K(A,"imports"):[]),exports:new Set,providers:new Set(A?K(A,"providers"):[]),isStandalone:true}));break}if(I==="Directive"||I==="Pipe"){A&&Ie(A,"standalone")&&h.add(f.fileName);break}}}return {ngModuleMap:c,standaloneComponents:h,classToFile:S}})(e,a),k=(function(y){let x=0;for(let c of y.values())x+=c.size;return x})(i);return common.debug("engine",`ProjectContext built in ${(performance.now()-n).toFixed(2)}ms \u2014 ${a.size} files, ${k} import edges, ${u.size} barrels, ${l.size} files with ext deps, ${g.size} components, ${p.size} template\u2194component links, ${m.size} NgModules/standalone, ${d.size} standalone`),{importGraph:i,reverseImportGraph:o,ngModuleMap:m,standaloneComponents:d,classToFile:w,componentGraph:g,projectFiles:a,rootDir:r,barrelFiles:u,externalDeps:l,templateToComponent:p}}function ce(e){if(C__default.default.isStringLiteralLike(e)||C__default.default.isNoSubstitutionTemplateLiteral(e))return e.text}function K(e,t){for(let r of e.properties){if(!C__default.default.isPropertyAssignment(r)||!C__default.default.isIdentifier(r.name)||r.name.text!==t)continue;let s=r.initializer;if(!C__default.default.isArrayLiteralExpression(s))break;let n=[];for(let a of s.elements)n.push(...(function i(o){return C__default.default.isIdentifier(o)?[o.text]:C__default.default.isPropertyAccessExpression(o)||C__default.default.isCallExpression(o)?i(o.expression):[]})(a));return n}return []}function Ie(e,t){for(let r of e.properties)if(C__default.default.isPropertyAssignment(r)&&C__default.default.isIdentifier(r.name)&&r.name.text===t)return r.initializer.kind===C__default.default.SyntaxKind.TrueKeyword;return false}var Nt=new Set(["Signal","WritableSignal","InputSignal","ModelSignal","OutputEmitterRef"]),$t=new Set(["WritableSignal","InputSignal","ModelSignal"]),It=new Set(["Subject","BehaviorSubject","ReplaySubject","AsyncSubject"]);function ue(e){if(!e)return _t;let t=new Map,r=(n,a)=>{if(!n)return false;let i=t.get(a);i||(i=new WeakMap,t.set(a,i));let o=i.get(n);if(o!==void 0)return o;let l=(function(u,g){let p=u.getDeclarations();if(!p||p.length===0)return false;let m=`/node_modules/${g}/`;for(let d of p)if(d.getSourceFile().fileName.replace(_e,"/").includes(m))return true;return false})(n,a);return i.set(n,l),l},s=(n,a,i)=>{if(!n)return false;let o=n.aliasSymbol??n.symbol;return !!o&&!!a.has(o.name)&&r(o,i)};return {isFromPackage:r,isFromAngularCore:n=>r(n,"@angular/core"),isSignal:n=>s(n,Nt,"@angular/core"),isWritableSignal:n=>s(n,$t,"@angular/core"),isObservable:n=>{if(!n)return false;let a=n.aliasSymbol??n.symbol;return !!a&&a.name==="Observable"&&r(a,"rxjs")},isSubjectLike:n=>s(n,It,"rxjs"),isHttpClient:n=>{if(!n)return false;let a=n.aliasSymbol??n.symbol;return !!a&&a.name==="HttpClient"&&r(a,"@angular/common")},isInjectionToken:n=>{if(!n)return false;let a=n.aliasSymbol??n.symbol;return !!a&&a.name==="InjectionToken"&&r(a,"@angular/core")},isEventEmitter:n=>{if(!n)return false;let a=n.aliasSymbol??n.symbol;return !!a&&a.name==="EventEmitter"&&r(a,"@angular/core")},isChangeDetectorRef:n=>{if(!n)return false;let a=n.aliasSymbol??n.symbol;return !!a&&a.name==="ChangeDetectorRef"&&r(a,"@angular/core")},isInjectableClass:n=>!!n&&(!!(function(a){let i=a.getDeclarations()?.[0];if(!i||!C__default.default.isClassDeclaration(i)||!C__default.default.canHaveDecorators(i))return false;let o=C__default.default.getDecorators(i);if(!o)return false;for(let l of o){let u=l.expression,g=C__default.default.isCallExpression(u)?u.expression:u;if(C__default.default.isIdentifier(g)&&g.text==="Injectable")return true}return false})(n)||(function(a){let i=a.getDeclarations();if(!i||i.length===0)return false;for(let o of i)if(o.getSourceFile().fileName.replace(_e,"/").includes("/node_modules/@angular/"))return true;return false})(n))}}var _e=/\\/g,_t={isFromPackage:()=>false,isFromAngularCore:()=>false,isSignal:()=>false,isWritableSignal:()=>false,isObservable:()=>false,isSubjectLike:()=>false,isHttpClient:()=>false,isInjectionToken:()=>false,isEventEmitter:()=>false,isChangeDetectorRef:()=>false,isInjectableClass:()=>false};var me=(e,t=[],r,s={})=>{let n,a=B(e);common.debug("engine","Initializing Type-Aware Context (ts.createProgram)...");let i=performance.now(),{program:o}=(function(p,m,d,w){let k=d?.tsconfigRootDir?$__namespace.default.resolve(p,d.tsconfigRootDir):p,y=d?.project?$__namespace.default.resolve(k,d.project):C__default.default.findConfigFile(k,C__default.default.sys.fileExists,"tsconfig.json");if(!y)return {program:void 0};let x=C__default.default.readConfigFile(y,C__default.default.sys.readFile),c=C__default.default.parseJsonConfigFileContent(x.config,C__default.default.sys,k),h=(w.programRootFiles??m).filter(fe),S=h.length>0?h:c.fileNames,f=C__default.default.createProgram({rootNames:S,options:c.options});return common.debug("engine",`Program rootNames: ${S.length} (tsconfig had ${c.fileNames.length})`),{program:f}})(e,t,r,s);o?common.debug("engine",`TypeScript Program ready in ${(performance.now()-i).toFixed(2)}ms (${o.getSourceFiles().length} source files)`):common.debug("engine","Could not find tsconfig.json; TypeChecker and ProjectContext will be unavailable.");let l=o?.getTypeChecker(),u=ue(o);if(o&&s.buildProjectContext!==false)try{n=pe(o,t,e);}catch(p){let m=p instanceof Error?p.message:String(p);common.debug("engine",`ProjectContext build failed (non-fatal): ${m}`);}else o&&common.debug("engine","Skipping ProjectContext build for type-checker-only chunk");let g=o;return {...a,getTypeChecker:p=>Promise.resolve(l),getProjectContext:()=>n,getTsSourceFile:p=>g?.getSourceFile(p),getAngularTypes:()=>u,warmup:()=>(common.debug("engine",`Type-aware context ready: ${g?`ts.Program with ${g.getSourceFiles().length} source files`:"no tsconfig found, TypeChecker unavailable"}`),Promise.resolve()),dispose:()=>{n=void 0,l=void 0,u=void 0,g=void 0,a.dispose();}}},fe=e=>(e.endsWith(".ts")||e.endsWith(".tsx"))&&!e.endsWith(".d.ts");var Oe=async(e,t,r,s,n,a)=>{let i,{Worker:o}=await import('worker_threads'),l=s??Math.max(2,re__default.default.cpus().length),u=await Bt();if(!u)return common.debug("workers","Execution worker not found, falling back to local execution."),We(e,t,r,n??l,a);let g=Ht(e,l),p=[],m=0,d=()=>{m++,common.debug("workers",`Worker progress: ${m}/${l} complete`);},w=g.map(x=>Ot(o,u,t,x,p,d,a));try{i=await Promise.all(w);}catch(x){var k;return await Promise.allSettled(p.map(c=>c.terminate())),common.debug("workers",`Worker execution failed, retrying locally with one file batch at a time: ${(k=x)instanceof Error?k.message:String(k)}`),We(e,t,r,1,a)}let y=i.flat();return common.Ok({results:y,parseErrors:[],stats:Y(y,r)})},Ot=(e,t,r,s,n,a,i)=>new Promise((o,l)=>{let u=false,g=new e(t,{workerData:{rootDir:r,tasks:s}});n.push(g);let p=()=>{clearTimeout(m),g.removeAllListeners();},m=setTimeout(()=>{u||(u=true,p(),a(),g.terminate(),l(Error(`Worker timed out after ${6e4/1e3}s`)));},6e4);g.on("message",d=>{se(d)?i?.(d):u||(u=true,p(),d.errors&&d.errors.length>0&&d.errors.forEach(w=>{common.debug("workers",`Worker failed task ${w.task.taskId}: ${w.error}`);}),a(),o(d.results));}),g.on("error",d=>{u||(u=true,p(),a(),l(d instanceof Error?d:Error(String(d))));}),g.on("exit",d=>{if(u||d===0)return;u=true,p();let w=common.createInfrastructureError("WorkerCrash",{cause:`Worker exited with code ${d}`,phase:"engine",recoverable:true,details:{exitCode:d}});common.debug("workers",`Worker crashed: ${w.cause}`),l(Error(w.cause));});}),We=async(e,t,r,s,n)=>{let a=B(t),i=ye__default.default(s),o=planner.groupTasksByFile(e),l=(await Promise.all(Array.from(o.values()).map(u=>i(async()=>{let g=u[0]?.filePath,p=performance.now(),m=await q(u,a);return g&&(a.evict(g),n?.(U(g,u.length,m,performance.now()-p))),m})))).flat();return common.Ok({results:l,parseErrors:[],stats:Y(l,r)})},Bt=async()=>{let e=$.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 [$.join(e,"..","..","rules","dist","execution-worker.js"),$.join(e,"..","..","rules","dist","execution-worker.cjs")].find(t=>fs.existsSync(t))??null},Ht=(e,t)=>{let r=Array.from(planner.groupTasksByFile(e).values()).sort((a,i)=>i.length-a.length),s=Array.from({length:t},()=>[]),n=Array(t).fill(0);for(let a of r){let i=0,o=n[0];for(let l=1;l<t;l++)n[l]<o&&(o=n[l],i=l);s[i].push(...a),n[i]+=a.length;}return s};function Ge(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 $a=async(e,t)=>{try{if(e.precomputedAnalysis){if((function(f){if(!f||typeof f!="object"||!Array.isArray(f.results)||!Array.isArray(f.parseErrors)||!f.stats||typeof f.stats!="object")return !1;let E=f.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:s,skippedTasks:n,cachedResults:a}=e,i=re__default.default.cpus().length,o=Math.max(1,Math.min(4,i-1)),l=Math.max(1,Math.min(t.maxWorkers??o,i)),u=t.parallelThreshold??150,g=s.filter(f=>!!f.needsTypeChecker||!!f.needsProjectContext),p=s.filter(f=>!f.needsTypeChecker&&!f.needsProjectContext);common.debug("engine",`workerTasks: ${p.length}, typeAwareTasks: ${g.length}`);let m=s.length+n.length,d=n.length,w=f=>{d=Math.min(d+f,m),t.onProgress?.(d,m);};n.length>0&&t.onProgress?.(d,m);let k=[];if(p.length>0)if(p.length>u){common.debug("engine",`Running analysis on ${p.length} syntax-only tasks using workers (max: ${l})...`);let f=await Oe(p,t.rootDir,r,l,void 0,t.onFileProgress);if(!f.ok)return f;k=f.data.results,w(p.length);}else common.debug("engine",`Running analysis on ${p.length} syntax-only tasks locally with batching (concurrency: ${l})...`),k=await xe(p,t.rootDir,l,!1,t.errorCollector,void 0,void 0,!0,void 0,w,t.onFileProgress);if(g.length>0&&!t.skipTypeCheck){let f=planner.groupTasksByFile(g).size,E=t.typeAwareChunkSize??(f>=1e3?50:100),b=Zt(t.typeAwareConcurrency,l),v=Qt(t.typeAwareFileConcurrency,l),F=await qt(g,t.rootDir,b,v,E,t,w,t.onFileProgress);k=[...k,...F];}else g.length>0&&t.skipTypeCheck&&common.debug("engine",`Skipping ${g.length} type-aware tasks (--skip-type-check)`);let y=await mr(n,a,t.cache),x=[...k,...y],c=s.length+n.length,h=c>0?y.length/c:void 0,S={results:x,parseErrors:[],stats:Y(x,r,h)};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(f){let E=f instanceof Error?f.message:String(f);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,s,n,a,i,o=true,l,u,g)=>{let p=s?me(t,a??[],i,{buildProjectContext:o,programRootFiles:l}):B(t);s&&(await p.warmup(),common.debug("engine",`Phase 1 complete \u2014 TypeScript Program ready. Starting Phase 2: ${r} concurrent file batches.`));let m=planner.groupTasksByFile(e);common.debug("engine",`Grouped ${e.length} tasks into ${m.size} file batches`);let d=ye__default.default(r),w=await Promise.all(Array.from(m.values()).map(k=>d(async()=>{let y=k[0]?.filePath,x=performance.now();try{let c=await q(k,p);return p.evict(y),u?.(k.length),y&&g?.(U(y,k.length,c,performance.now()-x,s)),c}catch(c){let h=c instanceof Error?c.message:String(c);return p.evict(y),u?.(k.length),y&&g?.(U(y,k.length,[],performance.now()-x,s)),n?.record(common.createInfrastructureError("IOError",{filePath:y,cause:`Batch execution failed: ${h}`,phase:"engine",recoverable:true})),[]}})));return p.dispose(),w.flat().filter(k=>k!==null)},qt=async(e,t,r,s,n,a,i,o)=>{let l=planner.groupTasksByFile(e),u=await nr(l,t,a.typeAwareChunkStrategy??"dependency"),g=a.typeAwareIsolation??"auto",p=g==="process"||g==="auto"&&u.length>=150,m=rr();common.debug("engine",`Type-aware: ${e.length} tasks across ${u.length} files; requested chunk size ${n}; adaptive cap ${m}; chunk concurrency=${r}; file concurrency=${s}; isolation=${p?"process":"in-process"}`);let d=[],w=ye__default.default(r),k=a.files&&a.files.length>0?a.files:void 0;for(let y of er(u,n,m,r)){let x=await Promise.all(y.map(c=>w(async()=>{common.debug("engine",`Type-aware chunk ${c.index}: ${c.files.length} files, ${c.programRootFiles.length} TS roots, ${c.tasks.length} tasks`);let h=Xt(k,c),S=p?await lr(c.tasks,t,h,c.programRootFiles,c.buildProjectContext,s,a,o):await xe(c.tasks,t,s,true,a.errorCollector,h,a.parserOptions,c.buildProjectContext,c.programRootFiles,i,o);return p&&i?.(c.tasks.length),S})));d.push(...x.flat()),Jt();}return d},Jt=()=>{let e=globalThis.gc;typeof e=="function"&&e();},Xt=(e,t)=>t.buildProjectContext&&e?e:t.files,Zt=(e,t)=>Math.max(1,Math.min(e==null||Number.isNaN(e)?1:Math.floor(e),t,4)),Qt=(e,t)=>Math.max(1,Math.min(e==null||Number.isNaN(e)?1:Math.floor(e),t,8)),er=(e,t,r,s)=>{let n=[],a=tr(t,r),i=0,o=1;for(let l=0;l<e.length;){let u=[];for(let p=0;p<s&&l<e.length;p++){let m=e.slice(l,l+a),d=m.flatMap(([,k])=>k),w=Ve(d);w.length>0?u.push({index:o,tasks:d,files:m.map(([k])=>k),programRootFiles:w,buildProjectContext:d.some(k=>!!k.needsProjectContext)}):common.debug("engine",`Skipping type-aware chunk ${o} with no TypeScript roots (${d.length} tasks)`),o++,l+=m.length;}u.length>0&&n.push(u);let g=ar(a,i,r);a=g.chunkSize,i=g.lowHeapStreak;}return n},tr=(e,t)=>Number.isFinite(e)?Math.max(10,Math.min(t,Math.floor(e))):t,rr=()=>{let e,t=re__default.default.totalmem()/1073741824,r=re__default.default.freemem()/1073741824,s=Ue__default.default.getHeapStatistics().heap_size_limit/1073741824,n=re__default.default.cpus().length;return e=r<1.5||t<4?100:r<3||t<8?300:r<6||t<16?650:r<12||t<32?1e3:1500,n<=4?e=Math.min(e,500):n>=12&&(e=Math.min(2e3,Math.round(1.2*e))),s<2?e=Math.min(e,250):s<4&&(e=Math.min(e,650)),e=Math.max(10,Math.min(2e3,e)),common.debug("engine",`Adaptive type-aware chunk cap: ${e} files (free memory ${r.toFixed(1)}GB, total memory ${t.toFixed(1)}GB, V8 heap limit ${s.toFixed(1)}GB, CPUs ${n})`),e},ar=(e,t,r)=>{let s=process.memoryUsage(),n=Ue__default.default.getHeapStatistics().heap_size_limit,a=n>0?s.heapUsed/n:0;if(a>=.94&&e>10){let i=Math.max(10,Math.floor(e/2));return common.debug("engine",`Critical heap pressure after type-aware chunk (${Math.round(100*a)}% of V8 heap limit); reducing chunk size to ${i}`),{chunkSize:i,lowHeapStreak:0}}if(a>=.88&&e>10){let i=Math.max(10,Math.floor(.8*e));return common.debug("engine",`High heap pressure after type-aware chunk (${Math.round(100*a)}% of V8 heap limit); reducing chunk size to ${i}`),{chunkSize:i,lowHeapStreak:0}}if(a<=.35&&e<r){let i=t+1;if(i<3)return {chunkSize:e,lowHeapStreak:i};let o=Math.min(r,e+Math.max(10,Math.floor(.1*e)));return common.debug("engine",`Sustained low heap pressure after type-aware chunk (${Math.round(100*a)}% of V8 heap limit); increasing chunk size to ${o}`),{chunkSize:o,lowHeapStreak:0}}return {chunkSize:e,lowHeapStreak:0}},Ve=e=>{let t=new Set;for(let r of e){let s=r.inputs.typescript.path;fe(s)&&t.add(s);}return [...t]},nr=async(e,t,r)=>{let s=Array.from(e.entries());if(r==="simple")return common.debug("engine",`Type-aware chunk ordering: simple path sort for ${s.length} files`),he(s);common.debug("engine",`Type-aware chunk ordering: dependency pre-pass for ${s.length} files`);let n=performance.now(),a=await or(s,t,n+5e3);return a?(common.debug("engine",`Dependency chunk ordering complete in ${(performance.now()-n).toFixed(1)}ms`),a):(common.debug("engine","Dependency chunk ordering exceeded 5000ms; falling back to simple path sort"),he(s))},or=async(e,t,r)=>{let s=new Map,n=ye__default.default(64);for(let a=0;a<e.length;a+=64){if(performance.now()>r)return null;let i=e.slice(a,a+64);await Promise.all(i.map(o=>n(async()=>{let[l,u]=o,g=Ve(u)[0]??l,p=await sr(g,t),m=s.get(p)??[];m.push(o),s.set(p,m);})));}return [...s.entries()].sort(([a],[i])=>a.localeCompare(i)).flatMap(([,a])=>he(a))},he=e=>[...e].sort(([t],[r])=>t.localeCompare(r)),sr=async(e,t)=>{let r=$.dirname(e);try{let s=await promises.readFile(e,"utf8"),n=ir(s);return n?$.join(r,n.split("/")[0]??""):r}catch{return $.dirname($.join(t,e))}},ir=e=>/\b(?:import|export)\b[^'"]*['"](\.{1,2}\/[^'"]+)['"]/g.exec(e)?.[1]??null,lr=async(e,t,r,s,n,a,i,o)=>{let l=await cr();return l?new Promise((u,g)=>{let p=child_process.fork(l,[],{cwd:t,execArgv:[],stdio:["ignore","pipe","pipe","ipc"]}),m=false,d=setTimeout(()=>{m||(m=true,p.kill(),g(Error("Type-aware child process timed out after 600s")));},6e5);p.stdout?.on("data",w=>common.debug("engine",`[type-aware-child] ${String(w).trim()}`)),p.stderr?.on("data",w=>common.debug("engine",`[type-aware-child:stderr] ${String(w).trim()}`)),p.on("message",w=>{if(ie(w))return void o?.(w);if(pr(w)){if(m)return;m=true,clearTimeout(d),u(w.results);return}if(ur(w)){if(m)return;m=true,clearTimeout(d),g(Error(w.error));}}),p.on("error",w=>{m||(m=true,clearTimeout(d),g(w));}),p.on("exit",w=>{m||(m=true,clearTimeout(d),g(Error(`Type-aware child process exited before completion with code ${w}`)));}),p.send({rootDir:t,tasks:e,files:r,programRootFiles:s,parserOptions:i.parserOptions,buildProjectContext:n,fileConcurrency:a});}):(common.debug("engine","Type-aware child worker not found; falling back to in-process execution"),xe(e,t,a,true,i.errorCollector,r,i.parserOptions,n,s,void 0,o))},cr=async()=>{let e=$.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 [$.join(e,"..","..","rules","dist","type-aware-worker.js"),$.join(e,"..","..","rules","dist","type-aware-worker.cjs")])if(fs.existsSync(t))return t;return null},pr=e=>!!e&&typeof e=="object"&&e.kind==="complete"&&Array.isArray(e.results),ur=e=>!!e&&typeof e=="object"&&e.kind==="error"&&typeof e.error=="string",mr=async(e,t,r)=>{if(e.length===0)return [];common.debug("engine",`Retrieving results for ${e.length} skipped tasks...`);let s=[],n=[];if(t)for(let a of e){let i=t.get(a.taskId);i&&Ge(i)?s.push(i):n.push(a);}else n.push(...e);if(n.length>0&&r){common.debug("engine",`Fetching ${n.length} results from cache service...`);let a=n.map(o=>o.taskId),i=await r.results.getMany(a);for(let o of n){let l=i.get(o.taskId);l&&Ge(l)&&s.push(l);}}return common.debug("engine",`Retrieved ${s.length} results from cache`),s};var Ye=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],qe=class{frameIndex=0;interval=null;message="";start(t){this.message=t,this.interval||(this.frameIndex=0,Z__default.default.stderr.write("\x1B[?25l"),this.interval=setInterval(()=>{Z__default.default.stderr.write(`\r${Ye[this.frameIndex]} ${this.message}`),this.frameIndex=(this.frameIndex+1)%Ye.length;},80));}update(t){this.message=t;}stop(t){this.interval&&(clearInterval(this.interval),this.interval=null),Z__default.default.stderr.write("\r\x1B[K"),t&&Z__default.default.stderr.write(t+`
`),Z__default.default.stderr.write("\x1B[?25h");}};exports.BUDGET_MS_PER_FILE_WITHOUT_TYPES=Qe;exports.BUDGET_MS_PER_FILE_WITH_TYPES=et;exports.MIN_WORKER_COUNT=Xe;exports.RuleContextFactory=ee;exports.SPINNER_FRAME_INTERVAL_MS=Ze;exports.STREAM_TO_NODE_TYPE=Je;exports.Spinner=qe;exports.WORKER_TIMEOUT_MS=Te;exports.buildFileProgress=U;exports.buildProjectContext=pe;exports.buildVisitorMap=Ce;exports.calculateStats=Y;exports.configureRuleExecutor=Tt;exports.createAnalysisContext=B;exports.createAngularTypeIndex=ue;exports.createAnyAngularClassRule=gr;exports.createCallExpressionRule=xr;exports.createComponentRule=fr;exports.createDecoratedPropertyRule=hr;exports.createNewExpressionRule=wr;exports.createTemplateAttributeRule=yr;exports.createTemplateBlockRule=kr;exports.createTemplateExpressionRule=dr;exports.createTemplateRule=Sr;exports.createTypeAwareAnalysisContext=me;exports.executeBatchedTasks=q;exports.isAnalysisFileProgress=ie;exports.isWorkerFileProgress=se;exports.runAnalysis=$a;exports.runAnalysisParallel=Oe;exports.runSinglePassAnalysis=Ar;//# 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'),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
//# sourceMappingURL=index.cjs.map

@@ -115,12 +115,13 @@ import { RuleContext, RuleFailure, RuleMetadata, InfrastructureErrorCollector, RuleResult, TemplateAst, StyleAst, ProjectContext, AngularTypeIndex, WorkerFileProgress, ParserOptions, Result, AnalysisResult, ComponentFiles } from '@ngcompass/common';

readonly parserOptions?: ParserOptions;
readonly typeAwareChunkSize?: number;
readonly typeAwareIsolation?: 'auto' | 'process' | 'off';
readonly typeAwareChunkStrategy?: 'dependency' | 'simple';
readonly typeAwareConcurrency?: number;
readonly typeAwareFileConcurrency?: number;
readonly typeAwarePerFileTimeoutMs?: number;
readonly skipTypeCheck?: boolean;
readonly onProgress?: (completed: number, total: number) => void;
readonly onFileProgress?: (event: AnalysisFileProgress) => void;
readonly onNotice?: (message: string) => void;
readonly onFileSkipped?: (filePath: string) => void;
}
declare const runAnalysis: (plan: ExecutionPlanOutput, options: AnalysisOptions) => Promise<Result<AnalysisResult>>;
declare const resolveChildExecArgv: (execArgv: ReadonlyArray<string>, nodeOptions: string | undefined) => string[];
declare const computeAdaptiveFileBudget: (explicitMs: number | undefined, observedFiles: number, maxObservedMs: number) => number;

@@ -159,2 +160,6 @@ declare function buildProjectContext(program: ts.Program, files: ReadonlyArray<string>, rootDir: string, componentFiles?: ReadonlyMap<string, ComponentFiles>): ProjectContext;

declare const requestGarbageCollection: () => boolean;
declare const getHeapPressureRatio: () => number;
declare const requestGarbageCollectionUnderPressure: (pressureRatio: number) => boolean;
declare class Spinner {

@@ -171,2 +176,2 @@ private frameIndex;

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 VisitorEntry, type VisitorMap, WORKER_TIMEOUT_MS, buildFileProgress, buildProjectContext, buildVisitorMap, calculateStats, configureRuleExecutor, createAnalysisContext, createAngularTypeIndex, createAnyAngularClassRule, createCallExpressionRule, createComponentRule, createDecoratedPropertyRule, createNewExpressionRule, createTemplateAttributeRule, createTemplateBlockRule, createTemplateExpressionRule, createTemplateRule, createTypeAwareAnalysisContext, executeBatchedTasks, isAnalysisFileProgress, isWorkerFileProgress, 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, createNewExpressionRule, createTemplateAttributeRule, createTemplateBlockRule, createTemplateExpressionRule, createTemplateRule, createTypeAwareAnalysisContext, executeBatchedTasks, getHeapPressureRatio, isAnalysisFileProgress, isWorkerFileProgress, requestGarbageCollection, requestGarbageCollectionUnderPressure, resolveChildExecArgv, runAnalysis, runAnalysisParallel, runSinglePassAnalysis };

@@ -115,12 +115,13 @@ import { RuleContext, RuleFailure, RuleMetadata, InfrastructureErrorCollector, RuleResult, TemplateAst, StyleAst, ProjectContext, AngularTypeIndex, WorkerFileProgress, ParserOptions, Result, AnalysisResult, ComponentFiles } from '@ngcompass/common';

readonly parserOptions?: ParserOptions;
readonly typeAwareChunkSize?: number;
readonly typeAwareIsolation?: 'auto' | 'process' | 'off';
readonly typeAwareChunkStrategy?: 'dependency' | 'simple';
readonly typeAwareConcurrency?: number;
readonly typeAwareFileConcurrency?: number;
readonly typeAwarePerFileTimeoutMs?: number;
readonly skipTypeCheck?: boolean;
readonly onProgress?: (completed: number, total: number) => void;
readonly onFileProgress?: (event: AnalysisFileProgress) => void;
readonly onNotice?: (message: string) => void;
readonly onFileSkipped?: (filePath: string) => void;
}
declare const runAnalysis: (plan: ExecutionPlanOutput, options: AnalysisOptions) => Promise<Result<AnalysisResult>>;
declare const resolveChildExecArgv: (execArgv: ReadonlyArray<string>, nodeOptions: string | undefined) => string[];
declare const computeAdaptiveFileBudget: (explicitMs: number | undefined, observedFiles: number, maxObservedMs: number) => number;

@@ -159,2 +160,6 @@ declare function buildProjectContext(program: ts.Program, files: ReadonlyArray<string>, rootDir: string, componentFiles?: ReadonlyMap<string, ComponentFiles>): ProjectContext;

declare const requestGarbageCollection: () => boolean;
declare const getHeapPressureRatio: () => number;
declare const requestGarbageCollectionUnderPressure: (pressureRatio: number) => boolean;
declare class Spinner {

@@ -171,2 +176,2 @@ private frameIndex;

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 VisitorEntry, type VisitorMap, WORKER_TIMEOUT_MS, buildFileProgress, buildProjectContext, buildVisitorMap, calculateStats, configureRuleExecutor, createAnalysisContext, createAngularTypeIndex, createAnyAngularClassRule, createCallExpressionRule, createComponentRule, createDecoratedPropertyRule, createNewExpressionRule, createTemplateAttributeRule, createTemplateBlockRule, createTemplateExpressionRule, createTemplateRule, createTypeAwareAnalysisContext, executeBatchedTasks, isAnalysisFileProgress, isWorkerFileProgress, 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, createNewExpressionRule, createTemplateAttributeRule, createTemplateBlockRule, createTemplateExpressionRule, createTemplateRule, createTypeAwareAnalysisContext, executeBatchedTasks, getHeapPressureRatio, isAnalysisFileProgress, isWorkerFileProgress, requestGarbageCollection, requestGarbageCollectionUnderPressure, resolveChildExecArgv, runAnalysis, runAnalysisParallel, runSinglePassAnalysis };

@@ -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 C from'typescript';import {fork}from'child_process';import {existsSync}from'fs';import {readFile}from'fs/promises';import {createRequire}from'module';import re from'os';import*as $ from'path';import $__default,{dirname,join}from'path';import {fileURLToPath}from'url';import Ue from'v8';import {groupTasksByFile}from'@ngcompass/planner';import ye from'p-limit';import {LRUCache}from'lru-cache';import Z from'process';var fr=(e,t,r)=>({name:e,streamType:"AngularClass",handle:t,meta:r}),gr=(e,t,r)=>({name:e,streamType:"AnyAngularClass",handle:t,meta:r}),hr=(e,t)=>({name:e,streamType:"DecoratedProperty",handle:t}),dr=(e,t,r)=>({name:e,streamType:"TemplateExpression",handle:t,meta:r}),yr=(e,t,r)=>({name:e,streamType:"TemplateAttribute",handle:t,meta:r}),xr=(e,t,r)=>({name:e,streamType:"CallExpression",handle:t,meta:r}),wr=(e,t,r)=>({name:e,streamType:"NewExpression",handle:t,meta:r}),kr=(e,t,r)=>({name:e,streamType:"TemplateBlock",handle:t,meta:r}),Sr=(e,t,r)=>({name:e,streamType:"Template",handle:t,meta:r});var Je={AngularClass:"ClassDeclaration",AnyAngularClass:"ClassDeclaration",DecoratedProperty:"PropertyDefinition",TemplateExpression:"__template_expression__",TemplateAttribute:"__template_attribute__",TemplateBlock:"__template_block__",Template:"__template_analysis__",CallExpression:"CallExpression",NewExpression:"NewExpression"};function Ce(e,t){let r=new Map;for(let s of e){let n=Je[s.streamType];if(!n||n.startsWith("__"))continue;let a=t[s.streamType];if(!a)continue;let i={ruleName:s.name,filter:a,handle:s.handle.bind(s)},o=r.get(n);o?o.push(i):r.set(n,[i]);}return r}var Xe=2,Ze=80,Te=6e4,Qe=2,et=5;var Q=(e,t,r,s,n,a,i)=>{if(t.length!==0)for(let o of e)for(let l=0;l<t.length;l++){let u=t[l],g=a?performance.now():0;try{let p=u.handle(o,r);if(p){let m=s.get(u.name)??[];Array.isArray(p)?m.push(...p):m.push(p),s.set(u.name,m);}}catch(p){i?.record(createInfrastructureError("RuleExecutionError",{cause:`Rule ${u.name} failed on template node: ${p instanceof Error?p.message:String(p)}`,recoverable:true,phase:"engine",details:{ruleName:u.name,errorName:p instanceof Error?p.name:void 0}}));}if(a){let p=performance.now()-g,m=n.get(u.name);m&&(m.totalMs+=p,m.invocations++);}}},Ar=(e,t,r)=>{let{program:s}=t;if(!s)return {results:e.map(c=>({ruleName:c.name,failures:[]})),performance:{traversalMs:0,nodesVisited:0,ruleTimings:[],cacheStats:{hits:0,misses:0},budgetViolations:[],hasBudgetViolations:false}};let n=performance.now(),a=Ce(e,{AngularClass:toAngularClassStream,AnyAngularClass:toAnyAngularClassStream,DecoratedProperty:toDecoratedPropertyStream,CallExpression:toCallExpressionStream,NewExpression:toNewExpressionStream}),i=e.filter(c=>c.streamType==="TemplateExpression"),o=e.filter(c=>c.streamType==="TemplateAttribute"),l=e.filter(c=>c.streamType==="TemplateBlock"),u=e.filter(c=>c.streamType==="Template"),g=new Map,p=new Map,m=r?.collectRuleTimings??isDebugEnabled(),d=0;for(let c of e)p.set(c.name,{ruleName:c.name,totalMs:0,invocations:0});if(resetComponentCacheStats(),walkProgram(s,c=>{if(!c?.type)return;d++;let h=a.get(c.type);if(h)for(let S=0;S<h.length;S++){let f=h[S],E=m?performance.now():0;try{let b=f.filter(c);if(b!==null){let v=f.handle(b,t);if(v){let F=g.get(f.ruleName)??[];Array.isArray(v)?F.push(...v):F.push(v),g.set(f.ruleName,F);}}}catch(b){r?.errorCollector?.record(createInfrastructureError("RuleExecutionError",{cause:`Rule ${f.ruleName} failed: ${b instanceof Error?b.message:String(b)}`,recoverable:true,phase:"engine",details:{ruleName:f.ruleName,errorName:b instanceof Error?b.name:void 0}}));}if(m){let b=performance.now()-E,v=p.get(f.ruleName);v&&(v.totalMs+=b,v.invocations++);}}}),t.template&&(i.length>0||o.length>0||l.length>0||u.length>0)){let c=analyzeTemplate(t.template),h=t.templateFilePath&&t.templateFileContent&&t.templateLocator?{...t,filePath:t.templateFilePath,fileContent:t.templateFileContent,locator:t.templateLocator}:t;Q(c.expressions,i,h,g,p,m,r?.errorCollector),Q(c.attributes,o,h,g,p,m,r?.errorCollector),Q(c.blocks,l,h,g,p,m,r?.errorCollector),Q([c],u,h,g,p,m,r?.errorCollector);}let w=[];for(let c of e)w.push({ruleName:c.name,failures:g.get(c.name)??[]});let k=performance.now()-n,y=[],x=t.typeChecker?5:2;if(k>x&&y.push(`Total traversal time ${k.toFixed(2)}ms exceeds budget ${x}ms`),m)for(let c of p.values()){if(c.invocations===0)continue;let h=c.totalMs/c.invocations;h>1&&y.push(`Rule ${c.ruleName} averages ${h.toFixed(2)}ms per invocation (threshold: 1ms)`);}return {results:w,performance:{traversalMs:k,nodesVisited:d,ruleTimings:Array.from(p.values()),cacheStats:getComponentCacheStats(),budgetViolations:y,hasBudgetViolations:y.length>0}}};var ee=class{context;constructor(t){this.context=t;}async build(t,r,s){let n,a,i,o,l,[u,g]=await Promise.all([this.context.readFile(t),this.context.getProgram(t)]),p=new Locator(u);this.context.getTypeChecker&&(n=await this.context.getTypeChecker(t)),s&&(a=await this.context.getTemplate(t));let m=this.context.getProjectContext?.(),d=this.context.getAngularTypes?.();s&&!a&&m&&(i=this.resolveExternalTemplatePath(t,m))&&(a=await this.context.getTemplate(i),l=new Locator(o=await this.context.readFile(i)));let w=m?await this.buildCrossRef(t,a,m):void 0;return {filePath:t,fileContent:u,locator:p,program:g,typeChecker:n,template:a,templateFilePath:i,templateFileContent:o,templateLocator:l,options:r,project:m,crossRef:w,angularTypes:d}}resolveExternalTemplatePath(t,r){let s=t.endsWith(".component.ts")?t:r.templateToComponent.get(t);if(s)return r.componentGraph.get(s)?.templatePath}async buildCrossRef(t,r,s){let n,a,i,o=t.endsWith(".component.ts")?t:s.templateToComponent.get(t);if(!o)return;let l=s.componentGraph.get(o),u=l?.templatePath,g=l?.stylePaths??[],p=l?.specPath;try{let d=await this.getComponentSourceFile(o);d&&(n=(function(w){let k=new Set;for(let y of w.statements)if(C.isClassDeclaration(y))for(let x of y.members){let c=C.canHaveModifiers(x)?C.getModifiers(x):void 0;if(c&&c.some(S=>S.kind===C.SyntaxKind.PrivateKeyword||S.kind===C.SyntaxKind.ProtectedKeyword))continue;let h=x.name;h&&!C.isPrivateIdentifier(h)&&(C.isIdentifier(h)||C.isStringLiteral(h))&&k.add(h.text);}return k})(d),a=(function(w){let k=new Set;for(let y of w.statements)if(C.isClassDeclaration(y))for(let x of y.members){if(!C.isPropertyDeclaration(x)||!x.initializer||!x.name||C.isPrivateIdentifier(x.name))continue;let c=(function(h){let S=C.isAsExpression(h)||C.isSatisfiesExpression(h)?h.expression:h;if(!C.isCallExpression(S))return;let f=S.expression;return C.isIdentifier(f)?f.text:C.isPropertyAccessExpression(f)?C.isIdentifier(f.expression)&&f.expression.text==="input"?"input":f.name.text:void 0})(x.initializer);c&&ut.has(c)&&(C.isIdentifier(x.name)||C.isStringLiteral(x.name))&&k.add(x.name.text);}return k})(d));}catch{}let m=r;if(!m&&u)try{m=await this.context.getTemplate(u);}catch{}if(m)try{i=(function(d){let w=new Set,k=/\{\{([\s\S]*?)\}\}/g;for(let y of d.rootNodes)(function x(c){if(c&&typeof c=="object"){if(Array.isArray(c.attrs))for(let h of c.attrs){if((typeof h.name=="string"?h.name:"").startsWith("("))continue;let S=h.value;typeof S=="string"&&S&&ve(S,w);}if(typeof c.value=="string"&&c.value){let h;for(k.lastIndex=0;(h=k.exec(c.value))!==null;)ve(h[1],w);}if(Array.isArray(c.children))for(let h of c.children)x(h);}})(y);return w})(m);}catch{}return {componentPath:o,templatePath:u,stylePaths:g,specPath:p,publicMembers:n,signalMembers:a,templateReferences:i}}async getComponentSourceFile(t){let r=this.context.getTsSourceFile?.(t);if(r)return r;let s=await this.context.readFile(t);return C.createSourceFile(t,s,C.ScriptTarget.Latest,true)}},ut=new Set(["signal","computed","linkedSignal","input","model","toSignal"]),Pe=/\b([a-zA-Z_$][a-zA-Z0-9_$]*)\b/g;function ve(e,t){let r;for(Pe.lastIndex=0;(r=Pe.exec(e))!==null;)t.add(r[1]);}var yt=new Set([".css",".scss",".sass",".less"]),B=e=>{let t=new LRUCache({max:128}),r=new LRUCache({max:64}),s=new LRUCache({max:64}),n=new LRUCache({max:64}),a=o=>{let l=t.get(o);if(l)return l;let u=xt(e,o);return t.set(o,u),u},i=o=>{let l=r.get(o);if(l)return l;let u=a(o).then(g=>parseTs(g,o).program);return r.set(o,u),u};return {rootDir:e,readFile:a,getProgram:i,getTemplate:o=>{let l=s.get(o);if(l)return l;let u=wt(o,a,i);return s.set(o,u),u},getStyle:o=>{let l=n.get(o);if(l)return l;let u=$.extname(o).toLowerCase();if(!yt.has(u)){let p=Promise.resolve(void 0);return n.set(o,p),p}let g=a(o).then(p=>parseCss(p,o));return n.set(o,g),g},evict:o=>{t.delete(o),r.delete(o),s.delete(o),n.delete(o);},dispose:()=>{t.clear(),r.clear(),s.clear(),n.clear();}}},xt=async(e,t)=>{try{return await readFile($.resolve(e,t),"utf-8")}catch(r){let s=r instanceof Error?r.message:String(r);throw Error(`Cannot read file: ${t}. ${s}`)}},wt=async(e,t,r)=>{let s=await kt(e,t,r);if(s&&s.content)return parseHtml(s.content,s.startOffset)},kt=async(e,t,r)=>{let s=$.extname(e);if(s===".html")return {content:await t(e),startOffset:0};if(s===".ts"){let n=extractTemplateFromProgram(await r(e));return n.content?n:null}return null};var Y=(e,t,r)=>{let s=performance.now()-t,n=e.flatMap(l=>l.failures),a=new Set(n.map(l=>l.filePath)),i=0,o=0;for(let l of n)St(l.severity)?i++:Ct(l.severity)&&o++;return {totalFiles:a.size,totalErrors:i,totalWarnings:o,duration:s,cacheHitRate:r}},St=e=>e==="error",Ct=e=>e==="warn";var U=(e,t,r,s,n)=>{let a=0,i=0;for(let o of r)for(let l of o.failures)l.severity==="error"?a++:l.severity==="warn"&&i++;return {filePath:e,taskCount:t,issueCount:a+i,errorCount:a,warningCount:i,duration:s,typeAware:n}},se=e=>!!e&&typeof e=="object"&&e.kind==="file-progress",ie=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,Tt=(e,t)=>{Ae=e,Fe=t;},Me=()=>Ae,Ne=()=>Fe;var q=async(e,t,r)=>{if(e.length===0)return [];let s=e[0].filePath,n=new ee(t),a=new Map,i=[];for(let o of e){if(!Ne()(o.ruleName)){debug("engine",`Skipping task ${o.taskId}: Rule "${o.ruleName}" not registered in engine.`),i.push({ruleName:o.ruleName,taskId:o.taskId,failures:[]});continue}let l=vt(o,r);if(l===null){i.push({ruleName:o.ruleName,taskId:o.taskId,failures:[]});continue}let u=a.get(l)??Pt(o.options);u.ruleNames.push(o.ruleName),u.taskIds.push(o.taskId),u.severities.set(o.ruleName,o.severity),a.set(l,u);}for(let o of a.values()){let l=await At(o,e,s,n,r);i.push(...l);}return i},Pt=e=>({options:e,ruleNames:[],taskIds:[],severities:new Map}),vt=(e,t)=>{try{return stableSerialize(e.options||{})}catch(r){let s=r instanceof SerializationError?r.message:String(r);return debug("engine",`Skipping task ${e.taskId}: failed to serialize options \u2014 ${s}`),t?.record(createInfrastructureError("SerializationError",{cause:s,phase:"engine",recoverable:true})),null}},At=async(e,t,r,s,n)=>{try{let a=new Set(e.taskIds),i=t.some(u=>a.has(u.taskId)&&u.inputs.template?.needsAst),o=await s.build(r,e.options,i),l=Me()(e.ruleNames,o);return Ft(e,l)}catch(a){let i=a instanceof Error?a.message:String(a);return debug("engine",`Failed to execute batch for ${r}: ${i}`),n?.record(createInfrastructureError("ParseError",{filePath:r,cause:i,phase:"engine",recoverable:true})),e.ruleNames.map((o,l)=>({ruleName:o,failures:[],taskId:e.taskIds[l]}))}},Ft=(e,t)=>{let r=new Map;for(let n=0;n<e.ruleNames.length;n++){let a=e.ruleNames[n],i=r.get(a);i?i.ids.push(e.taskIds[n]):r.set(a,{ids:[e.taskIds[n]],cursor:0});}let s=[];for(let n of t){let a=e.severities.get(n.ruleName),i=a?{...n,failures:n.failures.map(l=>({...l,severity:a}))}:n,o=r.get(n.ruleName);o&&o.cursor<o.ids.length?s.push({...i,taskId:o.ids[o.cursor++]}):s.push(i);}return s};function pe(e,t,r,s){let n=performance.now(),a=(function(y,x,c){var h;let S=new Set;for(let E of y)S.add($.resolve(x,E));let f=(h=x).endsWith($.sep)?h:h+$.sep;for(let E of c.getSourceFiles())!E.isDeclarationFile&&E.fileName.startsWith(f)&&S.add(E.fileName);return S})(t,r,e),{importGraph:i,reverseImportGraph:o,externalDeps:l}=(function(y,x){let c=y.getCompilerOptions(),h=C.createModuleResolutionCache(y.getCurrentDirectory(),C.sys.useCaseSensitiveFileNames?b=>b:b=>b.toLowerCase(),c),S=new Map,f=new Map,E=new Map;for(let b of x)S.set(b,new Set),f.set(b,new Set);for(let b of y.getSourceFiles()){if(b.isDeclarationFile||!x.has(b.fileName))continue;let v=b.fileName;for(let F of (function(I){let A=[];return C.forEachChild(I,function N(T){C.isImportDeclaration(T)&&C.isStringLiteral(T.moduleSpecifier)||C.isExportDeclaration(T)&&T.moduleSpecifier&&C.isStringLiteral(T.moduleSpecifier)?A.push(T.moduleSpecifier.text):(C.isCallExpression(T)&&T.expression.kind===C.SyntaxKind.ImportKeyword&&T.arguments.length>0&&C.isStringLiteralLike(T.arguments[0])&&A.push(T.arguments[0].text),C.forEachChild(T,N));}),A})(b)){let I=C.resolveModuleName(F,v,c,C.sys,h),A=I.resolvedModule?.resolvedFileName;if(A&&x.has(A)){S.get(v).add(A);let N=f.get(A);N||(N=new Set,f.set(A,N)),N.add(v);}else {let N=(function(T){if(T.startsWith(".")||$.isAbsolute(T))return null;if(T.startsWith("@")){let _=T.indexOf("/",1);if(_===-1)return null;let W=T.indexOf("/",_+1);return W===-1?T:T.slice(0,W)}let z=T.indexOf("/");return z===-1?T:T.slice(0,z)})(F);if(N){let T=E.get(v);T||(T=new Set,E.set(v,T)),T.add(N);}}}}return {importGraph:S,reverseImportGraph:f,externalDeps:E}})(e,a),u=(function(y,x){let c=new Set;for(let h of y.getSourceFiles()){if(h.isDeclarationFile||!x.has(h.fileName))continue;let{statements:S}=h;S.length!==0&&S.every(f=>C.isExportDeclaration(f)&&f.moduleSpecifier!=null)&&c.add(h.fileName);}return c})(e,a),g=s??(function(y,x){let c=new Map,h=[".scss",".sass",".css",".less"];for(let S of y){if(!S.endsWith(".component.ts"))continue;let f=$.dirname(S),E=$.basename(S,".ts"),b=$.join(f,E+".html"),v=y.has(b)?b:void 0,F=[];for(let N of h){let T=$.join(f,E+N);y.has(T)&&F.push(T);}if(!v||F.length===0){let N=(function(T,z,_,W){let we,ke=T.getSourceFile(z);if(!ke)return {templatePath:void 0,stylePaths:[]};let Se=(function(j){for(let L of j.statements){if(!C.isClassDeclaration(L))continue;let R=C.canHaveDecorators(L)?C.getDecorators(L):void 0;if(R)for(let D of R){let O=D.expression;if(!C.isCallExpression(O)||!C.isIdentifier(O.expression)||O.expression.text!=="Component")continue;let oe=O.arguments[0];if(oe&&C.isObjectLiteralExpression(oe))return oe}}})(ke);if(!Se)return {templatePath:void 0,stylePaths:[]};let ne=[];for(let j of Se.properties){if(!C.isPropertyAssignment(j)||!C.isIdentifier(j.name))continue;let L=j.name.text;if(L==="templateUrl"){let R=ce(j.initializer);if(R){let D=$.resolve(_,R);W.has(D)&&(we=D);}continue}if(L==="styleUrl"){let R=ce(j.initializer);if(R){let D=$.resolve(_,R);W.has(D)&&ne.push(D);}continue}if(L==="styleUrls"&&C.isArrayLiteralExpression(j.initializer))for(let R of j.initializer.elements){let D=ce(R);if(!D)continue;let O=$.resolve(_,D);W.has(O)&&ne.push(O);}}return {templatePath:we,stylePaths:ne}})(x,S,f,y);!v&&N.templatePath&&(v=N.templatePath),F.length===0&&N.stylePaths.length>0&&F.push(...N.stylePaths);}let I=$.join(f,E+".spec.ts"),A=y.has(I)?I:void 0;c.set(S,{tsPath:S,templatePath:v,stylePaths:F,specPath:A});}return c})(a,e),p=(function(y){let x=new Map;for(let[c,h]of y)h.templatePath&&x.set(h.templatePath,c);return x})(g),{ngModuleMap:m,standaloneComponents:d,classToFile:w}=(function(y,x){let c=new Map,h=new Set,S=(function(f,E){let b=new Map;for(let v of f.getSourceFiles())if(!v.isDeclarationFile&&E.has(v.fileName))for(let F of v.statements){if(!C.isClassDeclaration(F)||!F.name)continue;(C.canHaveModifiers(F)?C.getModifiers(F):void 0)?.some(A=>A.kind===C.SyntaxKind.ExportKeyword)&&b.set(F.name.text,v.fileName);}return b})(y,x);for(let f of y.getSourceFiles())if(!f.isDeclarationFile&&x.has(f.fileName))for(let E of f.statements){if(!C.isClassDeclaration(E))continue;let b=C.canHaveDecorators(E)?C.getDecorators(E):void 0;if(b?.length)for(let v of b){let F=(function(N){let T=N.expression;if(!C.isCallExpression(T))return;let z=T.expression;if(!C.isIdentifier(z))return;let _=T.arguments[0],W=_&&C.isObjectLiteralExpression(_)?_:void 0;return {name:z.text,arg:W}})(v);if(!F)continue;let{name:I,arg:A}=F;if(I==="NgModule"){A&&c.set(f.fileName,{filePath:f.fileName,declarations:new Set(K(A,"declarations")),imports:new Set(K(A,"imports")),exports:new Set(K(A,"exports")),providers:new Set(K(A,"providers")),isStandalone:false});break}if(I==="Component"){A&&Ie(A,"standalone")&&(h.add(f.fileName),c.set(f.fileName,{filePath:f.fileName,declarations:new Set,imports:new Set(A?K(A,"imports"):[]),exports:new Set,providers:new Set(A?K(A,"providers"):[]),isStandalone:true}));break}if(I==="Directive"||I==="Pipe"){A&&Ie(A,"standalone")&&h.add(f.fileName);break}}}return {ngModuleMap:c,standaloneComponents:h,classToFile:S}})(e,a),k=(function(y){let x=0;for(let c of y.values())x+=c.size;return x})(i);return debug("engine",`ProjectContext built in ${(performance.now()-n).toFixed(2)}ms \u2014 ${a.size} files, ${k} import edges, ${u.size} barrels, ${l.size} files with ext deps, ${g.size} components, ${p.size} template\u2194component links, ${m.size} NgModules/standalone, ${d.size} standalone`),{importGraph:i,reverseImportGraph:o,ngModuleMap:m,standaloneComponents:d,classToFile:w,componentGraph:g,projectFiles:a,rootDir:r,barrelFiles:u,externalDeps:l,templateToComponent:p}}function ce(e){if(C.isStringLiteralLike(e)||C.isNoSubstitutionTemplateLiteral(e))return e.text}function K(e,t){for(let r of e.properties){if(!C.isPropertyAssignment(r)||!C.isIdentifier(r.name)||r.name.text!==t)continue;let s=r.initializer;if(!C.isArrayLiteralExpression(s))break;let n=[];for(let a of s.elements)n.push(...(function i(o){return C.isIdentifier(o)?[o.text]:C.isPropertyAccessExpression(o)||C.isCallExpression(o)?i(o.expression):[]})(a));return n}return []}function Ie(e,t){for(let r of e.properties)if(C.isPropertyAssignment(r)&&C.isIdentifier(r.name)&&r.name.text===t)return r.initializer.kind===C.SyntaxKind.TrueKeyword;return false}var Nt=new Set(["Signal","WritableSignal","InputSignal","ModelSignal","OutputEmitterRef"]),$t=new Set(["WritableSignal","InputSignal","ModelSignal"]),It=new Set(["Subject","BehaviorSubject","ReplaySubject","AsyncSubject"]);function ue(e){if(!e)return _t;let t=new Map,r=(n,a)=>{if(!n)return false;let i=t.get(a);i||(i=new WeakMap,t.set(a,i));let o=i.get(n);if(o!==void 0)return o;let l=(function(u,g){let p=u.getDeclarations();if(!p||p.length===0)return false;let m=`/node_modules/${g}/`;for(let d of p)if(d.getSourceFile().fileName.replace(_e,"/").includes(m))return true;return false})(n,a);return i.set(n,l),l},s=(n,a,i)=>{if(!n)return false;let o=n.aliasSymbol??n.symbol;return !!o&&!!a.has(o.name)&&r(o,i)};return {isFromPackage:r,isFromAngularCore:n=>r(n,"@angular/core"),isSignal:n=>s(n,Nt,"@angular/core"),isWritableSignal:n=>s(n,$t,"@angular/core"),isObservable:n=>{if(!n)return false;let a=n.aliasSymbol??n.symbol;return !!a&&a.name==="Observable"&&r(a,"rxjs")},isSubjectLike:n=>s(n,It,"rxjs"),isHttpClient:n=>{if(!n)return false;let a=n.aliasSymbol??n.symbol;return !!a&&a.name==="HttpClient"&&r(a,"@angular/common")},isInjectionToken:n=>{if(!n)return false;let a=n.aliasSymbol??n.symbol;return !!a&&a.name==="InjectionToken"&&r(a,"@angular/core")},isEventEmitter:n=>{if(!n)return false;let a=n.aliasSymbol??n.symbol;return !!a&&a.name==="EventEmitter"&&r(a,"@angular/core")},isChangeDetectorRef:n=>{if(!n)return false;let a=n.aliasSymbol??n.symbol;return !!a&&a.name==="ChangeDetectorRef"&&r(a,"@angular/core")},isInjectableClass:n=>!!n&&(!!(function(a){let i=a.getDeclarations()?.[0];if(!i||!C.isClassDeclaration(i)||!C.canHaveDecorators(i))return false;let o=C.getDecorators(i);if(!o)return false;for(let l of o){let u=l.expression,g=C.isCallExpression(u)?u.expression:u;if(C.isIdentifier(g)&&g.text==="Injectable")return true}return false})(n)||(function(a){let i=a.getDeclarations();if(!i||i.length===0)return false;for(let o of i)if(o.getSourceFile().fileName.replace(_e,"/").includes("/node_modules/@angular/"))return true;return false})(n))}}var _e=/\\/g,_t={isFromPackage:()=>false,isFromAngularCore:()=>false,isSignal:()=>false,isWritableSignal:()=>false,isObservable:()=>false,isSubjectLike:()=>false,isHttpClient:()=>false,isInjectionToken:()=>false,isEventEmitter:()=>false,isChangeDetectorRef:()=>false,isInjectableClass:()=>false};var me=(e,t=[],r,s={})=>{let n,a=B(e);debug("engine","Initializing Type-Aware Context (ts.createProgram)...");let i=performance.now(),{program:o}=(function(p,m,d,w){let k=d?.tsconfigRootDir?$__default.resolve(p,d.tsconfigRootDir):p,y=d?.project?$__default.resolve(k,d.project):C.findConfigFile(k,C.sys.fileExists,"tsconfig.json");if(!y)return {program:void 0};let x=C.readConfigFile(y,C.sys.readFile),c=C.parseJsonConfigFileContent(x.config,C.sys,k),h=(w.programRootFiles??m).filter(fe),S=h.length>0?h:c.fileNames,f=C.createProgram({rootNames:S,options:c.options});return debug("engine",`Program rootNames: ${S.length} (tsconfig had ${c.fileNames.length})`),{program:f}})(e,t,r,s);o?debug("engine",`TypeScript Program ready in ${(performance.now()-i).toFixed(2)}ms (${o.getSourceFiles().length} source files)`):debug("engine","Could not find tsconfig.json; TypeChecker and ProjectContext will be unavailable.");let l=o?.getTypeChecker(),u=ue(o);if(o&&s.buildProjectContext!==false)try{n=pe(o,t,e);}catch(p){let m=p instanceof Error?p.message:String(p);debug("engine",`ProjectContext build failed (non-fatal): ${m}`);}else o&&debug("engine","Skipping ProjectContext build for type-checker-only chunk");let g=o;return {...a,getTypeChecker:p=>Promise.resolve(l),getProjectContext:()=>n,getTsSourceFile:p=>g?.getSourceFile(p),getAngularTypes:()=>u,warmup:()=>(debug("engine",`Type-aware context ready: ${g?`ts.Program with ${g.getSourceFiles().length} source files`:"no tsconfig found, TypeChecker unavailable"}`),Promise.resolve()),dispose:()=>{n=void 0,l=void 0,u=void 0,g=void 0,a.dispose();}}},fe=e=>(e.endsWith(".ts")||e.endsWith(".tsx"))&&!e.endsWith(".d.ts");var Oe=async(e,t,r,s,n,a)=>{let i,{Worker:o}=await import('worker_threads'),l=s??Math.max(2,re.cpus().length),u=await Bt();if(!u)return debug("workers","Execution worker not found, falling back to local execution."),We(e,t,r,n??l,a);let g=Ht(e,l),p=[],m=0,d=()=>{m++,debug("workers",`Worker progress: ${m}/${l} complete`);},w=g.map(x=>Ot(o,u,t,x,p,d,a));try{i=await Promise.all(w);}catch(x){var k;return await Promise.allSettled(p.map(c=>c.terminate())),debug("workers",`Worker execution failed, retrying locally with one file batch at a time: ${(k=x)instanceof Error?k.message:String(k)}`),We(e,t,r,1,a)}let y=i.flat();return Ok({results:y,parseErrors:[],stats:Y(y,r)})},Ot=(e,t,r,s,n,a,i)=>new Promise((o,l)=>{let u=false,g=new e(t,{workerData:{rootDir:r,tasks:s}});n.push(g);let p=()=>{clearTimeout(m),g.removeAllListeners();},m=setTimeout(()=>{u||(u=true,p(),a(),g.terminate(),l(Error(`Worker timed out after ${6e4/1e3}s`)));},6e4);g.on("message",d=>{se(d)?i?.(d):u||(u=true,p(),d.errors&&d.errors.length>0&&d.errors.forEach(w=>{debug("workers",`Worker failed task ${w.task.taskId}: ${w.error}`);}),a(),o(d.results));}),g.on("error",d=>{u||(u=true,p(),a(),l(d instanceof Error?d:Error(String(d))));}),g.on("exit",d=>{if(u||d===0)return;u=true,p();let w=createInfrastructureError("WorkerCrash",{cause:`Worker exited with code ${d}`,phase:"engine",recoverable:true,details:{exitCode:d}});debug("workers",`Worker crashed: ${w.cause}`),l(Error(w.cause));});}),We=async(e,t,r,s,n)=>{let a=B(t),i=ye(s),o=groupTasksByFile(e),l=(await Promise.all(Array.from(o.values()).map(u=>i(async()=>{let g=u[0]?.filePath,p=performance.now(),m=await q(u,a);return g&&(a.evict(g),n?.(U(g,u.length,m,performance.now()-p))),m})))).flat();return Ok({results:l,parseErrors:[],stats:Y(l,r)})},Bt=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},Ht=(e,t)=>{let r=Array.from(groupTasksByFile(e).values()).sort((a,i)=>i.length-a.length),s=Array.from({length:t},()=>[]),n=Array(t).fill(0);for(let a of r){let i=0,o=n[0];for(let l=1;l<t;l++)n[l]<o&&(o=n[l],i=l);s[i].push(...a),n[i]+=a.length;}return s};function Ge(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 $a=async(e,t)=>{try{if(e.precomputedAnalysis){if((function(f){if(!f||typeof f!="object"||!Array.isArray(f.results)||!Array.isArray(f.parseErrors)||!f.stats||typeof f.stats!="object")return !1;let E=f.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:s,skippedTasks:n,cachedResults:a}=e,i=re.cpus().length,o=Math.max(1,Math.min(4,i-1)),l=Math.max(1,Math.min(t.maxWorkers??o,i)),u=t.parallelThreshold??150,g=s.filter(f=>!!f.needsTypeChecker||!!f.needsProjectContext),p=s.filter(f=>!f.needsTypeChecker&&!f.needsProjectContext);debug("engine",`workerTasks: ${p.length}, typeAwareTasks: ${g.length}`);let m=s.length+n.length,d=n.length,w=f=>{d=Math.min(d+f,m),t.onProgress?.(d,m);};n.length>0&&t.onProgress?.(d,m);let k=[];if(p.length>0)if(p.length>u){debug("engine",`Running analysis on ${p.length} syntax-only tasks using workers (max: ${l})...`);let f=await Oe(p,t.rootDir,r,l,void 0,t.onFileProgress);if(!f.ok)return f;k=f.data.results,w(p.length);}else debug("engine",`Running analysis on ${p.length} syntax-only tasks locally with batching (concurrency: ${l})...`),k=await xe(p,t.rootDir,l,!1,t.errorCollector,void 0,void 0,!0,void 0,w,t.onFileProgress);if(g.length>0&&!t.skipTypeCheck){let f=groupTasksByFile(g).size,E=t.typeAwareChunkSize??(f>=1e3?50:100),b=Zt(t.typeAwareConcurrency,l),v=Qt(t.typeAwareFileConcurrency,l),F=await qt(g,t.rootDir,b,v,E,t,w,t.onFileProgress);k=[...k,...F];}else g.length>0&&t.skipTypeCheck&&debug("engine",`Skipping ${g.length} type-aware tasks (--skip-type-check)`);let y=await mr(n,a,t.cache),x=[...k,...y],c=s.length+n.length,h=c>0?y.length/c:void 0,S={results:x,parseErrors:[],stats:Y(x,r,h)};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(f){let E=f instanceof Error?f.message:String(f);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,s,n,a,i,o=true,l,u,g)=>{let p=s?me(t,a??[],i,{buildProjectContext:o,programRootFiles:l}):B(t);s&&(await p.warmup(),debug("engine",`Phase 1 complete \u2014 TypeScript Program ready. Starting Phase 2: ${r} concurrent file batches.`));let m=groupTasksByFile(e);debug("engine",`Grouped ${e.length} tasks into ${m.size} file batches`);let d=ye(r),w=await Promise.all(Array.from(m.values()).map(k=>d(async()=>{let y=k[0]?.filePath,x=performance.now();try{let c=await q(k,p);return p.evict(y),u?.(k.length),y&&g?.(U(y,k.length,c,performance.now()-x,s)),c}catch(c){let h=c instanceof Error?c.message:String(c);return p.evict(y),u?.(k.length),y&&g?.(U(y,k.length,[],performance.now()-x,s)),n?.record(createInfrastructureError("IOError",{filePath:y,cause:`Batch execution failed: ${h}`,phase:"engine",recoverable:true})),[]}})));return p.dispose(),w.flat().filter(k=>k!==null)},qt=async(e,t,r,s,n,a,i,o)=>{let l=groupTasksByFile(e),u=await nr(l,t,a.typeAwareChunkStrategy??"dependency"),g=a.typeAwareIsolation??"auto",p=g==="process"||g==="auto"&&u.length>=150,m=rr();debug("engine",`Type-aware: ${e.length} tasks across ${u.length} files; requested chunk size ${n}; adaptive cap ${m}; chunk concurrency=${r}; file concurrency=${s}; isolation=${p?"process":"in-process"}`);let d=[],w=ye(r),k=a.files&&a.files.length>0?a.files:void 0;for(let y of er(u,n,m,r)){let x=await Promise.all(y.map(c=>w(async()=>{debug("engine",`Type-aware chunk ${c.index}: ${c.files.length} files, ${c.programRootFiles.length} TS roots, ${c.tasks.length} tasks`);let h=Xt(k,c),S=p?await lr(c.tasks,t,h,c.programRootFiles,c.buildProjectContext,s,a,o):await xe(c.tasks,t,s,true,a.errorCollector,h,a.parserOptions,c.buildProjectContext,c.programRootFiles,i,o);return p&&i?.(c.tasks.length),S})));d.push(...x.flat()),Jt();}return d},Jt=()=>{let e=globalThis.gc;typeof e=="function"&&e();},Xt=(e,t)=>t.buildProjectContext&&e?e:t.files,Zt=(e,t)=>Math.max(1,Math.min(e==null||Number.isNaN(e)?1:Math.floor(e),t,4)),Qt=(e,t)=>Math.max(1,Math.min(e==null||Number.isNaN(e)?1:Math.floor(e),t,8)),er=(e,t,r,s)=>{let n=[],a=tr(t,r),i=0,o=1;for(let l=0;l<e.length;){let u=[];for(let p=0;p<s&&l<e.length;p++){let m=e.slice(l,l+a),d=m.flatMap(([,k])=>k),w=Ve(d);w.length>0?u.push({index:o,tasks:d,files:m.map(([k])=>k),programRootFiles:w,buildProjectContext:d.some(k=>!!k.needsProjectContext)}):debug("engine",`Skipping type-aware chunk ${o} with no TypeScript roots (${d.length} tasks)`),o++,l+=m.length;}u.length>0&&n.push(u);let g=ar(a,i,r);a=g.chunkSize,i=g.lowHeapStreak;}return n},tr=(e,t)=>Number.isFinite(e)?Math.max(10,Math.min(t,Math.floor(e))):t,rr=()=>{let e,t=re.totalmem()/1073741824,r=re.freemem()/1073741824,s=Ue.getHeapStatistics().heap_size_limit/1073741824,n=re.cpus().length;return e=r<1.5||t<4?100:r<3||t<8?300:r<6||t<16?650:r<12||t<32?1e3:1500,n<=4?e=Math.min(e,500):n>=12&&(e=Math.min(2e3,Math.round(1.2*e))),s<2?e=Math.min(e,250):s<4&&(e=Math.min(e,650)),e=Math.max(10,Math.min(2e3,e)),debug("engine",`Adaptive type-aware chunk cap: ${e} files (free memory ${r.toFixed(1)}GB, total memory ${t.toFixed(1)}GB, V8 heap limit ${s.toFixed(1)}GB, CPUs ${n})`),e},ar=(e,t,r)=>{let s=process.memoryUsage(),n=Ue.getHeapStatistics().heap_size_limit,a=n>0?s.heapUsed/n:0;if(a>=.94&&e>10){let i=Math.max(10,Math.floor(e/2));return debug("engine",`Critical heap pressure after type-aware chunk (${Math.round(100*a)}% of V8 heap limit); reducing chunk size to ${i}`),{chunkSize:i,lowHeapStreak:0}}if(a>=.88&&e>10){let i=Math.max(10,Math.floor(.8*e));return debug("engine",`High heap pressure after type-aware chunk (${Math.round(100*a)}% of V8 heap limit); reducing chunk size to ${i}`),{chunkSize:i,lowHeapStreak:0}}if(a<=.35&&e<r){let i=t+1;if(i<3)return {chunkSize:e,lowHeapStreak:i};let o=Math.min(r,e+Math.max(10,Math.floor(.1*e)));return debug("engine",`Sustained low heap pressure after type-aware chunk (${Math.round(100*a)}% of V8 heap limit); increasing chunk size to ${o}`),{chunkSize:o,lowHeapStreak:0}}return {chunkSize:e,lowHeapStreak:0}},Ve=e=>{let t=new Set;for(let r of e){let s=r.inputs.typescript.path;fe(s)&&t.add(s);}return [...t]},nr=async(e,t,r)=>{let s=Array.from(e.entries());if(r==="simple")return debug("engine",`Type-aware chunk ordering: simple path sort for ${s.length} files`),he(s);debug("engine",`Type-aware chunk ordering: dependency pre-pass for ${s.length} files`);let n=performance.now(),a=await or(s,t,n+5e3);return a?(debug("engine",`Dependency chunk ordering complete in ${(performance.now()-n).toFixed(1)}ms`),a):(debug("engine","Dependency chunk ordering exceeded 5000ms; falling back to simple path sort"),he(s))},or=async(e,t,r)=>{let s=new Map,n=ye(64);for(let a=0;a<e.length;a+=64){if(performance.now()>r)return null;let i=e.slice(a,a+64);await Promise.all(i.map(o=>n(async()=>{let[l,u]=o,g=Ve(u)[0]??l,p=await sr(g,t),m=s.get(p)??[];m.push(o),s.set(p,m);})));}return [...s.entries()].sort(([a],[i])=>a.localeCompare(i)).flatMap(([,a])=>he(a))},he=e=>[...e].sort(([t],[r])=>t.localeCompare(r)),sr=async(e,t)=>{let r=dirname(e);try{let s=await readFile(e,"utf8"),n=ir(s);return n?join(r,n.split("/")[0]??""):r}catch{return dirname(join(t,e))}},ir=e=>/\b(?:import|export)\b[^'"]*['"](\.{1,2}\/[^'"]+)['"]/g.exec(e)?.[1]??null,lr=async(e,t,r,s,n,a,i,o)=>{let l=await cr();return l?new Promise((u,g)=>{let p=fork(l,[],{cwd:t,execArgv:[],stdio:["ignore","pipe","pipe","ipc"]}),m=false,d=setTimeout(()=>{m||(m=true,p.kill(),g(Error("Type-aware child process timed out after 600s")));},6e5);p.stdout?.on("data",w=>debug("engine",`[type-aware-child] ${String(w).trim()}`)),p.stderr?.on("data",w=>debug("engine",`[type-aware-child:stderr] ${String(w).trim()}`)),p.on("message",w=>{if(ie(w))return void o?.(w);if(pr(w)){if(m)return;m=true,clearTimeout(d),u(w.results);return}if(ur(w)){if(m)return;m=true,clearTimeout(d),g(Error(w.error));}}),p.on("error",w=>{m||(m=true,clearTimeout(d),g(w));}),p.on("exit",w=>{m||(m=true,clearTimeout(d),g(Error(`Type-aware child process exited before completion with code ${w}`)));}),p.send({rootDir:t,tasks:e,files:r,programRootFiles:s,parserOptions:i.parserOptions,buildProjectContext:n,fileConcurrency:a});}):(debug("engine","Type-aware child worker not found; falling back to in-process execution"),xe(e,t,a,true,i.errorCollector,r,i.parserOptions,n,s,void 0,o))},cr=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},pr=e=>!!e&&typeof e=="object"&&e.kind==="complete"&&Array.isArray(e.results),ur=e=>!!e&&typeof e=="object"&&e.kind==="error"&&typeof e.error=="string",mr=async(e,t,r)=>{if(e.length===0)return [];debug("engine",`Retrieving results for ${e.length} skipped tasks...`);let s=[],n=[];if(t)for(let a of e){let i=t.get(a.taskId);i&&Ge(i)?s.push(i):n.push(a);}else n.push(...e);if(n.length>0&&r){debug("engine",`Fetching ${n.length} results from cache service...`);let a=n.map(o=>o.taskId),i=await r.results.getMany(a);for(let o of n){let l=i.get(o.taskId);l&&Ge(l)&&s.push(l);}}return debug("engine",`Retrieved ${s.length} results from cache`),s};var Ye=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],qe=class{frameIndex=0;interval=null;message="";start(t){this.message=t,this.interval||(this.frameIndex=0,Z.stderr.write("\x1B[?25l"),this.interval=setInterval(()=>{Z.stderr.write(`\r${Ye[this.frameIndex]} ${this.message}`),this.frameIndex=(this.frameIndex+1)%Ye.length;},80));}update(t){this.message=t;}stop(t){this.interval&&(clearInterval(this.interval),this.interval=null),Z.stderr.write("\r\x1B[K"),t&&Z.stderr.write(t+`
`),Z.stderr.write("\x1B[?25h");}};export{Qe as BUDGET_MS_PER_FILE_WITHOUT_TYPES,et as BUDGET_MS_PER_FILE_WITH_TYPES,Xe as MIN_WORKER_COUNT,ee as RuleContextFactory,Ze as SPINNER_FRAME_INTERVAL_MS,Je as STREAM_TO_NODE_TYPE,qe as Spinner,Te as WORKER_TIMEOUT_MS,U as buildFileProgress,pe as buildProjectContext,Ce as buildVisitorMap,Y as calculateStats,Tt as configureRuleExecutor,B as createAnalysisContext,ue as createAngularTypeIndex,gr as createAnyAngularClassRule,xr as createCallExpressionRule,fr as createComponentRule,hr as createDecoratedPropertyRule,wr as createNewExpressionRule,yr as createTemplateAttributeRule,kr as createTemplateBlockRule,dr as createTemplateExpressionRule,Sr as createTemplateRule,me as createTypeAwareAnalysisContext,q as executeBatchedTasks,ie as isAnalysisFileProgress,se as isWorkerFileProgress,$a as runAnalysis,Oe as runAnalysisParallel,Ar as runSinglePassAnalysis};//# sourceMappingURL=index.js.map
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
//# sourceMappingURL=index.js.map
{
"name": "@ngcompass/engine",
"version": "0.1.9-beta",
"version": "0.2.0-beta",
"description": "Rule execution engine for ngcompass",

@@ -27,6 +27,6 @@ "sideEffects": false,

"p-limit": "^6.1.0",
"@ngcompass/common": "0.1.9-beta",
"@ngcompass/cache": "0.1.9-beta",
"@ngcompass/ast": "0.1.9-beta",
"@ngcompass/planner": "0.1.9-beta"
"@ngcompass/common": "0.2.0-beta",
"@ngcompass/ast": "0.2.0-beta",
"@ngcompass/cache": "0.2.0-beta",
"@ngcompass/planner": "0.2.0-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