128 lines
3.4 KiB
JavaScript
128 lines
3.4 KiB
JavaScript
'use strict';
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
exports['default'] = jssExtend;
|
|
|
|
var _warning = require('warning');
|
|
|
|
var _warning2 = _interopRequireDefault(_warning);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
|
|
|
|
var isObject = function isObject(obj) {
|
|
return obj && (typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) === 'object' && !Array.isArray(obj);
|
|
};
|
|
var valueNs = 'extendCurrValue' + Date.now();
|
|
|
|
function mergeExtend(style, rule, sheet, newStyle) {
|
|
var extendType = _typeof(style.extend);
|
|
// Extend using a rule name.
|
|
if (extendType === 'string') {
|
|
if (!sheet) return;
|
|
var refRule = sheet.getRule(style.extend);
|
|
if (!refRule) return;
|
|
if (refRule === rule) {
|
|
(0, _warning2['default'])(false, '[JSS] A rule tries to extend itself \r\n%s', rule);
|
|
return;
|
|
}
|
|
var parent = refRule.options.parent;
|
|
|
|
if (parent) {
|
|
var originalStyle = parent.rules.raw[style.extend];
|
|
extend(originalStyle, rule, sheet, newStyle);
|
|
}
|
|
return;
|
|
}
|
|
|
|
// Extend using an array of objects.
|
|
if (Array.isArray(style.extend)) {
|
|
for (var index = 0; index < style.extend.length; index++) {
|
|
extend(style.extend[index], rule, sheet, newStyle);
|
|
}
|
|
return;
|
|
}
|
|
|
|
// Extend is a style object.
|
|
for (var prop in style.extend) {
|
|
if (prop === 'extend') {
|
|
extend(style.extend.extend, rule, sheet, newStyle);
|
|
continue;
|
|
}
|
|
if (isObject(style.extend[prop])) {
|
|
if (!(prop in newStyle)) newStyle[prop] = {};
|
|
extend(style.extend[prop], rule, sheet, newStyle[prop]);
|
|
continue;
|
|
}
|
|
newStyle[prop] = style.extend[prop];
|
|
}
|
|
}
|
|
|
|
function mergeRest(style, rule, sheet, newStyle) {
|
|
// Copy base style.
|
|
for (var prop in style) {
|
|
if (prop === 'extend') continue;
|
|
if (isObject(newStyle[prop]) && isObject(style[prop])) {
|
|
extend(style[prop], rule, sheet, newStyle[prop]);
|
|
continue;
|
|
}
|
|
|
|
if (isObject(style[prop])) {
|
|
newStyle[prop] = extend(style[prop], rule, sheet);
|
|
continue;
|
|
}
|
|
|
|
newStyle[prop] = style[prop];
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Recursively extend styles.
|
|
*/
|
|
function extend(style, rule, sheet) {
|
|
var newStyle = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
|
|
|
|
mergeExtend(style, rule, sheet, newStyle);
|
|
mergeRest(style, rule, sheet, newStyle);
|
|
return newStyle;
|
|
}
|
|
|
|
/**
|
|
* Handle `extend` property.
|
|
*
|
|
* @param {Rule} rule
|
|
* @api public
|
|
*/
|
|
function jssExtend() {
|
|
function onProcessStyle(style, rule, sheet) {
|
|
if ('extend' in style) return extend(style, rule, sheet);
|
|
return style;
|
|
}
|
|
|
|
function onChangeValue(value, prop, rule) {
|
|
if (prop !== 'extend') return value;
|
|
|
|
// Value is empty, remove properties set previously.
|
|
if (value == null || value === false) {
|
|
for (var key in rule[valueNs]) {
|
|
rule.prop(key, null);
|
|
}
|
|
rule[valueNs] = null;
|
|
return null;
|
|
}
|
|
|
|
for (var _key in value) {
|
|
rule.prop(_key, value[_key]);
|
|
}
|
|
rule[valueNs] = value;
|
|
|
|
// Make sure we don't set the value in the core.
|
|
return null;
|
|
}
|
|
|
|
return { onProcessStyle: onProcessStyle, onChangeValue: onChangeValue };
|
|
} |