eslint-plugin-import-next 2.7.7 → 2.8.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 +1 -0
- package/package.json +1 -1
- package/src/files/export-equals.js +1 -0
- package/src/index.js +1 -1
- package/src/rules/consistent-type-specifier-style.js +1 -1
- package/src/rules/default.js +1 -1
- package/src/rules/enforce-import-order.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-relative-parent-imports.js +1 -1
package/README.md
CHANGED
|
@@ -229,6 +229,7 @@ Part of the **Interlace ESLint ecosystem** — AI-native rules with LLM-optimize
|
|
|
229
229
|
| [`eslint-plugin-secure-coding`](https://www.npmjs.com/package/eslint-plugin-secure-coding) | [](https://www.npmjs.com/package/eslint-plugin-secure-coding) | Injection prevention. |
|
|
230
230
|
| [`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. |
|
|
231
231
|
| [`eslint-plugin-sqlite-security`](https://www.npmjs.com/package/eslint-plugin-sqlite-security) | [](https://www.npmjs.com/package/eslint-plugin-sqlite-security) | SQLite security. |
|
|
232
|
+
| [`eslint-plugin-supabase-security`](https://www.npmjs.com/package/eslint-plugin-supabase-security) | [](https://www.npmjs.com/package/eslint-plugin-supabase-security) | Supabase security. |
|
|
232
233
|
| [`eslint-plugin-typeorm-security`](https://www.npmjs.com/package/eslint-plugin-typeorm-security) | [](https://www.npmjs.com/package/eslint-plugin-typeorm-security) | TypeORM security. |
|
|
233
234
|
| [`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. |
|
|
234
235
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "eslint-plugin-import-next",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.8.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",
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";class Widget{render(){return"widget"}}module.exports=Widget;
|
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.7.7"},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.8.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.consistentTypeSpecifierStyle=void 0;const eslint_devkit_1=require("@interlace/eslint-devkit");exports.consistentTypeSpecifierStyle=(0,eslint_devkit_1.createRule)({name:"consistent-type-specifier-style",meta:{type:"suggestion",docs:{url:"https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/consistent-type-specifier-style.md",description:"Enforce or ban the use of inline type-only markers for named imports",cwe:"CWE-1078",cvss:2.5},fixable:"code",messages:{preferInline:(0,eslint_devkit_1.formatLLMMessage)({icon:eslint_devkit_1.MessageIcons.ARCHITECTURE,issueName:"Type Import Style",cwe:"CWE-1078",description:"Use inline type specifier: import { type Foo }",severity:"LOW",fix:"Convert to inline type: import { type {{name}} } from ...",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/consistent-type-specifier-style.md"}),preferTopLevel:(0,eslint_devkit_1.formatLLMMessage)({icon:eslint_devkit_1.MessageIcons.ARCHITECTURE,issueName:"Type Import Style",cwe:"CWE-1078",description:"Use top-level type import: import type { Foo }",severity:"LOW",fix:"Convert to top-level type: import type { {{name}} } from ...",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/consistent-type-specifier-style.md"})},schema:[{type:"string",enum:["prefer-inline","prefer-top-level"],default:"prefer-inline"}]},defaultOptions:["prefer-inline"],create(context){const style=context.options[0]||"prefer-inline";const sourceCode=context.sourceCode;function getSpecifierText(spec){const imported=spec.imported.type==="Identifier"?spec.imported.name:spec.imported.value;const local=spec.local.name;if(imported===local){return imported}return`${imported} as ${local}`}return{ImportDeclaration(node){const isTypeImport=node.importKind==="type";if(style==="prefer-inline"){if(isTypeImport&&node.specifiers.length>0){const namedSpecifiers=node.specifiers.filter(s=>s.type==="ImportSpecifier");if(namedSpecifiers.length>0){context.report({node,messageId:"preferInline",data:{name:namedSpecifiers.map(s=>s.local.name).join(", ")},fix(fixer){const specifiersText=namedSpecifiers.map(spec=>`type ${getSpecifierText(spec)}`).join(", ");const sourceText=sourceCode.getText(node.source);const newImport=`import { ${specifiersText} } from ${sourceText};`;return fixer.replaceText(node,newImport)}})}}}else{const namedSpecifiers=node.specifiers.filter(s=>s.type==="ImportSpecifier");const inlineTypeSpecifiers=namedSpecifiers.filter(s=>s.importKind==="type");if(!isTypeImport&&namedSpecifiers.length>0&&inlineTypeSpecifiers.length===namedSpecifiers.length){context.report({node,messageId:"preferTopLevel",data:{name:namedSpecifiers.map(s=>s.local.name).join(", ")},fix(fixer){const specifiersText=namedSpecifiers.map(spec=>getSpecifierText(spec)).join(", ");const sourceText=sourceCode.getText(node.source);const newImport=`import type { ${specifiersText} } from ${sourceText};`;return fixer.replaceText(node,newImport)}})}}}}}});
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.consistentTypeSpecifierStyle=void 0;const eslint_devkit_1=require("@interlace/eslint-devkit");exports.consistentTypeSpecifierStyle=(0,eslint_devkit_1.createRule)({name:"consistent-type-specifier-style",meta:{type:"suggestion",docs:{url:"https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/consistent-type-specifier-style.md",description:"Enforce or ban the use of inline type-only markers for named imports",cwe:"CWE-1078",cvss:2.5},fixable:"code",messages:{preferInline:(0,eslint_devkit_1.formatLLMMessage)({icon:eslint_devkit_1.MessageIcons.ARCHITECTURE,issueName:"Type Import Style",cwe:"CWE-1078",description:"Use inline type specifier: import { type Foo }",severity:"LOW",fix:"Convert to inline type: import { type {{name}} } from ...",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/consistent-type-specifier-style.md"}),preferTopLevel:(0,eslint_devkit_1.formatLLMMessage)({icon:eslint_devkit_1.MessageIcons.ARCHITECTURE,issueName:"Type Import Style",cwe:"CWE-1078",description:"Use top-level type import: import type { Foo }",severity:"LOW",fix:"Convert to top-level type: import type { {{name}} } from ...",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/consistent-type-specifier-style.md"})},schema:[{type:"string",enum:["prefer-inline","prefer-top-level"],default:"prefer-inline"}]},defaultOptions:["prefer-inline"],create(context){const style=context.options[0]||"prefer-inline";const sourceCode=context.sourceCode;function getSpecifierText(spec){const imported=spec.imported.type==="Identifier"?spec.imported.name:spec.imported.value;const local=spec.local.name;if(imported===local){return imported}return`${imported} as ${local}`}return{ImportDeclaration(node){const isTypeImport=node.importKind==="type";if(style==="prefer-inline"){if(isTypeImport&&node.specifiers.length>0){const namedSpecifiers=node.specifiers.filter(s=>s.type==="ImportSpecifier");if(namedSpecifiers.length>0){context.report({node,messageId:"preferInline",data:{name:namedSpecifiers.map(s=>s.local.name).join(", ")},fix(fixer){const specifiersText=namedSpecifiers.map(spec=>`type ${getSpecifierText(spec)}`).join(", ");const sourceText=sourceCode.getText(node.source);const newImport=`import { ${specifiersText} } from ${sourceText};`;return fixer.replaceText(node,newImport)}})}}}else{const namedSpecifiers=node.specifiers.filter(s=>s.type==="ImportSpecifier");const inlineTypeSpecifiers=namedSpecifiers.filter(s=>s.importKind==="type");const rebuildWouldDropABinding=node.specifiers.length!==namedSpecifiers.length;if(!isTypeImport&&namedSpecifiers.length>0&&inlineTypeSpecifiers.length===namedSpecifiers.length){context.report({node,messageId:"preferTopLevel",data:{name:namedSpecifiers.map(s=>s.local.name).join(", ")},fix:rebuildWouldDropABinding?void 0:function(fixer){const specifiersText=namedSpecifiers.map(spec=>getSpecifierText(spec)).join(", ");const sourceText=sourceCode.getText(node.source);const newImport=`import type { ${specifiersText} } from ${sourceText};`;return fixer.replaceText(node,newImport)}})}}}}}});
|
package/src/rules/default.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.defaultRule=void 0;const eslint_devkit_1=require("@interlace/eslint-devkit");const eslint_devkit_2=require("@interlace/eslint-devkit");const typescript_peer_1=require("../utils/typescript-peer");exports.defaultRule=(0,eslint_devkit_1.createRule)({name:"default",meta:{type:"problem",docs:{url:"https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/default.md",description:"Ensure a default export is present, given a default import"},messages:{noDefaultExport:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.QUALITY,issueName:"Missing Default Export",description:"No default export found in imported module",severity:"HIGH",fix:"Use named imports or add a default export to the module",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/default.md"})},schema:[]},defaultOptions:[],create(context){if(!(0,eslint_devkit_2.hasParserServices)(context))return{};const services=(0,eslint_devkit_2.getParserServices)(context);const checker=services.program?.getTypeChecker?.();return{ImportDefaultSpecifier(node){if(node.parent.type==="ImportDeclaration"&&node.parent.importKind==="type")return;const tsNode=services.esTreeNodeToTSNodeMap.get(node);
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.defaultRule=void 0;const eslint_devkit_1=require("@interlace/eslint-devkit");const eslint_devkit_2=require("@interlace/eslint-devkit");const typescript_peer_1=require("../utils/typescript-peer");exports.defaultRule=(0,eslint_devkit_1.createRule)({name:"default",meta:{type:"problem",docs:{url:"https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/default.md",description:"Ensure a default export is present, given a default import"},messages:{noDefaultExport:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.QUALITY,issueName:"Missing Default Export",description:"No default export found in imported module",severity:"HIGH",fix:"Use named imports or add a default export to the module",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/default.md"})},schema:[]},defaultOptions:[],create(context){if(!(0,eslint_devkit_2.hasParserServices)(context))return{};const services=(0,eslint_devkit_2.getParserServices)(context);const checker=services.program?.getTypeChecker?.();return{ImportDefaultSpecifier(node){if(node.parent.type==="ImportDeclaration"&&node.parent.importKind==="type")return;const tsNode=services.esTreeNodeToTSNodeMap.get(node.local);let symbol=checker?.getSymbolAtLocation?.(tsNode);if(symbol&&symbol.flags&(0,typescript_peer_1.aliasSymbolFlag)()){try{symbol=checker?.getAliasedSymbol?.(symbol)}catch{symbol=void 0}}if(symbol&&symbol.escapedName==="unknown"){symbol=void 0}const moduleNode=services.esTreeNodeToTSNodeMap.get(node.parent.source);const moduleSymbol=checker?.getSymbolAtLocation?.(moduleNode);if(moduleSymbol&&!symbol){const tsModule=(0,typescript_peer_1.loadTypeScript)();if(tsModule&&moduleSymbol.exports&&!moduleSymbol.exports.has(tsModule.InternalSymbolName.Default)){context.report({node,messageId:"noDefaultExport"})}}}}}});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.enforceImportOrder=void 0;const eslint_devkit_1=require("@interlace/eslint-devkit");const eslint_devkit_2=require("@interlace/eslint-devkit");const defaultOptions={groups:["builtin","external","internal","parent","sibling","index","side-effect"],internalPatterns:["^@/"],alphabetize:{order:"asc",caseInsensitive:true},newlinesBetween:"always"};exports.enforceImportOrder=(0,eslint_devkit_1.createRule)({name:"enforce-import-order",meta:{type:"suggestion",docs:{url:"https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/enforce-import-order.md",description:"Enforces a specific order for import statements"},fixable:"code",messages:{importOrder:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Import Order",description:"Imports are not ordered correctly",severity:"LOW",fix:"Reorder imports to match the configured group order",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/order.md"}),alphabeticalOrder:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Alphabetical Order",description:"Imports within the same group are not alphabetized",severity:"LOW",fix:"Sort imports alphabetically within groups",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/order.md"}),importsNotContiguous:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Imports Not Contiguous",description:"Code found between import statements",severity:"MEDIUM",fix:"Move all imports to the top of the file",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/first.md"})},schema:[{type:"object",properties:{groups:{type:"array",items:{type:"string",enum:["builtin","external","internal","parent","sibling","index","object","type","side-effect"]}},internalPatterns:{type:"array",items:{type:"string"}},alphabetize:{type:"object",properties:{order:{type:"string",enum:["asc","desc","ignore"]},caseInsensitive:{type:"boolean"}},additionalProperties:false},newlinesBetween:{type:"string",enum:["always","never","ignore"]}},additionalProperties:false}]},defaultOptions:[defaultOptions],create(context){const userOptions=context.options[0]||{};const options={groups:userOptions.groups??defaultOptions.groups,internalPatterns:userOptions.internalPatterns??defaultOptions.internalPatterns,newlinesBetween:userOptions.newlinesBetween??defaultOptions.newlinesBetween,alphabetize:{order:userOptions.alphabetize?.order??defaultOptions.alphabetize.order,caseInsensitive:userOptions.alphabetize?.caseInsensitive??defaultOptions.alphabetize.caseInsensitive}};const sourceCode=context.sourceCode;const imports=[];function getImportType(node){const source=node.source.value;if(node.specifiers.length===0){return"side-effect"}if(source.startsWith("node:")||["fs","path","os","util","http","https","events","stream","child_process"].includes(source)){return"builtin"}if(source.startsWith(".")){if(source.startsWith("../")){return"parent"}if(source==="./index"||source==="."){return"index"}return"sibling"}if(options.internalPatterns&&options.internalPatterns.length>0){for(const pattern of options.internalPatterns){if(new RegExp(pattern).test(source)){return"internal"}}}return"external"}function getGroupRank(importType){const index=options.groups.indexOf(importType);return index!==-1?index:999}function isHashbang(comment){return comment.range[0]===0&&sourceCode.getText().startsWith("#!")}function getExtendedRange(node){let start=node.range[0];let end=node.range[1];const commentsBefore=sourceCode.getCommentsBefore(node);const reorderable=commentsBefore.filter(c=>!isHashbang(c));if(reorderable.length>0){start=reorderable[0].range[0]}const tokenAfter=sourceCode.getTokenAfter(node);if(tokenAfter&&tokenAfter.value===";"){end=tokenAfter.range[1]}const commentsAfter=sourceCode.getCommentsAfter(node);const sameLineComment=commentsAfter.find(c=>c.loc.start.line===node.loc.end.line);if(sameLineComment){end=sameLineComment.range[1]}return[start,end]}function getImportText(node){const[start,end]=getExtendedRange(node);return sourceCode.text.slice(start,end)}return{ImportDeclaration(node){imports.push(node)},"Program:exit"(){if(imports.length===0){return}for(let i=0;i<imports.length-1;i++){const current=imports[i];const next=imports[i+1];const tokensBetween=sourceCode.getTokensBetween(current,next,{includeComments:true});if(tokensBetween.length>0){const codeTokens=sourceCode.getTokensBetween(current,next,{includeComments:false});if(codeTokens.length>0){context.report({node:next,messageId:"importsNotContiguous"});return}}}const originalImports=[...imports];const sortedImports=Array.from(imports).sort((a,b)=>{const typeA=getImportType(a);const typeB=getImportType(b);const rankA=getGroupRank(typeA);const rankB=getGroupRank(typeB);if(rankA!==rankB){return rankA-rankB}if(options.alphabetize?.order!=="ignore"){const sourceA=a.source.value;const sourceB=b.source.value;const compareResult=options.alphabetize?.caseInsensitive?sourceA.toLowerCase().localeCompare(sourceB.toLowerCase()):sourceA.localeCompare(sourceB);return options.alphabetize?.order==="asc"?compareResult:-compareResult}return 0});let isSorted=true;for(let i=0;i<originalImports.length;i++){if(originalImports[i]!==sortedImports[i]){isSorted=false;break}}if(isSorted&&options.newlinesBetween!=="ignore"){for(let i=0;i<imports.length-1;i++){const current=imports[i];const next=imports[i+1];const typeCurrent=getImportType(current);const typeNext=getImportType(next);const rankCurrent=getGroupRank(typeCurrent);const rankNext=getGroupRank(typeNext);if(rankCurrent!==rankNext){const linesBetween=next.loc.start.line-current.loc.end.line;if(options.newlinesBetween==="always"&&linesBetween<2){isSorted=false;break}if(options.newlinesBetween==="never"&&linesBetween>1){isSorted=false;break}}}}if(!isSorted){const firstImport=imports[0];const lastImport=imports[imports.length-1];const firstExtended=getExtendedRange(firstImport);const lastExtended=getExtendedRange(lastImport);context.report({node:firstImport,loc:{start:firstImport.loc.start,end:lastImport.loc.end},messageId:"importOrder",fix(fixer){const rangeStart=firstExtended[0];const rangeEnd=lastExtended[1];let newCode="";for(let i=0;i<sortedImports.length;i++){const node=sortedImports[i];const importType=getImportType(node);if(i>0&&options.newlinesBetween==="always"){const prevNode=sortedImports[i-1];const prevType=getImportType(prevNode);const prevRank=getGroupRank(prevType);const currRank=getGroupRank(importType);if(prevRank!==currRank){newCode+="\n"}}newCode+=getImportText(node)+"\n"}newCode=newCode.trimEnd();return fixer.replaceTextRange([rangeStart,rangeEnd],newCode)}})}}}}});
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.enforceImportOrder=void 0;const eslint_devkit_1=require("@interlace/eslint-devkit");const eslint_devkit_2=require("@interlace/eslint-devkit");const defaultOptions={groups:["builtin","external","internal","parent","sibling","index","side-effect"],internalPatterns:["^@/"],alphabetize:{order:"asc",caseInsensitive:true},newlinesBetween:"always"};exports.enforceImportOrder=(0,eslint_devkit_1.createRule)({name:"enforce-import-order",meta:{type:"suggestion",docs:{url:"https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/enforce-import-order.md",description:"Enforces a specific order for import statements"},fixable:"code",messages:{importOrder:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Import Order",description:"Imports are not ordered correctly",severity:"LOW",fix:"Reorder imports to match the configured group order",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/order.md"}),alphabeticalOrder:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Alphabetical Order",description:"Imports within the same group are not alphabetized",severity:"LOW",fix:"Sort imports alphabetically within groups",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/order.md"}),importsNotContiguous:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Imports Not Contiguous",description:"Code found between import statements",severity:"MEDIUM",fix:"Move all imports to the top of the file",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/first.md"})},schema:[{type:"object",properties:{groups:{type:"array",items:{type:"string",enum:["builtin","external","internal","parent","sibling","index","object","type","side-effect"]}},internalPatterns:{type:"array",items:{type:"string"}},alphabetize:{type:"object",properties:{order:{type:"string",enum:["asc","desc","ignore"]},caseInsensitive:{type:"boolean"}},additionalProperties:false},newlinesBetween:{type:"string",enum:["always","never","ignore"]}},additionalProperties:false}]},defaultOptions:[defaultOptions],create(context){const userOptions=context.options[0]||{};const options={groups:userOptions.groups??defaultOptions.groups,internalPatterns:userOptions.internalPatterns??defaultOptions.internalPatterns,newlinesBetween:userOptions.newlinesBetween??defaultOptions.newlinesBetween,alphabetize:{order:userOptions.alphabetize?.order??defaultOptions.alphabetize.order,caseInsensitive:userOptions.alphabetize?.caseInsensitive??defaultOptions.alphabetize.caseInsensitive}};const sourceCode=context.sourceCode;const imports=[];function getImportType(node){const source=node.source.value;if(node.specifiers.length===0){return"side-effect"}if(source.startsWith("node:")||["fs","path","os","util","http","https","events","stream","child_process"].includes(source)){return"builtin"}if(source.startsWith(".")){if(source.startsWith("../")){return"parent"}if(source==="./index"||source==="."){return"index"}return"sibling"}if(options.internalPatterns&&options.internalPatterns.length>0){for(const pattern of options.internalPatterns){if(new RegExp(pattern).test(source)){return"internal"}}}return"external"}function getGroupRank(importType){const index=options.groups.indexOf(importType);return index!==-1?index:999}function isHashbang(comment){return comment.range[0]===0&&sourceCode.getText().startsWith("#!")}function isFileDirective(comment){const text=comment.value.trim();if(!/^@ts-(nocheck|check)\b/.test(text)&&!/^\/\s*<reference\b/.test(text)){return false}return comment.range[1]<=sourceCode.ast.body[0].range[0]}function getExtendedRange(node){let start=node.range[0];let end=node.range[1];const commentsBefore=sourceCode.getCommentsBefore(node);const reorderable=commentsBefore.filter(c=>!isHashbang(c)&&!isFileDirective(c));if(reorderable.length>0){start=reorderable[0].range[0]}const tokenAfter=sourceCode.getTokenAfter(node);if(tokenAfter&&tokenAfter.value===";"){end=tokenAfter.range[1]}const commentsAfter=sourceCode.getCommentsAfter(node);const sameLineComment=commentsAfter.find(c=>c.loc.start.line===node.loc.end.line);if(sameLineComment){end=sameLineComment.range[1]}return[start,end]}function getImportText(node){const[start,end]=getExtendedRange(node);return sourceCode.text.slice(start,end)}return{ImportDeclaration(node){imports.push(node)},"Program:exit"(){if(imports.length===0){return}for(let i=0;i<imports.length-1;i++){const current=imports[i];const next=imports[i+1];const tokensBetween=sourceCode.getTokensBetween(current,next,{includeComments:true});if(tokensBetween.length>0){const codeTokens=sourceCode.getTokensBetween(current,next,{includeComments:false});if(codeTokens.length>0){context.report({node:next,messageId:"importsNotContiguous"});return}}}const originalImports=[...imports];const sortedImports=Array.from(imports).sort((a,b)=>{const typeA=getImportType(a);const typeB=getImportType(b);const rankA=getGroupRank(typeA);const rankB=getGroupRank(typeB);if(rankA!==rankB){return rankA-rankB}if(options.alphabetize?.order!=="ignore"){const sourceA=a.source.value;const sourceB=b.source.value;const compareResult=options.alphabetize?.caseInsensitive?sourceA.toLowerCase().localeCompare(sourceB.toLowerCase()):sourceA.localeCompare(sourceB);return options.alphabetize?.order==="asc"?compareResult:-compareResult}return 0});let isSorted=true;for(let i=0;i<originalImports.length;i++){if(originalImports[i]!==sortedImports[i]){isSorted=false;break}}if(isSorted&&options.newlinesBetween!=="ignore"){for(let i=0;i<imports.length-1;i++){const current=imports[i];const next=imports[i+1];const typeCurrent=getImportType(current);const typeNext=getImportType(next);const rankCurrent=getGroupRank(typeCurrent);const rankNext=getGroupRank(typeNext);if(rankCurrent!==rankNext){const linesBetween=next.loc.start.line-current.loc.end.line;if(options.newlinesBetween==="always"&&linesBetween<2){isSorted=false;break}if(options.newlinesBetween==="never"&&linesBetween>1){isSorted=false;break}}}}if(!isSorted){const firstImport=imports[0];const lastImport=imports[imports.length-1];const firstExtended=getExtendedRange(firstImport);const lastExtended=getExtendedRange(lastImport);context.report({node:firstImport,loc:{start:firstImport.loc.start,end:lastImport.loc.end},messageId:"importOrder",fix(fixer){const rangeStart=firstExtended[0];const rangeEnd=lastExtended[1];let newCode="";for(let i=0;i<sortedImports.length;i++){const node=sortedImports[i];const importType=getImportType(node);if(i>0&&options.newlinesBetween==="always"){const prevNode=sortedImports[i-1];const prevType=getImportType(prevNode);const prevRank=getGroupRank(prevType);const currRank=getGroupRank(importType);if(prevRank!==currRank){newCode+="\n"}}newCode+=getImportText(node)+"\n"}newCode=newCode.trimEnd();return fixer.replaceTextRange([rangeStart,rangeEnd],newCode)}})}}}}});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.noExtraneousDependencies=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");const eslint_devkit_4=require("@interlace/eslint-devkit");exports.noExtraneousDependencies=(0,eslint_devkit_1.createRule)({name:"no-extraneous-dependencies",meta:{type:"problem",docs:{url:"https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-extraneous-dependencies.md",description:"Forbid the use of extraneous packages not listed in package.json"},hasSuggestions:true,messages:{extraneousDependency:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.WARNING,issueName:"Extraneous Dependency",description:"Package not listed in package.json dependencies",severity:"HIGH",fix:"Add package to package.json or remove the import",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-extraneous-dependencies.md"}),missingDependency:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.WARNING,issueName:"Missing Dependency",description:"Package used but not in package.json",severity:"HIGH",fix:"Add package to appropriate section in package.json",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-extraneous-dependencies.md"}),devDependencyInProduction:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.WARNING,issueName:"Dev Dependency in Production",description:"Dev dependency used in production code",severity:"MEDIUM",fix:"Move to dependencies or ensure this is only used in development",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-extraneous-dependencies.md"}),addToDependencies:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Add to Dependencies",description:"Add package to dependencies in package.json",severity:"HIGH",fix:"Run: npm install <package>",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-extraneous-dependencies.md"}),addToDevDependencies:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Add to Dev Dependencies",description:"Add package to devDependencies in package.json",severity:"HIGH",fix:"Run: npm install --save-dev <package>",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-extraneous-dependencies.md"}),moveToDependencies:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Move to Dependencies",description:"Move package from devDependencies to dependencies",severity:"MEDIUM",fix:"Move package from devDependencies to dependencies in package.json",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-extraneous-dependencies.md"})},schema:[{type:"object",properties:{devDependencies:{type:"boolean",default:true,description:"Allow imports from devDependencies."},optionalDependencies:{type:"boolean",default:true,description:"Allow imports from optionalDependencies."},peerDependencies:{type:"boolean",default:true,description:"Allow imports from peerDependencies."},bundledDependencies:{type:"boolean",default:true,description:"Allow imports from bundledDependencies."},packageJsonPath:{type:"string",description:"Path to package.json file to use."},packageJson:{type:"object",description:"Direct package.json content for testing."},resolutionStrategy:{type:"string",enum:["strict","workspace","monorepo"],default:"strict",description:"Dependency resolution strategy: strict (exact match), workspace (allow workspace packages), monorepo (cross-package resolution)."},allowPatterns:{type:"array",items:{type:"string"},description:"Regex patterns for packages to allow even if not in package.json."},ignore:{type:"array",items:{type:"string"},description:"Specific package names to ignore (don't report as missing)."}},additionalProperties:false}]},defaultOptions:[{devDependencies:true,optionalDependencies:true,peerDependencies:true,bundledDependencies:true,resolutionStrategy:"strict",allowPatterns:[]}],create(context){const[options]=context.options;const{devDependencies=true,optionalDependencies=true,peerDependencies=true,bundledDependencies=true,packageJsonPath,packageJson,resolutionStrategy="strict",allowPatterns=[]}=options||{};const filename=context.filename;if(!filename){return{}}let resolvedPackageJson=null;if(packageJson){resolvedPackageJson=packageJson}else if(packageJsonPath){resolvedPackageJson=(0,eslint_devkit_3.readJsonFileSync)(packageJsonPath);if(!resolvedPackageJson){return{}}}else{const packageJsonFile=(0,eslint_devkit_3.findFileUpward)("package.json",(0,eslint_devkit_4.getDirname)(filename));if(!packageJsonFile){return{}}resolvedPackageJson=(0,eslint_devkit_3.readJsonFileSync)(packageJsonFile);if(!resolvedPackageJson){return{}}}const allowedPackages=new Set;if(resolvedPackageJson?.dependencies){Object.keys(resolvedPackageJson.dependencies).forEach(pkg=>allowedPackages.add(pkg))}if(devDependencies&&resolvedPackageJson?.devDependencies){Object.keys(resolvedPackageJson.devDependencies).forEach(pkg=>allowedPackages.add(pkg))}if(optionalDependencies&&resolvedPackageJson?.optionalDependencies){Object.keys(resolvedPackageJson.optionalDependencies).forEach(pkg=>allowedPackages.add(pkg))}if(peerDependencies&&resolvedPackageJson?.peerDependencies){Object.keys(resolvedPackageJson.peerDependencies).forEach(pkg=>allowedPackages.add(pkg))}if(bundledDependencies&&resolvedPackageJson?.bundledDependencies){resolvedPackageJson.bundledDependencies.forEach(pkg=>allowedPackages.add(pkg))}function isExternalPackage(importPath){if(/^\.\.?(\/|$)/.test(importPath)){return null}if(importPath.startsWith("/")){return null}if(importPath.startsWith("#")){return null}if(importPath.startsWith("node:")||node_module_1.builtinModules.includes(importPath)){return null}const packageName=importPath.startsWith("@")?importPath.split("/").slice(0,2).join("/"):importPath.split("/")[0];return packageName}function isWorkspacePackage(packageName){return packageName.startsWith("@workspace/")||packageName.startsWith("@company/")}function checkImport(importPath,node){const packageName=isExternalPackage(importPath);if(!packageName){return}const isAllowedByPattern=allowPatterns.some(pattern=>{try{const regex=new RegExp(pattern);return regex.test(packageName)}catch{return false}});if(isAllowedByPattern){return}const shouldCheckDependency=()=>{switch(resolutionStrategy){case"workspace":return!allowedPackages.has(packageName)&&!isWorkspacePackage(packageName);case"monorepo":return!allowedPackages.has(packageName)&&!isWorkspacePackage(packageName);case"strict":default:return!allowedPackages.has(packageName)}};if(shouldCheckDependency()){const isInDevDeps=resolvedPackageJson?.devDependencies&&resolvedPackageJson.devDependencies[packageName];if(isInDevDeps&&!devDependencies){context.report({node,messageId:"devDependencyInProduction",data:{packageName,importPath,suggestion:"Move to dependencies if used in production, or ensure this code is only executed in development"},suggest:[{messageId:"moveToDependencies",fix(fixer){let parentStatement=node;while(parentStatement&&parentStatement.type!=="ImportDeclaration"&&parentStatement.type!=="VariableDeclaration"&&parentStatement.type!=="ExpressionStatement"){parentStatement=parentStatement.parent}if(parentStatement){return fixer.insertTextBefore(parentStatement,`// TODO: Move ${packageName} from devDependencies to dependencies in package.json
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.noExtraneousDependencies=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");const eslint_devkit_4=require("@interlace/eslint-devkit");exports.noExtraneousDependencies=(0,eslint_devkit_1.createRule)({name:"no-extraneous-dependencies",meta:{type:"problem",docs:{url:"https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-extraneous-dependencies.md",description:"Forbid the use of extraneous packages not listed in package.json"},hasSuggestions:true,messages:{extraneousDependency:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.WARNING,issueName:"Extraneous Dependency",description:"Package not listed in package.json dependencies",severity:"HIGH",fix:"Add package to package.json or remove the import",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-extraneous-dependencies.md"}),missingDependency:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.WARNING,issueName:"Missing Dependency",description:"Package used but not in package.json",severity:"HIGH",fix:"Add package to appropriate section in package.json",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-extraneous-dependencies.md"}),devDependencyInProduction:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.WARNING,issueName:"Dev Dependency in Production",description:"Dev dependency used in production code",severity:"MEDIUM",fix:"Move to dependencies or ensure this is only used in development",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-extraneous-dependencies.md"}),addToDependencies:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Add to Dependencies",description:"Add package to dependencies in package.json",severity:"HIGH",fix:"Run: npm install <package>",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-extraneous-dependencies.md"}),addToDevDependencies:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Add to Dev Dependencies",description:"Add package to devDependencies in package.json",severity:"HIGH",fix:"Run: npm install --save-dev <package>",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-extraneous-dependencies.md"}),moveToDependencies:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Move to Dependencies",description:"Move package from devDependencies to dependencies",severity:"MEDIUM",fix:"Move package from devDependencies to dependencies in package.json",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-extraneous-dependencies.md"})},schema:[{type:"object",properties:{devDependencies:{type:"boolean",default:true,description:"Allow imports from devDependencies."},optionalDependencies:{type:"boolean",default:true,description:"Allow imports from optionalDependencies."},peerDependencies:{type:"boolean",default:true,description:"Allow imports from peerDependencies."},bundledDependencies:{type:"boolean",default:true,description:"Allow imports from bundledDependencies."},packageJsonPath:{type:"string",description:"Path to package.json file to use."},packageJson:{type:"object",description:"Direct package.json content for testing."},resolutionStrategy:{type:"string",enum:["strict","workspace","monorepo"],default:"strict",description:"Dependency resolution strategy: strict (exact match), workspace (allow workspace packages), monorepo (cross-package resolution)."},allowPatterns:{type:"array",items:{type:"string"},description:"Regex patterns for packages to allow even if not in package.json."},ignore:{type:"array",items:{type:"string"},description:"Specific package names to ignore (don't report as missing)."}},additionalProperties:false}]},defaultOptions:[{devDependencies:true,optionalDependencies:true,peerDependencies:true,bundledDependencies:true,resolutionStrategy:"strict",allowPatterns:[]}],create(context){const[options]=context.options;const{devDependencies=true,optionalDependencies=true,peerDependencies=true,bundledDependencies=true,packageJsonPath,packageJson,resolutionStrategy="strict",allowPatterns=[]}=options||{};const filename=context.filename;if(!filename){return{}}let resolvedPackageJson=null;if(packageJson){resolvedPackageJson=packageJson}else if(packageJsonPath){resolvedPackageJson=(0,eslint_devkit_3.readJsonFileSync)(packageJsonPath);if(!resolvedPackageJson){return{}}}else{const packageJsonFile=(0,eslint_devkit_3.findFileUpward)("package.json",(0,eslint_devkit_4.getDirname)(filename));if(!packageJsonFile){return{}}resolvedPackageJson=(0,eslint_devkit_3.readJsonFileSync)(packageJsonFile);if(!resolvedPackageJson){return{}}}const allowedPackages=new Set;if(resolvedPackageJson?.dependencies){Object.keys(resolvedPackageJson.dependencies).forEach(pkg=>allowedPackages.add(pkg))}if(devDependencies&&resolvedPackageJson?.devDependencies){Object.keys(resolvedPackageJson.devDependencies).forEach(pkg=>allowedPackages.add(pkg))}if(optionalDependencies&&resolvedPackageJson?.optionalDependencies){Object.keys(resolvedPackageJson.optionalDependencies).forEach(pkg=>allowedPackages.add(pkg))}if(peerDependencies&&resolvedPackageJson?.peerDependencies){Object.keys(resolvedPackageJson.peerDependencies).forEach(pkg=>allowedPackages.add(pkg))}if(bundledDependencies&&resolvedPackageJson?.bundledDependencies){resolvedPackageJson.bundledDependencies.forEach(pkg=>allowedPackages.add(pkg))}function isExternalPackage(importPath){if(/^\.\.?(\/|$)/.test(importPath)){return null}if(importPath.startsWith("/")){return null}if(importPath.startsWith("#")){return null}if(importPath.startsWith("node:")||node_module_1.builtinModules.includes(importPath)){return null}if(/^[a-zA-Z][a-zA-Z0-9+\-.]+:/.test(importPath)){return null}const packageName=importPath.startsWith("@")?importPath.split("/").slice(0,2).join("/"):importPath.split("/")[0];return packageName}function isWorkspacePackage(packageName){return packageName.startsWith("@workspace/")||packageName.startsWith("@company/")}function checkImport(importPath,node){const packageName=isExternalPackage(importPath);if(!packageName){return}const isAllowedByPattern=allowPatterns.some(pattern=>{try{const regex=new RegExp(pattern);return regex.test(packageName)}catch{return false}});if(isAllowedByPattern){return}const shouldCheckDependency=()=>{switch(resolutionStrategy){case"workspace":return!allowedPackages.has(packageName)&&!isWorkspacePackage(packageName);case"monorepo":return!allowedPackages.has(packageName)&&!isWorkspacePackage(packageName);case"strict":default:return!allowedPackages.has(packageName)}};if(shouldCheckDependency()){const isInDevDeps=resolvedPackageJson?.devDependencies&&resolvedPackageJson.devDependencies[packageName];if(isInDevDeps&&!devDependencies){context.report({node,messageId:"devDependencyInProduction",data:{packageName,importPath,suggestion:"Move to dependencies if used in production, or ensure this code is only executed in development"},suggest:[{messageId:"moveToDependencies",fix(fixer){let parentStatement=node;while(parentStatement&&parentStatement.type!=="ImportDeclaration"&&parentStatement.type!=="VariableDeclaration"&&parentStatement.type!=="ExpressionStatement"){parentStatement=parentStatement.parent}if(parentStatement){return fixer.insertTextBefore(parentStatement,`// TODO: Move ${packageName} from devDependencies to dependencies in package.json
|
|
2
2
|
`)}return fixer.insertTextBefore(node,`// TODO: Move ${packageName} from devDependencies to dependencies in package.json
|
|
3
3
|
`)}}]})}else{context.report({node,messageId:"missingDependency",data:{packageName,importPath,allowedPackages:Array.from(allowedPackages).slice(0,5).join(", ")+(allowedPackages.size>5?"...":""),suggestion:`Add "${packageName}" to package.json dependencies`},suggest:[{messageId:"addToDependencies",fix(fixer){let parentStatement=node;while(parentStatement&&parentStatement.type!=="ImportDeclaration"&&parentStatement.type!=="VariableDeclaration"&&parentStatement.type!=="ExpressionStatement"){parentStatement=parentStatement.parent}if(parentStatement){return fixer.insertTextBefore(parentStatement,`// TODO: Run: npm install ${packageName}
|
|
4
4
|
`)}return fixer.insertTextBefore(node,`// TODO: Run: npm install ${packageName}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";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){
|
|
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("../")){const leading=[];for(const seg of importPath.split("/")){if(seg!=="..")break;leading.push(seg)}return leading.length>0?leading.join("/"):"."}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 specifierNodeOf(node){return"source"in node&&node.source?node.source:node}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,suggestedPath:rootImport},fix(fixer){return fixer.replaceText(specifierNodeOf(node),`'${rootImport}'`)}})}else if(strategy==="suggest"){context.report({node,messageId:"internalModuleImport",data:reportData,suggest:[{messageId:"suggestPublicApi",data:{suggestedPath:rootImport},fix(fixer){return fixer.replaceText(specifierNodeOf(node),`'${rootImport}'`)}},...barrelPath!==rootImport&&barrelPath!==suggestedPath?[{messageId:"suggestBarrelExport",data:{suggestedPath:barrelPath},fix(fixer){return fixer.replaceText(specifierNodeOf(node),`'${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.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
|
+
"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)}})}}},ImportExpression(node){const staticText=(0,eslint_devkit_1.staticString)(node.source);if(staticText!==null){checkImport(staticText,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)}}}}});
|