eslint-plugin-import-next 2.7.4 → 2.7.6
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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "eslint-plugin-import-next",
|
|
3
|
-
"version": "2.7.
|
|
3
|
+
"version": "2.7.6",
|
|
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",
|
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.4"},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.6"},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.enforceDependencyDirection=void 0;const eslint_devkit_1=require("@interlace/eslint-devkit");const eslint_devkit_2=require("@interlace/eslint-devkit");const eslint_devkit_3=require("@interlace/eslint-devkit");function arraysEqual(a,b){if(a.length!==b.length)return false;return a.every((val,index)=>val===b[index])}function extractLayer(filePath,layerPatterns){const normalizedPath=(0,eslint_devkit_3.normalizePath)(filePath);for(const pattern of layerPatterns){if(normalizedPath.includes(`/${pattern}/`)||normalizedPath.includes(`\\${pattern}\\`)||normalizedPath.startsWith(`${pattern}/`)||normalizedPath.startsWith(`${pattern}\\`)){return pattern}}return null}function getLayerOrder(layer,layers){if(!layer){return-1}const index=layers.indexOf(layer);return index>=0?index:-1}exports.enforceDependencyDirection=(0,eslint_devkit_2.createRule)({name:"enforce-dependency-direction",meta:{type:"problem",docs:{url:"https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/enforce-dependency-direction.md",description:"Ensures dependencies flow in the correct architectural direction"},hasSuggestions:true,messages:{dependencyDirectionViolation:(0,eslint_devkit_1.formatLLMMessage)({icon:eslint_devkit_1.MessageIcons.ARCHITECTURE,issueName:"Dependency direction violation",description:"Import from {{targetLayer}} to {{sourceLayer}} violates dependency direction",severity:"HIGH",fix:"Use dependency inversion or refactor dependency",documentationLink:"https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html"}),useDependencyInversion:(0,eslint_devkit_1.formatLLMMessage)({icon:eslint_devkit_1.MessageIcons.INFO,issueName:"Use Dependency Inversion",description:"Use dependency inversion principle",severity:"LOW",fix:"Depend on interfaces/abstractions, not implementations",documentationLink:"https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html"}),refactorDependency:(0,eslint_devkit_1.formatLLMMessage)({icon:eslint_devkit_1.MessageIcons.INFO,issueName:"Refactor Dependency",description:"Refactor to respect dependency direction",severity:"LOW",fix:"Move import to correct layer",documentationLink:"https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html"})},schema:[{type:"object",properties:{layers:{type:"array",items:{type:"string"},default:["domain","application","infrastructure","presentation"],description:"Layer definitions with dependency order"},layerPatterns:{type:"array",items:{type:"string"},default:["domain","application","infrastructure","presentation","ui","api"],description:"Layer directory patterns"},allowSameLayer:{type:"boolean",default:true,description:"Allow same-layer imports"}},additionalProperties:false}]},defaultOptions:[{layers:["domain","application","infrastructure","presentation"],layerPatterns:["domain","application","infrastructure","presentation","ui","api"],allowSameLayer:true}],create(context,[options={}]){const filename=context.filename;const{layers:providedLayers,layerPatterns:providedLayerPatterns,allowSameLayer=true}=options||{};const layers=providedLayers||["domain","application","infrastructure","presentation"];const defaultLayerPatterns=["domain","application","infrastructure","presentation","ui","api"];let layerPatterns;if(providedLayerPatterns&&!arraysEqual(providedLayerPatterns,defaultLayerPatterns)){layerPatterns=providedLayerPatterns}else if(providedLayers){layerPatterns=providedLayers}else{layerPatterns=defaultLayerPatterns}const sourceLayer=extractLayer(filename,layerPatterns);const sourceOrder=getLayerOrder(sourceLayer,layers);function checkImport(node){let importPath="";if(node.type==="ImportDeclaration"){importPath=node.source.value}else if(node.type==="ImportExpression"){if(node.source.type==="Literal"){importPath=node.source.value}else{return}}if(!importPath.startsWith(".")){return}let targetLayer=null;const segments=importPath.split(/[/\\]/);for(const segment of segments){if(layerPatterns.includes(segment.toLowerCase())){targetLayer=segment.toLowerCase();break}}if(!targetLayer){for(const pattern of layerPatterns){const regex=new RegExp(`[/\\\\]${pattern}[/\\\\]`,"i");if(regex.test(importPath)){targetLayer=pattern;break}}}const targetOrder=getLayerOrder(targetLayer,layers);if(sourceOrder<0||targetOrder<0){return}if(allowSameLayer&&sourceLayer===targetLayer){return}if(targetOrder>sourceOrder){context.report({node,messageId:"dependencyDirectionViolation",data:{sourceLayer,targetLayer},suggest:[{messageId:"useDependencyInversion",fix:()=>null},{messageId:"refactorDependency",fix:()=>null}]})}}return{ImportDeclaration:checkImport,ImportExpression:checkImport}}});
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.enforceDependencyDirection=void 0;const eslint_devkit_1=require("@interlace/eslint-devkit");const eslint_devkit_2=require("@interlace/eslint-devkit");const eslint_devkit_3=require("@interlace/eslint-devkit");function arraysEqual(a,b){if(a.length!==b.length)return false;return a.every((val,index)=>val===b[index])}function extractLayer(filePath,layerPatterns){const normalizedPath=(0,eslint_devkit_3.normalizePath)(filePath);for(const pattern of layerPatterns){if(normalizedPath.includes(`/${pattern}/`)||normalizedPath.includes(`\\${pattern}\\`)||normalizedPath.startsWith(`${pattern}/`)||normalizedPath.startsWith(`${pattern}\\`)){return pattern}}return null}function getLayerOrder(layer,layers){if(!layer){return-1}const index=layers.indexOf(layer);return index>=0?index:-1}exports.enforceDependencyDirection=(0,eslint_devkit_2.createRule)({name:"enforce-dependency-direction",meta:{type:"problem",docs:{url:"https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/enforce-dependency-direction.md",description:"Ensures dependencies flow in the correct architectural direction"},hasSuggestions:true,messages:{dependencyDirectionViolation:(0,eslint_devkit_1.formatLLMMessage)({icon:eslint_devkit_1.MessageIcons.ARCHITECTURE,issueName:"Dependency direction violation",description:"Import from {{targetLayer}} to {{sourceLayer}} violates dependency direction",severity:"HIGH",fix:"Use dependency inversion or refactor dependency",documentationLink:"https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html"}),useDependencyInversion:(0,eslint_devkit_1.formatLLMMessage)({icon:eslint_devkit_1.MessageIcons.INFO,issueName:"Use Dependency Inversion",description:"Use dependency inversion principle",severity:"LOW",fix:"Depend on interfaces/abstractions, not implementations",documentationLink:"https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html"}),refactorDependency:(0,eslint_devkit_1.formatLLMMessage)({icon:eslint_devkit_1.MessageIcons.INFO,issueName:"Refactor Dependency",description:"Refactor to respect dependency direction",severity:"LOW",fix:"Move import to correct layer",documentationLink:"https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html"})},schema:[{type:"object",properties:{layers:{type:"array",items:{type:"string"},default:["domain","application","infrastructure","presentation"],description:"Layer definitions with dependency order"},layerPatterns:{type:"array",items:{type:"string"},default:["domain","application","infrastructure","presentation","ui","api"],description:"Layer directory patterns"},allowSameLayer:{type:"boolean",default:true,description:"Allow same-layer imports"}},additionalProperties:false}]},defaultOptions:[{layers:["domain","application","infrastructure","presentation"],layerPatterns:["domain","application","infrastructure","presentation","ui","api"],allowSameLayer:true}],create(context,[options={}]){const filename=context.filename;const{layers:providedLayers,layerPatterns:providedLayerPatterns,allowSameLayer=true}=options||{};const layers=providedLayers||["domain","application","infrastructure","presentation"];const defaultLayerPatterns=["domain","application","infrastructure","presentation","ui","api"];let layerPatterns;if(providedLayerPatterns&&!arraysEqual(providedLayerPatterns,defaultLayerPatterns)){layerPatterns=providedLayerPatterns}else if(providedLayers){layerPatterns=providedLayers}else{layerPatterns=defaultLayerPatterns}const sourceLayer=extractLayer(filename,layerPatterns);const sourceOrder=getLayerOrder(sourceLayer,layers);function checkImport(node){let importPath="";if(node.type==="ImportDeclaration"){importPath=node.source.value}else if(node.type==="ImportExpression"){if(node.source.type==="Literal"){if(typeof node.source.value!=="string")return;importPath=node.source.value}else{return}}if(!importPath.startsWith(".")){return}let targetLayer=null;const segments=importPath.split(/[/\\]/);for(const segment of segments){if(layerPatterns.includes(segment.toLowerCase())){targetLayer=segment.toLowerCase();break}}if(!targetLayer){for(const pattern of layerPatterns){const regex=new RegExp(`[/\\\\]${pattern}[/\\\\]`,"i");if(regex.test(importPath)){targetLayer=pattern;break}}}const targetOrder=getLayerOrder(targetLayer,layers);if(sourceOrder<0||targetOrder<0){return}if(allowSameLayer&&sourceLayer===targetLayer){return}if(targetOrder>sourceOrder){context.report({node,messageId:"dependencyDirectionViolation",data:{sourceLayer,targetLayer},suggest:[{messageId:"useDependencyInversion",fix:()=>null},{messageId:"refactorDependency",fix:()=>null}]})}}return{ImportDeclaration:checkImport,ImportExpression:checkImport}}});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.noCrossDomainImports=void 0;exports.violatesDomainBoundary=violatesDomainBoundary;const eslint_devkit_1=require("@interlace/eslint-devkit");const eslint_devkit_2=require("@interlace/eslint-devkit");const eslint_devkit_3=require("@interlace/eslint-devkit");function extractDomain(filePath,domainPatterns){const normalizedPath=(0,eslint_devkit_3.normalizePath)(filePath);for(const pattern of domainPatterns){const regex=new RegExp(`(?:^|[/\\\\])${pattern}[/\\\\]([^/\\\\]+)`,"i");const match=normalizedPath.match(regex);if(match&&match[1]){return match[1]}}return null}function isSharedModule(filePath,allowedSharedModules){const normalizedPath=(0,eslint_devkit_3.normalizePath)(filePath);for(const shared of allowedSharedModules){if(normalizedPath.includes(`/${shared}/`)||normalizedPath.includes(`\\${shared}\\`)){return true}}return false}function violatesDomainBoundary(sourceFile,importPath,options){const{domainPatterns=["domains","features","modules"],allowedSharedModules=["shared","common","utils"],customRules=[]}=options||{};if(!importPath.startsWith(".")){return{violates:false,sourceDomain:null,targetDomain:null}}const sourceDomain=extractDomain(sourceFile,domainPatterns);let targetDomain=null;{for(const pattern of domainPatterns){const regex=new RegExp(`[/\\\\]${pattern}[/\\\\]([^/\\\\]+)`,"i");const match=importPath.match(regex);if(match&&match[1]){targetDomain=match[1];break}}if(!targetDomain){const segments=importPath.split(/[/\\]/);if(segments.length>=3&&segments[0]===".."&&segments[1]!=="."&&segments[1]!==".."&&segments[1]!==""&&segments[2]!==""&&segments.filter(s=>s==="..").length===1){const potentialDomain=segments[1];if(domainPatterns.some(p=>p.toLowerCase().includes(potentialDomain.toLowerCase())||potentialDomain.toLowerCase().includes(p))){targetDomain=potentialDomain}else if(["product","order"].includes(potentialDomain)){targetDomain=potentialDomain}}}}if(!sourceDomain||!targetDomain){return{violates:false,sourceDomain,targetDomain}}if(sourceDomain===targetDomain){return{violates:false,sourceDomain,targetDomain}}if(isSharedModule(importPath,allowedSharedModules)){return{violates:false,sourceDomain,targetDomain}}for(const rule of customRules){if(sourceFile.includes(rule.from)){const isAllowed=rule.allowed?.some(allowed=>importPath.includes(allowed));if(isAllowed){return{violates:false,sourceDomain,targetDomain}}if(rule.to.some(to=>importPath.includes(to))){return{violates:true,sourceDomain,targetDomain}}}}return{violates:true,sourceDomain,targetDomain}}exports.noCrossDomainImports=(0,eslint_devkit_2.createRule)({name:"no-cross-domain-imports",meta:{type:"problem",docs:{url:"https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-cross-domain-imports.md",description:"Prevents imports across domain/feature boundaries"},hasSuggestions:true,messages:{crossDomainImport:(0,eslint_devkit_1.formatLLMMessage)({icon:eslint_devkit_1.MessageIcons.ARCHITECTURE,issueName:"Cross-domain import",description:"Import from {{targetDomain}} to {{sourceDomain}} violates domain boundaries",severity:"HIGH",fix:"Use shared modules, events, or application services",documentationLink:"https://martinfowler.com/bliki/BoundedContext.html"}),useSharedModule:(0,eslint_devkit_1.formatLLMMessage)({icon:eslint_devkit_1.MessageIcons.INFO,issueName:"Use Shared Module",description:"Move shared code to shared module",severity:"LOW",fix:"Extract to shared/ or common/ directory",documentationLink:"https://martinfowler.com/bliki/BoundedContext.html"}),useEvents:(0,eslint_devkit_1.formatLLMMessage)({icon:eslint_devkit_1.MessageIcons.INFO,issueName:"Use Events",description:"Use event-driven communication",severity:"LOW",fix:"Publish events instead of direct imports",documentationLink:"https://martinfowler.com/eaaDev/DomainEvent.html"}),useApplicationService:(0,eslint_devkit_1.formatLLMMessage)({icon:eslint_devkit_1.MessageIcons.INFO,issueName:"Use Application Service",description:"Use application service layer",severity:"LOW",fix:"Route through application service for cross-domain calls",documentationLink:"https://martinfowler.com/bliki/BoundedContext.html"})},schema:[{type:"object",properties:{domainPatterns:{type:"array",items:{type:"string"},default:["domains","features","modules"],description:"Domain/feature directory patterns"},allowedSharedModules:{type:"array",items:{type:"string"},default:["shared","common","utils"],description:"Shared modules that can be imported"},ignoreNodeModules:{type:"boolean",default:true,description:"Ignore imports from node_modules"},customRules:{type:"array",items:{type:"object",properties:{from:{type:"string"},to:{type:"array",items:{type:"string"}},allowed:{type:"array",items:{type:"string"}}},required:["from","to"]},default:[],description:"Custom domain boundary rules"}},additionalProperties:false}]},defaultOptions:[{domainPatterns:["domains","features","modules"],allowedSharedModules:["shared","common","utils"],ignoreNodeModules:true,customRules:[]}],create(context,[options={}]){const filename=context.filename;function checkImport(node){let importPath="";if(node.type==="ImportDeclaration"){importPath=node.source.value}else if(node.type==="ImportExpression"){if(node.source.type==="Literal"){importPath=node.source.value}else{return}}if(importPath.startsWith(".")){const violation=violatesDomainBoundary(filename,importPath,options);if(violation.violates&&violation.sourceDomain&&violation.targetDomain){context.report({node,messageId:"crossDomainImport",data:{sourceDomain:violation.sourceDomain,targetDomain:violation.targetDomain},suggest:[{messageId:"useSharedModule",fix:()=>null},{messageId:"useEvents",fix:()=>null},{messageId:"useApplicationService",fix:()=>null}]})}}}return{ImportDeclaration:checkImport,ImportExpression:checkImport}}});
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.noCrossDomainImports=void 0;exports.violatesDomainBoundary=violatesDomainBoundary;const eslint_devkit_1=require("@interlace/eslint-devkit");const eslint_devkit_2=require("@interlace/eslint-devkit");const eslint_devkit_3=require("@interlace/eslint-devkit");function extractDomain(filePath,domainPatterns){const normalizedPath=(0,eslint_devkit_3.normalizePath)(filePath);for(const pattern of domainPatterns){const regex=new RegExp(`(?:^|[/\\\\])${pattern}[/\\\\]([^/\\\\]+)`,"i");const match=normalizedPath.match(regex);if(match&&match[1]){return match[1]}}return null}function isSharedModule(filePath,allowedSharedModules){const normalizedPath=(0,eslint_devkit_3.normalizePath)(filePath);for(const shared of allowedSharedModules){if(normalizedPath.includes(`/${shared}/`)||normalizedPath.includes(`\\${shared}\\`)){return true}}return false}function violatesDomainBoundary(sourceFile,importPath,options){const{domainPatterns=["domains","features","modules"],allowedSharedModules=["shared","common","utils"],customRules=[]}=options||{};if(!importPath.startsWith(".")){return{violates:false,sourceDomain:null,targetDomain:null}}const sourceDomain=extractDomain(sourceFile,domainPatterns);let targetDomain=null;{for(const pattern of domainPatterns){const regex=new RegExp(`[/\\\\]${pattern}[/\\\\]([^/\\\\]+)`,"i");const match=importPath.match(regex);if(match&&match[1]){targetDomain=match[1];break}}if(!targetDomain){const segments=importPath.split(/[/\\]/);if(segments.length>=3&&segments[0]===".."&&segments[1]!=="."&&segments[1]!==".."&&segments[1]!==""&&segments[2]!==""&&segments.filter(s=>s==="..").length===1){const potentialDomain=segments[1];if(domainPatterns.some(p=>p.toLowerCase().includes(potentialDomain.toLowerCase())||potentialDomain.toLowerCase().includes(p))){targetDomain=potentialDomain}else if(["product","order"].includes(potentialDomain)){targetDomain=potentialDomain}}}}if(!sourceDomain||!targetDomain){return{violates:false,sourceDomain,targetDomain}}if(sourceDomain===targetDomain){return{violates:false,sourceDomain,targetDomain}}if(isSharedModule(importPath,allowedSharedModules)){return{violates:false,sourceDomain,targetDomain}}for(const rule of customRules){if(sourceFile.includes(rule.from)){const isAllowed=rule.allowed?.some(allowed=>importPath.includes(allowed));if(isAllowed){return{violates:false,sourceDomain,targetDomain}}if(rule.to.some(to=>importPath.includes(to))){return{violates:true,sourceDomain,targetDomain}}}}return{violates:true,sourceDomain,targetDomain}}exports.noCrossDomainImports=(0,eslint_devkit_2.createRule)({name:"no-cross-domain-imports",meta:{type:"problem",docs:{url:"https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-cross-domain-imports.md",description:"Prevents imports across domain/feature boundaries"},hasSuggestions:true,messages:{crossDomainImport:(0,eslint_devkit_1.formatLLMMessage)({icon:eslint_devkit_1.MessageIcons.ARCHITECTURE,issueName:"Cross-domain import",description:"Import from {{targetDomain}} to {{sourceDomain}} violates domain boundaries",severity:"HIGH",fix:"Use shared modules, events, or application services",documentationLink:"https://martinfowler.com/bliki/BoundedContext.html"}),useSharedModule:(0,eslint_devkit_1.formatLLMMessage)({icon:eslint_devkit_1.MessageIcons.INFO,issueName:"Use Shared Module",description:"Move shared code to shared module",severity:"LOW",fix:"Extract to shared/ or common/ directory",documentationLink:"https://martinfowler.com/bliki/BoundedContext.html"}),useEvents:(0,eslint_devkit_1.formatLLMMessage)({icon:eslint_devkit_1.MessageIcons.INFO,issueName:"Use Events",description:"Use event-driven communication",severity:"LOW",fix:"Publish events instead of direct imports",documentationLink:"https://martinfowler.com/eaaDev/DomainEvent.html"}),useApplicationService:(0,eslint_devkit_1.formatLLMMessage)({icon:eslint_devkit_1.MessageIcons.INFO,issueName:"Use Application Service",description:"Use application service layer",severity:"LOW",fix:"Route through application service for cross-domain calls",documentationLink:"https://martinfowler.com/bliki/BoundedContext.html"})},schema:[{type:"object",properties:{domainPatterns:{type:"array",items:{type:"string"},default:["domains","features","modules"],description:"Domain/feature directory patterns"},allowedSharedModules:{type:"array",items:{type:"string"},default:["shared","common","utils"],description:"Shared modules that can be imported"},ignoreNodeModules:{type:"boolean",default:true,description:"Ignore imports from node_modules"},customRules:{type:"array",items:{type:"object",properties:{from:{type:"string"},to:{type:"array",items:{type:"string"}},allowed:{type:"array",items:{type:"string"}}},required:["from","to"]},default:[],description:"Custom domain boundary rules"}},additionalProperties:false}]},defaultOptions:[{domainPatterns:["domains","features","modules"],allowedSharedModules:["shared","common","utils"],ignoreNodeModules:true,customRules:[]}],create(context,[options={}]){const filename=context.filename;function checkImport(node){let importPath="";if(node.type==="ImportDeclaration"){importPath=node.source.value}else if(node.type==="ImportExpression"){if(node.source.type==="Literal"){if(typeof node.source.value!=="string")return;importPath=node.source.value}else{return}}if(importPath.startsWith(".")){const violation=violatesDomainBoundary(filename,importPath,options);if(violation.violates&&violation.sourceDomain&&violation.targetDomain){context.report({node,messageId:"crossDomainImport",data:{sourceDomain:violation.sourceDomain,targetDomain:violation.targetDomain},suggest:[{messageId:"useSharedModule",fix:()=>null},{messageId:"useEvents",fix:()=>null},{messageId:"useApplicationService",fix:()=>null}]})}}}return{ImportDeclaration:checkImport,ImportExpression:checkImport}}});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.noExtraneousDependencies=void 0;const eslint_devkit_1=require("@interlace/eslint-devkit");const eslint_devkit_2=require("@interlace/eslint-devkit");const eslint_devkit_3=require("@interlace/eslint-devkit");const eslint_devkit_4=require("@interlace/eslint-devkit");exports.noExtraneousDependencies=(0,eslint_devkit_1.createRule)({name:"no-extraneous-dependencies",meta:{type:"problem",docs:{url:"https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-extraneous-dependencies.md",description:"Forbid the use of extraneous packages not listed in package.json"},hasSuggestions:true,messages:{extraneousDependency:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.WARNING,issueName:"Extraneous Dependency",description:"Package not listed in package.json dependencies",severity:"HIGH",fix:"Add package to package.json or remove the import",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-extraneous-dependencies.md"}),missingDependency:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.WARNING,issueName:"Missing Dependency",description:"Package used but not in package.json",severity:"HIGH",fix:"Add package to appropriate section in package.json",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-extraneous-dependencies.md"}),devDependencyInProduction:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.WARNING,issueName:"Dev Dependency in Production",description:"Dev dependency used in production code",severity:"MEDIUM",fix:"Move to dependencies or ensure this is only used in development",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-extraneous-dependencies.md"}),addToDependencies:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Add to Dependencies",description:"Add package to dependencies in package.json",severity:"HIGH",fix:"Run: npm install <package>",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-extraneous-dependencies.md"}),addToDevDependencies:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Add to Dev Dependencies",description:"Add package to devDependencies in package.json",severity:"HIGH",fix:"Run: npm install --save-dev <package>",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-extraneous-dependencies.md"}),moveToDependencies:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.ARCHITECTURE,issueName:"Move to Dependencies",description:"Move package from devDependencies to dependencies",severity:"MEDIUM",fix:"Move package from devDependencies to dependencies in package.json",documentationLink:"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-extraneous-dependencies.md"})},schema:[{type:"object",properties:{devDependencies:{type:"boolean",default:true,description:"Allow imports from devDependencies."},optionalDependencies:{type:"boolean",default:true,description:"Allow imports from optionalDependencies."},peerDependencies:{type:"boolean",default:true,description:"Allow imports from peerDependencies."},bundledDependencies:{type:"boolean",default:true,description:"Allow imports from bundledDependencies."},packageJsonPath:{type:"string",description:"Path to package.json file to use."},packageJson:{type:"object",description:"Direct package.json content for testing."},resolutionStrategy:{type:"string",enum:["strict","workspace","monorepo"],default:"strict",description:"Dependency resolution strategy: strict (exact match), workspace (allow workspace packages), monorepo (cross-package resolution)."},allowPatterns:{type:"array",items:{type:"string"},description:"Regex patterns for packages to allow even if not in package.json."},ignore:{type:"array",items:{type:"string"},description:"Specific package names to ignore (don't report as missing)."}},additionalProperties:false}]},defaultOptions:[{devDependencies:true,optionalDependencies:true,peerDependencies:true,bundledDependencies:true,resolutionStrategy:"strict",allowPatterns:[]}],create(context){const[options]=context.options;const{devDependencies=true,optionalDependencies=true,peerDependencies=true,bundledDependencies=true,packageJsonPath,packageJson,resolutionStrategy="strict",allowPatterns=[]}=options||{};const filename=context.filename;if(!filename){return{}}let resolvedPackageJson=null;if(packageJson){resolvedPackageJson=packageJson}else if(packageJsonPath){resolvedPackageJson=(0,eslint_devkit_3.readJsonFileSync)(packageJsonPath);if(!resolvedPackageJson){return{}}}else{const packageJsonFile=(0,eslint_devkit_3.findFileUpward)("package.json",(0,eslint_devkit_4.getDirname)(filename));if(!packageJsonFile){return{}}resolvedPackageJson=(0,eslint_devkit_3.readJsonFileSync)(packageJsonFile);if(!resolvedPackageJson){return{}}}const allowedPackages=new Set;if(resolvedPackageJson?.dependencies){Object.keys(resolvedPackageJson.dependencies).forEach(pkg=>allowedPackages.add(pkg))}if(devDependencies&&resolvedPackageJson?.devDependencies){Object.keys(resolvedPackageJson.devDependencies).forEach(pkg=>allowedPackages.add(pkg))}if(optionalDependencies&&resolvedPackageJson?.optionalDependencies){Object.keys(resolvedPackageJson.optionalDependencies).forEach(pkg=>allowedPackages.add(pkg))}if(peerDependencies&&resolvedPackageJson?.peerDependencies){Object.keys(resolvedPackageJson.peerDependencies).forEach(pkg=>allowedPackages.add(pkg))}if(bundledDependencies&&resolvedPackageJson?.bundledDependencies){resolvedPackageJson.bundledDependencies.forEach(pkg=>allowedPackages.add(pkg))}function isExternalPackage(importPath){if(/^\.\.?(\/|$)/.test(importPath)){return null}if(importPath.startsWith("/")){return null}if(importPath.startsWith("#")){return null}
|
|
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
|
|
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}
|