diff --git a/packages/core/.eslintrc.js b/packages/core/.eslintrc.js index 90ae34ae8b..c2eb663038 100644 --- a/packages/core/.eslintrc.js +++ b/packages/core/.eslintrc.js @@ -259,8 +259,8 @@ module.exports = { }, { files: [ - "src/{common,main,renderer}/**/*.ts", - "src/{common,main,renderer}/**/*.tsx", + "src/{common,main,renderer,features}/**/*.ts", + "src/{common,main,renderer,features}/**/*.tsx", ], rules: { "no-restricted-imports": ["error", { @@ -280,6 +280,9 @@ module.exports = { "**/extensions/renderer-api/**/*", "**/extensions/main-api/**/*", "**/extensions/common-api/**/*", + "**/extensions/renderer-api", + "**/extensions/main-api", + "**/extensions/common-api", ], message: "No importing from the extension api definitions in application code", }, diff --git a/packages/core/src/common/library.ts b/packages/core/src/common/library.ts index 95f8a8a1d3..48a6f3f77d 100644 --- a/packages/core/src/common/library.ts +++ b/packages/core/src/common/library.ts @@ -4,4 +4,6 @@ */ // @experimental +export type { BundledExtension } from "../features/extensions/common/bundled-extension-token"; +export type { BundledLensExtensionManifest } from "../features/extensions/common/installed-extension"; export { bundledExtensionInjectionToken } from "../features/extensions/common/bundled-extension-token"; diff --git a/packages/core/src/extensions/__tests__/is-compatible-extension.test.ts b/packages/core/src/extensions/__tests__/is-compatible-extension.test.ts index f2ca144681..a6c354d985 100644 --- a/packages/core/src/extensions/__tests__/is-compatible-extension.test.ts +++ b/packages/core/src/extensions/__tests__/is-compatible-extension.test.ts @@ -3,61 +3,102 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { isCompatibleExtension } from "../extension-discovery/is-compatible-extension/is-compatible-extension"; -import type { LensExtensionManifest } from "../lens-extension"; +import type { DiContainer } from "@ogre-tools/injectable"; +import extensionApiVersionInjectable from "../../common/vars/extension-api-version.injectable"; +import type { IsCompatibleExtension } from "../../features/extensions/discovery/main/is-compatible-extension.injectable"; +import isCompatibleExtensionInjectable from "../../features/extensions/discovery/main/is-compatible-extension.injectable"; +import { getDiForUnitTesting } from "../../renderer/getDiForUnitTesting"; describe("Extension/App versions compatibility checks", () => { - it("is compatible with exact version matching", () => { - expect(isCompatible({ extLensEngineVersion: "5.5.0", extensionApiVersion: "5.5.0" })).toBeTruthy(); + let di: DiContainer; + + beforeEach(() => { + di = getDiForUnitTesting({ doGeneralOverrides: true }); }); - it("is compatible with upper %PATCH versions of base app", () => { - expect(isCompatible({ extLensEngineVersion: "5.5.0", extensionApiVersion: "5.5.5" })).toBeTruthy(); + describe("when extension API version is 5.5.0", () => { + let isCompatibleExtension: IsCompatibleExtension; + + beforeEach(() => { + di.override(extensionApiVersionInjectable, () => "5.5.0"); + + isCompatibleExtension = di.inject(isCompatibleExtensionInjectable); + }); + + it("an extension specifying '5.5.0' is compatible", () => { + expect(isCompatibleExtension("5.5.0")).toBe(true); + }); + + it("an extension specifying '5.5' is compatible", () => { + expect(isCompatibleExtension("5.5")).toBe(true); + }); + + it("an extension specifying '6.0.0' is not compatible", () => { + expect(isCompatibleExtension("6.0.0")).toBe(false); + }); }); - it("is compatible with higher %MINOR version of base app", () => { - expect(isCompatible({ extLensEngineVersion: "5.5.0", extensionApiVersion: "5.6.0" })).toBeTruthy(); + describe("when extension API version is 5.5.5", () => { + let isCompatibleExtension: IsCompatibleExtension; + + beforeEach(() => { + di.override(extensionApiVersionInjectable, () => "5.5.5"); + + isCompatibleExtension = di.inject(isCompatibleExtensionInjectable); + }); + + it("an extension specifying '5.5.0' is compatible", () => { + expect(isCompatibleExtension("5.5.0")).toBe(true); + }); + + it("an extension specifying '5.5' is compatible", () => { + expect(isCompatibleExtension("5.5")).toBe(true); + }); + + it("an extension specifying '6.0.0' is not compatible", () => { + expect(isCompatibleExtension("6.0.0")).toBe(false); + }); }); - it("is not compatible with higher %MAJOR version of base app", () => { - expect(isCompatible({ extLensEngineVersion: "5.6.0", extensionApiVersion: "6.0.0" })).toBeFalsy(); // extension for lens@5 not compatible with lens@6 - expect(isCompatible({ extLensEngineVersion: "6.0.0", extensionApiVersion: "5.6.0" })).toBeFalsy(); + describe("when extension API version is 5.6.0", () => { + let isCompatibleExtension: IsCompatibleExtension; + + beforeEach(() => { + di.override(extensionApiVersionInjectable, () => "5.6.0"); + + isCompatibleExtension = di.inject(isCompatibleExtensionInjectable); + }); + + it("an extension specifying '5.5.0' is compatible", () => { + expect(isCompatibleExtension("5.5.0")).toBe(true); + }); + + it("an extension specifying '5.5' is compatible", () => { + expect(isCompatibleExtension("5.5")).toBe(true); + }); }); - it("supports short version format for manifest.engines.lens", () => { - expect(isCompatible({ extLensEngineVersion: "5.5", extensionApiVersion: "5.5.1" })).toBeTruthy(); - }); + describe("when extension API version is 6.0.0", () => { + let isCompatibleExtension: IsCompatibleExtension; - it("throws for incorrect or not supported version format", () => { - expect(() => isCompatible({ - extLensEngineVersion: ">=2.0", - extensionApiVersion: "2.0", - })).toThrow(/Invalid format/i); + beforeEach(() => { + di.override(extensionApiVersionInjectable, () => "6.0.0"); - expect(() => isCompatible({ - extLensEngineVersion: "~2.0", - extensionApiVersion: "2.0", - })).toThrow(/Invalid format/i); + isCompatibleExtension = di.inject(isCompatibleExtensionInjectable); + }); - expect(() => isCompatible({ - extLensEngineVersion: "*", - extensionApiVersion: "1.0", - })).toThrow(/Invalid format/i); + it("an extension specifying '5.5.0' is not compatible", () => { + expect(isCompatibleExtension("5.5.0")).toBe(false); + }); + + it("an extension specifying '5.5' is not compatible", () => { + expect(isCompatibleExtension("5.5")).toBe(false); + }); + + it("throws an error when the manifest lens version is invalid format", () => { + expect(() => isCompatibleExtension(">=2.0")).toThrow(/Invalid format/i); + expect(() => isCompatibleExtension("~2.0")).toThrow(/Invalid format/i); + expect(() => isCompatibleExtension("*")).toThrow(/Invalid format/i); + }); }); }); - -function isCompatible({ extLensEngineVersion = "^1.0", extensionApiVersion = "1.0" } = {}): boolean { - const extensionManifestMock = getExtensionManifestMock(extLensEngineVersion); - - return isCompatibleExtension({ extensionApiVersion })(extensionManifestMock); -} - -function getExtensionManifestMock(lensEngine = "1.0"): LensExtensionManifest { - return { - name: "some-extension", - version: "1.0", - engines: { - lens: lensEngine, - }, - }; -} diff --git a/packages/core/src/extensions/common-api/index.ts b/packages/core/src/extensions/common-api/index.ts index ddfaae5dd6..1991284a74 100644 --- a/packages/core/src/extensions/common-api/index.ts +++ b/packages/core/src/extensions/common-api/index.ts @@ -16,8 +16,14 @@ export * as Types from "./types"; export * as Proxy from "./proxy"; export type { Logger } from "../../common/logger"; -export type { LensExtension, LensExtensionManifest } from "../lens-extension"; -export type { InstalledExtension } from "../extension-discovery/extension-discovery"; +export type { LensExtension } from "../lens-extension"; +export type { + LensExtensionManifest, + InstalledExtension, + BundledLensExtensionManifest, + BaseInstalledExtension, + LensExtensionId, +} from "../../features/extensions/common/installed-extension"; export type { PackageJson } from "type-fest"; export const logger = asLegacyGlobalForExtensionApi(loggerInjectable); diff --git a/packages/core/src/extensions/extension-loader/extension-instances.injectable.ts b/packages/core/src/extensions/extension-loader/extension-instances.injectable.ts index 08e7ad4cc5..b66d2feeeb 100644 --- a/packages/core/src/extensions/extension-loader/extension-instances.injectable.ts +++ b/packages/core/src/extensions/extension-loader/extension-instances.injectable.ts @@ -4,7 +4,8 @@ */ import { getInjectable } from "@ogre-tools/injectable"; import { observable } from "mobx"; -import type { LensExtensionId, LensExtension } from "../lens-extension"; +import type { LensExtensionId } from "../common-api"; +import type { LensExtension } from "../lens-extension"; const extensionInstancesInjectable = getInjectable({ id: "extension-instances", diff --git a/packages/core/src/extensions/extension-loader/file-system-provisioner-store/ensure-hashed-directory-for-extension.test.ts b/packages/core/src/extensions/extension-loader/file-system-provisioner-store/ensure-hashed-directory-for-extension.test.ts index dab86f68b2..a31c5e42d5 100644 --- a/packages/core/src/extensions/extension-loader/file-system-provisioner-store/ensure-hashed-directory-for-extension.test.ts +++ b/packages/core/src/extensions/extension-loader/file-system-provisioner-store/ensure-hashed-directory-for-extension.test.ts @@ -7,7 +7,7 @@ import { runInAction } from "mobx"; import { getDiForUnitTesting } from "../../../main/getDiForUnitTesting"; import type { EnsureHashedDirectoryForExtension } from "./ensure-hashed-directory-for-extension.injectable"; import ensureHashedDirectoryForExtensionInjectable from "./ensure-hashed-directory-for-extension.injectable"; -import ensureDirInjectable from "../../../common/fs/ensure-dir.injectable"; +import ensureDirectoryInjectable from "../../../common/fs/ensure-directory.injectable"; import directoryForExtensionDataInjectable from "./directory-for-extension-data.injectable"; import directoryForUserDataInjectable from "../../../common/app-paths/directory-for-user-data/directory-for-user-data.injectable"; import { registeredExtensionsInjectable } from "./registered-extensions.injectable"; @@ -22,7 +22,7 @@ describe("ensure-hashed-directory-for-extension", () => { ensureDirMock = jest.fn(); - di.override(ensureDirInjectable, () => ensureDirMock); + di.override(ensureDirectoryInjectable, () => ensureDirMock); di.override(directoryForExtensionDataInjectable, () => "some-directory-for-extension-data"); di.override(directoryForUserDataInjectable, () => "/some-directory-for-user-data"); diff --git a/packages/core/src/extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store.ts b/packages/core/src/extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store.ts index 37bff649ad..ae5b0ce137 100644 --- a/packages/core/src/extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store.ts +++ b/packages/core/src/extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store.ts @@ -7,8 +7,8 @@ import type { ObservableMap } from "mobx"; import { action, makeObservable } from "mobx"; import type { BaseStoreDependencies } from "../../../common/base-store/base-store"; import { BaseStore } from "../../../common/base-store/base-store"; -import type { LensExtensionId } from "../../lens-extension"; import { toJS } from "../../../common/utils"; +import type { LensExtensionId } from "../../common-api"; import type { EnsureHashedDirectoryForExtension } from "./ensure-hashed-directory-for-extension.injectable"; interface FSProvisionModel { @@ -17,7 +17,7 @@ interface FSProvisionModel { interface Dependencies extends BaseStoreDependencies { ensureHashedDirectoryForExtension: EnsureHashedDirectoryForExtension; - registeredExtensions: ObservableMap; + readonly registeredExtensions: ObservableMap; } export class FileSystemProvisionerStore extends BaseStore { diff --git a/packages/core/src/extensions/extension-loader/file-system-provisioner-store/registered-extensions.injectable.ts b/packages/core/src/extensions/extension-loader/file-system-provisioner-store/registered-extensions.injectable.ts index 93fb7a342c..c40001b541 100644 --- a/packages/core/src/extensions/extension-loader/file-system-provisioner-store/registered-extensions.injectable.ts +++ b/packages/core/src/extensions/extension-loader/file-system-provisioner-store/registered-extensions.injectable.ts @@ -4,7 +4,7 @@ */ import { getInjectable } from "@ogre-tools/injectable"; import { observable } from "mobx"; -import type { LensExtensionId } from "../../lens-extension"; +import type { LensExtensionId } from "../../common-api"; export const registeredExtensionsInjectable = getInjectable({ id: "registered-extensions", diff --git a/packages/core/src/extensions/extension-loader/index.ts b/packages/core/src/extensions/extension-loader/index.ts deleted file mode 100644 index a1dab46d3b..0000000000 --- a/packages/core/src/extensions/extension-loader/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -export * from "./extension-loader"; diff --git a/packages/core/src/extensions/extensions-store/extensions-store.ts b/packages/core/src/extensions/extensions-store/extensions-store.ts index bdfa982d8c..f955e2647e 100644 --- a/packages/core/src/extensions/extensions-store/extensions-store.ts +++ b/packages/core/src/extensions/extensions-store/extensions-store.ts @@ -3,11 +3,11 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { LensExtensionId } from "../lens-extension"; import { action, computed, makeObservable, observable } from "mobx"; import { toJS } from "../../common/utils"; import type { BaseStoreDependencies } from "../../common/base-store/base-store"; import { BaseStore } from "../../common/base-store/base-store"; +import type { LensExtensionId } from "../common-api"; export interface LensExtensionsStoreModel { extensions: Record; diff --git a/packages/core/src/extensions/lens-extension.ts b/packages/core/src/extensions/lens-extension.ts index 2ad8c164b2..1fd867a8c1 100644 --- a/packages/core/src/extensions/lens-extension.ts +++ b/packages/core/src/extensions/lens-extension.ts @@ -3,47 +3,22 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { BundledInstalledExtension, ExternalInstalledExtension, InstalledExtension } from "./extension-discovery/extension-discovery"; import { observable } from "mobx"; import { disposer } from "../common/utils"; import type { ProtocolHandlerRegistration } from "../common/protocol-handler/registration"; -import type { PackageJson } from "type-fest"; +import assert from "assert"; +import type { BundledInstalledExtension, ExternalInstalledExtension, InstalledExtension, LensExtensionManifest } from "../features/extensions/common/installed-extension"; import type { FileSystemProvisionerStore } from "./extension-loader/file-system-provisioner-store/file-system-provisioner-store"; import type { Logger } from "../common/logger"; -import assert from "assert"; -export type LensExtensionId = string; // path to manifest (package.json) export type LensExtensionConstructor = new (ext: ExternalInstalledExtension) => LensExtension; export type BundledLensExtensionContructor = new (ext: BundledInstalledExtension) => LensExtension; -export interface BundledLensExtensionManifest extends PackageJson { - name: string; - version: string; - publishConfig?: Partial>; - - // Specify extension name used for persisting data. - // Useful if extension is renamed but the data should not be lost. - storeName?: string; -} - export interface LensExtensionDependencies { readonly fileSystemProvisionerStore: FileSystemProvisionerStore; readonly logger: Logger; } -export interface LensExtensionManifest extends BundledLensExtensionManifest { - main?: string; // path to %ext/dist/main.js - renderer?: string; // path to %ext/dist/renderer.js - /** - * Supported Lens version engine by extension could be defined in `manifest.engines.lens` - * Only MAJOR.MINOR version is taken in consideration. - */ - engines: { - lens: string; // "semver"-package format - [x: string]: string | undefined; - }; -} - export const Disposers = Symbol("disposers"); export class LensExtension { diff --git a/packages/core/src/features/extensions/common/bundled-extension-token.ts b/packages/core/src/features/extensions/common/bundled-extension-token.ts index f4116cf906..fd4b27de6d 100644 --- a/packages/core/src/features/extensions/common/bundled-extension-token.ts +++ b/packages/core/src/features/extensions/common/bundled-extension-token.ts @@ -4,7 +4,8 @@ */ import { getInjectionToken } from "@ogre-tools/injectable"; -import type { BundledLensExtensionManifest, BundledLensExtensionContructor } from "../../../extensions/lens-extension"; +import type { BundledLensExtensionContructor } from "../../../extensions/lens-extension"; +import type { BundledLensExtensionManifest } from "./installed-extension"; export interface BundledExtension { readonly manifest: BundledLensExtensionManifest; diff --git a/packages/core/src/features/extensions/common/get-installed-extension.injectable.ts b/packages/core/src/features/extensions/common/get-installed-extension.injectable.ts index 5fa8a5d2e6..304249d5b4 100644 --- a/packages/core/src/features/extensions/common/get-installed-extension.injectable.ts +++ b/packages/core/src/features/extensions/common/get-installed-extension.injectable.ts @@ -3,8 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import { getInjectable } from "@ogre-tools/injectable"; -import type { InstalledExtension } from "../../../extensions/common-api"; -import type { LensExtensionId } from "../../../extensions/lens-extension"; +import type { InstalledExtension, LensExtensionId } from "./installed-extension"; import installedExtensionsInjectable from "./installed-extensions.injectable"; export type GetInstalledExtension = (id: LensExtensionId) => InstalledExtension | undefined; diff --git a/packages/core/src/features/extensions/common/installed-extension.ts b/packages/core/src/features/extensions/common/installed-extension.ts index 20a29ee719..540bcbf1e1 100644 --- a/packages/core/src/features/extensions/common/installed-extension.ts +++ b/packages/core/src/features/extensions/common/installed-extension.ts @@ -3,20 +3,54 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { LensExtensionId, LensExtensionManifest } from "../../../extensions/lens-extension"; +import type { PackageJson } from "type-fest"; -export interface InstalledExtension { +export interface BaseInstalledExtension { readonly id: LensExtensionId; +} - readonly manifest: LensExtensionManifest; +export interface BundledInstalledExtension extends BaseInstalledExtension { + readonly manifest: BundledLensExtensionManifest; + readonly isBundled: true; + readonly isCompatible: true; + readonly isEnabled: true; +} +export interface ExternalInstalledExtension extends BaseInstalledExtension { // Absolute path to the non-symlinked source folder, // e.g. "/Users/user/.k8slens/extensions/helloworld" readonly absolutePath: string; - // Absolute to the symlinked package.json file readonly manifestPath: string; - readonly isBundled: boolean; // defined in project root's package.json + readonly manifest: LensExtensionManifest; + readonly isBundled: false; readonly isCompatible: boolean; isEnabled: boolean; } + +export type InstalledExtension = BundledInstalledExtension | ExternalInstalledExtension; + +export interface LensExtensionManifest extends BundledLensExtensionManifest { + readonly main?: string; // path to %ext/dist/main.js + readonly renderer?: string; // path to %ext/dist/renderer.js + /** + * Supported Lens version engine by extension could be defined in `manifest.engines.lens` + * Only MAJOR.MINOR version is taken in consideration. + */ + readonly engines: { + readonly lens: string; // "semver"-package format + readonly [x: string]: string | undefined; + }; +} + +export type LensExtensionId = string; // path to manifest (package.json) + +export interface BundledLensExtensionManifest extends PackageJson { + readonly name: string; + readonly version: string; + readonly publishConfig?: Partial>; + + // Specify extension name used for persisting data. + // Useful if extension is renamed but the data should not be lost. + readonly storeName?: string; +} diff --git a/packages/core/src/features/extensions/common/installed-extensions.injectable.ts b/packages/core/src/features/extensions/common/installed-extensions.injectable.ts index fc25f49c45..63a8466dea 100644 --- a/packages/core/src/features/extensions/common/installed-extensions.injectable.ts +++ b/packages/core/src/features/extensions/common/installed-extensions.injectable.ts @@ -4,8 +4,7 @@ */ import { getInjectable } from "@ogre-tools/injectable"; import { observable } from "mobx"; -import type { InstalledExtension } from "../../../extensions/common-api"; -import type { LensExtensionId } from "../../../extensions/lens-extension"; +import type { LensExtensionId, InstalledExtension } from "./installed-extension"; const installedExtensionsInjectable = getInjectable({ id: "installed-extensions", diff --git a/packages/core/src/features/extensions/common/user-extensions.injectable.ts b/packages/core/src/features/extensions/common/user-extensions.injectable.ts index 1a5033cf2a..b9667eb988 100644 --- a/packages/core/src/features/extensions/common/user-extensions.injectable.ts +++ b/packages/core/src/features/extensions/common/user-extensions.injectable.ts @@ -4,6 +4,7 @@ */ import { getInjectable } from "@ogre-tools/injectable"; import { computed } from "mobx"; +import type { ExternalInstalledExtension, LensExtensionId } from "./installed-extension"; import installedExtensionsInjectable from "./installed-extensions.injectable"; const installedUserExtensionsInjectable = getInjectable({ @@ -13,7 +14,7 @@ const installedUserExtensionsInjectable = getInjectable({ return computed(() => new Map(( installedExtensions.toJSON() - .filter(([, ext]) => !ext.isBundled) + .filter((entry): entry is [LensExtensionId, ExternalInstalledExtension] => !entry[1].isBundled) ))); }, }); diff --git a/packages/core/src/features/extensions/discovery/common/uninstall-extension.injectable.ts b/packages/core/src/features/extensions/discovery/common/uninstall-extension.injectable.ts index 41e300e8dc..d4daf0f40a 100644 --- a/packages/core/src/features/extensions/discovery/common/uninstall-extension.injectable.ts +++ b/packages/core/src/features/extensions/discovery/common/uninstall-extension.injectable.ts @@ -4,7 +4,7 @@ */ import { getInjectable } from "@ogre-tools/injectable"; import removePathInjectable from "../../../../common/fs/remove.injectable"; -import type { LensExtensionId } from "../../../../extensions/lens-extension"; +import type { LensExtensionId } from "../../common/installed-extension"; import installedExtensionsInjectable from "../../common/installed-extensions.injectable"; import extensionDiscoveryLoggerInjectable from "./logger.injectable"; import removeExtensionSymlinkByNameInjectable from "./remove-extension-symlink-by-name.injectable"; diff --git a/packages/core/src/features/extensions/discovery/main/is-compatible-extension.injectable.ts b/packages/core/src/features/extensions/discovery/main/is-compatible-extension.injectable.ts index 74aaaa9f0a..112ce65922 100644 --- a/packages/core/src/features/extensions/discovery/main/is-compatible-extension.injectable.ts +++ b/packages/core/src/features/extensions/discovery/main/is-compatible-extension.injectable.ts @@ -5,17 +5,15 @@ import { getInjectable } from "@ogre-tools/injectable"; import semver from "semver"; import extensionApiVersionInjectable from "../../../../common/vars/extension-api-version.injectable"; -import type { LensExtensionManifest } from "../../../../extensions/lens-extension"; -export type IsCompatibleExtension = (manifest: LensExtensionManifest) => boolean; +export type IsCompatibleExtension = (manifestLensEngine: string) => boolean; const isCompatibleExtensionInjectable = getInjectable({ id: "is-compatible-extension", instantiate: (di): IsCompatibleExtension => { const extensionApiVersion = di.inject(extensionApiVersionInjectable); - return (manifest: LensExtensionManifest): boolean => { - const manifestLensEngine = manifest.engines.lens; + return (manifestLensEngine) => { const validVersion = manifestLensEngine.match(/^[\^0-9]\d*\.\d+\b/); // must start from ^ or number if (!validVersion) { diff --git a/packages/core/src/features/extensions/discovery/main/load-initial-extensions.injectable.ts b/packages/core/src/features/extensions/discovery/main/load-initial-extensions.injectable.ts index 725606822d..894f9431f6 100644 --- a/packages/core/src/features/extensions/discovery/main/load-initial-extensions.injectable.ts +++ b/packages/core/src/features/extensions/discovery/main/load-initial-extensions.injectable.ts @@ -11,7 +11,7 @@ import readDirectoryInjectable from "../../../../common/fs/read-directory.inject import removePathInjectable from "../../../../common/fs/remove.injectable"; import joinPathsInjectable from "../../../../common/path/join-paths.injectable"; import { isErrnoException } from "../../../../common/utils"; -import type { InstalledExtension } from "../../../../extensions/extension-discovery/extension-discovery"; +import type { InstalledExtension } from "../../common/installed-extension"; import installedExtensionsInjectable from "../../common/installed-extensions.injectable"; import extensionsNodeModulesDirectoryPathInjectable from "../common/extension-node-modules-directory-path.injectable"; import initialDiscoveryLoadCompletedInjectable from "../common/initial-load-completed.injectable"; diff --git a/packages/core/src/features/extensions/discovery/main/load-user-extension-from-folder.injectable.ts b/packages/core/src/features/extensions/discovery/main/load-user-extension-from-folder.injectable.ts index 1fac4e7e04..5080eb132d 100644 --- a/packages/core/src/features/extensions/discovery/main/load-user-extension-from-folder.injectable.ts +++ b/packages/core/src/features/extensions/discovery/main/load-user-extension-from-folder.injectable.ts @@ -12,12 +12,11 @@ import { manifestFilename } from "../../../../common/vars"; import isProductionInjectable from "../../../../common/vars/is-production.injectable"; import isCompatibleExtensionInjectable from "./is-compatible-extension.injectable"; import extensionsStoreInjectable from "../../../../extensions/extensions-store/extensions-store.injectable"; -import type { LensExtensionManifest } from "../../../../extensions/lens-extension"; import extensionDiscoveryLoggerInjectable from "../common/logger.injectable"; import getExtensionInstallPathInjectable from "./get-extension-install-path.injectable"; -import type { InstalledExtension } from "../../common/installed-extension"; +import type { ExternalInstalledExtension, LensExtensionManifest } from "../../common/installed-extension"; -export type LoadUserExtensionFromFolder = (folderPath: string) => Promise; +export type LoadUserExtensionFromFolder = (folderPath: string) => Promise; const loadUserExtensionFromFolderInjectable = getInjectable({ id: "load-user-extension-from-folder", @@ -51,7 +50,7 @@ const loadUserExtensionFromFolderInjectable = getInjectable({ manifest, isBundled: false, isEnabled: extensionsStore.isEnabled(id), - isCompatible: isCompatibleExtension(manifest), + isCompatible: isCompatibleExtension(manifest.engines.lens), }; } catch (error) { if (isErrnoException(error) && error.code === "ENOTDIR") { diff --git a/packages/core/src/features/extensions/installation-states/common/channels.ts b/packages/core/src/features/extensions/installation-states/common/channels.ts index 41dfd30cec..bfb0d22877 100644 --- a/packages/core/src/features/extensions/installation-states/common/channels.ts +++ b/packages/core/src/features/extensions/installation-states/common/channels.ts @@ -4,7 +4,7 @@ */ import type { MessageChannel } from "../../../../common/utils/channel/message-channel-listener-injection-token"; -import type { LensExtensionId } from "../../../../extensions/lens-extension"; +import type { LensExtensionId } from "../../common/installed-extension"; export interface ExtensionInstallPhaseData { id: LensExtensionId; diff --git a/packages/core/src/features/extensions/installation-states/common/tokens.ts b/packages/core/src/features/extensions/installation-states/common/tokens.ts index d55db687fb..f58bed1b4a 100644 --- a/packages/core/src/features/extensions/installation-states/common/tokens.ts +++ b/packages/core/src/features/extensions/installation-states/common/tokens.ts @@ -4,7 +4,7 @@ */ import { getInjectionToken } from "@ogre-tools/injectable"; -import type { LensExtensionId } from "../../../../extensions/lens-extension"; +import type { LensExtensionId } from "../../common/installed-extension"; export type SetExtensionAsInstalling = (id: LensExtensionId) => void; diff --git a/packages/core/src/features/extensions/installation-states/renderer/get-phase.injectable.ts b/packages/core/src/features/extensions/installation-states/renderer/get-phase.injectable.ts index d45b16125b..ebd9e3a01b 100644 --- a/packages/core/src/features/extensions/installation-states/renderer/get-phase.injectable.ts +++ b/packages/core/src/features/extensions/installation-states/renderer/get-phase.injectable.ts @@ -3,7 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import { getInjectable } from "@ogre-tools/injectable"; -import type { LensExtensionId } from "../../../../extensions/lens-extension"; +import type { LensExtensionId } from "../../common/installed-extension"; import type { InstallationState } from "./states.injectable"; import extensionInstallationStatesInjectable from "./states.injectable"; diff --git a/packages/core/src/features/extensions/installation-states/renderer/set-as-uninstalling.injectable.ts b/packages/core/src/features/extensions/installation-states/renderer/set-as-uninstalling.injectable.ts index cf4079ae32..35765c3a2d 100644 --- a/packages/core/src/features/extensions/installation-states/renderer/set-as-uninstalling.injectable.ts +++ b/packages/core/src/features/extensions/installation-states/renderer/set-as-uninstalling.injectable.ts @@ -4,7 +4,7 @@ */ import { getInjectable } from "@ogre-tools/injectable"; -import type { LensExtensionId } from "../../../../extensions/lens-extension"; +import type { LensExtensionId } from "../../common/installed-extension"; import extensionInstallationStatesInjectable from "./states.injectable"; export type SetExtensionAsUninstalling = (id: LensExtensionId) => void; diff --git a/packages/core/src/features/extensions/installation-states/renderer/states.injectable.ts b/packages/core/src/features/extensions/installation-states/renderer/states.injectable.ts index f2125bc706..30d5f3034e 100644 --- a/packages/core/src/features/extensions/installation-states/renderer/states.injectable.ts +++ b/packages/core/src/features/extensions/installation-states/renderer/states.injectable.ts @@ -5,7 +5,7 @@ import { getInjectable } from "@ogre-tools/injectable"; import { observable } from "mobx"; -import type { LensExtensionId } from "../../../../extensions/lens-extension"; +import type { LensExtensionId } from "../../common/installed-extension"; export type InstallationState = ActiveInstallationState | "idle"; export type ActiveInstallationState = "installing" | "uninstalling"; diff --git a/packages/core/src/features/extensions/loader/common/auto-init-extensions.injectable.ts b/packages/core/src/features/extensions/loader/common/auto-init-extensions.injectable.ts index 1f70557cdf..41ebdd1eda 100644 --- a/packages/core/src/features/extensions/loader/common/auto-init-extensions.injectable.ts +++ b/packages/core/src/features/extensions/loader/common/auto-init-extensions.injectable.ts @@ -4,7 +4,7 @@ */ import { getInjectable } from "@ogre-tools/injectable"; import { reaction } from "mobx"; -import installedExtensionsInjectable from "../../common/installed-extensions.injectable"; +import installedUserExtensionsInjectable from "../../common/user-extensions.injectable"; import type { ExtensionLoading } from "./finalize-extension-loading.injectable"; import finalizeExtensionLoadingInjectable from "./finalize-extension-loading.injectable"; import loadBundledExtensionsInjectable from "./load-bundled-extensions.injectable"; @@ -16,7 +16,7 @@ export type AutoInitExtensions = () => Promise; const autoInitExtensionsInjectable = getInjectable({ id: "auto-init-extensions", instantiate: (di): AutoInitExtensions => { - const installedExtensions = di.inject(installedExtensionsInjectable); + const installedUserExtensions = di.inject(installedUserExtensionsInjectable); const logger = di.inject(extensionLoadingLoggerInjectable); const loadBundledExtensions = di.inject(loadBundledExtensionsInjectable); const loadUserExtensions = di.inject(loadUserExtensionsInjectable); @@ -27,13 +27,13 @@ const autoInitExtensionsInjectable = getInjectable({ const loadedExtensions = await finalizeExtensionLoading([ ...await loadBundledExtensions(), - ...await loadUserExtensions(installedExtensions.toJSON()), + ...await loadUserExtensions([...installedUserExtensions.get().entries()]), ]); // Setup reaction to load extensions on JSON changes - reaction(() => installedExtensions.toJSON(), installedExtensions => { + reaction(() => [...installedUserExtensions.get().entries()], installedUserExtensions => { void (async () => { - const userExtensions = await loadUserExtensions(installedExtensions); + const userExtensions = await loadUserExtensions(installedUserExtensions); await finalizeExtensionLoading(userExtensions); })(); diff --git a/packages/core/src/features/extensions/loader/common/channels.ts b/packages/core/src/features/extensions/loader/common/channels.ts index c4182a1256..c5309a2924 100644 --- a/packages/core/src/features/extensions/loader/common/channels.ts +++ b/packages/core/src/features/extensions/loader/common/channels.ts @@ -5,8 +5,7 @@ import type { MessageChannel } from "../../../../common/utils/channel/message-channel-listener-injection-token"; import type { RequestChannel } from "../../../../common/utils/channel/request-channel-listener-injection-token"; -import type { InstalledExtension } from "../../../../extensions/common-api"; -import type { LensExtensionId } from "../../../../extensions/lens-extension"; +import type { LensExtensionId, InstalledExtension } from "../../common/installed-extension"; export const loadedExtensionsChannel: RequestChannel = { id: "loaded-extensions", diff --git a/packages/core/src/features/extensions/loader/common/import-installed-extension.injectable.ts b/packages/core/src/features/extensions/loader/common/import-installed-extension.injectable.ts index ec17224b58..e6af71dc42 100644 --- a/packages/core/src/features/extensions/loader/common/import-installed-extension.injectable.ts +++ b/packages/core/src/features/extensions/loader/common/import-installed-extension.injectable.ts @@ -5,12 +5,12 @@ import { getInjectable } from "@ogre-tools/injectable"; import getDirnameOfPathInjectable from "../../../../common/path/get-dirname.injectable"; import joinPathsInjectable from "../../../../common/path/join-paths.injectable"; -import type { InstalledExtension } from "../../../../extensions/common-api"; import { extensionEntryPointNameInjectionToken } from "../../../../extensions/extension-loader/entry-point-name"; import type { LensExtensionConstructor } from "../../../../extensions/lens-extension"; +import type { ExternalInstalledExtension } from "../../common/installed-extension"; import extensionLoadingLoggerInjectable from "./logger.injectable"; -export type ImportInstalledExtension = (extension: InstalledExtension) => Promise; +export type ImportInstalledExtension = (extension: ExternalInstalledExtension) => Promise; const importInstalledExtensionInjectable = getInjectable({ id: "import-installed-extension", diff --git a/packages/core/src/features/extensions/loader/common/load-user-extensions.injectable.ts b/packages/core/src/features/extensions/loader/common/load-user-extensions.injectable.ts index b552a0ac47..c3cde1650f 100644 --- a/packages/core/src/features/extensions/loader/common/load-user-extensions.injectable.ts +++ b/packages/core/src/features/extensions/loader/common/load-user-extensions.injectable.ts @@ -4,9 +4,9 @@ */ import { getInjectable } from "@ogre-tools/injectable"; import { isDefined } from "../../../../common/utils"; -import type { ExternalInstalledExtension } from "../../../../extensions/extension-discovery/extension-discovery"; +import type { ExternalInstalledExtension, LensExtensionId } from "../../common/installed-extension"; import extensionInstancesInjectable from "../../../../extensions/extension-loader/extension-instances.injectable"; -import type { LensExtension, LensExtensionId } from "../../../../extensions/lens-extension"; +import type { LensExtension } from "../../../../extensions/lens-extension"; import importInstalledExtensionInjectable from "./import-installed-extension.injectable"; import extensionLoadingLoggerInjectable from "./logger.injectable"; import extensionsWithoutInstancesByNameInjectable from "./non-instances-by-name.injectable"; diff --git a/packages/core/src/features/extensions/loader/common/remove-instance.injectable.ts b/packages/core/src/features/extensions/loader/common/remove-instance.injectable.ts index c06b98b508..1be3bb67bc 100644 --- a/packages/core/src/features/extensions/loader/common/remove-instance.injectable.ts +++ b/packages/core/src/features/extensions/loader/common/remove-instance.injectable.ts @@ -6,7 +6,7 @@ import { getInjectable } from "@ogre-tools/injectable"; import { action } from "mobx"; import extensionInstancesInjectable from "../../../../extensions/extension-loader/extension-instances.injectable"; import extensionInjectable from "../../../../extensions/extension-loader/extension/extension.injectable"; -import type { LensExtensionId } from "../../../../extensions/lens-extension"; +import type { LensExtensionId } from "../../common/installed-extension"; import extensionLoadingLoggerInjectable from "./logger.injectable"; import extensionsWithoutInstancesByNameInjectable from "./non-instances-by-name.injectable"; diff --git a/packages/core/src/main/getDiForUnitTesting.ts b/packages/core/src/main/getDiForUnitTesting.ts index f542574832..1c5f61971c 100644 --- a/packages/core/src/main/getDiForUnitTesting.ts +++ b/packages/core/src/main/getDiForUnitTesting.ts @@ -15,9 +15,7 @@ import setupMainWindowVisibilityAfterActivationInjectable from "./electron-app/r import setupDeviceShutdownInjectable from "./electron-app/runnables/setup-device-shutdown.injectable"; import setupApplicationNameInjectable from "./electron-app/runnables/setup-application-name.injectable"; import setupRunnablesBeforeClosingOfApplicationInjectable from "./electron-app/runnables/setup-runnables-before-closing-of-application.injectable"; -import clusterFramesInjectable from "../common/cluster-frames.injectable"; -import type { ClusterFrameInfo } from "../common/cluster-frames"; -import { observable, runInAction } from "mobx"; +import { runInAction } from "mobx"; import broadcastMessageInjectable from "../common/ipc/broadcast-message.injectable"; import electronQuitAndInstallUpdateInjectable from "./electron-app/features/electron-quit-and-install-update.injectable"; import electronUpdaterIsActiveInjectable from "./electron-app/features/electron-updater-is-active.injectable"; @@ -61,8 +59,6 @@ export function getDiForUnitTesting(opts: { doGeneralOverrides?: boolean } = {}) overrideElectronFeatures(di); getOverrideFsWithFakes()(di); - di.override(clusterFramesInjectable, () => observable.map()); - di.override(broadcastMessageInjectable, () => (channel) => { throw new Error(`Tried to broadcast message to channel "${channel}" over IPC without explicit override.`); }); diff --git a/packages/core/src/main/protocol-handler/__test__/router.test.ts b/packages/core/src/main/protocol-handler/__test__/router.test.ts index ff462abd80..6226e24963 100644 --- a/packages/core/src/main/protocol-handler/__test__/router.test.ts +++ b/packages/core/src/main/protocol-handler/__test__/router.test.ts @@ -10,7 +10,7 @@ import type { LensProtocolRouterMain } from "../lens-protocol-router-main/lens-p import { getDiForUnitTesting } from "../../getDiForUnitTesting"; import lensProtocolRouterMainInjectable from "../lens-protocol-router-main/lens-protocol-router-main.injectable"; import extensionsStoreInjectable from "../../../extensions/extensions-store/extensions-store.injectable"; -import type { LensExtension, LensExtensionId } from "../../../extensions/lens-extension"; +import type { LensExtension } from "../../../extensions/lens-extension"; import type { ObservableMap } from "mobx"; import { runInAction } from "mobx"; import extensionInstancesInjectable from "../../../extensions/extension-loader/extension-instances.injectable"; @@ -24,6 +24,7 @@ import { getInjectable } from "@ogre-tools/injectable"; import type { InternalRouteRegistration } from "../../../features/deep-linking/common/internal-handler-token"; import { internalDeepLinkingRouteInjectionToken } from "../../../features/deep-linking/common/internal-handler-token"; import { LensMainExtension } from "../../../extensions/lens-main-extension"; +import type { LensExtensionId } from "../../../features/extensions/common/installed-extension"; function throwIfDefined(val: any): void { if (val != null) { diff --git a/packages/core/src/main/start-main-application/lens-window/application-window/create-lens-window.injectable.ts b/packages/core/src/main/start-main-application/lens-window/application-window/create-lens-window.injectable.ts index d2d8f344eb..92a92b879d 100644 --- a/packages/core/src/main/start-main-application/lens-window/application-window/create-lens-window.injectable.ts +++ b/packages/core/src/main/start-main-application/lens-window/application-window/create-lens-window.injectable.ts @@ -3,9 +3,9 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import { getInjectable } from "@ogre-tools/injectable"; +import type { ClusterFrameInfo } from "../../../../common/cluster-frames.injectable"; import type { ContentSource, ElectronWindowTitleBarStyle } from "./create-electron-window.injectable"; import createElectronWindowForInjectable from "./create-electron-window.injectable"; -import type { ClusterFrameInfo } from "../../../../common/cluster-frames"; export interface ElectronWindow { show: () => void; diff --git a/packages/core/src/main/utils/channel/message-to-channel.test.ts b/packages/core/src/main/utils/channel/message-to-channel.test.ts index 79174cf665..062deec14e 100644 --- a/packages/core/src/main/utils/channel/message-to-channel.test.ts +++ b/packages/core/src/main/utils/channel/message-to-channel.test.ts @@ -8,7 +8,6 @@ import clusterFramesInjectable from "../../../common/cluster-frames.injectable"; import type { MessageChannel } from "../../../common/utils/channel/message-channel-listener-injection-token"; import { sendMessageToChannelInjectionToken } from "../../../common/utils/channel/message-to-channel-injection-token"; import type { DiContainer } from "@ogre-tools/injectable"; -import type { ClusterFrameInfo } from "../../../common/cluster-frames"; describe("message-to-channel", () => { let di: DiContainer; @@ -46,7 +45,7 @@ describe("message-to-channel", () => { di.override( clusterFramesInjectable, () => - new Map([ + new Map([ [ "some-cluster-id", { frameId: 42, processId: 84 }, diff --git a/packages/core/src/renderer/components/+extensions/__tests__/extensions.test.tsx b/packages/core/src/renderer/components/+extensions/__tests__/extensions.test.tsx index 82b7d89cfe..42f4c7e10b 100644 --- a/packages/core/src/renderer/components/+extensions/__tests__/extensions.test.tsx +++ b/packages/core/src/renderer/components/+extensions/__tests__/extensions.test.tsx @@ -6,7 +6,7 @@ import "@testing-library/jest-dom/extend-expect"; import { fireEvent, screen, waitFor } from "@testing-library/react"; import React from "react"; -import type { InstalledExtension } from "../../../../extensions/extension-discovery/extension-discovery"; +import type { InstalledExtension, LensExtensionId } from "../../../../features/extensions/common/installed-extension"; import { ConfirmDialog } from "../../confirm-dialog"; import { Extensions } from "../extensions"; import { getDiForUnitTesting } from "../../../getDiForUnitTesting"; @@ -24,7 +24,6 @@ import removePathInjectable from "../../../../common/fs/remove.injectable"; import type { DownloadBinary } from "../../../../common/fetch/download-binary.injectable"; import downloadBinaryInjectable from "../../../../common/fetch/download-binary.injectable"; import currentlyInClusterFrameInjectable from "../../../routes/currently-in-cluster-frame.injectable"; -import type { LensExtensionId } from "../../../../extensions/lens-extension"; import installedExtensionsInjectable from "../../../../features/extensions/common/installed-extensions.injectable"; import initialDiscoveryLoadCompletedInjectable from "../../../../features/extensions/discovery/common/initial-load-completed.injectable"; import type { RemoveExtensionFiles } from "../../../../features/extensions/discovery/common/uninstall-extension.injectable"; diff --git a/packages/core/src/renderer/components/+extensions/attempt-install/create-temp-files-and-validate.injectable.tsx b/packages/core/src/renderer/components/+extensions/attempt-install/create-temp-files-and-validate.injectable.tsx index eb68fdec54..8934468500 100644 --- a/packages/core/src/renderer/components/+extensions/attempt-install/create-temp-files-and-validate.injectable.tsx +++ b/packages/core/src/renderer/components/+extensions/attempt-install/create-temp-files-and-validate.injectable.tsx @@ -6,7 +6,6 @@ import { getInjectable } from "@ogre-tools/injectable"; import { validatePackage } from "./validate-package"; import { getMessageFromError } from "../get-message-from-error/get-message-from-error"; import React from "react"; -import type { LensExtensionId, LensExtensionManifest } from "../../../../extensions/lens-extension"; import type { InstallRequest } from "./attempt-install.injectable"; import loggerInjectable from "../../../../common/logger.injectable"; import writeFileInjectable from "../../../../common/fs/write-file.injectable"; @@ -14,6 +13,7 @@ import joinPathsInjectable from "../../../../common/path/join-paths.injectable"; import tempDirectoryPathInjectable from "../../../../common/os/temp-directory-path.injectable"; import showErrorNotificationInjectable from "../../notifications/show-error-notification.injectable"; import extensionsNodeModulesDirectoryPathInjectable from "../../../../features/extensions/discovery/common/extension-node-modules-directory-path.injectable"; +import type { LensExtensionId, LensExtensionManifest } from "../../../../features/extensions/common/installed-extension"; export interface InstallRequestValidated { fileName: string; diff --git a/packages/core/src/renderer/components/+extensions/attempt-install/validate-package.tsx b/packages/core/src/renderer/components/+extensions/attempt-install/validate-package.tsx index 08f01c91cb..82363a5e2e 100644 --- a/packages/core/src/renderer/components/+extensions/attempt-install/validate-package.tsx +++ b/packages/core/src/renderer/components/+extensions/attempt-install/validate-package.tsx @@ -2,10 +2,10 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { LensExtensionManifest } from "../../../../extensions/lens-extension"; import { hasTypedProperty, isObject, isString, listTarEntries, readFileFromTar } from "../../../../common/utils"; import path from "path"; import { manifestFilename } from "../../../../common/vars"; +import type { LensExtensionManifest } from "../../../../features/extensions/common/installed-extension"; export async function validatePackage(filePath: string): Promise { const tarFiles = await listTarEntries(filePath); diff --git a/packages/core/src/renderer/components/+extensions/confirm-uninstall-extension.injectable.tsx b/packages/core/src/renderer/components/+extensions/confirm-uninstall-extension.injectable.tsx index fd832e8eb4..da2a2543dd 100644 --- a/packages/core/src/renderer/components/+extensions/confirm-uninstall-extension.injectable.tsx +++ b/packages/core/src/renderer/components/+extensions/confirm-uninstall-extension.injectable.tsx @@ -4,8 +4,7 @@ */ import { getInjectable } from "@ogre-tools/injectable"; import React from "react"; -import type { InstalledExtension } from "../../../extensions/extension-discovery/extension-discovery"; -import type { LensExtensionId } from "../../../extensions/lens-extension"; +import type { InstalledExtension, LensExtensionId } from "../../../features/extensions/common/installed-extension"; import { extensionDisplayName } from "../../../extensions/lens-extension"; import type { Confirm } from "../confirm-dialog/confirm.injectable"; import confirmInjectable from "../confirm-dialog/confirm.injectable"; diff --git a/packages/core/src/renderer/components/+extensions/disable-extension.injectable.ts b/packages/core/src/renderer/components/+extensions/disable-extension.injectable.ts index d6f295ea1c..2ae17e2790 100644 --- a/packages/core/src/renderer/components/+extensions/disable-extension.injectable.ts +++ b/packages/core/src/renderer/components/+extensions/disable-extension.injectable.ts @@ -4,8 +4,8 @@ */ import { getInjectable } from "@ogre-tools/injectable"; import { action } from "mobx"; -import type { LensExtensionId } from "../../../extensions/lens-extension"; import getInstalledExtensionInjectable from "../../../features/extensions/common/get-installed-extension.injectable"; +import type { LensExtensionId } from "../../../features/extensions/common/installed-extension"; export type DisableExtension = (id: LensExtensionId) => void; diff --git a/packages/core/src/renderer/components/+extensions/enable-extension.injectable.ts b/packages/core/src/renderer/components/+extensions/enable-extension.injectable.ts index 9fd77a112e..69068cccc6 100644 --- a/packages/core/src/renderer/components/+extensions/enable-extension.injectable.ts +++ b/packages/core/src/renderer/components/+extensions/enable-extension.injectable.ts @@ -4,8 +4,8 @@ */ import { getInjectable } from "@ogre-tools/injectable"; import { action } from "mobx"; -import type { LensExtensionId } from "../../../extensions/lens-extension"; import getInstalledExtensionInjectable from "../../../features/extensions/common/get-installed-extension.injectable"; +import type { LensExtensionId } from "../../../features/extensions/common/installed-extension"; export type EnableExtension = (id: LensExtensionId) => void; diff --git a/packages/core/src/renderer/components/+extensions/extensions.tsx b/packages/core/src/renderer/components/+extensions/extensions.tsx index cfcc03dffa..7a138fd000 100644 --- a/packages/core/src/renderer/components/+extensions/extensions.tsx +++ b/packages/core/src/renderer/components/+extensions/extensions.tsx @@ -14,7 +14,7 @@ import { } from "mobx"; import { disposeOnUnmount, observer } from "mobx-react"; import React from "react"; -import type { InstalledExtension } from "../../../extensions/extension-discovery/extension-discovery"; +import type { InstalledExtension, LensExtensionId } from "../../../features/extensions/common/installed-extension"; import { DropFileInput } from "../input"; import { Install } from "./install"; import { InstalledExtensions } from "./installed-extensions"; @@ -31,7 +31,6 @@ import confirmUninstallExtensionInjectable from "./confirm-uninstall-extension.i import type { InstallExtensionFromInput } from "./install-extension-from-input.injectable"; import installExtensionFromInputInjectable from "./install-extension-from-input.injectable"; import installFromSelectFileDialogInjectable from "./install-from-select-file-dialog.injectable"; -import type { LensExtensionId } from "../../../extensions/lens-extension"; import type { InstallOnDrop } from "./install-on-drop.injectable"; import installOnDropInjectable from "./install-on-drop.injectable"; import { supportedExtensionFormats } from "./supported-extension-formats"; diff --git a/packages/core/src/renderer/components/+extensions/installed-extensions.tsx b/packages/core/src/renderer/components/+extensions/installed-extensions.tsx index 8ef970c67f..450d5782df 100644 --- a/packages/core/src/renderer/components/+extensions/installed-extensions.tsx +++ b/packages/core/src/renderer/components/+extensions/installed-extensions.tsx @@ -5,7 +5,7 @@ import styles from "./installed-extensions.module.scss"; import React, { useMemo } from "react"; -import type { InstalledExtension } from "../../../extensions/extension-discovery/extension-discovery"; +import type { InstalledExtension, LensExtensionId } from "../../../features/extensions/common/installed-extension"; import { Icon } from "../icon"; import { List } from "../list/list"; import { MenuActions, MenuItem } from "../menu"; @@ -13,7 +13,6 @@ import { Spinner } from "../spinner"; import { cssNames, toJS } from "../../utils"; import { observer } from "mobx-react"; import type { Row } from "react-table"; -import type { LensExtensionId } from "../../../extensions/lens-extension"; import { withInjectables } from "@ogre-tools/injectable-react"; import type { IComputedValue } from "mobx"; import initialDiscoveryLoadCompletedInjectable from "../../../features/extensions/discovery/common/initial-load-completed.injectable"; diff --git a/packages/core/src/renderer/components/+extensions/uninstall-extension.injectable.tsx b/packages/core/src/renderer/components/+extensions/uninstall-extension.injectable.tsx index 3f4a3b036b..af563fbc95 100644 --- a/packages/core/src/renderer/components/+extensions/uninstall-extension.injectable.tsx +++ b/packages/core/src/renderer/components/+extensions/uninstall-extension.injectable.tsx @@ -4,7 +4,6 @@ */ import { getInjectable } from "@ogre-tools/injectable"; import loggerInjectable from "../../../common/logger.injectable"; -import type { LensExtensionId } from "../../../extensions/lens-extension"; import { extensionDisplayName } from "../../../extensions/lens-extension"; import React from "react"; import { when } from "mobx"; @@ -16,6 +15,7 @@ import getInstalledExtensionInjectable from "../../../features/extensions/common import removeExtensionFilesInjectable from "../../../features/extensions/discovery/common/uninstall-extension.injectable"; import clearExtensionAsInstallingInjectable from "../../../features/extensions/installation-states/renderer/clear-as-installing.injectable"; import setExtensionAsUninstallingInjectable from "../../../features/extensions/installation-states/renderer/set-as-uninstalling.injectable"; +import type { LensExtensionId } from "../../../features/extensions/common/installed-extension"; const uninstallExtensionInjectable = getInjectable({ id: "uninstall-extension",