From 61113dd35c4335c45a1050c167bf393763e5641a Mon Sep 17 00:00:00 2001 From: Daniel Rice Date: Tue, 28 Apr 2026 17:40:27 +0100 Subject: [PATCH 01/11] Performance: define baseline metrics and profiling workflow MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Introduces bench/ for capturing baselines before/after future refactors. Three layers, no src/ changes: * Bundle size — walks dist/ for raw + gzipped totals. * Lighthouse CI — runs the demo via vite preview against three UniProt scenarios (P05067, P38398, A0A2K5ULD0); 5 runs per URL, median reported. * Custom milestones — bench/instrument.js (loaded only on ?bench=1) uses MutationObserver on the host to mark fetch-and-parse, render, and total. Lighthouse captures these via its user-timings audit. Adds @lhci/cli devDep. --- .gitignore | 2 + bench/README.md | 84 +++ bench/baselines/.gitkeep | 0 bench/bundle-size.mjs | 88 +++ bench/instrument.js | 140 +++++ bench/lighthouserc.cjs | 50 ++ bench/run.mjs | 23 + bench/summarize.mjs | 106 ++++ eslint.config.mjs | 28 +- index.html | 15 +- package.json | 7 +- yarn.lock | 1246 +++++++++++++++++++++++++++++++++++++- 12 files changed, 1759 insertions(+), 30 deletions(-) create mode 100644 bench/README.md create mode 100644 bench/baselines/.gitkeep create mode 100644 bench/bundle-size.mjs create mode 100644 bench/instrument.js create mode 100644 bench/lighthouserc.cjs create mode 100644 bench/run.mjs create mode 100644 bench/summarize.mjs diff --git a/.gitignore b/.gitignore index 0aba0268..2a3f6f17 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,8 @@ node_modules/ yalc.lock coverage/ demo/ +bench/results/ +.lighthouseci/ # Security: prevent accidental commit of secrets and credentials .env diff --git a/bench/README.md b/bench/README.md new file mode 100644 index 00000000..e10e9374 --- /dev/null +++ b/bench/README.md @@ -0,0 +1,84 @@ +# Performance bench + +Repeatable performance measurement for protvista-uniprot. + +1. **Library bundle size** — raw + gzipped bytes from `yarn build`'s `dist/` output. Catches accidental dependency bloat in shippable code. +2. **Lighthouse CI** — runs the demo (`yarn build:demo`, served by `vite preview`) against a fixed list of UniProt accessions. Captures LCP, TBT, CLS, Speed Index, and the overall Performance score. +3. **Custom milestones** — `bench/instrument.js` observes the host's DOM to mark `script-start`, `data-loaded` (loader removed), `first-render` (manager inserted), and `tracks-settled` (no subtree mutations for 250 ms — same quiescence pattern Playwright's `networkidle` uses). Lighthouse's user-timings audit captures these automatically, so they appear next to the headline metrics in `summary.md`. + +`fetch-and-parse` (script-start → data-loaded) and `render` (data-loaded → tracks-settled) are the per-stage breakdowns; `total` is the end-to-end. The `render` measure includes a constant ~250 ms quiescence gap, which cancels out in before/after comparisons. + +The custom layer is purely external: it only loads when the URL has `?bench=1`, observes the rendered DOM, and adds **zero changes to `src/`**. If you need finer-grained timings (e.g., per-track or per-adapter cost) later, add `performance.mark()` calls inside `src/` — but the milestones above usually suffice for spotting regressions in a refactor. + +## Run + +```bash +yarn bench +``` + +This builds, measures, and writes: + +- `bench/results/bundle-size.json` — file-by-file sizes plus totals +- `bench/results/lighthouse/` — raw LHCI reports + `manifest.json` +- `bench/results/summary.md` — top-line markdown table + +`bench/results/` is gitignored. Only `bench/baselines/` is tracked. + +You can also run each layer on its own: + +```bash +yarn bench:bundle # library only +yarn bench:lighthouse # demo only +yarn bench:summary # re-render summary.md from existing results +``` + +## Capturing a baseline + +Lighthouse numbers are sensitive to machine state. To make a snapshot worth committing: + +- Run on a quiet machine, plugged in, no other heavy apps. +- Same Chrome version on every run (LHCI uses the system Chrome). +- 3 runs per URL by default; LHCI picks the representative (median) run. + +To pin a snapshot to a known commit: + +```bash +yarn bench +SHA=$(git rev-parse --short HEAD) +cp bench/results/summary.md bench/baselines/summary-${SHA}.md +cp bench/results/bundle-size.json bench/baselines/bundle-size-${SHA}.json +git add bench/baselines/summary-${SHA}.md bench/baselines/bundle-size-${SHA}.json +git commit -m "bench: baseline at ${SHA}" +``` + +To capture a baseline against an **older** commit (e.g., `main` immediately before a merge), use a worktree so your working checkout stays untouched: + +```bash +git worktree add ../protvista-baseline +cd ../protvista-baseline +yarn install --frozen-lockfile +yarn bench +# copy the snapshot back into the main checkout's bench/baselines/ +``` + +## Comparing + +Eyeballing two `summary.md` tables is enough most of the time. For a stricter check, LHCI's own diff works against the raw reports — see `lhci compare` docs. + +Treat any single-metric delta under ~5% as noise unless it's consistent across all scenarios. + +## Editing scenarios + +Scenarios are defined in `bench/lighthouserc.cjs` under `ci.collect.url`. Each query string is a UniProt accession — `index.html` reads `?accession=` and renders that protein. Add or remove URLs there. + +## Files + +| File | Purpose | +| ------------------ | ----------------------------------------------------- | +| `lighthouserc.cjs` | LHCI config: scenarios, run count, throttling preset | +| `bundle-size.mjs` | Walks `dist/`, writes raw + gzip sizes per file | +| `instrument.js` | Browser-side marks; loaded only on `?bench=1` | +| `summarize.mjs` | Reads results, writes `summary.md` | +| `run.mjs` | One-shot driver (`yarn bench`) | +| `baselines/` | Committed snapshots — reference points for comparison | +| `results/` | Gitignored — output of the latest run | diff --git a/bench/baselines/.gitkeep b/bench/baselines/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/bench/bundle-size.mjs b/bench/bundle-size.mjs new file mode 100644 index 00000000..0f68068a --- /dev/null +++ b/bench/bundle-size.mjs @@ -0,0 +1,88 @@ +#!/usr/bin/env node +/** + * Measure raw + gzipped size of the library build (dist/). + * + * Writes bench/results/bundle-size.json: + * { commit, shortSha, capturedAt, files: [{ file, raw, gzip }], total } + * + * Run after `yarn build`. The `bench:bundle` script in package.json + * does both in one go. + */ +import { + readdirSync, + readFileSync, + writeFileSync, + mkdirSync, + existsSync, +} from 'node:fs'; +import { gzipSync } from 'node:zlib'; +import { join, relative } from 'node:path'; +import { execSync } from 'node:child_process'; +import { fileURLToPath } from 'node:url'; + +const root = join(fileURLToPath(import.meta.url), '..', '..'); +const distDir = join(root, 'dist'); +const outDir = join(root, 'bench/results'); + +if (!existsSync(distDir)) { + console.error( + `error: ${relative(root, distDir)} does not exist. Run \`yarn build\` first.` + ); + process.exit(1); +} + +mkdirSync(outDir, { recursive: true }); + +// Walk dist/ and collect anything a consumer would actually ship. +const SHIPPABLE = /\.(m?js|css)$/; +function walk(dir) { + return readdirSync(dir, { withFileTypes: true }).flatMap((entry) => { + const full = join(dir, entry.name); + if (entry.isDirectory()) return walk(full); + if (SHIPPABLE.test(entry.name)) return [full]; + return []; + }); +} + +const files = walk(distDir).map((path) => { + const buf = readFileSync(path); + return { + file: relative(distDir, path), + raw: buf.length, + gzip: gzipSync(buf).length, + }; +}); + +const total = files.reduce( + (acc, f) => ({ raw: acc.raw + f.raw, gzip: acc.gzip + f.gzip }), + { raw: 0, gzip: 0 } +); + +// Tag the snapshot with the commit when available — but don't crash if +// git is unavailable (tarball install, shallow CI clone, etc.). +const git = (cmd) => { + try { + return execSync(cmd, { cwd: root, stdio: ['ignore', 'pipe', 'ignore'] }) + .toString() + .trim(); + } catch { + return 'unknown'; + } +}; +const result = { + commit: git('git rev-parse HEAD'), + shortSha: git('git rev-parse --short HEAD'), + capturedAt: new Date().toISOString(), + files, + total, +}; + +writeFileSync( + join(outDir, 'bundle-size.json'), + JSON.stringify(result, null, 2) +); + +const kb = (b) => (b / 1024).toFixed(1) + ' KB'; +console.log( + `bundle-size: ${kb(total.raw)} raw / ${kb(total.gzip)} gzip across ${files.length} files` +); diff --git a/bench/instrument.js b/bench/instrument.js new file mode 100644 index 00000000..7231db6e --- /dev/null +++ b/bench/instrument.js @@ -0,0 +1,140 @@ +/** + * External instrumentation for protvista-uniprot. + * + * Always loaded by the demo build, but no-ops unless the URL has + * `?bench=1`. Emits `performance.mark` / `performance.measure` calls + * based on the component's existing public surface — no `src/` changes. + * + * Lighthouse's user-timings audit picks these up automatically, so they + * show up in `summary.md` next to LCP/TBT/etc. + * + * Marks: + * protvista:script-start when this script runs (≈ navigation start) + * protvista:data-loaded loader removed (data fetched + parsed) + * protvista:first-render nightingale-manager appears under the host + * protvista:tracks-settled no host-subtree mutations for QUIESCENCE_MS + * (proxy for "tracks finished painting") + * + * Measures: + * protvista:fetch-and-parse script-start → data-loaded + * protvista:render data-loaded → tracks-settled (incl. quiescence gap) + * protvista:total script-start → tracks-settled + * + * The render measure ends at tracks-settled rather than first-render + * because Lit batches the loader-removal and manager-insertion into the + * same render cycle — first-render fires before nightingale's track + * elements have actually painted. Quiescence detection is the same + * pattern Playwright's `networkidle` and web-vitals' "long task" probes + * use; the QUIESCENCE_MS threshold below is a constant offset that + * cancels out in before/after comparisons. + * + * If the public events change shape, marks may go missing — fail loudly + * by checking summary.md, not silently by adding fallback heuristics. + */ + +if (new URLSearchParams(location.search).has('bench')) { + run(); +} + +function run() { + const HOST_TAG = 'protvista-uniprot'; + const RENDERED_CHILD = 'nightingale-manager'; + const LOADER_CLASS = 'protvista-loader'; + const QUIESCENCE_MS = 250; + + performance.mark('protvista:script-start'); + + const hasMark = (name) => + performance.getEntriesByName(name, 'mark').length > 0; + + function whenHostExists() { + return new Promise((resolve) => { + const found = document.querySelector(HOST_TAG); + if (found) return resolve(found); + const obs = new MutationObserver(() => { + const el = document.querySelector(HOST_TAG); + if (el) { + obs.disconnect(); + resolve(el); + } + }); + obs.observe(document.documentElement, { + childList: true, + subtree: true, + }); + }); + } + + whenHostExists().then((host) => { + // We watch the light-DOM host for three transitions: + // 1. `.protvista-loader` was shown and is now gone → data has loaded + // 2. `` is present → component has first-rendered + // 3. no further subtree mutations for QUIESCENCE_MS → tracks have settled + // + // The component's own `protvista-event{hasData}` is unreliable + // (see "Note: this doesn't seem to work" in src/protvista-uniprot.ts); + // the loader div is the next-best public signal of "fetch resolved". + // + // Why the `loaderEverSeen` flag matters: the host can be observed + // *before* Lit's first render inserts the loader. A naive "loader not + // present" check then fires `data-loaded` immediately at framework + // startup time — wrong by orders of magnitude. + let loaderEverSeen = !!host.querySelector(`.${LOADER_CLASS}`); + let settleTimer = null; + + const obs = new MutationObserver(() => { + const loaderPresent = !!host.querySelector(`.${LOADER_CLASS}`); + const managerPresent = !!host.querySelector(RENDERED_CHILD); + if (loaderPresent) loaderEverSeen = true; + + // Data loaded: loader was shown and is now gone. Fallback: manager + // appeared without a loader ever showing (cached / instant render). + if ( + !hasMark('protvista:data-loaded') && + ((loaderEverSeen && !loaderPresent) || + (managerPresent && !loaderEverSeen)) + ) { + performance.mark('protvista:data-loaded'); + performance.measure( + 'protvista:fetch-and-parse', + 'protvista:script-start', + 'protvista:data-loaded' + ); + } + + if (!hasMark('protvista:first-render') && managerPresent) { + performance.mark('protvista:first-render'); + } + + // Once first-render has fired, debounce: every new mutation pushes + // the settle timer out by QUIESCENCE_MS. When the timer finally + // expires, the subtree has been mutation-free for that long and we + // treat painting as done. + if (hasMark('protvista:first-render')) { + clearTimeout(settleTimer); + settleTimer = setTimeout(settle, QUIESCENCE_MS); + } + }); + + function settle() { + if (hasMark('protvista:tracks-settled')) return; + if (!hasMark('protvista:first-render')) return; + performance.mark('protvista:tracks-settled'); + if (hasMark('protvista:data-loaded')) { + performance.measure( + 'protvista:render', + 'protvista:data-loaded', + 'protvista:tracks-settled' + ); + } + performance.measure( + 'protvista:total', + 'protvista:script-start', + 'protvista:tracks-settled' + ); + obs.disconnect(); + } + + obs.observe(host, { childList: true, subtree: true }); + }); +} diff --git a/bench/lighthouserc.cjs b/bench/lighthouserc.cjs new file mode 100644 index 00000000..1714068f --- /dev/null +++ b/bench/lighthouserc.cjs @@ -0,0 +1,50 @@ +/** + * Lighthouse CI config. + * + * `lhci autorun` will boot `vite preview` against the demo build, run + * Lighthouse N times against each URL, then write reports under + * bench/results/lighthouse/. + * + * Edit `collect.url` to change scenarios. Each query string is a UniProt + * accession; index.html reads `?accession=` and renders that protein. + */ +module.exports = { + ci: { + collect: { + // Built artefact lives in `demo/` (see vite.demo.config.mjs). + // --strictPort makes startup fail loudly if 4173 is busy instead of + // silently moving to another port that the URLs below won't match. + startServerCommand: + 'npx vite preview --config vite.demo.config.mjs --port 4173 --strictPort', + startServerReadyPattern: 'Local:', + // `&bench=1` opts the page into bench/instrument.js, which emits + // `protvista:*` user timings that Lighthouse captures in its trace. + url: [ + // Well-annotated default — features, variants, structure. + 'http://localhost:4173/?accession=P05067&bench=1', + // Heavy entry — many variants, 3D Beacons. + 'http://localhost:4173/?accession=P38398&bench=1', + // Sparse entry — minimal feature load. + 'http://localhost:4173/?accession=A0A2K5ULD0&bench=1', + ], + // 5 runs per URL — LHCI takes the median, this smooths out the + // noise floor more than the default 3 without doubling wall time. + numberOfRuns: 5, + settings: { + // Library demo, not a PWA — only the perf category is meaningful. + onlyCategories: ['performance'], + // Researchers use this on desktop; mobile throttling distorts the + // signal we care about. + preset: 'desktop', + // Be explicit so two machines on different Chrome versions still + // produce comparable numbers. + chromeFlags: '--headless=new --no-sandbox', + }, + }, + upload: { + target: 'filesystem', + outputDir: './bench/results/lighthouse', + reportFilenamePattern: '%%PATHNAME%%-%%DATETIME%%-%%EXTENSION%%', + }, + }, +}; diff --git a/bench/run.mjs b/bench/run.mjs new file mode 100644 index 00000000..1022c9c5 --- /dev/null +++ b/bench/run.mjs @@ -0,0 +1,23 @@ +#!/usr/bin/env node +/** + * One-shot driver: bundle size, then Lighthouse, then summary. + * Equivalent to `yarn bench:bundle && yarn bench:lighthouse && yarn bench:summary`, + * but keeps the orchestration in one place so CI can call a single script. + */ +import { execSync } from 'node:child_process'; +import { join } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const root = join(fileURLToPath(import.meta.url), '..', '..'); +const run = (cmd) => execSync(cmd, { cwd: root, stdio: 'inherit' }); + +console.log('▶ bundle size'); +run('yarn bench:bundle'); + +console.log('▶ lighthouse'); +run('yarn bench:lighthouse'); + +console.log('▶ summary'); +run('yarn bench:summary'); + +console.log('\n✔ done — see bench/results/summary.md'); diff --git a/bench/summarize.mjs b/bench/summarize.mjs new file mode 100644 index 00000000..ba7751b3 --- /dev/null +++ b/bench/summarize.mjs @@ -0,0 +1,106 @@ +#!/usr/bin/env node +/** + * Roll bench/results/* into a single bench/results/summary.md table. + * + * Reads: + * - bench/results/bundle-size.json (from bench:bundle) + * - bench/results/lighthouse/manifest.json + report JSONs (from bench:lighthouse) + * + * For Lighthouse we use LHCI's own "representative run" — it's the median + * of numberOfRuns by performance score, which smooths out single-run noise. + */ +import { readFileSync, writeFileSync, existsSync } from 'node:fs'; +import { join } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const root = join(fileURLToPath(import.meta.url), '..', '..'); +const resultsDir = join(root, 'bench/results'); +const lhDir = join(resultsDir, 'lighthouse'); + +const lines = []; +const kb = (b) => (b / 1024).toFixed(1) + ' KB'; + +lines.push('# Bench results'); +lines.push(''); +lines.push(`Captured: ${new Date().toISOString()}`); +lines.push(''); + +const bundlePath = join(resultsDir, 'bundle-size.json'); +if (existsSync(bundlePath)) { + const bundle = JSON.parse(readFileSync(bundlePath, 'utf8')); + lines.push('## Bundle size (library, `dist/`)'); + lines.push(''); + lines.push(`Commit: \`${bundle.shortSha}\``); + lines.push(''); + lines.push('| Total raw | Total gzip | Files |'); + lines.push('|---|---|---|'); + lines.push( + `| ${kb(bundle.total.raw)} | ${kb(bundle.total.gzip)} | ${bundle.files.length} |` + ); + lines.push(''); +} + +const manifestPath = join(lhDir, 'manifest.json'); +if (existsSync(manifestPath)) { + const manifest = JSON.parse(readFileSync(manifestPath, 'utf8')); + // LHCI marks one run per URL as `isRepresentativeRun: true` (the median). + const representatives = manifest.filter((r) => r.isRepresentativeRun); + + // Hydrate each representative report once and cache; we read it twice + // (Lighthouse metrics + custom timings). + const rows = representatives.map((run) => { + const report = JSON.parse(readFileSync(run.jsonPath, 'utf8')); + const url = new URL(run.url); + return { + scenario: url.search.replace(/^\?/, '') || url.pathname, + report, + }; + }); + + lines.push('## Lighthouse (median of N runs)'); + lines.push(''); + lines.push('| Scenario | Perf | LCP | TBT | CLS | Speed Index |'); + lines.push('|---|---|---|---|---|---|'); + for (const { scenario, report } of rows) { + const a = report.audits; + const score = (report.categories.performance.score * 100).toFixed(0); + lines.push( + `| \`${scenario}\` | ${score} | ${a['largest-contentful-paint'].displayValue} | ` + + `${a['total-blocking-time'].displayValue} | ${a['cumulative-layout-shift'].displayValue} | ` + + `${a['speed-index'].displayValue} |` + ); + } + lines.push(''); + + // Custom milestones — emitted by bench/instrument.js, captured by + // Lighthouse's user-timings audit. Only renders if at least one row + // has timings (e.g., URL didn't include &bench=1). + const protvistaTimings = (report) => + (report.audits['user-timings']?.details?.items ?? []).filter( + (it) => it.timingType === 'Measure' && it.name?.startsWith('protvista:') + ); + const anyTimings = rows.some( + ({ report }) => protvistaTimings(report).length > 0 + ); + if (anyTimings) { + const fmt = (ms) => (ms == null ? '—' : `${ms.toFixed(0)} ms`); + const pick = (items, name) => + items.find((it) => it.name === name)?.duration; + lines.push('### Custom milestones (median run)'); + lines.push(''); + lines.push('| Scenario | fetch-and-parse | render | total |'); + lines.push('|---|---|---|---|'); + for (const { scenario, report } of rows) { + const items = protvistaTimings(report); + lines.push( + `| \`${scenario}\` | ${fmt(pick(items, 'protvista:fetch-and-parse'))} | ` + + `${fmt(pick(items, 'protvista:render'))} | ${fmt(pick(items, 'protvista:total'))} |` + ); + } + lines.push(''); + } +} + +const out = join(resultsDir, 'summary.md'); +writeFileSync(out, lines.join('\n')); +console.log(`summary: ${out}`); diff --git a/eslint.config.mjs b/eslint.config.mjs index 0d43ce2f..9c33df0f 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -8,7 +8,10 @@ import globals from 'globals'; export default [ js.configs.recommended, - ...ts.configs.recommended, + ...ts.configs.recommended.map((c) => ({ + ...c, + files: ['**/*.ts', '**/*.tsx'], + })), prettier, { files: ['**/*.ts', '**/*.tsx'], @@ -42,4 +45,27 @@ export default [ 'no-unsanitized/property': 'error', }, }, + + /* Bench scripts — plain JS, not part of the shipped library. Browser + globals for the instrumentation, Node globals for the runners. */ + { + files: ['bench/instrument.js'], + languageOptions: { + ecmaVersion: 2022, + sourceType: 'module', + globals: { + ...globals.browser, + }, + }, + }, + { + files: ['bench/**/*.{mjs,cjs}'], + languageOptions: { + ecmaVersion: 2022, + sourceType: 'module', + globals: { + ...globals.node, + }, + }, + }, ]; diff --git a/index.html b/index.html index d3e9846d..b46f63bf 100644 --- a/index.html +++ b/index.html @@ -23,9 +23,20 @@ + +
- - + + + diff --git a/package.json b/package.json index 8923e714..7630af64 100644 --- a/package.json +++ b/package.json @@ -11,12 +11,16 @@ "build": "vite build", "build:demo": "vite build --config vite.demo.config.mjs", "start": "vite", - "test:lint": "eslint src --ext .ts ", + "test:lint": "eslint 'src/**/*.ts' 'bench/**/*.{js,mjs,cjs}'", "test:types": "tsc", "test:unit": "vitest run", "test:watch": "vitest", "test:coverage": "vitest run --coverage", "test": "npm-run-all --continue-on-error test:lint test:types test:unit", + "bench": "node bench/run.mjs", + "bench:bundle": "yarn build && node bench/bundle-size.mjs", + "bench:lighthouse": "yarn build:demo && lhci autorun --config=bench/lighthouserc.cjs", + "bench:summary": "node bench/summarize.mjs", "clear-cdn-cache": "./scripts/clearCDNcaches.sh" }, "main": "dist/protvista-uniprot.js", @@ -50,6 +54,7 @@ }, "devDependencies": { "@eslint/js": "10.0.1", + "@lhci/cli": "0.15.1", "@originjs/vite-plugin-commonjs": "1.0.3", "@types/color-hash": "2.0.0", "@types/lodash-es": "4.17.12", diff --git a/yarn.lock b/yarn.lock index d64cadc0..600baa46 100644 --- a/yarn.lock +++ b/yarn.lock @@ -189,6 +189,47 @@ resolved "https://registry.yarnpkg.com/@exodus/bytes/-/bytes-1.15.0.tgz#54479e0f406cbad024d6fe1c3190ecca4468df3b" integrity sha512-UY0nlA+feH81UGSHv92sLEPLCeZFjXOuHhrIo0HQydScuQc8s0A7kL/UdgwgDq8g8ilksmuoF35YVTNphV2aBQ== +"@formatjs/ecma402-abstract@2.3.6": + version "2.3.6" + resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-2.3.6.tgz#d6ca9d3579054fe1e1a0a0b5e872e0d64922e4e1" + integrity sha512-HJnTFeRM2kVFVr5gr5kH1XP6K0JcJtE7Lzvtr3FS/so5f1kpsqqqxy5JF+FRaO6H2qmcMfAUIox7AJteieRtVw== + dependencies: + "@formatjs/fast-memoize" "2.2.7" + "@formatjs/intl-localematcher" "0.6.2" + decimal.js "^10.4.3" + tslib "^2.8.0" + +"@formatjs/fast-memoize@2.2.7": + version "2.2.7" + resolved "https://registry.yarnpkg.com/@formatjs/fast-memoize/-/fast-memoize-2.2.7.tgz#707f9ddaeb522a32f6715bb7950b0831f4cc7b15" + integrity sha512-Yabmi9nSvyOMrlSeGGWDiH7rf3a7sIwplbvo/dlz9WCIjzIQAfy1RMf4S0X3yG724n5Ghu2GmEl5NJIV6O9sZQ== + dependencies: + tslib "^2.8.0" + +"@formatjs/icu-messageformat-parser@2.11.4": + version "2.11.4" + resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.11.4.tgz#63bd2cd82d08ae2bef55adeeb86486df68826f32" + integrity sha512-7kR78cRrPNB4fjGFZg3Rmj5aah8rQj9KPzuLsmcSn4ipLXQvC04keycTI1F7kJYDwIXtT2+7IDEto842CfZBtw== + dependencies: + "@formatjs/ecma402-abstract" "2.3.6" + "@formatjs/icu-skeleton-parser" "1.8.16" + tslib "^2.8.0" + +"@formatjs/icu-skeleton-parser@1.8.16": + version "1.8.16" + resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.16.tgz#13f81f6845c7cf6599623006aacaf7d6b4ad2970" + integrity sha512-H13E9Xl+PxBd8D5/6TVUluSpxGNvFSlN/b3coUp0e0JpuWXXnQDiavIpY3NnvSp4xhEMoXyyBvVfdFX8jglOHQ== + dependencies: + "@formatjs/ecma402-abstract" "2.3.6" + tslib "^2.8.0" + +"@formatjs/intl-localematcher@0.6.2": + version "0.6.2" + resolved "https://registry.yarnpkg.com/@formatjs/intl-localematcher/-/intl-localematcher-0.6.2.tgz#e9ebe0b4082d7d48e5b2d753579fb7ece4eaefea" + integrity sha512-XOMO2Hupl0wdd172Y06h6kLpBz6Dv+J4okPLl4LPtzbr8f66WbIoy4ev98EBuZ6ZK4h5ydTN6XneT4QVpD7cdA== + dependencies: + tslib "^2.8.0" + "@gar/promisify@^1.1.3": version "1.1.3" resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" @@ -259,6 +300,38 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@lhci/cli@0.15.1": + version "0.15.1" + resolved "https://registry.yarnpkg.com/@lhci/cli/-/cli-0.15.1.tgz#38dcbb1af1e4e2d735726d47635a08a621ed0781" + integrity sha512-yhC0oXnXqGHYy1xl4D8YqaydMZ/khFAnXGY/o2m/J3PqPa/D0nj3V6TLoH02oVMFeEF2AQim7UbmdXMiXx2tOw== + dependencies: + "@lhci/utils" "0.15.1" + chrome-launcher "^0.13.4" + compression "^1.7.4" + debug "^4.3.1" + express "^4.17.1" + inquirer "^6.3.1" + isomorphic-fetch "^3.0.0" + lighthouse "12.6.1" + lighthouse-logger "1.2.0" + open "^7.1.0" + proxy-agent "^6.4.0" + tmp "^0.1.0" + uuid "^8.3.1" + yargs "^15.4.1" + yargs-parser "^13.1.2" + +"@lhci/utils@0.15.1": + version "0.15.1" + resolved "https://registry.yarnpkg.com/@lhci/utils/-/utils-0.15.1.tgz#75279392a787c9d9f8f1c179cf73db9a88ca93fd" + integrity sha512-WclJnUQJeOMY271JSuaOjCv/aA0pgvuHZS29NFNdIeI14id8eiFsjith85EGKYhljgoQhJ2SiW4PsVfFiakNNw== + dependencies: + debug "^4.3.1" + isomorphic-fetch "^3.0.0" + js-yaml "^3.13.1" + lighthouse "12.6.1" + tree-kill "^1.2.1" + "@lit-labs/ssr-dom-shim@^1.5.0": version "1.5.1" resolved "https://registry.yarnpkg.com/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.5.1.tgz#3166900c0d481f03d6d4133686e0febf760d521d" @@ -498,11 +571,32 @@ resolved "https://registry.yarnpkg.com/@oxc-project/types/-/types-0.126.0.tgz#9d9fa6fe9af5bc6c45996c6d9b9a3b3a4cd500e5" integrity sha512-oGfVtjAgwQVVpfBrbtk4e1XDyWHRFta6BS3GWVzrF8xYBT2VGQAk39yJS/wFSMrZqoiCU4oghT3Ch0HaHGIHcQ== +"@paulirish/trace_engine@0.0.53": + version "0.0.53" + resolved "https://registry.yarnpkg.com/@paulirish/trace_engine/-/trace_engine-0.0.53.tgz#2beab78c1e3157f99d696a9ddcde90101ee7a7a0" + integrity sha512-PUl/vlfo08Oj804VI5nDPeSk9vyslnBlVzDDwFt8SUVxY8+KdGMkra/vrXjEEHe8gb7+RqVTfOIlGw0nyrEelA== + dependencies: + legacy-javascript latest + third-party-web latest + "@pkgr/core@^0.2.9": version "0.2.9" resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.2.9.tgz#d229a7b7f9dac167a156992ef23c7f023653f53b" integrity sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA== +"@puppeteer/browsers@2.13.0": + version "2.13.0" + resolved "https://registry.yarnpkg.com/@puppeteer/browsers/-/browsers-2.13.0.tgz#10f980c6d65efeff77f8a3cac6e1a7ac10604500" + integrity sha512-46BZJYJjc/WwmKjsvDFykHtXrtomsCIrwYQPOP7VfMJoZY2bsDF9oROBABR3paDjDcmkUye1Pb1BqdcdiipaWA== + dependencies: + debug "^4.4.3" + extract-zip "^2.0.1" + progress "^2.0.3" + proxy-agent "^6.5.0" + semver "^7.7.4" + tar-fs "^3.1.1" + yargs "^17.7.2" + "@rolldown/binding-android-arm64@1.0.0-rc.16": version "1.0.0-rc.16" resolved "https://registry.yarnpkg.com/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.16.tgz#9af7872d363738e7a2aaa1c1be8cad57adf75798" @@ -655,6 +749,56 @@ resolved "https://registry.yarnpkg.com/@scarf/scarf/-/scarf-1.4.0.tgz#3bbb984085dbd6d982494538b523be1ce6562972" integrity sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ== +"@sentry-internal/tracing@7.120.4": + version "7.120.4" + resolved "https://registry.yarnpkg.com/@sentry-internal/tracing/-/tracing-7.120.4.tgz#4410e9cb4b6f8333111d97e8be7f01c7eaa008ca" + integrity sha512-Fz5+4XCg3akeoFK+K7g+d7HqGMjmnLoY2eJlpONJmaeT9pXY7yfUyXKZMmMajdE2LxxKJgQ2YKvSCaGVamTjHw== + dependencies: + "@sentry/core" "7.120.4" + "@sentry/types" "7.120.4" + "@sentry/utils" "7.120.4" + +"@sentry/core@7.120.4": + version "7.120.4" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.120.4.tgz#b90780621ed8f5a4826c827f0843dc86b3ba4cd4" + integrity sha512-TXu3Q5kKiq8db9OXGkWyXUbIxMMuttB5vJ031yolOl5T/B69JRyAoKuojLBjRv1XX583gS1rSSoX8YXX7ATFGA== + dependencies: + "@sentry/types" "7.120.4" + "@sentry/utils" "7.120.4" + +"@sentry/integrations@7.120.4": + version "7.120.4" + resolved "https://registry.yarnpkg.com/@sentry/integrations/-/integrations-7.120.4.tgz#bcd21b4981890282dfb38f58e07e6bbfd8954d5b" + integrity sha512-kkBTLk053XlhDCg7OkBQTIMF4puqFibeRO3E3YiVc4PGLnocXMaVpOSCkMqAc1k1kZ09UgGi8DxfQhnFEjUkpA== + dependencies: + "@sentry/core" "7.120.4" + "@sentry/types" "7.120.4" + "@sentry/utils" "7.120.4" + localforage "^1.8.1" + +"@sentry/node@^7.0.0": + version "7.120.4" + resolved "https://registry.yarnpkg.com/@sentry/node/-/node-7.120.4.tgz#a191f295eb180f7c028602b7a830811476290cc6" + integrity sha512-qq3wZAXXj2SRWhqErnGCSJKUhPSlZ+RGnCZjhfjHpP49KNpcd9YdPTIUsFMgeyjdh6Ew6aVCv23g1hTP0CHpYw== + dependencies: + "@sentry-internal/tracing" "7.120.4" + "@sentry/core" "7.120.4" + "@sentry/integrations" "7.120.4" + "@sentry/types" "7.120.4" + "@sentry/utils" "7.120.4" + +"@sentry/types@7.120.4": + version "7.120.4" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.120.4.tgz#8fab8dceeec4bda079fc6e8e380b982f766de354" + integrity sha512-cUq2hSSe6/qrU6oZsEP4InMI5VVdD86aypE+ENrQ6eZEVLTCYm1w6XhW1NvIu3UuWh7gZec4a9J7AFpYxki88Q== + +"@sentry/utils@7.120.4": + version "7.120.4" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.120.4.tgz#8995637fc4742ee75df347dcd0f08ee137968c78" + integrity sha512-zCKpyDIWKHwtervNK2ZlaK8mMV7gVUijAgFeJStH+CU/imcdquizV3pFLlSQYRswG+Lbyd6CT/LGRh3IbtkCFw== + dependencies: + "@sentry/types" "7.120.4" + "@standard-schema/spec@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@standard-schema/spec/-/spec-1.1.0.tgz#a79b55dbaf8604812f52d140b2c9ab41bc150bb8" @@ -665,6 +809,11 @@ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== +"@tootallnate/quickjs-emscripten@^0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz#db4ecfd499a9765ab24002c3b696d02e6d32a12c" + integrity sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA== + "@trysound/sax@0.2.0": version "0.2.0" resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" @@ -923,6 +1072,13 @@ resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.11.tgz#11af57b127e32487774841f7a4e54eab166d03c4" integrity sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA== +"@types/yauzl@^2.9.1": + version "2.10.3" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.3.tgz#e9b2808b4f109504a03cda958259876f61017999" + integrity sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q== + dependencies: + "@types/node" "*" + "@typescript-eslint/eslint-plugin@8.58.2": version "8.58.2" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.58.2.tgz#a6882a6a328e1259cff259fdb03184245ef06191" @@ -1197,6 +1353,11 @@ agent-base@6, agent-base@^6.0.2: dependencies: debug "4" +agent-base@^7.1.0, agent-base@^7.1.2: + version "7.1.4" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.4.tgz#e3cd76d4c548ee895d3c3fd8dc1f6c5b9032e7a8" + integrity sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ== + agentkeepalive@^4.2.1: version "4.6.0" resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.6.0.tgz#35f73e94b3f40bf65f105219c623ad19c136ea6a" @@ -1249,6 +1410,26 @@ alien-signals@^0.4.9: resolved "https://registry.yarnpkg.com/alien-signals/-/alien-signals-0.4.14.tgz#9ff8f72a272300a51692f54bd9bbbada78fbf539" integrity sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q== +ansi-colors@^4.1.1: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + +ansi-escapes@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + +ansi-regex@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" + integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== + +ansi-regex@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" + integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== + ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" @@ -1266,6 +1447,13 @@ ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" +ansi-styles@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + ansi-styles@^6.2.1: version "6.2.3" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.3.tgz#c044d5dcc521a076413472597a1acb1f103c4041" @@ -1292,18 +1480,18 @@ are-we-there-yet@^3.0.0: delegates "^1.0.0" readable-stream "^3.6.0" -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -argparse@~1.0.9: +argparse@^1.0.7, argparse@~1.0.9: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: sprintf-js "~1.0.2" +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz#384d12a37295aec3769ab022ad323a18a51ccf8b" @@ -1349,6 +1537,13 @@ assertion-error@^2.0.1: resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-2.0.1.tgz#f641a196b335690b1070bf00b6e7593fec190bf7" integrity sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA== +ast-types@^0.13.4: + version "0.13.4" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.4.tgz#ee0d77b343263965ecc3fb62da16e7222b2b6782" + integrity sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w== + dependencies: + tslib "^2.0.1" + ast-v8-to-istanbul@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ast-v8-to-istanbul/-/ast-v8-to-istanbul-1.0.0.tgz#d1e8bfc79fa9c452972ff91897633bda4e5e7577" @@ -1380,6 +1575,16 @@ available-typed-arrays@^1.0.7: dependencies: possible-typed-array-names "^1.0.0" +axe-core@^4.10.3: + version "4.11.3" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.11.3.tgz#d23cf404edaa5f97bdfd9afed6eea8405e5326e7" + integrity sha512-zBQouZixDTbo3jMGqHKyePxYxr1e5W8UdTmBQ7sNtaA9M2bE32daxxPLS/jojhKOHxQ7LWwPjfiwf/fhaJWzlg== + +b4a@^1.6.4: + version "1.8.0" + resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.8.0.tgz#1ca3ba0edc9469aaabef5647e769a83d50180b1a" + integrity sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg== + bail@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/bail/-/bail-2.0.2.tgz#d26f5cd8fe5d6f832a31517b9f7c356040ba6d5d" @@ -1395,11 +1600,59 @@ balanced-match@^4.0.2: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-4.0.4.tgz#bfb10662feed8196a2c62e7c68e17720c274179a" integrity sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA== +bare-events@^2.5.4, bare-events@^2.7.0: + version "2.8.2" + resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.8.2.tgz#7b3e10bd8e1fc80daf38bb516921678f566ab89f" + integrity sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ== + +bare-fs@^4.0.1, bare-fs@^4.5.5: + version "4.7.1" + resolved "https://registry.yarnpkg.com/bare-fs/-/bare-fs-4.7.1.tgz#6e81f784761102867c13f0823aa48c942d160f00" + integrity sha512-WDRsyVN52eAx/lBamKD6uyw8H4228h/x0sGGGegOamM2cd7Pag88GfMQalobXI+HaEUxpCkbKQUDOQqt9wawRw== + dependencies: + bare-events "^2.5.4" + bare-path "^3.0.0" + bare-stream "^2.6.4" + bare-url "^2.2.2" + fast-fifo "^1.3.2" + +bare-os@^3.0.1: + version "3.9.0" + resolved "https://registry.yarnpkg.com/bare-os/-/bare-os-3.9.0.tgz#59b1dd75c231067526f811c0e3d985257bd35747" + integrity sha512-JTjuZyNIDpw+GytMO4a6TK1VXdVKKJr6DRxEHasyuYyShV2deuiHJK/ahGZlebc+SG0/wJCB9XK8gprBGDFi/Q== + +bare-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bare-path/-/bare-path-3.0.0.tgz#b59d18130ba52a6af9276db3e96a2e3d3ea52178" + integrity sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw== + dependencies: + bare-os "^3.0.1" + +bare-stream@^2.6.4: + version "2.13.1" + resolved "https://registry.yarnpkg.com/bare-stream/-/bare-stream-2.13.1.tgz#acfd787a2983f5feb182ffe4c37ecc2c55b6ec85" + integrity sha512-Vp0cnjYyrEC4whYTymQ+YZi6pBpfiICZO3cfRG8sy67ZNWe951urv1x4eW1BKNngw3U+3fPYb5JQvHbCtxH7Ow== + dependencies: + streamx "^2.25.0" + teex "^1.0.1" + +bare-url@^2.2.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/bare-url/-/bare-url-2.4.2.tgz#1faab7d8f1780f6e51d5db03711dc390460874c0" + integrity sha512-/9a2j4ac6ckpmAHvod/ob7x439OAHst/drc2Clnq+reRYd/ovddwcF4LfoxHyNk5AuGBnPg+HqFjmE/Zpq6v0A== + dependencies: + bare-path "^3.0.0" + base64-js@^1.3.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== +basic-ftp@^5.0.2: + version "5.3.1" + resolved "https://registry.yarnpkg.com/basic-ftp/-/basic-ftp-5.3.1.tgz#3148ee9af43c0522514a4f973fecb1d3cbb6d71e" + integrity sha512-bopVNp6ugyA150DDuZfPFdt1KZ5a94ZDiwX4hMgZDzF+GttD80lEy8kj98kbyhLXnPvhtIo93mdnLIjpCAeeOw== + bidi-js@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/bidi-js/-/bidi-js-1.0.3.tgz#6f8bcf3c877c4d9220ddf49b9bb6930c88f877d2" @@ -1485,6 +1738,11 @@ braces@^3.0.3: dependencies: fill-range "^7.1.1" +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== + buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" @@ -1568,6 +1826,11 @@ camel-case@^4.1.2: pascal-case "^3.1.2" tslib "^2.0.3" +camelcase@^5.0.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + canvas@^2.11.2: version "2.11.2" resolved "https://registry.yarnpkg.com/canvas/-/canvas-2.11.2.tgz#553d87b1e0228c7ac0fc72887c3adbac4abbd860" @@ -1587,7 +1850,7 @@ chai@^6.2.2: resolved "https://registry.yarnpkg.com/chai/-/chai-6.2.2.tgz#ae41b52c9aca87734505362717f3255facda360e" integrity sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg== -chalk@^2.4.1: +chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -1616,6 +1879,11 @@ character-reference-invalid@^2.0.0: resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz#85c66b041e43b47210faf401278abf808ac45cb9" integrity sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw== +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + chownr@^1.1.1: version "1.1.4" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" @@ -1626,6 +1894,36 @@ chownr@^2.0.0: resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== +chrome-launcher@^0.13.4: + version "0.13.4" + resolved "https://registry.yarnpkg.com/chrome-launcher/-/chrome-launcher-0.13.4.tgz#4c7d81333c98282899c4e38256da23e00ed32f73" + integrity sha512-nnzXiDbGKjDSK6t2I+35OAPBy5Pw/39bgkb/ZAFwMhwJbdYBp6aH+vW28ZgtjdU890Q7D+3wN/tB8N66q5Gi2A== + dependencies: + "@types/node" "*" + escape-string-regexp "^1.0.5" + is-wsl "^2.2.0" + lighthouse-logger "^1.0.0" + mkdirp "^0.5.3" + rimraf "^3.0.2" + +chrome-launcher@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/chrome-launcher/-/chrome-launcher-1.2.1.tgz#a84877c123192bdadb40dc274b74caf164e98032" + integrity sha512-qmFR5PLMzHyuNJHwOloHPAHhbaNglkfeV/xDtt5b7xiFFyU1I+AZZX0PYseMuhenJSSirgxELYIbswcoc+5H4A== + dependencies: + "@types/node" "*" + escape-string-regexp "^4.0.0" + is-wsl "^2.2.0" + lighthouse-logger "^2.0.1" + +chromium-bidi@14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-14.0.0.tgz#15a12ab083ae519a49a724e94994ca0a9ced9c8e" + integrity sha512-9gYlLtS6tStdRWzrtXaTMnqcM4dudNegMXJxkR0I/CXObHalYeYcAMPrL19eroNZHtJ8DQmu1E+ZNOYu/IXMXw== + dependencies: + mitt "^3.0.1" + zod "^3.24.1" + clean-css@^5.2.2: version "5.3.3" resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.3.tgz#b330653cd3bd6b75009cc25c714cae7b93351ccd" @@ -1638,6 +1936,36 @@ clean-stack@^2.0.0: resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw== + dependencies: + restore-cursor "^2.0.0" + +cli-width@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" + integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== + +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + cliui@^9.0.1: version "9.0.1" resolved "https://registry.yarnpkg.com/cliui/-/cliui-9.0.1.tgz#6f7890f386f6f1f79953adc1f78dec46fcc2d291" @@ -1654,6 +1982,13 @@ color-convert@^1.9.0: dependencies: color-name "1.1.3" +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + color-hash@2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/color-hash/-/color-hash-2.0.2.tgz#abf735705da71874ddec7dcef50cd7479e7d64e9" @@ -1664,6 +1999,11 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + color-support@^1.1.2, color-support@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" @@ -1741,6 +2081,18 @@ confbox@^0.2.2: resolved "https://registry.yarnpkg.com/confbox/-/confbox-0.2.4.tgz#592e7be71f882a4a874e3c88f0ac1ef6f7da1ce5" integrity sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ== +configstore@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" + integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== + dependencies: + dot-prop "^5.2.0" + graceful-fs "^4.1.2" + make-dir "^3.0.0" + unique-string "^2.0.0" + write-file-atomic "^3.0.0" + xdg-basedir "^4.0.0" + connect-history-api-fallback@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" @@ -1816,6 +2168,16 @@ cross-spawn@^7.0.6: shebang-command "^2.0.0" which "^2.0.1" +crypto-random-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== + +csp_evaluator@1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/csp_evaluator/-/csp_evaluator-1.1.5.tgz#33788d695b7b539b17d5b6eba494431ce931faff" + integrity sha512-EL/iN9etCTzw/fBnp0/uj0f5BOOGvZut2mzsiiBZ/FdT6gFQCKRO/tmcKOxn5drWZ2Ndm/xBb1SI4zwWbGtmIw== + css-select@^4.2.1: version "4.3.0" resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" @@ -2154,6 +2516,11 @@ d3@7.9.0, d3@^7.9.0: d3-transition "3" d3-zoom "3" +data-uri-to-buffer@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz#8a58bb67384b261a38ef18bea1810cb01badd28b" + integrity sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw== + data-urls@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-7.0.0.tgz#6dce8b63226a1ecfdd907ce18a8ccfb1eee506d3" @@ -2194,21 +2561,26 @@ de-indent@^1.0.2: resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" integrity sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg== -debug@2.6.9: +debug@2.6.9, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@4, debug@^4.0.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.4.0, debug@^4.4.3: +debug@4, debug@^4.0.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.4.0, debug@^4.4.1, debug@^4.4.3: version "4.4.3" resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== dependencies: ms "^2.1.3" -decimal.js@^10.6.0: +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== + +decimal.js@^10.4.3, decimal.js@^10.6.0: version "10.6.0" resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.6.0.tgz#e649a43e3ab953a72192ff5983865e509f37ed9a" integrity sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg== @@ -2266,6 +2638,11 @@ define-data-property@^1.0.1, define-data-property@^1.1.4: es-errors "^1.3.0" gopd "^1.0.1" +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + define-lazy-prop@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f" @@ -2280,6 +2657,15 @@ define-properties@^1.2.1: has-property-descriptors "^1.0.0" object-keys "^1.1.1" +degenerator@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-5.0.1.tgz#9403bf297c6dad9a1ece409b37db27954f91f2f5" + integrity sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ== + dependencies: + ast-types "^0.13.4" + escodegen "^2.1.0" + esprima "^4.0.1" + delaunator@5: version "5.1.0" resolved "https://registry.yarnpkg.com/delaunator/-/delaunator-5.1.0.tgz#d13271fbf3aff6753f9ea6e235557f20901046ea" @@ -2324,6 +2710,16 @@ devlop@^1.0.0, devlop@^1.1.0: dependencies: dequal "^2.0.0" +devtools-protocol@0.0.1467305: + version "0.0.1467305" + resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1467305.tgz#dd3f03ceca5b9ecde8bfa96d2fe0b7102e77953e" + integrity sha512-LxwMLqBoPPGpMdRL4NkLFRNy3QLp6Uqa7GNp1v6JaBheop2QrB9Q7q0A/q/CYYP9sBfZdHOyszVx4gc9zyk7ow== + +devtools-protocol@0.0.1595872: + version "0.0.1595872" + resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1595872.tgz#6f3f537a8518887d30d5181e41788f697f2a4ab2" + integrity sha512-kRfgp8vWVjBu/fbYCiVFiOqsCk3CrMKEo3WbgGT2NXK2dG7vawWPBljixajVgGK9II8rDO9G0oD0zLt3I1daRg== + diff@~8.0.2: version "8.0.4" resolved "https://registry.yarnpkg.com/diff/-/diff-8.0.4.tgz#4f5baf3188b9b2431117b962eb20ba330fadf696" @@ -2392,6 +2788,13 @@ dot-case@^3.0.4: no-case "^3.0.4" tslib "^2.0.3" +dot-prop@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== + dependencies: + is-obj "^2.0.0" + dotenv-expand@5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" @@ -2467,6 +2870,14 @@ end-of-stream@^1.1.0, end-of-stream@^1.4.1: dependencies: once "^1.4.0" +enquirer@^2.3.6: + version "2.4.1" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" + integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== + dependencies: + ansi-colors "^4.1.1" + strip-ansi "^6.0.1" + entities@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" @@ -2757,6 +3168,17 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +escodegen@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionalDependencies: + source-map "~0.6.1" + eslint-config-prettier@10.1.8: version "10.1.8" resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz#15734ce4af8c2778cc32f0b01b37b0b5cd1ecb97" @@ -2840,6 +3262,11 @@ espree@^11.2.0: acorn-jsx "^5.3.2" eslint-visitor-keys "^5.0.1" +esprima@^4.0.0, esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + esquery@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.7.0.tgz#08d048f261f0ddedb5bae95f46809463d9c9496d" @@ -2886,6 +3313,13 @@ etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== +events-universal@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/events-universal/-/events-universal-1.0.1.tgz#b56a84fd611b6610e0a2d0f09f80fdf931e2dfe6" + integrity sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw== + dependencies: + bare-events "^2.7.0" + expand-template@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" @@ -2901,7 +3335,7 @@ exponential-backoff@^3.1.1: resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.3.tgz#51cf92c1c0493c766053f9d3abee4434c244d2f6" integrity sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA== -express@^4.18.2: +express@^4.17.1, express@^4.18.2: version "4.22.1" resolved "https://registry.yarnpkg.com/express/-/express-4.22.1.tgz#1de23a09745a4fffdb39247b344bb5eaff382069" integrity sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g== @@ -2948,6 +3382,26 @@ extend@^3.0.0: resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +extract-zip@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" + integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== + dependencies: + debug "^4.1.1" + get-stream "^5.1.0" + yauzl "^2.10.0" + optionalDependencies: + "@types/yauzl" "^2.9.1" + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -2958,6 +3412,11 @@ fast-diff@^1.1.2: resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== +fast-fifo@^1.2.0, fast-fifo@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" + integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== + fast-glob@^3.2.11: version "3.3.3" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" @@ -2991,11 +3450,25 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== + dependencies: + pend "~1.2.0" + fdir@^6.5.0: version "6.5.0" resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350" integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA== + dependencies: + escape-string-regexp "^1.0.5" + file-entry-cache@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" @@ -3035,6 +3508,14 @@ finalhandler@~1.3.1: statuses "~2.0.2" unpipe "~1.0.0" +find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + find-up@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" @@ -3180,7 +3661,7 @@ generator-function@^2.0.0: resolved "https://registry.yarnpkg.com/generator-function/-/generator-function-2.0.1.tgz#0e75dd410d1243687a0ba2e951b94eedb8f737a2" integrity sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g== -get-caller-file@^2.0.5: +get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== @@ -3214,6 +3695,13 @@ get-proto@^1.0.1: dunder-proto "^1.0.1" es-object-atoms "^1.0.0" +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + get-symbol-description@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.1.0.tgz#7bdd54e0befe8ffc9f3b4e203220d9f1e881b6ee" @@ -3223,6 +3711,15 @@ get-symbol-description@^1.1.0: es-errors "^1.3.0" get-intrinsic "^1.2.6" +get-uri@^6.0.1: + version "6.0.5" + resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-6.0.5.tgz#714892aa4a871db671abc5395e5e9447bc306a16" + integrity sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg== + dependencies: + basic-ftp "^5.0.2" + data-uri-to-buffer "^6.0.2" + debug "^4.3.4" + github-from-package@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" @@ -3461,6 +3958,11 @@ http-errors@~2.0.0, http-errors@~2.0.1: statuses "~2.0.2" toidentifier "~1.0.1" +http-link-header@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/http-link-header/-/http-link-header-1.1.3.tgz#b367b7a0ad1cf14027953f31aa1df40bb433da2a" + integrity sha512-3cZ0SRL8fb9MUlU3mKM61FcQvPfXx2dBrZW3Vbg5CXa8jFlK8OaEpePenLe1oEXQduhz8b0QjsqfS59QP4AJDQ== + http-proxy-agent@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" @@ -3470,6 +3972,14 @@ http-proxy-agent@^5.0.0: agent-base "6" debug "4" +http-proxy-agent@^7.0.0, http-proxy-agent@^7.0.1: + version "7.0.2" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e" + integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== + dependencies: + agent-base "^7.1.0" + debug "^4.3.4" + https-proxy-agent@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" @@ -3478,6 +3988,14 @@ https-proxy-agent@^5.0.0: agent-base "6" debug "4" +https-proxy-agent@^7.0.6: + version "7.0.6" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz#da8dfeac7da130b05c2ba4b59c9b6cd66611a6b9" + integrity sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw== + dependencies: + agent-base "^7.1.2" + debug "4" + humanize-ms@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" @@ -3492,7 +4010,7 @@ iconv-lite@0.6, iconv-lite@^0.6.2: dependencies: safer-buffer ">= 2.1.2 < 3.0.0" -iconv-lite@~0.4.24: +iconv-lite@^0.4.24, iconv-lite@~0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -3514,6 +4032,16 @@ ignore@^7.0.5: resolved "https://registry.yarnpkg.com/ignore/-/ignore-7.0.5.tgz#4cb5f6cd7d4c7ab0365738c7aea888baa6d7efd9" integrity sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg== +image-ssim@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/image-ssim/-/image-ssim-0.2.0.tgz#83b42c7a2e6e4b85505477fe6917f5dbc56420e5" + integrity sha512-W7+sO6/yhxy83L0G7xR8YAc5Z5QFtYEXXRV6EaE8tuYBZJnA3gVgp3q7X7muhLZVodeb9UfvjSbwt9VJwjIYAg== + +immediate@~3.0.5: + version "3.0.6" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" + integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== + immer@^9.0.21: version "9.0.21" resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.21.tgz#1e025ea31a40f24fb064f1fef23e931496330176" @@ -3567,6 +4095,25 @@ inline-style-parser@0.2.7: resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.2.7.tgz#b1fc68bfc0313b8685745e4464e37f9376b9c909" integrity sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA== +inquirer@^6.3.1: + version "6.5.2" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" + integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== + dependencies: + ansi-escapes "^3.2.0" + chalk "^2.4.2" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^2.0.0" + lodash "^4.17.12" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^6.4.0" + string-width "^2.1.0" + strip-ansi "^5.1.0" + through "^2.3.6" + internal-slot@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.1.0.tgz#1eac91762947d2f7056bc838d93e13b2e9604961" @@ -3581,6 +4128,16 @@ internal-slot@^1.1.0: resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009" integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg== +intl-messageformat@^10.5.3: + version "10.7.18" + resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-10.7.18.tgz#51a6f387afbca9b0f881b2ec081566db8c540b0d" + integrity sha512-m3Ofv/X/tV8Y3tHXLohcuVuhWKo7BBq62cqY15etqmLxg2DZ34AGGgQDeR+SCta2+zICb1NX83af0GJmbQ1++g== + dependencies: + "@formatjs/ecma402-abstract" "2.3.6" + "@formatjs/fast-memoize" "2.2.7" + "@formatjs/icu-messageformat-parser" "2.11.4" + tslib "^2.8.0" + io-ts@^2.2.21: version "2.2.22" resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-2.2.22.tgz#5ab0d3636fe8494a275f0266461ab019da4b8d0b" @@ -3591,6 +4148,11 @@ ip-address@^10.0.1: resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-10.1.0.tgz#d8dcffb34d0e02eb241427444a6e23f5b0595aa4" integrity sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q== +ip-address@^10.1.1: + version "10.1.1" + resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-10.1.1.tgz#a7614252413e3751b841aaffba939090d2c4c37b" + integrity sha512-1FMu8/N15Ck1BL551Jf42NYIoin2unWjLQ2Fze/DXryJRl5twqtwNHlO39qERGbIOcKYWHdgRryhOC+NG4eaLw== + ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" @@ -3683,6 +4245,11 @@ is-decimal@^2.0.0: resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-2.0.1.tgz#9469d2dc190d0214fd87d78b78caecc0cc14eef7" integrity sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A== +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + is-docker@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" @@ -3700,6 +4267,11 @@ is-finalizationregistry@^1.1.0: dependencies: call-bound "^1.0.3" +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== + is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" @@ -3768,6 +4340,11 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + is-plain-obj@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" @@ -3824,6 +4401,11 @@ is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15: dependencies: which-typed-array "^1.1.16" +is-typedarray@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + is-weakmap@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" @@ -3844,6 +4426,13 @@ is-weakset@^2.0.3: call-bound "^1.0.3" get-intrinsic "^1.2.6" +is-wsl@^2.1.1, is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + is-wsl@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-3.1.1.tgz#327897b26832a3eb117da6c27492d04ca132594f" @@ -3866,6 +4455,14 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== +isomorphic-fetch@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz#0267b005049046d2421207215d45d6a262b8b8b4" + integrity sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA== + dependencies: + node-fetch "^2.6.1" + whatwg-fetch "^3.4.1" + istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" @@ -3902,16 +4499,29 @@ jju@~1.4.0: resolved "https://registry.yarnpkg.com/jju/-/jju-1.4.0.tgz#a3abe2718af241a2b2904f84a625970f389ae32a" integrity sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA== -jpeg-js@^0.4.4: +jpeg-js@^0.4.1, jpeg-js@^0.4.4: version "0.4.4" resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.4.4.tgz#a9f1c6f1f9f0fa80cdb3484ed9635054d28936aa" integrity sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg== +js-library-detector@^6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/js-library-detector/-/js-library-detector-6.7.0.tgz#5075c71fcf835b71133bca13363b91509a39235a" + integrity sha512-c80Qupofp43y4cJ7+8TTDN/AsDwLi5oOm/plBrWI+iQt485vKXCco+yVmOwEgdo9VOdsYTuV0UlTeetVPTriXA== + js-tokens@^10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-10.0.0.tgz#dffe7599b4a8bb7fe30aff8d0235234dffb79831" integrity sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q== +js-yaml@^3.13.1: + version "3.14.2" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.2.tgz#77485ce1dd7f33c061fd1b16ecea23b55fcb04b0" + integrity sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + jsdom@29.0.2: version "29.0.2" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-29.0.2.tgz#1fc2cf4175da8de29fa94bea7ca931a194729fc3" @@ -3992,6 +4602,11 @@ kolorist@^1.8.0: resolved "https://registry.yarnpkg.com/kolorist/-/kolorist-1.8.0.tgz#edddbbbc7894bc13302cdf740af6374d4a04743c" integrity sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ== +legacy-javascript@latest: + version "0.0.1" + resolved "https://registry.yarnpkg.com/legacy-javascript/-/legacy-javascript-0.0.1.tgz#6bf2ac6b70b4555d9e4bfe9e4fc81675fede88cf" + integrity sha512-lPyntS4/aS7jpuvOlitZDFifBCb4W8L/3QU0PLbUTUj+zYah8rfVjYic88yG7ZKTxhS5h9iz7duT8oUXKszLhg== + levn@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" @@ -4000,6 +4615,76 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" +lie@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lie/-/lie-3.1.1.tgz#9a436b2cc7746ca59de7a41fa469b3efb76bd87e" + integrity sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw== + dependencies: + immediate "~3.0.5" + +lighthouse-logger@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/lighthouse-logger/-/lighthouse-logger-1.2.0.tgz#b76d56935e9c137e86a04741f6bb9b2776e886ca" + integrity sha512-wzUvdIeJZhRsG6gpZfmSCfysaxNEr43i+QT+Hie94wvHDKFLi4n7C2GqZ4sTC+PH5b5iktmXJvU87rWvhP3lHw== + dependencies: + debug "^2.6.8" + marky "^1.2.0" + +lighthouse-logger@^1.0.0: + version "1.4.2" + resolved "https://registry.yarnpkg.com/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz#aef90f9e97cd81db367c7634292ee22079280aaa" + integrity sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g== + dependencies: + debug "^2.6.9" + marky "^1.2.2" + +lighthouse-logger@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lighthouse-logger/-/lighthouse-logger-2.0.2.tgz#c0b39daee22035ce28551f3503c5935d0b5e1bf3" + integrity sha512-vWl2+u5jgOQuZR55Z1WM0XDdrJT6mzMP8zHUct7xTlWhuQs+eV0g+QL0RQdFjT54zVmbhLCP8vIVpy1wGn/gCg== + dependencies: + debug "^4.4.1" + marky "^1.2.2" + +lighthouse-stack-packs@1.12.2: + version "1.12.2" + resolved "https://registry.yarnpkg.com/lighthouse-stack-packs/-/lighthouse-stack-packs-1.12.2.tgz#dbe0ccdbc381784ef176f4f8c2367ac5b077d6ca" + integrity sha512-Ug8feS/A+92TMTCK6yHYLwaFMuelK/hAKRMdldYkMNwv+d9PtWxjXEg6rwKtsUXTADajhdrhXyuNCJ5/sfmPFw== + +lighthouse@12.6.1: + version "12.6.1" + resolved "https://registry.yarnpkg.com/lighthouse/-/lighthouse-12.6.1.tgz#ba4ab83c82336c17a0d91fe24d7abf31891b361a" + integrity sha512-85WDkjcXAVdlFem9Y6SSxqoKiz/89UsDZhLpeLJIsJ4LlHxw047XTZhlFJmjYCB7K5S1erSBAf5cYLcfyNbH3A== + dependencies: + "@paulirish/trace_engine" "0.0.53" + "@sentry/node" "^7.0.0" + axe-core "^4.10.3" + chrome-launcher "^1.2.0" + configstore "^5.0.1" + csp_evaluator "1.1.5" + devtools-protocol "0.0.1467305" + enquirer "^2.3.6" + http-link-header "^1.1.1" + intl-messageformat "^10.5.3" + jpeg-js "^0.4.4" + js-library-detector "^6.7.0" + lighthouse-logger "^2.0.1" + lighthouse-stack-packs "1.12.2" + lodash-es "^4.17.21" + lookup-closest-locale "6.2.0" + metaviewport-parser "0.3.0" + open "^8.4.0" + parse-cache-control "1.0.1" + puppeteer-core "^24.10.0" + robots-parser "^3.0.1" + semver "^5.3.0" + speedline-core "^1.4.3" + third-party-web "^0.26.6" + tldts-icann "^6.1.16" + ws "^7.0.0" + yargs "^17.3.1" + yargs-parser "^21.0.0" + lightningcss-android-arm64@1.32.0: version "1.32.0" resolved "https://registry.yarnpkg.com/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz#f033885116dfefd9c6f54787523e3514b61e1968" @@ -4136,6 +4821,20 @@ local-pkg@^1.0.0: pkg-types "^2.3.0" quansync "^0.2.11" +localforage@^1.8.1: + version "1.10.0" + resolved "https://registry.yarnpkg.com/localforage/-/localforage-1.10.0.tgz#5c465dc5f62b2807c3a84c0c6a1b1b3212781dd4" + integrity sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg== + dependencies: + lie "3.1.1" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + locate-path@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" @@ -4153,12 +4852,12 @@ lodash-es@4.17.15: resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.15.tgz#21bd96839354412f23d7a10340e5eac6ee455d78" integrity sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ== -lodash-es@4.18.1: +lodash-es@4.18.1, lodash-es@^4.17.21: version "4.18.1" resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.18.1.tgz#b962eeb80d9d983a900bf342961fb7418ca10b1d" integrity sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A== -lodash@^4.17.21: +lodash@^4.17.12, lodash@^4.17.21: version "4.18.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.18.1.tgz#ff2b66c1f6326d59513de2407bf881439812771c" integrity sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q== @@ -4168,6 +4867,11 @@ longest-streak@^3.0.0: resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.1.0.tgz#62fa67cd958742a1574af9f39866364102d90cd4" integrity sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g== +lookup-closest-locale@6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/lookup-closest-locale/-/lookup-closest-locale-6.2.0.tgz#57f665e604fd26f77142d48152015402b607bcf3" + integrity sha512-/c2kL+Vnp1jnV6K6RpDTHK3dgg0Tu2VVp+elEiJpjfS1UyY7AjOYHohRug6wT0OpoX2qFgNORndE9RqesfVxWQ== + lower-case@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" @@ -4180,7 +4884,7 @@ lru-cache@^11.2.7: resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.3.5.tgz#29047d348c0b2793e3112a01c739bb7c6d855637" integrity sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw== -lru-cache@^7.7.1: +lru-cache@^7.14.1, lru-cache@^7.7.1: version "7.18.3" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== @@ -4201,7 +4905,7 @@ magicast@^0.5.2: "@babel/types" "^7.29.0" source-map-js "^1.2.1" -make-dir@^3.1.0: +make-dir@^3.0.0, make-dir@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== @@ -4237,6 +4941,11 @@ make-fetch-happen@^10.0.3: socks-proxy-agent "^7.0.0" ssri "^9.0.0" +marky@^1.2.0, marky@^1.2.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/marky/-/marky-1.3.0.tgz#422b63b0baf65022f02eda61a238eccdbbc14997" + integrity sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ== + math-intrinsics@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" @@ -4382,6 +5091,11 @@ merge2@^1.3.0: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== +metaviewport-parser@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/metaviewport-parser/-/metaviewport-parser-0.3.0.tgz#6af1e99b5eaf250c049e0af1e84143a39750dea6" + integrity sha512-EoYJ8xfjQ6kpe9VbVHvZTZHiOl4HL1Z18CrZ+qahvLXT7ZO4YTC2JMyt5FaUp9JJp6J4Ybb/z7IsCXZt86/QkQ== + methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" @@ -4611,6 +5325,11 @@ mime@1.6.0: resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + mimic-response@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.1.0.tgz#d13763d35f613d09ec37ebb30bac0469c0ee8f43" @@ -4656,7 +5375,7 @@ minimatch@^9.0.3: dependencies: brace-expansion "^2.0.2" -minimist@^1.2.0, minimist@^1.2.3: +minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.6: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== @@ -4720,11 +5439,23 @@ minizlib@^2.1.1, minizlib@^2.1.2: minipass "^3.0.0" yallist "^4.0.0" +mitt@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/mitt/-/mitt-3.0.1.tgz#ea36cf0cc30403601ae074c8f77b7092cdab36d1" + integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw== + mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: version "0.5.3" resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== +mkdirp@^0.5.3: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + mkdirp@^1.0.3, mkdirp@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" @@ -4789,6 +5520,11 @@ muggle-string@^0.4.1: resolved "https://registry.yarnpkg.com/muggle-string/-/muggle-string-0.4.1.tgz#3b366bd43b32f809dc20659534dd30e7c8a0d328" integrity sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ== +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + integrity sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ== + nan@^2.17.0: version "2.26.2" resolved "https://registry.yarnpkg.com/nan/-/nan-2.26.2.tgz#2e5e25764224c737b9897790b57c3294d4dcee9c" @@ -4819,6 +5555,11 @@ negotiator@^0.6.3, negotiator@~0.6.4: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.4.tgz#777948e2452651c570b712dd01c23e262713fff7" integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== +netmask@^2.0.2: + version "2.1.1" + resolved "https://registry.yarnpkg.com/netmask/-/netmask-2.1.1.tgz#80043d265b53aa521b3bd01e8fcdf353f9e1e81e" + integrity sha512-eonl3sLUha+S1GzTPxychyhnUzKyeQkZ7jLjKrBagJgPla13F+uQ71HgpFefyHgqrjEbCPkDArxYsjY8/+gLKA== + nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" @@ -4839,7 +5580,7 @@ node-abi@^3.26.0, node-abi@^3.3.0: dependencies: semver "^7.3.5" -node-fetch@^2.6.7, node-fetch@^2.7.0: +node-fetch@^2.6.1, node-fetch@^2.6.7, node-fetch@^2.7.0: version "2.7.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== @@ -5001,6 +5742,13 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ== + dependencies: + mimic-fn "^1.0.0" + open@^11.0.0: version "11.0.0" resolved "https://registry.yarnpkg.com/open/-/open-11.0.0.tgz#897e6132f994d3554cbcf72e0df98f176a7e5f62" @@ -5013,6 +5761,23 @@ open@^11.0.0: powershell-utils "^0.1.0" wsl-utils "^0.3.0" +open@^7.1.0: + version "7.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" + integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== + dependencies: + is-docker "^2.0.0" + is-wsl "^2.1.1" + +open@^8.4.0: + version "8.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" + integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + optionator@^0.9.3: version "0.9.4" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" @@ -5025,6 +5790,11 @@ optionator@^0.9.3: type-check "^0.4.0" word-wrap "^1.2.5" +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== + own-keys@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/own-keys/-/own-keys-1.0.1.tgz#e4006910a2bf913585289676eebd6f390cf51358" @@ -5034,6 +5804,13 @@ own-keys@^1.0.1: object-keys "^1.1.1" safe-push-apply "^1.0.0" +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + p-limit@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" @@ -5041,6 +5818,13 @@ p-limit@^3.0.2: dependencies: yocto-queue "^0.1.0" +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + p-locate@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" @@ -5055,6 +5839,33 @@ p-map@^4.0.0: dependencies: aggregate-error "^3.0.0" +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +pac-proxy-agent@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz#9cfaf33ff25da36f6147a20844230ec92c06e5df" + integrity sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA== + dependencies: + "@tootallnate/quickjs-emscripten" "^0.23.0" + agent-base "^7.1.2" + debug "^4.3.4" + get-uri "^6.0.1" + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.6" + pac-resolver "^7.0.1" + socks-proxy-agent "^8.0.5" + +pac-resolver@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-7.0.1.tgz#54675558ea368b64d210fd9c92a640b5f3b8abb6" + integrity sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg== + dependencies: + degenerator "^5.0.0" + netmask "^2.0.2" + param-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" @@ -5063,6 +5874,11 @@ param-case@^3.0.4: dot-case "^3.0.4" tslib "^2.0.3" +parse-cache-control@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-cache-control/-/parse-cache-control-1.0.1.tgz#8eeab3e54fa56920fe16ba38f77fa21aacc2d74e" + integrity sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg== + parse-entities@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-4.0.2.tgz#61d46f5ed28e4ee62e9ddc43d6b010188443f159" @@ -5156,6 +5972,11 @@ pathe@^2.0.1, pathe@^2.0.3: resolved "https://registry.yarnpkg.com/pathe/-/pathe-2.0.3.tgz#3ecbec55421685b70a9da872b2cff3e1cbed1716" integrity sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w== +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== + picocolors@^1.0.0, picocolors@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" @@ -5253,6 +6074,11 @@ prettier-linter-helpers@^1.0.1: dependencies: fast-diff "^1.1.2" +progress@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + promise-inflight@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" @@ -5279,6 +6105,25 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" +proxy-agent@^6.4.0, proxy-agent@^6.5.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-6.5.0.tgz#9e49acba8e4ee234aacb539f89ed9c23d02f232d" + integrity sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A== + dependencies: + agent-base "^7.1.2" + debug "^4.3.4" + http-proxy-agent "^7.0.1" + https-proxy-agent "^7.0.6" + lru-cache "^7.14.1" + pac-proxy-agent "^7.1.0" + proxy-from-env "^1.1.0" + socks-proxy-agent "^8.0.5" + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + pump@^3.0.0: version "3.0.4" resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.4.tgz#1f313430527fa8b905622ebd22fe1444e757ab3c" @@ -5292,6 +6137,19 @@ punycode@^2.1.0, punycode@^2.3.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== +puppeteer-core@^24.10.0: + version "24.42.0" + resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-24.42.0.tgz#85c1f6c73e6225be0d50fc6a4f2914690280e8cf" + integrity sha512-T4zXokk/izH01fYPhyyev1A4piWiOKrYq7CUFpdoYQxmOnXoV6YjUabmfIjCYkNspSoAXIxRid3Tw+Vg0fthYg== + dependencies: + "@puppeteer/browsers" "2.13.0" + chromium-bidi "14.0.0" + debug "^4.4.3" + devtools-protocol "0.0.1595872" + typed-query-selector "^2.12.1" + webdriver-bidi-protocol "0.4.1" + ws "^8.19.0" + qs@~6.14.0: version "6.14.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.14.2.tgz#b5634cf9d9ad9898e31fba3504e866e8efb6798c" @@ -5431,11 +6289,21 @@ remark-rehype@^11.0.0: unified "^11.0.0" vfile "^6.0.0" +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + require-from-string@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + resolve@^1.10.0, resolve@~1.22.1, resolve@~1.22.2: version "1.22.12" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.12.tgz#f5b2a680897c69c238a13cd16b15671f8b73549f" @@ -5446,6 +6314,14 @@ resolve@^1.10.0, resolve@~1.22.1, resolve@~1.22.2: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q== + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + retry@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" @@ -5456,6 +6332,13 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.1.0.tgz#0fe13b9522e1473f51b558ee796e08f11f9b489f" integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== +rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" @@ -5463,6 +6346,11 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" +robots-parser@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/robots-parser/-/robots-parser-3.0.1.tgz#3d8a3cdfa8ac240cbb062a4bd16fcc0e0fb9ed23" + integrity sha512-s+pyvQeIKIZ0dx5iJiQk1tPLJAWln39+MI5jtM8wnyws+G5azk+dMnMX0qfbqNetKKNgcWWOdi0sfm+FbQbgdQ== + robust-predicates@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/robust-predicates/-/robust-predicates-3.0.3.tgz#1099061b3349e2c5abec6c2ab0acd440d24d4062" @@ -5507,6 +6395,11 @@ run-applescript@^7.0.0: resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-7.1.0.tgz#2e9e54c4664ec3106c5b5630e249d3d6595c4911" integrity sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q== +run-async@^2.2.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -5519,6 +6412,13 @@ rw@1: resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" integrity sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ== +rxjs@^6.4.0: + version "6.6.7" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" + integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== + dependencies: + tslib "^1.9.0" + rxjs@^7.8.1: version "7.8.2" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.2.tgz#955bc473ed8af11a002a2be52071bf475638607b" @@ -5571,7 +6471,7 @@ saxes@^6.0.0: dependencies: xmlchars "^2.2.0" -"semver@2 || 3 || 4 || 5", semver@^5.5.0: +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0: version "5.7.2" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== @@ -5581,7 +6481,7 @@ semver@^6.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.5, semver@^7.5.3, semver@^7.7.3, semver@~7.7.4: +semver@^7.3.5, semver@^7.5.3, semver@^7.7.3, semver@^7.7.4, semver@~7.7.4: version "7.7.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.4.tgz#28464e36060e991fa7a11d0279d2d3f3b57a7e8a" integrity sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA== @@ -5730,7 +6630,7 @@ siginfo@^2.0.0: resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== -signal-exit@^3.0.0, signal-exit@^3.0.7: +signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.7: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== @@ -5777,6 +6677,15 @@ socks-proxy-agent@^7.0.0: debug "^4.3.3" socks "^2.6.2" +socks-proxy-agent@^8.0.5: + version "8.0.5" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz#b9cdb4e7e998509d7659d689ce7697ac21645bee" + integrity sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw== + dependencies: + agent-base "^7.1.2" + debug "^4.3.4" + socks "^2.8.3" + socks@^2.6.2: version "2.8.7" resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.7.tgz#e2fb1d9a603add75050a2067db8c381a0b5669ea" @@ -5785,6 +6694,14 @@ socks@^2.6.2: ip-address "^10.0.1" smart-buffer "^4.2.0" +socks@^2.8.3: + version "2.8.8" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.8.tgz#23bef6d02748eac847ad75610deb6c472554c67a" + integrity sha512-NlGELfPrgX2f1TAAcz0WawlLn+0r3FyhhCRpFFK2CemXenPYvzMWWZINv3eDNo9ucdwme7oCHRY0Jnbs4aIkog== + dependencies: + ip-address "^10.1.1" + smart-buffer "^4.2.0" + source-map-js@^1.0.1, source-map-js@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" @@ -5839,6 +6756,15 @@ spdx-license-ids@^3.0.0: resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz#b069e687b1291a32f126893ed76a27a745ee2133" integrity sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw== +speedline-core@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/speedline-core/-/speedline-core-1.4.3.tgz#4d6e7276e2063c2d36a375cb25a523ac73475319" + integrity sha512-DI7/OuAUD+GMpR6dmu8lliO2Wg5zfeh+/xsdyJZCzd8o5JgFUjCeLsBDuZjIQJdwXS3J0L/uZYrELKYqx+PXog== + dependencies: + "@types/node" "*" + image-ssim "^0.2.0" + jpeg-js "^0.4.1" + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -5874,12 +6800,21 @@ stop-iteration-iterator@^1.1.0: es-errors "^1.3.0" internal-slot "^1.1.0" +streamx@^2.12.5, streamx@^2.15.0, streamx@^2.25.0: + version "2.25.0" + resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.25.0.tgz#cc967e99390fda8b918b1eeaf3bc437637c8c7af" + integrity sha512-0nQuG6jf1w+wddNEEXCF4nTg3LtufWINB5eFEN+5TNZW7KWJp6x87+JFL43vaAUPyCfH1wID+mNVyW6OHtFamg== + dependencies: + events-universal "^1.0.0" + fast-fifo "^1.3.2" + text-decoder "^1.1.0" + string-argv@~0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== -"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.2.3: +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -5888,6 +6823,14 @@ string-argv@~0.3.1: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" +string-width@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + string-width@^7.0.0, string-width@^7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-7.2.0.tgz#b5bb8e2165ce275d4d43476dd2700ad9091db6dc" @@ -5959,7 +6902,21 @@ stringify-entities@^4.0.0: character-entities-html4 "^2.0.0" character-entities-legacy "^3.0.0" -strip-ansi@^6.0.1: +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -6074,6 +7031,17 @@ tar-fs@^2.0.0: pump "^3.0.0" tar-stream "^2.1.4" +tar-fs@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-3.1.2.tgz#114b012f54796f31e62f3e57792820a80b83ae6e" + integrity sha512-QGxxTxxyleAdyM3kpFs14ymbYmNFrfY+pHj7Z8FgtbZ7w2//VAgLMac7sT6nRpIHjppXO2AwwEOg0bPFVRcmXw== + dependencies: + pump "^3.0.0" + tar-stream "^3.1.5" + optionalDependencies: + bare-fs "^4.0.1" + bare-path "^3.0.0" + tar-stream@^2.1.4: version "2.2.0" resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" @@ -6085,6 +7053,16 @@ tar-stream@^2.1.4: inherits "^2.0.3" readable-stream "^3.1.1" +tar-stream@^3.1.5: + version "3.1.8" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-3.1.8.tgz#a26f5b26c34dfd4936a4f8a9e694a8f5102af13d" + integrity sha512-U6QpVRyCGHva435KoNWy9PRoi2IFYCgtEhq9nmrPPpbRacPs9IH4aJ3gbrFC8dPcXvdSZ4XXfXT5Fshbp2MtlQ== + dependencies: + b4a "^1.6.4" + bare-fs "^4.5.5" + fast-fifo "^1.2.0" + streamx "^2.15.0" + tar@^6.1.11, tar@^6.1.2: version "6.2.1" resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" @@ -6097,6 +7075,13 @@ tar@^6.1.11, tar@^6.1.2: mkdirp "^1.0.3" yallist "^4.0.0" +teex@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/teex/-/teex-1.0.1.tgz#b8fa7245ef8e8effa8078281946c85ab780a0b12" + integrity sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg== + dependencies: + streamx "^2.12.5" + terser@^5.10.0: version "5.46.1" resolved "https://registry.yarnpkg.com/terser/-/terser-5.46.1.tgz#40e4b1e35d5f13130f82793a8b3eeb7ec3a92eee" @@ -6107,6 +7092,23 @@ terser@^5.10.0: commander "^2.20.0" source-map-support "~0.5.20" +text-decoder@^1.1.0: + version "1.2.7" + resolved "https://registry.yarnpkg.com/text-decoder/-/text-decoder-1.2.7.tgz#5d073a9a74b9c0a9d28dfadcab96b604af57d8ba" + integrity sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ== + dependencies: + b4a "^1.6.4" + +third-party-web@^0.26.6: + version "0.26.7" + resolved "https://registry.yarnpkg.com/third-party-web/-/third-party-web-0.26.7.tgz#3a6eabed3833698c262cb14966277db8311cf51f" + integrity sha512-buUzX4sXC4efFX6xg2bw6/eZsCUh8qQwSavC4D9HpONMFlRbcHhD8Je5qwYdCpViR6q0qla2wPP+t91a2vgolg== + +third-party-web@latest: + version "0.29.0" + resolved "https://registry.yarnpkg.com/third-party-web/-/third-party-web-0.29.0.tgz#28a6fd616510032f519018959cce828cd93fdfe2" + integrity sha512-nBDSJw5B7Sl1YfsATG2XkW5qgUPODbJhXw++BKygi9w6O/NKS98/uY/nR/DxDq2axEjL6halHW1v+jhm/j1DBQ== + through2@^0.6.3: version "0.6.5" resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" @@ -6115,6 +7117,11 @@ through2@^0.6.3: readable-stream ">=1.0.33-1 <1.1.0-0" xtend ">=4.0.0 <4.1.0-0" +through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + timing-functions@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/timing-functions/-/timing-functions-2.0.1.tgz#84145da4f68de95051ea96b57b9d9d76383d7140" @@ -6143,11 +7150,23 @@ tinyrainbow@^3.1.0: resolved "https://registry.yarnpkg.com/tinyrainbow/-/tinyrainbow-3.1.0.tgz#1d8a623893f95cf0a2ddb9e5d11150e191409421" integrity sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw== +tldts-core@^6.1.86: + version "6.1.86" + resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-6.1.86.tgz#a93e6ed9d505cb54c542ce43feb14c73913265d8" + integrity sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA== + tldts-core@^7.0.28: version "7.0.28" resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-7.0.28.tgz#28c256edae2ed177b2a8338a51caf81d41580ecf" integrity sha512-7W5Efjhsc3chVdFhqtaU0KtK32J37Zcr9RKtID54nG+tIpcY79CQK/veYPODxtD/LJ4Lue66jvrQzIX2Z2/pUQ== +tldts-icann@^6.1.16: + version "6.1.86" + resolved "https://registry.yarnpkg.com/tldts-icann/-/tldts-icann-6.1.86.tgz#7ac14d54bcc134ccf78f63d9b505cbadd24ee52b" + integrity sha512-NFxmRT2lAEMcCOBgeZ0NuM0zsK/xgmNajnY6n4S1mwAKocft2s2ise1O3nQxrH3c+uY6hgHUV9GGNVp7tUE4Sg== + dependencies: + tldts-core "^6.1.86" + tldts@^7.0.5: version "7.0.28" resolved "https://registry.yarnpkg.com/tldts/-/tldts-7.0.28.tgz#5a5bb26ef3f70008d88c6e53ff58cd59ed8d4c68" @@ -6155,6 +7174,20 @@ tldts@^7.0.5: dependencies: tldts-core "^7.0.28" +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +tmp@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.1.0.tgz#ee434a4e22543082e294ba6201dcc6eafefa2877" + integrity sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw== + dependencies: + rimraf "^2.6.3" + to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -6186,6 +7219,11 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== +tree-kill@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + trim-lines@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" @@ -6201,7 +7239,12 @@ ts-api-utils@^2.5.0: resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.5.0.tgz#4acd4a155e22734990a5ed1fe9e97f113bcb37c1" integrity sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA== -tslib@^2.0.3, tslib@^2.1.0, tslib@^2.4.0, tslib@^2.6.2: +tslib@^1.9.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.4.0, tslib@^2.6.2, tslib@^2.8.0: version "2.8.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== @@ -6273,6 +7316,18 @@ typed-array-length@^1.0.7: possible-typed-array-names "^1.0.0" reflect.getprototypeof "^1.0.6" +typed-query-selector@^2.12.1: + version "2.12.2" + resolved "https://registry.yarnpkg.com/typed-query-selector/-/typed-query-selector-2.12.2.tgz#65e2462ac6b0aecfae1bfac1a4f3027070dbabaa" + integrity sha512-EOPFbyIub4ngnEdqi2yOcNeDLaX/0jcE1JoAXQDDMIthap7FoN795lc/SHfIq2d416VufXpM8z/lD+WRm2gfOQ== + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + typescript-eslint@8.58.2: version "8.58.2" resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.58.2.tgz#55f425fc668c2d5148f45587f2cd04532d715c6a" @@ -6345,6 +7400,13 @@ unique-slug@^3.0.0: dependencies: imurmurhash "^0.1.4" +unique-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== + dependencies: + crypto-random-string "^2.0.0" + unist-util-is@^6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-6.0.1.tgz#d0a3f86f2dd0db7acd7d8c2478080b5c67f9c6a9" @@ -6428,6 +7490,11 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== +uuid@^8.3.1: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + validate-npm-package-license@^3.0.1: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" @@ -6556,6 +7623,11 @@ w3c-xmlserializer@^5.0.0: dependencies: xml-name-validator "^5.0.0" +webdriver-bidi-protocol@0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.4.1.tgz#d411e7b8e158408d83bb166b0b4f1054fa3f077e" + integrity sha512-ARrjNjtWRRs2w4Tk7nqrf2gBI0QXWuOmMCx2hU+1jUt6d00MjMxURrhxhGbrsoiZKJrhTSTzbIrc554iKI10qw== + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" @@ -6566,6 +7638,11 @@ webidl-conversions@^8.0.1: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-8.0.1.tgz#0657e571fe6f06fcb15ca50ed1fdbcb495cd1686" integrity sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ== +whatwg-fetch@^3.4.1: + version "3.6.20" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz#580ce6d791facec91d37c72890995a0b48d31c70" + integrity sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg== + whatwg-mimetype@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz#d8232895dbd527ceaee74efd4162008fb8a8cf48" @@ -6628,6 +7705,11 @@ which-collection@^1.0.2: is-weakmap "^2.0.2" is-weakset "^2.0.3" +which-module@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" + integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== + which-typed-array@^1.1.16, which-typed-array@^1.1.19: version "1.1.20" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.20.tgz#3fdb7adfafe0ea69157b1509f3a1cd892bd1d122" @@ -6675,6 +7757,24 @@ word-wrap@^1.2.5: resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^9.0.0: version "9.0.2" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-9.0.2.tgz#956832dea9494306e6d209eb871643bb873d7c98" @@ -6689,6 +7789,26 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + +ws@^7.0.0: + version "7.5.10" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" + integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== + +ws@^8.19.0: + version "8.20.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.20.0.tgz#4cd9532358eba60bc863aad1623dfb045a4d4af8" + integrity sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA== + wsl-utils@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/wsl-utils/-/wsl-utils-0.3.1.tgz#9479836ddf03be267aad3abfc3cb1f6e0c9f1ed1" @@ -6697,6 +7817,11 @@ wsl-utils@^0.3.0: is-wsl "^3.1.0" powershell-utils "^0.1.0" +xdg-basedir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" + integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== + xhr2@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/xhr2/-/xhr2-0.2.1.tgz#4e73adc4f9cfec9cbd2157f73efdce3a5f108a93" @@ -6717,6 +7842,11 @@ xmlchars@^2.2.0: resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== +y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== + y18n@^5.0.5: version "5.0.8" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" @@ -6727,11 +7857,62 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== +yargs-parser@^13.1.2: + version "13.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^18.1.2: + version "18.1.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^21.0.0, yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + yargs-parser@^22.0.0: version "22.0.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-22.0.0.tgz#87b82094051b0567717346ecd00fd14804b357c8" integrity sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw== +yargs@^15.4.1: + version "15.4.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== + dependencies: + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^18.1.2" + +yargs@^17.3.1, yargs@^17.7.2: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + yargs@^18.0.0: version "18.0.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-18.0.0.tgz#6c84259806273a746b09f579087b68a3c2d25bd1" @@ -6744,11 +7925,24 @@ yargs@^18.0.0: y18n "^5.0.5" yargs-parser "^22.0.0" +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== +zod@^3.24.1: + version "3.25.76" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.25.76.tgz#26841c3f6fd22a6a2760e7ccb719179768471e34" + integrity sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ== + zwitch@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7" From 89ddf8ca576236b7a2981369bb316525d26834b1 Mon Sep 17 00:00:00 2001 From: Daniel Rice Date: Tue, 28 Apr 2026 17:43:20 +0100 Subject: [PATCH 02/11] Add benchmark note to top README. --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 5c127b3d..60d835d1 100644 --- a/README.md +++ b/README.md @@ -124,6 +124,12 @@ Captured 2026-04-20 via `yarn test:coverage` (v8 instrumentation, 29 tests acros | Functions | 13.19% | | Lines | 9.66% | +## Performance benchmarks + +A `bench/` workflow captures repeatable performance baselines for the demo across three layers: library bundle size, Lighthouse CI against a fixed set of UniProt scenarios, and DOM-observed custom milestones (`fetch-and-parse`, `render`, `total`). Run `yarn bench` to produce `bench/results/summary.md`. Reference snapshots live under `bench/baselines/` and are committed; per-run output is gitignored. + +See [`bench/README.md`](./bench/README.md) for scenarios, capture procedure, and methodology notes. + ## Configuration You can pass your own configuration to the component using the `config` attribute/property. From 58d44a031184b57c8c60f962624bbb57006c15f1 Mon Sep 17 00:00:00 2001 From: Daniel Rice Date: Tue, 28 Apr 2026 17:55:40 +0100 Subject: [PATCH 03/11] Benchmarks: baseline at 89ddf8c --- bench/baselines/bundle-size-89ddf8c.json | 16 ++++++++++++++ bench/baselines/summary-89ddf8c.md | 27 ++++++++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 bench/baselines/bundle-size-89ddf8c.json create mode 100644 bench/baselines/summary-89ddf8c.md diff --git a/bench/baselines/bundle-size-89ddf8c.json b/bench/baselines/bundle-size-89ddf8c.json new file mode 100644 index 00000000..51e62e5c --- /dev/null +++ b/bench/baselines/bundle-size-89ddf8c.json @@ -0,0 +1,16 @@ +{ + "commit": "4bab442f036a3820321c7b591fef433291f77928", + "shortSha": "4bab442", + "capturedAt": "2026-04-28T16:32:00.007Z", + "files": [ + { + "file": "protvista-uniprot.mjs", + "raw": 4654875, + "gzip": 1162704 + } + ], + "total": { + "raw": 4654875, + "gzip": 1162704 + } +} \ No newline at end of file diff --git a/bench/baselines/summary-89ddf8c.md b/bench/baselines/summary-89ddf8c.md new file mode 100644 index 00000000..7e08eaeb --- /dev/null +++ b/bench/baselines/summary-89ddf8c.md @@ -0,0 +1,27 @@ +# Bench results + +Captured: 2026-04-28T16:35:44.483Z + +## Bundle size (library, `dist/`) + +Commit: `4bab442` + +| Total raw | Total gzip | Files | +|---|---|---| +| 4545.8 KB | 1135.5 KB | 1 | + +## Lighthouse (median of N runs) + +| Scenario | Perf | LCP | TBT | CLS | Speed Index | +|---|---|---|---|---|---| +| `accession=P05067&bench=1` | 70 | 5.4 s | 50 ms | 0 | 1.9 s | +| `accession=P38398&bench=1` | 47 | 46.7 s | 350 ms | 0 | 4.0 s | +| `accession=A0A2K5ULD0&bench=1` | 82 | 2.2 s | 70 ms | 0 | 1.9 s | + +### Custom milestones (median run) + +| Scenario | fetch-and-parse | render | total | +|---|---|---|---| +| `accession=P05067&bench=1` | 1471 ms | 322 ms | 1794 ms | +| `accession=P38398&bench=1` | 4759 ms | 293 ms | 5052 ms | +| `accession=A0A2K5ULD0&bench=1` | 1390 ms | 276 ms | 1666 ms | From 4c80b07038e4bb04fabda8ae9ab8608d11c77414 Mon Sep 17 00:00:00 2001 From: Daniel Rice Date: Tue, 28 Apr 2026 17:55:46 +0100 Subject: [PATCH 04/11] Tweak README. --- bench/README.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/bench/README.md b/bench/README.md index e10e9374..3f1c3d31 100644 --- a/bench/README.md +++ b/bench/README.md @@ -1,6 +1,4 @@ -# Performance bench - -Repeatable performance measurement for protvista-uniprot. +# Performance benchmarks 1. **Library bundle size** — raw + gzipped bytes from `yarn build`'s `dist/` output. Catches accidental dependency bloat in shippable code. 2. **Lighthouse CI** — runs the demo (`yarn build:demo`, served by `vite preview`) against a fixed list of UniProt accessions. Captures LCP, TBT, CLS, Speed Index, and the overall Performance score. @@ -38,7 +36,7 @@ Lighthouse numbers are sensitive to machine state. To make a snapshot worth comm - Run on a quiet machine, plugged in, no other heavy apps. - Same Chrome version on every run (LHCI uses the system Chrome). -- 3 runs per URL by default; LHCI picks the representative (median) run. +- 5 runs per URL by default; LHCI picks the representative (median) run. To pin a snapshot to a known commit: @@ -48,7 +46,7 @@ SHA=$(git rev-parse --short HEAD) cp bench/results/summary.md bench/baselines/summary-${SHA}.md cp bench/results/bundle-size.json bench/baselines/bundle-size-${SHA}.json git add bench/baselines/summary-${SHA}.md bench/baselines/bundle-size-${SHA}.json -git commit -m "bench: baseline at ${SHA}" +git commit -m "Benchmarks: baseline at ${SHA}" ``` To capture a baseline against an **older** commit (e.g., `main` immediately before a merge), use a worktree so your working checkout stays untouched: From 6f5c099a5dd1976485bc753aa3ecab3adf603887 Mon Sep 17 00:00:00 2001 From: Daniel Rice Date: Tue, 28 Apr 2026 19:18:45 +0100 Subject: [PATCH 05/11] Tweak report markdown. Generate fresh bench report. --- bench/baselines/bundle-size-4c80b07.json | 16 +++ bench/baselines/summary-4c80b07.md | 28 +++++ bench/baselines/summary-89ddf8c.md | 27 ---- bench/summarize.mjs | 154 ++++++++++++++++------- 4 files changed, 155 insertions(+), 70 deletions(-) create mode 100644 bench/baselines/bundle-size-4c80b07.json create mode 100644 bench/baselines/summary-4c80b07.md delete mode 100644 bench/baselines/summary-89ddf8c.md diff --git a/bench/baselines/bundle-size-4c80b07.json b/bench/baselines/bundle-size-4c80b07.json new file mode 100644 index 00000000..44b76108 --- /dev/null +++ b/bench/baselines/bundle-size-4c80b07.json @@ -0,0 +1,16 @@ +{ + "commit": "4c80b07038e4bb04fabda8ae9ab8608d11c77414", + "shortSha": "4c80b07", + "capturedAt": "2026-04-28T18:11:29.285Z", + "files": [ + { + "file": "protvista-uniprot.mjs", + "raw": 4654875, + "gzip": 1162704 + } + ], + "total": { + "raw": 4654875, + "gzip": 1162704 + } +} \ No newline at end of file diff --git a/bench/baselines/summary-4c80b07.md b/bench/baselines/summary-4c80b07.md new file mode 100644 index 00000000..ea03ffaa --- /dev/null +++ b/bench/baselines/summary-4c80b07.md @@ -0,0 +1,28 @@ +# Bench results + +Captured: 2026-04-28T18:15:26.550Z +Commit: `4c80b07` + +Numeric cells show `median (min–max)`. + +## Lighthouse (5 runs) + +| Scenario | Perf | LCP | TBT | CLS | Speed Index | +| ------------------------------ | ---------- | ------------------ | ---------------- | ---------------- | --------------- | +| `accession=P05067&bench=1` | 69 (68–70) | 5.5 s (5.4–5.6) | 44 ms (35–53) | 0.00 (0.00–0.00) | 2.2 s (2.0–2.4) | +| `accession=P38398&bench=1` | 48 (46–52) | 46.7 s (46.1–47.0) | 341 ms (308–389) | 0.00 (0.00–0.00) | 4.0 s (2.5–4.5) | +| `accession=A0A2K5ULD0&bench=1` | 80 (76–82) | 2.3 s (2.2–2.7) | 33 ms (23–116) | 0.00 (0.00–0.00) | 2.1 s (2.0–2.4) | + +### Custom milestones (5 runs) + +| Scenario | fetch-and-parse | render | total | +| ------------------------------ | --------------- | ---------------- | --------------- | +| `accession=P05067&bench=1` | 2.1 s (1.5–2.4) | 326 ms (317–335) | 2.5 s (1.9–2.7) | +| `accession=P38398&bench=1` | 4.9 s (4.2–6.6) | 292 ms (291–305) | 5.2 s (4.4–6.9) | +| `accession=A0A2K5ULD0&bench=1` | 1.6 s (1.5–2.1) | 274 ms (273–278) | 1.9 s (1.8–2.4) | + +## Bundle size (library, `dist/`) + +| Total raw | Total gzip | Files | +| --------- | ---------- | ----- | +| 4545.8 KB | 1135.5 KB | 1 | diff --git a/bench/baselines/summary-89ddf8c.md b/bench/baselines/summary-89ddf8c.md deleted file mode 100644 index 7e08eaeb..00000000 --- a/bench/baselines/summary-89ddf8c.md +++ /dev/null @@ -1,27 +0,0 @@ -# Bench results - -Captured: 2026-04-28T16:35:44.483Z - -## Bundle size (library, `dist/`) - -Commit: `4bab442` - -| Total raw | Total gzip | Files | -|---|---|---| -| 4545.8 KB | 1135.5 KB | 1 | - -## Lighthouse (median of N runs) - -| Scenario | Perf | LCP | TBT | CLS | Speed Index | -|---|---|---|---|---|---| -| `accession=P05067&bench=1` | 70 | 5.4 s | 50 ms | 0 | 1.9 s | -| `accession=P38398&bench=1` | 47 | 46.7 s | 350 ms | 0 | 4.0 s | -| `accession=A0A2K5ULD0&bench=1` | 82 | 2.2 s | 70 ms | 0 | 1.9 s | - -### Custom milestones (median run) - -| Scenario | fetch-and-parse | render | total | -|---|---|---|---| -| `accession=P05067&bench=1` | 1471 ms | 322 ms | 1794 ms | -| `accession=P38398&bench=1` | 4759 ms | 293 ms | 5052 ms | -| `accession=A0A2K5ULD0&bench=1` | 1390 ms | 276 ms | 1666 ms | diff --git a/bench/summarize.mjs b/bench/summarize.mjs index ba7751b3..641f6f0f 100644 --- a/bench/summarize.mjs +++ b/bench/summarize.mjs @@ -6,12 +6,14 @@ * - bench/results/bundle-size.json (from bench:bundle) * - bench/results/lighthouse/manifest.json + report JSONs (from bench:lighthouse) * - * For Lighthouse we use LHCI's own "representative run" — it's the median - * of numberOfRuns by performance score, which smooths out single-run noise. + * Each numeric cell shows `median (min–max)` across all N runs LHCI did, + * so a wide range is a hint that the median for that scenario is less + * trustworthy and may need re-running on a quieter machine. */ import { readFileSync, writeFileSync, existsSync } from 'node:fs'; import { join } from 'node:path'; import { fileURLToPath } from 'node:url'; +import { execSync } from 'node:child_process'; const root = join(fileURLToPath(import.meta.url), '..', '..'); const resultsDir = join(root, 'bench/results'); @@ -20,87 +22,153 @@ const lhDir = join(resultsDir, 'lighthouse'); const lines = []; const kb = (b) => (b / 1024).toFixed(1) + ' KB'; +// Tag the snapshot with the commit when available — `bench/baselines/` +// files in particular need this to be traceable back to a specific tree. +const shortSha = (() => { + try { + return execSync('git rev-parse --short HEAD', { + cwd: root, + stdio: ['ignore', 'pipe', 'ignore'], + }) + .toString() + .trim(); + } catch { + return null; + } +})(); + lines.push('# Bench results'); lines.push(''); lines.push(`Captured: ${new Date().toISOString()}`); +if (shortSha) lines.push(`Commit: \`${shortSha}\``); +lines.push(''); +lines.push('Numeric cells show `median (min–max)`.'); lines.push(''); -const bundlePath = join(resultsDir, 'bundle-size.json'); -if (existsSync(bundlePath)) { - const bundle = JSON.parse(readFileSync(bundlePath, 'utf8')); - lines.push('## Bundle size (library, `dist/`)'); - lines.push(''); - lines.push(`Commit: \`${bundle.shortSha}\``); - lines.push(''); - lines.push('| Total raw | Total gzip | Files |'); - lines.push('|---|---|---|'); - lines.push( - `| ${kb(bundle.total.raw)} | ${kb(bundle.total.gzip)} | ${bundle.files.length} |` +// Reduce a numeric series to {min, median, max}. Returns nulls when +// there are no numeric samples (e.g., a metric was missing in every run). +const stats = (values) => { + const cleaned = values.filter( + (v) => typeof v === 'number' && !Number.isNaN(v) ); - lines.push(''); -} + if (cleaned.length === 0) return { min: null, median: null, max: null }; + const sorted = [...cleaned].sort((a, b) => a - b); + return { + min: sorted[0], + max: sorted[sorted.length - 1], + median: sorted[Math.floor(sorted.length / 2)], + }; +}; + +// Format a {min, median, max} cell. Unit is picked once from the median +// so all three numbers share it — keeps cells visually balanced. +const cellMs = (s) => { + if (s.median == null) return '—'; + const useS = s.median >= 1000; + const f = (n) => (useS ? (n / 1000).toFixed(1) : n.toFixed(0)); + const unit = useS ? 's' : 'ms'; + return `${f(s.median)} ${unit} (${f(s.min)}–${f(s.max)})`; +}; +const cellInt = (s) => + s.median == null + ? '—' + : `${s.median.toFixed(0)} (${s.min.toFixed(0)}–${s.max.toFixed(0)})`; +const cellFixed = (s, n) => + s.median == null + ? '—' + : `${s.median.toFixed(n)} (${s.min.toFixed(n)}–${s.max.toFixed(n)})`; const manifestPath = join(lhDir, 'manifest.json'); if (existsSync(manifestPath)) { const manifest = JSON.parse(readFileSync(manifestPath, 'utf8')); - // LHCI marks one run per URL as `isRepresentativeRun: true` (the median). - const representatives = manifest.filter((r) => r.isRepresentativeRun); - // Hydrate each representative report once and cache; we read it twice - // (Lighthouse metrics + custom timings). - const rows = representatives.map((run) => { - const report = JSON.parse(readFileSync(run.jsonPath, 'utf8')); - const url = new URL(run.url); + // Group every run by URL — we need all of them, not just the + // representative, to compute the range. + const byUrl = new Map(); + for (const run of manifest) { + if (!byUrl.has(run.url)) byUrl.set(run.url, []); + byUrl.get(run.url).push(JSON.parse(readFileSync(run.jsonPath, 'utf8'))); + } + + const rows = [...byUrl].map(([url, reports]) => { + const u = new URL(url); return { - scenario: url.search.replace(/^\?/, '') || url.pathname, - report, + scenario: u.search.replace(/^\?/, '') || u.pathname, + reports, }; }); - lines.push('## Lighthouse (median of N runs)'); + const numRuns = rows[0]?.reports.length ?? 0; + lines.push(`## Lighthouse (${numRuns} runs)`); lines.push(''); lines.push('| Scenario | Perf | LCP | TBT | CLS | Speed Index |'); lines.push('|---|---|---|---|---|---|'); - for (const { scenario, report } of rows) { - const a = report.audits; - const score = (report.categories.performance.score * 100).toFixed(0); + for (const { scenario, reports } of rows) { + const score = stats( + reports.map((r) => r.categories.performance.score * 100) + ); + const lcp = stats( + reports.map((r) => r.audits['largest-contentful-paint'].numericValue) + ); + const tbt = stats( + reports.map((r) => r.audits['total-blocking-time'].numericValue) + ); + const cls = stats( + reports.map((r) => r.audits['cumulative-layout-shift'].numericValue) + ); + const si = stats( + reports.map((r) => r.audits['speed-index'].numericValue) + ); lines.push( - `| \`${scenario}\` | ${score} | ${a['largest-contentful-paint'].displayValue} | ` + - `${a['total-blocking-time'].displayValue} | ${a['cumulative-layout-shift'].displayValue} | ` + - `${a['speed-index'].displayValue} |` + `| \`${scenario}\` | ${cellInt(score)} | ${cellMs(lcp)} | ${cellMs(tbt)} | ${cellFixed(cls, 2)} | ${cellMs(si)} |` ); } lines.push(''); // Custom milestones — emitted by bench/instrument.js, captured by - // Lighthouse's user-timings audit. Only renders if at least one row - // has timings (e.g., URL didn't include &bench=1). + // Lighthouse's user-timings audit. const protvistaTimings = (report) => (report.audits['user-timings']?.details?.items ?? []).filter( (it) => it.timingType === 'Measure' && it.name?.startsWith('protvista:') ); - const anyTimings = rows.some( - ({ report }) => protvistaTimings(report).length > 0 + const durations = (reports, name) => + reports.map( + (r) => protvistaTimings(r).find((t) => t.name === name)?.duration + ); + + const anyTimings = rows.some(({ reports }) => + reports.some((r) => protvistaTimings(r).length > 0) ); if (anyTimings) { - const fmt = (ms) => (ms == null ? '—' : `${ms.toFixed(0)} ms`); - const pick = (items, name) => - items.find((it) => it.name === name)?.duration; - lines.push('### Custom milestones (median run)'); + lines.push(`### Custom milestones (${numRuns} runs)`); lines.push(''); lines.push('| Scenario | fetch-and-parse | render | total |'); lines.push('|---|---|---|---|'); - for (const { scenario, report } of rows) { - const items = protvistaTimings(report); + for (const { scenario, reports } of rows) { + const fp = stats(durations(reports, 'protvista:fetch-and-parse')); + const rd = stats(durations(reports, 'protvista:render')); + const tt = stats(durations(reports, 'protvista:total')); lines.push( - `| \`${scenario}\` | ${fmt(pick(items, 'protvista:fetch-and-parse'))} | ` + - `${fmt(pick(items, 'protvista:render'))} | ${fmt(pick(items, 'protvista:total'))} |` + `| \`${scenario}\` | ${cellMs(fp)} | ${cellMs(rd)} | ${cellMs(tt)} |` ); } lines.push(''); } } +const bundlePath = join(resultsDir, 'bundle-size.json'); +if (existsSync(bundlePath)) { + const bundle = JSON.parse(readFileSync(bundlePath, 'utf8')); + lines.push('## Bundle size (library, `dist/`)'); + lines.push(''); + lines.push('| Total raw | Total gzip | Files |'); + lines.push('|---|---|---|'); + lines.push( + `| ${kb(bundle.total.raw)} | ${kb(bundle.total.gzip)} | ${bundle.files.length} |` + ); + lines.push(''); +} + const out = join(resultsDir, 'summary.md'); writeFileSync(out, lines.join('\n')); console.log(`summary: ${out}`); From b94a9402bcbf10a87649e32dead3e5bb0c4e8c78 Mon Sep 17 00:00:00 2001 From: Daniel Rice Date: Wed, 29 Apr 2026 13:12:56 +0100 Subject: [PATCH 06/11] Remove old baseline. --- bench/baselines/bundle-size-89ddf8c.json | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 bench/baselines/bundle-size-89ddf8c.json diff --git a/bench/baselines/bundle-size-89ddf8c.json b/bench/baselines/bundle-size-89ddf8c.json deleted file mode 100644 index 51e62e5c..00000000 --- a/bench/baselines/bundle-size-89ddf8c.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "commit": "4bab442f036a3820321c7b591fef433291f77928", - "shortSha": "4bab442", - "capturedAt": "2026-04-28T16:32:00.007Z", - "files": [ - { - "file": "protvista-uniprot.mjs", - "raw": 4654875, - "gzip": 1162704 - } - ], - "total": { - "raw": 4654875, - "gzip": 1162704 - } -} \ No newline at end of file From 0523050e693327d1b7406b8589f72d612bcc276c Mon Sep 17 00:00:00 2001 From: Daniel Rice Date: Wed, 29 Apr 2026 13:44:44 +0100 Subject: [PATCH 07/11] Emit performance marks at the component's three lifecycle transitions so bench baselines survive refactors. --- bench/README.md | 13 ++-- bench/instrument.js | 140 --------------------------------------- bench/lighthouserc.cjs | 11 +-- eslint.config.mjs | 13 +--- index.html | 4 -- package.json | 2 +- src/filter-config.ts | 2 +- src/protvista-uniprot.ts | 78 +++++++++++++++++----- 8 files changed, 81 insertions(+), 182 deletions(-) delete mode 100644 bench/instrument.js diff --git a/bench/README.md b/bench/README.md index 3f1c3d31..7f9b6e06 100644 --- a/bench/README.md +++ b/bench/README.md @@ -2,11 +2,15 @@ 1. **Library bundle size** — raw + gzipped bytes from `yarn build`'s `dist/` output. Catches accidental dependency bloat in shippable code. 2. **Lighthouse CI** — runs the demo (`yarn build:demo`, served by `vite preview`) against a fixed list of UniProt accessions. Captures LCP, TBT, CLS, Speed Index, and the overall Performance score. -3. **Custom milestones** — `bench/instrument.js` observes the host's DOM to mark `script-start`, `data-loaded` (loader removed), `first-render` (manager inserted), and `tracks-settled` (no subtree mutations for 250 ms — same quiescence pattern Playwright's `networkidle` uses). Lighthouse's user-timings audit captures these automatically, so they appear next to the headline metrics in `summary.md`. +3. **Custom milestones** — `` emits three `performance.mark()` calls at lifecycle transitions (`script-start` in `connectedCallback`, `data-loaded` after fetch resolves, `first-render` after Lit commits the manager to the DOM) plus three `performance.measure()` calls between them. Lighthouse's user-timings audit captures these automatically, so they appear next to the headline metrics in `summary.md`. -`fetch-and-parse` (script-start → data-loaded) and `render` (data-loaded → tracks-settled) are the per-stage breakdowns; `total` is the end-to-end. The `render` measure includes a constant ~250 ms quiescence gap, which cancels out in before/after comparisons. +`fetch-and-parse` (script-start → data-loaded), `render` (data-loaded → first-render), and `total` (script-start → first-render) are the durations surfaced in the report. -The custom layer is purely external: it only loads when the URL has `?bench=1`, observes the rendered DOM, and adds **zero changes to `src/`**. If you need finer-grained timings (e.g., per-track or per-adapter cost) later, add `performance.mark()` calls inside `src/` — but the milestones above usually suffice for spotting regressions in a refactor. +## Stability contract + +The four mark/measure names — `protvista:script-start`, `protvista:data-loaded`, `protvista:first-render`, plus the three measures derived from them — are part of the component's public observable surface. **Renaming them, moving them to a different lifecycle point, or removing them is a breaking change for performance comparison.** A refactor that changes the conceptual meaning of any mark must update the corresponding baseline. + +The marks fire unconditionally (every demo run, every consumer page) — they're cheap (~150 bytes shipped, no work when nobody is observing) and useful for any consumer that wants to profile. ## Run @@ -75,8 +79,9 @@ Scenarios are defined in `bench/lighthouserc.cjs` under `ci.collect.url`. Each q | ------------------ | ----------------------------------------------------- | | `lighthouserc.cjs` | LHCI config: scenarios, run count, throttling preset | | `bundle-size.mjs` | Walks `dist/`, writes raw + gzip sizes per file | -| `instrument.js` | Browser-side marks; loaded only on `?bench=1` | | `summarize.mjs` | Reads results, writes `summary.md` | | `run.mjs` | One-shot driver (`yarn bench`) | | `baselines/` | Committed snapshots — reference points for comparison | | `results/` | Gitignored — output of the latest run | + +The custom marks themselves live in `src/protvista-uniprot.ts`, not in this directory. diff --git a/bench/instrument.js b/bench/instrument.js deleted file mode 100644 index 7231db6e..00000000 --- a/bench/instrument.js +++ /dev/null @@ -1,140 +0,0 @@ -/** - * External instrumentation for protvista-uniprot. - * - * Always loaded by the demo build, but no-ops unless the URL has - * `?bench=1`. Emits `performance.mark` / `performance.measure` calls - * based on the component's existing public surface — no `src/` changes. - * - * Lighthouse's user-timings audit picks these up automatically, so they - * show up in `summary.md` next to LCP/TBT/etc. - * - * Marks: - * protvista:script-start when this script runs (≈ navigation start) - * protvista:data-loaded loader removed (data fetched + parsed) - * protvista:first-render nightingale-manager appears under the host - * protvista:tracks-settled no host-subtree mutations for QUIESCENCE_MS - * (proxy for "tracks finished painting") - * - * Measures: - * protvista:fetch-and-parse script-start → data-loaded - * protvista:render data-loaded → tracks-settled (incl. quiescence gap) - * protvista:total script-start → tracks-settled - * - * The render measure ends at tracks-settled rather than first-render - * because Lit batches the loader-removal and manager-insertion into the - * same render cycle — first-render fires before nightingale's track - * elements have actually painted. Quiescence detection is the same - * pattern Playwright's `networkidle` and web-vitals' "long task" probes - * use; the QUIESCENCE_MS threshold below is a constant offset that - * cancels out in before/after comparisons. - * - * If the public events change shape, marks may go missing — fail loudly - * by checking summary.md, not silently by adding fallback heuristics. - */ - -if (new URLSearchParams(location.search).has('bench')) { - run(); -} - -function run() { - const HOST_TAG = 'protvista-uniprot'; - const RENDERED_CHILD = 'nightingale-manager'; - const LOADER_CLASS = 'protvista-loader'; - const QUIESCENCE_MS = 250; - - performance.mark('protvista:script-start'); - - const hasMark = (name) => - performance.getEntriesByName(name, 'mark').length > 0; - - function whenHostExists() { - return new Promise((resolve) => { - const found = document.querySelector(HOST_TAG); - if (found) return resolve(found); - const obs = new MutationObserver(() => { - const el = document.querySelector(HOST_TAG); - if (el) { - obs.disconnect(); - resolve(el); - } - }); - obs.observe(document.documentElement, { - childList: true, - subtree: true, - }); - }); - } - - whenHostExists().then((host) => { - // We watch the light-DOM host for three transitions: - // 1. `.protvista-loader` was shown and is now gone → data has loaded - // 2. `` is present → component has first-rendered - // 3. no further subtree mutations for QUIESCENCE_MS → tracks have settled - // - // The component's own `protvista-event{hasData}` is unreliable - // (see "Note: this doesn't seem to work" in src/protvista-uniprot.ts); - // the loader div is the next-best public signal of "fetch resolved". - // - // Why the `loaderEverSeen` flag matters: the host can be observed - // *before* Lit's first render inserts the loader. A naive "loader not - // present" check then fires `data-loaded` immediately at framework - // startup time — wrong by orders of magnitude. - let loaderEverSeen = !!host.querySelector(`.${LOADER_CLASS}`); - let settleTimer = null; - - const obs = new MutationObserver(() => { - const loaderPresent = !!host.querySelector(`.${LOADER_CLASS}`); - const managerPresent = !!host.querySelector(RENDERED_CHILD); - if (loaderPresent) loaderEverSeen = true; - - // Data loaded: loader was shown and is now gone. Fallback: manager - // appeared without a loader ever showing (cached / instant render). - if ( - !hasMark('protvista:data-loaded') && - ((loaderEverSeen && !loaderPresent) || - (managerPresent && !loaderEverSeen)) - ) { - performance.mark('protvista:data-loaded'); - performance.measure( - 'protvista:fetch-and-parse', - 'protvista:script-start', - 'protvista:data-loaded' - ); - } - - if (!hasMark('protvista:first-render') && managerPresent) { - performance.mark('protvista:first-render'); - } - - // Once first-render has fired, debounce: every new mutation pushes - // the settle timer out by QUIESCENCE_MS. When the timer finally - // expires, the subtree has been mutation-free for that long and we - // treat painting as done. - if (hasMark('protvista:first-render')) { - clearTimeout(settleTimer); - settleTimer = setTimeout(settle, QUIESCENCE_MS); - } - }); - - function settle() { - if (hasMark('protvista:tracks-settled')) return; - if (!hasMark('protvista:first-render')) return; - performance.mark('protvista:tracks-settled'); - if (hasMark('protvista:data-loaded')) { - performance.measure( - 'protvista:render', - 'protvista:data-loaded', - 'protvista:tracks-settled' - ); - } - performance.measure( - 'protvista:total', - 'protvista:script-start', - 'protvista:tracks-settled' - ); - obs.disconnect(); - } - - obs.observe(host, { childList: true, subtree: true }); - }); -} diff --git a/bench/lighthouserc.cjs b/bench/lighthouserc.cjs index 1714068f..2f947c8e 100644 --- a/bench/lighthouserc.cjs +++ b/bench/lighthouserc.cjs @@ -17,15 +17,16 @@ module.exports = { startServerCommand: 'npx vite preview --config vite.demo.config.mjs --port 4173 --strictPort', startServerReadyPattern: 'Local:', - // `&bench=1` opts the page into bench/instrument.js, which emits - // `protvista:*` user timings that Lighthouse captures in its trace. + // The component emits `protvista:*` performance marks/measures + // unconditionally; Lighthouse captures them via its user-timings + // audit and `bench/summarize.mjs` surfaces them in summary.md. url: [ // Well-annotated default — features, variants, structure. - 'http://localhost:4173/?accession=P05067&bench=1', + 'http://localhost:4173/?accession=P05067', // Heavy entry — many variants, 3D Beacons. - 'http://localhost:4173/?accession=P38398&bench=1', + 'http://localhost:4173/?accession=P38398', // Sparse entry — minimal feature load. - 'http://localhost:4173/?accession=A0A2K5ULD0&bench=1', + 'http://localhost:4173/?accession=A0A2K5ULD0', ], // 5 runs per URL — LHCI takes the median, this smooths out the // noise floor more than the default 3 without doubling wall time. diff --git a/eslint.config.mjs b/eslint.config.mjs index 9c33df0f..ce18c8cf 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -46,18 +46,7 @@ export default [ }, }, - /* Bench scripts — plain JS, not part of the shipped library. Browser - globals for the instrumentation, Node globals for the runners. */ - { - files: ['bench/instrument.js'], - languageOptions: { - ecmaVersion: 2022, - sourceType: 'module', - globals: { - ...globals.browser, - }, - }, - }, + /* Bench runners — node scripts, not shipped. */ { files: ['bench/**/*.{mjs,cjs}'], languageOptions: { diff --git a/index.html b/index.html index b46f63bf..17f3e8ed 100644 --- a/index.html +++ b/index.html @@ -23,10 +23,6 @@ - -
diff --git a/package.json b/package.json index 7630af64..63294c2f 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "build": "vite build", "build:demo": "vite build --config vite.demo.config.mjs", "start": "vite", - "test:lint": "eslint 'src/**/*.ts' 'bench/**/*.{js,mjs,cjs}'", + "test:lint": "eslint 'src/**/*.ts' 'bench/**/*.{mjs,cjs}'", "test:types": "tsc", "test:unit": "vitest run", "test:watch": "vitest", diff --git a/src/filter-config.ts b/src/filter-config.ts index 77b9dae3..c25bbab0 100644 --- a/src/filter-config.ts +++ b/src/filter-config.ts @@ -1,4 +1,4 @@ -import { VariationDatum } from '@nightingale-elements/nightingale-variation'; +import { type VariationDatum } from '@nightingale-elements/nightingale-variation'; import { ClinicalSignificance } from '@nightingale-elements/nightingale-variation'; const scaleColors = { diff --git a/src/protvista-uniprot.ts b/src/protvista-uniprot.ts index b5067917..f5c01442 100644 --- a/src/protvista-uniprot.ts +++ b/src/protvista-uniprot.ts @@ -51,6 +51,34 @@ import loaderIcon from './icons/spinner.svg'; import protvistaStyles from './styles/protvista-styles'; import loaderStyles from './styles/loader-styles'; +// Performance marks emitted at three lifecycle transitions: +// protvista:script-start component connectedCallback runs +// protvista:data-loaded fetch + parse complete +// protvista:first-render nightingale-manager rendered with content +// These are part of the component's public observable surface — the +// `bench/` workflow relies on them to compare baselines across refactors. +// Renaming or moving them is a breaking change for perf measurement. +// +// Each mark fires at most once per page (subsequent component instances +// or re-loads no-op), and corresponding measures are emitted so they +// show up as named segments in Chrome DevTools and Lighthouse's +// user-timings audit. +const markOnce = (name: string) => { + if (performance.getEntriesByName(name, 'mark').length === 0) { + performance.mark(name); + } +}; +const measureOnce = (name: string, start: string, end: string) => { + if (performance.getEntriesByName(name, 'measure').length === 0) { + try { + performance.measure(name, start, end); + } catch { + // Either start/end mark missing — surface marks but skip the measure + // rather than throwing; comparing the marks directly still works. + } + } +}; + // Heterogeneous adapter map — each adapter has its own signature and return // shape. Typed loosely here so the .apply() dispatch below doesn't try to // reconcile the union of all signatures at the call site. @@ -158,10 +186,23 @@ class ProtvistaUniprot extends LitElement { ); // Some endpoints return empty arrays, while most fail 🙄 + const wasHasData = this.hasData; this.hasData = this.hasData || Object.values(this.rawData).some((d) => !!d?.features?.length); + // Fire the public protvista-event the moment data first becomes + // available. (Previously this was hung off a `'load'` listener that + // never fired — see `connectedCallback` history.) + if (this.hasData && !wasHasData) { + this.dispatchEvent( + new CustomEvent('protvista-event', { + detail: { hasData: true }, + bubbles: true, + }) + ); + } + // Now iterate over tracks and categories, transforming the data // and assigning it as adequate for (const { name: categoryName, tracks, trackType } of this.config @@ -235,6 +276,12 @@ class ProtvistaUniprot extends LitElement { } } this.loading = false; + markOnce('protvista:data-loaded'); + measureOnce( + 'protvista:fetch-and-parse', + 'protvista:script-start', + 'protvista:data-loaded' + ); this.requestUpdate(); // Why? } @@ -313,6 +360,21 @@ class ProtvistaUniprot extends LitElement { updated(changedProperties: Map) { super.updated(changedProperties); + // First render with content — manager is in the DOM, not the loader. + if (this.hasData && !this.loading) { + markOnce('protvista:first-render'); + measureOnce( + 'protvista:render', + 'protvista:data-loaded', + 'protvista:first-render' + ); + measureOnce( + 'protvista:total', + 'protvista:script-start', + 'protvista:first-render' + ); + } + const filterComponent = this.querySelector('nightingale-filter'); if (filterComponent && filterComponent.filters !== filterConfig) { @@ -351,6 +413,7 @@ class ProtvistaUniprot extends LitElement { connectedCallback() { super.connectedCallback(); + markOnce('protvista:script-start'); this.registerWebComponents(); if (!this.suspend) this._init(); @@ -363,21 +426,6 @@ class ProtvistaUniprot extends LitElement { this.displayCoordinates.end = e.detail.displayend; } }); - - // Note: this doesn't seem to work - this.addEventListener('load', () => { - if (!this.hasData) { - this.dispatchEvent( - new CustomEvent('protvista-event', { - detail: { - hasData: true, - }, - bubbles: true, - }) - ); - this.hasData = true; - } - }); } async loadEntry(accession: string) { From f9aa5134ecba0019faa7752daf6efaa926cc989e Mon Sep 17 00:00:00 2001 From: Daniel Rice Date: Wed, 29 Apr 2026 13:45:27 +0100 Subject: [PATCH 08/11] Remove old baseline benchmarks. --- bench/baselines/bundle-size-4c80b07.json | 16 -------------- bench/baselines/summary-4c80b07.md | 28 ------------------------ 2 files changed, 44 deletions(-) delete mode 100644 bench/baselines/bundle-size-4c80b07.json delete mode 100644 bench/baselines/summary-4c80b07.md diff --git a/bench/baselines/bundle-size-4c80b07.json b/bench/baselines/bundle-size-4c80b07.json deleted file mode 100644 index 44b76108..00000000 --- a/bench/baselines/bundle-size-4c80b07.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "commit": "4c80b07038e4bb04fabda8ae9ab8608d11c77414", - "shortSha": "4c80b07", - "capturedAt": "2026-04-28T18:11:29.285Z", - "files": [ - { - "file": "protvista-uniprot.mjs", - "raw": 4654875, - "gzip": 1162704 - } - ], - "total": { - "raw": 4654875, - "gzip": 1162704 - } -} \ No newline at end of file diff --git a/bench/baselines/summary-4c80b07.md b/bench/baselines/summary-4c80b07.md deleted file mode 100644 index ea03ffaa..00000000 --- a/bench/baselines/summary-4c80b07.md +++ /dev/null @@ -1,28 +0,0 @@ -# Bench results - -Captured: 2026-04-28T18:15:26.550Z -Commit: `4c80b07` - -Numeric cells show `median (min–max)`. - -## Lighthouse (5 runs) - -| Scenario | Perf | LCP | TBT | CLS | Speed Index | -| ------------------------------ | ---------- | ------------------ | ---------------- | ---------------- | --------------- | -| `accession=P05067&bench=1` | 69 (68–70) | 5.5 s (5.4–5.6) | 44 ms (35–53) | 0.00 (0.00–0.00) | 2.2 s (2.0–2.4) | -| `accession=P38398&bench=1` | 48 (46–52) | 46.7 s (46.1–47.0) | 341 ms (308–389) | 0.00 (0.00–0.00) | 4.0 s (2.5–4.5) | -| `accession=A0A2K5ULD0&bench=1` | 80 (76–82) | 2.3 s (2.2–2.7) | 33 ms (23–116) | 0.00 (0.00–0.00) | 2.1 s (2.0–2.4) | - -### Custom milestones (5 runs) - -| Scenario | fetch-and-parse | render | total | -| ------------------------------ | --------------- | ---------------- | --------------- | -| `accession=P05067&bench=1` | 2.1 s (1.5–2.4) | 326 ms (317–335) | 2.5 s (1.9–2.7) | -| `accession=P38398&bench=1` | 4.9 s (4.2–6.6) | 292 ms (291–305) | 5.2 s (4.4–6.9) | -| `accession=A0A2K5ULD0&bench=1` | 1.6 s (1.5–2.1) | 274 ms (273–278) | 1.9 s (1.8–2.4) | - -## Bundle size (library, `dist/`) - -| Total raw | Total gzip | Files | -| --------- | ---------- | ----- | -| 4545.8 KB | 1135.5 KB | 1 | From 14632a30376b321fe98b2f33160a094e7dc55c08 Mon Sep 17 00:00:00 2001 From: Daniel Rice Date: Wed, 29 Apr 2026 13:49:35 +0100 Subject: [PATCH 09/11] Fix README. --- bench/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bench/README.md b/bench/README.md index 7f9b6e06..c8d93505 100644 --- a/bench/README.md +++ b/bench/README.md @@ -65,7 +65,7 @@ yarn bench ## Comparing -Eyeballing two `summary.md` tables is enough most of the time. For a stricter check, LHCI's own diff works against the raw reports — see `lhci compare` docs. +Eyeballing two `summary.md` tables — current run vs. a committed baseline under `bench/baselines/` — is enough most of the time. For raw numbers, `jq` over `bench/results/lighthouse/manifest.json` pulls per-run metrics out of the latest run; `lhci open` will pop the current run's HTML reports in a browser if you want to see Lighthouse's full breakdown for one scenario. Treat any single-metric delta under ~5% as noise unless it's consistent across all scenarios. From 7ffe6e2634fe922764d8a3baf5d4e5cb2fff7f33 Mon Sep 17 00:00:00 2001 From: Daniel Rice Date: Wed, 29 Apr 2026 16:01:09 +0100 Subject: [PATCH 10/11] Increase timeout for benchmarks. --- bench/lighthouserc.cjs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/bench/lighthouserc.cjs b/bench/lighthouserc.cjs index 2f947c8e..e18bb43a 100644 --- a/bench/lighthouserc.cjs +++ b/bench/lighthouserc.cjs @@ -40,6 +40,11 @@ module.exports = { // Be explicit so two machines on different Chrome versions still // produce comparable numbers. chromeFlags: '--headless=new --no-sandbox', + // Default is 45000 ms; the heavy variation payload on P38398 + // sometimes runs right at that edge and Lighthouse marks the + // whole run as a page-load failure (Perf=0, all audits empty). + // 60 s gives those scenarios room to finish. + maxWaitForLoad: 60000, }, }, upload: { From a160691238eb8efb9b565dce3e66fd44f56597ed Mon Sep 17 00:00:00 2001 From: Swaathik Date: Wed, 29 Apr 2026 16:04:57 +0100 Subject: [PATCH 11/11] Benchmarks: baseline at 14632a3 --- bench/baselines/bundle-size-14632a3.json | 16 ++++++++++++++ bench/baselines/summary-14632a3.md | 28 ++++++++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 bench/baselines/bundle-size-14632a3.json create mode 100644 bench/baselines/summary-14632a3.md diff --git a/bench/baselines/bundle-size-14632a3.json b/bench/baselines/bundle-size-14632a3.json new file mode 100644 index 00000000..086e0d28 --- /dev/null +++ b/bench/baselines/bundle-size-14632a3.json @@ -0,0 +1,16 @@ +{ + "commit": "14632a30376b321fe98b2f33160a094e7dc55c08", + "shortSha": "14632a3", + "capturedAt": "2026-04-29T13:45:49.709Z", + "files": [ + { + "file": "protvista-uniprot.mjs", + "raw": 4655449, + "gzip": 1162894 + } + ], + "total": { + "raw": 4655449, + "gzip": 1162894 + } +} \ No newline at end of file diff --git a/bench/baselines/summary-14632a3.md b/bench/baselines/summary-14632a3.md new file mode 100644 index 00000000..4cd6da9b --- /dev/null +++ b/bench/baselines/summary-14632a3.md @@ -0,0 +1,28 @@ +# Bench results + +Captured: 2026-04-29T13:33:27.855Z +Commit: `14632a3` + +Numeric cells show `median (min–max)`. + +## Lighthouse (5 runs) + +| Scenario | Perf | LCP | TBT | CLS | Speed Index | +|---|---|---|---|---|---| +| `accession=P05067` | 69 (38–70) | 5.5 s (5.5–5.8) | 22 ms (18–910) | 0.00 (0.00–0.00) | 2.1 s (2.0–2.9) | +| `accession=P38398` | 52 (45–53) | 46.4 s (46.2–46.7) | 266 ms (260–403) | 0.00 (0.00–0.00) | 4.2 s (3.7–4.6) | +| `accession=A0A2K5ULD0` | 80 (78–82) | 2.4 s (2.2–2.6) | 35 ms (16–42) | 0.00 (0.00–0.00) | 2.2 s (2.0–2.2) | + +### Custom milestones (5 runs) + +| Scenario | fetch-and-parse | render | total | +|---|---|---|---| +| `accession=P05067` | 1.7 s (1.6–2.3) | 7 ms (7–8) | 1.7 s (1.6–2.3) | +| `accession=P38398` | 5.2 s (4.3–5.8) | 7 ms (6–9) | 5.2 s (4.3–5.8) | +| `accession=A0A2K5ULD0` | 1.8 s (1.4–1.9) | 11 ms (9–12) | 1.8 s (1.5–1.9) | + +## Bundle size (library, `dist/`) + +| Total raw | Total gzip | Files | +|---|---|---| +| 4546.3 KB | 1135.6 KB | 1 |