react-obsidian
Version:
Dependency injection framework for React and React Native applications
37 lines (32 loc) • 1.37 kB
text/typescript
import { ObjectGraph } from '../../graph/ObjectGraph';
import { Constructable } from '../../types';
import { isString } from '../../utils/isString';
import ComponentInjector from './ComponentInjector';
interface Discriminator {
obsidianDiscriminator: never;
}
const componentInjector = new ComponentInjector();
export const injectComponent = <OwnProps = Discriminator, InjectedProps = Discriminator> (
Target: React.FunctionComponent<
(OwnProps extends infer P ? OwnProps extends Discriminator ? P : OwnProps : never) &
(InjectedProps extends Discriminator ? any : InjectedProps)
>,
keyOrGraph: string | Constructable<ObjectGraph>,
) => {
assertGraph(keyOrGraph, Target);
return componentInjector.inject(Target, keyOrGraph) as React.FunctionComponent<
InjectedProps extends Discriminator ?
OwnProps extends Discriminator ? Partial<OwnProps> : OwnProps :
OwnProps extends InjectedProps ? Partial<OwnProps> : OwnProps & Partial<InjectedProps>
>;
};
function assertGraph(keyOrGraph: string | Constructable<ObjectGraph>, Target: any) {
if (!isString(keyOrGraph) && !keyOrGraph) {
throw new Error(
`injectComponent was called with an undefined Graph.`
+ `This is probably not an issue with Obsidian.`
+ `It's typically caused by circular dependencies.`
+ ` Check the implementation of ${Target.name}.`,
);
}
}