@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
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GraphAnalyzer = void 0;
|
|
4
|
+
const generator_1 = require("./generator");
|
|
5
|
+
const html_generator_1 = require("./html-generator");
|
|
6
|
+
const json_formatter_1 = require("./json-formatter");
|
|
7
|
+
/**
|
|
8
|
+
* Main analyzer class for dependency injection graphs
|
|
9
|
+
*
|
|
10
|
+
* Analyzes Nexus IoC dependency graphs and generates JSON and/or PNG outputs.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* const analyzer = new GraphAnalyzer(modulesGraph, 'src/main.ts', {
|
|
15
|
+
* outputFormat: 'json',
|
|
16
|
+
* jsonOutputPath: './output/graph.json'
|
|
17
|
+
* });
|
|
18
|
+
*
|
|
19
|
+
* const output = analyzer.parse();
|
|
20
|
+
* console.log(`Found ${output.metadata.totalProviders} providers`);
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
class GraphAnalyzer {
|
|
24
|
+
/**
|
|
25
|
+
* Create a new GraphAnalyzer instance
|
|
26
|
+
*
|
|
27
|
+
* @param graph - Map of module names to parsed modules
|
|
28
|
+
* @param entryPoint - Path to application entry point file
|
|
29
|
+
* @param options - Configuration options for output generation
|
|
30
|
+
*/
|
|
31
|
+
constructor(graph, entryPoint, options = {}) {
|
|
32
|
+
this.graph = graph;
|
|
33
|
+
this.entryPoint = entryPoint;
|
|
34
|
+
this.options = options;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Parse the dependency graph and generate output based on configured format
|
|
38
|
+
*
|
|
39
|
+
* @returns GraphOutput object if format is 'json', 'html', or 'both', void if format is 'png'
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```typescript
|
|
43
|
+
* // Generate JSON only
|
|
44
|
+
* const output = analyzer.parse();
|
|
45
|
+
*
|
|
46
|
+
* // Generate PNG only
|
|
47
|
+
* analyzer.parse(); // Returns void
|
|
48
|
+
*
|
|
49
|
+
* // Generate HTML only
|
|
50
|
+
* analyzer.parse(); // Returns void
|
|
51
|
+
*
|
|
52
|
+
* // Generate both JSON and PNG
|
|
53
|
+
* const output = analyzer.parse(); // Returns GraphOutput and creates PNG
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
parse() {
|
|
57
|
+
const format = this.options.outputFormat || "both";
|
|
58
|
+
if (format === "json") {
|
|
59
|
+
return this.generateJson();
|
|
60
|
+
}
|
|
61
|
+
if (format === "png") {
|
|
62
|
+
this.generatePng();
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
if (format === "html") {
|
|
66
|
+
this.generateHtml();
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
if (format === "both") {
|
|
70
|
+
const output = this.generateJson();
|
|
71
|
+
this.generatePng();
|
|
72
|
+
return output;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Generate JSON output of the dependency graph
|
|
77
|
+
*
|
|
78
|
+
* Creates a structured JSON representation of all modules, providers, and dependencies.
|
|
79
|
+
* Optionally writes the output to a file if jsonOutputPath or outputPath is configured.
|
|
80
|
+
*
|
|
81
|
+
* @returns GraphOutput object containing modules, providers, and metadata
|
|
82
|
+
*
|
|
83
|
+
* @example
|
|
84
|
+
* ```typescript
|
|
85
|
+
* const output = analyzer.generateJson();
|
|
86
|
+
* console.log(`Total modules: ${output.metadata.totalModules}`);
|
|
87
|
+
* console.log(`Total providers: ${output.metadata.totalProviders}`);
|
|
88
|
+
* ```
|
|
89
|
+
*/
|
|
90
|
+
generateJson() {
|
|
91
|
+
const formatter = new json_formatter_1.JsonFormatter(this.graph, this.entryPoint, this.options.checkCircular || false, this.options.checkUnused || false, this.options.checkDepth || false, this.options.deepModuleThreshold || 5, this.options.checkScope || false);
|
|
92
|
+
const output = formatter.format();
|
|
93
|
+
// Write to file if path is specified
|
|
94
|
+
if (this.options.jsonOutputPath || this.options.outputPath) {
|
|
95
|
+
const fs = require("node:fs");
|
|
96
|
+
const pathModule = require("node:path");
|
|
97
|
+
const path = this.options.jsonOutputPath ||
|
|
98
|
+
this.options.outputPath ||
|
|
99
|
+
"./graph.json";
|
|
100
|
+
// Ensure directory exists
|
|
101
|
+
const dir = pathModule.dirname(path);
|
|
102
|
+
if (!fs.existsSync(dir)) {
|
|
103
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
104
|
+
}
|
|
105
|
+
fs.writeFileSync(path, JSON.stringify(output, null, 2));
|
|
106
|
+
console.log(`JSON output written to: ${path}`);
|
|
107
|
+
}
|
|
108
|
+
return output;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Generate PNG visualization of the dependency graph using Graphviz
|
|
112
|
+
*
|
|
113
|
+
* Creates a visual graph representation showing modules as nodes and dependencies as edges.
|
|
114
|
+
* Requires Graphviz to be installed on the system.
|
|
115
|
+
*
|
|
116
|
+
* @throws Error if Graphviz is not installed or graph generation fails
|
|
117
|
+
*
|
|
118
|
+
* @example
|
|
119
|
+
* ```typescript
|
|
120
|
+
* analyzer.generatePng();
|
|
121
|
+
* // Creates graph.png in the configured output path
|
|
122
|
+
* ```
|
|
123
|
+
*/
|
|
124
|
+
generatePng() {
|
|
125
|
+
const entryModule = this.graph.get("entry");
|
|
126
|
+
if (!entryModule || !entryModule.name) {
|
|
127
|
+
throw new Error("Empty entry module");
|
|
128
|
+
}
|
|
129
|
+
// biome-ignore lint/suspicious/noExplicitAny: Legacy format for GraphGenerator
|
|
130
|
+
const json = {};
|
|
131
|
+
const modules = [entryModule.name];
|
|
132
|
+
const visited = new Set(); // Track visited modules to prevent infinite loops
|
|
133
|
+
for (const module of modules) {
|
|
134
|
+
// Skip if already visited to prevent circular dependency infinite loops
|
|
135
|
+
if (visited.has(module)) {
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
visited.add(module);
|
|
139
|
+
const parseNsModule = this.graph.get(module);
|
|
140
|
+
if (!parseNsModule) {
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
json[module] = {
|
|
144
|
+
name: module,
|
|
145
|
+
imports: parseNsModule.imports,
|
|
146
|
+
exports: parseNsModule.exports,
|
|
147
|
+
isGlobal: parseNsModule.isGlobal,
|
|
148
|
+
providers: parseNsModule.providers.map((provider) => ({
|
|
149
|
+
token: provider.token,
|
|
150
|
+
value: provider.value,
|
|
151
|
+
inject: provider.inject,
|
|
152
|
+
scope: provider.scope,
|
|
153
|
+
type: provider.type,
|
|
154
|
+
dependencies: provider.dependencies,
|
|
155
|
+
})),
|
|
156
|
+
dependencies: parseNsModule.deps,
|
|
157
|
+
};
|
|
158
|
+
// Only add imports that haven't been visited yet
|
|
159
|
+
for (const imp of parseNsModule.imports) {
|
|
160
|
+
if (!visited.has(imp)) {
|
|
161
|
+
modules.push(imp);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
const pngPath = this.options.pngOutputPath || this.options.outputPath || "./graph.png";
|
|
166
|
+
const graphGenerator = new generator_1.GraphGenerator(json, pngPath);
|
|
167
|
+
graphGenerator.scan();
|
|
168
|
+
console.log(`PNG output written to: ${pngPath}`);
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Generate interactive HTML visualization of the dependency graph
|
|
172
|
+
*
|
|
173
|
+
* Creates an interactive HTML page with a graph visualization using Cytoscape.js.
|
|
174
|
+
* The HTML includes zoom/pan controls, node details, search functionality, and
|
|
175
|
+
* clickable file paths that open in your IDE.
|
|
176
|
+
*
|
|
177
|
+
* @example
|
|
178
|
+
* ```typescript
|
|
179
|
+
* analyzer.generateHtml();
|
|
180
|
+
* // Creates graph.html in the configured output path
|
|
181
|
+
* ```
|
|
182
|
+
*/
|
|
183
|
+
generateHtml() {
|
|
184
|
+
const htmlPath = this.options.htmlOutputPath || this.options.outputPath || "./graph.html";
|
|
185
|
+
const htmlGenerator = new html_generator_1.HtmlGenerator(this.graph, this.entryPoint, this.options.htmlOptions || {});
|
|
186
|
+
const html = htmlGenerator.generate();
|
|
187
|
+
const fs = require("node:fs");
|
|
188
|
+
const path = require("node:path");
|
|
189
|
+
// Ensure directory exists
|
|
190
|
+
const dir = path.dirname(htmlPath);
|
|
191
|
+
if (!fs.existsSync(dir)) {
|
|
192
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
193
|
+
}
|
|
194
|
+
fs.writeFileSync(htmlPath, html);
|
|
195
|
+
console.log(`HTML output written to: ${htmlPath}`);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
exports.GraphAnalyzer = GraphAnalyzer;
|
|
199
|
+
//# sourceMappingURL=graph-analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-analyzer.js","sourceRoot":"","sources":["../../src/visualize/graph-analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import type { ParseEntryFile } from "../parser/parse-entry-file";
|
|
2
|
+
import type { ParseNsModule } from "../parser/parse-ns-module";
|
|
3
|
+
/**
|
|
4
|
+
* Options for HTML generation
|
|
5
|
+
*/
|
|
6
|
+
export interface HtmlGeneratorOptions {
|
|
7
|
+
/** IDE protocol for clickable file links (default: 'vscode') */
|
|
8
|
+
ideProtocol?: "vscode" | "webstorm" | "idea" | "custom";
|
|
9
|
+
/** Custom IDE URL template (e.g., 'vscode://file/{path}:{line}:{column}') */
|
|
10
|
+
customIdeUrl?: string;
|
|
11
|
+
/** Title for the HTML page (default: 'Dependency Graph') */
|
|
12
|
+
title?: string;
|
|
13
|
+
/** Whether to use dark theme (default: false) */
|
|
14
|
+
darkTheme?: boolean;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Generates interactive HTML visualizations of dependency graphs
|
|
18
|
+
*
|
|
19
|
+
* Creates a self-contained HTML file with an interactive graph using Cytoscape.js.
|
|
20
|
+
* The graph includes modules and providers with clickable nodes, zoom/pan capabilities,
|
|
21
|
+
* and detailed information panels.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* const generator = new HtmlGenerator(modulesGraph, 'src/main.ts', {
|
|
26
|
+
* ideProtocol: 'vscode',
|
|
27
|
+
* title: 'My App Dependencies',
|
|
28
|
+
* darkTheme: true
|
|
29
|
+
* });
|
|
30
|
+
*
|
|
31
|
+
* const html = generator.generate();
|
|
32
|
+
* fs.writeFileSync('graph.html', html);
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export declare class HtmlGenerator {
|
|
36
|
+
readonly graph: Map<string, ParseNsModule | ParseEntryFile>;
|
|
37
|
+
private readonly entryPoint;
|
|
38
|
+
private readonly options;
|
|
39
|
+
private readonly formatter;
|
|
40
|
+
constructor(graph: Map<string, ParseNsModule | ParseEntryFile>, entryPoint: string, options?: HtmlGeneratorOptions);
|
|
41
|
+
/**
|
|
42
|
+
* Generate the complete HTML document
|
|
43
|
+
*
|
|
44
|
+
* @returns Complete HTML string ready to be written to a file
|
|
45
|
+
*/
|
|
46
|
+
generate(): string;
|
|
47
|
+
/**
|
|
48
|
+
* Convert GraphOutput to Cytoscape.js format with compound nodes
|
|
49
|
+
*/
|
|
50
|
+
private convertToCytoscapeFormat;
|
|
51
|
+
/**
|
|
52
|
+
* Get IDE URL for a file path
|
|
53
|
+
*/
|
|
54
|
+
private getIdeUrl;
|
|
55
|
+
/**
|
|
56
|
+
* Generate warning section for providers with missing @Inject decorators
|
|
57
|
+
*/
|
|
58
|
+
private generateMissingDecoratorsWarning;
|
|
59
|
+
/**
|
|
60
|
+
* Generate the complete HTML template
|
|
61
|
+
*/
|
|
62
|
+
private generateHtmlTemplate;
|
|
63
|
+
/**
|
|
64
|
+
* Generate CSS styles
|
|
65
|
+
*/
|
|
66
|
+
private generateStyles;
|
|
67
|
+
/**
|
|
68
|
+
* Generate JavaScript code
|
|
69
|
+
*/
|
|
70
|
+
private generateScript;
|
|
71
|
+
}
|