From 70276d0bb3400ad403cb94fd66d98102c4ac1a0c Mon Sep 17 00:00:00 2001 From: Dmytro Stebaiev Date: Thu, 11 Apr 2024 18:37:06 +0300 Subject: [PATCH 1/8] Add initial implementation --- typescript/base/src/domain/constants.ts | 1 + typescript/base/src/projects/factory.ts | 10 ++++ .../projects/ima/schain/SchainImaInstance.ts | 56 +++++++++++++++++++ .../projects/ima/schain/SchainImaProject.ts | 26 +++++++++ 4 files changed, 93 insertions(+) create mode 100644 typescript/base/src/projects/ima/schain/SchainImaInstance.ts create mode 100644 typescript/base/src/projects/ima/schain/SchainImaProject.ts diff --git a/typescript/base/src/domain/constants.ts b/typescript/base/src/domain/constants.ts index f1a372e..2599ff0 100644 --- a/typescript/base/src/domain/constants.ts +++ b/typescript/base/src/domain/constants.ts @@ -1,2 +1,3 @@ +export const PREDEPLOYED_ALIAS = "predeployed"; export const REPOSITORY_URL = "https://skalenetwork.github.io/skale-contracts/"; export const METADATA_FILENAME = "metadata.json"; diff --git a/typescript/base/src/projects/factory.ts b/typescript/base/src/projects/factory.ts index cb3d059..05281d9 100644 --- a/typescript/base/src/projects/factory.ts +++ b/typescript/base/src/projects/factory.ts @@ -4,6 +4,7 @@ import { Project } from "../project"; import { ProjectNotFoundError } from "../domain/errors/project/projectNotFoundError"; +import { SchainImaProject } from "./ima/schain/SchainImaProject"; import { SkaleAllocatorProject } from "./skale-allocator/skaleAllocatorProject"; import { SkaleManagerProject } from "./skale-manager/skaleManagerProject"; @@ -13,6 +14,10 @@ export const projects = { "name": "mainnet-ima", "path": "mainnet-ima" }, + "schainIma": { + "name": "schain-ima", + "path": "schain-ima" + }, "skaleAllocator": { "name": "skale-allocator", "path": "skale-allocator" @@ -38,6 +43,11 @@ export const createProject = network, projects.mainnetIma ); + } else if (name === projects.schainIma.name) { + return new SchainImaProject( + network, + projects.schainIma + ); } else if (name === projects.skaleAllocator.name) { return new SkaleAllocatorProject( network, diff --git a/typescript/base/src/projects/ima/schain/SchainImaInstance.ts b/typescript/base/src/projects/ima/schain/SchainImaInstance.ts new file mode 100644 index 0000000..5e4d3d4 --- /dev/null +++ b/typescript/base/src/projects/ima/schain/SchainImaInstance.ts @@ -0,0 +1,56 @@ +import { ImaInstance } from "../ImaInstance"; + + +export class SchainImaInstance extends + ImaInstance { + static PREDEPLOYED = new Map([ + [ + "CommunityLocker", + "0xD2aaa00300000000000000000000000000000000" + ], + [ + "KeyStorage", + "0xd2aaa00200000000000000000000000000000000" + ], + [ + "MessageProxyForSchain", + "0xd2AAa00100000000000000000000000000000000" + ], + [ + "ProxyAdmin", + "0xd2aAa00000000000000000000000000000000000" + ], + [ + "TokenManagerERC1155", + "0xD2aaA00900000000000000000000000000000000" + ], + [ + "TokenManagerERC20", + "0xD2aAA00500000000000000000000000000000000" + ], + [ + "TokenManagerERC721", + "0xD2aaa00600000000000000000000000000000000" + ], + [ + "TokenManagerERC721WithMetadata", + "0xd2AaA00a00000000000000000000000000000000" + ], + [ + "TokenManagerEth", + "0xd2AaA00400000000000000000000000000000000" + ], + [ + "TokenManagerLinker", + "0xD2aAA00800000000000000000000000000000000" + ] + ]); + + getContractAddress (name: string): Promise { + if (SchainImaInstance.PREDEPLOYED.has(name)) { + return Promise.resolve(SchainImaInstance.PREDEPLOYED. + get(name) as string); + } + throw new Error(`Can't get address of ${name} contract`); + } +} diff --git a/typescript/base/src/projects/ima/schain/SchainImaProject.ts b/typescript/base/src/projects/ima/schain/SchainImaProject.ts new file mode 100644 index 0000000..9a4fd24 --- /dev/null +++ b/typescript/base/src/projects/ima/schain/SchainImaProject.ts @@ -0,0 +1,26 @@ +import { ImaProject } from "../ImaProject"; +import { Instance } from "../../../instance"; +import { PREDEPLOYED_ALIAS } from "../../../domain/constants"; +import { SchainImaInstance } from "./SchainImaInstance"; + +export class SchainImaProject extends + ImaProject { + getAbiFilename (version: string) { + return `${this.metadata.name}-${version}-abi.json`; + } + + getInstance (aliasOrAddress: string) { + if (aliasOrAddress === PREDEPLOYED_ALIAS) { + return this.createInstance(SchainImaInstance.PREDEPLOYED. + get("MessageProxyForSchain")!); + } + return super.getInstance(aliasOrAddress); + } + + createInstance (address: string): Instance { + return new SchainImaInstance( + this, + address + ); + } +} From fd284f8ad30770a5fb2433555f8b19aa67db0343 Mon Sep 17 00:00:00 2001 From: Dmytro Stebaiev Date: Fri, 12 Apr 2024 17:17:06 +0300 Subject: [PATCH 2/8] Improve error handling --- typescript/base/src/project.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/typescript/base/src/project.ts b/typescript/base/src/project.ts index f77af47..4087127 100644 --- a/typescript/base/src/project.ts +++ b/typescript/base/src/project.ts @@ -33,7 +33,7 @@ export abstract class Project { } async downloadAbiFile (version: string) { - const exceptions = []; + const exceptions: string[] = []; for (const abiUrl of this.getAbiUrls(version)) { try { // Await expression should be executed only @@ -42,10 +42,10 @@ export abstract class Project { const response = await axios.get(abiUrl); return response.data as SkaleABIFile; } catch (exception) { - exceptions.push(exception); + exceptions.push(`\nDownloading from ${abiUrl} - ${exception}`); } } - throw new Error(exceptions.toString()); + throw new Error(exceptions.join("")); } getAbiUrls (version: string) { From 93568ec0243e3c2b36bb2f006b9bb816f9af725c Mon Sep 17 00:00:00 2001 From: Dmytro Stebaiev Date: Fri, 12 Apr 2024 20:02:05 +0300 Subject: [PATCH 3/8] Process PEP440 versions --- dictionary | 2 +- package.json | 3 ++ typescript/base/.eslintrc.cjs | 1 + typescript/base/package.json | 1 + typescript/base/src/instance.ts | 51 +++++++++++++++++-- .../projects/ima/schain/SchainImaInstance.ts | 3 ++ typescript/base/yarn.lock | 8 +++ yarn.lock | 12 +++++ 8 files changed, 77 insertions(+), 4 deletions(-) diff --git a/dictionary b/dictionary index 1187fd7..76852fd 160000 --- a/dictionary +++ b/dictionary @@ -1 +1 @@ -Subproject commit 1187fd7c0a2665788895da215a56906ed697bb0f +Subproject commit 76852fd21bdb6afb52820d8fac31fd8dcdb4755c diff --git a/package.json b/package.json index 8d55210..4377e62 100644 --- a/package.json +++ b/package.json @@ -15,5 +15,8 @@ "hooks": "git config core.hooksPath .githooks || true", "no-hooks": "git config core.hooksPath .git/hooks", "prepare": "yarn hooks" + }, + "dependencies": { + "semver": "^7.6.0" } } diff --git a/typescript/base/.eslintrc.cjs b/typescript/base/.eslintrc.cjs index 70a084c..896c99a 100644 --- a/typescript/base/.eslintrc.cjs +++ b/typescript/base/.eslintrc.cjs @@ -24,6 +24,7 @@ module.exports = { "error", "separate-lines" ], + "no-warning-comments": ["warn"], "object-curly-spacing": [ "error", "always" diff --git a/typescript/base/package.json b/typescript/base/package.json index 9a5d4c8..812f9fa 100644 --- a/typescript/base/package.json +++ b/typescript/base/package.json @@ -25,6 +25,7 @@ "types": "lib/index.d.ts", "version": "1.0.1", "dependencies": { + "@renovatebot/pep440": "^3.0.19", "axios": "^1.4.0" } } diff --git a/typescript/base/src/instance.ts b/typescript/base/src/instance.ts index 9e22f59..8b95402 100644 --- a/typescript/base/src/instance.ts +++ b/typescript/base/src/instance.ts @@ -1,9 +1,12 @@ +import * as semver from "semver"; import { ContractAddress, ContractName, MainContractAddress, SkaleABIFile } from "./domain/types"; +import { parse, stringify } from "@renovatebot/pep440/lib/version"; +import { Pep440Version } from "@renovatebot/pep440"; import { Project } from "./project"; export type InstanceData = { @@ -27,6 +30,40 @@ const defaultVersionAbi = [ } ]; +const processSemver = (semVersion: semver.SemVer) => { + if (!semVersion.prerelease.length) { + const defaultPrerelease = 0; + semVersion.prerelease = [ + "stable", + defaultPrerelease + ]; + } + return semVersion.format(); +}; + +const processPep440 = (pyVersion: Pep440Version) => { + const replaceMap = new Map([ + [ + "a", + "develop" + ], + [ + "b", + "beta" + ] + ]); + pyVersion.pre = pyVersion.pre.map((value: string | number) => { + if (typeof value === "string" && replaceMap.has(value)) { + return `-${replaceMap.get(value)!}.`; + } + return value; + }); + // TODO: remove any after the fix in the @renovatebot/pep440 library + // https://github.com/renovatebot/pep440/pull/555 + // eslint-disable-next-line @typescript-eslint/no-explicit-any + return stringify(pyVersion as any)!; +}; + export abstract class Instance { protected project: Project; @@ -87,9 +124,17 @@ export abstract class Instance { private async getVersion () { if (typeof this.version === "undefined") { - this.version = await this.queryVersion(); - if (!this.version.includes("-")) { - this.version = `${this.version}-stable.0`; + const rawVersion = await this.queryVersion(); + const semVersion = semver.parse(rawVersion); + if (semVersion) { + this.version = processSemver(semVersion); + } else { + const pyVersion = parse(rawVersion); + if (pyVersion) { + this.version = processPep440(pyVersion); + } else { + throw new Error(`Can't parse version ${rawVersion}`); + } } } return this.version; diff --git a/typescript/base/src/projects/ima/schain/SchainImaInstance.ts b/typescript/base/src/projects/ima/schain/SchainImaInstance.ts index 5e4d3d4..b130074 100644 --- a/typescript/base/src/projects/ima/schain/SchainImaInstance.ts +++ b/typescript/base/src/projects/ima/schain/SchainImaInstance.ts @@ -47,6 +47,9 @@ export class SchainImaInstance extends ]); getContractAddress (name: string): Promise { + if (name === "MessageProxyForSchain") { + return Promise.resolve(this.address); + } if (SchainImaInstance.PREDEPLOYED.has(name)) { return Promise.resolve(SchainImaInstance.PREDEPLOYED. get(name) as string); diff --git a/typescript/base/yarn.lock b/typescript/base/yarn.lock index 4882374..946abac 100644 --- a/typescript/base/yarn.lock +++ b/typescript/base/yarn.lock @@ -106,10 +106,18 @@ __metadata: languageName: node linkType: hard +"@renovatebot/pep440@npm:^3.0.19": + version: 3.0.19 + resolution: "@renovatebot/pep440@npm:3.0.19" + checksum: d4465f4bec8fe231ac5428c6ed1b9844508b0e0357eeb69818ce24a373faf41dbc2d2b60b2af474bf997aea918aaadb4d75ea005bfa6358deef9a5652f53d141 + languageName: node + linkType: hard + "@skalenetwork/skale-contracts@workspace:.": version: 0.0.0-use.local resolution: "@skalenetwork/skale-contracts@workspace:." dependencies: + "@renovatebot/pep440": ^3.0.19 "@tsconfig/recommended": ^1.0.2 "@types/node": ^20.2.5 "@typescript-eslint/eslint-plugin": ^6.0.0 diff --git a/yarn.lock b/yarn.lock index e652921..e7ca455 100644 --- a/yarn.lock +++ b/yarn.lock @@ -811,6 +811,7 @@ __metadata: resolution: "development@workspace:." dependencies: cspell: ^6.31.1 + semver: ^7.6.0 languageName: unknown linkType: soft @@ -1371,6 +1372,17 @@ __metadata: languageName: node linkType: hard +"semver@npm:^7.6.0": + version: 7.6.0 + resolution: "semver@npm:7.6.0" + dependencies: + lru-cache: ^6.0.0 + bin: + semver: bin/semver.js + checksum: 7427f05b70786c696640edc29fdd4bc33b2acf3bbe1740b955029044f80575fc664e1a512e4113c3af21e767154a94b4aa214bf6cd6e42a1f6dba5914e0b208c + languageName: node + linkType: hard + "signal-exit@npm:^3.0.2": version: 3.0.7 resolution: "signal-exit@npm:3.0.7" From 1e8ddf1a3440908bf94f4de330f9b0a4d2dcd1f1 Mon Sep 17 00:00:00 2001 From: Dmytro Stebaiev Date: Mon, 15 Apr 2024 15:54:41 +0300 Subject: [PATCH 4/8] Update PEP440 library --- typescript/base/package.json | 2 +- typescript/base/src/instance.ts | 5 +---- typescript/base/yarn.lock | 10 +++++----- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/typescript/base/package.json b/typescript/base/package.json index 812f9fa..b11dc37 100644 --- a/typescript/base/package.json +++ b/typescript/base/package.json @@ -25,7 +25,7 @@ "types": "lib/index.d.ts", "version": "1.0.1", "dependencies": { - "@renovatebot/pep440": "^3.0.19", + "@renovatebot/pep440": "^3.0.20", "axios": "^1.4.0" } } diff --git a/typescript/base/src/instance.ts b/typescript/base/src/instance.ts index 8b95402..58a55c7 100644 --- a/typescript/base/src/instance.ts +++ b/typescript/base/src/instance.ts @@ -58,10 +58,7 @@ const processPep440 = (pyVersion: Pep440Version) => { } return value; }); - // TODO: remove any after the fix in the @renovatebot/pep440 library - // https://github.com/renovatebot/pep440/pull/555 - // eslint-disable-next-line @typescript-eslint/no-explicit-any - return stringify(pyVersion as any)!; + return stringify(pyVersion)!; }; export abstract class Instance { diff --git a/typescript/base/yarn.lock b/typescript/base/yarn.lock index 946abac..d0f25db 100644 --- a/typescript/base/yarn.lock +++ b/typescript/base/yarn.lock @@ -106,10 +106,10 @@ __metadata: languageName: node linkType: hard -"@renovatebot/pep440@npm:^3.0.19": - version: 3.0.19 - resolution: "@renovatebot/pep440@npm:3.0.19" - checksum: d4465f4bec8fe231ac5428c6ed1b9844508b0e0357eeb69818ce24a373faf41dbc2d2b60b2af474bf997aea918aaadb4d75ea005bfa6358deef9a5652f53d141 +"@renovatebot/pep440@npm:^3.0.20": + version: 3.0.20 + resolution: "@renovatebot/pep440@npm:3.0.20" + checksum: f7014e1774bd7df0db8d08ea9aa8432a668f829f5f6233aee28dc598dc43a4011e5a65962a8d5f295b39b1bb550fd172b85ecb5bb47b8e9cd8ab5db69dabb8e0 languageName: node linkType: hard @@ -117,7 +117,7 @@ __metadata: version: 0.0.0-use.local resolution: "@skalenetwork/skale-contracts@workspace:." dependencies: - "@renovatebot/pep440": ^3.0.19 + "@renovatebot/pep440": ^3.0.20 "@tsconfig/recommended": ^1.0.2 "@types/node": ^20.2.5 "@typescript-eslint/eslint-plugin": ^6.0.0 From a2bf40fcfcc5a3b1e495b1e1dfc24f305f5be372 Mon Sep 17 00:00:00 2001 From: Dmytro Stebaiev Date: Mon, 15 Apr 2024 16:02:28 +0300 Subject: [PATCH 5/8] Update yarn.lock --- typescript/ethers-v6/yarn.lock | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/typescript/ethers-v6/yarn.lock b/typescript/ethers-v6/yarn.lock index f96c89c..b2c764e 100644 --- a/typescript/ethers-v6/yarn.lock +++ b/typescript/ethers-v6/yarn.lock @@ -127,6 +127,13 @@ __metadata: languageName: node linkType: hard +"@renovatebot/pep440@npm:^3.0.20": + version: 3.0.20 + resolution: "@renovatebot/pep440@npm:3.0.20" + checksum: f7014e1774bd7df0db8d08ea9aa8432a668f829f5f6233aee28dc598dc43a4011e5a65962a8d5f295b39b1bb550fd172b85ecb5bb47b8e9cd8ab5db69dabb8e0 + languageName: node + linkType: hard + "@skalenetwork/skale-contracts-ethers-v6@workspace:.": version: 0.0.0-use.local resolution: "@skalenetwork/skale-contracts-ethers-v6@workspace:." @@ -145,6 +152,7 @@ __metadata: version: 0.0.0-use.local resolution: "@skalenetwork/skale-contracts@portal:../base/::locator=%40skalenetwork%2Fskale-contracts-ethers-v6%40workspace%3A." dependencies: + "@renovatebot/pep440": ^3.0.20 axios: ^1.4.0 languageName: node linkType: soft From 8850387a2a71eb4ef12984dd94208cab13f72ab4 Mon Sep 17 00:00:00 2001 From: Dmytro Stebaiev Date: Mon, 15 Apr 2024 16:09:03 +0300 Subject: [PATCH 6/8] Update yarn.lock --- typescript/ethers-v5/yarn.lock | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/typescript/ethers-v5/yarn.lock b/typescript/ethers-v5/yarn.lock index 6815fd2..81c141a 100644 --- a/typescript/ethers-v5/yarn.lock +++ b/typescript/ethers-v5/yarn.lock @@ -508,6 +508,13 @@ __metadata: languageName: node linkType: hard +"@renovatebot/pep440@npm:^3.0.20": + version: 3.0.20 + resolution: "@renovatebot/pep440@npm:3.0.20" + checksum: f7014e1774bd7df0db8d08ea9aa8432a668f829f5f6233aee28dc598dc43a4011e5a65962a8d5f295b39b1bb550fd172b85ecb5bb47b8e9cd8ab5db69dabb8e0 + languageName: node + linkType: hard + "@skalenetwork/skale-contracts-ethers-v5@workspace:.": version: 0.0.0-use.local resolution: "@skalenetwork/skale-contracts-ethers-v5@workspace:." @@ -526,6 +533,7 @@ __metadata: version: 0.0.0-use.local resolution: "@skalenetwork/skale-contracts@portal:../base/::locator=%40skalenetwork%2Fskale-contracts-ethers-v5%40workspace%3A." dependencies: + "@renovatebot/pep440": ^3.0.20 axios: ^1.4.0 languageName: node linkType: soft From c7429b71985979b91ce74b2063fa72a6dad43369 Mon Sep 17 00:00:00 2001 From: Dmytro Stebaiev Date: Mon, 15 Apr 2024 16:17:04 +0300 Subject: [PATCH 7/8] Update dependencies --- package.json | 3 --- typescript/base/package.json | 3 ++- typescript/base/yarn.lock | 12 ++++++++++++ yarn.lock | 12 ------------ 4 files changed, 14 insertions(+), 16 deletions(-) diff --git a/package.json b/package.json index 4377e62..8d55210 100644 --- a/package.json +++ b/package.json @@ -15,8 +15,5 @@ "hooks": "git config core.hooksPath .githooks || true", "no-hooks": "git config core.hooksPath .git/hooks", "prepare": "yarn hooks" - }, - "dependencies": { - "semver": "^7.6.0" } } diff --git a/typescript/base/package.json b/typescript/base/package.json index b11dc37..bed09b4 100644 --- a/typescript/base/package.json +++ b/typescript/base/package.json @@ -26,6 +26,7 @@ "version": "1.0.1", "dependencies": { "@renovatebot/pep440": "^3.0.20", - "axios": "^1.4.0" + "axios": "^1.4.0", + "semver": "^7.6.0" } } diff --git a/typescript/base/yarn.lock b/typescript/base/yarn.lock index d0f25db..b0674b3 100644 --- a/typescript/base/yarn.lock +++ b/typescript/base/yarn.lock @@ -124,6 +124,7 @@ __metadata: "@typescript-eslint/parser": ^6.0.0 axios: ^1.4.0 eslint: ^8.45.0 + semver: ^7.6.0 typescript: ^5.1.6 languageName: unknown linkType: soft @@ -1171,6 +1172,17 @@ __metadata: languageName: node linkType: hard +"semver@npm:^7.6.0": + version: 7.6.0 + resolution: "semver@npm:7.6.0" + dependencies: + lru-cache: ^6.0.0 + bin: + semver: bin/semver.js + checksum: 7427f05b70786c696640edc29fdd4bc33b2acf3bbe1740b955029044f80575fc664e1a512e4113c3af21e767154a94b4aa214bf6cd6e42a1f6dba5914e0b208c + languageName: node + linkType: hard + "shebang-command@npm:^2.0.0": version: 2.0.0 resolution: "shebang-command@npm:2.0.0" diff --git a/yarn.lock b/yarn.lock index e7ca455..e652921 100644 --- a/yarn.lock +++ b/yarn.lock @@ -811,7 +811,6 @@ __metadata: resolution: "development@workspace:." dependencies: cspell: ^6.31.1 - semver: ^7.6.0 languageName: unknown linkType: soft @@ -1372,17 +1371,6 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.6.0": - version: 7.6.0 - resolution: "semver@npm:7.6.0" - dependencies: - lru-cache: ^6.0.0 - bin: - semver: bin/semver.js - checksum: 7427f05b70786c696640edc29fdd4bc33b2acf3bbe1740b955029044f80575fc664e1a512e4113c3af21e767154a94b4aa214bf6cd6e42a1f6dba5914e0b208c - languageName: node - linkType: hard - "signal-exit@npm:^3.0.2": version: 3.0.7 resolution: "signal-exit@npm:3.0.7" From 8302c74d11c92360557a87bee8ea3ecbd710aae7 Mon Sep 17 00:00:00 2001 From: Dmytro Stebaiev Date: Mon, 15 Apr 2024 16:21:29 +0300 Subject: [PATCH 8/8] Update yarn.lock --- typescript/ethers-v5/yarn.lock | 12 ++++++++++++ typescript/ethers-v6/yarn.lock | 12 ++++++++++++ 2 files changed, 24 insertions(+) diff --git a/typescript/ethers-v5/yarn.lock b/typescript/ethers-v5/yarn.lock index 81c141a..66424e9 100644 --- a/typescript/ethers-v5/yarn.lock +++ b/typescript/ethers-v5/yarn.lock @@ -535,6 +535,7 @@ __metadata: dependencies: "@renovatebot/pep440": ^3.0.20 axios: ^1.4.0 + semver: ^7.6.0 languageName: node linkType: soft @@ -1711,6 +1712,17 @@ __metadata: languageName: node linkType: hard +"semver@npm:^7.6.0": + version: 7.6.0 + resolution: "semver@npm:7.6.0" + dependencies: + lru-cache: ^6.0.0 + bin: + semver: bin/semver.js + checksum: 7427f05b70786c696640edc29fdd4bc33b2acf3bbe1740b955029044f80575fc664e1a512e4113c3af21e767154a94b4aa214bf6cd6e42a1f6dba5914e0b208c + languageName: node + linkType: hard + "shebang-command@npm:^2.0.0": version: 2.0.0 resolution: "shebang-command@npm:2.0.0" diff --git a/typescript/ethers-v6/yarn.lock b/typescript/ethers-v6/yarn.lock index b2c764e..05283d1 100644 --- a/typescript/ethers-v6/yarn.lock +++ b/typescript/ethers-v6/yarn.lock @@ -154,6 +154,7 @@ __metadata: dependencies: "@renovatebot/pep440": ^3.0.20 axios: ^1.4.0 + semver: ^7.6.0 languageName: node linkType: soft @@ -1222,6 +1223,17 @@ __metadata: languageName: node linkType: hard +"semver@npm:^7.6.0": + version: 7.6.0 + resolution: "semver@npm:7.6.0" + dependencies: + lru-cache: ^6.0.0 + bin: + semver: bin/semver.js + checksum: 7427f05b70786c696640edc29fdd4bc33b2acf3bbe1740b955029044f80575fc664e1a512e4113c3af21e767154a94b4aa214bf6cd6e42a1f6dba5914e0b208c + languageName: node + linkType: hard + "shebang-command@npm:^2.0.0": version: 2.0.0 resolution: "shebang-command@npm:2.0.0"