mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
- Allow hierarchy of setuppables - Detection of circular injections - Detection of circular setuppables - Better error messages for injecting non-registered injectables - Introduce injectMany as new pattern - Introduce keyed singletons as new lifecycle - Allow instantiation parameter of any type Adapt to new version of injectable Remove explicit singleton as lifecycle for being default Co-authored-by: Mikko Aspiala <mikko.aspiala@gmail.com> Signed-off-by: Janne Savolainen <janne.savolainen@live.fi>
46 lines
1.4 KiB
TypeScript
46 lines
1.4 KiB
TypeScript
/**
|
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
|
*/
|
|
import type { Injectable, TentativeTuple } from "@ogre-tools/injectable";
|
|
import { getLegacyGlobalDiForExtensionApi } from "./legacy-global-di-for-extension-api";
|
|
|
|
type MapInjectables<T> = {
|
|
[Key in keyof T]: T[Key] extends () => infer Res ? Res : never;
|
|
};
|
|
|
|
export const asLegacyGlobalObjectForExtensionApiWithModifications = <
|
|
TInjectable extends Injectable<unknown, unknown, TInstantiationParameter>,
|
|
TInstantiationParameter,
|
|
OtherFields extends Record<string, () => any>,
|
|
>(
|
|
injectableKey: TInjectable,
|
|
otherFields: OtherFields,
|
|
...instantiationParameter: TentativeTuple<TInstantiationParameter>
|
|
) =>
|
|
new Proxy(
|
|
{},
|
|
{
|
|
get(target, propertyName) {
|
|
if (propertyName === "$$typeof") {
|
|
return undefined;
|
|
}
|
|
|
|
const instance: any = getLegacyGlobalDiForExtensionApi().inject(
|
|
injectableKey,
|
|
...instantiationParameter,
|
|
);
|
|
|
|
const propertyValue = instance[propertyName] ?? otherFields[propertyName as any]();
|
|
|
|
if (typeof propertyValue === "function") {
|
|
return function (...args: any[]) {
|
|
return propertyValue.apply(instance, args);
|
|
};
|
|
}
|
|
|
|
return propertyValue;
|
|
},
|
|
},
|
|
) as ReturnType<TInjectable["instantiate"]> & MapInjectables<OtherFields>;
|