mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
Introduce BundledExtensionComparer
Signed-off-by: Alex Andreev <alex.andreev.email@gmail.com>
This commit is contained in:
parent
c9fc95e135
commit
bf80481a3e
@ -13,66 +13,65 @@ describe("BundledExtensionParser", () => {
|
|||||||
fetchMock.reset();
|
fetchMock.reset();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("Should return empty arrays if no url passed", async () => {
|
it("Should return empty objects if no url passed", async () => {
|
||||||
const lists = await new BundledExtensionParser("5.4.0-latest12345", "").getExtensionLists();
|
const lists = await new BundledExtensionParser("5.4.0-latest12345", "").getExtensionLists();
|
||||||
|
|
||||||
expect(lists).toEqual({
|
expect(lists).toEqual({
|
||||||
release: [],
|
release: {},
|
||||||
available: [],
|
available: {},
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it("Should return empty releases array if no release json found", async () => {
|
it("Should return empty releases object if no release json found", async () => {
|
||||||
fetchMock
|
fetchMock
|
||||||
.get("http://my-example-url.com/versions.json", [ { "node-menu": "0.0.1" } ] )
|
.get("http://my-example-url.com/versions.json", { "node-menu": "0.0.1" } )
|
||||||
.get("http://my-example-url.com/5.4.0-latest12345.json", 408 );
|
.get("http://my-example-url.com/5.4.0-latest12345.json", 408 );
|
||||||
|
|
||||||
|
|
||||||
const lists = await new BundledExtensionParser("5.4.0-latest12345", "http://my-example-url.com").getExtensionLists();
|
const lists = await new BundledExtensionParser("5.4.0-latest12345", "http://my-example-url.com").getExtensionLists();
|
||||||
|
|
||||||
expect(lists).toEqual({
|
expect(lists).toEqual({
|
||||||
release: [],
|
release: {},
|
||||||
available: [{ "node-menu": "0.0.1" }],
|
available: { "node-menu": "0.0.1" },
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it("Should return empty available array if no versions json found", async () => {
|
it("Should return empty available object if no versions json found", async () => {
|
||||||
fetchMock
|
fetchMock
|
||||||
.get("http://my-example-url.com/versions.json", 408 )
|
.get("http://my-example-url.com/versions.json", 408 )
|
||||||
.get("http://my-example-url.com/5.4.0-latest12345.json", [ { "node-menu": "0.0.1" } ]);
|
.get("http://my-example-url.com/5.4.0-latest12345.json", { "node-menu": "0.0.1" });
|
||||||
|
|
||||||
|
|
||||||
const lists = await new BundledExtensionParser("5.4.0-latest12345", "http://my-example-url.com").getExtensionLists();
|
const lists = await new BundledExtensionParser("5.4.0-latest12345", "http://my-example-url.com").getExtensionLists();
|
||||||
|
|
||||||
expect(lists).toEqual({
|
expect(lists).toEqual({
|
||||||
release: [{ "node-menu": "0.0.1" }],
|
release: { "node-menu": "0.0.1" },
|
||||||
available: [],
|
available: {},
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it("Should return proper lists for both release.json and version.json files", async () => {
|
it("Should return proper lists for both release.json and version.json files", async () => {
|
||||||
fetchMock
|
fetchMock
|
||||||
.get("http://my-example-url.com/versions.json", [
|
.get("http://my-example-url.com/versions.json", {
|
||||||
{ "node-menu": "0.0.1" },
|
"node-menu": "0.0.1",
|
||||||
{ "survey": "0.1.1" },
|
"survey": "0.1.1",
|
||||||
])
|
})
|
||||||
.get("http://my-example-url.com/5.4.0-latest12345.json", [
|
.get("http://my-example-url.com/5.4.0-latest12345.json", {
|
||||||
{ "node-menu": "0.0.1" },
|
"node-menu": "0.0.1",
|
||||||
{ "survey": "0.0.1" },
|
"survey": "0.0.1",
|
||||||
]);
|
});
|
||||||
|
|
||||||
|
|
||||||
const lists = await new BundledExtensionParser("5.4.0-latest12345", "http://my-example-url.com").getExtensionLists();
|
const lists = await new BundledExtensionParser("5.4.0-latest12345", "http://my-example-url.com").getExtensionLists();
|
||||||
|
|
||||||
expect(lists).toEqual({
|
expect(lists).toEqual({
|
||||||
release: [
|
release: {
|
||||||
{ "node-menu": "0.0.1" },
|
"node-menu": "0.0.1",
|
||||||
{ "survey": "0.0.1" },
|
"survey": "0.0.1",
|
||||||
],
|
},
|
||||||
available: [
|
available: {
|
||||||
{ "node-menu": "0.0.1" },
|
"node-menu": "0.0.1",
|
||||||
{ "survey": "0.1.1" },
|
"survey": "0.1.1",
|
||||||
],
|
},
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@ -0,0 +1,78 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { BundledExtensionComparer } from "../bundled-extension-comparer";
|
||||||
|
|
||||||
|
describe("BundledExtensionComparer", () => {
|
||||||
|
it("Should return empty array if all extensions have equal versions", () => {
|
||||||
|
const releaseExtensions = {
|
||||||
|
"node-menu": "0.1.1",
|
||||||
|
"survey": "0.1.1",
|
||||||
|
};
|
||||||
|
const availableExtensions = {
|
||||||
|
"node-menu": "0.1.1",
|
||||||
|
"survey": "0.1.1",
|
||||||
|
};
|
||||||
|
|
||||||
|
const downloads = new BundledExtensionComparer(releaseExtensions, availableExtensions, "https://myurl.com").getExtensionsToDownload();
|
||||||
|
|
||||||
|
expect(downloads).toHaveLength(0);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("Should return empty array if no extensions found in release list", () => {
|
||||||
|
const availableExtensions = {
|
||||||
|
"node-menu": "0.1.1",
|
||||||
|
"survey": "0.1.1",
|
||||||
|
};
|
||||||
|
|
||||||
|
const downloads = new BundledExtensionComparer({}, availableExtensions, "https://myurl.com").getExtensionsToDownload();
|
||||||
|
|
||||||
|
expect(downloads).toHaveLength(0);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("Should return empty array if no extensions found in available list", () => {
|
||||||
|
const releaseExtensions = {
|
||||||
|
"node-menu": "0.1.1",
|
||||||
|
"survey": "0.1.1",
|
||||||
|
};
|
||||||
|
|
||||||
|
const downloads = new BundledExtensionComparer(releaseExtensions, {}, "https://myurl.com").getExtensionsToDownload();
|
||||||
|
|
||||||
|
expect(downloads).toHaveLength(0);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("Should return extensions with never versions", () => {
|
||||||
|
const releaseExtensions = {
|
||||||
|
"node-menu": "0.1.1",
|
||||||
|
"survey": "0.1.1",
|
||||||
|
};
|
||||||
|
const availableExtensions = {
|
||||||
|
"node-menu": "0.1.1",
|
||||||
|
"survey": "1.0.1",
|
||||||
|
};
|
||||||
|
|
||||||
|
const downloads = new BundledExtensionComparer(releaseExtensions, availableExtensions, "https://myurl.com").getExtensionsToDownload();
|
||||||
|
|
||||||
|
expect(downloads).toEqual([{
|
||||||
|
name: "survey",
|
||||||
|
version: "1.0.1",
|
||||||
|
downloadUrl: "https://myurl.com/survey-1.0.1.tgz",
|
||||||
|
}]);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("Should skip extensions not found in releases list", () => {
|
||||||
|
const releaseExtensions = {
|
||||||
|
"node-menu": "0.1.1",
|
||||||
|
};
|
||||||
|
const availableExtensions = {
|
||||||
|
"node-menu": "0.1.1",
|
||||||
|
"survey": "1.0.1",
|
||||||
|
};
|
||||||
|
|
||||||
|
const downloads = new BundledExtensionComparer(releaseExtensions, availableExtensions, "https://myurl.com").getExtensionsToDownload();
|
||||||
|
|
||||||
|
expect(downloads).toHaveLength(0);
|
||||||
|
});
|
||||||
|
});
|
||||||
48
src/main/extension-updater/bundled-extension-comparer.ts
Normal file
48
src/main/extension-updater/bundled-extension-comparer.ts
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
|
*/
|
||||||
|
import semverValid from "semver/functions/valid";
|
||||||
|
import semverGt from "semver/functions/gt";
|
||||||
|
|
||||||
|
type Extensions = Record<string, string>;
|
||||||
|
|
||||||
|
type ExtensionToDownload = {
|
||||||
|
name: string;
|
||||||
|
version: string;
|
||||||
|
downloadUrl: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
export class BundledExtensionComparer {
|
||||||
|
private releaseExtensions: Map<string, string>;
|
||||||
|
private availableExtensions: Map<string, string>;
|
||||||
|
|
||||||
|
constructor(releaseExtensions: Extensions, availableExtensions: Extensions, private downloadUrl: string) {
|
||||||
|
this.releaseExtensions = new Map(Object.entries(releaseExtensions));
|
||||||
|
this.availableExtensions = new Map(Object.entries(availableExtensions));
|
||||||
|
}
|
||||||
|
|
||||||
|
private getDownloadUrl(name: string, version: string) {
|
||||||
|
return `${this.downloadUrl}/${name}-${version}.tgz`;
|
||||||
|
}
|
||||||
|
|
||||||
|
public getExtensionsToDownload(): ExtensionToDownload[] {
|
||||||
|
const extensions: ExtensionToDownload[] = [];
|
||||||
|
|
||||||
|
for (const [name, version] of this.availableExtensions) {
|
||||||
|
if (!semverValid(this.releaseExtensions.get(name))) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (semverGt(version, this.releaseExtensions.get(name))) {
|
||||||
|
extensions.push({
|
||||||
|
name,
|
||||||
|
version,
|
||||||
|
downloadUrl: this.getDownloadUrl(name, version),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return extensions;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
import logger from "../logger";
|
import logger from "../logger";
|
||||||
|
|
||||||
type Extensions = Record<string, string>[];
|
type Extensions = Record<string, string>;
|
||||||
|
|
||||||
interface ExtensionList {
|
interface ExtensionList {
|
||||||
release: Extensions,
|
release: Extensions,
|
||||||
@ -30,19 +30,19 @@ export class BundledExtensionParser {
|
|||||||
return response.json();
|
return response.json();
|
||||||
}
|
}
|
||||||
|
|
||||||
return [];
|
return {};
|
||||||
}).catch(error => {
|
}).catch(error => {
|
||||||
logger.error(`[EXTENSION-PARSER]: Failed to download and parse extension list: ${error}`);
|
logger.error(`[EXTENSION-PARSER]: Failed to download and parse extension list: ${error}`);
|
||||||
|
|
||||||
return [];
|
return {};
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public async getExtensionLists(): Promise<ExtensionList> {
|
public async getExtensionLists(): Promise<ExtensionList> {
|
||||||
if (!this.url) {
|
if (!this.url) {
|
||||||
return {
|
return {
|
||||||
release: [],
|
release: {},
|
||||||
available: [],
|
available: {},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user