eslint-plugin-react-native-unistyles
Version:
React Native Unistyles rules for ESLint
66 lines (65 loc) • 2.97 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.noUnusedStyles = void 0;
const utils_1 = require("@typescript-eslint/utils");
const component_1 = require("../util/component");
const stylesheet_1 = require("../util/stylesheet");
const createRule = utils_1.ESLintUtils.RuleCreator((name) => `https://github.com/RodSarhan/eslint-plugin-react-native-unistyles/blob/main/docs/rules/${name}.md`);
exports.noUnusedStyles = createRule({
name: 'no-unused-styles',
meta: {
docs: { description: 'Disallow unused styles' },
type: 'suggestion',
messages: { unusedStyleDetected: '{{ message }}' },
schema: [],
},
defaultOptions: [],
create: component_1.componentsUtils.enhanceRuleWithComponentDetection((context, components) => {
const styleSheets = new stylesheet_1.StyleSheets();
const styleReferences = new Set();
function reportUnusedStyles(unusedStyles) {
Object.keys(unusedStyles).forEach((key) => {
if ({}.hasOwnProperty.call(unusedStyles, key)) {
const styles = unusedStyles[key];
styles?.forEach((node) => {
const propertyName = stylesheet_1.stylesASTHelpers.getStylePropertyIdentifier(node);
if (propertyName) {
context.report({
node: node,
messageId: 'unusedStyleDetected',
data: { message: [`Unused style detected: ${key}.${propertyName}`] },
loc: node.key.loc,
});
}
});
}
});
}
return {
MemberExpression: function (node) {
const styleRef = stylesheet_1.stylesASTHelpers.getPotentialStyleReferenceFromMemberExpression(node);
if (styleRef) {
styleReferences.add(styleRef);
}
},
CallExpression: function (node) {
if (stylesheet_1.stylesASTHelpers.isStyleSheetDeclaration(node)) {
const styleSheetName = stylesheet_1.stylesASTHelpers.getStyleSheetName(node);
const styles = stylesheet_1.stylesASTHelpers.getStyleDeclarations(node);
if (styleSheetName) {
styleSheets.add(styleSheetName, styles);
}
}
},
'Program:exit': function () {
const list = components.all();
if (Object.keys(list).length > 0) {
styleReferences.forEach((reference) => {
styleSheets.markAsUsed(reference);
});
reportUnusedStyles(styleSheets.getUnusedReferences());
}
},
};
}),
});