Skip to content

Commit b9d848e

Browse files
author
Axel Eirola
committed
Add no-unused-styles default import support
1 parent da07c9a commit b9d848e

File tree

2 files changed

+95
-3
lines changed

2 files changed

+95
-3
lines changed

lib/util/stylesheet.js

+54-3
Original file line numberDiff line numberDiff line change
@@ -101,9 +101,16 @@ const astHelpers = {
101101
node &&
102102
node.type === 'CallExpression' &&
103103
node.callee &&
104-
node.callee.object &&
105-
node.callee.object.name &&
106-
objectNames.includes(node.callee.object.name)
104+
node.callee.object && ((
105+
node.callee.object.type === 'Identifier' &&
106+
node.callee.object.name &&
107+
objectNames.includes(node.callee.object.name)
108+
) || (
109+
node.callee.object.type === 'MemberExpression' &&
110+
node.callee.object.object.type === 'Identifier' &&
111+
astHelpers.getImportSource(node.callee.object.object) === 'react-native' &&
112+
objectNames.includes(node.callee.object.property.name)
113+
))
107114
);
108115
},
109116

@@ -463,6 +470,50 @@ const astHelpers = {
463470
}
464471
},
465472

473+
getRoot: function (node) {
474+
let currentNode = node;
475+
while (currentNode && currentNode.parent) {
476+
currentNode = currentNode.parent;
477+
}
478+
479+
return currentNode;
480+
},
481+
482+
getImportVariable: function (node) {
483+
if (node && node.type === 'ImportDeclaration') {
484+
for (let i = 0; node.specifiers; i += 1) {
485+
const specifier = node.specifiers[i];
486+
if (
487+
specifier && (
488+
specifier.type === 'ImportDefaultSpecifier' ||
489+
specifier.type === 'ImportNamespaceSpecifier'
490+
) &&
491+
specifier.local &&
492+
specifier.local.type === 'Identifier'
493+
) {
494+
return specifier.local.name;
495+
}
496+
}
497+
}
498+
},
499+
500+
getImportSource: function (node) {
501+
if (node && node.type === 'Identifier' && node.name) {
502+
const rootNode = astHelpers.getRoot(node);
503+
if (rootNode && rootNode.body) {
504+
for (let i = 0; rootNode.body.length; i += 1) {
505+
const bodyNode = rootNode.body[i];
506+
if (
507+
astHelpers.getImportVariable(bodyNode) === node.name &&
508+
bodyNode.source && bodyNode.source.type === 'Literal'
509+
) {
510+
return bodyNode.source.value;
511+
}
512+
}
513+
}
514+
}
515+
},
516+
466517
getPotentialStyleReferenceFromMemberExpression: function (node) {
467518
if (
468519
node &&

tests/lib/rules/no-unused-styles.js

+41
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,31 @@ const tests = {
215215
}
216216
});
217217
`,
218+
}, {
219+
code: `
220+
import RN from 'react-native';
221+
const styles = RN.StyleSheet.create({
222+
name: {}
223+
});
224+
const Hello = React.createClass({
225+
render: function() {
226+
return <Text textStyle={styles.name}>Hello {this.props.name}</Text>;
227+
}
228+
});
229+
`,
230+
}, {
231+
code: `
232+
import React from 'react';
233+
import RN from 'react-native';
234+
const styles = RN.StyleSheet.create({
235+
name: {}
236+
});
237+
const Hello = React.createClass({
238+
render: function() {
239+
return <Text textStyle={styles.name}>Hello {this.props.name}</Text>;
240+
}
241+
});
242+
`,
218243
}],
219244

220245
invalid: [{
@@ -276,6 +301,22 @@ const tests = {
276301
errors: [{
277302
message: 'Unused style detected: styles.bar',
278303
}],
304+
}, {
305+
code: `
306+
import RN from 'react-native';
307+
const styles = RN.StyleSheet.create({
308+
name: {}
309+
});
310+
const Hello = React.createClass({
311+
render: function() {
312+
return <Text>Hello {this.props.name}</Text>;
313+
}
314+
});
315+
`,
316+
errors: [{
317+
message: 'Unused style detected: styles.name',
318+
}],
319+
279320
}],
280321
};
281322

0 commit comments

Comments
 (0)