From 4808620085fc45b7fd064b293c5bb44677885b69 Mon Sep 17 00:00:00 2001 From: Alex Andreev Date: Thu, 17 Feb 2022 16:24:41 +0300 Subject: [PATCH] Introduce BundledExtensionComparer Signed-off-by: Alex Andreev --- .../extension-intall-checker.test.ts | 40 +++++++++++++++++ .../bundled-extension-comparer.ts | 2 +- .../bundled-extension-install-checker.ts | 43 +++++++++++++++++++ 3 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 src/main/extension-updater/__tests__/extension-intall-checker.test.ts create mode 100644 src/main/extension-updater/bundled-extension-install-checker.ts diff --git a/src/main/extension-updater/__tests__/extension-intall-checker.test.ts b/src/main/extension-updater/__tests__/extension-intall-checker.test.ts new file mode 100644 index 0000000000..6b6dac09a8 --- /dev/null +++ b/src/main/extension-updater/__tests__/extension-intall-checker.test.ts @@ -0,0 +1,40 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import { BundledExtensionInstallChecker } from "../bundled-extension-install-checker"; +import mockFs from "mock-fs"; + +const mockOpts = { + "some-user-data-directory": { + "some-file.tgz": "contents", + }, + "extension-updates": { + "file.txt": "text", + "node-menu-0.0.1": { + "package.json": "{\"name\": \"node-menu\", \"version\": \"0.0.1\"}", + }, + "survey-0.0.1": { + "dummyfile.text": "dummytext", + }, + }, +}; + +describe("BundledExtensionInstallChecker", () => { + afterEach(() => { + mockFs.restore(); + }); + + it("Should return false if extension's package json not found", async () => { + mockFs(mockOpts); + + const surveyInstalled = new BundledExtensionInstallChecker({ + name: "survey", + version: "0.0.1", + downloadUrl: "http://my-example-url.com/node-menu-0.0.1.tgz", + }, "./extension-updates").isUpdateAlredyInstalled(); + + expect(surveyInstalled).toBeFalsy(); + }); +}); diff --git a/src/main/extension-updater/bundled-extension-comparer.ts b/src/main/extension-updater/bundled-extension-comparer.ts index 283f7aa43c..0e44464a6f 100644 --- a/src/main/extension-updater/bundled-extension-comparer.ts +++ b/src/main/extension-updater/bundled-extension-comparer.ts @@ -7,7 +7,7 @@ import semverGt from "semver/functions/gt"; type Extensions = Record; -type ExtensionToDownload = { +export type ExtensionToDownload = { name: string; version: string; downloadUrl: string; diff --git a/src/main/extension-updater/bundled-extension-install-checker.ts b/src/main/extension-updater/bundled-extension-install-checker.ts new file mode 100644 index 0000000000..91e28cc9de --- /dev/null +++ b/src/main/extension-updater/bundled-extension-install-checker.ts @@ -0,0 +1,43 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import fs from "fs"; +import logger from "../logger"; +import type { ExtensionToDownload } from "./bundled-extension-comparer"; + +export class BundledExtensionInstallChecker { + constructor(private extension: ExtensionToDownload, private updatesFolder: string) { + } + + private getExtensionManifest() { + try { + const itemsInFolder = fs.readdirSync(this.updatesFolder); + + const directories = itemsInFolder.filter(dirOrFile => + fs.lstatSync(`${this.updatesFolder}/${dirOrFile}`).isDirectory(), + ); + + for (const dir of directories) { + const packageJson = fs.readFileSync(`${this.updatesFolder}/${dir}/package.json`, "utf-8"); + const contents: { name?: string, version?: string } = JSON.parse(packageJson); + + if (contents.name == this.extension.name) { + return contents; + } + } + } catch (err) { + logger.error(err); + + return {}; + } + + return {}; + } + + public isUpdateAlredyInstalled() { + const manifest = this.getExtensionManifest(); + + return manifest.version == this.extension.version; + } +}