tdepend 0.2.0 → 0.3.1
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 +212 -116
- package/dist/api/analyze.d.ts +8 -68
- package/dist/api/analyze.js +33 -108
- package/dist/api/analyze.js.map +1 -1
- package/dist/api/explain.d.ts +22 -0
- package/dist/api/explain.js +38 -0
- package/dist/api/explain.js.map +1 -0
- package/dist/api/export.d.ts +4 -47
- package/dist/api/export.js +6 -45
- package/dist/api/export.js.map +1 -1
- package/dist/api/serialization.d.ts +6 -26
- package/dist/api/serialization.js +68 -58
- package/dist/api/serialization.js.map +1 -1
- package/dist/cli/index.js +11 -129
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/run.d.ts +12 -0
- package/dist/cli/run.js +112 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/config/loadConfig.d.ts +10 -10
- package/dist/config/loadConfig.js +73 -36
- package/dist/config/loadConfig.js.map +1 -1
- package/dist/config/schema.d.ts +59 -29
- package/dist/config/schema.js +45 -51
- package/dist/config/schema.js.map +1 -1
- package/dist/errors.d.ts +9 -0
- package/dist/errors.js +21 -0
- package/dist/errors.js.map +1 -0
- package/dist/files/collectFiles.d.ts +21 -0
- package/dist/files/collectFiles.js +189 -0
- package/dist/files/collectFiles.js.map +1 -0
- package/dist/fs.d.ts +16 -0
- package/dist/fs.js +50 -0
- package/dist/fs.js.map +1 -0
- package/dist/graph/buildFileGraph.d.ts +33 -0
- package/dist/graph/buildFileGraph.js +163 -0
- package/dist/graph/buildFileGraph.js.map +1 -0
- package/dist/graph/fileGraph.d.ts +20 -0
- package/dist/graph/fileGraph.js +75 -0
- package/dist/graph/fileGraph.js.map +1 -0
- package/dist/index.d.ts +10 -21
- package/dist/index.js +6 -29
- package/dist/index.js.map +1 -1
- package/dist/output/analyzeText.d.ts +7 -0
- package/dist/output/analyzeText.js +91 -0
- package/dist/output/analyzeText.js.map +1 -0
- package/dist/parser/extractSites.d.ts +3 -0
- package/dist/parser/extractSites.js +704 -0
- package/dist/parser/extractSites.js.map +1 -0
- package/dist/parser/loadsTarget.d.ts +10 -0
- package/dist/parser/loadsTarget.js +304 -0
- package/dist/parser/loadsTarget.js.map +1 -0
- package/dist/parser/types.d.ts +30 -0
- package/dist/{types/graph.js → parser/types.js} +1 -1
- package/dist/parser/types.js.map +1 -0
- package/dist/project/discoverProject.d.ts +2 -0
- package/dist/project/discoverProject.js +477 -0
- package/dist/project/discoverProject.js.map +1 -0
- package/dist/project/gitignore.d.ts +13 -0
- package/dist/project/gitignore.js +138 -0
- package/dist/project/gitignore.js.map +1 -0
- package/dist/project/types.d.ts +44 -0
- package/dist/{types/parser.js → project/types.js} +1 -1
- package/dist/project/types.js.map +1 -0
- package/dist/resolver/createResolver.d.ts +4 -0
- package/dist/resolver/createResolver.js +276 -0
- package/dist/resolver/createResolver.js.map +1 -0
- package/dist/resolver/types.d.ts +28 -0
- package/dist/resolver/types.js +3 -0
- package/dist/resolver/types.js.map +1 -0
- package/dist/resolver/workspaceHost.d.ts +12 -0
- package/dist/resolver/workspaceHost.js +253 -0
- package/dist/resolver/workspaceHost.js.map +1 -0
- package/dist/types/api.d.ts +71 -64
- package/package.json +24 -25
- package/dist/analysis/reporter.d.ts +0 -22
- package/dist/analysis/reporter.js +0 -116
- package/dist/analysis/reporter.js.map +0 -1
- package/dist/graph/cycleDetector.d.ts +0 -2
- package/dist/graph/cycleDetector.js +0 -56
- package/dist/graph/cycleDetector.js.map +0 -1
- package/dist/graph/dependencyGraph.d.ts +0 -10
- package/dist/graph/dependencyGraph.js +0 -41
- package/dist/graph/dependencyGraph.js.map +0 -1
- package/dist/metrics/abstractness.d.ts +0 -2
- package/dist/metrics/abstractness.js +0 -10
- package/dist/metrics/abstractness.js.map +0 -1
- package/dist/metrics/distance.d.ts +0 -1
- package/dist/metrics/distance.js +0 -7
- package/dist/metrics/distance.js.map +0 -1
- package/dist/metrics/index.d.ts +0 -4
- package/dist/metrics/index.js +0 -30
- package/dist/metrics/index.js.map +0 -1
- package/dist/metrics/instability.d.ts +0 -1
- package/dist/metrics/instability.js +0 -8
- package/dist/metrics/instability.js.map +0 -1
- package/dist/parser/fileScanner.d.ts +0 -8
- package/dist/parser/fileScanner.js +0 -22
- package/dist/parser/fileScanner.js.map +0 -1
- package/dist/parser/tsParser.d.ts +0 -18
- package/dist/parser/tsParser.js +0 -158
- package/dist/parser/tsParser.js.map +0 -1
- package/dist/types/graph.d.ts +0 -14
- package/dist/types/graph.js.map +0 -1
- package/dist/types/parser.d.ts +0 -26
- package/dist/types/parser.js.map +0 -1
- package/dist/utils/deepMerge.d.ts +0 -1
- package/dist/utils/deepMerge.js +0 -23
- package/dist/utils/deepMerge.js.map +0 -1
- package/dist/utils/log.d.ts +0 -2
- package/dist/utils/log.js +0 -9
- package/dist/utils/log.js.map +0 -1
- package/dist/utils/pathUtils.d.ts +0 -12
- package/dist/utils/pathUtils.js +0 -27
- package/dist/utils/pathUtils.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,41 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* tdepend: executable architecture contracts for TypeScript.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* @packageDocumentation
|
|
5
|
+
* The public surface is the four high-level functions below plus their types.
|
|
6
|
+
* Discovery, resolution and graph helpers stay internal.
|
|
9
7
|
*/
|
|
10
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
-
exports.
|
|
12
|
-
// High-level API - Primary interface for library users
|
|
9
|
+
exports.toSerializable = exports.exportToFile = exports.explainFile = exports.analyze = void 0;
|
|
13
10
|
var analyze_1 = require("./api/analyze");
|
|
14
11
|
Object.defineProperty(exports, "analyze", { enumerable: true, get: function () { return analyze_1.analyze; } });
|
|
15
|
-
|
|
12
|
+
var explain_1 = require("./api/explain");
|
|
13
|
+
Object.defineProperty(exports, "explainFile", { enumerable: true, get: function () { return explain_1.explainFile; } });
|
|
16
14
|
var export_1 = require("./api/export");
|
|
17
15
|
Object.defineProperty(exports, "exportToFile", { enumerable: true, get: function () { return export_1.exportToFile; } });
|
|
18
|
-
Object.defineProperty(exports, "exportToJson", { enumerable: true, get: function () { return export_1.exportToJson; } });
|
|
19
16
|
var serialization_1 = require("./api/serialization");
|
|
20
17
|
Object.defineProperty(exports, "toSerializable", { enumerable: true, get: function () { return serialization_1.toSerializable; } });
|
|
21
|
-
// Core building blocks - For advanced users who want fine-grained control
|
|
22
|
-
var dependencyGraph_1 = require("./graph/dependencyGraph");
|
|
23
|
-
Object.defineProperty(exports, "DependencyGraph", { enumerable: true, get: function () { return dependencyGraph_1.DependencyGraph; } });
|
|
24
|
-
var cycleDetector_1 = require("./graph/cycleDetector");
|
|
25
|
-
Object.defineProperty(exports, "detectCycles", { enumerable: true, get: function () { return cycleDetector_1.detectCycles; } });
|
|
26
|
-
var metrics_1 = require("./metrics");
|
|
27
|
-
Object.defineProperty(exports, "computeAllMetrics", { enumerable: true, get: function () { return metrics_1.computeAllMetrics; } });
|
|
28
|
-
var tsParser_1 = require("./parser/tsParser");
|
|
29
|
-
Object.defineProperty(exports, "parseProject", { enumerable: true, get: function () { return tsParser_1.parseProject; } });
|
|
30
|
-
Object.defineProperty(exports, "parseFile", { enumerable: true, get: function () { return tsParser_1.parseFile; } });
|
|
31
|
-
var fileScanner_1 = require("./parser/fileScanner");
|
|
32
|
-
Object.defineProperty(exports, "scanFiles", { enumerable: true, get: function () { return fileScanner_1.scanFiles; } });
|
|
33
|
-
var loadConfig_1 = require("./config/loadConfig");
|
|
34
|
-
Object.defineProperty(exports, "loadConfig", { enumerable: true, get: function () { return loadConfig_1.loadConfig; } });
|
|
35
|
-
var reporter_1 = require("./analysis/reporter");
|
|
36
|
-
Object.defineProperty(exports, "generateReport", { enumerable: true, get: function () { return reporter_1.generateReport; } });
|
|
37
|
-
Object.defineProperty(exports, "formatJsonOutput", { enumerable: true, get: function () { return reporter_1.formatJsonOutput; } });
|
|
38
|
-
// Configuration - Useful for customization
|
|
39
|
-
var schema_1 = require("./config/schema");
|
|
40
|
-
Object.defineProperty(exports, "defaultConfig", { enumerable: true, get: function () { return schema_1.defaultConfig; } });
|
|
41
18
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,yCAAwC;AAA/B,kGAAA,OAAO,OAAA;AAGhB,yCAA4C;AAAnC,sGAAA,WAAW,OAAA;AAGpB,uCAA4C;AAAnC,sGAAA,YAAY,OAAA;AAErB,qDAAqD;AAA5C,+GAAA,cAAc,OAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { AnalysisResult } from '../types/api';
|
|
2
|
+
/**
|
|
3
|
+
* Renders the human-readable `analyze` report: a summary line set, the
|
|
4
|
+
* unresolved imports with `path:line`, the ignored (gitignored) target
|
|
5
|
+
* directories, and the unsupported, self-import and uncovered-file counts.
|
|
6
|
+
*/
|
|
7
|
+
export declare function formatAnalyzeText(result: AnalysisResult): string;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.formatAnalyzeText = formatAnalyzeText;
|
|
4
|
+
const serialization_1 = require("../api/serialization");
|
|
5
|
+
const MAX_UNRESOLVED = 20;
|
|
6
|
+
const MAX_IGNORED_DIRS = 10;
|
|
7
|
+
/**
|
|
8
|
+
* Renders the human-readable `analyze` report: a summary line set, the
|
|
9
|
+
* unresolved imports with `path:line`, the ignored (gitignored) target
|
|
10
|
+
* directories, and the unsupported, self-import and uncovered-file counts.
|
|
11
|
+
*/
|
|
12
|
+
function formatAnalyzeText(result) {
|
|
13
|
+
const sections = [
|
|
14
|
+
summaryLines(result),
|
|
15
|
+
classLines(result),
|
|
16
|
+
unresolvedLines(result),
|
|
17
|
+
ignoredLines(result),
|
|
18
|
+
unsupportedLines(result),
|
|
19
|
+
[
|
|
20
|
+
`Self-imports: ${result.report.selfImports.length}`,
|
|
21
|
+
`Files outside every tsconfig: ${result.files.uncovered.length}`,
|
|
22
|
+
],
|
|
23
|
+
notInstalledLines(result),
|
|
24
|
+
warningLines(result),
|
|
25
|
+
].filter((lines) => lines.length > 0);
|
|
26
|
+
return `${sections.map((lines) => lines.join('\n')).join('\n\n')}\n`;
|
|
27
|
+
}
|
|
28
|
+
function summaryLines(result) {
|
|
29
|
+
return [
|
|
30
|
+
`Files: ${result.files.files.length}`,
|
|
31
|
+
`Import sites: ${result.sites.length}`,
|
|
32
|
+
`Edges: ${result.graph.edges().length}`,
|
|
33
|
+
];
|
|
34
|
+
}
|
|
35
|
+
function classLines(result) {
|
|
36
|
+
const lines = ['Sites by class:'];
|
|
37
|
+
for (const [name, count] of Object.entries(result.report.stats)) {
|
|
38
|
+
lines.push(` ${name}: ${count}`);
|
|
39
|
+
}
|
|
40
|
+
return lines;
|
|
41
|
+
}
|
|
42
|
+
function unsupportedLines(result) {
|
|
43
|
+
const byReason = new Map();
|
|
44
|
+
for (const record of result.report.unsupported) {
|
|
45
|
+
const reason = record.resolution.reason ?? 'unknown';
|
|
46
|
+
byReason.set(reason, (byReason.get(reason) ?? 0) + 1);
|
|
47
|
+
}
|
|
48
|
+
const lines = [`Unsupported imports: ${result.report.unsupported.length}`];
|
|
49
|
+
for (const [reason, count] of [...byReason.entries()].sort()) {
|
|
50
|
+
lines.push(` ${reason}: ${count}`);
|
|
51
|
+
}
|
|
52
|
+
return lines;
|
|
53
|
+
}
|
|
54
|
+
function notInstalledLines(result) {
|
|
55
|
+
const count = result.sites.filter((record) => record.resolution.class === 'external' && record.resolution.reason === 'not-installed').length;
|
|
56
|
+
if (count === 0)
|
|
57
|
+
return [];
|
|
58
|
+
return [`Declared packages not found: ${count} (is node_modules installed?)`];
|
|
59
|
+
}
|
|
60
|
+
function warningLines(result) {
|
|
61
|
+
const warnings = (0, serialization_1.discoveryWarnings)(result);
|
|
62
|
+
if (warnings.length === 0)
|
|
63
|
+
return [];
|
|
64
|
+
return ['Warnings:', ...warnings.map((warning) => ` ${warning}`)];
|
|
65
|
+
}
|
|
66
|
+
function unresolvedLines(result) {
|
|
67
|
+
const { unresolved } = result.report;
|
|
68
|
+
const lines = [`Unresolved imports (${unresolved.length}):`];
|
|
69
|
+
for (const record of unresolved.slice(0, MAX_UNRESOLVED)) {
|
|
70
|
+
lines.push(` ${record.file}:${record.site.line} ${record.site.specifier}`);
|
|
71
|
+
}
|
|
72
|
+
if (unresolved.length > MAX_UNRESOLVED) {
|
|
73
|
+
lines.push(` ... and ${unresolved.length - MAX_UNRESOLVED} more`);
|
|
74
|
+
}
|
|
75
|
+
return lines;
|
|
76
|
+
}
|
|
77
|
+
function ignoredLines(result) {
|
|
78
|
+
const entries = Object.entries(result.report.ignoredByDir).sort(compareIgnored);
|
|
79
|
+
const total = entries.reduce((sum, [, count]) => sum + count, 0);
|
|
80
|
+
const lines = [`Ignored (gitignored targets): ${total}`];
|
|
81
|
+
for (const [dir, count] of entries.slice(0, MAX_IGNORED_DIRS)) {
|
|
82
|
+
lines.push(` ${dir} (${count})`);
|
|
83
|
+
}
|
|
84
|
+
return lines;
|
|
85
|
+
}
|
|
86
|
+
function compareIgnored(a, b) {
|
|
87
|
+
if (a[1] !== b[1])
|
|
88
|
+
return b[1] - a[1];
|
|
89
|
+
return a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=analyzeText.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzeText.js","sourceRoot":"","sources":["../../src/output/analyzeText.ts"],"names":[],"mappings":"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"}
|