UNPKG

eslint-plugin-opinionated

Version:
89 lines (75 loc) 3.02 kB
"use strict"; 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; } } } } } }; }