packages/eslint-plugin-baseui/src/no-block-style.js (50 lines of code) (raw):
/*
Copyright (c) Uber Technologies, Inc.
This source code is licensed under the MIT license found in the
LICENSE file in the root directory of this source tree.
*/
'use strict';
const { hasAnyProp } = require('jsx-ast-utils');
const MESSAGES = require('./messages.js');
module.exports = {
meta: {
fixable: 'code',
messages: {
[MESSAGES.styleOnBlock.id]: MESSAGES.styleOnBlock.message,
},
},
create(context) {
let importState = {};
return {
ImportDeclaration(node) {
if (!node.source.value.startsWith('baseui/')) {
return;
}
function isImporting(node, importName, importPath) {
if (node.imported.name === importName && node.parent.source.value === importPath) {
importState[importName] = node.local.name;
return true;
} else {
return false;
}
}
for (let x = 0; x < node.specifiers.length; x++) {
const specifier = node.specifiers[x];
if (
specifier.type !== 'ImportNamespaceSpecifier' &&
specifier.type !== 'ImportDefaultSpecifier'
) {
if (isImporting(specifier, 'Block', 'baseui/block')) return;
}
}
},
JSXOpeningElement(node) {
// style and $style
// Ex: <Block style={{ ... }} />
// Ex: <Block $style={{ ... }} />
// The "$style" and "style" props are not supported.
// It works because Block spreads props down to the base
// styled component, but styles are not guaranteed to be applied
// as expected.
if (
importState.Block &&
node.name.name === importState.Block &&
hasAnyProp(node.attributes, ['$style', 'style'])
) {
context.report({
node,
messageId: MESSAGES.styleOnBlock.id,
});
}
},
};
},
};