eslint-plugin-import-next 2.6.0 → 2.7.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 +58 -61
- package/package.json +2 -2
- package/src/index.js +1 -1
- package/src/rules/dynamic-import-chunkname.js +1 -1
- package/src/rules/max-dependencies.js +1 -1
- package/src/rules/no-extraneous-dependencies.js +1 -1
- package/src/rules/no-internal-modules.js +1 -1
- package/src/rules/no-mutable-exports.js +1 -1
- package/src/rules/no-named-as-default-member.js +1 -1
- package/src/rules/no-named-as-default.js +1 -1
- package/src/rules/no-nodejs-modules.js +1 -1
- package/src/rules/no-relative-parent-imports.js +1 -1
- package/src/rules/no-restricted-paths.js +1 -1
- package/src/rules/no-unassigned-import.js +1 -1
- package/src/rules/no-unresolved.js +1 -1
- package/src/rules/prefer-node-protocol.js +1 -1
package/README.md
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
<p align="center">
|
|
2
|
-
<a href="https://eslint.interlace.tools/?utm_source=github&utm_medium=referral&utm_campaign=eslint-plugin-import-next" target="blank"><img src="https://eslint.interlace.tools/logos/interlace.svg" alt="Interlace" height="90" /></a>
|
|
2
|
+
<a href="https://eslint.interlace.tools/?utm_source=github&utm_medium=referral&utm_campaign=eslint-plugin-import-next" target="blank"><picture><source media="(prefers-color-scheme: dark)" srcset="https://eslint.interlace.tools/logos/interlace-dark.svg"><img src="https://eslint.interlace.tools/logos/interlace-light.svg" alt="Interlace" height="90" /></picture></a>
|
|
3
3
|
|
|
4
|
-
<a href="https://oxc.rs" target="_blank"><img src="https://eslint.interlace.tools/logos/oxlint.svg" alt="oxlint" height="90" /></a>
|
|
4
|
+
<a href="https://oxc.rs" target="_blank"><picture><source media="(prefers-color-scheme: dark)" srcset="https://eslint.interlace.tools/logos/oxlint-dark.svg"><img src="https://eslint.interlace.tools/logos/oxlint-light.svg" alt="oxlint" height="90" /></picture></a>
|
|
5
5
|
|
|
6
|
-
<a href="https://eslint.org" target="_blank"><img src="https://eslint.interlace.tools/logos/eslint.svg" alt="ESLint" height="90" /></a>
|
|
6
|
+
<a href="https://eslint.org" target="_blank"><picture><source media="(prefers-color-scheme: dark)" srcset="https://eslint.interlace.tools/logos/eslint-dark.svg"><img src="https://eslint.interlace.tools/logos/eslint-light.svg" alt="ESLint" height="90" /></picture></a>
|
|
7
7
|
</p>
|
|
8
8
|
|
|
9
9
|
<p align="center">
|
|
@@ -25,57 +25,25 @@
|
|
|
25
25
|
|
|
26
26
|
This plugin provides Next-generation import sorting, validation, and architectural boundaries.
|
|
27
27
|
|
|
28
|
-
## Philosophy
|
|
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.
|
|
31
|
-
|
|
32
28
|
<!-- AUTO-GENERATED:DOCTRINE:START - Do not edit manually -->
|
|
33
29
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
**
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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
|
|
30
|
+
- **Why** — a linter nobody reads protects nothing. We would rather miss a finding
|
|
31
|
+
than spend your attention on one that was never real.
|
|
32
|
+
- **How** — evidence, not names. A rule fires on what the code *does*, resolved
|
|
33
|
+
through the AST and ESLint's own scope analysis.
|
|
34
|
+
- **What** — every finding carries its fix, in prose for a human and as structured
|
|
35
|
+
JSON for an agent. Security rules add a CWE mapping and, where assigned, a CVSS score.
|
|
57
36
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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).
|
|
37
|
+
That trade costs recall, and we measure it:
|
|
38
|
+
[methodology](https://github.com/ofri-peretz/eslint/blob/main/BENCHMARK-METHODOLOGY.md)
|
|
39
|
+
· [results](https://github.com/ofri-peretz/eslint/blob/main/BENCHMARK-RESULTS.md)
|
|
40
|
+
· [a false positive is a bug](https://github.com/ofri-peretz/eslint/issues).
|
|
68
41
|
|
|
69
42
|
<!-- AUTO-GENERATED:DOCTRINE:END -->
|
|
70
43
|
|
|
71
44
|
## Getting Started
|
|
72
45
|
|
|
73
46
|
- 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). 📚
|
|
74
|
-
- 要查看中文 [指南](https://eslint.interlace.tools/docs/quality/plugin-import-next?utm_source=github&utm_medium=referral&utm_campaign=eslint-plugin-import-next), 请访问 [eslint.interlace.tools](https://eslint.interlace.tools/?utm_source=github&utm_medium=referral&utm_campaign=eslint-plugin-import-next). 📚
|
|
75
|
-
- [가이드](https://eslint.interlace.tools/docs/quality/plugin-import-next?utm_source=github&utm_medium=referral&utm_campaign=eslint-plugin-import-next) 문서는 [eslint.interlace.tools](https://eslint.interlace.tools/?utm_source=github&utm_medium=referral&utm_campaign=eslint-plugin-import-next)에서 확인하실 수 있습니다. 📚
|
|
76
|
-
- [ガイド](https://eslint.interlace.tools/docs/quality/plugin-import-next?utm_source=github&utm_medium=referral&utm_campaign=eslint-plugin-import-next)は [eslint.interlace.tools](https://eslint.interlace.tools/?utm_source=github&utm_medium=referral&utm_campaign=eslint-plugin-import-next)でご確認ください。 📚
|
|
77
|
-
- Para ver la [guía](https://eslint.interlace.tools/docs/quality/plugin-import-next?utm_source=github&utm_medium=referral&utm_campaign=eslint-plugin-import-next), visita [eslint.interlace.tools](https://eslint.interlace.tools/?utm_source=github&utm_medium=referral&utm_campaign=eslint-plugin-import-next). 📚
|
|
78
|
-
- للاطلاع على [الدليل](https://eslint.interlace.tools/docs/quality/plugin-import-next?utm_source=github&utm_medium=referral&utm_campaign=eslint-plugin-import-next)، قم بزيارة [eslint.interlace.tools](https://eslint.interlace.tools/?utm_source=github&utm_medium=referral&utm_campaign=eslint-plugin-import-next). 📚
|
|
79
47
|
|
|
80
48
|
```bash
|
|
81
49
|
npm install eslint-plugin-import-next --save-dev
|
|
@@ -183,12 +151,12 @@ See the [ESLint Version Support Policy](../../docs/ESLINT_VERSION_SUPPORT.md) fo
|
|
|
183
151
|
| [export](https://eslint.interlace.tools/docs/quality/plugin-import-next/rules/export?utm_source=github&utm_medium=referral&utm_campaign=eslint-plugin-import-next) | | | | | 🟢 | 💼 | | | | |
|
|
184
152
|
| [exports-last](https://eslint.interlace.tools/docs/quality/plugin-import-next/rules/exports-last?utm_source=github&utm_medium=referral&utm_campaign=eslint-plugin-import-next) | | | | | 🟢 | | | | | |
|
|
185
153
|
| [extensions](https://eslint.interlace.tools/docs/quality/plugin-import-next/rules/extensions?utm_source=github&utm_medium=referral&utm_campaign=eslint-plugin-import-next) | | | | | 🟢 | | | | | |
|
|
186
|
-
| [first](https://eslint.interlace.tools/docs/quality/plugin-import-next/rules/first?utm_source=github&utm_medium=referral&utm_campaign=eslint-plugin-import-next) | | | | | 🟢 | |
|
|
154
|
+
| [first](https://eslint.interlace.tools/docs/quality/plugin-import-next/rules/first?utm_source=github&utm_medium=referral&utm_campaign=eslint-plugin-import-next) | | | | | 🟢 | | | | | |
|
|
187
155
|
| [group-exports](https://eslint.interlace.tools/docs/quality/plugin-import-next/rules/group-exports?utm_source=github&utm_medium=referral&utm_campaign=eslint-plugin-import-next) | | | | | 🟢 | | | | | |
|
|
188
156
|
| [max-dependencies](https://eslint.interlace.tools/docs/quality/plugin-import-next/rules/max-dependencies?utm_source=github&utm_medium=referral&utm_campaign=eslint-plugin-import-next) | | | | | 🟢 | | | | | |
|
|
189
157
|
| [named](https://eslint.interlace.tools/docs/quality/plugin-import-next/rules/named?utm_source=github&utm_medium=referral&utm_campaign=eslint-plugin-import-next) | | | | | 🟡 | 💼 | | | | |
|
|
190
158
|
| [namespace](https://eslint.interlace.tools/docs/quality/plugin-import-next/rules/namespace?utm_source=github&utm_medium=referral&utm_campaign=eslint-plugin-import-next) | | | | | 🟡 | | ⚠️ | | | |
|
|
191
|
-
| [newline-after-import](https://eslint.interlace.tools/docs/quality/plugin-import-next/rules/newline-after-import?utm_source=github&utm_medium=referral&utm_campaign=eslint-plugin-import-next) | | | | | 🟢 | |
|
|
159
|
+
| [newline-after-import](https://eslint.interlace.tools/docs/quality/plugin-import-next/rules/newline-after-import?utm_source=github&utm_medium=referral&utm_campaign=eslint-plugin-import-next) | | | | | 🟢 | | | | | |
|
|
192
160
|
| [no-absolute-path](https://eslint.interlace.tools/docs/quality/plugin-import-next/rules/no-absolute-path?utm_source=github&utm_medium=referral&utm_campaign=eslint-plugin-import-next) | | | | | 🟢 | | | | | |
|
|
193
161
|
| [no-amd](https://eslint.interlace.tools/docs/quality/plugin-import-next/rules/no-amd?utm_source=github&utm_medium=referral&utm_campaign=eslint-plugin-import-next) | | | | | 🟢 | | ⚠️ | | | |
|
|
194
162
|
| [no-anonymous-default-export](https://eslint.interlace.tools/docs/quality/plugin-import-next/rules/no-anonymous-default-export?utm_source=github&utm_medium=referral&utm_campaign=eslint-plugin-import-next) | | | | | 🟢 | | | | | |
|
|
@@ -222,7 +190,7 @@ See the [ESLint Version Support Policy](../../docs/ESLINT_VERSION_SUPPORT.md) fo
|
|
|
222
190
|
| [no-unresolved](https://eslint.interlace.tools/docs/quality/plugin-import-next/rules/no-unresolved?utm_source=github&utm_medium=referral&utm_campaign=eslint-plugin-import-next) | | A03:2021 | | | 🟢 | 💼 | | | | |
|
|
223
191
|
| [no-unused-modules](https://eslint.interlace.tools/docs/quality/plugin-import-next/rules/no-unused-modules?utm_source=github&utm_medium=referral&utm_campaign=eslint-plugin-import-next) | | | | | 🟢 | | | | | |
|
|
224
192
|
| [no-useless-path-segments](https://eslint.interlace.tools/docs/quality/plugin-import-next/rules/no-useless-path-segments?utm_source=github&utm_medium=referral&utm_campaign=eslint-plugin-import-next) | | | | | 🟢 | | | | | |
|
|
225
|
-
| [order](https://eslint.interlace.tools/docs/quality/plugin-import-next/rules/order?utm_source=github&utm_medium=referral&utm_campaign=eslint-plugin-import-next) | | | | | 🟢 | |
|
|
193
|
+
| [order](https://eslint.interlace.tools/docs/quality/plugin-import-next/rules/order?utm_source=github&utm_medium=referral&utm_campaign=eslint-plugin-import-next) | | | | | 🟢 | | | | | |
|
|
226
194
|
| [prefer-default-export](https://eslint.interlace.tools/docs/quality/plugin-import-next/rules/prefer-default-export?utm_source=github&utm_medium=referral&utm_campaign=eslint-plugin-import-next) | | | | | 🟢 | | | | | |
|
|
227
195
|
| [prefer-direct-import](https://eslint.interlace.tools/docs/quality/plugin-import-next/rules/prefer-direct-import?utm_source=github&utm_medium=referral&utm_campaign=eslint-plugin-import-next) | | | | | 🟢 | | | | | |
|
|
228
196
|
| [prefer-modern-api](https://eslint.interlace.tools/docs/quality/plugin-import-next/rules/prefer-modern-api?utm_source=github&utm_medium=referral&utm_campaign=eslint-plugin-import-next) | | | | | 🟢 | | | | | |
|
|
@@ -231,23 +199,52 @@ See the [ESLint Version Support Policy](../../docs/ESLINT_VERSION_SUPPORT.md) fo
|
|
|
231
199
|
| [require-import-approval](https://eslint.interlace.tools/docs/quality/plugin-import-next/rules/require-import-approval?utm_source=github&utm_medium=referral&utm_campaign=eslint-plugin-import-next) | | | | | 🟢 | | | | | |
|
|
232
200
|
| [unambiguous](https://eslint.interlace.tools/docs/quality/plugin-import-next/rules/unambiguous?utm_source=github&utm_medium=referral&utm_campaign=eslint-plugin-import-next) | | | | | 🟢 | | | | | |
|
|
233
201
|
<!-- AUTO-GENERATED:RULES_TABLE:END -->
|
|
202
|
+
<!-- AUTO-GENERATED:ECOSYSTEM_TABLE:START - Do not edit manually -->
|
|
203
|
+
|
|
234
204
|
## 🔗 Related ESLint Plugins
|
|
235
205
|
|
|
236
|
-
Part of the **Interlace ESLint
|
|
206
|
+
Part of the **Interlace ESLint ecosystem** — AI-native rules with LLM-optimized error messages:
|
|
207
|
+
|
|
208
|
+
**Security**
|
|
237
209
|
|
|
238
210
|
| Plugin | Downloads | Description |
|
|
239
211
|
| :--- | :---: | :--- |
|
|
240
|
-
| [`eslint-plugin-
|
|
241
|
-
| [`eslint-plugin-
|
|
242
|
-
| [`eslint-plugin-
|
|
243
|
-
| [`eslint-plugin-
|
|
244
|
-
| [`eslint-plugin-
|
|
245
|
-
| [`eslint-plugin-
|
|
246
|
-
| [`eslint-plugin-
|
|
247
|
-
| [`eslint-plugin-
|
|
248
|
-
| [`eslint-plugin-
|
|
249
|
-
| [`eslint-plugin-
|
|
250
|
-
| [`eslint-plugin-
|
|
212
|
+
| [`eslint-plugin-anthropic-security`](https://www.npmjs.com/package/eslint-plugin-anthropic-security) | [](https://www.npmjs.com/package/eslint-plugin-anthropic-security) | Anthropic SDK security. |
|
|
213
|
+
| [`eslint-plugin-browser-security`](https://www.npmjs.com/package/eslint-plugin-browser-security) | [](https://www.npmjs.com/package/eslint-plugin-browser-security) | XSS, DOM security. |
|
|
214
|
+
| [`eslint-plugin-drizzle-security`](https://www.npmjs.com/package/eslint-plugin-drizzle-security) | [](https://www.npmjs.com/package/eslint-plugin-drizzle-security) | Drizzle security. |
|
|
215
|
+
| [`eslint-plugin-express-security`](https://www.npmjs.com/package/eslint-plugin-express-security) | [](https://www.npmjs.com/package/eslint-plugin-express-security) | Express middleware hardening. |
|
|
216
|
+
| [`eslint-plugin-gemini-security`](https://www.npmjs.com/package/eslint-plugin-gemini-security) | [](https://www.npmjs.com/package/eslint-plugin-gemini-security) | Google Gemini SDK security. |
|
|
217
|
+
| [`eslint-plugin-jwt-security`](https://www.npmjs.com/package/eslint-plugin-jwt-security) | [](https://www.npmjs.com/package/eslint-plugin-jwt-security) | Token security. |
|
|
218
|
+
| [`eslint-plugin-knex-security`](https://www.npmjs.com/package/eslint-plugin-knex-security) | [](https://www.npmjs.com/package/eslint-plugin-knex-security) | Knex security. |
|
|
219
|
+
| [`eslint-plugin-lambda-security`](https://www.npmjs.com/package/eslint-plugin-lambda-security) | [](https://www.npmjs.com/package/eslint-plugin-lambda-security) | AWS Lambda hardening. |
|
|
220
|
+
| [`eslint-plugin-mcp-sdk-security`](https://www.npmjs.com/package/eslint-plugin-mcp-sdk-security) | [](https://www.npmjs.com/package/eslint-plugin-mcp-sdk-security) | MCP SDK security. |
|
|
221
|
+
| [`eslint-plugin-mongodb-security`](https://www.npmjs.com/package/eslint-plugin-mongodb-security) | [](https://www.npmjs.com/package/eslint-plugin-mongodb-security) | MongoDB injection. |
|
|
222
|
+
| [`eslint-plugin-mysql-security`](https://www.npmjs.com/package/eslint-plugin-mysql-security) | [](https://www.npmjs.com/package/eslint-plugin-mysql-security) | MySQL security. |
|
|
223
|
+
| [`eslint-plugin-nestjs-security`](https://www.npmjs.com/package/eslint-plugin-nestjs-security) | [](https://www.npmjs.com/package/eslint-plugin-nestjs-security) | NestJS framework hardening. |
|
|
224
|
+
| [`eslint-plugin-node-security`](https://www.npmjs.com/package/eslint-plugin-node-security) | [](https://www.npmjs.com/package/eslint-plugin-node-security) | Server-side patterns. |
|
|
225
|
+
| [`eslint-plugin-openai-security`](https://www.npmjs.com/package/eslint-plugin-openai-security) | [](https://www.npmjs.com/package/eslint-plugin-openai-security) | OpenAI SDK security. |
|
|
226
|
+
| [`eslint-plugin-postgresql-security`](https://www.npmjs.com/package/eslint-plugin-postgresql-security) | [](https://www.npmjs.com/package/eslint-plugin-postgresql-security) | PostgreSQL security. |
|
|
227
|
+
| [`eslint-plugin-prisma-security`](https://www.npmjs.com/package/eslint-plugin-prisma-security) | [](https://www.npmjs.com/package/eslint-plugin-prisma-security) | Prisma security. |
|
|
228
|
+
| [`eslint-plugin-secure-coding`](https://www.npmjs.com/package/eslint-plugin-secure-coding) | [](https://www.npmjs.com/package/eslint-plugin-secure-coding) | Injection prevention. |
|
|
229
|
+
| [`eslint-plugin-sequelize-security`](https://www.npmjs.com/package/eslint-plugin-sequelize-security) | [](https://www.npmjs.com/package/eslint-plugin-sequelize-security) | Sequelize ORM security. |
|
|
230
|
+
| [`eslint-plugin-sqlite-security`](https://www.npmjs.com/package/eslint-plugin-sqlite-security) | [](https://www.npmjs.com/package/eslint-plugin-sqlite-security) | SQLite security. |
|
|
231
|
+
| [`eslint-plugin-typeorm-security`](https://www.npmjs.com/package/eslint-plugin-typeorm-security) | [](https://www.npmjs.com/package/eslint-plugin-typeorm-security) | TypeORM security. |
|
|
232
|
+
| [`eslint-plugin-vercel-ai-security`](https://www.npmjs.com/package/eslint-plugin-vercel-ai-security) | [](https://www.npmjs.com/package/eslint-plugin-vercel-ai-security) | AI SDK security. |
|
|
233
|
+
|
|
234
|
+
**Code quality**
|
|
235
|
+
|
|
236
|
+
| Plugin | Downloads | Description |
|
|
237
|
+
| :--- | :---: | :--- |
|
|
238
|
+
| [`eslint-plugin-conventions`](https://www.npmjs.com/package/eslint-plugin-conventions) | [](https://www.npmjs.com/package/eslint-plugin-conventions) | Team-specific habits and styles. |
|
|
239
|
+
| [`eslint-plugin-maintainability`](https://www.npmjs.com/package/eslint-plugin-maintainability) | [](https://www.npmjs.com/package/eslint-plugin-maintainability) | Cognitive load and clean-code patterns. |
|
|
240
|
+
| [`eslint-plugin-modernization`](https://www.npmjs.com/package/eslint-plugin-modernization) | [](https://www.npmjs.com/package/eslint-plugin-modernization) | ESNext migration + syntax evolution. |
|
|
241
|
+
| [`eslint-plugin-modularity`](https://www.npmjs.com/package/eslint-plugin-modularity) | [](https://www.npmjs.com/package/eslint-plugin-modularity) | Structural integrity and DDD patterns. |
|
|
242
|
+
| [`eslint-plugin-operability`](https://www.npmjs.com/package/eslint-plugin-operability) | [](https://www.npmjs.com/package/eslint-plugin-operability) | Production readiness and resource health. |
|
|
243
|
+
| [`eslint-plugin-react-a11y`](https://www.npmjs.com/package/eslint-plugin-react-a11y) | [](https://www.npmjs.com/package/eslint-plugin-react-a11y) | React accessibility / WCAG. |
|
|
244
|
+
| [`eslint-plugin-react-features`](https://www.npmjs.com/package/eslint-plugin-react-features) | [](https://www.npmjs.com/package/eslint-plugin-react-features) | React best practices and optimization. |
|
|
245
|
+
| [`eslint-plugin-reliability`](https://www.npmjs.com/package/eslint-plugin-reliability) | [](https://www.npmjs.com/package/eslint-plugin-reliability) | Runtime stability and error safety. |
|
|
246
|
+
|
|
247
|
+
<!-- AUTO-GENERATED:ECOSYSTEM_TABLE:END -->
|
|
251
248
|
|
|
252
249
|
<!-- INTERLACE:STAR_CTA:START -->
|
|
253
250
|
## ⭐ Support & follow
|
|
@@ -267,5 +264,5 @@ MIT © [Ofri Peretz](https://github.com/ofri-peretz)
|
|
|
267
264
|
</p>
|
|
268
265
|
|
|
269
266
|
<p align="center">
|
|
270
|
-
<a href="https://eslint.interlace.tools/?utm_source=github&utm_medium=referral&utm_campaign=eslint-plugin-import-next" target="blank"><img src="https://eslint.interlace.tools/
|
|
267
|
+
<a href="https://eslint.interlace.tools/?utm_source=github&utm_medium=referral&utm_campaign=eslint-plugin-import-next" target="blank"><picture><source media="(prefers-color-scheme: dark)" srcset="https://eslint.interlace.tools/logos/interlace-dark.svg"><img src="https://eslint.interlace.tools/logos/interlace-light.svg" alt="Interlace" height="70" /></picture></a>
|
|
271
268
|
</p>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "eslint-plugin-import-next",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.7.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.18.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 eslint_devkit_1=require("@interlace/eslint-devkit");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}};(0,eslint_devkit_1.withCanonicalDocsUrls)("plugin-import-next",exports.rules);exports.plugin={meta:{name:"eslint-plugin-import-next",version:"2.5.1"},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;
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.clearCircularDependencyCache=exports.configs=exports.plugin=exports.rules=void 0;const eslint_devkit_1=require("@interlace/eslint-devkit");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}};(0,eslint_devkit_1.withCanonicalDocsUrls)("plugin-import-next",exports.rules);exports.plugin={meta:{name:"eslint-plugin-import-next",version:"2.7.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;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.dynamicImportChunkname=void 0;const eslint_devkit_1=require("@interlace/eslint-devkit");exports.dynamicImportChunkname=(0,eslint_devkit_1.createRule)({name:"dynamic-import-chunkname",meta:{type:"suggestion",docs:{url:"https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/dynamic-import-chunkname.md",description:"Enforce a leading comment with the webpackChunkName for dynamic imports",cwe:"CWE-1078",cvss:2.5},hasSuggestions:true,messages:{missingChunkName:(0,eslint_devkit_1.formatLLMMessage)({icon:eslint_devkit_1.MessageIcons.ARCHITECTURE,issueName:"Missing Chunk Name",cwe:"CWE-1078",description:"Dynamic import is missing webpackChunkName comment",severity:"LOW",fix:'Add /* webpackChunkName: "chunk-name" */ before the import path',documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/dynamic-import-chunkname.md"}),invalidChunkName:(0,eslint_devkit_1.formatLLMMessage)({icon:eslint_devkit_1.MessageIcons.ARCHITECTURE,issueName:"Invalid Chunk Name",cwe:"CWE-1078",description:'webpackChunkName "{{chunkName}}" does not match pattern',severity:"LOW",fix:"Update chunk name to match the required pattern",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/dynamic-import-chunkname.md"}),suggestChunkName:"Add webpackChunkName comment"},schema:[{type:"object",properties:{importFunctions:{type:"array",items:{type:"string"}},allowEmpty:{type:"boolean",default:false},webpackChunknameFormat:{type:"string"}},additionalProperties:false}]},defaultOptions:[{importFunctions:[],allowEmpty:false,webpackChunknameFormat:"[a-zA-Z0-9-_/.]+"}],create(context){const options=context.options[0]||{};const{allowEmpty=false,webpackChunknameFormat="[a-zA-Z0-9-_/.]+"}=options;const chunkNamePattern=new RegExp(`^${webpackChunknameFormat}$`);const sourceCode=context.sourceCode;function checkChunkName(node){const comments=sourceCode.getCommentsBefore(node.source);let foundChunkName=null;let hasWebpackComment=false;for(const comment of comments){const text=comment.value.trim();const match=text.match(/webpackChunkName:\s*["']([^"']+)["']/);if(match){hasWebpackComment=true;foundChunkName=match[1];break}}if(!hasWebpackComment){if(!allowEmpty){context.report({node,messageId:"missingChunkName",suggest:[{messageId:"suggestChunkName",fix(fixer){const source=node.source;
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.dynamicImportChunkname=void 0;const eslint_devkit_1=require("@interlace/eslint-devkit");exports.dynamicImportChunkname=(0,eslint_devkit_1.createRule)({name:"dynamic-import-chunkname",meta:{type:"suggestion",docs:{url:"https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/dynamic-import-chunkname.md",description:"Enforce a leading comment with the webpackChunkName for dynamic imports",cwe:"CWE-1078",cvss:2.5},hasSuggestions:true,messages:{missingChunkName:(0,eslint_devkit_1.formatLLMMessage)({icon:eslint_devkit_1.MessageIcons.ARCHITECTURE,issueName:"Missing Chunk Name",cwe:"CWE-1078",description:"Dynamic import is missing webpackChunkName comment",severity:"LOW",fix:'Add /* webpackChunkName: "chunk-name" */ before the import path',documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/dynamic-import-chunkname.md"}),invalidChunkName:(0,eslint_devkit_1.formatLLMMessage)({icon:eslint_devkit_1.MessageIcons.ARCHITECTURE,issueName:"Invalid Chunk Name",cwe:"CWE-1078",description:'webpackChunkName "{{chunkName}}" does not match pattern',severity:"LOW",fix:"Update chunk name to match the required pattern",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/dynamic-import-chunkname.md"}),suggestChunkName:"Add webpackChunkName comment"},schema:[{type:"object",properties:{importFunctions:{type:"array",items:{type:"string"}},allowEmpty:{type:"boolean",default:false},webpackChunknameFormat:{type:"string"}},additionalProperties:false}]},defaultOptions:[{importFunctions:[],allowEmpty:false,webpackChunknameFormat:"[a-zA-Z0-9-_/.]+"}],create(context){const options=context.options[0]||{};const{allowEmpty=false,webpackChunknameFormat="[a-zA-Z0-9-_/.]+"}=options;const chunkNamePattern=new RegExp(`^${webpackChunknameFormat}$`);const sourceCode=context.sourceCode;function checkChunkName(node){const comments=sourceCode.getCommentsBefore(node.source);let foundChunkName=null;let hasWebpackComment=false;for(const comment of comments){const text=comment.value.trim();const match=text.match(/webpackChunkName:\s*["']([^"']+)["']/);if(match){hasWebpackComment=true;foundChunkName=match[1];break}}if(!hasWebpackComment){if(!allowEmpty){context.report({node,messageId:"missingChunkName",suggest:[{messageId:"suggestChunkName",fix(fixer){const source=node.source;const staticText=(0,eslint_devkit_1.staticString)(source);if(staticText!==null){const chunkName=staticText.split("/").pop()?.replace(/[^a-zA-Z0-9-_]/g,"-")||"chunk";return fixer.insertTextBefore(source,`/* webpackChunkName: "${chunkName}" */ `)}return null}}]})}}else if(foundChunkName&&!chunkNamePattern.test(foundChunkName)){context.report({node,messageId:"invalidChunkName",data:{chunkName:foundChunkName}})}}return{ImportExpression(node){checkChunkName(node)}}}});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.maxDependencies=void 0;const eslint_devkit_1=require("@interlace/eslint-devkit");const eslint_devkit_2=require("@interlace/eslint-devkit");exports.maxDependencies=(0,eslint_devkit_1.createRule)({name:"max-dependencies",meta:{type:"suggestion",docs:{url:"https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/max-dependencies.md",description:"Enforce the maximum number of dependencies a module can have"},hasSuggestions:false,messages:{maxDependencies:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.WARNING,issueName:"Too Many Dependencies",description:"Module exceeds maximum dependency limit",severity:"MEDIUM",fix:"Refactor to reduce dependencies or increase limit for this module",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/max-dependencies.md"}),suggestRefactor:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Dependency Refactoring",description:"Consider breaking down module or creating barrel exports",severity:"LOW",fix:"Split module into smaller, focused modules",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/max-dependencies.md"}),dependencyAnalysis:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Dependency Analysis",description:"Review dependency usage and consider alternatives",severity:"LOW",fix:"Analyze if all dependencies are necessary",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/max-dependencies.md"})},schema:[{type:"object",properties:{max:{type:"number",minimum:1,default:10,description:"Maximum number of dependencies allowed."},ignoreTypeImports:{type:"boolean",default:true,description:"Ignore type-only imports."},ignoreImports:{type:"array",items:{type:"string"},description:"Import sources to ignore."},ignoreFiles:{type:"array",items:{type:"string"},description:"File patterns to ignore."}},additionalProperties:false}]},defaultOptions:[{max:10,ignoreTypeImports:true,ignoreImports:[],ignoreFiles:[]}],create(context){const[options]=context.options;const{max=10,ignoreTypeImports=true,ignoreImports=[],ignoreFiles=[]}=options||{};const filename=context.filename;if(!filename){return{}}const shouldIgnoreFile=ignoreFiles.some(pattern=>{if(pattern.includes("*")){const regex=new RegExp(pattern.replace(/\*/g,".*"));return regex.test(filename)}return filename.includes(pattern)});if(shouldIgnoreFile){return{}}const dependencies=new Set;function shouldCountImport(importPath,node){if(ignoreImports.includes(importPath)){return false}if(ignoreTypeImports&&node.importKind==="type"){return false}if(importPath.startsWith("./")||importPath.startsWith("../")){return false}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"];if(nodeBuiltins.includes(importPath)||importPath.startsWith("node:")){return false}return true}function shouldCountRequire(importPath){if(ignoreImports.includes(importPath)){return false}if(importPath.startsWith("./")||importPath.startsWith("../")){return false}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"];if(nodeBuiltins.includes(importPath)||importPath.startsWith("node:")){return false}return true}function addDependency(importPath){const packageName=importPath.startsWith("@")?importPath.split("/").slice(0,2).join("/"):importPath.split("/")[0];dependencies.add(packageName)}return{ImportDeclaration(node){const importPath=node.source
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.maxDependencies=void 0;const eslint_devkit_1=require("@interlace/eslint-devkit");const eslint_devkit_2=require("@interlace/eslint-devkit");exports.maxDependencies=(0,eslint_devkit_1.createRule)({name:"max-dependencies",meta:{type:"suggestion",docs:{url:"https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/max-dependencies.md",description:"Enforce the maximum number of dependencies a module can have"},hasSuggestions:false,messages:{maxDependencies:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.WARNING,issueName:"Too Many Dependencies",description:"Module exceeds maximum dependency limit",severity:"MEDIUM",fix:"Refactor to reduce dependencies or increase limit for this module",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/max-dependencies.md"}),suggestRefactor:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Dependency Refactoring",description:"Consider breaking down module or creating barrel exports",severity:"LOW",fix:"Split module into smaller, focused modules",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/max-dependencies.md"}),dependencyAnalysis:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Dependency Analysis",description:"Review dependency usage and consider alternatives",severity:"LOW",fix:"Analyze if all dependencies are necessary",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/max-dependencies.md"})},schema:[{type:"object",properties:{max:{type:"number",minimum:1,default:10,description:"Maximum number of dependencies allowed."},ignoreTypeImports:{type:"boolean",default:true,description:"Ignore type-only imports."},ignoreImports:{type:"array",items:{type:"string"},description:"Import sources to ignore."},ignoreFiles:{type:"array",items:{type:"string"},description:"File patterns to ignore."}},additionalProperties:false}]},defaultOptions:[{max:10,ignoreTypeImports:true,ignoreImports:[],ignoreFiles:[]}],create(context){const[options]=context.options;const{max=10,ignoreTypeImports=true,ignoreImports=[],ignoreFiles=[]}=options||{};const filename=context.filename;if(!filename){return{}}const shouldIgnoreFile=ignoreFiles.some(pattern=>{if(pattern.includes("*")){const regex=new RegExp(pattern.replace(/\*/g,".*"));return regex.test(filename)}return filename.includes(pattern)});if(shouldIgnoreFile){return{}}const dependencies=new Set;function shouldCountImport(importPath,node){if(ignoreImports.includes(importPath)){return false}if(ignoreTypeImports&&node.importKind==="type"){return false}if(importPath.startsWith("./")||importPath.startsWith("../")){return false}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"];if(nodeBuiltins.includes(importPath)||importPath.startsWith("node:")){return false}return true}function shouldCountRequire(importPath){if(ignoreImports.includes(importPath)){return false}if(importPath.startsWith("./")||importPath.startsWith("../")){return false}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"];if(nodeBuiltins.includes(importPath)||importPath.startsWith("node:")){return false}return true}function addDependency(importPath){const packageName=importPath.startsWith("@")?importPath.split("/").slice(0,2).join("/"):importPath.split("/")[0];dependencies.add(packageName)}return{ImportDeclaration(node){const importPath=(0,eslint_devkit_1.staticString)(node.source);if(typeof importPath==="string"&&shouldCountImport(importPath,node)){addDependency(importPath)}},CallExpression(node){if(node.callee.type==="Identifier"&&node.callee.name==="require"&&node.arguments.length===1){const arg=node.arguments[0];const staticText1=(0,eslint_devkit_1.staticString)(arg);if(staticText1!==null){if(shouldCountRequire(staticText1)){addDependency(staticText1)}}}},ImportExpression(node){const source=node.source;const staticText2=(0,eslint_devkit_1.staticString)(source);if(staticText2!==null){if(shouldCountRequire(staticText2)){addDependency(staticText2)}}},"Program:exit"(node){const dependencyCount=dependencies.size;if(dependencyCount>max){const dependencyList=Array.from(dependencies).join(", ");context.report({node,messageId:"maxDependencies",data:{count:dependencyCount,max,dependencies:dependencyList,filename,overLimit:dependencyCount-max}})}}}}});
|
|
@@ -4,4 +4,4 @@
|
|
|
4
4
|
`)}return fixer.insertTextBefore(node,`// TODO: Run: npm install ${packageName}
|
|
5
5
|
`)}},{messageId:"addToDevDependencies",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 --save-dev ${packageName}
|
|
6
6
|
`)}return fixer.insertTextBefore(node,`// TODO: Run: npm install --save-dev ${packageName}
|
|
7
|
-
`)}}]})}}}return{ImportDeclaration(node){if(node.source.value&&typeof node.source.value==="string"){checkImport(node.source.value,node.source)}},CallExpression(node){if(node.callee.type==="Identifier"&&node.callee.name==="require"&&node.arguments.length===1){const arg=node.arguments[0];
|
|
7
|
+
`)}}]})}}}return{ImportDeclaration(node){if(node.source.value&&typeof node.source.value==="string"){checkImport(node.source.value,node.source)}},CallExpression(node){if(node.callee.type==="Identifier"&&node.callee.name==="require"&&node.arguments.length===1){const arg=node.arguments[0];const staticText=(0,eslint_devkit_1.staticString)(arg);if(staticText!==null){checkImport(staticText,arg)}}},ImportExpression(node){if(node.source.type==="Literal"&&typeof node.source.value==="string"){checkImport(node.source.value,node.source)}}}}});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.noInternalModules=void 0;const eslint_devkit_1=require("@interlace/eslint-devkit");const eslint_devkit_2=require("@interlace/eslint-devkit");function matchGlob(pattern,path){const regexPattern=pattern.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*\*/g,"{{DOUBLE_STAR}}").replace(/\*/g,"[^/]*").replace(/\{\{DOUBLE_STAR\}\}/g,".*");return new RegExp(`^${regexPattern}$`).test(path)}function matchesAnyPattern(path,patterns){return patterns.some(pattern=>matchGlob(pattern,path))}function getImportDepth(importPath){if(importPath.startsWith("./")||importPath.startsWith("../")){const parts2=importPath.split("/").filter(p=>p!=="."&&p!=="..");return parts2.length}if(importPath.startsWith("@")){const parts2=importPath.split("/");return Math.max(0,parts2.length-2)}const parts=importPath.split("/");return parts.length-1}function getRootImport(importPath){if(importPath.startsWith("./")||importPath.startsWith("../")){return"."}if(importPath.startsWith("@")){const parts=importPath.split("/");return parts.slice(0,2).join("/")}return importPath.split("/")[0]}function getImportAtDepth(importPath,maxDepth){if(importPath.startsWith("./")||importPath.startsWith("../")){if(maxDepth===0)return".";const prefix=importPath.startsWith("../")?"../":"./";const parts2=importPath.replace(/^\.\.?\//,"").split("/");return prefix+parts2.slice(0,maxDepth).join("/")}if(importPath.startsWith("@")){const parts2=importPath.split("/");return parts2.slice(0,2+maxDepth).join("/")}const parts=importPath.split("/");return parts.slice(0,1+maxDepth).join("/")}exports.noInternalModules=(0,eslint_devkit_1.createRule)({name:"no-internal-modules",meta:{type:"problem",docs:{url:"https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-internal-modules.md",description:"Forbid importing the submodules of other modules"},fixable:"code",hasSuggestions:true,messages:{internalModuleImport:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Internal Module Import",description:'Import "{{importPath}}" exceeds maximum allowed depth ({{depth}} > {{maxDepth}})',severity:"MEDIUM",fix:'Import from "{{suggestedPath}}" instead of deep internal path',documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-internal-modules.md"}),suggestPublicApi:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Use Public API",description:"Import from the public API entry point",severity:"LOW",fix:'Change import to "{{suggestedPath}}"',documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-internal-modules.md"}),suggestBarrelExport:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Use Barrel Export",description:"Import from a barrel export file",severity:"LOW",fix:'Change import to "{{suggestedPath}}"',documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-internal-modules.md"})},schema:[{type:"object",properties:{maxDepth:{type:"number",minimum:0,default:1,description:"Maximum allowed depth of module imports (0 = only root, 1 = one level deep)"},allow:{type:"array",items:{type:"string"},default:[],description:"Glob patterns for paths that are allowed regardless of depth"},forbid:{type:"array",items:{type:"string"},default:[],description:"Glob patterns for paths that are explicitly forbidden"},ignorePaths:{type:"array",items:{type:"string"},default:[],description:"Glob patterns for paths to ignore completely"},strategy:{type:"string",enum:["error","warn","autofix","suggest"],default:"error",description:"How to handle violations: error (report), warn (report), autofix (fix automatically), suggest (provide suggestions)"}},additionalProperties:false}]},defaultOptions:[{maxDepth:1,allow:[],forbid:[],ignorePaths:[],strategy:"error"}],create(context){const[options]=context.options;const{maxDepth=1,allow=[],forbid=[],ignorePaths=[],strategy="error"}=options||{};function checkImport(importPath,node){if(matchesAnyPattern(importPath,ignorePaths)){return}if(matchesAnyPattern(importPath,allow)){return}const depth=getImportDepth(importPath);const isForbidden=forbid.length>0&&matchesAnyPattern(importPath,forbid);const exceedsDepth=depth>maxDepth;if(!isForbidden&&!exceedsDepth){return}const rootImport=getRootImport(importPath);const suggestedPath=exceedsDepth?getImportAtDepth(importPath,maxDepth):rootImport;const barrelPath=depth>1?getImportAtDepth(importPath,Math.max(0,depth-1)):rootImport;const reportData={importPath,depth:String(depth),maxDepth:String(maxDepth),suggestedPath};if(strategy==="autofix"){context.report({node,messageId:"internalModuleImport",data:reportData,fix(fixer){const sourceNode=node.type==="Literal"?node:node.source;return fixer.replaceText(sourceNode,`'${rootImport}'`)}})}else if(strategy==="suggest"){context.report({node,messageId:"internalModuleImport",data:reportData,suggest:[{messageId:"suggestPublicApi",data:{suggestedPath:rootImport},fix(fixer){const sourceNode=node.type==="Literal"?node:node.source;return fixer.replaceText(sourceNode,`'${rootImport}'`)}},...barrelPath!==rootImport&&barrelPath!==suggestedPath?[{messageId:"suggestBarrelExport",data:{suggestedPath:barrelPath},fix(fixer){const sourceNode=node.type==="Literal"?node:node.source;return fixer.replaceText(sourceNode,`'${barrelPath}'`)}}]:[]]})}else{context.report({node,messageId:"internalModuleImport",data:reportData})}}return{ImportDeclaration(node){const importPath=node.source.value;if(typeof importPath==="string"){checkImport(importPath,node)}},ExportNamedDeclaration(node){if(node.source&&typeof node.source.value==="string"){checkImport(node.source.value,node)}},ExportAllDeclaration(node){if(typeof node.source.value==="string"){checkImport(node.source.value,node)}},CallExpression(node){if(node.callee.type==="Identifier"&&node.callee.name==="require"&&node.arguments.length===1){const arg=node.arguments[0];
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.noInternalModules=void 0;const eslint_devkit_1=require("@interlace/eslint-devkit");const eslint_devkit_2=require("@interlace/eslint-devkit");function matchGlob(pattern,path){const regexPattern=pattern.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*\*/g,"{{DOUBLE_STAR}}").replace(/\*/g,"[^/]*").replace(/\{\{DOUBLE_STAR\}\}/g,".*");return new RegExp(`^${regexPattern}$`).test(path)}function matchesAnyPattern(path,patterns){return patterns.some(pattern=>matchGlob(pattern,path))}function getImportDepth(importPath){if(importPath.startsWith("./")||importPath.startsWith("../")){const parts2=importPath.split("/").filter(p=>p!=="."&&p!=="..");return parts2.length}if(importPath.startsWith("@")){const parts2=importPath.split("/");return Math.max(0,parts2.length-2)}const parts=importPath.split("/");return parts.length-1}function getRootImport(importPath){if(importPath.startsWith("./")||importPath.startsWith("../")){return"."}if(importPath.startsWith("@")){const parts=importPath.split("/");return parts.slice(0,2).join("/")}return importPath.split("/")[0]}function getImportAtDepth(importPath,maxDepth){if(importPath.startsWith("./")||importPath.startsWith("../")){if(maxDepth===0)return".";const prefix=importPath.startsWith("../")?"../":"./";const parts2=importPath.replace(/^\.\.?\//,"").split("/");return prefix+parts2.slice(0,maxDepth).join("/")}if(importPath.startsWith("@")){const parts2=importPath.split("/");return parts2.slice(0,2+maxDepth).join("/")}const parts=importPath.split("/");return parts.slice(0,1+maxDepth).join("/")}exports.noInternalModules=(0,eslint_devkit_1.createRule)({name:"no-internal-modules",meta:{type:"problem",docs:{url:"https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-internal-modules.md",description:"Forbid importing the submodules of other modules"},fixable:"code",hasSuggestions:true,messages:{internalModuleImport:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Internal Module Import",description:'Import "{{importPath}}" exceeds maximum allowed depth ({{depth}} > {{maxDepth}})',severity:"MEDIUM",fix:'Import from "{{suggestedPath}}" instead of deep internal path',documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-internal-modules.md"}),suggestPublicApi:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Use Public API",description:"Import from the public API entry point",severity:"LOW",fix:'Change import to "{{suggestedPath}}"',documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-internal-modules.md"}),suggestBarrelExport:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Use Barrel Export",description:"Import from a barrel export file",severity:"LOW",fix:'Change import to "{{suggestedPath}}"',documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-internal-modules.md"})},schema:[{type:"object",properties:{maxDepth:{type:"number",minimum:0,default:1,description:"Maximum allowed depth of module imports (0 = only root, 1 = one level deep)"},allow:{type:"array",items:{type:"string"},default:[],description:"Glob patterns for paths that are allowed regardless of depth"},forbid:{type:"array",items:{type:"string"},default:[],description:"Glob patterns for paths that are explicitly forbidden"},ignorePaths:{type:"array",items:{type:"string"},default:[],description:"Glob patterns for paths to ignore completely"},strategy:{type:"string",enum:["error","warn","autofix","suggest"],default:"error",description:"How to handle violations: error (report), warn (report), autofix (fix automatically), suggest (provide suggestions)"}},additionalProperties:false}]},defaultOptions:[{maxDepth:1,allow:[],forbid:[],ignorePaths:[],strategy:"error"}],create(context){const[options]=context.options;const{maxDepth=1,allow=[],forbid=[],ignorePaths=[],strategy="error"}=options||{};function checkImport(importPath,node){if(matchesAnyPattern(importPath,ignorePaths)){return}if(matchesAnyPattern(importPath,allow)){return}const depth=getImportDepth(importPath);const isForbidden=forbid.length>0&&matchesAnyPattern(importPath,forbid);const exceedsDepth=depth>maxDepth;if(!isForbidden&&!exceedsDepth){return}const rootImport=getRootImport(importPath);const suggestedPath=exceedsDepth?getImportAtDepth(importPath,maxDepth):rootImport;const barrelPath=depth>1?getImportAtDepth(importPath,Math.max(0,depth-1)):rootImport;const reportData={importPath,depth:String(depth),maxDepth:String(maxDepth),suggestedPath};if(strategy==="autofix"){context.report({node,messageId:"internalModuleImport",data:reportData,fix(fixer){const sourceNode=node.type==="Literal"?node:node.source;return fixer.replaceText(sourceNode,`'${rootImport}'`)}})}else if(strategy==="suggest"){context.report({node,messageId:"internalModuleImport",data:reportData,suggest:[{messageId:"suggestPublicApi",data:{suggestedPath:rootImport},fix(fixer){const sourceNode=node.type==="Literal"?node:node.source;return fixer.replaceText(sourceNode,`'${rootImport}'`)}},...barrelPath!==rootImport&&barrelPath!==suggestedPath?[{messageId:"suggestBarrelExport",data:{suggestedPath:barrelPath},fix(fixer){const sourceNode=node.type==="Literal"?node:node.source;return fixer.replaceText(sourceNode,`'${barrelPath}'`)}}]:[]]})}else{context.report({node,messageId:"internalModuleImport",data:reportData})}}return{ImportDeclaration(node){const importPath=node.source.value;if(typeof importPath==="string"){checkImport(importPath,node)}},ExportNamedDeclaration(node){if(node.source&&typeof node.source.value==="string"){checkImport(node.source.value,node)}},ExportAllDeclaration(node){if(typeof node.source.value==="string"){checkImport(node.source.value,node)}},CallExpression(node){if(node.callee.type==="Identifier"&&node.callee.name==="require"&&node.arguments.length===1){const arg=node.arguments[0];const staticText=(0,eslint_devkit_1.staticString)(arg);if(staticText!==null){checkImport(staticText,arg)}}},ImportExpression(node){if(node.source.type==="Literal"&&typeof node.source.value==="string"){checkImport(node.source.value,node.source)}}}}});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.noMutableExports=void 0;const eslint_devkit_1=require("@interlace/eslint-devkit");const eslint_devkit_2=require("@interlace/eslint-devkit");exports.noMutableExports=(0,eslint_devkit_1.createRule)({name:"no-mutable-exports",meta:{type:"suggestion",docs:{url:"https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-mutable-exports.md",description:"Forbid the use of mutable exports with `var` or `let`"},hasSuggestions:false,messages:{mutableExport:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.WARNING,issueName:"Mutable Export",description:"Export uses mutable declaration that can be reassigned",severity:"MEDIUM",fix:"Use const for exports to ensure immutability",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-mutable-exports.md"}),varExport:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.WARNING,issueName:"Var Export",description:"Export declared with var can be reassigned",severity:"MEDIUM",fix:"Change var to const for better predictability",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-mutable-exports.md"}),letExport:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.WARNING,issueName:"Let Export",description:"Export declared with let can be reassigned",severity:"MEDIUM",fix:"Change let to const if value never changes",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-mutable-exports.md"})},schema:[{type:"object",properties:{allowInFiles:{type:"array",items:{type:"string"},description:"File patterns where mutable exports are allowed"},ignoreExports:{type:"array",items:{type:"string"},description:"Specific export names to ignore"}},additionalProperties:false}]},defaultOptions:[{allowInFiles:[],ignoreExports:[]}],create(context){const[options]=context.options;const{allowInFiles=[],ignoreExports=[]}=options||{};const filename=context.filename;if(!filename){return{}}function shouldSkipFile(){return allowInFiles.some(pattern=>filename.includes(pattern))}function shouldIgnoreExport(exportName){return ignoreExports.includes(exportName)}function reportMutableExport(node,exportName,declarationKind){if(shouldSkipFile()||shouldIgnoreExport(exportName)){return}const messageId=declarationKind==="var"?"varExport":"letExport";context.report({node,messageId})}function checkPattern(node,kind,reportNode=node){if(node.type==="Identifier"){reportMutableExport(reportNode,node.name,kind)}else if(node.type==="ObjectPattern"){node.properties.forEach(prop=>{if(prop.type==="Property"&&prop.value){checkPattern(prop.value,kind,prop.key)}else if(prop.type==="RestElement"){checkPattern(prop.argument,kind,prop)}})}else if(node.type==="ArrayPattern"){node.elements.forEach(element=>{if(element){checkPattern(element,kind,element)}})}}return{ExportNamedDeclaration(node){if(
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.noMutableExports=void 0;const eslint_devkit_1=require("@interlace/eslint-devkit");const eslint_devkit_2=require("@interlace/eslint-devkit");exports.noMutableExports=(0,eslint_devkit_1.createRule)({name:"no-mutable-exports",meta:{type:"suggestion",docs:{url:"https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-mutable-exports.md",description:"Forbid the use of mutable exports with `var` or `let`"},hasSuggestions:false,messages:{mutableExport:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.WARNING,issueName:"Mutable Export",description:"Export uses mutable declaration that can be reassigned",severity:"MEDIUM",fix:"Use const for exports to ensure immutability",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-mutable-exports.md"}),varExport:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.WARNING,issueName:"Var Export",description:"Export declared with var can be reassigned",severity:"MEDIUM",fix:"Change var to const for better predictability",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-mutable-exports.md"}),letExport:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.WARNING,issueName:"Let Export",description:"Export declared with let can be reassigned",severity:"MEDIUM",fix:"Change let to const if value never changes",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-mutable-exports.md"})},schema:[{type:"object",properties:{allowInFiles:{type:"array",items:{type:"string"},description:"File patterns where mutable exports are allowed"},ignoreExports:{type:"array",items:{type:"string"},description:"Specific export names to ignore"}},additionalProperties:false}]},defaultOptions:[{allowInFiles:[],ignoreExports:[]}],create(context){const[options]=context.options;const{allowInFiles=[],ignoreExports=[]}=options||{};const filename=context.filename;if(!filename){return{}}function shouldSkipFile(){return allowInFiles.some(pattern=>filename.includes(pattern))}function shouldIgnoreExport(exportName){return ignoreExports.includes(exportName)}function reportMutableExport(node,exportName,declarationKind){if(shouldSkipFile()||shouldIgnoreExport(exportName)){return}const messageId=declarationKind==="var"?"varExport":"letExport";context.report({node,messageId})}function checkPattern(node,kind,reportNode=node){if(node.type==="Identifier"){reportMutableExport(reportNode,node.name,kind)}else if(node.type==="ObjectPattern"){node.properties.forEach(prop=>{if(prop.type==="Property"&&prop.value){checkPattern(prop.value,kind,prop.key)}else if(prop.type==="RestElement"){checkPattern(prop.argument,kind,prop)}})}else if(node.type==="ArrayPattern"){node.elements.forEach(element=>{if(element){checkPattern(element,kind,element)}})}}function mutableDeclaration(node,name){const variable=context.sourceCode.getScope(node).set.get(name);if(!variable)return null;for(const def of variable.defs){if(def.type!=="Variable")continue;const{kind}=def.parent;if(kind==="var"||kind==="let")return{id:def.name,kind}}return null}return{ExportNamedDeclaration(node){if(node.declaration?.type==="VariableDeclaration"){const{kind,declarations}=node.declaration;if(kind!=="var"&&kind!=="let"){return}declarations.forEach(decl=>{checkPattern(decl.id,kind)});return}if(node.source){return}for(const specifier of node.specifiers){const declaration=mutableDeclaration(node,specifier.local.name);if(!declaration)continue;const exported=specifier.exported.type==="Identifier"?specifier.exported.name:specifier.exported.value;reportMutableExport(declaration.id,exported,declaration.kind)}}}}});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.noNamedAsDefaultMember=void 0;const eslint_devkit_1=require("@interlace/eslint-devkit");exports.noNamedAsDefaultMember=(0,eslint_devkit_1.createRule)({name:"no-named-as-default-member",meta:{type:"suggestion",docs:{url:"https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-named-as-default-member.md",description:"Forbid use of exported name as property of default export",cwe:"CWE-1078",cvss:2.5},messages:{namedAsDefaultMember:(0,eslint_devkit_1.formatLLMMessage)({icon:eslint_devkit_1.MessageIcons.ARCHITECTURE,issueName:"Named as Default Member",cwe:"CWE-1078",description:'Accessing "{{name}}" as property of default import. Import it directly instead',severity:"LOW",fix:'Import the named export directly: import { {{name}} } from "..."',documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-named-as-default-member.md"})},schema:[]},defaultOptions:[],create(context){const defaultImports=new Map;const namedImportsBySource=new Map;return{ImportDeclaration(node){const source=node.source.value;node.specifiers.forEach(spec=>{if(spec.type===eslint_devkit_1.AST_NODE_TYPES.ImportDefaultSpecifier){defaultImports.set(spec.local.name,{source,node:spec})}else if(spec.type===eslint_devkit_1.AST_NODE_TYPES.ImportSpecifier){if(!namedImportsBySource.has(source)){namedImportsBySource.set(source,new Set)}const importedName=spec.imported.type===eslint_devkit_1.AST_NODE_TYPES.Identifier?spec.imported.name:spec.imported.value;namedImportsBySource.get(source)?.add(importedName)}})},MemberExpression(node){if(node.object.type!==eslint_devkit_1.AST_NODE_TYPES.Identifier){return}
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.noNamedAsDefaultMember=void 0;const eslint_devkit_1=require("@interlace/eslint-devkit");exports.noNamedAsDefaultMember=(0,eslint_devkit_1.createRule)({name:"no-named-as-default-member",meta:{type:"suggestion",docs:{url:"https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-named-as-default-member.md",description:"Forbid use of exported name as property of default export",cwe:"CWE-1078",cvss:2.5},messages:{namedAsDefaultMember:(0,eslint_devkit_1.formatLLMMessage)({icon:eslint_devkit_1.MessageIcons.ARCHITECTURE,issueName:"Named as Default Member",cwe:"CWE-1078",description:'Accessing "{{name}}" as property of default import. Import it directly instead',severity:"LOW",fix:'Import the named export directly: import { {{name}} } from "..."',documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-named-as-default-member.md"})},schema:[]},defaultOptions:[],create(context){const defaultImports=new Map;const namedImportsBySource=new Map;return{ImportDeclaration(node){const source=node.source.value;node.specifiers.forEach(spec=>{if(spec.type===eslint_devkit_1.AST_NODE_TYPES.ImportDefaultSpecifier){defaultImports.set(spec.local.name,{source,node:spec})}else if(spec.type===eslint_devkit_1.AST_NODE_TYPES.ImportSpecifier){if(!namedImportsBySource.has(source)){namedImportsBySource.set(source,new Set)}const importedName=spec.imported.type===eslint_devkit_1.AST_NODE_TYPES.Identifier?spec.imported.name:spec.imported.value;namedImportsBySource.get(source)?.add(importedName)}})},MemberExpression(node){if(node.object.type!==eslint_devkit_1.AST_NODE_TYPES.Identifier){return}const defaultImportInfo=defaultImports.get(node.object.name);if(!defaultImportInfo)return;const propertyName=node.property.type===eslint_devkit_1.AST_NODE_TYPES.Identifier&&!node.computed?node.property.name:node.property.type===eslint_devkit_1.AST_NODE_TYPES.Literal&&typeof node.property.value==="string"?node.property.value:null;if(propertyName===null)return;const namedExports=namedImportsBySource.get(defaultImportInfo.source);if(namedExports&&namedExports.has(propertyName)){context.report({node,messageId:"namedAsDefaultMember",data:{name:propertyName}})}}}}});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.noNamedAsDefault=void 0;const eslint_devkit_1=require("@interlace/eslint-devkit");exports.noNamedAsDefault=(0,eslint_devkit_1.createRule)({name:"no-named-as-default",meta:{type:"problem",docs:{url:"https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-named-as-default.md",description:"Forbid use of exported name as identifier of default export",cwe:"CWE-1078",cvss:5},messages:{namedAsDefault:(0,eslint_devkit_1.formatLLMMessage)({icon:eslint_devkit_1.MessageIcons.ARCHITECTURE,issueName:"Named as Default",cwe:"CWE-1078",description:'Using exported name "{{name}}" as default import may shadow the named export',severity:"MEDIUM",fix:"Use a different name for the default import or import the named export instead",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-named-as-default.md"})},schema:[]},defaultOptions:[],create(context){const
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.noNamedAsDefault=void 0;const eslint_devkit_1=require("@interlace/eslint-devkit");const nameOf=node=>node.type==="Identifier"?node.name:node.value;exports.noNamedAsDefault=(0,eslint_devkit_1.createRule)({name:"no-named-as-default",meta:{type:"problem",docs:{url:"https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-named-as-default.md",description:"Forbid use of exported name as identifier of default export",cwe:"CWE-1078",cvss:5},messages:{namedAsDefault:(0,eslint_devkit_1.formatLLMMessage)({icon:eslint_devkit_1.MessageIcons.ARCHITECTURE,issueName:"Named as Default",cwe:"CWE-1078",description:'Using exported name "{{name}}" as default import may shadow the named export',severity:"MEDIUM",fix:"Use a different name for the default import or import the named export instead",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-named-as-default.md"})},schema:[]},defaultOptions:[],create(context){return{ImportDeclaration(node){const named=[];let defaultName=null;for(const spec of node.specifiers){if(spec.type==="ImportDefaultSpecifier"){defaultName=spec.local.name;continue}if(spec.type!=="ImportSpecifier")continue;if(nameOf(spec.imported)==="default"){defaultName=spec.local.name;continue}named.push(spec)}if(defaultName===null)return;const collision=named.find(spec=>nameOf(spec.imported)===defaultName);if(collision===void 0)return;context.report({node:collision,messageId:"namedAsDefault",data:{name:defaultName}})}}}});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.noNodejsModules=void 0;const eslint_devkit_1=require("@interlace/eslint-devkit");const eslint_devkit_2=require("@interlace/eslint-devkit");const NODEJS_BUILTINS=new Set(["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","constants","module","process"]);const BUILTIN_ALTERNATIVES={fs:"Use platform-specific file APIs or isomorphic libraries",path:"Use URL constructor or path utilities from your bundler",crypto:"Use Web Crypto API (crypto.subtle) or crypto libraries",buffer:"Use Uint8Array or ArrayBuffer for binary data",child_process:"Use Web Workers or platform-specific APIs",os:"Use navigator.userAgent or platform detection libraries",http:"Use fetch() API or HTTP client libraries",https:"Use fetch() API or HTTP client libraries",stream:"Use ReadableStream/WriteableStream or streaming libraries",events:"Use DOM events or event libraries",util:"Use utility libraries or built-in language features",url:"Use URL constructor and URLSearchParams",querystring:"Use URLSearchParams or query parsing libraries",timers:"Use setTimeout/setInterval or timer libraries"};exports.noNodejsModules=(0,eslint_devkit_1.createRule)({name:"no-nodejs-modules",meta:{type:"problem",docs:{url:"https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-nodejs-modules.md",description:"Prevents Node.js builtin imports"},messages:{nodejsBuiltinImport:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.DEVELOPMENT,issueName:"Node.js Builtin Import",description:"Node.js builtin module import detected",severity:"HIGH",fix:"Replace with browser-compatible alternative or conditional import",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-nodejs-modules.md"}),nodejsBuiltinRequire:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.DEVELOPMENT,issueName:"Node.js Builtin Require",description:"Node.js builtin module require() detected",severity:"HIGH",fix:"Replace with browser-compatible alternative or conditional require",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-nodejs-modules.md"}),nodejsBuiltinDynamic:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.DEVELOPMENT,issueName:"Node.js Builtin Dynamic Import",description:"Node.js builtin module dynamic import detected",severity:"HIGH",fix:"Use conditional dynamic import with browser-compatible fallback",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-nodejs-modules.md"})},schema:[{type:"object",properties:{allow:{type:"array",items:{type:"string"},description:"Node.js builtins to allow."},additionalBuiltins:{type:"array",items:{type:"string"},description:"Additional modules to treat as builtins."},suggestAlternatives:{type:"boolean",default:true,description:"Suggest browser-compatible alternatives."}},additionalProperties:false}]},defaultOptions:[{allow:[],additionalBuiltins:[],suggestAlternatives:true}],create(context){const[options]=context.options;const{allow=[],additionalBuiltins=[],suggestAlternatives=true}=options||{};const allBuiltins=new Set([...NODEJS_BUILTINS,...additionalBuiltins]);const allowedBuiltins=new Set(allow);function isNodejsBuiltin(moduleName){if(allBuiltins.has(moduleName)){return!allowedBuiltins.has(moduleName)}if(moduleName.startsWith("node:")){const builtinName=moduleName.slice(5);return allBuiltins.has(builtinName)&&!allowedBuiltins.has(builtinName)}return false}function getBuiltinName(moduleName){if(moduleName.startsWith("node:")){return moduleName.slice(5)}return moduleName}function generateAlternativeSuggestion(builtinName){if(!suggestAlternatives){return""}const alternative=BUILTIN_ALTERNATIVES[builtinName];if(alternative){return`// Alternative: ${alternative}`}return"// Consider using a browser-compatible library or conditional import"}function reportBuiltin(node,moduleName,importType){const builtinName=getBuiltinName(moduleName);const alternative=generateAlternativeSuggestion(builtinName);let messageId;let fixSuggestion;switch(importType){case"static":messageId="nodejsBuiltinImport";fixSuggestion="Use conditional import or browser-compatible alternative";break;case"require":messageId="nodejsBuiltinRequire";fixSuggestion="Use dynamic import with fallback or browser-compatible alternative";break;case"dynamic":messageId="nodejsBuiltinDynamic";fixSuggestion="Add browser-compatible fallback in dynamic import";break}context.report({node,messageId,data:{moduleName,builtinName,currentFile:context.filename,alternative,suggestion:fixSuggestion}})}return{ImportDeclaration(node){const moduleName=node.source
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.noNodejsModules=void 0;const eslint_devkit_1=require("@interlace/eslint-devkit");const eslint_devkit_2=require("@interlace/eslint-devkit");const NODEJS_BUILTINS=new Set(["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","constants","module","process"]);const BUILTIN_ALTERNATIVES={fs:"Use platform-specific file APIs or isomorphic libraries",path:"Use URL constructor or path utilities from your bundler",crypto:"Use Web Crypto API (crypto.subtle) or crypto libraries",buffer:"Use Uint8Array or ArrayBuffer for binary data",child_process:"Use Web Workers or platform-specific APIs",os:"Use navigator.userAgent or platform detection libraries",http:"Use fetch() API or HTTP client libraries",https:"Use fetch() API or HTTP client libraries",stream:"Use ReadableStream/WriteableStream or streaming libraries",events:"Use DOM events or event libraries",util:"Use utility libraries or built-in language features",url:"Use URL constructor and URLSearchParams",querystring:"Use URLSearchParams or query parsing libraries",timers:"Use setTimeout/setInterval or timer libraries"};exports.noNodejsModules=(0,eslint_devkit_1.createRule)({name:"no-nodejs-modules",meta:{type:"problem",docs:{url:"https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-nodejs-modules.md",description:"Prevents Node.js builtin imports"},messages:{nodejsBuiltinImport:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.DEVELOPMENT,issueName:"Node.js Builtin Import",description:"Node.js builtin module import detected",severity:"HIGH",fix:"Replace with browser-compatible alternative or conditional import",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-nodejs-modules.md"}),nodejsBuiltinRequire:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.DEVELOPMENT,issueName:"Node.js Builtin Require",description:"Node.js builtin module require() detected",severity:"HIGH",fix:"Replace with browser-compatible alternative or conditional require",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-nodejs-modules.md"}),nodejsBuiltinDynamic:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.DEVELOPMENT,issueName:"Node.js Builtin Dynamic Import",description:"Node.js builtin module dynamic import detected",severity:"HIGH",fix:"Use conditional dynamic import with browser-compatible fallback",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-nodejs-modules.md"})},schema:[{type:"object",properties:{allow:{type:"array",items:{type:"string"},description:"Node.js builtins to allow."},additionalBuiltins:{type:"array",items:{type:"string"},description:"Additional modules to treat as builtins."},suggestAlternatives:{type:"boolean",default:true,description:"Suggest browser-compatible alternatives."}},additionalProperties:false}]},defaultOptions:[{allow:[],additionalBuiltins:[],suggestAlternatives:true}],create(context){const[options]=context.options;const{allow=[],additionalBuiltins=[],suggestAlternatives=true}=options||{};const allBuiltins=new Set([...NODEJS_BUILTINS,...additionalBuiltins]);const allowedBuiltins=new Set(allow);function isNodejsBuiltin(moduleName){if(allBuiltins.has(moduleName)){return!allowedBuiltins.has(moduleName)}if(moduleName.startsWith("node:")){const builtinName=moduleName.slice(5);return allBuiltins.has(builtinName)&&!allowedBuiltins.has(builtinName)}return false}function getBuiltinName(moduleName){if(moduleName.startsWith("node:")){return moduleName.slice(5)}return moduleName}function generateAlternativeSuggestion(builtinName){if(!suggestAlternatives){return""}const alternative=BUILTIN_ALTERNATIVES[builtinName];if(alternative){return`// Alternative: ${alternative}`}return"// Consider using a browser-compatible library or conditional import"}function reportBuiltin(node,moduleName,importType){const builtinName=getBuiltinName(moduleName);const alternative=generateAlternativeSuggestion(builtinName);let messageId;let fixSuggestion;switch(importType){case"static":messageId="nodejsBuiltinImport";fixSuggestion="Use conditional import or browser-compatible alternative";break;case"require":messageId="nodejsBuiltinRequire";fixSuggestion="Use dynamic import with fallback or browser-compatible alternative";break;case"dynamic":messageId="nodejsBuiltinDynamic";fixSuggestion="Add browser-compatible fallback in dynamic import";break}context.report({node,messageId,data:{moduleName,builtinName,currentFile:context.filename,alternative,suggestion:fixSuggestion}})}return{ImportDeclaration(node){const moduleName=(0,eslint_devkit_1.staticString)(node.source);if(typeof moduleName==="string"&&isNodejsBuiltin(moduleName)){reportBuiltin(node.source,moduleName,"static")}},CallExpression(node){if(node.callee.type==="Identifier"&&node.callee.name==="require"&&node.arguments.length===1){const arg=node.arguments[0];const staticText1=(0,eslint_devkit_1.staticString)(arg);if(staticText1!==null){const moduleName=staticText1;if(isNodejsBuiltin(moduleName)){reportBuiltin(arg,moduleName,"require")}}}},ImportExpression(node){const source=node.source;const staticText2=(0,eslint_devkit_1.staticString)(source);if(staticText2!==null){const moduleName=staticText2;if(isNodejsBuiltin(moduleName)){reportBuiltin(source,moduleName,"dynamic")}}},TSImportEqualsDeclaration(node){if(node.moduleReference.type==="TSExternalModuleReference"&&node.moduleReference.expression.type==="Literal"&&typeof node.moduleReference.expression.value==="string"){const moduleName=node.moduleReference.expression.value;if(isNodejsBuiltin(moduleName)){reportBuiltin(node.moduleReference,moduleName,"require")}}}}}});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.noRelativeParentImports=void 0;const eslint_devkit_1=require("@interlace/eslint-devkit");const eslint_devkit_2=require("@interlace/eslint-devkit");exports.noRelativeParentImports=(0,eslint_devkit_1.createRule)({name:"no-relative-parent-imports",meta:{type:"problem",docs:{url:"https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-relative-parent-imports.md",description:"Prevents ../ imports"},hasSuggestions:false,messages:{relativeParentImport:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Relative Parent Import",description:"Relative parent import (..) detected",severity:"MEDIUM",fix:"Use absolute import or move code closer to dependencies",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-relative-parent-imports.md"}),preferAbsoluteImport:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Prefer Absolute Import",description:"Parent directory import makes dependencies unclear",severity:"LOW",fix:"Use absolute import path instead of relative",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-relative-parent-imports.md"}),suggestAlias:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Import Alias Suggestion",description:"Consider using import alias for cleaner imports",severity:"LOW",fix:"Configure import alias (e.g., @/ or ~/ ) for absolute imports",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-relative-parent-imports.md"})},schema:[{type:"object",properties:{commonjs:{type:"boolean",default:true,description:"Check CommonJS require() calls."},amd:{type:"boolean",default:false,description:"Check AMD define/require calls."}},additionalProperties:false}]},defaultOptions:[{commonjs:true,amd:false}],create(context){const[options]=context.options;const{commonjs=true,amd=false}=options||{};function checkImport(importPath,node){if(importPath.startsWith("..")){context.report({node,messageId:"preferAbsoluteImport"})}}return{ImportDeclaration(node){const importPath=node.source.value;if(typeof importPath==="string"){checkImport(importPath,node.source)}},CallExpression(node){if(commonjs&&node.callee.type==="Identifier"&&node.callee.name==="require"&&node.arguments.length===1){const arg=node.arguments[0];
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.noRelativeParentImports=void 0;const eslint_devkit_1=require("@interlace/eslint-devkit");const eslint_devkit_2=require("@interlace/eslint-devkit");exports.noRelativeParentImports=(0,eslint_devkit_1.createRule)({name:"no-relative-parent-imports",meta:{type:"problem",docs:{url:"https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-relative-parent-imports.md",description:"Prevents ../ imports"},hasSuggestions:false,messages:{relativeParentImport:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Relative Parent Import",description:"Relative parent import (..) detected",severity:"MEDIUM",fix:"Use absolute import or move code closer to dependencies",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-relative-parent-imports.md"}),preferAbsoluteImport:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Prefer Absolute Import",description:"Parent directory import makes dependencies unclear",severity:"LOW",fix:"Use absolute import path instead of relative",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-relative-parent-imports.md"}),suggestAlias:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Import Alias Suggestion",description:"Consider using import alias for cleaner imports",severity:"LOW",fix:"Configure import alias (e.g., @/ or ~/ ) for absolute imports",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-relative-parent-imports.md"})},schema:[{type:"object",properties:{commonjs:{type:"boolean",default:true,description:"Check CommonJS require() calls."},amd:{type:"boolean",default:false,description:"Check AMD define/require calls."}},additionalProperties:false}]},defaultOptions:[{commonjs:true,amd:false}],create(context){const[options]=context.options;const{commonjs=true,amd=false}=options||{};function checkImport(importPath,node){if(importPath.startsWith("..")){context.report({node,messageId:"preferAbsoluteImport"})}}return{ImportDeclaration(node){const importPath=node.source.value;if(typeof importPath==="string"){checkImport(importPath,node.source)}},CallExpression(node){if(commonjs&&node.callee.type==="Identifier"&&node.callee.name==="require"&&node.arguments.length===1){const arg=node.arguments[0];const staticText=(0,eslint_devkit_1.staticString)(arg);if(staticText!==null){checkImport(staticText,arg)}}if(amd&&node.callee.type==="Identifier"&&(node.callee.name==="define"||node.callee.name==="require")&&node.arguments.length>=1){const depsArg=node.arguments[0];if(depsArg.type==="ArrayExpression"){depsArg.elements.forEach(element=>{if(element?.type==="Literal"&&typeof element.value==="string"){checkImport(element.value,element)}})}}},TSImportEqualsDeclaration(node){if(node.moduleReference.type==="TSExternalModuleReference"&&node.moduleReference.expression.type==="Literal"&&typeof node.moduleReference.expression.value==="string"){checkImport(node.moduleReference.expression.value,node.moduleReference)}}}}});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.noRestrictedPaths=void 0;const eslint_devkit_1=require("@interlace/eslint-devkit");const eslint_devkit_2=require("@interlace/eslint-devkit");exports.noRestrictedPaths=(0,eslint_devkit_1.createRule)({name:"no-restricted-paths",meta:{type:"problem",docs:{url:"https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-restricted-paths.md",description:"Enforce which files can be imported in a given folder"},hasSuggestions:false,messages:{restrictedPath:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Restricted Import Path",description:"Import violates architectural boundary rules",severity:"HIGH",fix:"Restructure code to respect architectural boundaries",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-restricted-paths.md"}),pathViolation:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Architecture Violation",description:"Import crosses forbidden architectural boundary",severity:"HIGH",fix:"Move code or adjust import to comply with architecture rules",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-restricted-paths.md"}),zoneViolation:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Zone Boundary Violation",description:"Import violates defined architectural zones",severity:"MEDIUM",fix:"Restructure imports to respect zone boundaries",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-restricted-paths.md"})},schema:[{type:"object",properties:{restricted:{type:"array",items:{type:"string"},description:"Array of restricted path patterns"}},additionalProperties:false}]},defaultOptions:[{restricted:[]}],create(context){const[options]=context.options;const{restricted=[]}=options||{};function checkImport(importPath,node){for(const pattern of restricted){if(importPath.includes(pattern)){context.report({node,messageId:"pathViolation"});return}}}return{ImportDeclaration(node){const importPath=node.source.value;if(typeof importPath==="string"){checkImport(importPath,node.source)}},CallExpression(node){if(node.callee.type==="Identifier"&&node.callee.name==="require"&&node.arguments.length===1){const arg=node.arguments[0];
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.noRestrictedPaths=void 0;const eslint_devkit_1=require("@interlace/eslint-devkit");const eslint_devkit_2=require("@interlace/eslint-devkit");exports.noRestrictedPaths=(0,eslint_devkit_1.createRule)({name:"no-restricted-paths",meta:{type:"problem",docs:{url:"https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-restricted-paths.md",description:"Enforce which files can be imported in a given folder"},hasSuggestions:false,messages:{restrictedPath:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Restricted Import Path",description:"Import violates architectural boundary rules",severity:"HIGH",fix:"Restructure code to respect architectural boundaries",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-restricted-paths.md"}),pathViolation:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Architecture Violation",description:"Import crosses forbidden architectural boundary",severity:"HIGH",fix:"Move code or adjust import to comply with architecture rules",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-restricted-paths.md"}),zoneViolation:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Zone Boundary Violation",description:"Import violates defined architectural zones",severity:"MEDIUM",fix:"Restructure imports to respect zone boundaries",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-restricted-paths.md"})},schema:[{type:"object",properties:{restricted:{type:"array",items:{type:"string"},description:"Array of restricted path patterns"}},additionalProperties:false}]},defaultOptions:[{restricted:[]}],create(context){const[options]=context.options;const{restricted=[]}=options||{};function checkImport(importPath,node){for(const pattern of restricted){if(importPath.includes(pattern)){context.report({node,messageId:"pathViolation"});return}}}return{ImportDeclaration(node){const importPath=node.source.value;if(typeof importPath==="string"){checkImport(importPath,node.source)}},CallExpression(node){if(node.callee.type==="Identifier"&&node.callee.name==="require"&&node.arguments.length===1){const arg=node.arguments[0];const staticText=(0,eslint_devkit_1.staticString)(arg);if(staticText!==null){checkImport(staticText,arg)}}}}}});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.noUnassignedImport=void 0;const eslint_devkit_1=require("@interlace/eslint-devkit");const eslint_devkit_2=require("@interlace/eslint-devkit");exports.noUnassignedImport=(0,eslint_devkit_1.createRule)({name:"no-unassigned-import",meta:{type:"problem",docs:{url:"https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-unassigned-import.md",description:"Prevents unassigned imports"},hasSuggestions:false,messages:{unassignedImport:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Unassigned Import",description:"Import statement without variable assignment",severity:"MEDIUM",fix:"Assign import to variable or use side-effect comment",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-unassigned-import.md"}),sideEffectOnly:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Side Effect Import",description:"Import for side effects should be documented",severity:"LOW",fix:"Add comment explaining side effect or assign to variable",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-unassigned-import.md"}),missingAssignment:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Missing Import Assignment",description:"Import requires explicit variable assignment",severity:"HIGH",fix:"Import must be assigned to variable for tracking",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-unassigned-import.md"})},schema:[{type:"object",properties:{allowModules:{type:"array",items:{type:"string"},description:"Allow specific modules to be imported without assignment."}},additionalProperties:false}]},defaultOptions:[{allowModules:[]}],create(context){const[options]=context.options;const{allowModules=[]}=options||{};function shouldAllow(importPath){return allowModules.includes(importPath)}return{ImportDeclaration(node){const importPath=node.source.value;if(typeof importPath!=="string"){return}if(shouldAllow(importPath)){return}const hasSpecifiers=node.specifiers&&node.specifiers.length>0;if(!hasSpecifiers){context.report({node:node.source,messageId:"unassignedImport"})}},CallExpression(node){if(node.callee.type===eslint_devkit_1.AST_NODE_TYPES.Identifier&&node.callee.name==="require"&&node.arguments.length===1){const arg=node.arguments[0];
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.noUnassignedImport=void 0;const eslint_devkit_1=require("@interlace/eslint-devkit");const eslint_devkit_2=require("@interlace/eslint-devkit");exports.noUnassignedImport=(0,eslint_devkit_1.createRule)({name:"no-unassigned-import",meta:{type:"problem",docs:{url:"https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-unassigned-import.md",description:"Prevents unassigned imports"},hasSuggestions:false,messages:{unassignedImport:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Unassigned Import",description:"Import statement without variable assignment",severity:"MEDIUM",fix:"Assign import to variable or use side-effect comment",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-unassigned-import.md"}),sideEffectOnly:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Side Effect Import",description:"Import for side effects should be documented",severity:"LOW",fix:"Add comment explaining side effect or assign to variable",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-unassigned-import.md"}),missingAssignment:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Missing Import Assignment",description:"Import requires explicit variable assignment",severity:"HIGH",fix:"Import must be assigned to variable for tracking",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-unassigned-import.md"})},schema:[{type:"object",properties:{allowModules:{type:"array",items:{type:"string"},description:"Allow specific modules to be imported without assignment."}},additionalProperties:false}]},defaultOptions:[{allowModules:[]}],create(context){const[options]=context.options;const{allowModules=[]}=options||{};function shouldAllow(importPath){return allowModules.includes(importPath)}return{ImportDeclaration(node){const importPath=node.source.value;if(typeof importPath!=="string"){return}if(shouldAllow(importPath)){return}const hasSpecifiers=node.specifiers&&node.specifiers.length>0;if(!hasSpecifiers){context.report({node:node.source,messageId:"unassignedImport"})}},CallExpression(node){if(node.callee.type===eslint_devkit_1.AST_NODE_TYPES.Identifier&&node.callee.name==="require"&&node.arguments.length===1){const arg=node.arguments[0];const staticText=(0,eslint_devkit_1.staticString)(arg);if(staticText!==null){if(!shouldAllow(staticText)){const parent=node.parent;if(parent&&parent.type===eslint_devkit_1.AST_NODE_TYPES.ExpressionStatement){context.report({node:arg,messageId:"unassignedImport"})}else if(parent&&parent.type===eslint_devkit_1.AST_NODE_TYPES.SequenceExpression){const expressions=parent.expressions;if(expressions[expressions.length-1]!==node){context.report({node:arg,messageId:"unassignedImport"})}}}}}}}}});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.noUnresolved=void 0;const node_module_1=require("node:module");const eslint_devkit_1=require("@interlace/eslint-devkit");const eslint_devkit_2=require("@interlace/eslint-devkit");const eslint_devkit_3=require("@interlace/eslint-devkit");exports.noUnresolved=(0,eslint_devkit_1.createRule)({name:"no-unresolved",meta:{type:"problem",docs:{url:"https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-unresolved.md",description:"Ensures imports point to resolvable modules"},hasSuggestions:true,messages:{unresolvedImport:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Unresolved Import",description:"Import cannot be resolved to a module",severity:"HIGH",fix:"Ensure the module exists or check the import path spelling",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-unresolved.md"}),moduleNotFound:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Module Not Found",description:"Cannot find module or file",severity:"HIGH",fix:"Verify the file exists and the path is correct",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-unresolved.md"}),invalidExtension:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Invalid File Extension",description:"File extension missing or invalid",severity:"MEDIUM",fix:"Add correct file extension or check if file exists",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-unresolved.md"}),addIgnoreComment:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.INFO,issueName:"Add to Ignore",description:"Add to ignore list if intentional",severity:"LOW",fix:"// eslint-disable-next-line import/no-unresolved",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-unresolved.md"})},schema:[{type:"object",properties:{extensions:{type:"array",items:{type:"string"},description:"File extensions to consider when resolving imports."},ignore:{type:"array",items:{type:"string"},description:"Modules/patterns to ignore during resolution."},allowUnresolved:{type:"boolean",default:false,description:"Allow unresolved imports in certain contexts."}},additionalProperties:false}]},defaultOptions:[{extensions:[".js",".jsx",".ts",".tsx",".json"],ignore:[],allowUnresolved:false}],create(context){const[options]=context.options;const{ignore=[],allowUnresolved=false}=options||{};if(allowUnresolved){return{}}function shouldIgnore(importPath){return ignore.some(pattern=>{if(pattern.includes("*")){const regex=new RegExp(pattern.replace(/\*/g,".*"));return regex.test(importPath)}return importPath===pattern||importPath.startsWith(pattern+"/")})}function checkImport(importPath,node){if(shouldIgnore(importPath)){return}if(importPath.startsWith("node:")||node_module_1.builtinModules.includes(importPath)){return}const filePath=context.filename;const resolved=(0,eslint_devkit_3.resolveModule)(importPath,filePath,{extensions:options?.extensions});if(!resolved){context.report({node,messageId:"moduleNotFound",data:{importPath,suggestion:"Check if the file exists, verify the path, or add to ignore list"},suggest:[{messageId:"addIgnoreComment",fix(fixer){let statement=node;while(statement.parent&&statement.parent.type!=="Program"){if(["ImportDeclaration","VariableDeclaration","ExpressionStatement","ExportNamedDeclaration","ExportAllDeclaration"].includes(statement.parent.type)){statement=statement.parent;break}statement=statement.parent}return fixer.insertTextBefore(statement,"// eslint-disable-next-line import-next/no-unresolved\n")}}]})}}return{ImportDeclaration(node){const importPath=node.source.value;if(typeof importPath==="string"){checkImport(importPath,node.source)}},ExportNamedDeclaration(node){if(node.source&&typeof node.source.value==="string"){checkImport(node.source.value,node.source)}},ExportAllDeclaration(node){if(node.source&&typeof node.source.value==="string"){checkImport(node.source.value,node.source)}},CallExpression(node){if(node.callee.type==="Identifier"&&node.callee.name==="require"&&node.arguments.length===1){const arg=node.arguments[0];
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.noUnresolved=void 0;const node_module_1=require("node:module");const eslint_devkit_1=require("@interlace/eslint-devkit");const eslint_devkit_2=require("@interlace/eslint-devkit");const eslint_devkit_3=require("@interlace/eslint-devkit");exports.noUnresolved=(0,eslint_devkit_1.createRule)({name:"no-unresolved",meta:{type:"problem",docs:{url:"https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-unresolved.md",description:"Ensures imports point to resolvable modules"},hasSuggestions:true,messages:{unresolvedImport:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Unresolved Import",description:"Import cannot be resolved to a module",severity:"HIGH",fix:"Ensure the module exists or check the import path spelling",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-unresolved.md"}),moduleNotFound:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Module Not Found",description:"Cannot find module or file",severity:"HIGH",fix:"Verify the file exists and the path is correct",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-unresolved.md"}),invalidExtension:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Invalid File Extension",description:"File extension missing or invalid",severity:"MEDIUM",fix:"Add correct file extension or check if file exists",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-unresolved.md"}),addIgnoreComment:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.INFO,issueName:"Add to Ignore",description:"Add to ignore list if intentional",severity:"LOW",fix:"// eslint-disable-next-line import/no-unresolved",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-unresolved.md"})},schema:[{type:"object",properties:{extensions:{type:"array",items:{type:"string"},description:"File extensions to consider when resolving imports."},ignore:{type:"array",items:{type:"string"},description:"Modules/patterns to ignore during resolution."},allowUnresolved:{type:"boolean",default:false,description:"Allow unresolved imports in certain contexts."}},additionalProperties:false}]},defaultOptions:[{extensions:[".js",".jsx",".ts",".tsx",".json"],ignore:[],allowUnresolved:false}],create(context){const[options]=context.options;const{ignore=[],allowUnresolved=false}=options||{};if(allowUnresolved){return{}}function shouldIgnore(importPath){return ignore.some(pattern=>{if(pattern.includes("*")){const regex=new RegExp(pattern.replace(/\*/g,".*"));return regex.test(importPath)}return importPath===pattern||importPath.startsWith(pattern+"/")})}function checkImport(importPath,node){if(shouldIgnore(importPath)){return}if(importPath.startsWith("node:")||node_module_1.builtinModules.includes(importPath)){return}const filePath=context.filename;const resolved=(0,eslint_devkit_3.resolveModule)(importPath,filePath,{extensions:options?.extensions});if(!resolved){context.report({node,messageId:"moduleNotFound",data:{importPath,suggestion:"Check if the file exists, verify the path, or add to ignore list"},suggest:[{messageId:"addIgnoreComment",fix(fixer){let statement=node;while(statement.parent&&statement.parent.type!=="Program"){if(["ImportDeclaration","VariableDeclaration","ExpressionStatement","ExportNamedDeclaration","ExportAllDeclaration"].includes(statement.parent.type)){statement=statement.parent;break}statement=statement.parent}return fixer.insertTextBefore(statement,"// eslint-disable-next-line import-next/no-unresolved\n")}}]})}}return{ImportDeclaration(node){const importPath=node.source.value;if(typeof importPath==="string"){checkImport(importPath,node.source)}},ExportNamedDeclaration(node){if(node.source&&typeof node.source.value==="string"){checkImport(node.source.value,node.source)}},ExportAllDeclaration(node){if(node.source&&typeof node.source.value==="string"){checkImport(node.source.value,node.source)}},CallExpression(node){if(node.callee.type==="Identifier"&&node.callee.name==="require"&&node.arguments.length===1){const arg=node.arguments[0];const staticText=(0,eslint_devkit_1.staticString)(arg);if(staticText!==null){checkImport(staticText,arg)}}},ImportExpression(node){if(node.source.type==="Literal"&&typeof node.source.value==="string"){checkImport(node.source.value,node.source)}},TSImportEqualsDeclaration(node){if(node.moduleReference.type==="TSExternalModuleReference"&&node.moduleReference.expression.type==="Literal"&&typeof node.moduleReference.expression.value==="string"){checkImport(node.moduleReference.expression.value,node.moduleReference)}}}}});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.preferNodeProtocol=void 0;const eslint_devkit_1=require("@interlace/eslint-devkit");const eslint_devkit_2=require("@interlace/eslint-devkit");const NODE_BUILT_INS=new Set(["assert","async_hooks","buffer","child_process","cluster","console","constants","crypto","dgram","diagnostics_channel","dns","domain","events","fs","http","http2","https","inspector","module","net","os","path","perf_hooks","process","punycode","querystring","readline","repl","stream","string_decoder","sys","timers","tls","trace_events","tty","url","util","v8","vm","wasi","worker_threads","zlib"]);exports.preferNodeProtocol=(0,eslint_devkit_1.createRule)({name:"prefer-node-protocol",meta:{type:"suggestion",docs:{url:"https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/prefer-node-protocol.md",description:"Prefer using the node: protocol when importing Node.js builtin modules"},fixable:"code",messages:{preferNodeProtocol:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.WARNING,issueName:"Node.js Protocol Import",description:"Use node: protocol for built-in modules",severity:"MEDIUM",fix:'Change "{{moduleName}}" to "node:{{moduleName}}" in import',documentationLink:"https://nodejs.org/api/modules.html#modules_node_imports"})},schema:[{type:"object",properties:{additionalModules:{type:"array",items:{type:"string"},default:[]}},additionalProperties:false}]},defaultOptions:[{}],create(context,[options={}]){const{additionalModules=[]}=options||{};const allModulesToCheck=new Set([...NODE_BUILT_INS,...additionalModules]);return{ImportDeclaration(node){const moduleName=node.source.value;if(typeof moduleName==="string"&&isBuiltInModule(moduleName,allModulesToCheck)){const fixedModuleName=`node:${moduleName}`;context.report({node:node.source,messageId:"preferNodeProtocol",data:{moduleName,fix:`Change "${moduleName}" to "${fixedModuleName}"`},fix(fixer){return fixer.replaceText(node.source,`"${fixedModuleName}"`)}})}},CallExpression(node){if(node.callee.type==="Identifier"&&node.callee.name==="require"&&node.arguments.length===1){const arg=node.arguments[0];
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.preferNodeProtocol=void 0;const eslint_devkit_1=require("@interlace/eslint-devkit");const eslint_devkit_2=require("@interlace/eslint-devkit");const NODE_BUILT_INS=new Set(["assert","async_hooks","buffer","child_process","cluster","console","constants","crypto","dgram","diagnostics_channel","dns","domain","events","fs","http","http2","https","inspector","module","net","os","path","perf_hooks","process","punycode","querystring","readline","repl","stream","string_decoder","sys","timers","tls","trace_events","tty","url","util","v8","vm","wasi","worker_threads","zlib"]);exports.preferNodeProtocol=(0,eslint_devkit_1.createRule)({name:"prefer-node-protocol",meta:{type:"suggestion",docs:{url:"https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/prefer-node-protocol.md",description:"Prefer using the node: protocol when importing Node.js builtin modules"},fixable:"code",messages:{preferNodeProtocol:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.WARNING,issueName:"Node.js Protocol Import",description:"Use node: protocol for built-in modules",severity:"MEDIUM",fix:'Change "{{moduleName}}" to "node:{{moduleName}}" in import',documentationLink:"https://nodejs.org/api/modules.html#modules_node_imports"})},schema:[{type:"object",properties:{additionalModules:{type:"array",items:{type:"string"},default:[]}},additionalProperties:false}]},defaultOptions:[{}],create(context,[options={}]){const{additionalModules=[]}=options||{};const allModulesToCheck=new Set([...NODE_BUILT_INS,...additionalModules]);return{ImportDeclaration(node){const moduleName=node.source.value;if(typeof moduleName==="string"&&isBuiltInModule(moduleName,allModulesToCheck)){const fixedModuleName=`node:${moduleName}`;context.report({node:node.source,messageId:"preferNodeProtocol",data:{moduleName,fix:`Change "${moduleName}" to "${fixedModuleName}"`},fix(fixer){return fixer.replaceText(node.source,`"${fixedModuleName}"`)}})}},CallExpression(node){if(node.callee.type==="Identifier"&&node.callee.name==="require"&&node.arguments.length===1){const arg=node.arguments[0];const staticText=(0,eslint_devkit_1.staticString)(arg);if(staticText!==null){const moduleName=staticText;if(isBuiltInModule(moduleName,allModulesToCheck)){const fixedModuleName=`node:${moduleName}`;context.report({node:arg,messageId:"preferNodeProtocol",data:{moduleName,fix:`Change "${moduleName}" to "${fixedModuleName}"`},fix(fixer){return fixer.replaceText(arg,`"${fixedModuleName}"`)}})}}}},ImportExpression(node){if(node.source.type==="Literal"&&typeof node.source.value==="string"){const moduleName=node.source.value;if(isBuiltInModule(moduleName,allModulesToCheck)){const fixedModuleName=`node:${moduleName}`;context.report({node:node.source,messageId:"preferNodeProtocol",data:{moduleName,fix:`Change "${moduleName}" to "${fixedModuleName}"`},fix(fixer){return fixer.replaceText(node.source,`"${fixedModuleName}"`)}})}}}};function isBuiltInModule(moduleName,modulesToCheck){if(moduleName.startsWith("node:")){return false}if(modulesToCheck.has(moduleName)){return true}const lowerCaseModule=moduleName.toLowerCase();if(modulesToCheck.has(lowerCaseModule)){return true}const baseModule=moduleName.split("/")[0];if(modulesToCheck.has(baseModule)){return true}const lowerCaseBaseModule=baseModule.toLowerCase();return modulesToCheck.has(lowerCaseBaseModule)}}});
|