@nexus-ioc/graph-analyzer 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/CHANGELOG.md +112 -0
  2. package/LICENSE +21 -0
  3. package/README.md +742 -0
  4. package/dist/analyzer/circular-dependency-detector.d.ts +94 -0
  5. package/dist/analyzer/circular-dependency-detector.js +203 -0
  6. package/dist/analyzer/circular-dependency-detector.js.map +1 -0
  7. package/dist/analyzer/module-depth-analyzer.d.ts +117 -0
  8. package/dist/analyzer/module-depth-analyzer.js +221 -0
  9. package/dist/analyzer/module-depth-analyzer.js.map +1 -0
  10. package/dist/analyzer/provider-scope-analyzer.d.ts +91 -0
  11. package/dist/analyzer/provider-scope-analyzer.js +137 -0
  12. package/dist/analyzer/provider-scope-analyzer.js.map +1 -0
  13. package/dist/analyzer/unused-provider-detector.d.ts +73 -0
  14. package/dist/analyzer/unused-provider-detector.js +147 -0
  15. package/dist/analyzer/unused-provider-detector.js.map +1 -0
  16. package/dist/cli.d.ts +2 -0
  17. package/dist/cli.js +537 -0
  18. package/dist/cli.js.map +1 -0
  19. package/dist/config/config-loader.d.ts +27 -0
  20. package/dist/config/config-loader.js +205 -0
  21. package/dist/config/config-loader.js.map +1 -0
  22. package/dist/config/config-schema.d.ts +83 -0
  23. package/dist/config/config-schema.js +97 -0
  24. package/dist/config/config-schema.js.map +1 -0
  25. package/dist/index.d.ts +41 -0
  26. package/dist/index.js +50 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/interfaces/graph-output.interface.d.ts +126 -0
  29. package/dist/interfaces/graph-output.interface.js +3 -0
  30. package/dist/interfaces/graph-output.interface.js.map +1 -0
  31. package/dist/interfaces/providers.interface.d.ts +10 -0
  32. package/dist/interfaces/providers.interface.js +3 -0
  33. package/dist/interfaces/providers.interface.js.map +1 -0
  34. package/dist/parser/dependency-extractor.d.ts +88 -0
  35. package/dist/parser/dependency-extractor.js +334 -0
  36. package/dist/parser/dependency-extractor.js.map +1 -0
  37. package/dist/parser/parse-entry-file.d.ts +15 -0
  38. package/dist/parser/parse-entry-file.js +46 -0
  39. package/dist/parser/parse-entry-file.js.map +1 -0
  40. package/dist/parser/parse-imports.d.ts +15 -0
  41. package/dist/parser/parse-imports.js +65 -0
  42. package/dist/parser/parse-imports.js.map +1 -0
  43. package/dist/parser/parse-ns-module.d.ts +39 -0
  44. package/dist/parser/parse-ns-module.js +122 -0
  45. package/dist/parser/parse-ns-module.js.map +1 -0
  46. package/dist/parser/parse-provider.d.ts +2 -0
  47. package/dist/parser/parse-provider.js +7 -0
  48. package/dist/parser/parse-provider.js.map +1 -0
  49. package/dist/parser/parse-ts-config.d.ts +10 -0
  50. package/dist/parser/parse-ts-config.js +40 -0
  51. package/dist/parser/parse-ts-config.js.map +1 -0
  52. package/dist/parser/parser-rec.d.ts +1 -0
  53. package/dist/parser/parser-rec.js +52 -0
  54. package/dist/parser/parser-rec.js.map +1 -0
  55. package/dist/parser/parser.d.ts +1 -0
  56. package/dist/parser/parser.js +61 -0
  57. package/dist/parser/parser.js.map +1 -0
  58. package/dist/parser/provider/class-parser.d.ts +20 -0
  59. package/dist/parser/provider/class-parser.js +137 -0
  60. package/dist/parser/provider/class-parser.js.map +1 -0
  61. package/dist/parser/provider/providers-parser.d.ts +9 -0
  62. package/dist/parser/provider/providers-parser.js +32 -0
  63. package/dist/parser/provider/providers-parser.js.map +1 -0
  64. package/dist/parser/provider/use-class-parser.d.ts +25 -0
  65. package/dist/parser/provider/use-class-parser.js +161 -0
  66. package/dist/parser/provider/use-class-parser.js.map +1 -0
  67. package/dist/parser/provider/use-factory-parser.d.ts +15 -0
  68. package/dist/parser/provider/use-factory-parser.js +53 -0
  69. package/dist/parser/provider/use-factory-parser.js.map +1 -0
  70. package/dist/parser/provider/use-value-parser.d.ts +13 -0
  71. package/dist/parser/provider/use-value-parser.js +41 -0
  72. package/dist/parser/provider/use-value-parser.js.map +1 -0
  73. package/dist/parser/rules.d.ts +10 -0
  74. package/dist/parser/rules.js +37 -0
  75. package/dist/parser/rules.js.map +1 -0
  76. package/dist/utils/error-formatter.d.ts +27 -0
  77. package/dist/utils/error-formatter.js +177 -0
  78. package/dist/utils/error-formatter.js.map +1 -0
  79. package/dist/utils/validator.d.ts +45 -0
  80. package/dist/utils/validator.js +252 -0
  81. package/dist/utils/validator.js.map +1 -0
  82. package/dist/visualize/generator.d.ts +26 -0
  83. package/dist/visualize/generator.js +75 -0
  84. package/dist/visualize/generator.js.map +1 -0
  85. package/dist/visualize/graph-analyzer.d.ts +126 -0
  86. package/dist/visualize/graph-analyzer.js +199 -0
  87. package/dist/visualize/graph-analyzer.js.map +1 -0
  88. package/dist/visualize/html-generator.d.ts +71 -0
  89. package/dist/visualize/html-generator.js +1312 -0
  90. package/dist/visualize/html-generator.js.map +1 -0
  91. package/dist/visualize/json-formatter.d.ts +106 -0
  92. package/dist/visualize/json-formatter.js +252 -0
  93. package/dist/visualize/json-formatter.js.map +1 -0
  94. package/docs/API_REFERENCE.md +747 -0
  95. package/docs/ARCHITECTURE.md +486 -0
  96. package/docs/CLI_GUIDE.md +576 -0
  97. package/docs/HTML_VISUALIZATION.md +365 -0
  98. package/package.json +85 -0
