@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.
- package/CHANGELOG.md +112 -0
- package/LICENSE +21 -0
- package/README.md +742 -0
- package/dist/analyzer/circular-dependency-detector.d.ts +94 -0
- package/dist/analyzer/circular-dependency-detector.js +203 -0
- package/dist/analyzer/circular-dependency-detector.js.map +1 -0
- package/dist/analyzer/module-depth-analyzer.d.ts +117 -0
- package/dist/analyzer/module-depth-analyzer.js +221 -0
- package/dist/analyzer/module-depth-analyzer.js.map +1 -0
- package/dist/analyzer/provider-scope-analyzer.d.ts +91 -0
- package/dist/analyzer/provider-scope-analyzer.js +137 -0
- package/dist/analyzer/provider-scope-analyzer.js.map +1 -0
- package/dist/analyzer/unused-provider-detector.d.ts +73 -0
- package/dist/analyzer/unused-provider-detector.js +147 -0
- package/dist/analyzer/unused-provider-detector.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +537 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/config-loader.d.ts +27 -0
- package/dist/config/config-loader.js +205 -0
- package/dist/config/config-loader.js.map +1 -0
- package/dist/config/config-schema.d.ts +83 -0
- package/dist/config/config-schema.js +97 -0
- package/dist/config/config-schema.js.map +1 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.js +50 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces/graph-output.interface.d.ts +126 -0
- package/dist/interfaces/graph-output.interface.js +3 -0
- package/dist/interfaces/graph-output.interface.js.map +1 -0
- package/dist/interfaces/providers.interface.d.ts +10 -0
- package/dist/interfaces/providers.interface.js +3 -0
- package/dist/interfaces/providers.interface.js.map +1 -0
- package/dist/parser/dependency-extractor.d.ts +88 -0
- package/dist/parser/dependency-extractor.js +334 -0
- package/dist/parser/dependency-extractor.js.map +1 -0
- package/dist/parser/parse-entry-file.d.ts +15 -0
- package/dist/parser/parse-entry-file.js +46 -0
- package/dist/parser/parse-entry-file.js.map +1 -0
- package/dist/parser/parse-imports.d.ts +15 -0
- package/dist/parser/parse-imports.js +65 -0
- package/dist/parser/parse-imports.js.map +1 -0
- package/dist/parser/parse-ns-module.d.ts +39 -0
- package/dist/parser/parse-ns-module.js +122 -0
- package/dist/parser/parse-ns-module.js.map +1 -0
- package/dist/parser/parse-provider.d.ts +2 -0
- package/dist/parser/parse-provider.js +7 -0
- package/dist/parser/parse-provider.js.map +1 -0
- package/dist/parser/parse-ts-config.d.ts +10 -0
- package/dist/parser/parse-ts-config.js +40 -0
- package/dist/parser/parse-ts-config.js.map +1 -0
- package/dist/parser/parser-rec.d.ts +1 -0
- package/dist/parser/parser-rec.js +52 -0
- package/dist/parser/parser-rec.js.map +1 -0
- package/dist/parser/parser.d.ts +1 -0
- package/dist/parser/parser.js +61 -0
- package/dist/parser/parser.js.map +1 -0
- package/dist/parser/provider/class-parser.d.ts +20 -0
- package/dist/parser/provider/class-parser.js +137 -0
- package/dist/parser/provider/class-parser.js.map +1 -0
- package/dist/parser/provider/providers-parser.d.ts +9 -0
- package/dist/parser/provider/providers-parser.js +32 -0
- package/dist/parser/provider/providers-parser.js.map +1 -0
- package/dist/parser/provider/use-class-parser.d.ts +25 -0
- package/dist/parser/provider/use-class-parser.js +161 -0
- package/dist/parser/provider/use-class-parser.js.map +1 -0
- package/dist/parser/provider/use-factory-parser.d.ts +15 -0
- package/dist/parser/provider/use-factory-parser.js +53 -0
- package/dist/parser/provider/use-factory-parser.js.map +1 -0
- package/dist/parser/provider/use-value-parser.d.ts +13 -0
- package/dist/parser/provider/use-value-parser.js +41 -0
- package/dist/parser/provider/use-value-parser.js.map +1 -0
- package/dist/parser/rules.d.ts +10 -0
- package/dist/parser/rules.js +37 -0
- package/dist/parser/rules.js.map +1 -0
- package/dist/utils/error-formatter.d.ts +27 -0
- package/dist/utils/error-formatter.js +177 -0
- package/dist/utils/error-formatter.js.map +1 -0
- package/dist/utils/validator.d.ts +45 -0
- package/dist/utils/validator.js +252 -0
- package/dist/utils/validator.js.map +1 -0
- package/dist/visualize/generator.d.ts +26 -0
- package/dist/visualize/generator.js +75 -0
- package/dist/visualize/generator.js.map +1 -0
- package/dist/visualize/graph-analyzer.d.ts +126 -0
- package/dist/visualize/graph-analyzer.js +199 -0
- package/dist/visualize/graph-analyzer.js.map +1 -0
- package/dist/visualize/html-generator.d.ts +71 -0
- package/dist/visualize/html-generator.js +1312 -0
- package/dist/visualize/html-generator.js.map +1 -0
- package/dist/visualize/json-formatter.d.ts +106 -0
- package/dist/visualize/json-formatter.js +252 -0
- package/dist/visualize/json-formatter.js.map +1 -0
- package/docs/API_REFERENCE.md +747 -0
- package/docs/ARCHITECTURE.md +486 -0
- package/docs/CLI_GUIDE.md +576 -0
- package/docs/HTML_VISUALIZATION.md +365 -0
- 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
|
package/dist/cli.js.map
ADDED
|
@@ -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;
|