eslint-plugin-fast-import 2.2.0 → 2.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/README.md +29 -5
- package/dist/module/computePackageInfo.d.ts +2 -0
- package/dist/module/computePackageInfo.js +4 -0
- package/dist/module/computePackageInfo.js.map +1 -0
- package/dist/module/computeRepoInfo.d.ts +5 -0
- package/dist/module/computeRepoInfo.js +100 -0
- package/dist/module/computeRepoInfo.js.map +1 -0
- package/dist/plugin.d.ts +1 -1
- package/dist/plugin.js +4 -1
- package/dist/plugin.js.map +1 -1
- package/dist/rules/no-cycle/cycle.d.ts +4 -0
- package/dist/rules/no-cycle/cycle.js +140 -0
- package/dist/rules/no-cycle/cycle.js.map +1 -0
- package/dist/rules/no-cycle/rule.d.ts +4 -0
- package/dist/rules/no-cycle/rule.js +319 -0
- package/dist/rules/no-cycle/rule.js.map +1 -0
- package/dist/rules/no-empty-entry-points/rule.d.ts +3 -0
- package/dist/rules/no-empty-entry-points/rule.js +57 -0
- package/dist/rules/no-empty-entry-points/rule.js.map +1 -0
- package/dist/rules/no-entry-point-imports/entryPoint.d.ts +3 -0
- package/dist/rules/no-entry-point-imports/entryPoint.js +57 -0
- package/dist/rules/no-entry-point-imports/entryPoint.js.map +1 -0
- package/dist/rules/no-entry-point-imports/rule.d.ts +3 -0
- package/dist/rules/no-entry-point-imports/rule.js +60 -0
- package/dist/rules/no-entry-point-imports/rule.js.map +1 -0
- package/dist/rules/no-external-barrel-reexports/externalBarrelReexports.d.ts +3 -0
- package/dist/rules/no-external-barrel-reexports/externalBarrelReexports.js +42 -0
- package/dist/rules/no-external-barrel-reexports/externalBarrelReexports.js.map +1 -0
- package/dist/rules/no-external-barrel-reexports/rule.d.ts +3 -0
- package/dist/rules/no-external-barrel-reexports/rule.js +42 -0
- package/dist/rules/no-external-barrel-reexports/rule.js.map +1 -0
- package/dist/rules/no-named-as-default/namedAsDefault.d.ts +3 -0
- package/dist/rules/no-named-as-default/namedAsDefault.js +77 -0
- package/dist/rules/no-named-as-default/namedAsDefault.js.map +1 -0
- package/dist/rules/no-named-as-default/rule.d.ts +3 -0
- package/dist/rules/no-named-as-default/rule.js +79 -0
- package/dist/rules/no-named-as-default/rule.js.map +1 -0
- package/dist/rules/no-node-builtins/nodeBuiltins.d.ts +3 -0
- package/dist/rules/no-node-builtins/nodeBuiltins.js +48 -0
- package/dist/rules/no-node-builtins/nodeBuiltins.js.map +1 -0
- package/dist/rules/no-node-builtins/rule.d.ts +3 -0
- package/dist/rules/no-node-builtins/rule.js +49 -0
- package/dist/rules/no-node-builtins/rule.js.map +1 -0
- package/dist/rules/no-restricted-imports/restricted.d.ts +31 -0
- package/dist/rules/no-restricted-imports/restricted.js +196 -0
- package/dist/rules/no-restricted-imports/restricted.js.map +1 -0
- package/dist/rules/no-restricted-imports/rule.d.ts +31 -0
- package/dist/rules/no-restricted-imports/rule.js +204 -0
- package/dist/rules/no-restricted-imports/rule.js.map +1 -0
- package/dist/rules/no-test-imports-in-prod/rule.d.ts +3 -0
- package/dist/rules/no-test-imports-in-prod/rule.js +57 -0
- package/dist/rules/no-test-imports-in-prod/rule.js.map +1 -0
- package/dist/rules/no-test-imports-in-prod/testInProd.d.ts +3 -0
- package/dist/rules/no-test-imports-in-prod/testInProd.js +49 -0
- package/dist/rules/no-test-imports-in-prod/testInProd.js.map +1 -0
- package/dist/rules/no-test-only-imports/rule.d.ts +3 -0
- package/dist/rules/no-test-only-imports/rule.js +69 -0
- package/dist/rules/no-test-only-imports/rule.js.map +1 -0
- package/dist/rules/no-unnamed-entry-point-exports/rule.d.ts +3 -0
- package/dist/rules/no-unnamed-entry-point-exports/rule.js +41 -0
- package/dist/rules/no-unnamed-entry-point-exports/rule.js.map +1 -0
- package/dist/rules/no-unresolved-imports/rule.d.ts +3 -0
- package/dist/rules/no-unresolved-imports/rule.js +139 -0
- package/dist/rules/no-unresolved-imports/rule.js.map +1 -0
- package/dist/rules/no-unresolved-imports/unresolved.d.ts +3 -0
- package/dist/rules/no-unresolved-imports/unresolved.js +135 -0
- package/dist/rules/no-unresolved-imports/unresolved.js.map +1 -0
- package/dist/rules/no-unused-exports/rule.d.ts +3 -0
- package/dist/rules/no-unused-exports/rule.js +60 -0
- package/dist/rules/no-unused-exports/rule.js.map +1 -0
- package/dist/rules/no-unused-package-exports/rule.d.ts +3 -0
- package/dist/rules/no-unused-package-exports/rule.js +57 -0
- package/dist/rules/no-unused-package-exports/rule.js.map +1 -0
- package/dist/rules/prefer-alias-imports/alias.d.ts +6 -0
- package/dist/rules/prefer-alias-imports/alias.js +210 -0
- package/dist/rules/prefer-alias-imports/alias.js.map +1 -0
- package/dist/rules/prefer-alias-imports/rule.d.ts +6 -0
- package/dist/rules/prefer-alias-imports/rule.js +214 -0
- package/dist/rules/prefer-alias-imports/rule.js.map +1 -0
- package/dist/rules/require-node-prefix/nodePrefix.d.ts +3 -0
- package/dist/rules/require-node-prefix/nodePrefix.js +59 -0
- package/dist/rules/require-node-prefix/nodePrefix.js.map +1 -0
- package/dist/rules/require-node-prefix/rule.d.ts +3 -0
- package/dist/rules/require-node-prefix/rule.js +60 -0
- package/dist/rules/require-node-prefix/rule.js.map +1 -0
- package/dist/settings/framework.d.ts +3 -0
- package/dist/settings/framework.js +91 -0
- package/dist/settings/framework.js.map +1 -0
- package/dist/settings/package.d.ts +6 -0
- package/dist/settings/package.js +64 -0
- package/dist/settings/package.js.map +1 -0
- package/dist/settings/repo.d.ts +1 -0
- package/dist/settings/repo.js +6 -0
- package/dist/settings/repo.js.map +1 -0
- package/dist/util/getSubpathEntry.d.ts +4 -0
- package/dist/util/getSubpathEntry.js +22 -0
- package/dist/util/getSubpathEntry.js.map +1 -0
- package/fast-import.config.json +3 -4
- package/package.json +12 -8
- package/dist/package/package.d.ts +0 -8
- package/dist/package/package.js +0 -41
- package/dist/package/package.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# CHANGELOG
|
|
2
2
|
|
|
3
|
+
## 2.2.2 (5/16/2026)
|
|
4
|
+
|
|
5
|
+
- Deprecated `eslint-plugin-fast-import` in favor of `import-integrity-lint`, a partial rewrite of Fast Import that brings first class monorepo support and Oxlint support
|
|
6
|
+
|
|
7
|
+
## 2.2.1 (10/13/2025)
|
|
8
|
+
|
|
9
|
+
- Added missing export for `getLocFromRange`
|
|
10
|
+
|
|
3
11
|
## 2.2.0 (3/26/2026)
|
|
4
12
|
|
|
5
13
|
- Added support for `regexp` property in `entryPoints` and `externallyImported` options
|
package/README.md
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
# eslint-plugin-fast-import
|
|
2
2
|
|
|
3
|
+
> [!WARNING]
|
|
4
|
+
> This plugin has been deprecated in favor of [Import Integrity](https://github.com/nebrius/import-integrity-lint). Import Integrity is a partial rewrite and rebrand that brings first class Oxlint support and new monorepo-specific rules. See the migration guide [on the docs site](https://nebrius.github.io/import-integrity-lint/guide/migration.html) or in [Markdown](https://github.com/nebrius/import-integrity-lint/blob/7cc026e7298ded64371c7b6772cf2c814a314c56/docs/guide/migration.md) for AI-friendly details.
|
|
5
|
+
|
|
3
6
|
[](https://badge.fury.io/js/eslint-plugin-fast-import)  [](https://codecov.io/gh/nebrius/eslint-plugin-fast-import)
|
|
4
7
|
|
|
5
8
|
- [Installation](#installation)
|
|
@@ -18,7 +21,7 @@
|
|
|
18
21
|
- [requireFileExtensions](#requirefileextensions)
|
|
19
22
|
- [Using fast-import.config.json](#using-fast-importconfigjson)
|
|
20
23
|
- [Use in monorepos](#use-in-monorepos)
|
|
21
|
-
- [Using with
|
|
24
|
+
- [Using with Oxlint](#using-with-oxlint)
|
|
22
25
|
- [Comparisons to import and import-x](#comparisons-to-import-and-import-x)
|
|
23
26
|
- [Performance](#performance)
|
|
24
27
|
- [Accuracy](#accuracy)
|
|
@@ -176,7 +179,7 @@ recommended({
|
|
|
176
179
|
externallyImported: {
|
|
177
180
|
'index.ts': /.*/,
|
|
178
181
|
// Or use { regexp: string } for environments that don't support RegExp
|
|
179
|
-
// (e.g.
|
|
182
|
+
// (e.g. Oxlint's JS plugin interface):
|
|
180
183
|
// 'index.ts': { regexp: '.*' },
|
|
181
184
|
},
|
|
182
185
|
});
|
|
@@ -337,11 +340,32 @@ And then the configuration file:
|
|
|
337
340
|
|
|
338
341
|
Fast import is designed to work well in monorepos. The caching mechanism described in [the algorithm](#algorithm) is monorepo aware, allowing fast import to manage multiple caches for different packages in the monorepo simultaneously.
|
|
339
342
|
|
|
340
|
-
### Using with
|
|
343
|
+
### Using with Oxlint
|
|
344
|
+
|
|
345
|
+
Fast Import works with [Oxlint](https://oxc.rs/docs/guide/usage/linter) via its [JS plugin interface](https://oxc.rs/docs/guide/usage/linter/js-plugins).
|
|
346
|
+
|
|
347
|
+
Configuration is essentially the same as with ESLint, with two differences:
|
|
348
|
+
|
|
349
|
+
1. Oxlint's JS plugin interface does not yet [support `RegExp` values in settings](https://github.com/oxc-project/oxc/issues/20530). If you use regexes in `entryPoints` or `externallyImported`, use the `{ regexp: string }` form instead (see [externallyImported / entryPoints](#externallyimported--entrypoints)).
|
|
350
|
+
2. Oxlint does not have an equivalent to ESLint's flat config, so the `recommended()` and `all()` helper functions cannot be used directly. Instead, call the helper and spread its `rules` and `settings` into Oxlint's config separately:
|
|
341
351
|
|
|
342
|
-
|
|
352
|
+
```ts
|
|
353
|
+
import { all } from 'eslint-plugin-fast-import';
|
|
343
354
|
|
|
344
|
-
|
|
355
|
+
const ROOT_DIR = import.meta.dirname;
|
|
356
|
+
const { rules: fastImportRules, settings } = all(ROOT_DIR);
|
|
357
|
+
|
|
358
|
+
export default {
|
|
359
|
+
jsPlugins: [
|
|
360
|
+
{ name: 'fast-import', specifier: 'eslint-plugin-fast-import' },
|
|
361
|
+
],
|
|
362
|
+
rules: {
|
|
363
|
+
...fastImportRules,
|
|
364
|
+
// other rules...
|
|
365
|
+
},
|
|
366
|
+
settings,
|
|
367
|
+
};
|
|
368
|
+
```
|
|
345
369
|
|
|
346
370
|
For a full working example, see this repo's own [oxlint.config.ts](./oxlint.config.ts).
|
|
347
371
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"computePackageInfo.js","sourceRoot":"","sources":["../../src/module/computePackageInfo.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,kBAAkB,CAChC,oBAAyC;IAEzC,2CAA2C;AAC7C,CAAC"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Computes cross-package import info.
|
|
3
|
+
*/
|
|
4
|
+
export function computeRepoInfo(analyzedPackageInfos) {
|
|
5
|
+
const packageImportMap = new Map();
|
|
6
|
+
// Initialize the package dependencies map
|
|
7
|
+
for (const [, analyzedPackageInfo] of analyzedPackageInfos) {
|
|
8
|
+
if (analyzedPackageInfo.packageName) {
|
|
9
|
+
for (const [, fileDetails,] of analyzedPackageInfo.packageEntryPointExports) {
|
|
10
|
+
if (fileDetails.entryPointSpecifier) {
|
|
11
|
+
packageImportMap.set(fileDetails.entryPointSpecifier, fileDetails);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
// Reset externallyImportedBy arrays. Since we don't do more intelligent cache
|
|
17
|
+
// updates for package info, we have to first reset externallyImportedBy
|
|
18
|
+
// arrays, otherwise we end up with duplicates.
|
|
19
|
+
for (const [, analyzedPackageInfo] of analyzedPackageInfos) {
|
|
20
|
+
for (const [, fileDetails] of analyzedPackageInfo.files) {
|
|
21
|
+
if (fileDetails.fileType !== 'code') {
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
for (const exportEntry of fileDetails.exports) {
|
|
25
|
+
exportEntry.externallyImportedBy = [];
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
// Mark entry points as imported in the monorepo
|
|
30
|
+
for (const [, analyzedPackageInfo] of analyzedPackageInfos) {
|
|
31
|
+
for (const [filePath, fileDetails] of analyzedPackageInfo.files) {
|
|
32
|
+
if (fileDetails.fileType !== 'code') {
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
// We don't include side effect imports because they don't import any
|
|
36
|
+
// actual exports, and thus we should make any of them as exprted
|
|
37
|
+
for (const importEntry of [
|
|
38
|
+
...fileDetails.singleImports,
|
|
39
|
+
...fileDetails.barrelImports,
|
|
40
|
+
...fileDetails.dynamicImports,
|
|
41
|
+
]) {
|
|
42
|
+
if (importEntry.resolvedModuleType !== 'thirdParty') {
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
// We can't analyze dynamic import specifiers that can't be resolve
|
|
46
|
+
// statically (aka moduleSpecifier is undefined), so we skip them
|
|
47
|
+
if (!importEntry.moduleSpecifier) {
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
// Check if this is a known package in the monorepo or not. If it's not
|
|
51
|
+
// then that means it's a true third party module from npm
|
|
52
|
+
const fileDetails = packageImportMap.get(importEntry.moduleSpecifier);
|
|
53
|
+
if (!fileDetails) {
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
switch (importEntry.type) {
|
|
57
|
+
// For single imports, we need to find the specific export so we can
|
|
58
|
+
// mark it as externally imported
|
|
59
|
+
case 'singleImport': {
|
|
60
|
+
for (const exportEntry of [
|
|
61
|
+
...fileDetails.exports,
|
|
62
|
+
...fileDetails.singleReexports,
|
|
63
|
+
...fileDetails.barrelReexports,
|
|
64
|
+
]) {
|
|
65
|
+
if (exportEntry.exportName === importEntry.importName) {
|
|
66
|
+
exportEntry.externallyImportedBy.push({
|
|
67
|
+
packageRootDir: analyzedPackageInfo.packageRootDir,
|
|
68
|
+
filePath,
|
|
69
|
+
importEntry,
|
|
70
|
+
});
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
// For barrel imports and dynamic imports, we mark all exports as externally imported
|
|
77
|
+
case 'dynamicImport':
|
|
78
|
+
case 'barrelImport': {
|
|
79
|
+
for (const exportEntry of [
|
|
80
|
+
...fileDetails.exports,
|
|
81
|
+
...fileDetails.singleReexports,
|
|
82
|
+
...fileDetails.barrelReexports,
|
|
83
|
+
]) {
|
|
84
|
+
if (!exportEntry.exportName) {
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
exportEntry.externallyImportedBy.push({
|
|
88
|
+
packageRootDir: analyzedPackageInfo.packageRootDir,
|
|
89
|
+
filePath,
|
|
90
|
+
importEntry,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=computeRepoInfo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"computeRepoInfo.js","sourceRoot":"","sources":["../../src/module/computeRepoInfo.ts"],"names":[],"mappings":"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"}
|
package/dist/plugin.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { TSESLint } from '@typescript-eslint/utils';
|
|
2
2
|
import type { UserSettings } from './settings/user.js';
|
|
3
|
-
export { getESMInfo, registerUpdateListener, isNonTestFile, } from './rules/util.js';
|
|
3
|
+
export { getESMInfo, registerUpdateListener, isNonTestFile, getLocFromRange, } from './rules/util.js';
|
|
4
4
|
declare const plugin: {
|
|
5
5
|
meta: {
|
|
6
6
|
name: string;
|
package/dist/plugin.js
CHANGED
|
@@ -13,8 +13,11 @@ import { noRestrictedImports } from './rules/restricted/restricted.js';
|
|
|
13
13
|
import { noTestImportsInProd } from './rules/testInProd/testInProd.js';
|
|
14
14
|
import { noUnresolvedImports } from './rules/unresolved/unresolved.js';
|
|
15
15
|
import { noUnusedExports } from './rules/unused/unused.js';
|
|
16
|
+
import { warn } from './util/logging.js';
|
|
17
|
+
warn('This package is deprecated. Please migrate to "import-integrity-lint": ' +
|
|
18
|
+
'https://github.com/nebrius/import-integrity-lint');
|
|
16
19
|
// Helper exports
|
|
17
|
-
export { getESMInfo, registerUpdateListener, isNonTestFile, } from './rules/util.js';
|
|
20
|
+
export { getESMInfo, registerUpdateListener, isNonTestFile, getLocFromRange, } from './rules/util.js';
|
|
18
21
|
// Plugin export
|
|
19
22
|
const { name, version } = JSON.parse(readFileSync(join(getDirname(), '..', 'package.json'), 'utf8'));
|
|
20
23
|
const plugin = {
|
package/dist/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAG7C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAC1E,OAAO,EAAE,yBAAyB,EAAE,MAAM,4DAA4D,CAAC;AACvG,OAAO,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { InternalError } from '../../util/error.js';
|
|
2
|
+
import { createRule, getESMInfo, getLocFromRange, registerUpdateListener } from '../util.js';
|
|
3
|
+
// Map of packageRootDirs to filepaths to imports/reexports with cycle dependencies
|
|
4
|
+
const cycleMaps = new Map();
|
|
5
|
+
function checkFile(originalFilePath, currentFilePath, projectInfo, importStack) {
|
|
6
|
+
const fileDetails = projectInfo.files.get(currentFilePath);
|
|
7
|
+
/* istanbul ignore if */
|
|
8
|
+
if (!fileDetails) {
|
|
9
|
+
throw new InternalError(`Could not get file info for "${currentFilePath}"`);
|
|
10
|
+
}
|
|
11
|
+
// Non-JS files by definition can't be circilar, since they can't import JS
|
|
12
|
+
if (fileDetails.fileType !== 'code') {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
let cycleMap = cycleMaps.get(projectInfo.packageRootDir);
|
|
16
|
+
if (!cycleMap) {
|
|
17
|
+
cycleMap = new Map();
|
|
18
|
+
cycleMaps.set(projectInfo.packageRootDir, cycleMap);
|
|
19
|
+
}
|
|
20
|
+
// Now check if this file is part of a cycle
|
|
21
|
+
const firstInstanceIndex = importStack.indexOf(currentFilePath);
|
|
22
|
+
if (firstInstanceIndex !== -1) {
|
|
23
|
+
const filesInCycle = importStack.slice(firstInstanceIndex);
|
|
24
|
+
for (let i = 0; i < filesInCycle.length; i++) {
|
|
25
|
+
const currentFile = filesInCycle[i];
|
|
26
|
+
const nextFile = i === filesInCycle.length - 1 ? filesInCycle[0] : filesInCycle[i + 1];
|
|
27
|
+
const currentCycleMapEntry = cycleMap.get(currentFile);
|
|
28
|
+
if (!currentCycleMapEntry) {
|
|
29
|
+
throw new InternalError(`Cycle map entry is undefined for ${currentFile}`);
|
|
30
|
+
}
|
|
31
|
+
currentCycleMapEntry.add(nextFile);
|
|
32
|
+
}
|
|
33
|
+
// Stop traversing since we'd otherwise traverse forever
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
// Otherwise, check if we've already analyzed this file
|
|
37
|
+
if (cycleMap.has(currentFilePath)) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
// Initialize this file
|
|
41
|
+
cycleMap.set(currentFilePath, new Set());
|
|
42
|
+
// If this wasn't a cycle, then keep exploring
|
|
43
|
+
for (const importEntry of [
|
|
44
|
+
...fileDetails.singleImports,
|
|
45
|
+
...fileDetails.singleReexports,
|
|
46
|
+
...fileDetails.barrelImports,
|
|
47
|
+
...fileDetails.singleReexports,
|
|
48
|
+
...fileDetails.barrelReexports,
|
|
49
|
+
]) {
|
|
50
|
+
if (
|
|
51
|
+
// We allow type imports to be cyclicle since they are compiled out
|
|
52
|
+
('isTypeImport' in importEntry && importEntry.isTypeImport) ||
|
|
53
|
+
('isTypeReexport' in importEntry && importEntry.isTypeReexport) ||
|
|
54
|
+
importEntry.resolvedModuleType !== 'firstPartyCode') {
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
checkFile(originalFilePath, importEntry.resolvedModulePath, projectInfo, [
|
|
58
|
+
...importStack,
|
|
59
|
+
currentFilePath,
|
|
60
|
+
]);
|
|
61
|
+
}
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
registerUpdateListener((root) => {
|
|
65
|
+
cycleMaps.delete(root);
|
|
66
|
+
});
|
|
67
|
+
// This is only used in tests, since update listeners aren't guaranteed to
|
|
68
|
+
// be called on each run
|
|
69
|
+
// eslint-disable-next-line fast-import/no-unused-exports
|
|
70
|
+
export function _resetCycleMap() {
|
|
71
|
+
cycleMaps.clear();
|
|
72
|
+
}
|
|
73
|
+
export const noCycle = createRule({
|
|
74
|
+
name: 'no-cycle',
|
|
75
|
+
meta: {
|
|
76
|
+
docs: {
|
|
77
|
+
description: 'Ensures that there are no cycles in imports/reexports',
|
|
78
|
+
},
|
|
79
|
+
schema: [],
|
|
80
|
+
fixable: undefined,
|
|
81
|
+
type: 'problem',
|
|
82
|
+
messages: {
|
|
83
|
+
noCycles: 'Imports/reexports cannot form a cycle',
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
defaultOptions: [],
|
|
87
|
+
create(context) {
|
|
88
|
+
const esmInfo = getESMInfo(context);
|
|
89
|
+
// No project info means this file wasn't found as part of the project, e.g.
|
|
90
|
+
// because it's ignored
|
|
91
|
+
/* istanbul ignore if */
|
|
92
|
+
if (!esmInfo) {
|
|
93
|
+
return {};
|
|
94
|
+
}
|
|
95
|
+
const { fileInfo, projectInfo } = esmInfo;
|
|
96
|
+
/* istanbul ignore if */
|
|
97
|
+
if (fileInfo.fileType !== 'code') {
|
|
98
|
+
return {};
|
|
99
|
+
}
|
|
100
|
+
let cycleMap = cycleMaps.get(projectInfo.packageRootDir);
|
|
101
|
+
if (!cycleMap) {
|
|
102
|
+
cycleMap = new Map();
|
|
103
|
+
cycleMaps.set(projectInfo.packageRootDir, cycleMap);
|
|
104
|
+
}
|
|
105
|
+
let cycleImports = cycleMap.get(context.filename);
|
|
106
|
+
if (!cycleImports) {
|
|
107
|
+
checkFile(context.filename, context.filename, projectInfo, []);
|
|
108
|
+
cycleImports = cycleMap.get(context.filename);
|
|
109
|
+
}
|
|
110
|
+
/* istanbul ignore if */
|
|
111
|
+
if (!cycleImports) {
|
|
112
|
+
throw new InternalError(`Cycle list is undefined for ${context.filename}`);
|
|
113
|
+
}
|
|
114
|
+
// Dedupe imports, since we mark cycle imports on a per-file basis, not on a
|
|
115
|
+
// per-import basis
|
|
116
|
+
const visitedImports = new Set();
|
|
117
|
+
for (const cycleImport of cycleImports) {
|
|
118
|
+
for (const importEntry of [
|
|
119
|
+
...fileInfo.singleImports,
|
|
120
|
+
...fileInfo.singleReexports,
|
|
121
|
+
...fileInfo.barrelImports,
|
|
122
|
+
...fileInfo.singleReexports,
|
|
123
|
+
...fileInfo.barrelReexports,
|
|
124
|
+
]) {
|
|
125
|
+
if (importEntry.resolvedModuleType === 'firstPartyCode' &&
|
|
126
|
+
importEntry.resolvedModulePath === cycleImport &&
|
|
127
|
+
!visitedImports.has(importEntry.resolvedModulePath)) {
|
|
128
|
+
visitedImports.add(importEntry.resolvedModulePath);
|
|
129
|
+
context.report({
|
|
130
|
+
messageId: 'noCycles',
|
|
131
|
+
loc: getLocFromRange(context, importEntry.statementNodeRange),
|
|
132
|
+
});
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return {};
|
|
138
|
+
},
|
|
139
|
+
});
|
|
140
|
+
//# sourceMappingURL=cycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cycle.js","sourceRoot":"","sources":["../../../src/rules/no-cycle/cycle.ts"],"names":[],"mappings":"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"}
|