diff --git a/src/injectors/components/InjectComponent.test.tsx b/src/injectors/components/InjectComponent.test.tsx index 6d02538c..4bc7c80d 100644 --- a/src/injectors/components/InjectComponent.test.tsx +++ b/src/injectors/components/InjectComponent.test.tsx @@ -1,5 +1,6 @@ import { render } from '@testing-library/react'; import React from 'react'; +import type { Constructable, ObjectGraph } from 'src'; import MainGraph, { Dependencies } from '../../../test/fixtures/MainGraph'; import { injectComponent } from './InjectComponent'; @@ -33,4 +34,15 @@ describe('injectComponent', () => { const { container } = render(); expect(container.textContent).toBe('error: own prop not provided - Fear kills progress'); }); + + // it throws an error if the Graph is undefined + it('Throws an error if the Graph is undefined', () => { + const Graph = undefined as unknown as Constructable; + expect(() => injectComponent(component, Graph)).toThrowError( + `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 component.`, + ); + }); }); diff --git a/src/injectors/components/InjectComponent.ts b/src/injectors/components/InjectComponent.ts index a8d357b8..22b258b5 100644 --- a/src/injectors/components/InjectComponent.ts +++ b/src/injectors/components/InjectComponent.ts @@ -2,20 +2,34 @@ import { ObjectGraph } from '../../graph/ObjectGraph'; import { Constructable } from '../../types'; import ComponentInjector from './ComponentInjector'; -interface Descriminator { - obsidianDescriminator: never; +interface Discriminator { + obsidianDiscriminator: never; } const componentInjector = new ComponentInjector(); -export const injectComponent = ( +export const injectComponent = ( Target: React.FunctionComponent< - (OwnProps extends infer P ? OwnProps extends Descriminator ? P : OwnProps : never) & - (InjectedProps extends Descriminator ? any : InjectedProps) + (OwnProps extends infer P ? OwnProps extends Discriminator ? P : OwnProps : never) & + (InjectedProps extends Discriminator ? any : InjectedProps) >, Graph: Constructable, -) => componentInjector.inject(Target, Graph) as React.FunctionComponent< - InjectedProps extends Descriminator ? - OwnProps extends Descriminator ? Partial : OwnProps : +) => { + assertGraph(Graph, Target); + + return componentInjector.inject(Target, Graph) as React.FunctionComponent< + InjectedProps extends Discriminator ? + OwnProps extends Discriminator ? Partial : OwnProps : OwnProps extends InjectedProps ? Partial : OwnProps & Partial >; +}; +function assertGraph(Graph: Constructable>, Target: any) { + if (!Graph) { + 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}.`, + ); + } +}