From e2eebbb15b52402da7fe922a654d8ca0c0ccf134 Mon Sep 17 00:00:00 2001 From: Will Binns-Smith Date: Wed, 25 Oct 2023 17:56:26 -0700 Subject: [PATCH 1/4] Devlow: refactor browser.ts - Resolves many lint errors - Handles timeouts more gracefully and resolves with offset - Correctly logs outstanding requests on timeouts - Logs when untracked requests are completed - Upgrades playwright --- packages/devlow-bench/package.json | 2 +- packages/devlow-bench/src/browser.ts | 118 ++++-- pnpm-lock.yaml | 543 ++++++++++++++++++++------- 3 files changed, 485 insertions(+), 178 deletions(-) diff --git a/packages/devlow-bench/package.json b/packages/devlow-bench/package.json index 554a52673b2bf..84c23e739d585 100644 --- a/packages/devlow-bench/package.json +++ b/packages/devlow-bench/package.json @@ -39,7 +39,7 @@ "inquirer": "^9.2.7", "minimist": "^1.2.8", "pidusage-tree": "^2.0.5", - "playwright-chromium": "^1.35.0", + "playwright-chromium": "^1.39.0", "split2": "^4.2.0", "tree-kill": "^1.2.2" } diff --git a/packages/devlow-bench/src/browser.ts b/packages/devlow-bench/src/browser.ts index 6f2cc56008e1f..2ab806359b9f1 100644 --- a/packages/devlow-bench/src/browser.ts +++ b/packages/devlow-bench/src/browser.ts @@ -16,14 +16,14 @@ interface BrowserSession { reload(metricName: string): Promise; } -const browserOutput = !!process.env.BROWSER_OUTPUT; +const browserOutput = Boolean(process.env.BROWSER_OUTPUT); async function withRequestMetrics( metricName: string, page: Page, fn: () => Promise ): Promise { - const activePromises: Promise[] = []; + const activePromises: Array> = []; const sizeByExtension = new Map(); const requestsByExtension = new Map(); const responseHandler = (response: Response) => { @@ -32,14 +32,17 @@ async function withRequestMetrics( const url = response.request().url(); const status = response.status(); const extension = - /^[^\?#]+\.([a-z0-9]+)(?:[\?#]|$)/i.exec(url)?.[1] ?? "none"; + // eslint-disable-next-line prefer-named-capture-group -- TODO: address lint + /^[^?#]+\.([a-z0-9]+)(?:[?#]|$)/i.exec(url)?.[1] ?? "none"; const currentRequests = requestsByExtension.get(extension) ?? 0; requestsByExtension.set(extension, currentRequests + 1); if (status >= 200 && status < 300) { let body; try { body = await response.body(); - } catch {} + } catch { + // empty + } if (body) { const size = body.length; const current = sizeByExtension.get(extension) ?? 0; @@ -145,12 +148,19 @@ async function withRequestMetrics( } } +/** + * Waits until network requests have all been resolved + * @param page - Playwright page object + * @param delayMs - Amount of time in ms to wait after the last request resolves before cleaning up + * @param timeoutMs - Amount of time to wait before continuing. In case of timeout, this function resolves + * @returns + */ function networkIdle( page: Page, - delay: number = 300, - rejectTimeout: number = 180000 -) { - return new Promise((resolve, reject) => { + delayMs = 300, + timeoutMs = 180000 +): Promise { + return new Promise((resolve) => { const cleanup = () => { page.off("request", requestHandler); page.off("requestfailed", requestFinishedHandler); @@ -160,50 +170,71 @@ function networkIdle( clearTimeout(timeout); } }; - let activeRequests = 0; + + const requests = new Map(); + const start = Date.now(); + let lastRequest: number; let timeout: NodeJS.Timeout | null = null; - const requests = new Set(); + const fullTimeout = setTimeout(() => { cleanup(); - reject( - new Error( - `Timeout while waiting for network idle. These requests are still pending: ${Array.from( - requests - ).join(", ")}}` - ) + // eslint-disable-next-line no-console -- logging + console.error( + `Timeout while waiting for network idle. These requests are still pending: ${Array.from( + requests + ).join(", ")}} time is ${lastRequest - start}` ); - }, rejectTimeout); - const requestFilter = async (request: Request) => { - return (await request.headers().accept) !== "text/event-stream"; + resolve(lastRequest - start); + }, timeoutMs); + + const requestFilter = (request: Request) => { + return request.headers().accept !== "text/event-stream"; }; - const requestHandler = async (request: Request) => { - requests.add(request.url()); - activeRequests++; + + const requestHandler = (request: Request) => { + requests.set(request.url(), (requests.get(request.url()) ?? 0) + 1); if (timeout) { clearTimeout(timeout); timeout = null; } // Avoid tracking some requests, but we only know this after awaiting // so we need to do this weird stunt to ensure that - if (!(await requestFilter(request))) { - await requestFinishedInternal(request); + if (!requestFilter(request)) { + requestFinishedInternal(request); } }; - const requestFinishedHandler = async (request: Request) => { - if (await requestFilter(request)) { + + const requestFinishedHandler = (request: Request) => { + if (requestFilter(request)) { requestFinishedInternal(request); } }; - const requestFinishedInternal = async (request: Request) => { - requests.delete(request.url()); - activeRequests--; - if (activeRequests === 0) { + + const requestFinishedInternal = (request: Request) => { + lastRequest = Date.now(); + const currentCount = requests.get(request.url()); + if (currentCount === undefined) { + // eslint-disable-next-line no-console -- basic logging + console.error( + `Unexpected untracked but completed request ${request.url()}` + ); + return; + } + + if (currentCount === 1) { + requests.delete(request.url()); + } else { + requests.set(request.url(), currentCount - 1); + } + + if (requests.size === 0) { timeout = setTimeout(() => { cleanup(); - resolve(); - }, delay); + resolve(lastRequest - start); + }, delayMs); } }; + page.on("request", requestHandler); page.on("requestfailed", requestFinishedHandler); page.on("requestfinished", requestFinishedHandler); @@ -229,8 +260,11 @@ class BrowserSessionImpl implements BrowserSession { } async hardNavigation(metricName: string, url: string) { - const page = (this.page = this.page ?? (await this.context.newPage())); + this.page = this.page ?? (await this.context.newPage()); + + const page = this.page; await withRequestMetrics(metricName, page, async () => { + /* eslint-disable @typescript-eslint/no-floating-promises -- don't wait for reporting */ measureTime(`${metricName}/start`); const idle = networkIdle(page, 3000); await page.goto(url, { @@ -247,11 +281,12 @@ class BrowserSessionImpl implements BrowserSession { measureTime(`${metricName}/load`, { relativeTo: `${metricName}/start`, }); - await idle; + const offset = await idle; measureTime(`${metricName}`, { - offset: 3000, + offset, relativeTo: `${metricName}/start`, }); + /* eslint-enable @typescript-eslint/no-floating-promises -- don't wait for reporting */ }); return page; } @@ -264,10 +299,13 @@ class BrowserSessionImpl implements BrowserSession { ); } await withRequestMetrics(metricName, page, async () => { + /* eslint-disable @typescript-eslint/no-floating-promises -- don't wait for reporting */ measureTime(`${metricName}/start`); - const firstResponse = new Promise((resolve) => - page.once("response", () => resolve()) - ); + const firstResponse = new Promise((resolve) => { + page.once("response", () => { + resolve(); + }); + }); const idle = networkIdle(page, 3000); await page.click(selector); await firstResponse; @@ -279,6 +317,7 @@ class BrowserSessionImpl implements BrowserSession { offset: 3000, relativeTo: `${metricName}/start`, }); + /* eslint-enable @typescript-eslint/no-floating-promises -- don't wait for reporting */ }); } @@ -288,6 +327,7 @@ class BrowserSessionImpl implements BrowserSession { throw new Error("reload() must be called after hardNavigation()"); } await withRequestMetrics(metricName, page, async () => { + /* eslint-disable @typescript-eslint/no-floating-promises -- don't wait for reporting */ measureTime(`${metricName}/start`); const idle = networkIdle(page, 3000); await page.reload({ @@ -309,6 +349,7 @@ class BrowserSessionImpl implements BrowserSession { offset: 3000, relativeTo: `${metricName}/start`, }); + /* eslint-enable @typescript-eslint/no-floating-promises -- don't wait for reporting */ }); } } @@ -320,6 +361,7 @@ export async function newBrowserSession(options: { }): Promise { const browser = await chromium.launch({ headless: options.headless ?? process.env.HEADLESS !== "false", + devtools: true, timeout: 60000, }); const context = await browser.newContext({ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f30440e2a771f..c9cfd95452713 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -221,7 +221,7 @@ importers: version: 18.2.0(react@18.2.0) styled-jsx: specifier: ^5.1.2 - version: 5.1.2(@babel/core@7.20.12)(react@18.2.0) + version: 5.1.2(@babel/core@7.23.2)(react@18.2.0) docs: dependencies: @@ -521,7 +521,7 @@ importers: version: 27.5.1(ts-node@10.9.1) ts-jest: specifier: ^27.1.1 - version: 27.1.5(@babel/core@7.20.12)(@types/jest@27.5.2)(esbuild@0.17.18)(jest@27.5.1)(typescript@5.2.2) + version: 27.1.5(@babel/core@7.23.2)(@types/jest@27.5.2)(esbuild@0.17.18)(jest@27.5.1)(typescript@5.2.2) tsup: specifier: ^6.7.0 version: 6.7.0(typescript@5.2.2) @@ -547,8 +547,8 @@ importers: specifier: ^2.0.5 version: 2.0.5 playwright-chromium: - specifier: ^1.35.0 - version: 1.35.0 + specifier: ^1.39.0 + version: 1.39.0 split2: specifier: ^4.2.0 version: 4.2.0 @@ -576,7 +576,7 @@ importers: devDependencies: '@vercel/style-guide': specifier: ^5.0.0 - version: 5.0.0(eslint@8.48.0)(prettier@2.8.7)(typescript@4.9.4) + version: 5.0.0(eslint@8.52.0)(prettier@2.8.7)(typescript@5.2.2) packages/eslint-config-turbo: dependencies: @@ -638,7 +638,7 @@ importers: version: 2.2.3 ts-jest: specifier: ^27.1.1 - version: 27.1.5(@babel/core@7.20.12)(@types/jest@27.5.2)(esbuild@0.17.18)(jest@27.5.1)(typescript@4.9.4) + version: 27.1.5(@babel/core@7.23.2)(@types/jest@27.5.2)(esbuild@0.17.18)(jest@27.5.1)(typescript@4.9.4) tsup: specifier: ^6.2.0 version: 6.7.0(ts-node@10.9.1)(typescript@4.9.4) @@ -751,7 +751,7 @@ importers: version: 3.1.1 ts-jest: specifier: ^27.1.1 - version: 27.1.5(@babel/core@7.20.12)(@types/jest@27.5.2)(esbuild@0.17.18)(jest@27.5.1)(typescript@4.9.4) + version: 27.1.5(@babel/core@7.23.2)(@types/jest@27.5.2)(esbuild@0.17.18)(jest@27.5.1)(typescript@4.9.4) tsup: specifier: ^6.7.0 version: 6.7.0(ts-node@10.9.1)(typescript@4.9.4) @@ -827,7 +827,7 @@ importers: version: 27.5.1(ts-node@10.9.1) ts-jest: specifier: ^27.1.1 - version: 27.1.5(@babel/core@7.20.12)(@types/jest@27.5.2)(esbuild@0.17.18)(jest@27.5.1)(typescript@4.9.4) + version: 27.1.5(@babel/core@7.23.2)(@types/jest@27.5.2)(esbuild@0.17.18)(jest@27.5.1)(typescript@4.9.4) tsup: specifier: ^6.7.0 version: 6.7.0(ts-node@10.9.1)(typescript@4.9.4) @@ -866,7 +866,7 @@ importers: version: 27.5.1(ts-node@10.9.1) ts-jest: specifier: ^27.1.1 - version: 27.1.5(@babel/core@7.20.12)(@types/jest@27.5.2)(esbuild@0.14.49)(jest@27.5.1)(typescript@4.9.4) + version: 27.1.5(@babel/core@7.23.2)(@types/jest@27.5.2)(esbuild@0.14.49)(jest@27.5.1)(typescript@4.9.4) tsup: specifier: ^5.12.1 version: 5.12.9(typescript@4.9.4) @@ -930,7 +930,7 @@ importers: version: 27.5.1(ts-node@10.9.1) ts-jest: specifier: ^27.1.1 - version: 27.1.5(@babel/core@7.20.12)(@types/jest@27.5.2)(esbuild@0.14.49)(jest@27.5.1)(typescript@4.9.4) + version: 27.1.5(@babel/core@7.23.2)(@types/jest@27.5.2)(esbuild@0.14.49)(jest@27.5.1)(typescript@4.9.4) typescript: specifier: ^4.7.4 version: 4.9.4 @@ -1062,7 +1062,7 @@ importers: version: 6.1.13 ts-jest: specifier: ^27.1.1 - version: 27.1.5(@babel/core@7.20.12)(@types/jest@27.5.2)(esbuild@0.14.49)(jest@27.5.1)(typescript@4.9.4) + version: 27.1.5(@babel/core@7.23.2)(@types/jest@27.5.2)(esbuild@0.14.49)(jest@27.5.1)(typescript@4.9.4) tsup: specifier: ^5.12.1 version: 5.12.9(typescript@4.9.4) @@ -1156,7 +1156,7 @@ importers: version: 6.0.1 ts-jest: specifier: ^27.1.1 - version: 27.1.5(@babel/core@7.20.12)(@types/jest@27.5.2)(esbuild@0.14.49)(jest@27.5.1)(typescript@4.9.4) + version: 27.1.5(@babel/core@7.23.2)(@types/jest@27.5.2)(esbuild@0.14.49)(jest@27.5.1)(typescript@4.9.4) tsup: specifier: ^5.10.3 version: 5.12.9(typescript@4.9.4) @@ -1272,6 +1272,13 @@ packages: '@jridgewell/gen-mapping': 0.1.1 '@jridgewell/trace-mapping': 0.3.17 + /@ampproject/remapping@2.2.1: + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.20 + /@babel/code-frame@7.18.6: resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} engines: {node: '>=6.9.0'} @@ -1284,7 +1291,6 @@ packages: dependencies: '@babel/highlight': 7.22.13 chalk: 2.4.2 - dev: true /@babel/compat-data@7.20.5: resolution: {integrity: sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g==} @@ -1295,6 +1301,10 @@ packages: engines: {node: '>=6.9.0'} dev: true + /@babel/compat-data@7.23.2: + resolution: {integrity: sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==} + engines: {node: '>=6.9.0'} + /@babel/core@7.20.12: resolution: {integrity: sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==} engines: {node: '>=6.9.0'} @@ -1340,7 +1350,29 @@ packages: - supports-color dev: true - /@babel/eslint-parser@7.22.11(@babel/core@7.22.11)(eslint@8.48.0): + /@babel/core@7.23.2: + resolution: {integrity: sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.23.0 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) + '@babel/helpers': 7.23.2 + '@babel/parser': 7.23.0 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.2 + '@babel/types': 7.23.0 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + /@babel/eslint-parser@7.22.11(@babel/core@7.22.11)(eslint@8.52.0): resolution: {integrity: sha512-YjOYZ3j7TjV8OhLW6NCtyg8G04uStATEUe5eiLuCZaXz2VSDQ3dsAtm2D+TuQyAqNMUK2WacGo0/uma9Pein1w==} engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} peerDependencies: @@ -1349,7 +1381,7 @@ packages: dependencies: '@babel/core': 7.22.11 '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 - eslint: 8.48.0 + eslint: 8.52.0 eslint-visitor-keys: 2.1.0 semver: 6.3.1 dev: true @@ -1373,6 +1405,15 @@ packages: jsesc: 2.5.2 dev: true + /@babel/generator@7.23.0: + resolution: {integrity: sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.20 + jsesc: 2.5.2 + /@babel/helper-compilation-targets@7.20.7(@babel/core@7.20.12): resolution: {integrity: sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==} engines: {node: '>=6.9.0'} @@ -1397,10 +1438,24 @@ packages: semver: 6.3.1 dev: true + /@babel/helper-compilation-targets@7.22.15: + resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.23.2 + '@babel/helper-validator-option': 7.22.15 + browserslist: 4.22.1 + lru-cache: 5.1.1 + semver: 6.3.1 + /@babel/helper-environment-visitor@7.18.9: resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} engines: {node: '>=6.9.0'} + /@babel/helper-environment-visitor@7.22.20: + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + /@babel/helper-environment-visitor@7.22.5: resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} engines: {node: '>=6.9.0'} @@ -1421,6 +1476,13 @@ packages: '@babel/types': 7.22.11 dev: true + /@babel/helper-function-name@7.23.0: + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/types': 7.23.0 + /@babel/helper-hoist-variables@7.18.6: resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} engines: {node: '>=6.9.0'} @@ -1432,7 +1494,6 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.22.11 - dev: true /@babel/helper-module-imports@7.18.6: resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} @@ -1440,6 +1501,12 @@ packages: dependencies: '@babel/types': 7.21.2 + /@babel/helper-module-imports@7.22.15: + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + /@babel/helper-module-imports@7.22.5: resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} engines: {node: '>=6.9.0'} @@ -1476,6 +1543,19 @@ packages: '@babel/helper-validator-identifier': 7.22.5 dev: true + /@babel/helper-module-transforms@7.23.0(@babel/core@7.23.2): + resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + /@babel/helper-plugin-utils@7.22.5: resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} engines: {node: '>=6.9.0'} @@ -1491,7 +1571,6 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.22.11 - dev: true /@babel/helper-split-export-declaration@7.18.6: resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} @@ -1504,7 +1583,6 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.22.11 - dev: true /@babel/helper-string-parser@7.19.4: resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} @@ -1513,21 +1591,27 @@ packages: /@babel/helper-string-parser@7.22.5: resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} engines: {node: '>=6.9.0'} - dev: true /@babel/helper-validator-identifier@7.19.1: resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} engines: {node: '>=6.9.0'} + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + /@babel/helper-validator-identifier@7.22.5: resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} engines: {node: '>=6.9.0'} - dev: true /@babel/helper-validator-option@7.21.0: resolution: {integrity: sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==} engines: {node: '>=6.9.0'} + /@babel/helper-validator-option@7.22.15: + resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} + engines: {node: '>=6.9.0'} + /@babel/helper-validator-option@7.22.5: resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} engines: {node: '>=6.9.0'} @@ -1554,6 +1638,16 @@ packages: - supports-color dev: true + /@babel/helpers@7.23.2: + resolution: {integrity: sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.2 + '@babel/types': 7.23.0 + transitivePeerDependencies: + - supports-color + /@babel/highlight@7.18.6: resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} engines: {node: '>=6.9.0'} @@ -1569,7 +1663,6 @@ packages: '@babel/helper-validator-identifier': 7.22.5 chalk: 2.4.2 js-tokens: 4.0.0 - dev: true /@babel/parser@7.21.2: resolution: {integrity: sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ==} @@ -1586,6 +1679,13 @@ packages: '@babel/types': 7.22.11 dev: true + /@babel/parser@7.23.0: + resolution: {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.23.0 + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.20.12): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: @@ -1730,6 +1830,14 @@ packages: '@babel/parser': 7.21.2 '@babel/types': 7.21.2 + /@babel/template@7.22.15: + resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 + /@babel/template@7.22.5: resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} engines: {node: '>=6.9.0'} @@ -1774,6 +1882,23 @@ packages: - supports-color dev: true + /@babel/traverse@7.23.2: + resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.23.0 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + /@babel/types@7.21.2: resolution: {integrity: sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==} engines: {node: '>=6.9.0'} @@ -1789,7 +1914,14 @@ packages: '@babel/helper-string-parser': 7.22.5 '@babel/helper-validator-identifier': 7.22.5 to-fast-properties: 2.0.0 - dev: true + + /@babel/types@7.23.0: + resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 /@bcoe/v8-coverage@0.2.3: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} @@ -2064,6 +2196,21 @@ packages: eslint-visitor-keys: 3.4.3 dev: true + /@eslint-community/eslint-utils@4.4.0(eslint@8.52.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.52.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@eslint-community/regexpp@4.10.0: + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + /@eslint-community/regexpp@4.6.2: resolution: {integrity: sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} @@ -2094,6 +2241,11 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true + /@eslint/js@8.52.0: + resolution: {integrity: sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + /@headlessui/react@1.7.14(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-znzdq9PG8rkwcu9oQ2FwIy0ZFtP9Z7ycS+BAqJ3R5EIqC/0bJGvhT7193rFf+45i9nnPsYvCQVW4V/bB9Xc+gA==} engines: {node: '>=10'} @@ -2124,6 +2276,17 @@ packages: transitivePeerDependencies: - supports-color + /@humanwhocodes/config-array@0.11.13: + resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 2.0.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + /@humanwhocodes/module-importer@1.0.1: resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} @@ -2131,6 +2294,10 @@ packages: /@humanwhocodes/object-schema@1.2.1: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + /@humanwhocodes/object-schema@2.0.1: + resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} + dev: true + /@isaacs/cliui@8.0.2: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -2487,10 +2654,22 @@ packages: '@jridgewell/sourcemap-codec': 1.4.14 '@jridgewell/trace-mapping': 0.3.17 + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.20 + /@jridgewell/resolve-uri@3.1.0: resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} engines: {node: '>=6.0.0'} + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + /@jridgewell/set-array@1.1.2: resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} engines: {node: '>=6.0.0'} @@ -2505,12 +2684,21 @@ packages: /@jridgewell/sourcemap-codec@1.4.14: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + /@jridgewell/trace-mapping@0.3.17: resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} dependencies: '@jridgewell/resolve-uri': 3.1.0 '@jridgewell/sourcemap-codec': 1.4.14 + /@jridgewell/trace-mapping@0.3.20: + resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + /@jridgewell/trace-mapping@0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} dependencies: @@ -3766,7 +3954,7 @@ packages: resolution: {integrity: sha512-S9q47ByT2pPvD65IvrWp7qppVMpk9WGMbVq9wbWZOHg6tnXSD4vyhao6nOSBwwfDdV2p3Kx9evA9vI+XWTfDvw==} dev: false - /@typescript-eslint/eslint-plugin@6.5.0(@typescript-eslint/parser@6.5.0)(eslint@8.48.0)(typescript@4.9.4): + /@typescript-eslint/eslint-plugin@6.5.0(@typescript-eslint/parser@6.5.0)(eslint@8.52.0)(typescript@5.2.2): resolution: {integrity: sha512-2pktILyjvMaScU6iK3925uvGU87E+N9rh372uGZgiMYwafaw9SXq86U04XPq3UH6tzRvNgBsub6x2DacHc33lw==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -3778,24 +3966,24 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.6.2 - '@typescript-eslint/parser': 6.5.0(eslint@8.48.0)(typescript@4.9.4) + '@typescript-eslint/parser': 6.5.0(eslint@8.52.0)(typescript@5.2.2) '@typescript-eslint/scope-manager': 6.5.0 - '@typescript-eslint/type-utils': 6.5.0(eslint@8.48.0)(typescript@4.9.4) - '@typescript-eslint/utils': 6.5.0(eslint@8.48.0)(typescript@4.9.4) + '@typescript-eslint/type-utils': 6.5.0(eslint@8.52.0)(typescript@5.2.2) + '@typescript-eslint/utils': 6.5.0(eslint@8.52.0)(typescript@5.2.2) '@typescript-eslint/visitor-keys': 6.5.0 debug: 4.3.4 - eslint: 8.48.0 + eslint: 8.52.0 graphemer: 1.4.0 ignore: 5.2.4 natural-compare: 1.4.0 semver: 7.5.4 - ts-api-utils: 1.0.2(typescript@4.9.4) - typescript: 4.9.4 + ts-api-utils: 1.0.2(typescript@5.2.2) + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@6.5.0(eslint@8.48.0)(typescript@4.9.4): + /@typescript-eslint/parser@6.5.0(eslint@8.52.0)(typescript@5.2.2): resolution: {integrity: sha512-LMAVtR5GN8nY0G0BadkG0XIe4AcNMeyEy3DyhKGAh9k4pLSMBO7rF29JvDBpZGCmp5Pgz5RLHP6eCpSYZJQDuQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -3807,11 +3995,11 @@ packages: dependencies: '@typescript-eslint/scope-manager': 6.5.0 '@typescript-eslint/types': 6.5.0 - '@typescript-eslint/typescript-estree': 6.5.0(typescript@4.9.4) + '@typescript-eslint/typescript-estree': 6.5.0(typescript@5.2.2) '@typescript-eslint/visitor-keys': 6.5.0 debug: 4.3.4 - eslint: 8.48.0 - typescript: 4.9.4 + eslint: 8.52.0 + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true @@ -3832,7 +4020,7 @@ packages: '@typescript-eslint/visitor-keys': 6.5.0 dev: true - /@typescript-eslint/type-utils@6.5.0(eslint@8.48.0)(typescript@4.9.4): + /@typescript-eslint/type-utils@6.5.0(eslint@8.52.0)(typescript@5.2.2): resolution: {integrity: sha512-f7OcZOkRivtujIBQ4yrJNIuwyCQO1OjocVqntl9dgSIZAdKqicj3xFDqDOzHDlGCZX990LqhLQXWRnQvsapq8A==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -3842,12 +4030,12 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 6.5.0(typescript@4.9.4) - '@typescript-eslint/utils': 6.5.0(eslint@8.48.0)(typescript@4.9.4) + '@typescript-eslint/typescript-estree': 6.5.0(typescript@5.2.2) + '@typescript-eslint/utils': 6.5.0(eslint@8.52.0)(typescript@5.2.2) debug: 4.3.4 - eslint: 8.48.0 - ts-api-utils: 1.0.2(typescript@4.9.4) - typescript: 4.9.4 + eslint: 8.52.0 + ts-api-utils: 1.0.2(typescript@5.2.2) + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true @@ -3862,7 +4050,7 @@ packages: engines: {node: ^16.0.0 || >=18.0.0} dev: true - /@typescript-eslint/typescript-estree@5.62.0(typescript@4.9.4): + /@typescript-eslint/typescript-estree@5.62.0(typescript@5.2.2): resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3877,13 +4065,13 @@ packages: globby: 11.1.0 is-glob: 4.0.3 semver: 7.5.0 - tsutils: 3.21.0(typescript@4.9.4) - typescript: 4.9.4 + tsutils: 3.21.0(typescript@5.2.2) + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/typescript-estree@6.5.0(typescript@4.9.4): + /@typescript-eslint/typescript-estree@6.5.0(typescript@5.2.2): resolution: {integrity: sha512-q0rGwSe9e5Kk/XzliB9h2LBc9tmXX25G0833r7kffbl5437FPWb2tbpIV9wAATebC/018pGa9fwPDuvGN+LxWQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -3898,25 +4086,25 @@ packages: globby: 11.1.0 is-glob: 4.0.3 semver: 7.5.4 - ts-api-utils: 1.0.2(typescript@4.9.4) - typescript: 4.9.4 + ts-api-utils: 1.0.2(typescript@5.2.2) + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils@5.62.0(eslint@8.48.0)(typescript@4.9.4): + /@typescript-eslint/utils@5.62.0(eslint@8.52.0)(typescript@5.2.2): resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.52.0) '@types/json-schema': 7.0.11 '@types/semver': 7.3.12 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.4) - eslint: 8.48.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2) + eslint: 8.52.0 eslint-scope: 5.1.1 semver: 7.5.0 transitivePeerDependencies: @@ -3924,19 +4112,19 @@ packages: - typescript dev: true - /@typescript-eslint/utils@6.5.0(eslint@8.48.0)(typescript@4.9.4): + /@typescript-eslint/utils@6.5.0(eslint@8.52.0)(typescript@5.2.2): resolution: {integrity: sha512-9nqtjkNykFzeVtt9Pj6lyR9WEdd8npPhhIPM992FWVkZuS6tmxHfGVnlUcjpUP2hv8r4w35nT33mlxd+Be1ACQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.52.0) '@types/json-schema': 7.0.12 '@types/semver': 7.5.1 '@typescript-eslint/scope-manager': 6.5.0 '@typescript-eslint/types': 6.5.0 - '@typescript-eslint/typescript-estree': 6.5.0(typescript@4.9.4) - eslint: 8.48.0 + '@typescript-eslint/typescript-estree': 6.5.0(typescript@5.2.2) + eslint: 8.52.0 semver: 7.5.4 transitivePeerDependencies: - supports-color @@ -3961,7 +4149,6 @@ packages: /@ungap/structured-clone@1.2.0: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - dev: false /@vercel/analytics@0.1.1(react@18.2.0): resolution: {integrity: sha512-34on7YtVt/yT8+QX7c5K2bcKYXnax06sQiK2PUdlQ1ABg5699mPdLGOSpS1gF//kR1s9oig4MCJ+N9nOjpaS6g==} @@ -3990,7 +4177,7 @@ packages: yoga-wasm-web: 0.1.2 dev: false - /@vercel/style-guide@5.0.0(eslint@8.48.0)(prettier@2.8.7)(typescript@4.9.4): + /@vercel/style-guide@5.0.0(eslint@8.52.0)(prettier@2.8.7)(typescript@5.2.2): resolution: {integrity: sha512-z8EbEyZm5Zn6AOa+XJ7dOja94m5Hm6cgCuTRK74qxKFWi7qQYUJoEkU27wYgOplZSAYVLB8mHfe51RGZMyqiUw==} engines: {node: '>=16'} peerDependencies: @@ -4009,27 +4196,27 @@ packages: optional: true dependencies: '@babel/core': 7.22.11 - '@babel/eslint-parser': 7.22.11(@babel/core@7.22.11)(eslint@8.48.0) + '@babel/eslint-parser': 7.22.11(@babel/core@7.22.11)(eslint@8.52.0) '@rushstack/eslint-patch': 1.3.3 - '@typescript-eslint/eslint-plugin': 6.5.0(@typescript-eslint/parser@6.5.0)(eslint@8.48.0)(typescript@4.9.4) - '@typescript-eslint/parser': 6.5.0(eslint@8.48.0)(typescript@4.9.4) - eslint: 8.48.0 - eslint-config-prettier: 9.0.0(eslint@8.48.0) + '@typescript-eslint/eslint-plugin': 6.5.0(@typescript-eslint/parser@6.5.0)(eslint@8.52.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.5.0(eslint@8.52.0)(typescript@5.2.2) + eslint: 8.52.0 + eslint-config-prettier: 9.0.0(eslint@8.52.0) eslint-import-resolver-alias: 1.1.2(eslint-plugin-import@2.28.1) - eslint-import-resolver-typescript: 3.6.0(@typescript-eslint/parser@6.5.0)(eslint-plugin-import@2.28.1)(eslint@8.48.0) - eslint-plugin-eslint-comments: 3.2.0(eslint@8.48.0) - eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.48.0) - eslint-plugin-jest: 27.2.3(@typescript-eslint/eslint-plugin@6.5.0)(eslint@8.48.0)(typescript@4.9.4) - eslint-plugin-jsx-a11y: 6.7.1(eslint@8.48.0) - eslint-plugin-playwright: 0.16.0(eslint-plugin-jest@27.2.3)(eslint@8.48.0) - eslint-plugin-react: 7.33.2(eslint@8.48.0) - eslint-plugin-react-hooks: 4.6.0(eslint@8.48.0) - eslint-plugin-testing-library: 6.0.1(eslint@8.48.0)(typescript@4.9.4) + eslint-import-resolver-typescript: 3.6.0(@typescript-eslint/parser@6.5.0)(eslint-plugin-import@2.28.1)(eslint@8.52.0) + eslint-plugin-eslint-comments: 3.2.0(eslint@8.52.0) + eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.52.0) + eslint-plugin-jest: 27.2.3(@typescript-eslint/eslint-plugin@6.5.0)(eslint@8.52.0)(typescript@5.2.2) + eslint-plugin-jsx-a11y: 6.7.1(eslint@8.52.0) + eslint-plugin-playwright: 0.16.0(eslint-plugin-jest@27.2.3)(eslint@8.52.0) + eslint-plugin-react: 7.33.2(eslint@8.52.0) + eslint-plugin-react-hooks: 4.6.0(eslint@8.52.0) + eslint-plugin-testing-library: 6.0.1(eslint@8.52.0)(typescript@5.2.2) eslint-plugin-tsdoc: 0.2.17 - eslint-plugin-unicorn: 48.0.1(eslint@8.48.0) + eslint-plugin-unicorn: 48.0.1(eslint@8.52.0) prettier: 2.8.7 prettier-plugin-packagejson: 2.4.5(prettier@2.8.7) - typescript: 4.9.4 + typescript: 5.2.2 transitivePeerDependencies: - eslint-import-resolver-node - eslint-import-resolver-webpack @@ -4739,6 +4926,16 @@ packages: node-releases: 2.0.10 update-browserslist-db: 1.0.10(browserslist@4.21.5) + /browserslist@4.22.1: + resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001554 + electron-to-chromium: 1.4.567 + node-releases: 2.0.13 + update-browserslist-db: 1.0.13(browserslist@4.22.1) + /bs-logger@0.2.6: resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} engines: {node: '>= 6'} @@ -4905,6 +5102,9 @@ packages: resolution: {integrity: sha512-Jj917pJtYg9HSJBF95HVX3Cdr89JUyLT4IZ8SvM5aDRni95swKgYi3TgYLH5hnGfPE/U1dg6IfZ50UsIlLkwSA==} dev: true + /caniuse-lite@1.0.30001554: + resolution: {integrity: sha512-A2E3U//MBwbJVzebddm1YfNp7Nud5Ip+IPn4BozBmn4KqVX7AvluoIDFWjsv5OkGnKUXQVmMSoMKLa3ScCblcQ==} + /capital-case@1.0.4: resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} dependencies: @@ -5028,7 +5228,7 @@ packages: normalize-path: 3.0.0 readdirp: 3.6.0 optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 dev: true /chownr@1.1.4: @@ -5281,7 +5481,6 @@ packages: /convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - dev: false /cookie@0.4.2: resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} @@ -6093,6 +6292,9 @@ packages: resolution: {integrity: sha512-cSMwIAd8yUh54VwitVRVvHK66QqHWE39C3DRj8SWiXitEpVSY3wNPD9y1pxQtLIi4w3UdzF9klLsmuPshz09DQ==} dev: true + /electron-to-chromium@1.4.567: + resolution: {integrity: sha512-8KR114CAYQ4/r5EIEsOmOMqQ9j0MRbJZR3aXD/KFA8RuKzyoUB4XrUCg+l8RUGqTVQgKNIgTpjaG8YHRPAbX2w==} + /elkjs@0.8.2: resolution: {integrity: sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ==} dev: false @@ -6121,7 +6323,7 @@ packages: resolution: {integrity: sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==} engines: {node: '>=10.13.0'} dependencies: - graceful-fs: 4.2.11 + graceful-fs: 4.2.10 tapable: 2.2.1 dev: true @@ -6765,13 +6967,13 @@ packages: source-map: 0.6.1 dev: true - /eslint-config-prettier@9.0.0(eslint@8.48.0): + /eslint-config-prettier@9.0.0(eslint@8.52.0): resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 8.48.0 + eslint: 8.52.0 dev: true /eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.28.1): @@ -6780,7 +6982,7 @@ packages: peerDependencies: eslint-plugin-import: '>=1.4.0' dependencies: - eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.48.0) + eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.52.0) dev: true /eslint-import-resolver-node@0.3.9: @@ -6793,7 +6995,7 @@ packages: - supports-color dev: true - /eslint-import-resolver-typescript@3.6.0(@typescript-eslint/parser@6.5.0)(eslint-plugin-import@2.28.1)(eslint@8.48.0): + /eslint-import-resolver-typescript@3.6.0(@typescript-eslint/parser@6.5.0)(eslint-plugin-import@2.28.1)(eslint@8.52.0): resolution: {integrity: sha512-QTHR9ddNnn35RTxlaEnx2gCxqFlF2SEN0SE2d17SqwyM7YOSI2GHWRYp5BiRkObTUNYPupC/3Fq2a0PpT+EKpg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -6802,9 +7004,9 @@ packages: dependencies: debug: 4.3.4 enhanced-resolve: 5.12.0 - eslint: 8.48.0 - eslint-module-utils: 2.7.4(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.48.0) - eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.48.0) + eslint: 8.52.0 + eslint-module-utils: 2.7.4(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.52.0) + eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.52.0) fast-glob: 3.3.1 get-tsconfig: 4.7.0 is-core-module: 2.11.0 @@ -6816,7 +7018,7 @@ packages: - supports-color dev: true - /eslint-module-utils@2.7.4(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.48.0): + /eslint-module-utils@2.7.4(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.52.0): resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} engines: {node: '>=4'} peerDependencies: @@ -6837,15 +7039,15 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 6.5.0(eslint@8.48.0)(typescript@4.9.4) + '@typescript-eslint/parser': 6.5.0(eslint@8.52.0)(typescript@5.2.2) debug: 3.2.7 - eslint: 8.48.0 - eslint-import-resolver-typescript: 3.6.0(@typescript-eslint/parser@6.5.0)(eslint-plugin-import@2.28.1)(eslint@8.48.0) + eslint: 8.52.0 + eslint-import-resolver-typescript: 3.6.0(@typescript-eslint/parser@6.5.0)(eslint-plugin-import@2.28.1)(eslint@8.52.0) transitivePeerDependencies: - supports-color dev: true - /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.0)(eslint@8.48.0): + /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.0)(eslint@8.52.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: @@ -6866,27 +7068,27 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 6.5.0(eslint@8.48.0)(typescript@4.9.4) + '@typescript-eslint/parser': 6.5.0(eslint@8.52.0)(typescript@5.2.2) debug: 3.2.7 - eslint: 8.48.0 + eslint: 8.52.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.0(@typescript-eslint/parser@6.5.0)(eslint-plugin-import@2.28.1)(eslint@8.48.0) + eslint-import-resolver-typescript: 3.6.0(@typescript-eslint/parser@6.5.0)(eslint-plugin-import@2.28.1)(eslint@8.52.0) transitivePeerDependencies: - supports-color dev: true - /eslint-plugin-eslint-comments@3.2.0(eslint@8.48.0): + /eslint-plugin-eslint-comments@3.2.0(eslint@8.52.0): resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==} engines: {node: '>=6.5.0'} peerDependencies: eslint: '>=4.19.1' dependencies: escape-string-regexp: 1.0.5 - eslint: 8.48.0 + eslint: 8.52.0 ignore: 5.2.4 dev: true - /eslint-plugin-import@2.28.1(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.48.0): + /eslint-plugin-import@2.28.1(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.52.0): resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==} engines: {node: '>=4'} peerDependencies: @@ -6896,16 +7098,16 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 6.5.0(eslint@8.48.0)(typescript@4.9.4) + '@typescript-eslint/parser': 6.5.0(eslint@8.52.0)(typescript@5.2.2) array-includes: 3.1.6 array.prototype.findlastindex: 1.2.2 array.prototype.flat: 1.3.1 array.prototype.flatmap: 1.3.1 debug: 3.2.7 doctrine: 2.1.0 - eslint: 8.48.0 + eslint: 8.52.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.0)(eslint@8.48.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.0)(eslint@8.52.0) has: 1.0.3 is-core-module: 2.13.0 is-glob: 4.0.3 @@ -6921,7 +7123,7 @@ packages: - supports-color dev: true - /eslint-plugin-jest@27.2.3(@typescript-eslint/eslint-plugin@6.5.0)(eslint@8.48.0)(typescript@4.9.4): + /eslint-plugin-jest@27.2.3(@typescript-eslint/eslint-plugin@6.5.0)(eslint@8.52.0)(typescript@5.2.2): resolution: {integrity: sha512-sRLlSCpICzWuje66Gl9zvdF6mwD5X86I4u55hJyFBsxYOsBCmT5+kSUjf+fkFWVMMgpzNEupjW8WzUqi83hJAQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -6934,15 +7136,15 @@ packages: jest: optional: true dependencies: - '@typescript-eslint/eslint-plugin': 6.5.0(@typescript-eslint/parser@6.5.0)(eslint@8.48.0)(typescript@4.9.4) - '@typescript-eslint/utils': 5.62.0(eslint@8.48.0)(typescript@4.9.4) - eslint: 8.48.0 + '@typescript-eslint/eslint-plugin': 6.5.0(@typescript-eslint/parser@6.5.0)(eslint@8.52.0)(typescript@5.2.2) + '@typescript-eslint/utils': 5.62.0(eslint@8.52.0)(typescript@5.2.2) + eslint: 8.52.0 transitivePeerDependencies: - supports-color - typescript dev: true - /eslint-plugin-jsx-a11y@6.7.1(eslint@8.48.0): + /eslint-plugin-jsx-a11y@6.7.1(eslint@8.52.0): resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==} engines: {node: '>=4.0'} peerDependencies: @@ -6957,7 +7159,7 @@ packages: axobject-query: 3.2.1 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 8.48.0 + eslint: 8.52.0 has: 1.0.3 jsx-ast-utils: 3.3.3 language-tags: 1.0.5 @@ -6967,7 +7169,7 @@ packages: semver: 6.3.1 dev: true - /eslint-plugin-playwright@0.16.0(eslint-plugin-jest@27.2.3)(eslint@8.48.0): + /eslint-plugin-playwright@0.16.0(eslint-plugin-jest@27.2.3)(eslint@8.52.0): resolution: {integrity: sha512-DcHpF0SLbNeh9MT4pMzUGuUSnJ7q5MWbP8sSEFIMS6j7Ggnduq8ghNlfhURgty4c1YFny7Ge9xYTO1FSAoV2Vw==} peerDependencies: eslint: '>=7' @@ -6976,20 +7178,20 @@ packages: eslint-plugin-jest: optional: true dependencies: - eslint: 8.48.0 - eslint-plugin-jest: 27.2.3(@typescript-eslint/eslint-plugin@6.5.0)(eslint@8.48.0)(typescript@4.9.4) + eslint: 8.52.0 + eslint-plugin-jest: 27.2.3(@typescript-eslint/eslint-plugin@6.5.0)(eslint@8.52.0)(typescript@5.2.2) dev: true - /eslint-plugin-react-hooks@4.6.0(eslint@8.48.0): + /eslint-plugin-react-hooks@4.6.0(eslint@8.52.0): resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 dependencies: - eslint: 8.48.0 + eslint: 8.52.0 dev: true - /eslint-plugin-react@7.33.2(eslint@8.48.0): + /eslint-plugin-react@7.33.2(eslint@8.52.0): resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} engines: {node: '>=4'} peerDependencies: @@ -7000,7 +7202,7 @@ packages: array.prototype.tosorted: 1.1.1 doctrine: 2.1.0 es-iterator-helpers: 1.0.14 - eslint: 8.48.0 + eslint: 8.52.0 estraverse: 5.3.0 jsx-ast-utils: 3.3.3 minimatch: 3.1.2 @@ -7014,14 +7216,14 @@ packages: string.prototype.matchall: 4.0.8 dev: true - /eslint-plugin-testing-library@6.0.1(eslint@8.48.0)(typescript@4.9.4): + /eslint-plugin-testing-library@6.0.1(eslint@8.52.0)(typescript@5.2.2): resolution: {integrity: sha512-CEYtjpcF3hAaQtYsTZqciR7s5z+T0LCMTwJeW+pz6kBnGtc866wAKmhaiK2Gsjc2jWNP7Gt6zhNr2DE1ZW4e+g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'} peerDependencies: eslint: ^7.5.0 || ^8.0.0 dependencies: - '@typescript-eslint/utils': 5.62.0(eslint@8.48.0)(typescript@4.9.4) - eslint: 8.48.0 + '@typescript-eslint/utils': 5.62.0(eslint@8.52.0)(typescript@5.2.2) + eslint: 8.52.0 transitivePeerDependencies: - supports-color - typescript @@ -7034,17 +7236,17 @@ packages: '@microsoft/tsdoc-config': 0.16.2 dev: true - /eslint-plugin-unicorn@48.0.1(eslint@8.48.0): + /eslint-plugin-unicorn@48.0.1(eslint@8.52.0): resolution: {integrity: sha512-FW+4r20myG/DqFcCSzoumaddKBicIPeFnTrifon2mWIzlfyvzwyqZjqVP7m4Cqr/ZYisS2aiLghkUWaPg6vtCw==} engines: {node: '>=16'} peerDependencies: eslint: '>=8.44.0' dependencies: '@babel/helper-validator-identifier': 7.22.5 - '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.52.0) ci-info: 3.8.0 clean-regexp: 1.0.0 - eslint: 8.48.0 + eslint: 8.52.0 esquery: 1.5.0 indent-string: 4.0.0 is-builtin-module: 3.2.1 @@ -7174,6 +7376,53 @@ packages: - supports-color dev: true + /eslint@8.52.0: + resolution: {integrity: sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.52.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.2 + '@eslint/js': 8.52.0 + '@humanwhocodes/config-array': 0.11.13 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.23.0 + graphemer: 1.4.0 + ignore: 5.2.4 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + /espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -7709,8 +7958,8 @@ packages: /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - /fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] requiresBuild: true @@ -7945,6 +8194,13 @@ packages: dependencies: type-fest: 0.20.2 + /globals@13.23.0: + resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + /globalthis@1.0.3: resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} engines: {node: '>= 0.4'} @@ -9386,7 +9642,7 @@ packages: micromatch: 4.0.5 walker: 1.0.8 optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 dev: true /jest-haste-map@29.5.0: @@ -9405,7 +9661,7 @@ packages: micromatch: 4.0.5 walker: 1.0.8 optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 dev: false /jest-jasmine2@27.5.1: @@ -9977,7 +10233,7 @@ packages: dependencies: universalify: 2.0.0 optionalDependencies: - graceful-fs: 4.2.11 + graceful-fs: 4.2.10 /jsx-ast-utils@3.3.3: resolution: {integrity: sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==} @@ -11546,7 +11802,6 @@ packages: /node-releases@2.0.13: resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} - dev: true /non-layered-tidy-tree-layout@2.0.2: resolution: {integrity: sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==} @@ -12165,17 +12420,17 @@ packages: find-up: 4.1.0 dev: true - /playwright-chromium@1.35.0: - resolution: {integrity: sha512-94xeZO0dv/PRZ/LH+vb6KFlOs8+Vt8Zw3IN+BfmL11xsbIDKRBtM2aS6x36fWXuFOITFVvSFjXiK4MJlW5q9qw==} + /playwright-chromium@1.39.0: + resolution: {integrity: sha512-0WVmvn9ppPbcyb2PQherIpzsvJlyjqziCZiAiexTEYSz8k6/+/3wljmFaMRMP1lcv2xKyHDn9yWd/lHb7IzYyA==} engines: {node: '>=16'} hasBin: true requiresBuild: true dependencies: - playwright-core: 1.35.0 + playwright-core: 1.39.0 dev: false - /playwright-core@1.35.0: - resolution: {integrity: sha512-muMXyPmIx/2DPrCHOD1H1ePT01o7OdKxKj2ebmCAYvqhUy+Y1bpal7B0rdoxros7YrXI294JT/DWw2LqyiqTPA==} + /playwright-core@1.39.0: + resolution: {integrity: sha512-+k4pdZgs1qiM+OUkSjx96YiKsXsmb59evFoqv8SKO067qBA+Z2s/dCzJij/ZhdQcs2zlTAgRKfeiiLm8PQ2qvw==} engines: {node: '>=16'} hasBin: true dev: false @@ -12944,14 +13199,14 @@ packages: engines: {node: '>=10.0.0'} hasBin: true optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 /rollup@3.21.5: resolution: {integrity: sha512-a4NTKS4u9PusbUJcfF4IMxuqjFzjm6ifj76P54a7cKnvVzJaG12BLVR+hgU2YDGHzyMMQNxLAZWuALsn8q2oQg==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 dev: true /rss@1.2.2: @@ -13701,7 +13956,7 @@ packages: client-only: 0.0.1 react: 18.2.0 - /styled-jsx@5.1.2(@babel/core@7.20.12)(react@18.2.0): + /styled-jsx@5.1.2(@babel/core@7.23.2)(react@18.2.0): resolution: {integrity: sha512-FI5r0a5ED2/+DSdG2ZRz3a4FtNQnKPLadauU5v76a9QsscwZrWggQKOmyxGGP5EWKbyY3bsuWAJYzyKaDAVAcw==} engines: {node: '>= 12.0.0'} peerDependencies: @@ -13714,7 +13969,7 @@ packages: babel-plugin-macros: optional: true dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.23.2 client-only: 0.0.1 react: 18.2.0 dev: false @@ -14092,13 +14347,13 @@ packages: resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} dev: false - /ts-api-utils@1.0.2(typescript@4.9.4): + /ts-api-utils@1.0.2(typescript@5.2.2): resolution: {integrity: sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ==} engines: {node: '>=16.13.0'} peerDependencies: typescript: '>=4.2.0' dependencies: - typescript: 4.9.4 + typescript: 5.2.2 dev: true /ts-dedent@2.2.0: @@ -14110,7 +14365,7 @@ packages: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} dev: true - /ts-jest@27.1.5(@babel/core@7.20.12)(@types/jest@27.5.2)(esbuild@0.14.49)(jest@27.5.1)(typescript@4.9.4): + /ts-jest@27.1.5(@babel/core@7.23.2)(@types/jest@27.5.2)(esbuild@0.14.49)(jest@27.5.1)(typescript@4.9.4): resolution: {integrity: sha512-Xv6jBQPoBEvBq/5i2TeSG9tt/nqkbpcurrEG1b+2yfBrcJelOZF9Ml6dmyMh7bcW9JyFbRYpR5rxROSlBLTZHA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} hasBin: true @@ -14131,7 +14386,7 @@ packages: esbuild: optional: true dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.23.2 '@types/jest': 27.5.2 bs-logger: 0.2.6 esbuild: 0.14.49 @@ -14146,7 +14401,7 @@ packages: yargs-parser: 20.2.9 dev: true - /ts-jest@27.1.5(@babel/core@7.20.12)(@types/jest@27.5.2)(esbuild@0.17.18)(jest@27.5.1)(typescript@4.9.4): + /ts-jest@27.1.5(@babel/core@7.23.2)(@types/jest@27.5.2)(esbuild@0.17.18)(jest@27.5.1)(typescript@4.9.4): resolution: {integrity: sha512-Xv6jBQPoBEvBq/5i2TeSG9tt/nqkbpcurrEG1b+2yfBrcJelOZF9Ml6dmyMh7bcW9JyFbRYpR5rxROSlBLTZHA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} hasBin: true @@ -14167,7 +14422,7 @@ packages: esbuild: optional: true dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.23.2 '@types/jest': 27.5.2 bs-logger: 0.2.6 esbuild: 0.17.18 @@ -14182,7 +14437,7 @@ packages: yargs-parser: 20.2.9 dev: true - /ts-jest@27.1.5(@babel/core@7.20.12)(@types/jest@27.5.2)(esbuild@0.17.18)(jest@27.5.1)(typescript@5.2.2): + /ts-jest@27.1.5(@babel/core@7.23.2)(@types/jest@27.5.2)(esbuild@0.17.18)(jest@27.5.1)(typescript@5.2.2): resolution: {integrity: sha512-Xv6jBQPoBEvBq/5i2TeSG9tt/nqkbpcurrEG1b+2yfBrcJelOZF9Ml6dmyMh7bcW9JyFbRYpR5rxROSlBLTZHA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} hasBin: true @@ -14203,7 +14458,7 @@ packages: esbuild: optional: true dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.23.2 '@types/jest': 27.5.2 bs-logger: 0.2.6 esbuild: 0.17.18 @@ -14391,14 +14646,14 @@ packages: - ts-node dev: true - /tsutils@3.21.0(typescript@4.9.4): + /tsutils@3.21.0(typescript@5.2.2): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' dependencies: tslib: 1.14.1 - typescript: 4.9.4 + typescript: 5.2.2 dev: true /tunnel-agent@0.6.0: @@ -14730,6 +14985,16 @@ packages: picocolors: 1.0.0 dev: true + /update-browserslist-db@1.0.13(browserslist@4.22.1): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.22.1 + escalade: 3.1.1 + picocolors: 1.0.0 + /update-check@1.5.4: resolution: {integrity: sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==} dependencies: From aeffe02b336bc368943bd0eaad2dd72d2c901da5 Mon Sep 17 00:00:00 2001 From: Will Binns-Smith Date: Wed, 25 Oct 2023 18:02:05 -0700 Subject: [PATCH 2/4] fixup! Devlow: refactor browser.ts --- packages/devlow-bench/src/browser.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/devlow-bench/src/browser.ts b/packages/devlow-bench/src/browser.ts index 2ab806359b9f1..554e46d5d4e9d 100644 --- a/packages/devlow-bench/src/browser.ts +++ b/packages/devlow-bench/src/browser.ts @@ -159,7 +159,7 @@ function networkIdle( page: Page, delayMs = 300, timeoutMs = 180000 -): Promise { +): Promise { return new Promise((resolve) => { const cleanup = () => { page.off("request", requestHandler); From dfe18af15a34bf0aac258adac1a757ec9335ef24 Mon Sep 17 00:00:00 2001 From: Will Binns-Smith Date: Wed, 25 Oct 2023 18:22:03 -0700 Subject: [PATCH 3/4] fixup! Devlow: refactor browser.ts --- packages/devlow-bench/src/browser.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/devlow-bench/src/browser.ts b/packages/devlow-bench/src/browser.ts index 554e46d5d4e9d..a295783d9d935 100644 --- a/packages/devlow-bench/src/browser.ts +++ b/packages/devlow-bench/src/browser.ts @@ -184,7 +184,7 @@ function networkIdle( requests ).join(", ")}} time is ${lastRequest - start}` ); - resolve(lastRequest - start); + resolve(Date.now() - lastRequest); }, timeoutMs); const requestFilter = (request: Request) => { @@ -230,7 +230,7 @@ function networkIdle( if (requests.size === 0) { timeout = setTimeout(() => { cleanup(); - resolve(lastRequest - start); + resolve(Date.now() - lastRequest); }, delayMs); } }; From 19a51d30dfbd7d10468e960e2c63ac98ea580a6c Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Mon, 6 Nov 2023 11:13:41 +0000 Subject: [PATCH 4/4] await async calls --- packages/devlow-bench/src/browser.ts | 32 +++++++++++----------------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/packages/devlow-bench/src/browser.ts b/packages/devlow-bench/src/browser.ts index a295783d9d935..1a6ca8e86d669 100644 --- a/packages/devlow-bench/src/browser.ts +++ b/packages/devlow-bench/src/browser.ts @@ -264,29 +264,27 @@ class BrowserSessionImpl implements BrowserSession { const page = this.page; await withRequestMetrics(metricName, page, async () => { - /* eslint-disable @typescript-eslint/no-floating-promises -- don't wait for reporting */ - measureTime(`${metricName}/start`); + await measureTime(`${metricName}/start`); const idle = networkIdle(page, 3000); await page.goto(url, { waitUntil: "commit", }); - measureTime(`${metricName}/html`, { + await measureTime(`${metricName}/html`, { relativeTo: `${metricName}/start`, }); await page.waitForLoadState("domcontentloaded"); - measureTime(`${metricName}/dom`, { + await measureTime(`${metricName}/dom`, { relativeTo: `${metricName}/start`, }); await page.waitForLoadState("load"); - measureTime(`${metricName}/load`, { + await measureTime(`${metricName}/load`, { relativeTo: `${metricName}/start`, }); const offset = await idle; - measureTime(`${metricName}`, { + await measureTime(`${metricName}`, { offset, relativeTo: `${metricName}/start`, }); - /* eslint-enable @typescript-eslint/no-floating-promises -- don't wait for reporting */ }); return page; } @@ -299,8 +297,7 @@ class BrowserSessionImpl implements BrowserSession { ); } await withRequestMetrics(metricName, page, async () => { - /* eslint-disable @typescript-eslint/no-floating-promises -- don't wait for reporting */ - measureTime(`${metricName}/start`); + await measureTime(`${metricName}/start`); const firstResponse = new Promise((resolve) => { page.once("response", () => { resolve(); @@ -309,15 +306,14 @@ class BrowserSessionImpl implements BrowserSession { const idle = networkIdle(page, 3000); await page.click(selector); await firstResponse; - measureTime(`${metricName}/firstResponse`, { + await measureTime(`${metricName}/firstResponse`, { relativeTo: `${metricName}/start`, }); await idle; - measureTime(`${metricName}`, { + await measureTime(`${metricName}`, { offset: 3000, relativeTo: `${metricName}/start`, }); - /* eslint-enable @typescript-eslint/no-floating-promises -- don't wait for reporting */ }); } @@ -327,29 +323,27 @@ class BrowserSessionImpl implements BrowserSession { throw new Error("reload() must be called after hardNavigation()"); } await withRequestMetrics(metricName, page, async () => { - /* eslint-disable @typescript-eslint/no-floating-promises -- don't wait for reporting */ - measureTime(`${metricName}/start`); + await measureTime(`${metricName}/start`); const idle = networkIdle(page, 3000); await page.reload({ waitUntil: "commit", }); - measureTime(`${metricName}/html`, { + await measureTime(`${metricName}/html`, { relativeTo: `${metricName}/start`, }); await page.waitForLoadState("domcontentloaded"); - measureTime(`${metricName}/dom`, { + await measureTime(`${metricName}/dom`, { relativeTo: `${metricName}/start`, }); await page.waitForLoadState("load"); - measureTime(`${metricName}/load`, { + await measureTime(`${metricName}/load`, { relativeTo: `${metricName}/start`, }); await idle; - measureTime(`${metricName}`, { + await measureTime(`${metricName}`, { offset: 3000, relativeTo: `${metricName}/start`, }); - /* eslint-enable @typescript-eslint/no-floating-promises -- don't wait for reporting */ }); } }