eslint-plugin-import-next 2.3.18 → 2.4.0
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
CHANGED
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
<a href="https://opensource.org/licenses/MIT" target="_blank"><img src="https://img.shields.io/badge/License-MIT-yellow.svg" alt="Package License" /></a>
|
|
17
17
|
<a href="https://app.codecov.io/gh/ofri-peretz/eslint/components?components%5B0%5D=eslint-plugin-import-next" target="_blank"><img src="https://codecov.io/gh/ofri-peretz/eslint/graph/badge.svg?component=eslint-plugin-import-next" alt="Codecov" /></a>
|
|
18
18
|
<a href="https://github.com/ofri-peretz/eslint" target="_blank"><img src="https://img.shields.io/badge/Since-Dec_2025-blue?logo=rocket&logoColor=white" alt="Since Dec 2025" /></a>
|
|
19
|
+
<a href="https://scorecard.dev/viewer/?uri=github.com/ofri-peretz/eslint" target="_blank"><img src="https://api.securityscorecards.dev/projects/github.com/ofri-peretz/eslint/badge" alt="OpenSSF Scorecard" /></a>
|
|
19
20
|
</p>
|
|
20
21
|
|
|
21
22
|
> ⭐ If this plugin caught a real bug for you, [**star the repo**](https://github.com/ofri-peretz/eslint) — it's the signal that keeps these rules maintained.
|
|
@@ -28,6 +29,45 @@ This plugin provides Next-generation import sorting, validation, and architectur
|
|
|
28
29
|
|
|
29
30
|
**Interlace** fosters **strength through integration**. Instead of stacking isolated rules, we **interlace** security directly into your workflow to create a resilient fabric of code. We believe tools should **guide rather than gatekeep**, providing educational feedback that strengthens the developer with every interaction.
|
|
30
31
|
|
|
32
|
+
<!-- AUTO-GENERATED:DOCTRINE:START - Do not edit manually -->
|
|
33
|
+
|
|
34
|
+
## Why these rules are quiet
|
|
35
|
+
|
|
36
|
+
**Noise creates apathy, and apathy is not a security posture.** A linter that reports
|
|
37
|
+
a thousand things a week gets switched off in a month, and the real finding goes with
|
|
38
|
+
it. So every rule here is built to be worth reading: we would rather miss a finding
|
|
39
|
+
than spend your attention on one that was never real.
|
|
40
|
+
|
|
41
|
+
That is a trade, and it is made deliberately. It costs recall, and we measure what it
|
|
42
|
+
costs rather than assuming it is free.
|
|
43
|
+
|
|
44
|
+
## How the rules decide
|
|
45
|
+
|
|
46
|
+
**Evidence, not names.** A rule fires on what the code *does*, resolved through the
|
|
47
|
+
AST and ESLint's own scope analysis — not on an identifier that happens to contain
|
|
48
|
+
`query`, a method called `setItem`, or a file whose path contains `key`. Every one of
|
|
49
|
+
those was a real false positive in this ecosystem, found by reading our own output on
|
|
50
|
+
open-source projects and fixed with a test that fails on the unfixed rule.
|
|
51
|
+
|
|
52
|
+
Where a rule has known false-positive shapes, its page carries a **Not a finding**
|
|
53
|
+
section: what it deliberately stays quiet on, and what to check first when it fires
|
|
54
|
+
and you disagree.
|
|
55
|
+
|
|
56
|
+
## What you get
|
|
57
|
+
|
|
58
|
+
The rules below. Security rules carry a CWE mapping and, where one is assigned, a
|
|
59
|
+
CVSS score; every rule carries a fix on its message — in prose for a human and as
|
|
60
|
+
structured JSON for an agent. Install it, enable
|
|
61
|
+
`recommended`, and read the findings. If one of them is wrong,
|
|
62
|
+
[open an issue](https://github.com/ofri-peretz/eslint/issues) — a false positive is a
|
|
63
|
+
bug here, not a tuning exercise for you.
|
|
64
|
+
|
|
65
|
+
How that is measured, on which projects, and where it falls short:
|
|
66
|
+
[benchmark methodology](https://github.com/ofri-peretz/eslint/blob/main/BENCHMARK-METHODOLOGY.md)
|
|
67
|
+
and [results](https://github.com/ofri-peretz/eslint/blob/main/BENCHMARK-RESULTS.md).
|
|
68
|
+
|
|
69
|
+
<!-- AUTO-GENERATED:DOCTRINE:END -->
|
|
70
|
+
|
|
31
71
|
## Getting Started
|
|
32
72
|
|
|
33
73
|
- To check out the [guide](https://eslint.interlace.tools/docs/quality/plugin-import-next?utm_source=github&utm_medium=referral&utm_campaign=eslint-plugin-import-next), visit [eslint.interlace.tools](https://eslint.interlace.tools/?utm_source=github&utm_medium=referral&utm_campaign=eslint-plugin-import-next). 📚
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "eslint-plugin-import-next",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.4.0",
|
|
4
4
|
"description": "ESLint plugin for imports and module boundaries — drop-in replacement for eslint-plugin-import, 3.1x faster end-to-end, zero-config migration.",
|
|
5
5
|
"type": "commonjs",
|
|
6
6
|
"main": "./src/index.js",
|
|
@@ -76,7 +76,7 @@
|
|
|
76
76
|
"typescript": "^4.8.4 || ^5.0.0 || ^6.0.0"
|
|
77
77
|
},
|
|
78
78
|
"dependencies": {
|
|
79
|
-
"@interlace/eslint-devkit": "^1.
|
|
79
|
+
"@interlace/eslint-devkit": "^1.17.0",
|
|
80
80
|
"oxc-resolver": "^11.24.2"
|
|
81
81
|
},
|
|
82
82
|
"funding": {
|
package/src/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.clearCircularDependencyCache=exports.configs=exports.plugin=exports.rules=void 0;const no_cycle_1=require("./rules/no-cycle");Object.defineProperty(exports,"clearCircularDependencyCache",{enumerable:true,get:function(){return no_cycle_1.clearCircularDependencyCache}});exports.rules={get"no-duplicates"(){return require("./rules/no-duplicates").noDuplicates},get named(){return require("./rules/named").named},get default(){return require("./rules/default").defaultRule},get namespace(){return require("./rules/namespace").namespace},get extensions(){return require("./rules/extensions").extensions},get"no-self-import"(){return require("./rules/no-self-import").noSelfImport},get"no-unresolved"(){return require("./rules/no-unresolved").noUnresolved},get"no-absolute-path"(){return require("./rules/no-absolute-path").noAbsolutePath},get"no-dynamic-require"(){return require("./rules/no-dynamic-require").noDynamicRequire},get"no-relative-packages"(){return require("./rules/no-relative-packages").noRelativePackages},get"no-useless-path-segments"(){return require("./rules/no-useless-path-segments").noUselessPathSegments},get"no-amd"(){return require("./rules/no-amd").noAmd},get"no-commonjs"(){return require("./rules/no-commonjs").noCommonjs},get"no-nodejs-modules"(){return require("./rules/no-nodejs-modules").noNodejsModules},get"no-import-module-exports"(){return require("./rules/no-import-module-exports").noImportModuleExports},get unambiguous(){return require("./rules/unambiguous").unambiguous},get"no-cycle"(){return require("./rules/no-cycle").noCycle},get"no-internal-modules"(){return require("./rules/no-internal-modules").noInternalModules},get"no-cross-domain-imports"(){return require("./rules/no-cross-domain-imports").noCrossDomainImports},get"enforce-dependency-direction"(){return require("./rules/enforce-dependency-direction").enforceDependencyDirection},get"no-restricted-paths"(){return require("./rules/no-restricted-paths").noRestrictedPaths},get"no-relative-parent-imports"(){return require("./rules/no-relative-parent-imports").noRelativeParentImports},get export(){return require("./rules/export").exportRule},get"no-default-export"(){return require("./rules/no-default-export").noDefaultExport},get"no-named-export"(){return require("./rules/no-named-export").noNamedExport},get"prefer-default-export"(){return require("./rules/prefer-default-export").preferDefaultExport},get"no-anonymous-default-export"(){return require("./rules/no-anonymous-default-export").noAnonymousDefaultExport},get"no-mutable-exports"(){return require("./rules/no-mutable-exports").noMutableExports},get"no-deprecated"(){return require("./rules/no-deprecated").noDeprecated},get"exports-last"(){return require("./rules/exports-last").exportsLast},get"group-exports"(){return require("./rules/group-exports").groupExports},get"enforce-import-order"(){return require("./rules/enforce-import-order").enforceImportOrder},get order(){return require("./rules/enforce-import-order").enforceImportOrder},get"no-unassigned-import"(){return require("./rules/no-unassigned-import").noUnassignedImport},get first(){return require("./rules/first").first},get"newline-after-import"(){return require("./rules/newline-after-import").newlineAfterImport},get"no-empty-named-blocks"(){return require("./rules/no-empty-named-blocks").noEmptyNamedBlocks},get"no-named-as-default"(){return require("./rules/no-named-as-default").noNamedAsDefault},get"no-named-as-default-member"(){return require("./rules/no-named-as-default-member").noNamedAsDefaultMember},get"no-named-default"(){return require("./rules/no-named-default").noNamedDefault},get"no-namespace"(){return require("./rules/no-namespace").noNamespace},get"consistent-type-specifier-style"(){return require("./rules/consistent-type-specifier-style").consistentTypeSpecifierStyle},get"dynamic-import-chunkname"(){return require("./rules/dynamic-import-chunkname").dynamicImportChunkname},get"no-extraneous-dependencies"(){return require("./rules/no-extraneous-dependencies").noExtraneousDependencies},get"no-unused-modules"(){return require("./rules/no-unused-modules").noUnusedModules},get"max-dependencies"(){return require("./rules/max-dependencies").maxDependencies},get"prefer-node-protocol"(){return require("./rules/prefer-node-protocol").preferNodeProtocol},get"no-barrel-file"(){return require("./rules/no-barrel-file").noBarrelFile},get"no-barrel-import"(){return require("./rules/no-barrel-import").noBarrelImport},get"prefer-tree-shakeable-imports"(){return require("./rules/prefer-tree-shakeable-imports").preferTreeShakeableImports},get"prefer-direct-import"(){return require("./rules/prefer-direct-import").preferDirectImport},get"no-full-package-import"(){return require("./rules/no-full-package-import").noFullPackageImport},get"enforce-team-boundaries"(){return require("./rules/enforce-team-boundaries").enforceTeamBoundaries},get"no-legacy-imports"(){return require("./rules/no-legacy-imports").noLegacyImports},get"require-import-approval"(){return require("./rules/require-import-approval").requireImportApproval},get"prefer-modern-api"(){return require("./rules/prefer-modern-api").preferModernApi}};exports.plugin={meta:{name:"eslint-plugin-import-next",version:"2.3.18"},rules:exports.rules};exports.configs={flagship:{plugins:{"import-next":exports.plugin},rules:{"import-next/no-cycle":"error"}},recommended:{plugins:{"import-next":exports.plugin},rules:{"import-next/no-unresolved":"error","import-next/named":"error","import-next/default":"error","import-next/namespace":"warn","import-next/no-duplicates":"error","import-next/export":"error","import-next/no-cycle":"error","import-next/no-self-import":"error","import-next/no-named-as-default":"warn","import-next/no-named-as-default-member":"warn","import-next/no-amd":"warn","import-next/order":"warn","import-next/first":"warn","import-next/newline-after-import":"warn","import-next/no-empty-named-blocks":"warn","import-next/no-extraneous-dependencies":"warn"}},strict:{plugins:{"import-next":exports.plugin},rules:{"import-next/no-unresolved":"error","import-next/named":"error","import-next/default":"error","import-next/namespace":"error","import-next/extensions":"error","import-next/no-self-import":"error","import-next/no-duplicates":"error","import-next/no-absolute-path":"error","import-next/no-dynamic-require":"error","import-next/no-useless-path-segments":"error","import-next/export":"error","import-next/no-amd":"error","import-next/no-commonjs":"error","import-next/no-nodejs-modules":"error","import-next/no-import-module-exports":"error","import-next/unambiguous":"error","import-next/no-cycle":"error","import-next/no-internal-modules":"error","import-next/no-cross-domain-imports":"error","import-next/enforce-dependency-direction":"error","import-next/no-restricted-paths":"error","import-next/no-relative-parent-imports":"error","import-next/no-relative-packages":"error","import-next/no-anonymous-default-export":"error","import-next/no-mutable-exports":"error","import-next/no-deprecated":"error","import-next/exports-last":"error","import-next/group-exports":"error","import-next/order":"error","import-next/no-unassigned-import":"error","import-next/first":"error","import-next/newline-after-import":"error","import-next/no-empty-named-blocks":"error","import-next/no-named-as-default":"error","import-next/no-named-as-default-member":"error","import-next/no-named-default":"error","import-next/no-namespace":"error","import-next/consistent-type-specifier-style":"error","import-next/no-extraneous-dependencies":"error","import-next/no-unused-modules":"error","import-next/max-dependencies":"error","import-next/prefer-node-protocol":"error"}},typescript:{plugins:{"import-next":exports.plugin},rules:{"import-next/no-unresolved":"error","import-next/named":"off","import-next/default":"error","import-next/namespace":"error","import-next/export":"error","import-next/no-cycle":"error","import-next/no-duplicates":"error","import-next/order":"warn","import-next/first":"warn","import-next/newline-after-import":"warn","import-next/consistent-type-specifier-style":["warn","prefer-inline"]}},"module-resolution":{plugins:{"import-next":exports.plugin},rules:{"import-next/no-unresolved":"error","import-next/named":"error","import-next/default":"error","import-next/namespace":"error","import-next/extensions":"warn","import-next/no-self-import":"error","import-next/no-duplicates":"error","import-next/no-absolute-path":"error","import-next/no-useless-path-segments":"warn"}},"import-style":{plugins:{"import-next":exports.plugin},rules:{"import-next/order":"error","import-next/first":"error","import-next/newline-after-import":"error","import-next/no-duplicates":"error","import-next/no-unassigned-import":"warn","import-next/no-empty-named-blocks":"error","import-next/no-namespace":"warn"}},esm:{plugins:{"import-next":exports.plugin},rules:{"import-next/no-amd":"error","import-next/no-commonjs":"error","import-next/no-import-module-exports":"error","import-next/unambiguous":"error","import-next/prefer-node-protocol":"error"}},architecture:{plugins:{"import-next":exports.plugin},rules:{"import-next/no-cycle":"error","import-next/no-internal-modules":"error","import-next/no-cross-domain-imports":"error","import-next/enforce-dependency-direction":"error","import-next/no-restricted-paths":"error","import-next/no-relative-parent-imports":"warn","import-next/no-relative-packages":"error"}},errors:{plugins:{"import-next":exports.plugin},rules:{"import-next/no-unresolved":"error","import-next/named":"error","import-next/default":"error","import-next/namespace":"error","import-next/export":"error"}},warnings:{plugins:{"import-next":exports.plugin},rules:{"import-next/no-named-as-default":"warn","import-next/no-named-as-default-member":"warn","import-next/no-duplicates":"warn"}},performance:{plugins:{"import-next":exports.plugin},rules:{"import-next/no-barrel-file":"error","import-next/no-barrel-import":"warn","import-next/prefer-tree-shakeable-imports":"warn","import-next/prefer-direct-import":"warn","import-next/no-full-package-import":"warn","import-next/no-cycle":"error"}},enterprise:{plugins:{"import-next":exports.plugin},rules:{"import-next/enforce-team-boundaries":"off","import-next/no-legacy-imports":"off","import-next/no-cross-domain-imports":"warn","import-next/enforce-dependency-direction":"warn","import-next/no-internal-modules":"warn"}}};exports.default=exports.plugin;
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.clearCircularDependencyCache=exports.configs=exports.plugin=exports.rules=void 0;const no_cycle_1=require("./rules/no-cycle");Object.defineProperty(exports,"clearCircularDependencyCache",{enumerable:true,get:function(){return no_cycle_1.clearCircularDependencyCache}});exports.rules={get"no-duplicates"(){return require("./rules/no-duplicates").noDuplicates},get named(){return require("./rules/named").named},get default(){return require("./rules/default").defaultRule},get namespace(){return require("./rules/namespace").namespace},get extensions(){return require("./rules/extensions").extensions},get"no-self-import"(){return require("./rules/no-self-import").noSelfImport},get"no-unresolved"(){return require("./rules/no-unresolved").noUnresolved},get"no-absolute-path"(){return require("./rules/no-absolute-path").noAbsolutePath},get"no-dynamic-require"(){return require("./rules/no-dynamic-require").noDynamicRequire},get"no-relative-packages"(){return require("./rules/no-relative-packages").noRelativePackages},get"no-useless-path-segments"(){return require("./rules/no-useless-path-segments").noUselessPathSegments},get"no-amd"(){return require("./rules/no-amd").noAmd},get"no-commonjs"(){return require("./rules/no-commonjs").noCommonjs},get"no-nodejs-modules"(){return require("./rules/no-nodejs-modules").noNodejsModules},get"no-import-module-exports"(){return require("./rules/no-import-module-exports").noImportModuleExports},get unambiguous(){return require("./rules/unambiguous").unambiguous},get"no-cycle"(){return require("./rules/no-cycle").noCycle},get"no-internal-modules"(){return require("./rules/no-internal-modules").noInternalModules},get"no-cross-domain-imports"(){return require("./rules/no-cross-domain-imports").noCrossDomainImports},get"enforce-dependency-direction"(){return require("./rules/enforce-dependency-direction").enforceDependencyDirection},get"no-restricted-paths"(){return require("./rules/no-restricted-paths").noRestrictedPaths},get"no-relative-parent-imports"(){return require("./rules/no-relative-parent-imports").noRelativeParentImports},get export(){return require("./rules/export").exportRule},get"no-default-export"(){return require("./rules/no-default-export").noDefaultExport},get"no-named-export"(){return require("./rules/no-named-export").noNamedExport},get"prefer-default-export"(){return require("./rules/prefer-default-export").preferDefaultExport},get"no-anonymous-default-export"(){return require("./rules/no-anonymous-default-export").noAnonymousDefaultExport},get"no-mutable-exports"(){return require("./rules/no-mutable-exports").noMutableExports},get"no-deprecated"(){return require("./rules/no-deprecated").noDeprecated},get"exports-last"(){return require("./rules/exports-last").exportsLast},get"group-exports"(){return require("./rules/group-exports").groupExports},get"enforce-import-order"(){return require("./rules/enforce-import-order").enforceImportOrder},get order(){return require("./rules/enforce-import-order").enforceImportOrder},get"no-unassigned-import"(){return require("./rules/no-unassigned-import").noUnassignedImport},get first(){return require("./rules/first").first},get"newline-after-import"(){return require("./rules/newline-after-import").newlineAfterImport},get"no-empty-named-blocks"(){return require("./rules/no-empty-named-blocks").noEmptyNamedBlocks},get"no-named-as-default"(){return require("./rules/no-named-as-default").noNamedAsDefault},get"no-named-as-default-member"(){return require("./rules/no-named-as-default-member").noNamedAsDefaultMember},get"no-named-default"(){return require("./rules/no-named-default").noNamedDefault},get"no-namespace"(){return require("./rules/no-namespace").noNamespace},get"consistent-type-specifier-style"(){return require("./rules/consistent-type-specifier-style").consistentTypeSpecifierStyle},get"dynamic-import-chunkname"(){return require("./rules/dynamic-import-chunkname").dynamicImportChunkname},get"no-extraneous-dependencies"(){return require("./rules/no-extraneous-dependencies").noExtraneousDependencies},get"no-unused-modules"(){return require("./rules/no-unused-modules").noUnusedModules},get"max-dependencies"(){return require("./rules/max-dependencies").maxDependencies},get"prefer-node-protocol"(){return require("./rules/prefer-node-protocol").preferNodeProtocol},get"no-barrel-file"(){return require("./rules/no-barrel-file").noBarrelFile},get"no-barrel-import"(){return require("./rules/no-barrel-import").noBarrelImport},get"prefer-tree-shakeable-imports"(){return require("./rules/prefer-tree-shakeable-imports").preferTreeShakeableImports},get"prefer-direct-import"(){return require("./rules/prefer-direct-import").preferDirectImport},get"no-full-package-import"(){return require("./rules/no-full-package-import").noFullPackageImport},get"enforce-team-boundaries"(){return require("./rules/enforce-team-boundaries").enforceTeamBoundaries},get"no-legacy-imports"(){return require("./rules/no-legacy-imports").noLegacyImports},get"require-import-approval"(){return require("./rules/require-import-approval").requireImportApproval},get"prefer-modern-api"(){return require("./rules/prefer-modern-api").preferModernApi}};exports.plugin={meta:{name:"eslint-plugin-import-next",version:"2.4.0"},rules:exports.rules};exports.configs={flagship:{plugins:{"import-next":exports.plugin},rules:{"import-next/no-cycle":"error"}},recommended:{plugins:{"import-next":exports.plugin},rules:{"import-next/no-unresolved":"error","import-next/named":"error","import-next/default":"error","import-next/namespace":"warn","import-next/no-duplicates":"error","import-next/export":"error","import-next/no-cycle":"error","import-next/no-self-import":"error","import-next/no-named-as-default":"warn","import-next/no-named-as-default-member":"warn","import-next/no-amd":"warn","import-next/no-empty-named-blocks":"warn","import-next/no-extraneous-dependencies":"warn"}},strict:{plugins:{"import-next":exports.plugin},rules:{"import-next/no-unresolved":"error","import-next/named":"error","import-next/default":"error","import-next/namespace":"error","import-next/extensions":"error","import-next/no-self-import":"error","import-next/no-duplicates":"error","import-next/no-absolute-path":"error","import-next/no-dynamic-require":"error","import-next/no-useless-path-segments":"error","import-next/export":"error","import-next/no-amd":"error","import-next/no-commonjs":"error","import-next/no-nodejs-modules":"error","import-next/no-import-module-exports":"error","import-next/unambiguous":"error","import-next/no-cycle":"error","import-next/no-internal-modules":"error","import-next/no-cross-domain-imports":"error","import-next/enforce-dependency-direction":"error","import-next/no-restricted-paths":"error","import-next/no-relative-parent-imports":"error","import-next/no-relative-packages":"error","import-next/no-anonymous-default-export":"error","import-next/no-mutable-exports":"error","import-next/no-deprecated":"error","import-next/exports-last":"error","import-next/group-exports":"error","import-next/order":"error","import-next/no-unassigned-import":"error","import-next/first":"error","import-next/newline-after-import":"error","import-next/no-empty-named-blocks":"error","import-next/no-named-as-default":"error","import-next/no-named-as-default-member":"error","import-next/no-named-default":"error","import-next/no-namespace":"error","import-next/consistent-type-specifier-style":"error","import-next/no-extraneous-dependencies":"error","import-next/no-unused-modules":"error","import-next/max-dependencies":"error","import-next/prefer-node-protocol":"error"}},typescript:{plugins:{"import-next":exports.plugin},rules:{"import-next/no-unresolved":"error","import-next/named":"off","import-next/default":"error","import-next/namespace":"error","import-next/export":"error","import-next/no-cycle":"error","import-next/no-duplicates":"error","import-next/order":"warn","import-next/first":"warn","import-next/newline-after-import":"warn","import-next/consistent-type-specifier-style":["warn","prefer-inline"]}},"module-resolution":{plugins:{"import-next":exports.plugin},rules:{"import-next/no-unresolved":"error","import-next/named":"error","import-next/default":"error","import-next/namespace":"error","import-next/extensions":"warn","import-next/no-self-import":"error","import-next/no-duplicates":"error","import-next/no-absolute-path":"error","import-next/no-useless-path-segments":"warn"}},"import-style":{plugins:{"import-next":exports.plugin},rules:{"import-next/order":"error","import-next/first":"error","import-next/newline-after-import":"error","import-next/no-duplicates":"error","import-next/no-unassigned-import":"warn","import-next/no-empty-named-blocks":"error","import-next/no-namespace":"warn"}},esm:{plugins:{"import-next":exports.plugin},rules:{"import-next/no-amd":"error","import-next/no-commonjs":"error","import-next/no-import-module-exports":"error","import-next/unambiguous":"error","import-next/prefer-node-protocol":"error"}},architecture:{plugins:{"import-next":exports.plugin},rules:{"import-next/no-cycle":"error","import-next/no-internal-modules":"error","import-next/no-cross-domain-imports":"error","import-next/enforce-dependency-direction":"error","import-next/no-restricted-paths":"error","import-next/no-relative-parent-imports":"warn","import-next/no-relative-packages":"error"}},errors:{plugins:{"import-next":exports.plugin},rules:{"import-next/no-unresolved":"error","import-next/named":"error","import-next/default":"error","import-next/namespace":"error","import-next/export":"error"}},warnings:{plugins:{"import-next":exports.plugin},rules:{"import-next/no-named-as-default":"warn","import-next/no-named-as-default-member":"warn","import-next/no-duplicates":"warn"}},performance:{plugins:{"import-next":exports.plugin},rules:{"import-next/no-barrel-file":"error","import-next/no-barrel-import":"warn","import-next/prefer-tree-shakeable-imports":"warn","import-next/prefer-direct-import":"warn","import-next/no-full-package-import":"warn","import-next/no-cycle":"error"}},enterprise:{plugins:{"import-next":exports.plugin},rules:{"import-next/enforce-team-boundaries":"off","import-next/no-legacy-imports":"off","import-next/no-cross-domain-imports":"warn","import-next/enforce-dependency-direction":"warn","import-next/no-internal-modules":"warn"}}};exports.default=exports.plugin;
|
package/src/rules/export.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.exportRule=void 0;const eslint_devkit_1=require("@interlace/eslint-devkit");exports.exportRule=(0,eslint_devkit_1.createRule)({name:"export",meta:{type:"problem",docs:{url:"https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/export.md",description:"Forbid any invalid exports, i.e. re-export of the same name",cwe:"CWE-694",cvss:7.5},messages:{duplicateExport:(0,eslint_devkit_1.formatLLMMessage)({icon:eslint_devkit_1.MessageIcons.ARCHITECTURE,issueName:"Duplicate Export",cwe:"CWE-694",description:'Multiple exports of name "{{name}}"',severity:"HIGH",fix:"Remove duplicate export or rename one of them",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/export.md"}),duplicateDefault:(0,eslint_devkit_1.formatLLMMessage)({icon:eslint_devkit_1.MessageIcons.ARCHITECTURE,issueName:"Duplicate Default Export",cwe:"CWE-694",description:"Multiple default exports",severity:"HIGH",fix:"A module can only have one default export",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/export.md"})},schema:[]},defaultOptions:[],create(context){const
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.exportRule=void 0;const eslint_devkit_1=require("@interlace/eslint-devkit");exports.exportRule=(0,eslint_devkit_1.createRule)({name:"export",meta:{type:"problem",docs:{url:"https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/export.md",description:"Forbid any invalid exports, i.e. re-export of the same name",cwe:"CWE-694",cvss:7.5},messages:{duplicateExport:(0,eslint_devkit_1.formatLLMMessage)({icon:eslint_devkit_1.MessageIcons.ARCHITECTURE,issueName:"Duplicate Export",cwe:"CWE-694",description:'Multiple exports of name "{{name}}"',severity:"HIGH",fix:"Remove duplicate export or rename one of them",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/export.md"}),duplicateDefault:(0,eslint_devkit_1.formatLLMMessage)({icon:eslint_devkit_1.MessageIcons.ARCHITECTURE,issueName:"Duplicate Default Export",cwe:"CWE-694",description:"Multiple default exports",severity:"HIGH",fix:"A module can only have one default export",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/export.md"})},schema:[]},defaultOptions:[],create(context){const valueNames=new Map;const typeNames=new Map;const mergeableInterfaces=new Set;let hasDefaultExport=null;function scopeKey(node){const parts=[];let current=node.parent;while(current){if(current.type==="TSModuleDeclaration"){const id=current.id;if(id.type==="Identifier"){parts.push(id.name)}else if(id.type==="Literal"){parts.push(String(id.value))}else{parts.push(context.sourceCode.getText(id))}}current=current.parent}return parts.length>0?`${parts.reverse().join(".")}.`:""}function checkAndAddExport(rawName,node,space="value"){const name=`${scopeKey(node)}${rawName}`;if(space==="interface"){const clash=typeNames.get(name);if(clash&&!mergeableInterfaces.has(name)){context.report({node,messageId:"duplicateExport",data:{name:rawName}});return}mergeableInterfaces.add(name);typeNames.set(name,node);return}const bucket=space==="type"?typeNames:valueNames;if(bucket.has(name)){context.report({node,messageId:"duplicateExport",data:{name:rawName}});return}bucket.set(name,node)}function checkDefaultExport(node){if(hasDefaultExport){context.report({node,messageId:"duplicateDefault"})}else{hasDefaultExport=node}}return{ExportDefaultDeclaration(node){checkDefaultExport(node)},ExportNamedDeclaration(node){if(node.declaration){if(node.declaration.type===eslint_devkit_1.AST_NODE_TYPES.VariableDeclaration){node.declaration.declarations.forEach(decl=>{if(decl.id.type===eslint_devkit_1.AST_NODE_TYPES.Identifier){checkAndAddExport(decl.id.name,node)}})}else if(node.declaration.type===eslint_devkit_1.AST_NODE_TYPES.FunctionDeclaration||node.declaration.type===eslint_devkit_1.AST_NODE_TYPES.ClassDeclaration){if(node.declaration.id){checkAndAddExport(node.declaration.id.name,node)}}else if(node.declaration.type===eslint_devkit_1.AST_NODE_TYPES.TSInterfaceDeclaration){checkAndAddExport(node.declaration.id.name,node,"interface")}else if(node.declaration.type===eslint_devkit_1.AST_NODE_TYPES.TSTypeAliasDeclaration){checkAndAddExport(node.declaration.id.name,node,"type")}else if(node.declaration.type===eslint_devkit_1.AST_NODE_TYPES.TSEnumDeclaration){const enumName=node.declaration.id.name;const scopedEnum=`${scopeKey(node)}${enumName}`;if(valueNames.has(scopedEnum)||typeNames.has(scopedEnum)){context.report({node,messageId:"duplicateExport",data:{name:enumName}})}else{valueNames.set(scopedEnum,node);typeNames.set(scopedEnum,node)}}}node.specifiers.forEach(spec=>{const exportedName=spec.exported.type===eslint_devkit_1.AST_NODE_TYPES.Identifier?spec.exported.name:spec.exported.value;if(exportedName==="default"){checkDefaultExport(spec)}else{const isTypeOnly=node.exportKind==="type"||spec.exportKind==="type";checkAndAddExport(exportedName,spec,isTypeOnly?"type":"value")}})},ExportAllDeclaration(node){if(node.exported){const exportedName=node.exported.name;checkAndAddExport(exportedName,node)}}}}});
|
package/src/rules/no-cycle.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.noCycle=void 0;exports.clearCircularDependencyCache=clearCircularDependencyCache;const eslint_devkit_1=require("@interlace/eslint-devkit");const eslint_devkit_2=require("@interlace/eslint-devkit");const eslint_devkit_3=require("@interlace/eslint-devkit");const node_fs_1=require("node:fs");const eslint_devkit_4=require("@interlace/eslint-devkit");const sharedCache=(0,eslint_devkit_4.createFileSystemCache)();function clearCircularDependencyCache(){(0,eslint_devkit_4.clearCache)(sharedCache)}exports.noCycle=(0,eslint_devkit_1.createRule)({name:"no-cycle",meta:{type:"problem",docs:{url:"https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-cycle.md",description:"Detect circular dependencies that cause bundle memory bloat and initialization issues",cwe:"CWE-
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.noCycle=void 0;exports.clearCircularDependencyCache=clearCircularDependencyCache;const eslint_devkit_1=require("@interlace/eslint-devkit");const eslint_devkit_2=require("@interlace/eslint-devkit");const eslint_devkit_3=require("@interlace/eslint-devkit");const node_fs_1=require("node:fs");const eslint_devkit_4=require("@interlace/eslint-devkit");const sharedCache=(0,eslint_devkit_4.createFileSystemCache)();function clearCircularDependencyCache(){(0,eslint_devkit_4.clearCache)(sharedCache)}exports.noCycle=(0,eslint_devkit_1.createRule)({name:"no-cycle",meta:{type:"problem",docs:{url:"https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-cycle.md",description:"Detect circular dependencies that cause bundle memory bloat and initialization issues",cwe:"CWE-1047",confidence:"high"},messages:{moduleSplit:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Circular dependency",cwe:"CWE-1047",description:"Circular dependency detected",severity:"MEDIUM",fix:"Split {{moduleToSplit}} into .{{coreFile}} and .{{extendedFile}}",documentationLink:"https://en.wikipedia.org/wiki/Circular_dependency"}),directImport:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Circular dependency",cwe:"CWE-1047",description:"Circular dependency detected",severity:"MEDIUM",fix:"{{newImport}} (direct imports preferred over barrel exports)",documentationLink:"https://en.wikipedia.org/wiki/Circular_dependency"}),extractShared:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Circular dependency",cwe:"CWE-1047",description:"Circular dependency detected",severity:"MEDIUM",fix:"Extract shared types to {{exports}} file",documentationLink:"https://en.wikipedia.org/wiki/Dependency_inversion_principle"}),dependencyInjection:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Circular dependency",cwe:"CWE-1047",description:"Circular dependency detected",severity:"MEDIUM",fix:"Use dependency injection pattern to break cycle",documentationLink:"https://en.wikipedia.org/wiki/Dependency_injection"})},schema:[{type:"object",properties:{maxDepth:{type:"number",default:Number.MAX_SAFE_INTEGER,description:"Maximum depth to traverse when detecting cycles. Default: unlimited (matches eslint-plugin-import and oxlint). Lower values are a performance escape hatch \u2014 but with our nonCyclicFiles cache, traversal cost is amortized, and a low cap silently misses cycles deeper than the limit. Set to a finite number only on huge graphs where the bench latency hurts you."},ignorePatterns:{type:"array",items:{type:"string"},default:["**/*.test.ts","**/*.test.tsx","**/*.spec.ts","**/*.spec.tsx","**/*.stories.tsx","**/__tests__/**","**/__mocks__/**"],description:"File patterns to ignore (glob patterns)"},barrelExports:{type:"array",items:{type:"string"},default:["index.ts","index.tsx","index.js","index.jsx"],description:"Files considered barrel exports"},reportAllCycles:{type:"boolean",default:true,description:"Report all circular dependencies found (not just the first one)"},fixStrategy:{type:"string",enum:["module-split","direct-import","extract-shared","dependency-injection","auto"],default:"auto",description:"Strategy for fixing circular dependencies (auto = smart detection)"},moduleNamingConvention:{type:"string",enum:["semantic","numbered"],default:"semantic",description:"Naming convention for split modules (semantic: .core, .api | numbered: .1, .2)"},coreModuleSuffix:{type:"string",default:"core",description:'Suffix for core module when splitting (e.g., "core", "base", "main")'},extendedModuleSuffix:{type:"string",default:"extended",description:'Suffix for extended module when splitting (e.g., "extended", "api", "helpers")'}},additionalProperties:false}],fixable:void 0},defaultOptions:[{maxDepth:Infinity,ignorePatterns:[],barrelExports:["index.ts","index.tsx","index.js","index.jsx"],reportAllCycles:true,fixStrategy:"auto",moduleNamingConvention:"semantic",coreModuleSuffix:"core",extendedModuleSuffix:"extended"}],create(context){const options=context.options[0]||{};const maxDepth=options.maxDepth??Infinity;const ignorePatterns=options.ignorePatterns??["**/*.test.ts","**/*.test.tsx","**/*.spec.ts","**/*.spec.tsx","**/*.stories.tsx","**/__tests__/**","**/__mocks__/**"];const barrelExports=options.barrelExports??["index.ts","index.tsx","index.js","index.jsx"];const _reportAllCycles=options.reportAllCycles??true;const fixStrategy=options.fixStrategy??"auto";const moduleNamingConvention=options.moduleNamingConvention??"semantic";const coreModuleSuffix=options.coreModuleSuffix??"core";const extendedModuleSuffix=options.extendedModuleSuffix??"extended";const filename=context.filename;const normalizedFilename=(()=>{try{return(0,node_fs_1.realpathSync)(filename)}catch{return filename}})();const workspaceRoot=context.cwd;const settings=context.settings;const resolverSettings=settings?.["import/resolver"]||settings?.["import-next/resolver"];if((0,eslint_devkit_3.shouldIgnoreFile)(filename,ignorePatterns,sharedCache.compiledPatterns)){return{}}sharedCache.pendingCycleReports.clear();const reportedImportNodes=new Set;function selectFixStrategy(cycle,userStrategy){if(userStrategy!=="auto"){return userStrategy}const hasBarrel=cycle.some(file=>(0,eslint_devkit_3.isBarrelExport)(file,barrelExports));const typesOnly=(0,eslint_devkit_4.hasOnlyTypeImports)(cycle,sharedCache);const cycleSize=cycle.length;if(hasBarrel&&cycleSize===2){return"direct-import"}if(typesOnly){return"extract-shared"}return"module-split"}function generateModuleSplitMessage(cycle){const moduleNames=(0,eslint_devkit_3.getModuleNames)(cycle,workspaceRoot);const[module1,module2]=moduleNames;const moduleToSplit=module1;const suffix1=moduleNamingConvention==="semantic"?`.${coreModuleSuffix}`:".1";const suffix2=moduleNamingConvention==="semantic"?`.${extendedModuleSuffix}`:".2";return{cycle:(0,eslint_devkit_3.formatCycleDisplay)(cycle,workspaceRoot),moduleToSplit,coreFile:coreModuleSuffix,extendedFile:extendedModuleSuffix,splitCount:"2",fileStructure:`\u251C\u2500 ${moduleToSplit}/${moduleToSplit}${suffix1}.ts (\u2192 ${module2} \u2713)
|
|
2
2
|
\u2514\u2500 ${moduleToSplit}/${moduleToSplit}${suffix2}.ts (\u2192 ${suffix1} + ${module2} \u2713)`,result:`${suffix1} \u2192 ${module2} \u2192 ${suffix2} (no cycle)`}}function generateDirectImportMessage(cycle,sourceImport){const currentFile=(0,eslint_devkit_3.getBasename)(context.filename);const targetFile=cycle[1];const relativeImport=(0,eslint_devkit_3.getRelativeImportPath)(context.filename,targetFile);return{cycle:(0,eslint_devkit_3.formatCycleDisplay)(cycle,workspaceRoot),currentFile,oldImport:`import { ... } from '${sourceImport.source}'`,newImport:`import { ... } from '${relativeImport}'`}}function generateExtractSharedMessage(cycle){const moduleNames=(0,eslint_devkit_3.getModuleNames)(cycle,workspaceRoot);const[module1,module2]=moduleNames;const exports2=[`- export type ${module1}Id, ${module2}Id`,`- export interface ${module1}Summary, ${module2}Summary`].join("\n");return{cycle:(0,eslint_devkit_3.formatCycleDisplay)(cycle,workspaceRoot),exports:exports2,result:`shared/types \u2190 ${module1}, ${module2} (no cycle)`}}function generateDependencyInjectionMessage(cycle){const moduleNames=(0,eslint_devkit_3.getModuleNames)(cycle,workspaceRoot);const[service1,service2]=moduleNames;const steps=[`1. Create interfaces/I${service1}.ts, interfaces/I${service2}.ts`,`2. Both services implement their interface`,`3. Inject via constructor: constructor(private dep?: IDep)`,`4. Wire in container.ts`].join("\n");return{cycle:(0,eslint_devkit_3.formatCycleDisplay)(cycle,workspaceRoot),steps}}function generateMessageData(cycle,strategy,sourceImport){switch(strategy){case"direct-import":return{messageId:"directImport",data:generateDirectImportMessage(cycle,sourceImport)};case"extract-shared":return{messageId:"extractShared",data:generateExtractSharedMessage(cycle)};case"dependency-injection":return{messageId:"dependencyInjection",data:generateDependencyInjectionMessage(cycle)};default:return{messageId:"moduleSplit",data:generateModuleSplitMessage(cycle)}}}return{"Program"(){},ImportDeclaration(node){if(node.importKind==="type")return;if(reportedImportNodes.has(node))return;const importSource=node.source.value;const resolved=(0,eslint_devkit_4.resolveImportPath)(importSource,{fromFile:normalizedFilename,workspaceRoot,barrelExports,cache:sharedCache,resolverSettings});if(!resolved)return;if(sharedCache.nonCyclicFiles.has(resolved))return;let tgtSCC=sharedCache.sccIndex.get(resolved);if(tgtSCC===void 0){(0,eslint_devkit_4.computeSCCsFromFile)(resolved,{maxDepth:Infinity,workspaceRoot,barrelExports,cache:sharedCache,resolverSettings});tgtSCC=sharedCache.sccIndex.get(resolved)}let srcSCC=sharedCache.sccIndex.get(normalizedFilename);if(srcSCC===void 0){(0,eslint_devkit_4.computeSCCsFromFile)(normalizedFilename,{maxDepth:Infinity,workspaceRoot,barrelExports,cache:sharedCache,resolverSettings});srcSCC=sharedCache.sccIndex.get(normalizedFilename)}if(srcSCC===void 0||tgtSCC===void 0||srcSCC!==tgtSCC){return}const cyclePath=(0,eslint_devkit_4.findShortestCyclePath)(normalizedFilename,resolved,{maxDepth,workspaceRoot,barrelExports,cache:sharedCache,resolverSettings});if(!cyclePath)return;reportedImportNodes.add(node);const cycleStart=cyclePath.indexOf(normalizedFilename);const relevantCycle=cycleStart>=0?[...cyclePath.slice(cycleStart),...cyclePath.slice(0,cycleStart)]:cyclePath;const strategy=selectFixStrategy(relevantCycle,fixStrategy);const sourceImport={path:resolved,source:importSource};const{messageId,data}=generateMessageData(relevantCycle,strategy,sourceImport);context.report({node,messageId,data})},ExportNamedDeclaration(node){if(!node.source)return;if(reportedImportNodes.has(node))return;const importSource=node.source.value;const resolved=(0,eslint_devkit_4.resolveImportPath)(importSource,{fromFile:normalizedFilename,workspaceRoot,barrelExports,cache:sharedCache,resolverSettings});if(!resolved)return;if(sharedCache.nonCyclicFiles.has(resolved))return;let tgtSCC=sharedCache.sccIndex.get(resolved);if(tgtSCC===void 0){(0,eslint_devkit_4.computeSCCsFromFile)(resolved,{maxDepth:Infinity,workspaceRoot,barrelExports,cache:sharedCache,resolverSettings});tgtSCC=sharedCache.sccIndex.get(resolved)}const srcSCC=sharedCache.sccIndex.get(normalizedFilename);if(srcSCC===void 0||tgtSCC===void 0||srcSCC!==tgtSCC)return;const cyclePath=(0,eslint_devkit_4.findShortestCyclePath)(normalizedFilename,resolved,{maxDepth,workspaceRoot,barrelExports,cache:sharedCache,resolverSettings});if(!cyclePath)return;reportedImportNodes.add(node);const cycleStart=cyclePath.indexOf(normalizedFilename);const relevantCycle=cycleStart>=0?[...cyclePath.slice(cycleStart),...cyclePath.slice(0,cycleStart)]:cyclePath;const strategy=selectFixStrategy(relevantCycle,fixStrategy);const sourceImport={path:resolved,source:importSource};const{messageId,data}=generateMessageData(relevantCycle,strategy,sourceImport);context.report({node,messageId,data})}}}});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.noDuplicates=void 0;const eslint_devkit_1=require("@interlace/eslint-devkit");const eslint_devkit_2=require("@interlace/eslint-devkit");exports.noDuplicates=(0,eslint_devkit_1.createRule)({name:"no-duplicates",meta:{type:"problem",docs:{url:"https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-duplicates.md",description:"Reports duplicate imports"},fixable:"code",messages:{noDuplicates:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.QUALITY,issueName:"Duplicate Import",description:"Duplicate import from the same module",severity:"HIGH",fix:"Merge imports into a single statement",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-duplicates.md"})},schema:[]},defaultOptions:[],create(context){const imports=new Map;return{ImportDeclaration(node){const source
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.noDuplicates=void 0;const eslint_devkit_1=require("@interlace/eslint-devkit");const eslint_devkit_2=require("@interlace/eslint-devkit");exports.noDuplicates=(0,eslint_devkit_1.createRule)({name:"no-duplicates",meta:{type:"problem",docs:{url:"https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-duplicates.md",description:"Reports duplicate imports"},fixable:"code",messages:{noDuplicates:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.QUALITY,issueName:"Duplicate Import",description:"Duplicate import from the same module",severity:"HIGH",fix:"Merge imports into a single statement",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-duplicates.md"})},schema:[]},defaultOptions:[],create(context){const imports=new Map;return{ImportDeclaration(node){const source=`${node.source.value}\0${node.importKind??"value"}`;let sourceNodes=imports.get(source);if(!sourceNodes){sourceNodes=[];imports.set(source,sourceNodes)}sourceNodes.push(node)},"Program:exit"(){for(const nodes of imports.values()){if(nodes.length>1){const[first,...duplicates]=nodes;for(const duplicate of duplicates){context.report({node:duplicate,messageId:"noDuplicates",fix(fixer){const firstHasDefault=first.specifiers.some(s=>s.type==="ImportDefaultSpecifier");const duplicateHasDefault=duplicate.specifiers.some(s=>s.type==="ImportDefaultSpecifier");const firstHasNamespace=first.specifiers.some(s=>s.type==="ImportNamespaceSpecifier");const duplicateHasNamespace=duplicate.specifiers.some(s=>s.type==="ImportNamespaceSpecifier");if(firstHasNamespace||duplicateHasNamespace){return null}if(firstHasDefault&&duplicateHasDefault){return null}if(duplicate.specifiers.length===0){return fixer.remove(duplicate)}if(first.specifiers.length===0){return null}const sourceCode=context.sourceCode;const specifiersToAdd=duplicate.specifiers.map(s=>sourceCode.getText(s));const lastSpecifier=first.specifiers[first.specifiers.length-1];const replacement=`, ${specifiersToAdd.join(", ")}`;return[fixer.insertTextAfter(lastSpecifier,replacement),fixer.remove(duplicate)]}})}}}}}}});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.noExtraneousDependencies=void 0;const eslint_devkit_1=require("@interlace/eslint-devkit");const eslint_devkit_2=require("@interlace/eslint-devkit");const eslint_devkit_3=require("@interlace/eslint-devkit");const eslint_devkit_4=require("@interlace/eslint-devkit");exports.noExtraneousDependencies=(0,eslint_devkit_1.createRule)({name:"no-extraneous-dependencies",meta:{type:"problem",docs:{url:"https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-extraneous-dependencies.md",description:"Forbid the use of extraneous packages not listed in package.json"},hasSuggestions:true,messages:{extraneousDependency:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.WARNING,issueName:"Extraneous Dependency",description:"Package not listed in package.json dependencies",severity:"HIGH",fix:"Add package to package.json or remove the import",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-extraneous-dependencies.md"}),missingDependency:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.WARNING,issueName:"Missing Dependency",description:"Package used but not in package.json",severity:"HIGH",fix:"Add package to appropriate section in package.json",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-extraneous-dependencies.md"}),devDependencyInProduction:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.WARNING,issueName:"Dev Dependency in Production",description:"Dev dependency used in production code",severity:"MEDIUM",fix:"Move to dependencies or ensure this is only used in development",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-extraneous-dependencies.md"}),addToDependencies:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Add to Dependencies",description:"Add package to dependencies in package.json",severity:"HIGH",fix:"Run: npm install <package>",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-extraneous-dependencies.md"}),addToDevDependencies:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Add to Dev Dependencies",description:"Add package to devDependencies in package.json",severity:"HIGH",fix:"Run: npm install --save-dev <package>",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-extraneous-dependencies.md"}),moveToDependencies:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Move to Dependencies",description:"Move package from devDependencies to dependencies",severity:"MEDIUM",fix:"Move package from devDependencies to dependencies in package.json",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-extraneous-dependencies.md"})},schema:[{type:"object",properties:{devDependencies:{type:"boolean",default:true,description:"Allow imports from devDependencies."},optionalDependencies:{type:"boolean",default:true,description:"Allow imports from optionalDependencies."},peerDependencies:{type:"boolean",default:true,description:"Allow imports from peerDependencies."},bundledDependencies:{type:"boolean",default:true,description:"Allow imports from bundledDependencies."},packageJsonPath:{type:"string",description:"Path to package.json file to use."},packageJson:{type:"object",description:"Direct package.json content for testing."},resolutionStrategy:{type:"string",enum:["strict","workspace","monorepo"],default:"strict",description:"Dependency resolution strategy: strict (exact match), workspace (allow workspace packages), monorepo (cross-package resolution)."},allowPatterns:{type:"array",items:{type:"string"},description:"Regex patterns for packages to allow even if not in package.json."},ignore:{type:"array",items:{type:"string"},description:"Specific package names to ignore (don't report as missing)."}},additionalProperties:false}]},defaultOptions:[{devDependencies:true,optionalDependencies:true,peerDependencies:true,bundledDependencies:true,resolutionStrategy:"strict",allowPatterns:[]}],create(context){const[options]=context.options;const{devDependencies=true,optionalDependencies=true,peerDependencies=true,bundledDependencies=true,packageJsonPath,packageJson,resolutionStrategy="strict",allowPatterns=[]}=options||{};const filename=context.filename;if(!filename){return{}}let resolvedPackageJson=null;if(packageJson){resolvedPackageJson=packageJson}else if(packageJsonPath){resolvedPackageJson=(0,eslint_devkit_3.readJsonFileSync)(packageJsonPath);if(!resolvedPackageJson){return{}}}else{const packageJsonFile=(0,eslint_devkit_3.findFileUpward)("package.json",(0,eslint_devkit_4.getDirname)(filename));if(!packageJsonFile){return{}}resolvedPackageJson=(0,eslint_devkit_3.readJsonFileSync)(packageJsonFile);if(!resolvedPackageJson){return{}}}const allowedPackages=new Set;if(resolvedPackageJson?.dependencies){Object.keys(resolvedPackageJson.dependencies).forEach(pkg=>allowedPackages.add(pkg))}if(devDependencies&&resolvedPackageJson?.devDependencies){Object.keys(resolvedPackageJson.devDependencies).forEach(pkg=>allowedPackages.add(pkg))}if(optionalDependencies&&resolvedPackageJson?.optionalDependencies){Object.keys(resolvedPackageJson.optionalDependencies).forEach(pkg=>allowedPackages.add(pkg))}if(peerDependencies&&resolvedPackageJson?.peerDependencies){Object.keys(resolvedPackageJson.peerDependencies).forEach(pkg=>allowedPackages.add(pkg))}if(bundledDependencies&&resolvedPackageJson?.bundledDependencies){resolvedPackageJson.bundledDependencies.forEach(pkg=>allowedPackages.add(pkg))}function isExternalPackage(importPath){if(
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.noExtraneousDependencies=void 0;const eslint_devkit_1=require("@interlace/eslint-devkit");const eslint_devkit_2=require("@interlace/eslint-devkit");const eslint_devkit_3=require("@interlace/eslint-devkit");const eslint_devkit_4=require("@interlace/eslint-devkit");exports.noExtraneousDependencies=(0,eslint_devkit_1.createRule)({name:"no-extraneous-dependencies",meta:{type:"problem",docs:{url:"https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-extraneous-dependencies.md",description:"Forbid the use of extraneous packages not listed in package.json"},hasSuggestions:true,messages:{extraneousDependency:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.WARNING,issueName:"Extraneous Dependency",description:"Package not listed in package.json dependencies",severity:"HIGH",fix:"Add package to package.json or remove the import",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-extraneous-dependencies.md"}),missingDependency:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.WARNING,issueName:"Missing Dependency",description:"Package used but not in package.json",severity:"HIGH",fix:"Add package to appropriate section in package.json",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-extraneous-dependencies.md"}),devDependencyInProduction:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.WARNING,issueName:"Dev Dependency in Production",description:"Dev dependency used in production code",severity:"MEDIUM",fix:"Move to dependencies or ensure this is only used in development",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-extraneous-dependencies.md"}),addToDependencies:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Add to Dependencies",description:"Add package to dependencies in package.json",severity:"HIGH",fix:"Run: npm install <package>",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-extraneous-dependencies.md"}),addToDevDependencies:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Add to Dev Dependencies",description:"Add package to devDependencies in package.json",severity:"HIGH",fix:"Run: npm install --save-dev <package>",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-extraneous-dependencies.md"}),moveToDependencies:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Move to Dependencies",description:"Move package from devDependencies to dependencies",severity:"MEDIUM",fix:"Move package from devDependencies to dependencies in package.json",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-extraneous-dependencies.md"})},schema:[{type:"object",properties:{devDependencies:{type:"boolean",default:true,description:"Allow imports from devDependencies."},optionalDependencies:{type:"boolean",default:true,description:"Allow imports from optionalDependencies."},peerDependencies:{type:"boolean",default:true,description:"Allow imports from peerDependencies."},bundledDependencies:{type:"boolean",default:true,description:"Allow imports from bundledDependencies."},packageJsonPath:{type:"string",description:"Path to package.json file to use."},packageJson:{type:"object",description:"Direct package.json content for testing."},resolutionStrategy:{type:"string",enum:["strict","workspace","monorepo"],default:"strict",description:"Dependency resolution strategy: strict (exact match), workspace (allow workspace packages), monorepo (cross-package resolution)."},allowPatterns:{type:"array",items:{type:"string"},description:"Regex patterns for packages to allow even if not in package.json."},ignore:{type:"array",items:{type:"string"},description:"Specific package names to ignore (don't report as missing)."}},additionalProperties:false}]},defaultOptions:[{devDependencies:true,optionalDependencies:true,peerDependencies:true,bundledDependencies:true,resolutionStrategy:"strict",allowPatterns:[]}],create(context){const[options]=context.options;const{devDependencies=true,optionalDependencies=true,peerDependencies=true,bundledDependencies=true,packageJsonPath,packageJson,resolutionStrategy="strict",allowPatterns=[]}=options||{};const filename=context.filename;if(!filename){return{}}let resolvedPackageJson=null;if(packageJson){resolvedPackageJson=packageJson}else if(packageJsonPath){resolvedPackageJson=(0,eslint_devkit_3.readJsonFileSync)(packageJsonPath);if(!resolvedPackageJson){return{}}}else{const packageJsonFile=(0,eslint_devkit_3.findFileUpward)("package.json",(0,eslint_devkit_4.getDirname)(filename));if(!packageJsonFile){return{}}resolvedPackageJson=(0,eslint_devkit_3.readJsonFileSync)(packageJsonFile);if(!resolvedPackageJson){return{}}}const allowedPackages=new Set;if(resolvedPackageJson?.dependencies){Object.keys(resolvedPackageJson.dependencies).forEach(pkg=>allowedPackages.add(pkg))}if(devDependencies&&resolvedPackageJson?.devDependencies){Object.keys(resolvedPackageJson.devDependencies).forEach(pkg=>allowedPackages.add(pkg))}if(optionalDependencies&&resolvedPackageJson?.optionalDependencies){Object.keys(resolvedPackageJson.optionalDependencies).forEach(pkg=>allowedPackages.add(pkg))}if(peerDependencies&&resolvedPackageJson?.peerDependencies){Object.keys(resolvedPackageJson.peerDependencies).forEach(pkg=>allowedPackages.add(pkg))}if(bundledDependencies&&resolvedPackageJson?.bundledDependencies){resolvedPackageJson.bundledDependencies.forEach(pkg=>allowedPackages.add(pkg))}function isExternalPackage(importPath){if(/^\.\.?(\/|$)/.test(importPath)){return null}if(importPath.startsWith("/")){return null}if(importPath.startsWith("#")){return null}const nodeBuiltins=["assert","buffer","child_process","cluster","crypto","dgram","dns","domain","events","fs","http","https","net","os","path","punycode","querystring","readline","stream","string_decoder","timers","tls","tty","url","util","v8","vm","zlib","node:assert","node:buffer","node:child_process","node:cluster","node:crypto","node:dgram","node:dns","node:domain","node:events","node:fs","node:http","node:https","node:net","node:os","node:path","node:punycode","node:querystring","node:readline","node:stream","node:string_decoder","node:timers","node:tls","node:tty","node:url","node:util","node:v8","node:vm","node:zlib"];if(nodeBuiltins.includes(importPath)){return null}const packageName=importPath.startsWith("@")?importPath.split("/").slice(0,2).join("/"):importPath.split("/")[0];return packageName}function isWorkspacePackage(packageName){return packageName.startsWith("@workspace/")||packageName.startsWith("@company/")}function checkImport(importPath,node){const packageName=isExternalPackage(importPath);if(!packageName){return}const isAllowedByPattern=allowPatterns.some(pattern=>{try{const regex=new RegExp(pattern);return regex.test(packageName)}catch{return false}});if(isAllowedByPattern){return}const shouldCheckDependency=()=>{switch(resolutionStrategy){case"workspace":return!allowedPackages.has(packageName)&&!isWorkspacePackage(packageName);case"monorepo":return!allowedPackages.has(packageName)&&!isWorkspacePackage(packageName);case"strict":default:return!allowedPackages.has(packageName)}};if(shouldCheckDependency()){const isInDevDeps=resolvedPackageJson?.devDependencies&&resolvedPackageJson.devDependencies[packageName];if(isInDevDeps&&!devDependencies){context.report({node,messageId:"devDependencyInProduction",data:{packageName,importPath,suggestion:"Move to dependencies if used in production, or ensure this code is only executed in development"},suggest:[{messageId:"moveToDependencies",fix(fixer){let parentStatement=node;while(parentStatement&&parentStatement.type!=="ImportDeclaration"&&parentStatement.type!=="VariableDeclaration"&&parentStatement.type!=="ExpressionStatement"){parentStatement=parentStatement.parent}if(parentStatement){return fixer.insertTextBefore(parentStatement,`// TODO: Move ${packageName} from devDependencies to dependencies in package.json
|
|
2
2
|
`)}return fixer.insertTextBefore(node,`// TODO: Move ${packageName} from devDependencies to dependencies in package.json
|
|
3
3
|
`)}}]})}else{context.report({node,messageId:"missingDependency",data:{packageName,importPath,allowedPackages:Array.from(allowedPackages).slice(0,5).join(", ")+(allowedPackages.size>5?"...":""),suggestion:`Add "${packageName}" to package.json dependencies`},suggest:[{messageId:"addToDependencies",fix(fixer){let parentStatement=node;while(parentStatement&&parentStatement.type!=="ImportDeclaration"&&parentStatement.type!=="VariableDeclaration"&&parentStatement.type!=="ExpressionStatement"){parentStatement=parentStatement.parent}if(parentStatement){return fixer.insertTextBefore(parentStatement,`// TODO: Run: npm install ${packageName}
|
|
4
4
|
`)}return fixer.insertTextBefore(node,`// TODO: Run: npm install ${packageName}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var __createBinding=this&&this.__createBinding||(Object.create?(function(o,m,k,k2){if(k2===void 0)k2=k;var desc=Object.getOwnPropertyDescriptor(m,k);if(!desc||("get"in desc?!m.__esModule:desc.writable||desc.configurable)){desc={enumerable:true,get:function(){return m[k]}}}Object.defineProperty(o,k2,desc)}):(function(o,m,k,k2){if(k2===void 0)k2=k;o[k2]=m[k]}));var __setModuleDefault=this&&this.__setModuleDefault||(Object.create?(function(o,v){Object.defineProperty(o,"default",{enumerable:true,value:v})}):function(o,v){o["default"]=v});var __importStar=this&&this.__importStar||(function(){var ownKeys=function(o){ownKeys=Object.getOwnPropertyNames||function(o2){var ar=[];for(var k in o2)if(Object.prototype.hasOwnProperty.call(o2,k))ar[ar.length]=k;return ar};return ownKeys(o)};return function(mod){if(mod&&mod.__esModule)return mod;var result={};if(mod!=null){for(var k=ownKeys(mod),i=0;i<k.length;i++)if(k[i]!=="default")__createBinding(result,mod,k[i])}__setModuleDefault(result,mod);return result}})();Object.defineProperty(exports,"__esModule",{value:true});exports.noSelfImport=void 0;const path=__importStar(require("node:path"));const eslint_devkit_1=require("@interlace/eslint-devkit");const eslint_devkit_2=require("@interlace/eslint-devkit");function isImportingSelf(context,node,importPath){const filename=context.filename;if(filename==="<text>"){return false}const[options]=context.options;const{allowInTests=false}=options||{};if(allowInTests&&(
|
|
1
|
+
"use strict";var __createBinding=this&&this.__createBinding||(Object.create?(function(o,m,k,k2){if(k2===void 0)k2=k;var desc=Object.getOwnPropertyDescriptor(m,k);if(!desc||("get"in desc?!m.__esModule:desc.writable||desc.configurable)){desc={enumerable:true,get:function(){return m[k]}}}Object.defineProperty(o,k2,desc)}):(function(o,m,k,k2){if(k2===void 0)k2=k;o[k2]=m[k]}));var __setModuleDefault=this&&this.__setModuleDefault||(Object.create?(function(o,v){Object.defineProperty(o,"default",{enumerable:true,value:v})}):function(o,v){o["default"]=v});var __importStar=this&&this.__importStar||(function(){var ownKeys=function(o){ownKeys=Object.getOwnPropertyNames||function(o2){var ar=[];for(var k in o2)if(Object.prototype.hasOwnProperty.call(o2,k))ar[ar.length]=k;return ar};return ownKeys(o)};return function(mod){if(mod&&mod.__esModule)return mod;var result={};if(mod!=null){for(var k=ownKeys(mod),i=0;i<k.length;i++)if(k[i]!=="default")__createBinding(result,mod,k[i])}__setModuleDefault(result,mod);return result}})();Object.defineProperty(exports,"__esModule",{value:true});exports.noSelfImport=void 0;const path=__importStar(require("node:path"));const eslint_devkit_1=require("@interlace/eslint-devkit");const eslint_devkit_2=require("@interlace/eslint-devkit");const MODULE_EXTENSION=/\.[cm]?[jt]sx?$/;function isImportingSelf(context,node,importPath){const filename=context.filename;if(filename==="<text>"){return false}const[options]=context.options;const{allowInTests=false}=options||{};if(allowInTests&&(0,eslint_devkit_1.isTestFilePath)(filename)){return false}let resolvedPath;if(importPath.startsWith("./")||importPath.startsWith("../")){const currentDir=path.dirname(filename);resolvedPath=path.resolve(currentDir,importPath)}else if(importPath.startsWith("/")){resolvedPath=importPath}else{return false}const trailingSuffix=/\.[^/.]+$/.exec(importPath);if(trailingSuffix&&!MODULE_EXTENSION.test(importPath)){return false}const normalizedCurrent=filename.replace(MODULE_EXTENSION,"");const normalizedImport=resolvedPath.replace(MODULE_EXTENSION,"");return normalizedCurrent===normalizedImport}exports.noSelfImport=(0,eslint_devkit_1.createRule)({name:"no-self-import",meta:{type:"problem",docs:{url:"https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-self-import.md",description:"Forbid a module from importing itself"},messages:{selfImport:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Self Import",description:"Module imports itself",severity:"HIGH",fix:"Remove the self-import statement",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-self-import.md"})},schema:[{type:"object",properties:{allowInTests:{type:"boolean",default:false,description:"Allow self-imports in test files."}},additionalProperties:false}]},defaultOptions:[{allowInTests:false}],create(context){function visitModule(source,node){const importPath=source.value;if(typeof importPath==="string"&&isImportingSelf(context,node,importPath)){context.report({node:source,messageId:"selfImport"})}}return{ImportDeclaration(node){if(node.importKind==="type"){return}visitModule(node.source,node)},CallExpression(node){if(node.callee.type==="Identifier"&&node.callee.name==="require"&&node.arguments.length===1){const arg=node.arguments[0];if(arg.type==="Literal"){visitModule(arg,node)}}},ImportExpression(node){if(node.source.type==="Literal"){visitModule(node.source,node)}},ExportNamedDeclaration(node){if(node.source){visitModule(node.source,node)}},ExportAllDeclaration(node){visitModule(node.source,node)}}}});
|