2025-05-28 15:36:51 -07:00

137 lines
3.1 KiB
JavaScript

import _extends from '@babel/runtime/helpers/esm/extends';
import warning from 'tiny-warning';
var isObject = function isObject(obj) {
return obj && 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) {
process.env.NODE_ENV !== "production" ? warning(false, "[JSS] A rule tries to extend itself \n" + rule.toString()) : void 0;
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.
if (Array.isArray(style.extend)) {
for (var index = 0; index < style.extend.length; index++) {
var singleExtend = style.extend[index];
var singleStyle = typeof singleExtend === 'string' ? _extends({}, style, {
extend: singleExtend
}) : style.extend[index];
extend(singleStyle, 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, newStyle) {
if (newStyle === void 0) {
newStyle = {};
}
mergeExtend(style, rule, sheet, newStyle);
mergeRest(style, rule, sheet, newStyle);
return newStyle;
}
/**
* Handle `extend` property.
*/
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;
}
if (typeof value === 'object') {
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
};
}
export default jssExtend;