UNPKG

jss-compose

Version:

JSS plugin for classes composition

82 lines (64 loc) 2.05 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = jssCompose; var _warning = require('warning'); var _warning2 = _interopRequireDefault(_warning); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * Set selector. * * @param {Object} original rule * @param {String} className class string * @return {Boolean} flag, indicating function was successfull or not */ function registerClass(rule, className) { // Skip falsy values if (!className) return true; // Support array of class names `{composes: ['foo', 'bar']}` if (Array.isArray(className)) { for (var index = 0; index < className.length; index++) { var isSetted = registerClass(rule, className[index]); if (!isSetted) return false; } return true; } // Support space separated class names `{composes: 'foo bar'}` if (className.indexOf(' ') > -1) { return registerClass(rule, className.split(' ')); } var parent = rule.options.parent; // It is a ref to a local rule. if (className[0] === '$') { var refRule = parent.getRule(className.substr(1)); if (!refRule) { (0, _warning2.default)(false, '[JSS] Referenced rule is not defined. \r\n%s', rule); return false; } if (refRule === rule) { (0, _warning2.default)(false, '[JSS] Cyclic composition detected. \r\n%s', rule); return false; } parent.classes[rule.key] += ' ' + parent.classes[refRule.key]; return true; } rule.options.parent.classes[rule.key] += ' ' + className; return true; } /** * Convert compose property to additional class, remove property from original styles. * * @param {Rule} rule * @api public */ function jssCompose() { function onProcessStyle(style, rule) { if (!style.composes) return style; registerClass(rule, style.composes); // Remove composes property to prevent infinite loop. delete style.composes; return style; } return { onProcessStyle: onProcessStyle }; }