@ts-stack/cycle-detector 1.1.0 → 1.1.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/README.md +60 -57
- package/dist/index.js +217 -68
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +236 -96
package/README.md
CHANGED
|
@@ -1,8 +1,65 @@
|
|
|
1
1
|
# Execution-Aware Circular Dependency Detector for TypeScript
|
|
2
2
|
|
|
3
|
-
`@ts-
|
|
3
|
+
`@ts-stack/cycle-detector` - this is a high-performance static analysis utility powered by the native TypeScript Compiler API. Unlike generic dependency visualizers, this tool evaluates the **runtime execution risk** of circular dependencies in monorepos and complex TypeScript applications, isolating architectural flaws from safe, deferred imports.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## Installation & Usage
|
|
6
|
+
|
|
7
|
+
You don't even need to install it! Just run it via `npx`:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npx @ts-stack/cycle-detector src/index.ts
|
|
11
|
+
# OR
|
|
12
|
+
npx @ts-stack/cycle-detector packages/*/src/index.ts
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
But you can install it locally:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm install -D @ts-stack/cycle-detector
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
In your `package.json`:
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
```json
|
|
25
|
+
"scripts": {
|
|
26
|
+
"lint:cycles": "cycle-detector packages/*/src/index.ts"
|
|
27
|
+
}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
And then:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
npm run lint:cycles
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### Arguments & Flags
|
|
37
|
+
|
|
38
|
+
* `<entry-patterns>`: Glob patterns or paths to entry point files (e.g., `packages/*/src/index.ts`).
|
|
39
|
+
* `-p, --project <path>`: Path to your root or fallback `tsconfig.json`.
|
|
40
|
+
|
|
41
|
+
## Interpreting Diagnostics
|
|
42
|
+
|
|
43
|
+
When a breaking circular dependency is detected, the script identifies exactly **which file executes the token prematurely**, leaving non-blocking files clearly marked.
|
|
44
|
+
|
|
45
|
+
```txt
|
|
46
|
+
❌ [/packages/rest/src/index.ts] — Found 1 critical circular dependencies:
|
|
47
|
+
1) --------------------------------------------------------------------------------
|
|
48
|
+
⏳ [Lazy] /srv/git/ditsmod/ditsmod/packages/rest/src/extensions/routes.extension.ts
|
|
49
|
+
⏳ [Lazy] /srv/git/ditsmod/ditsmod/packages/rest/src/decorators/rest-init-hooks-and-metadata.ts
|
|
50
|
+
💥 [Top-level] /srv/git/ditsmod/ditsmod/packages/rest/src/init/rest.module.ts
|
|
51
|
+
|
|
52
|
+
💥 Validation failed. Critical circular dependencies detected.
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### How to Refactor Based on the Log Above:
|
|
56
|
+
|
|
57
|
+
The log indicates that `/packages/rest/src/init/rest.module.ts` contains an immediate top-level expression (such as an active decorator evaluation or configuration factory instantiation) that forces the evaluation of `routes.extension.ts` before the module evaluation of `rest.module.ts` is complete. To fix this, extract the shared configuration metadata or decorator targets into a dedicated initialization file positioned lower in the dependency hierarchy.
|
|
58
|
+
|
|
59
|
+
## Exit Codes
|
|
60
|
+
|
|
61
|
+
* `0`: Success. Clean graph or only safe, runtime-deferred cyclic references found.
|
|
62
|
+
* `1`: Critical Top-level execution loops found. Build terminated.
|
|
6
63
|
|
|
7
64
|
## Why Use This Over Existing Solutions?
|
|
8
65
|
|
|
@@ -15,15 +72,13 @@ In large-scale TypeScript applications (especially those utilizing Dependency In
|
|
|
15
72
|
|
|
16
73
|
### Technical Differentiators
|
|
17
74
|
|
|
18
|
-
| Feature | @ts-
|
|
75
|
+
| Feature | @ts-stack/cycle-detector | Traditional Tools (e.g., Madge) | ESLint Rules |
|
|
19
76
|
| --- | --- | --- | --- |
|
|
20
77
|
| **Analysis Scope** | Execution-aware (Top-level vs. Lazy) | Pure Import Graph Topology | Token-based / File Boundary |
|
|
21
78
|
| **TypeScript Engine** | Native `typescript` Compiler API | Pre-bundled bundlers / Regex | AST Walkers (without Full Type Context) |
|
|
22
79
|
| **Monorepo Mapping** | Dynamic `package.json` -> `src` tracking | Requires complex path mapping config | Scoped only to single-package roots |
|
|
23
80
|
| **Signal-to-Noise Ratio** | High (Flags only breaking cycles) | Low (Floods with safe runtime loops) | High overhead / Slow parsing |
|
|
24
81
|
|
|
25
|
-
---
|
|
26
|
-
|
|
27
82
|
## Core Architecture & Technical Details
|
|
28
83
|
|
|
29
84
|
### 1. Execution-Scoped Risk Assessment
|
|
@@ -43,8 +98,6 @@ In monorepos, internal package dependencies often resolve to `node_modules/<loca
|
|
|
43
98
|
|
|
44
99
|
To prevent log flooding from deeply nested structural loops, the DFS (Depth-First Search) cycle collector normalizes all found paths into a canonical key based on lexicographical rotation. You see each unique cycle exactly once, regardless of which file initiated the traversal.
|
|
45
100
|
|
|
46
|
-
---
|
|
47
|
-
|
|
48
101
|
## How It Works Under the Hood
|
|
49
102
|
|
|
50
103
|
```
|
|
@@ -55,53 +108,3 @@ To prevent log flooding from deeply nested structural loops, the DFS (Depth-Firs
|
|
|
55
108
|
2. **Phase 2: Graph Traversal:** Runs a non-recursive path collector detecting back-edges.
|
|
56
109
|
3. **Phase 3: Scope Validation:** For every edge in a detected cycle, it inspects whether the consumer node executes the imported token outside an execution-deferred scope block.
|
|
57
110
|
4. **Phase 4: Targeted Diagnostics:** Groups and outputs anomalies based on the entry point package context.
|
|
58
|
-
|
|
59
|
-
---
|
|
60
|
-
|
|
61
|
-
## Installation & Usage
|
|
62
|
-
|
|
63
|
-
No configuration files are required. The script extracts metadata directly from your local environment.
|
|
64
|
-
|
|
65
|
-
### Execution
|
|
66
|
-
|
|
67
|
-
```bash
|
|
68
|
-
npx @ts-stack/cycle-detector <entry-patterns> [options]
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
### Arguments & Flags
|
|
72
|
-
|
|
73
|
-
* `<entry-patterns>`: Glob patterns or paths to entry point files (e.g., `packages/*/src/index.ts`).
|
|
74
|
-
* `-p, --project <path>`: Path to your root or fallback `tsconfig.json`.
|
|
75
|
-
|
|
76
|
-
### Example Command
|
|
77
|
-
|
|
78
|
-
```bash
|
|
79
|
-
npx @ts-stack/cycle-detector packages/*/src/index.ts
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
---
|
|
83
|
-
|
|
84
|
-
## Interpreting Diagnostics
|
|
85
|
-
|
|
86
|
-
When a breaking circular dependency is detected, the script identifies exactly **which file executes the token prematurely**, leaving non-blocking files clearly marked.
|
|
87
|
-
|
|
88
|
-
```txt
|
|
89
|
-
❌ [/packages/rest/src/index.ts] — Found 1 critical circular dependencies:
|
|
90
|
-
1) --------------------------------------------------------------------------------
|
|
91
|
-
⏳ [Lazy] /srv/git/ditsmod/ditsmod/packages/rest/src/extensions/routes.extension.ts
|
|
92
|
-
⏳ [Lazy] /srv/git/ditsmod/ditsmod/packages/rest/src/decorators/rest-init-hooks-and-metadata.ts
|
|
93
|
-
💥 [Top-level] /srv/git/ditsmod/ditsmod/packages/rest/src/init/rest.module.ts
|
|
94
|
-
|
|
95
|
-
💥 Validation failed. Critical circular dependencies detected.
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
### How to Refactor Based on the Log Above:
|
|
99
|
-
|
|
100
|
-
The log indicates that `/packages/rest/src/init/rest.module.ts` contains an immediate top-level expression (such as an active decorator evaluation or configuration factory instantiation) that forces the evaluation of `routes.extension.ts` before the module evaluation of `rest.module.ts` is complete. To fix this, extract the shared configuration metadata or decorator targets into a dedicated initialization file positioned lower in the dependency hierarchy.
|
|
101
|
-
|
|
102
|
-
---
|
|
103
|
-
|
|
104
|
-
## Exit Codes
|
|
105
|
-
|
|
106
|
-
* `0`: Success. Clean graph or only safe, runtime-deferred cyclic references found.
|
|
107
|
-
* `1`: Critical Top-level execution loops found. Build terminated.
|
package/dist/index.js
CHANGED
|
@@ -8,6 +8,10 @@ const allUniqueCycles = [];
|
|
|
8
8
|
const globalDetectedCycles = new Set();
|
|
9
9
|
const packageMetaCache = new Map();
|
|
10
10
|
const compilerOptionsCache = new Map();
|
|
11
|
+
// Caches for AST and analysis results to prevent bottlenecks
|
|
12
|
+
const sourceFileCache = new Map();
|
|
13
|
+
const topLevelUsageCache = new Map();
|
|
14
|
+
const exportedHoistedFunctionsCache = new Map();
|
|
11
15
|
let globalProjectPath;
|
|
12
16
|
function parseArgs() {
|
|
13
17
|
const args = [...process.argv.slice(2)];
|
|
@@ -31,13 +35,21 @@ function isRuntimeImport(node) {
|
|
|
31
35
|
return !node.isTypeOnly;
|
|
32
36
|
}
|
|
33
37
|
if (ts.isImportDeclaration(node)) {
|
|
38
|
+
if (node.importClause?.phaseModifier)
|
|
39
|
+
return false;
|
|
34
40
|
if (!node.importClause)
|
|
35
|
-
return true;
|
|
41
|
+
return true; // Side-effect import
|
|
36
42
|
if (node.importClause.phaseModifier)
|
|
37
43
|
return false;
|
|
44
|
+
if (node.importClause.name)
|
|
45
|
+
return true; // Default import present
|
|
38
46
|
const namedBindings = node.importClause.namedBindings;
|
|
39
|
-
if (namedBindings
|
|
40
|
-
|
|
47
|
+
if (namedBindings) {
|
|
48
|
+
if (ts.isNamespaceImport(namedBindings))
|
|
49
|
+
return true;
|
|
50
|
+
if (ts.isNamedImports(namedBindings)) {
|
|
51
|
+
return !namedBindings.elements.every((el) => el.isTypeOnly);
|
|
52
|
+
}
|
|
41
53
|
}
|
|
42
54
|
return true;
|
|
43
55
|
}
|
|
@@ -46,9 +58,8 @@ function isRuntimeImport(node) {
|
|
|
46
58
|
function getCompilerOptionsForFile(filePath) {
|
|
47
59
|
const currentDir = path.dirname(filePath);
|
|
48
60
|
const cachedOptions = compilerOptionsCache.get(currentDir);
|
|
49
|
-
if (cachedOptions !== undefined)
|
|
61
|
+
if (cachedOptions !== undefined)
|
|
50
62
|
return cachedOptions;
|
|
51
|
-
}
|
|
52
63
|
const configPath = ts.findConfigFile(currentDir, ts.sys.fileExists, 'tsconfig.json') || globalProjectPath;
|
|
53
64
|
if (configPath) {
|
|
54
65
|
const resolvedConfigPath = path.resolve(configPath);
|
|
@@ -89,15 +100,39 @@ function getPackageMeta(filePath) {
|
|
|
89
100
|
const pkg = JSON.parse(content);
|
|
90
101
|
let outDirName = 'dist';
|
|
91
102
|
const mainField = pkg.main || pkg.types || pkg.typings || '';
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
if (
|
|
95
|
-
|
|
103
|
+
let exportsMain = '';
|
|
104
|
+
if (pkg.exports) {
|
|
105
|
+
if (typeof pkg.exports === 'string') {
|
|
106
|
+
exportsMain = pkg.exports;
|
|
96
107
|
}
|
|
97
|
-
else if (
|
|
98
|
-
|
|
108
|
+
else if (typeof pkg.exports === 'object') {
|
|
109
|
+
const dotExport = pkg.exports['.'];
|
|
110
|
+
if (dotExport) {
|
|
111
|
+
if (typeof dotExport === 'string') {
|
|
112
|
+
exportsMain = dotExport;
|
|
113
|
+
}
|
|
114
|
+
else if (typeof dotExport === 'object') {
|
|
115
|
+
exportsMain = dotExport.import || dotExport.require || dotExport.default || '';
|
|
116
|
+
}
|
|
117
|
+
}
|
|
99
118
|
}
|
|
100
119
|
}
|
|
120
|
+
const targetField = mainField || exportsMain;
|
|
121
|
+
if (targetField) {
|
|
122
|
+
const parts = path.normalize(targetField).split(path.sep);
|
|
123
|
+
const cleanParts = parts.filter((p) => p !== '.' && p !== '..');
|
|
124
|
+
if (cleanParts.length > 0) {
|
|
125
|
+
outDirName = cleanParts[0];
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
if (fs.existsSync(path.join(currentDir, 'dist')))
|
|
130
|
+
outDirName = 'dist';
|
|
131
|
+
else if (fs.existsSync(path.join(currentDir, 'build')))
|
|
132
|
+
outDirName = 'build';
|
|
133
|
+
else if (fs.existsSync(path.join(currentDir, 'out')))
|
|
134
|
+
outDirName = 'out';
|
|
135
|
+
}
|
|
101
136
|
let srcDirName = 'src';
|
|
102
137
|
if (fs.existsSync(path.join(currentDir, 'source')))
|
|
103
138
|
srcDirName = 'source';
|
|
@@ -126,16 +161,14 @@ function resolveModule(moduleName, containingFile, options) {
|
|
|
126
161
|
if (!result.resolvedModule)
|
|
127
162
|
return null;
|
|
128
163
|
const resolvedFileName = path.resolve(result.resolvedModule.resolvedFileName);
|
|
129
|
-
if (resolvedFileName.includes(`${path.sep}node_modules${path.sep}`))
|
|
164
|
+
if (resolvedFileName.includes(`${path.sep}node_modules${path.sep}`))
|
|
130
165
|
return null;
|
|
131
|
-
}
|
|
132
166
|
const meta = getPackageMeta(resolvedFileName);
|
|
133
167
|
if (meta) {
|
|
134
168
|
const { pkgDir, srcDirName, outDirName } = meta;
|
|
135
169
|
const srcDirPath = path.join(pkgDir, srcDirName);
|
|
136
|
-
if (resolvedFileName.startsWith(srcDirPath + path.sep))
|
|
170
|
+
if (resolvedFileName.startsWith(srcDirPath + path.sep))
|
|
137
171
|
return resolvedFileName;
|
|
138
|
-
}
|
|
139
172
|
const outDirPath = path.join(pkgDir, outDirName);
|
|
140
173
|
if (resolvedFileName.startsWith(outDirPath + path.sep) || resolvedFileName === outDirPath) {
|
|
141
174
|
const relativeToOut = path.relative(outDirPath, resolvedFileName);
|
|
@@ -157,16 +190,12 @@ function resolveModule(moduleName, containingFile, options) {
|
|
|
157
190
|
const extensions = ['.ts', '.tsx', '.mts', '.cts'];
|
|
158
191
|
for (const ext of extensions) {
|
|
159
192
|
const targetSrcFile = path.join(srcDirPath, baseName + ext);
|
|
160
|
-
if (fs.existsSync(targetSrcFile))
|
|
193
|
+
if (fs.existsSync(targetSrcFile))
|
|
161
194
|
return targetSrcFile;
|
|
162
|
-
}
|
|
163
195
|
}
|
|
164
196
|
}
|
|
165
197
|
}
|
|
166
|
-
|
|
167
|
-
return null;
|
|
168
|
-
}
|
|
169
|
-
return resolvedFileName;
|
|
198
|
+
return result.resolvedModule.isExternalLibraryImport ? null : resolvedFileName;
|
|
170
199
|
}
|
|
171
200
|
function getCanonicalCycleKey(cycle) {
|
|
172
201
|
const nodes = cycle.slice(0, -1);
|
|
@@ -174,9 +203,8 @@ function getCanonicalCycleKey(cycle) {
|
|
|
174
203
|
return '';
|
|
175
204
|
let minIdx = 0;
|
|
176
205
|
for (let i = 1; i < nodes.length; i++) {
|
|
177
|
-
if (nodes[i] < nodes[minIdx])
|
|
206
|
+
if (nodes[i] < nodes[minIdx])
|
|
178
207
|
minIdx = i;
|
|
179
|
-
}
|
|
180
208
|
}
|
|
181
209
|
const rotated = [...nodes.slice(minIdx), ...nodes.slice(0, minIdx)];
|
|
182
210
|
rotated.push(rotated[0]);
|
|
@@ -187,8 +215,12 @@ function parseFile(filePath) {
|
|
|
187
215
|
return;
|
|
188
216
|
graph.set(filePath, []);
|
|
189
217
|
const options = getCompilerOptionsForFile(filePath);
|
|
190
|
-
|
|
191
|
-
|
|
218
|
+
let sourceFile = sourceFileCache.get(filePath);
|
|
219
|
+
if (!sourceFile) {
|
|
220
|
+
const content = fs.readFileSync(filePath, 'utf8');
|
|
221
|
+
sourceFile = ts.createSourceFile(filePath, content, ts.ScriptTarget.Latest, true);
|
|
222
|
+
sourceFileCache.set(filePath, sourceFile);
|
|
223
|
+
}
|
|
192
224
|
const imports = [];
|
|
193
225
|
function walk(node) {
|
|
194
226
|
if (ts.isImportDeclaration(node) || ts.isExportDeclaration(node)) {
|
|
@@ -208,16 +240,98 @@ function parseFile(filePath) {
|
|
|
208
240
|
for (const dep of imports)
|
|
209
241
|
parseFile(dep);
|
|
210
242
|
}
|
|
243
|
+
/**
|
|
244
|
+
* Analyzes a file and extracts the names of all exported functions that are hoisted.
|
|
245
|
+
*/
|
|
246
|
+
function getExportedHoistedFunctions(filePath) {
|
|
247
|
+
if (exportedHoistedFunctionsCache.has(filePath)) {
|
|
248
|
+
return exportedHoistedFunctionsCache.get(filePath);
|
|
249
|
+
}
|
|
250
|
+
const hoisted = new Set();
|
|
251
|
+
if (!fs.existsSync(filePath)) {
|
|
252
|
+
exportedHoistedFunctionsCache.set(filePath, hoisted);
|
|
253
|
+
return hoisted;
|
|
254
|
+
}
|
|
255
|
+
let sourceFile = sourceFileCache.get(filePath);
|
|
256
|
+
if (!sourceFile) {
|
|
257
|
+
try {
|
|
258
|
+
const content = fs.readFileSync(filePath, 'utf8');
|
|
259
|
+
sourceFile = ts.createSourceFile(filePath, content, ts.ScriptTarget.Latest, true);
|
|
260
|
+
sourceFileCache.set(filePath, sourceFile);
|
|
261
|
+
}
|
|
262
|
+
catch {
|
|
263
|
+
exportedHoistedFunctionsCache.set(filePath, hoisted);
|
|
264
|
+
return hoisted;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
const localHoistedFuncs = new Set();
|
|
268
|
+
// Pass 1: Find all top-level function declarations and direct export modifiers
|
|
269
|
+
for (const statement of sourceFile.statements) {
|
|
270
|
+
if (ts.isFunctionDeclaration(statement)) {
|
|
271
|
+
if (statement.name) {
|
|
272
|
+
localHoistedFuncs.add(statement.name.text);
|
|
273
|
+
}
|
|
274
|
+
const hasExport = statement.modifiers?.some((m) => m.kind === ts.SyntaxKind.ExportKeyword);
|
|
275
|
+
const hasDefault = statement.modifiers?.some((m) => m.kind === ts.SyntaxKind.DefaultKeyword);
|
|
276
|
+
if (hasExport) {
|
|
277
|
+
if (hasDefault)
|
|
278
|
+
hoisted.add('default');
|
|
279
|
+
else if (statement.name)
|
|
280
|
+
hoisted.add(statement.name.text);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
// Pass 2: Look for independent export declarations or export assignments mapping to local functions
|
|
285
|
+
for (const statement of sourceFile.statements) {
|
|
286
|
+
if (ts.isExportDeclaration(statement)) {
|
|
287
|
+
if (!statement.moduleSpecifier && statement.exportClause && ts.isNamedExports(statement.exportClause)) {
|
|
288
|
+
for (const el of statement.exportClause.elements) {
|
|
289
|
+
const localName = el.propertyName ? el.propertyName.text : el.name.text;
|
|
290
|
+
const exportedName = el.name.text;
|
|
291
|
+
if (localHoistedFuncs.has(localName)) {
|
|
292
|
+
hoisted.add(exportedName);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
else if (ts.isExportAssignment(statement)) {
|
|
298
|
+
if (!statement.isExportEquals && ts.isIdentifier(statement.expression)) {
|
|
299
|
+
if (localHoistedFuncs.has(statement.expression.text)) {
|
|
300
|
+
hoisted.add('default');
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
exportedHoistedFunctionsCache.set(filePath, hoisted);
|
|
306
|
+
return hoisted;
|
|
307
|
+
}
|
|
211
308
|
/**
|
|
212
309
|
* Checks if a specific file import creates an immediate execution (top-level) risk.
|
|
213
310
|
*/
|
|
214
311
|
function hasTopLevelUsage(fromFile, toFile) {
|
|
215
312
|
if (!fs.existsSync(fromFile))
|
|
216
313
|
return false;
|
|
314
|
+
const cacheKey = `${fromFile}-->${toFile}`;
|
|
315
|
+
if (topLevelUsageCache.has(cacheKey))
|
|
316
|
+
return topLevelUsageCache.get(cacheKey);
|
|
217
317
|
const options = getCompilerOptionsForFile(fromFile);
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
318
|
+
let sourceFile = sourceFileCache.get(fromFile);
|
|
319
|
+
if (!sourceFile) {
|
|
320
|
+
try {
|
|
321
|
+
const content = fs.readFileSync(fromFile, 'utf8');
|
|
322
|
+
sourceFile = ts.createSourceFile(fromFile, content, ts.ScriptTarget.Latest, true);
|
|
323
|
+
sourceFileCache.set(fromFile, sourceFile);
|
|
324
|
+
}
|
|
325
|
+
catch {
|
|
326
|
+
topLevelUsageCache.set(cacheKey, false);
|
|
327
|
+
return false;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
// Get all safe hoisted exports from the target file
|
|
331
|
+
const hoistedExports = getExportedHoistedFunctions(toFile);
|
|
332
|
+
// Maps local import identifier to its original exported symbol name
|
|
333
|
+
const localToExportedName = new Map();
|
|
334
|
+
let namespaceImportName = null;
|
|
221
335
|
let hasSideEffectOrReExport = false;
|
|
222
336
|
function findImports(node) {
|
|
223
337
|
if (ts.isImportDeclaration(node) || ts.isExportDeclaration(node)) {
|
|
@@ -228,15 +342,17 @@ function hasTopLevelUsage(fromFile, toFile) {
|
|
|
228
342
|
if (resolved === toFile) {
|
|
229
343
|
if (ts.isImportDeclaration(node) && node.importClause) {
|
|
230
344
|
const clause = node.importClause;
|
|
231
|
-
if (clause.name)
|
|
232
|
-
|
|
345
|
+
if (clause.name) {
|
|
346
|
+
localToExportedName.set(clause.name.text, 'default');
|
|
347
|
+
}
|
|
233
348
|
if (clause.namedBindings) {
|
|
234
349
|
if (ts.isNamespaceImport(clause.namedBindings)) {
|
|
235
|
-
|
|
350
|
+
namespaceImportName = clause.namedBindings.name.text;
|
|
236
351
|
}
|
|
237
352
|
else if (ts.isNamedImports(clause.namedBindings)) {
|
|
238
353
|
for (const el of clause.namedBindings.elements) {
|
|
239
|
-
|
|
354
|
+
const exportedName = el.propertyName ? el.propertyName.text : el.name.text;
|
|
355
|
+
localToExportedName.set(el.name.text, exportedName);
|
|
240
356
|
}
|
|
241
357
|
}
|
|
242
358
|
}
|
|
@@ -251,10 +367,14 @@ function hasTopLevelUsage(fromFile, toFile) {
|
|
|
251
367
|
ts.forEachChild(node, findImports);
|
|
252
368
|
}
|
|
253
369
|
findImports(sourceFile);
|
|
254
|
-
if (hasSideEffectOrReExport)
|
|
370
|
+
if (hasSideEffectOrReExport) {
|
|
371
|
+
topLevelUsageCache.set(cacheKey, true);
|
|
255
372
|
return true;
|
|
256
|
-
|
|
373
|
+
}
|
|
374
|
+
if (localToExportedName.size === 0 && !namespaceImportName) {
|
|
375
|
+
topLevelUsageCache.set(cacheKey, false);
|
|
257
376
|
return false;
|
|
377
|
+
}
|
|
258
378
|
let dangerousTopLevelUsage = false;
|
|
259
379
|
function checkNodeUsage(node, isInsideLazyScope) {
|
|
260
380
|
if (dangerousTopLevelUsage)
|
|
@@ -270,40 +390,76 @@ function hasTopLevelUsage(fromFile, toFile) {
|
|
|
270
390
|
currentScopeLazy = true;
|
|
271
391
|
}
|
|
272
392
|
if (ts.isPropertyDeclaration(node)) {
|
|
273
|
-
const isStatic = node.modifiers?.some(m => m.kind === ts.SyntaxKind.StaticKeyword);
|
|
274
|
-
if (!isStatic)
|
|
393
|
+
const isStatic = node.modifiers?.some((m) => m.kind === ts.SyntaxKind.StaticKeyword);
|
|
394
|
+
if (!isStatic)
|
|
275
395
|
currentScopeLazy = true;
|
|
276
|
-
}
|
|
277
396
|
}
|
|
278
397
|
if (!currentScopeLazy && ts.isIdentifier(node)) {
|
|
279
|
-
|
|
398
|
+
const isImportedSymbol = localToExportedName.has(node.text);
|
|
399
|
+
const isNamespaceReference = namespaceImportName && node.text === namespaceImportName;
|
|
400
|
+
if (isImportedSymbol || isNamespaceReference) {
|
|
280
401
|
const parent = node.parent;
|
|
281
|
-
|
|
402
|
+
// Protection 1: Skip metadata/declarations references
|
|
403
|
+
const isImportOrExportDeclarationRef = ts.isImportSpecifier(parent) ||
|
|
282
404
|
ts.isImportClause(parent) ||
|
|
283
|
-
ts.isNamespaceImport(parent)
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
405
|
+
ts.isNamespaceImport(parent) ||
|
|
406
|
+
ts.isExportSpecifier(parent);
|
|
407
|
+
if (isImportOrExportDeclarationRef)
|
|
408
|
+
return;
|
|
409
|
+
// Protection 2: Avoid object property name access False Positives (obj.foo)
|
|
410
|
+
if (ts.isPropertyAccessExpression(parent) && parent.name === node)
|
|
411
|
+
return;
|
|
412
|
+
// Protection 3: Avoid object assignment keys False Positives ({ foo: 123 })
|
|
413
|
+
if (ts.isPropertyAssignment(parent) && parent.name === node)
|
|
414
|
+
return;
|
|
415
|
+
// Protection 4: Avoid shadow declarations with matching names
|
|
416
|
+
if ((ts.isMethodDeclaration(parent) ||
|
|
417
|
+
ts.isPropertyDeclaration(parent) ||
|
|
418
|
+
ts.isClassDeclaration(parent) ||
|
|
419
|
+
ts.isInterfaceDeclaration(parent) ||
|
|
420
|
+
ts.isFunctionDeclaration(parent)) &&
|
|
421
|
+
parent.name === node) {
|
|
422
|
+
return;
|
|
423
|
+
}
|
|
424
|
+
// (Hoisting check 1): Direct or renamed named/default import usage
|
|
425
|
+
if (isImportedSymbol) {
|
|
426
|
+
const exportedName = localToExportedName.get(node.text);
|
|
427
|
+
if (hoistedExports.has(exportedName)) {
|
|
428
|
+
return; // Perfectly safe hoisted function call/reference!
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
// (Hoisting check 2): Namespace import property access usage (ns.foo())
|
|
432
|
+
if (isNamespaceReference) {
|
|
433
|
+
if (ts.isPropertyAccessExpression(parent) && parent.expression === node) {
|
|
434
|
+
const propName = parent.name.text;
|
|
435
|
+
if (hoistedExports.has(propName)) {
|
|
436
|
+
return; // Perfectly safe property from namespace!
|
|
294
437
|
}
|
|
295
|
-
checkParent = checkParent.parent;
|
|
296
438
|
}
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
439
|
+
}
|
|
440
|
+
// Protection 5: Type contexts checks
|
|
441
|
+
let isInTypeContext = false;
|
|
442
|
+
let checkParent = parent;
|
|
443
|
+
while (checkParent && checkParent !== sourceFile) {
|
|
444
|
+
if (ts.isTypeNode(checkParent) ||
|
|
445
|
+
ts.isTypeReferenceNode(checkParent) ||
|
|
446
|
+
ts.isTypeAliasDeclaration(checkParent) ||
|
|
447
|
+
ts.isInterfaceDeclaration(checkParent)) {
|
|
448
|
+
isInTypeContext = true;
|
|
449
|
+
break;
|
|
300
450
|
}
|
|
451
|
+
checkParent = checkParent.parent;
|
|
452
|
+
}
|
|
453
|
+
if (!isInTypeContext) {
|
|
454
|
+
dangerousTopLevelUsage = true;
|
|
455
|
+
return;
|
|
301
456
|
}
|
|
302
457
|
}
|
|
303
458
|
}
|
|
304
459
|
ts.forEachChild(node, (n) => checkNodeUsage(n, currentScopeLazy));
|
|
305
460
|
}
|
|
306
461
|
checkNodeUsage(sourceFile, false);
|
|
462
|
+
topLevelUsageCache.set(cacheKey, dangerousTopLevelUsage);
|
|
307
463
|
return dangerousTopLevelUsage;
|
|
308
464
|
}
|
|
309
465
|
function canReach(start, target) {
|
|
@@ -317,9 +473,8 @@ function canReach(start, target) {
|
|
|
317
473
|
continue;
|
|
318
474
|
seen.add(current);
|
|
319
475
|
const deps = graph.get(current) || [];
|
|
320
|
-
for (const dep of deps)
|
|
476
|
+
for (const dep of deps)
|
|
321
477
|
stack.push(dep);
|
|
322
|
-
}
|
|
323
478
|
}
|
|
324
479
|
return false;
|
|
325
480
|
}
|
|
@@ -378,9 +533,8 @@ function main() {
|
|
|
378
533
|
visited.set(node, 'VISITED');
|
|
379
534
|
}
|
|
380
535
|
for (const entryPoint of entryPoints) {
|
|
381
|
-
if (!visited.has(entryPoint))
|
|
536
|
+
if (!visited.has(entryPoint))
|
|
382
537
|
findCycles(entryPoint);
|
|
383
|
-
}
|
|
384
538
|
}
|
|
385
539
|
const criticalCycles = [];
|
|
386
540
|
for (const cycle of allUniqueCycles) {
|
|
@@ -391,14 +545,12 @@ function main() {
|
|
|
391
545
|
break;
|
|
392
546
|
}
|
|
393
547
|
}
|
|
394
|
-
if (isHarmfulCycle)
|
|
548
|
+
if (isHarmfulCycle)
|
|
395
549
|
criticalCycles.push(cycle);
|
|
396
|
-
}
|
|
397
550
|
}
|
|
398
551
|
const entryPointCycles = new Map();
|
|
399
|
-
for (const ep of entryPoints)
|
|
552
|
+
for (const ep of entryPoints)
|
|
400
553
|
entryPointCycles.set(ep, []);
|
|
401
|
-
}
|
|
402
554
|
for (const cycle of criticalCycles) {
|
|
403
555
|
const firstFile = cycle[0];
|
|
404
556
|
const matchedEp = entryPoints.find((ep) => {
|
|
@@ -410,15 +562,12 @@ function main() {
|
|
|
410
562
|
}
|
|
411
563
|
else {
|
|
412
564
|
const reachingEp = entryPoints.find((ep) => canReach(ep, firstFile));
|
|
413
|
-
if (reachingEp)
|
|
565
|
+
if (reachingEp)
|
|
414
566
|
entryPointCycles.get(reachingEp).push(cycle);
|
|
415
|
-
|
|
416
|
-
else {
|
|
567
|
+
else
|
|
417
568
|
entryPointCycles.get(entryPoints[0]).push(cycle);
|
|
418
|
-
}
|
|
419
569
|
}
|
|
420
570
|
}
|
|
421
|
-
// Phase 4: Output the clean, perfectly targeted report
|
|
422
571
|
let globalHasCycles = false;
|
|
423
572
|
for (const entryPoint of entryPoints) {
|
|
424
573
|
const absoluteEntry = path.resolve(entryPoint);
|
|
@@ -429,7 +578,7 @@ function main() {
|
|
|
429
578
|
cycles.forEach((cycle, index) => {
|
|
430
579
|
console.error(` ${index + 1})`, '-'.repeat(80));
|
|
431
580
|
for (let i = 1; i < cycle.length; i++) {
|
|
432
|
-
const nextFile =
|
|
581
|
+
const nextFile = i === cycle.length - 1 ? cycle[1] : cycle[i + 1];
|
|
433
582
|
const isTopLevel = hasTopLevelUsage(cycle[i], nextFile);
|
|
434
583
|
const prefix = isTopLevel ? ' 💥 [Top-level] ' : ' ⏳ [Lazy] ';
|
|
435
584
|
console.error(`${prefix}${path.resolve(cycle[i])}`);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -11,9 +11,14 @@ const graph = new Map<string, string[]>();
|
|
|
11
11
|
const allUniqueCycles: string[][] = [];
|
|
12
12
|
const globalDetectedCycles = new Set<string>();
|
|
13
13
|
|
|
14
|
-
const packageMetaCache = new Map<string, { pkgDir: string; srcDirName: string; outDirName: string
|
|
14
|
+
const packageMetaCache = new Map<string, { pkgDir: string; srcDirName: string; outDirName: string } | null>();
|
|
15
15
|
const compilerOptionsCache = new Map<string, ts.CompilerOptions>();
|
|
16
16
|
|
|
17
|
+
// Caches for AST and analysis results to prevent bottlenecks
|
|
18
|
+
const sourceFileCache = new Map<string, ts.SourceFile>();
|
|
19
|
+
const topLevelUsageCache = new Map<string, boolean>();
|
|
20
|
+
const exportedHoistedFunctionsCache = new Map<string, Set<string>>();
|
|
21
|
+
|
|
17
22
|
let globalProjectPath: string | undefined;
|
|
18
23
|
|
|
19
24
|
function parseArgs() {
|
|
@@ -40,12 +45,18 @@ function isRuntimeImport(node: ts.ImportDeclaration | ts.ExportDeclaration): boo
|
|
|
40
45
|
}
|
|
41
46
|
|
|
42
47
|
if (ts.isImportDeclaration(node)) {
|
|
43
|
-
if (
|
|
48
|
+
if (node.importClause?.phaseModifier) return false;
|
|
49
|
+
if (!node.importClause) return true; // Side-effect import
|
|
44
50
|
if (node.importClause.phaseModifier) return false;
|
|
45
51
|
|
|
52
|
+
if (node.importClause.name) return true; // Default import present
|
|
53
|
+
|
|
46
54
|
const namedBindings = node.importClause.namedBindings;
|
|
47
|
-
if (namedBindings
|
|
48
|
-
|
|
55
|
+
if (namedBindings) {
|
|
56
|
+
if (ts.isNamespaceImport(namedBindings)) return true;
|
|
57
|
+
if (ts.isNamedImports(namedBindings)) {
|
|
58
|
+
return !namedBindings.elements.every((el) => el.isTypeOnly);
|
|
59
|
+
}
|
|
49
60
|
}
|
|
50
61
|
return true;
|
|
51
62
|
}
|
|
@@ -55,18 +66,14 @@ function isRuntimeImport(node: ts.ImportDeclaration | ts.ExportDeclaration): boo
|
|
|
55
66
|
|
|
56
67
|
function getCompilerOptionsForFile(filePath: string): ts.CompilerOptions {
|
|
57
68
|
const currentDir = path.dirname(filePath);
|
|
58
|
-
|
|
59
69
|
const cachedOptions = compilerOptionsCache.get(currentDir);
|
|
60
|
-
if (cachedOptions !== undefined)
|
|
61
|
-
return cachedOptions;
|
|
62
|
-
}
|
|
70
|
+
if (cachedOptions !== undefined) return cachedOptions;
|
|
63
71
|
|
|
64
72
|
const configPath = ts.findConfigFile(currentDir, ts.sys.fileExists, 'tsconfig.json') || globalProjectPath;
|
|
65
73
|
|
|
66
74
|
if (configPath) {
|
|
67
75
|
const resolvedConfigPath = path.resolve(configPath);
|
|
68
76
|
const configDir = path.dirname(resolvedConfigPath);
|
|
69
|
-
|
|
70
77
|
const cachedConfig = compilerOptionsCache.get(resolvedConfigPath);
|
|
71
78
|
if (cachedConfig !== undefined) {
|
|
72
79
|
compilerOptionsCache.set(currentDir, cachedConfig);
|
|
@@ -77,7 +84,6 @@ function getCompilerOptionsForFile(filePath: string): ts.CompilerOptions {
|
|
|
77
84
|
const configFile = ts.readConfigFile(resolvedConfigPath, ts.sys.readFile);
|
|
78
85
|
const parsedConfig = ts.parseJsonConfigFileContent(configFile.config, ts.sys, configDir);
|
|
79
86
|
const options = parsedConfig.options || {};
|
|
80
|
-
|
|
81
87
|
compilerOptionsCache.set(resolvedConfigPath, options);
|
|
82
88
|
compilerOptionsCache.set(currentDir, options);
|
|
83
89
|
return options;
|
|
@@ -108,15 +114,36 @@ function getPackageMeta(filePath: string) {
|
|
|
108
114
|
|
|
109
115
|
let outDirName = 'dist';
|
|
110
116
|
const mainField = pkg.main || pkg.types || pkg.typings || '';
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
+
|
|
118
|
+
let exportsMain = '';
|
|
119
|
+
if (pkg.exports) {
|
|
120
|
+
if (typeof pkg.exports === 'string') {
|
|
121
|
+
exportsMain = pkg.exports;
|
|
122
|
+
} else if (typeof pkg.exports === 'object') {
|
|
123
|
+
const dotExport = pkg.exports['.'];
|
|
124
|
+
if (dotExport) {
|
|
125
|
+
if (typeof dotExport === 'string') {
|
|
126
|
+
exportsMain = dotExport;
|
|
127
|
+
} else if (typeof dotExport === 'object') {
|
|
128
|
+
exportsMain = dotExport.import || dotExport.require || dotExport.default || '';
|
|
129
|
+
}
|
|
130
|
+
}
|
|
117
131
|
}
|
|
118
132
|
}
|
|
119
133
|
|
|
134
|
+
const targetField = mainField || exportsMain;
|
|
135
|
+
if (targetField) {
|
|
136
|
+
const parts = path.normalize(targetField).split(path.sep);
|
|
137
|
+
const cleanParts = parts.filter((p) => p !== '.' && p !== '..');
|
|
138
|
+
if (cleanParts.length > 0) {
|
|
139
|
+
outDirName = cleanParts[0];
|
|
140
|
+
}
|
|
141
|
+
} else {
|
|
142
|
+
if (fs.existsSync(path.join(currentDir, 'dist'))) outDirName = 'dist';
|
|
143
|
+
else if (fs.existsSync(path.join(currentDir, 'build'))) outDirName = 'build';
|
|
144
|
+
else if (fs.existsSync(path.join(currentDir, 'out'))) outDirName = 'out';
|
|
145
|
+
}
|
|
146
|
+
|
|
120
147
|
let srcDirName = 'src';
|
|
121
148
|
if (fs.existsSync(path.join(currentDir, 'source'))) srcDirName = 'source';
|
|
122
149
|
else if (fs.existsSync(path.join(currentDir, 'lib'))) srcDirName = 'lib';
|
|
@@ -144,19 +171,14 @@ function resolveModule(moduleName: string, containingFile: string, options: ts.C
|
|
|
144
171
|
if (!result.resolvedModule) return null;
|
|
145
172
|
|
|
146
173
|
const resolvedFileName = path.resolve(result.resolvedModule.resolvedFileName);
|
|
147
|
-
|
|
148
|
-
if (resolvedFileName.includes(`${path.sep}node_modules${path.sep}`)) {
|
|
149
|
-
return null;
|
|
150
|
-
}
|
|
174
|
+
if (resolvedFileName.includes(`${path.sep}node_modules${path.sep}`)) return null;
|
|
151
175
|
|
|
152
176
|
const meta = getPackageMeta(resolvedFileName);
|
|
153
177
|
if (meta) {
|
|
154
178
|
const { pkgDir, srcDirName, outDirName } = meta;
|
|
155
179
|
const srcDirPath = path.join(pkgDir, srcDirName);
|
|
156
180
|
|
|
157
|
-
if (resolvedFileName.startsWith(srcDirPath + path.sep))
|
|
158
|
-
return resolvedFileName;
|
|
159
|
-
}
|
|
181
|
+
if (resolvedFileName.startsWith(srcDirPath + path.sep)) return resolvedFileName;
|
|
160
182
|
|
|
161
183
|
const outDirPath = path.join(pkgDir, outDirName);
|
|
162
184
|
if (resolvedFileName.startsWith(outDirPath + path.sep) || resolvedFileName === outDirPath) {
|
|
@@ -174,18 +196,12 @@ function resolveModule(moduleName: string, containingFile: string, options: ts.C
|
|
|
174
196
|
const extensions = ['.ts', '.tsx', '.mts', '.cts'];
|
|
175
197
|
for (const ext of extensions) {
|
|
176
198
|
const targetSrcFile = path.join(srcDirPath, baseName + ext);
|
|
177
|
-
if (fs.existsSync(targetSrcFile))
|
|
178
|
-
return targetSrcFile;
|
|
179
|
-
}
|
|
199
|
+
if (fs.existsSync(targetSrcFile)) return targetSrcFile;
|
|
180
200
|
}
|
|
181
201
|
}
|
|
182
202
|
}
|
|
183
203
|
|
|
184
|
-
|
|
185
|
-
return null;
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
return resolvedFileName;
|
|
204
|
+
return result.resolvedModule.isExternalLibraryImport ? null : resolvedFileName;
|
|
189
205
|
}
|
|
190
206
|
|
|
191
207
|
function getCanonicalCycleKey(cycle: string[]): string {
|
|
@@ -194,9 +210,7 @@ function getCanonicalCycleKey(cycle: string[]): string {
|
|
|
194
210
|
|
|
195
211
|
let minIdx = 0;
|
|
196
212
|
for (let i = 1; i < nodes.length; i++) {
|
|
197
|
-
if (nodes[i] < nodes[minIdx])
|
|
198
|
-
minIdx = i;
|
|
199
|
-
}
|
|
213
|
+
if (nodes[i] < nodes[minIdx]) minIdx = i;
|
|
200
214
|
}
|
|
201
215
|
|
|
202
216
|
const rotated = [...nodes.slice(minIdx), ...nodes.slice(0, minIdx)];
|
|
@@ -209,8 +223,14 @@ function parseFile(filePath: string) {
|
|
|
209
223
|
graph.set(filePath, []);
|
|
210
224
|
|
|
211
225
|
const options = getCompilerOptionsForFile(filePath);
|
|
212
|
-
|
|
213
|
-
|
|
226
|
+
|
|
227
|
+
let sourceFile = sourceFileCache.get(filePath);
|
|
228
|
+
if (!sourceFile) {
|
|
229
|
+
const content = fs.readFileSync(filePath, 'utf8');
|
|
230
|
+
sourceFile = ts.createSourceFile(filePath, content, ts.ScriptTarget.Latest, true);
|
|
231
|
+
sourceFileCache.set(filePath, sourceFile);
|
|
232
|
+
}
|
|
233
|
+
|
|
214
234
|
const imports: string[] = [];
|
|
215
235
|
|
|
216
236
|
function walk(node: ts.Node) {
|
|
@@ -232,17 +252,104 @@ function parseFile(filePath: string) {
|
|
|
232
252
|
for (const dep of imports) parseFile(dep);
|
|
233
253
|
}
|
|
234
254
|
|
|
255
|
+
/**
|
|
256
|
+
* Analyzes a file and extracts the names of all exported functions that are hoisted.
|
|
257
|
+
*/
|
|
258
|
+
function getExportedHoistedFunctions(filePath: string): Set<string> {
|
|
259
|
+
if (exportedHoistedFunctionsCache.has(filePath)) {
|
|
260
|
+
return exportedHoistedFunctionsCache.get(filePath)!;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
const hoisted = new Set<string>();
|
|
264
|
+
if (!fs.existsSync(filePath)) {
|
|
265
|
+
exportedHoistedFunctionsCache.set(filePath, hoisted);
|
|
266
|
+
return hoisted;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
let sourceFile = sourceFileCache.get(filePath);
|
|
270
|
+
if (!sourceFile) {
|
|
271
|
+
try {
|
|
272
|
+
const content = fs.readFileSync(filePath, 'utf8');
|
|
273
|
+
sourceFile = ts.createSourceFile(filePath, content, ts.ScriptTarget.Latest, true);
|
|
274
|
+
sourceFileCache.set(filePath, sourceFile);
|
|
275
|
+
} catch {
|
|
276
|
+
exportedHoistedFunctionsCache.set(filePath, hoisted);
|
|
277
|
+
return hoisted;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
const localHoistedFuncs = new Set<string>();
|
|
282
|
+
|
|
283
|
+
// Pass 1: Find all top-level function declarations and direct export modifiers
|
|
284
|
+
for (const statement of sourceFile.statements) {
|
|
285
|
+
if (ts.isFunctionDeclaration(statement)) {
|
|
286
|
+
if (statement.name) {
|
|
287
|
+
localHoistedFuncs.add(statement.name.text);
|
|
288
|
+
}
|
|
289
|
+
const hasExport = statement.modifiers?.some((m) => m.kind === ts.SyntaxKind.ExportKeyword);
|
|
290
|
+
const hasDefault = statement.modifiers?.some((m) => m.kind === ts.SyntaxKind.DefaultKeyword);
|
|
291
|
+
|
|
292
|
+
if (hasExport) {
|
|
293
|
+
if (hasDefault) hoisted.add('default');
|
|
294
|
+
else if (statement.name) hoisted.add(statement.name.text);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
// Pass 2: Look for independent export declarations or export assignments mapping to local functions
|
|
300
|
+
for (const statement of sourceFile.statements) {
|
|
301
|
+
if (ts.isExportDeclaration(statement)) {
|
|
302
|
+
if (!statement.moduleSpecifier && statement.exportClause && ts.isNamedExports(statement.exportClause)) {
|
|
303
|
+
for (const el of statement.exportClause.elements) {
|
|
304
|
+
const localName = el.propertyName ? el.propertyName.text : el.name.text;
|
|
305
|
+
const exportedName = el.name.text;
|
|
306
|
+
if (localHoistedFuncs.has(localName)) {
|
|
307
|
+
hoisted.add(exportedName);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
} else if (ts.isExportAssignment(statement)) {
|
|
312
|
+
if (!statement.isExportEquals && ts.isIdentifier(statement.expression)) {
|
|
313
|
+
if (localHoistedFuncs.has(statement.expression.text)) {
|
|
314
|
+
hoisted.add('default');
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
exportedHoistedFunctionsCache.set(filePath, hoisted);
|
|
321
|
+
return hoisted;
|
|
322
|
+
}
|
|
323
|
+
|
|
235
324
|
/**
|
|
236
325
|
* Checks if a specific file import creates an immediate execution (top-level) risk.
|
|
237
326
|
*/
|
|
238
327
|
function hasTopLevelUsage(fromFile: string, toFile: string): boolean {
|
|
239
328
|
if (!fs.existsSync(fromFile)) return false;
|
|
240
329
|
|
|
330
|
+
const cacheKey = `${fromFile}-->${toFile}`;
|
|
331
|
+
if (topLevelUsageCache.has(cacheKey)) return topLevelUsageCache.get(cacheKey)!;
|
|
332
|
+
|
|
241
333
|
const options = getCompilerOptionsForFile(fromFile);
|
|
242
|
-
const content = fs.readFileSync(fromFile, 'utf8');
|
|
243
|
-
const sourceFile = ts.createSourceFile(fromFile, content, ts.ScriptTarget.Latest, true);
|
|
244
334
|
|
|
245
|
-
|
|
335
|
+
let sourceFile = sourceFileCache.get(fromFile);
|
|
336
|
+
if (!sourceFile) {
|
|
337
|
+
try {
|
|
338
|
+
const content = fs.readFileSync(fromFile, 'utf8');
|
|
339
|
+
sourceFile = ts.createSourceFile(fromFile, content, ts.ScriptTarget.Latest, true);
|
|
340
|
+
sourceFileCache.set(fromFile, sourceFile);
|
|
341
|
+
} catch {
|
|
342
|
+
topLevelUsageCache.set(cacheKey, false);
|
|
343
|
+
return false;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
// Get all safe hoisted exports from the target file
|
|
348
|
+
const hoistedExports = getExportedHoistedFunctions(toFile);
|
|
349
|
+
|
|
350
|
+
// Maps local import identifier to its original exported symbol name
|
|
351
|
+
const localToExportedName = new Map<string, string>();
|
|
352
|
+
let namespaceImportName: string | null = null;
|
|
246
353
|
let hasSideEffectOrReExport = false;
|
|
247
354
|
|
|
248
355
|
function findImports(node: ts.Node) {
|
|
@@ -254,13 +361,16 @@ function hasTopLevelUsage(fromFile: string, toFile: string): boolean {
|
|
|
254
361
|
if (resolved === toFile) {
|
|
255
362
|
if (ts.isImportDeclaration(node) && node.importClause) {
|
|
256
363
|
const clause = node.importClause;
|
|
257
|
-
if (clause.name)
|
|
364
|
+
if (clause.name) {
|
|
365
|
+
localToExportedName.set(clause.name.text, 'default');
|
|
366
|
+
}
|
|
258
367
|
if (clause.namedBindings) {
|
|
259
368
|
if (ts.isNamespaceImport(clause.namedBindings)) {
|
|
260
|
-
|
|
369
|
+
namespaceImportName = clause.namedBindings.name.text;
|
|
261
370
|
} else if (ts.isNamedImports(clause.namedBindings)) {
|
|
262
371
|
for (const el of clause.namedBindings.elements) {
|
|
263
|
-
|
|
372
|
+
const exportedName = el.propertyName ? el.propertyName.text : el.name.text;
|
|
373
|
+
localToExportedName.set(el.name.text, exportedName);
|
|
264
374
|
}
|
|
265
375
|
}
|
|
266
376
|
}
|
|
@@ -276,8 +386,14 @@ function hasTopLevelUsage(fromFile: string, toFile: string): boolean {
|
|
|
276
386
|
|
|
277
387
|
findImports(sourceFile);
|
|
278
388
|
|
|
279
|
-
if (hasSideEffectOrReExport)
|
|
280
|
-
|
|
389
|
+
if (hasSideEffectOrReExport) {
|
|
390
|
+
topLevelUsageCache.set(cacheKey, true);
|
|
391
|
+
return true;
|
|
392
|
+
}
|
|
393
|
+
if (localToExportedName.size === 0 && !namespaceImportName) {
|
|
394
|
+
topLevelUsageCache.set(cacheKey, false);
|
|
395
|
+
return false;
|
|
396
|
+
}
|
|
281
397
|
|
|
282
398
|
let dangerousTopLevelUsage = false;
|
|
283
399
|
|
|
@@ -299,41 +415,81 @@ function hasTopLevelUsage(fromFile: string, toFile: string): boolean {
|
|
|
299
415
|
}
|
|
300
416
|
|
|
301
417
|
if (ts.isPropertyDeclaration(node)) {
|
|
302
|
-
const isStatic = node.modifiers?.some(m => m.kind === ts.SyntaxKind.StaticKeyword);
|
|
303
|
-
if (!isStatic)
|
|
304
|
-
currentScopeLazy = true;
|
|
305
|
-
}
|
|
418
|
+
const isStatic = node.modifiers?.some((m) => m.kind === ts.SyntaxKind.StaticKeyword);
|
|
419
|
+
if (!isStatic) currentScopeLazy = true;
|
|
306
420
|
}
|
|
307
421
|
|
|
308
422
|
if (!currentScopeLazy && ts.isIdentifier(node)) {
|
|
309
|
-
|
|
423
|
+
const isImportedSymbol = localToExportedName.has(node.text);
|
|
424
|
+
const isNamespaceReference = namespaceImportName && node.text === namespaceImportName;
|
|
425
|
+
|
|
426
|
+
if (isImportedSymbol || isNamespaceReference) {
|
|
310
427
|
const parent = node.parent;
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
ts.
|
|
315
|
-
ts.
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
428
|
+
|
|
429
|
+
// Protection 1: Skip metadata/declarations references
|
|
430
|
+
const isImportOrExportDeclarationRef =
|
|
431
|
+
ts.isImportSpecifier(parent) ||
|
|
432
|
+
ts.isImportClause(parent) ||
|
|
433
|
+
ts.isNamespaceImport(parent) ||
|
|
434
|
+
ts.isExportSpecifier(parent);
|
|
435
|
+
|
|
436
|
+
if (isImportOrExportDeclarationRef) return;
|
|
437
|
+
|
|
438
|
+
// Protection 2: Avoid object property name access False Positives (obj.foo)
|
|
439
|
+
if (ts.isPropertyAccessExpression(parent) && parent.name === node) return;
|
|
440
|
+
|
|
441
|
+
// Protection 3: Avoid object assignment keys False Positives ({ foo: 123 })
|
|
442
|
+
if (ts.isPropertyAssignment(parent) && parent.name === node) return;
|
|
443
|
+
|
|
444
|
+
// Protection 4: Avoid shadow declarations with matching names
|
|
445
|
+
if (
|
|
446
|
+
(ts.isMethodDeclaration(parent) ||
|
|
447
|
+
ts.isPropertyDeclaration(parent) ||
|
|
448
|
+
ts.isClassDeclaration(parent) ||
|
|
449
|
+
ts.isInterfaceDeclaration(parent) ||
|
|
450
|
+
ts.isFunctionDeclaration(parent)) &&
|
|
451
|
+
parent.name === node
|
|
452
|
+
) {
|
|
453
|
+
return;
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
// (Hoisting check 1): Direct or renamed named/default import usage
|
|
457
|
+
if (isImportedSymbol) {
|
|
458
|
+
const exportedName = localToExportedName.get(node.text)!;
|
|
459
|
+
if (hoistedExports.has(exportedName)) {
|
|
460
|
+
return; // Perfectly safe hoisted function call/reference!
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
// (Hoisting check 2): Namespace import property access usage (ns.foo())
|
|
465
|
+
if (isNamespaceReference) {
|
|
466
|
+
if (ts.isPropertyAccessExpression(parent) && parent.expression === node) {
|
|
467
|
+
const propName = parent.name.text;
|
|
468
|
+
if (hoistedExports.has(propName)) {
|
|
469
|
+
return; // Perfectly safe property from namespace!
|
|
329
470
|
}
|
|
330
|
-
checkParent = checkParent.parent;
|
|
331
471
|
}
|
|
472
|
+
}
|
|
332
473
|
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
474
|
+
// Protection 5: Type contexts checks
|
|
475
|
+
let isInTypeContext = false;
|
|
476
|
+
let checkParent: ts.Node | undefined = parent;
|
|
477
|
+
while (checkParent && checkParent !== sourceFile) {
|
|
478
|
+
if (
|
|
479
|
+
ts.isTypeNode(checkParent) ||
|
|
480
|
+
ts.isTypeReferenceNode(checkParent) ||
|
|
481
|
+
ts.isTypeAliasDeclaration(checkParent) ||
|
|
482
|
+
ts.isInterfaceDeclaration(checkParent)
|
|
483
|
+
) {
|
|
484
|
+
isInTypeContext = true;
|
|
485
|
+
break;
|
|
336
486
|
}
|
|
487
|
+
checkParent = checkParent.parent;
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
if (!isInTypeContext) {
|
|
491
|
+
dangerousTopLevelUsage = true;
|
|
492
|
+
return;
|
|
337
493
|
}
|
|
338
494
|
}
|
|
339
495
|
}
|
|
@@ -342,6 +498,7 @@ function hasTopLevelUsage(fromFile: string, toFile: string): boolean {
|
|
|
342
498
|
}
|
|
343
499
|
|
|
344
500
|
checkNodeUsage(sourceFile, false);
|
|
501
|
+
topLevelUsageCache.set(cacheKey, dangerousTopLevelUsage);
|
|
345
502
|
return dangerousTopLevelUsage;
|
|
346
503
|
}
|
|
347
504
|
|
|
@@ -356,9 +513,7 @@ function canReach(start: string, target: string): boolean {
|
|
|
356
513
|
seen.add(current);
|
|
357
514
|
|
|
358
515
|
const deps = graph.get(current) || [];
|
|
359
|
-
for (const dep of deps)
|
|
360
|
-
stack.push(dep);
|
|
361
|
-
}
|
|
516
|
+
for (const dep of deps) stack.push(dep);
|
|
362
517
|
}
|
|
363
518
|
return false;
|
|
364
519
|
}
|
|
@@ -432,36 +587,27 @@ function main() {
|
|
|
432
587
|
}
|
|
433
588
|
|
|
434
589
|
for (const entryPoint of entryPoints) {
|
|
435
|
-
if (!visited.has(entryPoint))
|
|
436
|
-
findCycles(entryPoint);
|
|
437
|
-
}
|
|
590
|
+
if (!visited.has(entryPoint)) findCycles(entryPoint);
|
|
438
591
|
}
|
|
439
592
|
|
|
440
593
|
const criticalCycles: string[][] = [];
|
|
441
594
|
|
|
442
595
|
for (const cycle of allUniqueCycles) {
|
|
443
596
|
let isHarmfulCycle = false;
|
|
444
|
-
|
|
445
597
|
for (let i = 0; i < cycle.length - 1; i++) {
|
|
446
598
|
if (hasTopLevelUsage(cycle[i], cycle[i + 1])) {
|
|
447
599
|
isHarmfulCycle = true;
|
|
448
600
|
break;
|
|
449
601
|
}
|
|
450
602
|
}
|
|
451
|
-
|
|
452
|
-
if (isHarmfulCycle) {
|
|
453
|
-
criticalCycles.push(cycle);
|
|
454
|
-
}
|
|
603
|
+
if (isHarmfulCycle) criticalCycles.push(cycle);
|
|
455
604
|
}
|
|
456
605
|
|
|
457
606
|
const entryPointCycles = new Map<string, string[][]>();
|
|
458
|
-
for (const ep of entryPoints)
|
|
459
|
-
entryPointCycles.set(ep, []);
|
|
460
|
-
}
|
|
607
|
+
for (const ep of entryPoints) entryPointCycles.set(ep, []);
|
|
461
608
|
|
|
462
609
|
for (const cycle of criticalCycles) {
|
|
463
610
|
const firstFile = cycle[0];
|
|
464
|
-
|
|
465
611
|
const matchedEp = entryPoints.find((ep) => {
|
|
466
612
|
const epDir = path.dirname(ep);
|
|
467
613
|
return firstFile.startsWith(epDir + path.sep) || firstFile === ep;
|
|
@@ -471,15 +617,11 @@ function main() {
|
|
|
471
617
|
entryPointCycles.get(matchedEp)!.push(cycle);
|
|
472
618
|
} else {
|
|
473
619
|
const reachingEp = entryPoints.find((ep) => canReach(ep, firstFile));
|
|
474
|
-
if (reachingEp)
|
|
475
|
-
|
|
476
|
-
} else {
|
|
477
|
-
entryPointCycles.get(entryPoints[0])!.push(cycle);
|
|
478
|
-
}
|
|
620
|
+
if (reachingEp) entryPointCycles.get(reachingEp)!.push(cycle);
|
|
621
|
+
else entryPointCycles.get(entryPoints[0])!.push(cycle);
|
|
479
622
|
}
|
|
480
623
|
}
|
|
481
624
|
|
|
482
|
-
// Phase 4: Output the clean, perfectly targeted report
|
|
483
625
|
let globalHasCycles = false;
|
|
484
626
|
|
|
485
627
|
for (const entryPoint of entryPoints) {
|
|
@@ -489,14 +631,12 @@ function main() {
|
|
|
489
631
|
if (cycles.length > 0) {
|
|
490
632
|
globalHasCycles = true;
|
|
491
633
|
console.error(`❌ ${absoluteEntry} — Found ${cycles.length} critical circular dependencies:`);
|
|
492
|
-
|
|
634
|
+
|
|
493
635
|
cycles.forEach((cycle, index) => {
|
|
494
636
|
console.error(` ${index + 1})`, '-'.repeat(80));
|
|
495
|
-
|
|
496
637
|
for (let i = 1; i < cycle.length; i++) {
|
|
497
|
-
const nextFile =
|
|
638
|
+
const nextFile = i === cycle.length - 1 ? cycle[1] : cycle[i + 1];
|
|
498
639
|
const isTopLevel = hasTopLevelUsage(cycle[i], nextFile);
|
|
499
|
-
|
|
500
640
|
const prefix = isTopLevel ? ' 💥 [Top-level] ' : ' ⏳ [Lazy] ';
|
|
501
641
|
console.error(`${prefix}${path.resolve(cycle[i])}`);
|
|
502
642
|
}
|