piral-configs
Version:
Plugin for dynamic configurations of pilets in Piral.
46 lines • 1.63 kB
JavaScript
import { Validator } from 'jsonschema';
export function createConfigsApi(config = {}) {
const readConfig = (name, defaultConfig) => {
const key = `config-${name}`;
const current = config.retrieve?.(key);
if (typeof current === 'object') {
return {
...defaultConfig,
...current,
};
}
else if (typeof current !== 'undefined') {
return current;
}
else {
return undefined;
}
};
const validate = (schema, proposedConfig, defaultConfig) => {
const validator = new Validator();
const result = validator.validate(proposedConfig, schema);
if (!result.valid) {
console.warn(`The given configuration does not match the provided schema. Taking the default configuration.`, proposedConfig, result);
return defaultConfig;
}
return proposedConfig;
};
return (ctx) => (_, meta) => ({
defineConfigSchema(schema, defaultConfig) {
const proposedConfig = readConfig(meta.name, defaultConfig);
const current = proposedConfig ? validate(schema, proposedConfig, defaultConfig) : defaultConfig;
ctx.dispatch((state) => ({
...state,
configs: {
...state.configs,
[meta.name]: current,
},
}));
return current;
},
getCurrentConfig() {
return ctx.readState((s) => s.configs[meta.name]) ?? {};
},
});
}
//# sourceMappingURL=create.js.map