diff --git a/.cspell.json b/.cspell.json index 0afbb2fe56b..3037dab87eb 100644 --- a/.cspell.json +++ b/.cspell.json @@ -15,6 +15,7 @@ "approveformyorg", "askar", "Askar", + "attw", "Authz", "authzn", "AWSSM", diff --git a/package.json b/package.json index c175dda0ba2..5ac95bdafe3 100644 --- a/package.json +++ b/package.json @@ -43,6 +43,7 @@ "tools:fix-pkg-npm-scope": "TS_NODE_PROJECT=tools/tsconfig.json node --experimental-json-modules --trace-deprecation --experimental-modules --abort-on-uncaught-exception --loader ts-node/esm --experimental-specifier-resolution=node ./tools/custom-checks/check-pkg-npm-scope.ts", "tools:sort-package-json": "TS_NODE_PROJECT=tools/tsconfig.json node --experimental-json-modules --trace-deprecation --experimental-modules --abort-on-uncaught-exception --loader ts-node/esm --experimental-specifier-resolution=node ./tools/sort-package-json.ts", "tools:check-missing-node-deps": "TS_NODE_PROJECT=tools/tsconfig.json node --experimental-json-modules --trace-deprecation --experimental-modules --abort-on-uncaught-exception --loader ts-node/esm --experimental-specifier-resolution=node ./tools/custom-checks/check-missing-node-deps.ts", + "tools:are-the-types-wrong": "TS_NODE_PROJECT=./tools/tsconfig.json node --trace-deprecation --experimental-modules --abort-on-uncaught-exception --loader ts-node/esm --experimental-specifier-resolution=node ./tools/custom-checks/run-attw-on-tgz.ts", "generate-api-server-config": "node ./tools/generate-api-server-config.js", "sync-ts-config": "TS_NODE_PROJECT=tools/tsconfig.json node --experimental-json-modules --loader ts-node/esm ./tools/sync-npm-deps-to-tsc-projects.ts", "start:api-server": "node ./packages/cactus-cmd-api-server/dist/lib/main/typescript/cmd/cactus-api.js --config-file=.config.json", @@ -121,6 +122,7 @@ "zod": ">=3.22.3" }, "devDependencies": { + "@arethetypeswrong/cli": "0.16.4", "@babel/parser": "7.24.7", "@babel/types": "7.24.7", "@bufbuild/buf": "1.30.0", diff --git a/tools/custom-checks/get-all-tgz-path.ts b/tools/custom-checks/get-all-tgz-path.ts new file mode 100644 index 00000000000..cefd3d4998e --- /dev/null +++ b/tools/custom-checks/get-all-tgz-path.ts @@ -0,0 +1,49 @@ +import path from "path"; +import { fileURLToPath } from "url"; +import { globby, Options as GlobbyOptions } from "globby"; +import lernaCfg from "../../lerna.json" assert { type: "json" }; + +/** + * Interface for the response of the getAllTgzPath function. + * @property {Array} relativePaths - An array of relative paths to the + * package directories. + */ + +export interface IGetAllTgzPathResponse { + readonly relativePaths: Readonly>; +} + +/** + * Asynchronous function to get all tgz filepaths in a Lerna monorepo. + * @returns {Promise} A promise that resolves to an + * object containing the arrays of relative paths to the all tgz files. + */ + +export async function getAllTgzPath(): Promise { + const TAG = "[tools/get-all-tgz-path.ts]"; + const __filename = fileURLToPath(import.meta.url); + const __dirname = path.dirname(__filename); + const SCRIPT_DIR = __dirname; + const PROJECT_DIR = path.join(SCRIPT_DIR, "../../"); + + console.log(`${TAG} SCRIPT_DIR=${SCRIPT_DIR}`); + console.log(`${TAG} PROJECT_DIR=${PROJECT_DIR}`); + + const globbyOpts: GlobbyOptions = { + cwd: PROJECT_DIR, + onlyFiles: true, + expandDirectories: false, + ignore: ["**/node_modules"], + }; + + const tgzFilesPattern = lernaCfg.packages.map( + (pkg: string) => `${pkg}/**/hyperledger-*.tgz`, + ); + + const tgzFilesRelative = await globby(tgzFilesPattern, globbyOpts); + console.log("%s Found %s tgz files.", TAG, tgzFilesRelative.length); + + return { + relativePaths: tgzFilesRelative, + }; +} diff --git a/tools/custom-checks/run-attw-on-tgz.ts b/tools/custom-checks/run-attw-on-tgz.ts new file mode 100644 index 00000000000..fdb56e9084b --- /dev/null +++ b/tools/custom-checks/run-attw-on-tgz.ts @@ -0,0 +1,106 @@ +import esMain from "es-main"; +import { getAllTgzPath } from "./get-all-tgz-path"; +import { exit } from "process"; +import { rm } from "fs"; +import { spawn } from "child_process"; + +// New function to stream subprocess output in real-time +function spawnPromise( + command: string, + args: string[], + options = {}, +): Promise { + return new Promise((resolve, reject) => { + const child = spawn(command, args, { shell: true, ...options }); + let output = ""; + + // Append stdout and stderr to the output string + child.stdout.on("data", (data) => { + process.stdout.write(data); + output += data.toString(); + }); + + child.stderr.on("data", (data) => { + process.stderr.write(data); + output += data.toString(); + }); + + child.on("close", (code) => { + if (code === 0) { + resolve(output); + } else { + const error = new Error(`Process exited with code ${code}`); + (error as any).output = output; + reject(error); + } + }); + + child.on("error", (err) => reject(err)); + }); +} + + +async function cleanUpTgzFiles(): Promise { + const TAG = "[tools/custom-checks/run-attw-on-tgz.ts]"; + console.log(`${TAG} Cleaning up existing .tgz files...`); + + const { relativePaths: tgzFilesRelative } = await getAllTgzPath(); + + for (const filePath of tgzFilesRelative) { + await rm(filePath, { recursive: true, force: true }, () => {}); + console.log(`${TAG} Deleted ${filePath}`); + } +} + +export async function runAttwOnTgz(): Promise<[boolean, string[]]> { + await cleanUpTgzFiles(); + + const TAG = "[tools/custom-checks/run-attw-on-tgz.ts]"; + await execCommand("yarn lerna exec 'npm pack'", true); + console.log(`${TAG} Packaging .tgz files`); + + console.log(`${TAG} Fetching .tgz file paths.`); + const { relativePaths: tgzFilesRelative } = await getAllTgzPath(); + + const attwFailedPackages: string[] = []; + + for (const filePath of tgzFilesRelative) { + try { + const output = await execCommand("attw", filePath); + console.log(output); + } catch (error: any) { + attwFailedPackages.push( + `ERROR ${filePath}: ${error.message}\n${error.output || ""}`, + ); + } + } + + const success = attwFailedPackages.length === 0; + return [success, attwFailedPackages]; +} + +async function execCommand( + binaryName: string, + argument: string | boolean, +): Promise { + let command; + if (typeof argument === "boolean") { + command = binaryName; + } else if (typeof argument === "string") { + command = `${binaryName} ./${argument}`; + } else { + throw new Error("Invalid arguments for execCommand"); + } + + return await spawnPromise(command, []); +} + +if (esMain(import.meta)) { + const [success, attwFailedPackages] = await runAttwOnTgz(); + if (!success) { + console.log("Types are wrong for these packages:"); + console.log(attwFailedPackages); + exit(1); + } + exit(0); +} diff --git a/tools/custom-checks/run-custom-checks.ts b/tools/custom-checks/run-custom-checks.ts index 082b430f309..0f292e30e5f 100644 --- a/tools/custom-checks/run-custom-checks.ts +++ b/tools/custom-checks/run-custom-checks.ts @@ -9,6 +9,7 @@ import { checkMissingNodeDeps, } from "./check-missing-node-deps"; import { getAllPkgDirs } from "./get-all-pkg-dirs"; +import { runAttwOnTgz } from "./run-attw-on-tgz"; export async function runCustomChecks( argv: string[], @@ -73,6 +74,12 @@ export async function runCustomChecks( overallSuccess = overallSuccess && success; } + { + const [success, errors] = await runAttwOnTgz(); + overallErrors = overallErrors.concat(errors); + overallSuccess = overallSuccess && success; + } + if (!overallSuccess) { overallErrors.forEach((it) => console.error(it)); } else { diff --git a/yarn.lock b/yarn.lock index 93697f78b5e..1bcf0ecd688 100644 --- a/yarn.lock +++ b/yarn.lock @@ -111,6 +111,13 @@ __metadata: languageName: node linkType: hard +"@andrewbranch/untar.js@npm:^1.0.3": + version: 1.0.3 + resolution: "@andrewbranch/untar.js@npm:1.0.3" + checksum: 10/a32de53839fc61af90a394cf93d4368aacd167c9c80f0b3ba0c268460942a6ce2bfe257b6d3f03986b9dcb7368f10b9dc7f66c2f94254d2662da8278454e7d12 + languageName: node + linkType: hard + "@angular-builders/common@npm:1.0.2": version: 1.0.2 resolution: "@angular-builders/common@npm:1.0.2" @@ -970,6 +977,38 @@ __metadata: languageName: node linkType: hard +"@arethetypeswrong/cli@npm:0.16.4": + version: 0.16.4 + resolution: "@arethetypeswrong/cli@npm:0.16.4" + dependencies: + "@arethetypeswrong/core": "npm:0.16.4" + chalk: "npm:^4.1.2" + cli-table3: "npm:^0.6.3" + commander: "npm:^10.0.1" + marked: "npm:^9.1.2" + marked-terminal: "npm:^7.1.0" + semver: "npm:^7.5.4" + bin: + attw: dist/index.js + checksum: 10/ec6c285e37f2c681e158d16dc77e56fd4422fdcc41fc55d018f0f0e3795c32128084d7fa436cb15a5d07f77ca1a1e0b59cc2d7e641d75c9316c93dc90c0a249a + languageName: node + linkType: hard + +"@arethetypeswrong/core@npm:0.16.4": + version: 0.16.4 + resolution: "@arethetypeswrong/core@npm:0.16.4" + dependencies: + "@andrewbranch/untar.js": "npm:^1.0.3" + cjs-module-lexer: "npm:^1.2.3" + fflate: "npm:^0.8.2" + lru-cache: "npm:^10.4.3" + semver: "npm:^7.5.4" + typescript: "npm:5.6.1-rc" + validate-npm-package-name: "npm:^5.0.0" + checksum: 10/cb392d5b69cc0c4326d8227d783e1abb1830986c4312a5f1897b827b8947060ec7dce3b607f4a91b699bb810919d02f68f523aac93d51bdecd1eb303f49c86aa + languageName: node + linkType: hard + "@aries-framework/anoncreds-rs@npm:0.5.0-alpha.71": version: 0.5.0-alpha.71 resolution: "@aries-framework/anoncreds-rs@npm:0.5.0-alpha.71" @@ -11071,6 +11110,7 @@ __metadata: version: 0.0.0-use.local resolution: "@hyperledger/cactus@workspace:." dependencies: + "@arethetypeswrong/cli": "npm:0.16.4" "@babel/parser": "npm:7.24.7" "@babel/types": "npm:7.24.7" "@bufbuild/buf": "npm:1.30.0" @@ -19624,6 +19664,15 @@ __metadata: languageName: node linkType: hard +"ansi-escapes@npm:^7.0.0": + version: 7.0.0 + resolution: "ansi-escapes@npm:7.0.0" + dependencies: + environment: "npm:^1.0.0" + checksum: 10/2d0e2345087bd7ae6bf122b9cc05ee35560d40dcc061146edcdc02bc2d7c7c50143cd12a22e69a0b5c0f62b948b7bc9a4539ee888b80f5bd33cdfd82d01a70ab + languageName: node + linkType: hard + "ansi-gray@npm:^0.1.1": version: 0.1.1 resolution: "ansi-gray@npm:0.1.1" @@ -19677,6 +19726,13 @@ __metadata: languageName: node linkType: hard +"ansi-regex@npm:^6.1.0": + version: 6.1.0 + resolution: "ansi-regex@npm:6.1.0" + checksum: 10/495834a53b0856c02acd40446f7130cb0f8284f4a39afdab20d5dc42b2e198b1196119fe887beed8f9055c4ff2055e3b2f6d4641d0be018cdfb64fedf6fc1aac + languageName: node + linkType: hard + "ansi-styles@npm:^2.2.1": version: 2.2.1 resolution: "ansi-styles@npm:2.2.1" @@ -22945,6 +23001,13 @@ __metadata: languageName: node linkType: hard +"cjs-module-lexer@npm:^1.2.3": + version: 1.4.1 + resolution: "cjs-module-lexer@npm:1.4.1" + checksum: 10/6e830a1e00a34d416949bbc1924f3e8da65cef4a6a09e2b7fa35722e2d1c34bf378d3baca987b698d1cbc3eb83e44b044039b4e82755c96f30e0f03d1d227637 + languageName: node + linkType: hard + "class-is@npm:^1.1.0": version: 1.1.0 resolution: "class-is@npm:1.1.0" @@ -23065,6 +23128,22 @@ __metadata: languageName: node linkType: hard +"cli-highlight@npm:^2.1.11": + version: 2.1.11 + resolution: "cli-highlight@npm:2.1.11" + dependencies: + chalk: "npm:^4.0.0" + highlight.js: "npm:^10.7.1" + mz: "npm:^2.4.0" + parse5: "npm:^5.1.1" + parse5-htmlparser2-tree-adapter: "npm:^6.0.0" + yargs: "npm:^16.0.0" + bin: + highlight: bin/highlight + checksum: 10/05d2b5beb8a4d3259f693517d013bf53d04ad20f470b77c3d02e051963092fae388388e3127f67d3679884a0c32cb855bf590292017c5e68c0f8d86f4b8e146e + languageName: node + linkType: hard + "cli-spinners@npm:^2.2.0": version: 2.9.0 resolution: "cli-spinners@npm:2.9.0" @@ -23107,6 +23186,19 @@ __metadata: languageName: node linkType: hard +"cli-table3@npm:^0.6.3, cli-table3@npm:^0.6.5": + version: 0.6.5 + resolution: "cli-table3@npm:0.6.5" + dependencies: + "@colors/colors": "npm:1.5.0" + string-width: "npm:^4.2.0" + dependenciesMeta: + "@colors/colors": + optional: true + checksum: 10/8dca71256f6f1367bab84c33add3f957367c7c43750a9828a4212ebd31b8df76bd7419d386e3391ac7419698a8540c25f1a474584028f35b170841cde2e055c5 + languageName: node + linkType: hard + "cli-truncate@npm:2.1.0, cli-truncate@npm:^2.1.0": version: 2.1.0 resolution: "cli-truncate@npm:2.1.0" @@ -26707,6 +26799,13 @@ __metadata: languageName: node linkType: hard +"emojilib@npm:^2.4.0": + version: 2.4.0 + resolution: "emojilib@npm:2.4.0" + checksum: 10/bef767eca49acaa881388d91bee6936ea57ae367d603d5227ff0a9da3e2d1e774a61c447e5f2f4901797d023c4b5239bc208285b6172a880d3655024a0f44980 + languageName: node + linkType: hard + "emojis-list@npm:^3.0.0": version: 3.0.0 resolution: "emojis-list@npm:3.0.0" @@ -26920,6 +27019,13 @@ __metadata: languageName: node linkType: hard +"environment@npm:^1.0.0": + version: 1.1.0 + resolution: "environment@npm:1.1.0" + checksum: 10/dd3c1b9825e7f71f1e72b03c2344799ac73f2e9ef81b78ea8b373e55db021786c6b9f3858ea43a436a2c4611052670ec0afe85bc029c384cc71165feee2f4ba6 + languageName: node + linkType: hard + "eol@npm:^0.9.1": version: 0.9.1 resolution: "eol@npm:0.9.1" @@ -29837,6 +29943,13 @@ __metadata: languageName: node linkType: hard +"fflate@npm:^0.8.2": + version: 0.8.2 + resolution: "fflate@npm:0.8.2" + checksum: 10/2bd26ba6d235d428de793c6a0cd1aaa96a06269ebd4e21b46c8fd1bd136abc631acf27e188d47c3936db090bf3e1ede11d15ce9eae9bffdc4bfe1b9dc66ca9cb + languageName: node + linkType: hard + "figures@npm:2.0.0, figures@npm:^2.0.0": version: 2.0.0 resolution: "figures@npm:2.0.0" @@ -32398,7 +32511,7 @@ __metadata: languageName: node linkType: hard -"highlight.js@npm:^10.4.1": +"highlight.js@npm:^10.4.1, highlight.js@npm:^10.7.1": version: 10.7.3 resolution: "highlight.js@npm:10.7.3" checksum: 10/db8d10a541936b058e221dbde77869664b2b45bca75d660aa98065be2cd29f3924755fbc7348213f17fd931aefb6e6597448ba6fe82afba6d8313747a91983ee @@ -38405,6 +38518,13 @@ __metadata: languageName: node linkType: hard +"lru-cache@npm:^10.4.3": + version: 10.4.3 + resolution: "lru-cache@npm:10.4.3" + checksum: 10/e6e90267360476720fa8e83cc168aa2bf0311f3f2eea20a6ba78b90a885ae72071d9db132f40fda4129c803e7dcec3a6b6a6fbb44ca90b081630b810b5d6a41a + languageName: node + linkType: hard + "lru-cache@npm:^4.0.1": version: 4.1.5 resolution: "lru-cache@npm:4.1.5" @@ -38808,6 +38928,32 @@ __metadata: languageName: node linkType: hard +"marked-terminal@npm:^7.1.0": + version: 7.2.1 + resolution: "marked-terminal@npm:7.2.1" + dependencies: + ansi-escapes: "npm:^7.0.0" + ansi-regex: "npm:^6.1.0" + chalk: "npm:^5.3.0" + cli-highlight: "npm:^2.1.11" + cli-table3: "npm:^0.6.5" + node-emoji: "npm:^2.1.3" + supports-hyperlinks: "npm:^3.1.0" + peerDependencies: + marked: ">=1 <15" + checksum: 10/126a29614a5bbe93aa3eb45c9c337ae4fb701cd6ce7bba41cb4b8339d57966829d0f22d08c990e46c9b176c7cc3ae4956921d645e5792c011bd352043560024e + languageName: node + linkType: hard + +"marked@npm:^9.1.2": + version: 9.1.6 + resolution: "marked@npm:9.1.6" + bin: + marked: bin/marked.js + checksum: 10/29d073500c70b6b53cd35a8d19f5e43df6e2819ddeca8848a31901b87b82ca0ea46a8a831920c656c69c33ad5dce4b75654c4c4ced34a67f4e4e4a31c7620cfe + languageName: node + linkType: hard + "mcl-wasm@npm:^0.7.1": version: 0.7.9 resolution: "mcl-wasm@npm:0.7.9" @@ -40463,6 +40609,18 @@ __metadata: languageName: node linkType: hard +"node-emoji@npm:^2.1.3": + version: 2.1.3 + resolution: "node-emoji@npm:2.1.3" + dependencies: + "@sindresorhus/is": "npm:^4.6.0" + char-regex: "npm:^1.0.2" + emojilib: "npm:^2.4.0" + skin-tone: "npm:^2.0.0" + checksum: 10/e9cff16f557972bc45040c26cb686961935c582af612bd41446f0094834088c1cdf7d4370a39ce5d42b71c1352a35b8d8a7a2fec53922b51abf54f36e56cc614 + languageName: node + linkType: hard + "node-fetch@npm:2.6.7, node-fetch@npm:^2.6.1, node-fetch@npm:^2.6.7": version: 2.6.7 resolution: "node-fetch@npm:2.6.7" @@ -42726,6 +42884,15 @@ __metadata: languageName: node linkType: hard +"parse5-htmlparser2-tree-adapter@npm:^6.0.0": + version: 6.0.1 + resolution: "parse5-htmlparser2-tree-adapter@npm:6.0.1" + dependencies: + parse5: "npm:^6.0.1" + checksum: 10/3400a2cd1ad450b2fe148544154f86ea53d3ed6b6eab56c78bb43b9629d3dfe9f580dffd75bbf32be134ffef645b68081fc764bf75c210f236ab9c5c8c38c252 + languageName: node + linkType: hard + "parse5-htmlparser2-tree-adapter@npm:^7.0.0": version: 7.0.0 resolution: "parse5-htmlparser2-tree-adapter@npm:7.0.0" @@ -42745,13 +42912,20 @@ __metadata: languageName: node linkType: hard -"parse5@npm:6.0.1": +"parse5@npm:6.0.1, parse5@npm:^6.0.1": version: 6.0.1 resolution: "parse5@npm:6.0.1" checksum: 10/dfb110581f62bd1425725a7c784ae022a24669bd0efc24b58c71fc731c4d868193e2ebd85b74cde2dbb965e4dcf07059b1e651adbec1b3b5267531bd132fdb75 languageName: node linkType: hard +"parse5@npm:^5.1.1": + version: 5.1.1 + resolution: "parse5@npm:5.1.1" + checksum: 10/5b509744cfe81488a33be05578df490c460690e64519fa67f0a0acb9c1bca05914e8acad17a977e2cf5964a000e43959b40024f0c243dd6595dd0cca8a32f71b + languageName: node + linkType: hard + "parse5@npm:^7.0.0": version: 7.1.2 resolution: "parse5@npm:7.1.2" @@ -48449,6 +48623,15 @@ __metadata: languageName: node linkType: hard +"skin-tone@npm:^2.0.0": + version: 2.0.0 + resolution: "skin-tone@npm:2.0.0" + dependencies: + unicode-emoji-modifier-base: "npm:^1.0.0" + checksum: 10/19de157586b8019cacc55eb25d9d640f00fc02415761f3e41a4527142970fd4e7f6af0333bc90e879858766c20a976107bb386ffd4c812289c01d51f2c8d182c + languageName: node + linkType: hard + "slash@npm:^3.0.0": version: 3.0.0 resolution: "slash@npm:3.0.0" @@ -50133,6 +50316,16 @@ __metadata: languageName: node linkType: hard +"supports-hyperlinks@npm:^3.1.0": + version: 3.1.0 + resolution: "supports-hyperlinks@npm:3.1.0" + dependencies: + has-flag: "npm:^4.0.0" + supports-color: "npm:^7.0.0" + checksum: 10/e893fb035ecd86e42c5225dc1cd24db56eb950ed77b2e8f59c7aaf2836b8b2ef276ffd11f0df88b0b12184832aa2333f875eefcb74d3c47ed2633b6b41d4be43 + languageName: node + linkType: hard + "supports-preserve-symlinks-flag@npm:^1.0.0": version: 1.0.0 resolution: "supports-preserve-symlinks-flag@npm:1.0.0" @@ -52100,6 +52293,16 @@ __metadata: languageName: node linkType: hard +"typescript@npm:5.6.1-rc": + version: 5.6.1-rc + resolution: "typescript@npm:5.6.1-rc" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10/5716659d5baf142b5c84b96209b30730a5e9dcc0202f879349f9974823f7452ec4ef3904397b6d89d861c688acdbb1dad0a449d753163519fae2ee06ea4a68be + languageName: node + linkType: hard + "typescript@npm:^4.6.4 || ^5.0.0": version: 5.2.2 resolution: "typescript@npm:5.2.2" @@ -52140,6 +52343,16 @@ __metadata: languageName: node linkType: hard +"typescript@patch:typescript@npm%3A5.6.1-rc#optional!builtin": + version: 5.6.1-rc + resolution: "typescript@patch:typescript@npm%3A5.6.1-rc#optional!builtin::version=5.6.1-rc&hash=379a07" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10/03b52131d656ea802ac2cc43209bf82e45db05d21618f149847f7693e86cb158d3140832b7d4ec32952b64a7048974e12e255f7c3ed31598a9b9d0b4ce0551d4 + languageName: node + linkType: hard + "typescript@patch:typescript@npm%3A^4.6.4 || ^5.0.0#optional!builtin": version: 5.2.2 resolution: "typescript@patch:typescript@npm%3A5.2.2#optional!builtin::version=5.2.2&hash=f3b441" @@ -52309,6 +52522,13 @@ __metadata: languageName: node linkType: hard +"unicode-emoji-modifier-base@npm:^1.0.0": + version: 1.0.0 + resolution: "unicode-emoji-modifier-base@npm:1.0.0" + checksum: 10/6e1521d35fa69493207eb8b41f8edb95985d8b3faf07c01d820a1830b5e8403e20002563e2f84683e8e962a49beccae789f0879356bf92a4ec7a4dd8e2d16fdb + languageName: node + linkType: hard + "unicode-length@npm:^2.0.2": version: 2.0.2 resolution: "unicode-length@npm:2.0.2" @@ -56833,7 +57053,7 @@ __metadata: languageName: node linkType: hard -"yargs@npm:16.2.0, yargs@npm:^16.1.1, yargs@npm:^16.2.0": +"yargs@npm:16.2.0, yargs@npm:^16.0.0, yargs@npm:^16.1.1, yargs@npm:^16.2.0": version: 16.2.0 resolution: "yargs@npm:16.2.0" dependencies: