Skip to content

Commit d3591ea

Browse files
authored
fix(eslint-plugin-internal): consistent-deprecated-stories not removing tags prop [AR-54233] (#304)
1 parent e6da4c4 commit d3591ea

4 files changed

Lines changed: 60 additions & 14 deletions

File tree

packages/eslint-plugin-internal/src/rules/__tests__/consistent-deprecated-stories.test.ts

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -605,7 +605,7 @@ ruleTester.run('consistent-deprecated-stories', consistentDeprecatedStories, {
605605
},
606606

607607
{
608-
name: 'non-deprecated component with deprecated tag - removes tag',
608+
name: 'non-deprecated component with only deprecated tag - removes the whole tags prop',
609609
code: `
610610
function DsButton() { return null; }
611611
@@ -623,7 +623,7 @@ ruleTester.run('consistent-deprecated-stories', consistentDeprecatedStories, {
623623
const meta = {
624624
title: 'Design System/Button',
625625
component: DsButton,
626-
tags: [],
626+
627627
};
628628
629629
export default meta;
@@ -640,6 +640,42 @@ ruleTester.run('consistent-deprecated-stories', consistentDeprecatedStories, {
640640
],
641641
},
642642

643+
{
644+
name: 'non-deprecated component with deprecated tag and other tags - removes only the deprecated tag',
645+
code: `
646+
function DsButton() { return null; }
647+
648+
const meta = {
649+
title: 'Design System/Button',
650+
component: DsButton,
651+
tags: ['!dev', 'deprecated', 'autodocs'],
652+
};
653+
654+
export default meta;
655+
`,
656+
output: `
657+
function DsButton() { return null; }
658+
659+
const meta = {
660+
title: 'Design System/Button',
661+
component: DsButton,
662+
tags: ['!dev', 'autodocs'],
663+
};
664+
665+
export default meta;
666+
`,
667+
errors: [
668+
{
669+
messageId: 'noUnusedDeprecatedTag',
670+
data: { component: 'DsButton' },
671+
line: 7,
672+
column: 21,
673+
endLine: 7,
674+
endColumn: 33,
675+
},
676+
],
677+
},
678+
643679
{
644680
name: 'imported deprecated namespaced component',
645681
code: `
@@ -701,7 +737,7 @@ ruleTester.run('consistent-deprecated-stories', consistentDeprecatedStories, {
701737
const meta = {
702738
title: 'Design System/ActiveNamespacedComponent',
703739
component: DsActiveNamespacedComponent,
704-
tags: [],
740+
705741
};
706742
707743
export default meta;
@@ -787,7 +823,7 @@ ruleTester.run('consistent-deprecated-stories', consistentDeprecatedStories, {
787823
const meta = {
788824
title: 'Design System/SubComponents.Active',
789825
component: DsSubComponents.Active,
790-
tags: [],
826+
791827
};
792828
793829
export default meta;

packages/eslint-plugin-internal/src/rules/consistent-deprecated-stories.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { resolveStoryMeta } from './utils/resolve-story-meta';
44
import { AST_NODE_TYPES, ESLintUtils, type TSESTree } from '@typescript-eslint/utils';
55
import { getStoryMetaProps } from './utils/get-story-meta-props';
66
import { getComponentParts } from './utils/get-component-parts';
7+
import { removeWithTrailingComma } from './utils/remove-with-trailing-comma';
78

89
type MessageId =
910
| 'missingDeprecatedSuffix'
@@ -100,7 +101,14 @@ export const consistentDeprecatedStories = createRule<[], MessageId>({
100101
messageId: 'noUnusedDeprecatedTag',
101102
data: { component: componentDisplayName },
102103
fix: (fixer) => {
103-
return fixer.remove(deprecatedTag);
104+
const hasOnlyOneTag = tagsArray?.elements.length === 1;
105+
const nodeToRemove = hasOnlyOneTag ? tagsProp : deprecatedTag;
106+
107+
if (!nodeToRemove) {
108+
return null;
109+
}
110+
111+
return removeWithTrailingComma(context.sourceCode, fixer, nodeToRemove);
104112
},
105113
});
106114
}

packages/eslint-plugin-internal/src/rules/no-autodocs-tag.ts

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { createRule } from '../create-rule';
22
import { getObjectProperty } from './utils/get-object-property';
3+
import { removeWithTrailingComma } from './utils/remove-with-trailing-comma';
34
import { resolveStoryMeta } from './utils/resolve-story-meta';
4-
import { AST_NODE_TYPES, type TSESTree } from '@typescript-eslint/utils';
5-
import type { RuleFixer, SourceCode } from '@typescript-eslint/utils/ts-eslint';
5+
import { AST_NODE_TYPES } from '@typescript-eslint/utils';
66

77
type MessageId = 'noAutodocsTag';
88

@@ -65,10 +65,3 @@ export const noAutodocsTag = createRule<[], MessageId>({
6565
};
6666
},
6767
});
68-
69-
function removeWithTrailingComma(sourceCode: SourceCode, fixer: RuleFixer, node: TSESTree.Node) {
70-
const trailingComma = sourceCode.getTokenAfter(node);
71-
const rangeEnd = trailingComma?.value === ',' ? trailingComma.range[1] : node.range[1];
72-
73-
return fixer.removeRange([node.range[0], rangeEnd]);
74-
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import type { TSESTree } from '@typescript-eslint/utils';
2+
import type { RuleFixer, SourceCode } from '@typescript-eslint/utils/ts-eslint';
3+
4+
export function removeWithTrailingComma(sourceCode: SourceCode, fixer: RuleFixer, node: TSESTree.Node) {
5+
const trailingComma = sourceCode.getTokenAfter(node);
6+
const rangeEnd = trailingComma?.value === ',' ? trailingComma.range[1] : node.range[1];
7+
8+
return fixer.removeRange([node.range[0], rangeEnd]);
9+
}

0 commit comments

Comments
 (0)