ngcompass 0.1.1-beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +299 -0
- package/dist/cli.cjs +450 -0
- package/dist/cli.cjs.map +1 -0
- package/dist/cli.d.cts +3 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.js +442 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.cjs +450 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +442 -0
- package/dist/index.js.map +1 -0
- package/package.json +65 -0
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,450 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
var commander = require('commander');
|
|
5
|
+
var reporters = require('@ngcompass/reporters');
|
|
6
|
+
var config = require('@ngcompass/config');
|
|
7
|
+
var e2 = require('path');
|
|
8
|
+
var r2 = require('picocolors');
|
|
9
|
+
var common = require('@ngcompass/common');
|
|
10
|
+
var n = require('process');
|
|
11
|
+
var cache = require('@ngcompass/cache');
|
|
12
|
+
var rules = require('@ngcompass/rules');
|
|
13
|
+
var engine = require('@ngcompass/engine');
|
|
14
|
+
var planner = require('@ngcompass/planner');
|
|
15
|
+
var scanner = require('@ngcompass/scanner');
|
|
16
|
+
|
|
17
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
18
|
+
|
|
19
|
+
var e2__default = /*#__PURE__*/_interopDefault(e2);
|
|
20
|
+
var r2__default = /*#__PURE__*/_interopDefault(r2);
|
|
21
|
+
var n__default = /*#__PURE__*/_interopDefault(n);
|
|
22
|
+
|
|
23
|
+
// src/commands/exit.ts
|
|
24
|
+
var exitWithError = (s3 = 1) => {
|
|
25
|
+
process.stdout.isTTY && process.stdout.write("\x1B[?25h"), process.exit(s3);
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
// src/commands/init.ts
|
|
29
|
+
function registerInitCommand(t5, i) {
|
|
30
|
+
t5.command("init").description("Create a starter ngcompass configuration in the current project").option("-f, --force", "Overwrite an existing configuration file").option("--cwd <path>", "Project directory where the configuration will be created", process.cwd()).action(async (t6) => {
|
|
31
|
+
try {
|
|
32
|
+
let i2 = await config.initConfig({
|
|
33
|
+
cwd: t6.cwd,
|
|
34
|
+
force: t6.force
|
|
35
|
+
}), c2 = reporters.getConfigReporter();
|
|
36
|
+
await c2.renderInitResult(i2), i2.success || i2.alreadyExists || exitWithError();
|
|
37
|
+
} catch (r7) {
|
|
38
|
+
console.error(r7 instanceof Error ? r7.message : String(r7)), exitWithError();
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
var FRAMES = [
|
|
43
|
+
"\u280B",
|
|
44
|
+
"\u2819",
|
|
45
|
+
"\u2839",
|
|
46
|
+
"\u2838",
|
|
47
|
+
"\u283C",
|
|
48
|
+
"\u2834",
|
|
49
|
+
"\u2826",
|
|
50
|
+
"\u2827",
|
|
51
|
+
"\u2807",
|
|
52
|
+
"\u280F"
|
|
53
|
+
];
|
|
54
|
+
var Spinner = class {
|
|
55
|
+
stream;
|
|
56
|
+
timer = null;
|
|
57
|
+
frameIndex = 0;
|
|
58
|
+
message = "";
|
|
59
|
+
isTTY;
|
|
60
|
+
constructor(t5) {
|
|
61
|
+
this.stream = t5, this.isTTY = !!t5.isTTY;
|
|
62
|
+
}
|
|
63
|
+
start(e6) {
|
|
64
|
+
(this.message = e6, this.frameIndex = 0, this.isTTY) ? (this.stream.write("\x1B[?25l"), this.render(), this.timer = setInterval(() => this.render(), 80)) : this.stream.write(`${r2__default.default.cyan("\u276F")} ${r2__default.default.dim(e6)}
|
|
65
|
+
`);
|
|
66
|
+
}
|
|
67
|
+
writeLine(t5) {
|
|
68
|
+
this.isTTY && this.timer ? (this.stream.write("\r\x1B[K"), this.stream.write(`${t5}
|
|
69
|
+
`), this.render()) : this.stream.write(`${t5}
|
|
70
|
+
`);
|
|
71
|
+
}
|
|
72
|
+
stop() {
|
|
73
|
+
this.timer && (clearInterval(this.timer), this.timer = null), this.isTTY && (this.stream.write("\r\x1B[K"), this.stream.write("\x1B[?25h"));
|
|
74
|
+
}
|
|
75
|
+
render() {
|
|
76
|
+
let e6 = r2__default.default.cyan(FRAMES[this.frameIndex % FRAMES.length]);
|
|
77
|
+
this.frameIndex++, this.stream.write(`\r${e6} ${r2__default.default.dim(this.message)}`);
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
function normalizeReporterFormat(e6) {
|
|
81
|
+
return "ui" === e6 ? "html" : e6 ?? "console";
|
|
82
|
+
}
|
|
83
|
+
function formatDuration(e6) {
|
|
84
|
+
return e6 < 1e3 ? `${Math.max(0, Math.round(e6))}ms` : `${(e6 / 1e3).toFixed(1)}s`;
|
|
85
|
+
}
|
|
86
|
+
function registerAnalyzeCommand(t5, l2) {
|
|
87
|
+
t5.command("analyze").description("Analyze your project and report rule violations and architecture risks").option("-p, --profile <name>", "Configuration profile to run").option("--force", "Ignore cached results and re-run all checks").option("--format <fmt>", "Reporter format: console | json | sarif | html | ui").option("--compact", "Use compact, ESLint-style output").option("-q, --quiet", "Show summary counts only, suppress violation details").option("--no-recommendation", "Suppress fix recommendations from output").option("--output <path>", "Output path for UI reports (default: ngcompass-report.html)").option("--rule <id>", "Run only one rule (useful for debugging or focused checks)").option("--max-workers <n>", "Cap the number of worker threads (lower = less memory, e.g. --max-workers 2)").option("--type-aware-chunk-size <n>", "Files per type-aware chunk (default 400; lower = less peak memory)").option("--skip-type-check", "Skip rules that require the TypeScript type checker (fastest, lowest memory)").action(async (t6) => {
|
|
88
|
+
let u2 = performance.now(), p2 = reporters.getReporter(normalizeReporterFormat(t6.format), {
|
|
89
|
+
compact: !!t6.compact,
|
|
90
|
+
outputPath: t6.output,
|
|
91
|
+
quiet: !!t6.quiet,
|
|
92
|
+
noRecommendation: false === t6.recommendation
|
|
93
|
+
}), c2 = l2, m2 = 0;
|
|
94
|
+
try {
|
|
95
|
+
var f2;
|
|
96
|
+
let i, d2, g2 = await loadConfigurationStep(t6, l2, p2);
|
|
97
|
+
if (!g2) {
|
|
98
|
+
m2 = 1;
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
let { config: h2 } = g2;
|
|
102
|
+
c2 = cache.createRuntimeCache(h2, n__default.default.cwd());
|
|
103
|
+
let w2 = (function(e6, r7) {
|
|
104
|
+
if (e6) return normalizeReporterFormat(e6);
|
|
105
|
+
switch (r7) {
|
|
106
|
+
case "json":
|
|
107
|
+
return "json";
|
|
108
|
+
case "sarif":
|
|
109
|
+
return "sarif";
|
|
110
|
+
case "html":
|
|
111
|
+
return "html";
|
|
112
|
+
default:
|
|
113
|
+
return "console";
|
|
114
|
+
}
|
|
115
|
+
})(t6.format, h2.outputFormat);
|
|
116
|
+
p2 = reporters.getReporter(w2, {
|
|
117
|
+
compact: !!t6.compact,
|
|
118
|
+
outputPath: t6.output ?? h2.outputPath,
|
|
119
|
+
quiet: !!t6.quiet,
|
|
120
|
+
noRecommendation: false === t6.recommendation
|
|
121
|
+
});
|
|
122
|
+
let k2 = await discoverFilesStep(h2, t6, c2, p2);
|
|
123
|
+
if (!k2) {
|
|
124
|
+
m2 = 1;
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
let y = await resolveRulesStep(h2, t6, p2);
|
|
128
|
+
if (!y) {
|
|
129
|
+
m2 = 1;
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
let $ = await buildPlanStep(k2, y, c2, t6, p2, h2);
|
|
133
|
+
if (!$) {
|
|
134
|
+
m2 = 1;
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
let v = "console" === w2 ? n__default.default.stdout : n__default.default.stderr, C = new Spinner(v);
|
|
138
|
+
C.start("Running analysis...");
|
|
139
|
+
let x = (function(t7, o5, n3) {
|
|
140
|
+
let a3 = /* @__PURE__ */ new Map();
|
|
141
|
+
for (let e6 of t7.tasks.map((e7) => e7.filePath).filter((e7) => "string" == typeof e7 && e7.length > 0)) a3.set(e6, (a3.get(e6) ?? 0) + 1);
|
|
142
|
+
let i2 = /* @__PURE__ */ new Map(), s3 = /* @__PURE__ */ new Set();
|
|
143
|
+
return (t8) => {
|
|
144
|
+
var l3;
|
|
145
|
+
if (s3.has(t8.filePath)) return;
|
|
146
|
+
let u3 = i2.get(t8.filePath), p3 = u3 ? {
|
|
147
|
+
filePath: t8.filePath,
|
|
148
|
+
taskCount: u3.taskCount + t8.taskCount,
|
|
149
|
+
issueCount: u3.issueCount + t8.issueCount,
|
|
150
|
+
errorCount: u3.errorCount + t8.errorCount,
|
|
151
|
+
warningCount: u3.warningCount + t8.warningCount,
|
|
152
|
+
duration: u3.duration + t8.duration
|
|
153
|
+
} : t8;
|
|
154
|
+
i2.set(t8.filePath, p3);
|
|
155
|
+
let c3 = a3.get(t8.filePath) ?? p3.taskCount;
|
|
156
|
+
if (p3.taskCount < c3) return;
|
|
157
|
+
s3.add(t8.filePath);
|
|
158
|
+
let m3 = e2__default.default.relative(n3, t8.filePath) || t8.filePath, f3 = p3.issueCount > 0, d3 = f3 ? r2__default.default.red("\u276F") : r2__default.default.green("\u276F"), g3 = f3 ? r2__default.default.red(formatDuration(p3.duration)) : r2__default.default.green(formatDuration(p3.duration));
|
|
159
|
+
o5(f3 ? `${d3} ${r2__default.default.red(m3)} ${g3} ${r2__default.default.red((l3 = p3.issueCount, `${l3.toLocaleString()} issue${1 === l3 ? "" : "s"}`))}` : `${d3} ${r2__default.default.dim(m3)} ${g3}`);
|
|
160
|
+
};
|
|
161
|
+
})($, (e6) => C.writeLine(e6), n__default.default.cwd()), S = await runAnalysisStep($, c2, t6, p2, k2, h2, void 0, h2.maxWorkers, x);
|
|
162
|
+
if (C.stop(), !S) {
|
|
163
|
+
m2 = 1;
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
let F = performance.now() - u2, P = {
|
|
167
|
+
scannedFiles: (/* @__PURE__ */ new Set([
|
|
168
|
+
...$.tasks.map((e6) => e6.filePath),
|
|
169
|
+
...($.skippedTasks ?? []).map((e6) => e6.filePath)
|
|
170
|
+
])).size,
|
|
171
|
+
discoveredFiles: k2.length,
|
|
172
|
+
totalFiles: S.stats.totalFiles,
|
|
173
|
+
totalTasks: $.tasks.length + ($.skippedTasks?.length ?? 0),
|
|
174
|
+
cachedTasks: $.precomputedAnalysis ? $.tasks.length : void 0,
|
|
175
|
+
totalErrors: S.stats.totalErrors,
|
|
176
|
+
totalWarnings: S.stats.totalWarnings,
|
|
177
|
+
failOnSeverity: h2.failOnSeverity,
|
|
178
|
+
maxWarnings: h2.maxWarnings,
|
|
179
|
+
duration: F
|
|
180
|
+
};
|
|
181
|
+
"console" === w2 && p2.summary(P), p2.parseErrors(S.parseErrors), p2.report(S.results), "console" !== w2 && (p2.step("\u276F Writing report..."), p2.summary(P)), $.precomputedAnalysis || await saveToCacheStep(S.results, c2, t6, p2), f2 = S.stats, i = h2.failOnSeverity ?? "error", d2 = h2.maxWarnings ?? 10, (f2.totalErrors > 0 || "warn" === i && f2.totalWarnings > 0 || f2.totalWarnings > d2) && (m2 = 1);
|
|
182
|
+
} catch (e6) {
|
|
183
|
+
p2.error(e6), m2 = 1;
|
|
184
|
+
} finally {
|
|
185
|
+
c2 && c2 !== l2 && await c2.flush(), 0 !== m2 && exitWithError(m2);
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
async function loadConfigurationStep(e6, r7, t5) {
|
|
190
|
+
let o5 = performance.now();
|
|
191
|
+
t5.step("\u276F Loading configuration...");
|
|
192
|
+
let a3 = await config.resolveConfig({
|
|
193
|
+
profile: e6.profile,
|
|
194
|
+
cache: r7,
|
|
195
|
+
cwd: n__default.default.cwd()
|
|
196
|
+
});
|
|
197
|
+
if (!a3.report.valid) {
|
|
198
|
+
let e7 = a3.report.issues.map((e8) => {
|
|
199
|
+
let r8 = e8.path?.join(".") || "root";
|
|
200
|
+
return `[${e8.severity.toUpperCase()}] ${r8}: ${e8.message}`;
|
|
201
|
+
});
|
|
202
|
+
return t5.error(Error([
|
|
203
|
+
"Configuration validation failed",
|
|
204
|
+
...e7
|
|
205
|
+
].join("\n"))), null;
|
|
206
|
+
}
|
|
207
|
+
if (!a3.config) return t5.error(Error("No configuration found")), null;
|
|
208
|
+
let i = a3.config.plugins;
|
|
209
|
+
if (i && i.length > 0) {
|
|
210
|
+
t5.step(`\u276F Loading ${i.length} plugin(s)...`);
|
|
211
|
+
let e7 = n__default.default.cwd();
|
|
212
|
+
await config.loadPlugins(i, e7, rules.getGlobalRegistry()), t5.info(`Loaded ${i.length} plugin(s)`);
|
|
213
|
+
}
|
|
214
|
+
return t5.debug(`Config resolve: ${(performance.now() - o5).toFixed(2)}ms`), {
|
|
215
|
+
config: a3.config
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
async function discoverFilesStep(r7, o5, a3, i) {
|
|
219
|
+
let s3 = performance.now();
|
|
220
|
+
i.step("\u276F Discovering files...");
|
|
221
|
+
let l2 = await scanner.scan({
|
|
222
|
+
rootDir: n__default.default.cwd(),
|
|
223
|
+
include: r7.include ?? [
|
|
224
|
+
...common.DEFAULT_INCLUDE_PATTERNS
|
|
225
|
+
],
|
|
226
|
+
exclude: r7.exclude ?? [],
|
|
227
|
+
ignorePatterns: r7.ignorePatterns,
|
|
228
|
+
tsConfigPath: (function(r8, t5) {
|
|
229
|
+
if (!r8?.project) return;
|
|
230
|
+
let o6 = r8.tsconfigRootDir ? e2__default.default.resolve(t5, r8.tsconfigRootDir) : t5;
|
|
231
|
+
return e2__default.default.resolve(o6, r8.project);
|
|
232
|
+
})(r7.parserOptions, n__default.default.cwd()),
|
|
233
|
+
respectGitignore: true,
|
|
234
|
+
debug: o5.debug,
|
|
235
|
+
cache: a3
|
|
236
|
+
});
|
|
237
|
+
return l2.ok ? (i.info(`\u276F Found ${l2.data.files.length} files in ${(performance.now() - s3).toFixed(0)}ms`), i.debug(`File discovery: ${(performance.now() - s3).toFixed(2)}ms`), l2.data.files) : (i.error(Error(`File discovery failed: ${l2.error.message}`)), null);
|
|
238
|
+
}
|
|
239
|
+
async function resolveRulesStep(e6, r7, t5) {
|
|
240
|
+
let o5 = performance.now();
|
|
241
|
+
t5.step("\u276F Loading rules...");
|
|
242
|
+
let n3 = e6;
|
|
243
|
+
r7.rule && (t5.info(`Filtering analysis to single rule: ${r7.rule}`), n3 = {
|
|
244
|
+
...e6,
|
|
245
|
+
rules: {
|
|
246
|
+
[r7.rule]: "error"
|
|
247
|
+
},
|
|
248
|
+
extends: []
|
|
249
|
+
});
|
|
250
|
+
let a3 = await rules.resolveRules(n3);
|
|
251
|
+
if (!a3.ok) return t5.error(Error(`Rule resolution failed: ${a3.error.message}`)), null;
|
|
252
|
+
let i = rules.getEnabledRules(a3.data.rules);
|
|
253
|
+
return t5.info(`\u276F Loaded ${i.size} active rules in ${(performance.now() - o5).toFixed(0)}ms`), t5.debug(`Rule resolution: ${(performance.now() - o5).toFixed(2)}ms`), i;
|
|
254
|
+
}
|
|
255
|
+
async function buildPlanStep(e6, r7, t5, o5, a3, i) {
|
|
256
|
+
let s3 = performance.now();
|
|
257
|
+
a3.step("\u276F Planning analysis...");
|
|
258
|
+
let l2 = await planner.buildExecutionPlan({
|
|
259
|
+
files: e6,
|
|
260
|
+
rules: r7,
|
|
261
|
+
rootDir: n__default.default.cwd(),
|
|
262
|
+
cache: t5,
|
|
263
|
+
debug: o5.debug,
|
|
264
|
+
incremental: o5.force ? {
|
|
265
|
+
forceRerun: true
|
|
266
|
+
} : void 0,
|
|
267
|
+
workerCount: i.maxWorkers,
|
|
268
|
+
overrides: i.overrides
|
|
269
|
+
});
|
|
270
|
+
return l2.ok ? (l2.data.precomputedAnalysis ? a3.info("\u276F Reused cached analysis plan") : a3.info(`\u276F Prepared ${l2.data.tasks.length.toLocaleString()} checks in ${(performance.now() - s3).toFixed(0)}ms`), a3.debug(`Plan build: ${(performance.now() - s3).toFixed(2)}ms`), l2.data) : (a3.error(Error(`Execution plan building failed: ${l2.error.message}`)), null);
|
|
271
|
+
}
|
|
272
|
+
async function runAnalysisStep(e6, r7, t5, o5, a3, i, s3, l2, c2) {
|
|
273
|
+
let m2 = performance.now();
|
|
274
|
+
engine.configureRuleExecutor(rules.executeBatchedNewEngineRules, rules.isNewEngineRule);
|
|
275
|
+
let f2 = t5.maxWorkers ? parseInt(t5.maxWorkers, 10) : void 0, d2 = t5.typeAwareChunkSize ? parseInt(t5.typeAwareChunkSize, 10) : void 0, w2 = await engine.runAnalysis(e6, {
|
|
276
|
+
rootDir: n__default.default.cwd(),
|
|
277
|
+
cache: r7,
|
|
278
|
+
debug: t5.debug,
|
|
279
|
+
files: a3,
|
|
280
|
+
maxWorkers: f2 ?? i?.maxWorkers,
|
|
281
|
+
typeAwareChunkSize: d2,
|
|
282
|
+
skipTypeCheck: t5.skipTypeCheck,
|
|
283
|
+
parserOptions: i?.parserOptions,
|
|
284
|
+
onProgress: s3,
|
|
285
|
+
onFileProgress: c2
|
|
286
|
+
});
|
|
287
|
+
return w2.ok ? (o5.debug(`Execution: ${(performance.now() - m2).toFixed(2)}ms`), w2.data) : (o5.error(Error(`Analysis failed: ${w2.error.message}`)), null);
|
|
288
|
+
}
|
|
289
|
+
async function saveToCacheStep(e6, r7, t5, o5) {
|
|
290
|
+
if (!r7) return;
|
|
291
|
+
let n3 = performance.now(), a3 = [];
|
|
292
|
+
for (let r8 of e6) r8.taskId && a3.push([
|
|
293
|
+
r8.taskId,
|
|
294
|
+
r8
|
|
295
|
+
]);
|
|
296
|
+
a3.length > 0 && (await r7.results.setMany(a3), t5.debug && o5.debug(`Saved ${a3.length} results to cache (${(performance.now() - n3).toFixed(2)}ms)`));
|
|
297
|
+
}
|
|
298
|
+
function registerConfigCommand(i, t5) {
|
|
299
|
+
i.command("config").description("Inspect and validate ngcompass configuration").command("health").description("Run semantic validation checks for the active configuration").option("-p, --profile <name>", "Configuration profile to validate").action(async (i2) => {
|
|
300
|
+
try {
|
|
301
|
+
let a3 = await config.validateConfig({
|
|
302
|
+
cache: i2.cache ? t5 : void 0,
|
|
303
|
+
profile: i2.profile
|
|
304
|
+
}), n3 = reporters.getConfigReporter();
|
|
305
|
+
await n3.renderHealthReport(a3.report), a3.report.valid || exitWithError();
|
|
306
|
+
} catch (r7) {
|
|
307
|
+
let o5 = r7 instanceof Error ? r7.message : String(r7);
|
|
308
|
+
console.error(`Error: ${o5}`), exitWithError();
|
|
309
|
+
}
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
function registerCacheCommand(e6, a3) {
|
|
313
|
+
let c2 = e6.command("cache").description("Inspect and manage analysis cache data");
|
|
314
|
+
c2.command("clear").description("Clear cached data for one cache type or all cache types").option("-p, --profile <name>", "Configuration profile used to resolve cache settings").option("--type <type>", "Cache type to clear: ast | config | results | all", "all").action(async (e7) => {
|
|
315
|
+
let c3 = reporters.getCacheReporter();
|
|
316
|
+
n__default.default.stdout.write(r2__default.default.dim(" \u203A Clearing cache...\n"));
|
|
317
|
+
let l2 = e7.type, n3 = [
|
|
318
|
+
"ast",
|
|
319
|
+
"config",
|
|
320
|
+
"results",
|
|
321
|
+
"all"
|
|
322
|
+
];
|
|
323
|
+
n3.includes(l2) || (console.error(r2__default.default.red(`Invalid cache type: ${l2}. Must be one of: ${n3.join(", ")}`)), exitWithError());
|
|
324
|
+
try {
|
|
325
|
+
let o5 = await resolveRuntimeCache(a3, {
|
|
326
|
+
profile: e7.profile,
|
|
327
|
+
allowDisabled: true
|
|
328
|
+
});
|
|
329
|
+
"all" === l2 ? await o5.clear() : await o5.clearType(l2), c3.renderClearResult(l2);
|
|
330
|
+
} catch (e8) {
|
|
331
|
+
console.error(r2__default.default.red("Error clearing cache:"), e8), exitWithError();
|
|
332
|
+
}
|
|
333
|
+
}), c2.command("info").description("Show cache status, size, and usage details").option("-p, --profile <name>", "Configuration profile used to resolve cache settings").action(async (e7) => {
|
|
334
|
+
let t5 = reporters.getCacheReporter();
|
|
335
|
+
try {
|
|
336
|
+
let o5 = await resolveRuntimeCache(a3, {
|
|
337
|
+
profile: e7.profile,
|
|
338
|
+
allowDisabled: true
|
|
339
|
+
}), r7 = await o5.getInfo();
|
|
340
|
+
t5.renderCacheInfo(r7);
|
|
341
|
+
} catch (e8) {
|
|
342
|
+
console.error(r2__default.default.red("Error getting cache info:"), e8), exitWithError();
|
|
343
|
+
}
|
|
344
|
+
}), c2.command("path").description("Print the resolved cache directory path").option("-p, --profile <name>", "Configuration profile used to resolve cache settings").action(async (e7) => {
|
|
345
|
+
let o5 = await resolveRuntimeCache(a3, {
|
|
346
|
+
profile: e7.profile,
|
|
347
|
+
allowDisabled: true
|
|
348
|
+
});
|
|
349
|
+
n__default.default.stdout.write(`${o5.getCachePath()}
|
|
350
|
+
`);
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
async function resolveRuntimeCache(o5, r7 = {}) {
|
|
354
|
+
let i = r7.cwd ?? n__default.default.cwd();
|
|
355
|
+
try {
|
|
356
|
+
let t5 = await config.resolveConfig({
|
|
357
|
+
profile: r7.profile,
|
|
358
|
+
cache: o5,
|
|
359
|
+
cwd: i
|
|
360
|
+
});
|
|
361
|
+
if (!t5.report.valid || !t5.config) return o5;
|
|
362
|
+
return cache.createRuntimeCache(t5.config, i, {
|
|
363
|
+
allowDisabled: r7.allowDisabled
|
|
364
|
+
}) ?? o5;
|
|
365
|
+
} catch {
|
|
366
|
+
return o5;
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
function registerRulesCommand(i) {
|
|
370
|
+
i.command("rules [ruleName]").description("Browse available rules or inspect details for a specific rule").option("--preset <name>", "Filter by preset: recommended, strict, performance, reactivity, or all").action((i2, l2) => {
|
|
371
|
+
l2.preset && !rules.isBuiltinPreset(l2.preset) && (console.error(r2__default.default.red(`Unknown preset: "${l2.preset}".`)), console.error(r2__default.default.dim("Available presets: recommended, strict, all, performance, reactivity")), exitWithError());
|
|
372
|
+
let n3 = rules.getRuleListEntries(), m2 = reporters.getRulesReporter({
|
|
373
|
+
preset: l2.preset
|
|
374
|
+
});
|
|
375
|
+
if (i2) {
|
|
376
|
+
let e6 = n3.find((e7) => e7.name === i2);
|
|
377
|
+
if (!e6) {
|
|
378
|
+
console.error(r2__default.default.red(`Rule "${i2}" not found.`)), console.error(r2__default.default.dim("Run `ngcompass rules` to list available rules.")), exitWithError();
|
|
379
|
+
return;
|
|
380
|
+
}
|
|
381
|
+
m2.renderSingleRule(e6);
|
|
382
|
+
} else m2.render(n3);
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
// src/commands/index.ts
|
|
387
|
+
function registerCommands(s3, f2) {
|
|
388
|
+
registerInitCommand(s3), registerAnalyzeCommand(s3, f2), registerConfigCommand(s3, f2), registerCacheCommand(s3, f2), registerRulesCommand(s3);
|
|
389
|
+
}
|
|
390
|
+
var restoreCursor = () => {
|
|
391
|
+
process.stdout.isTTY && process.stdout.write("\x1B[?25h");
|
|
392
|
+
};
|
|
393
|
+
var shutdownInProgress = false;
|
|
394
|
+
var gracefulShutdown = async (r7, o5) => {
|
|
395
|
+
if (!shutdownInProgress) {
|
|
396
|
+
if (shutdownInProgress = true, restoreCursor(), r7) try {
|
|
397
|
+
let o6 = new Promise((r8) => setTimeout(r8, 1e4).unref());
|
|
398
|
+
await Promise.race([
|
|
399
|
+
r7.flush(),
|
|
400
|
+
o6
|
|
401
|
+
]);
|
|
402
|
+
} catch {
|
|
403
|
+
}
|
|
404
|
+
process.exit(o5);
|
|
405
|
+
}
|
|
406
|
+
};
|
|
407
|
+
async function run() {
|
|
408
|
+
let a3 = new commander.Command();
|
|
409
|
+
a3.name("ngcompass").description("Static analysis and architecture insights for Angular codebases.").version(common.PACKAGE_VERSION, "-V, --version", "Display ngcompass version").option("--debug", "Enable detailed debug logs across all modules").addHelpText("after", "\nExamples:\n $ ngcompass init\n $ ngcompass analyze --profile strict\n $ ngcompass cache info\n").hook("preAction", async (r7, o5) => {
|
|
410
|
+
r7.opts().debug && common.enableDebug("debug", "all");
|
|
411
|
+
let n3 = o5.opts();
|
|
412
|
+
if ("json" !== n3.format && "sarif" !== n3.format && "html" !== n3.format && "ui" !== n3.format) {
|
|
413
|
+
let { default: r8 } = await import('picocolors'), e6 = o5.parent, n4 = e6 && "ngcompass" !== e6.name() ? e6.name() : o5.name(), t5 = process.cwd();
|
|
414
|
+
process.stdout.write(`
|
|
415
|
+
${r8.dim(">")} ${r8.dim(`ngcompass@${common.PACKAGE_VERSION}`)} ${r8.dim(n4)} ${r8.dim(t5)}
|
|
416
|
+
${r8.dim(">")} ${r8.dim("ngcompass")} ${r8.dim("run")}
|
|
417
|
+
|
|
418
|
+
${r8.bgCyan(r8.white(r8.bold(` ${n4.toUpperCase()} `)))} ${r8.cyan(common.PACKAGE_VERSION)} ${r8.dim(t5)}
|
|
419
|
+
|
|
420
|
+
`);
|
|
421
|
+
}
|
|
422
|
+
});
|
|
423
|
+
let c2 = cache.createCacheContext();
|
|
424
|
+
process.on("SIGINT", () => void gracefulShutdown(c2, 130)), process.on("SIGTERM", () => void gracefulShutdown(c2, 143)), process.on("uncaughtException", (r7) => {
|
|
425
|
+
restoreCursor(), console.error(`
|
|
426
|
+
[ngcompass] Unexpected error: ${r7.message}`), gracefulShutdown(c2, 1);
|
|
427
|
+
}), process.on("unhandledRejection", (r7) => {
|
|
428
|
+
restoreCursor();
|
|
429
|
+
let o5 = r7 instanceof Error ? r7.message : String(r7);
|
|
430
|
+
console.error(`
|
|
431
|
+
[ngcompass] Unhandled promise rejection: ${o5}`), gracefulShutdown(c2, 1);
|
|
432
|
+
});
|
|
433
|
+
try {
|
|
434
|
+
if (rules.registerAllBuiltinRules(), registerCommands(a3, c2), !process.argv.slice(2).length) return void a3.outputHelp();
|
|
435
|
+
await a3.parseAsync(process.argv), await c2.flush(), process.exit(0);
|
|
436
|
+
} catch (o5) {
|
|
437
|
+
restoreCursor();
|
|
438
|
+
let r7 = o5 instanceof Error ? o5.message : String(o5);
|
|
439
|
+
console.error(`[ngcompass] Fatal error: ${r7}`), await gracefulShutdown(c2, 1);
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
run().catch((r7) => {
|
|
443
|
+
restoreCursor();
|
|
444
|
+
let o5 = r7 instanceof Error ? r7.message : String(r7);
|
|
445
|
+
console.error(`[ngcompass] Fatal error: ${o5}`), process.exit(1);
|
|
446
|
+
});
|
|
447
|
+
|
|
448
|
+
exports.run = run;
|
|
449
|
+
//# sourceMappingURL=index.cjs.map
|
|
450
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/exit.ts","../src/commands/init.ts","../src/spinner.ts","../src/commands/analyze.ts","../src/commands/config.ts","../src/commands/cache.ts","../src/commands/rules.ts","../src/commands/index.ts","../src/bin/ngcompass.ts"],"names":["exitWithError","code","process","stdout","isTTY","write","exit","registerInitCommand","program","_cache","command","description","option","cwd","action","options","result","initConfig","force","reporter","getConfigReporter","renderInitResult","success","alreadyExists","error","console","Error","message","String","FRAMES","Spinner","timer","frameIndex","stream","start","render","setInterval","pc","cyan","dim","writeLine","line","stop","clearInterval","frame","length","normalizeReporterFormat","format","formatDuration","ms","Math","max","round","toFixed","registerAnalyzeCommand","cache","startTime","performance","now","getReporter","compact","outputPath","output","quiet","noRecommendation","recommendation","activeCache","exitCode","stats","failOnSeverity","maxWarnings","configResult","loadConfigurationStep","config","createRuntimeCache","reporterFormat","cliFormat","configFormat","outputFormat","files","discoverFilesStep","enabledRules","resolveRulesStep","plan","buildPlanStep","progressStream","stderr","spinner","logFileProgress","expectedTasksByFile","Map","filePath","tasks","map","task","filter","set","get","completedByFile","printedFiles","Set","event","count","has","accumulated","next","taskCount","issueCount","errorCount","warningCount","duration","expectedTasks","add","relativePath","path","relative","hasIssues","status","red","green","toLocaleString","analysis","runAnalysisStep","undefined","maxWorkers","summary","scannedFiles","t","skippedTasks","size","discoveredFiles","totalFiles","totalTasks","cachedTasks","precomputedAnalysis","totalErrors","totalWarnings","parseErrors","report","results","step","saveToCacheStep","flush","tStart","resolveConfig","profile","valid","issueLines","issues","issue","pathString","join","severity","toUpperCase","pluginList","plugins","configDir","loadPlugins","getGlobalRegistry","info","debug","scanResult","scan","rootDir","include","DEFAULT_INCLUDE_PATTERNS","exclude","ignorePatterns","tsConfigPath","parserOptions","project","tsconfigRootDir","resolve","respectGitignore","ok","data","effectiveConfig","rule","rules","extends","rulesResult","resolveRules","getEnabledRules","planResult","buildExecutionPlan","incremental","forceRerun","workerCount","overrides","onProgress","_workerCountForCompatibility","onFileProgress","configureRuleExecutor","executeBatchedNewEngineRules","isNewEngineRule","cliMaxWorkers","parseInt","cliChunkSize","typeAwareChunkSize","runAnalysis","skipTypeCheck","cacheEntries","taskId","push","setMany","registerConfigCommand","validateConfig","renderHealthReport","errorMessage","registerCacheCommand","cacheCmd","getCacheReporter","type","validTypes","includes","resolveRuntimeCache","allowDisabled","clear","clearType","renderClearResult","err","getInfo","renderCacheInfo","getCachePath","fallbackCache","registerRulesCommand","ruleName","opts","preset","isBuiltinPreset","entries","getRuleListEntries","getRulesReporter","find","e","name","renderSingleRule","registerCommands","restoreCursor","shutdownInProgress","gracefulShutdown","flushTimeout","Promise","setTimeout","unref","race","run","Command","version","PACKAGE_VERSION","addHelpText","hook","thisCommand","actionCommand","enableDebug","actionOpts","default","parent","commandName","bgCyan","white","bold","createCacheContext","on","reason","msg","registerAllBuiltinRules","argv","slice","outputHelp","parseAsync","catch"],"mappings":"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","file":"index.cjs","sourcesContent":["export const exitWithError = (s = 1)=>{\n process.stdout.isTTY && process.stdout.write('\\x1B[?25h'), process.exit(s);\n};\n","import { getConfigReporter as r } from '@ngcompass/reporters';\nimport { initConfig as e } from '@ngcompass/config';\nimport { exitWithError as o } from './exit.js';\nexport function registerInitCommand(t, i) {\n t.command('init').description('Create a starter ngcompass configuration in the current project').option('-f, --force', 'Overwrite an existing configuration file').option('--cwd <path>', 'Project directory where the configuration will be created', process.cwd()).action(async (t)=>{\n try {\n let i = await e({\n cwd: t.cwd,\n force: t.force\n }), c = r();\n await c.renderInitResult(i), i.success || i.alreadyExists || o();\n } catch (r) {\n console.error(r instanceof Error ? r.message : String(r)), o();\n }\n });\n}\n","import t from 'picocolors';\nlet FRAMES = [\n '⠋',\n '⠙',\n '⠹',\n '⠸',\n '⠼',\n '⠴',\n '⠦',\n '⠧',\n '⠇',\n '⠏'\n];\nexport class Spinner {\n stream;\n timer = null;\n frameIndex = 0;\n message = '';\n isTTY;\n constructor(t){\n this.stream = t, this.isTTY = !!t.isTTY;\n }\n start(e) {\n (this.message = e, this.frameIndex = 0, this.isTTY) ? (this.stream.write('\\x1B[?25l'), this.render(), this.timer = setInterval(()=>this.render(), 80)) : this.stream.write(`${t.cyan('❯')} ${t.dim(e)}\\n`);\n }\n writeLine(t) {\n this.isTTY && this.timer ? (this.stream.write('\\r\\x1B[K'), this.stream.write(`${t}\\n`), this.render()) : this.stream.write(`${t}\\n`);\n }\n stop() {\n this.timer && (clearInterval(this.timer), this.timer = null), this.isTTY && (this.stream.write('\\r\\x1B[K'), this.stream.write('\\x1B[?25h'));\n }\n render() {\n let e = t.cyan(FRAMES[this.frameIndex % FRAMES.length]);\n this.frameIndex++, this.stream.write(`\\r${e} ${t.dim(this.message)}`);\n }\n}\n","import e from 'node:path';\nimport r from 'picocolors';\nimport { DEFAULT_INCLUDE_PATTERNS as t } from '@ngcompass/common';\nimport { getReporter as o } from '@ngcompass/reporters';\nimport n from 'node:process';\nimport { createRuntimeCache as a } from '@ngcompass/cache';\nimport { exitWithError as i } from './exit.js';\nimport { Spinner as s } from '../spinner.js';\nimport { getGlobalRegistry as l, executeBatchedNewEngineRules as u, isNewEngineRule as p, resolveRules as c, getEnabledRules as m } from '@ngcompass/rules';\nimport { loadPlugins as f, resolveConfig as d } from '@ngcompass/config';\nimport { runAnalysis as g, configureRuleExecutor as h } from '@ngcompass/engine';\nimport { buildExecutionPlan as w } from '@ngcompass/planner';\nimport { scan as k } from '@ngcompass/scanner';\nfunction normalizeReporterFormat(e) {\n return 'ui' === e ? 'html' : e ?? 'console';\n}\nfunction formatDuration(e) {\n return e < 1000 ? `${Math.max(0, Math.round(e))}ms` : `${(e / 1000).toFixed(1)}s`;\n}\nexport function registerAnalyzeCommand(t, l) {\n t.command('analyze').description('Analyze your project and report rule violations and architecture risks').option('-p, --profile <name>', 'Configuration profile to run').option('--force', 'Ignore cached results and re-run all checks').option('--format <fmt>', 'Reporter format: console | json | sarif | html | ui').option('--compact', 'Use compact, ESLint-style output').option('-q, --quiet', 'Show summary counts only, suppress violation details').option('--no-recommendation', 'Suppress fix recommendations from output').option('--output <path>', 'Output path for UI reports (default: ngcompass-report.html)').option('--rule <id>', 'Run only one rule (useful for debugging or focused checks)').option('--max-workers <n>', 'Cap the number of worker threads (lower = less memory, e.g. --max-workers 2)').option('--type-aware-chunk-size <n>', 'Files per type-aware chunk (default 400; lower = less peak memory)').option('--skip-type-check', 'Skip rules that require the TypeScript type checker (fastest, lowest memory)').action(async (t)=>{\n let u = performance.now(), p = o(normalizeReporterFormat(t.format), {\n compact: !!t.compact,\n outputPath: t.output,\n quiet: !!t.quiet,\n noRecommendation: !1 === t.recommendation\n }), c = l, m = 0;\n try {\n var f;\n let i, d, g = await loadConfigurationStep(t, l, p);\n if (!g) {\n m = 1;\n return;\n }\n let { config: h } = g;\n c = a(h, n.cwd());\n let w = function(e, r) {\n if (e) return normalizeReporterFormat(e);\n switch(r){\n case 'json':\n return 'json';\n case 'sarif':\n return 'sarif';\n case 'html':\n return 'html';\n default:\n return 'console';\n }\n }(t.format, h.outputFormat);\n p = o(w, {\n compact: !!t.compact,\n outputPath: t.output ?? h.outputPath,\n quiet: !!t.quiet,\n noRecommendation: !1 === t.recommendation\n });\n let k = await discoverFilesStep(h, t, c, p);\n if (!k) {\n m = 1;\n return;\n }\n let y = await resolveRulesStep(h, t, p);\n if (!y) {\n m = 1;\n return;\n }\n let $ = await buildPlanStep(k, y, c, t, p, h);\n if (!$) {\n m = 1;\n return;\n }\n let v = 'console' === w ? n.stdout : n.stderr, C = new s(v);\n C.start('Running analysis...');\n let x = function(t, o, n) {\n let a = new Map();\n for (let e of t.tasks.map((e)=>e.filePath).filter((e)=>'string' == typeof e && e.length > 0))a.set(e, (a.get(e) ?? 0) + 1);\n let i = new Map(), s = new Set();\n return (t)=>{\n var l;\n if (s.has(t.filePath)) return;\n let u = i.get(t.filePath), p = u ? {\n filePath: t.filePath,\n taskCount: u.taskCount + t.taskCount,\n issueCount: u.issueCount + t.issueCount,\n errorCount: u.errorCount + t.errorCount,\n warningCount: u.warningCount + t.warningCount,\n duration: u.duration + t.duration\n } : t;\n i.set(t.filePath, p);\n let c = a.get(t.filePath) ?? p.taskCount;\n if (p.taskCount < c) return;\n s.add(t.filePath);\n let m = e.relative(n, t.filePath) || t.filePath, f = p.issueCount > 0, d = f ? r.red('❯') : r.green('❯'), g = f ? r.red(formatDuration(p.duration)) : r.green(formatDuration(p.duration));\n o(f ? `${d} ${r.red(m)} ${g} ${r.red((l = p.issueCount, `${l.toLocaleString()} issue${1 === l ? '' : 's'}`))}` : `${d} ${r.dim(m)} ${g}`);\n };\n }($, (e)=>C.writeLine(e), n.cwd()), S = await runAnalysisStep($, c, t, p, k, h, void 0, h.maxWorkers, x);\n if (C.stop(), !S) {\n m = 1;\n return;\n }\n let F = performance.now() - u, P = {\n scannedFiles: new Set([\n ...$.tasks.map((e)=>e.filePath),\n ...($.skippedTasks ?? []).map((e)=>e.filePath)\n ]).size,\n discoveredFiles: k.length,\n totalFiles: S.stats.totalFiles,\n totalTasks: $.tasks.length + ($.skippedTasks?.length ?? 0),\n cachedTasks: $.precomputedAnalysis ? $.tasks.length : void 0,\n totalErrors: S.stats.totalErrors,\n totalWarnings: S.stats.totalWarnings,\n failOnSeverity: h.failOnSeverity,\n maxWarnings: h.maxWarnings,\n duration: F\n };\n 'console' === w && p.summary(P), p.parseErrors(S.parseErrors), p.report(S.results), 'console' !== w && (p.step('❯ Writing report...'), p.summary(P)), $.precomputedAnalysis || await saveToCacheStep(S.results, c, t, p), f = S.stats, i = h.failOnSeverity ?? 'error', d = h.maxWarnings ?? 10, (f.totalErrors > 0 || 'warn' === i && f.totalWarnings > 0 || f.totalWarnings > d) && (m = 1);\n } catch (e) {\n p.error(e), m = 1;\n } finally{\n c && c !== l && await c.flush(), 0 !== m && i(m);\n }\n });\n}\nasync function loadConfigurationStep(e, r, t) {\n let o = performance.now();\n t.step('❯ Loading configuration...');\n let a = await d({\n profile: e.profile,\n cache: r,\n cwd: n.cwd()\n });\n if (!a.report.valid) {\n let e = a.report.issues.map((e)=>{\n let r = e.path?.join('.') || 'root';\n return `[${e.severity.toUpperCase()}] ${r}: ${e.message}`;\n });\n return t.error(Error([\n 'Configuration validation failed',\n ...e\n ].join('\\n'))), null;\n }\n if (!a.config) return t.error(Error('No configuration found')), null;\n let i = a.config.plugins;\n if (i && i.length > 0) {\n t.step(`❯ Loading ${i.length} plugin(s)...`);\n let e = n.cwd();\n await f(i, e, l()), t.info(`Loaded ${i.length} plugin(s)`);\n }\n return t.debug(`Config resolve: ${(performance.now() - o).toFixed(2)}ms`), {\n config: a.config\n };\n}\nasync function discoverFilesStep(r, o, a, i) {\n let s = performance.now();\n i.step('❯ Discovering files...');\n let l = await k({\n rootDir: n.cwd(),\n include: r.include ?? [\n ...t\n ],\n exclude: r.exclude ?? [],\n ignorePatterns: r.ignorePatterns,\n tsConfigPath: function(r, t) {\n if (!r?.project) return;\n let o = r.tsconfigRootDir ? e.resolve(t, r.tsconfigRootDir) : t;\n return e.resolve(o, r.project);\n }(r.parserOptions, n.cwd()),\n respectGitignore: !0,\n debug: o.debug,\n cache: a\n });\n return l.ok ? (i.info(`❯ Found ${l.data.files.length} files in ${(performance.now() - s).toFixed(0)}ms`), i.debug(`File discovery: ${(performance.now() - s).toFixed(2)}ms`), l.data.files) : (i.error(Error(`File discovery failed: ${l.error.message}`)), null);\n}\nasync function resolveRulesStep(e, r, t) {\n let o = performance.now();\n t.step('❯ Loading rules...');\n let n = e;\n r.rule && (t.info(`Filtering analysis to single rule: ${r.rule}`), n = {\n ...e,\n rules: {\n [r.rule]: 'error'\n },\n extends: []\n });\n let a = await c(n);\n if (!a.ok) return t.error(Error(`Rule resolution failed: ${a.error.message}`)), null;\n let i = m(a.data.rules);\n return t.info(`❯ Loaded ${i.size} active rules in ${(performance.now() - o).toFixed(0)}ms`), t.debug(`Rule resolution: ${(performance.now() - o).toFixed(2)}ms`), i;\n}\nasync function buildPlanStep(e, r, t, o, a, i) {\n let s = performance.now();\n a.step('❯ Planning analysis...');\n let l = await w({\n files: e,\n rules: r,\n rootDir: n.cwd(),\n cache: t,\n debug: o.debug,\n incremental: o.force ? {\n forceRerun: !0\n } : void 0,\n workerCount: i.maxWorkers,\n overrides: i.overrides\n });\n return l.ok ? (l.data.precomputedAnalysis ? a.info('❯ Reused cached analysis plan') : a.info(`❯ Prepared ${l.data.tasks.length.toLocaleString()} checks in ${(performance.now() - s).toFixed(0)}ms`), a.debug(`Plan build: ${(performance.now() - s).toFixed(2)}ms`), l.data) : (a.error(Error(`Execution plan building failed: ${l.error.message}`)), null);\n}\nasync function runAnalysisStep(e, r, t, o, a, i, s, l, c) {\n let m = performance.now();\n h(u, p);\n let f = t.maxWorkers ? parseInt(t.maxWorkers, 10) : void 0, d = t.typeAwareChunkSize ? parseInt(t.typeAwareChunkSize, 10) : void 0, w = await g(e, {\n rootDir: n.cwd(),\n cache: r,\n debug: t.debug,\n files: a,\n maxWorkers: f ?? i?.maxWorkers,\n typeAwareChunkSize: d,\n skipTypeCheck: t.skipTypeCheck,\n parserOptions: i?.parserOptions,\n onProgress: s,\n onFileProgress: c\n });\n return w.ok ? (o.debug(`Execution: ${(performance.now() - m).toFixed(2)}ms`), w.data) : (o.error(Error(`Analysis failed: ${w.error.message}`)), null);\n}\nasync function saveToCacheStep(e, r, t, o) {\n if (!r) return;\n let n = performance.now(), a = [];\n for (let r of e)r.taskId && a.push([\n r.taskId,\n r\n ]);\n a.length > 0 && (await r.results.setMany(a), t.debug && o.debug(`Saved ${a.length} results to cache (${(performance.now() - n).toFixed(2)}ms)`));\n}\n","import { getConfigReporter as o } from '@ngcompass/reporters';\nimport { validateConfig as r } from '@ngcompass/config';\nimport { exitWithError as e } from './exit.js';\nexport function registerConfigCommand(i, t) {\n i.command('config').description('Inspect and validate ngcompass configuration').command('health').description('Run semantic validation checks for the active configuration').option('-p, --profile <name>', 'Configuration profile to validate').action(async (i)=>{\n try {\n let a = await r({\n cache: i.cache ? t : void 0,\n profile: i.profile\n }), n = o();\n await n.renderHealthReport(a.report), a.report.valid || e();\n } catch (r) {\n let o = r instanceof Error ? r.message : String(r);\n console.error(`Error: ${o}`), e();\n }\n });\n}\n","import { createRuntimeCache as e } from '@ngcompass/cache';\nimport { getCacheReporter as o } from '@ngcompass/reporters';\nimport { resolveConfig as a } from '@ngcompass/config';\nimport r from 'picocolors';\nimport t from 'node:process';\nimport { exitWithError as i } from './exit.js';\nexport function registerCacheCommand(e, a) {\n let c = e.command('cache').description('Inspect and manage analysis cache data');\n c.command('clear').description('Clear cached data for one cache type or all cache types').option('-p, --profile <name>', 'Configuration profile used to resolve cache settings').option('--type <type>', 'Cache type to clear: ast | config | results | all', 'all').action(async (e)=>{\n let c = o();\n t.stdout.write(r.dim(' › Clearing cache...\\n'));\n let l = e.type, n = [\n 'ast',\n 'config',\n 'results',\n 'all'\n ];\n n.includes(l) || (console.error(r.red(`Invalid cache type: ${l}. Must be one of: ${n.join(', ')}`)), i());\n try {\n let o = await resolveRuntimeCache(a, {\n profile: e.profile,\n allowDisabled: !0\n });\n 'all' === l ? await o.clear() : await o.clearType(l), c.renderClearResult(l);\n } catch (e) {\n console.error(r.red('Error clearing cache:'), e), i();\n }\n }), c.command('info').description('Show cache status, size, and usage details').option('-p, --profile <name>', 'Configuration profile used to resolve cache settings').action(async (e)=>{\n let t = o();\n try {\n let o = await resolveRuntimeCache(a, {\n profile: e.profile,\n allowDisabled: !0\n }), r = await o.getInfo();\n t.renderCacheInfo(r);\n } catch (e) {\n console.error(r.red('Error getting cache info:'), e), i();\n }\n }), c.command('path').description('Print the resolved cache directory path').option('-p, --profile <name>', 'Configuration profile used to resolve cache settings').action(async (e)=>{\n let o = await resolveRuntimeCache(a, {\n profile: e.profile,\n allowDisabled: !0\n });\n t.stdout.write(`${o.getCachePath()}\\n`);\n });\n}\nasync function resolveRuntimeCache(o, r = {}) {\n let i = r.cwd ?? t.cwd();\n try {\n let t = await a({\n profile: r.profile,\n cache: o,\n cwd: i\n });\n if (!t.report.valid || !t.config) return o;\n return e(t.config, i, {\n allowDisabled: r.allowDisabled\n }) ?? o;\n } catch {\n return o;\n }\n}\n","import { getRulesReporter as e } from '@ngcompass/reporters';\nimport { getRuleListEntries as r, isBuiltinPreset as o } from '@ngcompass/rules';\nimport s from 'picocolors';\nimport { exitWithError as t } from './exit.js';\nexport function registerRulesCommand(i) {\n i.command('rules [ruleName]').description('Browse available rules or inspect details for a specific rule').option('--preset <name>', 'Filter by preset: recommended, strict, performance, reactivity, or all').action((i, l)=>{\n l.preset && !o(l.preset) && (console.error(s.red(`Unknown preset: \"${l.preset}\".`)), console.error(s.dim('Available presets: recommended, strict, all, performance, reactivity')), t());\n let n = r(), m = e({\n preset: l.preset\n });\n if (i) {\n let e = n.find((e)=>e.name === i);\n if (!e) {\n console.error(s.red(`Rule \"${i}\" not found.`)), console.error(s.dim('Run `ngcompass rules` to list available rules.')), t();\n return;\n }\n m.renderSingleRule(e);\n } else m.render(n);\n });\n}\n","import { registerInitCommand as o } from './init.js';\nimport { registerAnalyzeCommand as r } from './analyze.js';\nimport { registerConfigCommand as m } from './config.js';\nimport { registerCacheCommand as i } from './cache.js';\nimport { registerRulesCommand as t } from './rules.js';\nexport function registerCommands(s, f) {\n o(s, f), r(s, f), m(s, f), i(s, f), t(s);\n}\n","import { Command as r } from 'commander';\nimport { registerCommands as o } from '../commands/index.js';\nimport { enableDebug as e, PACKAGE_VERSION as s } from '@ngcompass/common';\nimport { createCacheContext as n } from '@ngcompass/cache';\nimport { registerAllBuiltinRules as t } from '@ngcompass/rules';\nlet restoreCursor = ()=>{\n process.stdout.isTTY && process.stdout.write('\\x1B[?25h');\n}, shutdownInProgress = !1, gracefulShutdown = async (r, o)=>{\n if (!shutdownInProgress) {\n if (shutdownInProgress = !0, restoreCursor(), r) try {\n let o = new Promise((r)=>setTimeout(r, 10_000).unref());\n await Promise.race([\n r.flush(),\n o\n ]);\n } catch {}\n process.exit(o);\n }\n};\nexport async function run() {\n let a = new r();\n a.name('ngcompass').description('Static analysis and architecture insights for Angular codebases.').version(s, '-V, --version', 'Display ngcompass version').option('--debug', 'Enable detailed debug logs across all modules').addHelpText('after', '\\nExamples:\\n $ ngcompass init\\n $ ngcompass analyze --profile strict\\n $ ngcompass cache info\\n').hook('preAction', async (r, o)=>{\n r.opts().debug && e('debug', 'all');\n let n = o.opts();\n if ('json' !== n.format && 'sarif' !== n.format && 'html' !== n.format && 'ui' !== n.format) {\n let { default: r } = await import('picocolors'), e = o.parent, n = e && 'ngcompass' !== e.name() ? e.name() : o.name(), t = process.cwd();\n process.stdout.write(`\\n${r.dim('>')} ${r.dim(`ngcompass@${s}`)} ${r.dim(n)} ${r.dim(t)}\\n${r.dim('>')} ${r.dim('ngcompass')} ${r.dim('run')}\\n\\n ${r.bgCyan(r.white(r.bold(` ${n.toUpperCase()} `)))} ${r.cyan(s)} ${r.dim(t)}\\n\\n`);\n }\n });\n let c = n();\n process.on('SIGINT', ()=>void gracefulShutdown(c, 130)), process.on('SIGTERM', ()=>void gracefulShutdown(c, 143)), process.on('uncaughtException', (r)=>{\n restoreCursor(), console.error(`\\n[ngcompass] Unexpected error: ${r.message}`), gracefulShutdown(c, 1);\n }), process.on('unhandledRejection', (r)=>{\n restoreCursor();\n let o = r instanceof Error ? r.message : String(r);\n console.error(`\\n[ngcompass] Unhandled promise rejection: ${o}`), gracefulShutdown(c, 1);\n });\n try {\n if (t(), o(a, c), !process.argv.slice(2).length) return void a.outputHelp();\n await a.parseAsync(process.argv), await c.flush(), process.exit(0);\n } catch (o) {\n restoreCursor();\n let r = o instanceof Error ? o.message : String(o);\n console.error(`[ngcompass] Fatal error: ${r}`), await gracefulShutdown(c, 1);\n }\n}\nrun().catch((r)=>{\n restoreCursor();\n let o = r instanceof Error ? r.message : String(r);\n console.error(`[ngcompass] Fatal error: ${o}`), process.exit(1);\n});\n"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { run } from './cli.cjs';
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { run } from './cli.js';
|