di-tory
Version:
Compose applications with dependency injection
58 lines (57 loc) • 2.33 kB
JavaScript
import { createModule } from './create-module.js';
import { createMethodResolvers, decorateResolvers, } from './decorate-resolvers.js';
const buildersState = new WeakMap();
const Module = () => {
const privateResolvers = {};
const publicResolvers = {};
const state = {
privateResolvers,
publicResolvers,
initializers: null,
};
const self = {
private(resolvers, scope) {
if (state.initializers != null) {
throw new Error('Cannot extend initialized module');
}
Object.defineProperties(privateResolvers, Object.getOwnPropertyDescriptors(scope != null ? decorateResolvers(resolvers, scope) : resolvers));
return self;
},
privateImpl(implementation) {
if (state.initializers != null) {
throw new Error('Cannot extend initialized module');
}
Object.defineProperties(privateResolvers, Object.getOwnPropertyDescriptors(
// eslint-disable-next-line @typescript-eslint/no-explicit-any
createMethodResolvers(implementation)));
return self;
},
public(resolvers, scope) {
if (state.initializers != null) {
throw new Error('Cannot extend initialized module');
}
Object.defineProperties(publicResolvers, Object.getOwnPropertyDescriptors(scope != null ? decorateResolvers(resolvers, scope) : resolvers));
return self;
},
publicImpl(implementation) {
if (state.initializers != null) {
throw new Error('Cannot extend initialized module');
}
Object.defineProperties(publicResolvers, Object.getOwnPropertyDescriptors(
// eslint-disable-next-line @typescript-eslint/no-explicit-any
createMethodResolvers(implementation)));
return self;
},
init(initializer) {
state.initializers = initializer;
return self;
},
create(params = {}) {
return createModule(privateResolvers, publicResolvers, state.initializers, params);
},
};
buildersState.set(self, state);
// eslint-disable-next-line @typescript-eslint/no-explicit-any
return self;
};
export default Module;