@ngcompass/engine
Advanced tools
+2
-2
@@ -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 |
+10
-5
@@ -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 }; |
+10
-5
@@ -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 }; |
+2
-2
@@ -1,3 +0,3 @@ | ||
| import {toNewExpressionStream,toCallExpressionStream,toDecoratedPropertyStream,toAnyAngularClassStream,toAngularClassStream,resetComponentCacheStats,walkProgram,analyzeTemplate,getComponentCacheStats,parseCss,parseHtml,extractTemplateFromProgram,parseTs}from'@ngcompass/ast';import {isDebugEnabled,createInfrastructureError,Locator,debug,stableSerialize,SerializationError,Ok,Err}from'@ngcompass/common';import 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 |
+5
-5
| { | ||
| "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
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
409161
2.56%460
2.22%7
40%2
100%+ Added
+ Added
+ Added
+ Added
+ Added
- Removed
- Removed
- Removed
- Removed
- Removed
Updated
Updated
Updated