UNPKG

@atlaskit/eslint-plugin-ui-styling-standard

Version:

The eslint plugin to enforce and educate on Atlassian's UI Styling Standard

67 lines (66 loc) • 2.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _eslintCodemodUtils = require("eslint-codemod-utils"); var _createRule = require("../utils/create-rule"); var isXcssProp = function isXcssProp(propName) { if (propName === 'xcss') { return true; } return propName.endsWith('Xcss'); }; var rule = (0, _createRule.createLintRule)({ meta: { name: 'no-classname-prop', docs: { description: 'Disallows usage of the `className` prop in JSX', recommended: true, severity: 'error' }, messages: { 'no-classname-prop': "Apply local styles through css instead of className. Use supported component props or its bounded xcss interface for component customization." }, type: 'problem' }, create: function create(context) { return { JSXAttribute: function JSXAttribute(node) { if (!(0, _eslintCodemodUtils.isNodeOfType)(node, 'JSXAttribute')) { return; } if (node.name.name !== 'className' || !node.value) { // Ignore, we can't parse this—it either isn't a `className` prop or has no value. return; } if ((0, _eslintCodemodUtils.isNodeOfType)(node.value, 'JSXExpressionContainer')) { /** * We're basically looking for `className={xcss}` and nothing else… */ var propValueName = null; if ((0, _eslintCodemodUtils.isNodeOfType)(node.value.expression, 'Identifier')) { // eg. `className={xcss}` propValueName = node.value.expression.name; } else if ((0, _eslintCodemodUtils.isNodeOfType)(node.value.expression, 'MemberExpression') && (0, _eslintCodemodUtils.isNodeOfType)(node.value.expression.property, 'Identifier')) { // eg. `className={props.xcss}` propValueName = node.value.expression.property.name; } else if ((0, _eslintCodemodUtils.isNodeOfType)(node.value.expression, 'MemberExpression') && (0, _eslintCodemodUtils.isNodeOfType)(node.value.expression.property, 'Literal') && typeof node.value.expression.property.value === 'string') { // eg. `className={props['xcss']}` propValueName = node.value.expression.property.value; } if (propValueName && isXcssProp(propValueName)) { // Ignore, it's valid to have `className={xcss}` // We just assume people have this typed correctly, eg. they're not using `xcss?: any` return; } } context.report({ node: node, messageId: 'no-classname-prop' }); } }; } }); var _default = exports.default = rule;