react-obsidian
Version:
Dependency injection framework for React and React Native applications
25 lines (21 loc) • 771 B
text/typescript
import { ObjectGraph } from '../../graph/ObjectGraph';
import { Graph } from '../../graph/Graph';
import useGraph from '../components/useGraph';
import { Constructable } from '../../types';
export default class HookInjector {
inject<Args, Result>(
hook: (args: Args) => Result,
Graph: Constructable<ObjectGraph>,
): (args?: Partial<Args>) => Result {
return (args?: Partial<Args>): Result => {
const graph = useGraph(Graph, hook, args);
return hook(new Proxy(args ?? {}, new Injector(graph)));
};
}
}
class Injector implements ProxyHandler<any> {
constructor(private graph: Graph) {}
get(obj: any, property: string, receiver: any): any {
return property in obj ? obj[property] : this.graph.retrieve(property, receiver);
}
}