diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0e218ea19..b10cf5dcb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -66,7 +66,7 @@ jobs: - name: Install run: pnpm install - name: Install Playwright Browsers - run: npx playwright install --with-deps + run: npx playwright install --with-deps chromium - name: Build run: npm run build - name: Test @@ -79,11 +79,12 @@ jobs: flags: unittests e2e: - runs-on: macos-latest + runs-on: ubuntu-latest strategy: matrix: node-version: [22.x] + shard: [1/4, 2/4, 3/4, 4/4] steps: - uses: actions/checkout@v3 @@ -95,29 +96,78 @@ jobs: uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} - - name: Run Cypress Tests - uses: cypress-io/github-action@v5 + cache: pnpm + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Get installed Playwright version + id: playwright-version + run: echo "PLAYWRIGHT_VERSION=$(node -e "console.log(require('./package.json').devDependencies['@playwright/test'])")" >> $GITHUB_ENV + + - name: Cache Playwright browsers + uses: actions/cache@v3 + id: playwright-cache with: - build: npm run build - start: npm run e2e:case - wait-on: "http://localhost:5175" - wait-on-timeout: 120 - browser: chrome - - name: Upload Diff + path: | + ~/.cache/ms-playwright + key: ${{ runner.os }}-playwright-${{ env.PLAYWRIGHT_VERSION }} + + - name: Install Playwright Browsers + if: steps.playwright-cache.outputs.cache-hit != 'true' + timeout-minutes: 15 + run: | + echo "๐Ÿ”ง Installing Playwright chromium browser..." + npx playwright install chromium + npx playwright install-deps chromium + echo "โœ… Playwright installation completed" + - name: Build project + run: npm run build + - name: Pull baseline images + run: git lfs pull + - name: Verify browser installation + run: | + echo "๐Ÿ” Verifying browser installation..." + ls -la ~/.cache/ms-playwright/ || echo "Browser cache directory not found" + find ~/.cache/ms-playwright -name "*headless_shell*" || echo "Headless shell not found" + + - name: Run Playwright Tests + run: | + echo "๐Ÿงช Starting e2e visual regression tests..." + echo "๐Ÿ“Š Test environment: ${{ runner.os }} - Node ${{ matrix.node-version }}" + start_time=$(date +%s) + npx playwright test --shard=${{ matrix.shard }} --reporter=list,github + exit_code=$? + end_time=$(date +%s) + duration=$((end_time - start_time)) + if [ $exit_code -eq 0 ]; then + echo "โœ… E2E tests completed successfully in ${duration}s!" + else + echo "โŒ E2E tests failed in ${duration}s with exit code $exit_code" + exit $exit_code + fi + env: + CI: true + PLAYWRIGHT_FORCE_TTY: 1 + - name: Upload test results if: failure() uses: actions/upload-artifact@v4 with: - name: cypress-diff - path: e2e/diff/ - - name: Upload Origin + name: playwright-test-results-${{ strategy.job-index }}-${{ github.run_number }} + path: | + e2e/test-results/ + !e2e/test-results/**/*.webm + retention-days: 7 + - name: Upload diff images if: failure() uses: actions/upload-artifact@v4 with: - name: cypress-origin - path: e2e/fixtures/originImage - - name: Upload Screenshots + name: playwright-diffs-${{ strategy.job-index }}-${{ github.run_number }} + path: e2e/test-results/diffs/ + retention-days: 14 + - name: Upload HTML report if: failure() uses: actions/upload-artifact@v4 with: - name: cypress-screenshots - path: e2e/downloads/ + name: playwright-report-${{ strategy.job-index }}-${{ github.run_number }} + path: playwright-report/ + retention-days: 7 diff --git a/.gitignore b/.gitignore index 87c3b87e8..55ac4e690 100644 --- a/.gitignore +++ b/.gitignore @@ -31,6 +31,13 @@ e2e/screenshots/* e2e/downloads/* e2e/diff/* e2e/.dev/mpa +e2e/test-results/* +playwright-report/ + +# Claude Code files +.claude/ +CLAUDE.md + .husky/post-checkout .husky/post-commit .husky/pre-push diff --git a/cypress.config.ts b/cypress.config.ts deleted file mode 100644 index 0fdf73fa0..000000000 --- a/cypress.config.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { defineConfig } from "cypress"; -import { compare } from "odiff-bin"; - -const path = require("path"); -const fs = require("fs-extra"); - -const downloadDirectory = path.join(__dirname, "e2e/downloads"); -let isRunningInCommandLine = false; -export default defineConfig({ - e2e: { - viewportWidth: 1200, - viewportHeight: 800, - baseUrl: "http://localhost:5175", - defaultCommandTimeout: 60000, - fileServerFolder: "e2e", - supportFile: "e2e/support/e2e.ts", - fixturesFolder: "e2e/fixtures", - screenshotsFolder: "e2e/screenshots", - videosFolder: "e2e/videos", - specPattern: "e2e/tests/*.cy.ts", - downloadsFolder: "e2e/downloads", - video: false, - setupNodeEvents(on, config) { - // implement node event listeners here - on("before:browser:launch", (browser, launchOptions) => { - console.log("launching browser %s is headless? %s", browser.name, browser.isHeadless); - // supply the absolute path to an unpacked extension's folder - // NOTE: extensions cannot be loaded in headless Chrome - if (fs.existsSync("e2e/diff")) { - fs.rmdirSync("e2e/diff", { recursive: true }); - } - if (browser.name === "chrome") { - launchOptions.preferences.default["download"] = { - default_directory: downloadDirectory - }; - } - if (browser.isHeadless) { - isRunningInCommandLine = true; - } - launchOptions.args.push("--force-device-scale-factor=1"); - return launchOptions; - }), - on("task", { - async compare({ fileName, options }) { - const baseFolder = "e2e/fixtures/originImage/"; - const newFolder = path.join("e2e/downloads"); - const diffFolder = path.join("e2e/diff", options.specFolder); - if (!fs.existsSync(diffFolder)) { - fs.mkdirSync(diffFolder, { recursive: true }); - } - const baseImage = path.join(baseFolder, fileName); - const newImage = path.join(newFolder, fileName); - const diffImage = path.join(diffFolder, fileName); - console.log("comparing base image %s to the new image %s", baseImage, newImage); - if (options) { - console.log("odiff options %o", options); - } - const started = +new Date(); - - const result = await compare(baseImage, newImage, diffImage, options); - const finished = +new Date(); - const elapsed = finished - started; - console.log("odiff took %dms", elapsed); - - //@ts-ignore - if (result.match === false && result.diffPercentage <= 0.1) { - //@ts-ignore - result.match = true; - } - - console.log(result); - return result; - } - }); - } - }, - chromeWebSecurity: false -}); diff --git a/e2e/.dev/vite.config.js b/e2e/.dev/vite.config.js index b6d811f46..2cfc11d82 100644 --- a/e2e/.dev/vite.config.js +++ b/e2e/.dev/vite.config.js @@ -45,7 +45,8 @@ module.exports = { server: { open: true, host: "0.0.0.0", - port: 5175 + port: 5175, + strictPort: true }, resolve: { dedupe: ["@galacean/engine"] diff --git a/e2e/README.md b/e2e/README.md index 43f73bef3..ac696caa2 100644 --- a/e2e/README.md +++ b/e2e/README.md @@ -1,43 +1,105 @@ -### Note: Require install git-lfs -We use [git-lfs](https://git-lfs.com/) (Install by official website) to manage baseline images for e2e tests, so it's necessary to install it, ignore if already installed. -### 1. Create a case page in the e2e/case directory -You can refer to e2e/case/animator-play.ts. -### 2. Configure your e2e test in e2e/config.ts -The threshold is color difference threshold (from 0 to 1). Less more precise. -### 3. Debug your test cases: -#### Launch the Case page: +# E2E Testing Guide -``` -npm run e2e:case -``` +## Prerequisites -After successfully launching the case page, run: - -``` +### Git LFS +We use [git-lfs](https://git-lfs.com/) to manage baseline images for e2e tests. Install it if you haven't already: +```bash +git lfs install git lfs pull ``` -Pull image from github, then run +## Quick Start + +### Run all e2e tests +```bash +npm run e2e ``` + +### Debug tests interactively +```bash npm run e2e:debug ``` -Open the Cypress client for debugging. -Cypress will capture screenshots of your case pages. -Review the screenshots in e2e/downloads folder, store them in the e2e/fixtures/originImage directory if there are no issues, then rerun the test cases. If the test cases pass, the debugging is complete. +Both commands will automatically: +- Install required browsers (Chromium) +- Start the test server +- Run visual regression tests with odiff comparison + +## Project Structure -### 4. Run the complete e2e tests: ``` -npm run e2e +e2e/ +โ”œโ”€โ”€ case/ # Test case implementations +โ”œโ”€โ”€ config.ts # Test configuration +โ”œโ”€โ”€ fixtures/ +โ”‚ โ””โ”€โ”€ originImage/ # Baseline images (managed by git-lfs) +โ”œโ”€โ”€ downloads/ # Generated screenshots +โ”œโ”€โ”€ tests/ # Playwright test files +โ””โ”€โ”€ utils/ # Helper utilities ``` -Note: The e2e testing framework for this project is Cypress. For detailed usage instructions, please refer to https://www.cypress.io/. - - -### Add new e2e case - -1. modify `config.ts` based on the new test case. -2. run `npm run e2e:debug` - -the new image of test case for comparison will be present under directory `e2e/downloads`, you need to copy it into directory `e2e/fixtures/originImage`. + +## Adding New Test Cases + +### 1. Create a test case file +Create your test implementation in `e2e/case/`, following existing patterns: +```typescript +// e2e/case/my-new-test.ts +WebGLEngine.create({ canvas: "canvas" }).then((engine) => { + // Your test implementation + updateForE2E(engine); + initScreenshot(engine, camera); +}); +``` + +### 2. Add configuration +Add your test to `e2e/config.ts`: +```typescript +MyCategory: { + myNewTest: { + category: "MyCategory", + caseFileName: "my-new-test", + threshold: 0.1 // 0.01 for strict tests, 0.1 for normal tests + } +} +``` + +### 3. Generate baseline image +Run in debug mode to generate the initial screenshot: +```bash +npm run e2e:debug +``` + +Copy the generated image from `e2e/downloads/` to `e2e/fixtures/originImage/` and commit it with git-lfs. + +## Threshold Guidelines + +- **0.01**: Strict comparison for pixel-perfect tests (e.g., FXAA, transparency) +- **0.1**: Normal comparison for most 3D rendering tests +- Adjust based on rendering stability and requirements + +## Troubleshooting + +### Browser installation issues +Manually install browsers: +```bash +npm run e2e:install +``` + +### Missing baseline images +Pull from git-lfs: +```bash +git lfs pull +``` + +### Server startup issues +Manually start the test server: +```bash +npm run e2e:case +``` + +## Framework Details + +This project uses [Playwright](https://playwright.dev/) with [odiff](https://github.com/dmtrKovalenko/odiff) for visual regression testing. All tests run in Chromium for consistency. diff --git a/e2e/case/.mockForE2E.ts b/e2e/case/.mockForE2E.ts index 25a0f9554..667343469 100644 --- a/e2e/case/.mockForE2E.ts +++ b/e2e/case/.mockForE2E.ts @@ -92,17 +92,25 @@ export function initScreenshot( const imageName = `${category}_${caseFileName}.jpg`; a.href = url; a.download = imageName; - a.id = "screenshot"; + a.dataset.testid = "screenshot"; + a.textContent = "Download Screenshot"; + a.style.cssText = ` + position: fixed; + top: 10px; + left: 10px; + z-index: 9999; + background: #007bff; + color: white; + padding: 8px 16px; + border-radius: 4px; + text-decoration: none; + font-family: Arial, sans-serif; + font-size: 14px; + border: none; + cursor: pointer; + `; document.body.appendChild(a); - a.addEventListener("click", () => { - if (a.parentElement) { - a.parentElement.removeChild(a); - } - }); - - // window.URL.revokeObjectURL(url); - // revert callbacks.forEach((cb) => cb()); !isPaused && engine.resume(); diff --git a/e2e/config.ts b/e2e/config.ts index 8ccf6a2e7..5a19a5f12 100644 --- a/e2e/config.ts +++ b/e2e/config.ts @@ -237,7 +237,7 @@ export const E2E_CONFIG = { caseFileName: "particleRenderer-dream", threshold: 0.1 }, - particleFire: { + particleFire: { category: "Particle", caseFileName: "particleRenderer-fire", threshold: 0.1 diff --git a/e2e/global-setup.ts b/e2e/global-setup.ts new file mode 100644 index 000000000..8ba606b8e --- /dev/null +++ b/e2e/global-setup.ts @@ -0,0 +1,67 @@ +import * as fs from "fs-extra"; +import * as path from "path"; + +// Wait for server to be ready +async function waitForServer(url: string, timeout: number = 120000): Promise { + const startTime = Date.now(); + console.log(`โณ Waiting for server at ${url}...`); + + while (Date.now() - startTime < timeout) { + try { + const response = await fetch(url); + if (response.ok) { + console.log(`โœ… Server is ready at ${url}`); + return; + } + } catch (error) { + // Server not ready yet, continue waiting + } + + // Wait 1 second before next attempt + await new Promise((resolve) => setTimeout(resolve, 100)); + } + + throw new Error(`โŒ Server at ${url} did not start within ${timeout}ms`); +} + +export default async function globalSetup() { + console.log("๐Ÿš€ Galacean Engine E2E Test Setup"); + console.log("๐Ÿ“ Cleaning downloads directory..."); + + // Clean downloads directory before tests + const downloadsPath = path.join(process.cwd(), "e2e/downloads"); + if (fs.existsSync(downloadsPath)) { + const files = fs.readdirSync(downloadsPath); + fs.emptyDirSync(downloadsPath); + console.log(` โœ… Cleaned ${files.length} files from e2e/downloads`); + } else { + console.log(" โ„น๏ธ Downloads directory is empty"); + } + + // Count test cases from config + let testCount = 0; + try { + const configPath = path.join(process.cwd(), "e2e/config.ts"); + if (fs.existsSync(configPath)) { + const { E2E_CONFIG } = require(configPath); + testCount = Object.values(E2E_CONFIG).reduce((total: number, category: any) => { + return total + Object.keys(category).length; + }, 0) as number; + console.log(`๐Ÿงช Found ${testCount} test cases`); + } + } catch (error) { + console.log("โš ๏ธ Could not read test configuration"); + } + + // Check baseline images + const baselineDir = path.join(process.cwd(), "e2e/fixtures/originImage"); + if (fs.existsSync(baselineDir)) { + const baselineFiles = fs.readdirSync(baselineDir).filter((f) => f.endsWith(".jpg")); + console.log(`๐Ÿ“ธ Found ${baselineFiles.length} baseline images`); + } + + // Wait for server to be ready + await waitForServer("http://localhost:5175"); + + console.log("๐ŸŽฌ Ready to run visual regression tests!\n"); +} diff --git a/e2e/support/commands.ts b/e2e/support/commands.ts deleted file mode 100644 index da824a47d..000000000 --- a/e2e/support/commands.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { recurse } from "cypress-recurse"; -import * as path from "path"; - -/// -// *********************************************** -// This example commands.ts shows you how to -// create various custom commands and overwrite -// existing commands. -// -// For more comprehensive examples of custom -// commands please read more here: -// https://on.cypress.io/custom-commands -// *********************************************** -// -// -// -- This is a parent command -- -// Cypress.Commands.add('login', (email, password) => { ... }) -// -// -// -- This is a child command -- -// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... }) -// -// -// -- This is a dual command -- -// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... }) -// -// -// -- This will overwrite an existing command -- -// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... }) -// -declare global { - namespace Cypress { - interface Chainable { - screenshotWithThreshold(category: string, name: string, threshold?: number): Chainable; - } - } -} - -Cypress.Commands.add("screenshotWithThreshold", (category, name, threshold = 0) => { - const downloadsFolder = Cypress.config("downloadsFolder"); - - cy.visit(`/mpa/${name}.html?category=${category}&case=${name}`); - const imageName = `${category}_${name}.jpg`; - const filePath = path.join(downloadsFolder, imageName); - cy.get("#screenshot", { timeout: 60000 }) - .click({ force: true }) - .then(() => { - return new Promise((resolve) => { - cy.log(`Reading file ${filePath}`); - resolve( - recurse( - () => { - return cy.readFile(filePath).then(() => { - cy.log(`Comparing ${imageName} with threshold ${threshold}`); - return cy.task("compare", { - fileName: imageName, - options: { - specFolder: Cypress.spec.name, - threshold, - antialiasing: true - } - }); - }); - }, - ({ match }) => match, - { - limit: 2 - } - ) - ); - }); - }); -}); diff --git a/e2e/support/e2e.ts b/e2e/support/e2e.ts deleted file mode 100644 index 6a173d6fc..000000000 --- a/e2e/support/e2e.ts +++ /dev/null @@ -1,20 +0,0 @@ -// *********************************************************** -// This example support/e2e.ts is processed and -// loaded automatically before your test files. -// -// This is a great place to put global configuration and -// behavior that modifies Cypress. -// -// You can change the location of this file or turn off -// automatically serving support files with the -// 'supportFile' configuration option. -// -// You can read more here: -// https://on.cypress.io/configuration -// *********************************************************** - -// Import commands.js using ES2015 syntax: -import "./commands"; - -// Alternatively you can use CommonJS syntax: -// require('./commands') diff --git a/e2e/tests/index.cy.ts b/e2e/tests/index.cy.ts deleted file mode 100644 index 44e00a2fe..000000000 --- a/e2e/tests/index.cy.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { E2E_CONFIG } from "../config"; - -for (let category in E2E_CONFIG) { - const config = E2E_CONFIG[category]; - - describe(category, () => { - for (const caseName in config) { - it(caseName, () => { - const { category, caseFileName, threshold } = config[caseName]; - cy.screenshotWithThreshold(category, caseFileName, threshold); - }); - } - }); -} diff --git a/e2e/tests/index.spec.ts b/e2e/tests/index.spec.ts new file mode 100644 index 000000000..4d95b1d3f --- /dev/null +++ b/e2e/tests/index.spec.ts @@ -0,0 +1,27 @@ +import { test } from "@playwright/test"; +import { E2E_CONFIG } from "../config"; +import { screenshotWithThreshold } from "../utils/screenshot"; +import type { CategoryConfig, TestCaseConfig } from "../types/test-config"; + +/** + * Create test cases for a given category + */ +function createTestsForCategory(categoryName: string, categoryConfig: CategoryConfig) { + test.describe(categoryName, () => { + Object.entries(categoryConfig).forEach(([caseName, config]: [string, TestCaseConfig]) => { + test(caseName, async ({ page }) => { + const { category, caseFileName, threshold } = config; + await screenshotWithThreshold(page, { + category, + name: caseFileName, + threshold + }); + }); + }); + }); +} + +// Generate test suites for all categories +Object.entries(E2E_CONFIG).forEach(([categoryName, categoryConfig]) => { + createTestsForCategory(categoryName, categoryConfig); +}); diff --git a/e2e/tsconfig.json b/e2e/tsconfig.json index 18edb199a..24569484c 100644 --- a/e2e/tsconfig.json +++ b/e2e/tsconfig.json @@ -2,7 +2,7 @@ "compilerOptions": { "target": "es5", "lib": ["es5", "dom"], - "types": ["cypress", "node"] + "types": ["@playwright/test", "node"] }, "include": ["**/*.ts"] } diff --git a/e2e/utils/screenshot.ts b/e2e/utils/screenshot.ts new file mode 100644 index 000000000..787c05896 --- /dev/null +++ b/e2e/utils/screenshot.ts @@ -0,0 +1,85 @@ +import { Page } from "@playwright/test"; +import { compare } from "odiff-bin"; +import * as path from "path"; + +export interface ScreenshotOptions { + category: string; + name: string; + threshold?: number; +} + +export async function screenshotWithThreshold(page: Page, options: ScreenshotOptions) { + const { category, name, threshold = 0.1 } = options; + const imageName = `${category}_${name}.jpg`; + const testId = `${category}_${name}`; + const startTime = Date.now(); + + console.log(`๐Ÿ“ธ [${testId}] Starting test`); + const testUrl = `/mpa/${name}.html`; + + console.log(`๐ŸŒ [${testId}] Navigating to ${testUrl}`); + await page.goto(testUrl); + + console.log(`โณ [${testId}] Waiting for DOM content loaded...`); + await page.waitForLoadState("domcontentloaded"); + const pageReadyTime = Date.now(); + console.log(`๐Ÿ“„ [${testId}] Page ready (${pageReadyTime - startTime}ms)`); + + console.log(`๐Ÿ” [${testId}] Looking for screenshot button...`); + // ็›‘ๅฌไธ‹่ฝฝไบ‹ไปถ + const downloadPromise = page.waitForEvent("download"); + console.log(`๐Ÿ“ก [${testId}] Download listener set up`); + + console.log(`โฐ [${testId}] Waiting for screenshot button to be visible (timeout: 180s)...`); + let pageRenderedTime; + try { + // ็ญ‰ๅพ… screenshot ๆŒ‰้’ฎๅฏ่ง + await page.getByTestId("screenshot").waitFor({ timeout: 180000 }); + pageRenderedTime = Date.now(); + console.log(`โœ… [${testId}] Screenshot button visible (${pageRenderedTime - pageReadyTime}ms)`); + } catch (error) { + console.log(`โŒ [${testId}] Screenshot button not visible after 180s`); + console.log(`๐Ÿ” [${testId}] Page content: ${await page.content()}`); + throw error; + } + + console.log(`๐Ÿ‘† [${testId}] Clicking screenshot button...`); + // ็‚นๅ‡ปไธ‹่ฝฝๆŒ‰้’ฎ + await page.getByTestId("screenshot").click(); + console.log(`โœ… [${testId}] Screenshot button clicked`); + + console.log(`โฌ‡๏ธ [${testId}] Waiting for download to start...`); + // ็ญ‰ๅพ…ไธ‹่ฝฝๅฎŒๆˆ + const download = await downloadPromise; + console.log(`๐Ÿ“ฆ [${testId}] Download received`); + + console.log(`๐Ÿ’พ [${testId}] Saving download...`); + const downloadPath = path.join(process.cwd(), "e2e/downloads", imageName); + + // ไฟๅญ˜ไธ‹่ฝฝ็š„ๆ–‡ไปถ + await download.saveAs(downloadPath); + + console.log(`๐Ÿ“ฅ [${testId}] Downloaded (${Date.now() - pageRenderedTime}ms)`); + + // Compare with baseline + const baseImagePath = path.join(process.cwd(), "e2e/fixtures/originImage", imageName); + const diffImagePath = path.join(process.cwd(), "e2e/test-results/diffs", imageName); + + const result = await compare(baseImagePath, downloadPath, diffImagePath, { + threshold: threshold * 100, + antialiasing: true + }); + + if (!result.match) { + const diffPercentage = "diffPercentage" in result ? result.diffPercentage : "unknown"; + console.log(`โŒ [${testId}] Visual regression: ${diffPercentage}% (${Date.now() - startTime}ms)`); + throw new Error( + `Visual regression detected for ${imageName}. ` + + `Difference: ${diffPercentage}%, threshold: ${threshold * 100}%. ` + + `Diff saved to: ${diffImagePath}` + ); + } + + console.log(`โœ… [${testId}] Test passed (${Date.now() - startTime}ms total)`); + return result; +} diff --git a/package.json b/package.json index 516bda755..cd46484d8 100644 --- a/package.json +++ b/package.json @@ -5,9 +5,9 @@ "private": true, "scripts": { "preinstall": "npx only-allow pnpm", - "pretest": "pnpm exec playwright install", + "pretest": "vitest --version && playwright install --with-deps chromium", "test": "vitest", - "coverage": "vitest --coverage", + "coverage": "cross-env HEADLESS=true vitest --coverage", "build": "npm run b:module && npm run b:types", "lint": "eslint packages/*/src --ext .ts", "watch": "cross-env NODE_ENV=release BUILD_TYPE=MODULE rollup -cw -m inline", @@ -19,14 +19,17 @@ "b:all": "cross-env NODE_ENV=release npm run b:types && cross-env BUILD_TYPE=ALL NODE_ENV=release rollup -c", "clean": "pnpm -r exec rm -rf dist && pnpm -r exec rm -rf types", "e2e:case": "pnpm -C ./e2e run case", - "e2e": "cypress run --browser chrome --headless", - "e2e:debug": "cypress open", + "pree2e": "playwright install --with-deps chromium", + "e2e": "playwright test", + "pree2e:debug": "playwright install --with-deps chromium", + "e2e:debug": "playwright test --ui", "prepare": "husky install", "release": "bumpp -r" }, "devDependencies": { "@commitlint/cli": "^11.0.0", "@commitlint/config-conventional": "^11.0.0", + "@playwright/test": "^1.53.1", "@rollup/plugin-commonjs": "^17.0.0", "@rollup/plugin-inject": "^4.0.2", "@rollup/plugin-node-resolve": "^11.0.1", @@ -41,8 +44,6 @@ "@vitest/coverage-v8": "2.1.3", "bumpp": "^9.5.2", "cross-env": "^5.2.0", - "cypress": "^12.17.1", - "cypress-recurse": "^1.23.0", "electron": "^13", "eslint": "^8.44.0", "eslint-config-prettier": "^8.8.0", @@ -52,7 +53,6 @@ "lint-staged": "^10.5.3", "nyc": "^15.1.0", "odiff-bin": "^2.5.0", - "playwright": "^1.48.1", "prettier": "^3.0.0", "rollup": "^2.36.1", "rollup-plugin-glslify": "^1.2.0", diff --git a/playwright.config.ts b/playwright.config.ts new file mode 100644 index 000000000..5af3ada17 --- /dev/null +++ b/playwright.config.ts @@ -0,0 +1,53 @@ +import { defineConfig, devices } from "@playwright/test"; + +export default defineConfig({ + globalSetup: "./e2e/global-setup.ts", + testDir: "./e2e/tests", + fullyParallel: true, + forbidOnly: !!process.env.CI, + retries: process.env.CI ? 2 : 0, + workers: process.env.CI ? 4 : undefined, + reporter: process.env.CI ? [["github"], ["list"], ["html", { open: "never" }]] : "html", + timeout: process.env.CI ? 180000 : 120000, + use: { + baseURL: "http://localhost:5175", + trace: process.env.CI ? "on-first-retry" : "on-first-retry", + video: process.env.CI ? "off" : "retain-on-failure", + screenshot: "only-on-failure", + actionTimeout: process.env.CI ? 180000 : 30000, + navigationTimeout: process.env.CI ? 180000 : 60000 + }, + projects: [ + { + name: "chromium", + use: { + ...devices["Desktop Chrome"], + viewport: { width: 1200, height: 800 }, + launchOptions: { + args: process.env.CI + ? [ + "--use-gl=angle", + "--use-angle=swiftshader", + "--enable-webgl", + "--ignore-gpu-blocklist", + "--disable-gpu-sandbox", + "--disable-software-rasterizer", + "--disable-dev-shm-usage", + "--no-sandbox", + "--disable-setuid-sandbox", + "--disable-web-security", + "--disable-features=VizDisplayCompositor" + ] + : ["--use-gl=egl", "--ignore-gpu-blocklist", "--use-gl=angle"] + } + } + } + ], + webServer: { + command: "npm run e2e:case", + timeout: 120 * 1000, + stdout: "pipe", + stderr: "pipe" + }, + outputDir: "e2e/test-results" +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4f7718fb7..1132b7e24 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,6 +14,9 @@ importers: '@commitlint/config-conventional': specifier: ^11.0.0 version: 11.0.0 + '@playwright/test': + specifier: ^1.53.1 + version: 1.53.1 '@rollup/plugin-commonjs': specifier: ^17.0.0 version: 17.1.0(rollup@2.79.2) @@ -40,7 +43,7 @@ importers: version: 18.19.64 '@types/webxr': specifier: latest - version: 0.5.20 + version: 0.5.22 '@typescript-eslint/eslint-plugin': specifier: ^6.1.0 version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3) @@ -49,19 +52,13 @@ importers: version: 6.21.0(eslint@8.57.1)(typescript@5.6.3) '@vitest/coverage-v8': specifier: 2.1.3 - version: 2.1.3(@vitest/browser@2.1.3)(vitest@2.1.3) + version: 2.1.3(@vitest/browser@2.1.3(@types/node@18.19.64)(@vitest/spy@2.1.3)(typescript@5.6.3)(vite@5.4.11(@types/node@18.19.64)(sass@1.81.0))(vitest@2.1.3))(vitest@2.1.3(@types/node@18.19.64)(@vitest/browser@2.1.3)(msw@2.6.5(@types/node@18.19.64)(typescript@5.6.3))(sass@1.81.0)) bumpp: specifier: ^9.5.2 version: 9.8.1(magicast@0.3.5) cross-env: specifier: ^5.2.0 version: 5.2.1 - cypress: - specifier: ^12.17.1 - version: 12.17.4 - cypress-recurse: - specifier: ^1.23.0 - version: 1.35.3 electron: specifier: ^13 version: 13.6.9 @@ -89,9 +86,6 @@ importers: odiff-bin: specifier: ^2.5.0 version: 2.6.1 - playwright: - specifier: ^1.48.1 - version: 1.48.2 prettier: specifier: ^3.0.0 version: 3.3.3 @@ -325,7 +319,7 @@ importers: devDependencies: '@vitest/browser': specifier: 2.1.3 - version: 2.1.3(@types/node@18.19.64)(@vitest/spy@2.1.5)(playwright@1.48.2)(typescript@5.6.3)(vite@5.4.11(@types/node@18.19.64)(sass@1.81.0))(vitest@2.1.5) + version: 2.1.3(@types/node@18.19.64)(@vitest/spy@2.1.5)(playwright@1.53.1)(typescript@5.6.3)(vite@5.4.11(@types/node@18.19.64)(sass@1.81.0))(vitest@2.1.5) packages: @@ -416,10 +410,6 @@ packages: resolution: {integrity: sha512-YstAqNb0MCN8PjdLCDfRsBcGVRN41f3vgLvaI0IrIcBp4AqILRSS0DeWNGkicC+f/zRIPJLc+9RURVSepwvfBw==} hasBin: true - '@colors/colors@1.5.0': - resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} - engines: {node: '>=0.1.90'} - '@commitlint/cli@11.0.0': resolution: {integrity: sha512-YWZWg1DuqqO5Zjh7vUOeSX76vm0FFyz4y0cpGMFhrhvUi5unc4IVfCXZ6337R9zxuBtmveiRuuhQqnRRer+13g==} engines: {node: '>=v10.22.0'} @@ -489,13 +479,6 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@cypress/request@2.88.12': - resolution: {integrity: sha512-tOn+0mDZxASFM+cuAP9szGUGPI1HwWVSvdzm7V4cCsPdFTx6qMj29CwaQmRAMIEhORIUBFBsYROYJcveK4uOjA==} - engines: {node: '>= 6'} - - '@cypress/xvfb@1.2.4': - resolution: {integrity: sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==} - '@electron/get@1.14.1': resolution: {integrity: sha512-BrZYyL/6m0ZXz/lDxy/nlVhQz+WF+iPS6qXolEU8atw7h6v1aYkjwJZ63m+bJMBTxDE66X+r2tPS4a/8C82sZw==} engines: {node: '>=8.6'} @@ -1009,6 +992,11 @@ packages: resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@playwright/test@1.53.1': + resolution: {integrity: sha512-Z4c23LHV0muZ8hfv4jw6HngPJkbbtZxTkxPNIg7cJcTc9C28N/p2q7g3JZS2SiKBBHJ3uM1dgDye66bB7LEk5w==} + engines: {node: '>=18'} + hasBin: true + '@polka/url@1.0.0-next.28': resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==} @@ -1274,9 +1262,6 @@ packages: '@types/node@14.18.63': resolution: {integrity: sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==} - '@types/node@16.18.119': - resolution: {integrity: sha512-ia7V9a2FnhUFfetng4/sRPBMTwHZUkPFY736rb1cg9AgG7MZdR97q7/nLR9om+sq5f1la9C857E0l/nrI0RiFQ==} - '@types/node@18.19.64': resolution: {integrity: sha512-955mDqvO2vFf/oL7V3WiUtiz+BugyX8uVbaT2H8oj3+8dRyH2FLiNdowe7eNqRM7IOIZvzDH76EoAT+gwm6aIQ==} @@ -1295,23 +1280,14 @@ packages: '@types/semver@7.5.8': resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} - '@types/sinonjs__fake-timers@8.1.1': - resolution: {integrity: sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==} - - '@types/sizzle@2.3.9': - resolution: {integrity: sha512-xzLEyKB50yqCUPUJkIsrVvoWNfFUbIZI+RspLWt8u+tIW/BetMBZtgV2LY/2o+tYH8dRvQ+eoPf3NdhQCcLE2w==} - '@types/statuses@2.0.5': resolution: {integrity: sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==} '@types/tough-cookie@4.0.5': resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} - '@types/webxr@0.5.20': - resolution: {integrity: sha512-JGpU6qiIJQKUuVSKx1GtQnHJGxRjtfGIhzO2ilq43VZZS//f1h1Sgexbdk+Lq+7569a6EYhOWrUpIruR/1Enmg==} - - '@types/yauzl@2.10.3': - resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + '@types/webxr@0.5.22': + resolution: {integrity: sha512-Vr6Stjv5jPRqH690f5I5GLjVk8GSsoQSYJ2FVd/3jJF7KaqfwPi3ehfBS96mlQ2kPCwZaX6U0rG2+NGHBKkA/A==} '@typescript-eslint/eslint-plugin@6.21.0': resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} @@ -1523,9 +1499,6 @@ packages: resolution: {integrity: sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==} engines: {node: '>=8'} - arch@2.2.0: - resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} - archy@1.0.0: resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} @@ -1552,13 +1525,6 @@ packages: resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} engines: {node: '>=0.10.0'} - asn1@0.2.6: - resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} - - assert-plus@1.0.0: - resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} - engines: {node: '>=0.8'} - assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} @@ -1567,31 +1533,13 @@ packages: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} - async@3.2.6: - resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} - - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - at-least-node@1.0.0: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} engines: {node: '>= 4.0.0'} - aws-sign2@0.7.0: - resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} - - aws4@1.13.2: - resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} - balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - bcrypt-pbkdf@1.0.2: - resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} - binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} @@ -1599,12 +1547,6 @@ packages: bl@2.2.1: resolution: {integrity: sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==} - blob-util@2.0.2: - resolution: {integrity: sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==} - - bluebird@3.7.2: - resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} - boolean@3.2.0: resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. @@ -1630,9 +1572,6 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} @@ -1658,18 +1597,10 @@ packages: resolution: {integrity: sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==} engines: {node: '>=8'} - cachedir@2.4.0: - resolution: {integrity: sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==} - engines: {node: '>=6'} - caching-transform@4.0.0: resolution: {integrity: sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==} engines: {node: '>=8'} - call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} - call-me-maybe@1.0.2: resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} @@ -1688,9 +1619,6 @@ packages: caniuse-lite@1.0.30001680: resolution: {integrity: sha512-rPQy70G6AGUMnbwS1z6Xg+RkHYPAi18ihs47GH0jcxIG7wArmPgY3XbS2sRdBbxJljp3thdT8BIqv9ccCypiPA==} - caseless@0.12.0: - resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} - chai@5.1.2: resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==} engines: {node: '>=12'} @@ -1707,10 +1635,6 @@ packages: resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} engines: {node: '>= 16'} - check-more-types@2.24.0: - resolution: {integrity: sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==} - engines: {node: '>= 0.8.0'} - chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -1723,10 +1647,6 @@ packages: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} - ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} - citty@0.1.6: resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} @@ -1738,10 +1658,6 @@ packages: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} - cli-table3@0.6.5: - resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} - engines: {node: 10.* || >= 12.*} - cli-truncate@2.1.0: resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} engines: {node: '>=8'} @@ -1770,10 +1686,6 @@ packages: colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -1781,10 +1693,6 @@ packages: resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} engines: {node: '>= 6'} - common-tags@1.8.2: - resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} - engines: {node: '>=4.0.0'} - commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} @@ -1834,9 +1742,6 @@ packages: core-js@3.39.0: resolution: {integrity: sha512-raM0ew0/jJUqkJ0E6e8UDtl+y/7ktFivgWvqw8dNSQeNWoSDLvQ1H/RN3aPXB9tBd4/FhyR4RDPGhsNIMsAn7g==} - core-util-is@1.0.2: - resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} - core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -1860,28 +1765,13 @@ packages: resolution: {integrity: sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==} engines: {node: '>= 8'} - cypress-recurse@1.35.3: - resolution: {integrity: sha512-NbFOpEuZT4tFqAB0jQqel7WtVNDe8pvSHE2TfXvYk4pspf3wq98OC2RhhLn3bMnoCnPtY4IHO7e37c+CZ9HnMA==} - - cypress@12.17.4: - resolution: {integrity: sha512-gAN8Pmns9MA5eCDFSDJXWKUpaL3IDd89N9TtIupjYnzLSmlpVr+ZR+vb4U/qaMp+lB6tBvAmt7504c3Z4RU5KQ==} - engines: {node: ^14.0.0 || ^16.0.0 || >=18.0.0} - hasBin: true - dargs@7.0.0: resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} engines: {node: '>=8'} - dashdash@1.14.1: - resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} - engines: {node: '>=0.10'} - dat.gui@0.7.9: resolution: {integrity: sha512-sCNc1OHobc+Erc1HqiswYgHdVNpSJUlk/Hz8vzOCsER7rl+oF/4+v8GXFUyCgtXpoCX6+bnmg07DedLvBLwYKQ==} - dayjs@1.11.13: - resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} - debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -1890,14 +1780,6 @@ packages: supports-color: optional: true - debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@4.3.7: resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} engines: {node: '>=6.0'} @@ -1951,10 +1833,6 @@ packages: defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} - delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} @@ -2002,9 +1880,6 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - ecc-jsbn@0.1.2: - resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} - electron-to-chromium@1.5.62: resolution: {integrity: sha512-t8c+zLmJHa9dJy96yBZRXGQYoiCEnHYgFwn1asvSPZSUdVxnB62A4RASd7k41ytG3ErFBA0TpHlKg9D9SQBmLg==} @@ -2185,10 +2060,6 @@ packages: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} - escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -2269,9 +2140,6 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - eventemitter2@6.4.7: - resolution: {integrity: sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==} - events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} @@ -2284,30 +2152,14 @@ packages: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} - executable@4.1.1: - resolution: {integrity: sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==} - engines: {node: '>=4'} - expect-type@1.1.0: resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} engines: {node: '>=12.0.0'} - extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - extract-zip@1.7.0: resolution: {integrity: sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==} hasBin: true - extract-zip@2.0.1: - resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} - engines: {node: '>= 10.17.0'} - hasBin: true - - extsprintf@1.3.0: - resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} - engines: {'0': node >=0.6.0} - falafel@2.2.5: resolution: {integrity: sha512-HuC1qF9iTnHDnML9YZAdCDQwT0yKl/U55K4XSUXqGAA2GLoafFgWRqdAbhWJxXaYD4pyoVxAJ8wH670jMpI9DQ==} engines: {node: '>=0.4.0'} @@ -2342,10 +2194,6 @@ packages: picomatch: optional: true - figures@3.2.0: - resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} - engines: {node: '>=8'} - file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -2381,13 +2229,6 @@ packages: resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} engines: {node: '>=14'} - forever-agent@0.6.1: - resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} - - form-data@2.3.3: - resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} - engines: {node: '>= 0.12'} - from2@2.3.0: resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} @@ -2464,12 +2305,6 @@ packages: get-tsconfig@4.8.1: resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} - getos@3.2.1: - resolution: {integrity: sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==} - - getpass@0.1.7: - resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} - giget@1.2.3: resolution: {integrity: sha512-8EHPljDvs7qKykr6uw8b+lqLiUc/vUg+KVTI0uND4s63TdsZM2Xus3mflvF0DDG9SiM4RlCkFGL+7aAjRmV7KA==} hasBin: true @@ -2503,10 +2338,6 @@ packages: resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} engines: {node: '>=4'} - global-dirs@3.0.1: - resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} - engines: {node: '>=10'} - global-tunnel-ng@2.7.1: resolution: {integrity: sha512-4s+DyciWBV0eK148wqXxcmVAbFVPqtc3sEtUE/GTQfuU80rySLcMhUmHKSHI7/LDj8q0gDYI1lIhRRB7ieRAqg==} engines: {node: '>=0.10'} @@ -2633,10 +2464,6 @@ packages: http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} - http-signature@1.3.6: - resolution: {integrity: sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==} - engines: {node: '>=0.10'} - human-signals@1.1.1: resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} engines: {node: '>=8.12.0'} @@ -2645,17 +2472,11 @@ packages: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} - humanize-duration@3.32.1: - resolution: {integrity: sha512-inh5wue5XdfObhu/IGEMiA1nUXigSGcaKNemcbLRKa7jXYGDZXr3LoT9pTIzq2hPEbld7w/qv9h+ikWGz8fL1g==} - husky@8.0.3: resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} engines: {node: '>=14'} hasBin: true - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -2685,10 +2506,6 @@ packages: ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - ini@2.0.0: - resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} - engines: {node: '>=10'} - is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} @@ -2696,10 +2513,6 @@ packages: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} - is-ci@3.0.1: - resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} - hasBin: true - is-core-module@2.15.1: resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} engines: {node: '>= 0.4'} @@ -2716,10 +2529,6 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} - is-installed-globally@0.4.0: - resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} - engines: {node: '>=10'} - is-module@1.0.0: resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} @@ -2788,9 +2597,6 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - isstream@0.1.2: - resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} - istanbul-lib-coverage@3.2.2: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} @@ -2841,9 +2647,6 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true - jsbn@0.1.1: - resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} - jscc@1.1.1: resolution: {integrity: sha512-anpZkTXwZbxfxLEBMciKxXMHx2xOLK2qhynIhTnoSyC+wGOEPrAoofxnADgblbarn0kijVMt1U71cQGmRF/1Og==} engines: {node: '>=6.0'} @@ -2865,9 +2668,6 @@ packages: json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - json-schema@0.4.0: - resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} - json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} @@ -2892,10 +2692,6 @@ packages: resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} engines: {'0': node >= 0.2.0} - jsprim@2.0.2: - resolution: {integrity: sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==} - engines: {'0': node >=0.6.0} - keyv@3.1.0: resolution: {integrity: sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==} @@ -2910,10 +2706,6 @@ packages: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} - lazy-ass@1.6.0: - resolution: {integrity: sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==} - engines: {node: '> 0.8'} - levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -2948,9 +2740,6 @@ packages: lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - lodash.once@4.1.1: - resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} - lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} @@ -3040,14 +2829,6 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - mime@2.6.0: resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} engines: {node: '>=4.0.0'} @@ -3203,10 +2984,6 @@ packages: engines: {node: ^14.16.0 || >=16.10.0} hasBin: true - object-inspect@1.13.3: - resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} - engines: {node: '>= 0.4'} - object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} @@ -3240,9 +3017,6 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} - ospath@1.2.2: - resolution: {integrity: sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==} - ospec@3.1.0: resolution: {integrity: sha512-+nGtjV3vlADp+UGfL51miAh/hB4awPBkQrArhcgG4trAaoA2gKt5bf9w0m9ch9zOr555cHWaCHZEDiBOkNZSxw==} hasBin: true @@ -3348,9 +3122,6 @@ packages: perfect-debounce@1.0.0: resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} - performance-now@2.1.0: - resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} - picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -3362,10 +3133,6 @@ packages: resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} engines: {node: '>=12'} - pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} - pify@3.0.0: resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} engines: {node: '>=4'} @@ -3377,13 +3144,13 @@ packages: pkg-types@1.2.1: resolution: {integrity: sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==} - playwright-core@1.48.2: - resolution: {integrity: sha512-sjjw+qrLFlriJo64du+EK0kJgZzoQPsabGF4lBvsid+3CNIZIYLgnMj9V6JY5VhM2Peh20DJWIVpVljLLnlawA==} + playwright-core@1.53.1: + resolution: {integrity: sha512-Z46Oq7tLAyT0lGoFx4DOuB1IA9D1TPj0QkYxpPVUnGDqHHvDpCftu1J2hM2PiWsNMoZh8+LQaarAWcDfPBc6zg==} engines: {node: '>=18'} hasBin: true - playwright@1.48.2: - resolution: {integrity: sha512-NjYvYgp4BPmiwfe31j4gHLa3J7bD2WiBz8Lk2RoSsmX38SVIARZ18VYjxLjAcDsAhA+F4iSEXTSGgjua0rrlgQ==} + playwright@1.53.1: + resolution: {integrity: sha512-LJ13YLr/ocweuwxyGf1XNFWIU4M2zUSo149Qbp+A4cpwDjsxRPj7k6H25LBrEHiEwxvRbD8HdwvQmRMSvquhYw==} engines: {node: '>=18'} hasBin: true @@ -3411,10 +3178,6 @@ packages: engines: {node: '>=14'} hasBin: true - pretty-bytes@5.6.0: - resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} - engines: {node: '>=6'} - pretty-format@27.5.1: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -3426,10 +3189,6 @@ packages: resolution: {integrity: sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q==} engines: {node: '>=8'} - process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} - progress@2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} @@ -3441,9 +3200,6 @@ packages: proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} - proxy-from-env@1.0.0: - resolution: {integrity: sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==} - psl@1.10.0: resolution: {integrity: sha512-KSKHEbjAnpUuAUserOq0FxGXCUrzC3WniuSJhvdbs102rL55266ZcHBqLWOsG30spQMlPdpy7icATiAQehg/iA==} @@ -3462,10 +3218,6 @@ packages: (For a CapTP with native promises, see @endo/eventual-send and @endo/captp) - qs@6.10.4: - resolution: {integrity: sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==} - engines: {node: '>=0.6'} - querystringify@2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} @@ -3519,9 +3271,6 @@ packages: resolution: {integrity: sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==} engines: {node: '>=4'} - request-progress@3.0.0: - resolution: {integrity: sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==} - require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -3635,9 +3384,6 @@ packages: safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - sass@1.81.0: resolution: {integrity: sha512-Q4fOxRfhmv3sqCLoGfvrC9pRV8btc0UtqL9mN6Yrv6Qi9ScL55CVH1vlPP863ISLEEMNLLuu9P+enCeGHlnzhA==} engines: {node: '>=14.0.0'} @@ -3671,10 +3417,6 @@ packages: set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - shallow-copy@0.0.1: resolution: {integrity: sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==} @@ -3694,10 +3436,6 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} - engines: {node: '>= 0.4'} - siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} @@ -3768,11 +3506,6 @@ packages: sprintf-js@1.1.3: resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} - sshpk@1.18.0: - resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} - engines: {node: '>=0.10.0'} - hasBin: true - stack-trace@0.0.9: resolution: {integrity: sha512-vjUc6sfgtgY0dxCdnc40mK6Oftjo9+2K8H/NG81TMhgL392FtiPA9tn9RLyTxXmTLPJPjF3VyzFp6bsWFLisMQ==} @@ -3860,10 +3593,6 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} @@ -3891,9 +3620,6 @@ packages: text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - throttleit@1.0.1: - resolution: {integrity: sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ==} - through2@0.6.5: resolution: {integrity: sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==} @@ -3928,10 +3654,6 @@ packages: resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} engines: {node: '>=14.0.0'} - tmp@0.2.3: - resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} - engines: {node: '>=14.14'} - to-readable-stream@1.0.0: resolution: {integrity: sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==} engines: {node: '>=6'} @@ -3975,16 +3697,10 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - tunnel@0.0.6: resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==} engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} - tweetnacl@0.14.5: - resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} - type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -4050,10 +3766,6 @@ packages: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} - untildify@4.0.0: - resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} - engines: {node: '>=8'} - update-browserslist-db@1.1.1: resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} hasBin: true @@ -4083,10 +3795,6 @@ packages: validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - verror@1.10.0: - resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} - engines: {'0': node >=0.6.0} - vite-node@2.1.3: resolution: {integrity: sha512-I1JadzO+xYX887S39Do+paRePCKoiDrWRRjp9kkG5he0t7RXNvPAJPCQSJqbGN4uCrFFeS3Kj3sLqY8NMYBEdA==} engines: {node: ^18.0.0 || >=20.0.0} @@ -4336,7 +4044,7 @@ snapshots: '@babel/traverse': 7.25.9 '@babel/types': 7.26.0 convert-source-map: 2.0.0 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -4407,7 +4115,7 @@ snapshots: '@babel/parser': 7.26.2 '@babel/template': 7.25.9 '@babel/types': 7.26.0 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -4436,9 +4144,6 @@ snapshots: dependencies: commander: 2.20.3 - '@colors/colors@1.5.0': - optional: true - '@commitlint/cli@11.0.0': dependencies: '@babel/runtime': 7.26.0 @@ -4531,37 +4236,9 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@cypress/request@2.88.12': - dependencies: - aws-sign2: 0.7.0 - aws4: 1.13.2 - caseless: 0.12.0 - combined-stream: 1.0.8 - extend: 3.0.2 - forever-agent: 0.6.1 - form-data: 2.3.3 - http-signature: 1.3.6 - is-typedarray: 1.0.0 - isstream: 0.1.2 - json-stringify-safe: 5.0.1 - mime-types: 2.1.35 - performance-now: 2.1.0 - qs: 6.10.4 - safe-buffer: 5.2.1 - tough-cookie: 4.1.4 - tunnel-agent: 0.6.0 - uuid: 8.3.2 - - '@cypress/xvfb@1.2.4(supports-color@8.1.1)': - dependencies: - debug: 3.2.7(supports-color@8.1.1) - lodash.once: 4.1.1 - transitivePeerDependencies: - - supports-color - '@electron/get@1.14.1': dependencies: - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7 env-paths: 2.2.1 fs-extra: 8.1.0 got: 9.6.0 @@ -4659,7 +4336,7 @@ snapshots: '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7 espree: 9.6.1 globals: 13.24.0 ignore: 5.3.2 @@ -4747,7 +4424,7 @@ snapshots: '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -4985,6 +4662,10 @@ snapshots: '@pkgr/core@0.1.1': {} + '@playwright/test@1.53.1': + dependencies: + playwright: 1.53.1 + '@polka/url@1.0.0-next.28': {} '@rollup/plugin-commonjs@17.1.0(rollup@2.79.2)': @@ -5196,8 +4877,6 @@ snapshots: '@types/node@14.18.63': {} - '@types/node@16.18.119': {} - '@types/node@18.19.64': dependencies: undici-types: 5.26.5 @@ -5216,20 +4895,11 @@ snapshots: '@types/semver@7.5.8': {} - '@types/sinonjs__fake-timers@8.1.1': {} - - '@types/sizzle@2.3.9': {} - '@types/statuses@2.0.5': {} '@types/tough-cookie@4.0.5': {} - '@types/webxr@0.5.20': {} - - '@types/yauzl@2.10.3': - dependencies: - '@types/node': 18.19.64 - optional: true + '@types/webxr@0.5.22': {} '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3)': dependencies: @@ -5239,7 +4909,7 @@ snapshots: '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.1)(typescript@5.6.3) '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.6.3) '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7 eslint: 8.57.1 graphemer: 1.4.0 ignore: 5.3.2 @@ -5257,7 +4927,7 @@ snapshots: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.6.3) '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7 eslint: 8.57.1 optionalDependencies: typescript: 5.6.3 @@ -5273,7 +4943,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.6.3) '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.6.3) - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7 eslint: 8.57.1 ts-api-utils: 1.4.0(typescript@5.6.3) optionalDependencies: @@ -5287,7 +4957,7 @@ snapshots: dependencies: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 @@ -5319,7 +4989,7 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@vitest/browser@2.1.3(@types/node@18.19.64)(@vitest/spy@2.1.3)(playwright@1.48.2)(typescript@5.6.3)(vite@5.4.11(@types/node@18.19.64)(sass@1.81.0))(vitest@2.1.3)': + '@vitest/browser@2.1.3(@types/node@18.19.64)(@vitest/spy@2.1.3)(typescript@5.6.3)(vite@5.4.11(@types/node@18.19.64)(sass@1.81.0))(vitest@2.1.3)': dependencies: '@testing-library/dom': 10.4.0 '@testing-library/user-event': 14.5.2(@testing-library/dom@10.4.0) @@ -5331,8 +5001,6 @@ snapshots: tinyrainbow: 1.2.0 vitest: 2.1.3(@types/node@18.19.64)(@vitest/browser@2.1.3)(msw@2.6.5(@types/node@18.19.64)(typescript@5.6.3))(sass@1.81.0) ws: 8.18.0 - optionalDependencies: - playwright: 1.48.2 transitivePeerDependencies: - '@types/node' - '@vitest/spy' @@ -5342,7 +5010,7 @@ snapshots: - vite optional: true - '@vitest/browser@2.1.3(@types/node@18.19.64)(@vitest/spy@2.1.5)(playwright@1.48.2)(typescript@5.6.3)(vite@5.4.11(@types/node@18.19.64)(sass@1.81.0))(vitest@2.1.5)': + '@vitest/browser@2.1.3(@types/node@18.19.64)(@vitest/spy@2.1.5)(playwright@1.53.1)(typescript@5.6.3)(vite@5.4.11(@types/node@18.19.64)(sass@1.81.0))(vitest@2.1.5)': dependencies: '@testing-library/dom': 10.4.0 '@testing-library/user-event': 14.5.2(@testing-library/dom@10.4.0) @@ -5355,7 +5023,7 @@ snapshots: vitest: 2.1.5(@types/node@18.19.64)(@vitest/browser@2.1.3)(msw@2.6.5(@types/node@18.19.64)(typescript@5.6.3))(sass@1.81.0) ws: 8.18.0 optionalDependencies: - playwright: 1.48.2 + playwright: 1.53.1 transitivePeerDependencies: - '@types/node' - '@vitest/spy' @@ -5364,11 +5032,11 @@ snapshots: - utf-8-validate - vite - '@vitest/coverage-v8@2.1.3(@vitest/browser@2.1.3)(vitest@2.1.3)': + '@vitest/coverage-v8@2.1.3(@vitest/browser@2.1.3(@types/node@18.19.64)(@vitest/spy@2.1.3)(typescript@5.6.3)(vite@5.4.11(@types/node@18.19.64)(sass@1.81.0))(vitest@2.1.3))(vitest@2.1.3(@types/node@18.19.64)(@vitest/browser@2.1.3)(msw@2.6.5(@types/node@18.19.64)(typescript@5.6.3))(sass@1.81.0))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 5.0.6 @@ -5380,7 +5048,7 @@ snapshots: tinyrainbow: 1.2.0 vitest: 2.1.3(@types/node@18.19.64)(@vitest/browser@2.1.3)(msw@2.6.5(@types/node@18.19.64)(typescript@5.6.3))(sass@1.81.0) optionalDependencies: - '@vitest/browser': 2.1.3(@types/node@18.19.64)(@vitest/spy@2.1.3)(playwright@1.48.2)(typescript@5.6.3)(vite@5.4.11(@types/node@18.19.64)(sass@1.81.0))(vitest@2.1.3) + '@vitest/browser': 2.1.3(@types/node@18.19.64)(@vitest/spy@2.1.3)(typescript@5.6.3)(vite@5.4.11(@types/node@18.19.64)(sass@1.81.0))(vitest@2.1.3) transitivePeerDependencies: - supports-color @@ -5531,8 +5199,6 @@ snapshots: dependencies: default-require-extensions: 3.0.1 - arch@2.2.0: {} - archy@1.0.0: {} arg@4.1.3: {} @@ -5553,34 +5219,14 @@ snapshots: arrify@1.0.1: {} - asn1@0.2.6: - dependencies: - safer-buffer: 2.1.2 - - assert-plus@1.0.0: {} - assertion-error@2.0.1: {} astral-regex@2.0.0: {} - async@3.2.6: {} - - asynckit@0.4.0: {} - at-least-node@1.0.0: {} - aws-sign2@0.7.0: {} - - aws4@1.13.2: {} - balanced-match@1.0.2: {} - base64-js@1.5.1: {} - - bcrypt-pbkdf@1.0.2: - dependencies: - tweetnacl: 0.14.5 - binary-extensions@2.3.0: {} bl@2.2.1: @@ -5588,10 +5234,6 @@ snapshots: readable-stream: 2.3.8 safe-buffer: 5.2.1 - blob-util@2.0.2: {} - - bluebird@3.7.2: {} - boolean@3.2.0: optional: true @@ -5619,11 +5261,6 @@ snapshots: buffer-from@1.1.2: {} - buffer@5.7.1: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - builtin-modules@3.3.0: {} bumpp@9.8.1(magicast@0.3.5): @@ -5669,8 +5306,6 @@ snapshots: normalize-url: 4.5.1 responselike: 1.0.2 - cachedir@2.4.0: {} - caching-transform@4.0.0: dependencies: hasha: 5.2.2 @@ -5678,14 +5313,6 @@ snapshots: package-hash: 4.0.0 write-file-atomic: 3.0.3 - call-bind@1.0.7: - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - set-function-length: 1.2.2 - call-me-maybe@1.0.2: {} callsites@3.1.0: {} @@ -5700,8 +5327,6 @@ snapshots: caniuse-lite@1.0.30001680: {} - caseless@0.12.0: {} - chai@5.1.2: dependencies: assertion-error: 2.0.1 @@ -5722,8 +5347,6 @@ snapshots: check-error@2.1.1: {} - check-more-types@2.24.0: {} - chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -5742,8 +5365,6 @@ snapshots: chownr@2.0.0: {} - ci-info@3.9.0: {} - citty@0.1.6: dependencies: consola: 3.2.3 @@ -5754,12 +5375,6 @@ snapshots: dependencies: restore-cursor: 3.1.0 - cli-table3@0.6.5: - dependencies: - string-width: 4.2.3 - optionalDependencies: - '@colors/colors': 1.5.0 - cli-truncate@2.1.0: dependencies: slice-ansi: 3.0.0 @@ -5791,16 +5406,10 @@ snapshots: colorette@2.0.20: {} - combined-stream@1.0.8: - dependencies: - delayed-stream: 1.0.0 - commander@2.20.3: {} commander@6.2.1: {} - common-tags@1.8.2: {} - commondir@1.0.1: {} compare-func@2.0.0: @@ -5855,8 +5464,6 @@ snapshots: core-js@3.39.0: {} - core-util-is@1.0.2: {} - core-util-is@1.0.3: {} cosmiconfig@7.1.0: @@ -5887,81 +5494,17 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - cypress-recurse@1.35.3: - dependencies: - humanize-duration: 3.32.1 - - cypress@12.17.4: - dependencies: - '@cypress/request': 2.88.12 - '@cypress/xvfb': 1.2.4(supports-color@8.1.1) - '@types/node': 16.18.119 - '@types/sinonjs__fake-timers': 8.1.1 - '@types/sizzle': 2.3.9 - arch: 2.2.0 - blob-util: 2.0.2 - bluebird: 3.7.2 - buffer: 5.7.1 - cachedir: 2.4.0 - chalk: 4.1.2 - check-more-types: 2.24.0 - cli-cursor: 3.1.0 - cli-table3: 0.6.5 - commander: 6.2.1 - common-tags: 1.8.2 - dayjs: 1.11.13 - debug: 4.3.7(supports-color@8.1.1) - enquirer: 2.4.1 - eventemitter2: 6.4.7 - execa: 4.1.0 - executable: 4.1.1 - extract-zip: 2.0.1(supports-color@8.1.1) - figures: 3.2.0 - fs-extra: 9.1.0 - getos: 3.2.1 - is-ci: 3.0.1 - is-installed-globally: 0.4.0 - lazy-ass: 1.6.0 - listr2: 3.14.0(enquirer@2.4.1) - lodash: 4.17.21 - log-symbols: 4.1.0 - minimist: 1.2.8 - ospath: 1.2.2 - pretty-bytes: 5.6.0 - process: 0.11.10 - proxy-from-env: 1.0.0 - request-progress: 3.0.0 - semver: 7.6.3 - supports-color: 8.1.1 - tmp: 0.2.3 - untildify: 4.0.0 - yauzl: 2.10.0 - dargs@7.0.0: {} - dashdash@1.14.1: - dependencies: - assert-plus: 1.0.0 - dat.gui@0.7.9: {} - dayjs@1.11.13: {} - debug@2.6.9: dependencies: ms: 2.0.0 - debug@3.2.7(supports-color@8.1.1): + debug@4.3.7: dependencies: ms: 2.1.3 - optionalDependencies: - supports-color: 8.1.1 - - debug@4.3.7(supports-color@8.1.1): - dependencies: - ms: 2.1.3 - optionalDependencies: - supports-color: 8.1.1 decamelize-keys@1.1.1: dependencies: @@ -5993,6 +5536,7 @@ snapshots: es-define-property: 1.0.0 es-errors: 1.3.0 gopd: 1.0.1 + optional: true define-properties@1.2.1: dependencies: @@ -6003,8 +5547,6 @@ snapshots: defu@6.1.4: {} - delayed-stream@1.0.0: {} - dequal@2.0.3: {} destr@2.0.3: {} @@ -6044,11 +5586,6 @@ snapshots: eastasianwidth@0.2.0: {} - ecc-jsbn@0.1.2: - dependencies: - jsbn: 0.1.1 - safer-buffer: 2.1.2 - electron-to-chromium@1.5.62: {} electron@13.6.9: @@ -6084,8 +5621,10 @@ snapshots: es-define-property@1.0.0: dependencies: get-intrinsic: 1.2.4 + optional: true - es-errors@1.3.0: {} + es-errors@1.3.0: + optional: true es-module-lexer@1.5.4: {} @@ -6204,8 +5743,6 @@ snapshots: escalade@3.2.0: {} - escape-string-regexp@1.0.5: {} - escape-string-regexp@4.0.0: {} escodegen@2.1.0: @@ -6249,7 +5786,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.5 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7 doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -6309,8 +5846,6 @@ snapshots: esutils@2.0.3: {} - eventemitter2@6.4.7: {} - events@3.3.0: {} execa@4.1.0: @@ -6337,14 +5872,8 @@ snapshots: signal-exit: 4.1.0 strip-final-newline: 3.0.0 - executable@4.1.1: - dependencies: - pify: 2.3.0 - expect-type@1.1.0: {} - extend@3.0.2: {} - extract-zip@1.7.0: dependencies: concat-stream: 1.6.2 @@ -6354,18 +5883,6 @@ snapshots: transitivePeerDependencies: - supports-color - extract-zip@2.0.1(supports-color@8.1.1): - dependencies: - debug: 4.3.7(supports-color@8.1.1) - get-stream: 5.2.0 - yauzl: 2.10.0 - optionalDependencies: - '@types/yauzl': 2.10.3 - transitivePeerDependencies: - - supports-color - - extsprintf@1.3.0: {} - falafel@2.2.5: dependencies: acorn: 7.4.1 @@ -6399,10 +5916,6 @@ snapshots: optionalDependencies: picomatch: 4.0.2 - figures@3.2.0: - dependencies: - escape-string-regexp: 1.0.5 - file-entry-cache@6.0.1: dependencies: flat-cache: 3.2.0 @@ -6445,14 +5958,6 @@ snapshots: cross-spawn: 7.0.5 signal-exit: 4.1.0 - forever-agent@0.6.1: {} - - form-data@2.3.3: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - from2@2.3.0: dependencies: inherits: 2.0.4 @@ -6504,6 +6009,7 @@ snapshots: has-proto: 1.0.3 has-symbols: 1.0.3 hasown: 2.0.2 + optional: true get-own-enumerable-property-symbols@3.0.2: {} @@ -6525,14 +6031,6 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 - getos@3.2.1: - dependencies: - async: 3.2.6 - - getpass@0.1.7: - dependencies: - assert-plus: 1.0.0 - giget@1.2.3: dependencies: citty: 0.1.6 @@ -6592,10 +6090,6 @@ snapshots: dependencies: ini: 1.3.8 - global-dirs@3.0.1: - dependencies: - ini: 2.0.0 - global-tunnel-ng@2.7.1: dependencies: encodeurl: 1.0.2 @@ -6710,6 +6204,7 @@ snapshots: gopd@1.0.1: dependencies: get-intrinsic: 1.2.4 + optional: true got@9.6.0: dependencies: @@ -6740,10 +6235,13 @@ snapshots: has-property-descriptors@1.0.2: dependencies: es-define-property: 1.0.0 + optional: true - has-proto@1.0.3: {} + has-proto@1.0.3: + optional: true - has-symbols@1.0.3: {} + has-symbols@1.0.3: + optional: true hasha@5.2.2: dependencies: @@ -6766,22 +6264,12 @@ snapshots: http-cache-semantics@4.1.1: {} - http-signature@1.3.6: - dependencies: - assert-plus: 1.0.0 - jsprim: 2.0.2 - sshpk: 1.18.0 - human-signals@1.1.1: {} human-signals@5.0.0: {} - humanize-duration@3.32.1: {} - husky@8.0.3: {} - ieee754@1.2.1: {} - ignore@5.3.2: {} immutable@5.0.2: {} @@ -6804,18 +6292,12 @@ snapshots: ini@1.3.8: {} - ini@2.0.0: {} - is-arrayish@0.2.1: {} is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 - is-ci@3.0.1: - dependencies: - ci-info: 3.9.0 - is-core-module@2.15.1: dependencies: hasown: 2.0.2 @@ -6828,11 +6310,6 @@ snapshots: dependencies: is-extglob: 2.1.1 - is-installed-globally@0.4.0: - dependencies: - global-dirs: 3.0.1 - is-path-inside: 3.0.3 - is-module@1.0.0: {} is-node-process@1.2.0: {} @@ -6875,8 +6352,6 @@ snapshots: isexe@2.0.0: {} - isstream@0.1.2: {} - istanbul-lib-coverage@3.2.2: {} istanbul-lib-hook@3.0.0: @@ -6909,7 +6384,7 @@ snapshots: istanbul-lib-source-maps@4.0.1: dependencies: - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7 istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: @@ -6918,7 +6393,7 @@ snapshots: istanbul-lib-source-maps@5.0.6: dependencies: '@jridgewell/trace-mapping': 0.3.25 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7 istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: - supports-color @@ -6947,8 +6422,6 @@ snapshots: dependencies: argparse: 2.0.1 - jsbn@0.1.1: {} - jscc@1.1.1: dependencies: '@jsbits/escape-regex-str': 1.0.3 @@ -6967,11 +6440,10 @@ snapshots: json-schema-traverse@0.4.1: {} - json-schema@0.4.0: {} - json-stable-stringify-without-jsonify@1.0.1: {} - json-stringify-safe@5.0.1: {} + json-stringify-safe@5.0.1: + optional: true json5@2.2.3: {} @@ -6989,13 +6461,6 @@ snapshots: jsonparse@1.3.1: {} - jsprim@2.0.2: - dependencies: - assert-plus: 1.0.0 - extsprintf: 1.3.0 - json-schema: 0.4.0 - verror: 1.10.0 - keyv@3.1.0: dependencies: json-buffer: 3.0.0 @@ -7008,8 +6473,6 @@ snapshots: kleur@3.0.3: {} - lazy-ass@1.6.0: {} - levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -7023,7 +6486,7 @@ snapshots: cli-truncate: 2.1.0 commander: 6.2.1 cosmiconfig: 7.1.0 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7 dedent: 0.7.0 enquirer: 2.4.1 execa: 4.1.0 @@ -7062,8 +6525,6 @@ snapshots: lodash.merge@4.6.2: {} - lodash.once@4.1.1: {} - lodash@4.17.21: {} log-symbols@4.1.0: @@ -7160,12 +6621,6 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 - mime-db@1.52.0: {} - - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 - mime@2.6.0: {} mimic-fn@2.1.0: {} @@ -7347,8 +6802,6 @@ snapshots: pkg-types: 1.2.1 ufo: 1.5.4 - object-inspect@1.13.3: {} - object-keys@1.1.1: optional: true @@ -7383,8 +6836,6 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 - ospath@1.2.2: {} - ospec@3.1.0: dependencies: glob: 7.2.3 @@ -7470,16 +6921,12 @@ snapshots: perfect-debounce@1.0.0: {} - performance-now@2.1.0: {} - picocolors@1.1.1: {} picomatch@2.3.1: {} picomatch@4.0.2: {} - pify@2.3.0: {} - pify@3.0.0: optional: true @@ -7493,11 +6940,11 @@ snapshots: mlly: 1.7.3 pathe: 1.1.2 - playwright-core@1.48.2: {} + playwright-core@1.53.1: {} - playwright@1.48.2: + playwright@1.53.1: dependencies: - playwright-core: 1.48.2 + playwright-core: 1.53.1 optionalDependencies: fsevents: 2.3.2 @@ -7521,8 +6968,6 @@ snapshots: prettier@3.3.3: {} - pretty-bytes@5.6.0: {} - pretty-format@27.5.1: dependencies: ansi-regex: 5.0.1 @@ -7535,8 +6980,6 @@ snapshots: dependencies: fromentries: 1.3.2 - process@0.11.10: {} - progress@2.0.3: {} prompts@2.4.2: @@ -7547,8 +6990,6 @@ snapshots: proto-list@1.2.4: optional: true - proxy-from-env@1.0.0: {} - psl@1.10.0: dependencies: punycode: 2.3.1 @@ -7562,10 +7003,6 @@ snapshots: q@1.5.1: {} - qs@6.10.4: - dependencies: - side-channel: 1.0.6 - querystringify@2.2.0: {} queue-microtask@1.2.3: {} @@ -7632,10 +7069,6 @@ snapshots: dependencies: es6-error: 4.1.1 - request-progress@3.0.0: - dependencies: - throttleit: 1.0.1 - require-directory@2.1.1: {} require-main-filename@2.0.0: {} @@ -7772,8 +7205,6 @@ snapshots: safe-buffer@5.2.1: {} - safer-buffer@2.1.2: {} - sass@1.81.0: dependencies: chokidar: 4.0.1 @@ -7799,15 +7230,6 @@ snapshots: set-blocking@2.0.0: {} - set-function-length@1.2.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - shallow-copy@0.0.1: {} shebang-command@1.2.0: @@ -7822,13 +7244,6 @@ snapshots: shebang-regex@3.0.0: {} - side-channel@1.0.6: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - object-inspect: 1.13.3 - siginfo@2.0.0: {} signal-exit@3.0.7: {} @@ -7897,18 +7312,6 @@ snapshots: sprintf-js@1.1.3: optional: true - sshpk@1.18.0: - dependencies: - asn1: 0.2.6 - assert-plus: 1.0.0 - bcrypt-pbkdf: 1.0.2 - dashdash: 1.14.1 - ecc-jsbn: 0.1.2 - getpass: 0.1.7 - jsbn: 0.1.1 - safer-buffer: 2.1.2 - tweetnacl: 0.14.5 - stack-trace@0.0.9: {} stackback@0.0.2: {} @@ -7979,7 +7382,7 @@ snapshots: sumchecker@3.0.1: dependencies: - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7 transitivePeerDependencies: - supports-color @@ -7987,10 +7390,6 @@ snapshots: dependencies: has-flag: 4.0.0 - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - supports-preserve-symlinks-flag@1.0.0: {} synckit@0.9.2: @@ -8023,8 +7422,6 @@ snapshots: text-table@0.2.0: {} - throttleit@1.0.1: {} - through2@0.6.5: dependencies: readable-stream: 1.0.34 @@ -8056,8 +7453,6 @@ snapshots: tinyspy@3.0.2: {} - tmp@0.2.3: {} - to-readable-stream@1.0.0: {} to-regex-range@5.0.1: @@ -8101,15 +7496,9 @@ snapshots: tslib@2.8.1: {} - tunnel-agent@0.6.0: - dependencies: - safe-buffer: 5.2.1 - tunnel@0.0.6: optional: true - tweetnacl@0.14.5: {} - type-check@0.4.0: dependencies: prelude-ls: 1.2.1 @@ -8149,8 +7538,6 @@ snapshots: universalify@2.0.1: {} - untildify@4.0.0: {} - update-browserslist-db@1.1.1(browserslist@4.24.2): dependencies: browserslist: 4.24.2 @@ -8181,16 +7568,10 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - verror@1.10.0: - dependencies: - assert-plus: 1.0.0 - core-util-is: 1.0.2 - extsprintf: 1.3.0 - vite-node@2.1.3(@types/node@18.19.64)(sass@1.81.0): dependencies: cac: 6.7.14 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7 pathe: 1.1.2 vite: 5.4.11(@types/node@18.19.64)(sass@1.81.0) transitivePeerDependencies: @@ -8207,7 +7588,7 @@ snapshots: vite-node@2.1.5(@types/node@18.19.64)(sass@1.81.0): dependencies: cac: 6.7.14 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7 es-module-lexer: 1.5.4 pathe: 1.1.2 vite: 5.4.11(@types/node@18.19.64)(sass@1.81.0) @@ -8252,7 +7633,7 @@ snapshots: '@vitest/spy': 2.1.3 '@vitest/utils': 2.1.3 chai: 5.1.2 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7 magic-string: 0.30.12 pathe: 1.1.2 std-env: 3.8.0 @@ -8265,7 +7646,7 @@ snapshots: why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 18.19.64 - '@vitest/browser': 2.1.3(@types/node@18.19.64)(@vitest/spy@2.1.3)(playwright@1.48.2)(typescript@5.6.3)(vite@5.4.11(@types/node@18.19.64)(sass@1.81.0))(vitest@2.1.3) + '@vitest/browser': 2.1.3(@types/node@18.19.64)(@vitest/spy@2.1.3)(typescript@5.6.3)(vite@5.4.11(@types/node@18.19.64)(sass@1.81.0))(vitest@2.1.3) transitivePeerDependencies: - less - lightningcss @@ -8287,7 +7668,7 @@ snapshots: '@vitest/spy': 2.1.5 '@vitest/utils': 2.1.5 chai: 5.1.2 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7 expect-type: 1.1.0 magic-string: 0.30.12 pathe: 1.1.2 @@ -8301,7 +7682,7 @@ snapshots: why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 18.19.64 - '@vitest/browser': 2.1.3(@types/node@18.19.64)(@vitest/spy@2.1.5)(playwright@1.48.2)(typescript@5.6.3)(vite@5.4.11(@types/node@18.19.64)(sass@1.81.0))(vitest@2.1.5) + '@vitest/browser': 2.1.3(@types/node@18.19.64)(@vitest/spy@2.1.5)(playwright@1.53.1)(typescript@5.6.3)(vite@5.4.11(@types/node@18.19.64)(sass@1.81.0))(vitest@2.1.5) transitivePeerDependencies: - less - lightningcss diff --git a/tests/src/rhi-webgl/WebGLEngine.test.ts b/tests/src/rhi-webgl/WebGLEngine.test.ts index 77ed12865..8d7e2c49a 100644 --- a/tests/src/rhi-webgl/WebGLEngine.test.ts +++ b/tests/src/rhi-webgl/WebGLEngine.test.ts @@ -69,36 +69,37 @@ describe("webgl engine test", () => { }); it("engine device lost", async () => { - const canvas = document.createElement("canvas"); - const engine = await WebGLEngine.create({ canvas }); - const scene = engine.sceneManager.activeScene; - const rootEntity = scene.createRootEntity(); - - // init camera - const cameraEntity = rootEntity.createChild("camera"); - const camera = cameraEntity.addComponent(Camera); - + const engine = await WebGLEngine.create({ canvas: document.createElement("canvas") }); + engine.sceneManager.activeScene.createRootEntity().createChild("camera").addComponent(Camera); engine.run(); - const opLost = vi.fn(() => { + const onLost = vi.fn(() => { console.log("On device lost."); }); const onRestored = vi.fn(() => { console.log("On device restored."); }); - engine.on("devicelost", opLost); + engine.on("devicelost", onLost); engine.on("devicerestored", onRestored); - engine.forceLoseDevice(); - setTimeout(() => { - expect(opLost).toHaveBeenCalledTimes(1); - }, 100); + const originalOnError = window.onerror; + let error: Error | null = null; + window.onerror = (msg, src, line, col, err) => (error = err || new Error(String(msg))); + + try { + engine.forceLoseDevice(); + await new Promise((r) => setTimeout(r, 100)); + expect(onLost).toHaveBeenCalledTimes(1); - setTimeout(() => { engine.forceRestoreDevice(); - }, 1000); + await new Promise((r) => setTimeout(r, 100)); + expect(onRestored).toHaveBeenCalledTimes(1); + + if (error) throw error; + } finally { + window.onerror = originalOnError; + engine.destroy(); + } }); }); -// npx cross-env TS_NODE_PROJECT=tsconfig.tests.json nyc --reporter=lcov floss -p tests/src/*.test.ts -r ts-node/register -// npx cross-env TS_NODE_PROJECT=tsconfig.tests.json nyc --reporter=lcov floss --path tests -r ts-node/register diff --git a/tests/vitest.config.ts b/tests/vitest.config.ts index 782c7177f..91a68ffbc 100644 --- a/tests/vitest.config.ts +++ b/tests/vitest.config.ts @@ -20,7 +20,10 @@ export default defineProject({ name: "chromium", providerOptions: { launch: { - args: ["--use-gl=egl", "--ignore-gpu-blocklist", "--use-gl=angle"] + args: + process.env.HEADLESS === "true" + ? ["--use-gl=egl", "--ignore-gpu-blocklist", "--use-gl=angle", "--headless"] + : ["--use-gl=egl", "--ignore-gpu-blocklist", "--use-gl=angle"] } } }