From 1cd6e0ae1ea3da7c0f8ba365970ff5dc8f2af8c3 Mon Sep 17 00:00:00 2001 From: Alexandre Tuleu Date: Mon, 14 Aug 2023 09:34:10 +0200 Subject: [PATCH] Adds ColorConfig to Config --- src/config.yml | 5 ++++ src/lib/config.ts | 9 ++++++ src/lib/server/config.test.ts | 25 +++++++++------- src/lib/server/config.ts | 56 ++++++++++++++++++++++++++++------- 4 files changed, 75 insertions(+), 20 deletions(-) diff --git a/src/config.yml b/src/config.yml index b65b09d..98a2876 100644 --- a/src/config.yml +++ b/src/config.yml @@ -4,6 +4,11 @@ logo: 'icon-any.svg' icon: 'fa fa-cloud' asmask: false +colors: + dark: + test: red + + services: - title: '/Cloud' subtitle: 'Private Cloud Utilities' diff --git a/src/lib/config.ts b/src/lib/config.ts index 65b13a1..4ee1f5f 100644 --- a/src/lib/config.ts +++ b/src/lib/config.ts @@ -23,8 +23,17 @@ export interface ServiceGroupConfig extends SectionConfig { [x: string]: unknown; } +export interface ColorConfig { + test: string; +} + export interface Config extends SectionConfig { services: Array; + colors: { + light: ColorConfig; + dark: ColorConfig; + }; + [x: string]: unknown; } diff --git a/src/lib/server/config.test.ts b/src/lib/server/config.test.ts index eee6d0b..503dc82 100644 --- a/src/lib/server/config.test.ts +++ b/src/lib/server/config.test.ts @@ -1,12 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { - defaultConfig, - mergeConfig, - type Config, - stripPrivateFields, - serverConfig, - clientConfig -} from './config'; +import { defaultConfig, stripPrivateFields, serverConfig, clientConfig, merge } from './config'; +import type { Config } from '$lib/config'; describe('Config', () => { it('should be export a build time server and client config store', () => { @@ -15,8 +9,13 @@ describe('Config', () => { }); it('should be able to merge with POJO', () => { - const merged = mergeConfig(defaultConfig, { + const merged: Config = merge(defaultConfig, { subtitle: "Homer's favorite neighboor", + colors: { + light: { + test: 'red' + } + }, services: [ { title: 'favorite occupations', @@ -28,10 +27,12 @@ describe('Config', () => { ] } ] - }); + }) as Config; expect(merged.title).toEqual('Flanders'); expect(merged.services).toHaveLength(1); + expect(merged.colors.light).toEqual({ test: 'red' }); + expect(merged.colors.dark).toEqual({}); expect(merged.services[0].title).toEqual('favorite occupations'); expect(merged.services[0].items).toHaveLength(1); expect(merged.services[0].items[0].title).toEqual('anoy homer'); @@ -42,6 +43,10 @@ describe('Config', () => { const custom: Config = { title: 'custom', secret: { secret: 'some secret' }, + colors: { + light: {}, + dark: {} + }, services: [ { title: 'top services', diff --git a/src/lib/server/config.ts b/src/lib/server/config.ts index afc1acd..806ecb6 100644 --- a/src/lib/server/config.ts +++ b/src/lib/server/config.ts @@ -30,21 +30,59 @@ export const requiredConfig: Required = { logo: '', icon: '', asmask: false, + colors: { + light: { + test: '' + }, + dark: { + test: '' + } + }, services: [requiredServiceGroup] }; -export function mergeConfig(a: Config, b: any): Config { - return { ...a, ...b }; +type SPOJO = Record; + +export function merge(a: Type, b: SPOJO): Type { + const res: Type = { ...a }; + for (const [key, value] of Object.entries(b)) { + console.log(key, value, typeof value, typeof res[key]); + if ( + typeof value != 'object' || + res[key] == undefined || + typeof res[key] != typeof res[key] + ) { + (res as SPOJO)[key] = value; + continue; + } + + if (value instanceof Array) { + const merged = []; + merged.push(...(res[key] as Array)); + merged.push(...value); + (res as SPOJO)[key] = merged; + continue; + } + (res as SPOJO)[key] = merge(res[key] as SPOJO, value as SPOJO); + } + + return res; } export const defaultConfig: Config = { title: 'Flanders', + colors: { + light: { + test: '' + }, + dark: { + test: '' + } + }, services: [] }; -type SPOJO = Record; - function strip(toStrip: Type, reference: Type): Type { const res: Type = { ...toStrip }; const referenceNames = Object.entries(reference).map(([key, value]) => key); @@ -70,10 +108,8 @@ function strip(toStrip: Type, reference: Type): Type { } // it is a child object, we strip it further - const stripped: SPOJO = {}; - const childReference: SPOJO = (reference[key] as Array)[0]; - stripped[key] = strip(value as SPOJO, childReference); - (res as SPOJO)[key] = stripped; + const childReference: SPOJO = reference[key] as SPOJO; + (res as SPOJO)[key] = strip(value as SPOJO, childReference); } return res; } @@ -82,7 +118,7 @@ export function stripPrivateFields(config: Config): Config { return strip(config, requiredConfig); } -export const serverConfig: Writable = writable(mergeConfig(defaultConfig, configData)); +export const serverConfig: Writable = writable(merge(defaultConfig, configData)); export const clientConfig: Readable = derived(serverConfig, ($config) => stripPrivateFields($config) @@ -94,7 +130,7 @@ export function watchDymamicConfig() { const reloadConfig = async () => { try { const dynamicConfig = yml.load(await readFile(__filepath, 'utf8')); - serverConfig.set(mergeConfig(defaultConfig, dynamicConfig)); + serverConfig.set(merge(defaultConfig, dynamicConfig)); } catch (err) { console.error('could not read or parse config: ' + err); }