diff --git a/.github/workflows/cypress.yml b/.github/workflows/tests.yml similarity index 55% rename from .github/workflows/cypress.yml rename to .github/workflows/tests.yml index 494cedb..108ddd4 100644 --- a/.github/workflows/cypress.yml +++ b/.github/workflows/tests.yml @@ -1,4 +1,4 @@ -name: Cypress UI tests +name: Tests on: push: @@ -7,9 +7,17 @@ on: merge_group: pull_request: +env: + VITE_PORT: 3000 + VITE_API_HOST: http://localhost:3636 + VITE_GRAASP_APP_KEY: id-1234567890 + VITE_ENABLE_MOCK_API: true + VITE_VERSION: ci-tests + CI: true + jobs: - cypress-run: - concurrency: cypress-${{ github.head_ref || github.ref }} + run-tests: + concurrency: tests-${{ github.head_ref || github.ref }} runs-on: ubuntu-latest steps: - name: Checkout @@ -17,45 +25,41 @@ jobs: - name: Yarn Install and Cache uses: graasp/graasp-deploy/.github/actions/yarn-install-and-cache@v1 - with: - cypress: true + + - name: Install Playwright Browsers + run: npx playwright install --with-deps - name: Build App run: yarn build:test shell: bash env: - VITE_PORT: 3000 - VITE_API_HOST: http://localhost:3636 - VITE_GRAASP_APP_KEY: id-1234567890 - VITE_ENABLE_MOCK_API: true - VITE_VERSION: cypress-tests + VITE_PORT: ${{ env.VITE_PORT }} + VITE_API_HOST: ${{ env.VITE_API_HOST }} + VITE_GRAASP_APP_KEY: ${{ env.VITE_GRAASP_APP_KEY }} + VITE_ENABLE_MOCK_API: ${{ env.VITE_ENABLE_MOCK_API }} + VITE_VERSION: ${{ env.VITE_VERSION }} + CI: ${{ env.CI }} - name: Vitest Run - run: yarn vitest + run: yarn unittest shell: bash - - name: Cypress Run - uses: cypress-io/github-action@v5 + - name: Playwright Run + run: yarn playwright + shell: bash env: - VITE_PORT: 3000 - VITE_API_HOST: http://localhost:3636 - VITE_GRAASP_APP_KEY: id-1234567890 - VITE_ENABLE_MOCK_API: true - VITE_VERSION: cypress-tests - with: - install: false - config: baseUrl=http://localhost:3000 - start: yarn preview:test - browser: chrome - quiet: true - # point to new cypress@10 config file - config-file: cypress.config.ts + VITE_PORT: ${{ env.VITE_PORT }} + VITE_API_HOST: ${{ env.VITE_API_HOST }} + VITE_GRAASP_APP_KEY: ${{ env.VITE_GRAASP_APP_KEY }} + VITE_ENABLE_MOCK_API: ${{ env.VITE_ENABLE_MOCK_API }} + VITE_VERSION: ${{ env.VITE_VERSION }} + CI: ${{ env.CI }} - uses: actions/upload-artifact@v4 if: failure() with: - name: cypress-screenshots - path: cypress/screenshots + name: playwright-report + path: playwright-report - name: coverage report run: npx nyc report --reporter=text-summary diff --git a/.gitignore b/.gitignore index 3061c42..0ae9422 100644 --- a/.gitignore +++ b/.gitignore @@ -37,7 +37,8 @@ yarn-debug.log* .vscode/* !.vscode/settings.json -# cypress -cypress/screenshots/ -cypress/videos/ -cypress/downloads/ +# Playwright +/test-results/ +/playwright-report/ +/blob-report/ +/playwright/.cache/ diff --git a/cypress.config.ts b/cypress.config.ts deleted file mode 100644 index 2f975bc..0000000 --- a/cypress.config.ts +++ /dev/null @@ -1,29 +0,0 @@ -import registerCodeCoverage from '@cypress/code-coverage/task'; -import { defineConfig } from 'cypress'; - -export default defineConfig({ - video: false, - - e2e: { - env: { - VITE_API_HOST: process.env.VITE_API_HOST, - VITE_ENABLE_MOCK_API: process.env.VITE_ENABLE_MOCK_API, - VITE_GRAASP_APP_KEY: process.env.VITE_GRAASP_APP_KEY, - }, - retries: { runMode: 1, openMode: 0 }, - // We've imported your old cypress plugins here. - // You may want to clean this up later by importing these. - setupNodeEvents(on, config) { - registerCodeCoverage(on, config); - return config; - }, - baseUrl: `http://localhost:${process.env.VITE_PORT || 4001}`, - }, - - component: { - devServer: { - framework: 'react', - bundler: 'vite', - }, - }, -}); diff --git a/cypress/e2e/analytics/main.cy.ts b/cypress/e2e/analytics/main.cy.ts deleted file mode 100644 index 93dd224..0000000 --- a/cypress/e2e/analytics/main.cy.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Context, PermissionLevel } from '@graasp/sdk'; - -import { ANALYTICS_VIEW_CY, buildDataCy } from '../../../src/config/selectors'; - -describe('Analytics View', () => { - beforeEach(() => { - cy.setUpApi( - {}, - { - context: Context.Analytics, - permission: PermissionLevel.Admin, - }, - ); - cy.visit('/'); - }); - - it('App', () => { - cy.get(buildDataCy(ANALYTICS_VIEW_CY)).should( - 'contain.text', - 'Analytics as admin', - ); - }); -}); diff --git a/cypress/e2e/builder/main.cy.ts b/cypress/e2e/builder/main.cy.ts deleted file mode 100644 index 8965659..0000000 --- a/cypress/e2e/builder/main.cy.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Context, PermissionLevel } from '@graasp/sdk'; - -import { BUILDER_VIEW_CY, buildDataCy } from '../../../src/config/selectors'; - -describe('Builder View', () => { - beforeEach(() => { - cy.setUpApi( - {}, - { - context: Context.Builder, - permission: PermissionLevel.Read, - }, - ); - cy.visit('/'); - }); - - it('App', () => { - cy.get(buildDataCy(BUILDER_VIEW_CY)).should( - 'contain.text', - 'Builder as read', - ); - }); -}); diff --git a/cypress/e2e/player/main.cy.ts b/cypress/e2e/player/main.cy.ts deleted file mode 100644 index 91942ad..0000000 --- a/cypress/e2e/player/main.cy.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Context, PermissionLevel } from '@graasp/sdk'; - -import { PLAYER_VIEW_CY, buildDataCy } from '../../../src/config/selectors'; - -describe('Player View', () => { - beforeEach(() => { - cy.setUpApi( - {}, - { - context: Context.Player, - permission: PermissionLevel.Write, - }, - ); - cy.visit('/'); - }); - - it('App', () => { - cy.get(buildDataCy(PLAYER_VIEW_CY)).should('be.visible'); - }); -}); diff --git a/cypress/fixtures/members.ts b/cypress/fixtures/members.ts deleted file mode 100644 index 00f3f71..0000000 --- a/cypress/fixtures/members.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Member, MemberType } from '@graasp/sdk'; - -export const MEMBERS: { [key: string]: Member } = { - ANNA: { - id: '0f0a2774-a965-4b97-afb4-bccc3796e060', - name: 'anna', - type: MemberType.Individual, - email: 'anna@graasp.org', - extra: {}, - createdAt: new Date(), - updatedAt: new Date(), - }, - BOB: { - id: '1f0a2774-a965-4b97-afb4-bccc3796e060', - name: 'bob', - type: MemberType.Individual, - email: 'bob@graasp.org', - extra: {}, - createdAt: new Date(), - updatedAt: new Date(), - }, -}; - -export const CURRENT_MEMBER = MEMBERS.ANNA; diff --git a/cypress/fixtures/mockItem.ts b/cypress/fixtures/mockItem.ts deleted file mode 100644 index 9bddc8d..0000000 --- a/cypress/fixtures/mockItem.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { MEMBERS } from './members'; - -export const MOCK_SERVER_ITEM = { - id: '123456789', - name: 'app-starter-ts-vite', - description: null, - path: '', - settings: {}, - creator: MEMBERS[0], - createdAt: new Date(), - updatedAt: new Date(), -}; diff --git a/cypress/support/commands.ts b/cypress/support/commands.ts deleted file mode 100644 index 3c39d3f..0000000 --- a/cypress/support/commands.ts +++ /dev/null @@ -1,43 +0,0 @@ -/// -import { Database, LocalContext } from '@graasp/apps-query-client'; - -import { CURRENT_MEMBER, MEMBERS } from '../fixtures/members'; -import { MOCK_SERVER_ITEM } from '../fixtures/mockItem'; - -declare global { - // eslint-disable-next-line @typescript-eslint/no-namespace - namespace Cypress { - interface Chainable { - /** - * Custom command to select DOM element by data-cy attribute. - * @example cy.dataCy('greeting') - */ - setUpApi( - database: Partial, - appContext: Partial, - ): void; - } - } -} - -Cypress.Commands.add('setUpApi', (database, appContext) => { - Cypress.on('window:before:load', (win: Window) => { - win.indexedDB.deleteDatabase('graasp-app-cypress'); - // eslint-disable-next-line no-param-reassign - win.appContext = { - memberId: CURRENT_MEMBER.id, - itemId: MOCK_SERVER_ITEM.id, - apiHost: Cypress.env('VITE_API_HOST'), - ...appContext, - }; - // eslint-disable-next-line no-param-reassign - win.database = { - appData: [], - appActions: [], - appSettings: [], - members: Object.values(MEMBERS), - items: [MOCK_SERVER_ITEM], - ...database, - }; - }); -}); diff --git a/cypress/support/component-index.html b/cypress/support/component-index.html deleted file mode 100644 index e39ba42..0000000 --- a/cypress/support/component-index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - Components App - - -
- - diff --git a/cypress/support/component.ts b/cypress/support/component.ts deleted file mode 100644 index e0516b6..0000000 --- a/cypress/support/component.ts +++ /dev/null @@ -1,38 +0,0 @@ -// *********************************************************** -// This example support/component.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: -// Alternatively you can use CommonJS syntax: -// require('./commands') -import { mount } from 'cypress/react18'; - -import './commands'; - -// Augment the Cypress namespace to include type definitions for -// your custom command. -// Alternatively, can be defined in cypress/support/component.d.ts -// with a at the top of your spec. -declare global { - // eslint-disable-next-line @typescript-eslint/no-namespace - namespace Cypress { - interface Chainable { - mount: typeof mount; - } - } -} - -Cypress.Commands.add('mount', mount); - -// Example use: -// cy.mount() diff --git a/cypress/support/e2e.ts b/cypress/support/e2e.ts deleted file mode 100644 index 1782114..0000000 --- a/cypress/support/e2e.ts +++ /dev/null @@ -1,30 +0,0 @@ -// *********************************************************** -// This example support/index.js 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 '@cypress/code-coverage/support'; - -import './commands'; - -// Alternatively you can use CommonJS syntax: -// require('./commands') - -// ignore Resize Observer errors -// eslint-disable-next-line consistent-return -Cypress.on('uncaught:exception', (err) => { - /* returning false here prevents Cypress from failing the test */ - if (/ResizeObserver/.test(err.message)) { - return false; - } -}); diff --git a/cypress/tsconfig.json b/cypress/tsconfig.json deleted file mode 100644 index 24c28a0..0000000 --- a/cypress/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "../tsconfig.eslint.json", - "compilerOptions": { - "target": "es5", - "lib": ["es5", "dom"], - "types": ["cypress", "node"], - "esModuleInterop": true - }, - "include": ["**/*.ts"] -} diff --git a/eslint.config.mjs b/eslint.config.mjs index 14f177e..4d114b5 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -31,6 +31,7 @@ export default [ '**/.nyc_output', '**/.yarn', '**/commitlint.config.cjs', + 'playwright-report/**/*', ], }, ...fixupConfigRules( @@ -39,7 +40,6 @@ export default [ 'airbnb-typescript', 'plugin:import/typescript', 'prettier', - 'plugin:cypress/recommended', 'plugin:react/recommended', 'plugin:react-hooks/recommended', 'plugin:@typescript-eslint/recommended', diff --git a/package.json b/package.json index 9147e90..c1f9f7e 100644 --- a/package.json +++ b/package.json @@ -45,25 +45,25 @@ "preview:test": "yarn vite preview --mode test", "postinstall": "husky install", "lint": "eslint .", - "prettier:write": "prettier {src,cypress}/**/*.{ts,tsx,js,jsx} --write", - "prettier:check": "prettier {src,cypress}/**/*.{ts,tsx,js,jsx} --check", + "prettier:write": "prettier src/**/*.{ts,tsx,js,jsx} --write", + "prettier:check": "prettier src/**/*.{ts,tsx,js,jsx} --check", "type-check": "tsc --noEmit", "check": "yarn lint && yarn prettier:check && yarn type-check", "hooks:install": "husky install", "hooks:uninstall": "husky uninstall", "pre-commit": "yarn prettier:check && yarn lint", - "cypress:open": "env-cmd -f ./.env.test cypress open", - "test": "concurrently -k -s first \"yarn start:test\" \"yarn test:ci\" ", - "test:ci": "env-cmd -f ./.env.test cypress run --browser chrome --headless && nyc report --reporter=text --reporter=text-summary", + "playwright": "playwright test --project chromium", + "playwright:ui": "playwright test --ui", + "unittest": "vitest", "cov:report": "open ./coverage/lcov-report/index.html" }, "devDependencies": { "@commitlint/cli": "19.5.0", "@commitlint/config-conventional": "19.5.0", - "@cypress/code-coverage": "3.13.4", "@eslint/compat": "^1.2.0", "@eslint/eslintrc": "^3.1.0", "@eslint/js": "^9.12.0", + "@playwright/test": "^1.49.0", "@trivago/prettier-plugin-sort-imports": "^4.3.0", "@types/i18n": "0.13.12", "@types/papaparse": "^5.3.15", @@ -74,7 +74,7 @@ "@vitejs/plugin-react": "^4.2.1", "axios": "1.7.7", "concurrently": "8.2.2", - "cypress": "13.15.1", + "dotenv": "^16.4.5", "env-cmd": "10.1.0", "eslint": "9.13.0", "eslint-config-airbnb": "19.0.4", @@ -82,7 +82,6 @@ "eslint-config-prettier": "9.1.0", "eslint-config-react-app": "7.0.1", "eslint-import-resolver-typescript": "^3.6.1", - "eslint-plugin-cypress": "4.0.0", "eslint-plugin-import": "2.31.0", "eslint-plugin-jsx-a11y": "6.10.2", "eslint-plugin-prettier": "5.2.1", @@ -92,6 +91,7 @@ "husky": "9.1.6", "nock": "^13.5.3", "nyc": "17.1.0", + "playwright-test-coverage": "^1.2.12", "prettier": "3.3.3", "three-stdlib": "2.33.0", "uuid": "9.0.1", diff --git a/playwright.config.ts b/playwright.config.ts new file mode 100644 index 0000000..07481cb --- /dev/null +++ b/playwright.config.ts @@ -0,0 +1,83 @@ +import { defineConfig, devices } from '@playwright/test'; + +/** + * Read environment variables from file. + * https://github.com/motdotla/dotenv + */ +// import 'dotenv/config'; +import dotenv from 'dotenv'; +import path from 'path'; + +dotenv.config({ path: path.resolve(process.cwd(), '.env.test') }); + +/** + * See https://playwright.dev/docs/test-configuration. + */ +export default defineConfig({ + testDir: './tests', + /* Run tests in files in parallel */ + fullyParallel: true, + /* Fail the build on CI if you accidentally left test.only in the source code. */ + forbidOnly: !!process.env.CI, + /* Retry on CI only */ + retries: process.env.CI ? 2 : 0, + /* Opt out of parallel tests on CI. */ + workers: process.env.CI ? 1 : undefined, + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + reporter: 'html', + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + /* Base URL to use in actions like `await page.goto('/')`. */ + baseURL: `http://localhost:${process.env.VITE_PORT || 4001}`, + + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: 'on-first-retry', + }, + + /* Configure projects for major browsers */ + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'] }, + }, + + { + name: 'firefox', + use: { ...devices['Desktop Firefox'] }, + }, + + { + name: 'webkit', + use: { ...devices['Desktop Safari'] }, + }, + + /* Test against mobile viewports. */ + // { + // name: 'Mobile Chrome', + // use: { ...devices['Pixel 5'] }, + // }, + // { + // name: 'Mobile Safari', + // use: { ...devices['iPhone 12'] }, + // }, + + /* Test against branded browsers. */ + // { + // name: 'Microsoft Edge', + // use: { ...devices['Desktop Edge'], channel: 'msedge' }, + // }, + // { + // name: 'Google Chrome', + // use: { ...devices['Desktop Chrome'], channel: 'chrome' }, + // }, + ], + + /* Run your local dev server before starting the tests */ + webServer: { + command: 'yarn start:test --no-open', + url: `http://localhost:${process.env.VITE_PORT || 4001}`, + stdout: 'ignore', + stderr: 'ignore', + reuseExistingServer: true, + }, +}); diff --git a/renovate.json b/renovate.json index 61ad54a..c4c6d7f 100644 --- a/renovate.json +++ b/renovate.json @@ -6,7 +6,7 @@ "packageRules": [ { "matchDepTypes": ["devDependencies"], - "matchPackagePatterns": ["lint", "prettier", "vite", "cypress", "commitlint", "axios", "concurrently", "env"], + "matchPackagePatterns": ["lint", "prettier", "vite", "commitlint", "axios", "concurrently", "env"], "automerge": true }, { diff --git a/src/config/env.ts b/src/config/env.ts index 4e1546d..439f759 100644 --- a/src/config/env.ts +++ b/src/config/env.ts @@ -6,7 +6,7 @@ const { VITE_GA_MEASUREMENT_ID, VITE_ENABLE_MOCK_API, VITE_API_HOST, -} = window.Cypress ? Cypress.env() : import.meta.env; +} = import.meta.env; export const MOCK_API = VITE_ENABLE_MOCK_API === 'true'; export const GA_MEASUREMENT_ID = VITE_GA_MEASUREMENT_ID; diff --git a/src/config/sentry.ts b/src/config/sentry.ts index 100fdee..8a68cfd 100644 --- a/src/config/sentry.ts +++ b/src/config/sentry.ts @@ -18,8 +18,8 @@ export const generateSentryConfig = (): SentryConfigType => { const PROD_REPLAY_SAMPLE_RATE = 0.1; return { - // dsn is set only when not running inside cypress - dsn: (!window.Cypress && SENTRY_DSN) || '', + // dsn is set only when not running inside a test + dsn: (!navigator.webdriver && SENTRY_DSN) || '', environment: SENTRY_ENV, tracesSampleRate: import.meta.env.PROD ? PROD_TRACE_SAMPLE_RATE diff --git a/src/context/HouseComponentsContext.tsx b/src/context/HouseComponentsContext.tsx index f0171fb..be037fa 100644 --- a/src/context/HouseComponentsContext.tsx +++ b/src/context/HouseComponentsContext.tsx @@ -156,7 +156,7 @@ export const HouseComponentsProvider = ({ children }: Props): ReactNode => { const insulationName = component.insulationName as keyof (typeof HouseInsulationPerComponent)[T]; - const currMaterials = HOUSE_INSULATIONS[componentType][insulationName]; + const currMaterials = component.buildingMaterials; if (!currMaterials?.length) { throw new Error( diff --git a/src/main.tsx b/src/main.tsx index 906c56c..c29d367 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -20,15 +20,15 @@ Sentry.init({ ...generateSentryConfig(), }); -// setup mocked api for cypress or standalone app +// setup mocked api for playwright or standalone app +// navigator.webdriver allows to determine if its in playwright if needed /* istanbul ignore next */ if (MOCK_API) { mockApi( { externalUrls: [], - dbName: window.Cypress ? 'graasp-app-cypress' : undefined, - appContext: window.Cypress ? window.appContext : defaultMockContext, - database: window.Cypress ? window.database : buildDatabase(mockMembers), + appContext: defaultMockContext, + database: buildDatabase(mockMembers), }, MockSolution.ServiceWorker, ); diff --git a/src/modules/Root.tsx b/src/modules/Root.tsx index ce3541a..6e551eb 100644 --- a/src/modules/Root.tsx +++ b/src/modules/Root.tsx @@ -87,9 +87,7 @@ const Root: FC = () => { } useGetLocalContext={hooks.useGetLocalContext} useAutoResize={hooks.useAutoResize} diff --git a/src/modules/main/App.tsx b/src/modules/main/App.tsx index f196660..6933fa2 100644 --- a/src/modules/main/App.tsx +++ b/src/modules/main/App.tsx @@ -21,6 +21,7 @@ const App = (): JSX.Element => { } }, [context]); + // eslint-disable-next-line @typescript-eslint/no-unused-vars const renderContent = (): JSX.Element => { switch (context.context) { case Context.Builder: @@ -35,7 +36,11 @@ const App = (): JSX.Element => { } }; - return {renderContent()}; + return ( + + + + ); }; export default App; diff --git a/src/modules/scenes/SimulationControlPanel/MaterialControlDialog/FormControlValidator.tsx b/src/modules/scenes/SimulationControlPanel/MaterialControlDialog/FormControlValidator.tsx index 1722922..aab71cc 100644 --- a/src/modules/scenes/SimulationControlPanel/MaterialControlDialog/FormControlValidator.tsx +++ b/src/modules/scenes/SimulationControlPanel/MaterialControlDialog/FormControlValidator.tsx @@ -126,7 +126,14 @@ export const FormControlValidator = ({ ) : undefined } /> - {error && {error}} + {error && ( + + {error} + + )} ); }; diff --git a/src/modules/scenes/SimulationControlPanel/WindowControlDialog/WindowControlDialog.tsx b/src/modules/scenes/SimulationControlPanel/WindowControlDialog/WindowControlDialog.tsx index fabf845..547d36a 100644 --- a/src/modules/scenes/SimulationControlPanel/WindowControlDialog/WindowControlDialog.tsx +++ b/src/modules/scenes/SimulationControlPanel/WindowControlDialog/WindowControlDialog.tsx @@ -81,7 +81,7 @@ export const WindowControlDialog = ({ {t('SIZE_LABEL')} - + {t('CURRENT_SIZE_LABEL')}{' '} {formatComponentSize({ componentSize: windowComponent.size })} diff --git a/src/window.d.ts b/src/window.d.ts index a4861d7..71bae2b 100644 --- a/src/window.d.ts +++ b/src/window.d.ts @@ -1,7 +1,6 @@ declare global { interface Window { appContext: LocalContext; - Cypress: boolean; database: Database; apiErrors: object; } diff --git a/tests/player/HousePage.ts b/tests/player/HousePage.ts new file mode 100644 index 0000000..2a8fe8d --- /dev/null +++ b/tests/player/HousePage.ts @@ -0,0 +1,47 @@ +import { Page, expect } from '@playwright/test'; + +import { MaterialEditorPage } from './MaterialEditorPage'; +import { WindowEditorPage } from './WindowEditorPage'; + +// Page Object for the house configuration page +export class HousePage { + readonly page: Page; + + constructor(page: Page) { + this.page = page; + } + + async goto(): Promise { + await this.page.goto('/'); + } + + async selectWindowInsulation(newInsulation: string): Promise { + await this.page.getByLabel('Windows Insulation').click(); + await this.page.getByRole('option', { name: newInsulation }).click(); + await expect( + this.page.getByRole('combobox', { name: 'Windows Insulation' }), + ).toHaveText(newInsulation); + } + + async selectWallInsulation(newInsulation: string): Promise { + await this.page.getByLabel('Wall Insulation').click(); + await this.page.getByRole('option', { name: newInsulation }).click(); + await expect( + this.page.getByRole('combobox', { name: 'Wall Insulation' }), + ).toHaveText(newInsulation); + } + + async openMaterialEditor(): Promise { + const button = this.page.getByLabel('House').getByRole('button').first(); + await button.click(); + + return new MaterialEditorPage(this.page); + } + + async openWindowEditor(): Promise { + const button = this.page.getByLabel('House').getByRole('button').nth(1); + await button.click(); + + return new WindowEditorPage(this.page); + } +} diff --git a/tests/player/MaterialEditorPage.ts b/tests/player/MaterialEditorPage.ts new file mode 100644 index 0000000..46eee6d --- /dev/null +++ b/tests/player/MaterialEditorPage.ts @@ -0,0 +1,42 @@ +import { Locator, Page, expect } from '@playwright/test'; + +// Page Object for the material editor (modal) +export class MaterialEditorPage { + private readonly page: Page; + + readonly materialPrice: Locator; + + readonly materialThickness: Locator; + + constructor(page: Page) { + this.page = page; + this.materialPrice = this.page.getByLabel('Price'); + this.materialThickness = this.page.getByLabel('Thickness'); + } + + async selectTab(tabName: string): Promise { + await this.page.getByRole('tab', { name: tabName }).click(); + } + + async setMaterialPrice(price: string): Promise { + await this.materialPrice.fill(price); + await expect(this.materialPrice).toHaveValue(price); + } + + async setMaterialThickness(thickness: string): Promise { + await this.materialThickness.fill(thickness); + await expect(this.materialThickness).toHaveValue(thickness); + } + + async close(): Promise { + await this.page.getByRole('button', { name: 'Close' }).click(); + } + + async checkErrorIsVisible( + label: string, + type: 'Required' | 'Min' | 'Max', + ): Promise { + const errorId = `error-${label.toLowerCase()}-${type.toLowerCase()}`; + await expect(this.page.getByTestId(errorId)).toBeVisible(); + } +} diff --git a/tests/player/WindowEditorPage.ts b/tests/player/WindowEditorPage.ts new file mode 100644 index 0000000..4cace65 --- /dev/null +++ b/tests/player/WindowEditorPage.ts @@ -0,0 +1,43 @@ +import { Locator, Page, expect } from '@playwright/test'; + +import { WindowSizeType } from '../../src/context/WindowSizeContext'; + +// Page Object for the window editor (modal) +export class WindowEditorPage { + private readonly page: Page; + + private readonly closeButton: Locator; + + constructor(page: Page) { + this.page = page; + this.closeButton = this.page.getByRole('button', { name: 'Close' }); + } + + async getWindowSizeHelper(size: WindowSizeType = 'Medium'): Promise { + return this.page.getByTestId(`window-size-helper-${size.toLowerCase()}`); + } + + async selectWindowSize( + newSize: WindowSizeType, + currentSize: WindowSizeType = 'Medium', + ): Promise { + await this.page.getByLabel(currentSize).click(); + await this.page.getByRole('option', { name: newSize }).click(); + + await expect( + this.page.getByRole('combobox', { name: 'Window Size' }), + ).toHaveText(newSize); + } + + async checkIsOpen(): Promise { + await expect(this.closeButton).toBeVisible(); + } + + async checkIsClosed(): Promise { + await expect(this.closeButton).not.toBeVisible(); + } + + async close(): Promise { + await this.closeButton.click(); + } +} diff --git a/tests/player/wall-insulation.spec.ts b/tests/player/wall-insulation.spec.ts new file mode 100644 index 0000000..abd68fc --- /dev/null +++ b/tests/player/wall-insulation.spec.ts @@ -0,0 +1,176 @@ +import { expect, test } from 'playwright-test-coverage'; + +import { HousePage } from './HousePage'; + +test('should change the wall insulation', async ({ page }) => { + const housePage = new HousePage(page); + await housePage.goto(); + await housePage.selectWallInsulation('Fiberglass'); +}); + +test('should only update the aerogel material', async ({ page }) => { + const housePage = new HousePage(page); + await housePage.goto(); + + let materialEditor = await housePage.openMaterialEditor(); + await materialEditor.selectTab('Aerogel'); + await materialEditor.setMaterialPrice('100'); + await materialEditor.setMaterialThickness('1'); + + // expect Brick haven't been changed + await materialEditor.selectTab('Brick'); + + await expect(materialEditor.materialPrice).not.toHaveValue('100'); + await expect(materialEditor.materialThickness).not.toHaveValue('1'); + + await materialEditor.close(); + materialEditor = await housePage.openMaterialEditor(); + await materialEditor.selectTab('Aerogel'); + + // expect Price and Thickness or Aergoel have not been reset + await expect(materialEditor.materialPrice).toHaveValue('100'); + await expect(materialEditor.materialThickness).toHaveValue('1'); +}); + +test('should update all the materials without reset', async ({ page }) => { + const housePage = new HousePage(page); + await housePage.goto(); + + const materialEditor = await housePage.openMaterialEditor(); + await materialEditor.setMaterialPrice('10'); + await materialEditor.setMaterialThickness('50'); + + await materialEditor.selectTab('Aerogel'); + await materialEditor.setMaterialPrice('100'); + await materialEditor.setMaterialThickness('1'); + + await materialEditor.selectTab('Brick'); + // expect Price and Thickness have not been reset + await expect(materialEditor.materialPrice).toHaveValue('10'); + await expect(materialEditor.materialThickness).toHaveValue('50'); + + await materialEditor.selectTab('Aerogel'); + // expect Price and Thickness have not been reset + await expect(materialEditor.materialPrice).toHaveValue('100'); + await expect(materialEditor.materialThickness).toHaveValue('1'); +}); + +test('price should accept numbers only', async ({ page }) => { + const housePage = new HousePage(page); + await housePage.goto(); + + const materialEditor = await housePage.openMaterialEditor(); + await materialEditor.selectTab('Aerogel'); + await materialEditor.materialPrice.click(); + await materialEditor.materialPrice.pressSequentially('Not a number'); + await expect(materialEditor.materialPrice).toHaveValue(''); +}); + +test('price should not be empty', async ({ page }) => { + const housePage = new HousePage(page); + await housePage.goto(); + + const materialEditor = await housePage.openMaterialEditor(); + await materialEditor.selectTab('Aerogel'); + await materialEditor.setMaterialPrice('150'); + await materialEditor.materialPrice.fill(''); + + await materialEditor.checkErrorIsVisible('price', 'Required'); + + await materialEditor.selectTab('Brick'); + await materialEditor.selectTab('Aerogel'); + await expect(materialEditor.materialPrice).toHaveValue('150'); +}); + +test('price should not be negative', async ({ page }) => { + const housePage = new HousePage(page); + await housePage.goto(); + + const materialEditor = await housePage.openMaterialEditor(); + await materialEditor.selectTab('Aerogel'); + await materialEditor.setMaterialPrice('150'); + await materialEditor.setMaterialPrice('-1'); + + await materialEditor.checkErrorIsVisible('price', 'Min'); + + await materialEditor.selectTab('Brick'); + await materialEditor.selectTab('Aerogel'); + await expect(materialEditor.materialPrice).toHaveValue('150'); +}); + +test('price should not exceed max value', async ({ page }) => { + const housePage = new HousePage(page); + await housePage.goto(); + + const materialEditor = await housePage.openMaterialEditor(); + await materialEditor.selectTab('Aerogel'); + await materialEditor.setMaterialPrice('150'); + await materialEditor.setMaterialPrice('1000000000'); + + await materialEditor.checkErrorIsVisible('price', 'Max'); + + await materialEditor.selectTab('Brick'); + await materialEditor.selectTab('Aerogel'); + await expect(materialEditor.materialPrice).toHaveValue('150'); +}); + +test('thickness should accept numbers only', async ({ page }) => { + const housePage = new HousePage(page); + await housePage.goto(); + + const materialEditor = await housePage.openMaterialEditor(); + await materialEditor.selectTab('Aerogel'); + await materialEditor.materialThickness.click(); + await materialEditor.materialThickness.pressSequentially('Not a number'); + await expect(materialEditor.materialThickness).toHaveValue(''); +}); + +test('thickness should not be empty', async ({ page }) => { + const housePage = new HousePage(page); + await housePage.goto(); + + const materialEditor = await housePage.openMaterialEditor(); + await materialEditor.selectTab('Aerogel'); + await materialEditor.setMaterialThickness('25'); + await materialEditor.materialThickness.fill(''); + + await materialEditor.checkErrorIsVisible('thickness', 'Required'); + + await materialEditor.selectTab('Brick'); + await materialEditor.selectTab('Aerogel'); + await expect(materialEditor.materialThickness).toHaveValue('25'); +}); + +test('thickness should not be negative or 0', async ({ page }) => { + const housePage = new HousePage(page); + await housePage.goto(); + + const materialEditor = await housePage.openMaterialEditor(); + await materialEditor.selectTab('Aerogel'); + await materialEditor.setMaterialThickness('25'); + await materialEditor.setMaterialThickness('-1'); + + await materialEditor.checkErrorIsVisible('thickness', 'Min'); + + await materialEditor.setMaterialThickness('0'); + + await materialEditor.selectTab('Brick'); + await materialEditor.selectTab('Aerogel'); + await expect(materialEditor.materialThickness).toHaveValue('25'); +}); + +test('thickness should not exceed max value', async ({ page }) => { + const housePage = new HousePage(page); + await housePage.goto(); + + const materialEditor = await housePage.openMaterialEditor(); + await materialEditor.selectTab('Aerogel'); + await materialEditor.setMaterialThickness('25'); + await materialEditor.setMaterialThickness('100'); + + await materialEditor.checkErrorIsVisible('thickness', 'Max'); + + await materialEditor.selectTab('Brick'); + await materialEditor.selectTab('Aerogel'); + await expect(materialEditor.materialThickness).toHaveValue('25'); +}); diff --git a/tests/player/window-insulation.spec.ts b/tests/player/window-insulation.spec.ts new file mode 100644 index 0000000..7cc94e0 --- /dev/null +++ b/tests/player/window-insulation.spec.ts @@ -0,0 +1,36 @@ +import { expect, test } from 'playwright-test-coverage'; + +import { HousePage } from './HousePage'; + +test('should change the window insulation', async ({ page }) => { + const housePage = new HousePage(page); + await housePage.goto(); + await housePage.selectWindowInsulation('Triple Pane'); +}); + +test('changing window size should update the size helper label', async ({ + page, +}) => { + const housePage = new HousePage(page); + await housePage.goto(); + await housePage.selectWindowInsulation('Single Pane'); + + const windowEditorPage = await housePage.openWindowEditor(); + await expect(await windowEditorPage.getWindowSizeHelper()).toBeVisible(); + await windowEditorPage.selectWindowSize('Small'); + + await expect(await windowEditorPage.getWindowSizeHelper()).not.toBeVisible(); + await expect( + await windowEditorPage.getWindowSizeHelper('Small'), + ).toBeVisible(); +}); + +test('close button should close the modal', async ({ page }) => { + const housePage = new HousePage(page); + await housePage.goto(); + + const windowEditorPage = await housePage.openWindowEditor(); + await windowEditorPage.checkIsOpen(); + await windowEditorPage.close(); + await windowEditorPage.checkIsClosed(); +}); diff --git a/tsconfig.eslint.json b/tsconfig.eslint.json index 08695d3..a850a15 100644 --- a/tsconfig.eslint.json +++ b/tsconfig.eslint.json @@ -3,10 +3,9 @@ "include": [ "vite.config.ts", "eslint.config.mjs", - "cypress.config.ts", + "playwright.config.ts", "src/**/*.tsx", "src/**/*.ts", - "test/**/*.ts", - "cypress/**/*.ts" + "tests/**/*.ts" ] } diff --git a/tsconfig.json b/tsconfig.json index a79374c..f0fc551 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -16,7 +16,7 @@ "noEmit": true, "jsx": "react-jsx", "typeRoots": ["node_modules", "node_modules/@types", "./src/@types"], - "types": ["vite/client", "cypress"], + "types": ["vite/client"], "baseUrl": "./src", "paths": { "@/*": ["./*"], diff --git a/vite.config.ts b/vite.config.ts index f602e06..de58ed0 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,9 +1,10 @@ /// import react from '@vitejs/plugin-react'; import { resolve } from 'path'; -import { UserConfigExport, defineConfig, loadEnv } from 'vite'; +import { loadEnv } from 'vite'; import checker from 'vite-plugin-checker'; import istanbul from 'vite-plugin-istanbul'; +import { UserConfigExport, defineConfig } from 'vitest/config'; // https://vitejs.dev/config/ export default ({ mode }: { mode: string }): UserConfigExport => { @@ -20,7 +21,7 @@ export default ({ mode }: { mode: string }): UserConfigExport => { port: parseInt(process.env.VITE_PORT, 10) || 4001, open: mode !== 'test', // open only when mode is different from test watch: { - ignored: ['**/coverage/**', '**/cypress/downloads/**'], + ignored: ['**/coverage/**'], }, }, preview: { @@ -59,6 +60,9 @@ export default ({ mode }: { mode: string }): UserConfigExport => { checkProd: true, }), ], + test: { + include: ['**/*.test.ts'], + }, resolve: { alias: { '@': resolve(__dirname, 'src'), diff --git a/yarn.lock b/yarn.lock index e3e3e55..04aa741 100644 --- a/yarn.lock +++ b/yarn.lock @@ -88,7 +88,7 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:^7.16.0, @babel/core@npm:^7.18.9, @babel/core@npm:^7.20.12, @babel/core@npm:^7.23.9, @babel/core@npm:^7.7.5": +"@babel/core@npm:^7.16.0, @babel/core@npm:^7.18.9, @babel/core@npm:^7.20.12, @babel/core@npm:^7.23.9": version: 7.25.2 resolution: "@babel/core@npm:7.25.2" dependencies: @@ -1961,13 +1961,6 @@ __metadata: languageName: node linkType: hard -"@colors/colors@npm:1.5.0": - version: 1.5.0 - resolution: "@colors/colors@npm:1.5.0" - checksum: 10/9d226461c1e91e95f067be2bdc5e6f99cfe55a721f45afb44122e23e4b8602eeac4ff7325af6b5a369f36396ee1514d3809af3f57769066d80d83790d8e53339 - languageName: node - linkType: hard - "@commitlint/cli@npm:19.5.0": version: 19.5.0 resolution: "@commitlint/cli@npm:19.5.0" @@ -2159,81 +2152,6 @@ __metadata: languageName: node linkType: hard -"@cypress/code-coverage@npm:3.13.4": - version: 3.13.4 - resolution: "@cypress/code-coverage@npm:3.13.4" - dependencies: - "@cypress/webpack-preprocessor": "npm:^6.0.0" - chalk: "npm:4.1.2" - dayjs: "npm:1.11.13" - debug: "npm:4.3.7" - execa: "npm:4.1.0" - globby: "npm:11.1.0" - istanbul-lib-coverage: "npm:^3.0.0" - js-yaml: "npm:4.1.0" - nyc: "npm:15.1.0" - peerDependencies: - "@babel/core": ^7.0.1 - "@babel/preset-env": ^7.0.0 - babel-loader: ^8.3 || ^9 - cypress: "*" - webpack: ^4 || ^5 - checksum: 10/7525b39fd1122c9888a4fd940c5a56b650bd41ede65f95419c6dc74e2157d61fd716a9669040da8e3ed15c5e6b3ddeb978c52b45b140e4522ae3df9d2343b6e6 - languageName: node - linkType: hard - -"@cypress/request@npm:^3.0.4": - version: 3.0.5 - resolution: "@cypress/request@npm:3.0.5" - dependencies: - aws-sign2: "npm:~0.7.0" - aws4: "npm:^1.8.0" - caseless: "npm:~0.12.0" - combined-stream: "npm:~1.0.6" - extend: "npm:~3.0.2" - forever-agent: "npm:~0.6.1" - form-data: "npm:~4.0.0" - http-signature: "npm:~1.4.0" - is-typedarray: "npm:~1.0.0" - isstream: "npm:~0.1.2" - json-stringify-safe: "npm:~5.0.1" - mime-types: "npm:~2.1.19" - performance-now: "npm:^2.1.0" - qs: "npm:6.13.0" - safe-buffer: "npm:^5.1.2" - tough-cookie: "npm:^4.1.3" - tunnel-agent: "npm:^0.6.0" - uuid: "npm:^8.3.2" - checksum: 10/41ea0de43c8be1f22b82ad8728505c8a155b8ac38be34fe404fbf1872aa631e7a990c913a5ceb4ef0e7c0d3ddd1b59f1637400379f1a50f6f79c7e70cb551574 - languageName: node - linkType: hard - -"@cypress/webpack-preprocessor@npm:^6.0.0": - version: 6.0.2 - resolution: "@cypress/webpack-preprocessor@npm:6.0.2" - dependencies: - bluebird: "npm:3.7.1" - debug: "npm:^4.3.4" - lodash: "npm:^4.17.20" - peerDependencies: - "@babel/core": ^7.0.1 - "@babel/preset-env": ^7.0.0 - babel-loader: ^8.3 || ^9 - webpack: ^4 || ^5 - checksum: 10/da98d36a4f4ee106b13c03e3e86d2345c4c909fc73913897117477e2b690ab4be838d655c95aa8175f52434dca6c12ff4f7357702bd93616634b57cb354429b4 - languageName: node - linkType: hard - -"@cypress/xvfb@npm:^1.2.4": - version: 1.2.4 - resolution: "@cypress/xvfb@npm:1.2.4" - dependencies: - debug: "npm:^3.1.0" - lodash.once: "npm:^4.1.1" - checksum: 10/cb995b069f8c4f1e7857049bda0bd73a58e0048ccaf276ef0e66d1e1c03ba6fa099b5d765ad12ea37a7e5b7685f7413a2b9a99b27891407565b915f4a2f919a7 - languageName: node - linkType: hard - "@emotion/babel-plugin@npm:^11.11.0, @emotion/babel-plugin@npm:^11.12.0": version: 11.12.0 resolution: "@emotion/babel-plugin@npm:11.12.0" @@ -3504,6 +3422,17 @@ __metadata: languageName: node linkType: hard +"@playwright/test@npm:^1.49.0": + version: 1.49.0 + resolution: "@playwright/test@npm:1.49.0" + dependencies: + playwright: "npm:1.49.0" + bin: + playwright: cli.js + checksum: 10/e87485ab4c02b6dc0bc20a43ea3965c949c45caa4e7f5beea4a0abd29be0a318662931e887072db0d165f8dde93709b97ea1b2c6f4c833b403aa13427d76dd22 + languageName: node + linkType: hard + "@popperjs/core@npm:^2.11.8": version: 2.11.8 resolution: "@popperjs/core@npm:2.11.8" @@ -4716,20 +4645,6 @@ __metadata: languageName: node linkType: hard -"@types/sinonjs__fake-timers@npm:8.1.1": - version: 8.1.1 - resolution: "@types/sinonjs__fake-timers@npm:8.1.1" - checksum: 10/567e01159b07eb19a56aa9a619bda963a3e2c1261b197b83fc664867228ce679e189450f0ae38483a08857155f94d9ae5d88e72c0f44f269103f63c2946a73ed - languageName: node - linkType: hard - -"@types/sizzle@npm:^2.3.2": - version: 2.3.8 - resolution: "@types/sizzle@npm:2.3.8" - checksum: 10/2ac62443dc917f5f903cbd9afc51c7d6cc1c6569b4e1a15faf04aea5b13b486e7f208650014c3dc4fed34653eded3e00fe5abffe0e6300cbf0e8a01beebf11a6 - languageName: node - linkType: hard - "@types/stats.js@npm:*": version: 0.17.3 resolution: "@types/stats.js@npm:0.17.3" @@ -4778,15 +4693,6 @@ __metadata: languageName: node linkType: hard -"@types/yauzl@npm:^2.9.1": - version: 2.10.3 - resolution: "@types/yauzl@npm:2.10.3" - dependencies: - "@types/node": "npm:*" - checksum: 10/5ee966ea7bd6b2802f31ad4281c92c4c0b6dfa593c378a2582c58541fa113bec3d70eb0696b34ad95e8e6861a884cba6c3e351285816693ed176222f840a8c08 - languageName: node - linkType: hard - "@typescript-eslint/eslint-plugin@npm:7.18.0": version: 7.18.0 resolution: "@typescript-eslint/eslint-plugin@npm:7.18.0" @@ -5357,13 +5263,6 @@ __metadata: languageName: node linkType: hard -"ansi-colors@npm:^4.1.1": - version: 4.1.3 - resolution: "ansi-colors@npm:4.1.3" - checksum: 10/43d6e2fc7b1c6e4dc373de708ee76311ec2e0433e7e8bd3194e7ff123ea6a747428fc61afdcf5969da5be3a5f0fd054602bec56fc0ebe249ce2fcde6e649e3c2 - languageName: node - linkType: hard - "ansi-escapes@npm:^4.2.1, ansi-escapes@npm:^4.3.0": version: 4.3.2 resolution: "ansi-escapes@npm:4.3.2" @@ -5445,13 +5344,6 @@ __metadata: languageName: node linkType: hard -"arch@npm:^2.2.0": - version: 2.2.0 - resolution: "arch@npm:2.2.0" - checksum: 10/e35dbc6d362297000ab90930069576ba165fe63cd52383efcce14bd66c1b16a91ce849e1fd239964ed029d5e0bdfc32f68e9c7331b7df6c84ddebebfdbf242f7 - languageName: node - linkType: hard - "archy@npm:^1.0.0": version: 1.0.0 resolution: "archy@npm:1.0.0" @@ -5617,22 +5509,6 @@ __metadata: languageName: node linkType: hard -"asn1@npm:~0.2.3": - version: 0.2.6 - resolution: "asn1@npm:0.2.6" - dependencies: - safer-buffer: "npm:~2.1.0" - checksum: 10/cf629291fee6c1a6f530549939433ebf32200d7849f38b810ff26ee74235e845c0c12b2ed0f1607ac17383d19b219b69cefa009b920dab57924c5c544e495078 - languageName: node - linkType: hard - -"assert-plus@npm:1.0.0, assert-plus@npm:^1.0.0": - version: 1.0.0 - resolution: "assert-plus@npm:1.0.0" - checksum: 10/f4f991ae2df849cc678b1afba52d512a7cbf0d09613ba111e72255409ff9158550c775162a47b12d015d1b82b3c273e8e25df0e4783d3ddb008a293486d00a07 - languageName: node - linkType: hard - "assert@npm:^2.1.0": version: 2.1.0 resolution: "assert@npm:2.1.0" @@ -5676,20 +5552,6 @@ __metadata: languageName: node linkType: hard -"astral-regex@npm:^2.0.0": - version: 2.0.0 - resolution: "astral-regex@npm:2.0.0" - checksum: 10/876231688c66400473ba505731df37ea436e574dd524520294cc3bbc54ea40334865e01fa0d074d74d036ee874ee7e62f486ea38bc421ee8e6a871c06f011766 - languageName: node - linkType: hard - -"async@npm:^3.2.0": - version: 3.2.6 - resolution: "async@npm:3.2.6" - checksum: 10/cb6e0561a3c01c4b56a799cc8bab6ea5fef45f069ab32500b6e19508db270ef2dffa55e5aed5865c5526e9907b1f8be61b27530823b411ffafb5e1538c86c368 - languageName: node - linkType: hard - "asynckit@npm:^0.4.0": version: 0.4.0 resolution: "asynckit@npm:0.4.0" @@ -5697,13 +5559,6 @@ __metadata: languageName: node linkType: hard -"at-least-node@npm:^1.0.0": - version: 1.0.0 - resolution: "at-least-node@npm:1.0.0" - checksum: 10/463e2f8e43384f1afb54bc68485c436d7622acec08b6fad269b421cb1d29cebb5af751426793d0961ed243146fe4dc983402f6d5a51b720b277818dbf6f2e49e - languageName: node - linkType: hard - "available-typed-arrays@npm:^1.0.7": version: 1.0.7 resolution: "available-typed-arrays@npm:1.0.7" @@ -5713,20 +5568,6 @@ __metadata: languageName: node linkType: hard -"aws-sign2@npm:~0.7.0": - version: 0.7.0 - resolution: "aws-sign2@npm:0.7.0" - checksum: 10/2ac497d739f71be3264cf096a33ab256a1fea7fe80b87dc51ec29374505bd5a661279ef1c22989d68528ea61ed634021ca63b31cf1d3c2a3682ffc106f7d0e96 - languageName: node - linkType: hard - -"aws4@npm:^1.8.0": - version: 1.13.2 - resolution: "aws4@npm:1.13.2" - checksum: 10/290b9f84facbad013747725bfd8b4c42d0b3b04b5620d8418f0219832ef95a7dc597a4af7b1589ae7fce18bacde96f40911c3cda36199dd04d9f8e01f72fa50a - languageName: node - linkType: hard - "axe-core@npm:^4.10.0": version: 4.10.0 resolution: "axe-core@npm:4.10.0" @@ -5855,15 +5696,6 @@ __metadata: languageName: node linkType: hard -"bcrypt-pbkdf@npm:^1.0.0": - version: 1.0.2 - resolution: "bcrypt-pbkdf@npm:1.0.2" - dependencies: - tweetnacl: "npm:^0.14.3" - checksum: 10/13a4cde058250dbf1fa77a4f1b9a07d32ae2e3b9e28e88a0c7a1827835bc3482f3e478c4a0cfd4da6ff0c46dae07da1061123a995372b32cc563d9975f975404 - languageName: node - linkType: hard - "bidi-js@npm:^1.0.2": version: 1.0.3 resolution: "bidi-js@npm:1.0.3" @@ -5891,27 +5723,6 @@ __metadata: languageName: node linkType: hard -"blob-util@npm:^2.0.2": - version: 2.0.2 - resolution: "blob-util@npm:2.0.2" - checksum: 10/b2c5a20c677f2a6c3821cf13c5522d64af96e666bc40cce6b43f87d16e89a55e2eab2f6264ec3f36d7f810eba848aa7e2bc611e47c14eb6395136c0b0a8b29ea - languageName: node - linkType: hard - -"bluebird@npm:3.7.1": - version: 3.7.1 - resolution: "bluebird@npm:3.7.1" - checksum: 10/2af420fcd493dea6aa2f53007bc511d44cd1da90e31810b405366956e4d9ca1c56f0c6d725e3444d9c59df7cacc9e3390ab52bd7d86c09852464d8a247f59841 - languageName: node - linkType: hard - -"bluebird@npm:^3.7.2": - version: 3.7.2 - resolution: "bluebird@npm:3.7.2" - checksum: 10/007c7bad22c5d799c8dd49c85b47d012a1fe3045be57447721e6afbd1d5be43237af1db62e26cb9b0d9ba812d2e4ca3bac82f6d7e016b6b88de06ee25ceb96e7 - languageName: node - linkType: hard - "body-parser@npm:1.20.3": version: 1.20.3 resolution: "body-parser@npm:1.20.3" @@ -5981,14 +5792,7 @@ __metadata: languageName: node linkType: hard -"buffer-crc32@npm:~0.2.3": - version: 0.2.13 - resolution: "buffer-crc32@npm:0.2.13" - checksum: 10/06252347ae6daca3453b94e4b2f1d3754a3b146a111d81c68924c22d91889a40623264e95e67955b1cb4a68cbedf317abeabb5140a9766ed248973096db5ce1c - languageName: node - linkType: hard - -"buffer@npm:^5.5.0, buffer@npm:^5.7.1": +"buffer@npm:^5.5.0": version: 5.7.1 resolution: "buffer@npm:5.7.1" dependencies: @@ -6042,13 +5846,6 @@ __metadata: languageName: node linkType: hard -"cachedir@npm:^2.3.0": - version: 2.4.0 - resolution: "cachedir@npm:2.4.0" - checksum: 10/43198514eaa61f65b5535ed29ad651f22836fba3868ed58a6a87731f05462f317d39098fa3ac778801c25455483c9b7f32a2fcad1f690a978947431f12a0f4d0 - languageName: node - linkType: hard - "caching-transform@npm:^4.0.0": version: 4.0.0 resolution: "caching-transform@npm:4.0.0" @@ -6104,13 +5901,6 @@ __metadata: languageName: node linkType: hard -"caseless@npm:~0.12.0": - version: 0.12.0 - resolution: "caseless@npm:0.12.0" - checksum: 10/ea1efdf430975fdbac3505cdd21007f7ac5aa29b6d4d1c091f965853cd1bf87e4b08ea07b31a6d688b038872b7cdf0589d9262d59c699d199585daad052aeb20 - languageName: node - linkType: hard - "chai@npm:^4.3.10": version: 4.5.0 resolution: "chai@npm:4.5.0" @@ -6139,16 +5929,6 @@ __metadata: languageName: node linkType: hard -"chalk@npm:4.1.2, chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.1, chalk@npm:^4.1.2": - version: 4.1.2 - resolution: "chalk@npm:4.1.2" - dependencies: - ansi-styles: "npm:^4.1.0" - supports-color: "npm:^7.1.0" - checksum: 10/cb3f3e594913d63b1814d7ca7c9bafbf895f75fbf93b92991980610dfd7b48500af4e3a5d4e3a8f337990a96b168d7eb84ee55efdce965e2ee8efc20f8c8f139 - languageName: node - linkType: hard - "chalk@npm:^2.4.2": version: 2.4.2 resolution: "chalk@npm:2.4.2" @@ -6160,6 +5940,16 @@ __metadata: languageName: node linkType: hard +"chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.1, chalk@npm:^4.1.2": + version: 4.1.2 + resolution: "chalk@npm:4.1.2" + dependencies: + ansi-styles: "npm:^4.1.0" + supports-color: "npm:^7.1.0" + checksum: 10/cb3f3e594913d63b1814d7ca7c9bafbf895f75fbf93b92991980610dfd7b48500af4e3a5d4e3a8f337990a96b168d7eb84ee55efdce965e2ee8efc20f8c8f139 + languageName: node + linkType: hard + "chalk@npm:^5.3.0": version: 5.3.0 resolution: "chalk@npm:5.3.0" @@ -6190,13 +5980,6 @@ __metadata: languageName: node linkType: hard -"check-more-types@npm:^2.24.0": - version: 2.24.0 - resolution: "check-more-types@npm:2.24.0" - checksum: 10/67c5288443bd73a81638e1185f8c5410d0edf6458c086149ef1cda95c07535b5dd5c11c426dc3ee8f0de0f3244aa2d4f2ba1937aaa8a94995589cdcce0bbccb9 - languageName: node - linkType: hard - "chokidar@npm:^3.4.2, chokidar@npm:^3.5.1": version: 3.6.0 resolution: "chokidar@npm:3.6.0" @@ -6223,13 +6006,6 @@ __metadata: languageName: node linkType: hard -"ci-info@npm:^3.2.0": - version: 3.9.0 - resolution: "ci-info@npm:3.9.0" - checksum: 10/75bc67902b4d1c7b435497adeb91598f6d52a3389398e44294f6601b20cfef32cf2176f7be0eb961d9e085bb333a8a5cae121cb22f81cf238ae7f58eb80e9397 - languageName: node - linkType: hard - "clean-stack@npm:^2.0.0": version: 2.2.0 resolution: "clean-stack@npm:2.2.0" @@ -6253,29 +6029,6 @@ __metadata: languageName: node linkType: hard -"cli-table3@npm:~0.6.1": - version: 0.6.5 - resolution: "cli-table3@npm:0.6.5" - dependencies: - "@colors/colors": "npm:1.5.0" - string-width: "npm:^4.2.0" - dependenciesMeta: - "@colors/colors": - optional: true - checksum: 10/8dca71256f6f1367bab84c33add3f957367c7c43750a9828a4212ebd31b8df76bd7419d386e3391ac7419698a8540c25f1a474584028f35b170841cde2e055c5 - languageName: node - linkType: hard - -"cli-truncate@npm:^2.1.0": - version: 2.1.0 - resolution: "cli-truncate@npm:2.1.0" - dependencies: - slice-ansi: "npm:^3.0.0" - string-width: "npm:^4.2.0" - checksum: 10/976f1887de067a8cd6ec830a7a8508336aebe6cec79b521d98ed13f67ef073b637f7305675b6247dd22f9e9cf045ec55fe746c7bdb288fbe8db0dfdc9fd52e55 - languageName: node - linkType: hard - "cli-width@npm:^3.0.0": version: 3.0.0 resolution: "cli-width@npm:3.0.0" @@ -6365,14 +6118,7 @@ __metadata: languageName: node linkType: hard -"colorette@npm:^2.0.16": - version: 2.0.20 - resolution: "colorette@npm:2.0.20" - checksum: 10/0b8de48bfa5d10afc160b8eaa2b9938f34a892530b2f7d7897e0458d9535a066e3998b49da9d21161c78225b272df19ae3a64d6df28b4c9734c0e55bbd02406f - languageName: node - linkType: hard - -"combined-stream@npm:^1.0.8, combined-stream@npm:~1.0.6": +"combined-stream@npm:^1.0.8": version: 1.0.8 resolution: "combined-stream@npm:1.0.8" dependencies: @@ -6388,13 +6134,6 @@ __metadata: languageName: node linkType: hard -"commander@npm:^6.2.1": - version: 6.2.1 - resolution: "commander@npm:6.2.1" - checksum: 10/25b88c2efd0380c84f7844b39cf18510da7bfc5013692d68cdc65f764a1c34e6c8a36ea6d72b6620e3710a930cf8fab2695bdec2bf7107a0f4fa30a3ef3b7d0e - languageName: node - linkType: hard - "commander@npm:^8.0.0, commander@npm:^8.3.0": version: 8.3.0 resolution: "commander@npm:8.3.0" @@ -6402,13 +6141,6 @@ __metadata: languageName: node linkType: hard -"common-tags@npm:^1.8.0": - version: 1.8.2 - resolution: "common-tags@npm:1.8.2" - checksum: 10/c665d0f463ee79dda801471ad8da6cb33ff7332ba45609916a508ad3d77ba07ca9deeb452e83f81f24c2b081e2c1315347f23d239210e63d1c5e1a0c7c019fe2 - languageName: node - linkType: hard - "commondir@npm:^1.0.1": version: 1.0.1 resolution: "commondir@npm:1.0.1" @@ -6568,13 +6300,6 @@ __metadata: languageName: node linkType: hard -"core-util-is@npm:1.0.2": - version: 1.0.2 - resolution: "core-util-is@npm:1.0.2" - checksum: 10/d0f7587346b44a1fe6c269267e037dd34b4787191e473c3e685f507229d88561c40eb18872fabfff02977301815d474300b7bfbd15396c13c5377393f7e87ec3 - languageName: node - linkType: hard - "cosmiconfig-typescript-loader@npm:^5.0.0": version: 5.0.0 resolution: "cosmiconfig-typescript-loader@npm:5.0.0" @@ -6648,59 +6373,6 @@ __metadata: languageName: node linkType: hard -"cypress@npm:13.15.1": - version: 13.15.1 - resolution: "cypress@npm:13.15.1" - dependencies: - "@cypress/request": "npm:^3.0.4" - "@cypress/xvfb": "npm:^1.2.4" - "@types/sinonjs__fake-timers": "npm:8.1.1" - "@types/sizzle": "npm:^2.3.2" - arch: "npm:^2.2.0" - blob-util: "npm:^2.0.2" - bluebird: "npm:^3.7.2" - buffer: "npm:^5.7.1" - cachedir: "npm:^2.3.0" - chalk: "npm:^4.1.0" - check-more-types: "npm:^2.24.0" - cli-cursor: "npm:^3.1.0" - cli-table3: "npm:~0.6.1" - commander: "npm:^6.2.1" - common-tags: "npm:^1.8.0" - dayjs: "npm:^1.10.4" - debug: "npm:^4.3.4" - enquirer: "npm:^2.3.6" - eventemitter2: "npm:6.4.7" - execa: "npm:4.1.0" - executable: "npm:^4.1.1" - extract-zip: "npm:2.0.1" - figures: "npm:^3.2.0" - fs-extra: "npm:^9.1.0" - getos: "npm:^3.2.1" - is-ci: "npm:^3.0.1" - is-installed-globally: "npm:~0.4.0" - lazy-ass: "npm:^1.6.0" - listr2: "npm:^3.8.3" - lodash: "npm:^4.17.21" - log-symbols: "npm:^4.0.0" - minimist: "npm:^1.2.8" - ospath: "npm:^1.2.2" - pretty-bytes: "npm:^5.6.0" - process: "npm:^0.11.10" - proxy-from-env: "npm:1.0.0" - request-progress: "npm:^3.0.0" - semver: "npm:^7.5.3" - supports-color: "npm:^8.1.1" - tmp: "npm:~0.2.3" - tree-kill: "npm:1.2.2" - untildify: "npm:^4.0.0" - yauzl: "npm:^2.10.0" - bin: - cypress: bin/cypress - checksum: 10/fa822dd7db5283d01b81fbad6278743e63b3bbb9e72e689b5bc92f6d7fbe8f62501d644e3db45fa4a11a810dccebae9c999cc59475a8f3d4c22536f7797e415b - languageName: node - linkType: hard - "damerau-levenshtein@npm:^1.0.8": version: 1.0.8 resolution: "damerau-levenshtein@npm:1.0.8" @@ -6715,15 +6387,6 @@ __metadata: languageName: node linkType: hard -"dashdash@npm:^1.12.0": - version: 1.14.1 - resolution: "dashdash@npm:1.14.1" - dependencies: - assert-plus: "npm:^1.0.0" - checksum: 10/137b287fa021201ce100cef772c8eeeaaafdd2aa7282864022acf3b873021e54cb809e9c060fa164840bf54ff72d00d6e2d8da1ee5a86d7200eeefa1123a8f7f - languageName: node - linkType: hard - "data-view-buffer@npm:^1.0.1": version: 1.0.1 resolution: "data-view-buffer@npm:1.0.1" @@ -6766,13 +6429,6 @@ __metadata: languageName: node linkType: hard -"dayjs@npm:1.11.13, dayjs@npm:^1.10.4": - version: 1.11.13 - resolution: "dayjs@npm:1.11.13" - checksum: 10/7374d63ab179b8d909a95e74790def25c8986e329ae989840bacb8b1888be116d20e1c4eee75a69ea0dfbae13172efc50ef85619d304ee7ca3c01d5878b704f5 - languageName: node - linkType: hard - "debounce@npm:^1.2.1": version: 1.2.1 resolution: "debounce@npm:1.2.1" @@ -6789,7 +6445,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:4.3.7, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4, debug@npm:^4.3.5, debug@npm:^4.3.6": +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4, debug@npm:^4.3.5, debug@npm:^4.3.6": version: 4.3.7 resolution: "debug@npm:4.3.7" dependencies: @@ -6801,7 +6457,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:^3.1.0, debug@npm:^3.2.7": +"debug@npm:^3.2.7": version: 3.2.7 resolution: "debug@npm:3.2.7" dependencies: @@ -7024,7 +6680,7 @@ __metadata: languageName: node linkType: hard -"dotenv@npm:^16.0.0": +"dotenv@npm:^16.0.0, dotenv@npm:^16.4.5": version: 16.4.5 resolution: "dotenv@npm:16.4.5" checksum: 10/55a3134601115194ae0f924e54473459ed0d9fc340ae610b676e248cca45aa7c680d86365318ea964e6da4e2ea80c4514c1adab5adb43d6867fb57ff068f95c8 @@ -7045,16 +6701,6 @@ __metadata: languageName: node linkType: hard -"ecc-jsbn@npm:~0.1.1": - version: 0.1.2 - resolution: "ecc-jsbn@npm:0.1.2" - dependencies: - jsbn: "npm:~0.1.0" - safer-buffer: "npm:^2.1.0" - checksum: 10/d43591f2396196266e186e6d6928038cc11c76c3699a912cb9c13757060f7bbc7f17f47c4cb16168cdeacffc7965aef021142577e646fb3cb88810c15173eb57 - languageName: node - linkType: hard - "ee-first@npm:1.1.1": version: 1.1.1 resolution: "ee-first@npm:1.1.1" @@ -7106,15 +6752,6 @@ __metadata: languageName: node linkType: hard -"end-of-stream@npm:^1.1.0": - version: 1.4.4 - resolution: "end-of-stream@npm:1.4.4" - dependencies: - once: "npm:^1.4.0" - checksum: 10/530a5a5a1e517e962854a31693dbb5c0b2fc40b46dad2a56a2deec656ca040631124f4795823acc68238147805f8b021abbe221f4afed5ef3c8e8efc2024908b - languageName: node - linkType: hard - "enhanced-resolve@npm:^5.15.0": version: 5.17.1 resolution: "enhanced-resolve@npm:5.17.1" @@ -7125,16 +6762,6 @@ __metadata: languageName: node linkType: hard -"enquirer@npm:^2.3.6": - version: 2.4.1 - resolution: "enquirer@npm:2.4.1" - dependencies: - ansi-colors: "npm:^4.1.1" - strip-ansi: "npm:^6.0.1" - checksum: 10/b3726486cd98f0d458a851a03326a2a5dd4d84f37ff94ff2a2960c915e0fc865865da3b78f0877dc36ac5c1189069eca603e82ec63d5bc6b0dd9985bf6426d7a - languageName: node - linkType: hard - "env-cmd@npm:10.1.0": version: 10.1.0 resolution: "env-cmd@npm:10.1.0" @@ -7709,17 +7336,6 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-cypress@npm:4.0.0": - version: 4.0.0 - resolution: "eslint-plugin-cypress@npm:4.0.0" - dependencies: - globals: "npm:^15.11.0" - peerDependencies: - eslint: ">=9" - checksum: 10/54fdac6a9fa2e9a1ae1bfe8b1e2a348b5755150121810e203c21c3164c15fb42faa7e5bdde2bc60f07611d8f9615096c570ad7105f536e47a1f5bb47b1751187 - languageName: node - linkType: hard - "eslint-plugin-flowtype@npm:^8.0.3": version: 8.0.3 resolution: "eslint-plugin-flowtype@npm:8.0.3" @@ -8128,13 +7744,6 @@ __metadata: languageName: node linkType: hard -"eventemitter2@npm:6.4.7": - version: 6.4.7 - resolution: "eventemitter2@npm:6.4.7" - checksum: 10/df2a733ee3a7ac6e7f6988cebbaac5b14b46bf82f700f1ec86f9e3f3d095dba20f9aa5c29d9d62a6f50fd943f798f7f2a38c4e1b45148f6f7cec7586a8ac6881 - languageName: node - linkType: hard - "eventemitter3@npm:^2.0.3": version: 2.0.3 resolution: "eventemitter3@npm:2.0.3" @@ -8149,23 +7758,6 @@ __metadata: languageName: node linkType: hard -"execa@npm:4.1.0": - version: 4.1.0 - resolution: "execa@npm:4.1.0" - dependencies: - cross-spawn: "npm:^7.0.0" - get-stream: "npm:^5.0.0" - human-signals: "npm:^1.1.1" - is-stream: "npm:^2.0.0" - merge-stream: "npm:^2.0.0" - npm-run-path: "npm:^4.0.0" - onetime: "npm:^5.1.0" - signal-exit: "npm:^3.0.2" - strip-final-newline: "npm:^2.0.0" - checksum: 10/ed58e41fe424797f3d837c8fb622548eeb72fa03324f2676af95f806568904eb55f196127a097f87d4517cab524c169ece13e6c9e201867de57b089584864b8f - languageName: node - linkType: hard - "execa@npm:^8.0.1": version: 8.0.1 resolution: "execa@npm:8.0.1" @@ -8183,15 +7775,6 @@ __metadata: languageName: node linkType: hard -"executable@npm:^4.1.1": - version: 4.1.1 - resolution: "executable@npm:4.1.1" - dependencies: - pify: "npm:^2.2.0" - checksum: 10/f01927ce59bccec804e171bf859a26e362c1f50aa9ebc69f7cafdcce3859d29d4b6267fd47237c18b0a1830614bd3f0ee14b7380d9bad18a4e7af9b5f0b6984f - languageName: node - linkType: hard - "exponential-backoff@npm:^3.1.1": version: 3.1.1 resolution: "exponential-backoff@npm:3.1.1" @@ -8238,7 +7821,7 @@ __metadata: languageName: node linkType: hard -"extend@npm:^3.0.2, extend@npm:~3.0.2": +"extend@npm:^3.0.2": version: 3.0.2 resolution: "extend@npm:3.0.2" checksum: 10/59e89e2dc798ec0f54b36d82f32a27d5f6472c53974f61ca098db5d4648430b725387b53449a34df38fd0392045434426b012f302b3cc049a6500ccf82877e4e @@ -8256,37 +7839,6 @@ __metadata: languageName: node linkType: hard -"extract-zip@npm:2.0.1": - version: 2.0.1 - resolution: "extract-zip@npm:2.0.1" - dependencies: - "@types/yauzl": "npm:^2.9.1" - debug: "npm:^4.1.1" - get-stream: "npm:^5.1.0" - yauzl: "npm:^2.10.0" - dependenciesMeta: - "@types/yauzl": - optional: true - bin: - extract-zip: cli.js - checksum: 10/8cbda9debdd6d6980819cc69734d874ddd71051c9fe5bde1ef307ebcedfe949ba57b004894b585f758b7c9eeeea0e3d87f2dda89b7d25320459c2c9643ebb635 - languageName: node - linkType: hard - -"extsprintf@npm:1.3.0": - version: 1.3.0 - resolution: "extsprintf@npm:1.3.0" - checksum: 10/26967d6c7ecbfb5bc5b7a6c43503dc5fafd9454802037e9fa1665e41f615da4ff5918bd6cb871a3beabed01a31eca1ccd0bdfb41231f50ad50d405a430f78377 - languageName: node - linkType: hard - -"extsprintf@npm:^1.2.0": - version: 1.4.1 - resolution: "extsprintf@npm:1.4.1" - checksum: 10/bfd6d55f3c0c04d826fe0213264b383c03f32825af6b1ff777f3f2dc49467e599361993568d75b7b19a8ea1bb08c8e7cd8c3d87d179ced91bb0dcf81ca6938e0 - languageName: node - linkType: hard - "fake-xml-http-request@npm:^2.1.2": version: 2.1.2 resolution: "fake-xml-http-request@npm:2.1.2" @@ -8365,15 +7917,6 @@ __metadata: languageName: node linkType: hard -"fd-slicer@npm:~1.1.0": - version: 1.1.0 - resolution: "fd-slicer@npm:1.1.0" - dependencies: - pend: "npm:~1.2.0" - checksum: 10/db3e34fa483b5873b73f248e818f8a8b59a6427fd8b1436cd439c195fdf11e8659419404826059a642b57d18075c856d06d6a50a1413b714f12f833a9341ead3 - languageName: node - linkType: hard - "fflate@npm:^0.6.9": version: 0.6.10 resolution: "fflate@npm:0.6.10" @@ -8388,7 +7931,7 @@ __metadata: languageName: node linkType: hard -"figures@npm:^3.0.0, figures@npm:^3.2.0": +"figures@npm:^3.0.0": version: 3.2.0 resolution: "figures@npm:3.2.0" dependencies: @@ -8559,14 +8102,7 @@ __metadata: languageName: node linkType: hard -"forever-agent@npm:~0.6.1": - version: 0.6.1 - resolution: "forever-agent@npm:0.6.1" - checksum: 10/c1e1644d5e074ac063ecbc3fb8582013ef91fff0e3fa41e76db23d2f62bc6d9677aac86db950917deed4fe1fdd772df780cfaa352075f23deec9c015313afb97 - languageName: node - linkType: hard - -"form-data@npm:^4.0.0, form-data@npm:~4.0.0": +"form-data@npm:^4.0.0": version: 4.0.0 resolution: "form-data@npm:4.0.0" dependencies: @@ -8620,18 +8156,6 @@ __metadata: languageName: node linkType: hard -"fs-extra@npm:^9.1.0": - version: 9.1.0 - resolution: "fs-extra@npm:9.1.0" - dependencies: - at-least-node: "npm:^1.0.0" - graceful-fs: "npm:^4.2.0" - jsonfile: "npm:^6.0.1" - universalify: "npm:^2.0.0" - checksum: 10/08600da1b49552ed23dfac598c8fc909c66776dd130fea54fbcad22e330f7fcc13488bb995f6bc9ce5651aa35b65702faf616fe76370ee56f1aade55da982dca - languageName: node - linkType: hard - "fs-minipass@npm:^2.0.0": version: 2.1.0 resolution: "fs-minipass@npm:2.1.0" @@ -8657,12 +8181,31 @@ __metadata: languageName: node linkType: hard -"fsevents@npm:~2.3.2, fsevents@npm:~2.3.3": - version: 2.3.3 - resolution: "fsevents@npm:2.3.3" +"fsevents@npm:2.3.2": + version: 2.3.2 + resolution: "fsevents@npm:2.3.2" + dependencies: + node-gyp: "npm:latest" + checksum: 10/6b5b6f5692372446ff81cf9501c76e3e0459a4852b3b5f1fc72c103198c125a6b8c72f5f166bdd76ffb2fca261e7f6ee5565daf80dca6e571e55bcc589cc1256 + conditions: os=darwin + languageName: node + linkType: hard + +"fsevents@npm:~2.3.2, fsevents@npm:~2.3.3": + version: 2.3.3 + resolution: "fsevents@npm:2.3.3" + dependencies: + node-gyp: "npm:latest" + checksum: 10/4c1ade961ded57cdbfbb5cac5106ec17bc8bccd62e16343c569a0ceeca83b9dfef87550b4dc5cbb89642da412b20c5071f304c8c464b80415446e8e155a038c0 + conditions: os=darwin + languageName: node + linkType: hard + +"fsevents@patch:fsevents@npm%3A2.3.2#optional!builtin": + version: 2.3.2 + resolution: "fsevents@patch:fsevents@npm%3A2.3.2#optional!builtin::version=2.3.2&hash=df0bf1" dependencies: node-gyp: "npm:latest" - checksum: 10/4c1ade961ded57cdbfbb5cac5106ec17bc8bccd62e16343c569a0ceeca83b9dfef87550b4dc5cbb89642da412b20c5071f304c8c464b80415446e8e155a038c0 conditions: os=darwin languageName: node linkType: hard @@ -8743,15 +8286,6 @@ __metadata: languageName: node linkType: hard -"get-stream@npm:^5.0.0, get-stream@npm:^5.1.0": - version: 5.2.0 - resolution: "get-stream@npm:5.2.0" - dependencies: - pump: "npm:^3.0.0" - checksum: 10/13a73148dca795e41421013da6e3ebff8ccb7fba4d2f023fd0c6da2c166ec4e789bec9774a73a7b49c08daf2cae552f8a3e914042ac23b5f59dd278cc8f9cbfb - languageName: node - linkType: hard - "get-stream@npm:^8.0.1": version: 8.0.1 resolution: "get-stream@npm:8.0.1" @@ -8779,24 +8313,6 @@ __metadata: languageName: node linkType: hard -"getos@npm:^3.2.1": - version: 3.2.1 - resolution: "getos@npm:3.2.1" - dependencies: - async: "npm:^3.2.0" - checksum: 10/228bede057f5cbed93dc6a66ce459a0364059faa2869682547663302f612e6295f13d3ad2a54ebbed573a9eb7f8124508b24409df6bcda6e15906c357526d11f - languageName: node - linkType: hard - -"getpass@npm:^0.1.1": - version: 0.1.7 - resolution: "getpass@npm:0.1.7" - dependencies: - assert-plus: "npm:^1.0.0" - checksum: 10/ab18d55661db264e3eac6012c2d3daeafaab7a501c035ae0ccb193c3c23e9849c6e29b6ac762b9c2adae460266f925d55a3a2a3a3c8b94be2f222df94d70c046 - languageName: node - linkType: hard - "git-raw-commits@npm:^4.0.0": version: 4.0.0 resolution: "git-raw-commits@npm:4.0.0" @@ -8878,15 +8394,6 @@ __metadata: languageName: node linkType: hard -"global-dirs@npm:^3.0.0": - version: 3.0.1 - resolution: "global-dirs@npm:3.0.1" - dependencies: - ini: "npm:2.0.0" - checksum: 10/70147b80261601fd40ac02a104581432325c1c47329706acd773f3a6ce99bb36d1d996038c85ccacd482ad22258ec233c586b6a91535b1a116b89663d49d6438 - languageName: node - linkType: hard - "globals@npm:^11.1.0": version: 11.12.0 resolution: "globals@npm:11.12.0" @@ -8918,7 +8425,7 @@ __metadata: languageName: node linkType: hard -"globby@npm:11.1.0, globby@npm:^11.1.0": +"globby@npm:^11.1.0": version: 11.1.0 resolution: "globby@npm:11.1.0" dependencies: @@ -8954,7 +8461,6 @@ __metadata: dependencies: "@commitlint/cli": "npm:19.5.0" "@commitlint/config-conventional": "npm:19.5.0" - "@cypress/code-coverage": "npm:3.13.4" "@emotion/react": "npm:11.13.3" "@emotion/styled": "npm:11.13.0" "@eslint/compat": "npm:^1.2.0" @@ -8966,6 +8472,7 @@ __metadata: "@mui/icons-material": "npm:5.16.7" "@mui/lab": "npm:5.0.0-alpha.173" "@mui/material": "npm:5.16.7" + "@playwright/test": "npm:^1.49.0" "@react-three/drei": "npm:^9.114.4" "@react-three/fiber": "npm:^8.17.10" "@sentry/react": "npm:7.119.2" @@ -8984,7 +8491,7 @@ __metadata: "@vitejs/plugin-react": "npm:^4.2.1" axios: "npm:1.7.7" concurrently: "npm:8.2.2" - cypress: "npm:13.15.1" + dotenv: "npm:^16.4.5" env-cmd: "npm:10.1.0" eslint: "npm:9.13.0" eslint-config-airbnb: "npm:19.0.4" @@ -8992,7 +8499,6 @@ __metadata: eslint-config-prettier: "npm:9.1.0" eslint-config-react-app: "npm:7.0.1" eslint-import-resolver-typescript: "npm:^3.6.1" - eslint-plugin-cypress: "npm:4.0.0" eslint-plugin-import: "npm:2.31.0" eslint-plugin-jsx-a11y: "npm:6.10.2" eslint-plugin-prettier: "npm:5.2.1" @@ -9005,6 +8511,7 @@ __metadata: nock: "npm:^13.5.3" nyc: "npm:17.1.0" papaparse: "npm:^5.4.1" + playwright-test-coverage: "npm:^1.2.12" prettier: "npm:3.3.3" react: "npm:18.3.1" react-dom: "npm:18.3.1" @@ -9208,17 +8715,6 @@ __metadata: languageName: node linkType: hard -"http-signature@npm:~1.4.0": - version: 1.4.0 - resolution: "http-signature@npm:1.4.0" - dependencies: - assert-plus: "npm:^1.0.0" - jsprim: "npm:^2.0.2" - sshpk: "npm:^1.18.0" - checksum: 10/f9f5eed4ac5db5e1ec6d00652680c7d8b76d553560017e34505c0c22c37abb2e6d22b9268ed4a8542aa9746852a2d64850531091e443393c9c8e0f4fd4174455 - languageName: node - linkType: hard - "http-status-codes@npm:2.3.0": version: 2.3.0 resolution: "http-status-codes@npm:2.3.0" @@ -9236,13 +8732,6 @@ __metadata: languageName: node linkType: hard -"human-signals@npm:^1.1.1": - version: 1.1.1 - resolution: "human-signals@npm:1.1.1" - checksum: 10/6a58224dffcef5588910b1028bda8623c9a7053460a1fe3367e61921a6b5f6b93aba30f323868a958f968d7de3f5f78421f11d4d9f7e9563b1bd2b00ed9a4deb - languageName: node - linkType: hard - "human-signals@npm:^5.0.0": version: 5.0.0 resolution: "human-signals@npm:5.0.0" @@ -9362,13 +8851,6 @@ __metadata: languageName: node linkType: hard -"ini@npm:2.0.0": - version: 2.0.0 - resolution: "ini@npm:2.0.0" - checksum: 10/04e24ba05c4f6947e15560824e153b4610bceea2f5a3ab68651d221a4aab3c77d4e3e90a917ebc8bf5ad71a30a8575de56c39d6b4c4b1375a28016b9f3625f9d - languageName: node - linkType: hard - "ini@npm:4.1.1": version: 4.1.1 resolution: "ini@npm:4.1.1" @@ -9518,17 +9000,6 @@ __metadata: languageName: node linkType: hard -"is-ci@npm:^3.0.1": - version: 3.0.1 - resolution: "is-ci@npm:3.0.1" - dependencies: - ci-info: "npm:^3.2.0" - bin: - is-ci: bin.js - checksum: 10/192c66dc7826d58f803ecae624860dccf1899fc1f3ac5505284c0a5cf5f889046ffeb958fa651e5725d5705c5bcb14f055b79150ea5fcad7456a9569de60260e - languageName: node - linkType: hard - "is-core-module@npm:^2.13.0, is-core-module@npm:^2.15.1": version: 2.15.1 resolution: "is-core-module@npm:2.15.1" @@ -9597,16 +9068,6 @@ __metadata: languageName: node linkType: hard -"is-installed-globally@npm:~0.4.0": - version: 0.4.0 - resolution: "is-installed-globally@npm:0.4.0" - dependencies: - global-dirs: "npm:^3.0.0" - is-path-inside: "npm:^3.0.2" - checksum: 10/5294d21c82cb9beedd693ce1dfb12117c4db36d6e35edc9dc6bf06cb300d23c96520d1bfb063386b054268ae3d7255c3f09393b52218cc26ace99b217bf37c93 - languageName: node - linkType: hard - "is-interactive@npm:^1.0.0": version: 1.0.0 resolution: "is-interactive@npm:1.0.0" @@ -9675,13 +9136,6 @@ __metadata: languageName: node linkType: hard -"is-path-inside@npm:^3.0.2": - version: 3.0.3 - resolution: "is-path-inside@npm:3.0.3" - checksum: 10/abd50f06186a052b349c15e55b182326f1936c89a78bf6c8f2b707412517c097ce04bc49a0ca221787bc44e1049f51f09a2ffb63d22899051988d3a618ba13e9 - languageName: node - linkType: hard - "is-plain-object@npm:5.0.0": version: 5.0.0 resolution: "is-plain-object@npm:5.0.0" @@ -9772,7 +9226,7 @@ __metadata: languageName: node linkType: hard -"is-typedarray@npm:^1.0.0, is-typedarray@npm:~1.0.0": +"is-typedarray@npm:^1.0.0": version: 1.0.0 resolution: "is-typedarray@npm:1.0.0" checksum: 10/4b433bfb0f9026f079f4eb3fbaa4ed2de17c9995c3a0b5c800bec40799b4b2a8b4e051b1ada77749deb9ded4ae52fe2096973f3a93ff83df1a5a7184a669478c @@ -9847,13 +9301,6 @@ __metadata: languageName: node linkType: hard -"isstream@npm:~0.1.2": - version: 0.1.2 - resolution: "isstream@npm:0.1.2" - checksum: 10/22d9c181015226d4534a227539256897bbbcb7edd1066ca4fc4d3a06dbd976325dfdd16b3983c7d236a89f256805c1a685a772e0364e98873d3819b064ad35a1 - languageName: node - linkType: hard - "istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.0": version: 3.2.2 resolution: "istanbul-lib-coverage@npm:3.2.2" @@ -9870,18 +9317,6 @@ __metadata: languageName: node linkType: hard -"istanbul-lib-instrument@npm:^4.0.0": - version: 4.0.3 - resolution: "istanbul-lib-instrument@npm:4.0.3" - dependencies: - "@babel/core": "npm:^7.7.5" - "@istanbuljs/schema": "npm:^0.1.2" - istanbul-lib-coverage: "npm:^3.0.0" - semver: "npm:^6.3.0" - checksum: 10/6e04ab365b95644ec4954b645f901be90be8ad81233d6df536300cdafcf70dd1ed22a912ceda38b32053c7fc9830c44cd23550c603f493329a8532073d1d6c42 - languageName: node - linkType: hard - "istanbul-lib-instrument@npm:^6.0.2": version: 6.0.3 resolution: "istanbul-lib-instrument@npm:6.0.3" @@ -10042,17 +9477,6 @@ __metadata: languageName: node linkType: hard -"js-yaml@npm:4.1.0, js-yaml@npm:^4.1.0": - version: 4.1.0 - resolution: "js-yaml@npm:4.1.0" - dependencies: - argparse: "npm:^2.0.1" - bin: - js-yaml: bin/js-yaml.js - checksum: 10/c138a34a3fd0d08ebaf71273ad4465569a483b8a639e0b118ff65698d257c2791d3199e3f303631f2cb98213fa7b5f5d6a4621fd0fff819421b990d30d967140 - languageName: node - linkType: hard - "js-yaml@npm:^3.13.1": version: 3.14.1 resolution: "js-yaml@npm:3.14.1" @@ -10065,6 +9489,17 @@ __metadata: languageName: node linkType: hard +"js-yaml@npm:^4.1.0": + version: 4.1.0 + resolution: "js-yaml@npm:4.1.0" + dependencies: + argparse: "npm:^2.0.1" + bin: + js-yaml: bin/js-yaml.js + checksum: 10/c138a34a3fd0d08ebaf71273ad4465569a483b8a639e0b118ff65698d257c2791d3199e3f303631f2cb98213fa7b5f5d6a4621fd0fff819421b990d30d967140 + languageName: node + linkType: hard + "jsbn@npm:1.1.0": version: 1.1.0 resolution: "jsbn@npm:1.1.0" @@ -10072,13 +9507,6 @@ __metadata: languageName: node linkType: hard -"jsbn@npm:~0.1.0": - version: 0.1.1 - resolution: "jsbn@npm:0.1.1" - checksum: 10/5450133242845100e694f0ef9175f44c012691a9b770b2571e677314e6f70600abb10777cdfc9a0c6a9f2ac6d134577403633de73e2fcd0f97875a67744e2d14 - languageName: node - linkType: hard - "jsesc@npm:^2.5.1": version: 2.5.2 resolution: "jsesc@npm:2.5.2" @@ -10134,13 +9562,6 @@ __metadata: languageName: node linkType: hard -"json-schema@npm:0.4.0": - version: 0.4.0 - resolution: "json-schema@npm:0.4.0" - checksum: 10/8b3b64eff4a807dc2a3045b104ed1b9335cd8d57aa74c58718f07f0f48b8baa3293b00af4dcfbdc9144c3aafea1e97982cc27cc8e150fc5d93c540649507a458 - languageName: node - linkType: hard - "json-stable-stringify-without-jsonify@npm:^1.0.1": version: 1.0.1 resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" @@ -10148,7 +9569,7 @@ __metadata: languageName: node linkType: hard -"json-stringify-safe@npm:^5.0.1, json-stringify-safe@npm:~5.0.1": +"json-stringify-safe@npm:^5.0.1": version: 5.0.1 resolution: "json-stringify-safe@npm:5.0.1" checksum: 10/59169a081e4eeb6f9559ae1f938f656191c000e0512aa6df9f3c8b2437a4ab1823819c6b9fd1818a4e39593ccfd72e9a051fdd3e2d1e340ed913679e888ded8c @@ -10195,18 +9616,6 @@ __metadata: languageName: node linkType: hard -"jsprim@npm:^2.0.2": - version: 2.0.2 - resolution: "jsprim@npm:2.0.2" - dependencies: - assert-plus: "npm:1.0.0" - extsprintf: "npm:1.3.0" - json-schema: "npm:0.4.0" - verror: "npm:1.10.0" - checksum: 10/fcfca5b55f83e1b8be5f932c71754bd37afd2611f81685abd05689e8ce718a91155ff7bd5b94c65ce483a787b5c43c6d0c18c1d2259fca5bb61a3f8ea2e29c0a - languageName: node - linkType: hard - "jsx-ast-utils@npm:^2.4.1 || ^3.0.0, jsx-ast-utils@npm:^3.3.5": version: 3.3.5 resolution: "jsx-ast-utils@npm:3.3.5" @@ -10255,13 +9664,6 @@ __metadata: languageName: node linkType: hard -"lazy-ass@npm:^1.6.0": - version: 1.6.0 - resolution: "lazy-ass@npm:1.6.0" - checksum: 10/3969ebef060b6f665fc78310ec769f7d2945db2d5af2b6663eda1bc9ec45c845deba9c4a3f75f124ce2c76fedf56514a063ee5c2affc8bc94963fbbddb442a88 - languageName: node - linkType: hard - "lazy-universal-dotenv@npm:^4.0.0": version: 4.0.0 resolution: "lazy-universal-dotenv@npm:4.0.0" @@ -10308,27 +9710,6 @@ __metadata: languageName: node linkType: hard -"listr2@npm:^3.8.3": - version: 3.14.0 - resolution: "listr2@npm:3.14.0" - dependencies: - cli-truncate: "npm:^2.1.0" - colorette: "npm:^2.0.16" - log-update: "npm:^4.0.0" - p-map: "npm:^4.0.0" - rfdc: "npm:^1.3.0" - rxjs: "npm:^7.5.1" - through: "npm:^2.3.8" - wrap-ansi: "npm:^7.0.0" - peerDependencies: - enquirer: ">= 2.3.0 < 3" - peerDependenciesMeta: - enquirer: - optional: true - checksum: 10/cebbd692330279ea82f05468cbb0a16f5b40015a6163e0a2fb04ef168da8e2d6c54e129148e90112d92e7f9ecb85a56e6b88d867a58a8ebdf36e0c98df49ae5c - languageName: node - linkType: hard - "local-pkg@npm:^0.5.0": version: 0.5.0 resolution: "local-pkg@npm:0.5.0" @@ -10424,13 +9805,6 @@ __metadata: languageName: node linkType: hard -"lodash.once@npm:^4.1.1": - version: 4.1.1 - resolution: "lodash.once@npm:4.1.1" - checksum: 10/202f2c8c3d45e401b148a96de228e50ea6951ee5a9315ca5e15733d5a07a6b1a02d9da1e7fdf6950679e17e8ca8f7190ec33cae47beb249b0c50019d753f38f3 - languageName: node - linkType: hard - "lodash.snakecase@npm:^4.1.1": version: 4.1.1 resolution: "lodash.snakecase@npm:4.1.1" @@ -10466,14 +9840,14 @@ __metadata: languageName: node linkType: hard -"lodash@npm:^4.0.0, lodash@npm:^4.17.20, lodash@npm:^4.17.21, lodash@npm:^4.17.4": +"lodash@npm:^4.0.0, lodash@npm:^4.17.21, lodash@npm:^4.17.4": version: 4.17.21 resolution: "lodash@npm:4.17.21" checksum: 10/c08619c038846ea6ac754abd6dd29d2568aa705feb69339e836dfa8d8b09abbb2f859371e86863eda41848221f9af43714491467b5b0299122431e202bb0c532 languageName: node linkType: hard -"log-symbols@npm:^4.0.0, log-symbols@npm:^4.1.0": +"log-symbols@npm:^4.1.0": version: 4.1.0 resolution: "log-symbols@npm:4.1.0" dependencies: @@ -10483,18 +9857,6 @@ __metadata: languageName: node linkType: hard -"log-update@npm:^4.0.0": - version: 4.0.0 - resolution: "log-update@npm:4.0.0" - dependencies: - ansi-escapes: "npm:^4.3.0" - cli-cursor: "npm:^3.1.0" - slice-ansi: "npm:^4.0.0" - wrap-ansi: "npm:^6.2.0" - checksum: 10/ae2f85bbabc1906034154fb7d4c4477c79b3e703d22d78adee8b3862fa913942772e7fa11713e3d96fb46de4e3cabefbf5d0a544344f03b58d3c4bff52aa9eb2 - languageName: node - linkType: hard - "loose-envify@npm:^1.1.0, loose-envify@npm:^1.4.0": version: 1.4.0 resolution: "loose-envify@npm:1.4.0" @@ -10722,7 +10084,7 @@ __metadata: languageName: node linkType: hard -"mime-types@npm:^2.1.12, mime-types@npm:~2.1.19, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": +"mime-types@npm:^2.1.12, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": version: 2.1.35 resolution: "mime-types@npm:2.1.35" dependencies: @@ -11074,7 +10436,7 @@ __metadata: languageName: node linkType: hard -"npm-run-path@npm:^4.0.0, npm-run-path@npm:^4.0.1": +"npm-run-path@npm:^4.0.1": version: 4.0.1 resolution: "npm-run-path@npm:4.0.1" dependencies: @@ -11092,43 +10454,6 @@ __metadata: languageName: node linkType: hard -"nyc@npm:15.1.0": - version: 15.1.0 - resolution: "nyc@npm:15.1.0" - dependencies: - "@istanbuljs/load-nyc-config": "npm:^1.0.0" - "@istanbuljs/schema": "npm:^0.1.2" - caching-transform: "npm:^4.0.0" - convert-source-map: "npm:^1.7.0" - decamelize: "npm:^1.2.0" - find-cache-dir: "npm:^3.2.0" - find-up: "npm:^4.1.0" - foreground-child: "npm:^2.0.0" - get-package-type: "npm:^0.1.0" - glob: "npm:^7.1.6" - istanbul-lib-coverage: "npm:^3.0.0" - istanbul-lib-hook: "npm:^3.0.0" - istanbul-lib-instrument: "npm:^4.0.0" - istanbul-lib-processinfo: "npm:^2.0.2" - istanbul-lib-report: "npm:^3.0.0" - istanbul-lib-source-maps: "npm:^4.0.0" - istanbul-reports: "npm:^3.0.2" - make-dir: "npm:^3.0.0" - node-preload: "npm:^0.2.1" - p-map: "npm:^3.0.0" - process-on-spawn: "npm:^1.0.0" - resolve-from: "npm:^5.0.0" - rimraf: "npm:^3.0.0" - signal-exit: "npm:^3.0.2" - spawn-wrap: "npm:^2.0.0" - test-exclude: "npm:^6.0.0" - yargs: "npm:^15.0.2" - bin: - nyc: bin/nyc.js - checksum: 10/c987f04f4192dfd94e9e69869c76a54220b3ed555016751f380a413a378cceff8ec346df579e9126035b6acbc60ab893cc65e67729cc427c0171361bcb481e66 - languageName: node - linkType: hard - "nyc@npm:17.1.0": version: 17.1.0 resolution: "nyc@npm:17.1.0" @@ -11263,7 +10588,7 @@ __metadata: languageName: node linkType: hard -"once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0": +"once@npm:^1.3.0": version: 1.4.0 resolution: "once@npm:1.4.0" dependencies: @@ -11328,13 +10653,6 @@ __metadata: languageName: node linkType: hard -"ospath@npm:^1.2.2": - version: 1.2.2 - resolution: "ospath@npm:1.2.2" - checksum: 10/505f48a4f4f1c557d6c656ec985707726e3714721680139be037613e903aa8c8fa4ddd8d1342006f9b2dc0065e6e20f8b7bea2ee05354f31257044790367b347 - languageName: node - linkType: hard - "outvariant@npm:^1.2.1, outvariant@npm:^1.4.0": version: 1.4.3 resolution: "outvariant@npm:1.4.3" @@ -11585,20 +10903,6 @@ __metadata: languageName: node linkType: hard -"pend@npm:~1.2.0": - version: 1.2.0 - resolution: "pend@npm:1.2.0" - checksum: 10/6c72f5243303d9c60bd98e6446ba7d30ae29e3d56fdb6fae8767e8ba6386f33ee284c97efe3230a0d0217e2b1723b8ab490b1bbf34fcbb2180dbc8a9de47850d - languageName: node - linkType: hard - -"performance-now@npm:^2.1.0": - version: 2.1.0 - resolution: "performance-now@npm:2.1.0" - checksum: 10/534e641aa8f7cba160f0afec0599b6cecefbb516a2e837b512be0adbe6c1da5550e89c78059c7fabc5c9ffdf6627edabe23eb7c518c4500067a898fa65c2b550 - languageName: node - linkType: hard - "picocolors@npm:^1.0.0, picocolors@npm:^1.0.1, picocolors@npm:^1.1.0": version: 1.1.0 resolution: "picocolors@npm:1.1.0" @@ -11613,13 +10917,6 @@ __metadata: languageName: node linkType: hard -"pify@npm:^2.2.0": - version: 2.3.0 - resolution: "pify@npm:2.3.0" - checksum: 10/9503aaeaf4577acc58642ad1d25c45c6d90288596238fb68f82811c08104c800e5a7870398e9f015d82b44ecbcbef3dc3d4251a1cbb582f6e5959fe09884b2ba - languageName: node - linkType: hard - "pkg-dir@npm:^4.1.0": version: 4.2.0 resolution: "pkg-dir@npm:4.2.0" @@ -11649,6 +10946,39 @@ __metadata: languageName: node linkType: hard +"playwright-core@npm:1.49.0": + version: 1.49.0 + resolution: "playwright-core@npm:1.49.0" + bin: + playwright-core: cli.js + checksum: 10/ef9c708293adab100337ed7fd8e61660be381707fc2b84f07b5f40d1ead44feb6a8e52fef98075e594522229d15a9ad56dd1471689cfa59409bec6447c22944d + languageName: node + linkType: hard + +"playwright-test-coverage@npm:^1.2.12": + version: 1.2.12 + resolution: "playwright-test-coverage@npm:1.2.12" + peerDependencies: + "@playwright/test": ^1.14.1 + checksum: 10/2a858543e0540d66ac43524a3f15abcfd26be5ec89ea899bf05ba44c525dccad3fa4053077329356cef2f009e5804be908fbf92557b8d655d0bfdceb2ee60c94 + languageName: node + linkType: hard + +"playwright@npm:1.49.0": + version: 1.49.0 + resolution: "playwright@npm:1.49.0" + dependencies: + fsevents: "npm:2.3.2" + playwright-core: "npm:1.49.0" + dependenciesMeta: + fsevents: + optional: true + bin: + playwright: cli.js + checksum: 10/1fb198d09d388ec46cc2f0fc6b889a8bde8a75066ded82d35f08ba333091ebf3fc4ddf11263a86058a7078c7238ec4f23a86a9f1dc3ebd4f610c9eb07841fb32 + languageName: node + linkType: hard + "possible-typed-array-names@npm:^1.0.0": version: 1.0.0 resolution: "possible-typed-array-names@npm:1.0.0" @@ -11709,13 +11039,6 @@ __metadata: languageName: node linkType: hard -"pretty-bytes@npm:^5.6.0": - version: 5.6.0 - resolution: "pretty-bytes@npm:5.6.0" - checksum: 10/9c082500d1e93434b5b291bd651662936b8bd6204ec9fa17d563116a192d6d86b98f6d328526b4e8d783c07d5499e2614a807520249692da9ec81564b2f439cd - languageName: node - linkType: hard - "pretty-format@npm:^29.7.0": version: 29.7.0 resolution: "pretty-format@npm:29.7.0" @@ -11750,13 +11073,6 @@ __metadata: languageName: node linkType: hard -"process@npm:^0.11.10": - version: 0.11.10 - resolution: "process@npm:0.11.10" - checksum: 10/dbaa7e8d1d5cf375c36963ff43116772a989ef2bb47c9bdee20f38fd8fc061119cf38140631cf90c781aca4d3f0f0d2c834711952b728953f04fd7d238f59f5b - languageName: node - linkType: hard - "promise-retry@npm:^2.0.1": version: 2.0.1 resolution: "promise-retry@npm:2.0.1" @@ -11805,13 +11121,6 @@ __metadata: languageName: node linkType: hard -"proxy-from-env@npm:1.0.0": - version: 1.0.0 - resolution: "proxy-from-env@npm:1.0.0" - checksum: 10/f26b59c0f21dd118c23a0eb1f5250848a23b5029ec5c9f2b4011b6439b19fa83da50858d84e9261da94aa4e67778c1bac5483afce884b7770a96895a4e6b9a19 - languageName: node - linkType: hard - "proxy-from-env@npm:^1.1.0": version: 1.1.0 resolution: "proxy-from-env@npm:1.1.0" @@ -11819,24 +11128,7 @@ __metadata: languageName: node linkType: hard -"psl@npm:^1.1.33": - version: 1.9.0 - resolution: "psl@npm:1.9.0" - checksum: 10/d07879d4bfd0ac74796306a8e5a36a93cfb9c4f4e8ee8e63fbb909066c192fe1008cd8f12abd8ba2f62ca28247949a20c8fb32e1d18831d9e71285a1569720f9 - languageName: node - linkType: hard - -"pump@npm:^3.0.0": - version: 3.0.2 - resolution: "pump@npm:3.0.2" - dependencies: - end-of-stream: "npm:^1.1.0" - once: "npm:^1.3.1" - checksum: 10/e0c4216874b96bd25ddf31a0b61a5613e26cc7afa32379217cf39d3915b0509def3565f5f6968fafdad2894c8bbdbd67d340e84f3634b2a29b950cffb6442d9f - languageName: node - linkType: hard - -"punycode@npm:^2.1.0, punycode@npm:^2.1.1": +"punycode@npm:^2.1.0": version: 2.3.1 resolution: "punycode@npm:2.3.1" checksum: 10/febdc4362bead22f9e2608ff0171713230b57aff9dddc1c273aa2a651fbd366f94b7d6a71d78342a7c0819906750351ca7f2edd26ea41b626d87d6a13d1bd059 @@ -11852,13 +11144,6 @@ __metadata: languageName: node linkType: hard -"querystringify@npm:^2.1.1": - version: 2.2.0 - resolution: "querystringify@npm:2.2.0" - checksum: 10/46ab16f252fd892fc29d6af60966d338cdfeea68a231e9457631ffd22d67cec1e00141e0a5236a2eb16c0d7d74175d9ec1d6f963660c6f2b1c2fc85b194c5680 - languageName: node - linkType: hard - "queue-microtask@npm:^1.2.2": version: 1.2.3 resolution: "queue-microtask@npm:1.2.3" @@ -12283,15 +11568,6 @@ __metadata: languageName: node linkType: hard -"request-progress@npm:^3.0.0": - version: 3.0.0 - resolution: "request-progress@npm:3.0.0" - dependencies: - throttleit: "npm:^1.0.0" - checksum: 10/c25b1c75fb0a0c3b38874abd7ebd58e320c55bc17a48e76772b26828d9e0f688741e144d31b678af9cf447cba32ae153efad05f8a2db225eb07135a613d3162b - languageName: node - linkType: hard - "require-directory@npm:^2.1.1": version: 2.1.1 resolution: "require-directory@npm:2.1.1" @@ -12313,13 +11589,6 @@ __metadata: languageName: node linkType: hard -"requires-port@npm:^1.0.0": - version: 1.0.0 - resolution: "requires-port@npm:1.0.0" - checksum: 10/878880ee78ccdce372784f62f52a272048e2d0827c29ae31e7f99da18b62a2b9463ea03a75f277352f4697c100183debb0532371ad515a2d49d4bfe596dd4c20 - languageName: node - linkType: hard - "resolve-from@npm:^4.0.0": version: 4.0.0 resolution: "resolve-from@npm:4.0.0" @@ -12417,13 +11686,6 @@ __metadata: languageName: node linkType: hard -"rfdc@npm:^1.3.0": - version: 1.4.1 - resolution: "rfdc@npm:1.4.1" - checksum: 10/2f3d11d3d8929b4bfeefc9acb03aae90f971401de0add5ae6c5e38fec14f0405e6a4aad8fdb76344bfdd20c5193110e3750cbbd28ba86d73729d222b6cf4a729 - languageName: node - linkType: hard - "rimraf@npm:^3.0.0": version: 3.0.2 resolution: "rimraf@npm:3.0.2" @@ -12535,7 +11797,7 @@ __metadata: languageName: node linkType: hard -"rxjs@npm:^7.5.1, rxjs@npm:^7.5.5, rxjs@npm:^7.8.1": +"rxjs@npm:^7.5.5, rxjs@npm:^7.8.1": version: 7.8.1 resolution: "rxjs@npm:7.8.1" dependencies: @@ -12556,7 +11818,7 @@ __metadata: languageName: node linkType: hard -"safe-buffer@npm:5.2.1, safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.2, safe-buffer@npm:~5.2.0": +"safe-buffer@npm:5.2.1, safe-buffer@npm:~5.2.0": version: 5.2.1 resolution: "safe-buffer@npm:5.2.1" checksum: 10/32872cd0ff68a3ddade7a7617b8f4c2ae8764d8b7d884c651b74457967a9e0e886267d3ecc781220629c44a865167b61c375d2da6c720c840ecd73f45d5d9451 @@ -12574,7 +11836,7 @@ __metadata: languageName: node linkType: hard -"safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0, safer-buffer@npm:^2.0.2, safer-buffer@npm:^2.1.0, safer-buffer@npm:~2.1.0": +"safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0": version: 2.1.2 resolution: "safer-buffer@npm:2.1.2" checksum: 10/7eaf7a0cf37cc27b42fb3ef6a9b1df6e93a1c6d98c6c6702b02fe262d5fcbd89db63320793b99b21cb5348097d0a53de81bd5f4e8b86e20cc9412e3f1cfb4e83 @@ -12760,28 +12022,6 @@ __metadata: languageName: node linkType: hard -"slice-ansi@npm:^3.0.0": - version: 3.0.0 - resolution: "slice-ansi@npm:3.0.0" - dependencies: - ansi-styles: "npm:^4.0.0" - astral-regex: "npm:^2.0.0" - is-fullwidth-code-point: "npm:^3.0.0" - checksum: 10/5ec6d022d12e016347e9e3e98a7eb2a592213a43a65f1b61b74d2c78288da0aded781f665807a9f3876b9daa9ad94f64f77d7633a0458876c3a4fdc4eb223f24 - languageName: node - linkType: hard - -"slice-ansi@npm:^4.0.0": - version: 4.0.0 - resolution: "slice-ansi@npm:4.0.0" - dependencies: - ansi-styles: "npm:^4.0.0" - astral-regex: "npm:^2.0.0" - is-fullwidth-code-point: "npm:^3.0.0" - checksum: 10/4a82d7f085b0e1b070e004941ada3c40d3818563ac44766cca4ceadd2080427d337554f9f99a13aaeb3b4a94d9964d9466c807b3d7b7541d1ec37ee32d308756 - languageName: node - linkType: hard - "smart-buffer@npm:^4.2.0": version: 4.2.0 resolution: "smart-buffer@npm:4.2.0" @@ -12880,27 +12120,6 @@ __metadata: languageName: node linkType: hard -"sshpk@npm:^1.18.0": - version: 1.18.0 - resolution: "sshpk@npm:1.18.0" - dependencies: - asn1: "npm:~0.2.3" - assert-plus: "npm:^1.0.0" - bcrypt-pbkdf: "npm:^1.0.0" - dashdash: "npm:^1.12.0" - ecc-jsbn: "npm:~0.1.1" - getpass: "npm:^0.1.1" - jsbn: "npm:~0.1.0" - safer-buffer: "npm:^2.0.2" - tweetnacl: "npm:~0.14.0" - bin: - sshpk-conv: bin/sshpk-conv - sshpk-sign: bin/sshpk-sign - sshpk-verify: bin/sshpk-verify - checksum: 10/858339d43e3c6b6a848772a66f69442ce74f1a37655d9f35ba9d1f85329499ff0000af9f8ab83dbb39ad24c0c370edabe0be1e39863f70c6cded9924b8458c34 - languageName: node - linkType: hard - "ssri@npm:^10.0.0": version: 10.0.6 resolution: "ssri@npm:10.0.6" @@ -13127,13 +12346,6 @@ __metadata: languageName: node linkType: hard -"strip-final-newline@npm:^2.0.0": - version: 2.0.0 - resolution: "strip-final-newline@npm:2.0.0" - checksum: 10/69412b5e25731e1938184b5d489c32e340605bb611d6140344abc3421b7f3c6f9984b21dff296dfcf056681b82caa3bb4cc996a965ce37bcfad663e92eae9c64 - languageName: node - linkType: hard - "strip-final-newline@npm:^3.0.0": version: 3.0.0 resolution: "strip-final-newline@npm:3.0.0" @@ -13329,14 +12541,7 @@ __metadata: languageName: node linkType: hard -"throttleit@npm:^1.0.0": - version: 1.0.1 - resolution: "throttleit@npm:1.0.1" - checksum: 10/17f1aba82192d8b4f5be5f7e7955acd2db0b60557a2e041900bcb685c03fc0a42e44fae955741c2994ec314918c6c1c2c179bfe17b1fbb4a011c506e9ea7cc33 - languageName: node - linkType: hard - -"through@npm:>=2.2.7 <3, through@npm:^2.3.6, through@npm:^2.3.8": +"through@npm:>=2.2.7 <3, through@npm:^2.3.6": version: 2.3.8 resolution: "through@npm:2.3.8" checksum: 10/5da78346f70139a7d213b65a0106f3c398d6bc5301f9248b5275f420abc2c4b1e77c2abc72d218dedc28c41efb2e7c312cb76a7730d04f9c2d37d247da3f4198 @@ -13408,13 +12613,6 @@ __metadata: languageName: node linkType: hard -"tmp@npm:~0.2.3": - version: 0.2.3 - resolution: "tmp@npm:0.2.3" - checksum: 10/7b13696787f159c9754793a83aa79a24f1522d47b87462ddb57c18ee93ff26c74cbb2b8d9138f571d2e0e765c728fb2739863a672b280528512c6d83d511c6fa - languageName: node - linkType: hard - "to-fast-properties@npm:^2.0.0": version: 2.0.0 resolution: "to-fast-properties@npm:2.0.0" @@ -13438,18 +12636,6 @@ __metadata: languageName: node linkType: hard -"tough-cookie@npm:^4.1.3": - version: 4.1.4 - resolution: "tough-cookie@npm:4.1.4" - dependencies: - psl: "npm:^1.1.33" - punycode: "npm:^2.1.1" - universalify: "npm:^0.2.0" - url-parse: "npm:^1.5.3" - checksum: 10/75663f4e2cd085f16af0b217e4218772adf0617fb3227171102618a54ce0187a164e505d61f773ed7d65988f8ff8a8f935d381f87da981752c1171b076b4afac - languageName: node - linkType: hard - "tr46@npm:~0.0.3": version: 0.0.3 resolution: "tr46@npm:0.0.3" @@ -13457,7 +12643,7 @@ __metadata: languageName: node linkType: hard -"tree-kill@npm:1.2.2, tree-kill@npm:^1.2.2": +"tree-kill@npm:^1.2.2": version: 1.2.2 resolution: "tree-kill@npm:1.2.2" bin: @@ -13556,15 +12742,6 @@ __metadata: languageName: node linkType: hard -"tunnel-agent@npm:^0.6.0": - version: 0.6.0 - resolution: "tunnel-agent@npm:0.6.0" - dependencies: - safe-buffer: "npm:^5.0.1" - checksum: 10/7f0d9ed5c22404072b2ae8edc45c071772affd2ed14a74f03b4e71b4dd1a14c3714d85aed64abcaaee5fec2efc79002ba81155c708f4df65821b444abb0cfade - languageName: node - linkType: hard - "tunnel-rat@npm:^0.1.2": version: 0.1.2 resolution: "tunnel-rat@npm:0.1.2" @@ -13574,13 +12751,6 @@ __metadata: languageName: node linkType: hard -"tweetnacl@npm:^0.14.3, tweetnacl@npm:~0.14.0": - version: 0.14.5 - resolution: "tweetnacl@npm:0.14.5" - checksum: 10/04ee27901cde46c1c0a64b9584e04c96c5fe45b38c0d74930710751ea991408b405747d01dfae72f80fc158137018aea94f9c38c651cb9c318f0861a310c3679 - languageName: node - linkType: hard - "type-check@npm:^0.4.0, type-check@npm:~0.4.0": version: 0.4.0 resolution: "type-check@npm:0.4.0" @@ -13807,13 +12977,6 @@ __metadata: languageName: node linkType: hard -"universalify@npm:^0.2.0": - version: 0.2.0 - resolution: "universalify@npm:0.2.0" - checksum: 10/e86134cb12919d177c2353196a4cc09981524ee87abf621f7bc8d249dbbbebaec5e7d1314b96061497981350df786e4c5128dbf442eba104d6e765bc260678b5 - languageName: node - linkType: hard - "universalify@npm:^2.0.0": version: 2.0.1 resolution: "universalify@npm:2.0.1" @@ -13843,13 +13006,6 @@ __metadata: languageName: node linkType: hard -"untildify@npm:^4.0.0": - version: 4.0.0 - resolution: "untildify@npm:4.0.0" - checksum: 10/39ced9c418a74f73f0a56e1ba4634b4d959422dff61f4c72a8e39f60b99380c1b45ed776fbaa0a4101b157e4310d873ad7d114e8534ca02609b4916bb4187fb9 - languageName: node - linkType: hard - "update-browserslist-db@npm:^1.1.0": version: 1.1.0 resolution: "update-browserslist-db@npm:1.1.0" @@ -13873,16 +13029,6 @@ __metadata: languageName: node linkType: hard -"url-parse@npm:^1.5.3": - version: 1.5.10 - resolution: "url-parse@npm:1.5.10" - dependencies: - querystringify: "npm:^2.1.1" - requires-port: "npm:^1.0.0" - checksum: 10/c9e96bc8c5b34e9f05ddfeffc12f6aadecbb0d971b3cc26015b58d5b44676a99f50d5aeb1e5c9e61fa4d49961ae3ab1ae997369ed44da51b2f5ac010d188e6ad - languageName: node - linkType: hard - "use-sync-external-store@npm:1.2.2, use-sync-external-store@npm:^1.2.0": version: 1.2.2 resolution: "use-sync-external-store@npm:1.2.2" @@ -13965,17 +13111,6 @@ __metadata: languageName: node linkType: hard -"verror@npm:1.10.0": - version: 1.10.0 - resolution: "verror@npm:1.10.0" - dependencies: - assert-plus: "npm:^1.0.0" - core-util-is: "npm:1.0.2" - extsprintf: "npm:^1.2.0" - checksum: 10/da548149dd9c130a8a2587c9ee71ea30128d1526925707e2d01ed9c5c45c9e9f86733c66a328247cdd5f7c1516fb25b0f959ba754bfbe15072aa99ff96468a29 - languageName: node - linkType: hard - "vite-node@npm:1.5.2": version: 1.5.2 resolution: "vite-node@npm:1.5.2" @@ -14593,16 +13728,6 @@ __metadata: languageName: node linkType: hard -"yauzl@npm:^2.10.0": - version: 2.10.0 - resolution: "yauzl@npm:2.10.0" - dependencies: - buffer-crc32: "npm:~0.2.3" - fd-slicer: "npm:~1.1.0" - checksum: 10/1e4c311050dc0cf2ee3dbe8854fe0a6cde50e420b3e561a8d97042526b4cf7a0718d6c8d89e9e526a152f4a9cec55bcea9c3617264115f48bd6704cf12a04445 - languageName: node - linkType: hard - "yocto-queue@npm:^0.1.0": version: 0.1.0 resolution: "yocto-queue@npm:0.1.0"