From c9503c1d14b4f0f43f0966f6d4e3e07e016e751c Mon Sep 17 00:00:00 2001 From: Janne Savolainen Date: Fri, 19 Nov 2021 14:13:53 +0200 Subject: [PATCH] Allow asynchronous instances in injectable typing Signed-off-by: Janne Savolainen --- src/renderer/bootstrap.tsx | 4 +-- src/renderer/components/getDi.tsx | 4 +-- .../components/getDiForUnitTesting.tsx | 4 +-- types/ogre-tools-injectable-react.d.ts | 10 +++--- types/ogre-tools-injectable.d.ts | 33 +++++++++++-------- 5 files changed, 31 insertions(+), 24 deletions(-) diff --git a/src/renderer/bootstrap.tsx b/src/renderer/bootstrap.tsx index bcae5a84a3..edc4ff90f7 100644 --- a/src/renderer/bootstrap.tsx +++ b/src/renderer/bootstrap.tsx @@ -52,7 +52,7 @@ import { AppPaths } from "../common/app-paths"; import { registerCustomThemes } from "./components/monaco-editor"; import { getDi } from "./components/getDi"; import { DiContextProvider } from "@ogre-tools/injectable-react"; -import type { IDependencyInjectionContainer } from "@ogre-tools/injectable"; +import type { DependencyInjectionContainer } from "@ogre-tools/injectable"; if (process.isMainFrame) { SentryInit(); @@ -76,7 +76,7 @@ type AppComponent = React.ComponentType & { init(rootElem: HTMLElement): Promise; }; -export async function bootstrap(comp: () => Promise, di: IDependencyInjectionContainer) { +export async function bootstrap(comp: () => Promise, di: DependencyInjectionContainer) { const rootElem = document.getElementById("app"); const logPrefix = `[BOOTSTRAP-${process.isMainFrame ? "ROOT" : "CLUSTER"}-FRAME]:`; diff --git a/src/renderer/components/getDi.tsx b/src/renderer/components/getDi.tsx index 745573e6ea..65367a8c77 100644 --- a/src/renderer/components/getDi.tsx +++ b/src/renderer/components/getDi.tsx @@ -20,10 +20,10 @@ */ import { createContainer } from "@ogre-tools/injectable"; -import type { IConfigurableDependencyInjectionContainer } from "@ogre-tools/injectable"; +import type { ConfigurableDependencyInjectionContainer } from "@ogre-tools/injectable"; export const getDi = () => { - const di: IConfigurableDependencyInjectionContainer = createContainer( + const di: ConfigurableDependencyInjectionContainer = createContainer( () => require.context("./", true, /\.injectable\.(ts|tsx)$/), ); diff --git a/src/renderer/components/getDiForUnitTesting.tsx b/src/renderer/components/getDiForUnitTesting.tsx index 0ce9b6c9b0..4e94d20dae 100644 --- a/src/renderer/components/getDiForUnitTesting.tsx +++ b/src/renderer/components/getDiForUnitTesting.tsx @@ -24,11 +24,11 @@ import { memoize } from "lodash/fp"; import { createContainer, - IConfigurableDependencyInjectionContainer, + ConfigurableDependencyInjectionContainer, } from "@ogre-tools/injectable"; export const getDiForUnitTesting = () => { - const di: IConfigurableDependencyInjectionContainer = createContainer(); + const di: ConfigurableDependencyInjectionContainer = createContainer(); getInjectableFilePaths() .map(key => { diff --git a/types/ogre-tools-injectable-react.d.ts b/types/ogre-tools-injectable-react.d.ts index 38599d909d..27e3fdbdfa 100644 --- a/types/ogre-tools-injectable-react.d.ts +++ b/types/ogre-tools-injectable-react.d.ts @@ -20,16 +20,16 @@ */ /// declare module "@ogre-tools/injectable-react" { - import type { IDependencyInjectionContainer, IInjectable } from "@ogre-tools/injectable"; + import type { DependencyInjectionContainer, Injectable } from "@ogre-tools/injectable"; - interface IDependencyInjectionContainerProviderProps { - di: IDependencyInjectionContainer; + interface DependencyInjectionContainerProviderProps { + di: DependencyInjectionContainer; } - export const DiContextProvider: React.Provider; + export const DiContextProvider: React.Provider; export const Inject: < - TComponentInjectable extends IInjectable, + TComponentInjectable extends Injectable, >({ Component, injectableKey, diff --git a/types/ogre-tools-injectable.d.ts b/types/ogre-tools-injectable.d.ts index 7322708ee6..f8d6a27ebf 100644 --- a/types/ogre-tools-injectable.d.ts +++ b/types/ogre-tools-injectable.d.ts @@ -19,24 +19,29 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ declare module "@ogre-tools/injectable" { - export interface IDependencyInjectionContainer { + type Awaited = TMaybePromise extends PromiseLike + ? TValue + : TMaybePromise; + + export interface DependencyInjectionContainer { inject: < - TInjectable extends IInjectable, + TInjectable extends Injectable, TInstance, TDependencies, + TMaybePromiseInstance = ReturnType, >( injectableKey: TInjectable, - ) => ReturnType; + ) => TMaybePromiseInstance extends PromiseLike + ? Awaited + : TMaybePromiseInstance; } - export interface IConfigurableDependencyInjectionContainer - extends IDependencyInjectionContainer { - register: ( - injectable: IInjectable | IComponentInjectable, - ) => void; + export interface ConfigurableDependencyInjectionContainer + extends DependencyInjectionContainer { + register: (injectable: Injectable) => void; preventSideEffects: () => void; - override: , TInstance>( + override: , TInstance>( injectable: TInjectable, overrider: | ReturnType @@ -47,7 +52,7 @@ declare module "@ogre-tools/injectable" { ) => void; } - export interface IInjectable< + export interface Injectable< TInstance, TDependencies extends object = {}, TInstantiationParameter extends object = {}, @@ -55,7 +60,7 @@ declare module "@ogre-tools/injectable" { id?: string; getDependencies: ( - di?: IDependencyInjectionContainer, + di?: DependencyInjectionContainer, ) => TDependencies | Promise; lifecycle?: lifecycleEnum; @@ -63,7 +68,9 @@ declare module "@ogre-tools/injectable" { instantiate: ( dependencies: TDependencies, instantiationParameter: TInstantiationParameter, - ) => TInstance; + ) => Promise | TInstance; + + causesSideEffects?: boolean; } export enum lifecycleEnum { @@ -74,5 +81,5 @@ declare module "@ogre-tools/injectable" { // eslint-disable-next-line unused-imports/no-unused-vars-ts export const createContainer = (...getRequireContexts: any[]) => - IConfigurableDependencyInjectionContainer; + ConfigurableDependencyInjectionContainer; }