eslint-plugin-opinionated
Version:
Opinionated rules for styling your code.
89 lines (75 loc) • 3.02 kB
JavaScript
;
exports.__esModule = true;
exports.rule = rule;
var _types = require("@babel/types");
var REACT_COMPONENT_EXPORT_NAME = 'Component';
var REACT_MODULE_NAME = 'react';
var REACT_PURE_COMPONENT_EXPORT_NAME = 'PureComponent'; // eslint-disable-next-line flowtype/no-weak-types
function rule(context) {
var componentImportedAs;
var pureComponentImportedAs;
var reactImportedAs;
return {
// eslint-disable-next-line flowtype/no-weak-types
ClassDeclaration: function ClassDeclaration(node) {
var id = node.id,
superClass = node.superClass,
superTypeParameters = node.superTypeParameters;
var isComponent = false;
if (superClass) {
if ((0, _types.isIdentifier)(superClass)) {
if (componentImportedAs && superClass.name === componentImportedAs || pureComponentImportedAs && superClass.name === pureComponentImportedAs) {
isComponent = true;
}
} else if ((0, _types.isMemberExpression)(superClass) && reactImportedAs && superClass.object.name === reactImportedAs && [REACT_COMPONENT_EXPORT_NAME, REACT_PURE_COMPONENT_EXPORT_NAME].includes(superClass.property.name)) {
isComponent = true;
}
if (isComponent && superTypeParameters) {
var params = superTypeParameters.params;
if (params.length >= 1) {
var expectedName = id.name + "Props";
var param = params[0];
if (param.id && param.id.name !== expectedName) {
context.report({
message: "Expected " + expectedName + ".",
node: params[0]
});
}
}
if (params.length >= 2) {
var _expectedName = id.name + "State";
var _param = params[1];
if (_param.id && _param.id.name !== _expectedName) {
context.report({
message: "Expected " + _expectedName + ".",
node: params[1]
});
}
}
}
}
},
// eslint-disable-next-line flowtype/no-weak-types
ImportDeclaration: function ImportDeclaration(node) {
var source = node.source,
specifiers = node.specifiers;
if (source.value === REACT_MODULE_NAME && Array.isArray(specifiers)) {
for (var i = 0; i < specifiers.length; i++) {
var specifier = specifiers[i];
if ((0, _types.isImportDefaultSpecifier)(specifier) || (0, _types.isImportNamespaceSpecifier)(specifier)) {
reactImportedAs = specifier.local.name;
} else if ((0, _types.isImportSpecifier)(specifier)) {
switch (specifier.imported.name) {
case REACT_COMPONENT_EXPORT_NAME:
componentImportedAs = specifier.local.name;
break;
case REACT_PURE_COMPONENT_EXPORT_NAME:
pureComponentImportedAs = specifier.local.name;
break;
}
}
}
}
}
};
}