From a61121e5ca775672e309676cfc0a42973d165ada Mon Sep 17 00:00:00 2001 From: Alex Andreev Date: Fri, 21 Jan 2022 16:15:08 +0300 Subject: [PATCH] Add bundled extensions version checker Signed-off-by: Alex Andreev --- .../bundled-latest-version-checker.test.ts | 67 +++++++++++++++++++ .../bundled-latest-version-checker.ts | 52 ++++++++++++++ 2 files changed, 119 insertions(+) create mode 100644 src/extensions/__tests__/bundled-latest-version-checker.test.ts create mode 100644 src/extensions/bundled-latest-version-checker.ts diff --git a/src/extensions/__tests__/bundled-latest-version-checker.test.ts b/src/extensions/__tests__/bundled-latest-version-checker.test.ts new file mode 100644 index 0000000000..aedd125e30 --- /dev/null +++ b/src/extensions/__tests__/bundled-latest-version-checker.test.ts @@ -0,0 +1,67 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import type { DownloadFileOptions } from "../../renderer/utils"; +import { BundledVersionChecker } from "../bundled-latest-version-checker"; + +process.env.BUNDLED_EXTENSIONS_URL = "https://someurl.com/versions.json"; + +describe("BundledExtensionsVersionChecker", () => { + it("returns for non-bundled extensions", async () => { + const checker = new BundledVersionChecker(); + + const version = await checker.getLatestVersion({ + name: "foo", + version: "1.0.0" + }); + + expect(version).toBeNull(); + }); + + it("returns null if json file not found", async () => { + const downloadJson = (args: DownloadFileOptions) => { + expect(args).toEqual({ + url: process.env.BUNDLED_EXTENSIONS_URL, + }); + + return { promise: new Promise((resolve, reject) => { + reject({ url: process.env.BUNDLED_EXTENSIONS_URL, error: "File not found" }) + }) }; + }; + + const checker = new BundledVersionChecker(downloadJson); + + const version = await checker.getLatestVersion({ + name: "foo", + version: "1.0.0" + }, true); + + expect(version).toBeNull(); + }) + + it("returns null if extension name not found in file", async () => { + const downloadJson = (args: DownloadFileOptions) => { + expect(args).toEqual({ + url: process.env.BUNDLED_EXTENSIONS_URL, + }); + + return { promise: new Promise((resolve) => { + resolve({ + "sample-foo": "v4.4.0", + "sample-bar": "1.0.0" + }); + }) }; + }; + + const checker = new BundledVersionChecker(downloadJson); + + const version = await checker.getLatestVersion({ + name: "crd-extension", + version: "1.0.0" + }, true); + + expect(version).toBeNull(); + }); +}) \ No newline at end of file diff --git a/src/extensions/bundled-latest-version-checker.ts b/src/extensions/bundled-latest-version-checker.ts new file mode 100644 index 0000000000..dd51e6a12c --- /dev/null +++ b/src/extensions/bundled-latest-version-checker.ts @@ -0,0 +1,52 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import { SemVer } from "semver"; +import logger from "../common/logger"; +import { DownloadFileOptions, downloadJson } from "../renderer/utils"; +import type { LensExtensionManifest } from "./lens-extension"; +import type { LensExtensionLatestVersionChecker } from "./lens-extension-latest-version-checker"; + +type ExtensionName = string; +type ExtensionVersion = string; +type Versions = Record; + +export class BundledVersionChecker implements LensExtensionLatestVersionChecker { + protected downloadJson; + + constructor(downloadJsonOverride?: (args: DownloadFileOptions) => any) { + this.downloadJson = downloadJsonOverride || downloadJson; + } + + public async getLatestVersion(manifest: LensExtensionManifest, isBundled?: boolean) { + if (!isBundled) { + return null; + } + + const updateUrl = process.env.BUNDLED_EXTENSIONS_URL; + const json = await this.getJson(updateUrl); + + if (!json || json.error || !json[manifest.name]) { + logger.info(`[BUNDLED-EXTENSIONS-UPDATER]: No version found for ${manifest.name}.`); + return null; + } + + const version = json[manifest.name]; + + return { + input: `${updateUrl}/${manifest.name}-${version}.tar`, + version: new SemVer(version).version + } + } + + protected async getJson(url: string): Promise { + const { promise } = this.downloadJson({ url }); + const json = await promise.catch(() => { + // do nothing + }); + + return json; + } +} \ No newline at end of file