From 7d5b7f74203c4403c3ebe1cf880e4388a449be99 Mon Sep 17 00:00:00 2001 From: NullVoxPopuli <199018+NullVoxPopuli@users.noreply.github.com> Date: Thu, 17 Sep 2026 17:41:38 -0400 Subject: [PATCH] Add a Lighthouse script with budgets `pnpm lighthouse` in apps/repl serves the production build and runs Lighthouse 13 (the version of pagespeed.web.dev, with the agentic browsing category) on three pages, three runs each, and takes the median run. What makes it exit with code 1 depends on what we ship, not on the speed of the machine: each scored audit of the accessibility, best practices, SEO, and agentic browsing categories, a CLS budget, and a transfer size budget. Known failures have a list with reasons. The performance score and TBT only warn. With GITHUB_STEP_SUMMARY set, the result table goes to the job summary. @lhci/cli is not used, because its newest release has Lighthouse 12.6. Co-Authored-By: Claude Fable 5.1 --- apps/repl/.gitignore | 3 + apps/repl/package.json | 7 +- apps/repl/scripts/lighthouse.mjs | 286 ++++++++++++ pnpm-lock.yaml | 745 +++++++++++++++++++++++++++++-- 4 files changed, 1014 insertions(+), 27 deletions(-) create mode 100644 apps/repl/scripts/lighthouse.mjs diff --git a/apps/repl/.gitignore b/apps/repl/.gitignore index 40aa79a09..a1435946a 100644 --- a/apps/repl/.gitignore +++ b/apps/repl/.gitignore @@ -26,3 +26,6 @@ tsconfig.tsbuildinfo /.node_modules.ember-try/ /bower.json.ember-try /package.json.ember-try + +# pnpm lighthouse +lighthouse-reports/ diff --git a/apps/repl/package.json b/apps/repl/package.json index e3c6c6a0c..3ae893901 100644 --- a/apps/repl/package.json +++ b/apps/repl/package.json @@ -29,6 +29,7 @@ "test:firefox": "CI_BROWSER=Firefox pnpm dist:ember:test", "test:preview": "pnpm vite preview", "dist:ember:test": "testem ci --port 0", + "lighthouse": "node ./scripts/lighthouse.mjs", "lint": "pnpm -w exec lint", "lint:js": "pnpm -w exec lint js", "lint:js:fix": "pnpm -w exec lint js:fix", @@ -76,6 +77,7 @@ "autoprefixer": "^10.4.22", "babel-plugin-ember-template-compilation": "^4.0.0", "chalk": "^5.6.2", + "chrome-launcher": "^1.2.1", "common-tags": "^1.8.2", "concurrently": "^9.2.1", "decorator-transforms": "2.4.0", @@ -89,6 +91,7 @@ "eslint": "^9.39.1", "execa": "^9.6.1", "fractal-page-object": "^1.0.0", + "lighthouse": "^13.4.1", "loader.js": "^4.7.0", "onp": "^2.0.4", "postcss": "^8.5.6", @@ -165,7 +168,6 @@ "ember-statechart-component": "7.1.0", "html-to-image": "^1.11.13", "limber-ui": "workspace:*", - "repl-sdk": "workspace:*", "lz-string": "^1.5.0", "nvp.ui": "^0.5.2", "path-browserify": "^1.0.1", @@ -176,9 +178,10 @@ "remark-html": "16.0.1", "remark-parse": "11.0.0", "remark-rehype": "^11.1.2", + "repl-sdk": "workspace:*", + "shiki": "^3.20.0", "stringify-object": "^5.0.0", "svelte": "^5.35.5", - "shiki": "^3.20.0", "tabster": "8.7.0", "tracked-built-ins": "^4.0.0", "tracked-toolbox": "^3.0.0", diff --git a/apps/repl/scripts/lighthouse.mjs b/apps/repl/scripts/lighthouse.mjs new file mode 100644 index 000000000..c508d39a6 --- /dev/null +++ b/apps/repl/scripts/lighthouse.mjs @@ -0,0 +1,286 @@ +/** + * Runs Lighthouse against the production build in ./dist, the same version and + * categories that pagespeed.web.dev uses. + * + * pnpm build:prod && pnpm lighthouse + * + * Options (environment variables): + * LIGHTHOUSE_DIST the folder to serve, default ./dist + * LIGHTHOUSE_RUNS runs for each page, default 3. The median run counts. + * LIGHTHOUSE_REPORTS where the HTML reports go, default ./lighthouse-reports + * + * Exit code 1 when an audit of STRICT_CATEGORIES fails, or a budget of BUDGETS with `fail: true`. + */ +import fs from 'node:fs'; +import http from 'node:http'; +import path from 'node:path'; +import zlib from 'node:zlib'; + +import { launch } from 'chrome-launcher'; +import lighthouse from 'lighthouse'; + +const DIST = path.resolve(process.env.LIGHTHOUSE_DIST ?? './dist'); +const RUNS = Number(process.env.LIGHTHOUSE_RUNS ?? 3); +const REPORTS = path.resolve(process.env.LIGHTHOUSE_REPORTS ?? './lighthouse-reports'); + +const GJS_DOCUMENT = `import Component from '@glimmer/component'; +import { tracked } from '@glimmer/tracking'; +import { on } from '@ember/modifier'; + +export default class Counter extends Component { + @tracked count = 0; + + increment = () => this.count++; + + +} +`; + +const PAGES = [ + { name: 'edit (welcome document)', path: '/edit' }, + { name: 'edit (gjs document)', path: `/edit?format=gjs&t=${encodeURIComponent(GJS_DOCUMENT)}` }, + { name: 'docs', path: '/docs' }, +]; + +/** + * Each audit in these categories must pass. A new failure stops CI. + * What we ship decides these results, not the speed of the CI machine. + */ +const STRICT_CATEGORIES = ['accessibility', 'best-practices', 'seo', 'agentic-browsing']; + +/** + * Failures that we know about and accept, with the reason. + */ +const KNOWN_FAILURES = { + // tabster puts focusable aria-hidden elements in . They move focus away at once. + // The tabster option that removes them (controlTab: false) breaks the single tab stop + // of the format switcher. + 'aria-hidden-focus': 'tabster', + 'agent-accessibility-tree': 'tabster', +}; + +/** + * `fail: false` only warns, because the performance score and its timings + * change with the speed of the machine. + */ +const BUDGETS = [ + { + label: 'CLS', + fail: true, + max: 0.1, + read: (r) => r.audits['cumulative-layout-shift'].numericValue, + }, + { label: 'Transfer (kB)', fail: true, max: 1800, read: transferKB }, + { label: 'Performance', fail: false, min: 0.7, read: (r) => r.categories.performance.score }, + { + label: 'TBT (ms)', + fail: false, + max: 300, + read: (r) => r.audits['total-blocking-time'].numericValue, + }, +]; + +const COLUMNS = [ + { label: 'Perf', read: (r) => percent(r.categories.performance.score) }, + { label: 'A11y', read: (r) => percent(r.categories.accessibility.score) }, + { label: 'BP', read: (r) => percent(r.categories['best-practices'].score) }, + { label: 'SEO', read: (r) => percent(r.categories.seo.score) }, + { label: 'Agentic', read: (r) => percent(r.categories['agentic-browsing']?.score) }, + { label: 'FCP', read: (r) => r.audits['first-contentful-paint'].displayValue }, + { label: 'LCP', read: (r) => r.audits['largest-contentful-paint'].displayValue }, + { label: 'TBT', read: (r) => r.audits['total-blocking-time'].displayValue }, + { label: 'CLS', read: (r) => r.audits['cumulative-layout-shift'].displayValue }, + { label: 'Transfer', read: (r) => `${transferKB(r)} kB` }, +]; + +function percent(score) { + return score == null ? 'n/a' : String(Math.round(score * 100)); +} + +function transferKB(report) { + let bytes = 0; + + for (const item of report.audits['network-requests'].details.items) { + bytes += item.transferSize; + } + + return Math.round(bytes / 1024); +} + +const TYPES = { + '.html': 'text/html', + '.js': 'text/javascript', + '.css': 'text/css', + '.wasm': 'application/wasm', + '.json': 'application/json', + '.svg': 'image/svg+xml', + '.txt': 'text/plain', + '.ico': 'image/x-icon', +}; + +/** + * Close to Cloudflare Pages: brotli, and index.html for a path with no file. + */ +function serve() { + const cache = new Map(); + + function load(file) { + if (cache.has(file)) return cache.get(file); + + const raw = fs.readFileSync(file); + const type = TYPES[path.extname(file)]; + const compress = Boolean(type) && type !== 'image/x-icon'; + const body = compress + ? zlib.brotliCompressSync(raw, { params: { [zlib.constants.BROTLI_PARAM_QUALITY]: 5 } }) + : raw; + const entry = { body, compress, type: type ?? 'application/octet-stream' }; + + cache.set(file, entry); + + return entry; + } + + const server = http.createServer((request, response) => { + const url = decodeURIComponent(new URL(request.url, 'http://localhost').pathname); + let file = path.join(DIST, url); + + if (!file.startsWith(DIST)) file = DIST; + if (fs.existsSync(file) && fs.statSync(file).isDirectory()) + file = path.join(file, 'index.html'); + if (!fs.existsSync(file)) file = path.join(DIST, 'index.html'); + + const { body, compress, type } = load(file); + + response.setHeader('content-type', type); + response.setHeader('cache-control', 'public, max-age=14400, must-revalidate'); + if (compress) response.setHeader('content-encoding', 'br'); + response.end(body); + }); + + return new Promise((resolve) => { + server.listen(0, '127.0.0.1', () => resolve(server)); + }); +} + +async function run(url) { + // A fresh Chrome for each run, so that no run has a warm cache. + const chrome = await launch({ chromeFlags: ['--headless=new', '--no-sandbox'] }); + + try { + const result = await lighthouse(url, { port: chrome.port, output: 'html', logLevel: 'error' }); + + return { report: result.lhr, html: result.report }; + } finally { + chrome.kill(); + } +} + +function median(results) { + const sorted = results + .slice() + .sort((a, b) => a.report.categories.performance.score - b.report.categories.performance.score); + + return sorted[Math.floor(sorted.length / 2)]; +} + +function check(page, report) { + const problems = []; + + for (const id of STRICT_CATEGORIES) { + for (const ref of report.categories[id]?.auditRefs ?? []) { + const audit = report.audits[ref.id]; + + // Lighthouse gives weight 0 to audits that do not count toward the category score. + if (ref.weight === 0) continue; + if (audit.score === null || audit.score === 1) continue; + if (audit.scoreDisplayMode === 'informative' || audit.scoreDisplayMode === 'manual') continue; + if (ref.id in KNOWN_FAILURES) continue; + + problems.push({ fail: true, text: `${page.name}: ${id} audit "${ref.id}": ${audit.title}` }); + } + } + + for (const budget of BUDGETS) { + const value = budget.read(report); + const ok = budget.min !== undefined ? value >= budget.min : value <= budget.max; + + if (ok) continue; + + const limit = budget.min !== undefined ? `at least ${budget.min}` : `at most ${budget.max}`; + + problems.push({ + fail: budget.fail, + text: `${page.name}: ${budget.label} is ${Math.round(value * 100) / 100}, expected ${limit}`, + }); + } + + return problems; +} + +if (!fs.existsSync(path.join(DIST, 'index.html'))) { + throw new Error(`No build in ${DIST}. Run "pnpm build:prod" first.`); +} + +fs.mkdirSync(REPORTS, { recursive: true }); + +const server = await serve(); +const origin = `http://127.0.0.1:${server.address().port}`; +const lines = []; +const problems = []; + +lines.push(`| Page | ${COLUMNS.map((column) => column.label).join(' | ')} |`); +lines.push(`| --- | ${COLUMNS.map(() => '---').join(' | ')} |`); + +for (const page of PAGES) { + const results = []; + + for (let i = 0; i < RUNS; i++) { + console.error(`${page.name}: run ${i + 1} of ${RUNS}`); + results.push(await run(origin + page.path)); + } + + const { report, html } = median(results); + const file = `${page.name.replace(/[^a-z0-9]+/gi, '-').replace(/-$/, '')}.html`; + + fs.writeFileSync(path.join(REPORTS, file), html); + lines.push(`| ${page.name} | ${COLUMNS.map((column) => column.read(report)).join(' | ')} |`); + + for (const problem of check(page, report)) { + problems.push(problem); + } +} + +server.close(); + +const version = JSON.parse( + fs.readFileSync(new URL(import.meta.resolve('lighthouse/package.json')), 'utf8') +).version; + +lines.push(''); +lines.push( + `Lighthouse ${version}, mobile, simulated slow 4G, median of ${RUNS} runs. The timings are simulated, so compare them with other CI runs, not with pagespeed.web.dev.` +); + +let failed = false; + +if (problems.length) { + lines.push(''); + + for (const problem of problems) { + failed ||= problem.fail; + lines.push(`- ${problem.fail ? 'FAIL' : 'warning'}: ${problem.text}`); + } +} + +const summary = lines.join('\n'); + +console.log(summary); + +if (process.env.GITHUB_STEP_SUMMARY) { + fs.appendFileSync(process.env.GITHUB_STEP_SUMMARY, `## Lighthouse\n\n${summary}\n`); +} + +if (failed) process.exitCode = 1; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3b23ac538..a51b70031 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -339,6 +339,9 @@ importers: chalk: specifier: ^5.6.2 version: 5.6.2 + chrome-launcher: + specifier: ^1.2.1 + version: 1.2.1 common-tags: specifier: ^1.8.2 version: 1.8.2 @@ -378,6 +381,9 @@ importers: fractal-page-object: specifier: ^1.0.0 version: 1.0.0 + lighthouse: + specifier: ^13.4.1 + version: 13.4.1(bf1be25639b6a2b409596eef25a15c72) loader.js: specifier: ^4.7.0 version: 4.7.0 @@ -479,7 +485,7 @@ importers: version: 7.1.0(26b86c1b73200152d68c973d8eccec8d) kolay: specifier: github:universal-ember/kolay#dist - version: https://codeload.github.com/universal-ember/kolay/tar.gz/85af138408a81c687230c170615b187281509e8d(e0e66335631b66baaed2daf43460943a) + version: https://codeload.github.com/universal-ember/kolay/tar.gz/7ed158039563f4a74d5f3e718f356fac7a1d81b4(e0e66335631b66baaed2daf43460943a) limber-ui: specifier: workspace:* version: link:../../packages/limber-ui @@ -1428,7 +1434,7 @@ importers: version: 4.5.4(f4c3cff2b0060581640191c5b1cdf48a) vitest: specifier: ^4.0.18 - version: 4.0.18(3d57c6b64fd3206716a3490dcf0e69c2) + version: 4.0.18(446ea4e279a9a66486730a97b9063e60) packages/repl-sdk/tests-browser: dependencies: @@ -1462,13 +1468,13 @@ importers: version: 4.0.4 '@vitest/browser': specifier: ^3.2.4 - version: 3.2.4(b30b5bf71eff4051e56920878619eb06) + version: 3.2.4(a51cb7919ee7f0adaae5b6a2396ea9ce) '@vitest/browser-playwright': specifier: ^4.0.18 version: 4.0.18(604ccac0b01bbfd2452f9540b6beecc7) '@vitest/browser-webdriverio': specifier: ^4.0.18 - version: 4.0.18(ba89de5022e570057ce1898c8cda41df) + version: 4.0.18(7184be3e6aa2116eef0f175345ed7087) '@vitest/ui': specifier: 3.2.4 version: 3.2.4(vitest@4.0.18) @@ -1522,13 +1528,13 @@ importers: version: 3.5.0(1772a17673355c6de89229b7565213b1) vitest: specifier: ^4.0.18 - version: 4.0.18(3d57c6b64fd3206716a3490dcf0e69c2) + version: 4.0.18(446ea4e279a9a66486730a97b9063e60) vue: specifier: ^3.5.17 version: 3.5.27(typescript@7.1.0-dev.20260825.1) webdriverio: specifier: ^9.17.0 - version: 9.23.3 + version: 9.23.3(puppeteer-core@25.11.0(yauzl@2.10.0)) packages/syntax/-infra: dependencies: @@ -2289,6 +2295,10 @@ importers: packages: + '@11ty/gray-matter@3.0.0': + resolution: {integrity: sha512-mi6KB36DZCpCfCb9XP3NtDDNXe1N0jKtuFj9mTCZNy5H7vTabODyMgFmmOiGIGJKt+i8mJqEb/REtK+JTEzlpQ==} + engines: {node: '>=11'} + '@algorithm.ts/base64@3.1.1': resolution: {integrity: sha512-8qXO3P6P7ocjtIZAa3By0D2Lzw8eUm5z8n0f/adgKz6tHnV7BrbrPTlFA9F3xNoSTBEXYh4JefJLueqFNTPwmw==} engines: {node: '>= 16.0.0'} @@ -3428,6 +3438,21 @@ packages: '@floating-ui/utils@0.2.10': resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} + '@formatjs/ecma402-abstract@2.3.6': + resolution: {integrity: sha512-HJnTFeRM2kVFVr5gr5kH1XP6K0JcJtE7Lzvtr3FS/so5f1kpsqqqxy5JF+FRaO6H2qmcMfAUIox7AJteieRtVw==} + + '@formatjs/fast-memoize@2.2.7': + resolution: {integrity: sha512-Yabmi9nSvyOMrlSeGGWDiH7rf3a7sIwplbvo/dlz9WCIjzIQAfy1RMf4S0X3yG724n5Ghu2GmEl5NJIV6O9sZQ==} + + '@formatjs/icu-messageformat-parser@2.11.4': + resolution: {integrity: sha512-7kR78cRrPNB4fjGFZg3Rmj5aah8rQj9KPzuLsmcSn4ipLXQvC04keycTI1F7kJYDwIXtT2+7IDEto842CfZBtw==} + + '@formatjs/icu-skeleton-parser@1.8.16': + resolution: {integrity: sha512-H13E9Xl+PxBd8D5/6TVUluSpxGNvFSlN/b3coUp0e0JpuWXXnQDiavIpY3NnvSp4xhEMoXyyBvVfdFX8jglOHQ==} + + '@formatjs/intl-localematcher@0.6.2': + resolution: {integrity: sha512-XOMO2Hupl0wdd172Y06h6kLpBz6Dv+J4okPLl4LPtzbr8f66WbIoy4ev98EBuZ6ZK4h5ydTN6XneT4QVpD7cdA==} + '@fortawesome/ember-fontawesome@3.1.0': resolution: {integrity: sha512-7kkPZo1no5VWamR3Ms2I4m2htZpUXcA76yC2gc0jviOEQit+urrCPIIWk1XdAudKO2Z8x5RR4l1mmJe110Zd7A==} peerDependencies: @@ -3878,6 +3903,48 @@ packages: '@open-rpc/client-js@1.8.1': resolution: {integrity: sha512-vV+Hetl688nY/oWI9IFY0iKDrWuLdYhf7OIKI6U1DcnJV7r4gAgwRJjEr1QVYszUc0gjkHoQJzqevmXMGLyA0g==} + '@opentelemetry/api-logs@0.220.0': + resolution: {integrity: sha512-CmVa4ImJ+ynfrPMNaAXHET6Bhb44SwzmfyVJFq9ni2jgXJR/l7C6gfVFddNmHP+ZOkP9cf4f9DBe68qVLTHc9w==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/api@1.9.1': + resolution: {integrity: sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/core@2.11.0': + resolution: {integrity: sha512-7YP44XH0tV6+Mb54x2YGf84i7yi+31MBZlE8JwvozkxyTvXbSp10X7cI7YE49ChJ3shMJoBmCJF3+1QFBJctGA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/instrumentation@0.220.0': + resolution: {integrity: sha512-xQx3E2WxP1mDvKzxLxX+CTCtNLa560YJZ3087qYHerl2YmiKpv7AH+dAy7vmx+eVrZ5BwhfWUAVoKOoxCNHcpw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/resources@2.11.0': + resolution: {integrity: sha512-Ie7+8q8MDF4FAEQCKVMTx3ReUvxiIAgIiiW3c9JdmP8+HMcDy20puT+AHjexnExgnbvBxjQ9fjkFDWrikJ2jQA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-trace-base@2.11.0': + resolution: {integrity: sha512-H19x/TX/LZdqiYOjM7fqtSxwlplC5pgelavqbQdHbhdq0q/AI/TGkM2dfGuuynTXmJPeF2HoZVoPDu+TGoW78A==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-trace@2.11.0': + resolution: {integrity: sha512-fFnTqGm8/G73GQVnxYi7LXa1ZVYEUvgL6XI1LpvV0bPC7WQ/ZGgKxCSl8FnlZBKto9JHHEFTO6s6CUpvvtwFrA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/semantic-conventions@1.43.0': + resolution: {integrity: sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg==} + engines: {node: '>=14'} + '@oxc-parser/binding-android-arm-eabi@0.130.0': resolution: {integrity: sha512-h/xYU8/7ADWzVSf5I+YalLpj33LOy9CI/zgbJNIZ5eunRBG+Czqa3lZsvuPHHf3rOt6z1c5+UzoxjbAzAvhwVw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4011,6 +4078,9 @@ packages: '@oxc-project/types@0.130.0': resolution: {integrity: sha512-ibD2usx9JRu7f5pu2tMKMI4cpA4NgXJQoYRP4pQ7Pxmn1l6k/53qWtQWZayhYy3X4QZkt90Ot+mJEaeXouio6Q==} + '@paulirish/trace_engine@0.0.65': + resolution: {integrity: sha512-Qsm6F5C8xf6ZzQXbQc2+wcpe6sggfs/gvc/ytqSurdvYg3kyW0ECHCqE0CWBKZpqgjVfPNX9c7SCS3r2nEIRGg==} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -4042,6 +4112,19 @@ packages: engines: {node: '>=18'} hasBin: true + '@puppeteer/browsers@3.2.2': + resolution: {integrity: sha512-q2BU4YfO9h/Wt7IcWPcggpOOqLk2Tbs1hDwolvKZrweRjy751OJBKMN9zO5bfD0pzU7X/tvKw/exQds4pM/LOg==} + engines: {node: '>=22.12.0'} + hasBin: true + peerDependencies: + proxy-agent: '>=8.0.1' + yauzl: ^2.10.0 || ^3.4.0 + peerDependenciesMeta: + proxy-agent: + optional: true + yauzl: + optional: true + '@replit/codemirror-lang-svelte@6.0.0': resolution: {integrity: sha512-U2OqqgMM6jKelL0GNWbAmqlu1S078zZNoBqlJBW+retTc5M4Mha6/Y2cf4SVg6ddgloJvmcSpt4hHrVoM4ePRA==} peerDependencies: @@ -4391,6 +4474,51 @@ packages: '@sec-ant/readable-stream@0.4.1': resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + '@sentry/conventions@0.16.0': + resolution: {integrity: sha512-fO9PLmHdVURcSPUpWCItWAtgKiMwGdJHbovoSEyLplX5sxs2ugvI4CBPTrkkgqhObnZOD0CnWBKDzSVQYBKEyQ==} + engines: {node: '>=14'} + + '@sentry/core@10.75.0': + resolution: {integrity: sha512-5wDQpQqjJ6RHdPR+z6Q+47XlwoxRKBv0yyB0LKHqL/1azPOQbR+nllyLmmQDcoJpaksuLSmLA1q6hFX7gjDT2w==} + engines: {node: '>=18'} + + '@sentry/node-core@10.75.0': + resolution: {integrity: sha512-+E3KSX1oMqhpWQ23hj6NblIVUzLy3T2oceU7DfMX1s1ar+npaQZxR5K0/cMGcQgS1LLm8Jqwqo/lrZlKTCDm5A==} + engines: {node: '>=18'} + peerDependencies: + '@opentelemetry/api': ^1.9.0 + '@opentelemetry/core': ^1.30.1 || ^2.1.0 + '@opentelemetry/exporter-trace-otlp-http': '>=0.57.0 <1' + '@opentelemetry/instrumentation': '>=0.57.1 <1' + '@opentelemetry/sdk-trace-base': ^1.30.1 || ^2.1.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@opentelemetry/core': + optional: true + '@opentelemetry/exporter-trace-otlp-http': + optional: true + '@opentelemetry/instrumentation': + optional: true + '@opentelemetry/sdk-trace-base': + optional: true + + '@sentry/node@10.75.0': + resolution: {integrity: sha512-XdYW+SEiscQnuugh1hMldfnHurmleKSTSDqgfro6Y1yd7s0r2csnZ5/SEYxIeL4lSl1QXg1lIA1pBmAXjcdnKA==} + engines: {node: '>=18'} + + '@sentry/opentelemetry@10.75.0': + resolution: {integrity: sha512-reJoMtuHMuaiztoDVoaeitc22eHlTAvz2qpFhibWyzukJlF8oXB+o8EvDN9mmDDMedU89c//cXRcnPBlJvUxcw==} + engines: {node: '>=18'} + peerDependencies: + '@opentelemetry/api': ^1.9.0 + '@opentelemetry/core': ^1.30.1 || ^2.1.0 + '@opentelemetry/sdk-trace-base': ^1.30.1 || ^2.1.0 + + '@sentry/server-utils@10.75.0': + resolution: {integrity: sha512-7fIa9vFGNzB13hmxl8Sip3xImSkqpc4wETzuQ7CLzVOwPvwI6y/gVEm0pxRhtJSq8SzfOp26eJWl80u8v78Osg==} + engines: {node: '>=18'} + '@shikijs/core@1.29.2': resolution: {integrity: sha512-vju0lY9r27jJfOY4Z7+Rt/nIOjzJpZ3y+nYpqtUZInVoXQ/TJZcfGnNOGnKjFdVZb8qexiCuSlZRKcGfhhTTZQ==} @@ -5362,6 +5490,9 @@ packages: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} engines: {node: '>= 4.0.0'} + atomically@2.1.1: + resolution: {integrity: sha512-P4w9o2dqARji6P7MHprklbfiArZAWvo07yW7qs3pdljb3BWr12FIB7W+p0zJiuiVsUpRO0iZn1kFFcpPegg0tQ==} + autoprefixer@10.4.23: resolution: {integrity: sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA==} engines: {node: ^10 || ^12 || >=14} @@ -5369,6 +5500,10 @@ packages: peerDependencies: postcss: ^8.1.0 + axe-core@4.13.0: + resolution: {integrity: sha512-UzGt8zg7Ny8djbYMhxl2zuEevVa7r2gJjYY5Lwr1xM7+XU2nd6CkIWFTVcCIbAP63vSz71NaVyyuSk9lHKcy0A==} + engines: {node: '>=4'} + axios@1.13.4: resolution: {integrity: sha512-1wVkUaAO6WyaYtCkcYCOx12ZgpGf9Zif+qXa4n+oYzK558YryKqiL6UWwd5DqiH3VRW0GYhTZQ/vlgJrCoNQlg==} @@ -5832,9 +5967,23 @@ packages: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} + chrome-launcher@1.2.1: + resolution: {integrity: sha512-qmFR5PLMzHyuNJHwOloHPAHhbaNglkfeV/xDtt5b7xiFFyU1I+AZZX0PYseMuhenJSSirgxELYIbswcoc+5H4A==} + engines: {node: '>=12.13.0'} + hasBin: true + + chromium-bidi@17.0.2: + resolution: {integrity: sha512-5v9GQFhTktFvotn/OFNJBmKLKRAb6n9r0bVCwf7sHgWc3/JryK0bj1nn93L3pHFrfgcsu6Be6EWsDi+1XHTGDg==} + engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0'} + peerDependencies: + devtools-protocol: '*' + cjs-module-lexer@1.4.3: resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} + cjs-module-lexer@2.2.1: + resolution: {integrity: sha512-Ca8swihM+/4yKecYHY52kgJd300hi2lADU/a1RxNTRe+RJ9jvqQlESpbz9DnG9mowez8qwXHB8qYdIUw9e+F5Q==} + clean-stack@2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} @@ -6011,6 +6160,10 @@ packages: config-chain@1.1.13: resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + configstore@7.1.0: + resolution: {integrity: sha512-N4oog6YJWbR9kGyXvS7jEykLDXIE2C0ILYqNBZBp9iwiJpoCBWYsuAdW6PPFn6w06jjnC+3JstVvWHO4cZqvRg==} + engines: {node: '>=18'} + connect@3.7.0: resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==} engines: {node: '>= 0.10.0'} @@ -6249,6 +6402,9 @@ packages: resolution: {integrity: sha512-ju88BYCQ2uvjO2bR+SsgLSTwTSctU+6Vp2ePbKPgSCZyy4MWZxYsT738DlKVRE5utUjobjPRm1MkTYKJxCmpTA==} engines: {node: '>=14.9.0'} + csp_evaluator@1.1.8: + resolution: {integrity: sha512-EwOnfYuNbTytvbMKsLixTrRgnjOa0WZCxGy8A9nnSYAicrdwn+T/epU/yjgymmOxlgKnvH+8wXt+7p/8ak5Feg==} + css-select@5.2.2: resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} @@ -6514,6 +6670,10 @@ packages: defaults@1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + degenerator@5.0.1: resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} engines: {node: '>= 14'} @@ -6555,6 +6715,12 @@ packages: devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + devtools-protocol@0.0.1663043: + resolution: {integrity: sha512-33aOY3ZnBP1dgZsshgaL+/XlsQleiFZgyUaDtdZkEa1nbZhVY1MoDeWjk+wxg25fU924l1ZJfoGNmjjeA/5s1w==} + + devtools-protocol@0.0.1680125: + resolution: {integrity: sha512-rVARKAvOFJCFkvgX01VLvYqKIvt+cRCqvUxIhB2oAqVGPalxk3w3sb5TUGDagpow/EFblBpm/Zl/29QA2dd+jA==} + didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} @@ -6609,6 +6775,10 @@ packages: dot-case@3.0.4: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dot-prop@9.0.0: + resolution: {integrity: sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==} + engines: {node: '>=18'} + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -6857,6 +7027,10 @@ packages: resolution: {integrity: sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==} engines: {node: '>=10.13.0'} + enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + ensure-posix-path@1.1.1: resolution: {integrity: sha512-VWU0/zXzVbeJNXvME/5EmLuEj2TauvoaTz6aFYK1Z92JCBlDlZ3Gu0tuGR42kpW1754ywTs+QB0g5TP0oj9Zaw==} @@ -6901,6 +7075,9 @@ packages: es-module-lexer@1.7.0: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + es-module-lexer@3.0.2: + resolution: {integrity: sha512-BuIB67FngDSyQ/dpQNOZybwdEBDUGJQvOqwWr4ha/ufYiqzuEwPkKO2zLhRAgay28tStRIHUeWmszZAJo3GCOg==} + es-module-shims@2.8.0: resolution: {integrity: sha512-7eBj0nIBTMjg8WspPfHOXVxwvDPeYjTMH7PipzrbecfLS4SFwRvWeakZNsAx0y9yF3TydxrG32tj3y+GKzlpYg==} @@ -7202,6 +7379,10 @@ packages: exsolve@1.0.8: resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -7250,6 +7431,9 @@ packages: fastq@1.20.1: resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + fault@2.0.1: + resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} + fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} @@ -7367,6 +7551,10 @@ packages: resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} engines: {node: '>= 6'} + format@0.2.2: + resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} + engines: {node: '>=0.4.x'} + forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} @@ -7728,6 +7916,10 @@ packages: resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} engines: {node: '>= 0.8'} + http-link-header@1.1.4: + resolution: {integrity: sha512-xT3GPW6/ZbGuw4UvwHqErSCEjNUlwbQJuZn9/q5U4WEKfp2kENVCAlousG1zLxHeaQ/ffOHUNpWamvkbBW0eNw==} + engines: {node: '>=6.0.0'} + http-proxy-agent@4.0.1: resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} engines: {node: '>= 6'} @@ -7786,6 +7978,9 @@ packages: resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} engines: {node: '>= 4'} + image-ssim@0.2.0: + resolution: {integrity: sha512-W7+sO6/yhxy83L0G7xR8YAc5Z5QFtYEXXRV6EaE8tuYBZJnA3gVgp3q7X7muhLZVodeb9UfvjSbwt9VJwjIYAg==} + immediate@3.0.6: resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} @@ -7793,6 +7988,10 @@ packages: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} + import-in-the-middle@3.5.1: + resolution: {integrity: sha512-mPKuL8bPQzecui2KK6Gb+M8JvJoHnhS1FeYGa22QopBmlevF5F0FE6ued/B5EgHDeIoMTONIpDWWFKUPOG0DBQ==} + engines: {node: '>=18'} + import-lazy@4.0.0: resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} engines: {node: '>=8'} @@ -7843,6 +8042,9 @@ packages: resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} engines: {node: '>=12'} + intl-messageformat@10.7.18: + resolution: {integrity: sha512-m3Ofv/X/tV8Y3tHXLohcuVuhWKo7BBq62cqY15etqmLxg2DZ34AGGgQDeR+SCta2+zICb1NX83af0GJmbQ1++g==} + ip-address@10.1.0: resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} engines: {node: '>= 12'} @@ -7866,6 +8068,10 @@ packages: engines: {node: '>=8'} hasBin: true + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -8008,6 +8214,13 @@ packages: jju@1.4.0: resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + jpeg-js@0.4.4: + resolution: {integrity: sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==} + + js-library-detector@6.7.0: + resolution: {integrity: sha512-c80Qupofp43y4cJ7+8TTDN/AsDwLi5oOm/plBrWI+iQt485vKXCco+yVmOwEgdo9VOdsYTuV0UlTeetVPTriXA==} + engines: {node: '>=12'} + js-string-escape@1.0.1: resolution: {integrity: sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==} engines: {node: '>= 0.8'} @@ -8025,6 +8238,10 @@ packages: resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true + js-yaml@5.4.2: + resolution: {integrity: sha512-m+aqu+LwO1O6sIopafj8HUVl5aawITwZQe/yHpMCKjaWBaA/d07B/QdMb3529REftiU+RMMHL3Vlsw3hON7vWg==} + hasBin: true + jsdom@25.0.1: resolution: {integrity: sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==} engines: {node: '>=18'} @@ -8104,8 +8321,12 @@ packages: khroma@2.1.0: resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} - kolay@https://codeload.github.com/universal-ember/kolay/tar.gz/85af138408a81c687230c170615b187281509e8d: - resolution: {gitHosted: true, tarball: https://codeload.github.com/universal-ember/kolay/tar.gz/85af138408a81c687230c170615b187281509e8d} + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + kolay@https://codeload.github.com/universal-ember/kolay/tar.gz/7ed158039563f4a74d5f3e718f356fac7a1d81b4: + resolution: {gitHosted: true, tarball: https://codeload.github.com/universal-ember/kolay/tar.gz/7ed158039563f4a74d5f3e718f356fac7a1d81b4} version: 5.4.0 engines: {node: '>= 18'} @@ -8130,6 +8351,9 @@ packages: resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} engines: {node: '>= 0.6.3'} + legacy-javascript@0.0.1: + resolution: {integrity: sha512-lPyntS4/aS7jpuvOlitZDFifBCb4W8L/3QU0PLbUTUj+zYah8rfVjYic88yG7ZKTxhS5h9iz7duT8oUXKszLhg==} + levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -8140,6 +8364,17 @@ packages: lie@3.3.0: resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + lighthouse-logger@2.0.2: + resolution: {integrity: sha512-vWl2+u5jgOQuZR55Z1WM0XDdrJT6mzMP8zHUct7xTlWhuQs+eV0g+QL0RQdFjT54zVmbhLCP8vIVpy1wGn/gCg==} + + lighthouse-stack-packs@1.12.3: + resolution: {integrity: sha512-d8IsOpE83kbANgnM+Tp8+x6HcMpX9o2ITBiUERssgzAIFdZCQzs/f4k6D0DLQTE59enml9mbAOU52Wu35exWtg==} + + lighthouse@13.4.1: + resolution: {integrity: sha512-fDu8lt3QLK/lTqIxtp1HkzQNJ32rsFHhbadYOepcMZFLgA8oINhxutMbMv8XXnpTOvZ0TXCo4JCk1LDTWaRLnA==} + engines: {node: '>=22.19'} + hasBin: true + lightningcss-android-arm64@1.32.0: resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} engines: {node: '>= 12.0.0'} @@ -8297,6 +8532,9 @@ packages: longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + lookup-closest-locale@6.2.0: + resolution: {integrity: sha512-/c2kL+Vnp1jnV6K6RpDTHK3dgg0Tu2VVp+elEiJpjfS1UyY7AjOYHohRug6wT0OpoX2qFgNORndE9RqesfVxWQ==} + loupe@3.2.1: resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} @@ -8368,6 +8606,9 @@ packages: engines: {node: '>= 16'} hasBin: true + marky@1.3.0: + resolution: {integrity: sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==} + matcher-collection@1.1.2: resolution: {integrity: sha512-YQ/teqaOIIfUHedRam08PB3NK7Mjct6BvzRnJmpGDm8uFXpNr1sbY4yuflI5JcEs6COpYA0FpRQhSDBf1tT95g==} @@ -8388,6 +8629,9 @@ packages: mdast-util-from-markdown@2.0.2: resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + mdast-util-frontmatter@2.0.1: + resolution: {integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==} + mdast-util-gfm-autolink-literal@2.0.1: resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} @@ -8463,6 +8707,9 @@ packages: micromark-core-commonmark@2.0.3: resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + micromark-extension-frontmatter@2.0.0: + resolution: {integrity: sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==} + micromark-extension-gfm-autolink-literal@2.1.0: resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} @@ -8697,6 +8944,13 @@ packages: resolution: {integrity: sha512-4W79zekKGyYU4JXVmB78DOscMFaJth2gGhgfTl2alWE4rNe3nf4N2pqenQ0rEtIewrnD79M687Ouba3YGTLOvg==} engines: {node: '>=18.0.0'} + modern-tar@0.8.5: + resolution: {integrity: sha512-snEhs+6G5Tjd4I7tLCDOaoln2RgE0bD19RzEKgvgK2hZ5VKy3MpLhLTZ2fWpXSTg4K2cyPwp+VHATFJhxfnOeA==} + engines: {node: '>=18.0.0'} + + module-details-from-path@1.0.4: + resolution: {integrity: sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==} + mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} @@ -8879,6 +9133,10 @@ packages: onp@2.0.4: resolution: {integrity: sha512-GQD7jcdjF8mUto+St3mRGl6M/5zB00a54kiiOS2zuT15wbwol6zP42pMQf6Qb2op82kZpyjVhjzDNei+CS4mgQ==} + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -9369,6 +9627,10 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + puppeteer-core@25.11.0: + resolution: {integrity: sha512-Ujym7JbxoAqanaxGcHgmTomfhC01HfDCSuGZ8Hs9boHrDjzbNVMnFRJo2KtbDT9LCRgeJoFnkn9JQZ41eEUrLw==} + engines: {node: '>=22.12.0'} + qs@6.14.1: resolution: {integrity: sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==} engines: {node: '>=0.6'} @@ -9528,6 +9790,9 @@ packages: resolution: {integrity: sha512-WzP+O+XRF4AqhTDQK84FovY+TxHyC8J7QWoOwxnrvVjyHns417l1FUldboRhBYua5Pej6Yg/2jH1dEH2MRNHeA==} hasBin: true + remark-frontmatter@5.0.0: + resolution: {integrity: sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==} + remark-gfm@4.0.1: resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} @@ -9560,6 +9825,10 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} + require-in-the-middle@8.0.1: + resolution: {integrity: sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ==} + engines: {node: '>=9.3.0 || >=8.10.0 <9.0.0'} + requireindex@1.2.0: resolution: {integrity: sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==} engines: {node: '>=0.10.5'} @@ -9656,6 +9925,10 @@ packages: engines: {node: 20 || >=22} hasBin: true + robots-parser@3.0.1: + resolution: {integrity: sha512-s+pyvQeIKIZ0dx5iJiQk1tPLJAWln39+MI5jtM8wnyws+G5azk+dMnMX0qfbqNetKKNgcWWOdi0sfm+FbQbgdQ==} + engines: {node: '>=10.0.0'} + robust-predicates@3.0.3: resolution: {integrity: sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==} @@ -9805,6 +10078,10 @@ packages: scheduler@0.27.0: resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + section-matter@1.0.0: + resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} + engines: {node: '>=4'} + selenium-webdriver@4.40.0: resolution: {integrity: sha512-dU0QbnVKdPmoNP8OtMCazRdtU2Ux6Wl4FEpG1iwUbDeajJK1dBAywBLrC1D7YFRtogHzN96AbXBgBAJaarcysw==} engines: {node: '>= 20.0.0'} @@ -9993,6 +10270,10 @@ packages: spdx-license-ids@3.0.23: resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==} + speedline-core@1.4.3: + resolution: {integrity: sha512-DI7/OuAUD+GMpR6dmu8lliO2Wg5zfeh+/xsdyJZCzd8o5JgFUjCeLsBDuZjIQJdwXS3J0L/uZYrELKYqx+PXog==} + engines: {node: '>=8.0'} + split2@4.2.0: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} @@ -10113,6 +10394,12 @@ packages: strnum@2.1.2: resolution: {integrity: sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==} + stubborn-fs@2.0.0: + resolution: {integrity: sha512-Y0AvSwDw8y+nlSNFXMm2g6L51rBGdAQT20J3YSOqxC53Lo3bjWRtr2BKcfYoAf352WYpsZSTURrA0tqhfgudPA==} + + stubborn-utils@1.0.2: + resolution: {integrity: sha512-zOh9jPYI+xrNOyisSelgym4tolKTJCQd5GBhK0+0xJvcYDcwlOoxF/rnFKQ2KRZknXSG9jWAp66fwP6AxN9STg==} + style-mod@4.1.3: resolution: {integrity: sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==} @@ -10236,6 +10523,12 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + third-party-web@0.29.2: + resolution: {integrity: sha512-fegtha91tq2DHphyoiBXVHjVi2YG9zFaRnboT9C28tO1en9Y3wJsfspuy40F+u5wl3hHVbw7cnd1b67kEGHb8g==} + + third-party-web@0.30.0: + resolution: {integrity: sha512-p+PfyL5U0ediGzvwPzMSdD9MnC8rHW6nWJJVLIQvqN7RsSqfaZ+7n4c9GILqH36EYR0eXB9CzAeCRnKFr/9uJg==} + through2@3.0.2: resolution: {integrity: sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==} @@ -10282,6 +10575,12 @@ packages: tldts-core@6.1.86: resolution: {integrity: sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==} + tldts-core@7.4.13: + resolution: {integrity: sha512-mbYsrih5FRtGxs3Usvl/PqwJsNpp+jsmrdFviiK02teHDG0/HebBG/pqCylje3kzgXYzuLoHJF/0mz9W53t8Xg==} + + tldts-icann@7.4.13: + resolution: {integrity: sha512-UTJXb538oP4wCyAcAE4RawUjw87qZFJ8BEob++0goalyg40zX5iP7L0mbXx3EnG1jrAsz+WDUAK613MtF0nUPA==} + tldts@6.1.86: resolution: {integrity: sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==} hasBin: true @@ -10438,6 +10737,9 @@ packages: resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} engines: {node: '>= 0.6'} + typed-query-selector@2.12.2: + resolution: {integrity: sha512-EOPFbyIub4ngnEdqi2yOcNeDLaX/0jcE1JoAXQDDMIthap7FoN795lc/SHfIq2d416VufXpM8z/lD+WRm2gfOQ==} + typedoc-plugin-rename-defaults@0.7.3: resolution: {integrity: sha512-fDtrWZ9NcDfdGdlL865GW7uIGQXlthPscURPOhDkKUe4DBQSRRFUf33fhWw41FLlsz8ZTeSxzvvuNmh54MynFA==} peerDependencies: @@ -11009,9 +11311,15 @@ packages: wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + web-features@3.39.0: + resolution: {integrity: sha512-4DgSV2sNjlLMZg1XqaKceUhbKfdUPOXQ63v9XdKOv0EOB4zBIfNh16tvrxlTFAL21HIOxtk2/e+49uBK9WF+xg==} + web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + webdriver-bidi-protocol@0.4.3: + resolution: {integrity: sha512-uuN0goWfxP22B7J/uAgBpOYNPttC+XVseYE+rSY5+rQ+YBeVz/VORw8WbmLVcqW78zNg5A4qnjNXYUWR3il2ig==} + webdriver@9.23.3: resolution: {integrity: sha512-8FdXOhzkxqDI6F1dyIsQONhKLDZ9HPSEwNBnH3bD1cHnj/6nVvyYrUtDPo/+J324BuwOa1IVTH3m8mb3B2hTlA==} engines: {node: '>=18.20.0'} @@ -11058,6 +11366,9 @@ packages: whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + when-exit@2.1.5: + resolution: {integrity: sha512-VGkKJ564kzt6Ms1dbgPP/yuIoQCrsFAnRbptpC5wOEsDaNsbCB2bnfnaA8i/vRs5tjUSEOtIuvl9/MyVsvQZCg==} + which-heading-do-i-need@0.4.1: resolution: {integrity: sha512-NUwKC7rjs6hFqdr6Yu+4Hd9muQEL5XW3QvV8hj/uHSBo8o9FRsWOqArgWcL4IIvUDpS+KCoaRW/8+jHhNL8itQ==} @@ -11164,6 +11475,10 @@ packages: utf-8-validate: optional: true + xdg-basedir@5.1.0: + resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} + engines: {node: '>=12'} + xml-name-validator@5.0.0: resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} engines: {node: '>=18'} @@ -11246,11 +11561,19 @@ packages: resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} engines: {node: '>= 14'} + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} snapshots: + '@11ty/gray-matter@3.0.0': + dependencies: + js-yaml: 5.4.2 + section-matter: 1.0.0 + '@algorithm.ts/base64@3.1.1': {} '@algorithm.ts/huffman@3.1.1': @@ -12872,6 +13195,32 @@ snapshots: '@floating-ui/utils@0.2.10': {} + '@formatjs/ecma402-abstract@2.3.6': + dependencies: + '@formatjs/fast-memoize': 2.2.7 + '@formatjs/intl-localematcher': 0.6.2 + decimal.js: 10.6.0 + tslib: 2.8.1 + + '@formatjs/fast-memoize@2.2.7': + dependencies: + tslib: 2.8.1 + + '@formatjs/icu-messageformat-parser@2.11.4': + dependencies: + '@formatjs/ecma402-abstract': 2.3.6 + '@formatjs/icu-skeleton-parser': 1.8.16 + tslib: 2.8.1 + + '@formatjs/icu-skeleton-parser@1.8.16': + dependencies: + '@formatjs/ecma402-abstract': 2.3.6 + tslib: 2.8.1 + + '@formatjs/intl-localematcher@0.6.2': + dependencies: + tslib: 2.8.1 + '@fortawesome/ember-fontawesome@3.1.0(da372f032e82d3cbc718b59c9210054a)': dependencies: '@embroider/addon-shim': 1.10.3 @@ -13531,6 +13880,49 @@ snapshots: - encoding - utf-8-validate + '@opentelemetry/api-logs@0.220.0': + dependencies: + '@opentelemetry/api': 1.9.1 + + '@opentelemetry/api@1.9.1': {} + + '@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/instrumentation@0.220.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/api-logs': 0.220.0 + import-in-the-middle: 3.5.1 + require-in-the-middle: 8.0.1 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/sdk-trace@2.11.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/semantic-conventions@1.43.0': {} + '@oxc-parser/binding-android-arm-eabi@0.130.0': optional: true @@ -13599,6 +13991,11 @@ snapshots: '@oxc-project/types@0.130.0': {} + '@paulirish/trace_engine@0.0.65': + dependencies: + legacy-javascript: 0.0.1 + third-party-web: 0.30.0 + '@pkgjs/parseargs@0.11.0': optional: true @@ -13637,6 +14034,13 @@ snapshots: - react-native-b4a - supports-color + '@puppeteer/browsers@3.2.2(yauzl@2.10.0)': + dependencies: + modern-tar: 0.8.5 + yargs: 18.0.0 + optionalDependencies: + yauzl: 2.10.0 + '@replit/codemirror-lang-svelte@6.0.0(9467715ca32889163bd7161ba7fdb3d1)': dependencies: '@codemirror/autocomplete': 6.20.0 @@ -13878,6 +14282,53 @@ snapshots: '@sec-ant/readable-stream@0.4.1': {} + '@sentry/conventions@0.16.0': {} + + '@sentry/core@10.75.0': + dependencies: + '@sentry/conventions': 0.16.0 + + '@sentry/node-core@10.75.0(81583a97114c424bf6439443177da499)': + dependencies: + '@sentry/conventions': 0.16.0 + '@sentry/core': 10.75.0 + '@sentry/opentelemetry': 10.75.0(25f3b4faf57df028cc90a1a2e1bd1f2c) + import-in-the-middle: 3.5.1 + optionalDependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.220.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.11.0(@opentelemetry/api@1.9.1) + + '@sentry/node@10.75.0(d60465c5ae177f9050996f83ef69382f)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/instrumentation': 0.220.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.11.0(@opentelemetry/api@1.9.1) + '@sentry/conventions': 0.16.0 + '@sentry/core': 10.75.0 + '@sentry/node-core': 10.75.0(81583a97114c424bf6439443177da499) + '@sentry/opentelemetry': 10.75.0(25f3b4faf57df028cc90a1a2e1bd1f2c) + '@sentry/server-utils': 10.75.0 + import-in-the-middle: 3.5.1 + transitivePeerDependencies: + - '@opentelemetry/core' + - '@opentelemetry/exporter-trace-otlp-http' + - supports-color + + '@sentry/opentelemetry@10.75.0(25f3b4faf57df028cc90a1a2e1bd1f2c)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.11.0(@opentelemetry/api@1.9.1) + '@sentry/conventions': 0.16.0 + '@sentry/core': 10.75.0 + + '@sentry/server-utils@10.75.0': + dependencies: + '@sentry/conventions': 0.16.0 + '@sentry/core': 10.75.0 + '@shikijs/core@1.29.2': dependencies: '@shikijs/engine-javascript': 1.29.2 @@ -14562,25 +15013,25 @@ snapshots: '@vitest/mocker': 4.0.18(1772a17673355c6de89229b7565213b1) playwright: 1.58.1 tinyrainbow: 3.0.3 - vitest: 4.0.18(3d57c6b64fd3206716a3490dcf0e69c2) + vitest: 4.0.18(446ea4e279a9a66486730a97b9063e60) transitivePeerDependencies: - bufferutil - msw - utf-8-validate - vite - '@vitest/browser-webdriverio@4.0.18(ba89de5022e570057ce1898c8cda41df)': + '@vitest/browser-webdriverio@4.0.18(7184be3e6aa2116eef0f175345ed7087)': dependencies: '@vitest/browser': 4.0.18(663bdce66dd0d09e2214e91cffb66647) - vitest: 4.0.18(3d57c6b64fd3206716a3490dcf0e69c2) - webdriverio: 9.23.3 + vitest: 4.0.18(446ea4e279a9a66486730a97b9063e60) + webdriverio: 9.23.3(puppeteer-core@25.11.0(yauzl@2.10.0)) transitivePeerDependencies: - bufferutil - msw - utf-8-validate - vite - '@vitest/browser@3.2.4(b100350c584d5ba61ab8be7ba0064d5f)': + '@vitest/browser@3.2.4(7315f2fd5c0db92efae7ffdf162c8f33)': dependencies: '@testing-library/dom': 10.4.1 '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1) @@ -14593,7 +15044,7 @@ snapshots: ws: 8.19.0 optionalDependencies: playwright: 1.58.1 - webdriverio: 9.23.3 + webdriverio: 9.23.3(puppeteer-core@25.11.0(yauzl@2.10.0)) transitivePeerDependencies: - bufferutil - msw @@ -14601,7 +15052,7 @@ snapshots: - vite optional: true - '@vitest/browser@3.2.4(b30b5bf71eff4051e56920878619eb06)': + '@vitest/browser@3.2.4(a51cb7919ee7f0adaae5b6a2396ea9ce)': dependencies: '@testing-library/dom': 10.4.1 '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1) @@ -14610,11 +15061,11 @@ snapshots: magic-string: 0.30.21 sirv: 3.0.2 tinyrainbow: 2.0.0 - vitest: 4.0.18(3d57c6b64fd3206716a3490dcf0e69c2) + vitest: 4.0.18(446ea4e279a9a66486730a97b9063e60) ws: 8.19.0 optionalDependencies: playwright: 1.58.1 - webdriverio: 9.23.3 + webdriverio: 9.23.3(puppeteer-core@25.11.0(yauzl@2.10.0)) transitivePeerDependencies: - bufferutil - msw @@ -14630,7 +15081,7 @@ snapshots: pngjs: 7.0.0 sirv: 3.0.2 tinyrainbow: 3.0.3 - vitest: 4.0.18(3d57c6b64fd3206716a3490dcf0e69c2) + vitest: 4.0.18(446ea4e279a9a66486730a97b9063e60) ws: 8.19.0 transitivePeerDependencies: - bufferutil @@ -14745,7 +15196,7 @@ snapshots: sirv: 3.0.2 tinyglobby: 0.2.15 tinyrainbow: 2.0.0 - vitest: 4.0.18(3d57c6b64fd3206716a3490dcf0e69c2) + vitest: 4.0.18(446ea4e279a9a66486730a97b9063e60) '@vitest/utils@3.2.4': dependencies: @@ -15152,6 +15603,11 @@ snapshots: at-least-node@1.0.0: {} + atomically@2.1.1: + dependencies: + stubborn-fs: 2.0.0 + when-exit: 2.1.5 + autoprefixer@10.4.23(postcss@8.5.9): dependencies: browserslist: 4.28.2 @@ -15161,6 +15617,8 @@ snapshots: postcss: 8.5.9 postcss-value-parser: 4.2.0 + axe-core@4.13.0: {} + axios@1.13.4(debug@4.4.3): dependencies: follow-redirects: 1.15.11(debug@4.4.3) @@ -15835,8 +16293,25 @@ snapshots: chownr@2.0.0: {} + chrome-launcher@1.2.1: + dependencies: + '@types/node': 24.10.9 + escape-string-regexp: 4.0.0 + is-wsl: 2.2.0 + lighthouse-logger: 2.0.2 + transitivePeerDependencies: + - supports-color + + chromium-bidi@17.0.2(devtools-protocol@0.0.1680125): + dependencies: + devtools-protocol: 0.0.1680125 + mitt: 3.0.1 + zod: 3.25.76 + cjs-module-lexer@1.4.3: {} + cjs-module-lexer@2.2.1: {} + clean-stack@2.2.0: {} clean-up-path@1.0.0: {} @@ -16066,6 +16541,13 @@ snapshots: ini: 1.3.8 proto-list: 1.2.4 + configstore@7.1.0: + dependencies: + atomically: 2.1.1 + dot-prop: 9.0.0 + graceful-fs: 4.2.11 + xdg-basedir: 5.1.0 + connect@3.7.0: dependencies: debug: 2.6.9 @@ -16169,6 +16651,8 @@ snapshots: dependencies: '@types/node': 17.0.45 + csp_evaluator@1.1.8: {} + css-select@5.2.2: dependencies: boolbase: 1.0.0 @@ -16435,6 +16919,8 @@ snapshots: dependencies: clone: 1.0.4 + define-lazy-prop@2.0.0: {} + degenerator@5.0.1: dependencies: ast-types: 0.13.4 @@ -16465,6 +16951,10 @@ snapshots: dependencies: dequal: 2.0.3 + devtools-protocol@0.0.1663043: {} + + devtools-protocol@0.0.1680125: {} + didyoumean@1.2.2: {} diff@5.2.2: {} @@ -16518,6 +17008,10 @@ snapshots: no-case: 3.0.4 tslib: 2.8.1 + dot-prop@9.0.0: + dependencies: + type-fest: 4.41.0 + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -17033,6 +17527,11 @@ snapshots: graceful-fs: 4.2.11 tapable: 2.3.0 + enquirer@2.4.1: + dependencies: + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 + ensure-posix-path@1.1.1: {} entities@4.5.0: {} @@ -17059,6 +17558,8 @@ snapshots: es-module-lexer@1.7.0: {} + es-module-lexer@3.0.2: {} + es-module-shims@2.8.0: {} es-object-atoms@1.1.1: @@ -17556,6 +18057,10 @@ snapshots: exsolve@1.0.8: {} + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 + extend@3.0.2: {} external-editor@3.1.0: @@ -17618,6 +18123,10 @@ snapshots: dependencies: reusify: 1.1.0 + fault@2.0.1: + dependencies: + format: 0.2.2 + fb-watchman@2.0.2: dependencies: bser: 2.1.1 @@ -17751,6 +18260,8 @@ snapshots: hasown: '@nolyfill/hasown@1.0.44' mime-types: 2.1.35 + format@0.2.2: {} + forwarded@0.2.0: {} fractal-page-object@1.0.0: @@ -18259,6 +18770,8 @@ snapshots: statuses: 2.0.2 toidentifier: 1.0.1 + http-link-header@1.1.4: {} + http-proxy-agent@4.0.1: dependencies: '@tootallnate/once': 1.1.2 @@ -18324,6 +18837,8 @@ snapshots: ignore@7.0.5: {} + image-ssim@0.2.0: {} + immediate@3.0.6: {} import-fresh@3.3.1: @@ -18331,6 +18846,12 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 + import-in-the-middle@3.5.1: + dependencies: + cjs-module-lexer: 2.2.1 + es-module-lexer: 3.0.2 + module-details-from-path: 1.0.4 + import-lazy@4.0.0: {} import-meta-resolve@4.2.0: {} @@ -18376,6 +18897,13 @@ snapshots: internmap@2.0.3: {} + intl-messageformat@10.7.18: + dependencies: + '@formatjs/ecma402-abstract': 2.3.6 + '@formatjs/fast-memoize': 2.2.7 + '@formatjs/icu-messageformat-parser': 2.11.4 + tslib: 2.8.1 + ip-address@10.1.0: {} ipaddr.js@1.9.1: {} @@ -18392,6 +18920,8 @@ snapshots: is-docker@2.2.1: {} + is-extendable@0.1.1: {} + is-extglob@2.1.1: {} is-fullwidth-code-point@2.0.0: {} @@ -18499,6 +19029,10 @@ snapshots: jju@1.4.0: {} + jpeg-js@0.4.4: {} + + js-library-detector@6.7.0: {} + js-string-escape@1.0.1: {} js-tokens@10.0.0: @@ -18512,6 +19046,10 @@ snapshots: dependencies: argparse: 2.0.1 + js-yaml@5.4.2: + dependencies: + argparse: 2.0.1 + jsdom@25.0.1: dependencies: cssstyle: 4.6.0 @@ -18620,10 +19158,12 @@ snapshots: khroma@2.1.0: {} - kolay@https://codeload.github.com/universal-ember/kolay/tar.gz/85af138408a81c687230c170615b187281509e8d(e0e66335631b66baaed2daf43460943a): + kind-of@6.0.3: {} + + kolay@https://codeload.github.com/universal-ember/kolay/tar.gz/7ed158039563f4a74d5f3e718f356fac7a1d81b4(e0e66335631b66baaed2daf43460943a): dependencies: + '@11ty/gray-matter': 3.0.0 '@ember/test-waiters': 4.1.2 - '@embroider/addon-shim': 1.10.3 '@glimmer/component': 2.1.1 '@glint/template': 1.8.0 change-case: 5.4.4 @@ -18641,6 +19181,7 @@ snapshots: reactiveweb: 1.9.1(d41a7bae60c14a4edce62c2c55c80806) rehype-raw: 7.0.0 rehype-stringify: 10.0.1 + remark-frontmatter: 5.0.0 remark-gfm: 4.0.1 remark-parse: 11.0.0 remark-rehype: 11.1.2 @@ -18689,6 +19230,8 @@ snapshots: dependencies: readable-stream: 2.3.8 + legacy-javascript@0.0.1: {} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -18707,6 +19250,52 @@ snapshots: dependencies: immediate: 3.0.6 + lighthouse-logger@2.0.2: + dependencies: + debug: 4.4.3(supports-color@8.1.1) + marky: 1.3.0 + transitivePeerDependencies: + - supports-color + + lighthouse-stack-packs@1.12.3: {} + + lighthouse@13.4.1(bf1be25639b6a2b409596eef25a15c72): + dependencies: + '@paulirish/trace_engine': 0.0.65 + '@sentry/node': 10.75.0(d60465c5ae177f9050996f83ef69382f) + axe-core: 4.13.0 + chrome-launcher: 1.2.1 + configstore: 7.1.0 + csp_evaluator: 1.1.8 + devtools-protocol: 0.0.1663043 + enquirer: 2.4.1 + http-link-header: 1.1.4 + intl-messageformat: 10.7.18 + jpeg-js: 0.4.4 + js-library-detector: 6.7.0 + lighthouse-logger: 2.0.2 + lighthouse-stack-packs: 1.12.3 + lodash-es: 4.18.1 + lookup-closest-locale: 6.2.0 + open: 8.4.2 + puppeteer-core: 25.11.0(yauzl@2.10.0) + robots-parser: 3.0.1 + speedline-core: 1.4.3 + third-party-web: 0.29.2 + tldts-icann: 7.4.13 + web-features: 3.39.0 + ws: 7.5.10 + yargs: 17.7.2 + yargs-parser: 21.1.1 + transitivePeerDependencies: + - '@opentelemetry/core' + - '@opentelemetry/exporter-trace-otlp-http' + - bufferutil + - proxy-agent + - supports-color + - utf-8-validate + - yauzl + lightningcss-android-arm64@1.32.0: optional: true @@ -18832,6 +19421,8 @@ snapshots: longest-streak@3.1.0: {} + lookup-closest-locale@6.2.0: {} + loupe@3.2.1: {} lower-case@2.0.2: @@ -18920,6 +19511,8 @@ snapshots: marked@9.1.6: {} + marky@1.3.0: {} + matcher-collection@1.1.2: dependencies: minimatch: 3.1.5 @@ -18957,6 +19550,17 @@ snapshots: transitivePeerDependencies: - supports-color + mdast-util-frontmatter@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + escape-string-regexp: 5.0.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + micromark-extension-frontmatter: 2.0.0 + transitivePeerDependencies: + - supports-color + mdast-util-gfm-autolink-literal@2.0.1: dependencies: '@types/mdast': 4.0.4 @@ -19122,6 +19726,13 @@ snapshots: micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 + micromark-extension-frontmatter@2.0.0: + dependencies: + fault: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + micromark-extension-gfm-autolink-literal@2.1.0: dependencies: micromark-util-character: 2.1.1 @@ -19462,6 +20073,10 @@ snapshots: modern-tar@0.7.3: {} + modern-tar@0.8.5: {} + + module-details-from-path@1.0.4: {} + mri@1.2.0: {} mrmime@2.0.1: {} @@ -19634,6 +20249,12 @@ snapshots: onp@2.0.4: {} + open@8.4.2: + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -20050,6 +20671,20 @@ snapshots: punycode@2.3.1: {} + puppeteer-core@25.11.0(yauzl@2.10.0): + dependencies: + '@puppeteer/browsers': 3.2.2(yauzl@2.10.0) + chromium-bidi: 17.0.2(devtools-protocol@0.0.1680125) + devtools-protocol: 0.0.1680125 + typed-query-selector: 2.12.2 + webdriver-bidi-protocol: 0.4.3 + ws: 8.21.3 + transitivePeerDependencies: + - bufferutil + - proxy-agent + - utf-8-validate + - yauzl + qs@6.14.1: dependencies: side-channel: '@nolyfill/side-channel@1.0.44' @@ -20275,6 +20910,15 @@ snapshots: - bluebird - supports-color + remark-frontmatter@5.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-frontmatter: 2.0.1 + micromark-extension-frontmatter: 2.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + remark-gfm@4.0.1: dependencies: '@types/mdast': 4.0.4 @@ -20388,6 +21032,13 @@ snapshots: require-from-string@2.0.2: {} + require-in-the-middle@8.0.1: + dependencies: + debug: 4.4.3(supports-color@8.1.1) + module-details-from-path: 1.0.4 + transitivePeerDependencies: + - supports-color + requireindex@1.2.0: {} requires-port@1.0.0: {} @@ -20476,6 +21127,8 @@ snapshots: glob: 13.0.6 package-json-from-dist: 1.0.1 + robots-parser@3.0.1: {} + robust-predicates@3.0.3: {} rolldown@1.0.0-rc.15: @@ -20668,6 +21321,11 @@ snapshots: scheduler@0.27.0: {} + section-matter@1.0.0: + dependencies: + extend-shallow: 2.0.1 + kind-of: 6.0.3 + selenium-webdriver@4.40.0: dependencies: '@bazel/runfiles': 6.5.0 @@ -20913,6 +21571,12 @@ snapshots: spdx-license-ids@3.0.23: {} + speedline-core@1.4.3: + dependencies: + '@types/node': 24.10.9 + image-ssim: 0.2.0 + jpeg-js: 0.4.4 + split2@4.2.0: {} sprintf-js@1.0.3: {} @@ -21024,6 +21688,12 @@ snapshots: strnum@2.1.2: {} + stubborn-fs@2.0.0: + dependencies: + stubborn-utils: 1.0.2 + + stubborn-utils@1.0.2: {} + style-mod@4.1.3: {} styled_string@0.0.1: {} @@ -21345,6 +22015,10 @@ snapshots: dependencies: any-promise: 1.3.0 + third-party-web@0.29.2: {} + + third-party-web@0.30.0: {} + through2@3.0.2: dependencies: inherits: 2.0.4 @@ -21380,6 +22054,12 @@ snapshots: tldts-core@6.1.86: {} + tldts-core@7.4.13: {} + + tldts-icann@7.4.13: + dependencies: + tldts-core: 7.4.13 + tldts@6.1.86: dependencies: tldts-core: 6.1.86 @@ -21541,6 +22221,8 @@ snapshots: media-typer: 1.1.0 mime-types: 3.0.2 + typed-query-selector@2.12.2: {} + typedoc-plugin-rename-defaults@0.7.3(typedoc@0.28.20(typescript@5.9.3)): dependencies: camelcase: 8.0.0 @@ -21931,7 +22613,7 @@ snapshots: optionalDependencies: '@types/debug': 4.1.12 '@types/node': 24.10.9 - '@vitest/browser': 3.2.4(b100350c584d5ba61ab8be7ba0064d5f) + '@vitest/browser': 3.2.4(7315f2fd5c0db92efae7ffdf162c8f33) '@vitest/ui': 3.2.4(vitest@3.2.4) happy-dom: 20.8.9 jsdom: 26.1.0 @@ -21949,7 +22631,7 @@ snapshots: - tsx - yaml - vitest@4.0.18(3d57c6b64fd3206716a3490dcf0e69c2): + vitest@4.0.18(446ea4e279a9a66486730a97b9063e60): dependencies: '@vitest/expect': 4.0.18 '@vitest/mocker': 4.0.18(bc8d41c8258c133aa92f64215a633c5c) @@ -21972,9 +22654,10 @@ snapshots: vite: 7.3.1(f51bab222b32c0df0f9838c32af47ee9) why-is-node-running: 2.3.0 optionalDependencies: + '@opentelemetry/api': 1.9.1 '@types/node': 24.10.9 '@vitest/browser-playwright': 4.0.18(604ccac0b01bbfd2452f9540b6beecc7) - '@vitest/browser-webdriverio': 4.0.18(ba89de5022e570057ce1898c8cda41df) + '@vitest/browser-webdriverio': 4.0.18(7184be3e6aa2116eef0f175345ed7087) '@vitest/ui': 3.2.4(vitest@4.0.18) happy-dom: 20.8.9 jsdom: 26.1.0 @@ -22122,8 +22805,12 @@ snapshots: dependencies: defaults: 1.0.4 + web-features@3.39.0: {} + web-namespaces@2.0.1: {} + webdriver-bidi-protocol@0.4.3: {} + webdriver@9.23.3: dependencies: '@types/node': 20.19.30 @@ -22145,7 +22832,7 @@ snapshots: - supports-color - utf-8-validate - webdriverio@9.23.3: + webdriverio@9.23.3(puppeteer-core@25.11.0(yauzl@2.10.0)): dependencies: '@types/node': 20.19.30 '@types/sinonjs__fake-timers': 8.1.5 @@ -22172,6 +22859,8 @@ snapshots: serialize-error: 12.0.0 urlpattern-polyfill: 10.1.0 webdriver: 9.23.3 + optionalDependencies: + puppeteer-core: 25.11.0(yauzl@2.10.0) transitivePeerDependencies: - bare-abort-controller - bare-buffer @@ -22206,6 +22895,8 @@ snapshots: tr46: 0.0.3 webidl-conversions: 3.0.1 + when-exit@2.1.5: {} + which-heading-do-i-need@0.4.1: {} which@1.3.1: @@ -22273,6 +22964,8 @@ snapshots: ws@8.21.3: {} + xdg-basedir@5.1.0: {} + xml-name-validator@5.0.0: {} xmlchars@2.2.0: {} @@ -22352,4 +23045,6 @@ snapshots: compress-commons: 6.0.2 readable-stream: 4.7.0 + zod@3.25.76: {} + zwitch@2.0.4: {}