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.
Files changed (103) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +29 -5
  3. package/dist/module/computePackageInfo.d.ts +2 -0
  4. package/dist/module/computePackageInfo.js +4 -0
  5. package/dist/module/computePackageInfo.js.map +1 -0
  6. package/dist/module/computeRepoInfo.d.ts +5 -0
  7. package/dist/module/computeRepoInfo.js +100 -0
  8. package/dist/module/computeRepoInfo.js.map +1 -0
  9. package/dist/plugin.d.ts +1 -1
  10. package/dist/plugin.js +4 -1
  11. package/dist/plugin.js.map +1 -1
  12. package/dist/rules/no-cycle/cycle.d.ts +4 -0
  13. package/dist/rules/no-cycle/cycle.js +140 -0
  14. package/dist/rules/no-cycle/cycle.js.map +1 -0
  15. package/dist/rules/no-cycle/rule.d.ts +4 -0
  16. package/dist/rules/no-cycle/rule.js +319 -0
  17. package/dist/rules/no-cycle/rule.js.map +1 -0
  18. package/dist/rules/no-empty-entry-points/rule.d.ts +3 -0
  19. package/dist/rules/no-empty-entry-points/rule.js +57 -0
  20. package/dist/rules/no-empty-entry-points/rule.js.map +1 -0
  21. package/dist/rules/no-entry-point-imports/entryPoint.d.ts +3 -0
  22. package/dist/rules/no-entry-point-imports/entryPoint.js +57 -0
  23. package/dist/rules/no-entry-point-imports/entryPoint.js.map +1 -0
  24. package/dist/rules/no-entry-point-imports/rule.d.ts +3 -0
  25. package/dist/rules/no-entry-point-imports/rule.js +60 -0
  26. package/dist/rules/no-entry-point-imports/rule.js.map +1 -0
  27. package/dist/rules/no-external-barrel-reexports/externalBarrelReexports.d.ts +3 -0
  28. package/dist/rules/no-external-barrel-reexports/externalBarrelReexports.js +42 -0
  29. package/dist/rules/no-external-barrel-reexports/externalBarrelReexports.js.map +1 -0
  30. package/dist/rules/no-external-barrel-reexports/rule.d.ts +3 -0
  31. package/dist/rules/no-external-barrel-reexports/rule.js +42 -0
  32. package/dist/rules/no-external-barrel-reexports/rule.js.map +1 -0
  33. package/dist/rules/no-named-as-default/namedAsDefault.d.ts +3 -0
  34. package/dist/rules/no-named-as-default/namedAsDefault.js +77 -0
  35. package/dist/rules/no-named-as-default/namedAsDefault.js.map +1 -0
  36. package/dist/rules/no-named-as-default/rule.d.ts +3 -0
  37. package/dist/rules/no-named-as-default/rule.js +79 -0
  38. package/dist/rules/no-named-as-default/rule.js.map +1 -0
  39. package/dist/rules/no-node-builtins/nodeBuiltins.d.ts +3 -0
  40. package/dist/rules/no-node-builtins/nodeBuiltins.js +48 -0
  41. package/dist/rules/no-node-builtins/nodeBuiltins.js.map +1 -0
  42. package/dist/rules/no-node-builtins/rule.d.ts +3 -0
  43. package/dist/rules/no-node-builtins/rule.js +49 -0
  44. package/dist/rules/no-node-builtins/rule.js.map +1 -0
  45. package/dist/rules/no-restricted-imports/restricted.d.ts +31 -0
  46. package/dist/rules/no-restricted-imports/restricted.js +196 -0
  47. package/dist/rules/no-restricted-imports/restricted.js.map +1 -0
  48. package/dist/rules/no-restricted-imports/rule.d.ts +31 -0
  49. package/dist/rules/no-restricted-imports/rule.js +204 -0
  50. package/dist/rules/no-restricted-imports/rule.js.map +1 -0
  51. package/dist/rules/no-test-imports-in-prod/rule.d.ts +3 -0
  52. package/dist/rules/no-test-imports-in-prod/rule.js +57 -0
  53. package/dist/rules/no-test-imports-in-prod/rule.js.map +1 -0
  54. package/dist/rules/no-test-imports-in-prod/testInProd.d.ts +3 -0
  55. package/dist/rules/no-test-imports-in-prod/testInProd.js +49 -0
  56. package/dist/rules/no-test-imports-in-prod/testInProd.js.map +1 -0
  57. package/dist/rules/no-test-only-imports/rule.d.ts +3 -0
  58. package/dist/rules/no-test-only-imports/rule.js +69 -0
  59. package/dist/rules/no-test-only-imports/rule.js.map +1 -0
  60. package/dist/rules/no-unnamed-entry-point-exports/rule.d.ts +3 -0
  61. package/dist/rules/no-unnamed-entry-point-exports/rule.js +41 -0
  62. package/dist/rules/no-unnamed-entry-point-exports/rule.js.map +1 -0
  63. package/dist/rules/no-unresolved-imports/rule.d.ts +3 -0
  64. package/dist/rules/no-unresolved-imports/rule.js +139 -0
  65. package/dist/rules/no-unresolved-imports/rule.js.map +1 -0
  66. package/dist/rules/no-unresolved-imports/unresolved.d.ts +3 -0
  67. package/dist/rules/no-unresolved-imports/unresolved.js +135 -0
  68. package/dist/rules/no-unresolved-imports/unresolved.js.map +1 -0
  69. package/dist/rules/no-unused-exports/rule.d.ts +3 -0
  70. package/dist/rules/no-unused-exports/rule.js +60 -0
  71. package/dist/rules/no-unused-exports/rule.js.map +1 -0
  72. package/dist/rules/no-unused-package-exports/rule.d.ts +3 -0
  73. package/dist/rules/no-unused-package-exports/rule.js +57 -0
  74. package/dist/rules/no-unused-package-exports/rule.js.map +1 -0
  75. package/dist/rules/prefer-alias-imports/alias.d.ts +6 -0
  76. package/dist/rules/prefer-alias-imports/alias.js +210 -0
  77. package/dist/rules/prefer-alias-imports/alias.js.map +1 -0
  78. package/dist/rules/prefer-alias-imports/rule.d.ts +6 -0
  79. package/dist/rules/prefer-alias-imports/rule.js +214 -0
  80. package/dist/rules/prefer-alias-imports/rule.js.map +1 -0
  81. package/dist/rules/require-node-prefix/nodePrefix.d.ts +3 -0
  82. package/dist/rules/require-node-prefix/nodePrefix.js +59 -0
  83. package/dist/rules/require-node-prefix/nodePrefix.js.map +1 -0
  84. package/dist/rules/require-node-prefix/rule.d.ts +3 -0
  85. package/dist/rules/require-node-prefix/rule.js +60 -0
  86. package/dist/rules/require-node-prefix/rule.js.map +1 -0
  87. package/dist/settings/framework.d.ts +3 -0
  88. package/dist/settings/framework.js +91 -0
  89. package/dist/settings/framework.js.map +1 -0
  90. package/dist/settings/package.d.ts +6 -0
  91. package/dist/settings/package.js +64 -0
  92. package/dist/settings/package.js.map +1 -0
  93. package/dist/settings/repo.d.ts +1 -0
  94. package/dist/settings/repo.js +6 -0
  95. package/dist/settings/repo.js.map +1 -0
  96. package/dist/util/getSubpathEntry.d.ts +4 -0
  97. package/dist/util/getSubpathEntry.js +22 -0
  98. package/dist/util/getSubpathEntry.js.map +1 -0
  99. package/fast-import.config.json +3 -4
  100. package/package.json +12 -8
  101. package/dist/package/package.d.ts +0 -8
  102. package/dist/package/package.js +0 -41
  103. 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
  [![npm version](https://badge.fury.io/js/eslint-plugin-fast-import.svg)](https://badge.fury.io/js/eslint-plugin-fast-import) ![ci workflow](https://github.com/nebrius/eslint-plugin-fast-import/actions/workflows/ci.yml/badge.svg) [![codecov](https://codecov.io/gh/nebrius/eslint-plugin-fast-import/graph/badge.svg?token=T6O54TXTKU)](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 OXLint](#using-with-oxlint)
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. OXLint's JS plugin interface):
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 OXLint
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
- 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).
352
+ ```ts
353
+ import { all } from 'eslint-plugin-fast-import';
343
354
 
344
- Configuration is essentially the same as with ESLint, with one exception: 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)).
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,2 @@
1
+ import type { AnalyzedProjectInfo } from '../types/analyzed.js';
2
+ export declare function computePackageInfo(_resolvedProjectInfo: AnalyzedProjectInfo): AnalyzedProjectInfo;
@@ -0,0 +1,4 @@
1
+ export function computePackageInfo(_resolvedProjectInfo) {
2
+ // TODO: Implement package info computation
3
+ }
4
+ //# sourceMappingURL=computePackageInfo.js.map
@@ -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,5 @@
1
+ import type { AnalyzedPackageInfo } from '../types/analyzed.js';
2
+ /**
3
+ * Computes cross-package import info.
4
+ */
5
+ export declare function computeRepoInfo(analyzedPackageInfos: Map<string, AnalyzedPackageInfo>): void;
@@ -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 = {
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function _resetCycleMap(): void;
2
+ export declare const noCycle: import("@typescript-eslint/utils/ts-eslint").RuleModule<"noCycles", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
3
+ name: string;
4
+ };
@@ -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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"}
@@ -0,0 +1,4 @@
1
+ export declare function _testOnlyResetCycleMap(): void;
2
+ export declare const noCycle: import("@typescript-eslint/utils/ts-eslint").RuleModule<"noCycles", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
3
+ name: string;
4
+ };