styled-components-modifiers
Version:
A library that enables BEM flavored modifiers to styled components
125 lines (99 loc) • 4.26 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.validateResponsiveModifiers = validateResponsiveModifiers;
exports.default = styleModifierPropTypes;
var _difference = _interopRequireDefault(require("lodash/difference"));
var _flatten = _interopRequireDefault(require("lodash/flatten"));
var _forIn = _interopRequireDefault(require("lodash/forIn"));
var _keys = _interopRequireDefault(require("lodash/keys"));
var _uniq = _interopRequireDefault(require("lodash/uniq"));
var _normalizeModifiers = _interopRequireDefault(require("./utils/normalizeModifiers"));
var _isResponsiveModifiersProp = _interopRequireDefault(require("./utils/isResponsiveModifiersProp"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* Returns an error if we have invalid modifiers or sizes with errors
*
* @param {string} modifiersPropName
* @param {string} componentName
* @param {ModifierNames} invalidModifiers
* @param {string[]} sizesWithErrors
* @returns {Error}
*/
function generateError(modifiersPropName, componentName, invalidModifiers, sizesWithErrors) {
var m = invalidModifiers.length > 1 ? 'modifiers' : 'modifier';
var modifierList = invalidModifiers.join(', ');
var k = sizesWithErrors && sizesWithErrors.length > 1 ? 'keys' : 'key';
return new Error("Invalid ".concat(m, " ").concat(modifierList, " used in prop '").concat(modifiersPropName, "'").concat(sizesWithErrors ? " (size ".concat(k, " ").concat(sizesWithErrors.join(', '), ")") : '', " and supplied to ").concat(componentName, ". Validation failed."));
}
/**
* Returns the invalid modifiers
*
* @param {ModifierKeys} modifierKeys
* @param {ModifiersConfig} modifiersConfig
* @returns {string[]}
*/
function getInvalidModifiers(modifierKeys, modifiersConfig) {
return (0, _difference.default)((0, _normalizeModifiers.default)(modifierKeys), (0, _keys.default)(modifiersConfig));
}
/**
* Checks for invalid modifiers
*
* @param {string} modifiersPropName
* @param {string} componentName
* @param {ModifierKeys} modifierKeys
* @param {ModifiersConfig} modifierConfig
* @returns {Error|Null}
*/
function validateModifiers(modifiersPropName, componentName, modifierKeys, modifierConfig) {
var invalidModifiers = getInvalidModifiers(modifierKeys, modifierConfig);
if (invalidModifiers.length > 0) {
return generateError(modifiersPropName, componentName, invalidModifiers);
}
return null;
}
/**
* Checks for invalid modfiers for responsive modifiers
*
* @export
* @param {string} modifiersPropName
* @param {string} componentName
* @param {ResponsiveModifiersProp} responsiveModifiers
* @param {ModifiersConfig} modifierConfig
* @returns {Error|Null}
*/
function validateResponsiveModifiers(modifiersPropName, componentName, responsiveModifiers, modifierConfig) {
var rawInvalidModifiers = [];
var rawSizesWithErrors = [];
(0, _forIn.default)(responsiveModifiers, function (modifiers, size) {
var invalidModifiers = getInvalidModifiers(modifiers, modifierConfig);
if (invalidModifiers.length > 0) {
rawInvalidModifiers.push(invalidModifiers);
rawSizesWithErrors.push(size);
}
});
var invalidModifiers = (0, _uniq.default)((0, _flatten.default)(rawInvalidModifiers));
var sizesWithErrors = (0, _uniq.default)(rawSizesWithErrors);
if (invalidModifiers.length > 0) {
return generateError(modifiersPropName, componentName, invalidModifiers, sizesWithErrors);
}
return null;
}
/**
* Evaluates the modifiers prop against the modifier config. Throws invalid proptype error
* if a modifier is supplied in prop and not found in modifier config.
* @export
* @param {ModifiersConfig} modifierConfig
* @returns {Validator<ModifierKeys>}
*/
function styleModifierPropTypes(modifierConfig) {
var validator = function validator(props, modifiersPropName, componentName) {
var modifiers = props[modifiersPropName];
if ((0, _isResponsiveModifiersProp.default)(modifiers)) {
return validateResponsiveModifiers(modifiersPropName, componentName, modifiers, modifierConfig);
}
return validateModifiers(modifiersPropName, componentName, modifiers, modifierConfig);
};
return validator;
}