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.
Files changed (115) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +212 -116
  3. package/dist/api/analyze.d.ts +8 -68
  4. package/dist/api/analyze.js +33 -108
  5. package/dist/api/analyze.js.map +1 -1
  6. package/dist/api/explain.d.ts +22 -0
  7. package/dist/api/explain.js +38 -0
  8. package/dist/api/explain.js.map +1 -0
  9. package/dist/api/export.d.ts +4 -47
  10. package/dist/api/export.js +6 -45
  11. package/dist/api/export.js.map +1 -1
  12. package/dist/api/serialization.d.ts +6 -26
  13. package/dist/api/serialization.js +68 -58
  14. package/dist/api/serialization.js.map +1 -1
  15. package/dist/cli/index.js +11 -129
  16. package/dist/cli/index.js.map +1 -1
  17. package/dist/cli/run.d.ts +12 -0
  18. package/dist/cli/run.js +112 -0
  19. package/dist/cli/run.js.map +1 -0
  20. package/dist/config/loadConfig.d.ts +10 -10
  21. package/dist/config/loadConfig.js +73 -36
  22. package/dist/config/loadConfig.js.map +1 -1
  23. package/dist/config/schema.d.ts +59 -29
  24. package/dist/config/schema.js +45 -51
  25. package/dist/config/schema.js.map +1 -1
  26. package/dist/errors.d.ts +9 -0
  27. package/dist/errors.js +21 -0
  28. package/dist/errors.js.map +1 -0
  29. package/dist/files/collectFiles.d.ts +21 -0
  30. package/dist/files/collectFiles.js +189 -0
  31. package/dist/files/collectFiles.js.map +1 -0
  32. package/dist/fs.d.ts +16 -0
  33. package/dist/fs.js +50 -0
  34. package/dist/fs.js.map +1 -0
  35. package/dist/graph/buildFileGraph.d.ts +33 -0
  36. package/dist/graph/buildFileGraph.js +163 -0
  37. package/dist/graph/buildFileGraph.js.map +1 -0
  38. package/dist/graph/fileGraph.d.ts +20 -0
  39. package/dist/graph/fileGraph.js +75 -0
  40. package/dist/graph/fileGraph.js.map +1 -0
  41. package/dist/index.d.ts +10 -21
  42. package/dist/index.js +6 -29
  43. package/dist/index.js.map +1 -1
  44. package/dist/output/analyzeText.d.ts +7 -0
  45. package/dist/output/analyzeText.js +91 -0
  46. package/dist/output/analyzeText.js.map +1 -0
  47. package/dist/parser/extractSites.d.ts +3 -0
  48. package/dist/parser/extractSites.js +704 -0
  49. package/dist/parser/extractSites.js.map +1 -0
  50. package/dist/parser/loadsTarget.d.ts +10 -0
  51. package/dist/parser/loadsTarget.js +304 -0
  52. package/dist/parser/loadsTarget.js.map +1 -0
  53. package/dist/parser/types.d.ts +30 -0
  54. package/dist/{types/graph.js → parser/types.js} +1 -1
  55. package/dist/parser/types.js.map +1 -0
  56. package/dist/project/discoverProject.d.ts +2 -0
  57. package/dist/project/discoverProject.js +477 -0
  58. package/dist/project/discoverProject.js.map +1 -0
  59. package/dist/project/gitignore.d.ts +13 -0
  60. package/dist/project/gitignore.js +138 -0
  61. package/dist/project/gitignore.js.map +1 -0
  62. package/dist/project/types.d.ts +44 -0
  63. package/dist/{types/parser.js → project/types.js} +1 -1
  64. package/dist/project/types.js.map +1 -0
  65. package/dist/resolver/createResolver.d.ts +4 -0
  66. package/dist/resolver/createResolver.js +276 -0
  67. package/dist/resolver/createResolver.js.map +1 -0
  68. package/dist/resolver/types.d.ts +28 -0
  69. package/dist/resolver/types.js +3 -0
  70. package/dist/resolver/types.js.map +1 -0
  71. package/dist/resolver/workspaceHost.d.ts +12 -0
  72. package/dist/resolver/workspaceHost.js +253 -0
  73. package/dist/resolver/workspaceHost.js.map +1 -0
  74. package/dist/types/api.d.ts +71 -64
  75. package/package.json +24 -25
  76. package/dist/analysis/reporter.d.ts +0 -22
  77. package/dist/analysis/reporter.js +0 -116
  78. package/dist/analysis/reporter.js.map +0 -1
  79. package/dist/graph/cycleDetector.d.ts +0 -2
  80. package/dist/graph/cycleDetector.js +0 -56
  81. package/dist/graph/cycleDetector.js.map +0 -1
  82. package/dist/graph/dependencyGraph.d.ts +0 -10
  83. package/dist/graph/dependencyGraph.js +0 -41
  84. package/dist/graph/dependencyGraph.js.map +0 -1
  85. package/dist/metrics/abstractness.d.ts +0 -2
  86. package/dist/metrics/abstractness.js +0 -10
  87. package/dist/metrics/abstractness.js.map +0 -1
  88. package/dist/metrics/distance.d.ts +0 -1
  89. package/dist/metrics/distance.js +0 -7
  90. package/dist/metrics/distance.js.map +0 -1
  91. package/dist/metrics/index.d.ts +0 -4
  92. package/dist/metrics/index.js +0 -30
  93. package/dist/metrics/index.js.map +0 -1
  94. package/dist/metrics/instability.d.ts +0 -1
  95. package/dist/metrics/instability.js +0 -8
  96. package/dist/metrics/instability.js.map +0 -1
  97. package/dist/parser/fileScanner.d.ts +0 -8
  98. package/dist/parser/fileScanner.js +0 -22
  99. package/dist/parser/fileScanner.js.map +0 -1
  100. package/dist/parser/tsParser.d.ts +0 -18
  101. package/dist/parser/tsParser.js +0 -158
  102. package/dist/parser/tsParser.js.map +0 -1
  103. package/dist/types/graph.d.ts +0 -14
  104. package/dist/types/graph.js.map +0 -1
  105. package/dist/types/parser.d.ts +0 -26
  106. package/dist/types/parser.js.map +0 -1
  107. package/dist/utils/deepMerge.d.ts +0 -1
  108. package/dist/utils/deepMerge.js +0 -23
  109. package/dist/utils/deepMerge.js.map +0 -1
  110. package/dist/utils/log.d.ts +0 -2
  111. package/dist/utils/log.js +0 -9
  112. package/dist/utils/log.js.map +0 -1
  113. package/dist/utils/pathUtils.d.ts +0 -12
  114. package/dist/utils/pathUtils.js +0 -27
  115. package/dist/utils/pathUtils.js.map +0 -1
