@atlaskit/eslint-plugin-design-system
Version:
The essential plugin for use with the Atlassian Design System.
67 lines • 2.22 kB
JavaScript
import { isNodeOfType } from 'eslint-codemod-utils';
import { createLintRule } from '../utils/create-lint-rule';
import { physicalLogicalMap } from './physical-logical-map';
const rule = createLintRule({
meta: {
name: 'no-physical-properties',
fixable: 'code',
docs: {
description: 'Disallow physical properties and values in `css` and `cssMap` function calls.',
recommended: false,
severity: 'error'
},
messages: {
noPhysicalProperties: 'Physical properties are not allowed in `css` and `cssMap` functions as they do not support different reading modes. Use a logical property instead.',
noPhysicalValues: 'Physical values are not allowed in `css` and `cssMap` functions.'
}
},
create(context) {
return {
// Handle css() calls
'CallExpression[callee.name=css] > ObjectExpression Property,CallExpression[callee.name=xcss] > ObjectExpression Property': node => {
if (!isNodeOfType(node, 'Property')) {
return;
}
if (!isNodeOfType(node.key, 'Identifier')) {
return;
}
const {
key
} = node;
if (key.name in physicalLogicalMap) {
context.report({
node: key,
messageId: 'noPhysicalProperties',
fix: fixer => {
const logicalProperty = physicalLogicalMap[key.name];
return fixer.replaceText(key, logicalProperty);
}
});
}
},
// Handle cssMap() calls
'CallExpression[callee.name=cssMap] > ObjectExpression Property > ObjectExpression Property': node => {
if (!isNodeOfType(node, 'Property')) {
return;
}
if (!isNodeOfType(node.key, 'Identifier')) {
return;
}
const {
key
} = node;
if (key.name in physicalLogicalMap) {
context.report({
node: key,
messageId: 'noPhysicalProperties',
fix: fixer => {
const logicalProperty = physicalLogicalMap[key.name];
return fixer.replaceText(key, logicalProperty);
}
});
}
}
};
}
});
export default rule;