From 4e4c13276551234b53d85fe99b8c660467816045 Mon Sep 17 00:00:00 2001 From: kinfuy Date: Wed, 22 Mar 2023 00:17:07 +0800 Subject: [PATCH] feat: gnrm test registry --- dist/gacm.js | 5 +- dist/gnrm.js | 180 ++++++++++++++++++++++--------- dist/package.json | 5 +- package.json | 2 + package/commands/gnrm/index.ts | 1 + package/commands/gnrm/useLs.ts | 14 +-- package/commands/gnrm/useTest.ts | 83 ++++++++++++++ package/gnrm.ts | 8 +- package/package.json | 1 + package/type/shell.type.ts | 4 + package/utils/getUserList.ts | 18 ++++ pnpm-lock.yaml | 70 ++++++++++++ 12 files changed, 324 insertions(+), 67 deletions(-) create mode 100644 package/commands/gnrm/useTest.ts diff --git a/dist/gacm.js b/dist/gacm.js index c87309c..7f1c2dc 100755 --- a/dist/gacm.js +++ b/dist/gacm.js @@ -130,6 +130,7 @@ var dependencies$1 = { execa: "5.1.1", kolorist: "^1.5.1", minimist: "^1.2.6", + "node-fetch": "2.6.6", prompts: "^2.4.2" }; var devDependencies = { @@ -142,6 +143,7 @@ var devDependencies = { "@types/fs-extra": "^9.0.13", "@types/gulp": "^4.0.9", "@types/node": "^17.0.21", + "@types/node-fetch": "^2.6.2", "@types/prompts": "^2.0.14", cac: "^6.7.14", changeloger: "0.1.0", @@ -223,7 +225,8 @@ var dependencies = { cac: "^6.7.14", execa: "5.1.1", kolorist: "^1.5.1", - prompts: "^2.4.2" + prompts: "^2.4.2", + "node-fetch": "2.6.6" }; var pkg = { name: name, diff --git a/dist/gnrm.js b/dist/gnrm.js index 0839d8a..755952b 100755 --- a/dist/gnrm.js +++ b/dist/gnrm.js @@ -4,17 +4,19 @@ var cac = require('cac'); var kolorist = require('kolorist'); var prompts = require('prompts'); -var path = require('path'); var fs = require('fs'); +var path = require('path'); require('child_process'); require('process'); var execa = require('execa'); +var fetch = require('node-fetch'); function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } var cac__default = /*#__PURE__*/_interopDefaultLegacy(cac); var prompts__default = /*#__PURE__*/_interopDefaultLegacy(prompts); var execa__default = /*#__PURE__*/_interopDefaultLegacy(execa); +var fetch__default = /*#__PURE__*/_interopDefaultLegacy(fetch); var name$1 = "gacm"; var version$1 = "1.2.8"; @@ -37,7 +39,8 @@ var dependencies$1 = { cac: "^6.7.14", execa: "5.1.1", kolorist: "^1.5.1", - prompts: "^2.4.2" + prompts: "^2.4.2", + "node-fetch": "2.6.6" }; var pkg$1 = { name: name$1, @@ -62,6 +65,46 @@ path.resolve(rootPath, "package"); const HOME = process.env[process.platform === "win32" ? "USERPROFILE" : "HOME"] || ""; const registriesPath = path.join(HOME, ".gacmrc"); +const defaultPackageManager = ["npm", "yarn", "cnpm", "pnpm"]; +const defaultNpmMirror = [ + { + name: "npm", + alias: "npm", + home: "https://www.npmjs.org", + registry: "https://registry.npmjs.org/" + }, + { + name: "yarn", + alias: "yarn", + home: "https://yarnpkg.com", + registry: "https://registry.yarnpkg.com/" + }, + { + name: "tencent", + alias: "tencent", + home: "https://mirrors.cloud.tencent.com/npm/", + registry: "https://mirrors.cloud.tencent.com/npm/" + }, + { + name: "cnpm", + alias: "cnpm", + home: "https://cnpmjs.org", + registry: "https://r.cnpmjs.org/" + }, + { + name: "taobao", + alias: "taobao", + home: "https://npmmirror.com", + registry: "https://registry.npmmirror.com/" + }, + { + name: "npmMirror", + alias: "npmMirror", + home: "https://skimdb.npmjs.com/", + registry: "https://skimdb.npmjs.com/registry/" + } +]; + const success = (msg) => console.log(` ${kolorist.green(msg)} `); @@ -123,46 +166,18 @@ async function writeFileUser(dir, data) { process.exit(0); }); } - -const defaultPackageManager = ["npm", "yarn", "cnpm", "pnpm"]; -const defaultNpmMirror = [ - { - name: "npm", - alias: "npm", - home: "https://www.npmjs.org", - registry: "https://registry.npmjs.org/" - }, - { - name: "yarn", - alias: "yarn", - home: "https://yarnpkg.com", - registry: "https://registry.yarnpkg.com/" - }, - { - name: "tencent", - alias: "tencent", - home: "https://mirrors.cloud.tencent.com/npm/", - registry: "https://mirrors.cloud.tencent.com/npm/" - }, - { - name: "cnpm", - alias: "cnpm", - home: "https://cnpmjs.org", - registry: "https://r.cnpmjs.org/" - }, - { - name: "taobao", - alias: "taobao", - home: "https://npmmirror.com", - registry: "https://registry.npmmirror.com/" - }, - { - name: "npmMirror", - alias: "npmMirror", - home: "https://skimdb.npmjs.com/", - registry: "https://skimdb.npmjs.com/registry/" - } -]; +const checkRegistry = async () => { + const userConfig = await getFileUser(registriesPath); + let registryList = defaultNpmMirror; + if (userConfig) + if (!userConfig.registry || userConfig.registry.length === 0) { + userConfig.registry = registryList; + writeFileUser(registriesPath, userConfig); + } else { + registryList = userConfig.registry; + } + return registryList; +}; const execCommand = async (cmd, args) => { const res = await execa__default["default"](cmd, args); @@ -189,6 +204,7 @@ var dependencies = { execa: "5.1.1", kolorist: "^1.5.1", minimist: "^1.2.6", + "node-fetch": "2.6.6", prompts: "^2.4.2" }; var devDependencies = { @@ -201,6 +217,7 @@ var devDependencies = { "@types/fs-extra": "^9.0.13", "@types/gulp": "^4.0.9", "@types/node": "^17.0.21", + "@types/node-fetch": "^2.6.2", "@types/prompts": "^2.0.14", cac: "^6.7.14", changeloger: "0.1.0", @@ -289,15 +306,7 @@ const getRegistrys = async (pkgs = defaultPackageManager) => { return registrys; }; const useLs = async (cmd) => { - const userConfig = await getFileUser(registriesPath); - let registryList = defaultNpmMirror; - if (userConfig) - if (!userConfig.registry || userConfig.registry.length === 0) { - userConfig.registry = registryList; - writeFileUser(registriesPath, userConfig); - } else { - registryList = userConfig.registry; - } + const registryList = await checkRegistry(); const pkgs = []; if (cmd.packageManager) pkgs.push(cmd.packageManager); @@ -336,7 +345,7 @@ const useLs = async (cmd) => { npm: kolorist.green, cnpm: kolorist.red, yarn: kolorist.blue, - pnpm: kolorist.lightYellow + pnpm: kolorist.yellow }; const currentTip = `current: ${Object.keys(currectRegistry).map((key) => { if (currectRegistry[key]) @@ -465,10 +474,77 @@ const useDelete = async (name) => { await writeFileUser(registriesPath, userConfig); }; +const testRegistry = async (registry) => { + const start = Date.now(); + const options = { + timeout: 5e3 + }; + let status = false; + let isTimeout = false; + try { + const response = await fetch__default["default"](registry, { + ...options + }); + status = response.ok; + } catch (error) { + console.log(error); + isTimeout = error.type === "request-timeout"; + } + return { + status, + isTimeout, + start + }; +}; +const useTest = async (cmd) => { + const registryList = await checkRegistry(); + const test = async (registry2) => { + const { status, start, isTimeout } = await testRegistry(new URL("", registry2.registry).href); + if (isTimeout) + log.error("timeout"); + if (status) { + const end = Date.now(); + console.log(` + ${kolorist.green(`\u3010${end - start}ms\u3011`)} ping ${registry2.alias}${registry2.alias === registry2.name ? "" : `${kolorist.gray(`(${registry2.name})`)}`}\uFF1A${registry2.registry}`); + } + }; + if (cmd.all) { + const list = registryList.map(async (r) => { + return { + handle: await test(r) + }; + }); + for (const iterator of list) + await iterator; + return; + } + if (cmd.packageManager) { + const registry2 = registryList.find((x) => x.alias === cmd.packageManager); + if (registry2) + await test(registry2); + return; + } + const { registry } = await prompts__default["default"]([ + { + type: "select", + name: "registry", + message: "Pick a registry", + choices: registryList.map((x) => { + return { + title: `${x.alias}${x.alias === x.name ? "" : `(${x.name})`} ${x.registry}`, + value: x + }; + }) + } + ]); + await test(registry.registry); +}; + const program = cac__default["default"]("gnrm"); program.version(useVersion()); program.command("ls", "\u5F53\u524D\u7528\u6237\u5217\u8868").option("-p, --packageManager ", "\u67E5\u770B\u5BF9\u5E94\u5305\u7BA1\u7406\u5668\uFF1A\u9ED8\u8BA4npm").action(useLs); program.command("use [name]", "\u5207\u6362\u955C\u50CF\u6E90").option("-p, --packageManager ", "\u8BBE\u7F6E\u5BF9\u5E94\u5305\u7BA1\u7406\u5668\uFF1A\u9ED8\u8BA4npm").action(useUse); +program.command("test", "\u5207\u6362\u955C\u50CF\u6E90").option("-p, --packageManager ", "\u6D4B\u8BD5\u5BF9\u5E94\u5305\u7BA1\u7406\u5668\uFF1A\u9ED8\u8BA4npm").option("-a, --all", "\u6D4B\u8BD5\u5B58\u5728\u7684\u955C\u50CF\u6E90").action(useTest); program.command("add", "\u6DFB\u52A0\u955C\u50CF").option("-n, --name ", "\u955C\u50CF\u540D\u79F0").option("-r, --registry ", "\u955C\u50CF\u5730\u5740").option("-a, --alias ", "\u955C\u50CF\u522B\u540D").action(useAdd); program.command("alias ", "\u955C\u50CF\u6DFB\u52A0\u522B\u540D").action(useAlias); program.command("delete ", "\u5220\u9664\u955C\u50CF").action(useDelete); diff --git a/dist/package.json b/dist/package.json index 2233997..bab4ac9 100644 --- a/dist/package.json +++ b/dist/package.json @@ -21,6 +21,7 @@ "cac": "^6.7.14", "execa": "5.1.1", "kolorist": "^1.5.1", - "prompts": "^2.4.2" + "prompts": "^2.4.2", + "node-fetch": "2.6.6" } -} +} \ No newline at end of file diff --git a/package.json b/package.json index 3d7296b..1c62dbb 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "execa": "5.1.1", "kolorist": "^1.5.1", "minimist": "^1.2.6", + "node-fetch": "2.6.6", "prompts": "^2.4.2" }, "devDependencies": { @@ -31,6 +32,7 @@ "@types/fs-extra": "^9.0.13", "@types/gulp": "^4.0.9", "@types/node": "^17.0.21", + "@types/node-fetch": "^2.6.2", "@types/prompts": "^2.0.14", "cac": "^6.7.14", "changeloger": "0.1.0", diff --git a/package/commands/gnrm/index.ts b/package/commands/gnrm/index.ts index bdf549f..771538d 100644 --- a/package/commands/gnrm/index.ts +++ b/package/commands/gnrm/index.ts @@ -3,3 +3,4 @@ export * from './useUse'; export * from './useAdd'; export * from './useAlias'; export * from './useDelete'; +export * from './useTest'; diff --git a/package/commands/gnrm/useLs.ts b/package/commands/gnrm/useLs.ts index dbaa10c..a87ff3b 100644 --- a/package/commands/gnrm/useLs.ts +++ b/package/commands/gnrm/useLs.ts @@ -1,8 +1,7 @@ import { blue, gray, green, red, yellow } from 'kolorist'; import prompts from 'prompts'; -import { registriesPath } from '../../config/path'; -import { getFileUser, writeFileUser } from '../../utils/getUserList'; -import { defaultNpmMirror, defaultPackageManager } from '../../config/registry'; +import { checkRegistry } from '../../utils/getUserList'; +import { defaultPackageManager } from '../../config/registry'; import { execCommand } from '../../utils/shell'; import { geneDashLine, padding, printMessages } from '../../utils/tools'; import { log } from '../../utils/log'; @@ -41,14 +40,7 @@ export const getRegistrys = async (pkgs: PackageManagertype[] = defaultPackageMa }; export const useLs = async (cmd: NrmCmd) => { - const userConfig = await getFileUser(registriesPath); - let registryList = defaultNpmMirror; - if (userConfig) - if (!userConfig.registry || userConfig.registry.length === 0) { - userConfig.registry = registryList; - writeFileUser(registriesPath, userConfig); - } - else { registryList = userConfig.registry; } + const registryList = await checkRegistry(); const pkgs: PackageManagertype[] = []; diff --git a/package/commands/gnrm/useTest.ts b/package/commands/gnrm/useTest.ts new file mode 100644 index 0000000..2b66738 --- /dev/null +++ b/package/commands/gnrm/useTest.ts @@ -0,0 +1,83 @@ +import prompts from 'prompts'; +import fetch from 'node-fetch'; +import { gray, green } from 'kolorist'; +import type { RegistryInfo, TestCmd } from '../../type/shell.type'; +import { checkRegistry } from '../../utils/getUserList'; +import { log } from '../../utils/log'; + +const testRegistry = async (registry: string) => { + const start = Date.now(); + const options = { + timeout: 5000 + }; + let status = false; + let isTimeout = false; + try { + const response = await fetch(registry, { + ...options + }); + status = response.ok; + } + catch (error: any) { + // eslint-disable-next-line no-console + console.log(error); + isTimeout = error.type === 'request-timeout'; + } + return { + status, + isTimeout, + start + }; +}; + +export const useTest = async (cmd: TestCmd) => { + const registryList = await checkRegistry(); + + const test = async (registry: RegistryInfo) => { + const { status, start, isTimeout } = await testRegistry(new URL('', registry.registry).href); + if (isTimeout) log.error('timeout'); + if (status) { + const end = Date.now(); + // eslint-disable-next-line no-console + console.log((`\n ${green(`【${end - start}ms】`)} ping ${registry.alias}${registry.alias === registry.name ? '' : `${gray(`(${registry.name})`)}`}:${registry.registry}`)); + } + }; + + if (cmd.all) { + const list = registryList.map(async (r) => { + return { + handle: await test(r) + }; + }); + for (const iterator of list) + await iterator; + + return; + } + + if (cmd.packageManager) { + const registry = registryList.find(x => x.alias === cmd.packageManager); + if (registry) + await test(registry); + + return; + } + + const { registry } = await prompts([ + { + type: 'select', + name: 'registry', + message: 'Pick a registry', + choices: registryList.map((x) => { + return { + title: `${x.alias}${x.alias === x.name ? '' : `(${x.name})`} ${ + x.registry + }`, + value: x + }; + }) + } + ]); + + await test(registry.registry); +}; diff --git a/package/gnrm.ts b/package/gnrm.ts index 9b21ad2..e776454 100644 --- a/package/gnrm.ts +++ b/package/gnrm.ts @@ -1,6 +1,6 @@ import cac from 'cac'; import { useVersion } from './commands/common/useVersion'; -import { useAdd, useAlias, useDelete, useLs, useUse } from './commands/gnrm'; +import { useAdd, useAlias, useDelete, useLs, useTest, useUse } from './commands/gnrm'; const program = cac('gnrm'); program.version(useVersion()); @@ -15,6 +15,12 @@ program .option('-p, --packageManager ', '设置对应包管理器:默认npm') .action(useUse); +program + .command('test', '切换镜像源') + .option('-p, --packageManager ', '测试对应包管理器:默认npm') + .option('-a, --all', '测试存在的镜像源') + .action(useTest); + program .command('add', '添加镜像') .option('-n, --name ', '镜像名称') diff --git a/package/package.json b/package/package.json index 2233997..c2b6746 100644 --- a/package/package.json +++ b/package/package.json @@ -21,6 +21,7 @@ "cac": "^6.7.14", "execa": "5.1.1", "kolorist": "^1.5.1", + "node-fetch": "2.6.6", "prompts": "^2.4.2" } } diff --git a/package/type/shell.type.ts b/package/type/shell.type.ts index 8fa0916..8918ef8 100644 --- a/package/type/shell.type.ts +++ b/package/type/shell.type.ts @@ -23,3 +23,7 @@ export type PackageManagertype = 'pnpm' | 'npm' | 'cnpm' | 'yarn'; export interface NrmCmd { packageManager: PackageManagertype } + +export interface TestCmd extends NrmCmd { + all: boolean +} diff --git a/package/utils/getUserList.ts b/package/utils/getUserList.ts index c0f3882..6b0231d 100644 --- a/package/utils/getUserList.ts +++ b/package/utils/getUserList.ts @@ -1,4 +1,6 @@ import { existsSync, promises } from 'fs'; +import { registriesPath } from '../config/path'; +import { defaultNpmMirror } from '../config/registry'; import type { UserInfoJson, UserOldInfoJson } from '../type/shell.type'; import { log } from './log'; import { transformData } from './tools'; @@ -35,3 +37,19 @@ export async function writeFileUser(dir: string, data: UserInfoJson) { process.exit(0); }); } + +/** + * 检查是否写入过Registry + * @returns Registrys + */ +export const checkRegistry = async () => { + const userConfig = await getFileUser(registriesPath); + let registryList = defaultNpmMirror; + if (userConfig) + if (!userConfig.registry || userConfig.registry.length === 0) { + userConfig.registry = registryList; + writeFileUser(registriesPath, userConfig); + } + else { registryList = userConfig.registry; } + return registryList; +}; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7035ed4..490dd46 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,6 +10,7 @@ specifiers: '@types/fs-extra': ^9.0.13 '@types/gulp': ^4.0.9 '@types/node': ^17.0.21 + '@types/node-fetch': ^2.6.2 '@types/prompts': ^2.0.14 cac: ^6.7.14 changeloger: 0.1.0 @@ -22,6 +23,7 @@ specifiers: kolorist: ^1.5.1 lint-staged: ^10.5.4 minimist: ^1.2.6 + node-fetch: 2.6.6 prettier: ^2.6.2 prompts: ^2.4.2 rimraf: ^3.0.2 @@ -33,6 +35,7 @@ dependencies: execa: 5.1.1 kolorist: 1.5.1 minimist: 1.2.6 + node-fetch: 2.6.6 prompts: 2.4.2 devDependencies: @@ -45,6 +48,7 @@ devDependencies: '@types/fs-extra': 9.0.13 '@types/gulp': 4.0.9 '@types/node': 17.0.27 + '@types/node-fetch': 2.6.2 '@types/prompts': 2.0.14 cac: 6.7.14 changeloger: 0.1.0 @@ -615,6 +619,13 @@ packages: resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} dev: true + /@types/node-fetch/2.6.2: + resolution: {integrity: sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==} + dependencies: + '@types/node': 17.0.27 + form-data: 3.0.1 + dev: true + /@types/node/17.0.27: resolution: {integrity: sha512-4/Ke7bbWOasuT3kceBZFGakP1dYN2XFd8v2l9bqF2LNWrmeU07JLpp56aEeG6+Q3olqO5TvXpW0yaiYnZJ5CXg==} dev: true @@ -1137,6 +1148,10 @@ packages: resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} dev: true + /asynckit/0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: true + /atob/2.1.2: resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} engines: {node: '>= 4.5.0'} @@ -1602,6 +1617,13 @@ packages: resolution: {integrity: sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==} dev: true + /combined-stream/1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: true + /commander/4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} @@ -1951,6 +1973,11 @@ packages: isobject: 3.0.1 dev: true + /delayed-stream/1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: true + /detect-file/1.0.0: resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} engines: {node: '>=0.10.0'} @@ -3032,6 +3059,15 @@ packages: for-in: 1.0.2 dev: true + /form-data/3.0.1: + resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: true + /fragment-cache/0.2.1: resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} engines: {node: '>=0.10.0'} @@ -4434,6 +4470,18 @@ packages: picomatch: 2.3.1 dev: true + /mime-db/1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: true + + /mime-types/2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: true + /mimic-fn/1.2.0: resolution: {integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==} engines: {node: '>=4'} @@ -4572,6 +4620,13 @@ packages: resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} dev: true + /node-fetch/2.6.6: + resolution: {integrity: sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==} + engines: {node: 4.x || >=6.0.0} + dependencies: + whatwg-url: 5.0.0 + dev: false + /normalize-package-data/2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} dependencies: @@ -5969,6 +6024,10 @@ packages: through2: 2.0.5 dev: true + /tr46/0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: false + /trim-newlines/2.0.0: resolution: {integrity: sha512-MTBWv3jhVjTU7XR3IQHllbiJs8sc75a80OEhB6or/q7pLTWgQ0bMGQXXYQSrSuXe6WiKWDZ5txXY5P59a/coVA==} engines: {node: '>=4'} @@ -6283,6 +6342,17 @@ packages: replace-ext: 1.0.1 dev: true + /webidl-conversions/3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: false + + /whatwg-url/5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: false + /which-boxed-primitive/1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} dependencies: