Skip to content

Commit d672f89

Browse files
committed
[Bugfix] - Fixes #47
1 parent 11de802 commit d672f89

File tree

2 files changed

+104
-3
lines changed

2 files changed

+104
-3
lines changed

lib/rules/no-global-jquery.js

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
*/
44
'use strict';
55

6+
const { getEmberImportBinding } = require('../utils/imports');
7+
const { collectObjectPatternBindings } = require('../utils/destructed-binding');
8+
9+
const MESSAGE = 'Do not use global `$` or `jQuery`. Use `Ember.$` instead. Please see the following guide for more information: https://github.com/ember-best-practices/eslint-plugin-ember-best-practices/blob/master/guides/rules/no-global-jquery.md';
610
const ALIASES = ['$', 'jQuery'];
711

812
/**
@@ -14,8 +18,6 @@ function isGlobalJquery(node) {
1418
return node.callee && ALIASES.includes(node.callee.name);
1519
}
1620

17-
const MESSAGE = 'Do not use global `$` or `jQuery`. Use `Ember.$` instead. Please see the following guide for more information: https://github.com/ember-best-practices/eslint-plugin-ember-best-practices/blob/master/guides/rules/no-global-jquery.md';
18-
1921
module.exports = {
2022
docs: {
2123
description: 'Disallow the use of global `$`',
@@ -26,9 +28,28 @@ module.exports = {
2628
message: MESSAGE
2729
},
2830
create(context) {
31+
let emberImportBinding;
32+
let deconstructedAssignment = null;
33+
34+
function isDeconstructed(node) {
35+
return node && node.callee && node.callee.name === deconstructedAssignment;
36+
}
37+
2938
return {
39+
ImportDefaultSpecifier(node) {
40+
emberImportBinding = getEmberImportBinding(node);
41+
},
42+
43+
ObjectPattern(node) {
44+
if (emberImportBinding) {
45+
deconstructedAssignment = collectObjectPatternBindings(node, {
46+
[emberImportBinding]: ['$']
47+
}).pop();
48+
}
49+
},
50+
3051
CallExpression(node) {
31-
if (isGlobalJquery(node)) {
52+
if (!isDeconstructed(node) && isGlobalJquery(node)) {
3253
context.report(node, MESSAGE);
3354
}
3455
}

tests/lib/rules/no-global-jquery.js

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,86 @@ ruleTester.run('no-global-jquery', rule, {
5656
ecmaVersion: 6,
5757
sourceType: 'module'
5858
}
59+
},
60+
{
61+
code: `
62+
import Ember from 'ember';
63+
64+
const { $ } = Ember;
65+
66+
export default Ember.Component({
67+
init() {
68+
this.el = $('.test');
69+
}
70+
});`,
71+
parserOptions: {
72+
ecmaVersion: 6,
73+
sourceType: 'module'
74+
},
75+
errors: [{
76+
message: MESSAGE
77+
}]
78+
},
79+
{
80+
code: `
81+
import Ember from 'ember';
82+
83+
const { $ } = Ember;
84+
85+
export default Ember.Component({
86+
actions: {
87+
valid() {
88+
this.inv1 = $('.invalid1');
89+
}
90+
}
91+
});`,
92+
parserOptions: {
93+
ecmaVersion: 6,
94+
sourceType: 'module'
95+
},
96+
errors: [{
97+
message: MESSAGE
98+
}]
99+
},
100+
{
101+
code: `
102+
import Ember from 'ember';
103+
104+
const { $: foo } = Ember;
105+
106+
export default Ember.Component({
107+
init() {
108+
this.el = foo('.test');
109+
}
110+
});`,
111+
parserOptions: {
112+
ecmaVersion: 6,
113+
sourceType: 'module'
114+
},
115+
errors: [{
116+
message: MESSAGE
117+
}]
118+
},
119+
{
120+
code: `
121+
import Ember from 'ember';
122+
123+
const { $: foo } = Ember;
124+
125+
export default Ember.Component({
126+
actions: {
127+
valid() {
128+
this.inv1 = foo('.invalid1');
129+
}
130+
}
131+
});`,
132+
parserOptions: {
133+
ecmaVersion: 6,
134+
sourceType: 'module'
135+
},
136+
errors: [{
137+
message: MESSAGE
138+
}]
59139
}
60140
],
61141
invalid: [

0 commit comments

Comments
 (0)