mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
* Reorganize stuff to prevent circular dependencies Signed-off-by: Janne Savolainen <janne.savolainen@live.fi> * Install injectable extension to allow injecting reactively many implementations Signed-off-by: Janne Savolainen <janne.savolainen@live.fi> * Switch to using computedInjectMany over filtering injectMany based on enabled extensions for simplicity Signed-off-by: Janne Savolainen <janne.savolainen@live.fi> * Remove await for not being needed Signed-off-by: Janne Savolainen <janne.savolainen@live.fi> * Sort dependencies alphabetically Signed-off-by: Janne Savolainen <janne.savolainen@live.fi>
51 lines
1.4 KiB
TypeScript
51 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 { getInjectable, lifecycleEnum } from "@ogre-tools/injectable";
|
|
import type { LensExtension } from "../../lens-extension";
|
|
import { extensionRegistratorInjectionToken } from "../extension-registrator-injection-token";
|
|
|
|
export interface Extension {
|
|
register: () => void;
|
|
deregister: () => void;
|
|
}
|
|
|
|
const extensionInjectable = getInjectable({
|
|
id: "extension",
|
|
|
|
instantiate: (parentDi, instance: LensExtension): Extension => {
|
|
const extensionInjectable = getInjectable({
|
|
id: `extension-${instance.sanitizedExtensionId}`,
|
|
|
|
instantiate: (childDi) => {
|
|
const extensionRegistrators = childDi.injectMany(extensionRegistratorInjectionToken);
|
|
|
|
return {
|
|
register: () => {
|
|
const injectables = extensionRegistrators.flatMap((getInjectablesOfExtension) =>
|
|
getInjectablesOfExtension(instance),
|
|
);
|
|
|
|
childDi.register(...injectables);
|
|
},
|
|
|
|
deregister: () => {
|
|
parentDi.deregister(extensionInjectable);
|
|
},
|
|
};
|
|
},
|
|
});
|
|
|
|
parentDi.register(extensionInjectable);
|
|
|
|
return parentDi.inject(extensionInjectable);
|
|
},
|
|
|
|
lifecycle: lifecycleEnum.keyedSingleton({
|
|
getInstanceKey: (di, extension: LensExtension) => extension,
|
|
}),
|
|
});
|
|
|
|
export default extensionInjectable;
|