@@ -0,0 +1,189 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DEFAULT_SKIPS = void 0;
7
+ exports.collectFiles = collectFiles;
8
+ exports.createExcludeMatcher = createExcludeMatcher;
9
+ const node_path_1 = require("node:path");
10
+ const picomatch_1 = __importDefault(require("picomatch"));
11
+ const fs_1 = require("../fs");
12
+ const gitignore_1 = require("../project/gitignore");
13
+ exports.DEFAULT_SKIPS = [
14
+ '**/*.{test,spec}.*',
15
+ '**/__tests__/**',
16
+ '**/*.stories.*',
17
+ '**/*.d.ts',
18
+ '**/*.d.mts',
19
+ '**/*.d.cts',
20
+ '**/*.min.js',
21
+ '**/dist/**',
22
+ '**/build/**',
23
+ '**/coverage/**',
24
+ '**/public/**',
25
+ 'e2e/**',
26
+ ];
27
+ const SOURCE_FILE = /\.(?:ts|tsx|mts|cts|js|jsx|mjs|cjs)$/;
28
+ const DECLARATION_FILE = /\.d\.(?:ts|mts|cts)$/;
29
+ function collectFiles(ctx, opts) {
30
+ const fs = opts.fs ?? (0, fs_1.nodeFileSystem)();
31
+ const isExcluded = createExcludeMatcher(opts.presetSkips, opts.exclude);
32
+ const matchesInclude = opts.include.length === 0 ? null : (0, picomatch_1.default)(opts.include, { dot: true });
33
+ const { candidates, skipped: walkSkipped } = discoverCandidates(fs, ctx, matchesInclude);
34
+ const { files, skipped: admitSkipped } = admitCandidates(fs, ctx, candidates, isExcluded);
35
+ const skipped = [...walkSkipped, ...admitSkipped];
36
+ const covered = coveredFiles(fs, ctx);
37
+ const uncovered = files.filter((file) => !covered.has(file));
38
+ files.sort();
39
+ uncovered.sort();
40
+ skipped.sort(compareSkipped);
41
+ return { files, uncovered, skipped };
42
+ }
43
+ function discoverCandidates(fs, ctx, matchesInclude) {
44
+ const root = ctx.rootDir;
45
+ const candidates = new Map();
46
+ const skipped = [];
47
+ if (matchesInclude === null) {
48
+ for (const entry of ctx.tsconfigs) {
49
+ for (const file of entry.fileNames) {
50
+ if (SOURCE_FILE.test(file))
51
+ candidates.set(file, (0, node_path_1.join)(root, file));
52
+ }
53
+ }
54
+ }
55
+ walkSourceFiles(fs, root, matchesInclude, {
56
+ onFile: (rel, abs) => candidates.set(rel, abs),
57
+ onOutside: (rel) => skipped.push({ file: rel, reason: 'outside-root' }),
58
+ });
59
+ return { candidates, skipped };
60
+ }
61
+ function admitCandidates(fs, ctx, candidates, isExcluded) {
62
+ const root = ctx.rootDir;
63
+ const files = [];
64
+ const skipped = [];
65
+ const seen = new Set();
66
+ for (const [rel, abs] of candidates) {
67
+ if (!(0, fs_1.isFile)(fs, abs))
68
+ continue;
69
+ const realRel = realRelative(fs, root, abs);
70
+ if (realRel === null) {
71
+ skipped.push({ file: rel, reason: 'outside-root' });
72
+ continue;
73
+ }
74
+ const reason = skipReasonFor(ctx, isExcluded, rel, abs);
75
+ if (reason !== null) {
76
+ skipped.push({ file: rel, reason });
77
+ continue;
78
+ }
79
+ if (seen.has(realRel))
80
+ continue;
81
+ seen.add(realRel);
82
+ files.push(realRel);
83
+ }
84
+ return { files, skipped };
85
+ }
86
+ function skipReasonFor(ctx, isExcluded, rel, abs) {
87
+ if (DECLARATION_FILE.test(rel))
88
+ return 'declaration';
89
+ if (isExcluded(rel))
90
+ return 'excluded';
91
+ if (ctx.isIgnored(abs))
92
+ return 'gitignored';
93
+ return null;
94
+ }
95
+ function walkSourceFiles(fs, root, matchesInclude, handlers) {
96
+ visitDirectory({ fs, root, matchesInclude, handlers }, root);
97
+ }
98
+ function visitDirectory(ctx, dir) {
99
+ let entries;
100
+ try {
101
+ entries = ctx.fs.readdir(dir);
102
+ }
103
+ catch {
104
+ return;
105
+ }
106
+ entries.sort();
107
+ for (const name of entries) {
108
+ const abs = (0, node_path_1.join)(dir, name);
109
+ const stats = (0, fs_1.tryStat)(ctx.fs, abs);
110
+ if (stats === null)
111
+ continue;
112
+ const rel = (0, fs_1.toPosix)((0, node_path_1.relative)(ctx.root, abs));
113
+ if (stats.isDirectory()) {
114
+ if ((0, gitignore_1.shouldSkipDir)(name))
115
+ continue;
116
+ if (realRelative(ctx.fs, ctx.root, abs) === null)
117
+ ctx.handlers.onOutside(rel);
118
+ else
119
+ visitDirectory(ctx, abs);
120
+ }
121
+ else if (stats.isFile()) {
122
+ visitFile(ctx, { abs, name, rel });
123
+ }
124
+ }
125
+ }
126
+ function visitFile(ctx, entry) {
127
+ if (!SOURCE_FILE.test(entry.name))
128
+ return;
129
+ if (realRelative(ctx.fs, ctx.root, entry.abs) === null) {
130
+ ctx.handlers.onOutside(entry.rel);
131
+ return;
132
+ }
133
+ if (ctx.matchesInclude !== null && !ctx.matchesInclude(entry.rel))
134
+ return;
135
+ ctx.handlers.onFile(entry.rel, entry.abs);
136
+ }
137
+ function createExcludeMatcher(presetSkips, exclude) {
138
+ const effective = [];
139
+ for (const pattern of [...presetSkips, ...exclude]) {
140
+ if (pattern === '')
141
+ continue;
142
+ if (pattern.startsWith('!')) {
143
+ const index = effective.indexOf(pattern.slice(1));
144
+ if (index >= 0)
145
+ effective.splice(index, 1);
146
+ continue;
147
+ }
148
+ if (!effective.includes(pattern))
149
+ effective.push(pattern);
150
+ }
151
+ if (effective.length === 0)
152
+ return () => false;
153
+ const match = (0, picomatch_1.default)(effective, { dot: true });
154
+ return (rel) => match(rel);
155
+ }
156
+ function coveredFiles(fs, ctx) {
157
+ const covered = new Set();
158
+ for (const entry of ctx.tsconfigs) {
159
+ for (const file of entry.fileNames) {
160
+ covered.add(file);
161
+ const realRel = realRelative(fs, ctx.rootDir, (0, node_path_1.join)(ctx.rootDir, file));
162
+ if (realRel !== null)
163
+ covered.add(realRel);
164
+ }
165
+ }
166
+ return covered;
167
+ }
168
+ function realRelative(fs, root, abs) {
169
+ let real;
170
+ try {
171
+ real = fs.realpath(abs);
172
+ }
173
+ catch {
174
+ return null;
175
+ }
176
+ if (real === root)
177
+ return '';
178
+ if (!real.startsWith(root + node_path_1.sep))
179
+ return null;
180
+ return (0, fs_1.toPosix)(real.slice(root.length + 1));
181
+ }
182
+ function compareSkipped(a, b) {
183
+ if (a.file !== b.file)
184
+ return a.file < b.file ? -1 : 1;
185
+ if (a.reason !== b.reason)
186
+ return a.reason < b.reason ? -1 : 1;
187
+ return 0;
188
+ }
189
+ //# sourceMappingURL=collectFiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collectFiles.js","sourceRoot":"","sources":["../../src/files/collectFiles.ts"],"names":[],"mappings":"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"}
package/dist/fs.d.ts ADDED
@@ -0,0 +1,16 @@
1
+ export type StatLike = {
2
+ isFile(): boolean;
3
+ isDirectory(): boolean;
4
+ };
5
+ export interface FileSystemLike {
6
+ readFile(path: string): string;
7
+ readdir(path: string): string[];
8
+ stat(path: string): StatLike;
9
+ realpath(path: string): string;
10
+ }
11
+ export declare function nodeFileSystem(): FileSystemLike;
12
+ export declare function toPosix(path: string): string;
13
+ export declare function tryRead(fs: FileSystemLike, path: string): string | null;
14
+ export declare function tryStat(fs: FileSystemLike, path: string): StatLike | null;
15
+ export declare function isDir(fs: FileSystemLike, path: string): boolean;
16
+ export declare function isFile(fs: FileSystemLike, path: string): boolean;
package/dist/fs.js ADDED
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.nodeFileSystem = nodeFileSystem;
4
+ exports.toPosix = toPosix;
5
+ exports.tryRead = tryRead;
6
+ exports.tryStat = tryStat;
7
+ exports.isDir = isDir;
8
+ exports.isFile = isFile;
9
+ const node_fs_1 = require("node:fs");
10
+ const node_path_1 = require("node:path");
11
+ function nodeFileSystem() {
12
+ return {
13
+ readFile: (path) => stripBom((0, node_fs_1.readFileSync)(path, 'utf-8')),
14
+ readdir: (path) => (0, node_fs_1.readdirSync)(path),
15
+ stat: (path) => {
16
+ const stats = (0, node_fs_1.statSync)(path);
17
+ return { isFile: () => stats.isFile(), isDirectory: () => stats.isDirectory() };
18
+ },
19
+ realpath: (path) => node_fs_1.realpathSync.native(path),
20
+ };
21
+ }
22
+ function stripBom(text) {
23
+ return text.charCodeAt(0) === 0xfeff ? text.slice(1) : text;
24
+ }
25
+ function toPosix(path) {
26
+ return node_path_1.sep === '/' ? path : path.split(node_path_1.sep).join('/');
27
+ }
28
+ function tryRead(fs, path) {
29
+ try {
30
+ return fs.readFile(path);
31
+ }
32
+ catch {
33
+ return null;
34
+ }
35
+ }
36
+ function tryStat(fs, path) {
37
+ try {
38
+ return fs.stat(path);
39
+ }
40
+ catch {
41
+ return null;
42
+ }
43
+ }
44
+ function isDir(fs, path) {
45
+ return tryStat(fs, path)?.isDirectory() ?? false;
46
+ }
47
+ function isFile(fs, path) {
48
+ return tryStat(fs, path)?.isFile() ?? false;
49
+ }
50
+ //# sourceMappingURL=fs.js.map
package/dist/fs.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.js","sourceRoot":"","sources":["../src/fs.ts"],"names":[],"mappings":";;AAYA,wCAUC;AAMD,0BAEC;AAED,0BAMC;AAED,0BAMC;AAED,sBAEC;AAED,wBAEC;AAtDD,qCAA4E;AAC5E,yCAAgC;AAWhC,SAAgB,cAAc;IAC5B,OAAO;QACL,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAA,sBAAY,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACzD,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAA,qBAAW,EAAC,IAAI,CAAC;QACpC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE;YACb,MAAM,KAAK,GAAG,IAAA,kBAAQ,EAAC,IAAI,CAAC,CAAC;YAC7B,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;QAClF,CAAC;QACD,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,sBAAY,CAAC,MAAM,CAAC,IAAI,CAAC;KAC9C,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9D,CAAC;AAED,SAAgB,OAAO,CAAC,IAAY;IAClC,OAAO,eAAG,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,eAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACxD,CAAC;AAED,SAAgB,OAAO,CAAC,EAAkB,EAAE,IAAY;IACtD,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAgB,OAAO,CAAC,EAAkB,EAAE,IAAY;IACtD,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAgB,KAAK,CAAC,EAAkB,EAAE,IAAY;IACpD,OAAO,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,WAAW,EAAE,IAAI,KAAK,CAAC;AACnD,CAAC;AAED,SAAgB,MAAM,CAAC,EAAkB,EAAE,IAAY;IACrD,OAAO,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,KAAK,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { type FileSystemLike } from '../fs';
2
+ import type { CollectResult } from '../files/collectFiles';
3
+ import { type Compiler } from '../parser/loadsTarget';
4
+ import type { ImportSite, ParsedFile } from '../parser/types';
5
+ import type { ProjectContext } from '../project/types';
6
+ import type { Resolution, ResolutionClass, Resolver } from '../resolver/types';
7
+ import { FileGraph } from './fileGraph';
8
+ export declare const DEFAULT_COMPILERS: Compiler[];
9
+ export interface SiteRecord {
10
+ file: string;
11
+ site: ImportSite;
12
+ resolution: Resolution;
13
+ }
14
+ export interface ResolutionReport {
15
+ stats: Record<ResolutionClass, number>;
16
+ unresolved: SiteRecord[];
17
+ ignoredByDir: Record<string, number>;
18
+ unsupported: SiteRecord[];
19
+ selfImports: string[];
20
+ uncovered: string[];
21
+ skipped: CollectResult['skipped'];
22
+ }
23
+ export interface BuildGraphResult {
24
+ graph: FileGraph;
25
+ sites: SiteRecord[];
26
+ report: ResolutionReport;
27
+ parsed: Map<string, ParsedFile>;
28
+ }
29
+ export interface BuildGraphOptions {
30
+ compilers?: Compiler[];
31
+ fs?: FileSystemLike;
32
+ }
33
+ export declare function buildFileGraph(ctx: ProjectContext, files: CollectResult, resolver: Resolver, typeOnly: 'usage' | 'syntax', options?: BuildGraphOptions): BuildGraphResult;
@@ -0,0 +1,163 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_COMPILERS = void 0;
4
+ exports.buildFileGraph = buildFileGraph;
5
+ const node_path_1 = require("node:path");
6
+ const errors_1 = require("../errors");
7
+ const fs_1 = require("../fs");
8
+ const extractSites_1 = require("../parser/extractSites");
9
+ const loadsTarget_1 = require("../parser/loadsTarget");
10
+ const workspaceHost_1 = require("../resolver/workspaceHost");
11
+ const fileGraph_1 = require("./fileGraph");
12
+ exports.DEFAULT_COMPILERS = ['tsc', 'esbuild', 'swc'];
13
+ const RESOLUTION_CLASSES = [
14
+ 'builtin',
15
+ 'asset',
16
+ 'virtual',
17
+ 'internal',
18
+ 'workspace',
19
+ 'excluded',
20
+ 'external',
21
+ 'ignored',
22
+ 'unsupported',
23
+ 'unresolved',
24
+ ];
25
+ function buildFileGraph(ctx, files, resolver, typeOnly, options = {}) {
26
+ const fs = options.fs ?? (0, fs_1.nodeFileSystem)();
27
+ const compilers = options.compilers ?? exports.DEFAULT_COMPILERS;
28
+ const parsed = new Map();
29
+ const sites = [];
30
+ const collector = emptyCollector();
31
+ for (const file of files.files) {
32
+ const { options: compilerOptions } = ctx.optionsFor(file);
33
+ const parsedFile = (0, extractSites_1.parseFile)(file, readSourceFile(fs, ctx.rootDir, file), compilerOptions, (0, node_path_1.join)(ctx.rootDir, file));
34
+ parsed.set(file, parsedFile);
35
+ const environment = {
36
+ resolver,
37
+ typeOnly,
38
+ compilers,
39
+ file,
40
+ parsedFile,
41
+ compilerOptions,
42
+ };
43
+ for (const site of parsedFile.sites) {
44
+ sites.push(collectSite(collector, environment, site));
45
+ }
46
+ }
47
+ return {
48
+ graph: new fileGraph_1.FileGraph(files.files, [...collector.edges.values()]),
49
+ sites,
50
+ report: buildReport(collector, files),
51
+ parsed,
52
+ };
53
+ }
54
+ // Classifies how a site loads, resolves it, and files the result under the class
55
+ // it landed in, adding a graph edge only when the site names an analysed file.
56
+ function collectSite(collector, environment, site) {
57
+ const { parsedFile, compilerOptions, typeOnly, compilers, resolver, file } = environment;
58
+ const verdict = (0, loadsTarget_1.classifyLoads)(parsedFile, site, compilerOptions, typeOnly, compilers);
59
+ site.loadsTarget = verdict.loadsTarget;
60
+ site.loadsTargetBy = verdict.loadsTargetBy;
61
+ site.loadReason = verdict.reason;
62
+ const resolution = resolver.resolve(site, parsedFile);
63
+ const record = { file, site, resolution };
64
+ collector.stats[resolution.class] += 1;
65
+ if (resolution.class === 'unresolved')
66
+ collector.unresolved.push(record);
67
+ if (resolution.class === 'unsupported')
68
+ collector.unsupported.push(record);
69
+ if (resolution.class === 'ignored' && resolution.reason === 'gitignored') {
70
+ recordIgnoredDirectory(collector.ignoredByDir, file, site.specifier);
71
+ }
72
+ addGraphEdge(collector, file, site, resolution);
73
+ return record;
74
+ }
75
+ function addGraphEdge(collector, file, site, resolution) {
76
+ const target = edgeTarget(resolution);
77
+ if (target === null)
78
+ return;
79
+ if (target === file) {
80
+ collector.selfImports.add(file);
81
+ return;
82
+ }
83
+ mergeEdge(collector.edges, file, target, site, resolution);
84
+ }
85
+ function recordIgnoredDirectory(ignoredByDir, file, specifier) {
86
+ const dir = targetDirectory(file, specifier);
87
+ if (dir === null)
88
+ return;
89
+ ignoredByDir.set(dir, (ignoredByDir.get(dir) ?? 0) + 1);
90
+ }
91
+ function buildReport(collector, files) {
92
+ return {
93
+ stats: collector.stats,
94
+ unresolved: collector.unresolved,
95
+ ignoredByDir: Object.fromEntries([...collector.ignoredByDir.entries()].sort()),
96
+ unsupported: collector.unsupported,
97
+ selfImports: [...collector.selfImports].sort(),
98
+ uncovered: files.uncovered,
99
+ skipped: files.skipped,
100
+ };
101
+ }
102
+ function emptyCollector() {
103
+ return {
104
+ stats: emptyStats(),
105
+ unresolved: [],
106
+ unsupported: [],
107
+ ignoredByDir: new Map(),
108
+ selfImports: new Set(),
109
+ edges: new Map(),
110
+ };
111
+ }
112
+ function emptyStats() {
113
+ const stats = {};
114
+ for (const resolutionClass of RESOLUTION_CLASSES)
115
+ stats[resolutionClass] = 0;
116
+ return stats;
117
+ }
118
+ // A collected file that cannot be read makes the whole analysis incomplete: its
119
+ // imports would silently vanish from the graph. Fail loudly instead of skipping.
120
+ function readSourceFile(fs, rootDir, file) {
121
+ try {
122
+ return fs.readFile((0, node_path_1.join)(rootDir, file));
123
+ }
124
+ catch (error) {
125
+ const reason = error instanceof Error ? error.message : String(error);
126
+ throw new errors_1.ParseError(`Cannot read source file ${file}: ${reason}`, file);
127
+ }
128
+ }
129
+ // Only the resolved-file classes that carry a graph edge. An `excluded` target
130
+ // keeps its file for selectors, but it adds no edge.
131
+ function edgeTarget(resolution) {
132
+ if (resolution.class !== 'internal' && resolution.class !== 'workspace')
133
+ return null;
134
+ const target = resolution.target;
135
+ if (target === null || !('file' in target))
136
+ return null;
137
+ return target.file;
138
+ }
139
+ function mergeEdge(edges, from, to, site, resolution) {
140
+ const key = `${from}\u0000${to}`;
141
+ const existing = edges.get(key);
142
+ if (existing !== undefined) {
143
+ existing.sites.push(site);
144
+ existing.runtime = existing.runtime || site.loadsTarget === true;
145
+ existing.mapped = existing.mapped || resolution.mapped !== undefined;
146
+ return;
147
+ }
148
+ edges.set(key, {
149
+ from,
150
+ to,
151
+ sites: [site],
152
+ runtime: site.loadsTarget === true,
153
+ mapped: resolution.mapped !== undefined,
154
+ });
155
+ }
156
+ function targetDirectory(file, specifier) {
157
+ const target = (0, workspaceHost_1.posixJoin)((0, workspaceHost_1.posixDirname)(file), specifier);
158
+ const dir = (0, workspaceHost_1.posixDirname)(target);
159
+ if (dir === '' || dir.startsWith('..'))
160
+ return null;
161
+ return `${dir}/`;
162
+ }
163
+ //# sourceMappingURL=buildFileGraph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildFileGraph.js","sourceRoot":"","sources":["../../src/graph/buildFileGraph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { ImportSite } from '../parser/types';
2
+ export interface FileEdge {
3
+ from: string;
4
+ to: string;
5
+ sites: ImportSite[];
6
+ runtime: boolean;
7
+ mapped: boolean;
8
+ }
9
+ export declare class FileGraph {
10
+ readonly id: string;
11
+ private readonly nodeList;
12
+ private readonly edgeList;
13
+ private readonly fromIndex;
14
+ private readonly toIndex;
15
+ constructor(files: string[], edges: FileEdge[]);
16
+ files(): string[];
17
+ edges(): FileEdge[];
18
+ edgesFrom(file: string): FileEdge[];
19
+ edgesTo(file: string): FileEdge[];
20
+ }
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FileGraph = void 0;
4
+ const node_crypto_1 = require("node:crypto");
5
+ // The file graph is the source every other level is aggregated from. Nodes are
6
+ // root-relative file paths and edges hold every site between two files.
7
+ class FileGraph {
8
+ constructor(files, edges) {
9
+ this.nodeList = [...files].sort();
10
+ this.edgeList = [...edges].sort(compareEdges);
11
+ this.fromIndex = indexBy(this.edgeList, (edge) => edge.from);
12
+ this.toIndex = indexBy(this.edgeList, (edge) => edge.to);
13
+ this.id = hashEdges(this.edgeList);
14
+ }
15
+ files() {
16
+ return [...this.nodeList];
17
+ }
18
+ edges() {
19
+ return [...this.edgeList];
20
+ }
21
+ edgesFrom(file) {
22
+ return [...(this.fromIndex.get(file) ?? [])];
23
+ }
24
+ edgesTo(file) {
25
+ return [...(this.toIndex.get(file) ?? [])];
26
+ }
27
+ }
28
+ exports.FileGraph = FileGraph;
29
+ function compareEdges(a, b) {
30
+ if (a.from !== b.from)
31
+ return a.from < b.from ? -1 : 1;
32
+ if (a.to !== b.to)
33
+ return a.to < b.to ? -1 : 1;
34
+ return 0;
35
+ }
36
+ function indexBy(edges, key) {
37
+ const index = new Map();
38
+ for (const edge of edges) {
39
+ const value = key(edge);
40
+ const list = index.get(value);
41
+ if (list === undefined)
42
+ index.set(value, [edge]);
43
+ else
44
+ list.push(edge);
45
+ }
46
+ return index;
47
+ }
48
+ // Cache key for anything derived from the graph: the sorted edges plus the
49
+ // filter-relevant shape of their sites. A source edit that moves a site between
50
+ // filtering categories gets a new identity, so a cached cycle result is never
51
+ // reused across it. Line and column stay out on purpose: editing above an import
52
+ // must not churn the id.
53
+ function hashEdges(edges) {
54
+ const canonical = edges.map((edge) => [
55
+ edge.from,
56
+ edge.to,
57
+ edge.runtime,
58
+ edge.mapped,
59
+ siteSignatures(edge.sites),
60
+ ]);
61
+ return (0, node_crypto_1.createHash)('sha1').update(JSON.stringify(canonical)).digest('hex');
62
+ }
63
+ function siteSignatures(sites) {
64
+ return sites
65
+ .map((site) => [site.kind, site.loadsTarget === true, site.deferred === true])
66
+ .sort(compareSiteSignatures);
67
+ }
68
+ function compareSiteSignatures(a, b) {
69
+ const left = JSON.stringify(a);
70
+ const right = JSON.stringify(b);
71
+ if (left === right)
72
+ return 0;
73
+ return left < right ? -1 : 1;
74
+ }
75
+ //# sourceMappingURL=fileGraph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileGraph.js","sourceRoot":"","sources":["../../src/graph/fileGraph.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,26 +1,15 @@
1
1
  /**
2
- * TDepend - TypeScript Dependency Analysis Library
2
+ * tdepend: executable architecture contracts for TypeScript.
3
3
  *
4
- * A JDepend-inspired dependency analysis tool for TypeScript projects.
5
- * Computes architectural metrics and detects dependency issues.
6
- *
7
- * @packageDocumentation
4
+ * The public surface is the four high-level functions below plus their types.
5
+ * Discovery, resolution and graph helpers stay internal.
8
6
  */