package/dist/cli.js ADDED
@@ -0,0 +1,537 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const tslib_1 = require("tslib");
5
+ const fs = tslib_1.__importStar(require("node:fs"));
6
+ const path = tslib_1.__importStar(require("node:path"));
7
+ const cliSpinners = tslib_1.__importStar(require("cli-spinners"));
8
+ const ts = tslib_1.__importStar(require("typescript"));
9
+ const config_loader_1 = require("./config/config-loader");
10
+ const config_schema_1 = require("./config/config-schema");
11
+ const parse_entry_file_1 = require("./parser/parse-entry-file");
12
+ const parse_ns_module_1 = require("./parser/parse-ns-module");
13
+ const parse_ts_config_1 = require("./parser/parse-ts-config");
14
+ const error_formatter_1 = require("./utils/error-formatter");
15
+ const validator_1 = require("./utils/validator");
16
+ const graph_analyzer_1 = require("./visualize/graph-analyzer");
17
+ // Read version from package.json
18
+ function getVersion() {
19
+ try {
20
+ const packageJsonPath = path.join(__dirname, "../package.json");
21
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf8"));
22
+ return packageJson.version || "unknown";
23
+ }
24
+ catch (_error) {
25
+ return "unknown";
26
+ }
27
+ }
28
+ const VERSION = getVersion();
29
+ // Simple spinner implementation
30
+ class Spinner {
31
+ constructor(text) {
32
+ this.interval = null;
33
+ this.frameIndex = 0;
34
+ this.text = "";
35
+ this.text = text;
36
+ this.frames = cliSpinners.dots.frames;
37
+ }
38
+ start() {
39
+ process.stdout.write("\x1B[?25l"); // Hide cursor
40
+ this.render();
41
+ this.interval = setInterval(() => {
42
+ this.frameIndex = (this.frameIndex + 1) % this.frames.length;
43
+ this.render();
44
+ }, cliSpinners.dots.interval);
45
+ return this;
46
+ }
47
+ render() {
48
+ const frame = this.frames[this.frameIndex];
49
+ process.stdout.write(`\r${frame} ${this.text}`);
50
+ }
51
+ clear() {
52
+ process.stdout.write(`\r${" ".repeat(this.text.length + 10)}\r`);
53
+ }
54
+ succeed(text) {
55
+ this.stop();
56
+ this.clear();
57
+ console.log(`✓ ${text || this.text}`);
58
+ }
59
+ fail(text) {
60
+ this.stop();
61
+ this.clear();
62
+ console.log(`✗ ${text || this.text}`);
63
+ }
64
+ warn(text) {
65
+ this.stop();
66
+ this.clear();
67
+ console.log(`⚠ ${text || this.text}`);
68
+ }
69
+ stop() {
70
+ if (this.interval) {
71
+ clearInterval(this.interval);
72
+ this.interval = null;
73
+ }
74
+ process.stdout.write("\x1B[?25h"); // Show cursor
75
+ }
76
+ }
77
+ // Logger utility that respects verbosity settings
78
+ class Logger {
79
+ constructor(isVerbose, isQuiet) {
80
+ this.isVerbose = isVerbose;
81
+ this.isQuiet = isQuiet;
82
+ }
83
+ log(message) {
84
+ if (!this.isQuiet) {
85
+ console.log(message);
86
+ }
87
+ }
88
+ verbose(message) {
89
+ if (this.isVerbose && !this.isQuiet) {
90
+ console.log(message);
91
+ }
92
+ }
93
+ warn(message) {
94
+ if (!this.isQuiet) {
95
+ console.warn(message);
96
+ }
97
+ }
98
+ error(message) {
99
+ console.error(message);
100
+ }
101
+ success(message) {
102
+ if (!this.isQuiet) {
103
+ console.log(`✓ ${message}`);
104
+ }
105
+ }
106
+ }
107
+ function printHelp() {
108
+ console.log(`
109
+ Nexus IoC Graph Analyzer v${VERSION}
110
+
111
+ Usage: graph-analyzer [options] <entry-file>
112
+ graph-analyzer --init [json|js]
113
+
114
+ Analyzes Nexus IoC dependency injection graphs and generates visualizations.
115
+
116
+ Arguments:
117
+ <entry-file> Path to the entry point file (e.g., src/main.ts)
118
+
119
+ Options:
120
+ -c, --config <path> Path to tsconfig.json (default: ./tsconfig.json)
121
+ --config-file <path> Path to configuration file (.graph-analyzer.json or .js)
122
+ -o, --output <path> Output file path (default: ./graph.json, ./graph.png, or ./graph.html)
123
+ -f, --format <format> Output format: json, png, html, or both (default: both)
124
+ --ide <protocol> IDE protocol for clickable links: vscode, webstorm, idea (default: vscode)
125
+ --dark Use dark theme for HTML output
126
+ --check-circular Detect circular dependencies in modules and providers
127
+ --check-unused Detect providers that are registered but never injected
128
+ --check-depth Analyze module hierarchy depth and complexity metrics
129
+ --depth-threshold <n> Threshold for identifying deep modules (default: 5)
130
+ --check-scope Analyze provider scopes and detect scope mismatches
131
+ --verbose Show detailed progress information
132
+ --quiet Suppress all output except errors
133
+ --init [json|js] Generate a configuration file (default: json)
134
+ -h, --help Display this help message
135
+ -v, --version Display version number
136
+
137
+ Configuration File:
138
+ The tool automatically searches for configuration files in the following order:
139
+ 1. .graph-analyzer.json
140
+ 2. graph-analyzer.config.json
141
+ 3. graph-analyzer.config.js
142
+
143
+ CLI arguments override configuration file settings.
144
+
145
+ Examples:
146
+ # Analyze and generate both JSON and PNG
147
+ graph-analyzer src/main.ts
148
+
149
+ # Generate only JSON output
150
+ graph-analyzer -f json -o output.json src/main.ts
151
+
152
+ # Generate only PNG visualization
153
+ graph-analyzer -f png -o graph.png src/main.ts
154
+
155
+ # Generate interactive HTML visualization
156
+ graph-analyzer -f html -o graph.html src/main.ts
157
+
158
+ # Generate HTML with dark theme and WebStorm links
159
+ graph-analyzer -f html --ide webstorm --dark src/main.ts
160
+
161
+ # Specify custom tsconfig.json
162
+ graph-analyzer -c ./tsconfig.app.json src/main.ts
163
+
164
+ # Use custom configuration file
165
+ graph-analyzer --config-file ./my-config.json
166
+
167
+ # Initialize configuration file
168
+ graph-analyzer --init json
169
+ graph-analyzer --init js
170
+
171
+ # Verbose output for debugging
172
+ graph-analyzer --verbose src/main.ts
173
+
174
+ # Quiet mode for CI/CD
175
+ graph-analyzer --quiet src/main.ts
176
+ `);
177
+ }
178
+ function printVersion() {
179
+ console.log(`v${VERSION}`);
180
+ }
181
+ function parseArgs(args) {
182
+ const options = {};
183
+ for (let i = 0; i < args.length; i++) {
184
+ const arg = args[i];
185
+ switch (arg) {
186
+ case "-h":
187
+ case "--help":
188
+ options.help = true;
189
+ break;
190
+ case "-v":
191
+ case "--version":
192
+ options.version = true;
193
+ break;
194
+ case "-c":
195
+ case "--config":
196
+ options.tsConfig = args[++i];
197
+ break;
198
+ case "--config-file":
199
+ options.configFile = args[++i];
200
+ break;
201
+ case "-o":
202
+ case "--output":
203
+ options.output = args[++i];
204
+ break;
205
+ case "-f":
206
+ case "--format": {
207
+ const format = args[++i];
208
+ if (format !== "json" &&
209
+ format !== "png" &&
210
+ format !== "html" &&
211
+ format !== "both") {
212
+ throw new Error(`Invalid format: ${format}. Must be json, png, html, or both`);
213
+ }
214
+ options.format = format;
215
+ break;
216
+ }
217
+ case "--ide": {
218
+ const ide = args[++i];
219
+ if (ide !== "vscode" && ide !== "webstorm" && ide !== "idea") {
220
+ throw new Error(`Invalid IDE protocol: ${ide}. Must be vscode, webstorm, or idea`);
221
+ }
222
+ options.ideProtocol = ide;
223
+ break;
224
+ }
225
+ case "--dark":
226
+ options.darkTheme = true;
227
+ break;
228
+ case "--verbose":
229
+ options.verbose = true;
230
+ break;
231
+ case "--quiet":
232
+ options.quiet = true;
233
+ break;
234
+ case "--check-circular":
235
+ options.checkCircular = true;
236
+ break;
237
+ case "--check-unused":
238
+ options.checkUnused = true;
239
+ break;
240
+ case "--check-depth":
241
+ options.checkDepth = true;
242
+ break;
243
+ case "--depth-threshold": {
244
+ const threshold = Number.parseInt(args[++i], 10);
245
+ if (Number.isNaN(threshold) || threshold < 1) {
246
+ console.error("Invalid depth threshold. Must be a positive integer.");
247
+ process.exit(1);
248
+ }
249
+ options.deepModuleThreshold = threshold;
250
+ break;
251
+ }
252
+ case "--check-scope":
253
+ options.checkScope = true;
254
+ break;
255
+ case "--init": {
256
+ const nextArg = args[i + 1];
257
+ if (nextArg === "json" || nextArg === "js") {
258
+ options.init = nextArg;
259
+ i++;
260
+ }
261
+ else {
262
+ options.init = "json"; // default to json
263
+ }
264
+ break;
265
+ }
266
+ default:
267
+ if (!arg.startsWith("-")) {
268
+ options.entryFile = arg;
269
+ }
270
+ else {
271
+ throw new Error(`Unknown option: ${arg}`);
272
+ }
273
+ }
274
+ }
275
+ return options;
276
+ }
277
+ async function buildDependencyGraph(entryFile, tsConfig, modulesGraph) {
278
+ const filesToProcess = [entryFile];
279
+ const processed = new Set();
280
+ while (filesToProcess.length) {
281
+ const currentFile = filesToProcess.pop();
282
+ if (processed.has(currentFile)) {
283
+ continue;
284
+ }
285
+ processed.add(currentFile);
286
+ const content = fs.readFileSync(currentFile, "utf8");
287
+ const sourceFile = ts.createSourceFile(currentFile, content, ts.ScriptTarget.Latest, true);
288
+ const nsModuleParser = new parse_ns_module_1.ParseNsModule(sourceFile, currentFile, tsConfig);
289
+ nsModuleParser.parse();
290
+ modulesGraph.set(nsModuleParser.name, nsModuleParser);
291
+ filesToProcess.push(...nsModuleParser.deps);
292
+ }
293
+ }
294
+ async function analyzeGraph(options) {
295
+ const startTime = Date.now();
296
+ const logger = new Logger(options.verbose || false, options.quiet || false);
297
+ const stats = {
298
+ modulesCount: 0,
299
+ providersCount: 0,
300
+ dependenciesCount: 0,
301
+ outputFiles: [],
302
+ duration: 0,
303
+ };
304
+ // Validate entry file
305
+ if (!options.entryFile) {
306
+ throw new Error("Entry file is required");
307
+ }
308
+ // Run pre-flight validation checks
309
+ const validationError = validator_1.Validator.runPreflightChecks({
310
+ entryFile: options.entryFile,
311
+ tsConfig: options.tsConfig,
312
+ output: options.output,
313
+ format: options.format,
314
+ });
315
+ if (validationError) {
316
+ console.error(error_formatter_1.ErrorFormatter.formatValidationError(validationError));
317
+ process.exit(1);
318
+ }
319
+ const entryPath = path.resolve(options.entryFile);
320
+ // Find tsconfig.json
321
+ let spinner = options.quiet
322
+ ? null
323
+ : new Spinner("Finding TypeScript configuration...").start();
324
+ let tsConfigPath = options.tsConfig
325
+ ? path.resolve(options.tsConfig)
326
+ : path.resolve("./tsconfig.json");
327
+ if (!fs.existsSync(tsConfigPath)) {
328
+ // Try to find tsconfig.json in parent directories
329
+ let currentDir = path.dirname(entryPath);
330
+ let found = false;
331
+ while (currentDir !== path.dirname(currentDir)) {
332
+ const candidatePath = path.join(currentDir, "tsconfig.json");
333
+ if (fs.existsSync(candidatePath)) {
334
+ tsConfigPath = candidatePath;
335
+ found = true;
336
+ break;
337
+ }
338
+ currentDir = path.dirname(currentDir);
339
+ }
340
+ if (!found) {
341
+ if (spinner) {
342
+ spinner.warn("tsconfig.json not found. Using default TypeScript configuration.");
343
+ }
344
+ else {
345
+ logger.warn("Warning: tsconfig.json not found. Using default TypeScript configuration.");
346
+ }
347
+ tsConfigPath = "";
348
+ spinner = null;
349
+ }
350
+ }
351
+ if (spinner) {
352
+ spinner.succeed("Configuration loaded");
353
+ }
354
+ logger.log(`\nAnalyzing: ${entryPath}`);
355
+ if (tsConfigPath) {
356
+ logger.verbose(`Using tsconfig: ${tsConfigPath}`);
357
+ }
358
+ // Parse entry file
359
+ spinner = options.quiet ? null : new Spinner("Parsing entry file...").start();
360
+ logger.verbose(`Reading: ${entryPath}`);
361
+ const entryContent = fs.readFileSync(entryPath, "utf8");
362
+ const entrySourceFile = ts.createSourceFile(entryPath, entryContent, ts.ScriptTarget.Latest, true);
363
+ const basePath = tsConfigPath ? path.dirname(tsConfigPath) : process.cwd();
364
+ const configContent = tsConfigPath
365
+ ? fs.readFileSync(tsConfigPath, "utf8")
366
+ : "{}";
367
+ const parseTsConfig = new parse_ts_config_1.ParseTsConfig(configContent, basePath);
368
+ const parseEntryFile = new parse_entry_file_1.ParseEntryFile(entrySourceFile, entryPath, parseTsConfig);
369
+ parseEntryFile.parse();
370
+ if (!parseEntryFile.name) {
371
+ if (spinner)
372
+ spinner.fail("No entry module found");
373
+ throw new Error("No entry module found in entry file");
374
+ }
375
+ if (spinner) {
376
+ spinner.succeed(`Entry file parsed (root module: ${parseEntryFile.name})`);
377
+ }
378
+ logger.verbose(`Root module: ${parseEntryFile.name}`);
379
+ // Build dependency graph
380
+ spinner = options.quiet
381
+ ? null
382
+ : new Spinner("Building module graph...").start();
383
+ const modulesGraph = new Map();
384
+ modulesGraph.set("entry", parseEntryFile);
385
+ await buildDependencyGraph(parseEntryFile.imports[0], parseTsConfig, modulesGraph);
386
+ stats.modulesCount = modulesGraph.size - 1; // Exclude 'entry'
387
+ if (spinner) {
388
+ spinner.succeed(`Module graph built (${stats.modulesCount} modules)`);
389
+ }
390
+ logger.verbose(`Found ${stats.modulesCount} modules`);
391
+ // Count providers and dependencies
392
+ spinner = options.quiet
393
+ ? null
394
+ : new Spinner("Analyzing dependencies...").start();
395
+ for (const [key, module] of modulesGraph) {
396
+ if (key === "entry")
397
+ continue;
398
+ const nsModule = module;
399
+ stats.providersCount += nsModule.providers?.length || 0;
400
+ // Count dependencies
401
+ for (const provider of nsModule.providers || []) {
402
+ stats.dependenciesCount += provider.dependencies?.length || 0;
403
+ }
404
+ }
405
+ if (spinner) {
406
+ spinner.succeed(`Dependencies analyzed (${stats.providersCount} providers, ${stats.dependenciesCount} dependencies)`);
407
+ }
408
+ logger.verbose(`Providers: ${stats.providersCount}`);
409
+ logger.verbose(`Dependencies: ${stats.dependenciesCount}`);
410
+ // Determine output format and paths
411
+ const format = options.format || "both";
412
+ const outputPath = options.output;
413
+ // biome-ignore lint/suspicious/noExplicitAny: GraphAnalyzerOptions type is complex
414
+ const analyzerOptions = {
415
+ outputFormat: format,
416
+ checkCircular: options.checkCircular || false,
417
+ checkUnused: options.checkUnused || false,
418
+ checkDepth: options.checkDepth || false,
419
+ deepModuleThreshold: options.deepModuleThreshold || 5,
420
+ checkScope: options.checkScope || false,
421
+ };
422
+ if (format === "json") {
423
+ analyzerOptions.jsonOutputPath = outputPath || "./graph.json";
424
+ stats.outputFiles.push(analyzerOptions.jsonOutputPath);
425
+ }
426
+ else if (format === "png") {
427
+ analyzerOptions.pngOutputPath = outputPath || "./graph.png";
428
+ stats.outputFiles.push(analyzerOptions.pngOutputPath);
429
+ }
430
+ else if (format === "html") {
431
+ analyzerOptions.htmlOutputPath = outputPath || "./graph.html";
432
+ stats.outputFiles.push(analyzerOptions.htmlOutputPath);
433
+ analyzerOptions.htmlOptions = {
434
+ ideProtocol: options.ideProtocol || "vscode",
435
+ darkTheme: options.darkTheme || false,
436
+ title: "Dependency Graph",
437
+ };
438
+ }
439
+ else {
440
+ // both
441
+ analyzerOptions.jsonOutputPath = "./graph.json";
442
+ analyzerOptions.pngOutputPath = "./graph.png";
443
+ stats.outputFiles.push("./graph.json", "./graph.png");
444
+ }
445
+ // Generate output
446
+ spinner = options.quiet ? null : new Spinner("Generating output...").start();
447
+ const analyzer = new graph_analyzer_1.GraphAnalyzer(modulesGraph, entryPath, analyzerOptions);
448
+ analyzer.parse();
449
+ if (spinner) {
450
+ spinner.succeed("Output generated");
451
+ }
452
+ // Calculate duration
453
+ stats.duration = Date.now() - startTime;
454
+ // Display summary
455
+ if (!options.quiet) {
456
+ console.log(`\n${"=".repeat(50)}`);
457
+ console.log("✓ Analysis Complete!");
458
+ console.log("=".repeat(50));
459
+ console.log(`\nStatistics:`);
460
+ console.log(` Modules: ${stats.modulesCount}`);
461
+ console.log(` Providers: ${stats.providersCount}`);
462
+ console.log(` Dependencies: ${stats.dependenciesCount}`);
463
+ console.log(` Duration: ${(stats.duration / 1000).toFixed(2)}s`);
464
+ console.log(`\nOutput Files:`);
465
+ for (const file of stats.outputFiles) {
466
+ const size = fs.existsSync(file)
467
+ ? `(${(fs.statSync(file).size / 1024).toFixed(1)} KB)`
468
+ : "";
469
+ console.log(` ✓ ${file} ${size}`);
470
+ }
471
+ console.log("");
472
+ }
473
+ }
474
+ // Main CLI entry point
475
+ async function main() {
476
+ try {
477
+ const args = process.argv.slice(2);
478
+ // Parse args first to check for special commands
479
+ const options = parseArgs(args);
480
+ if (options.help) {
481
+ printHelp();
482
+ process.exit(0);
483
+ }
484
+ if (options.version) {
485
+ printVersion();
486
+ process.exit(0);
487
+ }
488
+ // Handle --init command
489
+ if (options.init) {
490
+ const format = options.init === true ? "json" : options.init;
491
+ const fileName = format === "json" ? ".graph-analyzer.json" : "graph-analyzer.config.js";
492
+ const outputPath = path.resolve(fileName);
493
+ if (fs.existsSync(outputPath)) {
494
+ console.error(`\n❌ Configuration file already exists: ${fileName}`);
495
+ console.error("\nTo overwrite, delete the existing file first or use a different name.\n");
496
+ process.exit(1);
497
+ }
498
+ (0, config_loader_1.generateConfigFile)(outputPath, format);
499
+ console.log(`\n✓ Configuration file created: ${fileName}`);
500
+ console.log("\nYou can now customize the configuration and run:");
501
+ console.log(` graph-analyzer\n`);
502
+ process.exit(0);
503
+ }
504
+ // Load configuration file
505
+ let fileConfig = {};
506
+ let configPath = null;
507
+ try {
508
+ fileConfig = (0, config_loader_1.loadConfig)(options.configFile);
509
+ configPath = options.configFile || (0, config_loader_1.findConfigFile)();
510
+ if (configPath && !options.quiet) {
511
+ console.log(`Using configuration from: ${configPath}`);
512
+ }
513
+ }
514
+ catch (error) {
515
+ if (options.configFile) {
516
+ // If user explicitly specified a config file, throw error
517
+ throw error;
518
+ }
519
+ // Otherwise, silently ignore (no config file found)
520
+ }
521
+ // Merge configurations: defaults < file config < CLI options
522
+ const mergedOptions = (0, config_schema_1.mergeConfigs)(config_schema_1.DEFAULT_CONFIG, fileConfig, options);
523
+ // If no entry file provided and no config file, show help
524
+ if (!mergedOptions.entryFile && args.length === 0) {
525
+ printHelp();
526
+ process.exit(0);
527
+ }
528
+ await analyzeGraph(mergedOptions);
529
+ }
530
+ catch (error) {
531
+ // Use the error formatter for consistent error messages
532
+ console.error(error_formatter_1.ErrorFormatter.formatError(error));
533
+ process.exit(1);
534
+ }
535
+ }
536
+ main();
537
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { GraphAnalyzerConfig } from "./config-schema";
2
+ /**
3
+ * Loads configuration from a file
4
+ * @param configPath - Path to configuration file
5
+ * @returns Parsed configuration object
6
+ * @throws Error if file cannot be read or parsed
7
+ */
8
+ export declare function loadConfigFile(configPath: string): Partial<GraphAnalyzerConfig>;
9
+ /**
10
+ * Searches for a configuration file in the current directory and parent directories
11
+ * @param startDir - Directory to start searching from
12
+ * @returns Path to configuration file or null if not found
13
+ */
14
+ export declare function findConfigFile(startDir?: string): string | null;
15
+ /**
16
+ * Loads configuration from file or returns empty config if not found
17
+ * @param configPath - Optional explicit path to config file
18
+ * @param searchDir - Directory to start searching for config file
19
+ * @returns Configuration object
20
+ */
21
+ export declare function loadConfig(configPath?: string, searchDir?: string): Partial<GraphAnalyzerConfig>;
22
+ /**
23
+ * Generates a default configuration file
24
+ * @param outputPath - Path where to write the config file
25
+ * @param format - Format of the config file (json or js)
26
+ */
27
+ export declare function generateConfigFile(outputPath: string, format?: "json" | "js"): void;