module-composer
Version:
Bring order to chaos. Level up your JS application architecture with Module Composer, a tiny but powerful module composition utility based on functional dependency injection.
31 lines (27 loc) • 1.13 kB
JavaScript
const constants = require('./constants');
const _ = require('./util');
const applyArrayOptions = (...keys) => opts => {
return Object.fromEntries(keys.map(key => [key, [opts[key] ?? []].flat()]));
};
const validate = defaults => opts => {
const invalid = Object.keys(opts).filter(opt => Object.keys(defaults).indexOf(opt) === -1);
if (invalid.length) throw new Error(`Invalid option: ${invalid.join(', ')}`);
};
module.exports = opts => {
const composerOptions = _.pipeAssign(
opts,
validate(constants.composerDefaultOptions),
opts => ({ ...constants.composerDefaultOptions, ...opts }),
applyArrayOptions('configAlias')
);
const getComposeOptions = (key, opts) => {
return _.pipeAssign(
opts,
validate(constants.composeDefaultOptions),
{ overrides: opts.overrides ?? composerOptions.overrides?.[key] },
opts => ({ ...composerOptions, ...composerOptions.defaults[key], ...opts }),
applyArrayOptions('moduleAlias', 'functionAlias')
);
};
return { composerOptions, getComposeOptions };
};