9
- export { analyze, analyzeWithConfig } from './api/analyze';
7
+ export { analyze } from './api/analyze';
10
8
  export type { AnalyzeOptions } from './api/analyze';
11
- export { exportToFile, exportToJson } from './api/export';
12
- export type { ExportOptions } from './api/export';
9
+ export { explainFile } from './api/explain';
10
+ export type { ExplainRow } from './api/explain';
11
+ export { exportToFile } from './api/export';
13
12
  export { toSerializable } from './api/serialization';
14
- export { DependencyGraph } from './graph/dependencyGraph';
15
- export { detectCycles } from './graph/cycleDetector';
16
- export { computeAllMetrics } from './metrics';
17
- export { parseProject, parseFile } from './parser/tsParser';
18
- export { scanFiles } from './parser/fileScanner';
19
- export { loadConfig } from './config/loadConfig';
20
- export { generateReport, formatJsonOutput } from './analysis/reporter';
21
- export type { ParsedModule, ParsedClass, ParsedNamespace } from './types/parser';
22
- export type { DependencyNode, ModuleMetrics } from './types/graph';
23
- export type { AnalysisReport } from './analysis/reporter';
24
- export type { TDependConfig } from './config/schema';
25
- export type { AnalysisResult, SerializableAnalysisResult, SerializableDependencyGraph, SerializableDependencyNode, SerializableCycle, } from './types/api';
26
- export { defaultConfig } from './config/schema';
13
+ export type { EdgeKind, LoadReason } from './parser/types';
14
+ export type { ResolutionClass } from './resolver/types';
15
+ export type { AnalysisResult, SerializableEdge, SerializableReport, SerializableResult, SerializableSite, SerializableSiteLocation, SerializableUnsupported, } from './types/api';