1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00

Fix type errors

Signed-off-by: Sebastian Malton <sebastian@malton.name>
This commit is contained in:
Sebastian Malton 2023-02-21 12:04:06 -05:00
parent e946194582
commit 504d086bbf
43 changed files with 191 additions and 147 deletions

View File

@ -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",
},

View File

@ -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";

View File

@ -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,
},
};
}

View File

@ -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);

View File

@ -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",

View File

@ -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");

View File

@ -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<LensExtensionId, string>;
readonly registeredExtensions: ObservableMap<LensExtensionId, string>;
}
export class FileSystemProvisionerStore extends BaseStore<FSProvisionModel> {

View File

@ -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",

View File

@ -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";

View File

@ -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<LensExtensionId, LensExtensionState>;

View File

@ -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<Record<string, string>>;
// 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 {

View File

@ -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;

View File

@ -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;

View File

@ -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<Record<string, string>>;
// Specify extension name used for persisting data.
// Useful if extension is renamed but the data should not be lost.
readonly storeName?: string;
}

View File

@ -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",

View File

@ -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)
)));
},
});

View File

@ -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";

View File

@ -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) {

View File

@ -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";

View File

@ -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<InstalledExtension | null>;
export type LoadUserExtensionFromFolder = (folderPath: string) => Promise<ExternalInstalledExtension | null>;
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") {

View File

@ -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;

View File

@ -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;

View File

@ -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";

View File

@ -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;

View File

@ -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";

View File

@ -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<ExtensionLoading[]>;
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);
})();

View File

@ -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<void, [LensExtensionId, InstalledExtension][]> = {
id: "loaded-extensions",

View File

@ -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<LensExtensionConstructor | null>;
export type ImportInstalledExtension = (extension: ExternalInstalledExtension) => Promise<LensExtensionConstructor | null>;
const importInstalledExtensionInjectable = getInjectable({
id: "import-installed-extension",

View File

@ -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";

View File

@ -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";

View File

@ -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<string, ClusterFrameInfo>());
di.override(broadcastMessageInjectable, () => (channel) => {
throw new Error(`Tried to broadcast message to channel "${channel}" over IPC without explicit override.`);
});

View File

@ -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) {

View File

@ -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;

View File

@ -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<string, ClusterFrameInfo>([
new Map([
[
"some-cluster-id",
{ frameId: 42, processId: 84 },

View File

@ -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";

View File

@ -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;

View File

@ -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<LensExtensionManifest> {
const tarFiles = await listTarEntries(filePath);

View File

@ -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";

View File

@ -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;

View File

@ -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;

View File

@ -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";

View File

@ -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";

View File

@ -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",