Skip to content

Commit cf00326

Browse files
Merge pull request #2200 from wagenet/fix-lifecycle-hook-in-double-extend
Fix no-component-lifecycle-hook in double extended classic component
2 parents 49ff30c + 4427396 commit cf00326

File tree

2 files changed

+32
-2
lines changed

2 files changed

+32
-2
lines changed

lib/rules/no-component-lifecycle-hooks.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,22 +36,25 @@ module.exports = {
3636
let isInsideEmberComponent = false;
3737
let isInsideGlimmerComponent = false;
3838
let currentComponentNode = null;
39+
let isInsideClassDeclaration = false;
3940

4041
return {
4142
// Native class.
4243
ClassDeclaration(node) {
4344
if (isEmberComponent(context, node)) {
4445
currentComponentNode = node;
4546
isInsideEmberComponent = true;
47+
isInsideClassDeclaration = true;
4648
} else if (isGlimmerComponent(context, node)) {
4749
currentComponentNode = node;
4850
isInsideGlimmerComponent = true;
51+
isInsideClassDeclaration = true;
4952
}
5053
},
5154

5255
// Classic class (not used by Glimmer components).
5356
CallExpression(node) {
54-
if (isEmberComponent(context, node)) {
57+
if (isEmberComponent(context, node) && !isInsideClassDeclaration) {
5558
currentComponentNode = node;
5659
isInsideEmberComponent = true;
5760
}
@@ -62,11 +65,12 @@ module.exports = {
6265
currentComponentNode = null;
6366
isInsideEmberComponent = false;
6467
isInsideGlimmerComponent = false;
68+
isInsideClassDeclaration = false;
6569
}
6670
},
6771

6872
'CallExpression:exit'(node) {
69-
if (currentComponentNode === node) {
73+
if (currentComponentNode === node && !isInsideClassDeclaration) {
7074
currentComponentNode = null;
7175
isInsideEmberComponent = false;
7276
}

tests/lib/rules/no-component-lifecycle-hooks.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,16 @@ ruleTester.run('no-component-lifecycle-hooks', rule, {
8787
8888
const someRandomClassOrObject = { didDestroyElement() { } };
8989
`,
90+
`
91+
import Component from '@ember/component';
92+
93+
export default class CommentInput extends Component.extend() {
94+
}
95+
96+
export class CommentInput2 {
97+
didDestroyElement() {}
98+
}
99+
`,
90100
],
91101

92102
invalid: [
@@ -167,5 +177,21 @@ ruleTester.run('no-component-lifecycle-hooks', rule, {
167177
},
168178
],
169179
},
180+
{
181+
code: `
182+
import Component from '@ember/component';
183+
184+
export default class CommentInput extends Component.extend() {
185+
didDestroyElement() {}
186+
}
187+
`,
188+
output: null,
189+
errors: [
190+
{
191+
message: ERROR_MESSAGE,
192+
type: 'MethodDefinition',
193+
},
194+
],
195+
},
170196
],
171197
});

0 commit comments

Comments
 (0)