import { DiContainer, Factory, InjectionInstanceWithMeta, InjectionToken, InjectionToken2Base, ManyFactory, SingleInjectionToken2, } from '@ogre-tools/injectable'; import { IComputedValue } from 'mobx'; export function registerMobX(di: DiContainer): void; type ComputedInjectMany = { // InjectionToken2, abstract or not: variadic, returns IComputedValue of a // plain array element-typed by the token's many-factory, so a custom // multi-factory narrows it (normalized like v1 injectMany in the core) >( injectionToken: InjectionToken2Base, ...params: Parameters ): IComputedValue extends (infer R)[] ? R[] : never>; // Old-style InjectionToken , TInstance extends TInjectionToken extends InjectionToken ? T : never, >( injectionToken: TInjectionToken, ...param: TInjectionToken extends InjectionToken ? [T] : [] ): IComputedValue; }; type ComputedInjectManyWithMeta = { // InjectionToken2, abstract or not: variadic, returns IComputedValue of // instance-with-meta array, element-typed by the token's many-factory >( injectionToken: InjectionToken2Base, ...params: Parameters ): IComputedValue< InjectionInstanceWithMeta extends (infer R)[] ? R : never>[] >; // Old-style InjectionToken , TInstanceWithMeta extends TInjectionToken extends InjectionToken ? InjectionInstanceWithMeta : never, >( injectionToken: TInjectionToken, ...param: TInjectionToken extends InjectionToken ? [T] : [] ): IComputedValue; }; export const computedInjectManyInjectionToken: InjectionToken; export const computedInjectManyWithMetaInjectionToken: InjectionToken; type ComputedInjectMaybe = { // InjectionToken2: variadic, returns IComputedValue of the token's // maybe-factory result (which always includes undefined) < F extends Factory, MF extends (...args: Parameters) => ReturnType | undefined, >( injectionToken: InjectionToken2Base, ...params: Parameters ): IComputedValue>; // Old-style InjectionToken , TInstance extends TInjectionToken extends InjectionToken ? T : never, >( injectionToken: TInjectionToken, ...param: TInjectionToken extends InjectionToken ? [T] : [] ): IComputedValue; }; export const computedInjectMaybeInjectionToken: InjectionToken; type ComputedInjectMaybeWithMeta = { // InjectionToken2: variadic, returns IComputedValue of the meta-wrapped // instance or undefined, typed by the token's maybe-factory < F extends Factory, MF extends (...args: Parameters) => ReturnType | undefined, >( injectionToken: InjectionToken2Base, ...params: Parameters ): IComputedValue< InjectionInstanceWithMeta, undefined>> | undefined >; // Old-style InjectionToken , TInstanceWithMeta extends TInjectionToken extends InjectionToken ? InjectionInstanceWithMeta : never, >( injectionToken: TInjectionToken, ...param: TInjectionToken extends InjectionToken ? [T] : [] ): IComputedValue; }; export const computedInjectMaybeWithMetaInjectionToken: InjectionToken; // Factory-shape variants: `di.inject(X, token)` returns the bound callable // (and `di.inject2(X)(token)` equivalently). The callable is the token's // ManyFactory for ComputedInjectMany2 — generics on the token propagate. // WithMeta2 returns the token's with-meta many-template verbatim: by default // that derives from the many-factory (collapsing a generic to its // constraint), and a token that declares the slot explicitly keeps its // generic — same mechanism as InjectManyWithMeta2 in the core package. // Maybe2 needs none of this: a 'zero-or-one' token carries its maybe-factory, // which is returned verbatim. // Overload order matters on two fronts: // 1) At call time, TS tries overloads top-to-bottom. InjectionToken (v1) has // a required `instantiationParameter` field that InjectionToken2 lacks, // so InjectionToken2 correctly falls through the v1 overload to the v2 one. // 2) `Parameters` / `ReturnType` pick the LAST overload. `di.inject` // uses these on a token's Factory, so the v2 overload must be last for // `di.inject(computedInjectMany2InjectionToken, token)(...)` to infer MF. type ComputedInjectMany2 = { , TInstance extends TInjectionToken extends InjectionToken ? T : never, >( injectionToken: TInjectionToken, ): ( ...param: TInjectionToken extends InjectionToken ? [T] : [] ) => TInstance[]; < F extends Factory, MF extends (...args: Parameters) => ReturnType[], >( injectionToken: InjectionToken2Base, ): MF; }; export const computedInjectMany2InjectionToken: SingleInjectionToken2; type ComputedInjectManyWithMeta2 = { , TInstanceWithMeta extends TInjectionToken extends InjectionToken ? InjectionInstanceWithMeta : never, >( injectionToken: TInjectionToken, ): ( ...param: TInjectionToken extends InjectionToken ? [T] : [] ) => TInstanceWithMeta[]; ( injectionToken: InjectionToken2Base< F, any, 'zero-or-many' | 'one-or-many', any, WMF >, ): WMF; }; export const computedInjectManyWithMeta2InjectionToken: SingleInjectionToken2; type ComputedInjectMaybe2 = { , TInstance extends TInjectionToken extends InjectionToken ? T : never, >( injectionToken: TInjectionToken, ): ( ...param: TInjectionToken extends InjectionToken ? [T] : [] ) => TInstance | undefined; // Keyed on the token's own maybe-factory rather than recomputed from // Parameters / ReturnType, so a generic factory keeps its generic. < F extends Factory, MF extends (...args: Parameters) => ReturnType | undefined, >( injectionToken: InjectionToken2Base, ): MF; }; export const computedInjectMaybe2InjectionToken: SingleInjectionToken2; type ComputedInjectMaybeWithMeta2 = { , TInstanceWithMeta extends TInjectionToken extends InjectionToken ? InjectionInstanceWithMeta : never, >( injectionToken: TInjectionToken, ): ( ...param: TInjectionToken extends InjectionToken ? [T] : [] ) => TInstanceWithMeta | undefined; // Returns the token's with-meta consumption template verbatim — for a // 'zero-or-one' token that is `(...args) => InjectionInstanceWithMeta | // undefined` by default, and an explicitly declared generic slot survives. ( injectionToken: InjectionToken2Base, ): WMF; }; export const computedInjectMaybeWithMeta2InjectionToken: SingleInjectionToken2;