diff --git a/.github/workflows/buildAndTest.yaml b/.github/workflows/buildAndTest.yaml index 0061b2c5..edbb5438 100644 --- a/.github/workflows/buildAndTest.yaml +++ b/.github/workflows/buildAndTest.yaml @@ -14,6 +14,12 @@ on: - checks_requested workflow_dispatch: +permissions: + contents: read + issues: read + checks: write + pull-requests: write + jobs: build: runs-on: ubuntu-latest @@ -60,22 +66,21 @@ jobs: - run: yarn run build:vue-json-form - run: yarn test:unit working-directory: ./vue-json-form - - name: Cypress run - uses: cypress-io/github-action@v6 - with: - working-directory: ./vue-json-form - build: yarn run build - start: yarn dev - wait-on: 'http://localhost:5173' - record: true - env: - # pass GitHub token to allow accurately detecting a build vs a re-run build - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - # Cypress - CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }} - CYPRESS_PROJECT_ID: ${{ secrets.CYPRESS_PROJECT_ID }} + - name: Install Playwright Browsers + run: yarn playwright install --with-deps chromium + working-directory: ./vue-json-form + - name: Run Playwright tests + run: yarn test:e2e + working-directory: ./vue-json-form - uses: actions/upload-artifact@v4 if: always() with: - name: cypress-screenshots - path: cypress/screenshots + name: playwright-report + path: vue-json-form/playwright-report/ + retention-days: 30 + - name: Publish Test Results + uses: EnricoMi/publish-unit-test-result-action@v2 + if: (!cancelled()) + with: + files: | + vue-json-form/test-results/**/*.xml diff --git a/.gitignore b/.gitignore index 248c9dc3..2e4eb413 100644 --- a/.gitignore +++ b/.gitignore @@ -149,3 +149,7 @@ dist # and uncomment the following lines .pnp.* +# Playwright +playwright-report/ +test-results/ +playwright/.cache/ diff --git a/.junie/guidelines.md b/.junie/guidelines.md index 92c55289..ec79c1c7 100644 --- a/.junie/guidelines.md +++ b/.junie/guidelines.md @@ -1,6 +1,6 @@ Project-specific development guidelines for vue-json-form (monorepo) -Audience: Advanced contributors familiar with Yarn workspaces, Vite, Vue 3, TypeScript, Vitest, and Cypress. +Audience: Advanced contributors familiar with Yarn workspaces, Vite, Vue 3, TypeScript, Vitest, and Playwright. 1) Monorepo overview and prerequisites - Package manager: Yarn 4 (Berry). Confirm with node -v (CI uses Node 20/22/24). Use the same major Node versions for reproducibility. @@ -45,22 +45,22 @@ Audience: Advanced contributors familiar with Yarn workspaces, Vite, Vue 3, Type - Run: yarn workspace @educorvi/vue-json-form vitest run src/MapperFunctions/yourFunction.test.ts - Remove temporary files when done if they are only for demonstration. -4) Testing: end-to-end (Cypress) -- Location: vue-json-form/cypress/e2e/*.cy.ts -- Dev server + Cypress (CI parity): - - CI does: build deps, then in ./vue-json-form runs build, starts dev, wait-on http://localhost:5173, then runs Cypress. +4) Testing: end-to-end (Playwright) +- Location: vue-json-form/tests/e2e/*.spec.ts +- Dev server + Playwright (CI parity): + - CI does: build deps, then in ./vue-json-form installs Playwright browsers, runs Playwright tests. - Local equivalent from repo root: - yarn install --immutable - yarn build:vue-json-form - cd vue-json-form - - yarn build - - In one terminal: yarn dev # Vite at http://localhost:5173 - - In another terminal: yarn cypress # Opens Cypress runner - - Headless run: - - From vue-json-form: npx cypress run + - npx playwright install --with-deps chromium # First time only + - yarn test:e2e # Runs tests headless + - Interactive mode: + - From vue-json-form: yarn playwright # Opens Playwright UI - Tips - - Keep e2e fixtures and example schemas under vue-json-form/src/exampleSchemas for reproducible scenarios; CI records and uploads screenshots on failures. - - When adjusting ports/hosts, update wait-on in .github/workflows/buildAndTest.yaml and local commands accordingly. + - Playwright automatically starts the dev server before running tests (configured in playwright.config.ts). + - Keep e2e fixtures and example schemas under vue-json-form/src/exampleSchemas for reproducible scenarios; CI uploads test reports on failures. + - When adjusting ports/hosts, update baseURL in playwright.config.ts and webServer settings accordingly. 5) Coding standards and project conventions - Languages/stack: TypeScript, Vue 3, Vite, Pinia, Sass. Typings for schemas are provided by @educorvi/vue-json-form-schemas. @@ -93,5 +93,5 @@ Audience: Advanced contributors familiar with Yarn workspaces, Vite, Vue 3, Type - yarn install --immutable && yarn build - Iterate on vue-json-form only: - yarn build:vue-json-form && yarn workspace @educorvi/vue-json-form dev -- Run Cypress like CI does: - - yarn build:vue-json-form && (cd vue-json-form && yarn build && yarn dev) in one terminal, and in another terminal run yarn cypress from vue-json-form +- Run Playwright like CI does: + - yarn build:vue-json-form && (cd vue-json-form && yarn test:e2e) diff --git a/demo/cypress.config.ts b/demo/cypress.config.ts deleted file mode 100644 index c8fac129..00000000 --- a/demo/cypress.config.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { defineConfig } from 'cypress' - -export default defineConfig({ - e2e: { - specPattern: 'cypress/e2e/**/*.{cy,spec}.{js,jsx,ts,tsx}', - baseUrl: 'http://localhost:4173' - }, - component: { - specPattern: 'src/**/__tests__/*.{cy,spec}.{js,ts,jsx,tsx}', - devServer: { - framework: 'vue', - bundler: 'vite' - } - } -}) diff --git a/demo/cypress/e2e/example.cy.ts b/demo/cypress/e2e/example.cy.ts deleted file mode 100644 index 7554c35d..00000000 --- a/demo/cypress/e2e/example.cy.ts +++ /dev/null @@ -1,8 +0,0 @@ -// https://on.cypress.io/api - -describe('My First Test', () => { - it('visits the app root url', () => { - cy.visit('/') - cy.contains('h1', 'You did it!') - }) -}) diff --git a/demo/cypress/e2e/tsconfig.json b/demo/cypress/e2e/tsconfig.json deleted file mode 100644 index 37748feb..00000000 --- a/demo/cypress/e2e/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "@vue/tsconfig/tsconfig.dom.json", - "include": ["./**/*", "../support/**/*"], - "compilerOptions": { - "isolatedModules": false, - "target": "es5", - "lib": ["es5", "dom"], - "types": ["cypress"] - } -} diff --git a/demo/cypress/fixtures/example.json b/demo/cypress/fixtures/example.json deleted file mode 100644 index 02e42543..00000000 --- a/demo/cypress/fixtures/example.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "name": "Using fixtures to represent data", - "email": "hello@cypress.io", - "body": "Fixtures are a great way to mock data for responses to routes" -} diff --git a/demo/cypress/support/commands.ts b/demo/cypress/support/commands.ts deleted file mode 100644 index 9b7bb8e2..00000000 --- a/demo/cypress/support/commands.ts +++ /dev/null @@ -1,39 +0,0 @@ -/// -// *********************************************** -// 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 { -// login(email: string, password: string): Chainable -// drag(subject: string, options?: Partial): Chainable -// dismiss(subject: string, options?: Partial): Chainable -// visit(originalFn: CommandOriginalFn, url: string, options: Partial): Chainable -// } -// } -// } - -export {} diff --git a/demo/cypress/support/component-index.html b/demo/cypress/support/component-index.html deleted file mode 100644 index 5f9622ae..00000000 --- a/demo/cypress/support/component-index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - Components App - - -
- - diff --git a/demo/cypress/support/component.ts b/demo/cypress/support/component.ts deleted file mode 100644 index b53dfc04..00000000 --- a/demo/cypress/support/component.ts +++ /dev/null @@ -1,43 +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: -import './commands' - -// Alternatively you can use CommonJS syntax: -// require('./commands') - -// Import global styles -import '../../src/assets/main.scss' - -import { mount } from 'cypress/vue' - -// 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. -/* eslint-disable @typescript-eslint/no-namespace */ -declare global { - namespace Cypress { - interface Chainable { - mount: typeof mount - } - } -} - -Cypress.Commands.add('mount', mount) - -// Example use: -// cy.mount(MyComponent) diff --git a/demo/cypress/support/e2e.ts b/demo/cypress/support/e2e.ts deleted file mode 100644 index d68db96d..00000000 --- a/demo/cypress/support/e2e.ts +++ /dev/null @@ -1,20 +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 './commands' - -// Alternatively you can use CommonJS syntax: -// require('./commands') diff --git a/demo/package.json b/demo/package.json index 3a219b21..5ca44528 100644 --- a/demo/package.json +++ b/demo/package.json @@ -8,11 +8,9 @@ "pre-commit": "echo 'No pre commit configured for demo'", "build": "vite build", "preview": "vite preview", - "test:e2e": "start-server-and-test preview http://localhost:4173 'cypress run --e2e'", - "test:e2e:dev": "start-server-and-test 'vite dev --port 4173' http://localhost:4173 'cypress open --e2e'", - "test:unit": "cypress run --component", - "test:unit:dev": "cypress open --component", - "check-types": "vue-tsc --noEmit -p tsconfig.cypress-ct.json --composite false" + "test:e2e": "playwright test", + "test:e2e:dev": "playwright test --ui", + "check-types": "vue-tsc --noEmit -p tsconfig.app.json --composite false" }, "publishConfig": { "access": "public" @@ -29,17 +27,17 @@ "vue-router": "^4.6.3" }, "devDependencies": { + "@playwright/test": "^1.57.0", "@semantic-release/exec": "^7.1.0", "@tsconfig/node18": "^18.2.4", "@types/node": "^24.9.2", "@vitejs/plugin-vue": "^6.0.1", "@vue/tsconfig": "^0.8.1", - "cypress": "^15.5.0", "npm-run-all": "^4.1.5", + "playwright": "^1.57.0", "semantic-release": "^25.0.1", "semantic-release-monorepo": "^8.0.2", "semantic-release-yarn": "^3.0.2", - "start-server-and-test": "^2.1.2", "typescript": "~5.9.3", "unplugin-vue-components": "^30.0.0", "vite": "^7.1.12", diff --git a/demo/playwright.config.ts b/demo/playwright.config.ts new file mode 100644 index 00000000..11a183a6 --- /dev/null +++ b/demo/playwright.config.ts @@ -0,0 +1,40 @@ +import { defineConfig, devices } from '@playwright/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:4173', + /* 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'] }, + }, + ], + + /* Run your local dev server before starting the tests */ + webServer: { + command: 'yarn preview', + url: 'http://localhost:4173', + reuseExistingServer: !process.env.CI, + }, +}); diff --git a/demo/tests/e2e/example.spec.ts b/demo/tests/e2e/example.spec.ts new file mode 100644 index 00000000..3d3a48b8 --- /dev/null +++ b/demo/tests/e2e/example.spec.ts @@ -0,0 +1,8 @@ +import { test, expect } from '@playwright/test'; + +test.describe('My First Test', () => { + test('visits the app root url', async ({ page }) => { + await page.goto('/'); + await expect(page.locator('h1')).toContainText('You did it!'); + }); +}); diff --git a/demo/tsconfig.cypress-ct.json b/demo/tsconfig.cypress-ct.json deleted file mode 100644 index b21f0843..00000000 --- a/demo/tsconfig.cypress-ct.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "extends": "./tsconfig.app.json", - "include": [ - "env.d.ts", - "src/**/*", - "src/**/*.vue", - "cypress/support/component.*", - "cypress/support/commands.ts" - ], - "exclude": [], - "compilerOptions": { - "composite": true - } -} diff --git a/demo/tsconfig.json b/demo/tsconfig.json index 27e23a60..66b5e570 100644 --- a/demo/tsconfig.json +++ b/demo/tsconfig.json @@ -6,9 +6,6 @@ }, { "path": "./tsconfig.app.json" - }, - { - "path": "./tsconfig.cypress-ct.json" } ] } diff --git a/vue-json-form/cypress.config.ts b/vue-json-form/cypress.config.ts deleted file mode 100644 index 4602aebe..00000000 --- a/vue-json-form/cypress.config.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { defineConfig } from 'cypress'; -import { plugin as cypressGrepPlugin } from '@cypress/grep/plugin'; - -const registerCommonTasks = ( - on: Cypress.PluginEvents, - config: Cypress.PluginConfigOptions -) => { - on('task', { - log(message) { - console.log(message); - return null; - }, - table(data) { - console.table(data); - return null; - }, - }); - - return config; -}; - -export default defineConfig({ - projectId: 'ecbo8x', - component: { - devServer: { - framework: 'vue', - bundler: 'vite', - }, - setupNodeEvents(on, config) { - return registerCommonTasks(on, config); - }, - }, - - e2e: { - setupNodeEvents(on, config) { - cypressGrepPlugin(config); - return registerCommonTasks(on, config); - }, - }, -}); diff --git a/vue-json-form/cypress/e2e/accessibility.cy.ts b/vue-json-form/cypress/e2e/accessibility.cy.ts deleted file mode 100644 index f843f9f4..00000000 --- a/vue-json-form/cypress/e2e/accessibility.cy.ts +++ /dev/null @@ -1,40 +0,0 @@ -/// -/// -function terminalLog(violations: any) { - cy.task( - 'log', - `${violations.length} accessibility violation${ - violations.length === 1 ? '' : 's' - } ${violations.length === 1 ? 'was' : 'were'} detected` - ); - // pluck specific keys to keep the table readable - const violationData = violations.map( - ({ id, impact, description, nodes }) => ({ - id, - impact, - description, - nodes: nodes.length, - }) - ); - - cy.task('table', violationData); -} - -describe('Check for accessibility issues', () => { - const axeOptions = { - rules: { - 'page-has-heading-one': { enabled: false }, - }, - }; - - it('Showcase', () => { - cy.visit('http://localhost:5173/showcase?nonav=true'); - cy.injectAxe(); - cy.checkA11y(null, axeOptions, terminalLog); - }); - it('Reproduce', () => { - cy.visit('http://localhost:5173/reproduce?nonav=true'); - cy.injectAxe(); - cy.checkA11y(null, axeOptions, terminalLog); - }); -}); diff --git a/vue-json-form/cypress/e2e/helpers.ts b/vue-json-form/cypress/e2e/helpers.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/vue-json-form/cypress/e2e/reproduce.cy.ts b/vue-json-form/cypress/e2e/reproduce.cy.ts deleted file mode 100644 index 2bda0609..00000000 --- a/vue-json-form/cypress/e2e/reproduce.cy.ts +++ /dev/null @@ -1,505 +0,0 @@ -/// -import { register as registerCypressGrep } from '@cypress/grep'; -registerCypressGrep(); - -function submitForm() { - cy.get('button[type="submit"]').eq(-3).click(); -} - -const WAIT_TIME = 150; - -const expectSelectOptions = (selector: string, expectedValues: string[]) => { - cy.get(`${selector} option`) - .should('have.length', expectedValues.length) - .each(($option, index) => { - expect($option.attr('value')).to.equal(expectedValues[index]); - }); -}; - -it('JSO-43', () => { - const BOOL_FIELD = '#vjf_control_for__properties_jso-43_properties_bool'; - const HALLO_FIELD = - '#vjf_control_for__properties_jso-43_properties_hallo input[value="du"]'; - const HALLO_FIELD_ICH = - '#vjf_control_for__properties_jso-43_properties_hallo input[value="ich"]'; - const REQUIRED_FIELD = - '#vjf_control_for__properties_jso-43_properties_abhaengiges-feld'; - const REQUIRED_LABEL = - 'label[for="vjf_control_for__properties_jso-43_properties_abhaengiges-feld"]'; - - cy.visit('http://localhost:5173/reproduce?nonav=true'); - cy.get(REQUIRED_FIELD).should('not.exist'); - - cy.get(BOOL_FIELD).check({ force: true }); - cy.get(REQUIRED_FIELD).should('exist').and('have.attr', 'required'); - cy.get(REQUIRED_LABEL).should('contain.text', '*'); - - cy.get(BOOL_FIELD).uncheck({ force: true }); - cy.get(HALLO_FIELD_ICH).check({ force: true }); - cy.get(REQUIRED_FIELD).should('not.exist'); - - cy.get(HALLO_FIELD).check({ force: true }); - cy.get(REQUIRED_FIELD).should('exist').and('have.attr', 'required'); - cy.get(REQUIRED_LABEL).should('contain.text', '*'); - - cy.get(REQUIRED_FIELD).type('Hallo Pflichtfeld'); - submitForm(); - cy.get('#result-container').then((el) => { - const res = JSON.parse(el.text()); - expect(res['jso-43']['abhaengiges-feld']).to.equal('Hallo Pflichtfeld'); - expect(res['jso-43']['hallo']).to.equal('du'); - }); -}); - -it('JSO-79 (I)', () => { - const FIRST_SELECT = '#vjf_control_for__properties_jso-79_properties_first'; - const SECOND_SELECT = - '#vjf_control_for__properties_jso-79_properties_second'; - - cy.visit('http://localhost:5173/reproduce?nonav=true'); - - // Initial state: all options should be available - expectSelectOptions(SECOND_SELECT, ['a1', 'a2', 'b1']); - - // Select 'A': only 'a' options should be available - cy.get(FIRST_SELECT).select('A'); - cy.wait(WAIT_TIME); - expectSelectOptions(SECOND_SELECT, ['a1', 'a2']); - - // Select 'B': only 'b' options should be available - cy.get(FIRST_SELECT).select('B'); - cy.wait(WAIT_TIME); - expectSelectOptions(SECOND_SELECT, ['b1']); - - cy.get(FIRST_SELECT).select('A'); - cy.get(SECOND_SELECT).select('a1'); - cy.get(FIRST_SELECT).select('B'); - cy.wait(WAIT_TIME); - submitForm(); - cy.get('#result-container').then((el) => { - let res = JSON.parse(el.text()); - expect(res['jso-79']['second']).to.be.undefined; - }); -}); - -it('JSO-79-II', () => { - const BASE = '#vjf_control_for__properties_jso-79-ii_properties'; - const INDEPENDENT_SELECT = `${BASE}_unabhaengige-frage`; - const DEPENDENT_SELECT = `${BASE}_abhaengige-frage`; - const NAME_SELECT = `${BASE}_wie-heisst-du`; - - cy.visit('http://localhost:5173/reproduce?nonav=true'); - - expectSelectOptions(DEPENDENT_SELECT, ['1', '2', '3']); - - cy.get(INDEPENDENT_SELECT).select('a'); - cy.wait(WAIT_TIME); - expectSelectOptions(DEPENDENT_SELECT, ['1', '3']); - - cy.get(DEPENDENT_SELECT).select('1'); - - cy.get(NAME_SELECT).select('Henrik'); - cy.wait(WAIT_TIME); - expectSelectOptions(DEPENDENT_SELECT, ['2', '3']); - cy.get(DEPENDENT_SELECT).should('have.value', null); - - cy.get(DEPENDENT_SELECT).select('3'); - submitForm(); - cy.get('#result-container').then((el) => { - const res = JSON.parse(el.text()); - expect(res['jso-79-ii']['unabhaengige-frage']).to.equal('a'); - expect(res['jso-79-ii']['wie-heisst-du']).to.equal('Henrik'); - expect(res['jso-79-ii']['abhaengige-frage']).to.equal('3'); - }); -}); - -it('JSO-79-III', () => { - const BASE = '#vjf_control_for__properties_jso-79-iii_properties'; - const INDEPENDENT_GROUP = `${BASE}_unabhaengige-frage`; - const DEPENDENT_SELECT = `${BASE}_abhaengige-frage`; - const NAME_SELECT = `${BASE}_wie-heisst-du`; - - const toggleIndependent = (value: string, checked: boolean) => { - const selector = `${INDEPENDENT_GROUP} input[value="${value}"]`; - if (checked) { - cy.get(selector).check({ force: true }); - } else { - cy.get(selector).uncheck({ force: true }); - } - }; - - cy.visit('http://localhost:5173/reproduce?nonav=true'); - - expectSelectOptions(DEPENDENT_SELECT, ['3']); - - toggleIndependent('a', true); - cy.wait(WAIT_TIME); - expectSelectOptions(DEPENDENT_SELECT, ['3', '1']); - - cy.get(NAME_SELECT).select('Henrik'); - cy.wait(WAIT_TIME); - expectSelectOptions(DEPENDENT_SELECT, ['2', '3', '1']); - - toggleIndependent('a', false); - cy.wait(WAIT_TIME); - expectSelectOptions(DEPENDENT_SELECT, ['2', '3', '1']); - - toggleIndependent('b', true); - toggleIndependent('c', true); - cy.wait(WAIT_TIME); - expectSelectOptions(DEPENDENT_SELECT, ['2', '3', '1', '4']); - - cy.get(DEPENDENT_SELECT).select('4'); - submitForm(); - cy.get('#result-container').then((el) => { - const res = JSON.parse(el.text()); - expect(res['jso-79-iii']['unabhaengige-frage']).to.deep.equal([ - 'b', - 'c', - ]); - expect(res['jso-79-iii']['wie-heisst-du']).to.equal('Henrik'); - expect(res['jso-79-iii']['abhaengige-frage']).to.equal('4'); - }); -}); - -it('JSO-79-IV', () => { - cy.visit('http://localhost:5173/reproduce?nonav=true'); - cy.get('#vjf_control_for__properties_string-dep-required-2').should( - 'not.have.attr', - 'required' - ); - cy.get( - 'label[for="vjf_control_for__properties_string-dep-required-2"] span' - ).should('not.include.text', '*'); - - cy.get('#vjf_control_for__properties_string-dep-required').type('Test'); - cy.get('#vjf_control_for__properties_string-dep-required-2').should( - 'have.attr', - 'required' - ); - cy.get( - 'label[for="vjf_control_for__properties_string-dep-required-2"] span' - ).should('include.text', '*'); - - cy.get('#vjf_control_for__properties_string-dep-required').clear(); - cy.get('#vjf_control_for__properties_string-dep-required-2').should( - 'not.have.attr', - 'required' - ); - cy.get( - 'label[for="vjf_control_for__properties_string-dep-required-2"] span' - ).should('not.include.text', '*'); -}); - -it('JSO-68', () => { - const ARRAY_CONTAINER = '#vjf_control_for__properties_multiFileUpload1'; - const SINGLE_UPLOAD = '#vjf_control_for__properties_multiFileUpload2'; - - cy.visit('http://localhost:5173/reproduce?nonav=true'); - - cy.get(ARRAY_CONTAINER).should('exist').and('have.class', 'vjf_array'); - cy.get(`${ARRAY_CONTAINER} button[aria-label="Add Item"]`).should('exist'); - - cy.get(SINGLE_UPLOAD) - .should('exist') - .and('have.attr', 'type', 'file') - .and('have.attr', 'multiple'); - cy.get(SINGLE_UPLOAD) - .parents('.vjf_control') - .find('.vjf_array') - .should('not.exist'); -}); - -it('Pattern string', () => { - cy.visit('http://localhost:5173/reproduce?nonav=true'); - - cy.get("input[name='/properties/patternString']").type('abc'); - submitForm(); - cy.get('#result-container').then((el) => { - let res = JSON.parse(el.text()); - expect('patternString' in res).to.equal(false); - cy.get("input[name='/properties/patternString']").clear(); - cy.get("input[name='/properties/patternString']").type('mystring-abc'); - submitForm(); - cy.get('#result-container').then((el) => { - let res = JSON.parse(el.text()); - expect(res['patternString']).to.equal('mystring-abc'); - }); - }); -}); - -// JSO-64 Skipped for now - -it('Edit Symbols', () => { - cy.visit('http://localhost:5173/reproduce?nonav=true'); - cy.get('input[name="/properties/obj-l/properties/auswahlfeld"]') - .parent() - .parent() - .parent() - .children() - .eq(0) - .then((el) => { - expect(el).has.class('vjf_htmlRenderer'); - const chs = el.children().eq(0).children().get(); - chs.forEach((h) => { - expect(h).has.attr('aria-label'); - }); - }); -}); - -it('JSO-58', () => { - cy.visit('http://localhost:5173/reproduce?nonav=true'); - cy.get('input[name="/properties/bool-mit-hilfe"]') - .siblings() - .eq(0) - .children() - .eq(1) - .should('have.text', 'i'); -}); - -it('JSO-51', () => { - cy.visit('http://localhost:5173/reproduce?nonav=true'); - cy.get('div[name="/properties/jso-51-arr"] .vjf_htmlRenderer') - .eq(0) - .should('have.text', 'Pre html'); - cy.get('div[name="/properties/jso-51-arr"] .vjf_htmlRenderer') - .eq(1) - .should('have.text', 'Post html'); -}); - -it('JSO-31', () => { - cy.visit('http://localhost:5173/reproduce?nonav=true'); - submitForm(); - cy.get('#result-container').then((el) => { - let res = JSON.parse(el.text()); - expect(res['arrInArrPres']).to.deep.equal([ - ['item1', 'item2'], - ['item3', 'item4'], - ]); - expect(res['arrInArrDef']).to.deep.equal([ - ['item1', 'item2'], - ['item3', 'item4'], - ]); - }); -}); - -it('JSO-44', () => { - cy.visit('http://localhost:5173/reproduce?nonav=true'); - cy.get('div[name="/properties/abhaengiges-array"]').should('not.exist'); - cy.get('input[name="/properties/auswahlfeld"]').check(); - cy.get('div[name="/properties/abhaengiges-array"]').should('exist'); - cy.get( - 'div[name="/properties/abhaengiges-array"] input[type="text"]' - ).should('not.exist'); - cy.get( - 'div[name="/properties/abhaengiges-array"] input[type="checkbox"]' - ).check(); - cy.get( - 'div[name="/properties/abhaengiges-array"] input[type="text"]' - ).should('exist'); -}); - -it('JSO-37', () => { - cy.visit('http://localhost:5173/reproduce?nonav=true'); - cy.get('input[name="/properties/jso-37-field1"]').should('exist'); - cy.get('input[name="/properties/jso-37-field2"]').should('not.exist'); - cy.get('input[name="/properties/jso-37-field3"]').should('not.exist'); - - cy.get('input[name="/properties/jso-37-field1"]').type('a'); - - cy.get('input[name="/properties/jso-37-field1"]').should('exist'); - cy.get('input[name="/properties/jso-37-field2"]').should('exist'); - cy.get('input[name="/properties/jso-37-field3"]').should('not.exist'); - - cy.get('input[name="/properties/jso-37-field2"]').type('a'); - - cy.get('input[name="/properties/jso-37-field1"]').should('exist'); - cy.get('input[name="/properties/jso-37-field2"]').should('exist'); - cy.get('input[name="/properties/jso-37-field3"]').should('exist'); - - cy.get('input[name="/properties/jso-37-field1"]').clear(); - cy.get('input[name="/properties/jso-37-field1"]').should('exist'); - cy.get('input[name="/properties/jso-37-field2"]').should('not.exist'); - cy.get('input[name="/properties/jso-37-field3"]').should('not.exist'); - - cy.get('input[name="/properties/jso-37-field1"]').type('a'); - cy.get('input[name="/properties/jso-37-field2"]').type('a'); - - cy.get('input[name="/properties/jso-37-field1"]').should('exist'); - cy.get('input[name="/properties/jso-37-field2"]').should('exist'); - cy.get('input[name="/properties/jso-37-field3"]').should('exist'); - - cy.get('input[name="/properties/jso-37-field2"]').clear(); - - cy.get('input[name="/properties/jso-37-field1"]').should('exist'); - cy.get('input[name="/properties/jso-37-field2"]').should('exist'); - cy.get('input[name="/properties/jso-37-field3"]').should('not.exist'); -}); - -it('JSO-39', () => { - cy.visit('http://localhost:5173/reproduce?nonav=true'); - submitForm(); - cy.get('#result-container').then((el) => { - let res = JSON.parse(el.text()); - expect(res['jso-39-multiselect']).to.deep.equal([ - 'option 2', - 'option 3', - ]); - expect(res['jso-39-object']).to.deep.equal({ - test: 'ABC', - number: 14, - }); - expect(res['jso-39-string']).to.equal('Test'); - }); -}); - -it('JSO-34', () => { - cy.visit('http://localhost:5173/reproduce?nonav=true'); - cy.get( - '#vjf_control_for__properties_array141d1d356e40b4062ac2b1476ff52648c > button' - ).click(); - cy.get( - '#vjf_control_for__properties_array141d1d356e40b4062ac2b1476ff52648c > button' - ).click(); - cy.get( - '#vjf_control_for__properties_array141d1d356e40b4062ac2b1476ff52648c > .list-group > div:first button.btn-outline-primary' - ).click(); - cy.get( - '#vjf_control_for__properties_array141d1d356e40b4062ac2b1476ff52648c > .list-group > div:first button.btn-outline-primary' - ).click(); - cy.get( - '#vjf_control_for__properties_array141d1d356e40b4062ac2b1476ff52648c > .list-group > div:nth-child(2) button.btn-outline-primary' - ).click(); - cy.get( - '#vjf_control_for__properties_array141d1d356e40b4062ac2b1476ff52648c > .list-group > div:nth-child(2) button.btn-outline-primary' - ).click(); - cy.get( - '#vjf_control_for__properties_array141d1d356e40b4062ac2b1476ff52648c input[type="text"]' - ).should('not.exist'); - - cy.get( - '#vjf_control_for__properties_array141d1d356e40b4062ac2b1476ff52648c > .list-group > div:first .list-group > div:first input[type="checkbox"]' - ).check(); - cy.get( - '#vjf_control_for__properties_array141d1d356e40b4062ac2b1476ff52648c > .list-group > div:first .list-group > div:first input[type="text"]' - ).should('exist'); - cy.get( - '#vjf_control_for__properties_array141d1d356e40b4062ac2b1476ff52648c > .list-group > div:first .list-group > div:nth-child(2) input[type="text"]' - ).should('not.exist'); - cy.get( - '#vjf_control_for__properties_array141d1d356e40b4062ac2b1476ff52648c > .list-group > div:nth-child(2) .list-group > div:nth-child(1) input[type="text"]' - ).should('not.exist'); - cy.get( - '#vjf_control_for__properties_array141d1d356e40b4062ac2b1476ff52648c > .list-group > div:nth-child(2) .list-group > div:nth-child(2) input[type="text"]' - ).should('not.exist'); - - cy.get( - '#vjf_control_for__properties_array141d1d356e40b4062ac2b1476ff52648c > .list-group > div:nth-child(2) .list-group > div:nth-child(2) input[type="checkbox"]' - ).check(); - cy.get( - '#vjf_control_for__properties_array141d1d356e40b4062ac2b1476ff52648c > .list-group > div:first .list-group > div:first input[type="text"]' - ).should('exist'); - cy.get( - '#vjf_control_for__properties_array141d1d356e40b4062ac2b1476ff52648c > .list-group > div:first .list-group > div:nth-child(2) input[type="text"]' - ).should('not.exist'); - cy.get( - '#vjf_control_for__properties_array141d1d356e40b4062ac2b1476ff52648c > .list-group > div:nth-child(2) .list-group > div:nth-child(1) input[type="text"]' - ).should('not.exist'); - cy.get( - '#vjf_control_for__properties_array141d1d356e40b4062ac2b1476ff52648c > .list-group > div:nth-child(2) .list-group > div:nth-child(2) input[type="text"]' - ).should('exist'); -}); - -it('JSO-17', () => { - cy.visit('http://localhost:5173/reproduce?nonav=true'); - submitForm(); - cy.get('#result-container').then((el) => { - let res = JSON.parse(el.text()); - expect(res['arrayWithDefaults']).to.deep.equal([ - 'default1', - 'default2', - ]); - }); -}); - -it('JSO-23 & JSO-24', () => { - cy.visit('http://localhost:5173/reproduce?nonav=true'); - cy.get('.vjf_showOnWrapper button[type="submit"].btn-primary').should( - 'exist' - ); - cy.get('.vjf_showOnWrapper button[type="reset"].btn-danger').should( - 'exist' - ); - - cy.get( - 'div[name="/properties/array-11d6266e4c57d4363b1f4ef6d72025f3a"] button[aria-label="Add Item"]' - ).click(); - cy.get( - 'div[name="/properties/array-11d6266e4c57d4363b1f4ef6d72025f3a"] button[aria-label="Add Item"]' - ).click(); - cy.get( - 'div[name="/properties/array-11d6266e4c57d4363b1f4ef6d72025f3a"] input[type="text"]' - ).should('not.exist'); - cy.get( - 'div[name="/properties/array-11d6266e4c57d4363b1f4ef6d72025f3a"] .list-group > div:nth-child(2) input[type="checkbox"]' - ).check(); - cy.get( - 'div[name="/properties/array-11d6266e4c57d4363b1f4ef6d72025f3a"] input[type="text"]' - ).should('not.exist'); - cy.get( - 'div[name="/properties/array-11d6266e4c57d4363b1f4ef6d72025f3a"] .list-group > div:nth-child(1) input[type="checkbox"]' - ).check(); - cy.get( - 'div[name="/properties/array-11d6266e4c57d4363b1f4ef6d72025f3a"] .list-group > div:nth-child(1) input[type="text"]' - ).should('exist'); - cy.get( - 'div[name="/properties/array-11d6266e4c57d4363b1f4ef6d72025f3a"] .list-group > div:nth-child(2) input[type="text"]' - ).should('exist'); -}); - -// JSO-25 & JSO-12 skipped for redundancy - -it('JSO-11', () => { - cy.visit('http://localhost:5173/reproduce?nonav=true'); - cy.get( - 'input[name="/properties/upload-field-in-formcd69370e0708472482997b3da12ad3cc"]' - ).should('not.exist'); - cy.get( - 'input[name="/properties/textline-in-form736e3a96a17d436996e5c8489cb9d102"]' - ).type('abc'); - cy.get( - 'input[name="/properties/upload-field-in-formcd69370e0708472482997b3da12ad3cc"]' - ).should('exist'); - cy.reload(); - cy.get( - 'input[name="/properties/upload-field-in-formcd69370e0708472482997b3da12ad3cc"]' - ).should('not.exist'); - cy.get( - 'input[name="/properties/selectionfield-in-formad0995330a9343efbb2e5488ab28e4a8"][text="option 11"]' - ).check(); - cy.get( - 'input[name="/properties/upload-field-in-formcd69370e0708472482997b3da12ad3cc"]' - ).should('exist'); -}); - -// JSO-14 skipped for redundancy - -it('JSO-7', () => { - // Incomplete - cy.visit('http://localhost:5173/reproduce?nonav=true'); - cy.get('input[name="/properties/email"]').type('test'); - submitForm(); - cy.get('#result-container').then((el) => { - let res = JSON.parse(el.text()); - expect('email' in res).to.equal(false); - - cy.get('input[name="/properties/email"]').clear(); - cy.get('input[name="/properties/email"]').type('test@example.com'); - submitForm(); - - cy.get('#result-container').then((el) => { - let res = JSON.parse(el.text()); - expect(res['email']).to.equal('test@example.com'); - }); - }); -}); diff --git a/vue-json-form/cypress/e2e/showcase.cy.ts b/vue-json-form/cypress/e2e/showcase.cy.ts deleted file mode 100644 index 334e31d0..00000000 --- a/vue-json-form/cypress/e2e/showcase.cy.ts +++ /dev/null @@ -1,311 +0,0 @@ -/// -describe('Structure', () => { - function checkRadios(containerID: string, values: string[]) { - cy.get(containerID).children().should('have.length', values.length); - values.forEach((value, index) => { - cy.get(containerID) - .children() - .eq(index) - .children() - .first() - .should('have.value', value) - .should('have.attr', 'type', 'radio'); - }); - } - - beforeEach(() => { - cy.visit('http://localhost:5173/showcase?nonav=true'); - }); - - it('Switch', () => { - const checkbox = cy.get('#vjf_control_for__properties_done'); - checkbox.should('exist'); - // check if is checkbox - checkbox.should('have.attr', 'type', 'checkbox'); - }); - it('Title', () => { - const id = 'select#vjf_control_for__properties_title'; - cy.get(id).should('exist'); - cy.get(id).children().should('have.length', 4); - cy.get(id).children().eq(0).should('have.value', 'Mrs.'); - cy.get(id).children().eq(1).should('have.value', 'Mr.'); - cy.get(id).children().eq(2).should('have.value', 'Ms.'); - cy.get(id).children().eq(3).should('have.value', 'Dr.'); - }); - it('Fanciness', () => { - const id = 'div#vjf_control_for__properties_fanciness'; - cy.get(id).should('exist'); - - checkRadios(id, ['fancy', 'fancier', 'fanciest', 'unicorn']); - }); - it('Fileupload', () => { - const id = 'input#vjf_control_for__properties_fileupload'; - cy.get(id).should('exist'); - cy.get(id).should('have.attr', 'type', 'file'); - }); - it('Group selector', () => { - const id = '#vjf_control_for__properties_group_selector'; - cy.get(id).should('exist'); - cy.get(`${id} > label`).should('exist'); - }); - describe('Group', () => { - it('dueDate', () => { - const id = 'input#vjf_control_for__properties_due_date'; - cy.get(id).should('exist'); - cy.get(id).should('have.attr', 'type', 'datetime-local'); - }); - it('Rating', () => { - const id = 'input#vjf_control_for__properties_rating'; - cy.get(id).should('exist'); - cy.get(id).should('have.attr', 'type', 'range'); - cy.get(id).should('have.attr', 'min', '0'); - cy.get(id).should('have.attr', 'max', '5'); - cy.get(id).should('have.attr', 'step', '1'); - cy.get(id).should('have.value', 3); - }); - it('Description', () => { - const id = 'textarea#vjf_control_for__properties_description'; - cy.get(id).should('exist'); - cy.get(id).should( - 'have.value', - 'This good text was set as default' - ); - cy.get(id).should('have.attr', 'rows', '2'); - }); - it('Teststring', () => { - const id = 'input#vjf_control_for__properties_teststring'; - cy.get(id).should('exist'); - cy.get(id).should('have.attr', 'type', 'text'); - }); - it('Weekdays', () => { - const id = 'div#vjf_control_for__properties_weekdays'; - cy.get(id).should('exist'); - cy.get(id).children().should('have.length', 7); - - const weekdays = [ - 'Monday', - 'Tuesday', - 'Wednesday', - 'Thursday', - 'Friday', - 'Saturday', - 'Sunday', - ]; - weekdays.forEach((day, index) => { - cy.get(id) - .children() - .eq(index) - .children() - .first() - .should('have.value', day) - .should('have.attr', 'type', 'checkbox'); - }); - }); - it('RecurrenceInterval', () => { - const id = 'input#vjf_control_for__properties_recurrence_interval'; - cy.get(id).should('exist'); - cy.get(id).should('have.attr', 'type', 'number'); - cy.get(id).should('have.attr', 'step', '1'); - cy.get(id).siblings().eq(0).should('have.text', 'Weeks'); - }); - it('TestArray', () => { - const id = 'div[name="/properties/testArray"]'; - cy.get(id).should('exist'); - cy.get(`${id} input`).should('exist'); - cy.get(`${id} input`).should( - 'have.attr', - 'placeholder', - 'This is a placeholder' - ); - cy.get(`${id} button[aria-label='Add Item']`).should('exist'); - }); - }); - describe('Object', () => { - beforeEach(() => { - cy.get('#vjf_control_for__properties_group_selector') - .children() - .eq(3) - .click(); - }); - - it('name', () => { - const id = - 'input#vjf_control_for__properties_testObject_properties_petName'; - cy.get(id).should('exist'); - cy.get(id).should('have.attr', 'type', 'text'); - }); - - it('age', () => { - const id = - 'input#vjf_control_for__properties_testObject_properties_age'; - cy.get(id).should('exist'); - cy.get(id).should('have.attr', 'type', 'number'); - cy.get(id).should('have.attr', 'step', '1'); - cy.get(id).should('have.attr', 'min', '0'); - cy.get(id).should('have.attr', 'max', '100'); - cy.get(id).should('have.value', 10); - }); - - it('flauschig', () => { - const id = - 'input#vjf_control_for__properties_testObject_properties_flauschig'; - cy.get(id).should('exist'); - cy.get(id).should('have.attr', 'type', 'checkbox'); - }); - }); - - it('HTML text', () => { - const id = 'span.vjf_htmlRenderer > p '; - cy.get(id).should('exist'); - cy.get(id).should( - 'have.html', - 'Ich bin ein HTML Text' - ); - }); - - it('Form Buttons', () => { - cy.get('button[type="submit"]').should('exist'); - cy.get('button[type="reset"]').should('exist'); - }); - - it('Fancy Unicorn', () => { - cy.get('#vjf_control_for__properties_fanciness input').eq(3).check(); - cy.get('input[type=range]#vjf_control_for__properties_rating') - .invoke('val', 4) - .trigger('input'); - const id = 'span.vjf_htmlRenderer > h3'; - cy.get(id).should( - 'have.html', - 'You are a very fancy unicorn my friend...' - ); - cy.get(id).should( - 'have.attr', - 'style', - 'background-image:linear-gradient(to left, violet, indigo, blue, green, yellow, orange, red);-webkit-background-clip:text;color:transparent' - ); - }); -}); - -describe('Button functions', () => { - beforeEach(() => { - cy.visit('http://localhost:5173/showcase?nonav=true'); - }); - - it('submit with missing fields', () => { - cy.get('#vjf_control_for__properties_name').type('Test User'); - cy.get('button[type="submit"]:not([formnovalidate])').click(); - cy.get('#result-container').then(($el) => { - const rawText = $el.text(); - const json = JSON.parse(rawText); - - expect(json).to.deep.equal({}); - }); - }); - it('submit with missing fields and novalidate', () => { - cy.get('#vjf_control_for__properties_name').type('Test User'); - cy.get('button[type="submit"][formnovalidate]').click(); - cy.get('#result-container').then(($el) => { - const rawText = $el.text(); - const json = JSON.parse(rawText); - - expect(json['name']).to.equal('Test User'); - }); - }); - it('reset form', () => { - cy.get('#vjf_control_for__properties_name').type('Test User'); - cy.get('button[type="reset"]').click(); - cy.get('#vjf_control_for__properties_name').should('have.value', ''); - }); - - it('submit with data (group)', function () { - cy.get('#vjf_control_for__properties_done').check(); - cy.get('#vjf_control_for__properties_title').select('Mr.'); - cy.get('#vjf_control_for__properties_name').type('Test User 2'); - cy.get('#vjf_control_for__properties_fanciness input').eq(3).check(); - cy.get('#vjf_control_for__properties_due_date').type( - '2000-12-11T14:24' - ); - cy.get('#vjf_control_for__properties_description').click(); - cy.get('#vjf_control_for__properties_teststring').type('test'); - cy.get('#vjf_control_for__properties_weekdays input').eq(0).check(); - cy.get('#vjf_control_for__properties_weekdays input').eq(4).check(); - cy.get('#vjf_control_for__properties_recurrence_interval').type('4'); - cy.get('#vjf_control_for__properties_testArray input') - .eq(0) - .type('Hello'); - cy.get('#vjf_control_for__properties_testArray input') - .eq(1) - .type('World'); - cy.get( - '#vjf_control_for__properties_testArray > .btn-outline-primary' - ).click(); - cy.get('#vjf_control_for__properties_testArray input') - .eq(2) - .type('I am third!'); - cy.get('.btn-primary').click(); - - cy.get('#result-container').then(($el) => { - const rawText = $el.text(); - const json = JSON.parse(rawText); - - expect(json['done']).to.equal(true); - expect(json['title']).to.equal('Mr.'); - expect(json['name']).to.equal('Test User 2'); - expect(json['fanciness']).to.equal('unicorn'); - expect(json['due_date']).to.equal('2000-12-11T14:24'); - expect(json['description']).to.equal( - 'This good text was set as default' - ); - expect(json['teststring']).to.equal('test'); - expect(json['weekdays']).to.deep.equal(['Monday', 'Friday']); - expect(json['recurrence_interval']).to.equal(4); - expect(json['testArray']).to.deep.equal([ - 'Hello', - 'World', - 'I am third!', - ]); - }); - }); - - it('submit with data (object)', function () { - cy.get('#vjf_control_for__properties_done').check(); - cy.get('#vjf_control_for__properties_title').select('Mr.'); - cy.get('#vjf_control_for__properties_name').type('Test User 2'); - cy.get('#vjf_control_for__properties_fanciness input').eq(3).check(); - - cy.get('#vjf_control_for__properties_group_selector label') - .eq(1) - .click(); - - cy.get( - '#vjf_control_for__properties_testObject_properties_petName' - ).type('Richie'); - cy.get( - '#vjf_control_for__properties_testObject_properties_age' - ).clear(); - cy.get('#vjf_control_for__properties_testObject_properties_age').type( - '15' - ); - cy.get( - '#vjf_control_for__properties_testObject_properties_flauschig' - ).check(); - - cy.get('.btn-primary').click(); - - cy.get('#result-container').then(($el) => { - const rawText = $el.text(); - const json = JSON.parse(rawText); - - expect(json['done']).to.equal(true); - expect(json['title']).to.equal('Mr.'); - expect(json['name']).to.equal('Test User 2'); - expect(json['fanciness']).to.equal('unicorn'); - - expect(json['testObject']).to.deep.equal({ - petName: 'Richie', - age: 15, - flauschig: true, - }); - }); - }); -}); diff --git a/vue-json-form/cypress/fixtures/example.json b/vue-json-form/cypress/fixtures/example.json deleted file mode 100644 index 02e42543..00000000 --- a/vue-json-form/cypress/fixtures/example.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "name": "Using fixtures to represent data", - "email": "hello@cypress.io", - "body": "Fixtures are a great way to mock data for responses to routes" -} diff --git a/vue-json-form/cypress/support/commands.ts b/vue-json-form/cypress/support/commands.ts deleted file mode 100644 index 698b01a4..00000000 --- a/vue-json-form/cypress/support/commands.ts +++ /dev/null @@ -1,37 +0,0 @@ -/// -// *********************************************** -// 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 { -// login(email: string, password: string): Chainable -// drag(subject: string, options?: Partial): Chainable -// dismiss(subject: string, options?: Partial): Chainable -// visit(originalFn: CommandOriginalFn, url: string, options: Partial): Chainable -// } -// } -// } \ No newline at end of file diff --git a/vue-json-form/cypress/support/component-index.html b/vue-json-form/cypress/support/component-index.html deleted file mode 100644 index ac6e79fd..00000000 --- a/vue-json-form/cypress/support/component-index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - Components App - - -
- - \ No newline at end of file diff --git a/vue-json-form/cypress/support/component.ts b/vue-json-form/cypress/support/component.ts deleted file mode 100644 index 9b33d4a5..00000000 --- a/vue-json-form/cypress/support/component.ts +++ /dev/null @@ -1,39 +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: -import './commands' - -// Alternatively you can use CommonJS syntax: -// require('./commands') - -import { mount } from 'cypress/vue' - -// 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 { - namespace Cypress { - interface Chainable { - mount: typeof mount - } - } -} - -Cypress.Commands.add('mount', mount) - -// Example use: -// cy.mount(MyComponent) \ No newline at end of file diff --git a/vue-json-form/cypress/support/e2e.ts b/vue-json-form/cypress/support/e2e.ts deleted file mode 100644 index 6d551238..00000000 --- a/vue-json-form/cypress/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'; -import 'cypress-axe'; -// Alternatively you can use CommonJS syntax: -// require('./commands') diff --git a/vue-json-form/package.json b/vue-json-form/package.json index 8c73fafb..400c638e 100644 --- a/vue-json-form/package.json +++ b/vue-json-form/package.json @@ -40,14 +40,14 @@ "preview": "vite preview", "test": "run-p 'test:**'", "test:unit": "vitest --run", - "test:e2e": "cypress run", + "test:e2e": "playwright test", + "test:e2e:ui": "playwright test --ui", "build": "vite build", "check-types": "vue-tsc --noEmit -p tsconfig.app.json --composite false", "pre-commit": "echo ''", "lint": "eslint src --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore --exit-on-fatal-error", "format": "prettier --write src/", - "prepare": "husky", - "cypress": "cypress open" + "prepare": "husky" }, "dependencies": { "@educorvi/rita": "^5.5.0", @@ -66,8 +66,9 @@ "vuedraggable": "^4.1.0" }, "devDependencies": { - "@cypress/grep": "^5.0.0", + "@axe-core/playwright": "^4.11.0", "@educorvi/vue-json-form-ajv-validator": "workspace:^", + "@playwright/test": "^1.57.0", "@rushstack/eslint-patch": "^1.14.1", "@semantic-release/exec": "^7.1.0", "@tsconfig/node18": "^18.2.4", @@ -84,14 +85,13 @@ "@vue/test-utils": "^2.4.6", "@vue/tsconfig": "^0.8.1", "axe-core": "^4.11.0", - "cypress": "^15.5.0", - "cypress-axe": "^1.7.0", "eslint": "^9.38.0", "eslint-config-prettier": "^10.1.8", "eslint-plugin-vue": "^10.5.1", "jsdom": "^27.0.1", "lightningcss": "^1.30.2", "npm-run-all": "^4.1.5", + "playwright": "^1.57.0", "prettier": "^3.6.2", "semantic-release": "^25.0.1", "semantic-release-monorepo": "^8.0.2", diff --git a/vue-json-form/playwright.config.ts b/vue-json-form/playwright.config.ts new file mode 100644 index 00000000..ea5ef41c --- /dev/null +++ b/vue-json-form/playwright.config.ts @@ -0,0 +1,44 @@ +import { defineConfig, devices, PlaywrightTestConfig } from '@playwright/test'; + +const reporter: PlaywrightTestConfig['reporter'] = [['list'], ['html']]; +const reporterCI: PlaywrightTestConfig['reporter'] = [ + ['github'], + ['junit', { outputFile: 'test-results/results.xml' }], +]; + +/** + * 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, + /* Opt out of parallel tests on CI. */ + // workers: process.env.CI ? 1 : undefined, + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + reporter: process.env.CI ? reporterCI : reporter, + /* 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:5173', + /* 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'] }, + }, + ], + + /* Run your local dev server before starting the tests */ + webServer: { + command: 'yarn dev', + url: 'http://localhost:5173', + reuseExistingServer: !process.env.CI, + }, +}); diff --git a/vue-json-form/tests/e2e/accessibility.spec.ts b/vue-json-form/tests/e2e/accessibility.spec.ts new file mode 100644 index 00000000..78c15d19 --- /dev/null +++ b/vue-json-form/tests/e2e/accessibility.spec.ts @@ -0,0 +1,28 @@ +import { test, expect } from '@playwright/test'; +import AxeBuilder from '@axe-core/playwright'; + +test.describe('Check for accessibility issues', () => { + const axeOptions = { + rules: { + 'page-has-heading-one': { enabled: false }, + }, + }; + + test('Showcase', async ({ page }) => { + await page.goto('http://localhost:5173/showcase?nonav=true'); + const accessibilityScanResults = await new AxeBuilder({ page }) + .options(axeOptions) + .analyze(); + + expect(accessibilityScanResults.violations).toEqual([]); + }); + + test('Reproduce', async ({ page }) => { + await page.goto('http://localhost:5173/reproduce?nonav=true'); + const accessibilityScanResults = await new AxeBuilder({ page }) + .options(axeOptions) + .analyze(); + + expect(accessibilityScanResults.violations).toEqual([]); + }); +}); diff --git a/vue-json-form/tests/e2e/reproduce.spec.ts b/vue-json-form/tests/e2e/reproduce.spec.ts new file mode 100644 index 00000000..ff42265c --- /dev/null +++ b/vue-json-form/tests/e2e/reproduce.spec.ts @@ -0,0 +1,625 @@ +import { test, expect } from '@playwright/test'; + +function submitForm(page) { + return page.locator('button[type="submit"]').nth(-3).click(); +} + +const WAIT_TIME = 150; + +const expectSelectOptions = async ( + page, + selector: string, + expectedValues: string[] +) => { + const options = page.locator(`${selector} option`); + await expect(options).toHaveCount(expectedValues.length); + + for (let index = 0; index < expectedValues.length; index++) { + await expect(options.nth(index)).toHaveAttribute( + 'value', + expectedValues[index] + ); + } +}; + +test('JSO-43', async ({ page }) => { + const BOOL_FIELD = '#vjf_control_for__properties_jso-43_properties_bool'; + const HALLO_FIELD = + '#vjf_control_for__properties_jso-43_properties_hallo input[value="du"]'; + const HALLO_FIELD_ICH = + '#vjf_control_for__properties_jso-43_properties_hallo input[value="ich"]'; + const REQUIRED_FIELD = + '#vjf_control_for__properties_jso-43_properties_abhaengiges-feld'; + const REQUIRED_LABEL = + 'label[for="vjf_control_for__properties_jso-43_properties_abhaengiges-feld"]'; + + await page.goto('http://localhost:5173/reproduce?nonav=true'); + await expect(page.locator(REQUIRED_FIELD)).not.toBeVisible(); + + await page.locator(BOOL_FIELD).check({ force: true }); + await expect(page.locator(REQUIRED_FIELD)).toBeVisible(); + await expect(page.locator(REQUIRED_FIELD)).toHaveAttribute('required', ''); + await expect(page.locator(REQUIRED_LABEL)).toContainText('*'); + + await page.locator(BOOL_FIELD).uncheck({ force: true }); + await page.locator(HALLO_FIELD_ICH).check({ force: true }); + await expect(page.locator(REQUIRED_FIELD)).not.toBeVisible(); + + await page.locator(HALLO_FIELD).check({ force: true }); + await expect(page.locator(REQUIRED_FIELD)).toBeVisible(); + await expect(page.locator(REQUIRED_FIELD)).toHaveAttribute('required', ''); + await expect(page.locator(REQUIRED_LABEL)).toContainText('*'); + + await page.locator(REQUIRED_FIELD).fill('Hallo Pflichtfeld'); + await submitForm(page); + + const resultText = await page.locator('#result-container').textContent(); + const res = JSON.parse(resultText || ''); + expect(res['jso-43']['abhaengiges-feld']).toEqual('Hallo Pflichtfeld'); + expect(res['jso-43']['hallo']).toEqual('du'); +}); + +test('JSO-79 (I)', async ({ page }) => { + const FIRST_SELECT = '#vjf_control_for__properties_jso-79_properties_first'; + const SECOND_SELECT = + '#vjf_control_for__properties_jso-79_properties_second'; + + await page.goto('http://localhost:5173/reproduce?nonav=true'); + + // Initial state: all options should be available + await expectSelectOptions(page, SECOND_SELECT, ['a1', 'a2', 'b1']); + + // Select 'A': only 'a' options should be available + await page.locator(FIRST_SELECT).selectOption('A'); + await page.waitForTimeout(WAIT_TIME); + await expectSelectOptions(page, SECOND_SELECT, ['a1', 'a2']); + + // Select 'B': only 'b' options should be available + await page.locator(FIRST_SELECT).selectOption('B'); + await page.waitForTimeout(WAIT_TIME); + await expectSelectOptions(page, SECOND_SELECT, ['b1']); + + await page.locator(FIRST_SELECT).selectOption('A'); + await page.locator(SECOND_SELECT).selectOption('a1'); + await page.locator(FIRST_SELECT).selectOption('B'); + await page.waitForTimeout(WAIT_TIME); + await submitForm(page); + + const resultText = await page.locator('#result-container').textContent(); + const res = JSON.parse(resultText || ''); + expect(res['jso-79']['second']).toBeUndefined(); +}); + +test('JSO-79-II', async ({ page }) => { + const BASE = '#vjf_control_for__properties_jso-79-ii_properties'; + const INDEPENDENT_SELECT = `${BASE}_unabhaengige-frage`; + const DEPENDENT_SELECT = `${BASE}_abhaengige-frage`; + const NAME_SELECT = `${BASE}_wie-heisst-du`; + + await page.goto('http://localhost:5173/reproduce?nonav=true'); + + await expectSelectOptions(page, DEPENDENT_SELECT, ['1', '2', '3']); + + await page.locator(INDEPENDENT_SELECT).selectOption('a'); + await page.waitForTimeout(WAIT_TIME); + await expectSelectOptions(page, DEPENDENT_SELECT, ['1', '3']); + + await page.locator(DEPENDENT_SELECT).selectOption('1'); + + await page.locator(NAME_SELECT).selectOption('Henrik'); + await page.waitForTimeout(WAIT_TIME); + await expectSelectOptions(page, DEPENDENT_SELECT, ['2', '3']); + await expect(page.locator(DEPENDENT_SELECT)).toHaveValue(''); + + await page.locator(DEPENDENT_SELECT).selectOption('3'); + await submitForm(page); + + const resultText = await page.locator('#result-container').textContent(); + const res = JSON.parse(resultText || ''); + expect(res['jso-79-ii']['unabhaengige-frage']).toEqual('a'); + expect(res['jso-79-ii']['wie-heisst-du']).toEqual('Henrik'); + expect(res['jso-79-ii']['abhaengige-frage']).toEqual('3'); +}); + +test('JSO-79-III', async ({ page }) => { + const BASE = '#vjf_control_for__properties_jso-79-iii_properties'; + const INDEPENDENT_GROUP = `${BASE}_unabhaengige-frage`; + const DEPENDENT_SELECT = `${BASE}_abhaengige-frage`; + const NAME_SELECT = `${BASE}_wie-heisst-du`; + + const toggleIndependent = async (value: string, checked: boolean) => { + const selector = `${INDEPENDENT_GROUP} input[value="${value}"]`; + if (checked) { + await page.locator(selector).check({ force: true }); + } else { + await page.locator(selector).uncheck({ force: true }); + } + }; + + await page.goto('http://localhost:5173/reproduce?nonav=true'); + + await expectSelectOptions(page, DEPENDENT_SELECT, ['3']); + + await toggleIndependent('a', true); + await page.waitForTimeout(WAIT_TIME); + await expectSelectOptions(page, DEPENDENT_SELECT, ['3', '1']); + + await page.locator(NAME_SELECT).selectOption('Henrik'); + await page.waitForTimeout(WAIT_TIME); + await expectSelectOptions(page, DEPENDENT_SELECT, ['2', '3', '1']); + + await toggleIndependent('a', false); + await page.waitForTimeout(WAIT_TIME); + await expectSelectOptions(page, DEPENDENT_SELECT, ['2', '3', '1']); + + await toggleIndependent('b', true); + await toggleIndependent('c', true); + await page.waitForTimeout(WAIT_TIME); + await expectSelectOptions(page, DEPENDENT_SELECT, ['2', '3', '1', '4']); + + await page.locator(DEPENDENT_SELECT).selectOption('4'); + await submitForm(page); + + const resultText = await page.locator('#result-container').textContent(); + const res = JSON.parse(resultText || ''); + expect(res['jso-79-iii']['unabhaengige-frage']).toEqual(['b', 'c']); + expect(res['jso-79-iii']['wie-heisst-du']).toEqual('Henrik'); + expect(res['jso-79-iii']['abhaengige-frage']).toEqual('4'); +}); + +test('JSO-79-IV', async ({ page }) => { + await page.goto('http://localhost:5173/reproduce?nonav=true'); + + await expect( + page.locator('#vjf_control_for__properties_string-dep-required-2') + ).not.toHaveAttribute('required', ''); + await expect( + page.locator( + 'label[for="vjf_control_for__properties_string-dep-required-2"] span' + ) + ).not.toContainText('*'); + + await page + .locator('#vjf_control_for__properties_string-dep-required') + .fill('Test'); + await expect( + page.locator('#vjf_control_for__properties_string-dep-required-2') + ).toHaveAttribute('required', ''); + await expect( + page.locator( + 'label[for="vjf_control_for__properties_string-dep-required-2"] span' + ) + ).toContainText('*'); + + await page + .locator('#vjf_control_for__properties_string-dep-required') + .clear(); + await expect( + page.locator('#vjf_control_for__properties_string-dep-required-2') + ).not.toHaveAttribute('required', ''); + await expect( + page.locator( + 'label[for="vjf_control_for__properties_string-dep-required-2"] span' + ) + ).not.toContainText('*'); +}); + +test('JSO-68', async ({ page }) => { + const ARRAY_CONTAINER = '#vjf_control_for__properties_multiFileUpload1'; + const SINGLE_UPLOAD = '#vjf_control_for__properties_multiFileUpload2'; + + await page.goto('http://localhost:5173/reproduce?nonav=true'); + + await expect(page.locator(ARRAY_CONTAINER)).toBeVisible(); + await expect(page.locator(ARRAY_CONTAINER)).toHaveClass(/vjf_array/); + await expect( + page.locator(`${ARRAY_CONTAINER} button[aria-label="Add Item"]`) + ).toBeVisible(); + + await expect(page.locator(SINGLE_UPLOAD)).toBeVisible(); + await expect(page.locator(SINGLE_UPLOAD)).toHaveAttribute('type', 'file'); + await expect(page.locator(SINGLE_UPLOAD)).toHaveAttribute('multiple', ''); + + const parent = page + .locator(SINGLE_UPLOAD) + .locator('xpath=ancestor::div[@class="vjf_control"]'); + await expect(parent.locator('.vjf_array')).not.toBeVisible(); +}); + +test('Pattern string', async ({ page }) => { + await page.goto('http://localhost:5173/reproduce?nonav=true'); + + await page.locator('input[name="/properties/patternString"]').fill('abc'); + await submitForm(page); + + let resultText = await page.locator('#result-container').textContent(); + let res = JSON.parse(resultText || ''); + expect('patternString' in res).toEqual(false); + + await page.locator('input[name="/properties/patternString"]').clear(); + await page + .locator('input[name="/properties/patternString"]') + .fill('mystring-abc'); + await submitForm(page); + + resultText = await page.locator('#result-container').textContent(); + res = JSON.parse(resultText || ''); + expect(res['patternString']).toEqual('mystring-abc'); +}); + +test('Edit Symbols', async ({ page }) => { + await page.goto('http://localhost:5173/reproduce?nonav=true'); + + const parent = page + .locator('input[name="/properties/obj-l/properties/auswahlfeld"]') + .locator('xpath=ancestor::*[3]'); + const firstChild = parent.locator('> *').first(); + + await expect(firstChild).toHaveClass(/vjf_htmlRenderer/); + + const icons = firstChild.locator('> * > *'); + const count = await icons.count(); + + for (let i = 0; i < count; i++) { + await expect(icons.nth(i)).toHaveAttribute('aria-label', /.+/); + } +}); + +test('JSO-58', async ({ page }) => { + await page.goto('http://localhost:5173/reproduce?nonav=true'); + + const helpText = page + .locator('input[name="/properties/bool-mit-hilfe"]') + .locator('xpath=following-sibling::*[1]') + .locator('> *') + .nth(1); + + await expect(helpText).toHaveText('i'); +}); + +test('JSO-51', async ({ page }) => { + await page.goto('http://localhost:5173/reproduce?nonav=true'); + + await expect( + page + .locator('div[name="/properties/jso-51-arr"] .vjf_htmlRenderer') + .nth(0) + ).toHaveText('Pre html'); + await expect( + page + .locator('div[name="/properties/jso-51-arr"] .vjf_htmlRenderer') + .nth(1) + ).toHaveText('Post html'); +}); + +test('JSO-31', async ({ page }) => { + await page.goto('http://localhost:5173/reproduce?nonav=true'); + await submitForm(page); + + const resultText = await page.locator('#result-container').textContent(); + const res = JSON.parse(resultText || ''); + expect(res['arrInArrPres']).toEqual([ + ['item1', 'item2'], + ['item3', 'item4'], + ]); + expect(res['arrInArrDef']).toEqual([ + ['item1', 'item2'], + ['item3', 'item4'], + ]); +}); + +test('JSO-44', async ({ page }) => { + await page.goto('http://localhost:5173/reproduce?nonav=true'); + + await expect( + page.locator('div[name="/properties/abhaengiges-array"]') + ).not.toBeVisible(); + await page.locator('input[name="/properties/auswahlfeld"]').check(); + await expect( + page.locator('div[name="/properties/abhaengiges-array"]') + ).toBeVisible(); + await expect( + page.locator( + 'div[name="/properties/abhaengiges-array"] input[type="text"]' + ) + ).not.toBeVisible(); + await page + .locator( + 'div[name="/properties/abhaengiges-array"] input[type="checkbox"]' + ) + .check(); + await expect( + page.locator( + 'div[name="/properties/abhaengiges-array"] input[type="text"]' + ) + ).toBeVisible(); +}); + +test('JSO-37', async ({ page }) => { + await page.goto('http://localhost:5173/reproduce?nonav=true'); + + await expect( + page.locator('input[name="/properties/jso-37-field1"]') + ).toBeVisible(); + await expect( + page.locator('input[name="/properties/jso-37-field2"]') + ).not.toBeVisible(); + await expect( + page.locator('input[name="/properties/jso-37-field3"]') + ).not.toBeVisible(); + + await page.locator('input[name="/properties/jso-37-field1"]').fill('a'); + + await expect( + page.locator('input[name="/properties/jso-37-field1"]') + ).toBeVisible(); + await expect( + page.locator('input[name="/properties/jso-37-field2"]') + ).toBeVisible(); + await expect( + page.locator('input[name="/properties/jso-37-field3"]') + ).not.toBeVisible(); + + await page.locator('input[name="/properties/jso-37-field2"]').fill('a'); + + await expect( + page.locator('input[name="/properties/jso-37-field1"]') + ).toBeVisible(); + await expect( + page.locator('input[name="/properties/jso-37-field2"]') + ).toBeVisible(); + await expect( + page.locator('input[name="/properties/jso-37-field3"]') + ).toBeVisible(); + + await page.locator('input[name="/properties/jso-37-field1"]').clear(); + await expect( + page.locator('input[name="/properties/jso-37-field1"]') + ).toBeVisible(); + await expect( + page.locator('input[name="/properties/jso-37-field2"]') + ).not.toBeVisible(); + await expect( + page.locator('input[name="/properties/jso-37-field3"]') + ).not.toBeVisible(); + + await page.locator('input[name="/properties/jso-37-field1"]').fill('a'); + await page.locator('input[name="/properties/jso-37-field2"]').fill('a'); + + await expect( + page.locator('input[name="/properties/jso-37-field1"]') + ).toBeVisible(); + await expect( + page.locator('input[name="/properties/jso-37-field2"]') + ).toBeVisible(); + await expect( + page.locator('input[name="/properties/jso-37-field3"]') + ).toBeVisible(); + + await page.locator('input[name="/properties/jso-37-field2"]').clear(); + + await expect( + page.locator('input[name="/properties/jso-37-field1"]') + ).toBeVisible(); + await expect( + page.locator('input[name="/properties/jso-37-field2"]') + ).toBeVisible(); + await expect( + page.locator('input[name="/properties/jso-37-field3"]') + ).not.toBeVisible(); +}); + +test('JSO-39', async ({ page }) => { + await page.goto('http://localhost:5173/reproduce?nonav=true'); + await submitForm(page); + + const resultText = await page.locator('#result-container').textContent(); + const res = JSON.parse(resultText || ''); + expect(res['jso-39-multiselect']).toEqual(['option 2', 'option 3']); + expect(res['jso-39-object']).toEqual({ + test: 'ABC', + number: 14, + }); + expect(res['jso-39-string']).toEqual('Test'); +}); + +test('JSO-34', async ({ page }) => { + await page.goto('http://localhost:5173/reproduce?nonav=true'); + + const containerId = + '#vjf_control_for__properties_array141d1d356e40b4062ac2b1476ff52648c'; + + await page.locator(`${containerId} > button`).click(); + await page.locator(`${containerId} > button`).click(); + await page + .locator( + `${containerId} > .list-group > div:first-child button.btn-outline-primary` + ) + .click(); + await page + .locator( + `${containerId} > .list-group > div:first-child button.btn-outline-primary` + ) + .click(); + await page + .locator( + `${containerId} > .list-group > div:nth-child(2) button.btn-outline-primary` + ) + .click(); + await page + .locator( + `${containerId} > .list-group > div:nth-child(2) button.btn-outline-primary` + ) + .click(); + + await expect( + page.locator(`${containerId} input[type="text"]`) + ).not.toBeVisible(); + + await page + .locator( + `${containerId} > .list-group > div:first-child .list-group > div:first-child input[type="checkbox"]` + ) + .check(); + await expect( + page.locator( + `${containerId} > .list-group > div:first-child .list-group > div:first-child input[type="text"]` + ) + ).toBeVisible(); + await expect( + page.locator( + `${containerId} > .list-group > div:first-child .list-group > div:nth-child(2) input[type="text"]` + ) + ).not.toBeVisible(); + await expect( + page.locator( + `${containerId} > .list-group > div:nth-child(2) .list-group > div:nth-child(1) input[type="text"]` + ) + ).not.toBeVisible(); + await expect( + page.locator( + `${containerId} > .list-group > div:nth-child(2) .list-group > div:nth-child(2) input[type="text"]` + ) + ).not.toBeVisible(); + + await page + .locator( + `${containerId} > .list-group > div:nth-child(2) .list-group > div:nth-child(2) input[type="checkbox"]` + ) + .check(); + await expect( + page.locator( + `${containerId} > .list-group > div:first-child .list-group > div:first-child input[type="text"]` + ) + ).toBeVisible(); + await expect( + page.locator( + `${containerId} > .list-group > div:first-child .list-group > div:nth-child(2) input[type="text"]` + ) + ).not.toBeVisible(); + await expect( + page.locator( + `${containerId} > .list-group > div:nth-child(2) .list-group > div:nth-child(1) input[type="text"]` + ) + ).not.toBeVisible(); + await expect( + page.locator( + `${containerId} > .list-group > div:nth-child(2) .list-group > div:nth-child(2) input[type="text"]` + ) + ).toBeVisible(); +}); + +test('JSO-17', async ({ page }) => { + await page.goto('http://localhost:5173/reproduce?nonav=true'); + await submitForm(page); + + const resultText = await page.locator('#result-container').textContent(); + const res = JSON.parse(resultText || ''); + expect(res['arrayWithDefaults']).toEqual(['default1', 'default2']); +}); + +test('JSO-23 & JSO-24', async ({ page }) => { + await page.goto('http://localhost:5173/reproduce?nonav=true'); + + await expect( + page.locator( + '.vjf_group .vjf_showOnWrapper button[type="submit"].btn-primary' + ) + ).toBeVisible(); + await expect( + page.locator( + '.vjf_group .vjf_showOnWrapper button[type="reset"].btn-danger' + ) + ).toBeVisible(); + + const arrayId = + 'div[name="/properties/array-11d6266e4c57d4363b1f4ef6d72025f3a"]'; + + await page.locator(`${arrayId} button[aria-label="Add Item"]`).click(); + await page.locator(`${arrayId} button[aria-label="Add Item"]`).click(); + await expect( + page.locator(`${arrayId} input[type="text"]`) + ).not.toBeVisible(); + await page + .locator( + `${arrayId} .list-group > div:nth-child(2) input[type="checkbox"]` + ) + .check(); + await expect( + page.locator(`${arrayId} input[type="text"]`) + ).not.toBeVisible(); + await page + .locator( + `${arrayId} .list-group > div:nth-child(1) input[type="checkbox"]` + ) + .check(); + await expect( + page.locator( + `${arrayId} .list-group > div:nth-child(1) input[type="text"]` + ) + ).toBeVisible(); + await expect( + page.locator( + `${arrayId} .list-group > div:nth-child(2) input[type="text"]` + ) + ).toBeVisible(); +}); + +test('JSO-11', async ({ page }) => { + await page.goto('http://localhost:5173/reproduce?nonav=true'); + + await expect( + page.locator( + 'input[name="/properties/upload-field-in-formcd69370e0708472482997b3da12ad3cc"]' + ) + ).not.toBeVisible(); + await page + .locator( + 'input[name="/properties/textline-in-form736e3a96a17d436996e5c8489cb9d102"]' + ) + .fill('abc'); + await expect( + page.locator( + 'input[name="/properties/upload-field-in-formcd69370e0708472482997b3da12ad3cc"]' + ) + ).toBeVisible(); + + await page.reload(); + + await expect( + page.locator( + 'input[name="/properties/upload-field-in-formcd69370e0708472482997b3da12ad3cc"]' + ) + ).not.toBeVisible(); + await page + .locator( + 'input[name="/properties/selectionfield-in-formad0995330a9343efbb2e5488ab28e4a8"][value="option 11"]' + ) + .check(); + await expect( + page.locator( + 'input[name="/properties/upload-field-in-formcd69370e0708472482997b3da12ad3cc"]' + ) + ).toBeVisible(); +}); + +test('JSO-7', async ({ page }) => { + await page.goto('http://localhost:5173/reproduce?nonav=true'); + + await page.locator('input[name="/properties/email"]').fill('test'); + await submitForm(page); + + let resultText = await page.locator('#result-container').textContent(); + let res = JSON.parse(resultText || ''); + expect('email' in res).toEqual(false); + + await page.locator('input[name="/properties/email"]').clear(); + await page + .locator('input[name="/properties/email"]') + .fill('test@example.com'); + await submitForm(page); + + resultText = await page.locator('#result-container').textContent(); + res = JSON.parse(resultText || ''); + expect(res['email']).toEqual('test@example.com'); +}); diff --git a/vue-json-form/tests/e2e/showcase.spec.ts b/vue-json-form/tests/e2e/showcase.spec.ts new file mode 100644 index 00000000..4e674bcf --- /dev/null +++ b/vue-json-form/tests/e2e/showcase.spec.ts @@ -0,0 +1,407 @@ +import { test, expect } from '@playwright/test'; + +test.describe('Structure', () => { + async function checkRadios(page, containerID: string, values: string[]) { + const container = page.locator(containerID); + await expect(container.locator('> *')).toHaveCount(values.length); + + for (let index = 0; index < values.length; index++) { + const radio = container + .locator('> *') + .nth(index) + .locator('input') + .first(); + await expect(radio).toHaveValue(values[index]); + await expect(radio).toHaveAttribute('type', 'radio'); + } + } + + test.beforeEach(async ({ page }) => { + await page.goto('http://localhost:5173/showcase?nonav=true'); + }); + + test('Switch', async ({ page }) => { + const checkbox = page.locator('#vjf_control_for__properties_done'); + await expect(checkbox).toBeVisible(); + await expect(checkbox).toHaveAttribute('type', 'checkbox'); + }); + + test('Title', async ({ page }) => { + const id = 'select#vjf_control_for__properties_title'; + const select = page.locator(id); + await expect(select).toBeVisible(); + await expect(select.locator('option')).toHaveCount(4); + await expect(select.locator('option').nth(0)).toHaveAttribute( + 'value', + 'Mrs.' + ); + await expect(select.locator('option').nth(1)).toHaveAttribute( + 'value', + 'Mr.' + ); + await expect(select.locator('option').nth(2)).toHaveAttribute( + 'value', + 'Ms.' + ); + await expect(select.locator('option').nth(3)).toHaveAttribute( + 'value', + 'Dr.' + ); + }); + + test('Fanciness', async ({ page }) => { + const id = 'div#vjf_control_for__properties_fanciness'; + await expect(page.locator(id)).toBeVisible(); + await checkRadios(page, id, [ + 'fancy', + 'fancier', + 'fanciest', + 'unicorn', + ]); + }); + + test('Fileupload', async ({ page }) => { + const id = 'input#vjf_control_for__properties_fileupload'; + await expect(page.locator(id)).toBeVisible(); + await expect(page.locator(id)).toHaveAttribute('type', 'file'); + }); + + test('Group selector', async ({ page }) => { + const id = '#vjf_control_for__properties_group_selector'; + await expect(page.locator(id)).toBeVisible(); + const labels = page.locator(`${id} > label`); + await expect(labels).toHaveCount(2); + await expect(labels.first()).toBeVisible(); + await expect(labels.last()).toBeVisible(); + }); + + test.describe('Group', () => { + test('dueDate', async ({ page }) => { + const id = 'input#vjf_control_for__properties_due_date'; + await expect(page.locator(id)).toBeVisible(); + await expect(page.locator(id)).toHaveAttribute( + 'type', + 'datetime-local' + ); + }); + + test('Rating', async ({ page }) => { + const id = 'input#vjf_control_for__properties_rating'; + const rating = page.locator(id); + await expect(rating).toBeVisible(); + await expect(rating).toHaveAttribute('type', 'range'); + await expect(rating).toHaveAttribute('min', '0'); + await expect(rating).toHaveAttribute('max', '5'); + await expect(rating).toHaveAttribute('step', '1'); + await expect(rating).toHaveValue('3'); + }); + + test('Description', async ({ page }) => { + const id = 'textarea#vjf_control_for__properties_description'; + const description = page.locator(id); + await expect(description).toBeVisible(); + await expect(description).toHaveValue( + 'This good text was set as default' + ); + await expect(description).toHaveAttribute('rows', '2'); + }); + + test('Teststring', async ({ page }) => { + const id = 'input#vjf_control_for__properties_teststring'; + await expect(page.locator(id)).toBeVisible(); + await expect(page.locator(id)).toHaveAttribute('type', 'text'); + }); + + test('Weekdays', async ({ page }) => { + const id = 'div#vjf_control_for__properties_weekdays'; + const container = page.locator(id); + await expect(container).toBeVisible(); + await expect(container.locator('> *')).toHaveCount(7); + + const weekdays = [ + 'Monday', + 'Tuesday', + 'Wednesday', + 'Thursday', + 'Friday', + 'Saturday', + 'Sunday', + ]; + + for (let index = 0; index < weekdays.length; index++) { + const checkbox = container + .locator('> *') + .nth(index) + .locator('input') + .first(); + await expect(checkbox).toHaveValue(weekdays[index]); + await expect(checkbox).toHaveAttribute('type', 'checkbox'); + } + }); + + test('RecurrenceInterval', async ({ page }) => { + const id = 'input#vjf_control_for__properties_recurrence_interval'; + const input = page.locator(id); + await expect(input).toBeVisible(); + await expect(input).toHaveAttribute('type', 'number'); + await expect(input).toHaveAttribute('step', '1'); + const sibling = await input.locator( + 'xpath=following-sibling::*[1]' + ); + await expect(sibling).toHaveText('Weeks'); + }); + + test('TestArray', async ({ page }) => { + const id = 'div[name="/properties/testArray"]'; + const container = page.locator(id); + await expect(container).toBeVisible(); + await expect(container.locator('input')).toHaveCount(2); + await expect(container.locator('input').first()).toBeVisible(); + await expect(container.locator('input').first()).toHaveAttribute( + 'placeholder', + 'This is a placeholder' + ); + await expect( + container.locator('button[aria-label="Add Item"]') + ).toBeVisible(); + }); + }); + + test.describe('Object', () => { + test.beforeEach(async ({ page }) => { + await page + .locator('#vjf_control_for__properties_group_selector') + .locator('> *') + .nth(3) + .click(); + }); + + test('name', async ({ page }) => { + const id = + 'input#vjf_control_for__properties_testObject_properties_petName'; + await expect(page.locator(id)).toBeVisible(); + await expect(page.locator(id)).toHaveAttribute('type', 'text'); + }); + + test('age', async ({ page }) => { + const id = + 'input#vjf_control_for__properties_testObject_properties_age'; + const age = page.locator(id); + await expect(age).toBeVisible(); + await expect(age).toHaveAttribute('type', 'number'); + await expect(age).toHaveAttribute('step', '1'); + await expect(age).toHaveAttribute('min', '0'); + await expect(age).toHaveAttribute('max', '100'); + await expect(age).toHaveValue('10'); + }); + + test('flauschig', async ({ page }) => { + const id = + 'input#vjf_control_for__properties_testObject_properties_flauschig'; + await expect(page.locator(id)).toBeVisible(); + await expect(page.locator(id)).toHaveAttribute('type', 'checkbox'); + }); + }); + + test('HTML text', async ({ page }) => { + const id = 'span.vjf_htmlRenderer > p'; + await expect(page.locator(id)).toBeVisible(); + expect(await page.locator(id).innerHTML()).toBe( + 'Ich bin ein HTML Text' + ); + }); + + test('Form Buttons', async ({ page }) => { + await expect( + page.locator('button[type="submit"]:not([formnovalidate])') + ).toBeVisible(); + await expect( + page.locator('button[type="submit"][formnovalidate]') + ).toBeVisible(); + await expect(page.locator('button[type="reset"]')).toBeVisible(); + }); + + test('Fancy Unicorn', async ({ page }) => { + await page + .locator('#vjf_control_for__properties_fanciness input') + .nth(3) + .check(); + await page + .locator('input[type=range]#vjf_control_for__properties_rating') + .fill('4'); + + const id = 'span.vjf_htmlRenderer > h3'; + await expect(page.locator(id)).toHaveText( + 'You are a very fancy unicorn my friend...' + ); + await expect(page.locator(id)).toHaveAttribute( + 'style', + 'background-image:linear-gradient(to left, violet, indigo, blue, green, yellow, orange, red);-webkit-background-clip:text;color:transparent' + ); + }); +}); + +test.describe('Button functions', () => { + test.beforeEach(async ({ page }) => { + await page.goto('http://localhost:5173/showcase?nonav=true'); + }); + + test('submit with missing fields', async ({ page }) => { + await page + .locator('#vjf_control_for__properties_name') + .fill('Test User'); + await page + .locator('button[type="submit"]:not([formnovalidate])') + .click(); + + const resultText = await page + .locator('#result-container') + .textContent(); + const json = JSON.parse(resultText || ''); + expect(json).toEqual({}); + }); + + test('submit with missing fields and novalidate', async ({ page }) => { + await page + .locator('#vjf_control_for__properties_name') + .fill('Test User'); + await page.locator('button[type="submit"][formnovalidate]').click(); + + const resultText = await page + .locator('#result-container') + .textContent(); + const json = JSON.parse(resultText || ''); + expect(json['name']).toEqual('Test User'); + }); + + test('reset form', async ({ page }) => { + await page + .locator('#vjf_control_for__properties_name') + .fill('Test User'); + await page.locator('button[type="reset"]').click(); + await expect( + page.locator('#vjf_control_for__properties_name') + ).toHaveValue(''); + }); + + test('submit with data (group)', async ({ page }) => { + await page.locator('#vjf_control_for__properties_done').check(); + await page + .locator('#vjf_control_for__properties_title') + .selectOption('Mr.'); + await page + .locator('#vjf_control_for__properties_name') + .fill('Test User 2'); + await page + .locator('#vjf_control_for__properties_fanciness input') + .nth(3) + .check(); + await page + .locator('#vjf_control_for__properties_due_date') + .fill('2000-12-11T14:24'); + await page.locator('#vjf_control_for__properties_description').click(); + await page + .locator('#vjf_control_for__properties_teststring') + .fill('test'); + await page + .locator('#vjf_control_for__properties_weekdays input') + .nth(0) + .check(); + await page + .locator('#vjf_control_for__properties_weekdays input') + .nth(4) + .check(); + await page + .locator('#vjf_control_for__properties_recurrence_interval') + .fill('4'); + await page + .locator('#vjf_control_for__properties_testArray input') + .nth(0) + .fill('Hello'); + await page + .locator('#vjf_control_for__properties_testArray input') + .nth(1) + .fill('World'); + await page + .locator( + '#vjf_control_for__properties_testArray > .btn-outline-primary' + ) + .click(); + await page + .locator('#vjf_control_for__properties_testArray input') + .nth(2) + .fill('I am third!'); + await page.locator('.btn-primary').click(); + + const resultText = await page + .locator('#result-container') + .textContent(); + const json = JSON.parse(resultText || ''); + + expect(json['done']).toEqual(true); + expect(json['title']).toEqual('Mr.'); + expect(json['name']).toEqual('Test User 2'); + expect(json['fanciness']).toEqual('unicorn'); + expect(json['due_date']).toEqual('2000-12-11T14:24'); + expect(json['description']).toEqual( + 'This good text was set as default' + ); + expect(json['teststring']).toEqual('test'); + expect(json['weekdays']).toEqual(['Monday', 'Friday']); + expect(json['recurrence_interval']).toEqual(4); + expect(json['testArray']).toEqual(['Hello', 'World', 'I am third!']); + }); + + test('submit with data (object)', async ({ page }) => { + await page.locator('#vjf_control_for__properties_done').check(); + await page + .locator('#vjf_control_for__properties_title') + .selectOption('Mr.'); + await page + .locator('#vjf_control_for__properties_name') + .fill('Test User 2'); + await page + .locator('#vjf_control_for__properties_fanciness input') + .nth(3) + .check(); + + await page + .locator('#vjf_control_for__properties_group_selector label') + .nth(1) + .click(); + + await page + .locator( + '#vjf_control_for__properties_testObject_properties_petName' + ) + .fill('Richie'); + await page + .locator('#vjf_control_for__properties_testObject_properties_age') + .clear(); + await page + .locator('#vjf_control_for__properties_testObject_properties_age') + .fill('15'); + await page + .locator( + '#vjf_control_for__properties_testObject_properties_flauschig' + ) + .check(); + + await page.locator('.btn-primary').click(); + + const resultText = await page + .locator('#result-container') + .textContent(); + const json = JSON.parse(resultText || ''); + + expect(json['done']).toEqual(true); + expect(json['title']).toEqual('Mr.'); + expect(json['name']).toEqual('Test User 2'); + expect(json['fanciness']).toEqual('unicorn'); + expect(json['testObject']).toEqual({ + petName: 'Richie', + age: 15, + flauschig: true, + }); + }); +}); diff --git a/vue-json-form/tsconfig.vitest.json b/vue-json-form/tsconfig.vitest.json index 403e74e4..b5db040d 100644 --- a/vue-json-form/tsconfig.vitest.json +++ b/vue-json-form/tsconfig.vitest.json @@ -3,6 +3,6 @@ "exclude": [], "compilerOptions": { "composite": true, - "types": ["node", "jsdom", "cypress", "cypress-axe"] + "types": ["node", "jsdom"] } } diff --git a/vue-json-form/vitest.config.ts b/vue-json-form/vitest.config.ts index 10067d57..788f9115 100644 --- a/vue-json-form/vitest.config.ts +++ b/vue-json-form/vitest.config.ts @@ -1,14 +1,14 @@ -import { fileURLToPath } from 'node:url' -import { mergeConfig, defineConfig, configDefaults } from 'vitest/config' -import viteConfig from './vite.config' +import { fileURLToPath } from 'node:url'; +import { mergeConfig, defineConfig, configDefaults } from 'vitest/config'; +import viteConfig from './vite.config'; export default mergeConfig( - viteConfig, - defineConfig({ - test: { - environment: 'jsdom', - exclude: [...configDefaults.exclude, 'e2e/*'], - root: fileURLToPath(new URL('./', import.meta.url)) - } - }) -) + viteConfig, + defineConfig({ + test: { + environment: 'jsdom', + exclude: [...configDefaults.exclude, '**/e2e/*'], + root: fileURLToPath(new URL('./', import.meta.url)), + }, + }) +); diff --git a/yarn.lock b/yarn.lock index 0108d2ca..cbb71677 100644 --- a/yarn.lock +++ b/yarn.lock @@ -113,6 +113,17 @@ __metadata: languageName: node linkType: hard +"@axe-core/playwright@npm:^4.11.0": + version: 4.11.0 + resolution: "@axe-core/playwright@npm:4.11.0" + dependencies: + axe-core: "npm:~4.11.0" + peerDependencies: + playwright-core: ">= 1.0.0" + checksum: 10/54de38082deeb1d9022b47f1412ebba7c9b93aa09a0dbc5b1609d35b4f5d05f43840968aeeea913b340b4d89ab1ec0c8bb18aeb1f4c609751ae95e7b8ae2b724 + languageName: node + linkType: hard + "@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.21.4, @babel/code-frame@npm:^7.26.2": version: 7.27.1 resolution: "@babel/code-frame@npm:7.27.1" @@ -266,13 +277,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/helper-plugin-utils@npm:7.27.1" - checksum: 10/96136c2428888e620e2ec493c25888f9ceb4a21099dcf3dd4508ea64b58cdedbd5a9fb6c7b352546de84d6c24edafe482318646932a22c449ebd16d16c22d864 - languageName: node - linkType: hard - "@babel/helper-replace-supers@npm:^7.25.9": version: 7.25.9 resolution: "@babel/helper-replace-supers@npm:7.25.9" @@ -359,25 +363,25 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.27.2, @babel/parser@npm:^7.28.4": - version: 7.28.5 - resolution: "@babel/parser@npm:7.28.5" +"@babel/parser@npm:^7.27.5": + version: 7.28.0 + resolution: "@babel/parser@npm:7.28.0" dependencies: - "@babel/types": "npm:^7.28.5" + "@babel/types": "npm:^7.28.0" bin: parser: ./bin/babel-parser.js - checksum: 10/8d9bfb437af6c97a7f6351840b9ac06b4529ba79d6d3def24d6c2996ab38ff7f1f9d301e868ca84a93a3050fadb3d09dbc5105b24634cd281671ac11eebe8df7 + checksum: 10/2c14a0d2600bae9ab81924df0a85bbd34e427caa099c260743f7c6c12b2042e743e776043a0d1a2573229ae648f7e66a80cfb26fc27e2a9eb59b55932d44c817 languageName: node linkType: hard -"@babel/parser@npm:^7.27.5": - version: 7.28.0 - resolution: "@babel/parser@npm:7.28.0" +"@babel/parser@npm:^7.28.4": + version: 7.28.5 + resolution: "@babel/parser@npm:7.28.5" dependencies: - "@babel/types": "npm:^7.28.0" + "@babel/types": "npm:^7.28.5" bin: parser: ./bin/babel-parser.js - checksum: 10/2c14a0d2600bae9ab81924df0a85bbd34e427caa099c260743f7c6c12b2042e743e776043a0d1a2573229ae648f7e66a80cfb26fc27e2a9eb59b55932d44c817 + checksum: 10/8d9bfb437af6c97a7f6351840b9ac06b4529ba79d6d3def24d6c2996ab38ff7f1f9d301e868ca84a93a3050fadb3d09dbc5105b24634cd281671ac11eebe8df7 languageName: node linkType: hard @@ -438,17 +442,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-jsx@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-syntax-jsx@npm:7.27.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/c6d1324cff286a369aa95d99b8abd21dd07821b5d3affd5fe7d6058c84cff9190743287826463ee57a7beecd10fa1e4bc99061df532ee14e188c1c8937b13e3a - languageName: node - linkType: hard - "@babel/plugin-syntax-typescript@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-syntax-typescript@npm:7.25.9" @@ -800,55 +793,6 @@ __metadata: languageName: node linkType: hard -"@cypress/grep@npm:^5.0.0": - version: 5.0.0 - resolution: "@cypress/grep@npm:5.0.0" - dependencies: - debug: "npm:^4.3.4" - find-test-names: "npm:^1.28.18" - globby: "npm:^11.0.4" - peerDependencies: - cypress: ">=10" - checksum: 10/a7ebd1936dbbe7c832559dd13bc381a1cec73f044d01074577cc8f5aaa07a2585d17021b184536dcc528816e865d222685c3829811f7d9f5a4c9beac24b51a90 - languageName: node - linkType: hard - -"@cypress/request@npm:^3.0.9": - version: 3.0.9 - resolution: "@cypress/request@npm:3.0.9" - 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.4" - 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.14.0" - safe-buffer: "npm:^5.1.2" - tough-cookie: "npm:^5.0.0" - tunnel-agent: "npm:^0.6.0" - uuid: "npm:^8.3.2" - checksum: 10/735bd15b9bfb2ac950f4ca715c4ea944c3686fab5f48649c6f6ce62e5d2186df51a96c22fb6e4839dc5d16033ceeece03ca9fa621c9232fb96ad567846a4158c - 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 - "@educorvi/rita@npm:^5.4.4": version: 5.4.4 resolution: "@educorvi/rita@npm:5.4.4" @@ -948,10 +892,11 @@ __metadata: version: 0.0.0-use.local resolution: "@educorvi/vue-json-form@workspace:vue-json-form" dependencies: - "@cypress/grep": "npm:^5.0.0" + "@axe-core/playwright": "npm:^4.11.0" "@educorvi/rita": "npm:^5.5.0" "@educorvi/vue-json-form-ajv-validator": "workspace:^" "@educorvi/vue-json-form-schemas": "workspace:*" + "@playwright/test": "npm:^1.57.0" "@rushstack/eslint-patch": "npm:^1.14.1" "@semantic-release/exec": "npm:^7.1.0" "@tsconfig/node18": "npm:^18.2.4" @@ -971,8 +916,6 @@ __metadata: axe-core: "npm:^4.11.0" bootstrap: "npm:^5.3.8" bootstrap-vue-next: "npm:0.40.7" - cypress: "npm:^15.5.0" - cypress-axe: "npm:^1.7.0" deepmerge: "npm:^4.3.1" eslint: "npm:^9.38.0" eslint-config-prettier: "npm:^10.1.8" @@ -983,6 +926,7 @@ __metadata: lightningcss: "npm:^1.30.2" npm-run-all: "npm:^4.1.5" pinia: "npm:^3.0.3" + playwright: "npm:^1.57.0" prettier: "npm:^3.6.2" sanitize-html: "npm:^2.17.0" sass-embedded: "npm:^1.93.2" @@ -1508,52 +1452,6 @@ __metadata: languageName: node linkType: hard -"@hapi/address@npm:^5.1.1": - version: 5.1.1 - resolution: "@hapi/address@npm:5.1.1" - dependencies: - "@hapi/hoek": "npm:^11.0.2" - checksum: 10/9462b22f96f1081a07b3bb07f046c5fdfa1940805b3433476f56c0df3b8eded026f62a2e8395534a14a48f689757f9eb8b44c0c4360d96a12ad34ff21989a534 - languageName: node - linkType: hard - -"@hapi/formula@npm:^3.0.2": - version: 3.0.2 - resolution: "@hapi/formula@npm:3.0.2" - checksum: 10/c6d4fdcd19fdeb02f0995174497b69ca1f2d534d9f55d512b404ce78a3ce4c53618d4c339fb708c812de4ad1db49122cef960eb1d2cc17e284aa9a7ce4283e2b - languageName: node - linkType: hard - -"@hapi/hoek@npm:^11.0.2, @hapi/hoek@npm:^11.0.7": - version: 11.0.7 - resolution: "@hapi/hoek@npm:11.0.7" - checksum: 10/d0cbacf2edcedac1f06dd1d731c1f8c83ef32f2432630c4b1ebe119729cbf79e3da69fa3e5991f19d80e344f5d246b03b7e96998a032940e18bfda7ba2a56f0e - languageName: node - linkType: hard - -"@hapi/pinpoint@npm:^2.0.1": - version: 2.0.1 - resolution: "@hapi/pinpoint@npm:2.0.1" - checksum: 10/28e72305c13de10893be33273cd33c7d7b1c89cfcf707de5a7e214b08f8e3c440adf7df0ff1c9ab4d86744eefdab3ae549456b641f66a2af47ed862f764d6c49 - languageName: node - linkType: hard - -"@hapi/tlds@npm:^1.1.1": - version: 1.1.4 - resolution: "@hapi/tlds@npm:1.1.4" - checksum: 10/274550c5c9700711dfeb5f57df9b432977549cb04a86eaafa509d13344506fba098461adbdf93309d560f766dcd2a1a65d630519ebd34b37ca713a4265a7aa5b - languageName: node - linkType: hard - -"@hapi/topo@npm:^6.0.2": - version: 6.0.2 - resolution: "@hapi/topo@npm:6.0.2" - dependencies: - "@hapi/hoek": "npm:^11.0.2" - checksum: 10/ef959d3796638e11e5f7a9f2a64295ded7c638d6a21fa37bf1265b14c3a6636da593c9976138826c5b8972830a706d18a82b489e3d902e77026f7f0bec908704 - languageName: node - linkType: hard - "@humanfs/core@npm:^0.19.1": version: 0.19.1 resolution: "@humanfs/core@npm:0.19.1" @@ -2349,6 +2247,17 @@ __metadata: languageName: node linkType: hard +"@playwright/test@npm:^1.57.0": + version: 1.57.0 + resolution: "@playwright/test@npm:1.57.0" + dependencies: + playwright: "npm:1.57.0" + bin: + playwright: cli.js + checksum: 10/07f5ba4841b2db1dea70d821004c5156b692488e13523c096ce3487d30f95f34ccf30ba6467ece60c86faac27ae382213b7eacab48a695550981b2e811e5e579 + languageName: node + linkType: hard + "@pnpm/config.env-replace@npm:^1.1.0": version: 1.1.0 resolution: "@pnpm/config.env-replace@npm:1.1.0" @@ -3166,27 +3075,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.3 - resolution: "@types/sizzle@npm:2.3.3" - checksum: 10/586a9fb1f6ff3e325e0f2cc1596a460615f0bc8a28f6e276ac9b509401039dd242fa8b34496d3a30c52f5b495873922d09a9e76c50c2ab2bcc70ba3fb9c4e160 - languageName: node - linkType: hard - -"@types/tmp@npm:^0.2.3": - version: 0.2.6 - resolution: "@types/tmp@npm:0.2.6" - checksum: 10/e14a094c10569d3b56805552b21417860ef21060d969000d5d5b53604a78c2bdac216f064b03797d4b07a081e0141dd3ab22bc36923e75300eb1c023f7252cc7 - languageName: node - linkType: hard - "@types/tough-cookie@npm:*": version: 4.0.2 resolution: "@types/tough-cookie@npm:4.0.2" @@ -4225,7 +4113,7 @@ __metadata: languageName: node linkType: hard -"acorn-walk@npm:^8.1.1, acorn-walk@npm:^8.2.0": +"acorn-walk@npm:^8.1.1": version: 8.3.4 resolution: "acorn-walk@npm:8.3.4" dependencies: @@ -4401,22 +4289,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.3.0": - version: 4.3.2 - resolution: "ansi-escapes@npm:4.3.2" - dependencies: - type-fest: "npm:^0.21.3" - checksum: 10/8661034456193ffeda0c15c8c564a9636b0c04094b7f78bd01517929c17c504090a60f7a75f949f5af91289c264d3e1001d91492c1bd58efc8e100500ce04de2 - languageName: node - linkType: hard - "ansi-escapes@npm:^7.0.0": version: 7.0.0 resolution: "ansi-escapes@npm:7.0.0" @@ -4510,13 +4382,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" @@ -4541,13 +4406,6 @@ __metadata: languageName: node linkType: hard -"arg@npm:^5.0.2": - version: 5.0.2 - resolution: "arg@npm:5.0.2" - checksum: 10/92fe7de222054a060fd2329e92e867410b3ea260328147ee3fb7855f78efae005f4087e698d4e688a856893c56bb09951588c40f2c901cf6996cd8cd7bcfef2c - languageName: node - linkType: hard - "argparse@npm:^2.0.1": version: 2.0.1 resolution: "argparse@npm:2.0.1" @@ -4609,22 +4467,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 - "ast-kit@npm:^2.1.2": version: 2.1.3 resolution: "ast-kit@npm:2.1.3" @@ -4644,13 +4486,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-function@npm:^1.0.0": version: 1.0.0 resolution: "async-function@npm:1.0.0" @@ -4672,13 +4507,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.5": version: 1.0.5 resolution: "available-typed-arrays@npm:1.0.5" @@ -4686,28 +4514,14 @@ __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.12.0 - resolution: "aws4@npm:1.12.0" - checksum: 10/2b8455fe1eee87f0e7d5f32e81e7fec74dce060c72d03f528c8c631fa74209cef53aab6fede182ea17d0c9520cb1e5e3023c5fedb4f1139ae9f067fc720869a5 - languageName: node - linkType: hard - -"axe-core@npm:^4.11.0": +"axe-core@npm:^4.11.0, axe-core@npm:~4.11.0": version: 4.11.0 resolution: "axe-core@npm:4.11.0" checksum: 10/18254ee95bc328aec9a909b22e4b22e8ff14a21363fdbd1a5227267e66bf1d2fc1425c186e9001759aab5827cf4ee9dc30f7ea57e8200cbf7a1cd555ed21a908 languageName: node linkType: hard -"axios@npm:^1.12.1, axios@npm:^1.13.1": +"axios@npm:^1.13.1": version: 1.13.1 resolution: "axios@npm:1.13.1" dependencies: @@ -4788,13 +4602,6 @@ __metadata: languageName: node linkType: hard -"base64-js@npm:^1.3.1": - version: 1.5.1 - resolution: "base64-js@npm:1.5.1" - checksum: 10/669632eb3745404c2f822a18fc3a0122d2f9a7a13f7fb8b5823ee19d1d2ff9ee5b52c53367176ea4ad093c332fd5ab4bd0ebae5a8e27917a4105a4cfc86b1005 - languageName: node - linkType: hard - "basic-ftp@npm:^5.0.2": version: 5.0.5 resolution: "basic-ftp@npm:5.0.5" @@ -4802,15 +4609,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 - "before-after-hook@npm:^4.0.0": version: 4.0.0 resolution: "before-after-hook@npm:4.0.0" @@ -4868,20 +4666,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.2, bluebird@npm:^3.7.2": - version: 3.7.2 - resolution: "bluebird@npm:3.7.2" - checksum: 10/007c7bad22c5d799c8dd49c85b47d012a1fe3045be57447721e6afbd1d5be43237af1db62e26cb9b0d9ba812d2e4ca3bac82f6d7e016b6b88de06ee25ceb96e7 - languageName: node - linkType: hard - "boolbase@npm:^1.0.0": version: 1.0.0 resolution: "boolbase@npm:1.0.0" @@ -5010,16 +4794,6 @@ __metadata: languageName: node linkType: hard -"buffer@npm:^5.7.1": - version: 5.7.1 - resolution: "buffer@npm:5.7.1" - dependencies: - base64-js: "npm:^1.3.1" - ieee754: "npm:^1.1.13" - checksum: 10/997434d3c6e3b39e0be479a80288875f71cd1c07d75a3855e6f08ef848a3c966023f79534e22e415ff3a5112708ce06127277ab20e527146d55c84566405c7c6 - languageName: node - linkType: hard - "bundle-name@npm:^4.1.0": version: 4.1.0 resolution: "bundle-name@npm:4.1.0" @@ -5095,13 +4869,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 - "call-bind-apply-helpers@npm:^1.0.1, call-bind-apply-helpers@npm:^1.0.2": version: 1.0.2 resolution: "call-bind-apply-helpers@npm:1.0.2" @@ -5122,16 +4889,6 @@ __metadata: languageName: node linkType: hard -"call-bound@npm:^1.0.2": - version: 1.0.4 - resolution: "call-bound@npm:1.0.4" - dependencies: - call-bind-apply-helpers: "npm:^1.0.2" - get-intrinsic: "npm:^1.3.0" - checksum: 10/ef2b96e126ec0e58a7ff694db43f4d0d44f80e641370c21549ed911fecbdbc2df3ebc9bddad918d6bbdefeafb60bb3337902006d5176d72bcd2da74820991af7 - languageName: node - linkType: hard - "callsites@npm:^3.0.0": version: 3.1.0 resolution: "callsites@npm:3.1.0" @@ -5146,13 +4903,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:^6.0.1": version: 6.2.0 resolution: "chai@npm:6.2.0" @@ -5171,7 +4921,7 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^4.0.0, chalk@npm:^4.1.0": +"chalk@npm:^4.0.0": version: 4.1.2 resolution: "chalk@npm:4.1.2" dependencies: @@ -5202,13 +4952,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.6.0": version: 3.6.0 resolution: "chokidar@npm:3.6.0" @@ -5270,7 +5013,7 @@ __metadata: languageName: node linkType: hard -"ci-info@npm:^4.0.0, ci-info@npm:^4.1.0": +"ci-info@npm:^4.0.0": version: 4.2.0 resolution: "ci-info@npm:4.2.0" checksum: 10/928d8457f3476ffc4a66dec93b9cdf1944d5e60dba69fbd6a0fc95b652386f6ef64857f6e32372533210ef6d8954634af2c7693d7c07778ee015f3629a5e0dd9 @@ -5319,15 +5062,6 @@ __metadata: languageName: node linkType: hard -"cli-cursor@npm:^3.1.0": - version: 3.1.0 - resolution: "cli-cursor@npm:3.1.0" - dependencies: - restore-cursor: "npm:^3.1.0" - checksum: 10/2692784c6cd2fd85cfdbd11f53aea73a463a6d64a77c3e098b2b4697a20443f430c220629e1ca3b195ea5ac4a97a74c2ee411f3807abf6df2b66211fec0c0a29 - languageName: node - linkType: hard - "cli-highlight@npm:^2.1.11": version: 2.1.11 resolution: "cli-highlight@npm:2.1.11" @@ -5344,19 +5078,6 @@ __metadata: languageName: node linkType: hard -"cli-table3@npm:0.6.1": - version: 0.6.1 - resolution: "cli-table3@npm:0.6.1" - dependencies: - colors: "npm:1.4.0" - string-width: "npm:^4.2.0" - dependenciesMeta: - colors: - optional: true - checksum: 10/eb11ef1264d6e6480eef4d1306f7c9c25800751a40d3eb205f3910ff6e49d067b8b4208e2a17abe57742a57e3c19764a44a68dbf2761bc1f707fdb7b4d658cd9 - languageName: node - linkType: hard - "cli-table3@npm:^0.6.5": version: 0.6.5 resolution: "cli-table3@npm:0.6.5" @@ -5370,16 +5091,6 @@ __metadata: 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 - "cliui@npm:^7.0.2": version: 7.0.4 resolution: "cliui@npm:7.0.4" @@ -5468,13 +5179,6 @@ __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 - "colorjs.io@npm:^0.5.0": version: 0.5.2 resolution: "colorjs.io@npm:0.5.2" @@ -5482,14 +5186,7 @@ __metadata: languageName: node linkType: hard -"colors@npm:1.4.0": - version: 1.4.0 - resolution: "colors@npm:1.4.0" - checksum: 10/90b2d5465159813a3983ea72ca8cff75f784824ad70f2cc2b32c233e95bcfbcda101ebc6d6766bc50f57263792629bfb4f1f8a4dfbd1d240f229fc7f69b785fc - 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: @@ -5519,13 +5216,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 - "common-ancestor-path@npm:^1.0.1": version: 1.0.1 resolution: "common-ancestor-path@npm:1.0.1" @@ -5533,13 +5223,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 - "compare-func@npm:^2.0.0": version: 2.0.0 resolution: "compare-func@npm:2.0.0" @@ -5691,13 +5374,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 - "core-util-is@npm:~1.0.0": version: 1.0.3 resolution: "core-util-is@npm:1.0.3" @@ -5847,69 +5523,6 @@ __metadata: languageName: node linkType: hard -"cypress-axe@npm:^1.7.0": - version: 1.7.0 - resolution: "cypress-axe@npm:1.7.0" - peerDependencies: - axe-core: ^3 || ^4 - cypress: ^10 || ^11 || ^12 || ^13 || ^14 || ^15 - checksum: 10/f37620c4c17b315d8ec34e1a51d798b91739ecbd868ac7ee1dc1f47bc7e7412d0e0ad942e13e2e25d397f2d4aa487ce485a86d4aa66fc022bf7d1239576f42a1 - languageName: node - linkType: hard - -"cypress@npm:^15.5.0": - version: 15.5.0 - resolution: "cypress@npm:15.5.0" - dependencies: - "@cypress/request": "npm:^3.0.9" - "@cypress/xvfb": "npm:^1.2.4" - "@types/sinonjs__fake-timers": "npm:8.1.1" - "@types/sizzle": "npm:^2.3.2" - "@types/tmp": "npm:^0.2.3" - 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" - ci-info: "npm:^4.1.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" - hasha: "npm:5.2.2" - is-installed-globally: "npm:~0.4.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.7.1" - supports-color: "npm:^8.1.1" - systeminformation: "npm:5.27.7" - tmp: "npm:~0.2.4" - tree-kill: "npm:1.2.2" - untildify: "npm:^4.0.0" - yauzl: "npm:^2.10.0" - bin: - cypress: bin/cypress - checksum: 10/fdfe965d36734cb301ee5573261a5a7766c7176f4d3eb0ecd24532c00aeff8983347d855bc7f3afa106558812602d306d70eb765a3181f03fe100ad5f7688bce - languageName: node - linkType: hard - "dargs@npm:^8.0.0": version: 8.1.0 resolution: "dargs@npm:8.1.0" @@ -5917,15 +5530,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-uri-to-buffer@npm:^6.0.2": version: 6.0.2 resolution: "data-uri-to-buffer@npm:6.0.2" @@ -5943,13 +5547,6 @@ __metadata: languageName: node linkType: hard -"dayjs@npm:^1.10.4": - version: 1.11.9 - resolution: "dayjs@npm:1.11.9" - checksum: 10/7bee5a13653049ae166d4ee7f17fd1b3cd31ec8699b2bae1dee6262431d8d5815a4a9f12eaf48d1879a98d993c014a9a9098ed75aa6a041efe9bccc080a687cd - languageName: node - linkType: hard - "de-indent@npm:^1.0.2": version: 1.0.2 resolution: "de-indent@npm:1.0.2" @@ -5969,27 +5566,6 @@ __metadata: languageName: node linkType: hard -"debug@npm:4.4.3, debug@npm:^4.4.3": - version: 4.4.3 - resolution: "debug@npm:4.4.3" - dependencies: - ms: "npm:^2.1.3" - peerDependenciesMeta: - supports-color: - optional: true - checksum: 10/9ada3434ea2993800bd9a1e320bd4aa7af69659fb51cca685d390949434bc0a8873c21ed7c9b852af6f2455a55c6d050aa3937d52b3c69f796dab666f762acad - languageName: node - linkType: hard - -"debug@npm:^3.1.0": - version: 3.2.7 - resolution: "debug@npm:3.2.7" - dependencies: - ms: "npm:^2.1.1" - checksum: 10/d86fd7be2b85462297ea16f1934dc219335e802f629ca9a69b63ed8ed041dda492389bb2ee039217c02e5b54792b1c51aa96ae954cf28634d363a2360c7a1639 - languageName: node - linkType: hard - "debug@npm:^4.0.0": version: 4.4.0 resolution: "debug@npm:4.4.0" @@ -6026,6 +5602,18 @@ __metadata: languageName: node linkType: hard +"debug@npm:^4.4.3": + version: 4.4.3 + resolution: "debug@npm:4.4.3" + dependencies: + ms: "npm:^2.1.3" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 10/9ada3434ea2993800bd9a1e320bd4aa7af69659fb51cca685d390949434bc0a8873c21ed7c9b852af6f2455a55c6d050aa3937d52b3c69f796dab666f762acad + languageName: node + linkType: hard + "decimal.js@npm:^10.6.0": version: 10.6.0 resolution: "decimal.js@npm:10.6.0" @@ -6135,6 +5723,7 @@ __metadata: dependencies: "@educorvi/vue-json-form": "workspace:^" "@educorvi/vue-json-form-ajv-validator": "workspace:^" + "@playwright/test": "npm:^1.57.0" "@semantic-release/exec": "npm:^7.1.0" "@tsconfig/node18": "npm:^18.2.4" "@types/node": "npm:^24.9.2" @@ -6143,13 +5732,12 @@ __metadata: bootstrap: "npm:^5.3.8" bootstrap-vue-next: "npm:0.40.7" bootswatch: "npm:^5.3.8" - cypress: "npm:^15.5.0" npm-run-all: "npm:^4.1.5" + playwright: "npm:^1.57.0" sass-embedded: "npm:^1.93.2" semantic-release: "npm:^25.0.1" semantic-release-monorepo: "npm:^8.0.2" semantic-release-yarn: "npm:^3.0.2" - start-server-and-test: "npm:^2.1.2" typescript: "npm:~5.9.3" unplugin-vue-components: "npm:^30.0.0" vite: "npm:^7.1.12" @@ -6273,13 +5861,6 @@ __metadata: languageName: node linkType: hard -"duplexer@npm:~0.1.1": - version: 0.1.2 - resolution: "duplexer@npm:0.1.2" - checksum: 10/62ba61a830c56801db28ff6305c7d289b6dc9f859054e8c982abd8ee0b0a14d2e9a8e7d086ffee12e868d43e2bbe8a964be55ddbd8c8957714c87373c7a4f9b0 - languageName: node - linkType: hard - "eastasianwidth@npm:^0.2.0": version: 0.2.0 resolution: "eastasianwidth@npm:0.2.0" @@ -6287,16 +5868,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 - "editorconfig@npm:^1.0.4": version: 1.0.4 resolution: "editorconfig@npm:1.0.4" @@ -6374,16 +5945,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 - "entities@npm:^4.2.0, entities@npm:^4.4.0, entities@npm:^4.5.0": version: 4.5.0 resolution: "entities@npm:4.5.0" @@ -7016,28 +6577,6 @@ __metadata: languageName: node linkType: hard -"event-stream@npm:=3.3.4": - version: 3.3.4 - resolution: "event-stream@npm:3.3.4" - dependencies: - duplexer: "npm:~0.1.1" - from: "npm:~0" - map-stream: "npm:~0.1.0" - pause-stream: "npm:0.0.11" - split: "npm:0.3" - stream-combiner: "npm:~0.0.4" - through: "npm:~2.3.1" - checksum: 10/48ea0e17df89ff45778c25e7111a6691401c902162823ddd7656d83fc972e75380f789f7a48f272f50fe7015420cc04f835d458560bf95e34b2c7a479570c8fb - 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 - "events@npm:^3.2.0": version: 3.3.0 resolution: "events@npm:3.3.0" @@ -7045,24 +6584,7 @@ __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:5.1.1, execa@npm:^5.1.1": +"execa@npm:^5.1.1": version: 5.1.1 resolution: "execa@npm:5.1.1" dependencies: @@ -7116,15 +6638,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 - "expect-type@npm:^1.2.2": version: 1.2.2 resolution: "expect-type@npm:1.2.2" @@ -7146,14 +6659,7 @@ __metadata: languageName: node linkType: hard -"extend@npm:~3.0.2": - version: 3.0.2 - resolution: "extend@npm:3.0.2" - checksum: 10/59e89e2dc798ec0f54b36d82f32a27d5f6472c53974f61ca098db5d4648430b725387b53449a34df38fd0392045434426b012f302b3cc049a6500ccf82877e4e - languageName: node - linkType: hard - -"extract-zip@npm:2.0.1, extract-zip@npm:^2.0.1": +"extract-zip@npm:^2.0.1": version: 2.0.1 resolution: "extract-zip@npm:2.0.1" dependencies: @@ -7170,20 +6676,6 @@ __metadata: 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 - "fast-content-type-parse@npm:^3.0.0": version: 3.0.0 resolution: "fast-content-type-parse@npm:3.0.0" @@ -7337,15 +6829,6 @@ __metadata: languageName: node linkType: hard -"figures@npm:^3.2.0": - version: 3.2.0 - resolution: "figures@npm:3.2.0" - dependencies: - escape-string-regexp: "npm:^1.0.5" - checksum: 10/a3bf94e001be51d3770500789157f067218d4bc681a65e1f69d482de15120bcac822dceb1a7b3803f32e4e3a61a46df44f7f2c8ba95d6375e7491502e0dd3d97 - languageName: node - linkType: hard - "figures@npm:^6.0.0, figures@npm:^6.1.0": version: 6.1.0 resolution: "figures@npm:6.1.0" @@ -7398,24 +6881,6 @@ __metadata: languageName: node linkType: hard -"find-test-names@npm:^1.28.18": - version: 1.29.19 - resolution: "find-test-names@npm:1.29.19" - dependencies: - "@babel/parser": "npm:^7.27.2" - "@babel/plugin-syntax-jsx": "npm:^7.27.1" - acorn-walk: "npm:^8.2.0" - debug: "npm:^4.3.3" - simple-bin-help: "npm:^1.8.0" - tinyglobby: "npm:^0.2.13" - bin: - find-test-names: bin/find-test-names.js - print-tests: bin/print-tests.js - update-test-count: bin/update-test-count.js - checksum: 10/0bd0a791e6122881457a177c548bde7a4bb6caa1e4b01a7e768cfab156e65ce4d712830cca9fc856125f5f4e4e589bf10da415cba36a8e836e30c3034f57cb8d - languageName: node - linkType: hard - "find-up-simple@npm:^1.0.0": version: 1.0.1 resolution: "find-up-simple@npm:1.0.1" @@ -7535,14 +7000,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.4, form-data@npm:~4.0.4": +"form-data@npm:^4.0.4": version: 4.0.4 resolution: "form-data@npm:4.0.4" dependencies: @@ -7565,13 +7023,6 @@ __metadata: languageName: node linkType: hard -"from@npm:~0": - version: 0.1.7 - resolution: "from@npm:0.1.7" - checksum: 10/b85125b7890489656eb2e4f208f7654a93ec26e3aefaf3bbbcc0d496fc1941e4405834fcc9fe7333192aa2187905510ace70417bbf9ac6f6f4784a731d986939 - languageName: node - linkType: hard - "fs-extra@npm:^10.0.1": version: 10.1.0 resolution: "fs-extra@npm:10.1.0" @@ -7605,18 +7056,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" @@ -7642,6 +7081,16 @@ __metadata: languageName: node linkType: hard +"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" @@ -7652,6 +7101,15 @@ __metadata: 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" + conditions: os=darwin + languageName: node + linkType: hard + "fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.3#optional!builtin": version: 2.3.3 resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" @@ -7757,24 +7215,6 @@ __metadata: languageName: node linkType: hard -"get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.3.0": - version: 1.3.0 - resolution: "get-intrinsic@npm:1.3.0" - dependencies: - call-bind-apply-helpers: "npm:^1.0.2" - es-define-property: "npm:^1.0.1" - es-errors: "npm:^1.3.0" - es-object-atoms: "npm:^1.1.1" - function-bind: "npm:^1.1.2" - get-proto: "npm:^1.0.1" - gopd: "npm:^1.2.0" - has-symbols: "npm:^1.1.0" - hasown: "npm:^2.0.2" - math-intrinsics: "npm:^1.1.0" - checksum: 10/6e9dd920ff054147b6f44cb98104330e87caafae051b6d37b13384a45ba15e71af33c3baeac7cb630a0aaa23142718dcf25b45cfdd86c184c5dcb4e56d953a10 - languageName: node - linkType: hard - "get-intrinsic@npm:^1.2.6": version: 1.3.1 resolution: "get-intrinsic@npm:1.3.1" @@ -7806,7 +7246,7 @@ __metadata: languageName: node linkType: hard -"get-stream@npm:^5.0.0, get-stream@npm:^5.1.0": +"get-stream@npm:^5.1.0": version: 5.2.0 resolution: "get-stream@npm:5.2.0" dependencies: @@ -7876,15 +7316,6 @@ __metadata: 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-log-parser@npm:^1.2.0": version: 1.2.1 resolution: "git-log-parser@npm:1.2.1" @@ -8007,15 +7438,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" @@ -8055,7 +7477,7 @@ __metadata: languageName: node linkType: hard -"globby@npm:^11.0.1, globby@npm:^11.0.4": +"globby@npm:^11.0.1": version: 11.1.0 resolution: "globby@npm:11.1.0" dependencies: @@ -8209,16 +7631,6 @@ __metadata: languageName: node linkType: hard -"hasha@npm:5.2.2": - version: 5.2.2 - resolution: "hasha@npm:5.2.2" - dependencies: - is-stream: "npm:^2.0.0" - type-fest: "npm:^0.8.0" - checksum: 10/06cc474bed246761ff61c19d629977eb5f53fa817be4313a255a64ae0f433e831a29e83acb6555e3f4592b348497596f1d1653751008dda4f21c9c21ca60ac5a - languageName: node - linkType: hard - "hasown@npm:^2.0.2": version: 2.0.2 resolution: "hasown@npm:2.0.2" @@ -8339,17 +7751,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 - "https-proxy-agent@npm:^5.0.0": version: 5.0.1 resolution: "https-proxy-agent@npm:5.0.1" @@ -8370,13 +7771,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:^2.1.0": version: 2.1.0 resolution: "human-signals@npm:2.1.0" @@ -8425,13 +7819,6 @@ __metadata: languageName: node linkType: hard -"ieee754@npm:^1.1.13": - version: 1.2.1 - resolution: "ieee754@npm:1.2.1" - checksum: 10/d9f2557a59036f16c282aaeb107832dc957a93d73397d89bbad4eb1130560560eb695060145e8e6b3b498b15ab95510226649a0b8f52ae06583575419fe10fc4 - languageName: node - linkType: hard - "ignore-walk@npm:^8.0.0": version: 8.0.0 resolution: "ignore-walk@npm:8.0.0" @@ -8558,13 +7945,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" @@ -8778,16 +8158,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-lambda@npm:^1.0.1": version: 1.0.1 resolution: "is-lambda@npm:1.0.1" @@ -8943,20 +8313,6 @@ __metadata: languageName: node linkType: hard -"is-typedarray@npm:~1.0.0": - version: 1.0.0 - resolution: "is-typedarray@npm:1.0.0" - checksum: 10/4b433bfb0f9026f079f4eb3fbaa4ed2de17c9995c3a0b5c800bec40799b4b2a8b4e051b1ada77749deb9ded4ae52fe2096973f3a93ff83df1a5a7184a669478c - languageName: node - linkType: hard - -"is-unicode-supported@npm:^0.1.0": - version: 0.1.0 - resolution: "is-unicode-supported@npm:0.1.0" - checksum: 10/a2aab86ee7712f5c2f999180daaba5f361bdad1efadc9610ff5b8ab5495b86e4f627839d085c6530363c6d6d4ecbde340fb8e54bdb83da4ba8e0865ed5513c52 - languageName: node - linkType: hard - "is-unicode-supported@npm:^2.0.0": version: 2.1.0 resolution: "is-unicode-supported@npm:2.1.0" @@ -9017,13 +8373,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 - "issue-parser@npm:^7.0.0": version: 7.0.1 resolution: "issue-parser@npm:7.0.1" @@ -9115,21 +8464,6 @@ __metadata: languageName: node linkType: hard -"joi@npm:^18.0.1": - version: 18.0.1 - resolution: "joi@npm:18.0.1" - dependencies: - "@hapi/address": "npm:^5.1.1" - "@hapi/formula": "npm:^3.0.2" - "@hapi/hoek": "npm:^11.0.7" - "@hapi/pinpoint": "npm:^2.0.1" - "@hapi/tlds": "npm:^1.1.1" - "@hapi/topo": "npm:^6.0.2" - "@standard-schema/spec": "npm:^1.0.0" - checksum: 10/d8e391c0e93ca1e83836bd8eb3562004a038d5184e74b9e6c6877fc60c782cbc549dcaa003e41ddb12c10899be3c4da175e7dc290e9457e92f2f4d28b46094df - languageName: node - linkType: hard - "js-beautify@npm:^1.14.9": version: 1.15.4 resolution: "js-beautify@npm:1.15.4" @@ -9179,13 +8513,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 - "jsdom@npm:^27.0.1": version: 27.0.1 resolution: "jsdom@npm:27.0.1" @@ -9319,13 +8646,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" @@ -9340,13 +8660,6 @@ __metadata: languageName: node linkType: hard -"json-stringify-safe@npm:~5.0.1": - version: 5.0.1 - resolution: "json-stringify-safe@npm:5.0.1" - checksum: 10/59169a081e4eeb6f9559ae1f938f656191c000e0512aa6df9f3c8b2437a4ab1823819c6b9fd1818a4e39593ccfd72e9a051fdd3e2d1e340ed913679e888ded8c - languageName: node - linkType: hard - "json5@npm:^2.2.3": version: 2.2.3 resolution: "json5@npm:2.2.3" @@ -9388,18 +8701,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 - "just-diff-apply@npm:^5.2.0": version: 5.5.0 resolution: "just-diff-apply@npm:5.5.0" @@ -9430,13 +8731,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 - "levn@npm:^0.4.1": version: 0.4.1 resolution: "levn@npm:0.4.1" @@ -9722,27 +9016,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 - "load-json-file@npm:^4.0.0": version: 4.0.0 resolution: "load-json-file@npm:4.0.0" @@ -9885,13 +9158,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" @@ -9934,28 +9200,6 @@ __metadata: languageName: node linkType: hard -"log-symbols@npm:^4.0.0": - version: 4.1.0 - resolution: "log-symbols@npm:4.1.0" - dependencies: - chalk: "npm:^4.1.0" - is-unicode-supported: "npm:^0.1.0" - checksum: 10/fce1497b3135a0198803f9f07464165e9eb83ed02ceb2273930a6f8a508951178d8cf4f0378e9d28300a2ed2bc49050995d2bd5f53ab716bb15ac84d58c6ef74 - 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 - "lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": version: 10.4.3 resolution: "lru-cache@npm:10.4.3" @@ -10120,13 +9364,6 @@ __metadata: languageName: node linkType: hard -"map-stream@npm:~0.1.0": - version: 0.1.0 - resolution: "map-stream@npm:0.1.0" - checksum: 10/f04a07041dccdf8140a4a6613e4731e917153ee031d3c837cb32ea7d609e8fbea538c44053718772f59dd1dca0ce68a5689ad006688612ee720d78bacf5bf24d - languageName: node - linkType: hard - "markdown-it@npm:^14.1.0": version: 14.1.0 resolution: "markdown-it@npm:14.1.0" @@ -10252,7 +9489,7 @@ __metadata: languageName: node linkType: hard -"mime-types@npm:^2.1.12, mime-types@npm:^2.1.27, mime-types@npm:~2.1.19": +"mime-types@npm:^2.1.12, mime-types@npm:^2.1.27": version: 2.1.35 resolution: "mime-types@npm:2.1.35" dependencies: @@ -10550,7 +9787,7 @@ __metadata: languageName: node linkType: hard -"ms@npm:^2.0.0, ms@npm:^2.1.1, ms@npm:^2.1.2, ms@npm:^2.1.3": +"ms@npm:^2.0.0, ms@npm:^2.1.2, ms@npm:^2.1.3": version: 2.1.3 resolution: "ms@npm:2.1.3" checksum: 10/aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d @@ -10964,7 +10201,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: @@ -11110,13 +10347,6 @@ __metadata: languageName: node linkType: hard -"object-inspect@npm:^1.13.3": - version: 1.13.4 - resolution: "object-inspect@npm:1.13.4" - checksum: 10/aa13b1190ad3e366f6c83ad8a16ed37a19ed57d267385aa4bfdccda833d7b90465c057ff6c55d035a6b2e52c1a2295582b294217a0a3a1ae7abdd6877ef781fb - languageName: node - linkType: hard - "object-keys@npm:^1.1.1": version: 1.1.1 resolution: "object-keys@npm:1.1.1" @@ -11152,7 +10382,7 @@ __metadata: languageName: node linkType: hard -"onetime@npm:^5.1.0, onetime@npm:^5.1.2": +"onetime@npm:^5.1.2": version: 5.1.2 resolution: "onetime@npm:5.1.2" dependencies: @@ -11196,13 +10426,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 - "p-each-series@npm:^2.1.0": version: 2.2.0 resolution: "p-each-series@npm:2.2.0" @@ -11639,15 +10862,6 @@ __metadata: languageName: node linkType: hard -"pause-stream@npm:0.0.11": - version: 0.0.11 - resolution: "pause-stream@npm:0.0.11" - dependencies: - through: "npm:~2.3" - checksum: 10/1407efadfe814b5c487e4b28d6139cb7e03ee5d25fbb5f89a68f2053e81f05ce6b2bec196eeb3d46ef2c856f785016d14816b0d0e3c3abd1b64311c5c20660dc - languageName: node - linkType: hard - "pend@npm:~1.2.0": version: 1.2.0 resolution: "pend@npm:1.2.0" @@ -11669,13 +10883,6 @@ __metadata: 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": version: 1.0.0 resolution: "picocolors@npm:1.0.0" @@ -11720,13 +10927,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 - "pify@npm:^3.0.0": version: 3.0.0 resolution: "pify@npm:3.0.0" @@ -11801,6 +11001,30 @@ __metadata: languageName: node linkType: hard +"playwright-core@npm:1.57.0": + version: 1.57.0 + resolution: "playwright-core@npm:1.57.0" + bin: + playwright-core: cli.js + checksum: 10/ec066602f0196f036006caee14a30d0a57533a76673bb9a0c609ef56e21decf018f0e8d402ba2fb18251393be6a1c9e193c83266f1670fe50838c5340e220de0 + languageName: node + linkType: hard + +"playwright@npm:1.57.0, playwright@npm:^1.57.0": + version: 1.57.0 + resolution: "playwright@npm:1.57.0" + dependencies: + fsevents: "npm:2.3.2" + playwright-core: "npm:1.57.0" + dependenciesMeta: + fsevents: + optional: true + bin: + playwright: cli.js + checksum: 10/241559210f98ef11b6bd6413f2d29da7ef67c7865b72053192f0d164fab9e0d3bd47913b3351d5de6433a8aff2d8424d4b8bd668df420bf4dda7ae9fcd37b942 + languageName: node + linkType: hard + "postcss-selector-parser@npm:^6.0.15": version: 6.1.2 resolution: "postcss-selector-parser@npm:6.1.2" @@ -11879,13 +11103,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-ms@npm:^9.0.0": version: 9.2.0 resolution: "pretty-ms@npm:9.2.0" @@ -11916,13 +11133,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 - "proggy@npm:^3.0.0": version: 3.0.0 resolution: "proggy@npm:3.0.0" @@ -11993,13 +11203,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" @@ -12007,17 +11210,6 @@ __metadata: languageName: node linkType: hard -"ps-tree@npm:1.2.0": - version: 1.2.0 - resolution: "ps-tree@npm:1.2.0" - dependencies: - event-stream: "npm:=3.3.4" - bin: - ps-tree: ./bin/ps-tree.js - checksum: 10/0587defdc20c0768fad884623c0204c77e5228878a5cb043676b00529220ec12d9cb6a328a0580767a9909a317bff466fe4530a4676e3d145a9deb3b7fbbeef3 - languageName: node - linkType: hard - "pump@npm:^3.0.0": version: 3.0.0 resolution: "pump@npm:3.0.0" @@ -12072,15 +11264,6 @@ __metadata: languageName: node linkType: hard -"qs@npm:6.14.0": - version: 6.14.0 - resolution: "qs@npm:6.14.0" - dependencies: - side-channel: "npm:^1.1.0" - checksum: 10/a60e49bbd51c935a8a4759e7505677b122e23bf392d6535b8fc31c1e447acba2c901235ecb192764013cd2781723dc1f61978b5fdd93cc31d7043d31cdc01974 - languageName: node - linkType: hard - "quansync@npm:^0.2.11": version: 0.2.11 resolution: "quansync@npm:0.2.11" @@ -12269,15 +11452,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" @@ -12391,16 +11565,6 @@ __metadata: languageName: node linkType: hard -"restore-cursor@npm:^3.1.0": - version: 3.1.0 - resolution: "restore-cursor@npm:3.1.0" - dependencies: - onetime: "npm:^5.1.0" - signal-exit: "npm:^3.0.2" - checksum: 10/f877dd8741796b909f2a82454ec111afb84eb45890eb49ac947d87991379406b3b83ff9673a46012fca0d7844bb989f45cc5b788254cf1a39b6b5a9659de0630 - languageName: node - linkType: hard - "retry@npm:^0.12.0": version: 0.12.0 resolution: "retry@npm:0.12.0" @@ -12415,13 +11579,6 @@ __metadata: languageName: node linkType: hard -"rfdc@npm:^1.3.0": - version: 1.3.0 - resolution: "rfdc@npm:1.3.0" - checksum: 10/76dedd9700cdf132947fde7ce1a8838c9cbb7f3e8f9188af0aaf97194cce745f42094dd2cf547426934cc83252ee2c0e432b2e0222a4415ab0db32de82665c69 - languageName: node - linkType: hard - "rfdc@npm:^1.4.1": version: 1.4.1 resolution: "rfdc@npm:1.4.1" @@ -12551,7 +11708,7 @@ __metadata: languageName: node linkType: hard -"rxjs@npm:^7.4.0, rxjs@npm:^7.8.2": +"rxjs@npm:^7.4.0": version: 7.8.2 resolution: "rxjs@npm:7.8.2" dependencies: @@ -12560,15 +11717,6 @@ __metadata: languageName: node linkType: hard -"rxjs@npm:^7.5.1": - version: 7.8.1 - resolution: "rxjs@npm:7.8.1" - dependencies: - tslib: "npm:^2.1.0" - checksum: 10/b10cac1a5258f885e9dd1b70d23c34daeb21b61222ee735d2ec40a8685bdca40429000703a44f0e638c27a684ac139e1c37e835d2a0dc16f6fc061a138ae3abb - languageName: node - linkType: hard - "safe-array-concat@npm:^1.0.0": version: 1.0.0 resolution: "safe-array-concat@npm:1.0.0" @@ -12581,7 +11729,7 @@ __metadata: languageName: node linkType: hard -"safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.0, safe-buffer@npm:^5.1.2, safe-buffer@npm:~5.2.0": +"safe-buffer@npm:^5.1.0, safe-buffer@npm:~5.2.0": version: 5.2.1 resolution: "safe-buffer@npm:5.2.1" checksum: 10/32872cd0ff68a3ddade7a7617b8f4c2ae8764d8b7d884c651b74457967a9e0e886267d3ecc781220629c44a865167b61c375d2da6c720c840ecd73f45d5d9451 @@ -12606,7 +11754,7 @@ __metadata: languageName: node linkType: hard -"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.0.0": version: 2.1.2 resolution: "safer-buffer@npm:2.1.2" checksum: 10/7eaf7a0cf37cc27b42fb3ef6a9b1df6e93a1c6d98c6c6702b02fe262d5fcbd89db63320793b99b21cb5348097d0a53de81bd5f4e8b86e20cc9412e3f1cfb4e83 @@ -12993,7 +12141,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.1.1, semver@npm:^7.1.2, semver@npm:^7.3.2, semver@npm:^7.5.2, semver@npm:^7.6.3, semver@npm:^7.7.1": +"semver@npm:^7.1.1, semver@npm:^7.1.2, semver@npm:^7.3.2, semver@npm:^7.5.2, semver@npm:^7.6.3": version: 7.7.1 resolution: "semver@npm:7.7.1" bin: @@ -13086,41 +12234,6 @@ __metadata: languageName: node linkType: hard -"side-channel-list@npm:^1.0.0": - version: 1.0.0 - resolution: "side-channel-list@npm:1.0.0" - dependencies: - es-errors: "npm:^1.3.0" - object-inspect: "npm:^1.13.3" - checksum: 10/603b928997abd21c5a5f02ae6b9cc36b72e3176ad6827fab0417ead74580cc4fb4d5c7d0a8a2ff4ead34d0f9e35701ed7a41853dac8a6d1a664fcce1a044f86f - languageName: node - linkType: hard - -"side-channel-map@npm:^1.0.1": - version: 1.0.1 - resolution: "side-channel-map@npm:1.0.1" - dependencies: - call-bound: "npm:^1.0.2" - es-errors: "npm:^1.3.0" - get-intrinsic: "npm:^1.2.5" - object-inspect: "npm:^1.13.3" - checksum: 10/5771861f77feefe44f6195ed077a9e4f389acc188f895f570d56445e251b861754b547ea9ef73ecee4e01fdada6568bfe9020d2ec2dfc5571e9fa1bbc4a10615 - languageName: node - linkType: hard - -"side-channel-weakmap@npm:^1.0.2": - version: 1.0.2 - resolution: "side-channel-weakmap@npm:1.0.2" - dependencies: - call-bound: "npm:^1.0.2" - es-errors: "npm:^1.3.0" - get-intrinsic: "npm:^1.2.5" - object-inspect: "npm:^1.13.3" - side-channel-map: "npm:^1.0.1" - checksum: 10/a815c89bc78c5723c714ea1a77c938377ea710af20d4fb886d362b0d1f8ac73a17816a5f6640f354017d7e292a43da9c5e876c22145bac00b76cfb3468001736 - languageName: node - linkType: hard - "side-channel@npm:^1.0.4": version: 1.0.4 resolution: "side-channel@npm:1.0.4" @@ -13132,19 +12245,6 @@ __metadata: languageName: node linkType: hard -"side-channel@npm:^1.1.0": - version: 1.1.0 - resolution: "side-channel@npm:1.1.0" - dependencies: - es-errors: "npm:^1.3.0" - object-inspect: "npm:^1.13.3" - side-channel-list: "npm:^1.0.0" - side-channel-map: "npm:^1.0.1" - side-channel-weakmap: "npm:^1.0.2" - checksum: 10/7d53b9db292c6262f326b6ff3bc1611db84ece36c2c7dc0e937954c13c73185b0406c56589e2bb8d071d6fee468e14c39fb5d203ee39be66b7b8174f179afaba - languageName: node - linkType: hard - "siginfo@npm:^2.0.0": version: 2.0.0 resolution: "siginfo@npm:2.0.0" @@ -13152,7 +12252,7 @@ __metadata: languageName: node linkType: hard -"signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": +"signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": version: 3.0.7 resolution: "signal-exit@npm:3.0.7" checksum: 10/a2f098f247adc367dffc27845853e9959b9e88b01cb301658cfe4194352d8d2bb32e18467c786a7fe15f1d44b233ea35633d076d5e737870b7139949d1ab6318 @@ -13191,13 +12291,6 @@ __metadata: languageName: node linkType: hard -"simple-bin-help@npm:^1.8.0": - version: 1.8.0 - resolution: "simple-bin-help@npm:1.8.0" - checksum: 10/2333be11a8863f9ea7c5fbd9824824bcc56bfd91e436ea4364bd117600e9a2971ecdbaf1782924b53d3c16f393200e85ddbdf075a454375f80572481cd0aecd3 - languageName: node - linkType: hard - "sirv@npm:^3.0.1": version: 3.0.1 resolution: "sirv@npm:3.0.1" @@ -13253,28 +12346,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" @@ -13436,15 +12507,6 @@ __metadata: languageName: node linkType: hard -"split@npm:0.3": - version: 0.3.3 - resolution: "split@npm:0.3.3" - dependencies: - through: "npm:2" - checksum: 10/41b397e9fedc984ee1b061780bf173ef72a4f99265ca9cbccd9765b8cc0729eeee6cdeaf70664eb3eb0823e8430db033e50a33050498d75569fc743c6964c84e - languageName: node - linkType: hard - "sprintf-js@npm:^1.1.3": version: 1.1.3 resolution: "sprintf-js@npm:1.1.3" @@ -13459,27 +12521,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.5 resolution: "ssri@npm:10.0.5" @@ -13505,26 +12546,6 @@ __metadata: languageName: node linkType: hard -"start-server-and-test@npm:^2.1.2": - version: 2.1.2 - resolution: "start-server-and-test@npm:2.1.2" - dependencies: - arg: "npm:^5.0.2" - bluebird: "npm:3.7.2" - check-more-types: "npm:2.24.0" - debug: "npm:4.4.3" - execa: "npm:5.1.1" - lazy-ass: "npm:1.6.0" - ps-tree: "npm:1.2.0" - wait-on: "npm:8.0.5" - bin: - server-test: src/bin/start.js - start-server-and-test: src/bin/start.js - start-test: src/bin/start.js - checksum: 10/bf4010fed2f1bc9db99ff3939a6327cce9af89782e44d0ce71a4a68a65babdc3b620dc8fc157c2e442b6970def4a57cd8d25ca3e13d8a75e91976ad248e99268 - languageName: node - linkType: hard - "std-env@npm:^3.9.0": version: 3.9.0 resolution: "std-env@npm:3.9.0" @@ -13542,15 +12563,6 @@ __metadata: languageName: node linkType: hard -"stream-combiner@npm:~0.0.4": - version: 0.0.4 - resolution: "stream-combiner@npm:0.0.4" - dependencies: - duplexer: "npm:~0.1.1" - checksum: 10/844b622cfe8b9de45a6007404f613b60aaf85200ab9862299066204242f89a7c8033b1c356c998aa6cfc630f6cd9eba119ec1c6dc1f93e245982be4a847aee7d - languageName: node - linkType: hard - "streamx@npm:^2.15.0, streamx@npm:^2.21.0": version: 2.22.1 resolution: "streamx@npm:2.22.1" @@ -13917,16 +12929,6 @@ __metadata: languageName: node linkType: hard -"systeminformation@npm:5.27.7": - version: 5.27.7 - resolution: "systeminformation@npm:5.27.7" - bin: - systeminformation: lib/cli.js - checksum: 10/8e9b2fc1836822bd09355933675fdaa40776b150b8afd3e8cedf2a2303f95f02aa592c0303eb46a68857f367bc2483159ba325b40d0b7deca776ec0615f743ad - conditions: (os=darwin | os=linux | os=win32 | os=freebsd | os=openbsd | os=netbsd | os=sunos | os=android) - languageName: node - linkType: hard - "tapable@npm:^2.1.1, tapable@npm:^2.2.0": version: 2.2.3 resolution: "tapable@npm:2.2.3" @@ -14119,13 +13121,6 @@ __metadata: languageName: node linkType: hard -"throttleit@npm:^1.0.0": - version: 1.0.0 - resolution: "throttleit@npm:1.0.0" - checksum: 10/cfc5b156143a6c4c3a2265a9926fa4964ac3c71c746245cef00afb92359aba8ba3fd905afd97e3ff6403f57971f5e2cdf01cad631799448773ae81d8de5cade6 - languageName: node - linkType: hard - "through2@npm:~2.0.0": version: 2.0.5 resolution: "through2@npm:2.0.5" @@ -14136,7 +13131,7 @@ __metadata: languageName: node linkType: hard -"through@npm:2, through@npm:>=2.2.7 <3, through@npm:^2.3.8, through@npm:~2.3, through@npm:~2.3.1": +"through@npm:>=2.2.7 <3": version: 2.3.8 resolution: "through@npm:2.3.8" checksum: 10/5da78346f70139a7d213b65a0106f3c398d6bc5301f9248b5275f420abc2c4b1e77c2abc72d218dedc28c41efb2e7c312cb76a7730d04f9c2d37d247da3f4198 @@ -14200,7 +13195,7 @@ __metadata: languageName: node linkType: hard -"tinyglobby@npm:^0.2.13, tinyglobby@npm:^0.2.15, tinyglobby@npm:^0.2.9": +"tinyglobby@npm:^0.2.15, tinyglobby@npm:^0.2.9": version: 0.2.15 resolution: "tinyglobby@npm:0.2.15" dependencies: @@ -14217,13 +13212,6 @@ __metadata: languageName: node linkType: hard -"tldts-core@npm:^6.1.61": - version: 6.1.61 - resolution: "tldts-core@npm:6.1.61" - checksum: 10/44e80c5e587ab868750613336ac43ec1164d112d394958c220e54820595f3bf7b443a30ef6c73cd99234a897e41b70a4102a2fb8a9d7b40854973ed4e73c75d7 - languageName: node - linkType: hard - "tldts-core@npm:^7.0.17": version: 7.0.17 resolution: "tldts-core@npm:7.0.17" @@ -14231,17 +13219,6 @@ __metadata: languageName: node linkType: hard -"tldts@npm:^6.1.32": - version: 6.1.61 - resolution: "tldts@npm:6.1.61" - dependencies: - tldts-core: "npm:^6.1.61" - bin: - tldts: bin/cli.js - checksum: 10/dd2e1783fa0be71276e303be7a33f2746777e49eb0783452b42501edfc5a33b4396b54bd49b9268fc7e71a7fec58fb91064bdc4c4a50e1a1ada615e57ffa4bd8 - languageName: node - linkType: hard - "tldts@npm:^7.0.5": version: 7.0.17 resolution: "tldts@npm:7.0.17" @@ -14253,13 +13230,6 @@ __metadata: languageName: node linkType: hard -"tmp@npm:~0.2.4": - version: 0.2.5 - resolution: "tmp@npm:0.2.5" - checksum: 10/dd4b78b32385eab4899d3ae296007b34482b035b6d73e1201c4a9aede40860e90997a1452c65a2d21aee73d53e93cd167d741c3db4015d90e63b6d568a93d7ec - languageName: node - linkType: hard - "to-regex-range@npm:^5.0.1": version: 5.0.1 resolution: "to-regex-range@npm:5.0.1" @@ -14276,15 +13246,6 @@ __metadata: languageName: node linkType: hard -"tough-cookie@npm:^5.0.0": - version: 5.0.0 - resolution: "tough-cookie@npm:5.0.0" - dependencies: - tldts: "npm:^6.1.32" - checksum: 10/a98d3846ed386e399e8b470c1eb08a6a296944246eabc55c9fe79d629bd2cdaa62f5a6572f271fe0060987906bd20468d72a219a3b4cbe51086bea48d2d677b6 - languageName: node - linkType: hard - "tough-cookie@npm:^6.0.0": version: 6.0.0 resolution: "tough-cookie@npm:6.0.0" @@ -14310,15 +13271,6 @@ __metadata: languageName: node linkType: hard -"tree-kill@npm:1.2.2": - version: 1.2.2 - resolution: "tree-kill@npm:1.2.2" - bin: - tree-kill: cli.js - checksum: 10/49117f5f410d19c84b0464d29afb9642c863bc5ba40fcb9a245d474c6d5cc64d1b177a6e6713129eb346b40aebb9d4631d967517f9fbe8251c35b21b13cd96c7 - languageName: node - linkType: hard - "treeverse@npm:^3.0.0": version: 3.0.0 resolution: "treeverse@npm:3.0.0" @@ -14414,15 +13366,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@npm:^0.0.6": version: 0.0.6 resolution: "tunnel@npm:0.0.6" @@ -14501,13 +13444,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" @@ -14524,13 +13460,6 @@ __metadata: languageName: node linkType: hard -"type-fest@npm:^0.21.3": - version: 0.21.3 - resolution: "type-fest@npm:0.21.3" - checksum: 10/f4254070d9c3d83a6e573bcb95173008d73474ceadbbf620dd32d273940ca18734dff39c2b2480282df9afe5d1675ebed5499a00d791758748ea81f61a38961f - languageName: node - linkType: hard - "type-fest@npm:^0.6.0": version: 0.6.0 resolution: "type-fest@npm:0.6.0" @@ -14538,13 +13467,6 @@ __metadata: languageName: node linkType: hard -"type-fest@npm:^0.8.0": - version: 0.8.1 - resolution: "type-fest@npm:0.8.1" - checksum: 10/fd4a91bfb706aeeb0d326ebd2e9a8ea5263979e5dec8d16c3e469a5bd3a946e014a062ef76c02e3086d3d1c7209a56a20a4caafd0e9f9a5c2ab975084ea3d388 - languageName: node - linkType: hard - "type-fest@npm:^1.0.1": version: 1.4.0 resolution: "type-fest@npm:1.4.0" @@ -14903,13 +13825,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.1": version: 1.1.1 resolution: "update-browserslist-db@npm:1.1.1" @@ -14956,15 +13871,6 @@ __metadata: languageName: node linkType: hard -"uuid@npm:^8.3.2": - version: 8.3.2 - resolution: "uuid@npm:8.3.2" - bin: - uuid: dist/bin/uuid - checksum: 10/9a5f7aa1d6f56dd1e8d5f2478f855f25c645e64e26e347a98e98d95781d5ed20062d6cca2eecb58ba7c84bc3910be95c0451ef4161906abaab44f9cb68ffbdd1 - languageName: node - linkType: hard - "v8-compile-cache-lib@npm:^3.0.1": version: 3.0.1 resolution: "v8-compile-cache-lib@npm:3.0.1" @@ -15003,17 +13909,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-bundle-analyzer@npm:^1.2.3": version: 1.2.3 resolution: "vite-bundle-analyzer@npm:1.2.3" @@ -15386,21 +14281,6 @@ __metadata: languageName: node linkType: hard -"wait-on@npm:8.0.5": - version: 8.0.5 - resolution: "wait-on@npm:8.0.5" - dependencies: - axios: "npm:^1.12.1" - joi: "npm:^18.0.1" - lodash: "npm:^4.17.21" - minimist: "npm:^1.2.8" - rxjs: "npm:^7.8.2" - bin: - wait-on: bin/wait-on - checksum: 10/edfee086741a8630d583cb7799c7ef701d27c162cf3fea5aa7670f53a05cac572951a7070b624cff7d123f15c975e0ceceee37fc230fa68fb0b9e7a0b71ae467 - languageName: node - linkType: hard - "walk-up-path@npm:^4.0.0": version: 4.0.0 resolution: "walk-up-path@npm:4.0.0" @@ -15601,17 +14481,6 @@ __metadata: languageName: node linkType: hard -"wrap-ansi@npm:^6.2.0": - version: 6.2.0 - resolution: "wrap-ansi@npm:6.2.0" - dependencies: - ansi-styles: "npm:^4.0.0" - string-width: "npm:^4.1.0" - strip-ansi: "npm:^6.0.0" - checksum: 10/0d64f2d438e0b555e693b95aee7b2689a12c3be5ac458192a1ce28f542a6e9e59ddfecc37520910c2c88eb1f82a5411260566dba5064e8f9895e76e169e76187 - languageName: node - linkType: hard - "wrap-ansi@npm:^8.1.0": version: 8.1.0 resolution: "wrap-ansi@npm:8.1.0"