diff --git a/.eslintrc.cjs b/.eslintrc.cjs index dc587cb2..afdf7f28 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -30,6 +30,10 @@ module.exports = { "no-constant-condition": [ "error", {"checkLoops": false } + ], + "no-use-before-define": [ + "error", + {"variables": true, "functions": false, "classes": false, "allowNamedExports": true} ] } }; diff --git a/Dockerfile b/Dockerfile index a980ab90..c1ff54d4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -20,7 +20,6 @@ ENV PROXY_HOST=localhost \ WORKDIR /app ADD requirements.txt /app/ -RUN pip install 'uwsgi==2.0.21' RUN pip install -U setuptools; pip install -r requirements.txt ADD package.json /app/ diff --git a/crawler.js b/crawler.js index 7d8df7a4..c98d9275 100644 --- a/crawler.js +++ b/crawler.js @@ -6,7 +6,6 @@ import fsp from "fs/promises"; import { RedisCrawlState, LoadState, QueueState } from "./util/state.js"; import Sitemapper from "sitemapper"; -import { v4 as uuidv4 } from "uuid"; import yaml from "js-yaml"; import * as warcio from "warcio"; @@ -103,8 +102,9 @@ export class Crawler { this.emulateDevice = this.params.emulateDevice || {}; - this.captureBasePrefix = `http://${process.env.PROXY_HOST}:${process.env.PROXY_PORT}/${this.params.collection}/record`; - this.capturePrefix = process.env.NO_PROXY ? "" : this.captureBasePrefix + "/id_/"; + //this.captureBasePrefix = `http://${process.env.PROXY_HOST}:${process.env.PROXY_PORT}/${this.params.collection}/record`; + //this.capturePrefix = "";//process.env.NO_PROXY ? "" : this.captureBasePrefix + "/id_/"; + this.captureBasePrefix = null; this.gotoOpts = { waitUntil: this.params.waitUntil, @@ -213,13 +213,36 @@ export class Crawler { return new ScreenCaster(transport, this.params.workers); } - async bootstrap() { - const initRes = child_process.spawnSync("wb-manager", ["init", this.params.collection], {cwd: this.params.cwd}); + launchRedis() { + let redisStdio; - if (initRes.status) { - logger.info("wb-manager init failed, collection likely already exists"); + if (this.params.logging.includes("redis")) { + const redisStderr = fs.openSync(path.join(this.logDir, "redis.log"), "a"); + redisStdio = [process.stdin, redisStderr, redisStderr]; + + } else { + redisStdio = "ignore"; } + let redisArgs = []; + if (this.params.debugAccessRedis) { + redisArgs = ["--protected-mode", "no"]; + } + + return child_process.spawn("redis-server", redisArgs,{cwd: "/tmp/", stdio: redisStdio}); + } + + async bootstrap() { + const subprocesses = []; + + subprocesses.push(this.launchRedis()); + + //const initRes = child_process.spawnSync("wb-manager", ["init", this.params.collection], {cwd: this.params.cwd}); + + //if (initRes.status) { + // logger.info("wb-manager init failed, collection likely already exists"); + //} + fs.mkdirSync(this.logDir, {recursive: true}); this.logFH = fs.createWriteStream(this.logFilename); logger.setExternalLogStream(this.logFH); @@ -246,42 +269,8 @@ export class Crawler { this.customBehaviors = this.loadCustomBehaviors(this.params.customBehaviors); } - let opts = {}; - let redisStdio; - - if (this.params.logging.includes("pywb")) { - const pywbStderr = fs.openSync(path.join(this.logDir, "pywb.log"), "a"); - const stdio = [process.stdin, pywbStderr, pywbStderr]; - - const redisStderr = fs.openSync(path.join(this.logDir, "redis.log"), "a"); - redisStdio = [process.stdin, redisStderr, redisStderr]; - - opts = {stdio, cwd: this.params.cwd}; - } else { - opts = {stdio: "ignore", cwd: this.params.cwd}; - redisStdio = "ignore"; - } - this.headers = {"User-Agent": this.configureUA()}; - const subprocesses = []; - - let redisArgs = []; - if (this.params.debugAccessRedis) { - redisArgs = ["--protected-mode", "no"]; - } - - subprocesses.push(child_process.spawn("redis-server", redisArgs, {cwd: "/tmp/", stdio: redisStdio})); - - opts.env = { - ...process.env, - COLL: this.params.collection, - ROLLOVER_SIZE: this.params.rolloverSize, - DEDUP_POLICY: this.params.dedupPolicy - }; - - subprocesses.push(child_process.spawn("uwsgi", [new URL("uwsgi.ini", import.meta.url).pathname], opts)); - process.on("exit", () => { for (const proc of subprocesses) { proc.kill(); @@ -472,7 +461,7 @@ self.__bx_behaviors.selectMainBehavior(); async crawlPage(opts) { await this.writeStats(); - const {page, cdp, data, workerid, callbacks} = opts; + const {page, cdp, data, workerid, callbacks, directFetchCapture} = opts; data.callbacks = callbacks; const {url} = data; @@ -481,6 +470,38 @@ self.__bx_behaviors.selectMainBehavior(); data.logDetails = logDetails; data.workerid = workerid; + data.isHTMLPage = await timedRun( + this.isHTML(url, logDetails), + FETCH_TIMEOUT_SECS, + "HEAD request to determine if URL is HTML page timed out", + logDetails, + "fetch", + true + ); + + if (!data.isHTMLPage && directFetchCapture) { + try { + const {fetched, mime} = await timedRun( + directFetchCapture(url), + FETCH_TIMEOUT_SECS, + "Direct fetch capture attempt timed out", + logDetails, + "fetch", + true + ); + if (fetched) { + data.loadState = LoadState.FULL_PAGE_LOADED; + if (mime) { + data.mime = mime; + } + logger.info("Direct fetch successful", {url, ...logDetails}, "fetch"); + return true; + } + } catch (e) { + // ignore failed direct fetch attempt, do browser-based capture + } + } + // run custom driver here await this.driver({page, data, crawler: this}); @@ -660,9 +681,8 @@ self.__bx_behaviors.selectMainBehavior(); async getInfoString() { const packageFileJSON = JSON.parse(await fsp.readFile("../app/package.json")); const warcioPackageJSON = JSON.parse(await fsp.readFile("/app/node_modules/warcio/package.json")); - const pywbVersion = child_process.execSync("pywb -V", {encoding: "utf8"}).trim().split(" ")[1]; - return `Browsertrix-Crawler ${packageFileJSON.version} (with warcio.js ${warcioPackageJSON.version} pywb ${pywbVersion})`; + return `Browsertrix-Crawler ${packageFileJSON.version} (with warcio.js ${warcioPackageJSON.version})`; } async createWARCInfo(filename) { @@ -872,7 +892,7 @@ self.__bx_behaviors.selectMainBehavior(); headless: this.params.headless, emulateDevice: this.emulateDevice, chromeOptions: { - proxy: !process.env.NO_PROXY, + proxy: false, userAgent: this.emulateDevice.userAgent, extraArgs: this.extraChromeArgs() }, @@ -882,9 +902,10 @@ self.__bx_behaviors.selectMainBehavior(); } }); + // -------------- // Run Crawl Here! - await runWorkers(this, this.params.workers, this.maxPageTime); + await runWorkers(this, this.params.workers, this.maxPageTime, this.collDir); // -------------- await this.serializeConfig(true); @@ -898,8 +919,6 @@ self.__bx_behaviors.selectMainBehavior(); await this.writeStats(); - // extra wait for all resources to land into WARCs - await this.awaitPendingClear(); // if crawl has been stopped, mark as final exit for post-crawl tasks if (await this.crawlState.isCrawlStopped()) { @@ -916,8 +935,19 @@ self.__bx_behaviors.selectMainBehavior(); if (this.params.generateCDX) { logger.info("Generating CDX"); + await fsp.mkdir(path.join(this.collDir, "indexes"), {recursive: true}); await this.crawlState.setStatus("generate-cdx"); - const indexResult = await this.awaitProcess(child_process.spawn("wb-manager", ["reindex", this.params.collection], {cwd: this.params.cwd})); + + const warcList = await fsp.readdir(path.join(this.collDir, "archive")); + const warcListFull = warcList.map((filename) => path.join(this.collDir, "archive", filename)); + + //const indexResult = await this.awaitProcess(child_process.spawn("wb-manager", ["reindex", this.params.collection], {cwd: this.params.cwd})); + const params = [ + "-o", + path.join(this.collDir, "indexes", "index.cdxj"), + ...warcListFull + ]; + const indexResult = await this.awaitProcess(child_process.spawn("cdxj-indexer", params, {cwd: this.params.cwd})); if (indexResult === 0) { logger.debug("Indexing complete, CDX successfully created"); } else { @@ -1136,34 +1166,6 @@ self.__bx_behaviors.selectMainBehavior(); const failCrawlOnError = ((depth === 0) && this.params.failOnFailedSeed); - let isHTMLPage = await timedRun( - this.isHTML(url), - FETCH_TIMEOUT_SECS, - "HEAD request to determine if URL is HTML page timed out", - logDetails, - "fetch", - true - ); - - if (!isHTMLPage) { - try { - const captureResult = await timedRun( - this.directFetchCapture(url), - FETCH_TIMEOUT_SECS, - "Direct fetch capture attempt timed out", - logDetails, - "fetch", - true - ); - if (captureResult) { - logger.info("Direct fetch successful", {url, ...logDetails}, "fetch"); - return; - } - } catch (e) { - // ignore failed direct fetch attempt, do browser-based capture - } - } - let ignoreAbort = false; // Detect if ERR_ABORTED is actually caused by trying to load a non-page (eg. downloadable PDF), @@ -1172,6 +1174,8 @@ self.__bx_behaviors.selectMainBehavior(); ignoreAbort = shouldIgnoreAbort(req); }); + let isHTMLPage = data.isHTMLPage; + if (isHTMLPage) { page.once("domcontentloaded", () => { data.loadState = LoadState.CONTENT_LOADED; @@ -1441,9 +1445,12 @@ self.__bx_behaviors.selectMainBehavior(); } } - async writePage({url, depth, title, text, loadState, favicon}) { - const id = uuidv4(); - const row = {id, url, title, loadState}; + async writePage({pageid, url, depth, title, text, loadState, mime, favicon}) { + const row = {id: pageid, url, title, loadState}; + + if (mime) { + row.mime = mime; + } if (depth === 0) { row.seed = true; @@ -1469,7 +1476,7 @@ self.__bx_behaviors.selectMainBehavior(); return urlParsed.protocol === "https:" ? HTTPS_AGENT : HTTP_AGENT; } - async isHTML(url) { + async isHTML(url, logDetails) { try { const resp = await fetch(url, { method: "HEAD", @@ -1477,7 +1484,7 @@ self.__bx_behaviors.selectMainBehavior(); agent: this.resolveAgent }); if (resp.status !== 200) { - logger.debug(`Skipping HEAD check ${url}, invalid status ${resp.status}`); + logger.debug("HEAD response code != 200, loading in browser", {status: resp.status, ...logDetails}); return true; } @@ -1485,7 +1492,7 @@ self.__bx_behaviors.selectMainBehavior(); } catch(e) { // can't confirm not html, so try in browser - logger.debug("HEAD request failed", {...e, url}); + logger.debug("HEAD request failed", {...errJSON(e), ...logDetails}); return true; } } @@ -1505,35 +1512,6 @@ self.__bx_behaviors.selectMainBehavior(); return false; } - async directFetchCapture(url) { - const abort = new AbortController(); - const signal = abort.signal; - const resp = await fetch(this.capturePrefix + url, {signal, headers: this.headers, redirect: "manual"}); - abort.abort(); - return resp.status === 200 && !resp.headers.get("set-cookie"); - } - - async awaitPendingClear() { - logger.info("Waiting to ensure pending data is written to WARCs..."); - await this.crawlState.setStatus("pending-wait"); - - const redis = await initRedis("redis://localhost/0"); - - while (!this.interrupted) { - try { - const count = Number(await redis.get(`pywb:${this.params.collection}:pending`) || 0); - if (count <= 0) { - break; - } - logger.debug("Waiting for pending requests to finish", {numRequests: count}); - } catch (e) { - break; - } - - await sleep(1); - } - } - async parseSitemap(url, seedId, sitemapFromDate) { // handle sitemap last modified date if passed let lastmodFromTimestamp = null; diff --git a/create-login-profile.js b/create-login-profile.js index 291b40e2..182287df 100755 --- a/create-login-profile.js +++ b/create-login-profile.js @@ -11,7 +11,6 @@ import yargs from "yargs"; import { logger } from "./util/logger.js"; -import { sleep } from "./util/timing.js"; import { Browser } from "./util/browser.js"; import { initStorage } from "./util/storage.js"; @@ -144,18 +143,6 @@ async function main() { ]); } - let useProxy = false; - - if (params.proxy) { - child_process.spawn("wayback", ["--live", "--proxy", "live"], {stdio: "inherit", cwd: "/tmp"}); - - logger.debug("Running with pywb proxy"); - - await sleep(3000); - - useProxy = true; - } - const browser = new Browser(); await browser.launch({ @@ -163,7 +150,7 @@ async function main() { headless: params.headless, signals: true, chromeOptions: { - proxy: useProxy, + proxy: false, extraArgs: [ "--window-position=0,0", `--window-size=${params.windowSize}`, diff --git a/package.json b/package.json index 3162a27c..ca073e91 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "browsertrix-crawler", - "version": "0.12.1", + "version": "1.0.0-beta.0", "main": "browsertrix-crawler", "type": "module", "repository": "https://github.com/webrecorder/browsertrix-crawler", @@ -13,6 +13,7 @@ }, "dependencies": { "@novnc/novnc": "^1.4.0", + "@webrecorder/wabac": "^2.16.12", "browsertrix-behaviors": "^0.5.2", "crc": "^4.3.2", "get-folder-size": "^4.0.0", @@ -20,16 +21,17 @@ "ioredis": "^4.27.1", "js-yaml": "^4.1.0", "minio": "7.0.26", + "p-queue": "^7.3.4", "puppeteer-core": "^20.7.4", "sharp": "^0.32.1", "sitemapper": "^3.2.5", "uuid": "8.3.2", - "warcio": "^1.6.0", + "warcio": "^2.2.0", "ws": "^7.4.4", "yargs": "^17.7.2" }, "devDependencies": { - "eslint": "^7.20.0", + "eslint": "^8.37.0", "eslint-plugin-react": "^7.22.0", "jest": "^29.2.1", "md5": "^2.3.0" diff --git a/requirements.txt b/requirements.txt index 59dd3892..aa919c23 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1 @@ -pywb>=2.7.4 -uwsgi wacz>=0.4.9 -requests[socks] diff --git a/tests/warcinfo.test.js b/tests/warcinfo.test.js index f6d797b3..2c353f9b 100644 --- a/tests/warcinfo.test.js +++ b/tests/warcinfo.test.js @@ -21,7 +21,7 @@ test("check that the warcinfo file works as expected on the command line", async expect(string.indexOf("operator: test")).toBeGreaterThan(-1); expect(string.indexOf("host: hostname")).toBeGreaterThan(-1); - expect(string.match(/Browsertrix-Crawler \d[\w.-]+ \(with warcio.js \d[\w.-]+ pywb \d[\w.-]+\)/)).not.toEqual(null); + expect(string.match(/Browsertrix-Crawler \d[\w.-]+ \(with warcio.js \d[\w.-]+\)/)).not.toEqual(null); expect(string.indexOf("format: WARC File Format 1.0")).toBeGreaterThan(-1); diff --git a/util/argParser.js b/util/argParser.js index 2eb15839..5ca6cbd0 100644 --- a/util/argParser.js +++ b/util/argParser.js @@ -178,7 +178,7 @@ class ArgParser { }, "logging": { - describe: "Logging options for crawler, can include: stats (enabled by default), jserrors, pywb, debug", + describe: "Logging options for crawler, can include: stats (enabled by default), jserrors, debug", type: "array", default: ["stats"], coerce, diff --git a/util/browser.js b/util/browser.js index de9ebca3..5dee4b20 100644 --- a/util/browser.js +++ b/util/browser.js @@ -19,6 +19,8 @@ export class BaseBrowser this.profileDir = fs.mkdtempSync(path.join(os.tmpdir(), "profile-")); this.customProfile = false; this.emulateDevice = null; + + this.recorders = []; } async launch({profileUrl, chromeOptions, signals = false, headless = false, emulateDevice = {}, ondisconnect = null} = {}) { @@ -117,6 +119,7 @@ export class BaseBrowser chromeArgs({proxy=true, userAgent=null, extraArgs=[]} = {}) { // Chrome Flags, including proxy server const args = [ + // eslint-disable-next-line no-use-before-define ...defaultArgs, ...(process.env.CHROME_FLAGS ?? "").split(" ").filter(Boolean), //"--no-xshm", // needed for Chrome >80 (check if puppeteer adds automatically) @@ -239,6 +242,8 @@ export class Browser extends BaseBrowser this.firstCDP = await target.createCDPSession(); + await this.serviceWorkerFetch(); + if (ondisconnect) { this.browser.on("disconnected", (err) => ondisconnect(err)); } @@ -294,6 +299,50 @@ export class Browser extends BaseBrowser return {page, cdp}; } + async serviceWorkerFetch() { + this.firstCDP.on("Fetch.requestPaused", async (params) => { + const { frameId, requestId, networkId, request } = params; + + if (networkId) { + try { + await this.firstCDP.send("Fetch.continueResponse", {requestId}); + } catch (e) { + logger.warn("continueResponse failed", {url: request.url}, "recorder"); + } + return; + } + + let foundRecorder = null; + + for (const recorder of this.recorders) { + if (recorder.swUrls.has(request.url)) { + recorder.swFrameIds.add(frameId); + } + + if (recorder.swFrameIds && recorder.swFrameIds.has(frameId)) { + foundRecorder = recorder; + break; + } + } + + if (!foundRecorder) { + logger.debug("Skipping URL from unknown frame", {url: request.url, frameId}, "recorder"); + + try { + await this.firstCDP.send("Fetch.continueResponse", {requestId}); + } catch (e) { + logger.warn("continueResponse failed", {url: request.url}, "recorder"); + } + + return; + } + + await foundRecorder.handleRequestPaused(params, this.firstCDP, true); + }); + + await this.firstCDP.send("Fetch.enable", {patterns: [{urlPattern: "*", requestStage: "Response"}]}); + } + async evaluateWithCLI(_, frame, cdp, funcString, logData, contextName) { const context = await frame.executionContext(); cdp = context._client; @@ -360,6 +409,9 @@ export const defaultArgs = [ // See https://chromium-review.googlesource.com/c/chromium/src/+/2436773 "--no-service-autorun", "--export-tagged-pdf", + "--apps-keep-chrome-alive-in-tests", + "--apps-gallery-url=https://invalid.webstore.example.com/", + "--apps-gallery-update-url=https://invalid.webstore.example.com/", "--component-updater=url-source=http://invalid.dev/", "--brave-stats-updater-server=url-source=http://invalid.dev/" ]; diff --git a/util/recorder.js b/util/recorder.js new file mode 100644 index 00000000..eac522ef --- /dev/null +++ b/util/recorder.js @@ -0,0 +1,949 @@ +import fs from "fs"; +import path from "path"; +import os from "os"; + +import { v4 as uuidv4 } from "uuid"; + +import PQueue from "p-queue"; + +import { logger, errJSON } from "./logger.js"; +import { sleep, timestampNow } from "./timing.js"; +import { RequestResponseInfo } from "./reqresp.js"; + +import { baseRules as baseDSRules } from "@webrecorder/wabac/src/rewrite/index.js"; +import { rewriteDASH, rewriteHLS } from "@webrecorder/wabac/src/rewrite/rewriteVideo.js"; + +import { WARCRecord } from "warcio"; +import { WARCSerializer } from "warcio/node"; +import { WARCWriter } from "./warcwriter.js"; + +const MAX_BROWSER_FETCH_SIZE = 2_000_000; +const MAX_NETWORK_LOAD_SIZE = 200_000_000; + +const ASYNC_FETCH_DUPE_KEY = "s:fetchdupe"; + +const WRITE_DUPE_KEY = "s:writedupe"; + +const encoder = new TextEncoder(); + +// ================================================================= +function logNetwork(/*msg, data*/) { + // logger.debug(msg, data, "recorderNetwork"); +} + +// ================================================================= +export class Recorder +{ + constructor({workerid, collDir, crawler}) { + this.workerid = workerid; + this.crawler = crawler; + this.crawlState = crawler.crawlState; + + this.warcQ = new PQueue({concurrency: 1}); + + this.fetcherQ = new PQueue({concurrency: 1}); + + this.pendingRequests = null; + this.skipIds = null; + + this.swSessionId = null; + this.swFrameIds = new Set(); + this.swUrls = new Set(); + + + this.logDetails = {}; + this.skipping = false; + + this.allowFull206 = true; + + this.collDir = collDir; + + this.archivesDir = path.join(this.collDir, "archive"); + this.tempdir = path.join(this.collDir, "tmp-dl"); + this.tempCdxDir = path.join(this.collDir, "tmp-cdx"); + + fs.mkdirSync(this.tempdir, {recursive: true}); + fs.mkdirSync(this.archivesDir, {recursive: true}); + fs.mkdirSync(this.tempCdxDir, {recursive: true}); + + const crawlId = process.env.CRAWL_ID || os.hostname(); + const filename = `rec-${crawlId}-${timestampNow()}-${this.workerid}.warc`; + this.gzip = true; + + this.writer = new WARCWriter({ + archivesDir: this.archivesDir, + tempCdxDir: this.tempCdxDir, + filename, + gzip: this.gzip, + logDetails: this.logDetails + }); + } + + async onCreatePage({cdp}) { + // Fetch + + cdp.on("Fetch.requestPaused", async (params) => { + this.handleRequestPaused(params, cdp); + }); + + await cdp.send("Fetch.enable", {patterns: [{urlPattern: "*", requestStage: "Response"}]}); + + // Response + cdp.on("Network.responseReceived", (params) => { + // handling to fill in security details + logNetwork("Network.responseReceived", {requestId: params.requestId, ...this.logDetails}); + this.handleResponseReceived(params); + }); + + cdp.on("Network.responseReceivedExtraInfo", (params) => { + logNetwork("Network.responseReceivedExtraInfo", {requestId: params.requestId, ...this.logDetails}); + const reqresp = this.pendingReqResp(params.requestId, true); + if (reqresp) { + reqresp.fillResponseReceivedExtraInfo(params); + } + }); + + // Request + + cdp.on("Network.requestWillBeSent", (params) => { + // only handling redirect here, committing last response in redirect chain + // request data stored from requestPaused + if (params.redirectResponse) { + logNetwork("Network.requestWillBeSent after redirect", {requestId: params.requestId, ...this.logDetails}); + this.handleRedirectResponse(params); + } + }); + + cdp.on("Network.requestServedFromCache", (params) => { + logNetwork("Network.requestServedFromCache", {requestId: params.requestId, ...this.logDetails}); + this.removeReqResp(params.requestId); + }); + + cdp.on("Network.requestWillBeSentExtraInfo", (params) => { + logNetwork("Network.requestWillBeSentExtraInfo", {requestId: params.requestId, ...this.logDetails}); + this.handleRequestExtraInfo(params); + }); + + // Loading + cdp.on("Network.loadingFinished", (params) => { + logNetwork("Network.loadingFinished", {requestId: params.requestId, ...this.logDetails}); + this.handleLoadingFinished(params); + }); + + cdp.on("Network.loadingFailed", (params) => { + logNetwork("Network.loadingFailed", {requestId: params.requestId, ...this.logDetails}); + this.handleLoadingFailed(params); + }); + + await cdp.send("Network.enable"); + + // Target + + cdp.on("Target.attachedToTarget", async (params) => { + const { url, type, sessionId } = params.targetInfo; + if (type === "service_worker") { + this.swSessionId = sessionId; + this.swUrls.add(url); + } + }); + + cdp.on("Target.detachedFromTarget", async (params) => { + const { sessionId } = params; + if (this.swSessionId && sessionId === this.swSessionId) { + this.swUrls.clear(); + this.swFrameIds.clear(); + this.swSessionId = null; + } + }); + + await cdp.send("Target.setAutoAttach", {autoAttach: true, waitForDebuggerOnStart: false, flatten: true}); + } + + handleResponseReceived(params) { + const { requestId, response } = params; + + const reqresp = this.pendingReqResp(requestId); + if (!reqresp) { + return; + } + + reqresp.fillResponse(response); + } + + handleRequestExtraInfo(params) { + if (!this.shouldSkip(params.headers)) { + const reqresp = this.pendingReqResp(params.requestId, true); + if (reqresp) { + reqresp.fillRequestExtraInfo(params); + } + } + } + + handleRedirectResponse(params) { + const { requestId, redirectResponse } = params; + + // remove and serialize, but allow reusing requestId + // as redirect chain may reuse same requestId for subsequent request + const reqresp = this.removeReqResp(requestId, true); + if (!reqresp) { + return; + } + + reqresp.fillResponse(redirectResponse); + + if (reqresp.isSelfRedirect()) { + logger.warn("Skipping self redirect", {url: reqresp. url, status: reqresp.status, ...this.logDetails}, "recorder"); + return; + } + + this.serializeToWARC(reqresp); + } + + handleLoadingFailed(params) { + const { errorText, type, requestId } = params; + + const reqresp = this.pendingReqResp(requestId, true); + if (!reqresp) { + return; + } + + const { url } = reqresp; + + switch (errorText) { + case "net::ERR_BLOCKED_BY_CLIENT": + logNetwork("Request blocked", {url, errorText, ...this.logDetails}, "recorder"); + break; + + case "net::ERR_ABORTED": + // check if this is a false positive -- a valid download that's already been fetched + // the abort is just for page, but download will succeed + if (url && type === "Document" && reqresp.isValidBinary()) { + this.serializeToWARC(reqresp); + //} else if (url) { + } else if (url && reqresp.requestHeaders && reqresp.requestHeaders["x-browsertrix-fetch"]) { + delete reqresp.requestHeaders["x-browsertrix-fetch"]; + logger.warn("Attempt direct fetch of failed request", {url, ...this.logDetails}, "recorder"); + const fetcher = new AsyncFetcher({tempdir: this.tempdir, reqresp, recorder: this, networkId: requestId}); + this.fetcherQ.add(() => fetcher.load()); + return; + } + break; + + default: + logger.warn("Request failed", {url, errorText, ...this.logDetails}, "recorder"); + } + this.removeReqResp(requestId); + } + + handleLoadingFinished(params) { + const reqresp = this.pendingReqResp(params.requestId, true); + + if (!reqresp || reqresp.asyncLoading) { + return; + } + + this.removeReqResp(params.requestId); + + if (!this.isValidUrl(reqresp.url)) { + return; + } + + this.serializeToWARC(reqresp); + } + + async handleRequestPaused(params, cdp, isSWorker = false) { + const { requestId, request, responseStatusCode, responseErrorReason, resourceType, networkId } = params; + const { method, headers, url } = request; + + logNetwork("Fetch.requestPaused", {requestId, networkId, url, ...this.logDetails}); + + let continued = false; + + try { + if (responseStatusCode && !responseErrorReason && !this.shouldSkip(headers, url, method, resourceType) && !(isSWorker && networkId)) { + continued = await this.handleFetchResponse(params, cdp, isSWorker); + } + } catch (e) { + logger.error("Error handling response, probably skipping URL", {url, ...errJSON(e), ...this.logDetails}, "recorder"); + } + + if (!continued) { + try { + await cdp.send("Fetch.continueResponse", {requestId}); + } catch (e) { + logger.debug("continueResponse failed", {requestId, networkId, url, ...errJSON(e), ...this.logDetails}, "recorder"); + } + } + } + + async handleFetchResponse(params, cdp, isSWorker) { + const { request } = params; + const { url } = request; + const {requestId, responseErrorReason, responseStatusCode, responseHeaders} = params; + + const networkId = params.networkId || requestId; + + if (responseErrorReason) { + logger.warn("Skipping failed response", {url, reason: responseErrorReason, ...this.logDetails}, "recorder"); + return false; + } + + const contentLen = this._getContentLen(responseHeaders); + + if (responseStatusCode === 206) { + const range = this._getContentRange(responseHeaders); + if (this.allowFull206 && range === `bytes 0-${contentLen - 1}/${contentLen}`) { + logger.debug("Keep 206 Response, Full Range", {range, contentLen, url, networkId, ...this.logDetails}, "recorder"); + } else { + logger.debug("Skip 206 Response", {range, contentLen, url, ...this.logDetails}, "recorder"); + this.removeReqResp(networkId); + return false; + } + } + + const reqresp = this.pendingReqResp(networkId); + if (!reqresp) { + return false; + } + + reqresp.fillFetchRequestPaused(params); + + if (this.noResponseForStatus(responseStatusCode)) { + reqresp.payload = new Uint8Array(); + + if (isSWorker) { + this.removeReqResp(networkId); + await this.serializeToWARC(reqresp); + } + + return false; + } + + let streamingConsume = false; + + if (contentLen < 0 || contentLen > MAX_BROWSER_FETCH_SIZE) { + const opts = {tempdir: this.tempdir, reqresp, expectedSize: contentLen, recorder: this, networkId, cdp}; + + // fetching using response stream, await here and then either call fulFill, or if not started, return false + if (contentLen < 0) { + const fetcher = new ResponseStreamAsyncFetcher({...opts, requestId, cdp }); + const res = await fetcher.load(); + switch (res) { + case "dupe": + this.removeReqResp(networkId); + return false; + + case "fetched": + streamingConsume = true; + break; + } + } + + // if not consumed via takeStream, attempt async loading + if (!streamingConsume) { + let fetcher = null; + + if (reqresp.method !== "GET" || contentLen > MAX_NETWORK_LOAD_SIZE) { + fetcher = new AsyncFetcher(opts); + } else { + fetcher = new NetworkLoadStreamAsyncFetcher(opts); + } + this.fetcherQ.add(() => fetcher.load()); + return false; + } + + } else { + try { + logNetwork("Fetching response", {sizeExpected: this._getContentLen(responseHeaders), url, networkId, ...this.logDetails}); + const { body, base64Encoded } = await cdp.send("Fetch.getResponseBody", {requestId}); + reqresp.payload = Buffer.from(body, base64Encoded ? "base64" : "utf-8"); + logNetwork("Fetch done", {size: reqresp.payload.length, url, networkId, ...this.logDetails}); + } catch (e) { + logger.warn("Failed to load response body", {url, networkId, ...errJSON(e), ...this.logDetails}, "recorder"); + return false; + } + } + + const rewritten = await this.rewriteResponse(reqresp); + + // if in service worker, serialize here + // as won't be getting a loadingFinished message + if (isSWorker && reqresp.payload) { + this.removeReqResp(networkId); + await this.serializeToWARC(reqresp); + } + + // not rewritten, and not streaming, return false to continue + if (!rewritten && !streamingConsume) { + if (!reqresp.payload) { + logger.error("Unable to get payload skipping recording", {url, ...this.logDetails}, "recorder"); + this.removeReqResp(networkId); + } + return false; + } + + // if has payload, encode it, otherwise return empty string + const body = reqresp.payload && reqresp.payload.length ? Buffer.from(reqresp.payload).toString("base64") : ""; + + try { + await cdp.send("Fetch.fulfillRequest", { + requestId, + responseCode: responseStatusCode, + responseHeaders, + body + }); + } catch (e) { + const type = reqresp.type; + if (type === "Document") { + logger.debug("document not loaded in browser, possibly other URLs missing", {url, type: reqresp.resourceType}, "recorder"); + } else { + logger.debug("URL not loaded in browser", {url, type: reqresp.resourceType}, "recorder"); + } + } + + return true; + } + + startPage({pageid, url}) { + this.pageid = pageid; + this.logDetails = {page: url, workerid: this.workerid}; + if (this.pendingRequests && this.pendingRequests.size) { + logger.debug("Interrupting timed out requests, moving to next page", this.logDetails, "recorder"); + } + this.pendingRequests = new Map(); + this.skipIds = new Set(); + this.skipping = false; + } + + async finishPage() { + for (const [requestId, reqresp] of this.pendingRequests.entries()) { + if (reqresp.payload) { + this.removeReqResp(requestId); + await this.serializeToWARC(reqresp); + // no url, likely invalid + } else if (!reqresp.url) { + this.removeReqResp(requestId); + } + } + + let numPending = this.pendingRequests.size; + + while (numPending && !this.crawler.interrupted) { + const pending = []; + for (const [requestId, reqresp] of this.pendingRequests.entries()) { + const url = reqresp.url; + const entry = {requestId, url}; + if (reqresp.expectedSize) { + entry.expectedSize = reqresp.expectedSize; + } + if (reqresp.readSize) { + entry.readSize = reqresp.readSize; + } + pending.push(entry); + } + + logger.debug("Finishing pending requests for page", {numPending, pending, ...this.logDetails}, "recorder"); + await sleep(5.0); + numPending = this.pendingRequests.size; + } + } + + async onClosePage() { + // Any page-specific handling before page is closed. + } + + async onDone() { + await this.crawlState.setStatus("pending-wait"); + + logger.debug("Finishing Fetcher Queue", this.logDetails, "recorder"); + await this.fetcherQ.onIdle(); + + logger.debug("Finishing WARC writing", this.logDetails, "recorder"); + await this.warcQ.onIdle(); + + await this.writer.flush(); + } + + shouldSkip(headers, url, method, resourceType) { + if (headers && !method) { + method = headers[":method"]; + } + + if (!this.isValidUrl(url)) { + return true; + } + + if (method === "OPTIONS" || method === "HEAD") { + return true; + } + + if (["EventSource", "WebSocket", "Ping"].includes(resourceType)) { + return true; + } + + // beacon + if (resourceType === "Other" && method === "POST") { + return true; + } + + // skip eventsource, resourceType may not be set correctly + if (headers && (headers["accept"] === "text/event-stream" || headers["Accept"] === "text/event-stream")) { + return true; + } + + return false; + } + + async rewriteResponse(reqresp) { + const { url, responseHeadersList, extraOpts, payload } = reqresp; + + if (!payload || !payload.length) { + return false; + } + + let newString = null; + let string = null; + + const ct = this._getContentType(responseHeadersList); + + switch (ct) { + case "application/x-mpegURL": + case "application/vnd.apple.mpegurl": + string = payload.toString("utf-8"); + newString = rewriteHLS(string, {save: extraOpts}); + break; + + case "application/dash+xml": + string = payload.toString("utf-8"); + newString = rewriteDASH(string, {save: extraOpts}); + break; + + case "text/html": + case "application/json": + case "text/javascript": + case "application/javascript": + case "application/x-javascript": { + const rw = baseDSRules.getRewriter(url); + + if (rw !== baseDSRules.defaultRewriter) { + string = payload.toString("utf-8"); + newString = rw.rewrite(string, {live: true, save: extraOpts}); + } + break; + } + } + + if (!newString) { + return false; + } + + if (newString !== string) { + extraOpts.rewritten = 1; + logger.debug("Content Rewritten", {url, ...this.logDetails}, "recorder"); + reqresp.payload = encoder.encode(newString); + return true; + } else { + return false; + } + + //return Buffer.from(newString).toString("base64"); + } + + _getContentType(headers) { + for (let header of headers) { + if (header.name.toLowerCase() === "content-type") { + return header.value.split(";")[0]; + } + } + + return null; + } + + _getContentLen(headers) { + for (let header of headers) { + if (header.name.toLowerCase() === "content-length") { + return Number(header.value); + } + } + + return -1; + } + + _getContentRange(headers) { + for (let header of headers) { + if (header.name.toLowerCase() === "content-range") { + return header.value; + } + } + + return null; + } + + noResponseForStatus(status) { + return (!status || status === 204 || (status >= 300 && status < 400)); + } + + isValidUrl(url) { + return url && (url.startsWith("https:") || url.startsWith("http:")); + } + + pendingReqResp(requestId, reuseOnly = false) { + if (!this.pendingRequests.has(requestId)) { + if (reuseOnly || !requestId) { + return null; + } + if (this.skipIds.has(requestId)) { + logNetwork("Skipping ignored id", {requestId}); + return null; + } + if (this.skipping) { + //logger.debug("Skipping request, page already finished", this.logDetails, "recorder"); + return null; + } + const reqresp = new RequestResponseInfo(requestId); + this.pendingRequests.set(requestId, reqresp); + return reqresp; + } else { + const reqresp = this.pendingRequests.get(requestId); + if (requestId !== reqresp.requestId) { + logger.warn("Invalid request id", {requestId, actualRequestId: reqresp.requestId}, "recorder"); + } + return reqresp; + } + } + + removeReqResp(requestId, allowReuse=false) { + const reqresp = this.pendingRequests.get(requestId); + this.pendingRequests.delete(requestId); + if (!allowReuse) { + this.skipIds.add(requestId); + } + return reqresp; + } + + async serializeToWARC(reqresp) { + if (!reqresp.payload) { + logNetwork("Not writing, no payload", {url: reqresp.url}); + return; + } + + if (reqresp.method === "GET" && !await this.crawlState.addIfNoDupe(WRITE_DUPE_KEY, reqresp.url)) { + logNetwork("Skipping dupe", {url: reqresp.url}); + return; + } + + const responseRecord = createResponse(reqresp, this.pageid); + const requestRecord = createRequest(reqresp, responseRecord, this.pageid); + + this.warcQ.add(() => this.writer.writeRecordPair(responseRecord, requestRecord)); + } + + async directFetchCapture(url) { + const reqresp = new RequestResponseInfo(0); + reqresp.url = url; + reqresp.method = "GET"; + + logger.debug("Directly fetching page URL without browser", {url, ...this.logDetails}, "recorder"); + + const filter = (resp) => resp.status === 200 && !resp.headers.get("set-cookie"); + + // ignore dupes: if previous URL was not a page, still load as page. if previous was page, + // should not get here, as dupe pages tracked via seen list + const fetcher = new AsyncFetcher({tempdir: this.tempdir, reqresp, recorder: this, networkId: 0, filter, ignoreDupe: true}); + const res = await fetcher.load(); + + const mime = reqresp && reqresp.responseHeaders["content-type"] && reqresp.responseHeaders["content-type"].split(";")[0]; + + return {fetched: res === "fetched", mime}; + } +} + +// ================================================================= +class AsyncFetcher +{ + constructor({tempdir, reqresp, expectedSize = -1, recorder, networkId, filter = null, ignoreDupe = false}) { + this.reqresp = reqresp; + this.reqresp.expectedSize = expectedSize; + this.reqresp.asyncLoading = true; + + this.networkId = networkId; + this.filter = filter; + this.ignoreDupe = ignoreDupe; + + this.recorder = recorder; + + this.tempdir = tempdir; + this.filename = path.join(this.tempdir, `${timestampNow()}-${uuidv4()}.data`); + } + + async load() { + const { reqresp, recorder, networkId, filename } = this; + const { url } = reqresp; + + const { pageid, crawlState, gzip, logDetails } = recorder; + + let fetched = "notfetched"; + + try { + if (reqresp.method === "GET" && !await crawlState.addIfNoDupe(ASYNC_FETCH_DUPE_KEY, url)) { + if (!this.ignoreDupe) { + this.reqresp.asyncLoading = false; + return "dupe"; + } + } + + const body = await this._doFetch(); + fetched = "fetched"; + + const responseRecord = createResponse(reqresp, pageid, body); + const requestRecord = createRequest(reqresp, responseRecord, pageid); + + const serializer = new WARCSerializer(responseRecord, {gzip, maxMemSize: MAX_BROWSER_FETCH_SIZE}); + + try { + let readSize = await serializer.digestRecord(); + if (serializer.httpHeadersBuff) { + readSize -= serializer.httpHeadersBuff.length; + } + reqresp.readSize = readSize; + } catch (e) { + logger.error("Error reading + digesting payload", {url, filename, ...errJSON(e), ...logDetails}, "recorder"); + } + + if (reqresp.readSize === reqresp.expectedSize || reqresp.expectedSize < 0) { + logger.debug("Async fetch: streaming done", {size: reqresp.readSize, expected: reqresp.expectedSize, networkId, url, ...logDetails}, "recorder"); + + } else { + logger.warn("Async fetch: possible response size mismatch", {size: reqresp.readSize, expected: reqresp.expectedSize, url, ...logDetails}, "recorder"); + //await crawlState.removeDupe(ASYNC_FETCH_DUPE_KEY, url); + //return fetched; + } + + const externalBuffer = serializer.externalBuffer; + + if (externalBuffer) { + const { currSize, buffers, fh } = externalBuffer; + + if (buffers && buffers.length && !fh) { + reqresp.payload = Buffer.concat(buffers, currSize); + externalBuffer.buffers = [reqresp.payload]; + } + } + + if (Object.keys(reqresp.extraOpts).length) { + responseRecord.warcHeaders["WARC-JSON-Metadata"] = JSON.stringify(reqresp.extraOpts); + } + + recorder.warcQ.add(() => recorder.writer.writeRecordPair(responseRecord, requestRecord, serializer)); + + } catch (e) { + logger.error("Streaming Fetch Error", {url, networkId, filename, ...errJSON(e), ...logDetails}, "recorder"); + await crawlState.removeDupe(ASYNC_FETCH_DUPE_KEY, url); + } finally { + recorder.removeReqResp(networkId); + } + + return fetched; + } + + async _doFetch() { + const { reqresp } = this; + const { method, url } = reqresp; + logger.debug("Async started: fetch", {url}, "recorder"); + + const headers = reqresp.getRequestHeadersDict(); + + let signal = null; + let abort = null; + + if (this.filter) { + abort = new AbortController(); + signal = abort.signal; + } + + const resp = await fetch(url, {method, headers, body: reqresp.postData || undefined, signal}); + + if (this.filter && !this.filter(resp)) { + abort.abort(); + throw new Error("invalid response, ignoring fetch"); + } + + if (reqresp.expectedSize < 0 && resp.headers.get("content-length") && !resp.headers.get("content-encoding")) { + reqresp.expectedSize = Number(resp.headers.get("content-length") || -1); + } + + if (reqresp.expectedSize === 0) { + reqresp.payload = new Uint8Array(); + return; + + } else if (!resp.body) { + logger.error("Empty body, stopping fetch", {url}, "recorder"); + await this.recorder.crawlState.removeDupe(ASYNC_FETCH_DUPE_KEY, url); + return; + } + + reqresp.fillFetchResponse(resp); + + return this.takeReader(resp.body.getReader()); + } + + async* takeReader(reader) { + try { + while (true) { + const { value, done } = await reader.read(); + if (done) { + break; + } + + yield value; + } + } catch (e) { + logger.warn("takeReader interrupted", {...errJSON(e), url: this.reqresp.url, ...this.recorder.logDetails}, "recorder"); + this.reqresp.truncated = "disconnect"; + } + } + + async* takeStreamIter(cdp, stream) { + try { + while (true) { + const {data, base64Encoded, eof} = await cdp.send("IO.read", {handle: stream}); + const buff = Buffer.from(data, base64Encoded ? "base64" : "utf-8"); + + yield buff; + + if (eof) { + break; + } + } + } catch (e) { + logger.warn("takeStream interrupted", {...errJSON(e), url: this.reqresp.url, ...this.recorder.logDetails}, "recorder"); + this.reqresp.truncated = "disconnect"; + } + } +} + +// ================================================================= +class ResponseStreamAsyncFetcher extends AsyncFetcher +{ + constructor(opts) { + super(opts); + this.cdp = opts.cdp; + this.requestId = opts.requestId; + } + + async _doFetch() { + const { requestId, reqresp, cdp } = this; + const { url } = reqresp; + logger.debug("Async started: takeStream", {url}, "recorder"); + + const { stream } = await cdp.send("Fetch.takeResponseBodyAsStream", {requestId}); + + return this.takeStreamIter(cdp, stream); + } +} + +// ================================================================= +class NetworkLoadStreamAsyncFetcher extends AsyncFetcher +{ + constructor(opts) { + super(opts); + this.cdp = opts.cdp; + } + + async _doFetch() { + const { reqresp, cdp } = this; + const { url } = reqresp; + logger.debug("Async started: loadNetworkResource", {url}, "recorder"); + + const options = {disableCache: false, includeCredentials: true}; + + let result = null; + + try { + result = await cdp.send("Network.loadNetworkResource", {frameId: reqresp.frameId, url, options}); + } catch (e) { + logger.debug("Network.loadNetworkResource failed, attempting node fetch", {url, ...errJSON(e), ...this.recorder.logDetails}, "recorder"); + return await super._doFetch(); + } + + const { stream, headers, httpStatusCode, success, netError, netErrorName } = result.resource; + + if (!success || !stream) { + //await this.recorder.crawlState.removeDupe(ASYNC_FETCH_DUPE_KEY, url); + logger.debug("Network.loadNetworkResource failed, attempting node fetch", {url, netErrorName, netError, httpStatusCode, ...this.recorder.logDetails}, "recorder"); + return await super._doFetch(); + } + + if (reqresp.expectedSize < 0 && headers && headers["content-length"] && !headers["content-encoding"]) { + reqresp.expectedSize = Number(headers["content-length"] || -1); + } + + if (reqresp.expectedSize === 0) { + reqresp.payload = new Uint8Array(); + return; + } + + reqresp.status = httpStatusCode; + reqresp.responseHeaders = headers || {}; + + return this.takeStreamIter(cdp, stream); + } +} + +// ================================================================= +// response +function createResponse(reqresp, pageid, contentIter) { + const url = reqresp.url; + const warcVersion = "WARC/1.1"; + const statusline = `HTTP/1.1 ${reqresp.status} ${reqresp.statusText}`; + const date = new Date().toISOString(); + + const httpHeaders = reqresp.getResponseHeadersDict(reqresp.payload ? reqresp.payload.length : null); + + const warcHeaders = { + "WARC-Page-ID": pageid, + }; + + if (reqresp.truncated) { + warcHeaders["WARC-Truncated"] = reqresp.truncated; + } + + if (!contentIter) { + contentIter = [reqresp.payload]; + } + + if (Object.keys(reqresp.extraOpts).length) { + warcHeaders["WARC-JSON-Metadata"] = JSON.stringify(reqresp.extraOpts); + } + + return WARCRecord.create({ + url, date, warcVersion, type: "response", warcHeaders, + httpHeaders, statusline}, contentIter); +} + +// ================================================================= +// request +function createRequest(reqresp, responseRecord, pageid) { + const url = reqresp.url; + const warcVersion = "WARC/1.1"; + const method = reqresp.method; + + const urlParsed = new URL(url); + + const statusline = `${method} ${url.slice(urlParsed.origin.length)} HTTP/1.1`; + + const requestBody = reqresp.postData ? [encoder.encode(reqresp.postData)] : []; + + const httpHeaders = reqresp.getRequestHeadersDict(); + + const warcHeaders = { + "WARC-Concurrent-To": responseRecord.warcHeader("WARC-Record-ID"), + "WARC-Page-ID": pageid, + }; + + const date = responseRecord.warcDate; + + return WARCRecord.create({ + url, date, warcVersion, type: "request", warcHeaders, + httpHeaders, statusline}, requestBody); +} diff --git a/util/reqresp.js b/util/reqresp.js new file mode 100644 index 00000000..d5c86020 --- /dev/null +++ b/util/reqresp.js @@ -0,0 +1,239 @@ +import { getStatusText } from "@webrecorder/wabac/src/utils.js"; + +const CONTENT_LENGTH = "content-length"; +const CONTENT_TYPE = "content-type"; +const EXCLUDE_HEADERS = ["content-encoding", "transfer-encoding"]; + + +// =========================================================================== +export class RequestResponseInfo +{ + constructor(requestId) { + this._created = new Date(); + + this.requestId = requestId; + + this.ts = null; + + // request data + this.method = null; + this.url = null; + this.protocol = "HTTP/1.1"; + + this.requestHeaders = null; + this.requestHeadersText = null; + + this.postData = null; + this.hasPostData = false; + + // response data + this.status = 0; + this.statusText = null; + + this.responseHeaders = null; + this.responseHeadersList = null; + this.responseHeadersText = null; + + this.payload = null; + + this.fromServiceWorker = false; + + this.fetch = false; + + this.resourceType = null; + + this.extraOpts = {}; + + this.readSize = 0; + this.expectedSize = 0; + + // set to true to indicate async loading in progress + this.asyncLoading = false; + + // set to add truncated message + this.truncated = null; + } + + fillRequest(params) { + this.url = params.request.url; + this.method = params.request.method; + if (!this.requestHeaders) { + this.requestHeaders = params.request.headers; + } + this.postData = params.request.postData; + this.hasPostData = params.request.hasPostData; + + if (params.type) { + this.resourceType = params.type; + } + + } + + fillFetchRequestPaused(params) { + this.fillRequest(params); + + this.status = params.responseStatusCode; + this.statusText = params.responseStatusText || getStatusText(this.status); + + this.responseHeadersList = params.responseHeaders; + + this.fetch = true; + this.resourceType = params.resourceType; + + this.frameId = params.frameId; + } + + fillResponse(response) { + // if initial fetch was a 200, but now replacing with 304, don't! + if (response.status == 304 && this.status && this.status != 304 && this.url) { + return; + } + + this.url = response.url.split("#")[0]; + + this.status = response.status; + this.statusText = response.statusText || getStatusText(this.status); + + this.protocol = response.protocol; + + if (response.requestHeaders) { + this.requestHeaders = response.requestHeaders; + } + if (response.requestHeadersText) { + this.requestHeadersText = response.requestHeadersText; + } + + this.responseHeaders = response.headers; + + if (response.headersText) { + this.responseHeadersText = response.headersText; + } + + this.fromServiceWorker = !!response.fromServiceWorker; + + if (response.securityDetails) { + const issuer = response.securityDetails.issuer || ""; + const ctc = response.securityDetails.certificateTransparencyCompliance === "compliant" ? "1" : "0"; + this.extraOpts.cert = {issuer, ctc}; + } + } + + isSelfRedirect() { + if (this.status < 300 || this.status >= 400 || this.status === 304) { + return false; + } + try { + const headers = new Headers(this.responseHeaders); + const redirUrl = new URL(headers.get("location"), this.url).href; + return this.url === redirUrl; + } catch (e) { + return false; + } + } + + fillResponseReceivedExtraInfo(params) { + // this.responseHeaders = params.headers; + // if (params.headersText) { + // this.responseHeadersText = params.headersText; + // } + this.extraOpts.ipType = params.resourceIPAddressSpace; + } + + fillFetchResponse(response) { + this.responseHeaders = Object.fromEntries(response.headers); + this.status = response.status; + this.statusText = response.statusText || getStatusText(this.status); + + } + + fillRequestExtraInfo(params) { + this.requestHeaders = params.headers; + } + + getResponseHeadersText() { + let headers = `${this.protocol} ${this.status} ${this.statusText}\r\n`; + + for (const header of Object.keys(this.responseHeaders)) { + headers += `${header}: ${this.responseHeaders[header].replace(/\n/g, ", ")}\r\n`; + } + headers += "\r\n"; + return headers; + } + + hasRequest() { + return this.method && (this.requestHeaders || this.requestHeadersText); + } + + getRequestHeadersDict() { + return this._getHeadersDict(this.requestHeaders, null); + } + + getResponseHeadersDict(length) { + return this._getHeadersDict(this.responseHeaders, this.responseHeadersList, length); + } + + _getHeadersDict(headersDict, headersList, actualContentLength) { + if (!headersDict && headersList) { + headersDict = {}; + + for (const header of headersList) { + let headerName = header.name.toLowerCase(); + if (EXCLUDE_HEADERS.includes(headerName)) { + headerName = "x-orig-" + headerName; + continue; + } + if (actualContentLength && headerName === CONTENT_LENGTH) { + headersDict[headerName] = "" + actualContentLength; + continue; + } + headersDict[headerName] = header.value.replace(/\n/g, ", "); + } + } + + if (!headersDict) { + return {}; + } + + for (const key of Object.keys(headersDict)) { + if (key[0] === ":") { + delete headersDict[key]; + continue; + } + const keyLower = key.toLowerCase(); + if (EXCLUDE_HEADERS.includes(keyLower)) { + headersDict["x-orig-" + key] = headersDict[key]; + delete headersDict[key]; + continue; + } + if (actualContentLength && keyLower === CONTENT_LENGTH) { + headersDict[key] = "" + actualContentLength; + continue; + } + headersDict[key] = headersDict[key].replace(/\n/g, ", "); + } + + return headersDict; + } + + isValidBinary() { + if (!this.payload) { + return false; + } + + const length = this.payload.length; + + const headers = new Headers(this.getResponseHeadersDict()); + const contentType = headers.get(CONTENT_TYPE); + const contentLength = headers.get(CONTENT_LENGTH); + + if (Number(contentLength) !== length) { + return false; + } + + if (contentType && contentType.startsWith("text/html")) { + return false; + } + + return true; + } +} diff --git a/util/state.js b/util/state.js index 5e0de505..8c2473b7 100644 --- a/util/state.js +++ b/util/state.js @@ -31,6 +31,7 @@ export class PageState this.extraHops = redisData.extraHops; this.workerid = null; + this.pageid = null; this.title = null; this.isHTMLPage = null; @@ -550,6 +551,14 @@ return 0; return this._lastSize; } + async addIfNoDupe(key, value) { + return await this.redis.sadd(key, value) === 1; + } + + async removeDupe(key, value) { + return await this.redis.srem(key, value); + } + async logError(error) { return await this.redis.lpush(this.ekey, error); } diff --git a/util/timing.js b/util/timing.js index b0f63c2d..56b7f9c1 100644 --- a/util/timing.js +++ b/util/timing.js @@ -31,3 +31,7 @@ export function secondsElapsed(startTime, nowDate = null) { return (nowDate.getTime() - startTime) / 1000; } + +export function timestampNow() { + return new Date().toISOString().replace(/[^\d]/g, ""); +} diff --git a/util/warcwriter.js b/util/warcwriter.js new file mode 100644 index 00000000..0ff26666 --- /dev/null +++ b/util/warcwriter.js @@ -0,0 +1,111 @@ +import fs from "fs"; +import path from "path"; + +import { CDXIndexer } from "warcio"; +import { WARCSerializer } from "warcio/node"; +import { logger, errJSON } from "./logger.js"; + + +// ================================================================= +export class WARCWriter +{ + constructor({archivesDir, tempCdxDir, filename, gzip, logDetails}) { + this.archivesDir = archivesDir; + this.tempCdxDir = tempCdxDir; + this.filename = filename; + this.gzip = gzip; + this.logDetails = logDetails; + + this.offset = 0; + this.recordLength = 0; + + if (this.tempCdxDir) { + this.indexer = new CDXIndexer({format: "cdxj"}); + } else { + this.indexer = null; + } + + this.fh = null; + this.cdxFH = null; + } + + async initFH() { + if (!this.fh) { + this.fh = fs.createWriteStream(path.join(this.archivesDir, this.filename)); + } + if (!this.cdxFH && this.tempCdxDir) { + this.cdxFH = fs.createWriteStream(path.join(this.tempCdxDir, this.filename + ".cdx")); + } + } + + async writeRecordPair(responseRecord, requestRecord, responseSerializer = null) { + const opts = {gzip: this.gzip}; + + if (!responseSerializer) { + responseSerializer = new WARCSerializer(responseRecord, opts); + } + + await this.initFH(); + + this.recordLength = await this._writeRecord(responseRecord, responseSerializer); + + this._writeCDX(responseRecord); + + const requestSerializer = new WARCSerializer(requestRecord, opts); + this.recordLength = await this._writeRecord(requestRecord, requestSerializer); + + this._writeCDX(requestRecord); + + } + + async _writeRecord(record, serializer) { + let total = 0; + const url = record.warcTargetURI; + + for await (const chunk of serializer) { + total += chunk.length; + try { + this.fh.write(chunk); + } catch (e) { + logger.error("Error writing to WARC, corruption possible", {...errJSON(e), url, ...this.logDetails}, "writer"); + } + } + + return total; + } + + _writeCDX(record) { + if (this.indexer) { + const cdx = this.indexer.indexRecord(record, this, this.filename); + + if (this.indexer && this.cdxFH && cdx) { + this.indexer.write(cdx, this.cdxFH); + } + } + + this.offset += this.recordLength; + } + + async flush() { + if (this.fh) { + await streamFinish(this.fh); + this.fh = null; + } + + if (this.cdxFH) { + this._writeCDX(null); + + await streamFinish(this.cdxFH); + this.cdxFH = null; + } + } +} + +// ================================================================= +export function streamFinish(fh) { + const p = new Promise(resolve => { + fh.once("finish", () => resolve()); + }); + fh.end(); + return p; +} diff --git a/util/worker.js b/util/worker.js index e88fcf7f..148b6983 100644 --- a/util/worker.js +++ b/util/worker.js @@ -1,6 +1,10 @@ import os from "os"; + +import { v4 as uuidv4 } from "uuid"; + import { logger, errJSON } from "./logger.js"; import { sleep, timedRun } from "./timing.js"; +import { Recorder } from "./recorder.js"; import { rxEscape } from "./seeds.js"; const MAX_REUSE = 5; @@ -10,7 +14,7 @@ const TEARDOWN_TIMEOUT = 10; const FINISHED_TIMEOUT = 60; // =========================================================================== -export function runWorkers(crawler, numWorkers, maxPageTime) { +export function runWorkers(crawler, numWorkers, maxPageTime, collDir) { logger.info(`Creating ${numWorkers} workers`, {}, "worker"); const workers = []; @@ -31,8 +35,7 @@ export function runWorkers(crawler, numWorkers, maxPageTime) { } for (let i = 0; i < numWorkers; i++) { - //workers.push(new PageWorker(`worker-${i+1}`, crawler, maxPageTime)); - workers.push(new PageWorker(i + offset, crawler, maxPageTime)); + workers.push(new PageWorker(i + offset, crawler, maxPageTime, collDir)); } return Promise.allSettled(workers.map((worker) => worker.run())); @@ -42,7 +45,7 @@ export function runWorkers(crawler, numWorkers, maxPageTime) { // =========================================================================== export class PageWorker { - constructor(id, crawler, maxPageTime) { + constructor(id, crawler, maxPageTime, collDir) { this.id = id; this.crawler = crawler; this.maxPageTime = maxPageTime; @@ -59,6 +62,10 @@ export class PageWorker this.crashed = false; this.markCrashed = null; this.crashBreak = null; + + this.recorder = new Recorder({workerid: id, collDir, crawler: this.crawler}); + + this.crawler.browser.recorders.push(this.recorder); } async closePage() { @@ -66,6 +73,10 @@ export class PageWorker return; } + if (this.recorder) { + await this.recorder.onClosePage(); + } + if (!this.crashed) { try { await timedRun( @@ -140,7 +151,18 @@ export class PageWorker this.page = page; this.cdp = cdp; this.callbacks = {}; - this.opts = {page: this.page, cdp: this.cdp, workerid, callbacks: this.callbacks}; + const directFetchCapture = this.recorder ? (x) => this.recorder.directFetchCapture(x) : null; + this.opts = { + page: this.page, + cdp: this.cdp, + workerid, + callbacks: this.callbacks, + directFetchCapture, + }; + + if (this.recorder) { + await this.recorder.onCreatePage(this.opts); + } // updated per page crawl this.crashed = false; @@ -184,6 +206,14 @@ export class PageWorker } } + async crawlPage(opts) { + const res = await this.crawler.crawlPage(opts); + if (this.recorder) { + await this.recorder.finishPage(); + } + return res; + } + async timedCrawlPage(opts) { const workerid = this.id; const { data } = opts; @@ -193,10 +223,18 @@ export class PageWorker this.logDetails = {page: url, workerid}; + // set new page id + const pageid = uuidv4(); + data.pageid = pageid; + + if (this.recorder) { + this.recorder.startPage({pageid, url}); + } + try { await Promise.race([ timedRun( - this.crawler.crawlPage(opts), + this.crawlPage(opts), this.maxPageTime, "Page Worker Timeout", this.logDetails, @@ -225,9 +263,13 @@ export class PageWorker try { await this.runLoop(); - logger.info("Worker exiting, all tasks complete", {workerid: this.id}, "worker"); + logger.info("Worker done, all tasks complete", {workerid: this.id}, "worker"); } catch (e) { logger.error("Worker error, exiting", {...errJSON(e), workerid: this.id}, "worker"); + } finally { + if (this.recorder) { + await this.recorder.onDone(); + } } } diff --git a/yarn.lock b/yarn.lock index bb4023a8..a00f0e3d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10,13 +10,6 @@ "@jridgewell/gen-mapping" "^0.1.0" "@jridgewell/trace-mapping" "^0.3.9" -"@babel/code-frame@7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" - integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== - dependencies: - "@babel/highlight" "^7.10.4" - "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658" @@ -170,7 +163,7 @@ "@babel/traverse" "^7.19.4" "@babel/types" "^7.19.4" -"@babel/highlight@^7.10.4", "@babel/highlight@^7.12.13": +"@babel/highlight@^7.12.13": version "7.14.0" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.0.tgz#3197e375711ef6bf834e67d0daec88e4f46113cf" integrity sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg== @@ -352,21 +345,57 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@eslint/eslintrc@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.1.tgz#442763b88cecbe3ee0ec7ca6d6dd6168550cbf14" - integrity sha512-5v7TDE9plVhvxQeWLXDTvFvJBdH6pEsdnl2g/dAptmuFEPedQ4Erq5rsDsX+mvAM610IhNaO2W5V1dOOnDKxkQ== +"@eslint-community/eslint-utils@^4.2.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.4.0": + version "4.5.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.5.0.tgz#f6f729b02feee2c749f57e334b7a1b5f40a81724" + integrity sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ== + +"@eslint/eslintrc@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.0.2.tgz#01575e38707add677cf73ca1589abba8da899a02" + integrity sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ== dependencies: ajv "^6.12.4" - debug "^4.1.1" - espree "^7.3.0" - globals "^12.1.0" - ignore "^4.0.6" + debug "^4.3.2" + espree "^9.5.1" + globals "^13.19.0" + ignore "^5.2.0" import-fresh "^3.2.1" - js-yaml "^3.13.1" - minimatch "^3.0.4" + js-yaml "^4.1.0" + minimatch "^3.1.2" strip-json-comments "^3.1.1" +"@eslint/js@8.37.0": + version "8.37.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.37.0.tgz#cf1b5fa24217fe007f6487a26d765274925efa7d" + integrity sha512-x5vzdtOOGgFVDCUs81QRB2+liax8rFg3+7hqM+QhBG0/G3F1ZsoYl97UrqgHgQ9KKT7G6c4V+aTUCgu/n22v1A== + +"@humanwhocodes/config-array@^0.11.8": + version "0.11.8" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz#03595ac2075a4dc0f191cc2131de14fbd7d410b9" + integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" @@ -615,21 +644,166 @@ "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + "@novnc/novnc@^1.4.0": version "1.4.0" resolved "https://registry.yarnpkg.com/@novnc/novnc/-/novnc-1.4.0.tgz#68adae81a741624142b518323441e852c1f34281" integrity sha512-kW6ALMc5BuH08e/ond/I1naYcfjc19JYMN1EdtmgjjjzPGCjW8fMtVM3MwM6q7YLRjPlQ3orEvoKMgSS7RkEVQ== -"@puppeteer/browsers@1.4.3": - version "1.4.3" - resolved "https://registry.yarnpkg.com/@puppeteer/browsers/-/browsers-1.4.3.tgz#39bfd8bf999d707ed2914b036fa2febac2960985" - integrity sha512-8Jfkpb8qhPQhMsNBmIY8b6+ic2kvcmHZlyvifmcNKBC5jNZf3MAKq3gryKfmrjFAYFl3naPjiKljPUq5wuolfQ== +"@peculiar/asn1-cms@^2.3.4", "@peculiar/asn1-cms@^2.3.6": + version "2.3.6" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-cms/-/asn1-cms-2.3.6.tgz#bf588c19ce0feaa7616543140d7f9cd3d79c3a3b" + integrity sha512-Kr0XsyjuElTc4NijuPYyd6YkTlbz0KCuoWnNkfPFhXjHTzbUIh/s15ixjxLj8XDrXsI1aPQp3D64uHbrs3Kuyg== + dependencies: + "@peculiar/asn1-schema" "^2.3.6" + "@peculiar/asn1-x509" "^2.3.6" + "@peculiar/asn1-x509-attr" "^2.3.6" + asn1js "^3.0.5" + tslib "^2.4.0" + +"@peculiar/asn1-csr@^2.3.4": + version "2.3.6" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-csr/-/asn1-csr-2.3.6.tgz#53167eebd6cacd8c7caa16d562e231bd80d5602f" + integrity sha512-gCTEB/PvUxapmxo4SzGZT1JtEdevRnphRGZZmc9oJE7+pLuj2Px0Q6x+w8VvObfozA3pyPRTq+Wkocnu64+oLw== + dependencies: + "@peculiar/asn1-schema" "^2.3.6" + "@peculiar/asn1-x509" "^2.3.6" + asn1js "^3.0.5" + tslib "^2.4.0" + +"@peculiar/asn1-ecc@^2.3.4": + version "2.3.6" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-ecc/-/asn1-ecc-2.3.6.tgz#f155f33f5c61df463d9b33b911d25578a19694b7" + integrity sha512-Hu1xzMJQWv8/GvzOiinaE6XiD1/kEhq2C/V89UEoWeZ2fLUcGNIvMxOr/pMyL0OmpRWj/mhCTXOZp4PP+a0aTg== + dependencies: + "@peculiar/asn1-schema" "^2.3.6" + "@peculiar/asn1-x509" "^2.3.6" + asn1js "^3.0.5" + tslib "^2.4.0" + +"@peculiar/asn1-pfx@^2.3.6": + version "2.3.6" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-pfx/-/asn1-pfx-2.3.6.tgz#86c5d59cc9194c07b183148b699134a4969f78da" + integrity sha512-bScrrpQ59mppcoZLkDEW/Wruu+daSWQxpR2vqGjg69+v7VoQ1Le/Elm10ObfNShV2eNNridNQcOQvsHMLvUOCg== + dependencies: + "@peculiar/asn1-cms" "^2.3.6" + "@peculiar/asn1-pkcs8" "^2.3.6" + "@peculiar/asn1-rsa" "^2.3.6" + "@peculiar/asn1-schema" "^2.3.6" + asn1js "^3.0.5" + tslib "^2.4.0" + +"@peculiar/asn1-pkcs8@^2.3.6": + version "2.3.6" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.3.6.tgz#4d26a1dd10a57dc3780b7ebe8046c44221a9e008" + integrity sha512-poqgdjsHNiyR0gnxP8l5VjRInSgpQvOM3zLULF/ZQW67uUsEiuPfplvaNJUlNqNOCd2szGo9jKW9+JmVVpWojA== + dependencies: + "@peculiar/asn1-schema" "^2.3.6" + "@peculiar/asn1-x509" "^2.3.6" + asn1js "^3.0.5" + tslib "^2.4.0" + +"@peculiar/asn1-pkcs9@^2.3.4": + version "2.3.6" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.3.6.tgz#9f81c6eecd6231f79ff67dbce32636aed1359646" + integrity sha512-uaxSBF60glccuu5BEZvoPsaJzebVYcQRjXx2wXsGe7Grz/BXtq5RQAJ/3i9fEXawFK/zIbvbXBBpy07cnvrqhA== + dependencies: + "@peculiar/asn1-cms" "^2.3.6" + "@peculiar/asn1-pfx" "^2.3.6" + "@peculiar/asn1-pkcs8" "^2.3.6" + "@peculiar/asn1-schema" "^2.3.6" + "@peculiar/asn1-x509" "^2.3.6" + "@peculiar/asn1-x509-attr" "^2.3.6" + asn1js "^3.0.5" + tslib "^2.4.0" + +"@peculiar/asn1-rsa@^2.3.4", "@peculiar/asn1-rsa@^2.3.6": + version "2.3.6" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-rsa/-/asn1-rsa-2.3.6.tgz#e2af2c52a914c60f33853a86a48905ec555b29c2" + integrity sha512-DswjJyAXZnvESuImGNTvbNKvh1XApBVqU+r3UmrFFTAI23gv62byl0f5OFKWTNhCf66WQrd3sklpsCZc/4+jwA== + dependencies: + "@peculiar/asn1-schema" "^2.3.6" + "@peculiar/asn1-x509" "^2.3.6" + asn1js "^3.0.5" + tslib "^2.4.0" + +"@peculiar/asn1-schema@^2.3.3", "@peculiar/asn1-schema@^2.3.6": + version "2.3.6" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-schema/-/asn1-schema-2.3.6.tgz#3dd3c2ade7f702a9a94dfb395c192f5fa5d6b922" + integrity sha512-izNRxPoaeJeg/AyH8hER6s+H7p4itk+03QCa4sbxI3lNdseQYCuxzgsuNK8bTXChtLTjpJz6NmXKA73qLa3rCA== + dependencies: + asn1js "^3.0.5" + pvtsutils "^1.3.2" + tslib "^2.4.0" + +"@peculiar/asn1-x509-attr@^2.3.6": + version "2.3.6" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.3.6.tgz#b187b049e4075ec36f4ad2a836d557a2b3c6990b" + integrity sha512-x5Kax8xp3fz+JSc+4Sq0/SUXIdbJeOePibYqvjHMGkP6AoeCOVcP+gg7rZRRGkTlDSyQnAoUTgTEsfAfFEd1/g== + dependencies: + "@peculiar/asn1-schema" "^2.3.6" + "@peculiar/asn1-x509" "^2.3.6" + asn1js "^3.0.5" + tslib "^2.4.0" + +"@peculiar/asn1-x509@^2.3.4", "@peculiar/asn1-x509@^2.3.6": + version "2.3.6" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-x509/-/asn1-x509-2.3.6.tgz#e50154a460cdf43da8a41b23ee807a53e0036af0" + integrity sha512-dRwX31R1lcbIdzbztiMvLNTDoGptxdV7HocNx87LfKU0fEWh7fTWJjx4oV+glETSy6heF/hJHB2J4RGB3vVSYg== + dependencies: + "@peculiar/asn1-schema" "^2.3.6" + asn1js "^3.0.5" + ipaddr.js "^2.0.1" + pvtsutils "^1.3.2" + tslib "^2.4.0" + +"@peculiar/x509@^1.9.2": + version "1.9.3" + resolved "https://registry.yarnpkg.com/@peculiar/x509/-/x509-1.9.3.tgz#a61e3dcc54ec568f6ba9325fb751a5fb01db15a6" + integrity sha512-rv1TrPi85jOtBJ7Xmqx08p3QPIE2avd5CWgtiwOIAbhV3hoUCLlGIUtXn9CuShfFBCjGy8EnZRQ6YbNFaDL8vw== + dependencies: + "@peculiar/asn1-cms" "^2.3.4" + "@peculiar/asn1-csr" "^2.3.4" + "@peculiar/asn1-ecc" "^2.3.4" + "@peculiar/asn1-pkcs9" "^2.3.4" + "@peculiar/asn1-rsa" "^2.3.4" + "@peculiar/asn1-schema" "^2.3.3" + "@peculiar/asn1-x509" "^2.3.4" + pvtsutils "^1.3.2" + reflect-metadata "^0.1.13" + tslib "^2.4.1" + tsyringe "^4.7.0" + +"@puppeteer/browsers@1.4.6": + version "1.4.6" + resolved "https://registry.yarnpkg.com/@puppeteer/browsers/-/browsers-1.4.6.tgz#1f70fd23d5d2ccce9d29b038e5039d7a1049ca77" + integrity sha512-x4BEjr2SjOPowNeiguzjozQbsc6h437ovD/wu+JpaenxVLm3jkgzHY2xOslMTp50HoTvQreMjiexiGQw1sqZlQ== dependencies: debug "4.3.4" extract-zip "2.0.1" progress "2.0.3" - proxy-agent "6.2.1" - tar-fs "3.0.3" + proxy-agent "6.3.0" + tar-fs "3.0.4" unbzip2-stream "1.4.3" yargs "17.7.1" @@ -664,6 +838,11 @@ dependencies: defer-to-connect "^2.0.0" +"@tootallnate/quickjs-emscripten@^0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz#db4ecfd499a9765ab24002c3b696d02e6d32a12c" + integrity sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA== + "@types/babel__core@^7.1.14": version "7.1.19" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.19.tgz#7b497495b7d1b4812bdb9d02804d0576f43ee460" @@ -786,27 +965,58 @@ dependencies: "@types/node" "*" +"@webrecorder/wabac@^2.16.12": + version "2.16.12" + resolved "https://registry.yarnpkg.com/@webrecorder/wabac/-/wabac-2.16.12.tgz#cf9ce5490cffcc34f0c1c4a30245276a094d78b2" + integrity sha512-lqu9L4Ig2TWzt3t7cKs2CH9epkSt0k09NLx58xzytcHiH2sSEMpk5/ZvBQhNEjjd9Hb2gh3G7Clf7qdXB6b8lA== + dependencies: + "@peculiar/asn1-ecc" "^2.3.4" + "@peculiar/asn1-schema" "^2.3.3" + "@peculiar/x509" "^1.9.2" + "@webrecorder/wombat" "^3.6.1" + acorn "^8.10.0" + auto-js-ipfs "^2.1.1" + base64-js "^1.5.1" + brotli "^1.3.3" + buffer "^6.0.3" + fast-xml-parser "^4.2.5" + hash-wasm "^4.9.0" + http-link-header "^1.1.0" + http-status-codes "^2.1.4" + idb "^7.1.1" + js-levenshtein "^1.1.6" + js-yaml "^4.1.0" + pako "^1.0.11" + parse5-html-rewriting-stream "^7.0.0" + parse5-sax-parser "^7.0.0" + path-parser "^6.1.0" + process "^0.11.10" + stream-browserify "^3.0.0" + warcio "^2.2.0" + +"@webrecorder/wombat@^3.6.1": + version "3.6.1" + resolved "https://registry.yarnpkg.com/@webrecorder/wombat/-/wombat-3.6.1.tgz#55e23a2c0df28ad8e6d67b87fffd913a101f6982" + integrity sha512-yJ5NBf/ERCBz07cFA4phIQCpj6U/28HWFk67V+yg3S3GSAAmlFP8dC9g1z+JO77PKuAe/qlrzO6CcS0VyUr5Ww== + dependencies: + warcio "^2.2.0" + "@zxing/text-encoding@0.9.0": version "0.9.0" resolved "https://registry.yarnpkg.com/@zxing/text-encoding/-/text-encoding-0.9.0.tgz#fb50ffabc6c7c66a0c96b4c03e3d9be74864b70b" integrity sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA== -acorn-jsx@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" - integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn-walk@^8.2.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== +acorn@^8.10.0: + version "8.10.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== -acorn@^7.4.0: - version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - -acorn@^8.7.0: +acorn@^8.8.0: version "8.8.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== @@ -828,21 +1038,6 @@ ajv@^6.10.0, ajv@^6.12.4: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.1: - version "8.4.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.4.0.tgz#48984fdb2ce225cab15795f0772a8d85669075e4" - integrity sha512-7QD2l6+KBSLwf+7MuYocbWvRPdOu63/trReTLu2KFwkgctnub1auoF+Y1WYcm09CTM7quuscrzqmASaLHC/K4Q== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -ansi-colors@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" - integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== - ansi-escapes@^4.2.1: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" @@ -930,23 +1125,32 @@ asn1.js@^5.2.0: minimalistic-assert "^1.0.0" safer-buffer "^2.1.0" -ast-types@^0.13.2: +asn1js@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/asn1js/-/asn1js-3.0.5.tgz#5ea36820443dbefb51cc7f88a2ebb5b462114f38" + integrity sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ== + dependencies: + pvtsutils "^1.3.2" + pvutils "^1.1.3" + tslib "^2.4.0" + +ast-types@^0.13.4: version "0.13.4" resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.4.tgz#ee0d77b343263965ecc3fb62da16e7222b2b6782" integrity sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w== dependencies: tslib "^2.0.1" -astral-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" - integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== - async@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720" integrity sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw== +auto-js-ipfs@^2.1.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/auto-js-ipfs/-/auto-js-ipfs-2.3.0.tgz#2c2684074cdaa2eb579345c4f86420d7635956c8" + integrity sha512-gUg2+lJqcbBUDgimlOVqWWBVl/8Avs9JMIjEpIk4liho+5hFGrCXvj1ydj5GGxpOXUGkR0H9eVxTXwu+xvQgIg== + available-typed-arrays@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" @@ -1022,7 +1226,14 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64-js@^1.3.1: +base32-encode@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/base32-encode/-/base32-encode-2.0.0.tgz#f029bea7d1db2ecc95df5c1d0a6038a39354029a" + integrity sha512-mlmkfc2WqdDtMl/id4qm3A7RjW6jxcbAoMjdRmsPiwQP0ufD4oXItYMnPgVHe80lnAIy+1xwzhHE1s4FoIceSw== + dependencies: + to-data-view "^2.0.0" + +base64-js@^1.1.2, base64-js@^1.3.1, base64-js@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== @@ -1078,6 +1289,13 @@ brorand@^1.0.1, brorand@^1.1.0: resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= +brotli@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/brotli/-/brotli-1.3.3.tgz#7365d8cc00f12cf765d2b2c898716bcf4b604d48" + integrity sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg== + dependencies: + base64-js "^1.1.2" + browser-or-node@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/browser-or-node/-/browser-or-node-1.3.0.tgz#f2a4e8568f60263050a6714b2cc236bb976647a7" @@ -1182,6 +1400,14 @@ buffer@^5.2.1, buffer@^5.5.0: base64-js "^1.3.1" ieee754 "^1.1.13" +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + cacheable-lookup@^5.0.3: version "5.0.4" resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" @@ -1213,7 +1439,7 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -camelcase@^5.0.0, camelcase@^5.3.1: +camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== @@ -1285,15 +1511,6 @@ cjs-module-lexer@^1.0.0: resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== -cliui@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" - integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^6.2.0" - cliui@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" @@ -1413,12 +1630,12 @@ create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: safe-buffer "^5.0.1" sha.js "^2.4.8" -cross-fetch@3.1.6: - version "3.1.6" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.6.tgz#bae05aa31a4da760969756318feeee6e70f15d6c" - integrity sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g== +cross-fetch@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-4.0.0.tgz#f037aef1580bb3a1a35164ea2a848ba81b445983" + integrity sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g== dependencies: - node-fetch "^2.6.11" + node-fetch "^2.6.12" cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" @@ -1451,30 +1668,32 @@ crypto-browserify@^3.12.0: randombytes "^2.0.0" randomfill "^1.0.3" +crypto-random-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-4.0.0.tgz#5a3cc53d7dd86183df5da0312816ceeeb5bb1fc2" + integrity sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA== + dependencies: + type-fest "^1.0.1" + data-uri-to-buffer@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-5.0.1.tgz#db89a9e279c2ffe74f50637a59a32fb23b3e4d7c" integrity sha512-a9l6T1qqDogvvnw0nKlfZzqsyikEBZBClF39V3TFoKhDtGBqHu2HkuomJc02j5zft8zrUaXEuoicLeW54RkzPg== -debug@4, debug@4.3.4, debug@^4.3.4: +debug@4, debug@4.3.4, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" -debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: +debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== dependencies: ms "2.1.2" -decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= - decompress-response@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" @@ -1497,11 +1716,6 @@ deep-is@^0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= -deep-is@~0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - deepmerge@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" @@ -1519,15 +1733,14 @@ define-properties@^1.1.3: dependencies: object-keys "^1.0.12" -degenerator@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-4.0.2.tgz#55b7fb41239ee0ea7644fa3f2aba84e0adfaa40c" - integrity sha512-HKwIFvZROUMfH3qI3gBpD61BYh7q3c3GXD5UGZzoVNJwVSYgZKvYl1fRMXc9ozoTxl/VZxKJ5v/bA+19tywFiw== +degenerator@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-5.0.1.tgz#9403bf297c6dad9a1ece409b37db27954f91f2f5" + integrity sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ== dependencies: - ast-types "^0.13.2" - escodegen "^1.8.1" - esprima "^4.0.0" - vm2 "^3.9.17" + ast-types "^0.13.4" + escodegen "^2.1.0" + esprima "^4.0.1" denque@^1.1.0: version "1.5.0" @@ -1552,10 +1765,10 @@ detect-newline@^3.0.0: resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== -devtools-protocol@0.0.1135028: - version "0.0.1135028" - resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1135028.tgz#b2c667c301cb6da9ba3ed0989fe1fb88b660ee0a" - integrity sha512-jEcNGrh6lOXNRJvZb9RjeevtZGrgugPKSMJZxfyxWQnhlKawMPhMtk/dfC+Z/6xNXExlzTKlY5LzIAK/fRpQIw== +devtools-protocol@0.0.1147663: + version "0.0.1147663" + resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1147663.tgz#4ec5610b39a6250d1f87e6b9c7e16688ed0ac78e" + integrity sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ== diff-sequences@^29.2.0: version "29.2.0" @@ -1620,12 +1833,10 @@ end-of-stream@^1.1.0, end-of-stream@^1.4.1: dependencies: once "^1.4.0" -enquirer@^2.3.5: - version "2.3.6" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" - integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== - dependencies: - ansi-colors "^4.1.1" +entities@^4.3.0, entities@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174" + integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== error-ex@^1.3.1: version "1.3.2" @@ -1711,15 +1922,19 @@ escape-string-regexp@^2.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== -escodegen@^1.8.1: - version "1.14.3" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" - integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escodegen@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== dependencies: esprima "^4.0.1" - estraverse "^4.2.0" + estraverse "^5.2.0" esutils "^2.0.2" - optionator "^0.8.1" optionalDependencies: source-map "~0.6.1" @@ -1741,92 +1956,83 @@ eslint-plugin-react@^7.22.0: resolve "^2.0.0-next.3" string.prototype.matchall "^4.0.4" -eslint-scope@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== +eslint-scope@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" + integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== dependencies: esrecurse "^4.3.0" - estraverse "^4.1.1" + estraverse "^5.2.0" -eslint-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" - integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz#c7f0f956124ce677047ddbc192a68f999454dedc" + integrity sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ== + +eslint@^8.37.0: + version "8.37.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.37.0.tgz#1f660ef2ce49a0bfdec0b0d698e0b8b627287412" + integrity sha512-NU3Ps9nI05GUoVMxcZx1J8CNR6xOvUT4jAUMH5+z8lpp3aEdPVCImKw6PWG4PY+Vfkpr+jvMpxs/qoE7wq0sPw== dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" - integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== - -eslint-visitor-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" - integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== - -eslint@^7.20.0: - version "7.26.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.26.0.tgz#d416fdcdcb3236cd8f282065312813f8c13982f6" - integrity sha512-4R1ieRf52/izcZE7AlLy56uIHHDLT74Yzz2Iv2l6kDaYvEu9x+wMB5dZArVL8SYGXSYV2YAg70FcW5Y5nGGNIg== - dependencies: - "@babel/code-frame" "7.12.11" - "@eslint/eslintrc" "^0.4.1" + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.4.0" + "@eslint/eslintrc" "^2.0.2" + "@eslint/js" "8.37.0" + "@humanwhocodes/config-array" "^0.11.8" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" - debug "^4.0.1" + debug "^4.3.2" doctrine "^3.0.0" - enquirer "^2.3.5" - eslint-scope "^5.1.1" - eslint-utils "^2.1.0" - eslint-visitor-keys "^2.0.0" - espree "^7.3.1" - esquery "^1.4.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.1.1" + eslint-visitor-keys "^3.4.0" + espree "^9.5.1" + esquery "^1.4.2" esutils "^2.0.2" + fast-deep-equal "^3.1.3" file-entry-cache "^6.0.1" - functional-red-black-tree "^1.0.1" - glob-parent "^5.0.0" - globals "^13.6.0" - ignore "^4.0.6" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + grapheme-splitter "^1.0.4" + ignore "^5.2.0" import-fresh "^3.0.0" imurmurhash "^0.1.4" is-glob "^4.0.0" - js-yaml "^3.13.1" + is-path-inside "^3.0.3" + js-sdsl "^4.1.4" + js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" - lodash "^4.17.21" - minimatch "^3.0.4" + lodash.merge "^4.6.2" + minimatch "^3.1.2" natural-compare "^1.4.0" optionator "^0.9.1" - progress "^2.0.0" - regexpp "^3.1.0" - semver "^7.2.1" - strip-ansi "^6.0.0" + strip-ansi "^6.0.1" strip-json-comments "^3.1.0" - table "^6.0.4" text-table "^0.2.0" - v8-compile-cache "^2.0.3" -espree@^7.3.0, espree@^7.3.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" - integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== +espree@^9.5.1: + version "9.5.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.5.1.tgz#4f26a4d5f18905bf4f2e0bd99002aab807e96dd4" + integrity sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg== dependencies: - acorn "^7.4.0" - acorn-jsx "^5.3.1" - eslint-visitor-keys "^1.3.0" + acorn "^8.8.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.0" esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" - integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== dependencies: estraverse "^5.1.0" @@ -1837,11 +2043,6 @@ esrecurse@^4.3.0: dependencies: estraverse "^5.2.0" -estraverse@^4.1.1, estraverse@^4.2.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - estraverse@^5.1.0, estraverse@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" @@ -1852,6 +2053,11 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== +eventemitter3@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" @@ -1907,7 +2113,7 @@ extract-zip@2.0.1: optionalDependencies: "@types/yauzl" "^2.9.1" -fast-deep-equal@^3.1.1: +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== @@ -1922,7 +2128,7 @@ fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: +fast-levenshtein@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= @@ -1932,6 +2138,20 @@ fast-xml-parser@^3.17.5: resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-3.19.0.tgz#cb637ec3f3999f51406dd8ff0e6fc4d83e520d01" integrity sha512-4pXwmBplsCPv8FOY1WRakF970TjNGnGnfbOnLqjlYvMiF1SR3yOHyxMR/YCXpPTOspNF5gwudqktIP4VsWkvBg== +fast-xml-parser@^4.2.5: + version "4.2.6" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.2.6.tgz#30ad37b014c16e31eec0e01fbf90a85cedb4eacf" + integrity sha512-Xo1qV++h/Y3Ng8dphjahnYe+rGHaaNdsYOBWL9Y9GCPKpNKilJtilvWkLcI9f9X2DoKTLsZsGYAls5+JL5jfLA== + dependencies: + strnum "^1.0.5" + +fastq@^1.6.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + dependencies: + reusify "^1.0.4" + fb-watchman@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" @@ -1968,6 +2188,14 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + flat-cache@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" @@ -2015,11 +2243,6 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= - gar@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/gar/-/gar-1.0.4.tgz#f777bc7db425c0572fdeb52676172ca1ae9888b8" @@ -2030,7 +2253,7 @@ gensync@^1.0.0-beta.2: resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-caller-file@^2.0.1, get-caller-file@^2.0.5: +get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== @@ -2091,12 +2314,12 @@ github-from-package@0.0.0: resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== -glob-parent@^5.0.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== dependencies: - is-glob "^4.0.1" + is-glob "^4.0.3" glob@^7.1.3, glob@^7.1.4: version "7.1.7" @@ -2115,17 +2338,10 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globals@^12.1.0: - version "12.4.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" - integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== - dependencies: - type-fest "^0.8.1" - -globals@^13.6.0: - version "13.8.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.8.0.tgz#3e20f504810ce87a8d72e55aecf8435b50f4c1b3" - integrity sha512-rHtdA6+PDBIjeEvA91rpqzEvk/k3/i7EeNQiryiWuJH0Hw9cpyJMAt2jtbAwUaRdhD+573X4vWw6IcjKPasi9Q== +globals@^13.19.0: + version "13.20.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" + integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== dependencies: type-fest "^0.20.2" @@ -2156,6 +2372,11 @@ graceful-fs@^4.2.9: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== +grapheme-splitter@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" + integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== + has-bigints@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" @@ -2199,6 +2420,11 @@ hash-base@^3.0.0: readable-stream "^3.6.0" safe-buffer "^5.2.0" +hash-wasm@^4.9.0: + version "4.9.0" + resolved "https://registry.yarnpkg.com/hash-wasm/-/hash-wasm-4.9.0.tgz#7e9dcc9f7d6bd0cc802f2a58f24edce999744206" + integrity sha512-7SW7ejyfnRxuOc7ptQHSf4LDoZaWOivfzqw+5rpcQku0nHfmicPKE51ra9BiRLAmT8+gGLestr1XroUkqdjL6w== + hash.js@^1.0.0, hash.js@^1.0.3: version "1.1.7" resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" @@ -2207,11 +2433,6 @@ hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.1" -hi-base32@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/hi-base32/-/hi-base32-0.5.1.tgz#1279f2ddae2673219ea5870c2121d2a33132857e" - integrity sha512-EmBBpvdYh/4XxsnUybsPag6VikPYnN30td+vQk+GI3qpahVEG9+gTkG0aXVxTjBqQ5T6ijbWIu77O+C5WFWsnA== - hmac-drbg@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" @@ -2231,6 +2452,11 @@ http-cache-semantics@^4.0.0: resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== +http-link-header@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/http-link-header/-/http-link-header-1.1.0.tgz#a1ca87efdbcb7778d8d0d4525de1e6964ec1f129" + integrity sha512-pj6N1yxOz/ANO8HHsWGg/OoIL1kmRYvQnXQ7PIRpgp+15AnEsRH8fmIJE6D1OdWG2Bov+BJHVla1fFXxg1JbbA== + http-proxy-agent@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz#e9096c5afd071a3fce56e6252bb321583c124673" @@ -2239,6 +2465,11 @@ http-proxy-agent@^7.0.0: agent-base "^7.1.0" debug "^4.3.4" +http-status-codes@^2.1.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/http-status-codes/-/http-status-codes-2.2.0.tgz#bb2efe63d941dfc2be18e15f703da525169622be" + integrity sha512-feERVo9iWxvnejp3SEfm/+oNG517npqL2/PIA8ORjyOZjGC7TwCRQsZylciLS64i6pJ0wRYz3rkXLRwbtFa8Ng== + http2-wrapper@^1.0.0-beta.5.2: version "1.0.3" resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" @@ -2255,6 +2486,14 @@ https-proxy-agent@^7.0.0: agent-base "^7.0.2" debug "4" +https-proxy-agent@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz#e2645b846b90e96c6e6f347fb5b2e41f1590b09b" + integrity sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA== + dependencies: + agent-base "^7.0.2" + debug "4" + human-signals@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" @@ -2265,15 +2504,20 @@ husky@^8.0.3: resolved "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz#4936d7212e46d1dea28fef29bb3a108872cd9184" integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg== -ieee754@^1.1.13: +idb@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/idb/-/idb-7.1.1.tgz#d910ded866d32c7ced9befc5bfdf36f572ced72b" + integrity sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ== + +ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -ignore@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== +ignore@^5.2.0: + version "5.2.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== import-fresh@^3.0.0, import-fresh@^3.2.1: version "3.3.0" @@ -2304,7 +2548,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4: +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -2339,7 +2583,7 @@ ioredis@^4.27.1: redis-parser "^3.0.0" standard-as-callback "^2.1.0" -ip@^1.1.5: +ip@^1.1.8: version "1.1.8" resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.8.tgz#ae05948f6b075435ed3307acce04629da8cdbf48" integrity sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg== @@ -2440,13 +2684,20 @@ is-generator-function@^1.0.7: dependencies: has-tostringtag "^1.0.0" -is-glob@^4.0.0, is-glob@^4.0.1: +is-glob@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== dependencies: is-extglob "^2.1.1" +is-glob@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + is-gzip@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-gzip/-/is-gzip-2.0.0.tgz#f4fed2bbd9f96bf2cb39e19262797fdb15aad933" @@ -2467,6 +2718,11 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + is-regex@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.3.tgz#d029f9aff6448b93ebbe3f33dac71511fdcbef9f" @@ -2493,6 +2749,11 @@ is-stream@^2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== +is-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" + integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== + is-string@^1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.6.tgz#3fe5d5992fb0d93404f32584d4b0179a71b54a5f" @@ -2943,6 +3204,16 @@ jest@^29.2.1: import-local "^3.0.2" jest-cli "^29.2.1" +js-levenshtein@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" + integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== + +js-sdsl@^4.1.4: + version "4.4.0" + resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.4.0.tgz#8b437dbe642daa95760400b602378ed8ffea8430" + integrity sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg== + "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -2983,11 +3254,6 @@ json-schema-traverse@^0.4.1: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" @@ -3043,14 +3309,6 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - lines-and-columns@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" @@ -3063,10 +3321,12 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" -lodash.clonedeep@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" - integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" lodash.defaults@^4.2.0: version "4.2.0" @@ -3078,10 +3338,10 @@ lodash.flatten@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= -lodash.truncate@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" - integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== lodash@^4.17.21: version "4.17.21" @@ -3209,6 +3469,13 @@ minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" +minimatch@^3.0.5, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + minimist@^1.2.0, minimist@^1.2.3: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" @@ -3290,10 +3557,10 @@ node-addon-api@^6.1.0: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-6.1.0.tgz#ac8470034e58e67d0c6f1204a18ae6995d9c0d76" integrity sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA== -node-fetch@^2.6.11: - version "2.6.11" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.11.tgz#cde7fc71deef3131ef80a738919f999e6edfff25" - integrity sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w== +node-fetch@^2.6.12: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== dependencies: whatwg-url "^5.0.0" @@ -3398,18 +3665,6 @@ onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" -optionator@^0.8.1: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - optionator@^0.9.1: version "0.9.1" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" @@ -3434,7 +3689,7 @@ p-limit@^2.2.0: dependencies: p-try "^2.0.0" -p-limit@^3.1.0: +p-limit@^3.0.2, p-limit@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== @@ -3448,36 +3703,57 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + p-map@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== +p-queue@^7.3.4: + version "7.3.4" + resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-7.3.4.tgz#7ef7d89b6c1a0563596d98adbc9dc404e9ed4a84" + integrity sha512-esox8CWt0j9EZECFvkFl2WNPat8LN4t7WWeXq73D9ha0V96qPRufApZi4ZhPwXAln1uVVal429HVVKPa2X0yQg== + dependencies: + eventemitter3 "^4.0.7" + p-timeout "^5.0.2" + +p-timeout@^5.0.2: + version "5.1.0" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-5.1.0.tgz#b3c691cf4415138ce2d9cfe071dba11f0fee085b" + integrity sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew== + p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -pac-proxy-agent@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-6.0.3.tgz#61042187093b67aa7dd05b41e4ec7c241a27c428" - integrity sha512-5Hr1KgPDoc21Vn3rsXBirwwDnF/iac1jN/zkpsOYruyT+ZgsUhUOgVwq3v9+ukjZd/yGm/0nzO1fDfl7rkGoHQ== +pac-proxy-agent@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz#6b9ddc002ec3ff0ba5fdf4a8a21d363bcc612d75" + integrity sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A== dependencies: + "@tootallnate/quickjs-emscripten" "^0.23.0" agent-base "^7.0.2" debug "^4.3.4" get-uri "^6.0.1" http-proxy-agent "^7.0.0" - https-proxy-agent "^7.0.0" - pac-resolver "^6.0.1" - socks-proxy-agent "^8.0.1" + https-proxy-agent "^7.0.2" + pac-resolver "^7.0.0" + socks-proxy-agent "^8.0.2" -pac-resolver@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-6.0.1.tgz#319c182d3db4e6782e79519cb4dd1dda46579292" - integrity sha512-dg497MhVT7jZegPRuOScQ/z0aV/5WR0gTdRu1md+Irs9J9o+ls5jIuxjo1WfaTG+eQQkxyn5HMGvWK+w7EIBkQ== +pac-resolver@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-7.0.0.tgz#79376f1ca26baf245b96b34c339d79bff25e900c" + integrity sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg== dependencies: - degenerator "^4.0.1" - ip "^1.1.5" + degenerator "^5.0.0" + ip "^1.1.8" netmask "^2.0.2" pako@^1.0.11: @@ -3513,6 +3789,29 @@ parse-json@^5.2.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" +parse5-html-rewriting-stream@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.0.0.tgz#e376d3e762d2950ccbb6bb59823fc1d7e9fdac36" + integrity sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg== + dependencies: + entities "^4.3.0" + parse5 "^7.0.0" + parse5-sax-parser "^7.0.0" + +parse5-sax-parser@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz#4c05064254f0488676aca75fb39ca069ec96dee5" + integrity sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg== + dependencies: + parse5 "^7.0.0" + +parse5@^7.0.0: + version "7.1.2" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" + integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== + dependencies: + entities "^4.4.0" + path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" @@ -3538,6 +3837,14 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-parser@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/path-parser/-/path-parser-6.1.0.tgz#ee8a1dd7b1ffaf4069f2ddd1c20d1867c8fd3a08" + integrity sha512-nAB6J73z2rFcQP+870OHhpkHFj5kO4rPLc2Ol4Y3Ale7F6Hk1/cPKp7cQ8RznKF8FOSvu+YR9Xc6Gafk7DlpYA== + dependencies: + search-params "3.0.0" + tslib "^1.10.0" + pbkdf2@^3.0.3: version "3.1.2" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" @@ -3604,11 +3911,6 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== - pretty-format@^29.2.1: version "29.2.1" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.2.1.tgz#86e7748fe8bbc96a6a4e04fa99172630907a9611" @@ -3618,7 +3920,12 @@ pretty-format@^29.2.1: ansi-styles "^5.0.0" react-is "^18.0.0" -progress@2.0.3, progress@^2.0.0: +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + +progress@2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== @@ -3640,17 +3947,17 @@ prop-types@^15.7.2: object-assign "^4.1.1" react-is "^16.8.1" -proxy-agent@6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-6.2.1.tgz#062df6609a4012fd1c108974865599b61e77abde" - integrity sha512-OIbBKlRAT+ycCm6wAYIzMwPejzRtjy8F3QiDX0eKOA3e4pe3U9F/IvzcHP42bmgQxVv97juG+J8/gx+JIeCX/Q== +proxy-agent@6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-6.3.0.tgz#72f7bb20eb06049db79f7f86c49342c34f9ba08d" + integrity sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og== dependencies: agent-base "^7.0.2" debug "^4.3.4" http-proxy-agent "^7.0.0" https-proxy-agent "^7.0.0" lru-cache "^7.14.1" - pac-proxy-agent "^6.0.3" + pac-proxy-agent "^7.0.0" proxy-from-env "^1.1.0" socks-proxy-agent "^8.0.1" @@ -3685,22 +3992,39 @@ punycode@^2.1.0: integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== puppeteer-core@^20.7.4: - version "20.7.4" - resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-20.7.4.tgz#4ea245aa8746873584f620222fc31a1781394b32" - integrity sha512-7YZ1LmTo+5yM9uBNFTMJpE+lJjcIoNjKVarsYIk7o5WhgQNI9o5XgiQK5f71y1vWwr7sT/eGG75HXAehjnTBTg== + version "20.9.0" + resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-20.9.0.tgz#6f4b420001b64419deab38d398a4d9cd071040e6" + integrity sha512-H9fYZQzMTRrkboEfPmf7m3CLDN6JvbxXA3qTtS+dFt27tR+CsFHzPsT6pzp6lYL6bJbAPaR0HaPO6uSi+F94Pg== dependencies: - "@puppeteer/browsers" "1.4.3" + "@puppeteer/browsers" "1.4.6" chromium-bidi "0.4.16" - cross-fetch "3.1.6" + cross-fetch "4.0.0" debug "4.3.4" - devtools-protocol "0.0.1135028" + devtools-protocol "0.0.1147663" ws "8.13.0" +pvtsutils@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/pvtsutils/-/pvtsutils-1.3.2.tgz#9f8570d132cdd3c27ab7d51a2799239bf8d8d5de" + integrity sha512-+Ipe2iNUyrZz+8K/2IOo+kKikdtfhRKzNpQbruF2URmqPtoqAs8g3xS7TJvFF2GcPXjh7DkqMnpVveRFq4PgEQ== + dependencies: + tslib "^2.4.0" + +pvutils@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/pvutils/-/pvutils-1.1.3.tgz#f35fc1d27e7cd3dfbd39c0826d173e806a03f5a3" + integrity sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ== + querystring@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + queue-tick@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/queue-tick/-/queue-tick-1.0.1.tgz#f6f07ac82c1fd60f82e098b417a80e52f1f4c142" @@ -3755,7 +4079,7 @@ react-is@^18.0.0: string_decoder "^1.1.1" util-deprecate "^1.0.1" -readable-stream@^3.1.1: +readable-stream@^3.1.1, readable-stream@^3.5.0: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== @@ -3781,6 +4105,11 @@ redis-parser@^3.0.0: dependencies: redis-errors "^1.0.0" +reflect-metadata@^0.1.13: + version "0.1.13" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" + integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== + regexp.prototype.flags@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26" @@ -3789,26 +4118,11 @@ regexp.prototype.flags@^1.3.1: call-bind "^1.0.2" define-properties "^1.1.3" -regexpp@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" - integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== - require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - resolve-alpn@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.1.2.tgz#30b60cfbb0c0b8dc897940fe13fe255afcdd4d28" @@ -3860,6 +4174,11 @@ responselike@^2.0.0: dependencies: lowercase-keys "^2.0.0" +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" @@ -3875,6 +4194,13 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" @@ -3895,18 +4221,16 @@ sax@>=0.6.0: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== +search-params@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/search-params/-/search-params-3.0.0.tgz#dbc7c243058e5a33ae1e9870be91f5aced4100d8" + integrity sha512-8CYNl/bjkEhXWbDTU/K7c2jQtrnqEffIPyOLMqygW/7/b+ym8UtQumcAZjOfMLjZKR6AxK5tOr9fChbQZCzPqg== + semver@^6.0.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.2.1: - version "7.3.5" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" - integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== - dependencies: - lru-cache "^6.0.0" - semver@^7.3.5: version "7.3.8" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" @@ -3921,11 +4245,6 @@ semver@^7.5.0: dependencies: lru-cache "^6.0.0" -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= - sha.js@^2.4.0, sha.js@^2.4.8: version "2.4.11" resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" @@ -4015,15 +4334,6 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -slice-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" - integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - smart-buffer@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" @@ -4038,6 +4348,15 @@ socks-proxy-agent@^8.0.1: debug "^4.3.4" socks "^2.7.1" +socks-proxy-agent@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz#5acbd7be7baf18c46a3f293a840109a430a640ad" + integrity sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g== + dependencies: + agent-base "^7.0.2" + debug "^4.3.4" + socks "^2.7.1" + socks@^2.7.1: version "2.7.1" resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" @@ -4076,6 +4395,14 @@ standard-as-callback@^2.1.0: resolved "https://registry.yarnpkg.com/standard-as-callback/-/standard-as-callback-2.1.0.tgz#8953fc05359868a77b5b9739a665c5977bb7df45" integrity sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A== +stream-browserify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f" + integrity sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA== + dependencies: + inherits "~2.0.4" + readable-stream "^3.5.0" + streamx@^2.15.0: version "2.15.0" resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.15.0.tgz#f58c92e6f726b5390dcabd6dd9094d29a854d698" @@ -4180,6 +4507,11 @@ strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== +strnum@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.0.5.tgz#5c4e829fe15ad4ff0d20c3db5ac97b73c9b072db" + integrity sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA== + supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -4206,26 +4538,14 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -table@^6.0.4: - version "6.7.1" - resolved "https://registry.yarnpkg.com/table/-/table-6.7.1.tgz#ee05592b7143831a8c94f3cee6aae4c1ccef33e2" - integrity sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg== - dependencies: - ajv "^8.0.1" - lodash.clonedeep "^4.5.0" - lodash.truncate "^4.4.2" - slice-ansi "^4.0.0" - string-width "^4.2.0" - strip-ansi "^6.0.0" - -tar-fs@3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-3.0.3.tgz#6593e7df92f337e74d755be183a192213d923050" - integrity sha512-ZK36riGYnFI6LujIBfBRoDfeaaWUkStIFKwtPjnDWCKnsDE9kuQthG09aQjLjpzoRtVElEMZ/AIAURNb7N9mkA== +tar-fs@3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-3.0.4.tgz#a21dc60a2d5d9f55e0089ccd78124f1d3771dbbf" + integrity sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w== dependencies: mkdirp-classic "^0.5.2" pump "^3.0.0" - tar-stream "^3.1.0" + tar-stream "^3.1.5" tar-fs@^2.0.0, tar-fs@^2.1.1: version "2.1.1" @@ -4248,7 +4568,7 @@ tar-stream@^2.1.4: inherits "^2.0.3" readable-stream "^3.1.1" -tar-stream@^3.1.0: +tar-stream@^3.1.5: version "3.1.6" resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-3.1.6.tgz#6520607b55a06f4a2e2e04db360ba7d338cc5bab" integrity sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg== @@ -4257,6 +4577,21 @@ tar-stream@^3.1.0: fast-fifo "^1.2.0" streamx "^2.15.0" +temp-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-3.0.0.tgz#7f147b42ee41234cc6ba3138cd8e8aa2302acffa" + integrity sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw== + +tempy@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/tempy/-/tempy-3.1.0.tgz#00958b6df85db8589cb595465e691852aac038e9" + integrity sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g== + dependencies: + is-stream "^3.0.0" + temp-dir "^3.0.0" + type-fest "^2.12.2" + unique-string "^3.0.0" + test-exclude@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" @@ -4289,6 +4624,11 @@ tmpl@1.0.5: resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== +to-data-view@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-data-view/-/to-data-view-2.0.0.tgz#4cc3f5c9eb59514a7436fc54c587c3c34c9b1d60" + integrity sha512-RGEM5KqlPHr+WVTPmGNAXNeFEmsBnlkxXaIfEpUYV0AST2Z5W1EGq9L/MENFrMMmL2WQr1wjkmZy/M92eKhjYA== + to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" @@ -4306,11 +4646,28 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== +tslib@^1.10.0, tslib@^1.9.3: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + tslib@^2.0.1: version "2.5.2" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.2.tgz#1b6f07185c881557b0ffa84b111a0106989e8338" integrity sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA== +tslib@^2.4.0, tslib@^2.4.1: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" + integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== + +tsyringe@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/tsyringe/-/tsyringe-4.7.0.tgz#aea0a9d565385deebb6def60cda342b15016f283" + integrity sha512-ncFDM1jTLsok4ejMvSW5jN1VGPQD48y2tfAR0pdptWRKYX4bkbqPt92k7KJ5RFJ1KV36JEs/+TMh7I6OUgj74g== + dependencies: + tslib "^1.9.3" + tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" @@ -4325,13 +4682,6 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== - dependencies: - prelude-ls "~1.1.2" - type-detect@4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" @@ -4347,10 +4697,15 @@ type-fest@^0.21.3: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== -type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== +type-fest@^1.0.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" + integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== + +type-fest@^2.12.2: + version "2.19.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" + integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== unbox-primitive@^1.0.0, unbox-primitive@^1.0.1: version "1.0.1" @@ -4370,6 +4725,13 @@ unbzip2-stream@1.4.3: buffer "^5.2.1" through "^2.3.8" +unique-string@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-3.0.0.tgz#84a1c377aff5fd7a8bc6b55d8244b2bd90d75b9a" + integrity sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ== + dependencies: + crypto-random-string "^4.0.0" + universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" @@ -4407,7 +4769,7 @@ util@^0.12.3: safe-buffer "^5.1.2" which-typed-array "^1.1.2" -uuid-random@^1.3.0: +uuid-random@^1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/uuid-random/-/uuid-random-1.3.2.tgz#96715edbaef4e84b1dcf5024b00d16f30220e2d0" integrity sha512-UOzej0Le/UgkbWEO8flm+0y+G+ljUon1QWTEZOq1rnMAsxo2+SckbiZdKzAHHlVh6gJqI1TjC/xwgR50MuCrBQ== @@ -4417,11 +4779,6 @@ uuid@8.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -v8-compile-cache@^2.0.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" - integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== - v8-to-istanbul@^9.0.1: version "9.0.1" resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz#b6f994b0b5d4ef255e17a0d17dc444a9f5132fa4" @@ -4431,14 +4788,6 @@ v8-to-istanbul@^9.0.1: "@types/istanbul-lib-coverage" "^2.0.1" convert-source-map "^1.6.0" -vm2@^3.9.17: - version "3.9.19" - resolved "https://registry.yarnpkg.com/vm2/-/vm2-3.9.19.tgz#be1e1d7a106122c6c492b4d51c2e8b93d3ed6a4a" - integrity sha512-J637XF0DHDMV57R6JyVsTak7nIL8gy5KH4r1HiwWLf/4GBbb5MKL5y7LpmF4A8E2nR6XmzpmMFQ7V7ppPTmUQg== - dependencies: - acorn "^8.7.0" - acorn-walk "^8.2.0" - walker@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" @@ -4446,15 +4795,17 @@ walker@^1.0.8: dependencies: makeerror "1.0.12" -warcio@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/warcio/-/warcio-1.6.0.tgz#ca3a1380bf9f2ce25fe1c09bda18311a6475d78d" - integrity sha512-xSpjZTP2uXBn41vDBo0QBGi2+IScYJaKVs6wmd4irEnOeaf3Pd8/8I1lMOFveo2kA4niIKpZfbk2t+SUdwwO6Q== +warcio@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/warcio/-/warcio-2.2.0.tgz#9f307174c7b05b5546dda9e45098c4212c363561" + integrity sha512-+ahadJnbAqqRlI1OFzyj1Nk+yy9BrR/4jDksuolJBZuesY39y9pUeYzSoje8vWONgZKPU24s3jMD8jPU7J/Q6w== dependencies: - hi-base32 "^0.5.0" + base32-encode "^2.0.0" + hash-wasm "^4.9.0" pako "^1.0.11" - uuid-random "^1.3.0" - yargs "^15.3.1" + tempy "^3.1.0" + uuid-random "^1.3.2" + yargs "^17.6.2" web-encoding@^1.1.5: version "1.1.5" @@ -4489,11 +4840,6 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= - which-typed-array@^1.1.2: version "1.1.7" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.7.tgz#2761799b9a22d4b8660b3c1b40abaa7739691793" @@ -4513,20 +4859,11 @@ which@^2.0.1: dependencies: isexe "^2.0.0" -word-wrap@^1.2.3, word-wrap@~1.2.3: +word-wrap@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== -wrap-ansi@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" - integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" @@ -4577,11 +4914,6 @@ xmlbuilder@~11.0.0: resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== -y18n@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" - integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== - y18n@^5.0.5: version "5.0.8" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" @@ -4592,20 +4924,12 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yargs-parser@^18.1.2: - version "18.1.3" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" - integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-parser@^21.0.0, yargs-parser@^21.1.1: +yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs@17.7.1: +yargs@17.7.1, yargs@^17.6.2: version "17.7.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.1.tgz#34a77645201d1a8fc5213ace787c220eabbd0967" integrity sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw== @@ -4618,37 +4942,7 @@ yargs@17.7.1: y18n "^5.0.5" yargs-parser "^21.1.1" -yargs@^15.3.1: - version "15.4.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" - integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== - dependencies: - cliui "^6.0.0" - decamelize "^1.2.0" - find-up "^4.1.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^4.2.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^18.1.2" - -yargs@^17.3.1: - version "17.6.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.6.0.tgz#e134900fc1f218bc230192bdec06a0a5f973e46c" - integrity sha512-8H/wTDqlSwoSnScvV2N/JHfLWOKuh5MVla9hqLjK3nsfyy6Y4kDSYSvkU5YCUEPOSnRXfIyx3Sq+B/IWudTo4g== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.0.0" - -yargs@^17.7.2: +yargs@^17.3.1, yargs@^17.7.2: version "17.7.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==