index.js 2.92 KB
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _postcss = _interopRequireDefault(require("postcss"));

var _postcssSelectorParser = _interopRequireDefault(require("postcss-selector-parser"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function nodeIsInsensitiveAttribute(node) {
  return node.type === 'attribute' && node.insensitive;
}

function selectorHasInsensitiveAttribute(selector) {
  return selector.some(nodeIsInsensitiveAttribute);
}

function transformString(strings, charPos, string) {
  var char = string.charAt(charPos);

  if (char === '') {
    return strings;
  }

  var newStrings = strings.map(function (x) {
    return x + char;
  });
  var upperChar = char.toLocaleUpperCase();

  if (upperChar !== char) {
    newStrings = newStrings.concat(strings.map(function (x) {
      return x + upperChar;
    }));
  }

  return transformString(newStrings, charPos + 1, string);
}

function createSensitiveAtributes(attribute) {
  var attributes = transformString([''], 0, attribute.value);
  return attributes.map(function (x) {
    var newAttribute = attribute.clone({
      spaces: {
        after: attribute.spaces.after,
        before: attribute.spaces.before
      },
      insensitive: false
    });
    newAttribute.setValue(x);
    return newAttribute;
  });
}

function createNewSelectors(selector) {
  var newSelectors = [_postcssSelectorParser.default.selector()];
  selector.walk(function (node) {
    if (!nodeIsInsensitiveAttribute(node)) {
      newSelectors.forEach(function (newSelector) {
        newSelector.append(node.clone());
      });
      return;
    }

    var sensitiveAttributes = createSensitiveAtributes(node);
    var newSelectorsWithSensitiveAttributes = [];
    sensitiveAttributes.forEach(function (newNode) {
      newSelectors.forEach(function (newSelector) {
        var newSelectorWithNewNode = newSelector.clone();
        newSelectorWithNewNode.append(newNode);
        newSelectorsWithSensitiveAttributes.push(newSelectorWithNewNode);
      });
    });
    newSelectors = newSelectorsWithSensitiveAttributes;
  });
  return newSelectors;
}

function transform(selectors) {
  var newSelectors = [];
  selectors.each(function (selector) {
    if (selectorHasInsensitiveAttribute(selector)) {
      newSelectors = newSelectors.concat(createNewSelectors(selector));
      selector.remove();
    }
  });

  if (newSelectors.length) {
    newSelectors.forEach(function (newSelector) {
      return selectors.append(newSelector);
    });
  }
}

var caseInsensitiveRegExp = /i(\s*\/\*[\W\w]*?\*\/)*\s*\]/;

var _default = _postcss.default.plugin('postcss-attribute-case-insensitive', function () {
  return function (css) {
    css.walkRules(caseInsensitiveRegExp, function (rule) {
      rule.selector = (0, _postcssSelectorParser.default)(transform).processSync(rule.selector);
    });
  };
});

exports.default = _default;