257 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			257 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
	
	
| "use strict";
 | |
| Object.defineProperty(exports, "__esModule", {
 | |
|     value: true
 | |
| });
 | |
| Object.defineProperty(exports, "default", {
 | |
|     enumerable: true,
 | |
|     get: function() {
 | |
|         return resolveConfig;
 | |
|     }
 | |
| });
 | |
| const _negateValue = /*#__PURE__*/ _interop_require_default(require("./negateValue"));
 | |
| const _corePluginList = /*#__PURE__*/ _interop_require_default(require("../corePluginList"));
 | |
| const _configurePlugins = /*#__PURE__*/ _interop_require_default(require("./configurePlugins"));
 | |
| const _colors = /*#__PURE__*/ _interop_require_default(require("../public/colors"));
 | |
| const _defaults = require("./defaults");
 | |
| const _toPath = require("./toPath");
 | |
| const _normalizeConfig = require("./normalizeConfig");
 | |
| const _isPlainObject = /*#__PURE__*/ _interop_require_default(require("./isPlainObject"));
 | |
| const _cloneDeep = require("./cloneDeep");
 | |
| const _pluginUtils = require("./pluginUtils");
 | |
| const _withAlphaVariable = require("./withAlphaVariable");
 | |
| const _toColorValue = /*#__PURE__*/ _interop_require_default(require("./toColorValue"));
 | |
| function _interop_require_default(obj) {
 | |
|     return obj && obj.__esModule ? obj : {
 | |
|         default: obj
 | |
|     };
 | |
| }
 | |
| function isFunction(input) {
 | |
|     return typeof input === "function";
 | |
| }
 | |
| 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 ((0, _isPlainObject.default)(target[k]) && (0, _isPlainObject.default)(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, value) {
 | |
|     // When we have an array of objects, we do want to merge it
 | |
|     if (Array.isArray(merged) && (0, _isPlainObject.default)(merged[0])) {
 | |
|         return merged.concat(value);
 | |
|     }
 | |
|     // When the incoming value is an array, and the existing config is an object, prepend the existing object
 | |
|     if (Array.isArray(value) && (0, _isPlainObject.default)(value[0]) && (0, _isPlainObject.default)(merged)) {
 | |
|         return [
 | |
|             merged,
 | |
|             ...value
 | |
|         ];
 | |
|     }
 | |
|     // Override arrays (for example for font-families, box-shadows, ...)
 | |
|     if (Array.isArray(value)) {
 | |
|         return value;
 | |
|     }
 | |
|     // 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 _config_plugins;
 | |
|         const plugins = (_config_plugins = config === null || config === void 0 ? void 0 : config.plugins) !== null && _config_plugins !== void 0 ? _config_plugins : [];
 | |
|         if (plugins.length === 0) {
 | |
|             return;
 | |
|         }
 | |
|         plugins.forEach((plugin)=>{
 | |
|             if (plugin.__isOptionsFunction) {
 | |
|                 plugin = plugin();
 | |
|             }
 | |
|             var _plugin_config;
 | |
|             allConfigs = [
 | |
|                 ...allConfigs,
 | |
|                 ...extractPluginConfigs([
 | |
|                     (_plugin_config = plugin === null || plugin === void 0 ? void 0 : plugin.config) !== null && _plugin_config !== void 0 ? _plugin_config : {}
 | |
|                 ])
 | |
|             ];
 | |
|         });
 | |
|     });
 | |
|     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;
 | |
| }
 | |
| function resolveConfig(configs) {
 | |
|     let allConfigs = [
 | |
|         ...extractPluginConfigs(configs),
 | |
|         {
 | |
|             prefix: "",
 | |
|             important: false,
 | |
|             separator: ":"
 | |
|         }
 | |
|     ];
 | |
|     var _t_theme, _c_plugins;
 | |
|     return (0, _normalizeConfig.normalizeConfig)((0, _defaults.defaults)({
 | |
|         theme: resolveFunctionKeys(mergeExtensions(mergeThemes(allConfigs.map((t)=>{
 | |
|             return (_t_theme = t === null || t === void 0 ? void 0 : t.theme) !== null && _t_theme !== void 0 ? _t_theme : {};
 | |
|         })))),
 | |
|         corePlugins: resolveCorePlugins(allConfigs.map((c)=>c.corePlugins)),
 | |
|         plugins: resolvePluginLists(configs.map((c)=>{
 | |
|             return (_c_plugins = c === null || c === void 0 ? void 0 : c.plugins) !== null && _c_plugins !== void 0 ? _c_plugins : [];
 | |
|         }))
 | |
|     }, ...allConfigs));
 | |
| }
 |