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:
parent
e946194582
commit
504d086bbf
@ -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",
|
||||
},
|
||||
|
||||
@ -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";
|
||||
|
||||
@ -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,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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",
|
||||
|
||||
@ -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");
|
||||
|
||||
|
||||
@ -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> {
|
||||
|
||||
@ -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",
|
||||
|
||||
@ -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";
|
||||
@ -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>;
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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",
|
||||
|
||||
@ -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)
|
||||
)));
|
||||
},
|
||||
});
|
||||
|
||||
@ -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";
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -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";
|
||||
|
||||
@ -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") {
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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";
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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";
|
||||
|
||||
@ -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);
|
||||
})();
|
||||
|
||||
@ -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",
|
||||
|
||||
@ -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",
|
||||
|
||||
@ -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";
|
||||
|
||||
@ -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";
|
||||
|
||||
|
||||
@ -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.`);
|
||||
});
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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 },
|
||||
|
||||
@ -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";
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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";
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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";
|
||||
|
||||
@ -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";
|
||||
|
||||
@ -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",
|
||||
|
||||
Loading…
Reference in New Issue
Block a user