di-tory
Version:
Compose applications with dependency injection
31 lines (30 loc) • 1.26 kB
JavaScript
import { propertyKeys } from './objects.js';
import Scope from './scope.js';
export const decorateResolver = (resolver, scope) => {
const newResolver = (injection, params) => resolver(injection, params);
newResolver.scope = scope;
Object.defineProperty(newResolver, 'name', {
value: `${scope}::${resolver.name}`,
});
return newResolver;
};
export const decorateResolvers = (resolvers, scope) => {
const newResolvers = {};
for (const key of propertyKeys(resolvers)) {
newResolvers[key] = decorateResolver(resolvers[key], scope);
}
return newResolvers;
};
const createMethodResolver = (method) => (self) => (...args) => method(self, ...args);
export const createMethodResolvers = (implementation) => {
const newImplementation = {};
for (const key of propertyKeys(implementation)) {
const method = implementation[key];
if (typeof method !== 'function') {
throw new Error(`Expected ${String(key)} to be a function, but got ${typeof method}`);
}
newImplementation[key] = createMethodResolver(method); // eslint-disable-line @typescript-eslint/no-explicit-any
newImplementation[key].scope = `!${Scope.module}`;
}
return newImplementation;
};