eslint-plugin-fast-import 2.2.1 → 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/.claude/settings.local.json +4 -4
- package/CHANGELOG.md +4 -0
- package/README.md +3 -0
- 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 +3 -0
- package/dist/plugin.js.map +1 -1
- package/dist/rules/alias/alias.d.ts +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/settings/user.d.ts +1 -1
- package/dist/util/getSubpathEntry.d.ts +4 -0
- package/dist/util/getSubpathEntry.js +22 -0
- package/dist/util/getSubpathEntry.js.map +1 -0
- package/package.json +6 -8
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"permissions": {
|
|
3
3
|
"allow": [
|
|
4
|
-
"Bash(npm
|
|
4
|
+
"Bash(npm i)",
|
|
5
5
|
"Bash(npm run build:*)",
|
|
6
|
-
"Bash(
|
|
7
|
-
"Bash(npm test:*)",
|
|
8
|
-
"Bash(
|
|
6
|
+
"Bash(npm run lint:*)",
|
|
7
|
+
"Bash(npm run test:*)",
|
|
8
|
+
"Bash(ln:*)"
|
|
9
9
|
]
|
|
10
10
|
}
|
|
11
11
|
}
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
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
|
+
|
|
3
7
|
## 2.2.1 (10/13/2025)
|
|
4
8
|
|
|
5
9
|
- Added missing export for `getLocFromRange`
|
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)
|
|
@@ -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
|
@@ -63,7 +63,7 @@ declare const plugin: {
|
|
|
63
63
|
name: string;
|
|
64
64
|
};
|
|
65
65
|
'prefer-alias-imports': TSESLint.RuleModule<"preferAlias" | "preferRelative", [{
|
|
66
|
-
mode?: "relative-if-local" |
|
|
66
|
+
mode?: "always" | "relative-if-local" | undefined;
|
|
67
67
|
minSharedPathDepth?: number | undefined;
|
|
68
68
|
} | undefined], unknown, TSESLint.RuleListener> & {
|
|
69
69
|
name: string;
|
package/dist/plugin.js
CHANGED
|
@@ -13,6 +13,9 @@ 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
20
|
export { getESMInfo, registerUpdateListener, isNonTestFile, getLocFromRange, } from './rules/util.js';
|
|
18
21
|
// Plugin export
|
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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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export declare const preferAliasImports: import("@typescript-eslint/utils/ts-eslint").RuleModule<"preferAlias" | "preferRelative", [{
|
|
2
|
-
mode?: "relative-if-local" |
|
|
2
|
+
mode?: "always" | "relative-if-local" | undefined;
|
|
3
3
|
minSharedPathDepth?: number | undefined;
|
|
4
4
|
} | undefined], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
|
|
5
5
|
name: string;
|
|
@@ -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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"}
|