@arwes/theme
Version:
Futuristic Sci-Fi UI Web Framework
79 lines (78 loc) • 3.32 kB
JavaScript
;
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;