Skip to content

Commit a1378e5

Browse files
Merge pull request #2578 from RobbieTheWagner/feat/native-controller-class-order-support
Add native class support for order-in-controllers
2 parents 93dabe1 + ea8eef7 commit a1378e5

4 files changed

Lines changed: 160 additions & 6 deletions

File tree

docs/rules/order-in-controllers.md

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -125,8 +125,4 @@ export default Controller.extend({
125125
});
126126
```
127127

128-
## Help Wanted
129-
130-
| Issue | Link |
131-
| :----------------------------------------- | :------------------------------------------------------------------ |
132-
| ❌ Missing native JavaScript class support | [#560](https://github.com/ember-cli/eslint-plugin-ember/issues/560) |
128+
This rule checks ordering only; it does not enforce indentation or other whitespace formatting.

lib/rules/order-in-controllers.js

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,40 @@ module.exports = {
9191
return;
9292
}
9393

94+
reportUnorderedProperties(
95+
node,
96+
context,
97+
'controller',
98+
order,
99+
importedEmberName,
100+
importedInjectName,
101+
importedObserverName,
102+
importedControllerName,
103+
scopeManager
104+
);
105+
},
106+
ClassDeclaration(node) {
107+
if (!ember.isEmberController(context, node)) {
108+
return;
109+
}
110+
111+
reportUnorderedProperties(
112+
node,
113+
context,
114+
'controller',
115+
order,
116+
importedEmberName,
117+
importedInjectName,
118+
importedObserverName,
119+
importedControllerName,
120+
scopeManager
121+
);
122+
},
123+
ClassExpression(node) {
124+
if (!ember.isEmberController(context, node)) {
125+
return;
126+
}
127+
94128
reportUnorderedProperties(
95129
node,
96130
context,

tests/lib/rules/order-in-controllers.js

Lines changed: 123 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,13 @@ const RuleTester = require('eslint').RuleTester;
1010
// ------------------------------------------------------------------------------
1111

1212
const eslintTester = new RuleTester({
13-
parserOptions: { ecmaVersion: 2022, sourceType: 'module' },
13+
parserOptions: {
14+
ecmaVersion: 2022,
15+
sourceType: 'module',
16+
babelOptions: {
17+
configFile: require.resolve('../../../.babelrc'),
18+
},
19+
},
1420
parser: require.resolve('@babel/eslint-parser'),
1521
});
1622

@@ -146,6 +152,51 @@ eslintTester.run('order-in-controllers', rule, {
146152
],
147153
parserOptions: { ecmaVersion: 2022, sourceType: 'module' },
148154
},
155+
`import Controller from '@ember/controller';
156+
import { inject as service } from '@ember/service';
157+
export default class UserController extends Controller {
158+
@service currentUser;
159+
queryParams = [];
160+
customProp = 'test';
161+
actions() {}
162+
}`,
163+
{
164+
code: `import Controller from '@ember/controller';
165+
import { inject as service } from '@ember/service';
166+
export default class UserController extends Controller {
167+
queryParams = [];
168+
@service currentUser;
169+
actions() {}
170+
}`,
171+
options: [
172+
{
173+
order: ['query-params', 'service', 'single-line-function'],
174+
},
175+
],
176+
},
177+
{
178+
code: `import Controller from '@ember/controller';
179+
import { inject as service } from '@ember/service';
180+
export default class UserController extends Controller {
181+
@service currentUser;
182+
queryParams = [];
183+
customProp = 'test';
184+
}`,
185+
options: [
186+
{
187+
order: [['service', 'query-params'], 'property'],
188+
},
189+
],
190+
},
191+
// spacing/indentation is intentionally not validated by this rule;
192+
// only member ordering should matter.
193+
`import Controller from '@ember/controller';
194+
import { inject as service } from '@ember/service';
195+
export default class UserController extends Controller {
196+
@service currentUser;
197+
queryParams = [];
198+
customProp = 'test';
199+
}`,
149200
],
150201
invalid: [
151202
{
@@ -524,5 +575,76 @@ eslintTester.run('order-in-controllers', rule, {
524575
},
525576
],
526577
},
578+
{
579+
code: `import Controller from '@ember/controller';
580+
import { inject as service } from '@ember/service';
581+
export default class UserController extends Controller {
582+
queryParams = [];
583+
@service currentUser;
584+
customProp = 'test';
585+
}`,
586+
output: `import Controller from '@ember/controller';
587+
import { inject as service } from '@ember/service';
588+
export default class UserController extends Controller {
589+
@service currentUser;
590+
queryParams = [];
591+
customProp = 'test';
592+
}`,
593+
errors: [
594+
{
595+
message:
596+
'The "currentUser" service injection should be above the "queryParams" property on line 4',
597+
line: 5,
598+
},
599+
],
600+
},
601+
{
602+
code: `import Controller from '@ember/controller';
603+
export default class UserController extends Controller {
604+
customProp = 'test';
605+
queryParams = [];
606+
actions() {}
607+
}`,
608+
output: `import Controller from '@ember/controller';
609+
export default class UserController extends Controller {
610+
queryParams = [];
611+
customProp = 'test';
612+
actions() {}
613+
}`,
614+
errors: [
615+
{
616+
message: 'The "queryParams" property should be above the "customProp" property on line 3',
617+
line: 4,
618+
},
619+
],
620+
},
621+
{
622+
code: `import Controller from '@ember/controller';
623+
import { inject as service } from '@ember/service';
624+
export default class UserController extends Controller {
625+
@service currentUser;
626+
queryParams = [];
627+
actions() {}
628+
}`,
629+
output: `import Controller from '@ember/controller';
630+
import { inject as service } from '@ember/service';
631+
export default class UserController extends Controller {
632+
queryParams = [];
633+
@service currentUser;
634+
actions() {}
635+
}`,
636+
options: [
637+
{
638+
order: ['query-params', 'service', 'single-line-function'],
639+
},
640+
],
641+
errors: [
642+
{
643+
message:
644+
'The "queryParams" property should be above the "currentUser" service injection on line 4',
645+
line: 5,
646+
},
647+
],
648+
},
527649
],
528650
});

tests/lib/utils/ember-test.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1706,6 +1706,8 @@ describe('isFunctionExpression', () => {
17061706
test: () => {}
17071707
}`);
17081708
expect(emberUtils.isFunctionExpression(property.value)).toBeTruthy();
1709+
1710+
expect(emberUtils.isFunctionExpression(null)).toBeFalsy();
17091711
});
17101712
});
17111713

0 commit comments

Comments
 (0)