jsx-equals-spacing.js 2.14 KB
/**
 * @fileoverview Disallow or enforce spaces around equal signs in JSX attributes.
 * @author ryym
 */
'use strict';

// ------------------------------------------------------------------------------
// Rule Definition
// ------------------------------------------------------------------------------

module.exports = function(context) {
  var config = context.options[0];
  var sourceCode = context.getSourceCode();

  /**
   * Determines a given attribute node has an equal sign.
   * @param {ASTNode} attrNode - The attribute node.
   * @returns {boolean} Whether or not the attriute node has an equal sign.
   */
  function hasEqual(attrNode) {
    return attrNode.type !== 'JSXSpreadAttribute' && attrNode.value !== null;
  }

  // --------------------------------------------------------------------------
  // Public
  // --------------------------------------------------------------------------

  return {
    JSXOpeningElement: function(node) {
      node.attributes.forEach(function(attrNode) {
        if (!hasEqual(attrNode)) {
          return;
        }

        var equalToken = sourceCode.getTokenAfter(attrNode.name);
        var spacedBefore = sourceCode.isSpaceBetweenTokens(attrNode.name, equalToken);
        var spacedAfter = sourceCode.isSpaceBetweenTokens(equalToken, attrNode.value);

        switch (config) {
          default:
          case 'never':
            if (spacedBefore) {
              context.report(attrNode, equalToken.loc.start,
                'There should be no space before \'=\'');
            }
            if (spacedAfter) {
              context.report(attrNode, equalToken.loc.start,
                'There should be no space after \'=\'');
            }
            break;
          case 'always':
            if (!spacedBefore) {
              context.report(attrNode, equalToken.loc.start,
                'A space is required before \'=\'');
            }
            if (!spacedAfter) {
              context.report(attrNode, equalToken.loc.start,
                'A space is required after \'=\'');
            }
            break;
        }
      });
    }
  };
};

module.exports.schema = [{
  enum: ['always', 'never']
}];