From 8bc968c945886f2d6d091d523262f53ea0e51de2 Mon Sep 17 00:00:00 2001 From: erhant Date: Tue, 20 Feb 2024 16:13:46 +0300 Subject: [PATCH] add progress, remove wallet configs, better list (#12) --- .gitignore | 3 - README.md | 25 ++-- package.json | 9 +- src/commands/list.ts | 4 +- src/commands/pull.ts | 12 +- src/common/download.ts | 55 +++++++-- src/configurations/index.ts | 6 +- src/containers/hnsw.ts | 5 +- src/containers/hollowdb.ts | 12 +- src/index.ts | 56 ++------- yarn.lock | 223 ++++++++++++++++++++++++++++++++---- 11 files changed, 288 insertions(+), 122 deletions(-) diff --git a/.gitignore b/.gitignore index 56d3462..6397b6c 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,3 @@ bin .yarn -# wallets and such -wallet.json - diff --git a/README.md b/README.md index cd1b658..df7e785 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ ## Installation -Dria CLI requires NodeJS & Docker to be installed on your machine, and is available on NPM. It can be installed to your system with: +Dria CLI requires NodeJS (>= 18.0.0) & Docker to be installed on your machine, and is available on NPM. It can be installed to your system with: ```sh npm i -g dria-cli @@ -30,7 +30,7 @@ npm i -g dria-cli ## Usage -You can see available commands with `dria help`: +You can see available commands with `dria help`, which outputs: ```sh dria @@ -41,7 +41,6 @@ Commands: dria clear [contract] Clear local knowledge. dria fetch Fetch an existing index at the given URL directly. dria set-contract Set default contract. - dria set-wallet Set default wallet. dria config Show default configurations. dria list List all local knowledge. dria stop Stop serving knowledge. @@ -52,6 +51,12 @@ Options: -v, --verbose Show extra information [boolean] [default: false] ``` +> [!WARNING] +> +> If you are using Docker with `sudo` only, you must use the Dria CLI with `sudo` as well, since it needs access +> to Docker in the background. Otherwise, the CLI will not be able to detect your Docker engine. +> See more [here](https://docs.docker.com/engine/install/linux-postinstall/#manage-docker-as-a-non-root-user). + ### Pull Knowledge A Dria knowledge is stored on blockchain, and we can pull that knowledge to our local machine with the `pull` command: @@ -59,9 +64,6 @@ A Dria knowledge is stored on blockchain, and we can pull that knowledge to our ```sh dria pull dria pull # use configured contract - -# provide a wallet -dria pull -w ``` ### Serve Knowledge @@ -93,22 +95,19 @@ Note that the argument here is not the knowledge ID (i.e. the corresponding Arwe ### Configurations -You can set the default wallet & contract with `set-contract` and `set-wallet` commands respectively. When a contract is set by default, `[contract]` can be omitted such that the CLI will use the default one. To see the defaults: +You can set the default contract with `set-contract` command. When a contract is set by default, `[contract]` can be omitted such that the CLI will use the default one. To see the defaults: ```sh -# view configured wallet & contract +# view configurations dria config # change contract dria set-contract - -# change wallet -dria set-wallet ./path/to/wallet.json ``` -### List Pulled Knowledge +### List Knowledge -You can print out the list of contracts [pulled](#pull-knowledge) so far, along with their last modification date, with the command: +You can print out the list of contracts [pulled](#pull-knowledge) or [fetched](#fetch-knowledge) so far, along with their last modification date, with the command: ```sh dria list diff --git a/package.json b/package.json index 522b06c..8f52b84 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dria-cli", - "version": "0.0.3", + "version": "0.0.4", "description": "A command-line tool for Dria", "author": "FirstBatch Team ", "contributors": [ @@ -23,19 +23,22 @@ "dria": "yarn build && yarn start", "test": "npx jest" }, + "engines": { + "node": ">=18.0.0" + }, "dependencies": { - "adm-zip": "^0.5.10", "axios": "^1.6.7", "dockerode": "^4.0.2", "loglevel": "^1.9.1", + "unzipper": "^0.10.14", "yargs": "^17.7.2" }, "packageManager": "yarn@4.1.0", "devDependencies": { - "@types/adm-zip": "^0", "@types/dockerode": "^3.3.23", "@types/jest": "^29.5.12", "@types/node": "^20.11.16", + "@types/unzipper": "^0", "@types/yargs": "^17.0.32", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", diff --git a/src/commands/list.ts b/src/commands/list.ts index 53ba4d7..1749f74 100644 --- a/src/commands/list.ts +++ b/src/commands/list.ts @@ -16,8 +16,8 @@ export default function cmdList() { } else { for (const file of files) { const lastModified = statSync(`${constants.DRIA.DATA}/${file}`).mtime.toLocaleString(); - logger.info(`${file.split(".")[0]}\t(last modified: ${lastModified})`); + const name = file.split(".")[0]; + logger.info(`${name.padEnd(45)}\t(last modified: ${lastModified})`); } } - // logger.info(files.length ? files.map((v) => " " + v).join("\n") : " no contracts pulled yet!"); } diff --git a/src/commands/pull.ts b/src/commands/pull.ts index c9b969e..c8c5652 100644 --- a/src/commands/pull.ts +++ b/src/commands/pull.ts @@ -1,5 +1,4 @@ -import { logger, sleep } from "../common"; -import constants from "../constants"; +import { logger } from "../common"; import { hollowdbContainer, redisContainer } from "../containers"; /** @@ -12,16 +11,15 @@ import { hollowdbContainer, redisContainer } from "../containers"; * The saved `.rdb` file has the contract name, which can be used later by * Dria HNSW. * - * @param walletPath wallet required for HollowDB * @param contractId contract ID to download */ -export default async function cmdPull(walletPath: string, contractId: string) { +export default async function cmdPull(contractId: string) { logger.debug("Running Redis."); const redis = await redisContainer(contractId); await redis.start(); logger.debug("Running HollowDB."); - const hollowdb = await hollowdbContainer(walletPath, contractId); + const hollowdb = await hollowdbContainer(contractId); await hollowdb.start(); logger.info("Pulling the latest contract data."); @@ -44,14 +42,14 @@ export default async function cmdPull(walletPath: string, contractId: string) { } else { const idx = str.indexOf(targetStr); if (idx != -1) { - logger.info(str.slice(idx + targetStr.length - 1)); + logger.info(str.slice(idx + targetStr.length - 1).replace("\n", "")); } } }); } }); }); - logger.info("\nDone! Cleaning up..."); + logger.info("Done! Cleaning up..."); await hollowdb.stop(); await redis.stop(); diff --git a/src/common/download.ts b/src/common/download.ts index 295ba84..4f6cb65 100644 --- a/src/common/download.ts +++ b/src/common/download.ts @@ -1,9 +1,12 @@ -import axios from "axios"; -import AdmZip from "adm-zip"; +import Axios from "axios"; +import unzipper from "unzipper"; import constants from "../constants"; import { logger } from "."; +import { createReadStream, createWriteStream, rmSync } from "fs"; /** Download a zipped data from Arweave, unzip & extract it at a given path. + * + * Uses streaming to write request to tmp disk, and then to target folder due to large size. * * @param txid txID on Arweave * @param outDir output directory for the extraction file @@ -11,17 +14,47 @@ import { logger } from "."; export async function downloadAndUnzip(contractId: string, outDir: string) { const url = `${constants.ARWEAVE.DOWNLOAD_URL}/${contractId}`; - logger.debug("Downloading..."); - const response = await axios.get(url, { + logger.info("Downloading from", url); + + // download the file using a stream (due to large size) + const tmpPath = `/tmp/${contractId}.zip`; + const writer = createWriteStream(tmpPath); + await Axios({ + url, + method: "get", timeout: constants.ARWEAVE.DOWNLOAD_TIMEOUT, - responseType: "arraybuffer", + responseType: "stream", + // show download progress here + onDownloadProgress(progressEvent) { + if (progressEvent.total) { + const percentCompleted = ((progressEvent.loaded / progressEvent.total) * 100).toFixed(2); + logger.info(`Progress: ${percentCompleted}%`); + } + }, + }).then((response) => { + return new Promise((resolve, reject) => { + response.data.pipe(writer); + + let error: Error | null = null; + + writer.on("error", (err) => { + error = err; + writer.close(); + reject(err); + }); + + writer.on("close", () => { + if (!error) resolve(true); + // if error, we've rejected above + }); + }); }); - if (response.status !== 200) { - throw new Error(`Arweave Download failed with ${response.status}`); - } - logger.debug(`${response.data.length} bytes downloaded.`); - const zip = new AdmZip(response.data); - zip.extractAllTo(outDir, true); // overwrite existing data at path + // unzip to correct folder + // TODO: connecting axios stream to unzipper could work, but couldnt solve it yet + createReadStream(tmpPath).pipe(unzipper.Extract({ path: outDir })); logger.info("Knowledge extracted at", outDir); + + // cleanup temporary zip + rmSync(tmpPath); } diff --git a/src/configurations/index.ts b/src/configurations/index.ts index 84540c0..eaca10c 100644 --- a/src/configurations/index.ts +++ b/src/configurations/index.ts @@ -3,15 +3,12 @@ import constants from "../constants"; import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs"; export type DriaCLIConfig = { - /** Defualt Contract ID to fall-back if none is provided. */ + /** Default Contract ID to fall-back if none is provided. */ contract?: string; - /** Defualt absolute path to wallet. */ - wallet?: string; }; const defaultConfig: DriaCLIConfig = { contract: undefined, - wallet: undefined, }; const CONFIG_PATH = constants.DRIA.CONFIG; @@ -36,7 +33,6 @@ export function setConfig(args: DriaCLIConfig) { const cfg = getConfig(); if (args.contract) cfg.contract = args.contract; - if (args.wallet) cfg.wallet = args.wallet; writeFileSync(CONFIG_PATH, JSON.stringify(cfg)); } diff --git a/src/containers/hnsw.ts b/src/containers/hnsw.ts index 32b57d6..86d0d4e 100644 --- a/src/containers/hnsw.ts +++ b/src/containers/hnsw.ts @@ -4,6 +4,7 @@ import constants from "../constants"; export async function hnswContainer(contractId: string) { const portBinding = `${constants.PORTS.HNSW}/tcp`; const redisPortBinding = `${constants.PORTS.REDIS}/tcp`; + const guestDataDir = "/data"; await pullImageIfNotExists(constants.IMAGES.HNSW); await removeContainerIfExists(constants.CONTAINERS.HNSW); @@ -14,11 +15,11 @@ export async function hnswContainer(contractId: string) { Env: [ `REDIS_URL=redis://default:redispw@${constants.NETWORK.IPS.REDIS}:6379`, `CONTRACT_ID=${contractId}`, - `ROCKSDB_PATH=/data/${contractId}`, + `ROCKSDB_PATH=${guestDataDir}/${contractId}`, ], ExposedPorts: { [portBinding]: {} }, HostConfig: { - Binds: [`${constants.DRIA.DATA}:/data`], + Binds: [`${constants.DRIA.DATA}:${guestDataDir}`], PortBindings: { [portBinding]: [{ HostPort: constants.PORTS.HNSW.toString() }], [redisPortBinding]: [{ HostPort: constants.PORTS.REDIS.toString() }], diff --git a/src/containers/hollowdb.ts b/src/containers/hollowdb.ts index 1a4923f..24d2975 100644 --- a/src/containers/hollowdb.ts +++ b/src/containers/hollowdb.ts @@ -1,9 +1,10 @@ import { docker, pullImageIfNotExists, removeContainerIfExists } from "../common"; import constants from "../constants"; -export async function hollowdbContainer(walletPath: string, contractId: string) { +export async function hollowdbContainer(contractId: string) { const portBinding = `${constants.PORTS.HOLLOWDB}/tcp`; const redisPortBinding = `${constants.PORTS.REDIS}/tcp`; + const guestDataDir = "/app/data"; await pullImageIfNotExists(constants.IMAGES.HOLLOWDB); await removeContainerIfExists(constants.CONTAINERS.HOLLOWDB); @@ -13,8 +14,8 @@ export async function hollowdbContainer(walletPath: string, contractId: string) name: constants.CONTAINERS.HOLLOWDB, Env: [ `REDIS_URL=redis://default:redispw@${constants.NETWORK.IPS.REDIS}:6379`, - `ROCKSDB_PATH=/app/data/${contractId}`, - `CONTRACT_TXID=${contractId}`, + `ROCKSDB_PATH=${guestDataDir}/${contractId}`, + `CONTRACT_ID=${contractId}`, "USE_BUNDLR=true", // true if your contract uses Bundlr "USE_HTX=true", // true if your contract stores values as `hash.txid` "BUNDLR_FBS=80", // batch size for downloading bundled values from Arweave @@ -23,9 +24,8 @@ export async function hollowdbContainer(walletPath: string, contractId: string) ExposedPorts: { [portBinding]: {} }, HostConfig: { // prettier-ignore - Binds: [ - `${walletPath}:/app/config/wallet.json:ro`, - `${constants.DRIA.DATA}:/app/data` + Binds: [ + `${constants.DRIA.DATA}:${guestDataDir}` ], PortBindings: { [portBinding]: [{ HostPort: constants.PORTS.HOLLOWDB.toString() }], diff --git a/src/index.ts b/src/index.ts index 30bba85..d3c93ac 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,13 +2,12 @@ import yargs from "yargs"; import { hideBin } from "yargs/helpers"; +import { existsSync, mkdirSync } from "fs"; import commands from "./commands/"; import { checkDocker, checkNetwork, logger } from "./common"; - import { getConfig, setConfig } from "./configurations"; -import { resolve } from "path"; -import { existsSync, mkdirSync } from "fs"; import constants from "./constants"; + const config = getConfig(); const contractIdArg = { @@ -28,24 +27,6 @@ const contractIdArg = { } as const, } as const; -const walletArg = { - id: "wallet" as const, - opts: { - alias: "w", - describe: "Path to an Arweave wallet", - string: true, - default: config.wallet, - // map a given path to absolute so that Docker can use it - coerce: (path: string) => { - path = resolve(path); - if (!existsSync(path)) { - throw new Error("No wallet found at: " + path); - } - return path; - }, - } as const, -} as const; - const verboseArg = { id: "verbose" as const, opts: { @@ -69,15 +50,7 @@ const txIdArg = { } as const, } as const; -async function checkArgs( - args: { wallet?: string; contract?: string }, - checks: { wallet?: boolean; contract?: boolean; docker?: boolean }, -) { - if (checks.wallet) { - if (args.wallet === undefined) throw new Error("No wallet provided."); - if (!existsSync(args.wallet)) throw new Error("No wallet exists at: " + args.wallet); - } - +async function checkArgs(args: { contract?: string }, checks: { contract?: boolean; docker?: boolean }) { if (checks.contract) { if (args.contract === undefined) throw new Error("Contract not provided."); } @@ -98,14 +71,11 @@ yargs(hideBin(process.argv)) "pull [contract]", "Pull a knowledge to your local machine.", (yargs) => - yargs - .option(walletArg.id, walletArg.opts) - .positional(contractIdArg.id, contractIdArg.opts) - .check(async (args) => { - return await checkArgs(args, { wallet: true, contract: true, docker: true }); - }), + yargs.positional(contractIdArg.id, contractIdArg.opts).check(async (args) => { + return await checkArgs(args, { contract: true, docker: true }); + }), async (args) => { - await commands.pull(args.wallet!, args.contract!); + await commands.pull(args.contract!); }, ) @@ -153,24 +123,12 @@ yargs(hideBin(process.argv)) }, ) - .command( - "set-wallet ", - "Set default wallet.", - (yargs) => yargs.option(walletArg.id, { ...walletArg.opts, demandOption: true }), - (args) => { - setConfig({ - wallet: args.wallet, - }); - }, - ) - .command( "config", "Show default configurations.", (yargs) => yargs, () => { const cfg = getConfig(); - logger.info("Wallet: ", cfg.wallet ?? "not set."); logger.info("Contract: ", cfg.contract ?? "not set."); }, ) diff --git a/yarn.lock b/yarn.lock index 7cf4806..dc4a70b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -883,15 +883,6 @@ __metadata: languageName: node linkType: hard -"@types/adm-zip@npm:^0": - version: 0.5.5 - resolution: "@types/adm-zip@npm:0.5.5" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/4976dc61e33534ecfb7eee87e8a587db06420a4eb9f34eee9425aece82e9fdd01ddd22677ff6430c582f4d9735c7d714c71adb8f149e3511bc189501b4113631 - languageName: node - linkType: hard - "@types/babel__core@npm:^7.1.14": version: 7.20.5 resolution: "@types/babel__core@npm:7.20.5" @@ -1045,6 +1036,15 @@ __metadata: languageName: node linkType: hard +"@types/unzipper@npm:^0": + version: 0.10.9 + resolution: "@types/unzipper@npm:0.10.9" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/64b843eb362e0329997e95c9ecb8f9f990f6b6fb8d65004e00d9073670a7eae467ba400aeeb276aba7bd09234c8eb1fcca8d8b73e5a6f7a498a8accde1f7ab0c + languageName: node + linkType: hard + "@types/yargs-parser@npm:*": version: 21.0.3 resolution: "@types/yargs-parser@npm:21.0.3" @@ -1216,13 +1216,6 @@ __metadata: languageName: node linkType: hard -"adm-zip@npm:^0.5.10": - version: 0.5.10 - resolution: "adm-zip@npm:0.5.10" - checksum: 10c0/1f391a4e02940688b6ca6d4b3ea96cc82a9dbe1596671d7dbc052f9a53ed2efa6ba9ba253f032ea16e70081f22d6ddd1af2d65d6be700853cdee9c2fc925c20e - languageName: node - linkType: hard - "agent-base@npm:^7.0.2, agent-base@npm:^7.1.0": version: 7.1.0 resolution: "agent-base@npm:7.1.0" @@ -1468,6 +1461,23 @@ __metadata: languageName: node linkType: hard +"big-integer@npm:^1.6.17": + version: 1.6.52 + resolution: "big-integer@npm:1.6.52" + checksum: 10c0/9604224b4c2ab3c43c075d92da15863077a9f59e5d4205f4e7e76acd0cd47e8d469ec5e5dba8d9b32aa233951893b29329ca56ac80c20ce094b4a647a66abae0 + languageName: node + linkType: hard + +"binary@npm:~0.3.0": + version: 0.3.0 + resolution: "binary@npm:0.3.0" + dependencies: + buffers: "npm:~0.1.1" + chainsaw: "npm:~0.1.0" + checksum: 10c0/752c2c2ff9f23506b3428cc8accbfcc92fec07bf8a31a1953e9c7e2193eb5db8a67252034ab93e8adab2a1c43f3eeb3da0bacae0320e9814f3ca127942c55871 + languageName: node + linkType: hard + "bl@npm:^4.0.3": version: 4.1.0 resolution: "bl@npm:4.1.0" @@ -1479,6 +1489,13 @@ __metadata: languageName: node linkType: hard +"bluebird@npm:~3.4.1": + version: 3.4.7 + resolution: "bluebird@npm:3.4.7" + checksum: 10c0/ac7e3df09a433b985a0ba61a0be4fc23e3874bf62440ffbca2f275a8498b00c11336f1f633631f38419b2c842515473985f9c4aaa9e4c9b36105535026d94144 + languageName: node + linkType: hard + "brace-expansion@npm:^1.1.7": version: 1.1.11 resolution: "brace-expansion@npm:1.1.11" @@ -1546,6 +1563,13 @@ __metadata: languageName: node linkType: hard +"buffer-indexof-polyfill@npm:~1.0.0": + version: 1.0.2 + resolution: "buffer-indexof-polyfill@npm:1.0.2" + checksum: 10c0/b8376d5f8b2c230d02fce36762b149b6c436aa03aca5e02b934ea13ce72a7e731c785fa30fb30e9c713df5173b4f8e89856574e70ce86b2f1d94d7d90166eab0 + languageName: node + linkType: hard + "buffer@npm:^5.5.0": version: 5.7.1 resolution: "buffer@npm:5.7.1" @@ -1556,6 +1580,13 @@ __metadata: languageName: node linkType: hard +"buffers@npm:~0.1.1": + version: 0.1.1 + resolution: "buffers@npm:0.1.1" + checksum: 10c0/c7a3284ddb4f5c65431508be65535e3739215f7996aa03e5d3a3fcf03144d35ffca7d9825572e6c6c6007f5308b8553c7b2941fcf5e56fac20dedea7178f5f71 + languageName: node + linkType: hard + "buildcheck@npm:~0.0.6": version: 0.0.6 resolution: "buildcheck@npm:0.0.6" @@ -1611,6 +1642,15 @@ __metadata: languageName: node linkType: hard +"chainsaw@npm:~0.1.0": + version: 0.1.0 + resolution: "chainsaw@npm:0.1.0" + dependencies: + traverse: "npm:>=0.3.0 <0.4" + checksum: 10c0/c27b8b10fd372b07d80b3f63615ce5ecb9bb1b0be6934fe5de3bb0328f9ffad5051f206bd7a0b426b85778fee0c063a1f029fb32cc639f3b2ee38d6b39f52c5c + languageName: node + linkType: hard + "chalk@npm:^2.4.2": version: 2.4.2 resolution: "chalk@npm:2.4.2" @@ -1754,6 +1794,13 @@ __metadata: languageName: node linkType: hard +"core-util-is@npm:~1.0.0": + version: 1.0.3 + resolution: "core-util-is@npm:1.0.3" + checksum: 10c0/90a0e40abbddfd7618f8ccd63a74d88deea94e77d0e8dbbea059fa7ebebb8fbb4e2909667fe26f3a467073de1a542ebe6ae4c73a73745ac5833786759cd906c9 + languageName: node + linkType: hard + "cpu-features@npm:~0.0.9": version: 0.0.9 resolution: "cpu-features@npm:0.0.9" @@ -1897,14 +1944,13 @@ __metadata: version: 0.0.0-use.local resolution: "dria-cli@workspace:." dependencies: - "@types/adm-zip": "npm:^0" "@types/dockerode": "npm:^3.3.23" "@types/jest": "npm:^29.5.12" "@types/node": "npm:^20.11.16" + "@types/unzipper": "npm:^0" "@types/yargs": "npm:^17.0.32" "@typescript-eslint/eslint-plugin": "npm:^6.21.0" "@typescript-eslint/parser": "npm:^6.21.0" - adm-zip: "npm:^0.5.10" axios: "npm:^1.6.7" dockerode: "npm:^4.0.2" eslint: "npm:^8.56.0" @@ -1915,12 +1961,22 @@ __metadata: prettier: "npm:^3.2.5" ts-jest: "npm:^29.1.2" typescript: "npm:^5.3.3" + unzipper: "npm:^0.10.14" yargs: "npm:^17.7.2" bin: dria: ./bin/index.js languageName: unknown linkType: soft +"duplexer2@npm:~0.1.4": + version: 0.1.4 + resolution: "duplexer2@npm:0.1.4" + dependencies: + readable-stream: "npm:^2.0.2" + checksum: 10c0/0765a4cc6fe6d9615d43cc6dbccff6f8412811d89a6f6aa44828ca9422a0a469625ce023bf81cee68f52930dbedf9c5716056ff264ac886612702d134b5e39b4 + languageName: node + linkType: hard + "eastasianwidth@npm:^0.2.0": version: 0.2.0 resolution: "eastasianwidth@npm:0.2.0" @@ -2415,6 +2471,18 @@ __metadata: languageName: node linkType: hard +"fstream@npm:^1.0.12": + version: 1.0.12 + resolution: "fstream@npm:1.0.12" + dependencies: + graceful-fs: "npm:^4.1.2" + inherits: "npm:~2.0.0" + mkdirp: "npm:>=0.5 0" + rimraf: "npm:2" + checksum: 10c0/f52a0687a0649c6b93973eb7f1d5495e445fa993f797ba1af186e666b6aebe53916a8c497dce7037c74d0d4a33c56b0ab1f98f10ad71cca84ba8661110d25ee2 + languageName: node + linkType: hard + "function-bind@npm:^1.1.2": version: 1.1.2 resolution: "function-bind@npm:1.1.2" @@ -2527,7 +2595,7 @@ __metadata: languageName: node linkType: hard -"graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": +"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.2.2, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 @@ -2674,7 +2742,7 @@ __metadata: languageName: node linkType: hard -"inherits@npm:2, inherits@npm:^2.0.3, inherits@npm:^2.0.4": +"inherits@npm:2, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.0, inherits@npm:~2.0.3": version: 2.0.4 resolution: "inherits@npm:2.0.4" checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 @@ -2762,6 +2830,13 @@ __metadata: languageName: node linkType: hard +"isarray@npm:~1.0.0": + version: 1.0.0 + resolution: "isarray@npm:1.0.0" + checksum: 10c0/18b5be6669be53425f0b84098732670ed4e727e3af33bc7f948aac01782110eb9a18b3b329c5323bcdd3acdaae547ee077d3951317e7f133bff7105264b3003d + languageName: node + linkType: hard + "isexe@npm:^2.0.0": version: 2.0.0 resolution: "isexe@npm:2.0.0" @@ -3409,6 +3484,13 @@ __metadata: languageName: node linkType: hard +"listenercount@npm:~1.0.1": + version: 1.0.1 + resolution: "listenercount@npm:1.0.1" + checksum: 10c0/280c38501984f0a83272187ea472aff18a2aa3db40d8e05be5f797dc813c3d9351ae67a64e09d23d36e6061288b291c989390297db6a99674de2394c6930284c + languageName: node + linkType: hard + "locate-path@npm:^5.0.0": version: 5.0.0 resolution: "locate-path@npm:5.0.0" @@ -3582,6 +3664,13 @@ __metadata: languageName: node linkType: hard +"minimist@npm:^1.2.6": + version: 1.2.8 + resolution: "minimist@npm:1.2.8" + checksum: 10c0/19d3fcdca050087b84c2029841a093691a91259a47def2f18222f41e7645a0b7c44ef4b40e88a1e58a40c84d2ef0ee6047c55594d298146d0eb3f6b737c20ce6 + languageName: node + linkType: hard + "minipass-collect@npm:^2.0.1": version: 2.0.1 resolution: "minipass-collect@npm:2.0.1" @@ -3673,6 +3762,17 @@ __metadata: languageName: node linkType: hard +"mkdirp@npm:>=0.5 0": + version: 0.5.6 + resolution: "mkdirp@npm:0.5.6" + dependencies: + minimist: "npm:^1.2.6" + bin: + mkdirp: bin/cmd.js + checksum: 10c0/e2e2be789218807b58abced04e7b49851d9e46e88a2f9539242cc8a92c9b5c3a0b9bab360bd3014e02a140fc4fbc58e31176c408b493f8a2a6f4986bd7527b01 + languageName: node + linkType: hard + "mkdirp@npm:^1.0.3": version: 1.0.4 resolution: "mkdirp@npm:1.0.4" @@ -3996,6 +4096,13 @@ __metadata: languageName: node linkType: hard +"process-nextick-args@npm:~2.0.0": + version: 2.0.1 + resolution: "process-nextick-args@npm:2.0.1" + checksum: 10c0/bec089239487833d46b59d80327a1605e1c5287eaad770a291add7f45fda1bb5e28b38e0e061add0a1d0ee0984788ce74fa394d345eed1c420cacf392c554367 + languageName: node + linkType: hard + "promise-retry@npm:^2.0.1": version: 2.0.1 resolution: "promise-retry@npm:2.0.1" @@ -4061,6 +4168,21 @@ __metadata: languageName: node linkType: hard +"readable-stream@npm:^2.0.2, readable-stream@npm:~2.3.6": + version: 2.3.8 + resolution: "readable-stream@npm:2.3.8" + dependencies: + core-util-is: "npm:~1.0.0" + inherits: "npm:~2.0.3" + isarray: "npm:~1.0.0" + process-nextick-args: "npm:~2.0.0" + safe-buffer: "npm:~5.1.1" + string_decoder: "npm:~1.1.1" + util-deprecate: "npm:~1.0.1" + checksum: 10c0/7efdb01f3853bc35ac62ea25493567bf588773213f5f4a79f9c365e1ad13bab845ac0dae7bc946270dc40c3929483228415e92a3fc600cc7e4548992f41ee3fa + languageName: node + linkType: hard + "readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.5.0": version: 3.6.2 resolution: "readable-stream@npm:3.6.2" @@ -4149,6 +4271,17 @@ __metadata: languageName: node linkType: hard +"rimraf@npm:2": + version: 2.7.1 + resolution: "rimraf@npm:2.7.1" + dependencies: + glob: "npm:^7.1.3" + bin: + rimraf: ./bin.js + checksum: 10c0/4eef73d406c6940927479a3a9dee551e14a54faf54b31ef861250ac815172bade86cc6f7d64a4dc5e98b65e4b18a2e1c9ff3b68d296be0c748413f092bb0dd40 + languageName: node + linkType: hard + "rimraf@npm:^3.0.2": version: 3.0.2 resolution: "rimraf@npm:3.0.2" @@ -4169,6 +4302,13 @@ __metadata: languageName: node linkType: hard +"safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": + version: 5.1.2 + resolution: "safe-buffer@npm:5.1.2" + checksum: 10c0/780ba6b5d99cc9a40f7b951d47152297d0e260f0df01472a1b99d4889679a4b94a13d644f7dbc4f022572f09ae9005fa2fbb93bbbd83643316f365a3e9a45b21 + languageName: node + linkType: hard + "safe-buffer@npm:~5.2.0": version: 5.2.1 resolution: "safe-buffer@npm:5.2.1" @@ -4203,6 +4343,13 @@ __metadata: languageName: node linkType: hard +"setimmediate@npm:~1.0.4": + version: 1.0.5 + resolution: "setimmediate@npm:1.0.5" + checksum: 10c0/5bae81bfdbfbd0ce992893286d49c9693c82b1bcc00dcaaf3a09c8f428fdeacf4190c013598b81875dfac2b08a572422db7df779a99332d0fce186d15a3e4d49 + languageName: node + linkType: hard + "shebang-command@npm:^2.0.0": version: 2.0.0 resolution: "shebang-command@npm:2.0.0" @@ -4382,6 +4529,15 @@ __metadata: languageName: node linkType: hard +"string_decoder@npm:~1.1.1": + version: 1.1.1 + resolution: "string_decoder@npm:1.1.1" + dependencies: + safe-buffer: "npm:~5.1.0" + checksum: 10c0/b4f89f3a92fd101b5653ca3c99550e07bdf9e13b35037e9e2a1c7b47cec4e55e06ff3fc468e314a0b5e80bfbaf65c1ca5a84978764884ae9413bec1fc6ca924e + languageName: node + linkType: hard + "strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": version: 6.0.1 resolution: "strip-ansi@npm:6.0.1" @@ -4545,6 +4701,13 @@ __metadata: languageName: node linkType: hard +"traverse@npm:>=0.3.0 <0.4": + version: 0.3.9 + resolution: "traverse@npm:0.3.9" + checksum: 10c0/05f04ff1002f08f19b033187124764e2713186c7a7c0ad88172368df993edc4fa7580e829e252cef6b38375317b69671932ee3820381398a9e375aad3797f607 + languageName: node + linkType: hard + "ts-api-utils@npm:^1.0.1": version: 1.2.0 resolution: "ts-api-utils@npm:1.2.0" @@ -4676,6 +4839,24 @@ __metadata: languageName: node linkType: hard +"unzipper@npm:^0.10.14": + version: 0.10.14 + resolution: "unzipper@npm:0.10.14" + dependencies: + big-integer: "npm:^1.6.17" + binary: "npm:~0.3.0" + bluebird: "npm:~3.4.1" + buffer-indexof-polyfill: "npm:~1.0.0" + duplexer2: "npm:~0.1.4" + fstream: "npm:^1.0.12" + graceful-fs: "npm:^4.2.2" + listenercount: "npm:~1.0.1" + readable-stream: "npm:~2.3.6" + setimmediate: "npm:~1.0.4" + checksum: 10c0/0d9d0bdb566581534fba4ad88cbf037f3c1d9aa97fcd26ca52d30e7e198a3c6cb9e315deadc59821647c98657f233601cb9ebfc92f59228a1fe594197061760e + languageName: node + linkType: hard + "update-browserslist-db@npm:^1.0.13": version: 1.0.13 resolution: "update-browserslist-db@npm:1.0.13" @@ -4699,7 +4880,7 @@ __metadata: languageName: node linkType: hard -"util-deprecate@npm:^1.0.1": +"util-deprecate@npm:^1.0.1, util-deprecate@npm:~1.0.1": version: 1.0.2 resolution: "util-deprecate@npm:1.0.2" checksum: 10c0/41a5bdd214df2f6c3ecf8622745e4a366c4adced864bc3c833739791aeeeb1838119af7daed4ba36428114b5c67dcda034a79c882e97e43c03e66a4dd7389942