Makes finally dynamic component work??
This commit is contained in:
@@ -33,26 +33,26 @@ describe('Config', () => {
|
||||
it('should be able to strip custom keys', () => {
|
||||
const custom: Config = {
|
||||
title: 'custom',
|
||||
secret: {secret: 'some secret'},
|
||||
services: [
|
||||
{
|
||||
secret: { secret: 'some secret' },
|
||||
services: {
|
||||
top: {
|
||||
title: 'top services',
|
||||
secret: 'secret',
|
||||
items: [
|
||||
{
|
||||
items: {
|
||||
top: {
|
||||
title: 'top service',
|
||||
url: 'somewhere',
|
||||
secret: 'secret'
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
};
|
||||
|
||||
const stripped: Config = stripPrivateFields(custom);
|
||||
|
||||
expect(stripped.secret).toBeUndefined();
|
||||
expect(stripped.services[0].secret).toBeUndefined();
|
||||
expect(stripped.services[0].items[0].secret).toBeUndefined();
|
||||
expect(stripped.services.top.secret).toBeUndefined();
|
||||
expect(stripped.services.top.items.top.secret).toBeUndefined();
|
||||
});
|
||||
});
|
||||
|
||||
@@ -21,13 +21,13 @@ export interface ServiceConfig extends SectionConfig {
|
||||
}
|
||||
|
||||
export interface ServiceGroupConfig extends SectionConfig {
|
||||
items: ServiceConfig[];
|
||||
items: Record<string, ServiceConfig>;
|
||||
|
||||
[x: string]: unknown;
|
||||
}
|
||||
|
||||
export interface Config extends SectionConfig {
|
||||
services: ServiceGroupConfig[];
|
||||
services: Record<string, ServiceGroupConfig>;
|
||||
|
||||
[x: string]: unknown;
|
||||
}
|
||||
@@ -41,17 +41,17 @@ type DeepRequired<T> = T extends object
|
||||
const requiredConfig: DeepRequired<Config> = {
|
||||
title: '',
|
||||
subtitle: '',
|
||||
services: [
|
||||
{
|
||||
services: {
|
||||
default: {
|
||||
title: '',
|
||||
items: [
|
||||
{
|
||||
items: {
|
||||
default: {
|
||||
title: '',
|
||||
url: ''
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
};
|
||||
|
||||
export function mergeConfig(a: Config, b: any): Config {
|
||||
@@ -61,7 +61,7 @@ export function mergeConfig(a: Config, b: any): Config {
|
||||
export const defaultConfig: Config = {
|
||||
title: 'Flanders',
|
||||
|
||||
services: []
|
||||
services: {}
|
||||
};
|
||||
|
||||
type SPOJO = Record<string, unknown>;
|
||||
@@ -70,29 +70,21 @@ function strip<Type extends SPOJO>(toStrip: Type, reference: Type): Type {
|
||||
const res: Type = { ...toStrip };
|
||||
const referenceNames = Object.entries(reference).map(([key, value]) => key);
|
||||
|
||||
const allowAny: boolean = referenceNames.length == 1 && referenceNames[0] == 'default';
|
||||
for (const [key, value] of Object.entries(res)) {
|
||||
if (referenceNames.includes(key) == false) {
|
||||
if (referenceNames.includes(key) == false && allowAny == false) {
|
||||
// remove the object
|
||||
delete res[key];
|
||||
continue;
|
||||
}
|
||||
|
||||
// strips further arrays
|
||||
if (value instanceof Array) {
|
||||
const stripped: SPOJO = {};
|
||||
const childRef = (reference[key] as Array<SPOJO>)[0];
|
||||
stripped[key] = value.map((v: SPOJO) => strip(v, childRef));
|
||||
Object.assign(res, stripped);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (typeof value != 'object') {
|
||||
continue;
|
||||
}
|
||||
|
||||
// it is a child object, we strip it further
|
||||
const stripped: SPOJO = {};
|
||||
stripped[key] = strip(value as SPOJO, reference[key] as SPOJO);
|
||||
const childReference: SPOJO = reference[allowAny ? 'default' : key] as SPOJO;
|
||||
stripped[key] = strip(value as SPOJO, childReference);
|
||||
Object.assign(res, stripped);
|
||||
}
|
||||
return res;
|
||||
|
||||
@@ -10,18 +10,21 @@ export type ServiceHandler = (input: Partial<ServiceHandlerArgs>) => {
|
||||
componentPath: string;
|
||||
};
|
||||
|
||||
const services: Record<string, ServiceHandler> = {};
|
||||
const services: Record<string, [ServiceHandler, string]> = {};
|
||||
|
||||
export function registerService(type: string, handler: ServiceHandler) {
|
||||
services[type] = handler;
|
||||
services[type] = [handler, type];
|
||||
}
|
||||
|
||||
export function getService(type: string): ServiceHandler {
|
||||
export function getService(type: string): [ServiceHandler, string] {
|
||||
const handler = services[type];
|
||||
if (handler == undefined) {
|
||||
return () => {
|
||||
return { data: {}, componentPath: 'generic/GenericServiceCard.svelte' };
|
||||
};
|
||||
return [
|
||||
() => {
|
||||
return { data: {}, componentPath: 'generic/GenericServiceCard.svelte' };
|
||||
},
|
||||
'generic'
|
||||
];
|
||||
}
|
||||
return handler;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user