UNPKG

@arwes/theme

Version:

Futuristic Sci-Fi UI Web Framework

79 lines (78 loc) 3.32 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createCreateTheme = void 0; const index_js_1 = require("../createThemeMultiplier/index.js"); const index_js_2 = require("../createThemeUnit/index.js"); const index_js_3 = require("../createThemeColor/index.js"); const index_js_4 = require("../createThemeStyle/index.js"); const index_js_5 = require("../createThemeBreakpoints/index.js"); const extendDeepObject = (structure, defaults, extension) => { const newObject = {}; Object.keys(structure).forEach((key) => { if (typeof structure[key] === 'object') { if (structure[key] === null) { throw new Error('Theme structure values can not be null.'); } if (!defaults[key] || typeof defaults[key] !== 'object') { throw new Error('Theme default value should match theme structure object.'); } newObject[key] = extendDeepObject(structure[key], defaults[key], extension?.[key]); } else { newObject[key] = extension?.[key] ?? defaults[key]; } }); return newObject; }; const createDeepThemeSetup = (structure, settings) => { const newObject = {}; Object.keys(structure).forEach((key) => { if (typeof structure[key] === 'object') { newObject[key] = createDeepThemeSetup(structure[key], settings[key]); } else { switch (structure[key]) { case 'multiplier': newObject[key] = (0, index_js_1.createThemeMultiplier)(settings[key]); break; case 'unit': newObject[key] = (0, index_js_2.createThemeUnit)(settings[key]); break; case 'color': newObject[key] = (0, index_js_3.createThemeColor)(settings[key]); break; case 'style': newObject[key] = (0, index_js_4.createThemeStyle)(settings[key]); break; case 'breakpoints': newObject[key] = (0, index_js_5.createThemeBreakpoints)(settings[key]); break; case 'other': newObject[key] = settings[key]; break; default: throw new Error(`Invalid theme structure key "${structure[key]}" provided.`); } } }); return newObject; }; const createCreateTheme = (themeStructure, themeSettingsDefaults) => { const createTheme = (themeSettingsExtensions = {}) => { let themeSettings; if (Array.isArray(themeSettingsExtensions)) { themeSettings = themeSettingsExtensions.reduce((settingsTotal, settingsItem) => { if (!settingsItem) { return settingsTotal; } return extendDeepObject(themeStructure, settingsTotal, settingsItem); }, themeSettingsDefaults); } else { themeSettings = extendDeepObject(themeStructure, themeSettingsDefaults, themeSettingsExtensions); } return createDeepThemeSetup(themeStructure, themeSettings); }; return createTheme; }; exports.createCreateTheme = createCreateTheme;