Skip to content

Commit

Permalink
feat: allow only one import name per rule
Browse files Browse the repository at this point in the history
  • Loading branch information
gajus committed Oct 12, 2023
1 parent c92ebd1 commit b197579
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 60 deletions.
1 change: 0 additions & 1 deletion .README/README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
# eslint-plugin-canonical

[![NPM version](http://img.shields.io/npm/v/eslint-plugin-canonical.svg?style=flat-square)](https://www.npmjs.org/package/eslint-plugin-canonical)
[![Travis build status](http://img.shields.io/travis/gajus/eslint-plugin-canonical/master.svg?style=flat-square)](https://travis-ci.com/github/gajus/eslint-plugin-canonical)
[![js-canonical-style](https://img.shields.io/badge/code%20style-canonical-blue.svg?style=flat-square)](https://github.com/gajus/canonical)

ESLint rules for [Canonical ruleset](https://github.com/gajus/eslint-config-canonical).
Expand Down
1 change: 0 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
# eslint-plugin-canonical

[![NPM version](http://img.shields.io/npm/v/eslint-plugin-canonical.svg?style=flat-square)](https://www.npmjs.org/package/eslint-plugin-canonical)
[![Travis build status](http://img.shields.io/travis/gajus/eslint-plugin-canonical/master.svg?style=flat-square)](https://travis-ci.com/github/gajus/eslint-plugin-canonical)
[![js-canonical-style](https://img.shields.io/badge/code%20style-canonical-blue.svg?style=flat-square)](https://github.com/gajus/canonical)

ESLint rules for [Canonical ruleset](https://github.com/gajus/eslint-config-canonical).
Expand Down
101 changes: 47 additions & 54 deletions src/rules/noRestrictedImports.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import { createRule } from '../utilities';

type Options = [
{
paths: Array<{ importNames?: string[]; message: string; name: string }>;
paths: Array<{ importName?: string; message: string; name: string }>;
},
];

Expand Down Expand Up @@ -42,9 +42,9 @@ export default createRule<Options, keyof typeof messages>({
}

for (const importRule of importRules) {
const importNames = importRule.importNames ?? [];
const importName = importRule.importName;

if (importNames.length === 0) {
if (!importName) {
context.report({
data: {
customMessage: importRule.message,
Expand All @@ -57,62 +57,58 @@ export default createRule<Options, keyof typeof messages>({
continue;
}

for (const importName of importNames) {
if (importName === 'default') {
for (const nodeSpecifier of node.specifiers) {
if (
nodeSpecifier.type === AST_NODE_TYPES.ImportDefaultSpecifier
) {
context.report({
data: {
customMessage: importRule.message,
importName: 'default',
importSource,
},
messageId: 'importName',
node: nodeSpecifier,
});
}
if (importName === 'default') {
for (const nodeSpecifier of node.specifiers) {
if (nodeSpecifier.type === AST_NODE_TYPES.ImportDefaultSpecifier) {
context.report({
data: {
customMessage: importRule.message,
importName: 'default',
importSource,
},
messageId: 'importName',
node: nodeSpecifier,
});
}
}
}

if (
importName === '*' &&
node.specifiers[0].type === AST_NODE_TYPES.ImportNamespaceSpecifier
) {
context.report({
data: {
customMessage: importRule.message,
importNames: '*',
importSource,
},
messageId: 'everything',
node: node.source,
});

return;
}

const importSpecifiers = node.specifiers.filter(
(specifier) =>
specifier.type === 'ImportSpecifier' &&
specifier.imported.name === importName,
);

if (importSpecifiers.length === 0) {
continue;
}

if (
importName === '*' &&
node.specifiers[0].type === AST_NODE_TYPES.ImportNamespaceSpecifier
) {
context.report({
data: {
customMessage: importRule.message,
importName,
importNames: '*',
importSource,
},
messageId: 'importName',
node: importSpecifiers[0],
messageId: 'everything',
node: node.source,
});

return;
}

const importSpecifiers = node.specifiers.filter(
(specifier) =>
specifier.type === 'ImportSpecifier' &&
specifier.imported.name === importName,
);

if (importSpecifiers.length === 0) {
continue;
}

context.report({
data: {
customMessage: importRule.message,
importName,
importSource,
},
messageId: 'importName',
node: importSpecifiers[0],
});
}
};

Expand All @@ -138,11 +134,8 @@ export default createRule<Options, keyof typeof messages>({
items: {
additionalProperties: false,
properties: {
importNames: {
items: {
type: 'string',
},
type: 'array',
importName: {
type: 'string',
},
message: {
minLength: 1,
Expand Down
8 changes: 4 additions & 4 deletions tests/rules/noRestrictedImports.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ ruleTester.run('no-restricted-imports', rule, {
{
paths: [
{
importNames: ['*'],
importName: '*',
message: 'foo is restricted',
name: 'bar',
},
Expand All @@ -47,7 +47,7 @@ ruleTester.run('no-restricted-imports', rule, {
{
paths: [
{
importNames: ['foo'],
importName: 'foo',
message: 'foo is restricted',
name: 'bar',
},
Expand All @@ -71,7 +71,7 @@ ruleTester.run('no-restricted-imports', rule, {
{
paths: [
{
importNames: ['default'],
importName: 'default',
message: 'foo is restricted',
name: 'bar',
},
Expand Down Expand Up @@ -109,7 +109,7 @@ ruleTester.run('no-restricted-imports', rule, {
{
paths: [
{
importNames: ['foo'],
importName: 'foo',
message: 'foo is restricted',
name: 'bar',
},
Expand Down

0 comments on commit b197579

Please sign in to comment.