@ts-stack/cycle-detector 1.1.1 → 1.1.3
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 +0 -5
- package/dist/index.js +132 -174
- package/dist/index.js.map +1 -1
- package/package.json +5 -4
- package/src/index.ts +130 -169
package/README.md
CHANGED
|
@@ -33,11 +33,6 @@ And then:
|
|
|
33
33
|
npm run lint:cycles
|
|
34
34
|
```
|
|
35
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
36
|
## Interpreting Diagnostics
|
|
42
37
|
|
|
43
38
|
When a breaking circular dependency is detected, the script identifies exactly **which file executes the token prematurely**, leaving non-blocking files clearly marked.
|
package/dist/index.js
CHANGED
|
@@ -2,31 +2,14 @@
|
|
|
2
2
|
import fs from 'node:fs';
|
|
3
3
|
import path from 'node:path';
|
|
4
4
|
import ts from 'typescript';
|
|
5
|
-
//
|
|
6
|
-
const graph = new Map();
|
|
7
|
-
const allUniqueCycles = [];
|
|
8
|
-
const globalDetectedCycles = new Set();
|
|
9
|
-
const packageMetaCache = new Map();
|
|
5
|
+
// Performance caches that are safe to share across calls (read-only filesystem data)
|
|
10
6
|
const compilerOptionsCache = new Map();
|
|
11
|
-
// Caches for AST and analysis results to prevent bottlenecks
|
|
12
7
|
const sourceFileCache = new Map();
|
|
13
8
|
const topLevelUsageCache = new Map();
|
|
14
9
|
const exportedHoistedFunctionsCache = new Map();
|
|
15
|
-
|
|
10
|
+
const resolvedSourceCache = new Map(); // Performance cache for path mapping
|
|
16
11
|
function parseArgs() {
|
|
17
|
-
|
|
18
|
-
let projectPath;
|
|
19
|
-
const entryPatterns = [];
|
|
20
|
-
for (let i = 0; i < args.length; i++) {
|
|
21
|
-
if (args[i] === '--project' || args[i] === '-p') {
|
|
22
|
-
projectPath = args[i + 1];
|
|
23
|
-
i++;
|
|
24
|
-
}
|
|
25
|
-
else {
|
|
26
|
-
entryPatterns.push(args[i]);
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
return { entryPatterns, projectPath };
|
|
12
|
+
return { entryPatterns: process.argv.slice(2) };
|
|
30
13
|
}
|
|
31
14
|
function isRuntimeImport(node) {
|
|
32
15
|
if (ts.isExportDeclaration(node)) {
|
|
@@ -39,8 +22,6 @@ function isRuntimeImport(node) {
|
|
|
39
22
|
return false;
|
|
40
23
|
if (!node.importClause)
|
|
41
24
|
return true; // Side-effect import
|
|
42
|
-
if (node.importClause.phaseModifier)
|
|
43
|
-
return false;
|
|
44
25
|
if (node.importClause.name)
|
|
45
26
|
return true; // Default import present
|
|
46
27
|
const namedBindings = node.importClause.namedBindings;
|
|
@@ -60,7 +41,7 @@ function getCompilerOptionsForFile(filePath) {
|
|
|
60
41
|
const cachedOptions = compilerOptionsCache.get(currentDir);
|
|
61
42
|
if (cachedOptions !== undefined)
|
|
62
43
|
return cachedOptions;
|
|
63
|
-
const configPath = ts.findConfigFile(currentDir, ts.sys.fileExists, 'tsconfig.json')
|
|
44
|
+
const configPath = ts.findConfigFile(currentDir, ts.sys.fileExists, 'tsconfig.json');
|
|
64
45
|
if (configPath) {
|
|
65
46
|
const resolvedConfigPath = path.resolve(configPath);
|
|
66
47
|
const configDir = path.dirname(resolvedConfigPath);
|
|
@@ -81,121 +62,103 @@ function getCompilerOptionsForFile(filePath) {
|
|
|
81
62
|
// Fallback
|
|
82
63
|
}
|
|
83
64
|
}
|
|
84
|
-
|
|
65
|
+
const emptyOptions = {};
|
|
66
|
+
compilerOptionsCache.set(currentDir, emptyOptions);
|
|
67
|
+
return emptyOptions;
|
|
85
68
|
}
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
69
|
+
/**
|
|
70
|
+
* Universal resolution engine: safely maps compiled assets (.js, .d.ts) back to source files (.ts)
|
|
71
|
+
* Works flawlessly for standalone packages, polyrepos, and complex monorepos alike.
|
|
72
|
+
*/
|
|
73
|
+
function convertToSourcePath(resolvedPath) {
|
|
74
|
+
const isBuildDir = new RegExp(String.raw `[\\/](dist|build|lib|out|cjs|esm|bin)[\\/]`, 'i');
|
|
75
|
+
// If it's already a source file and not trapped inside a known build directory, return it directly
|
|
76
|
+
if (/\.(ts|tsx|mts|cts)$/.test(resolvedPath) && !isBuildDir.test(resolvedPath)) {
|
|
77
|
+
return resolvedPath;
|
|
78
|
+
}
|
|
79
|
+
const extensions = ['.ts', '.tsx', '.mts', '.cts'];
|
|
80
|
+
// Strip execution/declaration extensions to get the base file signature
|
|
81
|
+
let baseName = resolvedPath;
|
|
82
|
+
if (baseName.endsWith('.d.ts'))
|
|
83
|
+
baseName = baseName.slice(0, -5);
|
|
84
|
+
else if (baseName.endsWith('.d.mts'))
|
|
85
|
+
baseName = baseName.slice(0, -6);
|
|
86
|
+
else if (baseName.endsWith('.d.cts'))
|
|
87
|
+
baseName = baseName.slice(0, -6);
|
|
88
|
+
else if (baseName.endsWith('.js'))
|
|
89
|
+
baseName = baseName.slice(0, -3);
|
|
90
|
+
else if (baseName.endsWith('.mjs'))
|
|
91
|
+
baseName = baseName.slice(0, -4);
|
|
92
|
+
else if (baseName.endsWith('.cjs'))
|
|
93
|
+
baseName = baseName.slice(0, -4);
|
|
94
|
+
else if (baseName.endsWith('.jsx'))
|
|
95
|
+
baseName = baseName.slice(0, -4);
|
|
96
|
+
// Strategy 1: Direct Extension Swap (In-place builds or matching structures)
|
|
97
|
+
for (const ext of extensions) {
|
|
98
|
+
if (fs.existsSync(baseName + ext))
|
|
99
|
+
return baseName + ext;
|
|
100
|
+
}
|
|
101
|
+
// Strategy 2: Adaptive Path Segment Replacement (Remaps build directories to source directories)
|
|
102
|
+
const buildDirs = ['dist', 'build', 'lib', 'out', 'cjs', 'esm', 'bin'];
|
|
103
|
+
const srcDirs = ['src', 'source', '.']; // '.' fallback for flat root architectures
|
|
104
|
+
for (const bDir of buildDirs) {
|
|
105
|
+
const regex = new RegExp(String.raw `([\\/])${bDir}([\\/])`, 'i');
|
|
106
|
+
if (regex.test(baseName)) {
|
|
107
|
+
for (const sDir of srcDirs) {
|
|
108
|
+
// Skip illegal mappings that loop 'lib' back onto 'lib'
|
|
109
|
+
if (bDir.toLowerCase() === sDir.toLowerCase())
|
|
110
|
+
continue;
|
|
111
|
+
const replacedBase = baseName.replace(regex, `$1${sDir}$2`);
|
|
112
|
+
for (const ext of extensions) {
|
|
113
|
+
if (fs.existsSync(replacedBase + ext))
|
|
114
|
+
return replacedBase + ext;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
95
117
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
const
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
const
|
|
110
|
-
|
|
111
|
-
if (
|
|
112
|
-
|
|
113
|
-
}
|
|
114
|
-
else if (typeof dotExport === 'object') {
|
|
115
|
-
exportsMain = dotExport.import || dotExport.require || dotExport.default || '';
|
|
116
|
-
}
|
|
118
|
+
}
|
|
119
|
+
// Strategy 3: Boundary-driven subpath mapping via closest package.json
|
|
120
|
+
let currentDir = path.dirname(resolvedPath);
|
|
121
|
+
while (currentDir && currentDir !== path.parse(currentDir).root) {
|
|
122
|
+
if (fs.existsSync(path.join(currentDir, 'package.json'))) {
|
|
123
|
+
for (const sDir of ['src', 'source']) {
|
|
124
|
+
const srcDirPath = path.join(currentDir, sDir);
|
|
125
|
+
if (fs.existsSync(srcDirPath)) {
|
|
126
|
+
const relativeToPackage = path.relative(currentDir, baseName);
|
|
127
|
+
const pathParts = relativeToPackage.split(path.sep);
|
|
128
|
+
if (pathParts.length > 1) {
|
|
129
|
+
// Drop the first segment (which is the output folder like 'dist' or 'lib')
|
|
130
|
+
const subPath = pathParts.slice(1).join(path.sep);
|
|
131
|
+
for (const ext of extensions) {
|
|
132
|
+
const targetFile = path.join(srcDirPath, subPath + ext);
|
|
133
|
+
if (fs.existsSync(targetFile))
|
|
134
|
+
return targetFile;
|
|
117
135
|
}
|
|
118
136
|
}
|
|
119
137
|
}
|
|
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
|
-
}
|
|
136
|
-
let srcDirName = 'src';
|
|
137
|
-
if (fs.existsSync(path.join(currentDir, 'source')))
|
|
138
|
-
srcDirName = 'source';
|
|
139
|
-
else if (fs.existsSync(path.join(currentDir, 'lib')))
|
|
140
|
-
srcDirName = 'lib';
|
|
141
|
-
const meta = { pkgDir: currentDir, srcDirName, outDirName };
|
|
142
|
-
packageMetaCache.set(currentDir, meta);
|
|
143
|
-
for (const d of visitedDirs)
|
|
144
|
-
packageMetaCache.set(d, meta);
|
|
145
|
-
return meta;
|
|
146
|
-
}
|
|
147
|
-
catch {
|
|
148
|
-
packageMetaCache.set(currentDir, null);
|
|
149
|
-
for (const d of visitedDirs)
|
|
150
|
-
packageMetaCache.set(d, null);
|
|
151
|
-
return null;
|
|
152
138
|
}
|
|
139
|
+
break;
|
|
153
140
|
}
|
|
154
|
-
visitedDirs.push(currentDir);
|
|
155
141
|
currentDir = path.dirname(currentDir);
|
|
156
142
|
}
|
|
157
|
-
return
|
|
143
|
+
return resolvedPath;
|
|
158
144
|
}
|
|
159
145
|
function resolveModule(moduleName, containingFile, options) {
|
|
160
146
|
const result = ts.resolveModuleName(moduleName, containingFile, options, ts.sys);
|
|
161
147
|
if (!result.resolvedModule)
|
|
162
148
|
return null;
|
|
163
149
|
const resolvedFileName = path.resolve(result.resolvedModule.resolvedFileName);
|
|
164
|
-
|
|
150
|
+
// Run universal mapping first: dist/*.d.ts -> src/*.ts
|
|
151
|
+
let sourcePath = resolvedSourceCache.get(resolvedFileName);
|
|
152
|
+
if (sourcePath === undefined) {
|
|
153
|
+
sourcePath = convertToSourcePath(resolvedFileName);
|
|
154
|
+
resolvedSourceCache.set(resolvedFileName, sourcePath);
|
|
155
|
+
}
|
|
156
|
+
// Safety filter: Ignore true external node_modules.
|
|
157
|
+
// Symlinked monorepo packages will successfully map to their local paths above and bypass this check.
|
|
158
|
+
if (sourcePath.includes(`${path.sep}node_modules${path.sep}`)) {
|
|
165
159
|
return null;
|
|
166
|
-
const meta = getPackageMeta(resolvedFileName);
|
|
167
|
-
if (meta) {
|
|
168
|
-
const { pkgDir, srcDirName, outDirName } = meta;
|
|
169
|
-
const srcDirPath = path.join(pkgDir, srcDirName);
|
|
170
|
-
if (resolvedFileName.startsWith(srcDirPath + path.sep))
|
|
171
|
-
return resolvedFileName;
|
|
172
|
-
const outDirPath = path.join(pkgDir, outDirName);
|
|
173
|
-
if (resolvedFileName.startsWith(outDirPath + path.sep) || resolvedFileName === outDirPath) {
|
|
174
|
-
const relativeToOut = path.relative(outDirPath, resolvedFileName);
|
|
175
|
-
let baseName = relativeToOut;
|
|
176
|
-
if (baseName.endsWith('.d.ts'))
|
|
177
|
-
baseName = baseName.slice(0, -5);
|
|
178
|
-
else if (baseName.endsWith('.d.mts'))
|
|
179
|
-
baseName = baseName.slice(0, -6);
|
|
180
|
-
else if (baseName.endsWith('.d.cts'))
|
|
181
|
-
baseName = baseName.slice(0, -6);
|
|
182
|
-
else if (baseName.endsWith('.js'))
|
|
183
|
-
baseName = baseName.slice(0, -3);
|
|
184
|
-
else if (baseName.endsWith('.mjs'))
|
|
185
|
-
baseName = baseName.slice(0, -4);
|
|
186
|
-
else if (baseName.endsWith('.cjs'))
|
|
187
|
-
baseName = baseName.slice(0, -4);
|
|
188
|
-
else if (baseName.endsWith('.jsx'))
|
|
189
|
-
baseName = baseName.slice(0, -4);
|
|
190
|
-
const extensions = ['.ts', '.tsx', '.mts', '.cts'];
|
|
191
|
-
for (const ext of extensions) {
|
|
192
|
-
const targetSrcFile = path.join(srcDirPath, baseName + ext);
|
|
193
|
-
if (fs.existsSync(targetSrcFile))
|
|
194
|
-
return targetSrcFile;
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
160
|
}
|
|
198
|
-
return
|
|
161
|
+
return sourcePath;
|
|
199
162
|
}
|
|
200
163
|
function getCanonicalCycleKey(cycle) {
|
|
201
164
|
const nodes = cycle.slice(0, -1);
|
|
@@ -210,39 +173,44 @@ function getCanonicalCycleKey(cycle) {
|
|
|
210
173
|
rotated.push(rotated[0]);
|
|
211
174
|
return rotated.join('|');
|
|
212
175
|
}
|
|
213
|
-
function parseFile(
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
sourceFileCache.
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
176
|
+
function parseFile(startPath, graph) {
|
|
177
|
+
// Iterative DFS to avoid stack overflow on deeply nested dependency trees
|
|
178
|
+
const queue = [startPath];
|
|
179
|
+
while (queue.length > 0) {
|
|
180
|
+
const filePath = queue.pop();
|
|
181
|
+
if (graph.has(filePath) || !fs.existsSync(filePath))
|
|
182
|
+
continue;
|
|
183
|
+
graph.set(filePath, []);
|
|
184
|
+
const options = getCompilerOptionsForFile(filePath);
|
|
185
|
+
let sourceFile = sourceFileCache.get(filePath);
|
|
186
|
+
if (!sourceFile) {
|
|
187
|
+
const content = fs.readFileSync(filePath, 'utf8');
|
|
188
|
+
sourceFile = ts.createSourceFile(filePath, content, ts.ScriptTarget.Latest, true);
|
|
189
|
+
sourceFileCache.set(filePath, sourceFile);
|
|
190
|
+
}
|
|
191
|
+
const imports = [];
|
|
192
|
+
function walk(node) {
|
|
193
|
+
if (ts.isImportDeclaration(node) || ts.isExportDeclaration(node)) {
|
|
194
|
+
if (isRuntimeImport(node)) {
|
|
195
|
+
const specifier = node.moduleSpecifier;
|
|
196
|
+
if (specifier && ts.isStringLiteral(specifier)) {
|
|
197
|
+
const resolved = resolveModule(specifier.text, filePath, options);
|
|
198
|
+
if (resolved && !imports.includes(resolved))
|
|
199
|
+
imports.push(resolved);
|
|
200
|
+
}
|
|
233
201
|
}
|
|
234
202
|
}
|
|
203
|
+
ts.forEachChild(node, walk);
|
|
204
|
+
}
|
|
205
|
+
walk(sourceFile);
|
|
206
|
+
graph.set(filePath, imports);
|
|
207
|
+
// Push unvisited dependencies onto the queue
|
|
208
|
+
for (const dep of imports) {
|
|
209
|
+
if (!graph.has(dep))
|
|
210
|
+
queue.push(dep);
|
|
235
211
|
}
|
|
236
|
-
ts.forEachChild(node, walk);
|
|
237
212
|
}
|
|
238
|
-
walk(sourceFile);
|
|
239
|
-
graph.set(filePath, imports);
|
|
240
|
-
for (const dep of imports)
|
|
241
|
-
parseFile(dep);
|
|
242
213
|
}
|
|
243
|
-
/**
|
|
244
|
-
* Analyzes a file and extracts the names of all exported functions that are hoisted.
|
|
245
|
-
*/
|
|
246
214
|
function getExportedHoistedFunctions(filePath) {
|
|
247
215
|
if (exportedHoistedFunctionsCache.has(filePath)) {
|
|
248
216
|
return exportedHoistedFunctionsCache.get(filePath);
|
|
@@ -265,7 +233,6 @@ function getExportedHoistedFunctions(filePath) {
|
|
|
265
233
|
}
|
|
266
234
|
}
|
|
267
235
|
const localHoistedFuncs = new Set();
|
|
268
|
-
// Pass 1: Find all top-level function declarations and direct export modifiers
|
|
269
236
|
for (const statement of sourceFile.statements) {
|
|
270
237
|
if (ts.isFunctionDeclaration(statement)) {
|
|
271
238
|
if (statement.name) {
|
|
@@ -281,7 +248,6 @@ function getExportedHoistedFunctions(filePath) {
|
|
|
281
248
|
}
|
|
282
249
|
}
|
|
283
250
|
}
|
|
284
|
-
// Pass 2: Look for independent export declarations or export assignments mapping to local functions
|
|
285
251
|
for (const statement of sourceFile.statements) {
|
|
286
252
|
if (ts.isExportDeclaration(statement)) {
|
|
287
253
|
if (!statement.moduleSpecifier && statement.exportClause && ts.isNamedExports(statement.exportClause)) {
|
|
@@ -305,9 +271,6 @@ function getExportedHoistedFunctions(filePath) {
|
|
|
305
271
|
exportedHoistedFunctionsCache.set(filePath, hoisted);
|
|
306
272
|
return hoisted;
|
|
307
273
|
}
|
|
308
|
-
/**
|
|
309
|
-
* Checks if a specific file import creates an immediate execution (top-level) risk.
|
|
310
|
-
*/
|
|
311
274
|
function hasTopLevelUsage(fromFile, toFile) {
|
|
312
275
|
if (!fs.existsSync(fromFile))
|
|
313
276
|
return false;
|
|
@@ -327,9 +290,7 @@ function hasTopLevelUsage(fromFile, toFile) {
|
|
|
327
290
|
return false;
|
|
328
291
|
}
|
|
329
292
|
}
|
|
330
|
-
// Get all safe hoisted exports from the target file
|
|
331
293
|
const hoistedExports = getExportedHoistedFunctions(toFile);
|
|
332
|
-
// Maps local import identifier to its original exported symbol name
|
|
333
294
|
const localToExportedName = new Map();
|
|
334
295
|
let namespaceImportName = null;
|
|
335
296
|
let hasSideEffectOrReExport = false;
|
|
@@ -351,6 +312,8 @@ function hasTopLevelUsage(fromFile, toFile) {
|
|
|
351
312
|
}
|
|
352
313
|
else if (ts.isNamedImports(clause.namedBindings)) {
|
|
353
314
|
for (const el of clause.namedBindings.elements) {
|
|
315
|
+
if (el.isTypeOnly)
|
|
316
|
+
continue;
|
|
354
317
|
const exportedName = el.propertyName ? el.propertyName.text : el.name.text;
|
|
355
318
|
localToExportedName.set(el.name.text, exportedName);
|
|
356
319
|
}
|
|
@@ -358,6 +321,7 @@ function hasTopLevelUsage(fromFile, toFile) {
|
|
|
358
321
|
}
|
|
359
322
|
}
|
|
360
323
|
else {
|
|
324
|
+
// Side-effect import OR export ... from '...' (re-export) — always top-level
|
|
361
325
|
hasSideEffectOrReExport = true;
|
|
362
326
|
}
|
|
363
327
|
}
|
|
@@ -399,20 +363,16 @@ function hasTopLevelUsage(fromFile, toFile) {
|
|
|
399
363
|
const isNamespaceReference = namespaceImportName && node.text === namespaceImportName;
|
|
400
364
|
if (isImportedSymbol || isNamespaceReference) {
|
|
401
365
|
const parent = node.parent;
|
|
402
|
-
// Protection 1: Skip metadata/declarations references
|
|
403
366
|
const isImportOrExportDeclarationRef = ts.isImportSpecifier(parent) ||
|
|
404
367
|
ts.isImportClause(parent) ||
|
|
405
368
|
ts.isNamespaceImport(parent) ||
|
|
406
369
|
ts.isExportSpecifier(parent);
|
|
407
370
|
if (isImportOrExportDeclarationRef)
|
|
408
371
|
return;
|
|
409
|
-
// Protection 2: Avoid object property name access False Positives (obj.foo)
|
|
410
372
|
if (ts.isPropertyAccessExpression(parent) && parent.name === node)
|
|
411
373
|
return;
|
|
412
|
-
// Protection 3: Avoid object assignment keys False Positives ({ foo: 123 })
|
|
413
374
|
if (ts.isPropertyAssignment(parent) && parent.name === node)
|
|
414
375
|
return;
|
|
415
|
-
// Protection 4: Avoid shadow declarations with matching names
|
|
416
376
|
if ((ts.isMethodDeclaration(parent) ||
|
|
417
377
|
ts.isPropertyDeclaration(parent) ||
|
|
418
378
|
ts.isClassDeclaration(parent) ||
|
|
@@ -421,23 +381,18 @@ function hasTopLevelUsage(fromFile, toFile) {
|
|
|
421
381
|
parent.name === node) {
|
|
422
382
|
return;
|
|
423
383
|
}
|
|
424
|
-
// (Hoisting check 1): Direct or renamed named/default import usage
|
|
425
384
|
if (isImportedSymbol) {
|
|
426
385
|
const exportedName = localToExportedName.get(node.text);
|
|
427
|
-
if (hoistedExports.has(exportedName))
|
|
428
|
-
return;
|
|
429
|
-
}
|
|
386
|
+
if (hoistedExports.has(exportedName))
|
|
387
|
+
return;
|
|
430
388
|
}
|
|
431
|
-
// (Hoisting check 2): Namespace import property access usage (ns.foo())
|
|
432
389
|
if (isNamespaceReference) {
|
|
433
390
|
if (ts.isPropertyAccessExpression(parent) && parent.expression === node) {
|
|
434
391
|
const propName = parent.name.text;
|
|
435
|
-
if (hoistedExports.has(propName))
|
|
436
|
-
return;
|
|
437
|
-
}
|
|
392
|
+
if (hoistedExports.has(propName))
|
|
393
|
+
return;
|
|
438
394
|
}
|
|
439
395
|
}
|
|
440
|
-
// Protection 5: Type contexts checks
|
|
441
396
|
let isInTypeContext = false;
|
|
442
397
|
let checkParent = parent;
|
|
443
398
|
while (checkParent && checkParent !== sourceFile) {
|
|
@@ -462,7 +417,7 @@ function hasTopLevelUsage(fromFile, toFile) {
|
|
|
462
417
|
topLevelUsageCache.set(cacheKey, dangerousTopLevelUsage);
|
|
463
418
|
return dangerousTopLevelUsage;
|
|
464
419
|
}
|
|
465
|
-
function canReach(start, target) {
|
|
420
|
+
function canReach(start, target, graph) {
|
|
466
421
|
const seen = new Set();
|
|
467
422
|
const stack = [start];
|
|
468
423
|
while (stack.length > 0) {
|
|
@@ -479,12 +434,15 @@ function canReach(start, target) {
|
|
|
479
434
|
return false;
|
|
480
435
|
}
|
|
481
436
|
function main() {
|
|
482
|
-
const { entryPatterns
|
|
483
|
-
globalProjectPath = projectPath;
|
|
437
|
+
const { entryPatterns } = parseArgs();
|
|
484
438
|
if (entryPatterns.length === 0) {
|
|
485
439
|
console.error('❌ Error: Please specify at least one entry point or glob pattern.');
|
|
486
440
|
process.exit(1);
|
|
487
441
|
}
|
|
442
|
+
// All mutable state is local to each run — no cross-run contamination
|
|
443
|
+
const graph = new Map();
|
|
444
|
+
const allUniqueCycles = [];
|
|
445
|
+
const globalDetectedCycles = new Set();
|
|
488
446
|
const entryPoints = [];
|
|
489
447
|
for (const pattern of entryPatterns) {
|
|
490
448
|
const matches = fs.globSync ? fs.globSync(pattern) : [pattern];
|
|
@@ -506,7 +464,7 @@ function main() {
|
|
|
506
464
|
}
|
|
507
465
|
console.log(`🔍 Found ${entryPoints.length} entry point(s) for analysis. Building graph...\n`);
|
|
508
466
|
for (const entryPoint of entryPoints) {
|
|
509
|
-
parseFile(entryPoint);
|
|
467
|
+
parseFile(entryPoint, graph);
|
|
510
468
|
}
|
|
511
469
|
const visited = new Map();
|
|
512
470
|
const currentStack = [];
|
|
@@ -561,7 +519,7 @@ function main() {
|
|
|
561
519
|
entryPointCycles.get(matchedEp).push(cycle);
|
|
562
520
|
}
|
|
563
521
|
else {
|
|
564
|
-
const reachingEp = entryPoints.find((ep) => canReach(ep, firstFile));
|
|
522
|
+
const reachingEp = entryPoints.find((ep) => canReach(ep, firstFile, graph));
|
|
565
523
|
if (reachingEp)
|
|
566
524
|
entryPointCycles.get(reachingEp).push(cycle);
|
|
567
525
|
else
|
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
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ts-stack/cycle-detector",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "1.1.
|
|
4
|
+
"version": "1.1.3",
|
|
5
5
|
"bin": {
|
|
6
6
|
"cycle-detector": "./dist/index.js"
|
|
7
7
|
},
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
},
|
|
22
22
|
"scripts": {
|
|
23
23
|
"start": "npm run build && node dist/index.js",
|
|
24
|
-
"test": "npm run build-test && npm run esm-jest",
|
|
24
|
+
"test": "npm run build-test && npm run esm-jest --",
|
|
25
25
|
"esm-jest": "node --experimental-vm-modules --no-warnings=ExperimentalWarning node_modules/jest/bin/jest.js",
|
|
26
26
|
"build": "tsc -b tsconfig.build.json",
|
|
27
27
|
"build-test": "tsc -b tsconfig.unit.json",
|
|
@@ -40,14 +40,15 @@
|
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
42
|
"@eslint/js": "^10.0.1",
|
|
43
|
-
"@types/jest": "^
|
|
43
|
+
"@types/jest": "^30.0.0",
|
|
44
44
|
"@types/node": "^26.0.0",
|
|
45
45
|
"eslint": "^10.5.0",
|
|
46
|
-
"jest": "^
|
|
46
|
+
"jest": "^30.4.2",
|
|
47
47
|
"nodemon": "^3.1.14",
|
|
48
48
|
"prettier": "^3.8.4",
|
|
49
49
|
"rimraf": "^5.0.10",
|
|
50
50
|
"ts-node": "^10.9.2",
|
|
51
|
+
"type-fest": "^5.7.0",
|
|
51
52
|
"typescript": "^5.9.3",
|
|
52
53
|
"typescript-eslint": "^8.62.0"
|
|
53
54
|
},
|
package/src/index.ts
CHANGED
|
@@ -6,36 +6,15 @@ import ts from 'typescript';
|
|
|
6
6
|
|
|
7
7
|
type NodeState = 'VISITING' | 'VISITED';
|
|
8
8
|
|
|
9
|
-
//
|
|
10
|
-
const graph = new Map<string, string[]>();
|
|
11
|
-
const allUniqueCycles: string[][] = [];
|
|
12
|
-
const globalDetectedCycles = new Set<string>();
|
|
13
|
-
|
|
14
|
-
const packageMetaCache = new Map<string, { pkgDir: string; srcDirName: string; outDirName: string } | null>();
|
|
9
|
+
// Performance caches that are safe to share across calls (read-only filesystem data)
|
|
15
10
|
const compilerOptionsCache = new Map<string, ts.CompilerOptions>();
|
|
16
|
-
|
|
17
|
-
// Caches for AST and analysis results to prevent bottlenecks
|
|
18
11
|
const sourceFileCache = new Map<string, ts.SourceFile>();
|
|
19
12
|
const topLevelUsageCache = new Map<string, boolean>();
|
|
20
13
|
const exportedHoistedFunctionsCache = new Map<string, Set<string>>();
|
|
21
|
-
|
|
22
|
-
let globalProjectPath: string | undefined;
|
|
14
|
+
const resolvedSourceCache = new Map<string, string>(); // Performance cache for path mapping
|
|
23
15
|
|
|
24
16
|
function parseArgs() {
|
|
25
|
-
|
|
26
|
-
let projectPath: string | undefined;
|
|
27
|
-
const entryPatterns: string[] = [];
|
|
28
|
-
|
|
29
|
-
for (let i = 0; i < args.length; i++) {
|
|
30
|
-
if (args[i] === '--project' || args[i] === '-p') {
|
|
31
|
-
projectPath = args[i + 1];
|
|
32
|
-
i++;
|
|
33
|
-
} else {
|
|
34
|
-
entryPatterns.push(args[i]);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
return { entryPatterns, projectPath };
|
|
17
|
+
return { entryPatterns: process.argv.slice(2) };
|
|
39
18
|
}
|
|
40
19
|
|
|
41
20
|
function isRuntimeImport(node: ts.ImportDeclaration | ts.ExportDeclaration): boolean {
|
|
@@ -47,7 +26,6 @@ function isRuntimeImport(node: ts.ImportDeclaration | ts.ExportDeclaration): boo
|
|
|
47
26
|
if (ts.isImportDeclaration(node)) {
|
|
48
27
|
if (node.importClause?.phaseModifier) return false;
|
|
49
28
|
if (!node.importClause) return true; // Side-effect import
|
|
50
|
-
if (node.importClause.phaseModifier) return false;
|
|
51
29
|
|
|
52
30
|
if (node.importClause.name) return true; // Default import present
|
|
53
31
|
|
|
@@ -69,7 +47,7 @@ function getCompilerOptionsForFile(filePath: string): ts.CompilerOptions {
|
|
|
69
47
|
const cachedOptions = compilerOptionsCache.get(currentDir);
|
|
70
48
|
if (cachedOptions !== undefined) return cachedOptions;
|
|
71
49
|
|
|
72
|
-
const configPath = ts.findConfigFile(currentDir, ts.sys.fileExists, 'tsconfig.json')
|
|
50
|
+
const configPath = ts.findConfigFile(currentDir, ts.sys.fileExists, 'tsconfig.json');
|
|
73
51
|
|
|
74
52
|
if (configPath) {
|
|
75
53
|
const resolvedConfigPath = path.resolve(configPath);
|
|
@@ -92,78 +70,85 @@ function getCompilerOptionsForFile(filePath: string): ts.CompilerOptions {
|
|
|
92
70
|
}
|
|
93
71
|
}
|
|
94
72
|
|
|
95
|
-
|
|
73
|
+
const emptyOptions = {};
|
|
74
|
+
compilerOptionsCache.set(currentDir, emptyOptions);
|
|
75
|
+
return emptyOptions;
|
|
96
76
|
}
|
|
97
77
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
78
|
+
/**
|
|
79
|
+
* Universal resolution engine: safely maps compiled assets (.js, .d.ts) back to source files (.ts)
|
|
80
|
+
* Works flawlessly for standalone packages, polyrepos, and complex monorepos alike.
|
|
81
|
+
*/
|
|
82
|
+
function convertToSourcePath(resolvedPath: string): string {
|
|
83
|
+
const isBuildDir = new RegExp(String.raw`[\\/](dist|build|lib|out|cjs|esm|bin)[\\/]`, 'i');
|
|
101
84
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
return cached;
|
|
107
|
-
}
|
|
85
|
+
// If it's already a source file and not trapped inside a known build directory, return it directly
|
|
86
|
+
if (/\.(ts|tsx|mts|cts)$/.test(resolvedPath) && !isBuildDir.test(resolvedPath)) {
|
|
87
|
+
return resolvedPath;
|
|
88
|
+
}
|
|
108
89
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
90
|
+
const extensions = ['.ts', '.tsx', '.mts', '.cts'];
|
|
91
|
+
|
|
92
|
+
// Strip execution/declaration extensions to get the base file signature
|
|
93
|
+
let baseName = resolvedPath;
|
|
94
|
+
if (baseName.endsWith('.d.ts')) baseName = baseName.slice(0, -5);
|
|
95
|
+
else if (baseName.endsWith('.d.mts')) baseName = baseName.slice(0, -6);
|
|
96
|
+
else if (baseName.endsWith('.d.cts')) baseName = baseName.slice(0, -6);
|
|
97
|
+
else if (baseName.endsWith('.js')) baseName = baseName.slice(0, -3);
|
|
98
|
+
else if (baseName.endsWith('.mjs')) baseName = baseName.slice(0, -4);
|
|
99
|
+
else if (baseName.endsWith('.cjs')) baseName = baseName.slice(0, -4);
|
|
100
|
+
else if (baseName.endsWith('.jsx')) baseName = baseName.slice(0, -4);
|
|
101
|
+
|
|
102
|
+
// Strategy 1: Direct Extension Swap (In-place builds or matching structures)
|
|
103
|
+
for (const ext of extensions) {
|
|
104
|
+
if (fs.existsSync(baseName + ext)) return baseName + ext;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Strategy 2: Adaptive Path Segment Replacement (Remaps build directories to source directories)
|
|
108
|
+
const buildDirs = ['dist', 'build', 'lib', 'out', 'cjs', 'esm', 'bin'];
|
|
109
|
+
const srcDirs = ['src', 'source', '.']; // '.' fallback for flat root architectures
|
|
110
|
+
|
|
111
|
+
for (const bDir of buildDirs) {
|
|
112
|
+
const regex = new RegExp(String.raw`([\\/])${bDir}([\\/])`, 'i');
|
|
113
|
+
if (regex.test(baseName)) {
|
|
114
|
+
for (const sDir of srcDirs) {
|
|
115
|
+
// Skip illegal mappings that loop 'lib' back onto 'lib'
|
|
116
|
+
if (bDir.toLowerCase() === sDir.toLowerCase()) continue;
|
|
117
|
+
|
|
118
|
+
const replacedBase = baseName.replace(regex, `$1${sDir}$2`);
|
|
119
|
+
for (const ext of extensions) {
|
|
120
|
+
if (fs.existsSync(replacedBase + ext)) return replacedBase + ext;
|
|
132
121
|
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
133
125
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
126
|
+
// Strategy 3: Boundary-driven subpath mapping via closest package.json
|
|
127
|
+
let currentDir = path.dirname(resolvedPath);
|
|
128
|
+
while (currentDir && currentDir !== path.parse(currentDir).root) {
|
|
129
|
+
if (fs.existsSync(path.join(currentDir, 'package.json'))) {
|
|
130
|
+
for (const sDir of ['src', 'source']) {
|
|
131
|
+
const srcDirPath = path.join(currentDir, sDir);
|
|
132
|
+
if (fs.existsSync(srcDirPath)) {
|
|
133
|
+
const relativeToPackage = path.relative(currentDir, baseName);
|
|
134
|
+
const pathParts = relativeToPackage.split(path.sep);
|
|
135
|
+
|
|
136
|
+
if (pathParts.length > 1) {
|
|
137
|
+
// Drop the first segment (which is the output folder like 'dist' or 'lib')
|
|
138
|
+
const subPath = pathParts.slice(1).join(path.sep);
|
|
139
|
+
for (const ext of extensions) {
|
|
140
|
+
const targetFile = path.join(srcDirPath, subPath + ext);
|
|
141
|
+
if (fs.existsSync(targetFile)) return targetFile;
|
|
142
|
+
}
|
|
140
143
|
}
|
|
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
144
|
}
|
|
146
|
-
|
|
147
|
-
let srcDirName = 'src';
|
|
148
|
-
if (fs.existsSync(path.join(currentDir, 'source'))) srcDirName = 'source';
|
|
149
|
-
else if (fs.existsSync(path.join(currentDir, 'lib'))) srcDirName = 'lib';
|
|
150
|
-
|
|
151
|
-
const meta = { pkgDir: currentDir, srcDirName, outDirName };
|
|
152
|
-
packageMetaCache.set(currentDir, meta);
|
|
153
|
-
for (const d of visitedDirs) packageMetaCache.set(d, meta);
|
|
154
|
-
return meta;
|
|
155
|
-
} catch {
|
|
156
|
-
packageMetaCache.set(currentDir, null);
|
|
157
|
-
for (const d of visitedDirs) packageMetaCache.set(d, null);
|
|
158
|
-
return null;
|
|
159
145
|
}
|
|
146
|
+
break;
|
|
160
147
|
}
|
|
161
|
-
|
|
162
|
-
visitedDirs.push(currentDir);
|
|
163
148
|
currentDir = path.dirname(currentDir);
|
|
164
149
|
}
|
|
165
150
|
|
|
166
|
-
return
|
|
151
|
+
return resolvedPath;
|
|
167
152
|
}
|
|
168
153
|
|
|
169
154
|
function resolveModule(moduleName: string, containingFile: string, options: ts.CompilerOptions): string | null {
|
|
@@ -171,37 +156,21 @@ function resolveModule(moduleName: string, containingFile: string, options: ts.C
|
|
|
171
156
|
if (!result.resolvedModule) return null;
|
|
172
157
|
|
|
173
158
|
const resolvedFileName = path.resolve(result.resolvedModule.resolvedFileName);
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
if (
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
let baseName = relativeToOut;
|
|
187
|
-
|
|
188
|
-
if (baseName.endsWith('.d.ts')) baseName = baseName.slice(0, -5);
|
|
189
|
-
else if (baseName.endsWith('.d.mts')) baseName = baseName.slice(0, -6);
|
|
190
|
-
else if (baseName.endsWith('.d.cts')) baseName = baseName.slice(0, -6);
|
|
191
|
-
else if (baseName.endsWith('.js')) baseName = baseName.slice(0, -3);
|
|
192
|
-
else if (baseName.endsWith('.mjs')) baseName = baseName.slice(0, -4);
|
|
193
|
-
else if (baseName.endsWith('.cjs')) baseName = baseName.slice(0, -4);
|
|
194
|
-
else if (baseName.endsWith('.jsx')) baseName = baseName.slice(0, -4);
|
|
195
|
-
|
|
196
|
-
const extensions = ['.ts', '.tsx', '.mts', '.cts'];
|
|
197
|
-
for (const ext of extensions) {
|
|
198
|
-
const targetSrcFile = path.join(srcDirPath, baseName + ext);
|
|
199
|
-
if (fs.existsSync(targetSrcFile)) return targetSrcFile;
|
|
200
|
-
}
|
|
201
|
-
}
|
|
159
|
+
|
|
160
|
+
// Run universal mapping first: dist/*.d.ts -> src/*.ts
|
|
161
|
+
let sourcePath = resolvedSourceCache.get(resolvedFileName);
|
|
162
|
+
if (sourcePath === undefined) {
|
|
163
|
+
sourcePath = convertToSourcePath(resolvedFileName);
|
|
164
|
+
resolvedSourceCache.set(resolvedFileName, sourcePath);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// Safety filter: Ignore true external node_modules.
|
|
168
|
+
// Symlinked monorepo packages will successfully map to their local paths above and bypass this check.
|
|
169
|
+
if (sourcePath.includes(`${path.sep}node_modules${path.sep}`)) {
|
|
170
|
+
return null;
|
|
202
171
|
}
|
|
203
172
|
|
|
204
|
-
return
|
|
173
|
+
return sourcePath;
|
|
205
174
|
}
|
|
206
175
|
|
|
207
176
|
function getCanonicalCycleKey(cycle: string[]): string {
|
|
@@ -218,43 +187,50 @@ function getCanonicalCycleKey(cycle: string[]): string {
|
|
|
218
187
|
return rotated.join('|');
|
|
219
188
|
}
|
|
220
189
|
|
|
221
|
-
function parseFile(
|
|
222
|
-
|
|
223
|
-
|
|
190
|
+
function parseFile(startPath: string, graph: Map<string, string[]>) {
|
|
191
|
+
// Iterative DFS to avoid stack overflow on deeply nested dependency trees
|
|
192
|
+
const queue = [startPath];
|
|
224
193
|
|
|
225
|
-
|
|
194
|
+
while (queue.length > 0) {
|
|
195
|
+
const filePath = queue.pop()!;
|
|
226
196
|
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
const content = fs.readFileSync(filePath, 'utf8');
|
|
230
|
-
sourceFile = ts.createSourceFile(filePath, content, ts.ScriptTarget.Latest, true);
|
|
231
|
-
sourceFileCache.set(filePath, sourceFile);
|
|
232
|
-
}
|
|
197
|
+
if (graph.has(filePath) || !fs.existsSync(filePath)) continue;
|
|
198
|
+
graph.set(filePath, []);
|
|
233
199
|
|
|
234
|
-
|
|
200
|
+
const options = getCompilerOptionsForFile(filePath);
|
|
235
201
|
|
|
236
|
-
|
|
237
|
-
if (
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
202
|
+
let sourceFile = sourceFileCache.get(filePath);
|
|
203
|
+
if (!sourceFile) {
|
|
204
|
+
const content = fs.readFileSync(filePath, 'utf8');
|
|
205
|
+
sourceFile = ts.createSourceFile(filePath, content, ts.ScriptTarget.Latest, true);
|
|
206
|
+
sourceFileCache.set(filePath, sourceFile);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
const imports: string[] = [];
|
|
210
|
+
|
|
211
|
+
function walk(node: ts.Node) {
|
|
212
|
+
if (ts.isImportDeclaration(node) || ts.isExportDeclaration(node)) {
|
|
213
|
+
if (isRuntimeImport(node)) {
|
|
214
|
+
const specifier = node.moduleSpecifier;
|
|
215
|
+
if (specifier && ts.isStringLiteral(specifier)) {
|
|
216
|
+
const resolved = resolveModule(specifier.text, filePath, options);
|
|
217
|
+
if (resolved && !imports.includes(resolved)) imports.push(resolved);
|
|
218
|
+
}
|
|
243
219
|
}
|
|
244
220
|
}
|
|
221
|
+
ts.forEachChild(node, walk);
|
|
245
222
|
}
|
|
246
|
-
ts.forEachChild(node, walk);
|
|
247
|
-
}
|
|
248
223
|
|
|
249
|
-
|
|
250
|
-
|
|
224
|
+
walk(sourceFile);
|
|
225
|
+
graph.set(filePath, imports);
|
|
251
226
|
|
|
252
|
-
|
|
227
|
+
// Push unvisited dependencies onto the queue
|
|
228
|
+
for (const dep of imports) {
|
|
229
|
+
if (!graph.has(dep)) queue.push(dep);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
253
232
|
}
|
|
254
233
|
|
|
255
|
-
/**
|
|
256
|
-
* Analyzes a file and extracts the names of all exported functions that are hoisted.
|
|
257
|
-
*/
|
|
258
234
|
function getExportedHoistedFunctions(filePath: string): Set<string> {
|
|
259
235
|
if (exportedHoistedFunctionsCache.has(filePath)) {
|
|
260
236
|
return exportedHoistedFunctionsCache.get(filePath)!;
|
|
@@ -280,7 +256,6 @@ function getExportedHoistedFunctions(filePath: string): Set<string> {
|
|
|
280
256
|
|
|
281
257
|
const localHoistedFuncs = new Set<string>();
|
|
282
258
|
|
|
283
|
-
// Pass 1: Find all top-level function declarations and direct export modifiers
|
|
284
259
|
for (const statement of sourceFile.statements) {
|
|
285
260
|
if (ts.isFunctionDeclaration(statement)) {
|
|
286
261
|
if (statement.name) {
|
|
@@ -296,7 +271,6 @@ function getExportedHoistedFunctions(filePath: string): Set<string> {
|
|
|
296
271
|
}
|
|
297
272
|
}
|
|
298
273
|
|
|
299
|
-
// Pass 2: Look for independent export declarations or export assignments mapping to local functions
|
|
300
274
|
for (const statement of sourceFile.statements) {
|
|
301
275
|
if (ts.isExportDeclaration(statement)) {
|
|
302
276
|
if (!statement.moduleSpecifier && statement.exportClause && ts.isNamedExports(statement.exportClause)) {
|
|
@@ -321,9 +295,6 @@ function getExportedHoistedFunctions(filePath: string): Set<string> {
|
|
|
321
295
|
return hoisted;
|
|
322
296
|
}
|
|
323
297
|
|
|
324
|
-
/**
|
|
325
|
-
* Checks if a specific file import creates an immediate execution (top-level) risk.
|
|
326
|
-
*/
|
|
327
298
|
function hasTopLevelUsage(fromFile: string, toFile: string): boolean {
|
|
328
299
|
if (!fs.existsSync(fromFile)) return false;
|
|
329
300
|
|
|
@@ -344,10 +315,7 @@ function hasTopLevelUsage(fromFile: string, toFile: string): boolean {
|
|
|
344
315
|
}
|
|
345
316
|
}
|
|
346
317
|
|
|
347
|
-
// Get all safe hoisted exports from the target file
|
|
348
318
|
const hoistedExports = getExportedHoistedFunctions(toFile);
|
|
349
|
-
|
|
350
|
-
// Maps local import identifier to its original exported symbol name
|
|
351
319
|
const localToExportedName = new Map<string, string>();
|
|
352
320
|
let namespaceImportName: string | null = null;
|
|
353
321
|
let hasSideEffectOrReExport = false;
|
|
@@ -369,12 +337,15 @@ function hasTopLevelUsage(fromFile: string, toFile: string): boolean {
|
|
|
369
337
|
namespaceImportName = clause.namedBindings.name.text;
|
|
370
338
|
} else if (ts.isNamedImports(clause.namedBindings)) {
|
|
371
339
|
for (const el of clause.namedBindings.elements) {
|
|
340
|
+
if (el.isTypeOnly) continue;
|
|
341
|
+
|
|
372
342
|
const exportedName = el.propertyName ? el.propertyName.text : el.name.text;
|
|
373
343
|
localToExportedName.set(el.name.text, exportedName);
|
|
374
344
|
}
|
|
375
345
|
}
|
|
376
346
|
}
|
|
377
347
|
} else {
|
|
348
|
+
// Side-effect import OR export ... from '...' (re-export) — always top-level
|
|
378
349
|
hasSideEffectOrReExport = true;
|
|
379
350
|
}
|
|
380
351
|
}
|
|
@@ -426,7 +397,6 @@ function hasTopLevelUsage(fromFile: string, toFile: string): boolean {
|
|
|
426
397
|
if (isImportedSymbol || isNamespaceReference) {
|
|
427
398
|
const parent = node.parent;
|
|
428
399
|
|
|
429
|
-
// Protection 1: Skip metadata/declarations references
|
|
430
400
|
const isImportOrExportDeclarationRef =
|
|
431
401
|
ts.isImportSpecifier(parent) ||
|
|
432
402
|
ts.isImportClause(parent) ||
|
|
@@ -434,14 +404,8 @@ function hasTopLevelUsage(fromFile: string, toFile: string): boolean {
|
|
|
434
404
|
ts.isExportSpecifier(parent);
|
|
435
405
|
|
|
436
406
|
if (isImportOrExportDeclarationRef) return;
|
|
437
|
-
|
|
438
|
-
// Protection 2: Avoid object property name access False Positives (obj.foo)
|
|
439
407
|
if (ts.isPropertyAccessExpression(parent) && parent.name === node) return;
|
|
440
|
-
|
|
441
|
-
// Protection 3: Avoid object assignment keys False Positives ({ foo: 123 })
|
|
442
408
|
if (ts.isPropertyAssignment(parent) && parent.name === node) return;
|
|
443
|
-
|
|
444
|
-
// Protection 4: Avoid shadow declarations with matching names
|
|
445
409
|
if (
|
|
446
410
|
(ts.isMethodDeclaration(parent) ||
|
|
447
411
|
ts.isPropertyDeclaration(parent) ||
|
|
@@ -453,25 +417,18 @@ function hasTopLevelUsage(fromFile: string, toFile: string): boolean {
|
|
|
453
417
|
return;
|
|
454
418
|
}
|
|
455
419
|
|
|
456
|
-
// (Hoisting check 1): Direct or renamed named/default import usage
|
|
457
420
|
if (isImportedSymbol) {
|
|
458
421
|
const exportedName = localToExportedName.get(node.text)!;
|
|
459
|
-
if (hoistedExports.has(exportedName))
|
|
460
|
-
return; // Perfectly safe hoisted function call/reference!
|
|
461
|
-
}
|
|
422
|
+
if (hoistedExports.has(exportedName)) return;
|
|
462
423
|
}
|
|
463
424
|
|
|
464
|
-
// (Hoisting check 2): Namespace import property access usage (ns.foo())
|
|
465
425
|
if (isNamespaceReference) {
|
|
466
426
|
if (ts.isPropertyAccessExpression(parent) && parent.expression === node) {
|
|
467
427
|
const propName = parent.name.text;
|
|
468
|
-
if (hoistedExports.has(propName))
|
|
469
|
-
return; // Perfectly safe property from namespace!
|
|
470
|
-
}
|
|
428
|
+
if (hoistedExports.has(propName)) return;
|
|
471
429
|
}
|
|
472
430
|
}
|
|
473
431
|
|
|
474
|
-
// Protection 5: Type contexts checks
|
|
475
432
|
let isInTypeContext = false;
|
|
476
433
|
let checkParent: ts.Node | undefined = parent;
|
|
477
434
|
while (checkParent && checkParent !== sourceFile) {
|
|
@@ -502,7 +459,7 @@ function hasTopLevelUsage(fromFile: string, toFile: string): boolean {
|
|
|
502
459
|
return dangerousTopLevelUsage;
|
|
503
460
|
}
|
|
504
461
|
|
|
505
|
-
function canReach(start: string, target: string): boolean {
|
|
462
|
+
function canReach(start: string, target: string, graph: Map<string, string[]>): boolean {
|
|
506
463
|
const seen = new Set<string>();
|
|
507
464
|
const stack = [start];
|
|
508
465
|
|
|
@@ -519,14 +476,18 @@ function canReach(start: string, target: string): boolean {
|
|
|
519
476
|
}
|
|
520
477
|
|
|
521
478
|
function main() {
|
|
522
|
-
const { entryPatterns
|
|
523
|
-
globalProjectPath = projectPath;
|
|
479
|
+
const { entryPatterns } = parseArgs();
|
|
524
480
|
|
|
525
481
|
if (entryPatterns.length === 0) {
|
|
526
482
|
console.error('❌ Error: Please specify at least one entry point or glob pattern.');
|
|
527
483
|
process.exit(1);
|
|
528
484
|
}
|
|
529
485
|
|
|
486
|
+
// All mutable state is local to each run — no cross-run contamination
|
|
487
|
+
const graph = new Map<string, string[]>();
|
|
488
|
+
const allUniqueCycles: string[][] = [];
|
|
489
|
+
const globalDetectedCycles = new Set<string>();
|
|
490
|
+
|
|
530
491
|
const entryPoints: string[] = [];
|
|
531
492
|
|
|
532
493
|
for (const pattern of entryPatterns) {
|
|
@@ -555,7 +516,7 @@ function main() {
|
|
|
555
516
|
console.log(`🔍 Found ${entryPoints.length} entry point(s) for analysis. Building graph...\n`);
|
|
556
517
|
|
|
557
518
|
for (const entryPoint of entryPoints) {
|
|
558
|
-
parseFile(entryPoint);
|
|
519
|
+
parseFile(entryPoint, graph);
|
|
559
520
|
}
|
|
560
521
|
|
|
561
522
|
const visited = new Map<string, NodeState>();
|
|
@@ -616,7 +577,7 @@ function main() {
|
|
|
616
577
|
if (matchedEp) {
|
|
617
578
|
entryPointCycles.get(matchedEp)!.push(cycle);
|
|
618
579
|
} else {
|
|
619
|
-
const reachingEp = entryPoints.find((ep) => canReach(ep, firstFile));
|
|
580
|
+
const reachingEp = entryPoints.find((ep) => canReach(ep, firstFile, graph));
|
|
620
581
|
if (reachingEp) entryPointCycles.get(reachingEp)!.push(cycle);
|
|
621
582
|
else entryPointCycles.get(entryPoints[0])!.push(cycle);
|
|
622
583
|
}
|