forked from ember-cli/eslint-plugin-ember
-
Notifications
You must be signed in to change notification settings - Fork 0
/
no-implicit-service-injection-argument.js
105 lines (95 loc) · 4.71 KB
/
no-implicit-service-injection-argument.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
//------------------------------------------------------------------------------
// Requirements
//------------------------------------------------------------------------------
const rule = require('../../../lib/rules/no-implicit-service-injection-argument');
const RuleTester = require('eslint').RuleTester;
const { ERROR_MESSAGE } = rule;
const EMBER_IMPORT = "import Ember from 'ember';";
const INJECT_IMPORT = "import {inject} from '@ember/service';";
const SERVICE_IMPORT = "import {inject as service} from '@ember/service';";
const NEW_SERVICE_IMPORT = "import {service} from '@ember/service';";
//------------------------------------------------------------------------------
// Tests
//------------------------------------------------------------------------------
const ruleTester = new RuleTester({
parserOptions: {
ecmaVersion: 2020,
sourceType: 'module',
ecmaFeatures: { legacyDecorators: true },
},
parser: require.resolve('@babel/eslint-parser'),
});
ruleTester.run('no-implicit-service-injection-argument', rule, {
valid: [
// With argument (classic class):
`${EMBER_IMPORT} export default Component.extend({ serviceName: Ember.inject.service('serviceName') });`,
`${INJECT_IMPORT} export default Component.extend({ serviceName: inject('serviceName') });`,
`${SERVICE_IMPORT} export default Component.extend({ serviceName: service('serviceName') });`,
`${SERVICE_IMPORT} export default Component.extend({ serviceName: service('service-name') });`,
`${SERVICE_IMPORT} export default Component.extend({ serviceName: service('random') });`,
`${SERVICE_IMPORT} export default Component.extend({ serviceName: service(\`service-name\`) });`,
// With argument (native class)
`${SERVICE_IMPORT} class Test { @service('service-name') serviceName }`,
`${NEW_SERVICE_IMPORT} class Test { @service('service-name') serviceName }`,
// Not Ember's `service()` function (classic class):
'export default Component.extend({ serviceName: otherFunction() });',
`${SERVICE_IMPORT} export default Component.extend({ serviceName: service.foo() });`,
// Not Ember's `service()` function (native class):
`${SERVICE_IMPORT} class Test { @otherDecorator() name }`,
`${SERVICE_IMPORT} class Test { @service.foo() name }`,
`${SERVICE_IMPORT} class Test { @foo.service() name }`,
// Spread syntax
'export default Component.extend({ ...foo });',
],
invalid: [
// Classic class
{
// `service` import
code: `${SERVICE_IMPORT} export default Component.extend({ serviceName: service() });`,
output: `${SERVICE_IMPORT} export default Component.extend({ serviceName: service('service-name') });`,
errors: [{ message: ERROR_MESSAGE, type: 'CallExpression' }],
},
{
// `inject` import
code: `${INJECT_IMPORT} export default Component.extend({ serviceName: inject() });`,
output: `${INJECT_IMPORT} export default Component.extend({ serviceName: inject('service-name') });`,
errors: [{ message: ERROR_MESSAGE, type: 'CallExpression' }],
},
{
// Property name in string literal.
code: `${SERVICE_IMPORT} export default Component.extend({ 'serviceName': service() });`,
output: `${SERVICE_IMPORT} export default Component.extend({ 'serviceName': service('service-name') });`,
errors: [{ message: ERROR_MESSAGE, type: 'CallExpression' }],
},
// Decorator:
{
code: `${SERVICE_IMPORT} class Test { @service() serviceName }`,
output: `${SERVICE_IMPORT} class Test { @service('service-name') serviceName }`,
errors: [{ message: ERROR_MESSAGE, type: 'CallExpression' }],
},
// Decorator with new import
{
code: `${NEW_SERVICE_IMPORT} class Test { @service() serviceName }`,
output: `${NEW_SERVICE_IMPORT} class Test { @service('service-name') serviceName }`,
errors: [{ message: ERROR_MESSAGE, type: 'CallExpression' }],
},
{
// Decorator with no parenthesis
code: `${SERVICE_IMPORT} class Test { @service serviceName }`,
output: `${SERVICE_IMPORT} class Test { @service('service-name') serviceName }`,
errors: [{ message: ERROR_MESSAGE, type: 'Identifier' }],
},
{
// No normalization needed.
code: `${SERVICE_IMPORT} class Test { @service() foo }`,
output: `${SERVICE_IMPORT} class Test { @service('foo') foo }`,
errors: [{ message: ERROR_MESSAGE, type: 'CallExpression' }],
},
{
// Scoped/nested service name with property name in string literal.
code: `${SERVICE_IMPORT} class Test { @service() 'myScope/myService' }`,
output: `${SERVICE_IMPORT} class Test { @service('my-scope/my-service') 'myScope/myService' }`,
errors: [{ message: ERROR_MESSAGE, type: 'CallExpression' }],
},
],
});