no-single-element-style-arrays.js 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. /**
  2. * @fileoverview Enforce no single element style arrays
  3. * @author Michael Gall
  4. */
  5. 'use strict';
  6. module.exports = {
  7. meta: {
  8. docs: {
  9. description:
  10. 'Disallow single element style arrays. These cause unnecessary re-renders as the identity of the array always changes',
  11. category: 'Stylistic Issues',
  12. recommended: false,
  13. url: '',
  14. },
  15. fixable: 'code',
  16. },
  17. create(context) {
  18. function reportNode(JSXExpressionNode) {
  19. context.report({
  20. node: JSXExpressionNode,
  21. message:
  22. 'Single element style arrays are not necessary and cause unnecessary re-renders',
  23. fix(fixer) {
  24. const realStyleNode = JSXExpressionNode.value.expression.elements[0];
  25. const styleSource = context.getSourceCode().getText(realStyleNode);
  26. return fixer.replaceText(JSXExpressionNode.value.expression, styleSource);
  27. },
  28. });
  29. }
  30. // --------------------------------------------------------------------------
  31. // Public
  32. // --------------------------------------------------------------------------
  33. return {
  34. JSXAttribute(node) {
  35. if (node.name.name !== 'style') return;
  36. if (!node.value.expression) return;
  37. if (node.value.expression.type !== 'ArrayExpression') return;
  38. if (node.value.expression.elements.length === 1) {
  39. reportNode(node);
  40. }
  41. },
  42. };
  43. },
  44. };