Skip to content

Commit 119fba7

Browse files
authored
fix(eslint-plugin): [no-input-rename] do not report on directive composition API (#1231)
1 parent 299a0c2 commit 119fba7

File tree

3 files changed

+156
-0
lines changed

3 files changed

+156
-0
lines changed

packages/eslint-plugin/docs/rules/no-input-rename.md

+99
Original file line numberDiff line numberDiff line change
@@ -655,6 +655,105 @@ class Test {}
655655

656656
#### ✅ Valid Code
657657

658+
```ts
659+
@Component({
660+
selector: 'qx-menuitem',
661+
hostDirectives: [{
662+
directive: CdkMenuItem,
663+
inputs: ['cdkMenuItemDisabled: disabled'],
664+
}]
665+
})
666+
class Test {}
667+
```
668+
669+
<br>
670+
671+
---
672+
673+
<br>
674+
675+
#### Default Config
676+
677+
```json
678+
{
679+
"rules": {
680+
"@angular-eslint/no-input-rename": [
681+
"error"
682+
]
683+
}
684+
}
685+
```
686+
687+
<br>
688+
689+
#### ✅ Valid Code
690+
691+
```ts
692+
@Component({
693+
selector: 'qx-menuitem',
694+
'hostDirectives': [{
695+
directive: CdkMenuItem,
696+
inputs: ['cdkMenuItemDisabled: disabled'],
697+
}]
698+
})
699+
class Test {}
700+
```
701+
702+
<br>
703+
704+
---
705+
706+
<br>
707+
708+
#### Default Config
709+
710+
```json
711+
{
712+
"rules": {
713+
"@angular-eslint/no-input-rename": [
714+
"error"
715+
]
716+
}
717+
}
718+
```
719+
720+
<br>
721+
722+
#### ✅ Valid Code
723+
724+
```ts
725+
@Component({
726+
selector: 'qx-menuitem',
727+
['hostDirectives']: [{
728+
directive: CdkMenuItem,
729+
inputs: ['cdkMenuItemDisabled: disabled'],
730+
}]
731+
})
732+
class Test {}
733+
```
734+
735+
<br>
736+
737+
---
738+
739+
<br>
740+
741+
#### Default Config
742+
743+
```json
744+
{
745+
"rules": {
746+
"@angular-eslint/no-input-rename": [
747+
"error"
748+
]
749+
}
750+
}
751+
```
752+
753+
<br>
754+
755+
#### ✅ Valid Code
756+
658757
```ts
659758
@Component({})
660759
class Test {

packages/eslint-plugin/src/rules/no-input-rename.ts

+22
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,28 @@ export default createESLintRule<Options, MessageIds>({
139139
[Selectors.INPUTS_METADATA_PROPERTY_LITERAL](
140140
node: TSESTree.Literal | TSESTree.TemplateElement,
141141
) {
142+
const ancestorMaybeHostDirectiveAPI =
143+
node.parent?.parent?.parent?.parent?.parent;
144+
if (
145+
ancestorMaybeHostDirectiveAPI &&
146+
ASTUtils.isProperty(ancestorMaybeHostDirectiveAPI)
147+
) {
148+
/**
149+
* Angular v15 introduced the directive composition API: https://angular.io/guide/directive-composition-api
150+
* Renaming host directive inputs using this API is not a bad practice and should not be reported
151+
*/
152+
const hostDirectiveAPIPropertyName = 'hostDirectives';
153+
if (
154+
(ASTUtils.isLiteral(ancestorMaybeHostDirectiveAPI.key) &&
155+
ancestorMaybeHostDirectiveAPI.key.value ===
156+
hostDirectiveAPIPropertyName) ||
157+
(TSESLintASTUtils.isIdentifier(ancestorMaybeHostDirectiveAPI.key) &&
158+
ancestorMaybeHostDirectiveAPI.key.name ===
159+
hostDirectiveAPIPropertyName)
160+
) {
161+
return;
162+
}
163+
}
142164
const [propertyName, aliasName] = withoutBracketsAndWhitespaces(
143165
ASTUtils.getRawText(node),
144166
).split(':');

packages/eslint-plugin/tests/rules/no-input-rename/cases.ts

+35
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,41 @@ export const valid = [
5050
})
5151
class Test {}
5252
`,
53+
/**
54+
* Renaming inputs when using the directive composition API is not a bad practice
55+
* https://angular.io/guide/directive-composition-api
56+
* https://www.youtube.com/watch?v=EJJwyyjsRGs
57+
*/
58+
`
59+
@Component({
60+
selector: 'qx-menuitem',
61+
hostDirectives: [{
62+
directive: CdkMenuItem,
63+
inputs: ['cdkMenuItemDisabled: disabled'],
64+
}]
65+
})
66+
class Test {}
67+
`,
68+
`
69+
@Component({
70+
selector: 'qx-menuitem',
71+
'hostDirectives': [{
72+
directive: CdkMenuItem,
73+
inputs: ['cdkMenuItemDisabled: disabled'],
74+
}]
75+
})
76+
class Test {}
77+
`,
78+
`
79+
@Component({
80+
selector: 'qx-menuitem',
81+
['hostDirectives']: [{
82+
directive: CdkMenuItem,
83+
inputs: ['cdkMenuItemDisabled: disabled'],
84+
}]
85+
})
86+
class Test {}
87+
`,
5388
`
5489
@Component({})
5590
class Test {

0 commit comments

Comments
 (0)