diff --git a/benches/.gitignore b/benches/.gitignore new file mode 100644 index 000000000..507e01180 --- /dev/null +++ b/benches/.gitignore @@ -0,0 +1,6 @@ +dist/ +results/ +logs/ +logs-saved/ +node_modules/ +proxy-packages/*/package-lock.json diff --git a/benches/jsconfig.json b/benches/jsconfig.json new file mode 100644 index 000000000..cac9965cc --- /dev/null +++ b/benches/jsconfig.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "target": "es2020", + "checkJs": true, + "moduleResolution": "node" + }, + "exclude": [ + "node_modules", + "dist" + ] +} diff --git a/benches/package.json b/benches/package.json new file mode 100644 index 000000000..794ba3c18 --- /dev/null +++ b/benches/package.json @@ -0,0 +1,30 @@ +{ + "name": "preact-signals-benchmarks", + "private": true, + "version": "1.0.0", + "type": "module", + "description": "Benchmarks for @preact/signals", + "scripts": { + "start": "node ./scripts config basic.html && tach --force-clean-npm-install --config dist/basic.config.json --manual", + "analyze": "node ./scripts analyze", + "bench": "node ./scripts bench", + "deopts": "node ./scripts deopts", + "help": "node ./scripts --help" + }, + "license": "MIT", + "dependencies": { + "afterframe": "^1.0.2" + }, + "devDependencies": { + "@kristoferbaxter/async": "^1.0.0", + "del": "^6.0.0", + "escalade": "^3.0.2", + "escape-string-regexp": "^4.0.0", + "globby": "^11.0.0", + "prompts": "^2.4.0", + "sade": "^1.7.3", + "strip-ansi": "^6.0.0", + "tachometer": "^0.7.0", + "v8-deopt-viewer": "^0.2.1" + } +} diff --git a/benches/proxy-packages/signals-local-proxy/index.js b/benches/proxy-packages/signals-local-proxy/index.js new file mode 100644 index 000000000..8b76238cb --- /dev/null +++ b/benches/proxy-packages/signals-local-proxy/index.js @@ -0,0 +1 @@ +export * from "@preact/signals"; diff --git a/benches/proxy-packages/signals-local-proxy/package.json b/benches/proxy-packages/signals-local-proxy/package.json new file mode 100644 index 000000000..66292461b --- /dev/null +++ b/benches/proxy-packages/signals-local-proxy/package.json @@ -0,0 +1,11 @@ +{ + "name": "preact-signals-local-proxy", + "private": true, + "version": "0.0.0", + "type": "module", + "main": "index.js", + "dependencies": { + "@preact/signals": "file:../../../packages/preact", + "preact": "^10.10.6" + } +} diff --git a/benches/proxy-packages/signals-master-proxy/index.js b/benches/proxy-packages/signals-master-proxy/index.js new file mode 100644 index 000000000..8b76238cb --- /dev/null +++ b/benches/proxy-packages/signals-master-proxy/index.js @@ -0,0 +1 @@ +export * from "@preact/signals"; diff --git a/benches/proxy-packages/signals-master-proxy/package.json b/benches/proxy-packages/signals-master-proxy/package.json new file mode 100644 index 000000000..d719c8baf --- /dev/null +++ b/benches/proxy-packages/signals-master-proxy/package.json @@ -0,0 +1,11 @@ +{ + "name": "signals-proxy", + "private": true, + "version": "0.0.0", + "type": "module", + "main": "index.js", + "dependencies": { + "@preact/signals": "file:../../../preact-signals.tgz", + "preact": "^10.10.6" + } +} diff --git a/benches/scripts/analyze.js b/benches/scripts/analyze.js new file mode 100644 index 000000000..0af447813 --- /dev/null +++ b/benches/scripts/analyze.js @@ -0,0 +1,358 @@ +import { existsSync } from "fs"; +import { readFile, readdir } from "fs/promises"; +import prompts from "prompts"; +import { baseTraceLogDir, frameworks } from "./config.js"; + +import { summaryStats, computeDifferences } from "tachometer/lib/stats.js"; +import { + automaticResultTable, + verticalTermResultTable, +} from "tachometer/lib/format.js"; + +/** + * @typedef {import('./tracing').TraceEvent} TraceEvent + * @typedef {import('tachometer/lib/stats').SummaryStats} SummaryStats + * @typedef {import('tachometer/lib/stats').ResultStats} ResultStats + * @typedef {import('tachometer/lib/stats').ResultStatsWithDifferences} ResultStatsWithDifferences + */ + +const toTrack = new Set([ + // 'V8.CompileCode', // Might be tachometer code?? But maybe not? + "V8.MarkCandidatesForOptimization", + "V8.OptimizeCode", + "V8.OptimizeConcurrentPrepare", + "V8.OptimizeNonConcurrent", + // 'V8.OptimizeBackground', // Runs on background thread + "V8.InstallOptimizedFunctions", + "V8.DeoptimizeCode", + "MinorGC", + "V8.GCDeoptMarkedAllocationSites", +]); + +/** + * @template T + * @param {Map} grouping + * @param {Map} results + */ +function addToGrouping(grouping, results) { + for (let [group, data] of results.entries()) { + if (grouping.has(group)) { + if (Array.isArray(data)) { + grouping.get(group).push(...data); + } else { + grouping.get(group).push(data); + } + } else { + if (Array.isArray(data)) { + grouping.set(group, data); + } else { + grouping.set(group, [data]); + } + } + } +} + +/** + * @template K + * @template V + * @param {Map} map + * @param {K} key + * @param {...V} values + */ +function addToMapArray(map, key, ...values) { + if (map.has(key)) { + map.get(key).push(...values); + } else { + map.set(key, values); + } +} + +/** + * @template K + * @template V + * @param {Map} map + * @param {K} key + * @param {number} index + * @param {V} value + */ +function setInMapArray(map, key, index, value) { + if (map.has(key)) { + map.get(key)[index] = value; + } else { + map.set(key, [value]); + } +} + +/** + * @param {ResultStats[]} results + */ +function logDifferences(key, results) { + let withDifferences = computeDifferences(results); + console.log(); + let { fixed, unfixed } = automaticResultTable(withDifferences); + // console.log(horizontalTermResultTable(fixed)); + console.log(key); + console.log(verticalTermResultTable(unfixed)); +} + +/** + * @param {string} version + * @param {string[]} logPaths + * @param {(logs: TraceEvent[], logFilePath: string) => number} [getThreadId] + * @param {(log: TraceEvent) => boolean} [trackEventsIn] + * @returns {Promise>} + */ +async function getStatsFromLogs(version, logPaths, getThreadId, trackEventsIn) { + /** @type {Map} Sums for each function for each file */ + const data = new Map(); + for (let logPath of logPaths) { + /** @type {TraceEvent[]} */ + const logs = JSON.parse(await readFile(logPath, "utf8")); + + let tid = getThreadId ? getThreadId(logs, logPath) : null; + + /** @type {Array<{ id: string; start: number; end: number; }>} Determine what durations to track events under */ + const parentLogs = []; + for (let log of logs) { + if (trackEventsIn && trackEventsIn(log)) { + if (log.ph == "X") { + parentLogs.push({ + id: log.name, + start: log.ts, + end: log.ts + log.dur, + }); + } else if (log.ph == "b") { + parentLogs.push({ + id: log.name, + start: log.ts, + end: log.ts, + }); + } else if (log.ph == "e") { + parentLogs.find(l => l.id == log.name).end = log.ts; + } else { + throw new Error(`Unsupported parent log type: ${log.ph}`); + } + } + } + + /** @type {Map} */ + const durationBeginEvents = new Map(); + + /** @type {Map} Sum of time spent in each function for this log file */ + const sumsForFile = new Map(); + for (let log of logs) { + if (tid != null && log.tid !== tid) { + // if (toTrack.has(log.name)) { + // console.log( + // `Skipping ${log.name} on tid ${log.tid} (expected ${tid}) in ${logPath}` + // ); + // } + + continue; + } + + if (log.ph == "X") { + // Track duration event + if (toTrack.has(log.name)) { + let key = `Sum of ${log.name} time`; + let sum = sumsForFile.get(key)?.[0] ?? 0; + // sumsForFile.set(log.name, sum + log.dur / 1000); + setInMapArray(sumsForFile, key, 0, sum + log.dur / 1000); + + key = `Count of ${log.name}`; + sum = sumsForFile.get(key)?.[0] ?? 0; + // sumsForFile.set(key, sum + 1); + setInMapArray(sumsForFile, key, 0, sum + 1); + + key = `Sum of V8 runtime`; + sum = sumsForFile.get(key)?.[0] ?? 0; + // sumsForFile.set(key, sum + log.dur / 1000); + setInMapArray(sumsForFile, key, 0, sum + log.dur / 1000); + + for (let parentLog of parentLogs) { + if ( + parentLog.start <= log.ts && + log.ts + log.dur <= parentLog.end + ) { + key = `In ${parentLog.id}, Sum of V8 runtime`; + sum = sumsForFile.get(key)?.[0] ?? 0; + setInMapArray(sumsForFile, key, 0, sum + log.dur / 1000); + } + } + } + + if (log.name == "MinorGC" || log.name == "MajorGC") { + let key = `${log.name} usedHeapSizeBefore`; + addToMapArray(sumsForFile, key, log.args.usedHeapSizeBefore / 1e6); + + key = `${log.name} usedHeapSizeAfter`; + addToMapArray(sumsForFile, key, log.args.usedHeapSizeAfter / 1e6); + } + } else if ( + (log.ph == "b" || log.ph == "e") && + log.cat == "blink.user_timing" && + log.scope == "blink.user_timing" + ) { + // TODO: Doesn't handle nested events of same name. Oh well. + if (log.ph == "b") { + durationBeginEvents.set(log.name, log); + } else { + const beginEvent = durationBeginEvents.get(log.name); + const endEvent = log; + durationBeginEvents.delete(log.name); + + let key = beginEvent.name; + let duration = (endEvent.ts - beginEvent.ts) / 1000; + addToMapArray(sumsForFile, key, duration); + + if (key.startsWith("run-") && key !== "run-warmup-0") { + // Skip run-warmup-0 since it doesn't do unmounting + addToMapArray(sumsForFile, "average run duration", duration); + } + } + } + } + + addToGrouping(data, sumsForFile); + } + + const stats = new Map(); + for (let [key, sums] of data) { + stats.set(key, { + result: { + name: "02_replace1k", + version: version, + measurement: { + name: key, + mode: "expression", + expression: key, + unit: key.startsWith("Count") + ? "" + : key.includes("usedHeapSize") + ? "MB" + : null, + }, + browser: { + name: "chrome", + }, + millis: sums, + }, + stats: summaryStats(sums), + }); + } + + return stats; +} + +/** + * @param {import('./tracing').TraceEvent[]} logs + * @param {string} logFilePath + * @returns {number} + */ +function getDurationThread(logs, logFilePath) { + let log = logs.find(isDurationLog); + + if (log == null) { + throw new Error( + `Could not find blink.user_timing log for "run-final" or "duration" in ${logFilePath}.` + ); + } else { + return log.tid; + } +} + +/** + * @param {TraceEvent} log + */ +function isDurationLog(log) { + return ( + (log.ph == "b" || log.ph == "e") && + log.cat == "blink.user_timing" && + log.scope == "blink.user_timing" && + // Tachometer may kill the tab after seeing the duration measure before + // the tab can log it to the trace file + (log.name == "run-final" || log.name == "duration") + ); +} + +export async function analyze() { + // const frameworkNames = await readdir(p('logs')); + const frameworkNames = frameworks.map(f => f.label); + const listAtEnd = [ + "average run duration", + "Sum of V8 runtime", + "In run-final, Sum of V8 runtime", + "In duration, Sum of V8 runtime", + "duration", + ]; + + if (!existsSync(baseTraceLogDir())) { + console.log( + `Could not find log directory: "${baseTraceLogDir()}". Did you run the benchmarks?` + ); + return; + } + + const benchmarkNames = await readdir(baseTraceLogDir()); + let selectedBench; + if (benchmarkNames.length == 0) { + console.log(`No benchmarks or results found in "${baseTraceLogDir()}".`); + return; + } else if (benchmarkNames.length == 1) { + selectedBench = benchmarkNames[0]; + } else { + selectedBench = ( + await prompts({ + type: "select", + name: "value", + message: "Which benchmark's results would you like to analyze?", + choices: benchmarkNames.map(name => ({ + title: name, + value: name, + })), + }) + ).value; + } + + /** @type {Map} */ + const resultStatsMap = new Map(); + for (let framework of frameworkNames) { + const logDir = baseTraceLogDir(selectedBench, framework); + + let logFilePaths; + try { + logFilePaths = (await readdir(logDir)).map(fn => + baseTraceLogDir(selectedBench, framework, fn) + ); + } catch (e) { + // If directory doesn't exist or we fail to read it, just skip + continue; + } + + const resultStats = await getStatsFromLogs( + framework, + logFilePaths, + getDurationThread, + isDurationLog + ); + addToGrouping(resultStatsMap, resultStats); + + // console.log(`${framework}:`); + // console.log(resultStats); + } + + // Compute differences and print table + for (let [key, results] of resultStatsMap.entries()) { + if (listAtEnd.includes(key)) { + continue; + } + + logDifferences(key, results); + } + + for (let key of listAtEnd) { + if (resultStatsMap.has(key)) { + logDifferences(key, resultStatsMap.get(key)); + } + } +} diff --git a/benches/scripts/bench.js b/benches/scripts/bench.js new file mode 100644 index 000000000..9d5ce986a --- /dev/null +++ b/benches/scripts/bench.js @@ -0,0 +1,71 @@ +import { spawnSync } from "child_process"; +import { mkdir } from "fs/promises"; +import { + globSrc, + benchesRoot, + allBenches, + resultsPath, + IS_CI, +} from "./utils.js"; +import { generateConfig } from "./config.js"; + +export const defaultBenchOptions = { + browser: "chrome-headless", + // Tachometer default is 50, but locally let's only do 10 + "sample-size": !IS_CI ? 10 : 50, + // Tachometer default is 10% but let's do 5% to save some GitHub action + // minutes by reducing the likelihood of needing auto-sampling. See + // https://github.com/Polymer/tachometer#auto-sampling + horizon: "5%", + // Tachometer default is 3 minutes, but let's shrink it to 1 here to save some + // GitHub Action minutes + timeout: 1, + "window-size": "1024,768", + framework: IS_CI ? ["signals-master", "signals-local"] : null, + memory: true, + trace: false, +}; + +/** + * @param {string} bench1 + * @param {{ _: string[]; } & TachometerOptions} opts + */ +export async function runBenches(bench1 = "all", opts) { + const globs = bench1 === "all" ? allBenches : [bench1].concat(opts._); + const benchesToRun = await globSrc(globs); + + if (benchesToRun.length == 0) { + console.log("No benchmarks found matching patterns:", globs); + } else { + console.log("Running benchmarks:", benchesToRun.join(", ")); + console.log(); + } + + const configFileTasks = benchesToRun.map(async (benchPath, i) => { + return generateConfig(benchesRoot("src", benchPath), { + ...opts, + prepare: i === 0, // Only run prepare script for first config + }); + }); + + await mkdir(resultsPath(), { recursive: true }); + + const configFiles = await Promise.all(configFileTasks); + for (const { name, configPath } of configFiles) { + const args = [ + benchesRoot("node_modules/tachometer/bin/tach.js"), + "--force-clean-npm-install", + "--config", + configPath, + "--json-file", + benchesRoot("results", name + ".json"), + ]; + + console.log("\n$", process.execPath, ...args); + + spawnSync(process.execPath, args, { + cwd: benchesRoot(), + stdio: "inherit", + }); + } +} diff --git a/benches/scripts/config.js b/benches/scripts/config.js new file mode 100644 index 000000000..7ebc154c1 --- /dev/null +++ b/benches/scripts/config.js @@ -0,0 +1,299 @@ +import * as path from "path"; +import del from "del"; +import { writeFile, stat, mkdir } from "fs/promises"; +import { repoRoot, benchesRoot, toUrl } from "./utils.js"; +import { defaultBenchOptions } from "./bench.js"; +import { prepare } from "./prepare.js"; + +const measureName = "duration"; // Must match measureName in '../src/util.js' +const warnings = new Set([]); +const TACH_SCHEMA = + "https://raw.githubusercontent.com/Polymer/tachometer/master/config.schema.json"; + +export const baseTraceLogDir = (...args) => + path.join(benchesRoot("logs"), ...args); + +/** + * @param {ConfigFileBenchmark["packageVersions"]["dependencies"]["framework"]} framework + * @returns {Promise} + */ +async function validateFileDep(framework) { + try { + if (typeof framework === "string") { + await stat(framework.replace(/^file:/, "")); + return true; + } + return false; + } catch (e) { + console.log("Stat error:", e); + return false; + } +} + +/** + * @typedef {ConfigFileBenchmark["packageVersions"]} ConfigFilePackageVersion + * @typedef {ConfigFilePackageVersion & { isValid(): Promise; }} BenchConfig + * @type {BenchConfig[]} + */ +export const frameworks = [ + { + label: "signals-master", + dependencies: { + preact: "file:" + repoRoot("node_modules/preact"), + framework: + "file:" + repoRoot("benches/proxy-packages/signals-master-proxy"), + }, + async isValid() { + try { + await stat(repoRoot("preact-signals.tgz")); + return validateFileDep(this.dependencies.framework); + } catch (e) { + return false; + } + }, + }, + { + label: "signals-local", + dependencies: { + // preact: "npm:preact@latest", + preact: "file:" + repoRoot("node_modules/preact"), + // preact: "file:" + repoRoot("benches/proxy-packages/preact-proxy"), + // framework: "file:" + repoRoot("benches/proxy-packages/signals-local-proxy"), + framework: "file:" + repoRoot("packages/preact"), + }, + isValid() { + return validateFileDep(this.dependencies.framework); + }, + }, +]; + +/** + * @param {string} benchPath + * @param {TachometerOptions} options + * @returns {Pick} + */ +function getBaseBenchmarkConfig(benchPath, options) { + let name = path.basename(benchPath).replace(".html", ""); + let url = path.posix.relative(toUrl(benchesRoot("dist")), toUrl(benchPath)); + + /** @type {ConfigFileBenchmark["measurement"]} */ + let measurement = [ + { + name: "duration", + mode: "performance", + entryName: measureName, + }, + { + name: "usedJSHeapSize", + mode: "expression", + expression: "window.usedJSHeapSize", + }, + ]; + if (options.memory === false) { + measurement.pop(); + } + + return { name, url, measurement }; +} + +export async function generateSingleConfig(benchFile, opts) { + const benchPath = await benchesRoot("src", benchFile); + const results = await stat(benchPath); + if (!results.isFile) { + throw new Error(`Given path is not a file: ${benchPath}`); + } + + await generateConfig(benchPath, { ...defaultBenchOptions, ...opts }); +} + +/** + * @typedef {import('tachometer/lib/configfile').ConfigFile} ConfigFile Expected + * format of a top-level tachometer JSON config file. + * @typedef {ConfigFile["benchmarks"][0]} ConfigFileBenchmark + * @typedef {{ name: string; configPath: string; config: ConfigFile; }} ConfigData + * @param {string} benchPath + * @param {TachometerOptions & { prepare?: boolean }} options + * @returns {Promise} + */ +export async function generateConfig(benchPath, options) { + /** @type {ConfigFileBenchmark["expand"]} */ + let expand; + /** @type {BrowserConfigs} */ + let browser; + + const baseBenchConfig = getBaseBenchmarkConfig(benchPath, options); + + // See https://www.npmjs.com/package/tachometer#browsers + // and https://www.npmjs.com/package/tachometer#config-file + if (Array.isArray(options.browser)) { + expand = options.browser.map(browserOpt => ({ + browser: parseBrowserOption(browserOpt, options), + })); + } else { + browser = parseBrowserOption(options.browser, options); + } + + if (browser.name == "chrome" && options.trace) { + const traceLogDir = baseTraceLogDir(baseBenchConfig.name); + await del("**/*", { cwd: traceLogDir }); + await mkdir(traceLogDir, { recursive: true }); + + browser.trace = { + logDir: traceLogDir, + }; + } + + /** @type {BenchConfig[]} */ + let frameworksToRun; + if (!options.framework) { + frameworksToRun = frameworks; + } else if (typeof options.framework === "string") { + const match = frameworks.find(f => f.label == options.framework); + frameworksToRun = match ? [match] : []; + } else if (Array.isArray(options.framework)) { + frameworksToRun = frameworks.filter(f => + options.framework.includes(f.label) + ); + } else { + throw new Error(`Unrecognized framework option: ${options.framework}`); + } + + if (frameworksToRun.length == 0) { + console.error( + `Framework options did not match any configured frameworks:\n` + + `\tProvided option: ${options.framework}\n` + + `\tAvailable frameworks: [${frameworks + .map(f => JSON.stringify(f.label)) + .join(", ")}]\n` + ); + + throw new Error( + `Framework option did not match any configured frameworks: ${options.framework}` + ); + } + + /** @type {ConfigFile["benchmarks"]} */ + const benchmarks = []; + for (let framework of frameworksToRun) { + let frameworkPath = framework.dependencies.framework; + if (typeof frameworkPath !== "string") { + throw new Error( + "Only string/npm dependencies are supported at this time" + ); + } + + if (!(await framework.isValid())) { + const warnMsg = `Could not locate path for ${framework.label}: ${framework.dependencies.framework}. \nSkipping...`; + if (!warnings.has(warnMsg)) { + console.warn(warnMsg); + warnings.add(warnMsg); + } + + continue; + } + + benchmarks.push({ + ...baseBenchConfig, + packageVersions: framework, + browser, + expand, + }); + } + + if (options.prepare !== false) { + await prepare(benchmarks.map(b => b.packageVersions.label)); + } + + /** @type {ConfigFile} */ + const config = { + $schema: TACH_SCHEMA, + root: repoRoot("benches"), + sampleSize: options["sample-size"], + timeout: options.timeout, + horizons: options.horizon.split(","), + benchmarks, + resolveBareModules: true, + }; + + if (config.benchmarks.length == 0) { + if (options.framework) { + const configuredFrameworks = frameworks.map(f => f.label).join(", "); + throw new Error( + `No benchmarks created. Does the specified framework match one of the configured frameworks? ${configuredFrameworks}` + ); + } else { + throw new Error( + `Unknown failure: no benchmarks created. frameworksToRun: ${frameworksToRun}` + ); + } + } + + const configPath = await writeConfig(baseBenchConfig.name, config); + + return { name: baseBenchConfig.name, configPath, config }; +} + +async function writeConfig(name, config) { + const configPath = benchesRoot("dist", name + ".config.json"); + await mkdir(path.dirname(configPath), { recursive: true }); + await writeFile(configPath, JSON.stringify(config, null, 2), "utf8"); + + return configPath; +} + +/** + * @typedef {Exclude} BrowserConfigs + * @param {string} str + * @param {TachometerOptions} options + * @returns {BrowserConfigs} + */ +function parseBrowserOption(str, options) { + // Source: https://github.com/Polymer/tachometer/blob/d4d5116acb2d7df18035ddc36f0a3a1730841a23/src/browser.ts#L100 + let remoteUrl; + const at = str.indexOf("@"); + if (at !== -1) { + remoteUrl = str.substring(at + 1); + str = str.substring(0, at); + } + const headless = str.endsWith("-headless"); + if (headless === true) { + str = str.replace(/-headless$/, ""); + } + + /** @type {import('tachometer/lib/browser').BrowserName} */ + // @ts-ignore + const name = str; + + /** @type {BrowserConfigs} */ + const config = { name }; + + if (config.name === "chrome" || config.name === "firefox") { + config.headless = headless; + } + + if (remoteUrl !== undefined) { + config.remoteUrl = remoteUrl; + } + + // Custom browser options + if (config.name == "chrome") { + const mem = options.memory !== false; + config.addArguments = [ + // Quoted values don't seem to work with WebDriver :( + // `--js-flags="${mem ? '--expose-gc ' : ''}--random-seed=1157259157"`, + mem && "--js-flags=--expose-gc", + mem && "--enable-precise-memory-info", + "--disable-ipc-flooding-protection", + "--disable-renderer-backgrounding", + "--disable-background-timer-throttling", + "--disable-backgrounding-occluded-windows", + "--disable-hang-monitor", + "--disable-device-discovery-notifications", + "--disable-extensions", + "--incognito", + "--no-sandbox", + ].filter(Boolean); + } + + return config; +} diff --git a/benches/scripts/deopts.js b/benches/scripts/deopts.js new file mode 100644 index 000000000..dbf0915a9 --- /dev/null +++ b/benches/scripts/deopts.js @@ -0,0 +1,253 @@ +import * as path from "path"; +import { mkdir } from "fs/promises"; +import { spawn } from "child_process"; +import { Transform } from "stream"; +import escapeRe from "escape-string-regexp"; +import stripAnsi from "strip-ansi"; +import { pool } from "@kristoferbaxter/async"; +import { + globSrc, + benchesRoot, + getPkgBinPath, + resultsPath, + IS_CI, +} from "./utils.js"; +import { generateConfig } from "./config.js"; +import { defaultBenchOptions } from "./bench.js"; + +export const defaultDeoptsOptions = { + framework: "preact-local", + timeout: 5, + open: IS_CI ? false : true, +}; + +const getResultDir = (benchmark, framework) => + resultsPath("v8-deopt-viewer", benchmark, framework); + +/** + * @param {string} pkgName + * @param {string[]} args + * @param {"pipe" | "inherit"} [stdio] + * @returns {Promise} + */ +async function runPackage(pkgName, args, stdio) { + const binPath = await getPkgBinPath(pkgName); + args.unshift(binPath); + + return spawn(process.execPath, args, { stdio }); +} + +/** + * @param {import('child_process').ChildProcess} childProcess + */ +async function onExit(childProcess) { + return new Promise((resolve, reject) => { + childProcess.once("exit", (code, signal) => { + if (code === 0 || signal == "SIGINT") { + resolve(); + } else { + reject(new Error("Exit with error code: " + code)); + } + }); + + childProcess.once("error", err => { + reject(err); + }); + }); +} + +/** + * @typedef {{ benchName: string; framework: string; url: string; }} TachURL + * @param {import('child_process').ChildProcess} tachProcess + * @param {import('./config').ConfigData} tachConfig + * @param {number} timeoutMs + * @returns {Promise} + */ +async function getTachometerURLs(tachProcess, tachConfig, timeoutMs = 60e3) { + return new Promise(async (resolve, reject) => { + let timeout; + if (timeoutMs > 0) { + timeout = setTimeout(() => { + reject( + new Error( + "Timed out waiting for Tachometer to get set up. Did it output a URL?" + ) + ); + }, timeoutMs); + } + + // Look for lines like: + // many_updates [@preact] + // http://127.0.0.1:56536/src/many_updates.html + const benchesToSearch = tachConfig.config.benchmarks.map(bench => ({ + benchName: bench.name, + framework: bench.packageVersions.label, + regex: new RegExp( + escapeRe(`${bench.name} [@${bench.packageVersions.label}]`) + + `\\s+(http:\\/\\/.*)`, + "im" + ), + url: null, + })); + + /** @type {TachURL[]} */ + const results = []; + let output = ""; + tachProcess.stdout.on("data", function onStdOutChunk(chunk) { + output += stripAnsi(chunk.toString("utf8")); + + for (let bench of benchesToSearch) { + if (bench.url) { + continue; + } + + let match = output.match(bench.regex); + if (match) { + bench.url = match[1]; + results.push(bench); + } + } + + if (results.length == benchesToSearch.length) { + // All URLs found, removeEventListener + tachProcess.off("data", onStdOutChunk); + + clearTimeout(timeout); + resolve(results); + } + }); + }); +} + +function createPrefixTransform(prefix) { + return new Transform({ + transform(chunk, encoding, callback) { + try { + // @ts-ignore + chunk = encoding == "buffer" ? chunk.toString() : chunk; + const lines = chunk.split("\n"); + + for (let line of lines) { + if (line) { + line = `[${prefix}] ${line}`; + this.push(line + "\n"); + } + } + + callback(); + } catch (error) { + return callback(error); + } + }, + }); +} + +/** + * @param {TachURL} tachURL + * @param {DeoptOptions} options + */ +async function runV8DeoptViewer(tachURL, options) { + const deoptOutputDir = getResultDir(tachURL.benchName, tachURL.framework); + await mkdir(deoptOutputDir, { recursive: true }); + + const deoptArgs = [ + tachURL.url, + "-o", + deoptOutputDir, + "-t", + (options.timeout * 1000).toString(), + ]; + + if (options.open) { + deoptArgs.push("--open"); + } + + const deoptProcess = await runPackage("v8-deopt-viewer", deoptArgs); + deoptProcess.stdout + .pipe(createPrefixTransform(tachURL.framework)) + .pipe(process.stdout); + deoptProcess.stderr + .pipe(createPrefixTransform(tachURL.framework)) + .pipe(process.stderr); + + await onExit(deoptProcess); +} + +/** + * @param {string} benchGlob + * @param {DeoptOptions} options + */ +export async function runDeopts(benchGlob, options) { + // TODO: + // * Handle multiple benchmarks + + const frameworks = options.framework; + if (!benchGlob) { + benchGlob = "many_updates.html"; + } + + const benchesToRun = await globSrc(benchGlob); + if (benchesToRun.length > 1) { + console.error("Matched multiple benchmarks. Only running the first one."); + } + + const benchPath = benchesRoot("src", benchesToRun[0]); + const tachConfig = await generateConfig(benchPath, { + ...defaultBenchOptions, + ...defaultDeoptsOptions, + framework: frameworks, + }); + + console.log("Benchmarks running:", benchPath); + console.log("Frameworks running:", frameworks); + + /** @type {Promise} */ + let onTachExit; + /** @type {import('child_process').ChildProcess} */ + let tachProcess; + try { + // Run tachometer in manual mode with generated config + const tachArgs = ["--config", tachConfig.configPath, "--manual"]; + tachProcess = await runPackage("tachometer", tachArgs); + tachProcess.stdout.pipe(process.stdout); + tachProcess.stderr.pipe(process.stderr); + onTachExit = onExit(tachProcess); + + // Parse URL from tachometer stdout + const tachURLs = await getTachometerURLs(tachProcess, tachConfig); + + // Run v8-deopt-viewer against tachometer URL + console.log(); + await pool(tachURLs, tachURL => + runV8DeoptViewer(tachURL, { + ...options, + open: options.open && tachURLs.length == 1, + }) + ); + + if (tachURLs.length > 1) { + const rootResultDir = getResultDir("", ""); + console.log(`\nOpen your browser to ${rootResultDir} to view results.`); + + if (options.open) { + // TODO: Figure out how to open a directory in the user's default browser + } + } + } finally { + if (tachProcess) { + tachProcess.kill("SIGINT"); + + // Log a message is Tachometer takes a while to close + let logMsg = () => console.log("Waiting for Tachometer to exit..."); + let t = setTimeout(logMsg, 2e3); + + try { + await onTachExit; + } catch (error) { + console.error("Error waiting for Tachometer to exit:", error); + } finally { + clearTimeout(t); + } + } + } +} diff --git a/benches/scripts/global.d.ts b/benches/scripts/global.d.ts new file mode 100644 index 000000000..fb693e19b --- /dev/null +++ b/benches/scripts/global.d.ts @@ -0,0 +1,16 @@ +interface TachometerOptions { + browser: string | string[]; + framework: string | string[]; + "window-size": string; + "sample-size": number; + horizon: string; + timeout: number; + trace: boolean; + memory: boolean; +} + +interface DeoptOptions { + framework: string; + timeout: number; + open: boolean; +} diff --git a/benches/scripts/index.js b/benches/scripts/index.js new file mode 100644 index 000000000..2e1ee637c --- /dev/null +++ b/benches/scripts/index.js @@ -0,0 +1,115 @@ +import sade from "sade"; +import { generateSingleConfig } from "./config.js"; +import { defaultDeoptsOptions, runDeopts } from "./deopts.js"; +import { defaultBenchOptions, runBenches } from "./bench.js"; +import { analyze } from "./analyze.js"; + +const prog = sade("./scripts"); + +// Tests: +// - npm start +prog + .command("config [bench]") + .describe("Generate the config for the given benchmark HTML file.") + .option( + "--trace", + "Enable perf tracing for browsers that support it", + defaultBenchOptions.trace + ) + .action(generateSingleConfig); + +// Tests: +// - many* -n 2 -t 0 +// - many* -n 2 -t 0 -f preact-local -f preact-v8 +// - many* -n 2 -t 0 -f preact-local -f preact-v8 -b chrome +prog + .command("bench [globs]") + .describe( + 'Run the benchmarks matching the given globs. The root for the globs is the "src" directory. Specify "all" to run all benchmarks (default). To get more help on options, see polymer/tachometer help. Result table is printed to stdout and written to a csv and json file in the results directory.' + ) + .example("bench text*") + .example("bench *.html") + .example("bench all") + .example("bench many* -f preact-local -f preact-master") + .option( + "--browser, -b", + "Which browsers to launch in automatic mode, comma-delimited (chrome, chrome-headless, firefox, firefox-headless, safari, edge, ie)", + defaultBenchOptions.browser + ) + // TODO: Consider parsing and adding to configs + // .option( + // '--window-size', + // '"width,height" in pixels of the browser windows that will be created', + // defaultOptions['window-size'] + // ) + .option( + "--sample-size, -n", + "Minimum number of times to run each benchmark", + defaultBenchOptions["sample-size"] + ) + .option( + "--horizon, -h", + 'The degrees of difference to try and resolve when auto-sampling ("N%" or "Nms", comma-delimited)', + defaultBenchOptions.horizon + ) + .option( + "--timeout, -t", + "The maximum number of minutes to spend auto-sampling", + defaultBenchOptions.timeout + ) + .option( + "--framework, -f", + "Which framework(s) to bench. Specify the flag multiple times to compare specific frameworks. Default is all frameworks", + defaultBenchOptions.framework + ) + .option( + "--memory", + "Measure and report memory consumption", + defaultBenchOptions.memory + ) + .option( + "--trace", + "Enable perf tracing for browsers that support it", + defaultBenchOptions.trace + ) + .action(runBenches); + +// Tests: +// - (no args) +// - many* +// - many* -f preact-local -f preact-master +prog + .command("deopts [benchmark]") + .describe( + "Run v8-deopt-viewer against the specified benchmark file (defaults to many_updates.html). If a glob is given, only the first matching file will be run" + ) + .example("deopts many_updates.html") + .example("deopts many*") + .example("deopts many* -f preact-local") + .example("deopts many* -f preact-local -f preact-master") + .option( + "--framework, -f", + "The framework to run the benchmark with.", + defaultDeoptsOptions.framework + ) + .option( + "--timeout, -t", + "How long in seconds to keep the browser open while the benchmark runs. Passed to v8-deopt-viewer.", + defaultDeoptsOptions.timeout + ) + .option( + "--open", + "Open the resulting v8-deopt-viewer result in the browser upon completion", + defaultDeoptsOptions.open + ) + .action(runDeopts); + +prog + .command("analyze") + .describe( + "Analyze the trace logs created by running benchmarks with the --trace flag" + ) + .example("analyze") + .action(analyze); + +prog.parse(process.argv); diff --git a/benches/scripts/prepare.js b/benches/scripts/prepare.js new file mode 100644 index 000000000..3ed79b043 --- /dev/null +++ b/benches/scripts/prepare.js @@ -0,0 +1,47 @@ +import { readdir } from "fs/promises"; +import path from "path"; +import { execFileSync } from "child_process"; +import del from "del"; +import { repoRoot } from "./utils.js"; + +const npmCmd = process.platform == "win32" ? "npm.cmd" : "npm"; + +/** + * @param {string[]} frameworks + */ +export async function prepare(frameworks) { + const proxyRoot = repoRoot("benches/proxy-packages"); + const proxyDirs = (await readdir(proxyRoot)).map(dirname => + dirname.replace(/-proxy$/, "") + ); + + for (let framework of frameworks) { + const dirname = proxyDirs.find(dir => dir == framework); + if (dirname == null) { + continue; + } + + const proxyDir = (...args) => + path.join(proxyRoot, dirname + "-proxy", ...args); + + // It appears from ad-hoc testing (npm v6.14.9 on Windows), npm will cache + // any locally referenced tarball files (e.g. "file:../../../preact.tgz") in + // its global cache. + // + // If a package-lock is present and the `npm ci` or `npm i` command is used, + // then npm will pull the tarball from the cache and not use the local + // tarball file even if the local reference has changed or is deleted. + // + // Because of the above behavior, we'll always delete the package-lock file + // and node_modules folder and use `npm i` to ensure we always get the + // latest packages + console.log(`Preparing ${dirname}: Cleaning ${proxyDir()}...`); + await del(["package-lock.json", "node_modules"], { cwd: proxyDir() }); + + console.log(`Preparing ${dirname}: Running "npm i" in ${proxyDir()}...`); + execFileSync(npmCmd, ["i", "--no-scripts"], { + cwd: proxyDir(), + stdio: "inherit", + }); + } +} diff --git a/benches/scripts/tracing.d.ts b/benches/scripts/tracing.d.ts new file mode 100644 index 000000000..e4920ff04 --- /dev/null +++ b/benches/scripts/tracing.d.ts @@ -0,0 +1,224 @@ +// From: https://docs.google.com/document/d/1CvAClvFfyA5R-PhYUmn5OOQtYMH4h6I0nSsKchNAySU/preview + +export type TraceEvent = + | DurationEvent + | CompleteEvent + | InstantEvent + | AsyncEvent + | FlowEvent + | SampleEvent + | ProcessNameEvent + | ProcessLabelsEvent + | ProcessSortIndexEvent + | ThreadNameEvent + | ThreadSortIndexEvent + | MarkEvent + | ContextEvent + | ObjectCreatedEvent + | ObjectSnapshotEvent + | ObjectDestroyedEvent; + +interface BaseEvent { + /** The name of the event */ + name: string; + /** + * The event categories. This is a comma separated list of categories for the + * event. + */ + cat: string; + /** The event type (phase?) */ + ph: string; + /** The tracing clock timestamp (microseconds) */ + ts: number; + /** The thread clock timestamp of the event (microseconds) */ + tts?: number; + /** Process ID */ + pid: number; + /** Thread ID */ + tid: number; + /** Any args provided for the event */ + args: Record; +} + +interface StackData { + /** + * Stack frame at the start of the event. ID pointing the corresponding stack + * in the stackFrames map + */ + sf?: number; + /** + * Stack at the start of the event. Usually contains program counter addresses + * as hex strings + */ + stack?: string[]; +} + +/** Mark the beginning or end of a duration of work on a given thread */ +interface DurationEvent extends BaseEvent, StackData { + ph: "B" | "E"; +} + +/** Represents a duration of work on a given thread */ +interface CompleteEvent extends BaseEvent, StackData { + ph: "X"; + /** Tracing clock duration (microseconds) */ + dur: number; + /** Thread clock duration? (microseconds) */ + tdur?: number; + /** Stack frame at the end of this event */ + esf?: number; + /** Stack at the end of this event */ + estack?: string[]; +} + +/** + * Mark something happened but has no duration associated with it. Only threaded + * scoped events can have stack data associated with them. + */ +interface InstantEvent extends BaseEvent, StackData { + ph: "i" | "I"; + /** Scope of the event. g = global, p = process, t = thread (default) */ + s?: "g" | "p" | "t"; +} + +/** + * Async operations (e.g. frames in a game, network I/O). b = start, n = + * instant, e = end. Events with the same category, id, and scope (if provided) + * are considered events from the same event tree. Nested async events should + * have the same category and id as its parent (but perhaps a different name). + */ +interface AsyncEvent extends BaseEvent { + ph: "b" | "n" | "e"; + id: string; + scope?: string; +} + +/** + * Similar to Async events but allows a duration to be associated with each + * other across threads/processes. Visually, think of a flow event as an arrow + * between two duration events. With flow events, each event will be drawn in + * the thread it is emitted from. The events will be linked together visually + * using lines and arrows. + * + * TODO: Finish filling out + */ +interface FlowEvent extends BaseEvent { + ph: "s" | "t" | "f"; +} + +interface SampleEvent extends BaseEvent, StackData { + ph: "P"; +} + +interface ProcessNameEvent extends BaseEvent { + ph: "M"; + name: "process_name"; + args: { + name: string; + }; +} + +interface ProcessLabelsEvent extends BaseEvent { + ph: "M"; + name: "process_labels"; + args: { + labels: string; + }; +} + +interface ProcessSortIndexEvent extends BaseEvent { + ph: "M"; + name: "process_sort_index"; + args: { + sort_index: number; + }; +} + +interface ProcessUptimeEvent extends BaseEvent { + ph: "M"; + name: "process_uptime_seconds"; + args: { + uptime: number; + }; +} + +interface ThreadNameEvent extends BaseEvent { + ph: "M"; + name: "thread_name"; + args: { + name: string; + }; +} + +interface ThreadSortIndexEvent extends BaseEvent { + ph: "M"; + name: "thread_sort_index"; + args: { + sort_index: number; + }; +} + +interface NumCPUsEvent extends BaseEvent { + ph: "M"; + name: "num_cpus"; + args: { + number: number; + }; +} + +/** + * Mark events are created whenever a corresponding navigation timing API mark + * is created + */ +interface MarkEvent extends BaseEvent { + ph: "R"; +} + +/** + * Context events are used to mark sequences of trace events as belonging to a + * particular context (or a tree of contexts). "(" = enter context, ")" = exit + * context. The enter event adds a context to all following trace events on the + * same thread until a corresponding leave event exits that context. Context ids + * refer to context object snapshots. + */ +interface ContextEvent extends BaseEvent { + ph: "(" | ")"; + id?: string; +} + +/** Object was created. Time is inclusive */ +interface ObjectCreatedEvent extends BaseEvent { + ph: "N"; + id: string; + scope?: string; + args: undefined; +} + +interface ObjectSnapshotEvent extends BaseEvent { + ph: "O"; + id: string; + scope?: string; + args: { + /** + * By default, an object snapshot inherits the category of its containing + * trace event. However, sometimes the object being snapshotted needs its + * own category. This happens because the place that creates an object + * snapshot's values is often separate form where the objects' constructor + * and destructor is called. Categories for the object creation and deletion + * commands must match the snapshot commands. Thus, the category of any + * object snapshot may be provided with the snapshot itself + */ + cat?: string; + /** Name of base type object */ + base_type?: string; + snapshot: any; + }; +} + +/** Object was destroyed. Time is exclusive */ +interface ObjectDestroyedEvent extends BaseEvent { + ph: "D"; + id: string; + scope?: string; + args: undefined; +} diff --git a/benches/scripts/utils.js b/benches/scripts/utils.js new file mode 100644 index 000000000..cf540e252 --- /dev/null +++ b/benches/scripts/utils.js @@ -0,0 +1,65 @@ +import { fileURLToPath } from "url"; +import { stat, readFile } from "fs/promises"; +import * as path from "path"; +import escalade from "escalade"; +import globby from "globby"; + +// TODO: Replace with import.meta.resolve when stable +import { createRequire } from "module"; +// @ts-ignore +const require = createRequire(import.meta.url); + +export const IS_CI = process.env.CI === "true"; + +// @ts-ignore +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +export const repoRoot = (...args) => path.join(__dirname, "..", "..", ...args); +export const benchesRoot = (...args) => repoRoot("benches", ...args); +export const resultsPath = (...args) => benchesRoot("results", ...args); + +export const toUrl = str => str.replace(/^[A-Za-z]+:/, "/").replace(/\\/g, "/"); + +export const allBenches = "**/*.html"; +export function globSrc(patterns) { + return globby(patterns, { cwd: benchesRoot("src") }); +} + +export async function getPkgBinPath(pkgName) { + /** @type {string | void} */ + let packageJsonPath; + try { + // TODO: Replace with import.meta.resolve when stable + const pkgMainPath = require.resolve(pkgName); + packageJsonPath = await escalade(pkgMainPath, (dir, names) => { + if (names.includes("package.json")) { + return "package.json"; + } + }); + } catch (e) { + // Tachometer doesn't have a valid 'main' entry + packageJsonPath = benchesRoot("node_modules", pkgName, "package.json"); + } + + if (!packageJsonPath || !(await stat(packageJsonPath)).isFile()) { + throw new Error( + `Could not locate "${pkgName}" package.json at "${packageJsonPath}".` + ); + } + + const pkg = JSON.parse(await readFile(packageJsonPath, "utf8")); + if (!pkg.bin) { + throw new Error(`${pkgName} package.json does not contain a "bin" entry.`); + } + + let binSubPath = pkg.bin; + if (typeof pkg.bin == "object") { + binSubPath = pkg.bin[pkgName]; + } + + const binPath = path.join(path.dirname(packageJsonPath), binSubPath); + if (!(await stat(binPath)).isFile()) { + throw new Error(`Bin path for ${pkgName} is not a file: ${binPath}`); + } + + return binPath; +} diff --git a/benches/src/basic.html b/benches/src/basic.html new file mode 100644 index 000000000..d416cd815 --- /dev/null +++ b/benches/src/basic.html @@ -0,0 +1,177 @@ + + + + + + Basic + + + +
+ + + diff --git a/benches/src/util.js b/benches/src/util.js new file mode 100644 index 000000000..8ea624e41 --- /dev/null +++ b/benches/src/util.js @@ -0,0 +1,143 @@ +// import afterFrame from "../node_modules/afterframe/dist/afterframe.module.js"; +import afterFrame from "afterframe"; + +export { afterFrame }; + +export const measureName = "duration"; + +let promise = null; +export function afterFrameAsync() { + if (promise === null) { + promise = new Promise(resolve => + afterFrame(time => { + promise = null; + resolve(time); + }) + ); + } + + return promise; +} + +let count = 0; +const channel = new MessageChannel(); +const callbacks = new Map(); +channel.port1.onmessage = e => { + let id = e.data; + let fn = callbacks.get(id); + callbacks.delete(id); + fn(); +}; +let pm = function (callback) { + let id = ++count; + callbacks.set(id, callback); + this.postMessage(id); +}.bind(channel.port2); + +export function nextTick() { + return new Promise(r => pm(r)); +} + +export function mutateAndLayoutAsync(mutation, times = 1) { + return new Promise(resolve => { + requestAnimationFrame(() => { + for (let i = 0; i < times; i++) { + mutation(i); + } + pm(resolve); + }); + }); +} + +export const raf = () => new Promise(requestAnimationFrame); +export const forceLayout = () => + (document.body._height = document.body.getBoundingClientRect().height); +export const tick = () => new Promise(r => Promise.resolve().then(r)); +export const sleep = ms => new Promise(r => setTimeout(r, ms)); + +export async function mutateAndLayout(mutation, times = 1) { + // await afterFrameAsync(); + for (let i = 0; i < times; i++) { + await mutation(i); + } + await tick(); + await forceLayout(); +} + +export function measureMemory() { + if ("gc" in window && "memory" in performance) { + // Report results in MBs + window.gc(); + window.usedJSHeapSize = performance.memory.usedJSHeapSize / 1e6; + } else { + window.usedJSHeapSize = 0; + } +} + +export function markRunStart(runId) { + performance.mark(`run-${runId}-start`); +} + +let staticPromise = Promise.resolve(); +export function markRunEnd(runId) { + return staticPromise.then(() => { + performance.mark(`run-${runId}-end`); + performance.measure( + `run-${runId}`, + `run-${runId}-start`, + `run-${runId}-end` + ); + }); +} + +export function getRowIdSel(index) { + return `tbody > tr:nth-child(${index}) > td:first-child`; +} + +export function getRowLinkSel(index) { + return `tbody > tr:nth-child(${index}) > td:nth-child(2) > a`; +} + +/** + * @param {string} selector + * @returns {Element} + */ +export function getBySelector(selector) { + const element = document.querySelector(selector); + if (element == null) { + throw new Error(`Could not find element matching selector: ${selector}`); + } + + return element; +} + +export function testElement(selector) { + const testElement = document.querySelector(selector); + if (testElement == null) { + throw new Error( + "Test failed. Rendering after one paint was not successful" + ); + } +} + +export function testElementText(selector, expectedText) { + const elm = document.querySelector(selector); + if (elm == null) { + throw new Error("Could not find element matching selector: " + selector); + } + + if (elm.textContent != expectedText) { + throw new Error( + `Element did not have expected text. Expected: '${expectedText}' Actual: '${elm.textContent}'` + ); + } +} + +export function testElementTextContains(selector, expectedText) { + const elm = getBySelector(selector); + if (!elm.textContent.includes(expectedText)) { + throw new Error( + `Element did not include expected text. Expected to include: '${expectedText}' Actual: '${elm.textContent}'` + ); + } +} diff --git a/packages/preact/package.json b/packages/preact/package.json index d67c7236e..cc86d26d2 100644 --- a/packages/preact/package.json +++ b/packages/preact/package.json @@ -43,6 +43,6 @@ "preact": "10.x" }, "devDependencies": { - "preact": "10.9.0" + "preact": "^10.10.6" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8a6e49712..adb684059 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -85,6 +85,33 @@ importers: sinon-chai: 3.7.0_chai@4.3.6+sinon@14.0.0 typescript: 4.7.4 + benches: + specifiers: + '@kristoferbaxter/async': ^1.0.0 + afterframe: ^1.0.2 + del: ^6.0.0 + escalade: ^3.0.2 + escape-string-regexp: ^4.0.0 + globby: ^11.0.0 + prompts: ^2.4.0 + sade: ^1.7.3 + strip-ansi: ^6.0.0 + tachometer: ^0.7.0 + v8-deopt-viewer: ^0.2.1 + dependencies: + afterframe: 1.0.2 + devDependencies: + '@kristoferbaxter/async': 1.0.0 + del: 6.1.1 + escalade: 3.1.1 + escape-string-regexp: 4.0.0 + globby: 11.1.0 + prompts: 2.4.2 + sade: 1.8.1 + strip-ansi: 6.0.1 + tachometer: 0.7.0 + v8-deopt-viewer: 0.2.1 + docs: specifiers: '@babel/core': ^7.18.10 @@ -128,11 +155,11 @@ importers: packages/preact: specifiers: '@preact/signals-core': workspace:^1.0.1 - preact: 10.9.0 + preact: ^10.10.6 dependencies: '@preact/signals-core': link:../core devDependencies: - preact: 10.9.0 + preact: 10.10.6 packages/react: specifiers: @@ -1800,6 +1827,11 @@ packages: '@jridgewell/sourcemap-codec': 1.4.14 dev: true + /@kristoferbaxter/async/1.0.0: + resolution: {integrity: sha512-CAQQQ8mUUBKI2P7stYojHwHb+ShdFN8SrC90/96V4m2XlDSctXAA+5PD5CqCICs0o5c/83cYJCeub+FSetKLrw==} + engines: {node: '>=12'} + dev: true + /@manypkg/find-root/1.1.0: resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} dependencies: @@ -1982,6 +2014,11 @@ packages: picomatch: 2.3.1 dev: true + /@sindresorhus/is/5.3.0: + resolution: {integrity: sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==} + engines: {node: '>=14.16'} + dev: true + /@sinonjs/commons/1.8.3: resolution: {integrity: sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==} dependencies: @@ -2015,11 +2052,33 @@ packages: string.prototype.matchall: 4.0.7 dev: true + /@szmarczak/http-timer/5.0.1: + resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} + engines: {node: '>=14.16'} + dependencies: + defer-to-connect: 2.0.1 + dev: true + /@trysound/sax/0.2.0: resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} engines: {node: '>=10.13.0'} dev: true + /@types/babel__generator/7.6.4: + resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} + dependencies: + '@babel/types': 7.19.0 + dev: true + + /@types/cacheable-request/6.0.2: + resolution: {integrity: sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==} + dependencies: + '@types/http-cache-semantics': 4.0.1 + '@types/keyv': 3.1.4 + '@types/node': 18.6.5 + '@types/responselike': 1.0.0 + dev: true + /@types/chai/4.3.3: resolution: {integrity: sha512-hC7OMnszpxhZPduX+m+nrx+uFoLkWOMiR4oa/AZF3MuSETYTZmFfJAHqZEM8MVlvfG7BEUcgvtwoCTxBp6hm3g==} dev: true @@ -2044,6 +2103,16 @@ packages: resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} dev: true + /@types/execa/0.9.0: + resolution: {integrity: sha512-mgfd93RhzjYBUHHV532turHC2j4l/qxsF/PbfDmprHDEUHmNZGlDn1CEsulGK3AfsPdhkWzZQT/S/k0UGhLGsA==} + dependencies: + '@types/node': 18.6.5 + dev: true + + /@types/http-cache-semantics/4.0.1: + resolution: {integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==} + dev: true + /@types/is-ci/3.0.0: resolution: {integrity: sha512-Q0Op0hdWbYd1iahB+IFNQcWXFq4O0Q5MwQP7uN0souuQ4rPg1vEYcnIOfr1gY+M+6rc8FGoRaBO1mOOvL29sEQ==} dependencies: @@ -2054,6 +2123,12 @@ packages: resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} dev: true + /@types/keyv/3.1.4: + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + dependencies: + '@types/node': 18.6.5 + dev: true + /@types/minimist/1.2.2: resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} dev: true @@ -2062,6 +2137,10 @@ packages: resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} dev: true + /@types/node/11.15.54: + resolution: {integrity: sha512-1RWYiq+5UfozGsU6MwJyFX6BtktcT10XRjvcAQmskCtMcW3tPske88lM/nHv7BQG1w9KBXI1zPGuu5PnNCX14g==} + dev: true + /@types/node/12.20.55: resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} dev: true @@ -2078,6 +2157,10 @@ packages: resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} dev: true + /@types/parse5/5.0.3: + resolution: {integrity: sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==} + dev: true + /@types/prop-types/15.7.5: resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} dev: true @@ -2102,6 +2185,12 @@ packages: '@types/node': 18.6.5 dev: true + /@types/responselike/1.0.0: + resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} + dependencies: + '@types/node': 18.6.5 + dev: true + /@types/scheduler/0.16.2: resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==} dev: true @@ -2127,6 +2216,14 @@ packages: resolution: {integrity: sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA==} dev: true + /@types/yauzl/2.10.0: + resolution: {integrity: sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==} + requiresBuild: true + dependencies: + '@types/node': 18.6.5 + dev: true + optional: true + /@typescript-eslint/eslint-plugin/5.33.0_njno5y7ry2l2lcmiu4tywxkwnq: resolution: {integrity: sha512-jHvZNSW2WZ31OPJ3enhLrEKvAZNyAFWZ6rx9tUwaessTc4sx9KmgMNhVcqVAl1ETnT5rU5fpXTLmY9YvC1DCNg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2279,6 +2376,15 @@ packages: hasBin: true dev: true + /afterframe/1.0.2: + resolution: {integrity: sha512-0JeMZI7dIfVs5guqLgidQNV7c6jBC2HO0QNSekAUB82Hr7PdU9QXNAF3kpFkvATvHYDDTGto7FPsRu1ey+aKJQ==} + dev: false + + /agent-base/5.1.1: + resolution: {integrity: sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==} + engines: {node: '>= 6.0.0'} + dev: true + /aggregate-error/3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} @@ -2296,6 +2402,15 @@ packages: uri-js: 4.4.1 dev: true + /ajv/8.11.0: + resolution: {integrity: sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: true + /ansi-colors/4.1.1: resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} engines: {node: '>=6'} @@ -2306,6 +2421,13 @@ packages: engines: {node: '>=6'} dev: true + /ansi-escape-sequences/6.2.1: + resolution: {integrity: sha512-0gK95MrLXv+Vy5h4eKGvSX1yXopBqSYBi3/w4hekUxs/hHakF6asH9Gg7UXbb7IH9weAlVIrUzVOITNBr8Imag==} + engines: {node: '>=12.17'} + dependencies: + array-back: 6.2.2 + dev: true + /ansi-escapes/4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} @@ -2375,6 +2497,21 @@ packages: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} dev: true + /array-back/3.1.0: + resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} + engines: {node: '>=6'} + dev: true + + /array-back/4.0.2: + resolution: {integrity: sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==} + engines: {node: '>=8'} + dev: true + + /array-back/6.2.2: + resolution: {integrity: sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==} + engines: {node: '>=12.17'} + dev: true + /array-union/2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} @@ -2517,6 +2654,10 @@ packages: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true + /base64-js/1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: true + /base64id/2.0.0: resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} engines: {node: ^4.5.0 || >= 5.9} @@ -2534,6 +2675,14 @@ packages: engines: {node: '>=8'} dev: true + /bl/4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.0 + dev: true + /body-parser/1.20.0: resolution: {integrity: sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -2606,10 +2755,25 @@ packages: update-browserslist-db: 1.0.5_browserslist@4.21.3 dev: true + /buffer-crc32/0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + dev: true + + /buffer-equal-constant-time/1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + dev: true + /buffer-from/1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} dev: true + /buffer/5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: true + /builtin-modules/3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} @@ -2620,6 +2784,32 @@ packages: engines: {node: '>= 0.8'} dev: true + /cache-content-type/1.0.1: + resolution: {integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==} + engines: {node: '>= 6.0.0'} + dependencies: + mime-types: 2.1.35 + ylru: 1.3.2 + dev: true + + /cacheable-lookup/6.1.0: + resolution: {integrity: sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==} + engines: {node: '>=10.6.0'} + dev: true + + /cacheable-request/7.0.2: + resolution: {integrity: sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==} + engines: {node: '>=8'} + dependencies: + clone-response: 1.0.3 + get-stream: 5.2.0 + http-cache-semantics: 4.1.0 + keyv: 4.5.0 + lowercase-keys: 2.0.0 + normalize-url: 6.1.0 + responselike: 2.0.1 + dev: true + /call-bind/1.0.2: resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} dependencies: @@ -2728,6 +2918,23 @@ packages: fsevents: 2.3.2 dev: true + /chownr/1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: true + + /chrome-launcher/0.13.4: + resolution: {integrity: sha512-nnzXiDbGKjDSK6t2I+35OAPBy5Pw/39bgkb/ZAFwMhwJbdYBp6aH+vW28ZgtjdU890Q7D+3wN/tB8N66q5Gi2A==} + dependencies: + '@types/node': 18.6.5 + escape-string-regexp: 1.0.5 + is-wsl: 2.2.0 + lighthouse-logger: 1.3.0 + mkdirp: 0.5.6 + rimraf: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + /ci-info/3.3.2: resolution: {integrity: sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg==} dev: true @@ -2776,11 +2983,31 @@ packages: wrap-ansi: 7.0.0 dev: true + /clone-response/1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + dependencies: + mimic-response: 1.0.1 + dev: true + /clone/1.0.4: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} dev: true + /co-body/6.1.0: + resolution: {integrity: sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ==} + dependencies: + inflation: 2.0.0 + qs: 6.10.3 + raw-body: 2.5.1 + type-is: 1.6.18 + dev: true + + /co/4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + dev: true + /color-convert/1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: @@ -2815,6 +3042,26 @@ packages: engines: {node: '>=0.1.90'} dev: true + /command-line-args/5.2.1: + resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==} + engines: {node: '>=4.0.0'} + dependencies: + array-back: 3.1.0 + find-replace: 3.0.0 + lodash.camelcase: 4.3.0 + typical: 4.0.0 + dev: true + + /command-line-usage/6.1.3: + resolution: {integrity: sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==} + engines: {node: '>=8.0.0'} + dependencies: + array-back: 4.0.2 + chalk: 2.4.2 + table-layout: 1.0.2 + typical: 5.2.0 + dev: true + /commander/2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} dev: true @@ -2859,6 +3106,13 @@ packages: - supports-color dev: true + /content-disposition/0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + dependencies: + safe-buffer: 5.2.1 + dev: true + /content-type/1.0.4: resolution: {integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==} engines: {node: '>= 0.6'} @@ -2875,6 +3129,18 @@ packages: engines: {node: '>= 0.6'} dev: true + /cookies/0.8.0: + resolution: {integrity: sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + keygrip: 1.1.0 + dev: true + + /copy-to/2.0.1: + resolution: {integrity: sha512-3DdaFaU/Zf1AnpLiFDeNCD4TOWe3Zl2RZaTzUvWiIk5ERzcCodOE20Vqq4fzCbNoHURFHT4/us/Lfq+S2zyY4w==} + dev: true + /core-js-compat/3.24.1: resolution: {integrity: sha512-XhdNAGeRnTpp8xbD+sR/HFDK9CbeeeqXT6TuofXh3urqEevzkWmLRgrVoykodsw8okqo2pu1BOmuCKrHx63zdw==} dependencies: @@ -2882,6 +3148,10 @@ packages: semver: 7.0.0 dev: true + /core-util-is/1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: true + /cors/2.8.5: resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} engines: {node: '>= 0.10'} @@ -2917,6 +3187,17 @@ packages: which: 1.3.1 dev: true + /cross-spawn/6.0.5: + resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} + engines: {node: '>=4.8'} + dependencies: + nice-try: 1.0.5 + path-key: 2.0.1 + semver: 5.7.1 + shebang-command: 1.2.0 + which: 1.3.1 + dev: true + /cross-spawn/7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} @@ -3046,6 +3327,10 @@ packages: resolution: {integrity: sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==} dev: true + /csv-stringify/6.2.0: + resolution: {integrity: sha512-dcUbQLRTTDcgQxgEU8V9IctkaCwHZjZfzUZ5ZB3RY8Y+pXtdtl5iVQHfGzANytFFkRKanYzBXrkfpNdGR7eviA==} + dev: true + /csv/5.5.3: resolution: {integrity: sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g==} engines: {node: '>= 0.1.90'} @@ -3076,6 +3361,17 @@ packages: ms: 2.0.0 dev: true + /debug/3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: true + /debug/4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -3119,6 +3415,13 @@ packages: engines: {node: '>=10'} dev: true + /decompress-response/6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dependencies: + mimic-response: 3.1.0 + dev: true + /deep-eql/3.0.1: resolution: {integrity: sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==} engines: {node: '>=0.12'} @@ -3126,6 +3429,15 @@ packages: type-detect: 4.0.8 dev: true + /deep-equal/1.0.1: + resolution: {integrity: sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==} + dev: true + + /deep-extend/0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + dev: true + /deep-is/0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true @@ -3141,6 +3453,11 @@ packages: clone: 1.0.4 dev: true + /defer-to-connect/2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + dev: true + /define-lazy-prop/2.0.0: resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} engines: {node: '>=8'} @@ -3154,6 +3471,29 @@ packages: object-keys: 1.1.1 dev: true + /del/6.1.1: + resolution: {integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==} + engines: {node: '>=10'} + dependencies: + globby: 11.1.0 + graceful-fs: 4.2.10 + is-glob: 4.0.3 + is-path-cwd: 2.2.0 + is-path-inside: 3.0.3 + p-map: 4.0.0 + rimraf: 3.0.2 + slash: 3.0.0 + dev: true + + /delegates/1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + dev: true + + /depd/1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + dev: true + /depd/2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} @@ -3169,6 +3509,10 @@ packages: engines: {node: '>=8'} dev: true + /devtools-protocol/0.0.818844: + resolution: {integrity: sha512-AD1hi7iVJ8OD0aMLQU5VK0XH9LDlA1+BcPIgrAxPfaibx2DbWucuyOhc4oyQCbnvDDO68nN6/LcKfqTP343Jjg==} + dev: true + /di/0.0.1: resolution: {integrity: sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==} dev: true @@ -3245,6 +3589,12 @@ packages: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: true + /ecdsa-sig-formatter/1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + dependencies: + safe-buffer: 5.2.1 + dev: true + /ee-first/1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} dev: true @@ -3274,6 +3624,12 @@ packages: engines: {node: '>= 0.8'} dev: true + /end-of-stream/1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: true + /engine.io-parser/5.0.4: resolution: {integrity: sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg==} engines: {node: '>=10.0.0'} @@ -3749,6 +4105,19 @@ packages: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} dev: true + /execa/1.0.0: + resolution: {integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==} + engines: {node: '>=6'} + dependencies: + cross-spawn: 6.0.5 + get-stream: 4.1.0 + is-stream: 1.1.0 + npm-run-path: 2.0.2 + p-finally: 1.0.0 + signal-exit: 3.0.7 + strip-eof: 1.0.0 + dev: true + /execa/6.1.0: resolution: {integrity: sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -3781,6 +4150,20 @@ packages: tmp: 0.0.33 dev: true + /extract-zip/2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + dependencies: + debug: 4.3.4 + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.0 + transitivePeerDependencies: + - supports-color + dev: true + /fast-deep-equal/3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: true @@ -3810,6 +4193,12 @@ packages: reusify: 1.0.4 dev: true + /fd-slicer/1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + dependencies: + pend: 1.2.0 + dev: true + /figures/1.7.0: resolution: {integrity: sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==} engines: {node: '>=0.10.0'} @@ -3867,6 +4256,13 @@ packages: pkg-dir: 4.2.0 dev: true + /find-replace/3.0.0: + resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} + engines: {node: '>=4.0.0'} + dependencies: + array-back: 3.1.0 + dev: true + /find-up/4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -3883,6 +4279,14 @@ packages: path-exists: 4.0.0 dev: true + /find-up/6.3.0: + resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + locate-path: 7.1.1 + path-exists: 5.0.0 + dev: true + /find-yarn-workspace-root2/1.2.16: resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} dependencies: @@ -3917,10 +4321,24 @@ packages: optional: true dev: true + /form-data-encoder/2.1.2: + resolution: {integrity: sha512-FCaIOVTRA9E0siY6FeXid7D5yrCqpsErplUkE2a1BEiKj1BE9z6FbKB4ntDTwC4NVLie9p+4E9nX4mWwEOT05A==} + engines: {node: '>= 14.17'} + dev: true + /fraction.js/4.2.0: resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} dev: true + /fresh/0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + dev: true + + /fs-constants/1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + dev: true + /fs-extra/10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} @@ -4015,6 +4433,20 @@ packages: engines: {node: '>=8.0.0'} dev: true + /get-stream/4.1.0: + resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} + engines: {node: '>=6'} + dependencies: + pump: 3.0.0 + dev: true + + /get-stream/5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + dependencies: + pump: 3.0.0 + dev: true + /get-stream/6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} @@ -4096,6 +4528,24 @@ packages: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} dev: true + /got/12.4.1: + resolution: {integrity: sha512-Sz1ojLt4zGNkcftIyJKnulZT/yEDvifhUjccHA8QzOuTgPs/+njXYNMFE3jR4/2OODQSSbH8SdnoLCkbh41ieA==} + engines: {node: '>=14.16'} + dependencies: + '@sindresorhus/is': 5.3.0 + '@szmarczak/http-timer': 5.0.1 + '@types/cacheable-request': 6.0.2 + cacheable-lookup: 6.1.0 + cacheable-request: 7.0.2 + decompress-response: 6.0.0 + form-data-encoder: 2.1.2 + get-stream: 6.0.1 + http2-wrapper: 2.1.11 + lowercase-keys: 3.0.0 + p-cancelable: 3.0.0 + responselike: 3.0.0 + dev: true + /graceful-fs/4.2.10: resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} dev: true @@ -4182,18 +4632,51 @@ packages: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} dev: true - /http-errors/2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + /http-assert/1.5.0: + resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} engines: {node: '>= 0.8'} dependencies: - depd: 2.0.0 + deep-equal: 1.0.1 + http-errors: 1.8.1 + dev: true + + /http-cache-semantics/4.1.0: + resolution: {integrity: sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==} + dev: true + + /http-errors/1.6.3: + resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} + engines: {node: '>= 0.6'} + dependencies: + depd: 1.1.2 + inherits: 2.0.3 + setprototypeof: 1.1.0 + statuses: 1.5.0 + dev: true + + /http-errors/1.8.1: + resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} + engines: {node: '>= 0.6'} + dependencies: + depd: 1.1.2 inherits: 2.0.4 setprototypeof: 1.2.0 - statuses: 2.0.1 + statuses: 1.5.0 toidentifier: 1.0.1 dev: true - /http-proxy/1.18.1: + /http-errors/2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + dev: true + + /http-proxy/1.18.1: resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} engines: {node: '>=8.0.0'} dependencies: @@ -4204,6 +4687,29 @@ packages: - debug dev: true + /http2-wrapper/2.1.11: + resolution: {integrity: sha512-aNAk5JzLturWEUiuhAN73Jcbq96R7rTitAoXV54FYMatvihnpD2+6PUgU4ce3D/m5VDbw+F5CsyKSF176ptitQ==} + engines: {node: '>=10.19.0'} + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + dev: true + + /httpie/1.1.2: + resolution: {integrity: sha512-VQ82oXG95oY1fQw/XecHuvcFBA+lZQ9Vwj1RfLcO8a7HpDd4cc2ukwpJt+TUlFaLUAzZErylxWu6wclJ1rUhUQ==} + engines: {node: '>=8'} + dev: true + + /https-proxy-agent/4.0.0: + resolution: {integrity: sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==} + engines: {node: '>= 6.0.0'} + dependencies: + agent-base: 5.1.1 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + /human-id/1.0.2: resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} dev: true @@ -4239,11 +4745,19 @@ packages: postcss: 8.4.16 dev: true + /ieee754/1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: true + /ignore/5.2.0: resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==} engines: {node: '>= 4'} dev: true + /immediate/3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + dev: true + /import-cwd/3.0.0: resolution: {integrity: sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==} engines: {node: '>=8'} @@ -4276,6 +4790,11 @@ packages: engines: {node: '>=8'} dev: true + /inflation/2.0.0: + resolution: {integrity: sha512-m3xv4hJYR2oXw4o4Y5l6P5P16WYmazYof+el6Al3f+YlggGj6qT9kImBAnzDelRALnP5d3h4jGBPKzYCizjZZw==} + engines: {node: '>= 0.8.0'} + dev: true + /inflight/1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: @@ -4283,6 +4802,10 @@ packages: wrappy: 1.0.2 dev: true + /inherits/2.0.3: + resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} + dev: true + /inherits/2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} dev: true @@ -4367,6 +4890,13 @@ packages: engines: {node: '>=12'} dev: true + /is-generator-function/1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + /is-glob/4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -4395,6 +4925,16 @@ packages: engines: {node: '>=0.12.0'} dev: true + /is-path-cwd/2.2.0: + resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==} + engines: {node: '>=6'} + dev: true + + /is-path-inside/3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + /is-plain-obj/1.1.0: resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} engines: {node: '>=0.10.0'} @@ -4425,6 +4965,11 @@ packages: call-bind: 1.0.2 dev: true + /is-stream/1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} + dev: true + /is-stream/3.0.0: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -4478,6 +5023,10 @@ packages: resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} dev: true + /isarray/1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: true + /isbinaryfile/4.0.10: resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} engines: {node: '>= 8.0.0'} @@ -4582,6 +5131,10 @@ packages: hasBin: true dev: true + /json-buffer/3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: true + /json-parse-even-better-errors/2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} dev: true @@ -4590,6 +5143,10 @@ packages: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} dev: true + /json-schema-traverse/1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: true + /json-stable-stringify-without-jsonify/1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} dev: true @@ -4614,10 +5171,58 @@ packages: graceful-fs: 4.2.10 dev: true + /jsonschema/1.4.1: + resolution: {integrity: sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==} + dev: true + + /jsonwebtoken/8.5.1: + resolution: {integrity: sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==} + engines: {node: '>=4', npm: '>=1.4.28'} + dependencies: + jws: 3.2.2 + lodash.includes: 4.3.0 + lodash.isboolean: 3.0.3 + lodash.isinteger: 4.0.4 + lodash.isnumber: 3.0.3 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.once: 4.1.1 + ms: 2.1.3 + semver: 5.7.1 + dev: true + + /jstat/1.9.5: + resolution: {integrity: sha512-cWnp4vObF5GmB2XsIEzxI/1ZTcYlcfNqxQ/9Fp5KFUa0Jf/4tO0ZkGVnqoEHDisJvYgvn5n3eWZbd2xTVJJPUQ==} + dev: true + + /jszip/3.10.1: + resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} + dependencies: + lie: 3.3.0 + pako: 1.0.11 + readable-stream: 2.3.7 + setimmediate: 1.0.5 + dev: true + /just-extend/4.2.1: resolution: {integrity: sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==} dev: true + /jwa/1.4.1: + resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + dev: true + + /jws/3.2.2: + resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} + dependencies: + jwa: 1.4.1 + safe-buffer: 5.2.1 + dev: true + /karma-chai-sinon/0.1.5_4327255nuu22k6utwpuk2rzg54: resolution: {integrity: sha512-J/ecbp1h3Qr6cr+XgK1Q5LOf/JlqO44hbvILcdM8Md4jxnXClhA2jzOExhKaSezziNu1ue40Q6e1OC07epqVmA==} engines: {node: '>=0.8'} @@ -4727,16 +5332,131 @@ packages: - utf-8-validate dev: true + /keygrip/1.1.0: + resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} + engines: {node: '>= 0.6'} + dependencies: + tsscmp: 1.0.6 + dev: true + + /keyv/4.5.0: + resolution: {integrity: sha512-2YvuMsA+jnFGtBareKqgANOEKe1mk3HKiXu2fRmAfyxG0MJAywNhi5ttWA3PMjl4NmpyjZNbFifR2vNjW1znfA==} + dependencies: + json-buffer: 3.0.1 + dev: true + /kind-of/6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} dev: true + /kleur/3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + dev: true + /kleur/4.1.5: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} dev: true + /koa-bodyparser/4.3.0: + resolution: {integrity: sha512-uyV8G29KAGwZc4q/0WUAjH+Tsmuv9ImfBUF2oZVyZtaeo0husInagyn/JH85xMSxM0hEk/mbCII5ubLDuqW/Rw==} + engines: {node: '>=8.0.0'} + dependencies: + co-body: 6.1.0 + copy-to: 2.0.1 + dev: true + + /koa-compose/4.1.0: + resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} + dev: true + + /koa-convert/2.0.0: + resolution: {integrity: sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==} + engines: {node: '>= 10'} + dependencies: + co: 4.6.0 + koa-compose: 4.1.0 + dev: true + + /koa-mount/4.0.0: + resolution: {integrity: sha512-rm71jaA/P+6HeCpoRhmCv8KVBIi0tfGuO/dMKicbQnQW/YJntJ6MnnspkodoA4QstMVEZArsCphmd0bJEtoMjQ==} + engines: {node: '>= 7.6.0'} + dependencies: + debug: 4.3.4 + koa-compose: 4.1.0 + transitivePeerDependencies: + - supports-color + dev: true + + /koa-node-resolve/1.0.0-pre.9: + resolution: {integrity: sha512-WKgqe5TGVD6zuR3NrKnmbb/NNHIbWOCezQVqqnyQLdtLLXWgiothlUQT23S5qQGE0Z623jp6jxpMjvAqyrcZFQ==} + dependencies: + '@babel/generator': 7.18.12 + '@babel/parser': 7.18.11 + '@babel/traverse': 7.18.11 + '@types/babel__generator': 7.6.4 + '@types/parse5': 5.0.3 + get-stream: 5.2.0 + parse5: 5.1.1 + resolve: 1.22.1 + transitivePeerDependencies: + - supports-color + dev: true + + /koa-send/5.0.1: + resolution: {integrity: sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==} + engines: {node: '>= 8'} + dependencies: + debug: 4.3.4 + http-errors: 1.8.1 + resolve-path: 1.4.0 + transitivePeerDependencies: + - supports-color + dev: true + + /koa-static/5.0.0: + resolution: {integrity: sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==} + engines: {node: '>= 7.6.0'} + dependencies: + debug: 3.2.7 + koa-send: 5.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /koa/2.13.4: + resolution: {integrity: sha512-43zkIKubNbnrULWlHdN5h1g3SEKXOEzoAlRsHOTFpnlDu8JlAOZSMJBLULusuXRequboiwJcj5vtYXKB3k7+2g==} + engines: {node: ^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4} + dependencies: + accepts: 1.3.8 + cache-content-type: 1.0.1 + content-disposition: 0.5.4 + content-type: 1.0.4 + cookies: 0.8.0 + debug: 4.3.4 + delegates: 1.0.0 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + fresh: 0.5.2 + http-assert: 1.5.0 + http-errors: 1.8.1 + is-generator-function: 1.0.10 + koa-compose: 4.1.0 + koa-convert: 2.0.0 + on-finished: 2.4.1 + only: 0.0.2 + parseurl: 1.3.3 + statuses: 1.5.0 + type-is: 1.6.18 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: true + /kolorist/1.5.1: resolution: {integrity: sha512-lxpCM3HTvquGxKGzHeknB/sUjuVoUElLlfYnXZT73K8geR9jQbroGlSCFBax9/0mpGoD3kzcMLnOlGQPJJNyqQ==} dev: true @@ -4749,6 +5469,21 @@ packages: type-check: 0.4.0 dev: true + /lie/3.3.0: + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + dependencies: + immediate: 3.0.6 + dev: true + + /lighthouse-logger/1.3.0: + resolution: {integrity: sha512-BbqAKApLb9ywUli+0a+PcV04SyJ/N1q/8qgCNe6U97KbPCS1BTksEuHFLYdvc8DltuhfxIUBqDZsC0bBGtl3lA==} + dependencies: + debug: 2.6.9 + marky: 1.2.5 + transitivePeerDependencies: + - supports-color + dev: true + /lilconfig/2.0.5: resolution: {integrity: sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==} engines: {node: '>=10'} @@ -4829,6 +5564,13 @@ packages: p-locate: 5.0.0 dev: true + /locate-path/7.1.1: + resolution: {integrity: sha512-vJXaRMJgRVD3+cUZs3Mncj2mxpt5mP0EmNOsxRSZRMlbqjvxzDEOIUWXGmavo0ZC9+tNZCBLQ66reA11nbpHZg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + p-locate: 6.0.0 + dev: true + /lodash.camelcase/4.3.0: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} dev: true @@ -4841,6 +5583,30 @@ packages: resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} dev: true + /lodash.includes/4.3.0: + resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} + dev: true + + /lodash.isboolean/3.0.3: + resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} + dev: true + + /lodash.isinteger/4.0.4: + resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} + dev: true + + /lodash.isnumber/3.0.3: + resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} + dev: true + + /lodash.isplainobject/4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + dev: true + + /lodash.isstring/4.0.1: + resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + dev: true + /lodash.memoize/4.1.2: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} dev: true @@ -4849,10 +5615,18 @@ packages: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true + /lodash.once/4.1.1: + resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + dev: true + /lodash.startcase/4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} dev: true + /lodash.truncate/4.4.2: + resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} + dev: true + /lodash.uniq/4.5.0: resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} dev: true @@ -4911,6 +5685,16 @@ packages: get-func-name: 2.0.0 dev: true + /lowercase-keys/2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} + dev: true + + /lowercase-keys/3.0.0: + resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + /lru-cache/4.1.5: resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} dependencies: @@ -4948,6 +5732,10 @@ packages: engines: {node: '>=8'} dev: true + /marky/1.2.5: + resolution: {integrity: sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==} + dev: true + /maxmin/2.1.0: resolution: {integrity: sha512-NWlApBjW9az9qRPaeg7CX4sQBWwytqz32bIEo1PW9pRW+kBP9KLRfJO3UC+TV31EcQZEUq7eMzikC7zt3zPJcw==} engines: {node: '>=0.12'} @@ -5082,6 +5870,16 @@ packages: engines: {node: '>=12'} dev: true + /mimic-response/1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + dev: true + + /mimic-response/3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + dev: true + /min-indent/1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} @@ -5125,6 +5923,10 @@ packages: engines: {node: '>= 8.0.0'} dev: true + /mkdirp-classic/0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + dev: true + /mkdirp/0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true @@ -5199,6 +6001,10 @@ packages: engines: {node: '>= 0.6'} dev: true + /nice-try/1.0.5: + resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} + dev: true + /nise/5.1.1: resolution: {integrity: sha512-yr5kW2THW1AkxVmCnKEh4nbYkJdB3I7LUkiUgOvEkOp414mc2UMaHMA7pjq1nYowhdoJZGwEKGaQVbxfpWj10A==} dependencies: @@ -5209,6 +6015,18 @@ packages: path-to-regexp: 1.8.0 dev: true + /node-fetch/2.6.7: + resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: true + /node-releases/2.0.6: resolution: {integrity: sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==} dev: true @@ -5237,6 +6055,13 @@ packages: engines: {node: '>=10'} dev: true + /npm-run-path/2.0.2: + resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} + engines: {node: '>=4'} + dependencies: + path-key: 2.0.1 + dev: true + /npm-run-path/5.1.0: resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -5313,6 +6138,18 @@ packages: mimic-fn: 4.0.0 dev: true + /only/0.0.2: + resolution: {integrity: sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==} + dev: true + + /open/7.4.2: + resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + is-wsl: 2.2.0 + dev: true + /open/8.4.0: resolution: {integrity: sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==} engines: {node: '>=12'} @@ -5343,6 +6180,11 @@ packages: resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} dev: true + /p-cancelable/3.0.0: + resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} + engines: {node: '>=12.20'} + dev: true + /p-filter/2.1.0: resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} engines: {node: '>=8'} @@ -5369,6 +6211,13 @@ packages: yocto-queue: 0.1.0 dev: true + /p-limit/4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + yocto-queue: 1.0.0 + dev: true + /p-locate/4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} @@ -5383,6 +6232,13 @@ packages: p-limit: 3.1.0 dev: true + /p-locate/6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + p-limit: 4.0.0 + dev: true + /p-map/2.1.0: resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} engines: {node: '>=6'} @@ -5415,6 +6271,10 @@ packages: engines: {node: '>=6'} dev: true + /pako/1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + dev: true + /parent-module/1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -5432,6 +6292,10 @@ packages: lines-and-columns: 1.2.4 dev: true + /parse5/5.1.1: + resolution: {integrity: sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==} + dev: true + /parseurl/1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} @@ -5442,11 +6306,21 @@ packages: engines: {node: '>=8'} dev: true + /path-exists/5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + /path-is-absolute/1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} dev: true + /path-key/2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} + dev: true + /path-key/3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -5476,6 +6350,10 @@ packages: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} dev: true + /pend/1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + dev: true + /picocolors/1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} dev: true @@ -5508,6 +6386,21 @@ packages: find-up: 4.1.0 dev: true + /pkg-install/1.0.0: + resolution: {integrity: sha512-UGI8bfhrDb1KN01RZ7Bq08GRQc8rmVjxQ2up0g4mUHPCYDTK1FzQ0PMmLOBCHg3yaIijZ2U3Fn9ofLa4N392Ug==} + dependencies: + '@types/execa': 0.9.0 + '@types/node': 11.15.54 + execa: 1.0.0 + dev: true + + /pkg-up/4.0.0: + resolution: {integrity: sha512-N4zdA4sfOe6yCv+ulPCmpnIBQ5I60xfhDr1otdBBhKte9QtEf3bhfrfkW7dTb+IQ0iEx4ZDzas0kc1o5rdWpYg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + find-up: 6.3.0 + dev: true + /postcss-calc/8.2.4_postcss@8.4.16: resolution: {integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==} peerDependencies: @@ -5915,6 +6808,10 @@ packages: pretty-format: 3.8.0 dev: false + /preact/10.10.6: + resolution: {integrity: sha512-w0mCL5vICUAZrh1DuHEdOWBjxdO62lvcO++jbzr8UhhYcTbFkpegLH9XX+7MadjTl/y0feoqwQ/zAnzkc/EGog==} + dev: true + /preact/10.9.0: resolution: {integrity: sha512-jO6/OvCRL+OT8gst/+Q2ir7dMybZAX8ioP02Zmzh3BkQMHLyqZSujvxbUriXvHi8qmhcHKC2Gwbog6Kt+YTh+Q==} @@ -5961,20 +6858,71 @@ packages: resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==} dev: false + /process-nextick-args/2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: true + + /progress/2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + dev: true + /promise.series/0.2.0: resolution: {integrity: sha512-VWQJyU2bcDTgZw8kpfBpB/ejZASlCrzwz5f2hjb/zlujOEB4oeiAhHygAWq8ubsX2GVkD4kCU5V2dwOTaCY5EQ==} engines: {node: '>=0.12'} dev: true + /prompts/2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + dev: true + + /proxy-from-env/1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: true + /pseudomap/1.0.2: resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} dev: true + /pump/3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: true + /punycode/2.1.1: resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} engines: {node: '>=6'} dev: true + /puppeteer-core/5.5.0: + resolution: {integrity: sha512-tlA+1n+ziW/Db03hVV+bAecDKse8ihFRXYiEypBe9IlLRvOCzYFG6qrCMBYK34HO/Q/Ecjc+tvkHRAfLVH+NgQ==} + engines: {node: '>=10.18.1'} + dependencies: + debug: 4.3.4 + devtools-protocol: 0.0.818844 + extract-zip: 2.0.1 + https-proxy-agent: 4.0.0 + node-fetch: 2.6.7 + pkg-dir: 4.2.0 + progress: 2.0.3 + proxy-from-env: 1.1.0 + rimraf: 3.0.2 + tar-fs: 2.1.1 + unbzip2-stream: 1.4.3 + ws: 7.5.9 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: true + /qjobs/1.2.0: resolution: {integrity: sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==} engines: {node: '>=0.9'} @@ -5996,6 +6944,11 @@ packages: engines: {node: '>=8'} dev: true + /quick-lru/5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + dev: true + /randombytes/2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} dependencies: @@ -6061,6 +7014,27 @@ packages: strip-bom: 3.0.0 dev: true + /readable-stream/2.3.7: + resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + dev: true + + /readable-stream/3.6.0: + resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: true + /readdirp/3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -6076,6 +7050,11 @@ packages: strip-indent: 3.0.0 dev: true + /reduce-flatten/2.0.0: + resolution: {integrity: sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==} + engines: {node: '>=6'} + dev: true + /regenerate-unicode-properties/10.0.1: resolution: {integrity: sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==} engines: {node: '>=4'} @@ -6139,6 +7118,11 @@ packages: engines: {node: '>=0.10.0'} dev: true + /require-from-string/2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: true + /require-main-filename/2.0.0: resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} dev: true @@ -6147,6 +7131,10 @@ packages: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} dev: true + /resolve-alpn/1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + dev: true + /resolve-from/4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -6157,6 +7145,14 @@ packages: engines: {node: '>=8'} dev: true + /resolve-path/1.4.0: + resolution: {integrity: sha512-i1xevIst/Qa+nA9olDxLWnLk8YZbi8R/7JPbCMcgyWaFR6bKWaexgJgEB5oc2PKMjYdrHynyz0NY+if+H98t1w==} + engines: {node: '>= 0.8'} + dependencies: + http-errors: 1.6.3 + path-is-absolute: 1.0.1 + dev: true + /resolve/1.22.1: resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} hasBin: true @@ -6166,6 +7162,19 @@ packages: supports-preserve-symlinks-flag: 1.0.0 dev: true + /responselike/2.0.1: + resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + dependencies: + lowercase-keys: 2.0.0 + dev: true + + /responselike/3.0.0: + resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} + engines: {node: '>=14.16'} + dependencies: + lowercase-keys: 3.0.0 + dev: true + /restore-cursor/3.1.0: resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} engines: {node: '>=8'} @@ -6311,11 +7320,29 @@ packages: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} dev: true + /sanitize-filename/1.6.3: + resolution: {integrity: sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==} + dependencies: + truncate-utf8-bytes: 1.0.2 + dev: true + /scheduler/0.23.0: resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} dependencies: loose-envify: 1.4.0 + /selenium-webdriver/4.4.0: + resolution: {integrity: sha512-Du+/xfpvNi9zHAeYgXhOWN9yH0hph+cuX+hHDBr7d+SbtQVcfNJwBzLsbdHrB1Wh7MHXFuIkSG88A9TRRQUx3g==} + engines: {node: '>= 10.15.0'} + dependencies: + jszip: 3.10.1 + tmp: 0.2.1 + ws: 8.8.1 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: true + /semver/5.7.1: resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} hasBin: true @@ -6355,6 +7382,14 @@ packages: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} dev: true + /setimmediate/1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + dev: true + + /setprototypeof/1.1.0: + resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} + dev: true + /setprototypeof/1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} dev: true @@ -6416,6 +7451,10 @@ packages: supports-color: 7.2.0 dev: true + /sisteransi/1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + dev: true + /slash/3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -6638,6 +7677,18 @@ packages: es-abstract: 1.20.1 dev: true + /string_decoder/1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + dev: true + + /string_decoder/1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: true + /strip-ansi/3.0.1: resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} engines: {node: '>=0.10.0'} @@ -6671,6 +7722,11 @@ packages: engines: {node: '>=4'} dev: true + /strip-eof/1.0.0: + resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} + engines: {node: '>=0.10.0'} + dev: true + /strip-final-newline/3.0.0: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} @@ -6748,6 +7804,91 @@ packages: stable: 0.1.8 dev: true + /systeminformation/5.12.6: + resolution: {integrity: sha512-FkCvT5BOuH1OE3+8lFM25oXIYJ0CM8kq4Wgvz2jyBTrsOIgha/6gdJXgbF4rv+g0j/5wJqQLDKan7kc/p7uIvw==} + engines: {node: '>=8.0.0'} + os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android] + hasBin: true + dev: true + + /table-layout/1.0.2: + resolution: {integrity: sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==} + engines: {node: '>=8.0.0'} + dependencies: + array-back: 4.0.2 + deep-extend: 0.6.0 + typical: 5.2.0 + wordwrapjs: 4.0.1 + dev: true + + /table/6.8.0: + resolution: {integrity: sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==} + engines: {node: '>=10.0.0'} + dependencies: + ajv: 8.11.0 + lodash.truncate: 4.4.2 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /tachometer/0.7.0: + resolution: {integrity: sha512-163DdzoNkjZlr/m3IpaPMYBOTUc54hzfGSUw7pv9ZoO3OkjDcoGqJGImcrfEDNsw3DD0J/FM5AWjEi2/0W4YZA==} + hasBin: true + dependencies: + ansi-escape-sequences: 6.2.1 + command-line-args: 5.2.1 + command-line-usage: 6.1.3 + csv-stringify: 6.2.0 + fs-extra: 10.1.0 + get-stream: 6.0.1 + got: 12.4.1 + jsonschema: 1.4.1 + jsonwebtoken: 8.5.1 + jstat: 1.9.5 + koa: 2.13.4 + koa-bodyparser: 4.3.0 + koa-mount: 4.0.0 + koa-node-resolve: 1.0.0-pre.9 + koa-send: 5.0.1 + koa-static: 5.0.0 + pkg-install: 1.0.0 + pkg-up: 4.0.0 + progress: 2.0.3 + sanitize-filename: 1.6.3 + selenium-webdriver: 4.4.0 + semver: 7.3.7 + source-map-support: 0.5.21 + strip-ansi: 7.0.1 + systeminformation: 5.12.6 + table: 6.8.0 + ua-parser-js: 1.0.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /tar-fs/2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + dev: true + + /tar-stream/2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.0 + dev: true + /term-size/2.2.1: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} @@ -6819,11 +7960,21 @@ packages: engines: {node: '>=0.6'} dev: true + /tr46/0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: true + /trim-newlines/3.0.1: resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} engines: {node: '>=8'} dev: true + /truncate-utf8-bytes/1.0.2: + resolution: {integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==} + dependencies: + utf8-byte-length: 1.0.4 + dev: true + /tslib/1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} dev: true @@ -6832,6 +7983,11 @@ packages: resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} dev: true + /tsscmp/1.0.6: + resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} + engines: {node: '>=0.6.x'} + dev: true + /tsutils/3.21.0_typescript@4.7.4: resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} @@ -6907,10 +8063,24 @@ packages: hasBin: true dev: true + /typical/4.0.0: + resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} + engines: {node: '>=8'} + dev: true + + /typical/5.2.0: + resolution: {integrity: sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==} + engines: {node: '>=8'} + dev: true + /ua-parser-js/0.7.31: resolution: {integrity: sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==} dev: true + /ua-parser-js/1.0.2: + resolution: {integrity: sha512-00y/AXhx0/SsnI51fTc0rLRmafiGOM4/O+ny10Ps7f+j/b8p/ZY11ytMgznXkOVo4GQ+KwQG5UQLkLGirsACRg==} + dev: true + /unbox-primitive/1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: @@ -6920,6 +8090,13 @@ packages: which-boxed-primitive: 1.0.2 dev: true + /unbzip2-stream/1.4.3: + resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} + dependencies: + buffer: 5.7.1 + through: 2.3.8 + dev: true + /unicode-canonical-property-names-ecmascript/2.0.0: resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} engines: {node: '>=4'} @@ -6975,6 +8152,10 @@ packages: punycode: 2.1.1 dev: true + /utf8-byte-length/1.0.4: + resolution: {integrity: sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==} + dev: true + /util-deprecate/1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: true @@ -6988,6 +8169,43 @@ packages: resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} dev: true + /v8-deopt-generate-log/0.2.2: + resolution: {integrity: sha512-Apvt75YeBE2N5PsRfvIi2/F3wKAHMmBWexCjWK7wOK3+Z4lmNle08C3boFtjvWcoJl+JqQtzuJLpTyGxDsseWQ==} + dependencies: + chrome-launcher: 0.13.4 + puppeteer-core: 5.5.0 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: true + + /v8-deopt-parser/0.4.1: + resolution: {integrity: sha512-YbUrxkJmlbLb9VzE/KyEetkceEyah3b1TrTPVpc8NSMAdlXO5Zf+sc1/cqntDFb1Tsc+KtEaR8tHgtgfcu1Oig==} + dev: true + + /v8-deopt-viewer/0.2.1: + resolution: {integrity: sha512-ukm5uACxNB5y8p4LXTIWmQHMGcyGdK7UfRfrNqQGMpBNdpCp8zuPObYMu+rMlA5mqr1NM0tAlNpiDumAJR6YiA==} + hasBin: true + dependencies: + httpie: 1.1.2 + open: 7.4.2 + sade: 1.8.1 + v8-deopt-generate-log: 0.2.2 + v8-deopt-parser: 0.4.1 + v8-deopt-webapp: 0.4.3 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: true + + /v8-deopt-webapp/0.4.3: + resolution: {integrity: sha512-hqvVSw4Xz2yRgnEiCmghdH2VG1j/Z/Hkj58CE6zzNdRnZf8yHtS8gqSjdQWeNYysF3WFn6v6l27FwTbK9yWnIQ==} + dev: true + /validate-npm-package-license/3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} dependencies: @@ -7038,6 +8256,17 @@ packages: defaults: 1.0.3 dev: true + /webidl-conversions/3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: true + + /whatwg-url/5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: true + /which-boxed-primitive/1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} dependencies: @@ -7080,6 +8309,14 @@ packages: engines: {node: '>=0.10.0'} dev: true + /wordwrapjs/4.0.1: + resolution: {integrity: sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==} + engines: {node: '>=8.0.0'} + dependencies: + reduce-flatten: 2.0.0 + typical: 5.2.0 + dev: true + /workerpool/6.2.1: resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==} dev: true @@ -7106,6 +8343,19 @@ packages: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true + /ws/7.5.9: + resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + /ws/8.2.3: resolution: {integrity: sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==} engines: {node: '>=10.0.0'} @@ -7119,6 +8369,19 @@ packages: optional: true dev: true + /ws/8.8.1: + resolution: {integrity: sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + /y18n/4.0.3: resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} dev: true @@ -7222,7 +8485,24 @@ packages: yargs-parser: 21.1.1 dev: true + /yauzl/2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + dev: true + + /ylru/1.3.2: + resolution: {integrity: sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA==} + engines: {node: '>= 4.0.0'} + dev: true + /yocto-queue/0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} dev: true + + /yocto-queue/1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 060d3f67b..f3a64db9d 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -3,5 +3,7 @@ packages: - "packages/*" # all packages in subdirs of components/ - "docs/**" + # all packages in subdirs of components/ + - "benches" # exclude packages that are inside test directories - "!**/test/**"