You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
257 lines
8.9 KiB
257 lines
8.9 KiB
2 years ago
|
"use strict";
|
||
|
Object.defineProperty(exports, "__esModule", {
|
||
|
value: true
|
||
|
});
|
||
|
exports.default = resolveConfig;
|
||
|
var _negateValue = _interopRequireDefault(require("./negateValue"));
|
||
|
var _corePluginList = _interopRequireDefault(require("../corePluginList"));
|
||
|
var _configurePlugins = _interopRequireDefault(require("./configurePlugins"));
|
||
|
var _defaultConfigStub = _interopRequireDefault(require("../../stubs/defaultConfig.stub"));
|
||
|
var _colors = _interopRequireDefault(require("../public/colors"));
|
||
|
var _defaults = require("./defaults");
|
||
|
var _toPath = require("./toPath");
|
||
|
var _normalizeConfig = require("./normalizeConfig");
|
||
|
var _isPlainObject = _interopRequireDefault(require("./isPlainObject"));
|
||
|
var _cloneDeep = require("./cloneDeep");
|
||
|
var _pluginUtils = require("./pluginUtils");
|
||
|
var _withAlphaVariable = require("./withAlphaVariable");
|
||
|
var _toColorValue = _interopRequireDefault(require("./toColorValue"));
|
||
|
function resolveConfig(configs) {
|
||
|
let allConfigs = [
|
||
|
...extractPluginConfigs(configs),
|
||
|
{
|
||
|
prefix: "",
|
||
|
important: false,
|
||
|
separator: ":",
|
||
|
variantOrder: _defaultConfigStub.default.variantOrder
|
||
|
},
|
||
|
];
|
||
|
var ref, ref1;
|
||
|
return (0, _normalizeConfig).normalizeConfig((0, _defaults).defaults({
|
||
|
theme: resolveFunctionKeys(mergeExtensions(mergeThemes(allConfigs.map((t)=>{
|
||
|
return (ref = t === null || t === void 0 ? void 0 : t.theme) !== null && ref !== void 0 ? ref : {};
|
||
|
})))),
|
||
|
corePlugins: resolveCorePlugins(allConfigs.map((c)=>c.corePlugins)),
|
||
|
plugins: resolvePluginLists(configs.map((c)=>{
|
||
|
return (ref1 = c === null || c === void 0 ? void 0 : c.plugins) !== null && ref1 !== void 0 ? ref1 : [];
|
||
|
}))
|
||
|
}, ...allConfigs));
|
||
|
}
|
||
|
function _interopRequireDefault(obj) {
|
||
|
return obj && obj.__esModule ? obj : {
|
||
|
default: obj
|
||
|
};
|
||
|
}
|
||
|
function isFunction(input) {
|
||
|
return typeof input === "function";
|
||
|
}
|
||
|
function isObject(input) {
|
||
|
return typeof input === "object" && input !== null;
|
||
|
}
|
||
|
function mergeWith(target, ...sources) {
|
||
|
let customizer = sources.pop();
|
||
|
for (let source of sources){
|
||
|
for(let k in source){
|
||
|
let merged = customizer(target[k], source[k]);
|
||
|
if (merged === undefined) {
|
||
|
if (isObject(target[k]) && isObject(source[k])) {
|
||
|
target[k] = mergeWith(target[k], source[k], customizer);
|
||
|
} else {
|
||
|
target[k] = source[k];
|
||
|
}
|
||
|
} else {
|
||
|
target[k] = merged;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return target;
|
||
|
}
|
||
|
const configUtils = {
|
||
|
colors: _colors.default,
|
||
|
negative (scale) {
|
||
|
// TODO: Log that this function isn't really needed anymore?
|
||
|
return Object.keys(scale).filter((key)=>scale[key] !== "0").reduce((negativeScale, key)=>{
|
||
|
let negativeValue = (0, _negateValue).default(scale[key]);
|
||
|
if (negativeValue !== undefined) {
|
||
|
negativeScale[`-${key}`] = negativeValue;
|
||
|
}
|
||
|
return negativeScale;
|
||
|
}, {});
|
||
|
},
|
||
|
breakpoints (screens) {
|
||
|
return Object.keys(screens).filter((key)=>typeof screens[key] === "string").reduce((breakpoints, key)=>({
|
||
|
...breakpoints,
|
||
|
[`screen-${key}`]: screens[key]
|
||
|
}), {});
|
||
|
}
|
||
|
};
|
||
|
function value(valueToResolve, ...args) {
|
||
|
return isFunction(valueToResolve) ? valueToResolve(...args) : valueToResolve;
|
||
|
}
|
||
|
function collectExtends(items) {
|
||
|
return items.reduce((merged, { extend })=>{
|
||
|
return mergeWith(merged, extend, (mergedValue, extendValue)=>{
|
||
|
if (mergedValue === undefined) {
|
||
|
return [
|
||
|
extendValue
|
||
|
];
|
||
|
}
|
||
|
if (Array.isArray(mergedValue)) {
|
||
|
return [
|
||
|
extendValue,
|
||
|
...mergedValue
|
||
|
];
|
||
|
}
|
||
|
return [
|
||
|
extendValue,
|
||
|
mergedValue
|
||
|
];
|
||
|
});
|
||
|
}, {});
|
||
|
}
|
||
|
function mergeThemes(themes) {
|
||
|
return {
|
||
|
...themes.reduce((merged, theme)=>(0, _defaults).defaults(merged, theme), {}),
|
||
|
// In order to resolve n config objects, we combine all of their `extend` properties
|
||
|
// into arrays instead of objects so they aren't overridden.
|
||
|
extend: collectExtends(themes)
|
||
|
};
|
||
|
}
|
||
|
function mergeExtensionCustomizer(merged, value1) {
|
||
|
// When we have an array of objects, we do want to merge it
|
||
|
if (Array.isArray(merged) && isObject(merged[0])) {
|
||
|
return merged.concat(value1);
|
||
|
}
|
||
|
// When the incoming value is an array, and the existing config is an object, prepend the existing object
|
||
|
if (Array.isArray(value1) && isObject(value1[0]) && isObject(merged)) {
|
||
|
return [
|
||
|
merged,
|
||
|
...value1
|
||
|
];
|
||
|
}
|
||
|
// Override arrays (for example for font-families, box-shadows, ...)
|
||
|
if (Array.isArray(value1)) {
|
||
|
return value1;
|
||
|
}
|
||
|
// Execute default behaviour
|
||
|
return undefined;
|
||
|
}
|
||
|
function mergeExtensions({ extend , ...theme }) {
|
||
|
return mergeWith(theme, extend, (themeValue, extensions)=>{
|
||
|
// The `extend` property is an array, so we need to check if it contains any functions
|
||
|
if (!isFunction(themeValue) && !extensions.some(isFunction)) {
|
||
|
return mergeWith({}, themeValue, ...extensions, mergeExtensionCustomizer);
|
||
|
}
|
||
|
return (resolveThemePath, utils)=>mergeWith({}, ...[
|
||
|
themeValue,
|
||
|
...extensions
|
||
|
].map((e)=>value(e, resolveThemePath, utils)), mergeExtensionCustomizer);
|
||
|
});
|
||
|
}
|
||
|
/**
|
||
|
*
|
||
|
* @param {string} key
|
||
|
* @return {Iterable<string[] & {alpha: string | undefined}>}
|
||
|
*/ function* toPaths(key) {
|
||
|
let path = (0, _toPath).toPath(key);
|
||
|
if (path.length === 0) {
|
||
|
return;
|
||
|
}
|
||
|
yield path;
|
||
|
if (Array.isArray(key)) {
|
||
|
return;
|
||
|
}
|
||
|
let pattern = /^(.*?)\s*\/\s*([^/]+)$/;
|
||
|
let matches = key.match(pattern);
|
||
|
if (matches !== null) {
|
||
|
let [, prefix, alpha] = matches;
|
||
|
let newPath = (0, _toPath).toPath(prefix);
|
||
|
newPath.alpha = alpha;
|
||
|
yield newPath;
|
||
|
}
|
||
|
}
|
||
|
function resolveFunctionKeys(object) {
|
||
|
// theme('colors.red.500 / 0.5') -> ['colors', 'red', '500 / 0', '5]
|
||
|
const resolvePath = (key, defaultValue)=>{
|
||
|
for (const path of toPaths(key)){
|
||
|
let index = 0;
|
||
|
let val = object;
|
||
|
while(val !== undefined && val !== null && index < path.length){
|
||
|
val = val[path[index++]];
|
||
|
let shouldResolveAsFn = isFunction(val) && (path.alpha === undefined || index < path.length - 1);
|
||
|
val = shouldResolveAsFn ? val(resolvePath, configUtils) : val;
|
||
|
}
|
||
|
if (val !== undefined) {
|
||
|
if (path.alpha !== undefined) {
|
||
|
let normalized = (0, _pluginUtils).parseColorFormat(val);
|
||
|
return (0, _withAlphaVariable).withAlphaValue(normalized, path.alpha, (0, _toColorValue).default(normalized));
|
||
|
}
|
||
|
if ((0, _isPlainObject).default(val)) {
|
||
|
return (0, _cloneDeep).cloneDeep(val);
|
||
|
}
|
||
|
return val;
|
||
|
}
|
||
|
}
|
||
|
return defaultValue;
|
||
|
};
|
||
|
Object.assign(resolvePath, {
|
||
|
theme: resolvePath,
|
||
|
...configUtils
|
||
|
});
|
||
|
return Object.keys(object).reduce((resolved, key)=>{
|
||
|
resolved[key] = isFunction(object[key]) ? object[key](resolvePath, configUtils) : object[key];
|
||
|
return resolved;
|
||
|
}, {});
|
||
|
}
|
||
|
function extractPluginConfigs(configs) {
|
||
|
let allConfigs = [];
|
||
|
configs.forEach((config)=>{
|
||
|
allConfigs = [
|
||
|
...allConfigs,
|
||
|
config
|
||
|
];
|
||
|
var ref2;
|
||
|
const plugins = (ref2 = config === null || config === void 0 ? void 0 : config.plugins) !== null && ref2 !== void 0 ? ref2 : [];
|
||
|
if (plugins.length === 0) {
|
||
|
return;
|
||
|
}
|
||
|
plugins.forEach((plugin)=>{
|
||
|
if (plugin.__isOptionsFunction) {
|
||
|
plugin = plugin();
|
||
|
}
|
||
|
var ref;
|
||
|
allConfigs = [
|
||
|
...allConfigs,
|
||
|
...extractPluginConfigs([
|
||
|
(ref = plugin === null || plugin === void 0 ? void 0 : plugin.config) !== null && ref !== void 0 ? ref : {}
|
||
|
])
|
||
|
];
|
||
|
});
|
||
|
});
|
||
|
return allConfigs;
|
||
|
}
|
||
|
function resolveCorePlugins(corePluginConfigs) {
|
||
|
const result = [
|
||
|
...corePluginConfigs
|
||
|
].reduceRight((resolved, corePluginConfig)=>{
|
||
|
if (isFunction(corePluginConfig)) {
|
||
|
return corePluginConfig({
|
||
|
corePlugins: resolved
|
||
|
});
|
||
|
}
|
||
|
return (0, _configurePlugins).default(corePluginConfig, resolved);
|
||
|
}, _corePluginList.default);
|
||
|
return result;
|
||
|
}
|
||
|
function resolvePluginLists(pluginLists) {
|
||
|
const result = [
|
||
|
...pluginLists
|
||
|
].reduceRight((resolved, pluginList)=>{
|
||
|
return [
|
||
|
...resolved,
|
||
|
...pluginList
|
||
|
];
|
||
|
}, []);
|
||
|
return result;
|
||
|
}
|