eslint-plugin-import-next 2.3.3 → 2.3.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/CHANGELOG.md +24 -0
- package/README.md +80 -70
- package/package.json +15 -3
- package/src/index.d.ts +192 -0
- package/src/index.js +13 -1
- package/src/oxlint.d.ts +20 -0
- package/src/oxlint.js +21 -0
- package/src/rules/consistent-type-specifier-style.js +5 -1
- package/src/rules/default.js +1 -0
- package/src/rules/dynamic-import-chunkname.js +4 -1
- package/src/rules/enforce-dependency-direction.js +2 -1
- package/src/rules/enforce-import-order.js +4 -2
- package/src/rules/enforce-team-boundaries.js +27 -17
- package/src/rules/export.js +3 -0
- package/src/rules/exports-last.js +3 -0
- package/src/rules/extensions.js +1 -0
- package/src/rules/first.js +2 -0
- package/src/rules/group-exports.js +3 -0
- package/src/rules/max-dependencies.js +2 -1
- package/src/rules/named.js +1 -0
- package/src/rules/namespace.js +1 -0
- package/src/rules/newline-after-import.js +1 -0
- package/src/rules/no-absolute-path.js +3 -0
- package/src/rules/no-amd.js +2 -1
- package/src/rules/no-anonymous-default-export.js +2 -0
- package/src/rules/no-barrel-file.js +2 -1
- package/src/rules/no-barrel-import.js +1 -0
- package/src/rules/no-commonjs.js +2 -1
- package/src/rules/no-cross-domain-imports.js +2 -1
- package/src/rules/no-cycle.js +94 -73
- package/src/rules/no-default-export.js +2 -1
- package/src/rules/no-deprecated.js +2 -1
- package/src/rules/no-duplicates.js +1 -0
- package/src/rules/no-dynamic-require.js +3 -0
- package/src/rules/no-empty-named-blocks.js +4 -1
- package/src/rules/no-extraneous-dependencies.js +4 -1
- package/src/rules/no-full-package-import.js +1 -0
- package/src/rules/no-import-module-exports.js +3 -0
- package/src/rules/no-internal-modules.js +1 -0
- package/src/rules/no-legacy-imports.js +1 -0
- package/src/rules/no-mutable-exports.js +2 -1
- package/src/rules/no-named-as-default-member.js +3 -0
- package/src/rules/no-named-as-default.js +3 -0
- package/src/rules/no-named-default.js +3 -0
- package/src/rules/no-named-export.js +2 -1
- package/src/rules/no-namespace.js +12 -5
- package/src/rules/no-nodejs-modules.js +3 -1
- package/src/rules/no-relative-packages.js +4 -1
- package/src/rules/no-relative-parent-imports.js +1 -0
- package/src/rules/no-restricted-paths.js +1 -0
- package/src/rules/no-self-import.js +2 -1
- package/src/rules/no-unassigned-import.js +1 -0
- package/src/rules/no-unresolved.js +3 -2
- package/src/rules/no-unused-modules.js +1 -0
- package/src/rules/no-useless-path-segments.js +3 -0
- package/src/rules/prefer-default-export.js +2 -1
- package/src/rules/prefer-direct-import.js +1 -0
- package/src/rules/prefer-modern-api.js +1 -0
- package/src/rules/prefer-node-protocol.js +2 -0
- package/src/rules/prefer-tree-shakeable-imports.js +1 -0
- package/src/rules/require-import-approval.js +1 -0
- package/src/rules/unambiguous.js +3 -0
|
@@ -13,6 +13,7 @@ exports.noDuplicates = (0, eslint_devkit_1.createRule)({
|
|
|
13
13
|
meta: {
|
|
14
14
|
type: 'problem',
|
|
15
15
|
docs: {
|
|
16
|
+
url: 'https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-duplicates.md',
|
|
16
17
|
description: 'Reports duplicate imports',
|
|
17
18
|
},
|
|
18
19
|
fixable: 'code',
|
|
@@ -12,7 +12,10 @@ exports.noDynamicRequire = (0, eslint_devkit_1.createRule)({
|
|
|
12
12
|
meta: {
|
|
13
13
|
type: 'suggestion',
|
|
14
14
|
docs: {
|
|
15
|
+
url: 'https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-dynamic-require.md',
|
|
15
16
|
description: 'Forbid require() calls with expressions',
|
|
17
|
+
cwe: 'CWE-829',
|
|
18
|
+
cvss: 5,
|
|
16
19
|
},
|
|
17
20
|
messages: {
|
|
18
21
|
dynamicRequire: (0, eslint_devkit_1.formatLLMMessage)({
|
|
@@ -12,7 +12,10 @@ exports.noEmptyNamedBlocks = (0, eslint_devkit_1.createRule)({
|
|
|
12
12
|
meta: {
|
|
13
13
|
type: 'suggestion',
|
|
14
14
|
docs: {
|
|
15
|
+
url: 'https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-empty-named-blocks.md',
|
|
15
16
|
description: 'Forbid empty named import blocks',
|
|
17
|
+
cwe: 'CWE-561',
|
|
18
|
+
cvss: 2.5,
|
|
16
19
|
},
|
|
17
20
|
fixable: 'code',
|
|
18
21
|
hasSuggestions: true,
|
|
@@ -40,7 +43,7 @@ exports.noEmptyNamedBlocks = (0, eslint_devkit_1.createRule)({
|
|
|
40
43
|
const hasNamespaceImport = node.specifiers.some((spec) => spec.type === 'ImportNamespaceSpecifier');
|
|
41
44
|
const namedImports = node.specifiers.filter((spec) => spec.type === 'ImportSpecifier');
|
|
42
45
|
// Get the source code
|
|
43
|
-
const sourceCode = context.
|
|
46
|
+
const sourceCode = context.sourceCode;
|
|
44
47
|
const importText = sourceCode.getText(node);
|
|
45
48
|
// Check for empty braces pattern: {}
|
|
46
49
|
const hasEmptyBraces = /\{\s*\}/.test(importText);
|
|
@@ -15,6 +15,7 @@ exports.noExtraneousDependencies = (0, eslint_devkit_1.createRule)({
|
|
|
15
15
|
meta: {
|
|
16
16
|
type: 'problem',
|
|
17
17
|
docs: {
|
|
18
|
+
url: 'https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-extraneous-dependencies.md',
|
|
18
19
|
description: 'Forbid the use of extraneous packages not listed in package.json',
|
|
19
20
|
},
|
|
20
21
|
hasSuggestions: true,
|
|
@@ -134,7 +135,7 @@ exports.noExtraneousDependencies = (0, eslint_devkit_1.createRule)({
|
|
|
134
135
|
create(context) {
|
|
135
136
|
const [options] = context.options;
|
|
136
137
|
const { devDependencies = true, optionalDependencies = true, peerDependencies = true, bundledDependencies = true, packageJsonPath, packageJson, resolutionStrategy = 'strict', allowPatterns = [], } = options || {};
|
|
137
|
-
const filename = context.
|
|
138
|
+
const filename = context.filename;
|
|
138
139
|
if (!filename) {
|
|
139
140
|
return {};
|
|
140
141
|
}
|
|
@@ -188,6 +189,7 @@ exports.noExtraneousDependencies = (0, eslint_devkit_1.createRule)({
|
|
|
188
189
|
if (bundledDependencies && resolvedPackageJson?.bundledDependencies) {
|
|
189
190
|
resolvedPackageJson.bundledDependencies.forEach((pkg) => allowedPackages.add(pkg));
|
|
190
191
|
}
|
|
192
|
+
// oxlint-disable-next-line consistent-function-scoping
|
|
191
193
|
function isExternalPackage(importPath) {
|
|
192
194
|
// Skip relative imports
|
|
193
195
|
if (importPath.startsWith('./') || importPath.startsWith('../')) {
|
|
@@ -265,6 +267,7 @@ exports.noExtraneousDependencies = (0, eslint_devkit_1.createRule)({
|
|
|
265
267
|
: importPath.split('/')[0];
|
|
266
268
|
return packageName;
|
|
267
269
|
}
|
|
270
|
+
// oxlint-disable-next-line consistent-function-scoping
|
|
268
271
|
function isWorkspacePackage(packageName) {
|
|
269
272
|
// For testing purposes, consider packages with @workspace/ or @company/ as workspace packages
|
|
270
273
|
return (packageName.startsWith('@workspace/') ||
|
|
@@ -79,6 +79,7 @@ exports.noFullPackageImport = (0, eslint_devkit_1.createRule)({
|
|
|
79
79
|
meta: {
|
|
80
80
|
type: 'suggestion',
|
|
81
81
|
docs: {
|
|
82
|
+
url: 'https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-full-package-import.md',
|
|
82
83
|
description: 'Disallow full package imports from known large packages that prevent tree-shaking',
|
|
83
84
|
},
|
|
84
85
|
hasSuggestions: true,
|
|
@@ -12,7 +12,10 @@ exports.noImportModuleExports = (0, eslint_devkit_1.createRule)({
|
|
|
12
12
|
meta: {
|
|
13
13
|
type: 'problem',
|
|
14
14
|
docs: {
|
|
15
|
+
url: 'https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-import-module-exports.md',
|
|
15
16
|
description: 'Forbid import statements with CommonJS module.exports',
|
|
17
|
+
cwe: 'CWE-1078',
|
|
18
|
+
cvss: 7.5,
|
|
16
19
|
},
|
|
17
20
|
fixable: 'code',
|
|
18
21
|
messages: {
|
|
@@ -87,6 +87,7 @@ exports.noInternalModules = (0, eslint_devkit_1.createRule)({
|
|
|
87
87
|
meta: {
|
|
88
88
|
type: 'problem',
|
|
89
89
|
docs: {
|
|
90
|
+
url: 'https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-internal-modules.md',
|
|
90
91
|
description: 'Forbid importing the submodules of other modules',
|
|
91
92
|
},
|
|
92
93
|
fixable: 'code',
|
|
@@ -25,6 +25,7 @@ exports.noLegacyImports = (0, eslint_devkit_1.createRule)({
|
|
|
25
25
|
meta: {
|
|
26
26
|
type: 'suggestion',
|
|
27
27
|
docs: {
|
|
28
|
+
url: 'https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-legacy-imports.md',
|
|
28
29
|
description: 'Detect imports from deprecated internal paths and suggest alternatives',
|
|
29
30
|
},
|
|
30
31
|
fixable: 'code',
|
|
@@ -13,6 +13,7 @@ exports.noMutableExports = (0, eslint_devkit_1.createRule)({
|
|
|
13
13
|
meta: {
|
|
14
14
|
type: 'suggestion',
|
|
15
15
|
docs: {
|
|
16
|
+
url: 'https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-mutable-exports.md',
|
|
16
17
|
description: 'Forbid the use of mutable exports with `var` or `let`',
|
|
17
18
|
},
|
|
18
19
|
hasSuggestions: false,
|
|
@@ -70,7 +71,7 @@ exports.noMutableExports = (0, eslint_devkit_1.createRule)({
|
|
|
70
71
|
create(context) {
|
|
71
72
|
const [options] = context.options;
|
|
72
73
|
const { allowInFiles = [], ignoreExports = [] } = options || {};
|
|
73
|
-
const filename = context.
|
|
74
|
+
const filename = context.filename;
|
|
74
75
|
if (!filename) {
|
|
75
76
|
return {};
|
|
76
77
|
}
|
|
@@ -12,7 +12,10 @@ exports.noNamedAsDefaultMember = (0, eslint_devkit_1.createRule)({
|
|
|
12
12
|
meta: {
|
|
13
13
|
type: 'suggestion',
|
|
14
14
|
docs: {
|
|
15
|
+
url: 'https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-named-as-default-member.md',
|
|
15
16
|
description: 'Forbid use of exported name as property of default export',
|
|
17
|
+
cwe: 'CWE-1078',
|
|
18
|
+
cvss: 2.5,
|
|
16
19
|
},
|
|
17
20
|
messages: {
|
|
18
21
|
namedAsDefaultMember: (0, eslint_devkit_1.formatLLMMessage)({
|
|
@@ -12,7 +12,10 @@ exports.noNamedAsDefault = (0, eslint_devkit_1.createRule)({
|
|
|
12
12
|
meta: {
|
|
13
13
|
type: 'problem',
|
|
14
14
|
docs: {
|
|
15
|
+
url: 'https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-named-as-default.md',
|
|
15
16
|
description: 'Forbid use of exported name as identifier of default export',
|
|
17
|
+
cwe: 'CWE-1078',
|
|
18
|
+
cvss: 5,
|
|
16
19
|
},
|
|
17
20
|
messages: {
|
|
18
21
|
namedAsDefault: (0, eslint_devkit_1.formatLLMMessage)({
|
|
@@ -12,7 +12,10 @@ exports.noNamedDefault = (0, eslint_devkit_1.createRule)({
|
|
|
12
12
|
meta: {
|
|
13
13
|
type: 'suggestion',
|
|
14
14
|
docs: {
|
|
15
|
+
url: 'https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-named-default.md',
|
|
15
16
|
description: 'Forbid named default exports',
|
|
17
|
+
cwe: 'CWE-1078',
|
|
18
|
+
cvss: 2.5,
|
|
16
19
|
},
|
|
17
20
|
messages: {
|
|
18
21
|
namedDefault: (0, eslint_devkit_1.formatLLMMessage)({
|
|
@@ -13,6 +13,7 @@ exports.noNamedExport = (0, eslint_devkit_1.createRule)({
|
|
|
13
13
|
meta: {
|
|
14
14
|
type: 'problem',
|
|
15
15
|
docs: {
|
|
16
|
+
url: 'https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-named-export.md',
|
|
16
17
|
description: 'Prevents named exports',
|
|
17
18
|
},
|
|
18
19
|
hasSuggestions: false,
|
|
@@ -82,7 +83,7 @@ exports.noNamedExport = (0, eslint_devkit_1.createRule)({
|
|
|
82
83
|
const { allowInFiles = [], allowNames = [], allowPatterns = [],
|
|
83
84
|
// suggestDefault // unused option
|
|
84
85
|
} = options || {};
|
|
85
|
-
const filename = context.
|
|
86
|
+
const filename = context.filename;
|
|
86
87
|
function shouldAllow(specifier) {
|
|
87
88
|
if (!filename) {
|
|
88
89
|
return false;
|
|
@@ -12,7 +12,10 @@ exports.noNamespace = (0, eslint_devkit_1.createRule)({
|
|
|
12
12
|
meta: {
|
|
13
13
|
type: 'suggestion',
|
|
14
14
|
docs: {
|
|
15
|
+
url: 'https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-namespace.md',
|
|
15
16
|
description: 'Forbid namespace (a.k.a. "wildcard" *) imports',
|
|
17
|
+
cwe: 'CWE-1078',
|
|
18
|
+
cvss: 2.5,
|
|
16
19
|
},
|
|
17
20
|
fixable: 'code',
|
|
18
21
|
messages: {
|
|
@@ -45,12 +48,16 @@ exports.noNamespace = (0, eslint_devkit_1.createRule)({
|
|
|
45
48
|
const ignorePatterns = options.ignore || [];
|
|
46
49
|
function isIgnored(source) {
|
|
47
50
|
return ignorePatterns.some((pattern) => {
|
|
48
|
-
//
|
|
51
|
+
// Escape ALL regex metacharacters — including `*`, `?`, and `\` — so
|
|
52
|
+
// the subsequent replaces can find the now-escaped `\*` and `\?` and
|
|
53
|
+
// translate them back to glob meanings. Without escaping `*` and `?`,
|
|
54
|
+
// the inner replaces don't match anything and raw `*` / `?` reach
|
|
55
|
+
// `new RegExp()` (CodeQL: `js/incomplete-sanitization`).
|
|
56
|
+
const escaped = pattern.replace(/[.+^${}()|[\]\\*?]/g, '\\$&');
|
|
49
57
|
const regex = new RegExp('^' +
|
|
50
|
-
|
|
51
|
-
.replace(
|
|
52
|
-
.replace(
|
|
53
|
-
.replace(/\//g, '\\/') +
|
|
58
|
+
escaped
|
|
59
|
+
.replace(/\\\*/g, '.*')
|
|
60
|
+
.replace(/\\\?/g, '.') +
|
|
54
61
|
'$');
|
|
55
62
|
return regex.test(source);
|
|
56
63
|
});
|
|
@@ -64,6 +64,7 @@ exports.noNodejsModules = (0, eslint_devkit_1.createRule)({
|
|
|
64
64
|
meta: {
|
|
65
65
|
type: 'problem',
|
|
66
66
|
docs: {
|
|
67
|
+
url: 'https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-nodejs-modules.md',
|
|
67
68
|
description: 'Prevents Node.js builtin imports',
|
|
68
69
|
},
|
|
69
70
|
messages: {
|
|
@@ -146,6 +147,7 @@ exports.noNodejsModules = (0, eslint_devkit_1.createRule)({
|
|
|
146
147
|
}
|
|
147
148
|
return false;
|
|
148
149
|
}
|
|
150
|
+
// oxlint-disable-next-line consistent-function-scoping
|
|
149
151
|
function getBuiltinName(moduleName) {
|
|
150
152
|
if (moduleName.startsWith('node:')) {
|
|
151
153
|
return moduleName.slice(5);
|
|
@@ -189,7 +191,7 @@ exports.noNodejsModules = (0, eslint_devkit_1.createRule)({
|
|
|
189
191
|
data: {
|
|
190
192
|
moduleName,
|
|
191
193
|
builtinName,
|
|
192
|
-
currentFile: context.
|
|
194
|
+
currentFile: context.filename,
|
|
193
195
|
alternative,
|
|
194
196
|
suggestion: fixSuggestion,
|
|
195
197
|
},
|
|
@@ -33,7 +33,10 @@ exports.noRelativePackages = (0, eslint_devkit_1.createRule)({
|
|
|
33
33
|
meta: {
|
|
34
34
|
type: 'suggestion',
|
|
35
35
|
docs: {
|
|
36
|
+
url: 'https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-relative-packages.md',
|
|
36
37
|
description: 'Forbid importing packages through relative paths',
|
|
38
|
+
cwe: 'CWE-1047',
|
|
39
|
+
cvss: 5,
|
|
37
40
|
},
|
|
38
41
|
fixable: 'code',
|
|
39
42
|
messages: {
|
|
@@ -61,7 +64,7 @@ exports.noRelativePackages = (0, eslint_devkit_1.createRule)({
|
|
|
61
64
|
create(context) {
|
|
62
65
|
const options = context.options[0] || {};
|
|
63
66
|
const { allowSamePackage = true } = options;
|
|
64
|
-
const filename = context.
|
|
67
|
+
const filename = context.filename;
|
|
65
68
|
const currentDir = path.dirname(filename);
|
|
66
69
|
const currentPackageRoot = findPackageJson(currentDir);
|
|
67
70
|
function checkImport(node, source) {
|
|
@@ -13,6 +13,7 @@ exports.noRelativeParentImports = (0, eslint_devkit_1.createRule)({
|
|
|
13
13
|
meta: {
|
|
14
14
|
type: 'problem',
|
|
15
15
|
docs: {
|
|
16
|
+
url: 'https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-relative-parent-imports.md',
|
|
16
17
|
description: 'Prevents ../ imports',
|
|
17
18
|
},
|
|
18
19
|
hasSuggestions: false,
|
|
@@ -13,6 +13,7 @@ exports.noRestrictedPaths = (0, eslint_devkit_1.createRule)({
|
|
|
13
13
|
meta: {
|
|
14
14
|
type: 'problem',
|
|
15
15
|
docs: {
|
|
16
|
+
url: 'https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-restricted-paths.md',
|
|
16
17
|
description: 'Enforce which files can be imported in a given folder',
|
|
17
18
|
},
|
|
18
19
|
hasSuggestions: false,
|
|
@@ -15,7 +15,7 @@ const path = tslib_1.__importStar(require("node:path"));
|
|
|
15
15
|
const eslint_devkit_1 = require("@interlace/eslint-devkit");
|
|
16
16
|
const eslint_devkit_2 = require("@interlace/eslint-devkit");
|
|
17
17
|
function isImportingSelf(context, node, importPath) {
|
|
18
|
-
const filename = context.
|
|
18
|
+
const filename = context.filename;
|
|
19
19
|
// If the input is from stdin, this test can't fail
|
|
20
20
|
if (filename === '<text>') {
|
|
21
21
|
return false;
|
|
@@ -55,6 +55,7 @@ exports.noSelfImport = (0, eslint_devkit_1.createRule)({
|
|
|
55
55
|
meta: {
|
|
56
56
|
type: 'problem',
|
|
57
57
|
docs: {
|
|
58
|
+
url: 'https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-self-import.md',
|
|
58
59
|
description: 'Forbid a module from importing itself',
|
|
59
60
|
},
|
|
60
61
|
messages: {
|
|
@@ -13,6 +13,7 @@ exports.noUnassignedImport = (0, eslint_devkit_1.createRule)({
|
|
|
13
13
|
meta: {
|
|
14
14
|
type: 'problem',
|
|
15
15
|
docs: {
|
|
16
|
+
url: 'https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-unassigned-import.md',
|
|
16
17
|
description: 'Prevents unassigned imports',
|
|
17
18
|
},
|
|
18
19
|
hasSuggestions: false,
|
|
@@ -19,6 +19,7 @@ exports.noUnresolved = (0, eslint_devkit_1.createRule)({
|
|
|
19
19
|
meta: {
|
|
20
20
|
type: 'problem',
|
|
21
21
|
docs: {
|
|
22
|
+
url: 'https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-unresolved.md',
|
|
22
23
|
description: 'Ensures imports point to resolvable modules',
|
|
23
24
|
},
|
|
24
25
|
hasSuggestions: true,
|
|
@@ -117,7 +118,7 @@ exports.noUnresolved = (0, eslint_devkit_1.createRule)({
|
|
|
117
118
|
node_module_1.builtinModules.includes(importPath)) {
|
|
118
119
|
return;
|
|
119
120
|
}
|
|
120
|
-
const filePath = context.filename
|
|
121
|
+
const filePath = context.filename;
|
|
121
122
|
const resolved = (0, eslint_devkit_3.resolveModule)(importPath, filePath, {
|
|
122
123
|
extensions: options?.extensions,
|
|
123
124
|
});
|
|
@@ -149,7 +150,7 @@ exports.noUnresolved = (0, eslint_devkit_1.createRule)({
|
|
|
149
150
|
}
|
|
150
151
|
statement = statement.parent;
|
|
151
152
|
}
|
|
152
|
-
return fixer.insertTextBefore(statement, '// eslint-disable-next-line
|
|
153
|
+
return fixer.insertTextBefore(statement, '// eslint-disable-next-line import-next/no-unresolved\n');
|
|
153
154
|
},
|
|
154
155
|
},
|
|
155
156
|
],
|
|
@@ -13,6 +13,7 @@ exports.noUnusedModules = (0, eslint_devkit_1.createRule)({
|
|
|
13
13
|
meta: {
|
|
14
14
|
type: 'problem',
|
|
15
15
|
docs: {
|
|
16
|
+
url: 'https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-unused-modules.md',
|
|
16
17
|
description: 'Forbid modules without exports',
|
|
17
18
|
},
|
|
18
19
|
hasSuggestions: false,
|
|
@@ -14,7 +14,10 @@ exports.noUselessPathSegments = (0, eslint_devkit_1.createRule)({
|
|
|
14
14
|
meta: {
|
|
15
15
|
type: 'suggestion',
|
|
16
16
|
docs: {
|
|
17
|
+
url: 'https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/no-useless-path-segments.md',
|
|
17
18
|
description: 'Forbid unnecessary path segments in import and require statements',
|
|
19
|
+
cwe: 'CWE-1078',
|
|
20
|
+
cvss: 2.5,
|
|
18
21
|
},
|
|
19
22
|
fixable: 'code',
|
|
20
23
|
messages: {
|
|
@@ -13,6 +13,7 @@ exports.preferDefaultExport = (0, eslint_devkit_1.createRule)({
|
|
|
13
13
|
meta: {
|
|
14
14
|
type: 'suggestion',
|
|
15
15
|
docs: {
|
|
16
|
+
url: 'https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/prefer-default-export.md',
|
|
16
17
|
description: 'Prefer a default export if module exports a single name',
|
|
17
18
|
},
|
|
18
19
|
hasSuggestions: true,
|
|
@@ -77,7 +78,7 @@ exports.preferDefaultExport = (0, eslint_devkit_1.createRule)({
|
|
|
77
78
|
create(context) {
|
|
78
79
|
const [options] = context.options;
|
|
79
80
|
const { target = 'single', ignoreFiles = [], allowNamedExports = false, } = options || {};
|
|
80
|
-
const filename = context.
|
|
81
|
+
const filename = context.filename;
|
|
81
82
|
if (!filename) {
|
|
82
83
|
return {};
|
|
83
84
|
}
|
|
@@ -47,6 +47,7 @@ exports.preferDirectImport = (0, eslint_devkit_1.createRule)({
|
|
|
47
47
|
meta: {
|
|
48
48
|
type: 'suggestion',
|
|
49
49
|
docs: {
|
|
50
|
+
url: 'https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/prefer-direct-import.md',
|
|
50
51
|
description: 'Prefer direct imports over barrel imports for better tree-shaking and build performance',
|
|
51
52
|
},
|
|
52
53
|
fixable: 'code',
|
|
@@ -126,6 +126,7 @@ exports.preferModernApi = (0, eslint_devkit_1.createRule)({
|
|
|
126
126
|
meta: {
|
|
127
127
|
type: 'suggestion',
|
|
128
128
|
docs: {
|
|
129
|
+
url: 'https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/prefer-modern-api.md',
|
|
129
130
|
description: 'Suggest modern replacements for deprecated or outdated libraries',
|
|
130
131
|
},
|
|
131
132
|
messages: {
|
|
@@ -58,6 +58,7 @@ exports.preferNodeProtocol = (0, eslint_devkit_1.createRule)({
|
|
|
58
58
|
meta: {
|
|
59
59
|
type: 'suggestion',
|
|
60
60
|
docs: {
|
|
61
|
+
url: 'https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/prefer-node-protocol.md',
|
|
61
62
|
description: 'Prefer using the node: protocol when importing Node.js builtin modules',
|
|
62
63
|
},
|
|
63
64
|
fixable: 'code',
|
|
@@ -160,6 +161,7 @@ exports.preferNodeProtocol = (0, eslint_devkit_1.createRule)({
|
|
|
160
161
|
}
|
|
161
162
|
},
|
|
162
163
|
};
|
|
164
|
+
// oxlint-disable-next-line consistent-function-scoping
|
|
163
165
|
function isBuiltInModule(moduleName, modulesToCheck) {
|
|
164
166
|
// Skip if already using node: protocol
|
|
165
167
|
if (moduleName.startsWith('node:')) {
|
|
@@ -39,6 +39,7 @@ exports.preferTreeShakeableImports = (0, eslint_devkit_1.createRule)({
|
|
|
39
39
|
meta: {
|
|
40
40
|
type: 'suggestion',
|
|
41
41
|
docs: {
|
|
42
|
+
url: 'https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/prefer-tree-shakeable-imports.md',
|
|
42
43
|
description: 'Prefer import patterns that enable effective tree-shaking',
|
|
43
44
|
},
|
|
44
45
|
hasSuggestions: true,
|
|
@@ -44,6 +44,7 @@ exports.requireImportApproval = (0, eslint_devkit_1.createRule)({
|
|
|
44
44
|
meta: {
|
|
45
45
|
type: 'problem',
|
|
46
46
|
docs: {
|
|
47
|
+
url: 'https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/require-import-approval.md',
|
|
47
48
|
description: 'Enforce explicit approval for high-risk package imports',
|
|
48
49
|
},
|
|
49
50
|
messages: {
|
package/src/rules/unambiguous.js
CHANGED
|
@@ -12,7 +12,10 @@ exports.unambiguous = (0, eslint_devkit_1.createRule)({
|
|
|
12
12
|
meta: {
|
|
13
13
|
type: 'suggestion',
|
|
14
14
|
docs: {
|
|
15
|
+
url: 'https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-import-next/docs/rules/unambiguous.md',
|
|
15
16
|
description: 'Forbid potentially ambiguous parse goal (script vs. module)',
|
|
17
|
+
cwe: 'CWE-1078',
|
|
18
|
+
cvss: 2.5,
|
|
16
19
|
},
|
|
17
20
|
messages: {
|
|
18
21
|
ambiguous: (0, eslint_devkit_1.formatLLMMessage)({
|