diff --git a/.github/actions/pnpm-install/action.yml b/.github/actions/pnpm-install/action.yml index fa18384a880..db110e7a22d 100644 --- a/.github/actions/pnpm-install/action.yml +++ b/.github/actions/pnpm-install/action.yml @@ -4,18 +4,12 @@ description: Restore node_modules and cache, then run pnpm install runs: using: composite steps: - - uses: actions/cache@v4 - with: - path: | - node_modules - **/node_modules - /home/runner/.cache/pnpm - /home/runner/.cache/Cypress - /home/runner/.pnpm-store - key: pnpm-${{ runner.os }}-${{ hashFiles('./pnpm-lock.yaml') }} + - uses: pnpm/action-setup@v4 - uses: actions/setup-node@v4 with: - node-version-file: .nvmrc - - uses: pnpm/action-setup@v4 + cache: 'pnpm' + node-version-file: '.nvmrc' + - run: pnpm --version + shell: bash - run: pnpm i --frozen-lockfile shell: bash diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 02caa559414..f00c0a5f41c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -67,7 +67,7 @@ jobs: steps: - uses: actions/checkout@v4 - uses: ./.github/actions/pnpm-install - - run: pnpm run test + - run: pnpm run test --project unit working-directory: ./packages/vuetify test-e2e: @@ -78,20 +78,8 @@ jobs: steps: - uses: actions/checkout@v4 - uses: ./.github/actions/pnpm-install - - run: pnpm cy:run --record --parallel --ci-build-id $GITHUB_RUN_ID - if: ${{ !startswith(github.ref, 'refs/tags/v') && github.repository_owner == 'vuetifyjs' }} + - run: pnpm run test --project browser working-directory: ./packages/vuetify - env: - CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }} - - run: pnpm cy:run - if: ${{ !startswith(github.ref, 'refs/tags/v') && github.repository_owner != 'vuetifyjs' }} - working-directory: ./packages/vuetify - - uses: actions/upload-artifact@v3 - if: failure() - with: - name: cypress-screenshots - path: ./packages/vuetify/cypress/screenshots/ - if-no-files-found: ignore deploy: needs: [lint, test-unit, test-e2e, build-vuetify] diff --git a/.gitignore b/.gitignore index e556fb4f513..f433d067efa 100644 --- a/.gitignore +++ b/.gitignore @@ -21,5 +21,8 @@ coverage/ cypress/screenshots cypress/videos +# vitest +__screenshots__/ + .vercel .now diff --git a/eslint-local-rules.js b/eslint-local-rules.js index ca3301bfd2b..8bbba50c890 100644 --- a/eslint-local-rules.js +++ b/eslint-local-rules.js @@ -6,7 +6,6 @@ module.exports = { 'jsx-condition-key': require('./scripts/rules/jsx-condition-key'), 'jsx-curly-spacing': require('./scripts/rules/jsx-curly-spacing'), 'vitest-global-imports': require('./scripts/rules/vitest-global-imports'), - 'cypress-types-reference': require('./scripts/rules/cypress-types-reference'), 'sort-imports': require('./scripts/rules/sort-imports'), 'no-nullish-coalescing-in-condition': require('./scripts/rules/no-nullish-coalescing-in-condition'), } diff --git a/package.json b/package.json index 5ba44417d02..037d29e737f 100755 --- a/package.json +++ b/package.json @@ -85,12 +85,15 @@ "vue-tsc": "^2.0.29", "yargs": "^17.7.2" }, - "packageManager": "pnpm@9.6.0", + "packageManager": "pnpm@9.10.0", "pnpm": { "patchedDependencies": { - "@mdi/js@7.4.47": "patches/@mdi__js@7.4.47.patch" + "@mdi/js@7.4.47": "patches/@mdi__js@7.4.47.patch", + "@testing-library/vue": "patches/@testing-library__vue.patch" }, "overrides": { + "@testing-library/dom": "npm:@vuetify/testing-library-dom@1.0.2", + "@types/node": "22.5.4", "tough-cookie": "5.0.0-rc.4" } } diff --git a/packages/docs/package.json b/packages/docs/package.json index 576eed5dea9..7ef5614fb64 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -81,7 +81,7 @@ "unplugin-auto-import": "0.17.5", "unplugin-fonts": "1.0.3", "unplugin-vue-components": "^0.27.4", - "vite": "^5.4.0", + "vite": "^5.4.3", "vite-plugin-md": "^0.21.5", "vite-plugin-pages": "^0.32.1", "vite-plugin-pwa": "^0.17.4", diff --git a/packages/vuetify/.eslintignore b/packages/vuetify/.eslintignore index e0a4dbe295d..bb42ae50b64 100644 --- a/packages/vuetify/.eslintignore +++ b/packages/vuetify/.eslintignore @@ -9,3 +9,5 @@ /lib-temp/ /dist/ /cypress/ +*.spec.cy.ts +*.spec.cy.tsx diff --git a/packages/vuetify/.eslintrc.js b/packages/vuetify/.eslintrc.js index f2a2419c247..78f656db0c4 100644 --- a/packages/vuetify/.eslintrc.js +++ b/packages/vuetify/.eslintrc.js @@ -44,46 +44,20 @@ module.exports = { }, }, { - files: '**/*.spec.{ts,tsx}', - env: { - 'jest/globals': true, - }, - plugins: ['jest'], - extends: ['plugin:jest/recommended'], + files: '**/*.spec.?(browser.){ts,tsx}', + plugins: ['vitest'], + extends: ['plugin:vitest/recommended'], rules: { 'local-rules/vitest-global-imports': 'error', 'no-restricted-imports': 'off', - 'jest/no-disabled-tests': 'off', - 'jest/no-large-snapshots': 'warn', - 'jest/prefer-spy-on': 'warn', - 'jest/prefer-to-be': 'warn', - 'jest/prefer-to-contain': 'warn', - 'jest/prefer-to-have-length': 'warn', - 'jest/no-standalone-expect': 'off', - 'jest/no-conditional-expect': 'off', - 'jest/no-identical-title': 'off', - }, - }, - { - files: '**/*.spec.cy.{ts,tsx}', - env: { - 'cypress/globals': true, - }, - plugins: ['cypress'], - extends: ['plugin:cypress/recommended'], - rules: { - 'local-rules/cypress-types-reference': 'error', - - 'no-restricted-imports': 'off', - - 'no-unused-expressions': 'off', - 'cypress/no-assigning-return-values': 'error', - 'cypress/no-unnecessary-waiting': 'warn', - 'cypress/assertion-before-screenshot': 'warn', - 'cypress/no-async-tests': 'error', - 'cypress/unsafe-to-chain-command': 'off', + 'vitest/no-commented-out-tests': 'off', + 'vitest/no-large-snapshots': 'warn', + 'vitest/prefer-spy-on': 'warn', + 'vitest/prefer-to-be': 'warn', + 'vitest/prefer-to-contain': 'warn', + 'vitest/prefer-to-have-length': 'warn', }, }, ], diff --git a/packages/vuetify/cypress.config.ts b/packages/vuetify/cypress.config.ts deleted file mode 100644 index 7d17f380bca..00000000000 --- a/packages/vuetify/cypress.config.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { defineConfig } from 'cypress' - -export default defineConfig({ - projectId: '5w5r1i', - component: { - devServer: { - framework: 'vue', - bundler: 'vite', - }, - specPattern: './src/**/*.spec.cy.{js,jsx,ts,tsx}', - supportFile: './cypress/support/index.ts', - video: false, - }, - viewportWidth: 1280, - viewportHeight: 825, -}) diff --git a/packages/vuetify/cypress/fixtures/example.json b/packages/vuetify/cypress/fixtures/example.json deleted file mode 100644 index 02e4254378e..00000000000 --- a/packages/vuetify/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/packages/vuetify/cypress/fixtures/text.txt b/packages/vuetify/cypress/fixtures/text.txt deleted file mode 100644 index 5b9c8aaf391..00000000000 --- a/packages/vuetify/cypress/fixtures/text.txt +++ /dev/null @@ -1 +0,0 @@ -This is just a simple text file. diff --git a/packages/vuetify/cypress/support/component-index.html b/packages/vuetify/cypress/support/component-index.html deleted file mode 100644 index 959c8bce4aa..00000000000 --- a/packages/vuetify/cypress/support/component-index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - -
- - diff --git a/packages/vuetify/cypress/support/index.ts b/packages/vuetify/cypress/support/index.ts deleted file mode 100644 index c4970b35c36..00000000000 --- a/packages/vuetify/cypress/support/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -import '@percy/cypress' -import 'cypress-file-upload' -import 'cy-mobile-commands' -import 'cypress-real-events/support' -import '@mdi/font/css/materialdesignicons.css' -import './mount' -import './selector' diff --git a/packages/vuetify/cypress/support/mount.ts b/packages/vuetify/cypress/support/mount.ts deleted file mode 100644 index bd328bc9ad6..00000000000 --- a/packages/vuetify/cypress/support/mount.ts +++ /dev/null @@ -1,74 +0,0 @@ -/// -import '../../src/styles/main.sass' -import type { VueWrapper } from '@vue/test-utils' -import { mount as cyMount } from 'cypress/vue' -import { createVuetify } from '../../src/framework' -import { mergeDeep } from '../../src/util' -import { aliases } from '../../src/iconsets/mdi-svg' - -/** - * @example - * cy.mount(My button) - */ -Cypress.Commands.add('mount', (component, options, vuetifyOptions) => { - const root = document.getElementById('cy-root')! - - // add the v-application class that allows Vuetify styles to work - if (!root.classList.contains('v-locale--is-rtl')) { - root.classList.add('v-locale--is-ltr') - } - - const vuetify = createVuetify(mergeDeep({ - icons: { aliases }, - }, vuetifyOptions)) - const defaultOptions = { - global: { - stubs: { - transition: false, - 'transition-group': false, - }, - plugins: [vuetify], - }, - } - - const mountOptions = mergeDeep(defaultOptions, options!, (a, b) => a.concat(b)) - - return cyMount(component, mountOptions) - .then(({ wrapper }) => { - cy.wrap(wrapper).as('wrapper') - }) -}) - -Cypress.Commands.add('vue', () => { - return cy.get>('@wrapper') -}) - -/** - * Update the props and wait for Vue to re-render. - * Must be chained of a chain that starts with `cy.mount`. - * - * @example - * cy.mount(My button) - * .get('button'). - * .should('not.have.class', 'v-btn--disabled') - * .setProps({ disabled: true }). - * .get('button') - * .should('have.class', 'v-btn--disabled') - */ - -Cypress.Commands.add('setProps', (props: Record = {}) => { - return cy.get>('@wrapper').then(async wrapper => { - await wrapper.setProps(props) - return wrapper - }) -}) - -Cypress.Commands.add('emitted', (selector: Parameters[0], event?: string) => { - return cy.get>('@wrapper').then(wrapper => { - const cmp = wrapper.findComponent(selector) - - if (!cmp) return cy.wrap({}) - - return cy.wrap(event ? cmp.emitted(event) : cmp.emitted()) - }) -}) diff --git a/packages/vuetify/cypress/support/selector.ts b/packages/vuetify/cypress/support/selector.ts deleted file mode 100644 index 390bf47612c..00000000000 --- a/packages/vuetify/cypress/support/selector.ts +++ /dev/null @@ -1,5 +0,0 @@ -/// - -Cypress.Commands.add('getBySel', (selector, ...args) => { - return cy.get(`[data-test=${selector}]`, ...args) as any -}) diff --git a/packages/vuetify/package.json b/packages/vuetify/package.json index 8def3ada4c8..34fc843901b 100755 --- a/packages/vuetify/package.json +++ b/packages/vuetify/package.json @@ -109,11 +109,14 @@ "build:types": "rimraf types-temp && tsc --pretty --emitDeclarationOnly -p tsconfig.dist.json && rollup --config build/rollup.types.config.mjs && rimraf types-temp", "tsc": "tsc", "test": "vitest", + "test:unit": "vitest --project unit", + "test:browser": "vitest --project browser", + "test:open": "TEST_BAIL=1 vitest --project browser -w", "test:coverage": "pnpm run test --coverage", + "test:percy": "percy exec -- vitest --project browser", + "test:all": "concurrently -gr 'vitest --project unit' 'vitest --project browser --shard=1/5' 'vitest --project browser --shard=2/5' 'vitest --project browser --shard=3/5' 'vitest --project browser --shard=4/5' 'vitest --project browser --shard=5/5'", "lint": "concurrently -n \"tsc,eslint\" --kill-others-on-fail \"tsc -p tsconfig.checks.json --noEmit --pretty\" \"eslint src -f codeframe --max-warnings 0\"", - "lint:fix": "concurrently -n \"tsc,eslint\" \"tsc -p tsconfig.checks.json --noEmit --pretty\" \"eslint --fix src\"", - "cy:open": "cypress open --component -b electron", - "cy:run": "percy exec -- cypress run --component" + "lint:fix": "concurrently -n \"tsc,eslint\" \"tsc -p tsconfig.checks.json --noEmit --pretty\" \"eslint --fix src\"" }, "devDependencies": { "@date-io/core": "3.0.0", @@ -123,17 +126,22 @@ "@fortawesome/fontawesome-svg-core": "^6.5.2", "@fortawesome/free-solid-svg-icons": "^6.5.2", "@fortawesome/vue-fontawesome": "^3.0.6", - "@percy/cli": "^1.28.2", - "@percy/cypress": "^3.1.2", + "@percy/cli": "^1.29.3", + "@percy/sdk-utils": "^1.29.3", "@rollup/plugin-alias": "^5.1.0", "@rollup/plugin-babel": "^6.0.4", "@rollup/plugin-node-resolve": "^15.2.3", "@rollup/plugin-typescript": "^11.1.6", - "@types/node": "^20.12.7", + "@testing-library/dom": "npm:@vuetify/testing-library-dom@1.0.2", + "@testing-library/user-event": "^14.5.2", + "@testing-library/vue": "^8.1.0", + "@types/node": "^22.5.4", "@types/resize-observer-browser": "^0.1.11", "@vitejs/plugin-vue": "^5.0.4", "@vitejs/plugin-vue-jsx": "^3.1.0", + "@vitest/browser": "^2.0.5", "@vitest/coverage-v8": "^2.0.5", + "@vitest/ui": "^2.0.5", "@vue/babel-plugin-jsx": "^1.2.2", "@vue/shared": "^3.4.27", "@vue/test-utils": "2.4.6", @@ -147,19 +155,17 @@ "cssnano": "^6.1.2", "csstype": "^3.1.3", "cy-mobile-commands": "^0.3.0", - "cypress": "^13.7.2", - "cypress-file-upload": "^5.0.8", - "cypress-real-events": "^1.12.0", "date-fns": "^3.6.0", "dotenv": "^16.4.5", - "eslint-plugin-cypress": "^2.15.1", "eslint-plugin-jest": "^28.7.0", + "eslint-plugin-vitest": "0.4.1", "expect": "^28.1.3", "fast-glob": "^3.3.2", "identity-obj-proxy": "^3.0.0", "jsdom": "^25.0.0", "micromatch": "^4.0.5", "postcss": "^8.4.38", + "roboto-fontface": "^0.10.0", "rollup": "^3.20.7", "rollup-plugin-dts": "^6.1.0", "rollup-plugin-sass": "^1.12.21", @@ -169,11 +175,12 @@ "unplugin-auto-import": "0.17.5", "unplugin-vue-components": "^0.27.4", "upath": "^2.0.1", - "vite": "^5.4.0", + "vite": "^5.4.3", "vite-ssr": "^0.17.1", "vitest": "^2.0.5", "vue-i18n": "^9.7.1", - "vue-router": "^4.3.0" + "vue-router": "^4.3.0", + "webdriverio": "^8.40.5" }, "peerDependencies": { "typescript": ">=4.7", diff --git a/packages/vuetify/src/__tests__/framework.spec.ts b/packages/vuetify/src/__tests__/framework.spec.browser.ts similarity index 97% rename from packages/vuetify/src/__tests__/framework.spec.ts rename to packages/vuetify/src/__tests__/framework.spec.browser.ts index 14031435f5a..49835d33266 100644 --- a/packages/vuetify/src/__tests__/framework.spec.ts +++ b/packages/vuetify/src/__tests__/framework.spec.browser.ts @@ -1,6 +1,5 @@ // Utilities import { mount } from '@vue/test-utils' -import { expect, it } from 'vitest' import { createVuetify } from '@/framework' describe('framework', () => { diff --git a/packages/vuetify/src/components.d.ts b/packages/vuetify/src/components.d.ts deleted file mode 100644 index 4edc351177c..00000000000 --- a/packages/vuetify/src/components.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* eslint-disable */ -// @ts-nocheck -// Generated by unplugin-vue-components -// Read more: https://github.com/vuejs/core/pull/3399 -export {} - -/* prettier-ignore */ -declare module 'vue' { - export interface GlobalComponents { - RouterLink: typeof import('vue-router')['RouterLink'] - RouterView: typeof import('vue-router')['RouterView'] - } -} diff --git a/packages/vuetify/src/components/VAlert/__tests__/VAlert.spec.cy.tsx b/packages/vuetify/src/components/VAlert/__tests__/VAlert.spec.browser.tsx similarity index 61% rename from packages/vuetify/src/components/VAlert/__tests__/VAlert.spec.cy.tsx rename to packages/vuetify/src/components/VAlert/__tests__/VAlert.spec.browser.tsx index 92889871975..dde9b7fdce6 100644 --- a/packages/vuetify/src/components/VAlert/__tests__/VAlert.spec.cy.tsx +++ b/packages/vuetify/src/components/VAlert/__tests__/VAlert.spec.browser.tsx @@ -1,7 +1,7 @@ -/// - import { VAlert } from '..' -import { generate } from '@/../cypress/templates' + +// Utilities +import { generate, render } from '@test' const defaultColors = ['success', 'info', 'warning', 'error', 'invalid'] @@ -19,8 +19,8 @@ const stories = { // Tests describe('VAlert', () => { describe('color', () => { - it('supports default color props', () => { - cy.mount(() => ( + it('supports default color props', async () => { + const { container } = render(() => ( <> { defaultColors.map((color, idx) => ( @@ -29,13 +29,14 @@ describe('VAlert', () => { ))} )) - .get('.v-alert') - .should('have.length', defaultColors.length) - .then(subjects => { - Array.from(subjects).forEach((subject, idx) => { - expect(subject).to.contain(defaultColors[idx]) - }) - }) + + const alerts = container.querySelectorAll('.v-alert') + expect(alerts).toHaveLength(defaultColors.length) + + Array.from(alerts).forEach((alert, idx) => { + // TODO: useless assert + expect(alert).toHaveTextContent(defaultColors[idx]) + }) }) }) diff --git a/packages/vuetify/src/components/VAutocomplete/__tests__/VAutocomplete.spec.browser.tsx b/packages/vuetify/src/components/VAutocomplete/__tests__/VAutocomplete.spec.browser.tsx new file mode 100644 index 00000000000..65c516a4df2 --- /dev/null +++ b/packages/vuetify/src/components/VAutocomplete/__tests__/VAutocomplete.spec.browser.tsx @@ -0,0 +1,639 @@ +// Components +import { VAutocomplete } from '../VAutocomplete' +import { VForm } from '@/components/VForm' + +// Utilities +import { generate, render, screen, userEvent, waitAnimationFrame, waitIdle } from '@test' +import { findAllByRole, queryAllByRole, within } from '@testing-library/vue' +import { cloneVNode, ref } from 'vue' + +const variants = ['underlined', 'outlined', 'filled', 'solo', 'plain'] as const +const densities = ['default', 'comfortable', 'compact'] as const +const items = ['California', 'Colorado', 'Florida', 'Georgia', 'Texas', 'Wyoming'] as const + +const stories = Object.fromEntries(Object.entries({ + 'Default input': , + Disabled: , + Affixes: , + 'Prepend/append': , + 'Prepend/append inner': , + Placeholder: , +}).map(([k, v]) => [k, ( +
+ { variants.map(variant => ( + densities.map(density => ( +
+ { cloneVNode(v, { variant, density, label: `${variant} ${density}` }) } + { cloneVNode(v, { variant, density, label: `with value`, modelValue: ['California'] }) } + { cloneVNode(v, { variant, density, label: `chips`, chips: true, modelValue: ['California'] }) } + {{ + selection: ({ item }) => { + return item.title + }, + }} + +
+ )) + )).flat()} +
+)])) + +describe('VAutocomplete', () => { + it('should close only first chip', async () => { + const items = ['Item 1', 'Item 2', 'Item 3', 'Item 4'] + + const selectedItems = ref(['Item 1', 'Item 2', 'Item 3']) + + render(() => ( + + )) + + const closeButtons = await screen.findAllByTestId('close-chip') + await userEvent.click(closeButtons[0]) + + expect(selectedItems.value).toEqual(['Item 2', 'Item 3']) + }) + + it('should have selected chip with array of strings', async () => { + const items = ref(['California', 'Colorado', 'Florida']) + + const selectedItems = ref(['California', 'Colorado']) + + const { container } = render(() => ( + + )) + + await userEvent.click(container) + + const menu = await screen.findByRole('listbox') + + let activeItems = await findAllByRole(menu, 'option', { selected: true }) + expect(activeItems).toHaveLength(2) + + await userEvent.click(activeItems[0]) + activeItems = await findAllByRole(menu, 'option', { selected: true }) + expect(activeItems).toHaveLength(1) + expect(selectedItems.value).toEqual(['Colorado']) + + await userEvent.click(await screen.findByTestId('close-chip')) + expect(screen.queryAllByTestId('close-chip')).toHaveLength(0) + expect(selectedItems.value).toEqual([]) + }) + + it('should have selected chip with return-object', async () => { + const items = ref([ + { + title: 'Item 1', + value: 'item1', + }, + { + title: 'Item 2', + value: 'item2', + }, + ]) + + const selectedItems = ref([ + { + title: 'Item 1', + value: 'item1', + }, + ]) + + const { container } = render(() => ( + + )) + + await userEvent.click(container) + + const menu = await screen.findByRole('listbox') + + let activeItems = await findAllByRole(menu, 'option', { selected: true }) + expect(activeItems).toHaveLength(1) + + await userEvent.click(activeItems[0]) + expect(selectedItems.value).toHaveLength(0) + activeItems = queryAllByRole(menu, 'option', { selected: true }) + expect(activeItems).toHaveLength(0) + }) + + it('should work with objects when using multiple and item-value', async () => { + const items = ref([ + { + text: 'Item 1', + id: 'item1', + }, + { + text: 'Item 2', + id: 'item2', + }, + { + text: 'Item 3', + id: 'item3', + }, + ]) + + const selectedItems = ref([ + { + text: 'Item 1', + id: 'item1', + }, + { + text: 'Item 2', + id: 'item2', + }, + ]) + + const { container } = render(() => ( + + )) + + await userEvent.click(container) + + const menu = await screen.findByRole('listbox') + + const activeItems = await findAllByRole(menu, 'option', { selected: true }) + expect(activeItems).toHaveLength(2) + + const input = await screen.findByRole('combobox') + expect(input).toHaveTextContent('Item 1') + expect(input).toHaveTextContent('Item 2') + + await userEvent.click(activeItems[0]) + + expect(input).not.toHaveTextContent('Item 1') + expect(input).toHaveTextContent('Item 2') + expect(selectedItems.value).toEqual([{ + text: 'Item 2', + id: 'item2', + }]) + }) + + it('should not be clickable when in readonly', async () => { + const items = ['Item 1', 'Item 2', 'Item 3', 'Item 4'] + + const selectedItems = 'Item 1' + + const { element } = render(() => ( + + )) + + await userEvent.click(element) + + expect(screen.queryAllByRole('listbox')).toHaveLength(0) + expect(element).not.toHaveClass('v-select--active-menu') + + screen.getByCSS('input').focus() + await userEvent.keyboard('{ArrowDown}') + + expect(screen.queryAllByRole('listbox')).toHaveLength(0) + expect(element).not.toHaveClass('v-select--active-menu') + }) + + it('should not be clickable when in readonly form', async () => { + const items = ['Item 1', 'Item 2', 'Item 3', 'Item 4'] + + const selectedItems = 'Item 1' + + render(() => ( + + + + )) + + const element = screen.getByCSS('.v-autocomplete') + + await userEvent.click(element) + expect(screen.queryAllByRole('listbox')).toHaveLength(0) + expect(element).not.toHaveClass('v-select--active-menu') + + screen.getByCSS('input').focus() + await userEvent.keyboard('{ArrowDown}') + + expect(screen.queryAllByRole('listbox')).toHaveLength(0) + expect(element).not.toHaveClass('v-select--active-menu') + }) + + it('should remove selection if search is cleared', async () => { + const items = ref([ + { title: 'Item 1', value: 'Item 1' }, + { title: 'Item 2', value: 'Item 2' }, + ]) + + const selectedItems = ref(null) + + const { element } = render(() => ( + + )) + + await userEvent.click(element) + const options = await screen.findAllByRole('option') + expect(options).toHaveLength(2) + + await userEvent.click(options[0]) + + await userEvent.click(element) + await userEvent.keyboard('{Control>}a{/Ctrl}{Backspace}') + await userEvent.click(document.body) + + expect(element).not.toHaveTextContent('Item 1') + }) + + // https://github.com/vuetifyjs/vuetify/issues/16210 + it('should return item object as the argument of item-title function', async () => { + const items = [ + { id: 1, name: 'a' }, + { id: 2, name: 'b' }, + ] + + const selectedItems = ref(null) + + const itemTitle = vi.fn((item: any) => { + return 'Item: ' + JSON.stringify(item) + }) + + const { element } = render(() => ( + + )) + + await userEvent.click(element) + + await userEvent.click(screen.getAllByRole('option')[0]) + expect(selectedItems.value).toBe(1) + + expect(itemTitle).toHaveBeenCalledWith({ id: 1, name: 'a' }, expect.anything()) + + expect(element).toHaveTextContent('Item: {"id":1,"name":"a"}') + }) + + // https://github.com/vuetifyjs/vuetify/issues/16442 + describe('null value', () => { + it('should allow null as legit itemValue', async () => { + const items = [ + { name: 'Default Language', code: null }, + { code: 'en-US', name: 'English' }, + { code: 'de-DE', name: 'German' }, + ] + + const selectedItems = null + + const { element } = render(() => ( + + )) + + expect(element).toHaveTextContent('Default Language') + }) + + it('should mark input as "not dirty" when the v-model is null, but null is not present in the items', async () => { + const items = [ + { code: 'en-US', name: 'English' }, + { code: 'de-DE', name: 'German' }, + ] + + const { container } = render(() => ( + + )) + + expect(container.querySelector('.v-field')).not.toHaveClass('v-field--dirty') + }) + }) + + describe('hide-selected', () => { + it('should hide selected item(s)', async () => { + const items = ['Item 1', 'Item 2', 'Item 3', 'Item 4'] + const selectedItems = ['Item 1', 'Item 2'] + + render(() => ( + + )) + + const menuIcon = screen.getByRole('button', { name: /open/i }) + await userEvent.click(menuIcon) + + const listItems = screen.getAllByRole('option') + expect(listItems).toHaveLength(2) + expect(listItems[0]).toHaveTextContent('Item 3') + expect(listItems[1]).toHaveTextContent('Item 4') + }) + }) + + // https://github.com/vuetifyjs/vuetify/issues/16055 + it('should not replicate html select hotkeys in v-autocomplete', async () => { + const items = ref(['aaa', 'foo', 'faa']) + + const selectedItems = ref(undefined) + + const { element } = render(() => ( + + )) + + await userEvent.type(element, 'f') + const listItems = screen.getAllByRole('option') + expect(listItems).toHaveLength(2) + expect(selectedItems.value).toBeUndefined() + }) + + it('should conditionally show placeholder', async () => { + const { rerender, getByCSS } = render(VAutocomplete, { + props: { placeholder: 'Placeholder' }, + }) + + const input = getByCSS('input') + expect(input).toHaveAttribute('placeholder', 'Placeholder') + + await rerender({ label: 'Label' }) + expect(input).not.toBeVisible() + + input.focus() + await waitAnimationFrame() + expect(input).toHaveAttribute('placeholder', 'Placeholder') + expect(input).toBeVisible() + + input.blur() + await rerender({ persistentPlaceholder: true }) + expect(input).toHaveAttribute('placeholder', 'Placeholder') + expect(input).toBeVisible() + + await rerender({ modelValue: 'Foobar' }) + expect(input).not.toHaveAttribute('placeholder') + + await rerender({ multiple: true, modelValue: ['Foobar'] }) + expect(input).not.toHaveAttribute('placeholder') + }) + + it('should keep TextField focused while selecting items from open menu', async () => { + const { element } = render(() => ( + + )) + + await userEvent.click(element) + + await userEvent.keyboard('{ArrowDown}{ArrowDown}{ArrowDown}c') + + expect(document.activeElement).toBe(within(element).getByCSS('input')) + }) + + it('should not open menu when closing a chip', async () => { + const { element } = render(() => ( + + )) + + expect(screen.queryByRole('listbox')).toBeNull() + + await userEvent.click(screen.getAllByTestId('close-chip')[0]) + await waitAnimationFrame() + expect(screen.queryByRole('listbox')).toBeNull() + + await userEvent.click(screen.getAllByTestId('close-chip')[0]) + await waitAnimationFrame() + expect(screen.queryByRole('listbox')).toBeNull() + + await userEvent.click(element) + await screen.findByRole('listbox') + + await userEvent.keyboard('{Escape}') + await expect.poll(() => screen.queryByRole('listbox')).toBeNull() + }) + + describe('auto-select-first', () => { + async function setup () { + const selectedItems = ref() + const { element } = render(() => ( + + )) + const getItems = () => screen.queryAllByRole('option') + + await userEvent.click(element) + await expect.poll(getItems).toHaveLength(6) + + await userEvent.keyboard('Cal') + await expect.poll(() => getItems()[0]).toHaveClass('v-list-item--active') + + return { selectedItems, element, getItems } + } + + it('should auto-select-first item when pressing enter', async () => { + const { selectedItems, getItems } = await setup() + + await userEvent.keyboard('{Enter}') + await expect.poll(getItems).toHaveLength(1) + expect(selectedItems.value).toStrictEqual(['California']) + }) + + it('should auto-select-first item when pressing tab', async () => { + const { selectedItems, getItems } = await setup() + + await userEvent.keyboard('{Tab}') + await expect.poll(getItems).toHaveLength(0) + expect(selectedItems.value).toStrictEqual(['California']) + }) + + it('should not auto-select-first item when blur', async () => { + const { selectedItems, getItems } = await setup() + + await userEvent.click(document.body) + await expect.poll(getItems).toHaveLength(0) + expect(selectedItems.value).toBeUndefined() + }) + }) + + // https://github.com/vuetifyjs/vuetify/issues/18796 + // https://github.com/vuetifyjs/vuetify/issues/19235 + it('should allow deleting single selection via closable-chips', async () => { + const selectedItem = ref('California') + + const { getByTestId } = render(() => ( + + )) + + await userEvent.click(getByTestId('close-chip')) + expect(selectedItem.value).toBeNull() + }) + + it('should allow deleting multiple selection via closable-chips', async () => { + const selectedItem = ref(['California']) + + const { getByTestId } = render(() => ( + + )) + + await userEvent.click(getByTestId('close-chip')) + expect(selectedItem.value).toHaveLength(0) + }) + + // https://github.com/vuetifyjs/vuetify/issues/19261 + it('should not remove single selection on list item click', async () => { + const selectedItem = ref('abc') + + const { element } = render(() => ( + + )) + + await userEvent.click(element) + + const items = await screen.findAllByRole('option') + expect(items).toHaveLength(2) + + await userEvent.click(items[0]) + await waitAnimationFrame() + expect(selectedItem.value).toBe('abc') + }) + + // https://github.com/vuetifyjs/vuetify/issues/18556 + it('should show menu if focused and items are added', async () => { + const { rerender } = render(VAutocomplete) + + await userEvent.keyboard('{Tab}') + await waitAnimationFrame() + expect(screen.queryByRole('listbox')).toBeNull() + + await rerender({ items: ['Foo', 'Bar'] }) + expect(await screen.findByRole('listbox')).toBeInTheDocument() + }) + + // https://github.com/vuetifyjs/vuetify/issues/19346 + it('should not show menu when focused and existing non-empty items are changed', async () => { + const { element, rerender } = render(VAutocomplete, { + props: { items: ['Foo', 'Bar'] }, + }) + + await userEvent.click(element) + expect(await screen.findByRole('listbox')).toBeInTheDocument() + + await userEvent.click(screen.getAllByRole('option')[0]) + await rerender({ items: ['Foo', 'Bar', 'test', 'test 2'] }) + await waitIdle() + await expect.poll(() => screen.queryByRole('listbox')).toBeNull() + }) + + // https://github.com/vuetifyjs/vuetify/issues/17573 + // When using selection slot or chips, input displayed next to chip/selection slot should be always empty + it('should always have empty input value when it is unfocused and when using selection slot or chips', async () => { + const items = ['Item 1', 'Item 2', 'Item 3', 'Item 4'] + const selectedItem = ref('Item 1') + + const { element, getByCSS } = render(() => ( + + )) + + await userEvent.click(element) + const input = getByCSS('input') + expect(input).toHaveValue('') + + // Blur input with a custom search input value + await userEvent.keyboard('test') + input.blur() + await expect.poll(() => selectedItem.value).toBe('Item 1') + expect(input).toHaveValue('') + + // Search existing item and click to select + await userEvent.click(element) + expect(input).toHaveValue('') + await userEvent.keyboard('Item 1') + await userEvent.click(await screen.findByRole('option')) + await expect.poll(() => selectedItem.value).toBe('Item 1') + }) + + describe('Showcase', () => { + generate({ stories }) + }) +}) diff --git a/packages/vuetify/src/components/VAutocomplete/__tests__/VAutocomplete.spec.cy.tsx b/packages/vuetify/src/components/VAutocomplete/__tests__/VAutocomplete.spec.cy.tsx deleted file mode 100644 index bfc87cf239f..00000000000 --- a/packages/vuetify/src/components/VAutocomplete/__tests__/VAutocomplete.spec.cy.tsx +++ /dev/null @@ -1,658 +0,0 @@ -/// - -// Components -import { VAutocomplete } from '../VAutocomplete' -import { VForm } from '@/components/VForm' - -// Utilities -import { cloneVNode, ref } from 'vue' -import { generate } from '../../../../cypress/templates' -import { keyValues } from '@/util' - -const variants = ['underlined', 'outlined', 'filled', 'solo', 'plain'] as const -const densities = ['default', 'comfortable', 'compact'] as const -const items = ['California', 'Colorado', 'Florida', 'Georgia', 'Texas', 'Wyoming'] as const - -const stories = Object.fromEntries(Object.entries({ - 'Default input': , - Disabled: , - Affixes: , - 'Prepend/append': , - 'Prepend/append inner': , - Placeholder: , -}).map(([k, v]) => [k, ( -
- { variants.map(variant => ( - densities.map(density => ( -
- { cloneVNode(v, { variant, density, label: `${variant} ${density}` }) } - { cloneVNode(v, { variant, density, label: `with value`, modelValue: ['California'] }) } - { cloneVNode(v, { variant, density, label: `chips`, chips: true, modelValue: ['California'] }) } - {{ - selection: ({ item }) => { - return item.title - }, - }} - -
- )) - )).flat()} -
-)])) - -describe('VAutocomplete', () => { - it('should close only first chip', () => { - const items = ['Item 1', 'Item 2', 'Item 3', 'Item 4'] - - const selectedItems = ['Item 1', 'Item 2', 'Item 3'] - - cy.mount(() => ( - - )) - - cy.get('.v-chip__close').eq(0).click() - cy.get('input').should('exist') - cy.get('.v-chip').should('have.length', 2) - }) - - it('should have selected chip with array of strings', () => { - const items = ref(['California', 'Colorado', 'Florida']) - - const selectedItems = ref(['California', 'Colorado']) - - cy.mount(() => ( - - )) - - cy.get('.v-autocomplete__menu-icon').click() - - cy.get('.v-list-item--active').should('have.length', 2) - cy.get('.v-list-item--active input').eq(0).click() - cy.then(() => { - expect(selectedItems.value).to.deep.equal(['Colorado']) - }) - - cy.get('.v-list-item--active').should('have.length', 1) - - cy.get('.v-chip__close').eq(0).click() - cy.get('.v-chip') - .should('have.length', 0) - .should(() => expect(selectedItems.value).to.be.empty) - }) - - it('should have selected chip with return-object', () => { - const items = ref([ - { - title: 'Item 1', - value: 'item1', - }, - { - title: 'Item 2', - value: 'item2', - }, - ]) - - const selectedItems = ref([ - { - title: 'Item 1', - value: 'item1', - }, - ]) - - cy.mount(() => ( - - )) - - cy.get('.v-autocomplete__menu-icon').click() - - cy.get('.v-list-item--active').should('have.length', 1) - cy.get('.v-list-item--active input').click() - cy.then(() => { - expect(selectedItems.value).to.be.empty - }) - cy.get('.v-list-item--active').should('have.length', 0) - }) - - it('should work with objects when using multiple and item-value', () => { - const items = ref([ - { - text: 'Item 1', - id: 'item1', - }, - { - text: 'Item 2', - id: 'item2', - }, - { - text: 'Item 3', - id: 'item3', - }, - ]) - - const selectedItems = ref([ - { - text: 'Item 1', - id: 'item1', - }, - { - text: 'Item 2', - id: 'item2', - }, - ]) - - cy.mount(() => ( - - )) - - cy.get('.v-autocomplete').click() - - cy.get('.v-list-item--active').should('have.length', 2) - cy.get('.v-field__input').should('include.text', 'Item 1') - cy.get('.v-field__input').should('include.text', 'Item 2') - - cy.get('.v-list-item--active input') - .eq(0) - .click() - .get('.v-field__input') - .should(() => expect(selectedItems.value).to.deep.equal([{ - text: 'Item 2', - id: 'item2', - }])) - }) - - it('should not be clickable when in readonly', () => { - const items = ['Item 1', 'Item 2', 'Item 3', 'Item 4'] - - const selectedItems = 'Item 1' - - cy.mount(() => ( - - )) - - cy.get('.v-autocomplete').click() - cy.get('.v-list-item').should('have.length', 0) - cy.get('.v-select--active-menu').should('have.length', 0) - - cy.get('.v-autocomplete input').as('input') - .focus() - cy.get('@input').type('{downarrow}', { force: true }) - cy.get('.v-list-item').should('have.length', 0) - cy.get('.v-select--active-menu').should('have.length', 0) - }) - - it('should not be clickable when in readonly form', () => { - const items = ['Item 1', 'Item 2', 'Item 3', 'Item 4'] - - const selectedItems = 'Item 1' - - cy.mount(() => ( - - - - )) - - cy.get('.v-autocomplete').click() - cy.get('.v-list-item').should('have.length', 0) - cy.get('.v-select--active-menu').should('have.length', 0) - - cy.get('.v-autocomplete input').as('input') - .focus() - cy.get('@input').type('{downarrow}', { force: true }) - cy.get('.v-list-item').should('have.length', 0) - cy.get('.v-select--active-menu').should('have.length', 0) - }) - - it('should be empty when delete the selected option', () => { - const items = ref([ - { title: 'Item 1', value: 'Item 1' }, - { title: 'Item 2', value: 'Item 2' }, - ]) - - const selectedItems = ref(null) - - cy.mount(() => ( - - )) - - cy.get('.v-autocomplete').click() - cy.get('.v-list-item').should('have.length', 2) - cy.get('.v-list-item').contains('Item 1').click() - - cy.get('.v-field__input').clear() - cy.get('body').click('bottomLeft') - cy.get('.v-field__input').should('not.include.text', 'Item 1') - }) - - // https://github.com/vuetifyjs/vuetify/issues/16210 - it('should return item object as the argument of item-title function', () => { - const items = [ - { id: 1, name: 'a' }, - { id: 2, name: 'b' }, - ] - - const selectedItems = ref(null) - - function itemTitleFunc (item: any) { - return 'Item: ' + JSON.stringify(item) - } - - const itemTitleFuncSpy = cy.spy(itemTitleFunc).as('itemTitleFunc') - - cy.mount(() => ( - - )) - - cy.get('.v-autocomplete').click() - - cy.get('.v-list-item').eq(0).click({ waitForAnimations: false }).should(() => { - expect(selectedItems.value).to.deep.equal(1) - }) - - cy.get('@itemTitleFunc') - .should('have.been.calledWith', { id: 1, name: 'a' }) - - cy.get('.v-autocomplete__selection-text').should('have.text', `Item: {"id":1,"name":"a"}`) - }) - - // https://github.com/vuetifyjs/vuetify/issues/16442 - describe('null value', () => { - it('should allow null as legit itemValue', () => { - const items = [ - { name: 'Default Language', code: null }, - { code: 'en-US', name: 'English' }, - { code: 'de-DE', name: 'German' }, - ] - - const selectedItems = null - - cy.mount(() => ( - - )) - - cy.get('.v-autocomplete__selection').eq(0).invoke('text').should('equal', 'Default Language') - }) - it('should mark input as "not dirty" when the v-model is null, but null is not present in the items', () => { - const items = [ - { code: 'en-US', name: 'English' }, - { code: 'de-DE', name: 'German' }, - ] - - cy.mount(() => ( - - )) - - cy.get('.v-field').should('not.have.class', 'v-field--dirty') - }) - }) - - describe('hide-selected', () => { - it('should hide selected item(s)', () => { - const items = ['Item 1', 'Item 2', 'Item 3', 'Item 4'] - - const selectedItems = ['Item 1', 'Item 2'] - - cy.mount(() => ( - - )) - - cy.get('.v-autocomplete__menu-icon').click() - - cy.get('.v-overlay__content .v-list-item').should('have.length', 2) - cy.get('.v-overlay__content .v-list-item .v-list-item-title').eq(0).should('have.text', 'Item 3') - cy.get('.v-overlay__content .v-list-item .v-list-item-title').eq(1).should('have.text', 'Item 4') - }) - }) - - // https://github.com/vuetifyjs/vuetify/issues/16055 - it('should not replicate html select hotkeys in v-autocomplete', () => { - const items = ref(['aaa', 'foo', 'faa']) - - const selectedItems = ref(undefined) - - cy.mount(() => ( - - )) - - cy.get('.v-autocomplete') - .click() - .get('.v-autocomplete input') - .focus() - .type('f', { force: true }) - .get('.v-list-item').should('have.length', 2) - .then(_ => { - expect(selectedItems.value).equal(undefined) - }) - }) - - it('should conditionally show placeholder', () => { - cy.mount(props => ( - - )) - .get('.v-autocomplete input') - .should('have.attr', 'placeholder', 'Placeholder') - .setProps({ label: 'Label' }) - .get('.v-autocomplete input') - .should('not.be.visible') - .get('.v-autocomplete input') - .focus() - .should('have.attr', 'placeholder', 'Placeholder') - .should('be.visible') - .blur() - .setProps({ persistentPlaceholder: true }) - .get('.v-autocomplete input') - .should('have.attr', 'placeholder', 'Placeholder') - .should('be.visible') - .setProps({ modelValue: 'Foobar' }) - .get('.v-autocomplete input') - .should('not.have.attr', 'placeholder') - .setProps({ multiple: true, modelValue: ['Foobar'] }) - .get('.v-autocomplete input') - .should('not.have.attr', 'placeholder') - }) - - it('should keep TextField focused while selecting items from open menu', () => { - cy.mount(() => ( - - )) - - cy.get('.v-autocomplete') - .click() - - cy.get('.v-list') - .trigger('keydown', { key: keyValues.down, waitForAnimations: false }) - .trigger('keydown', { key: keyValues.down, waitForAnimations: false }) - .trigger('keydown', { key: keyValues.down, waitForAnimations: false }) - - cy.get('.v-field').should('have.class', 'v-field--focused') - }) - - it('should not open menu when closing a chip', () => { - cy - .mount(() => ( - - )) - .get('.v-autocomplete') - .should('not.have.class', 'v-autocomplete--active-menu') - .get('.v-chip__close').eq(1) - .click() - .get('.v-autocomplete') - .should('not.have.class', 'v-autocomplete--active-menu') - .get('.v-chip__close') - .click() - .get('.v-autocomplete') - .should('not.have.class', 'v-autocomplete--active-menu') - .click() - .should('have.class', 'v-autocomplete--active-menu') - .trigger('keydown', { key: keyValues.esc }) - .should('not.have.class', 'v-autocomplete--active-menu') - }) - - describe('auto-select-first', () => { - it('should auto-select-first item when pressing enter', () => { - const selectedItems = ref(undefined) - - cy - .mount(() => ( - - )) - .get('.v-autocomplete') - .click() - .get('.v-list-item') - .should('have.length', 6) - .get('.v-autocomplete input') - .type('Cal') - .get('.v-list-item').eq(0) - .should('have.class', 'v-list-item--active') - .get('.v-autocomplete input') - .trigger('keydown', { key: keyValues.enter, waitForAnimations: false }) - .get('.v-list-item') - .should('have.length', 1) - .then(_ => { - expect(selectedItems.value).to.deep.equal(['California']) - }) - }) - - it('should auto-select-first item when pressing tab', () => { - const selectedItems = ref([]) - - cy - .mount(() => ( - - )) - .get('.v-autocomplete') - .click() - .get('.v-list-item') - .should('have.length', 6) - .get('.v-autocomplete input') - .type('Cal') - .get('.v-list-item').eq(0) - .should('have.class', 'v-list-item--active') - .realPress('Tab') - .get('.v-list-item') - .should('have.length', 0) - .then(_ => { - expect(selectedItems.value).to.deep.equal(['California']) - }) - }) - - it('should not auto-select-first item when blur', () => { - const selectedItems = ref(undefined) - - cy - .mount(() => ( - - )) - .get('.v-autocomplete') - .click() - .get('.v-list-item') - .should('have.length', 6) - .get('.v-autocomplete input') - .type('Cal') - .get('.v-list-item').eq(0) - .should('have.class', 'v-list-item--active') - .get('.v-autocomplete input') - .blur() - .get('.v-list-item') - .should('have.length', 0) - .should(_ => { - expect(selectedItems.value).to.deep.equal(undefined) - }) - }) - }) - - // https://github.com/vuetifyjs/vuetify/issues/18796 - // https://github.com/vuetifyjs/vuetify/issues/19235 - it('should allow deleting selection via closable-chips', () => { - const selectedItem = ref('California') - - cy.mount(() => ( - - )) - .get('.v-chip__close') - .click() - .then(_ => { - expect(selectedItem.value).to.equal(null) - }) - }) - - // https://github.com/vuetifyjs/vuetify/issues/19261 - it('should not toggle v-model to null when clicking already selected item in single selection mode', () => { - const selectedItem = ref('abc') - - cy.mount(() => ( - - )) - - cy.get('.v-autocomplete').click() - - cy.get('.v-list-item').should('have.length', 2) - cy.get('.v-list-item').eq(0).click({ waitForAnimations: false }).should(() => { - expect(selectedItem.value).equal('abc') - }) - }) - - // https://github.com/vuetifyjs/vuetify/issues/18556 - it('should show menu if focused and items are added', () => { - cy - .mount(props => ()) - .get('.v-autocomplete input') - .focus() - .get('.v-overlay') - .should('not.exist') - .setProps({ items: ['Foo', 'Bar'] }) - .get('.v-overlay') - .should('exist') - }) - - // https://github.com/vuetifyjs/vuetify/issues/19346 - it('should not show menu when focused and existing non-empty items are changed', () => { - cy - .mount((props: any) => ()) - .setProps({ items: ['Foo', 'Bar'] }) - .get('.v-autocomplete') - .click() - .get('.v-overlay') - .should('exist') - .get('.v-list-item').eq(1).click({ waitForAnimations: false }) - .setProps({ items: ['Foo', 'Bar', 'test', 'test 2'] }) - .get('.v-overlay') - .should('not.exist') - }) - - // https://github.com/vuetifyjs/vuetify/issues/17573 - // When using selection slot or chips, input displayed next to chip/selection slot should be always empty - it('should always have empty input value when it is unfocused and when using selection slot or chips', () => { - const items = ['Item 1', 'Item 2', 'Item 3', 'Item 4'] - const selectedItem = ref('Item 1') - - cy - .mount(() => ( - - )) - .get('.v-autocomplete').click() - .get('.v-autocomplete input').should('have.value', '') - // Blur input with a custom search input value - .type('test') - .blur() - .should('have.value', '') - .should(() => { - expect(selectedItem.value).to.equal('Item 1') - }) - // Search existing item and click to select - .get('.v-autocomplete').click() - .get('.v-autocomplete input').should('have.value', '') - .type('Item 1') - .get('.v-list-item').eq(0).click({ waitForAnimations: false }) - .should(() => { - expect(selectedItem.value).to.equal('Item 1') - }) - }) - - describe('Showcase', () => { - generate({ stories }) - }) -}) diff --git a/packages/vuetify/src/components/VBadge/__tests__/VBadge.spec.browser.tsx b/packages/vuetify/src/components/VBadge/__tests__/VBadge.spec.browser.tsx new file mode 100644 index 00000000000..b2a83b96750 --- /dev/null +++ b/packages/vuetify/src/components/VBadge/__tests__/VBadge.spec.browser.tsx @@ -0,0 +1,79 @@ +// Components +import { VBadge } from '..' +import { VBtn } from '@/components/VBtn' + +// Utilities +import { generate, gridOn, render, screen } from '@test' + +const defaultColors = ['success', 'info', 'warning', 'error', 'invalid'] +const location = ['bottom start', 'bottom end', 'top start', 'top end'] +const rounded = ['circle', 'pill', 'shaped', 'tr-xl', 'br-lg', 0] // TODO: fix pill +const offset = [8, -8, '4', '-4', undefined] + +const props = { + bordered: true, + color: defaultColors, + content: ['content'], + dot: true, + icon: ['$vuetify'], + floating: true, + inline: true, + location, + modelValue: true, + rounded, +} + +const stories = { + 'Default badge': , + 'Icon badge': , + 'Offset badge': gridOn(['offsetX', 'offsetY'], offset, (xy, offset) => ( + + + { String(offset) } + + + )), + Color: gridOn([null], defaultColors, (_, color) => ( + + + { color } + + + )), + 'Text color': gridOn([null], defaultColors, (_, color) => ( + + + { color } + + + )), +} + +// Tests +describe('VBadge', () => { + describe('label', () => { + it('should have the designated aria label', async () => { + render(label) + expect(await screen.findByLabelText('label-badge')).toBeDefined() + }) + }) + + describe('max', () => { + it('should add a suffix if the content value is greater than the max value', () => { + const { container } = render() + expect(container).toHaveTextContent('+') + }) + }) + + describe('tag', () => { + it('renders the proper tag instead of a div', () => { + const { wrapper } = render(tag) + const el = wrapper.find('custom-tag').element + expect(el).toHaveTextContent('tag') + }) + }) + + describe('Showcase', () => { + generate({ stories, props, component: VBadge }) + }) +}) diff --git a/packages/vuetify/src/components/VBadge/__tests__/VBadge.spec.cy.tsx b/packages/vuetify/src/components/VBadge/__tests__/VBadge.spec.cy.tsx deleted file mode 100644 index 2d70fe102fe..00000000000 --- a/packages/vuetify/src/components/VBadge/__tests__/VBadge.spec.cy.tsx +++ /dev/null @@ -1,122 +0,0 @@ -/// - -// Components -import { VBadge } from '..' -import { VBtn } from '@/components/VBtn' - -// Utilities -import { generate, gridOn } from '@/../cypress/templates' - -const defaultColors = ['success', 'info', 'warning', 'error', 'invalid'] -const location = ['bottom start', 'bottom end', 'top start', 'top end'] -const rounded = ['circle', 'pill', 'shaped', 'tr-xl', 'br-lg', 0] // TODO: fix pill -const offset = [8, -8, '4', '-4', undefined] - -const props = { - bordered: true, - color: defaultColors, - content: ['content'], - dot: true, - icon: ['$vuetify'], - floating: true, - inline: true, - location, - modelValue: true, - rounded, -} - -const stories = { - 'Default badge': , - 'Icon badge': , - 'Offset badge': gridOn(['offsetX', 'offsetY'], offset, (xy, offset) => ( - - - { xy } - - - )), - 'Text color': gridOn(defaultColors, [null], color => ( - - - { color } - - - )), -} - -// Tests -describe('VBadge', () => { - describe('color', () => { - it('supports default color props', () => { - cy.mount(() => ( - <> - { defaultColors.map((color, idx) => ( - - { color } badge - - ))} - - )) - .get('.v-badge') - .should('have.length', defaultColors.length) - .then(subjects => { - Array.from(subjects).forEach((subject, idx) => { - // TODO: refactor - expect(subject.querySelector(`.bg-${defaultColors[idx]}`)).to.be.instanceOf(HTMLSpanElement) - expect(subject).to.contain(defaultColors[idx]) - }) - }) - }) - }) - - describe('label', () => { - it('should have the designated aria label', () => { - cy.mount(label) - .get('.v-badge__badge') - .should('have.attr', 'aria-label', 'label-badge') - }) - }) - - describe('max', () => { - it('should add a suffix if the content value is greater than the max value', () => { - cy.mount() - .get('.v-badge') - .should('contain.text', '+') - }) - }) - - describe('tag', () => { - it('renders the proper tag instead of a div', () => { - cy.mount(tag) - .get('custom-tag') - .should('have.text', 'tag') - }) - }) - - describe('textColor', () => { - it('supports default text color props', () => { - cy.mount(() => ( - <> - { defaultColors.map((color, idx) => ( - - { color } text badge - - ))} - - )) - .get('.v-badge') - .should('have.length', defaultColors.length) - .then(subjects => { - Array.from(subjects).forEach((subject, idx) => { - // TODO: refactor - expect(subject.querySelector(`.text-${defaultColors[idx]}`)).to.be.instanceOf(HTMLSpanElement) - expect(subject).to.contain(defaultColors[idx]) - }) - }) - }) - }) - - describe('Showcase', () => { - generate({ stories, props, component: VBadge }) - }) -}) diff --git a/packages/vuetify/src/components/VBtn/__tests__/VBtn.spec.browser.tsx b/packages/vuetify/src/components/VBtn/__tests__/VBtn.spec.browser.tsx new file mode 100644 index 00000000000..01c6ff9be6f --- /dev/null +++ b/packages/vuetify/src/components/VBtn/__tests__/VBtn.spec.browser.tsx @@ -0,0 +1,241 @@ +import { VBtn } from '../VBtn' + +// Utilities +import { generate, gridOn, render } from '@test' +import { userEvent } from '@vitest/browser/context' +import { createRouter, createWebHistory } from 'vue-router' + +// TODO: generate these from types +const colors = ['success', 'info', 'warning', 'error', 'invalid'] +const sizes = ['x-small', 'small', 'default', 'large', 'x-large'] as const +const densities = ['default', 'comfortable', 'compact'] as const +const variants = ['elevated', 'flat', 'tonal', 'outlined', 'text', 'plain'] as const +const props = { + color: colors, + // variant: variants, + // disabled: false, + // loading: false, +} + +const stories = { + 'Default button': Basic button, + 'Small success button': Completed!, + 'Large, plain button w/ error': Whoops, + Loading: ( +
+ {{ loader: () => Loading..., default: () => 'Default Content' }} + {{ loader: () => Loading..., default: () => 'Default Content' }} + {{ loader: () => Loading... }} + Default Content +
+ ), + Icon: , + 'Density + size': gridOn(densities, sizes, (density, size) => + { size } + ), + Variants: gridOn(['no color', 'primary'], variants, (color, variant) => + { variant } + ), + 'Disabled variants': gridOn(['no color', 'primary'], variants, (color, variant) => + { variant } + ), + Stacked: gridOn([undefined], variants, (_, variant) => + { variant } + ), +} + +// Actual tests +describe('VBtn', () => { + describe('color', () => { + it('supports default color props', async () => { + const { container } = render(() => ( + <> + { colors.map(color => ( + + { color } button + + ))} + + )) + + const buttons = container.querySelectorAll('button') + expect(buttons).toHaveLength(colors.length) + buttons.forEach((button, idx) => { + expect(button).toHaveTextContent(colors[idx]) + }) + }) + }) + + describe('tag', () => { + it('renders the proper tag instead of a button', async () => { + const { container } = render(Click me) + const customTag = container.querySelector('custom-tag') + expect(customTag).toHaveTextContent('Click me') + }) + }) + + describe('elevation', () => { + it('should have the correct elevation', async () => { + const { container } = render() + const button = container.querySelector('button') + expect(button).toHaveClass('elevation-24') + }) + }) + + describe('events', () => { + it('emits native click events', async () => { + const click = vi.fn() + + const { container, rerender } = render(() => ( + Click me + )) + + await userEvent.click(container.querySelector('button')!) + expect(click).toHaveBeenCalledTimes(1) + + await rerender({ to: '#my-anchor' }) + + await userEvent.click(container.querySelector('button')!) + expect(click).toHaveBeenCalledTimes(2) + }) + + // Pending test, is "toggle" even going to be emitted anymore? + it.skip('emits toggle when used within a button group', () => { + // const register = jest.fn() + // const unregister = jest.fn() + // const toggle = jest.fn() + // const wrapper = mountFunction({ + // provide: { + // btnToggle: { register, unregister }, + // }, + // methods: { toggle }, + // }) + + // wrapper.trigger('click') + // expect(toggle).toHaveBeenCalled() + }) + }) + + // These tests were copied over from the previous Jest tests, + // but they are breaking because the features have not been implemented + describe.skip('activeClass', () => { + it('should use custom active-class', async () => { + const { wrapper } = render(Active Class) + expect(wrapper.element).toHaveClass('my-active-class') + }) + }) + + describe('href', () => { + it.skip('should render an tag when using href prop', async () => { + const anchor = { href: '#anchor', hash: 'anchor' } + const { container } = render(Click me) + const link = container.querySelector('a')! + + await userEvent.click(link) + expect(link).toHaveTextContent('Click me') + expect(link).toHaveFocus() + expect(window.location.hash).toContain(anchor.hash) + }) + + it('should change route when using to prop', async () => { + const router = createRouter({ + history: createWebHistory(), + routes: [ + { path: '/', component: { template: 'Home' } }, + { path: '/about', component: { template: 'About' } }, + ], + }) + + await router.replace('/') + + const result = render(() => ( + Click me + ), { global: { plugins: [router] } }) + + const link = result.wrapper.element + + await userEvent.click(link) + expect(link).toHaveFocus() + await result.findByText('Click me') + expect(window.location.pathname).toBe('/about') + }) + }) + + describe('value', () => { + it('should pass string values', async () => { + const stringValue = 'Foobar' + const { wrapper } = render(() => ( + + )) + expect(wrapper.element).toHaveValue(stringValue) + }) + + it('should stringify object', async () => { + const objectValue = { value: {} } + const { wrapper } = render(() => ( + + )) + expect(wrapper.element).toHaveValue(JSON.stringify(objectValue, null, 0)) + }) + + it('should stringify number', async () => { + const numberValue = 15 + const { wrapper } = render(() => ( + + )) + expect(wrapper.element).toHaveValue(JSON.stringify(numberValue, null, 0)) + }) + + it('should stringify array', async () => { + const arrayValue = ['foo', 'bar'] + const { wrapper } = render(() => ( + + )) + expect(wrapper.element).toHaveValue(JSON.stringify(arrayValue, null, 0)) + }) + + it('should not generate a fallback value when not provided', async () => { + const { wrapper } = render() + expect(wrapper.element).not.toHaveValue() + }) + }) + + describe('Reactivity', () => { + it('disabled', async () => { + const { wrapper } = render(() => ( + + )) + expect(wrapper.element).toHaveClass('v-btn--disabled') + + await wrapper.setProps({ disabled: false }) + expect.poll(() => wrapper.element).not.toHaveClass('v-btn--disabled') + }) + + it.skip('activeClass', async () => { + const { container, wrapper } = render(() => ( + Active Class + )) + + await wrapper.setProps({ activeClass: 'different-class' }) + + const activeClassElement = container.querySelector('.different-class') + expect(activeClassElement).not.toBeInTheDocument() + }) + + it('plain', async () => { + const { wrapper } = render(() => ( + Plain + )) + + expect(wrapper.element).toHaveClass('v-btn--variant-plain') + + await wrapper.setProps({ variant: 'default' }) + + expect.poll(() => wrapper.element).not.toHaveClass('v-btn--variant-plain') + }) + }) + + describe('Showcase', () => { + generate({ stories, props, component: VBtn }) + }) +}) diff --git a/packages/vuetify/src/components/VBtn/__tests__/VBtn.spec.cy.tsx b/packages/vuetify/src/components/VBtn/__tests__/VBtn.spec.cy.tsx deleted file mode 100644 index 6273c356eb9..00000000000 --- a/packages/vuetify/src/components/VBtn/__tests__/VBtn.spec.cy.tsx +++ /dev/null @@ -1,301 +0,0 @@ -/// - -import { VBtn } from '../VBtn' - -// Utilities -import { createRouter, createWebHistory } from 'vue-router' -import { generate, gridOn } from '@/../cypress/templates' - -const anchor = { - href: '#my-anchor', - hash: 'my-anchor', -} - -// TODO: generate these from types -const colors = ['success', 'info', 'warning', 'error', 'invalid'] -const sizes = ['x-small', 'small', 'default', 'large', 'x-large'] as const -const densities = ['default', 'comfortable', 'compact'] as const -const variants = ['elevated', 'flat', 'tonal', 'outlined', 'text', 'plain'] as const -const props = { - color: colors, - // variant: variants, - // disabled: false, - // loading: false, -} - -const stories = { - 'Default button': Basic button, - 'Small success button': Completed!, - 'Large, plain button w/ error': Whoops, - Loading: ( -
- {{ loader: () => Loading..., default: () => 'Default Content' }} - {{ loader: () => Loading..., default: () => 'Default Content' }} - {{ loader: () => Loading... }} - Default Content -
- ), - Icon: , - 'Density + size': gridOn(densities, sizes, (density, size) => - { size } - ), - Variants: gridOn(['no color', 'primary'], variants, (color, variant) => - { variant } - ), - 'Disabled variants': gridOn(['no color', 'primary'], variants, (color, variant) => - { variant } - ), - Stacked: gridOn([undefined], variants, (_, variant) => - { variant } - ), -} - -// Actual tests -describe('VBtn', () => { - describe('color', () => { - it('supports default color props', () => { - cy.mount(() => ( - <> - { colors.map(color => ( - - { color } button - - ))} - - )) - .get('button') - .should('have.length', colors.length) - .then(subjects => { - Array.from(subjects).forEach((subject, idx) => { - expect(subject).to.contain(colors[idx]) - }) - }) - }) - }) - - describe('icons', () => { - it('adds the icon class when true', () => { - cy.mount() - .get('button') - .should('have.class', 'v-btn--icon') - }) - - it('renders an icon inside', () => { - // TODO: Render VIcon instead of emoji - cy.mount(🐻) - .get('button') - .should('have.text', '🐻') - }) - }) - - describe('plain', () => { - it('should have the plain class when variant is plain', () => { - cy.mount(Plain) - .get('button') - .should('have.class', 'v-btn--variant-plain') - }) - }) - - describe('tag', () => { - it('renders the proper tag instead of a button', () => { - cy.mount(Click me) - .get('button') - .should('not.exist') - .get('custom-tag') - .should('have.text', 'Click me') - }) - }) - - describe('elevation', () => { - it('should have the correct elevation', () => { - cy.mount() - .get('button') - .should('have.class', 'elevation-24') - }) - }) - - describe('events', () => { - it('emits native click events', () => { - const click = cy.stub().as('click') - cy.mount(Click me) - .get('button') - .click() - cy.get('@click') - .should('have.been.called', 1) - cy.setProps({ href: undefined, to: '#my-anchor' }) - cy.get('@click') - .should('have.been.called', 2) - }) - - // Pending test, is "toggle" even going to be emitted anymore? - it.skip('emits toggle when used within a button group', () => { - // const register = jest.fn() - // const unregister = jest.fn() - // const toggle = jest.fn() - // const wrapper = mountFunction({ - // provide: { - // btnToggle: { register, unregister }, - // }, - // methods: { toggle }, - // }) - - // wrapper.trigger('click') - // expect(toggle).toHaveBeenCalled() - }) - }) - - // These tests were copied over from the previous Jest tests, - // but they are breaking because the features have not been implemented - describe.skip('disabled', () => { - // The actual behavior here is working, but the color class name isn't being removed - // We can _technically_ test that the background is NOT the color's background, - // but it's a bit brittle and I think it'll be better to check against the class name - it('should not add color classes if disabled', () => { - cy.mount() - .get('button') - .should('have.class', 'bg-success') - .get('button') - .should('have.class', 'v-btn--disabled') - .should('not.have.class', 'bg-success') - }) - }) - - describe.skip('activeClass', () => { - it('should use custom active-class', () => { - cy.mount(Active Class) - .get('.my-active-class') - .should('exist') - }) - }) - - // v-btn--tile isn't implemented at all - describe.skip('tile', () => { - it('applies the tile class when true', () => { - cy.mount() - .get('button') - .should('contain.class', 'v-btn--tile') - }) - - it('does not apply the tile class when false', () => { - cy.mount() - .get('button') - .should('not.contain.class', 'v-btn--tile') - }) - }) - - describe('href', () => { - it('should render an
tag when using href prop', () => { - cy.mount(Click me) - .get('.v-btn') - .click() - cy.get('a') - .should('contain.text', 'Click me') - .should('have.focus') - cy.hash() - .should('contain', anchor.hash) - }) - - it('should change route when using to prop', () => { - const router = createRouter({ - history: createWebHistory(), - routes: [ - { - path: '/', - component: { template: 'Home' }, - }, - { - path: '/about', - component: { template: 'About' }, - }, - ], - }) - - cy.mount(Click me, { global: { plugins: [router] } }) - .get('.v-btn') - .click() - cy.get('a') - .should('contain.text', 'Click me') - .should('have.focus') - cy.url() - .should('contain', '/about') - }) - }) - - describe('value', () => { - it('should pass string values', () => { - const stringValue = 'Foobar' - - cy.mount() - .get('button') - .should('have.value', stringValue) - }) - - it('should stringify object', () => { - const objectValue = { value: {} } - cy.mount() - .get('button') - .should('have.value', JSON.stringify(objectValue, null, 0)) - }) - - it('should stringify number', () => { - const numberValue = 15 - cy.mount() - .get('button') - .should('have.value', JSON.stringify(numberValue, null, 0)) - }) - - it('should stringify array', () => { - const arrayValue = ['foo', 'bar'] - cy.mount() - .get('button') - .should('have.value', JSON.stringify(arrayValue, null, 0)) - }) - - it('should not generate a fallback value when not provided', () => { - cy.mount() - .get('button') - .should('not.have.value') - }) - }) - - describe('Reactivity', () => { - // tile is not implemented. - it.skip('tile', () => { - cy.mount(My button) - .get('button') - .should('contain.class', 'v-btn--tile') - cy.setProps({ tile: false }) - cy.get('button') - .should('not.contain.class', 'v-btn--tile') - }) - - it('disabled', () => { - cy.mount() - .get('button') - .should('have.class', 'v-btn--disabled') - cy.setProps({ disabled: false }) - cy.get('button') - .should('not.have.class', 'v-btn--disabled') - }) - - it('activeClass', () => { - cy.mount(Active Class) - .setProps({ activeClass: 'different-class' }) - cy.get('.different-class') - .should('not.exist') - }) - - it('plain', () => { - cy.mount(Plain) - .get('button') - .should('have.class', 'v-btn--variant-plain') - cy.setProps({ variant: 'default' }) - cy.get('button') - .should('not.have.class', 'v-btn--variant-plain') - }) - }) - - describe('Showcase', () => { - generate({ stories, props, component: VBtn }) - }) -}) diff --git a/packages/vuetify/src/components/VChip/VChip.tsx b/packages/vuetify/src/components/VChip/VChip.tsx index bbaedfd2842..8c38e4e7bf6 100644 --- a/packages/vuetify/src/components/VChip/VChip.tsx +++ b/packages/vuetify/src/components/VChip/VChip.tsx @@ -333,6 +333,7 @@ export const VChip = genericComponent()({ key="close" class="v-chip__close" type="button" + data-testid="close-chip" { ...closeProps.value } > { !slots.close ? ( diff --git a/packages/vuetify/src/components/VColorPicker/util/__tests__/index.spec.ts b/packages/vuetify/src/components/VColorPicker/util/__tests__/index.spec.ts index e45f3ef7758..6608efde02c 100644 --- a/packages/vuetify/src/components/VColorPicker/util/__tests__/index.spec.ts +++ b/packages/vuetify/src/components/VColorPicker/util/__tests__/index.spec.ts @@ -1,5 +1,4 @@ // Utilities -import { expect, it } from 'vitest' import { extractColor } from '../' const red = { h: 0, s: 1, v: 1, a: 1 } diff --git a/packages/vuetify/src/components/VCombobox/__tests__/VCombobox.spec.browser.tsx b/packages/vuetify/src/components/VCombobox/__tests__/VCombobox.spec.browser.tsx new file mode 100644 index 00000000000..1d1da782e5a --- /dev/null +++ b/packages/vuetify/src/components/VCombobox/__tests__/VCombobox.spec.browser.tsx @@ -0,0 +1,741 @@ +// Components +import { VCombobox } from '../VCombobox' +import { VForm } from '@/components/VForm' + +// Utilities +import { generate, render, screen, waitAnimationFrame, userEvent, waitIdle } from '@test' +import { cloneVNode, ref } from 'vue' + +const variants = ['underlined', 'outlined', 'filled', 'solo', 'plain'] as const +const densities = ['default', 'comfortable', 'compact'] as const +const items = ['California', 'Colorado', 'Florida', 'Georgia', 'Texas', 'Wyoming'] as const + +const stories = Object.fromEntries(Object.entries({ + 'Default input': , + Disabled: , + Affixes: , + 'Prepend/append': , + 'Prepend/append inner': , + Placeholder: , +}).map(([k, v]) => [k, ( +
+ { variants.map(variant => ( + densities.map(density => ( +
+ { cloneVNode(v, { variant, density, label: `${variant} ${density}` }) } + { cloneVNode(v, { variant, density, label: `with value`, modelValue: ['California'] }) } + { cloneVNode(v, { variant, density, label: `chips`, chips: true, modelValue: ['California'] }) } + {{ + selection: ({ item }) => { + return item.title + }, + }} + +
+ )) + )).flat()} +
+)])) + +describe('VCombobox', () => { + describe('closableChips', () => { + it('should close only first chip', async () => { + const items = [ + 'Item 1', + 'Item 2', + 'Item 3', + 'Item 4', + ] + + const selectedItems = [ + 'Item 1', + 'Item 2', + 'Item 3', + ] + + render(() => ( + + )) + + await userEvent.click(screen.getAllByTestId('close-chip')[0]) + await expect.poll(() => screen.getAllByCSS('.v-chip')).toHaveLength(2) + }) + }) + + describe('complex objects', () => { + it('single', async () => { + const items = [ + { title: 'Item 1', value: 'item1' }, + { title: 'Item 2', value: 'item2' }, + { title: 'Item 3', value: 'item3' }, + { title: 'Item 4', value: 'item4' }, + ] + const model = ref() + const search = ref() + const updateModel = vi.fn(val => model.value = val) + const updateSearch = vi.fn(val => search.value = val) + + const { element } = render(() => ( + + )) + + await userEvent.click(element) + await userEvent.click((await screen.findAllByRole('option'))[0]) + expect(model.value).toStrictEqual(items[0]) + expect(search.value).toBe(items[0].title) + expect(screen.getByRole('textbox')).toHaveValue(items[0].title) + expect(screen.getByCSS('.v-combobox__selection')).toHaveTextContent(items[0].title) + + await userEvent.click(element) + await userEvent.keyboard('{Control>}a{/Ctrl}{Backspace}') + await userEvent.keyboard('Item 2') + expect(model.value).toEqual('Item 2') + expect(search.value).toEqual('Item 2') + expect(screen.getByRole('textbox')).toHaveValue('Item 2') + expect(screen.getByCSS('.v-combobox__selection')).toHaveTextContent('Item 2') + + await userEvent.click(element) + await userEvent.keyboard('{Control>}a{/Ctrl}{Backspace}') + await userEvent.keyboard('item3') + expect(model.value).toEqual('item3') + expect(search.value).toEqual('item3') + expect(screen.getByRole('textbox')).toHaveValue('item3') + expect(screen.getByCSS('.v-combobox__selection')).toHaveTextContent('item3') + }) + + it('multiple', async () => { + const items = [ + { title: 'Item 1', value: 'item1' }, + { title: 'Item 2', value: 'item2' }, + { title: 'Item 3', value: 'item3' }, + { title: 'Item 4', value: 'item4' }, + ] + const model = ref<(string | typeof items[number])[]>([]) + const search = ref() + const updateModel = vi.fn(val => model.value = val) + const updateSearch = vi.fn(val => search.value = val) + + const { element } = render(() => ( + + )) + + await userEvent.click(element) + await userEvent.click(screen.getAllByRole('option')[0]) + expect(model.value).toStrictEqual([items[0]]) + expect(search.value).toBeUndefined() + expect(screen.getByRole('textbox')).toHaveValue('') + expect(screen.getByCSS('.v-combobox__selection')).toHaveTextContent(items[0].title) + + await userEvent.click(element) + await userEvent.keyboard('Item 2{tab}') + expect(model.value).toStrictEqual([items[0], 'Item 2']) + expect(search.value).toBe('') + expect(screen.getByRole('textbox')).toHaveValue('') + expect(screen.getAllByCSS('.v-combobox__selection').at(-1)).toHaveTextContent('Item 2') + + await userEvent.click(element) + await userEvent.keyboard('item3{tab}') + expect(model.value).toStrictEqual([items[0], 'Item 2', 'item3']) + expect(search.value).toBe('') + expect(screen.getByRole('textbox')).toHaveValue('') + expect(screen.getAllByCSS('.v-combobox__selection').at(-1)).toHaveTextContent('item3') + }) + }) + + describe('search', () => { + it('should filter items', async () => { + const items = [ + 'Item 1', + 'Item 1a', + 'Item 2', + 'Item 2a', + ] + + const { element } = render(() => ( + + )) + + await userEvent.click(element) + await userEvent.keyboard('Item') + expect(await screen.findAllByRole('option')).toHaveLength(4) + await userEvent.keyboard('{Control>}a{/Ctrl}{Backspace}') + await userEvent.keyboard('Item 1') + expect(await screen.findAllByRole('option')).toHaveLength(2) + await userEvent.keyboard('{Control>}a{/Ctrl}{Backspace}') + await userEvent.keyboard('Item 3') + expect(screen.queryAllByRole('option')).toHaveLength(0) + }) + + it('should filter items when using multiple', async () => { + const items = [ + 'Item 1', + 'Item 1a', + 'Item 2', + 'Item 2a', + ] + + const { element } = render(() => ( + + )) + + await userEvent.click(element) + await userEvent.keyboard('Item') + expect(await screen.findAllByRole('option')).toHaveLength(4) + await userEvent.keyboard('{Control>}a{/Ctrl}{Backspace}') + await userEvent.keyboard('Item 1') + expect(await screen.findAllByRole('option')).toHaveLength(2) + await userEvent.keyboard('{Control>}a{/Ctrl}{Backspace}') + await userEvent.keyboard('Item 3') + expect(screen.queryAllByRole('option')).toHaveLength(0) + }) + + it('should filter with custom item shape', async () => { + const items = [ + { + id: 1, + name: 'Test1', + }, + { + id: 2, + name: 'Antonsen PK', + }, + ] + + const { element } = render(() => ( + + )) + + await userEvent.click(element) + await userEvent.keyboard('test') + expect(await screen.findByRole('option')).toHaveTextContent('Test1') + + await userEvent.keyboard('{Control>}a{/Ctrl}{Backspace}') + await userEvent.keyboard('antonsen') + expect(await screen.findByRole('option')).toHaveTextContent('Antonsen PK') + }) + }) + + describe('prefilled data', async () => { + it('should work with array of strings when using multiple', async () => { + const items = ref(['California', 'Colorado', 'Florida']) + + const selectedItems = ref(['California', 'Colorado']) + + const { element } = render(() => ( + + )) + + await userEvent.click(element) + + expect(await screen.findAllByRole('option', { selected: true })).toHaveLength(2) + expect(screen.getAllByCSS('.v-chip')).toHaveLength(2) + + await userEvent.click(screen.getAllByTestId('close-chip')[0]) + expect(await screen.findByRole('textbox')).toBeInTheDocument() + expect(screen.getAllByCSS('.v-chip')).toHaveLength(1) + expect(selectedItems.value).toStrictEqual(['Colorado']) + }) + + it('should work with objects when using multiple', async () => { + const items = ref([ + { + title: 'Item 1', + value: 'item1', + }, + { + title: 'Item 2', + value: 'item2', + }, + { + title: 'Item 3', + value: 'item3', + }, + ]) + + const selectedItems = ref( + [ + { + title: 'Item 1', + value: 'item1', + }, + { + title: 'Item 2', + value: 'item2', + }, + ] + ) + + const { element } = render(() => ( + + )) + + await userEvent.click(element) + + expect(await screen.findAllByRole('option', { selected: true })).toHaveLength(2) + expect(screen.getAllByCSS('.v-chip')).toHaveLength(2) + + await userEvent.click(screen.getAllByTestId('close-chip')[0]) + expect(await screen.findByRole('textbox')).toBeInTheDocument() + expect(screen.getAllByCSS('.v-chip')).toHaveLength(1) + expect(selectedItems.value).toStrictEqual([{ + title: 'Item 2', + value: 'item2', + }]) + }) + + it('should work with objects when using multiple and item-value', async () => { + const items = ref([ + { + text: 'Item 1', + id: 'item1', + }, + { + text: 'Item 2', + id: 'item2', + }, + { + text: 'Item 3', + id: 'item3', + }, + ]) + + const selectedItems = ref( + [ + { + text: 'Item 1', + id: 'item1', + }, + { + text: 'Item 2', + id: 'item2', + }, + ] + ) + + const { element } = render(() => ( + + )) + + await userEvent.click(element) + + const options = await screen.findAllByRole('option', { selected: true }) + expect(options).toHaveLength(2) + const input = await screen.findByRole('combobox') + expect(input).toHaveTextContent('Item 1') + expect(input).toHaveTextContent('Item 2') + + await userEvent.click(options[0]) + + expect(selectedItems.value).toStrictEqual([{ + text: 'Item 2', + id: 'item2', + }]) + }) + }) + + describe('readonly', () => { + it('should not be clickable when in readonly', async () => { + const items = ['Item 1', 'Item 2', 'Item 3', 'Item 4'] + + const selectedItems = 'Item 1' + + const { element } = render(() => ( + + )) + + await userEvent.click(element) + + expect(screen.queryAllByRole('option')).toHaveLength(0) + expect(screen.queryAllByRole('listbox')).toHaveLength(0) + + await userEvent.keyboard('{ArrowDown}') + expect(screen.queryAllByRole('option')).toHaveLength(0) + expect(screen.queryAllByRole('listbox')).toHaveLength(0) + }) + + it('should not be clickable when in readonly form', async () => { + const items = ['Item 1', 'Item 2', 'Item 3', 'Item 4'] + + const selectedItems = 'Item 1' + + const { element } = render(() => ( + + + + )) + + await userEvent.click(element) + + expect(screen.queryAllByRole('option')).toHaveLength(0) + expect(screen.queryAllByRole('listbox')).toHaveLength(0) + + await userEvent.keyboard('{ArrowDown}') + expect(screen.queryAllByRole('option')).toHaveLength(0) + expect(screen.queryAllByRole('listbox')).toHaveLength(0) + }) + }) + + describe('hide-selected', () => { + it('should hide selected item(s)', async () => { + const items = [ + 'Item 1', + 'Item 2', + 'Item 3', + 'Item 4', + ] + + const selectedItems = [ + 'Item 1', + 'Item 2', + ] + + const { element } = render(() => ( + + )) + + await userEvent.click(element) + + const listItems = await screen.findAllByRole('option') + expect(listItems).toHaveLength(2) + expect(listItems[0]).toHaveTextContent('Item 3') + expect(listItems[1]).toHaveTextContent('Item 4') + }) + }) + + // https://github.com/vuetifyjs/vuetify/issues/17120 + it('should display 0 when selected', async () => { + const items = [0, 1, 2, 3, 4] + + const selectedItems = ref(undefined) + + const { element } = render(() => ( + + )) + + await userEvent.click(element) + + await userEvent.click(screen.getAllByRole('option')[0]) + + expect(screen.getByRole('textbox')).toHaveValue('0') + }) + + it('should conditionally show placeholder', async () => { + const { rerender } = render(VCombobox, { + props: { placeholder: 'Placeholder' }, + }) + + const input = screen.getByRole('textbox') + await expect.poll(() => input).toHaveAttribute('placeholder', 'Placeholder') + + await rerender({ label: 'Label' }) + await expect.poll(() => input).not.toBeVisible() + + await userEvent.click(input) + await expect.poll(() => input).toHaveAttribute('placeholder', 'Placeholder') + expect(input).toBeVisible() + + await userEvent.tab() + await rerender({ persistentPlaceholder: true }) + await expect.poll(() => input).toHaveAttribute('placeholder', 'Placeholder') + expect(input).toBeVisible() + + await rerender({ modelValue: 'Foobar' }) + await expect.poll(() =>input).not.toHaveAttribute('placeholder') + + await rerender({ multiple: true, modelValue: ['Foobar'] }) + await expect.poll(() => input).not.toHaveAttribute('placeholder') + }) + + it('should keep TextField focused while selecting items from open menu', async () => { + const { element } = render(() => ( + + )) + + await userEvent.click(element) + + await userEvent.keyboard('{ArrowDown}') + await userEvent.keyboard('{ArrowDown}') + await userEvent.keyboard('{ArrowDown}') + + expect(screen.getByCSS('.v-field')).toHaveClass('v-field--focused') + }) + + it('should not open menu when closing a chip', async () => { + const { element } = render(() => ( + + )) + + expect(screen.queryAllByRole('listbox')).toHaveLength(0) + + await userEvent.click(screen.getAllByTestId('close-chip')[1]) + expect(screen.queryAllByRole('listbox')).toHaveLength(0) + + await userEvent.click(screen.getByTestId('close-chip')) + expect(screen.queryAllByRole('listbox')).toHaveLength(0) + + await userEvent.click(element) + expect(screen.queryAllByRole('listbox')).toHaveLength(1) + await userEvent.keyboard('{Escape}') + await expect.poll(() => screen.queryAllByRole('listbox')).toHaveLength(0) + }) + + describe('auto-select-first', () => { + it('should auto-select-first item when pressing enter', async () => { + const selectedItems = ref([]) + + const { element } = render(() => ( + + )) + + await userEvent.click(element) + expect(screen.getAllByRole('option')).toHaveLength(6) + + await userEvent.keyboard('Cal') + expect(await screen.findByRole('option')).toHaveClass('v-list-item--active') + await userEvent.keyboard('{Enter}') + await expect.poll(() => screen.queryAllByRole('option')).toHaveLength(6) + expect(selectedItems.value).toStrictEqual(['California']) + }) + + it('should auto-select-first item when pressing tab', async () => { + const selectedItems = ref([]) + + const { element } = render(() => ( + + )) + + await userEvent.click(element) + expect(screen.getAllByRole('option')).toHaveLength(6) + + await userEvent.keyboard('Cal') + expect(await screen.findByRole('option')).toHaveClass('v-list-item--active') + await userEvent.keyboard('{Tab}') + await expect.poll(() => screen.queryAllByRole('option')).toHaveLength(0) + expect(selectedItems.value).toStrictEqual(['California']) + }) + + it('should not auto-select-first item when blur', async () => { + const selectedItems = ref([]) + + const { element } = render(() => ( + + )) + + await userEvent.click(element) + expect(screen.getAllByRole('option')).toHaveLength(6) + + await userEvent.keyboard('Cal') + expect(await screen.findByRole('option')).toHaveClass('v-list-item--active') + await userEvent.click(document.body) + await expect.poll(() => screen.queryAllByRole('option')).toHaveLength(0) + expect(selectedItems.value).toStrictEqual(['Cal']) + }) + }) + + it(`doesn't add duplicate values`, async () => { + const selection = ref([]) + const { element } = render(() => ( + + )) + + await userEvent.click(element) + await userEvent.keyboard('foo{Enter}') + await userEvent.keyboard('bar{Enter}') + expect(selection.value).toHaveLength(2) + + await userEvent.keyboard('foo{Enter}') + expect(selection.value).toHaveLength(2) + }) + + // https://github.com/vuetifyjs/vuetify/issues/18796 + it('should allow deleting selection via closable-chips', async () => { + const selectedItem = ref('California') + + render(() => ( + + )) + + await userEvent.click(screen.getByTestId('close-chip')) + expect(selectedItem.value).toBeNull + }) + + // https://github.com/vuetifyjs/vuetify/issues/18556 + it('should show menu if focused and items are added', async () => { + const { rerender } = render(VCombobox) + + await userEvent.keyboard('{Tab}') + await waitAnimationFrame() + expect(screen.queryByRole('listbox')).toBeNull() + + await rerender({ items: ['Foo', 'Bar'] }) + expect(await screen.findByRole('listbox')).toBeInTheDocument() + }) + + // https://github.com/vuetifyjs/vuetify/issues/19346 + it('should not show menu when focused and existing non-empty items are changed', async () => { + const { element, rerender } = render(VCombobox, { + props: { items: ['Foo', 'Bar'] }, + }) + + await userEvent.click(element) + expect(await screen.findByRole('listbox')).toBeInTheDocument() + + await userEvent.click(screen.getAllByRole('option')[0]) + await rerender({ items: ['Foo', 'Bar', 'test'] }) + await waitIdle() + await expect.poll(() => screen.queryByRole('listbox')).toBeNull() + }) + + // https://github.com/vuetifyjs/vuetify/issues/17573 + // When using selection slot or chips, input displayed next to chip/selection slot should be always empty + it('should always have empty input value when it is unfocused and when using selection slot or chips', async () => { + const items = ['Item 1', 'Item 2', 'Item 3', 'Item 4'] + const selectedItem = ref('Item 1') + + const { element, getByCSS } = render(() => ( + + )) + + await userEvent.click(element) + const input = getByCSS('input') + expect(input).toHaveValue('') + + // Blur input with a custom search input value + await userEvent.keyboard('test') + input.blur() + await expect.poll(() => selectedItem.value).toBe('test') + expect(input).toHaveValue('') + + // Press enter key with a custom search input value + await userEvent.click(element) + await userEvent.keyboard('test 2{Enter}') + await expect.poll(() => selectedItem.value).toBe('test 2') + expect(input).toHaveValue('') + + // Search existing item and click to select + await userEvent.click(element) + expect(input).toHaveValue('') + await userEvent.keyboard('Item 1') + await userEvent.click(await screen.findByRole('option')) + await expect.poll(() => selectedItem.value).toBe('Item 1') + }) + + // https://github.com/vuetifyjs/vuetify/issues/19319 + it('should respect return-object when blurring', async () => { + const items = [ + { title: 'Item 1', value: 'item1' }, + { title: 'Item 2', value: 'item2' }, + { title: 'Item 3', value: 'item3' }, + { title: 'Item 4', value: 'item4' }, + ] + const model = ref() + const search = ref() + + const { element } = render(() => ( + + )) + + await userEvent.click(element) + await userEvent.click(screen.getAllByRole('option')[0]) + expect(model.value).toStrictEqual({ title: 'Item 1', value: 'item1' }) + + await userEvent.click(document.body) + expect(model.value).toStrictEqual({ title: 'Item 1', value: 'item1' }) + }) + + describe('Showcase', () => { + generate({ stories }) + }) +}) diff --git a/packages/vuetify/src/components/VCombobox/__tests__/VCombobox.spec.cy.tsx b/packages/vuetify/src/components/VCombobox/__tests__/VCombobox.spec.cy.tsx deleted file mode 100644 index 616753caf0c..00000000000 --- a/packages/vuetify/src/components/VCombobox/__tests__/VCombobox.spec.cy.tsx +++ /dev/null @@ -1,816 +0,0 @@ -/// - -// Components -import { VCombobox } from '../VCombobox' -import { VForm } from '@/components/VForm' - -// Utilities -import { cloneVNode, ref } from 'vue' -import { generate } from '../../../../cypress/templates' -import { keyValues } from '@/util' - -const variants = ['underlined', 'outlined', 'filled', 'solo', 'plain'] as const -const densities = ['default', 'comfortable', 'compact'] as const -const items = ['California', 'Colorado', 'Florida', 'Georgia', 'Texas', 'Wyoming'] as const - -const stories = Object.fromEntries(Object.entries({ - 'Default input': , - Disabled: , - Affixes: , - 'Prepend/append': , - 'Prepend/append inner': , - Placeholder: , -}).map(([k, v]) => [k, ( -
- { variants.map(variant => ( - densities.map(density => ( -
- { cloneVNode(v, { variant, density, label: `${variant} ${density}` }) } - { cloneVNode(v, { variant, density, label: `with value`, modelValue: ['California'] }) } - { cloneVNode(v, { variant, density, label: `chips`, chips: true, modelValue: ['California'] }) } - {{ - selection: ({ item }) => { - return item.title - }, - }} - -
- )) - )).flat()} -
-)])) - -describe('VCombobox', () => { - describe('closableChips', () => { - it('should close only first chip', () => { - const items = [ - 'Item 1', - 'Item 2', - 'Item 3', - 'Item 4', - ] - - const selectedItems = [ - 'Item 1', - 'Item 2', - 'Item 3', - ] - - cy.mount(() => ( - - )) - .get('.v-chip__close').eq(0) - .click() - cy.get('input').should('exist') - cy.get('.v-chip') - .should('have.length', 2) - }) - }) - - describe('complex objects', () => { - it('single', () => { - const items = [ - { title: 'Item 1', value: 'item1' }, - { title: 'Item 2', value: 'item2' }, - { title: 'Item 3', value: 'item3' }, - { title: 'Item 4', value: 'item4' }, - ] - const model = ref() - const search = ref() - const updateModel = cy.stub().as('model').callsFake(val => model.value = val) - const updateSearch = cy.stub().as('search').callsFake(val => search.value = val) - - cy.mount(() => ( - - )) - .get('input') - .click() - cy.get('.v-list-item').eq(0) - .click({ waitForAnimations: false }) - cy.should(() => { - expect(model.value).to.deep.equal(items[0]) - expect(search.value).to.deep.equal(items[0].title) - }) - cy.get('input') - .should('have.value', items[0].title) - .blur() - cy.get('.v-combobox__selection') - .should('contain', items[0].title) - - cy.get('input').click() - cy.get('input').clear() - cy.get('input').type('Item 2') - cy.should(() => { - expect(model.value).to.equal('Item 2') - expect(search.value).to.equal('Item 2') - }) - cy.get('input') - .should('have.value', 'Item 2') - .blur() - cy.get('.v-combobox__selection') - .should('contain', 'Item 2') - - cy.get('input').click() - cy.get('input').clear() - cy.get('input').type('item3') - cy.should(() => { - expect(model.value).to.equal('item3') - expect(search.value).to.equal('item3') - }) - cy.get('input') - .should('have.value', 'item3') - .blur() - cy.get('.v-combobox__selection') - .should('contain', 'item3') - }) - - it('multiple', () => { - const items = [ - { title: 'Item 1', value: 'item1' }, - { title: 'Item 2', value: 'item2' }, - { title: 'Item 3', value: 'item3' }, - { title: 'Item 4', value: 'item4' }, - ] - const model = ref<(string | typeof items[number])[]>([]) - const search = ref() - const updateModel = cy.stub().as('model').callsFake(val => model.value = val) - const updateSearch = cy.stub().as('search').callsFake(val => search.value = val) - - cy.mount(() => ( - - )) - .get('.v-field input') - .click() - cy.get('.v-list-item').eq(0) - .click({ waitForAnimations: false }) - cy.then(() => { - expect(model.value).to.deep.equal([items[0]]) - expect(search.value).to.be.undefined - }) - cy.get('.v-field input').as('input') - .should('have.value', '') - cy.get('.v-combobox__selection') - .should('contain', items[0].title) - - cy.get('@input').click() - cy.get('@input').type('Item 2') - cy.get('@input').blur() - cy.should(() => { - expect(model.value).to.deep.equal([items[0], 'Item 2']) - expect(search.value).to.equal('') - }) - cy.get('@input').should('have.value', '') - cy.get('.v-combobox__selection') - .should('contain', 'Item 2') - - cy.get('@input').click() - cy.get('@input').type('item3') - cy.get('@input').blur() - cy.should(() => { - expect(model.value).to.deep.equal([items[0], 'Item 2', 'item3']) - expect(search.value).to.equal('') - }) - cy.get('@input').should('have.value', '') - cy.get('.v-combobox__selection') - .should('contain', 'item3') - }) - }) - - describe('search', () => { - it('should filter items', () => { - const items = [ - 'Item 1', - 'Item 1a', - 'Item 2', - 'Item 2a', - ] - - cy.mount(() => ( - - )) - .get('input') - .type('Item') - cy.get('.v-list-item') - .should('have.length', 4) - cy.get('input').clear() - cy.get('input').type('Item 1') - cy.get('.v-list-item') - .should('have.length', 2) - cy.get('input').clear() - cy.get('input').type('Item 3') - cy.get('.v-list-item').should('have.length', 0) - }) - - it('should filter items when using multiple', () => { - const items = [ - 'Item 1', - 'Item 1a', - 'Item 2', - 'Item 2a', - ] - - cy.mount(() => ( - - )) - .get('input') - .type('Item') - cy.get('.v-list-item') - .should('have.length', 4) - cy.get('input:first-child').as('input') - .clear() - cy.get('@input').type('Item 1') - cy.get('.v-list-item') - .should('have.length', 2) - cy.get('@input').clear() - cy.get('@input').type('Item 3') - cy.get('.v-list-item') - .should('have.length', 0) - }) - - it('should filter with custom item shape', () => { - const items = [ - { - id: 1, - name: 'Test1', - }, - { - id: 2, - name: 'Antonsen PK', - }, - ] - - cy.mount(() => ( - - )) - .get('input') - .type('test') - cy.get('.v-list-item') - .should('have.length', 1) - .eq(0) - .should('have.text', 'Test1') - cy.get('input').clear() - cy.get('input').type('antonsen') - cy.get('.v-list-item') - .should('have.length', 1) - .eq(0) - .should('have.text', 'Antonsen PK') - }) - }) - - describe('prefilled data', () => { - it('should work with array of strings when using multiple', () => { - const items = ref(['California', 'Colorado', 'Florida']) - - const selectedItems = ref(['California', 'Colorado']) - - cy.mount(() => ( - - )) - - cy.get('.v-combobox input').click() - - cy.get('.v-list-item--active').should('have.length', 2) - cy.get('input').get('.v-chip').should('have.length', 2) - - cy.get('.v-chip__close') - .eq(0) - .click() - cy.get('input').should('exist') - cy.get('.v-chip') - .should('have.length', 1) - cy.should(() => expect(selectedItems.value).to.deep.equal(['Colorado'])) - }) - - it('should work with objects when using multiple', () => { - const items = ref([ - { - title: 'Item 1', - value: 'item1', - }, - { - title: 'Item 2', - value: 'item2', - }, - { - title: 'Item 3', - value: 'item3', - }, - ]) - - const selectedItems = ref( - [ - { - title: 'Item 1', - value: 'item1', - }, - { - title: 'Item 2', - value: 'item2', - }, - ] - ) - - cy.mount(() => ( - - )) - - cy.get('.v-combobox input').click() - - cy.get('.v-list-item--active').should('have.length', 2) - cy.get('input').get('.v-chip').should('have.length', 2) - - cy.get('.v-chip__close') - .eq(0) - .click() - cy.get('input').should('exist') - cy.get('.v-chip') - .should('have.length', 1) - cy.should(() => expect(selectedItems.value).to.deep.equal([{ - title: 'Item 2', - value: 'item2', - }])) - }) - - it('should work with objects when using multiple and item-value', () => { - const items = ref([ - { - text: 'Item 1', - id: 'item1', - }, - { - text: 'Item 2', - id: 'item2', - }, - { - text: 'Item 3', - id: 'item3', - }, - ]) - - const selectedItems = ref( - [ - { - text: 'Item 1', - id: 'item1', - }, - { - text: 'Item 2', - id: 'item2', - }, - ] - ) - - cy.mount(() => ( - - )) - - cy.get('.v-combobox input').click() - - cy.get('.v-list-item--active').should('have.length', 2) - cy.get('.v-field__input').should('include.text', 'Item 1') - cy.get('.v-field__input').should('include.text', 'Item 2') - - cy.get('.v-list-item--active input') - .eq(0) - .click() - .get('.v-field__input') - .should(() => expect(selectedItems.value).to.deep.equal([{ - text: 'Item 2', - id: 'item2', - }])) - }) - }) - - describe('readonly', () => { - it('should not be clickable when in readonly', () => { - const items = ['Item 1', 'Item 2', 'Item 3', 'Item 4'] - - const selectedItems = 'Item 1' - - cy.mount(() => ( - - )) - - cy.get('.v-combobox') - .click() - cy.get('.v-list-item').should('have.length', 0) - .get('.v-select--active-menu').should('have.length', 0) - - cy.get('.v-combobox input').as('input') - .focus() - cy.get('@input').type('{downarrow}', { force: true }) - cy.get('.v-list-item').should('have.length', 0) - .get('.v-select--active-menu').should('have.length', 0) - }) - - it('should not be clickable when in readonly form', () => { - const items = ['Item 1', 'Item 2', 'Item 3', 'Item 4'] - - const selectedItems = 'Item 1' - - cy.mount(() => ( - - - - )) - - cy.get('.v-combobox') - .click() - cy.get('.v-list-item').should('have.length', 0) - .get('.v-select--active-menu').should('have.length', 0) - - cy.get('.v-combobox input').as('input') - .focus() - cy.get('@input').type('{downarrow}', { force: true }) - cy.get('.v-list-item').should('have.length', 0) - .get('.v-select--active-menu').should('have.length', 0) - }) - }) - - describe('hide-selected', () => { - it('should hide selected item(s)', () => { - const items = [ - 'Item 1', - 'Item 2', - 'Item 3', - 'Item 4', - ] - - const selectedItems = [ - 'Item 1', - 'Item 2', - ] - - cy.mount(() => ( - - )) - - cy.get('.v-combobox input').click() - - cy.get('.v-overlay__content .v-list-item').should('have.length', 2) - cy.get('.v-overlay__content .v-list-item .v-list-item-title').eq(0).should('have.text', 'Item 3') - cy.get('.v-overlay__content .v-list-item .v-list-item-title').eq(1).should('have.text', 'Item 4') - }) - }) - - // https://github.com/vuetifyjs/vuetify/issues/17120 - it('should display 0 when selected', () => { - const items = [0, 1, 2, 3, 4] - - const selectedItems = ref(undefined) - - cy.mount(() => ( - - )) - .get('.v-field input') - .click() - - cy.get('.v-list-item').eq(0) - .click({ waitForAnimations: false }) - - cy.get('.v-combobox input') - .should('have.value', '0') - }) - - it('should conditionally show placeholder', () => { - cy.mount(props => ( - - )) - .get('.v-combobox input') - .should('have.attr', 'placeholder', 'Placeholder') - .setProps({ label: 'Label' }) - .get('.v-combobox input') - .should('not.be.visible') - .get('.v-combobox input') - .focus() - .should('have.attr', 'placeholder', 'Placeholder') - .should('be.visible') - .blur() - .setProps({ persistentPlaceholder: true }) - .get('.v-combobox input') - .should('have.attr', 'placeholder', 'Placeholder') - .should('be.visible') - .setProps({ modelValue: 'Foobar' }) - .get('.v-combobox input') - .should('not.have.attr', 'placeholder') - .setProps({ multiple: true, modelValue: ['Foobar'] }) - .get('.v-combobox input') - .should('not.have.attr', 'placeholder') - }) - - it('should keep TextField focused while selecting items from open menu', () => { - cy.mount(() => ( - - )) - - cy.get('.v-combobox') - .click() - - cy.get('.v-list') - .trigger('keydown', { key: keyValues.down, waitForAnimations: false }) - .trigger('keydown', { key: keyValues.down, waitForAnimations: false }) - .trigger('keydown', { key: keyValues.down, waitForAnimations: false }) - - cy.get('.v-field').should('have.class', 'v-field--focused') - }) - - it('should not open menu when closing a chip', () => { - cy - .mount(() => ( - - )) - .get('.v-combobox') - .should('not.have.class', 'v-combobox--active-menu') - .get('.v-chip__close').eq(1) - .click() - .get('.v-combobox') - .should('not.have.class', 'v-combobox--active-menu') - .get('.v-chip__close') - .click() - .get('.v-combobox') - .should('not.have.class', 'v-combobox--active-menu') - .click() - .should('have.class', 'v-combobox--active-menu') - .trigger('keydown', { key: keyValues.esc }) - .should('not.have.class', 'v-combobox--active-menu') - }) - - describe('auto-select-first', () => { - it('should auto-select-first item when pressing enter', () => { - cy - .mount(() => ( - - )) - .get('.v-combobox') - .click() - .get('.v-list-item') - .should('have.length', 6) - .get('.v-combobox input') - .type('Cal') - .get('.v-list-item').eq(0) - .should('have.class', 'v-list-item--active') - .get('.v-combobox input') - .trigger('keydown', { key: keyValues.enter, waitForAnimations: false }) - .get('.v-list-item') - .should('have.length', 6) - }) - - it('should auto-select-first item when pressing tab', () => { - const selectedItems = ref([]) - - cy - .mount(() => ( - - )) - .get('.v-combobox') - .click() - .get('.v-list-item') - .should('have.length', 6) - .get('.v-combobox input') - .type('Cal') - .get('.v-list-item').eq(0) - .should('have.class', 'v-list-item--active') - .realPress('Tab') - .get('.v-list-item') - .should('have.length', 0) - .then(_ => { - expect(selectedItems.value).to.deep.equal(['California']) - }) - }) - - it('should not auto-select-first item when blur', () => { - const selectedItems = ref(undefined) - - cy - .mount(() => ( - - )) - .get('.v-combobox') - .click() - .get('.v-list-item') - .should('have.length', 6) - .get('.v-combobox input') - .type('Cal') - .get('.v-list-item').eq(0) - .should('have.class', 'v-list-item--active') - .get('.v-combobox input') - .blur() - .get('.v-list-item') - .should('have.length', 0) - .should(_ => { - expect(selectedItems.value).to.deep.equal(['Cal']) - }) - }) - }) - - it(`doesn't add duplicate values`, () => { - cy - .mount(() => ( - - )) - .get('.v-combobox input') - .click() - .type('foo{enter}') - .type('bar{enter}') - .get('.v-combobox__selection') - .should('have.length', 2) - .get('.v-combobox input') - .type('foo{enter}') - .get('.v-combobox__selection') - .should('have.length', 2) - }) - - // https://github.com/vuetifyjs/vuetify/issues/18796 - it('should allow deleting selection via closable-chips', () => { - const selectedItem = ref('California') - - cy.mount(() => ( - - )) - .get('.v-chip__close') - .click() - .then(_ => { - expect(selectedItem.value).to.equal(null) - }) - }) - - // https://github.com/vuetifyjs/vuetify/issues/18556 - it('should show menu if focused and items are added', () => { - cy - .mount(props => ()) - .get('.v-combobox input') - .focus() - .get('.v-overlay') - .should('not.exist') - .setProps({ items: ['Foo', 'Bar'] }) - .get('.v-overlay') - .should('exist') - }) - - // https://github.com/vuetifyjs/vuetify/issues/19346 - it('should not show menu when focused and existing non-empty items are changed', () => { - cy - .mount((props: any) => ()) - .setProps({ items: ['Foo', 'Bar'] }) - .get('.v-combobox') - .click() - .get('.v-overlay') - .should('exist') - .get('.v-list-item').eq(0).click({ waitForAnimations: false }) - .setProps({ items: ['Foo', 'Bar', 'test'] }) - .get('.v-overlay') - .should('not.exist') - }) - - // https://github.com/vuetifyjs/vuetify/issues/17573 - // When using selection slot or chips, input displayed next to chip/selection slot should be always empty - it('should always have empty input value when it is unfocused and when using selection slot or chips', () => { - const items = ['Item 1', 'Item 2', 'Item 3', 'Item 4'] - const selectedItem = ref('Item 1') - - cy - .mount(() => ( - - )) - .get('.v-combobox').click() - .get('.v-combobox input').should('have.value', '') - // Blur input with a custom search input value - .type('test') - .blur() - .should('have.value', '') - .should(() => { - expect(selectedItem.value).to.equal('test') - }) - // Press enter key with a custom search input value - .get('.v-combobox').click() - .get('.v-combobox input').should('have.value', '') - .type('test 2') - .trigger('keydown', { key: keyValues.enter, waitForAnimations: false }) - .should('have.value', '') - .should(() => { - expect(selectedItem.value).to.equal('test 2') - }) - // Search existing item and click to select - .get('.v-combobox').click() - .get('.v-combobox input').type('Item 1') - .get('.v-list-item').eq(0).click({ waitForAnimations: false }) - .get('.v-combobox input').should('have.value', '') - .should(() => { - expect(selectedItem.value).to.equal('Item 1') - }) - }) - - // https://github.com/vuetifyjs/vuetify/issues/19319 - it('should respect return-object when blurring', () => { - const items = [ - { title: 'Item 1', value: 'item1' }, - { title: 'Item 2', value: 'item2' }, - { title: 'Item 3', value: 'item3' }, - { title: 'Item 4', value: 'item4' }, - ] - const model = ref() - const search = ref() - - cy.mount(() => ( - - )) - .get('.v-combobox').click() - .get('.v-list-item').eq(0).click({ waitForAnimations: false }) - .should(() => { - expect(model.value).to.deep.equal({ title: 'Item 1', value: 'item1' }) - }) - .get('.v-combobox input').blur() - .should(() => { - expect(model.value).to.deep.equal({ title: 'Item 1', value: 'item1' }) - }) - }) - - describe('Showcase', () => { - generate({ stories }) - }) -}) diff --git a/packages/vuetify/src/components/VDataTable/__tests__/headers.spec.ts b/packages/vuetify/src/components/VDataTable/__tests__/headers.spec.ts index ba5dc1899d1..c85fa867f92 100644 --- a/packages/vuetify/src/components/VDataTable/__tests__/headers.spec.ts +++ b/packages/vuetify/src/components/VDataTable/__tests__/headers.spec.ts @@ -1,5 +1,4 @@ // Utilities -import { expect, it } from 'vitest' import { createHeaders } from '../composables/headers' describe('VDataTable headers', () => { diff --git a/packages/vuetify/src/components/VDataTable/__tests__/sort.spec.ts b/packages/vuetify/src/components/VDataTable/__tests__/sort.spec.ts index 477aa4e8dc7..59723ba1152 100644 --- a/packages/vuetify/src/components/VDataTable/__tests__/sort.spec.ts +++ b/packages/vuetify/src/components/VDataTable/__tests__/sort.spec.ts @@ -5,7 +5,6 @@ import { sortItems as _sortItems } from '../composables/sort' // Utilities import { mount } from '@vue/test-utils' -import { expect, it } from 'vitest' // Types import type { SortItem } from '../composables/sort' diff --git a/packages/vuetify/src/components/VFileInput/__tests__/VFileInput.spec.cy.tsx b/packages/vuetify/src/components/VFileInput/__tests__/VFileInput.spec.browser.tsx similarity index 97% rename from packages/vuetify/src/components/VFileInput/__tests__/VFileInput.spec.cy.tsx rename to packages/vuetify/src/components/VFileInput/__tests__/VFileInput.spec.browser.tsx index fcfa4889a0c..9a5073bc135 100644 --- a/packages/vuetify/src/components/VFileInput/__tests__/VFileInput.spec.cy.tsx +++ b/packages/vuetify/src/components/VFileInput/__tests__/VFileInput.spec.browser.tsx @@ -1,11 +1,8 @@ -/// - -import { CenteredGrid, generate } from '@/../cypress/templates' - // Components import { VFileInput } from '../VFileInput' // Utilities +import { CenteredGrid, generate } from '@test' import { cloneVNode, ref } from 'vue' const oneMBFile = new File([new ArrayBuffer(1021576)], '1MB file') @@ -18,7 +15,6 @@ const items = ['California', 'Colorado', 'Florida', 'Georgia', 'Texas', 'Wyoming const stories = Object.fromEntries(Object.entries({ 'Default input': , Disabled: , - Affixes: , 'Prepend/append': , 'Prepend/append inner': , Placeholder: , @@ -48,7 +44,7 @@ const stories = Object.fromEntries(Object.entries({ )])) -describe('VFileInput', () => { +describe.skip('VFileInput', () => { it('should add file', () => { cy.mount(() => ( @@ -230,7 +226,10 @@ describe('VFileInput', () => { expect(input.files).to.have.length(0) }) }) +}) +// eslint-disable-next-line vitest/no-identical-title +describe('VFileInput', () => { describe('Showcase', () => { generate({ stories }) }) diff --git a/packages/vuetify/src/components/VFileInput/__tests__/VFileInput.spec.tsx b/packages/vuetify/src/components/VFileInput/__tests__/VFileInput.spec.tsx index 0b129da50d4..4b03dfe2a15 100644 --- a/packages/vuetify/src/components/VFileInput/__tests__/VFileInput.spec.tsx +++ b/packages/vuetify/src/components/VFileInput/__tests__/VFileInput.spec.tsx @@ -2,7 +2,6 @@ import { VFileInput } from '../VFileInput' // Utilities import { mount } from '@vue/test-utils' -import { describe, expect, it, vi } from 'vitest' import { createVuetify } from '@/framework' describe('VFileInput', () => { diff --git a/packages/vuetify/src/components/VGrid/__tests__/VCol.spec.ts b/packages/vuetify/src/components/VGrid/__tests__/VCol.spec.ts index fc94f974bec..01dcf307c72 100644 --- a/packages/vuetify/src/components/VGrid/__tests__/VCol.spec.ts +++ b/packages/vuetify/src/components/VGrid/__tests__/VCol.spec.ts @@ -1,6 +1,5 @@ // Utilities import { mount } from '@vue/test-utils' -import { expect, it } from 'vitest' import { VCol } from '../VCol' import { createVuetify } from '@/framework' diff --git a/packages/vuetify/src/components/VInput/__tests__/VInput.spec.cy.tsx b/packages/vuetify/src/components/VInput/__tests__/VInput.spec.browser.tsx similarity index 83% rename from packages/vuetify/src/components/VInput/__tests__/VInput.spec.cy.tsx rename to packages/vuetify/src/components/VInput/__tests__/VInput.spec.browser.tsx index 6a437a0ffb3..ba96423bdf4 100644 --- a/packages/vuetify/src/components/VInput/__tests__/VInput.spec.cy.tsx +++ b/packages/vuetify/src/components/VInput/__tests__/VInput.spec.browser.tsx @@ -1,18 +1,15 @@ -/// - // Components import { VInput } from '../VInput' // Utilities +import { generate } from '@test' import { cloneVNode } from 'vue' -import { generate } from '../../../../cypress/templates' const densities = ['default', 'comfortable', 'compact'] const stories = Object.fromEntries(Object.entries({ Default: , Disabled: , - Affixes: , PrependAppend: , Hint: , Messages: , diff --git a/packages/vuetify/src/components/VItemGroup/__tests__/VItemGroup.spec.ts b/packages/vuetify/src/components/VItemGroup/__tests__/VItemGroup.spec.ts index 82910d5afb2..e43637d739c 100644 --- a/packages/vuetify/src/components/VItemGroup/__tests__/VItemGroup.spec.ts +++ b/packages/vuetify/src/components/VItemGroup/__tests__/VItemGroup.spec.ts @@ -4,7 +4,6 @@ import { VItemGroup } from '../VItemGroup' // Utilities import { mount } from '@vue/test-utils' -import { expect, it } from 'vitest' import { h } from 'vue' import { createVuetify } from '@/framework' diff --git a/packages/vuetify/src/components/VList/VListItem.tsx b/packages/vuetify/src/components/VList/VListItem.tsx index fae894279cd..dcd422e06ba 100644 --- a/packages/vuetify/src/components/VList/VListItem.tsx +++ b/packages/vuetify/src/components/VList/VListItem.tsx @@ -244,6 +244,7 @@ export const VListItem = genericComponent()({ props.style, ]} tabindex={ isClickable.value ? (list ? -2 : 0) : undefined } + aria-selected={ root.activatable.value ? isActivated.value : isSelected.value } onClick={ onClick } onKeydown={ isClickable.value && !isLink.value && onKeyDown } v-ripple={ isClickable.value && props.ripple } diff --git a/packages/vuetify/src/components/VList/__tests__/VList.spec.ts b/packages/vuetify/src/components/VList/__tests__/VList.spec.ts index 58a6a31d5d2..59eebb5816d 100644 --- a/packages/vuetify/src/components/VList/__tests__/VList.spec.ts +++ b/packages/vuetify/src/components/VList/__tests__/VList.spec.ts @@ -3,7 +3,6 @@ import { VList } from '..' // Utilities import { mount } from '@vue/test-utils' -import { expect, it } from 'vitest' import { createVuetify } from '@/framework' describe('VList', () => { diff --git a/packages/vuetify/src/components/VList/__tests__/VListItemMedia.spec.ts b/packages/vuetify/src/components/VList/__tests__/VListItemMedia.spec.ts index bd799bd8200..a73cab175d4 100644 --- a/packages/vuetify/src/components/VList/__tests__/VListItemMedia.spec.ts +++ b/packages/vuetify/src/components/VList/__tests__/VListItemMedia.spec.ts @@ -3,7 +3,6 @@ import { VListItemMedia } from '..' // Utilities import { mount } from '@vue/test-utils' -import { expect, it } from 'vitest' import { createVuetify } from '@/framework' describe('VListItemMedia', () => { diff --git a/packages/vuetify/src/components/VResponsive/__tests__/VResponsive.spec.ts b/packages/vuetify/src/components/VResponsive/__tests__/VResponsive.spec.ts index 5257be49b7b..b681e41c146 100644 --- a/packages/vuetify/src/components/VResponsive/__tests__/VResponsive.spec.ts +++ b/packages/vuetify/src/components/VResponsive/__tests__/VResponsive.spec.ts @@ -3,7 +3,6 @@ import { VResponsive } from '..' // Utilities import { mount } from '@vue/test-utils' -import { expect, it } from 'vitest' import { h } from 'vue' import { createVuetify } from '@/framework' diff --git a/packages/vuetify/src/components/VSelect/__tests__/VSelect.spec.cy.tsx b/packages/vuetify/src/components/VSelect/__tests__/VSelect.spec.browser.tsx similarity index 99% rename from packages/vuetify/src/components/VSelect/__tests__/VSelect.spec.cy.tsx rename to packages/vuetify/src/components/VSelect/__tests__/VSelect.spec.browser.tsx index fd60cd9c537..da44cfa6808 100644 --- a/packages/vuetify/src/components/VSelect/__tests__/VSelect.spec.cy.tsx +++ b/packages/vuetify/src/components/VSelect/__tests__/VSelect.spec.browser.tsx @@ -1,13 +1,11 @@ -/// - // Components import { VSelect } from '../VSelect' import { VForm } from '@/components/VForm' import { VListItem } from '@/components/VList' // Utilities +import { generate } from '@test' import { cloneVNode, ref } from 'vue' -import { generate } from '../../../../cypress/templates' import { keyValues } from '@/util' const variants = ['underlined', 'outlined', 'filled', 'solo', 'plain'] as const @@ -47,7 +45,7 @@ const stories = Object.fromEntries(Object.entries({ )])) -describe('VSelect', () => { +describe.skip('VSelect', () => { it('should render selection slot', () => { const items = [ { title: 'a' }, @@ -636,7 +634,10 @@ describe('VSelect', () => { .get('.v-overlay') .should('not.exist') }) +}) +// eslint-disable-next-line vitest/no-identical-title +describe('VSelect', () => { describe('Showcase', () => { generate({ stories }) }) diff --git a/packages/vuetify/src/components/VSelectionControl/__tests__/VSelectionControl.spec.tsx b/packages/vuetify/src/components/VSelectionControl/__tests__/VSelectionControl.spec.tsx index c42bd239f69..f77d0a70946 100644 --- a/packages/vuetify/src/components/VSelectionControl/__tests__/VSelectionControl.spec.tsx +++ b/packages/vuetify/src/components/VSelectionControl/__tests__/VSelectionControl.spec.tsx @@ -3,7 +3,6 @@ import { makeVSelectionControlProps, useSelectionControl } from '../VSelectionCo // Utilities import { mount } from '@vue/test-utils' -import { describe, expect, it, vi } from 'vitest' import { defineComponent, nextTick } from 'vue' import { createVuetify } from '@/framework' diff --git a/packages/vuetify/src/components/VSwitch/__tests__/VSwitch.spec.cy.tsx b/packages/vuetify/src/components/VSwitch/__tests__/VSwitch.spec.browser.tsx similarity index 78% rename from packages/vuetify/src/components/VSwitch/__tests__/VSwitch.spec.cy.tsx rename to packages/vuetify/src/components/VSwitch/__tests__/VSwitch.spec.browser.tsx index 5b9afbf0de8..841559dd246 100644 --- a/packages/vuetify/src/components/VSwitch/__tests__/VSwitch.spec.cy.tsx +++ b/packages/vuetify/src/components/VSwitch/__tests__/VSwitch.spec.browser.tsx @@ -1,7 +1,7 @@ -/// - import { VSwitch } from '../VSwitch' -import { generate, gridOn } from '@/../cypress/templates' + +// Utilities +import { generate, gridOn } from '@test' const contextColor = 'rgb(0, 0, 255)' const color = 'rgb(255, 0, 0)' @@ -20,9 +20,14 @@ const stories = { )), } +const props = { + loading: [true], + inset: [true], + indeterminate: [true], +} describe('VSwitch', () => { describe('Showcase', () => { - generate({ stories, props: {}, component: VSwitch }) + generate({ stories, props, component: VSwitch }) }) }) diff --git a/packages/vuetify/src/components/VTextField/__tests__/VTextField.spec.cy.tsx b/packages/vuetify/src/components/VTextField/__tests__/VTextField.spec.browser.tsx similarity index 96% rename from packages/vuetify/src/components/VTextField/__tests__/VTextField.spec.cy.tsx rename to packages/vuetify/src/components/VTextField/__tests__/VTextField.spec.browser.tsx index 0921161c883..d68527938ce 100644 --- a/packages/vuetify/src/components/VTextField/__tests__/VTextField.spec.cy.tsx +++ b/packages/vuetify/src/components/VTextField/__tests__/VTextField.spec.browser.tsx @@ -1,10 +1,8 @@ -/// - import { VTextField } from '../VTextField' // Utilities +import { generate } from '@test' import { cloneVNode } from 'vue' -import { generate } from '../../../../cypress/templates' const variants = ['underlined', 'outlined', 'filled', 'solo', 'plain'] as const const densities = ['default', 'comfortable', 'compact'] as const @@ -29,7 +27,7 @@ const stories = Object.fromEntries(Object.entries({ )])) -describe('VTextField', () => { +describe.skip('VTextField', () => { it('validates input on mount', () => { const rule = cy.spy(v => v?.length > 4 || 'Error!').as('rule') @@ -88,7 +86,10 @@ describe('VTextField', () => { )) .get('.v-input__details').should('be.visible') }) +}) +// eslint-disable-next-line vitest/no-identical-title +describe('VTextField', () => { describe('Showcase', () => { generate({ stories }) }) diff --git a/packages/vuetify/src/components/VTextField/__tests__/VTextField.spec.tsx b/packages/vuetify/src/components/VTextField/__tests__/VTextField.spec.tsx index 2532399c57e..1eb24c6de53 100644 --- a/packages/vuetify/src/components/VTextField/__tests__/VTextField.spec.tsx +++ b/packages/vuetify/src/components/VTextField/__tests__/VTextField.spec.tsx @@ -2,7 +2,6 @@ import { VTextField } from '../VTextField' // Utilities import { mount } from '@vue/test-utils' -import { describe, expect, it, vi } from 'vitest' import { createVuetify } from '@/framework' describe('VTextField', () => { diff --git a/packages/vuetify/src/components/VTextarea/__tests__/VTextarea.spec.tsx b/packages/vuetify/src/components/VTextarea/__tests__/VTextarea.spec.tsx index 4aad3d728e1..e05bde32a5e 100644 --- a/packages/vuetify/src/components/VTextarea/__tests__/VTextarea.spec.tsx +++ b/packages/vuetify/src/components/VTextarea/__tests__/VTextarea.spec.tsx @@ -2,7 +2,6 @@ import { VTextarea } from '../VTextarea' // Utilities import { mount } from '@vue/test-utils' -import { describe, expect, it, vi } from 'vitest' import { createVuetify } from '@/framework' describe('VTextarea', () => { diff --git a/packages/vuetify/src/components/VVirtualScroll/__tests__/VVirtualScroll.spec.browser.tsx b/packages/vuetify/src/components/VVirtualScroll/__tests__/VVirtualScroll.spec.browser.tsx new file mode 100644 index 00000000000..f99d914ad36 --- /dev/null +++ b/packages/vuetify/src/components/VVirtualScroll/__tests__/VVirtualScroll.spec.browser.tsx @@ -0,0 +1,51 @@ +// Components +import { VVirtualScroll } from '../VVirtualScroll' + +// Utilities +import { render, scroll, waitIdle } from '@test' +import { createRange } from '@/util' + +describe('VVirtualScroll', () => { + it('only renders visible items', async () => { + const items = createRange(1000) + + const { container } = render(() => ( + + {{ + default: ({ index }) => ( +
{ index }
+ ), + }} +
+ )) + + const elements = container.querySelectorAll('.v-virtual-scroll__item') + expect(elements.length).toBeGreaterThan(10) + expect(elements.length).toBeLessThan(50) + }) + + it('reuses the same elements', async () => { + const items = createRange(1000) + + const result = render(() => ( + + {{ + default: ({ item, index }) => ( +
{ index }
+ ), + }} +
+ )) + + const root = result.container.querySelector('.v-virtual-scroll')! + + await waitIdle() + const el = await result.findByText(16) + await scroll({ top: 400, behavior: 'smooth' }, root) + expect(await result.findByText(16)).toBe(el) + + await scroll({ top: 800, behavior: 'smooth' }, root) + await scroll({ top: 200, behavior: 'smooth' }, root) + expect(await result.findByText(16)).not.toBe(el) + }) +}) diff --git a/packages/vuetify/src/components/VVirtualScroll/__tests__/VVirtualScroll.spec.cy.tsx b/packages/vuetify/src/components/VVirtualScroll/__tests__/VVirtualScroll.spec.cy.tsx deleted file mode 100644 index 4813a8d00b7..00000000000 --- a/packages/vuetify/src/components/VVirtualScroll/__tests__/VVirtualScroll.spec.cy.tsx +++ /dev/null @@ -1,47 +0,0 @@ -/// - -// Components -import { VVirtualScroll } from '../VVirtualScroll' - -// Utilities -import { createRange } from '@/util' - -describe('VVirtualScroll', () => { - it('only renders visible items', () => { - const items = createRange(1000) - - cy.mount(() => ( - - {{ - default: ({ item, index }) => ( -
{ index }
- ), - }} -
- )) - - cy.get('.v-virtual-scroll__item').should('have.length.above', 10).should('have.length.below', 50) - }) - - it('reuses the same elements', () => { - const items = createRange(1000) - - cy.mount(() => ( - - {{ - default: ({ item, index }) => ( -
{ index }
- ), - }} -
- )) - - cy.get('.v-virtual-scroll__item').contains('15') - .then($el => { - cy.get('.v-virtual-scroll').scrollTo(0, 320, { duration: 50 }) - cy.get('.v-virtual-scroll__item').contains('15').then($el2 => { - expect($el2[0]).to.equal($el[0]) - }) - }) - }) -}) diff --git a/packages/vuetify/src/composables/__tests__/border.spec.ts b/packages/vuetify/src/composables/__tests__/border.spec.ts index 3886aedc549..abb1c1054bf 100644 --- a/packages/vuetify/src/composables/__tests__/border.spec.ts +++ b/packages/vuetify/src/composables/__tests__/border.spec.ts @@ -3,7 +3,6 @@ import { makeBorderProps, useBorder } from '../border' // Utilities import { mount } from '@vue/test-utils' -import { expect, it } from 'vitest' // Types import type { BorderProps } from '../border' diff --git a/packages/vuetify/src/composables/__tests__/calendar.spec.cy.tsx b/packages/vuetify/src/composables/__tests__/calendar.spec.cy.tsx deleted file mode 100644 index 7f3aeb68ff5..00000000000 --- a/packages/vuetify/src/composables/__tests__/calendar.spec.cy.tsx +++ /dev/null @@ -1,38 +0,0 @@ -/// - -// Composables -import { makeCalendarProps, useCalendar } from '@/composables/calendar' -import { useDate } from '@/composables/date' - -// Utilities -import { defineComponent } from 'vue' - -const Component = defineComponent({ - props: makeCalendarProps(), - setup (props) { - const { daysInMonth, displayValue } = useCalendar(props as any) - const date = useDate() - - return () => ( -
-
- { date.format(displayValue.value, 'monthAndYear') } -
- -
- { daysInMonth.value.map((day: any) => ( -
{ day.isoDate }
- ))} -
-
- ) - }, -}) - -describe('calendar.ts', () => { - it('render days based upon displayValue', () => { - cy - .mount(() => ()) - .percySnapshot() - }) -}) diff --git a/packages/vuetify/src/composables/__tests__/calendar.spec.ts b/packages/vuetify/src/composables/__tests__/calendar.spec.ts new file mode 100644 index 00000000000..27c120dbe97 --- /dev/null +++ b/packages/vuetify/src/composables/__tests__/calendar.spec.ts @@ -0,0 +1,73 @@ +// Composables +import { makeCalendarProps, useCalendar } from '@/composables/calendar' +import { useDate } from '@/composables/date' + +// Utilities +import { mount } from '@vue/test-utils' +import { defineComponent } from 'vue' +import { createVuetify } from '@/framework' + +describe('calendar', () => { + it('renders days based upon displayValue', () => { + expect.assertions(2) + mount(defineComponent({ + props: makeCalendarProps(), + setup (props) { + const calendar = useCalendar({ ...props, displayValue: '2021-10-10' } as any) + const date = useDate() + + expect(date.format(calendar.displayValue.value, 'monthAndYear')).toMatchInlineSnapshot(`"October 2021"`) + expect(calendar.daysInMonth.value.map(day => day.isoDate)).toMatchInlineSnapshot(` + [ + "2021-09-26", + "2021-09-27", + "2021-09-28", + "2021-09-29", + "2021-09-30", + "2021-10-01", + "2021-10-02", + "2021-10-03", + "2021-10-04", + "2021-10-05", + "2021-10-06", + "2021-10-07", + "2021-10-08", + "2021-10-09", + "2021-10-10", + "2021-10-11", + "2021-10-12", + "2021-10-13", + "2021-10-14", + "2021-10-15", + "2021-10-16", + "2021-10-17", + "2021-10-18", + "2021-10-19", + "2021-10-20", + "2021-10-21", + "2021-10-22", + "2021-10-23", + "2021-10-24", + "2021-10-25", + "2021-10-26", + "2021-10-27", + "2021-10-28", + "2021-10-29", + "2021-10-30", + "2021-10-31", + "2021-11-01", + "2021-11-02", + "2021-11-03", + "2021-11-04", + "2021-11-05", + "2021-11-06", + ] + `) + + return () => {} + }, + }), { + global: { plugins: [createVuetify()] }, + }) + }) +}) diff --git a/packages/vuetify/src/composables/__tests__/color.spec.ts b/packages/vuetify/src/composables/__tests__/color.spec.ts index a3c8f716e80..cb96018f377 100644 --- a/packages/vuetify/src/composables/__tests__/color.spec.ts +++ b/packages/vuetify/src/composables/__tests__/color.spec.ts @@ -2,7 +2,6 @@ import { useBackgroundColor, useColor, useTextColor } from '../color' // Utilities -import { expect, it } from 'vitest' import { reactive, toRef } from 'vue' describe('color.ts', () => { diff --git a/packages/vuetify/src/composables/__tests__/defaults.spec.ts b/packages/vuetify/src/composables/__tests__/defaults.spec.ts index 6e6dd589a95..4fd099a08a4 100644 --- a/packages/vuetify/src/composables/__tests__/defaults.spec.ts +++ b/packages/vuetify/src/composables/__tests__/defaults.spec.ts @@ -3,7 +3,6 @@ import { VBtn } from '@/components/VBtn' // Utilities import { mount } from '@vue/test-utils' -import { expect, it } from 'vitest' import { createVuetify } from '@/framework' describe('defaults', () => { diff --git a/packages/vuetify/src/composables/__tests__/delay.spec.ts b/packages/vuetify/src/composables/__tests__/delay.spec.ts index 3c4345d58aa..adcd8787ff1 100644 --- a/packages/vuetify/src/composables/__tests__/delay.spec.ts +++ b/packages/vuetify/src/composables/__tests__/delay.spec.ts @@ -3,7 +3,6 @@ import { makeDelayProps, useDelay } from '../delay' // Utilities import { mount } from '@vue/test-utils' -import { expect, it } from 'vitest' import { wait } from '@/../test' describe('delayProps', () => { diff --git a/packages/vuetify/src/composables/__tests__/dimensions.spec.ts b/packages/vuetify/src/composables/__tests__/dimensions.spec.ts index 0ae905575aa..60cbd5a6c45 100644 --- a/packages/vuetify/src/composables/__tests__/dimensions.spec.ts +++ b/packages/vuetify/src/composables/__tests__/dimensions.spec.ts @@ -1,5 +1,4 @@ // Utilities -import { expect, it } from 'vitest' import { useDimension } from '../dimensions' // Types diff --git a/packages/vuetify/src/composables/__tests__/display-components.spec.browser.tsx b/packages/vuetify/src/composables/__tests__/display-components.spec.browser.tsx new file mode 100644 index 00000000000..cea846c10f9 --- /dev/null +++ b/packages/vuetify/src/composables/__tests__/display-components.spec.browser.tsx @@ -0,0 +1,49 @@ +/* eslint-disable max-len */ + +// Components +import { VBanner } from '@/components/VBanner/VBanner' +import { VLayout } from '@/components/VLayout/VLayout' +import { VMain } from '@/components/VMain' +import { VNavigationDrawer } from '@/components/VNavigationDrawer/VNavigationDrawer' +import { VSlideGroup } from '@/components/VSlideGroup/VSlideGroup' + +// Utilities +import { render } from '@test' +import { page } from '@vitest/browser/context' +import { ref } from 'vue' + +// Types +import type { DisplayBreakpoint } from '@/composables' + +describe('display-components', () => { + it('should render items', async () => { + await page.viewport(960, 800) + + const mobileBreakpoint = ref('lg') + const { container } = render(() => ( + + + + + Lorem ipsum dolor sit amet consectetur adipisicing elit. Dicta quaerat fugit ratione totam magnam, beatae consequuntur qui quam enim et sapiente autem accusantium id nesciunt maiores obcaecati minus molestiae! Ipsa. + + + + + )) + + const navigationDrawer = container.querySelector('.v-navigation-drawer') + const banner = container.querySelector('.v-banner') + const slideGroup = container.querySelector('.v-slide-group') + + expect(navigationDrawer).toHaveClass('v-navigation-drawer--mobile') + expect(banner).toHaveClass('v-banner--mobile') + expect(slideGroup).toHaveClass('v-slide-group--mobile') + + mobileBreakpoint.value = 959 + + await expect.poll(() => navigationDrawer).not.toHaveClass('v-navigation-drawer--mobile') + await expect.poll(() => banner).not.toHaveClass('v-banner--mobile') + await expect.poll(() => slideGroup).not.toHaveClass('v-slide-group--mobile') + }) +}) diff --git a/packages/vuetify/src/composables/__tests__/display.spec.ts b/packages/vuetify/src/composables/__tests__/display.spec.browser.ts similarity index 91% rename from packages/vuetify/src/composables/__tests__/display.spec.ts rename to packages/vuetify/src/composables/__tests__/display.spec.browser.ts index 0074283bafd..5dbc704668e 100644 --- a/packages/vuetify/src/composables/__tests__/display.spec.ts +++ b/packages/vuetify/src/composables/__tests__/display.spec.browser.ts @@ -2,8 +2,7 @@ import { createDisplay } from '../display' // Utilities -import { expect, it } from 'vitest' -import { resizeWindow } from '@/../test' +import { page } from '@vitest/browser/context' const breakpoints = [ 'xs', @@ -261,7 +260,7 @@ describe('display', () => { ], ], ])('should calculate breakpoint for $description', async (options, expected) => { - await resizeWindow(options.width, options.height) + await page.viewport(options.width, options.height) const display = createDisplay() @@ -278,20 +277,20 @@ describe('display', () => { thresholds: { sm: 400 }, }) - await resizeWindow(400) - expect(name.value).toBe('sm') + await page.viewport(400, 900) + await expect.poll(() => name.value).toBe('sm') - await resizeWindow(399) - expect(name.value).toBe('xs') + await page.viewport(399, 900) + await expect.poll(() => name.value).toBe('xs') }) it('should allow breakpoint strings for mobileBreakpoint', async () => { const { mobile } = createDisplay({ mobileBreakpoint: 'lg' }) - await resizeWindow(1920) - expect(mobile.value).toBe(false) + await page.viewport(1920, 900) + await expect.poll(() => mobile.value).toBe(false) - await resizeWindow(600) - expect(mobile.value).toBe(true) + await page.viewport(600, 900) + await expect.poll(() => mobile.value).toBe(true) }) }) diff --git a/packages/vuetify/src/composables/__tests__/display.spec.cy.tsx b/packages/vuetify/src/composables/__tests__/display.spec.cy.tsx deleted file mode 100644 index 09fd49ff1dd..00000000000 --- a/packages/vuetify/src/composables/__tests__/display.spec.cy.tsx +++ /dev/null @@ -1,38 +0,0 @@ -/* eslint-disable max-len */ -/// - -// Components -import { VBanner } from '@/components/VBanner/VBanner' -import { VLayout } from '@/components/VLayout/VLayout' -import { VMain } from '@/components/VMain' -import { VNavigationDrawer } from '@/components/VNavigationDrawer/VNavigationDrawer' -import { VSlideGroup } from '@/components/VSlideGroup/VSlideGroup' - -describe('VWindow', () => { - it('should render items', () => { - cy.viewport(960, 800) - .mount(({ mobileBreakpoint }: any) => ( - - - - - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Dicta quaerat fugit ratione totam magnam, beatae consequuntur qui quam enim et sapiente autem accusantium id nesciunt maiores obcaecati minus molestiae! Ipsa. - - - - - - )) - - cy - .setProps({ mobileBreakpoint: 'lg' }) - .get('.v-navigation-drawer').should('have.class', 'v-navigation-drawer--mobile') - .get('.v-banner').should('have.class', 'v-banner--mobile') - .get('.v-slide-group').should('have.class', 'v-slide-group--mobile') - .setProps({ mobileBreakpoint: 959 }) - .get('.v-navigation-drawer').should('not.have.class', 'v-navigation-drawer--mobile') - .get('.v-banner').should('not.have.class', 'v-banner--mobile') - .get('.v-slide-group').should('not.have.class', 'v-slide-group--mobile') - }) -}) diff --git a/packages/vuetify/src/composables/__tests__/elevation.spec.ts b/packages/vuetify/src/composables/__tests__/elevation.spec.ts index d88dd91f796..a92b4f1bcbc 100644 --- a/packages/vuetify/src/composables/__tests__/elevation.spec.ts +++ b/packages/vuetify/src/composables/__tests__/elevation.spec.ts @@ -2,7 +2,6 @@ import { makeElevationProps, useElevation } from '../elevation' // Utilities -import { expect, it } from 'vitest' // Utilities diff --git a/packages/vuetify/src/composables/__tests__/filter.spec.ts b/packages/vuetify/src/composables/__tests__/filter.spec.ts index 2c6d1bdc8fd..751fd2e52b7 100644 --- a/packages/vuetify/src/composables/__tests__/filter.spec.ts +++ b/packages/vuetify/src/composables/__tests__/filter.spec.ts @@ -3,7 +3,6 @@ import { defaultFilter, filterItems, useFilter } from '../filter' import { transformItem, transformItems } from '../list-items' // Utilities -import { expect, it } from 'vitest' import { nextTick, ref } from 'vue' import { deepEqual } from '@/util' diff --git a/packages/vuetify/src/composables/__tests__/forwardRefs.spec.tsx b/packages/vuetify/src/composables/__tests__/forwardRefs.spec.tsx index d35dfb04fd8..ed6f24b853b 100644 --- a/packages/vuetify/src/composables/__tests__/forwardRefs.spec.tsx +++ b/packages/vuetify/src/composables/__tests__/forwardRefs.spec.tsx @@ -3,7 +3,6 @@ import { forwardRefs } from '@/composables/forwardRefs' // Utilities import { mount } from '@vue/test-utils' -import { expect, it } from 'vitest' import { defineComponent, ref } from 'vue' import { useRender } from '@/util' diff --git a/packages/vuetify/src/composables/__tests__/goto.spec.browser.tsx b/packages/vuetify/src/composables/__tests__/goto.spec.browser.tsx new file mode 100644 index 00000000000..9d18526a152 --- /dev/null +++ b/packages/vuetify/src/composables/__tests__/goto.spec.browser.tsx @@ -0,0 +1,82 @@ +// Utilities +import { render } from '@test' +import { userEvent } from '@testing-library/user-event' +import { defineComponent } from 'vue' +import { useGoTo } from '../goto' + +const ComponentA = defineComponent({ + props: { + target: String, + }, + + setup (props) { + const goTo = useGoTo() + + function onClick () { + return goTo(props.target!) + } + + return () => ( + + ) + }, +}) + +const ComponentB = defineComponent({ + props: { + target: String, + container: String, + }, + + setup (props) { + const goTo = useGoTo() + + function onClick () { + return goTo.horizontal(props.target!, { container: props.container }) + } + + return () => ( + + ) + }, +}) + +describe('goto', () => { + it('scrolls vertically', async () => { + const { container } = render(() => ( +
+ +
+ +
+ )) + + const top = container.querySelector('#top')! + const bottom = container.querySelector('#bottom')! + + await userEvent.click(top) + await expect.poll(() => window.scrollY).toBeCloseTo(1250, -1) + + await userEvent.click(bottom) + await expect.poll(() => window.scrollY).toBe(0) + }) + + it('scrolls horizontally', async () => { + const { container } = render(() => ( +
+ + + +
+ )) + + const start = container.querySelector('#start')! + const end = container.querySelector('#end')! + + await userEvent.click(start) + await expect.poll(() => window.scrollX).toBeCloseTo(755, -1) + + await userEvent.click(end) + await expect.poll(() => window.scrollX).toBe(0) + }) +}) diff --git a/packages/vuetify/src/composables/__tests__/goto.spec.cy.tsx b/packages/vuetify/src/composables/__tests__/goto.spec.cy.tsx deleted file mode 100644 index fa9acc19be3..00000000000 --- a/packages/vuetify/src/composables/__tests__/goto.spec.cy.tsx +++ /dev/null @@ -1,89 +0,0 @@ -/* eslint-disable cypress/no-unnecessary-waiting */ -/// - -// Utilities -import { defineComponent } from 'vue' -import { useGoTo } from '../goto' -import { useRender } from '@/util' - -const ComponentA = defineComponent({ - props: { - id: String, - target: String, - }, - - setup (props) { - const goTo = useGoTo() - - function onClick () { - return goTo(props.target!) - } - - useRender(() => ( - - )) - - return {} - }, -}) - -const ComponentB = defineComponent({ - props: { - id: String, - target: String, - container: String, - }, - - setup (props) { - const goTo = useGoTo() - - function onClick () { - return goTo.horizontal(props.target!, { container: props.container }) - } - - useRender(() => ( - - )) - - return {} - }, -}) - -describe('goto', () => { - it('scrolls vertically', () => { - cy - .mount(() => ( -
- - -
- - -
- )) - .get('#top').click() - .window().should(win => { - expect(Math.ceil(win.scrollY)).to.equal(1223) - }) - .get('#bottom').click() - .window().should(win => { - expect(win.scrollY).to.equal(0) - }) - }) - - it('scrolls horizontally', () => { - cy.viewport(1075, 825) - cy - .mount(() => ( -
- - - -
- )) - .get('#start').click().wait(500) - .get('#end').should('be.visible') - .get('#end').click().wait(500) - .get('#start').should('be.visible') - }) -}) diff --git a/packages/vuetify/src/composables/__tests__/group.spec.ts b/packages/vuetify/src/composables/__tests__/group.spec.ts index d29f00f3440..2bcd25c2f86 100644 --- a/packages/vuetify/src/composables/__tests__/group.spec.ts +++ b/packages/vuetify/src/composables/__tests__/group.spec.ts @@ -1,6 +1,5 @@ // Utilities import { mount } from '@vue/test-utils' -import { expect, it } from 'vitest' import { defineComponent, h, nextTick, reactive, useSlots } from 'vue' import { makeGroupProps, useGroup, useGroupItem } from '../group' diff --git a/packages/vuetify/src/composables/__tests__/icons.spec.ts b/packages/vuetify/src/composables/__tests__/icons.spec.ts index 83782a8e3a0..ab3f6e31dfd 100644 --- a/packages/vuetify/src/composables/__tests__/icons.spec.ts +++ b/packages/vuetify/src/composables/__tests__/icons.spec.ts @@ -3,7 +3,6 @@ import { useIcon } from '../icons' // Utilities import { mount } from '@vue/test-utils' -import { expect, it } from 'vitest' import { defineComponent, toRef } from 'vue' import { createVuetify } from '@/framework' diff --git a/packages/vuetify/src/composables/__tests__/items.spec.ts b/packages/vuetify/src/composables/__tests__/items.spec.ts index c40310ac970..574aa7036f5 100644 --- a/packages/vuetify/src/composables/__tests__/items.spec.ts +++ b/packages/vuetify/src/composables/__tests__/items.spec.ts @@ -2,7 +2,6 @@ import { useItems } from '../list-items' // Utilities -import { expect, it } from 'vitest' import { deepEqual } from '@/util' describe('items', () => { diff --git a/packages/vuetify/src/composables/__tests__/loader.spec.ts b/packages/vuetify/src/composables/__tests__/loader.spec.ts index 12979360c32..e767400fcd0 100644 --- a/packages/vuetify/src/composables/__tests__/loader.spec.ts +++ b/packages/vuetify/src/composables/__tests__/loader.spec.ts @@ -1,5 +1,4 @@ // Utilities -import { expect, it } from 'vitest' import { useLoader } from '../loader' describe('size', () => { diff --git a/packages/vuetify/src/composables/__tests__/location.spec.ts b/packages/vuetify/src/composables/__tests__/location.spec.ts index 76d2cc37542..da71cdf95c1 100644 --- a/packages/vuetify/src/composables/__tests__/location.spec.ts +++ b/packages/vuetify/src/composables/__tests__/location.spec.ts @@ -3,7 +3,6 @@ import { useLocation } from '../location' // Utilities import { mount } from '@vue/test-utils' -import { expect, it } from 'vitest' // Types import { createVuetify } from '@/framework' diff --git a/packages/vuetify/src/composables/__tests__/mutationObserver.spec.ts b/packages/vuetify/src/composables/__tests__/mutationObserver.spec.ts index 047db35937d..61ea8eef1d2 100644 --- a/packages/vuetify/src/composables/__tests__/mutationObserver.spec.ts +++ b/packages/vuetify/src/composables/__tests__/mutationObserver.spec.ts @@ -3,7 +3,6 @@ import { useMutationObserver } from '../mutationObserver' // Utilities import { mount } from '@vue/test-utils' -import { expect } from 'vitest' import { h } from 'vue' describe('mutationObserver', () => { diff --git a/packages/vuetify/src/composables/__tests__/position.spec.ts b/packages/vuetify/src/composables/__tests__/position.spec.ts index 172c4eaf428..1fa276ee307 100644 --- a/packages/vuetify/src/composables/__tests__/position.spec.ts +++ b/packages/vuetify/src/composables/__tests__/position.spec.ts @@ -2,7 +2,6 @@ import { usePosition } from '../position' // Utilities -import { expect, it } from 'vitest' // Types import type { PositionProps } from '../position' diff --git a/packages/vuetify/src/composables/__tests__/proxiedModel.spec.ts b/packages/vuetify/src/composables/__tests__/proxiedModel.spec.ts index 5e81fefb28a..d1c4f73b9dc 100644 --- a/packages/vuetify/src/composables/__tests__/proxiedModel.spec.ts +++ b/packages/vuetify/src/composables/__tests__/proxiedModel.spec.ts @@ -3,7 +3,6 @@ import { useProxiedModel } from '../proxiedModel' // Utilities import { mount } from '@vue/test-utils' -import { expect, it } from 'vitest' import { defineComponent, h } from 'vue' const TestComponent = defineComponent({ diff --git a/packages/vuetify/src/composables/__tests__/resizeObserver.spec.browser.tsx b/packages/vuetify/src/composables/__tests__/resizeObserver.spec.browser.tsx new file mode 100644 index 00000000000..0f04bdc6949 --- /dev/null +++ b/packages/vuetify/src/composables/__tests__/resizeObserver.spec.browser.tsx @@ -0,0 +1,25 @@ +// Composables +import { useResizeObserver } from '../resizeObserver' + +// Utilities +import { waitIdle } from '@test' +import { render, screen } from '@testing-library/vue' + +describe('resizeObserver', () => { + it('calls the callback after mount', async () => { + const callback = vi.fn() + render({ + setup () { + const { resizeRef } = useResizeObserver(callback) + + return () =>
foo
+ }, + }) + + expect(screen.getByText('foo')).toBeInTheDocument() + + await waitIdle() + + expect(callback).toHaveBeenCalledTimes(1) + }) +}) diff --git a/packages/vuetify/src/composables/__tests__/resizeObserver.spec.ts b/packages/vuetify/src/composables/__tests__/resizeObserver.spec.ts deleted file mode 100644 index f9a34a7fc0f..00000000000 --- a/packages/vuetify/src/composables/__tests__/resizeObserver.spec.ts +++ /dev/null @@ -1,24 +0,0 @@ -// Composables -import { useResizeObserver } from '../resizeObserver' - -// Utilities -import { mount } from '@vue/test-utils' -import { expect } from 'vitest' -import { h, nextTick } from 'vue' - -describe('resizeObserver', () => { - it('should make sure mock exists', async () => { - const callback = vi.fn() - mount({ - setup () { - const { resizeRef } = useResizeObserver(callback) - - return () => h('div', { ref: resizeRef }, ['foo']) - }, - }) - - await nextTick() - - expect(callback).toHaveBeenCalled() - }) -}) diff --git a/packages/vuetify/src/composables/__tests__/rounded.spec.ts b/packages/vuetify/src/composables/__tests__/rounded.spec.ts index 1c907ebc0ad..ff5514456e7 100644 --- a/packages/vuetify/src/composables/__tests__/rounded.spec.ts +++ b/packages/vuetify/src/composables/__tests__/rounded.spec.ts @@ -3,7 +3,6 @@ import { makeRoundedProps, useRounded } from '../rounded' // Utilities import { mount } from '@vue/test-utils' -import { expect, it } from 'vitest' // Types import type { RoundedProps } from '../rounded' diff --git a/packages/vuetify/src/composables/__tests__/scroll.spec.browser.tsx b/packages/vuetify/src/composables/__tests__/scroll.spec.browser.tsx new file mode 100644 index 00000000000..8dc55e36ffc --- /dev/null +++ b/packages/vuetify/src/composables/__tests__/scroll.spec.browser.tsx @@ -0,0 +1,98 @@ +// Composables +import { makeScrollProps, useScroll } from '../scroll' + +// Utilities +import { render, scroll, wait } from '@test' +import { defineComponent, reactive } from 'vue' + +// Types +import type { UnwrapNestedRefs } from 'vue' +import type { ScrollProps } from '../scroll' + +describe('useScroll', () => { + function setup (props?: Partial) { + let data!: UnwrapNestedRefs> + render(defineComponent({ + props: makeScrollProps(), + setup (props) { + data = reactive(useScroll(props)) + return () =>
+ }, + }), { props }) + return { data } + } + + it('should set isScrollingUp', async () => { + const { data } = setup() + + await scroll({ top: 1000 }) + expect(data.isScrollingUp).toBe(false) + + await scroll({ top: 0 }) + expect(data.isScrollingUp).toBe(true) + }) + + // it.skip('should use a custom target', async () => { + // const thresholdMetCallback = vi.fn() + // mountFunction({}, { + // props: { scrollTarget: 'body', scrollThreshold: 300 }, + // }) + // + // await wait() + // expect(thresholdMetCallback).not.toHaveBeenCalled() + // + // await scroll({ top: 1000 }, document.body) + // await expect.poll(() => thresholdMetCallback).toHaveBeenCalled() + // }) + // + // it.skip('should do nothing if !canScroll', async () => { + // const thresholdMetCallback = vi.fn() + // mountFunction({ + // canScroll: ref(false), + // }, { + // props: { scrollTarget: 'body', scrollThreshold: 300 }, + // }) + // + // await wait() + // expect(thresholdMetCallback).not.toHaveBeenCalled() + // + // await scroll({ top: 1000 }, document.body) + // await expect.poll(() => thresholdMetCallback).not.toHaveBeenCalled() + // }) + // + // it.skip('should do something if canScroll', async () => { + // const thresholdMetCallback = vi.fn() + // mountFunction({ + // canScroll: ref(true), + // }, { + // props: { scrollTarget: 'body', scrollThreshold: 300 }, + // }) + // + // await wait() + // expect(thresholdMetCallback).not.toHaveBeenCalled() + // + // await scroll({ top: 1000 }, document.body) + // await expect.poll(() => thresholdMetCallback).toHaveBeenCalled() + // }) + + it('should reset savedScroll when isActive state changes', async () => { + const { data } = setup() + + await scroll({ top: 1000 }) + expect(data.savedScroll).toBe(0) + + await scroll({ top: 900 }) + expect(data.savedScroll).toBe(900) + + data.isScrollActive = true + await wait() + expect(data.savedScroll).toBe(0) + }) + + it(`should warn if target isn't present`, async () => { + setup({ scrollTarget: '#test' }) + + await wait() + expect('Unable to locate element with identifier #test').toHaveBeenTipped() + }) +}) diff --git a/packages/vuetify/src/composables/__tests__/scroll.spec.ts b/packages/vuetify/src/composables/__tests__/scroll.spec.ts deleted file mode 100644 index f35ced8eff6..00000000000 --- a/packages/vuetify/src/composables/__tests__/scroll.spec.ts +++ /dev/null @@ -1,125 +0,0 @@ -// Composables -import { makeScrollProps, useScroll } from '../scroll' - -// Utilities -import { mount } from '@vue/test-utils' -import { expect, it } from 'vitest' -import { defineComponent, ref } from 'vue' - -// Types -import type { ScrollArguments } from '../scroll' - -// Utils -import { - scrollElement, - scrollWindow, - wait, -} from '@/../test' - -describe('scrollProps', () => { - it('should allow setting default values', () => { - const wrapper = mount({ - template: '
', - props: makeScrollProps({ - scrollTarget: 'foo', - scrollThreshold: 500, - }), - }) - - expect(wrapper.props()).toStrictEqual({ - scrollTarget: 'foo', - scrollThreshold: 500, - }) - }) -}) - -describe('useScroll', () => { - function mountFunction (args?: ScrollArguments, options?: any) { - return mount(defineComponent({ - props: makeScrollProps(), - setup (props) { - return useScroll(props, args) - }, - template: '
', - }), options) - } - - beforeEach(() => { - (window as any).pageYOffset = 0 - document.body.scrollTop = 0 - }) - - it('should set isScrollingUp', async () => { - const { vm } = mountFunction() - - await scrollWindow(1000) - expect(vm.isScrollingUp).toBe(false) - - await scrollWindow(0) - expect(vm.isScrollingUp).toBe(true) - }) - - it.skip('should use a custom target', async () => { - const thresholdMetCallback = vi.fn() - mountFunction({}, { - props: { scrollTarget: 'body', scrollThreshold: 300 }, - }) - - await wait() - expect(thresholdMetCallback).not.toHaveBeenCalled() - - await scrollElement(document.body, 1000) - expect(thresholdMetCallback).toHaveBeenCalled() - }) - - it.skip('should do nothing if !canScroll', async () => { - const thresholdMetCallback = vi.fn() - mountFunction({ - canScroll: ref(false), - }, { - props: { scrollTarget: 'body', scrollThreshold: 300 }, - }) - - await wait() - expect(thresholdMetCallback).not.toHaveBeenCalled() - - await scrollElement(document.body, 1000) - expect(thresholdMetCallback).not.toHaveBeenCalled() - }) - - it.skip('should do something if canScroll', async () => { - const thresholdMetCallback = vi.fn() - mountFunction({ - canScroll: ref(true), - }, { - props: { scrollTarget: 'body', scrollThreshold: 300 }, - }) - - await wait() - expect(thresholdMetCallback).not.toHaveBeenCalled() - - await scrollElement(document.body, 1000) - expect(thresholdMetCallback).toHaveBeenCalled() - }) - - it('should reset savedScroll when isActive state changes', async () => { - const { vm } = mountFunction() - - await scrollWindow(1000) - expect(vm.savedScroll).toBe(0) - - await scrollWindow(900) - expect(vm.savedScroll).toBe(900) - - vm.isScrollActive = true - await wait() - expect(vm.savedScroll).toBe(0) - }) - - it(`should warn if target isn't present`, async () => { - mountFunction(undefined, { props: { scrollTarget: '#test' } }) - - await wait() - expect('Unable to locate element with identifier #test').toHaveBeenTipped() - }) -}) diff --git a/packages/vuetify/src/composables/__tests__/size.spec.ts b/packages/vuetify/src/composables/__tests__/size.spec.ts index 4bcf5d32165..ca3416967f6 100644 --- a/packages/vuetify/src/composables/__tests__/size.spec.ts +++ b/packages/vuetify/src/composables/__tests__/size.spec.ts @@ -2,7 +2,6 @@ import { useSize } from '../size' // Utilities -import { expect, it } from 'vitest' // Utilities diff --git a/packages/vuetify/src/composables/__tests__/tag.spec.ts b/packages/vuetify/src/composables/__tests__/tag.spec.ts index 0ff5218e438..428d2d5b8cb 100644 --- a/packages/vuetify/src/composables/__tests__/tag.spec.ts +++ b/packages/vuetify/src/composables/__tests__/tag.spec.ts @@ -3,7 +3,6 @@ import { makeTagProps } from '../tag' // Utilities import { mount } from '@vue/test-utils' -import { expect, it } from 'vitest' import { h } from 'vue' // Types diff --git a/packages/vuetify/src/composables/__tests__/theme.spec.ts b/packages/vuetify/src/composables/__tests__/theme.spec.ts index f7b220b02e9..e959e1c6369 100644 --- a/packages/vuetify/src/composables/__tests__/theme.spec.ts +++ b/packages/vuetify/src/composables/__tests__/theme.spec.ts @@ -1,10 +1,9 @@ -/* eslint-disable jest/no-commented-out-tests */ +/* eslint-disable vitest/no-commented-out-tests */ // Composables import { createTheme } from '../theme' // Utilities -import { expect, it } from 'vitest' import { createApp } from 'vue' // Types diff --git a/packages/vuetify/src/composables/__tests__/validation.spec.ts b/packages/vuetify/src/composables/__tests__/validation.spec.ts index c8511c6d6ab..82838f56c56 100644 --- a/packages/vuetify/src/composables/__tests__/validation.spec.ts +++ b/packages/vuetify/src/composables/__tests__/validation.spec.ts @@ -3,7 +3,6 @@ import { makeValidationProps, useValidation } from '../validation' // Utilities import { mount } from '@vue/test-utils' -import { expect, it } from 'vitest' import { defineComponent, nextTick } from 'vue' // Types diff --git a/packages/vuetify/src/composables/__tests__/variant.spec.ts b/packages/vuetify/src/composables/__tests__/variant.spec.ts index 3041c388328..e17dca8f0f0 100644 --- a/packages/vuetify/src/composables/__tests__/variant.spec.ts +++ b/packages/vuetify/src/composables/__tests__/variant.spec.ts @@ -2,7 +2,6 @@ import { allowedVariants, makeVariantProps, useVariant } from '../variant' // Utilities -import { expect, it } from 'vitest' // Utilities diff --git a/packages/vuetify/src/composables/date/__tests__/date.spec.ts b/packages/vuetify/src/composables/date/__tests__/date.spec.ts index e2cafa2daf8..510c96147b4 100644 --- a/packages/vuetify/src/composables/date/__tests__/date.spec.ts +++ b/packages/vuetify/src/composables/date/__tests__/date.spec.ts @@ -2,7 +2,6 @@ import { getWeek } from '../date' // Utilities -import { expect, it } from 'vitest' import { VuetifyDateAdapter } from '../adapters/vuetify' // Types diff --git a/packages/vuetify/src/composables/date/adapters/__tests__/vuetify.spec.ts b/packages/vuetify/src/composables/date/adapters/__tests__/vuetify.spec.ts index 632ac4fcab0..d13e74852c2 100644 --- a/packages/vuetify/src/composables/date/adapters/__tests__/vuetify.spec.ts +++ b/packages/vuetify/src/composables/date/adapters/__tests__/vuetify.spec.ts @@ -1,6 +1,5 @@ // Utilities import timezoneMock from 'timezone-mock' -import { expect, it } from 'vitest' import { VuetifyDateAdapter } from '../vuetify' // Types diff --git a/packages/vuetify/src/composables/nested/__tests__/selectStrategies.spec.ts b/packages/vuetify/src/composables/nested/__tests__/selectStrategies.spec.ts index 307a5560bef..8328f6b95af 100644 --- a/packages/vuetify/src/composables/nested/__tests__/selectStrategies.spec.ts +++ b/packages/vuetify/src/composables/nested/__tests__/selectStrategies.spec.ts @@ -1,7 +1,6 @@ /* eslint-disable max-len */ /* eslint-disable sonarjs/no-identical-functions */ // Utilities -import { expect, it } from 'vitest' import { classicSelectStrategy, independentSelectStrategy, independentSingleSelectStrategy, leafSelectStrategy, leafSingleSelectStrategy } from '../selectStrategies' describe('selectStrategies', () => { diff --git a/packages/vuetify/src/directives/click-outside/__tests__/click-outside-shadow-dom.spec.ts b/packages/vuetify/src/directives/click-outside/__tests__/click-outside-shadow-dom.spec.ts index 1c7192f1bce..26f6a796843 100644 --- a/packages/vuetify/src/directives/click-outside/__tests__/click-outside-shadow-dom.spec.ts +++ b/packages/vuetify/src/directives/click-outside/__tests__/click-outside-shadow-dom.spec.ts @@ -2,7 +2,6 @@ import ClickOutside from '../' // Utilities -import { describe, expect, it, vi } from 'vitest' import { wait } from '@/../test' function bootstrap (args?: object) { diff --git a/packages/vuetify/src/directives/click-outside/__tests__/click-outside.spec.ts b/packages/vuetify/src/directives/click-outside/__tests__/click-outside.spec.ts index b9e47168890..f86e4fdea3b 100644 --- a/packages/vuetify/src/directives/click-outside/__tests__/click-outside.spec.ts +++ b/packages/vuetify/src/directives/click-outside/__tests__/click-outside.spec.ts @@ -2,7 +2,6 @@ import ClickOutside from '../' // Utilities -import { expect } from 'vitest' import { wait } from '@/../test' function bootstrap (args?: object) { diff --git a/packages/vuetify/src/directives/intersect/__tests__/intersect.spec.browser.tsx b/packages/vuetify/src/directives/intersect/__tests__/intersect.spec.browser.tsx new file mode 100644 index 00000000000..d3997460d04 --- /dev/null +++ b/packages/vuetify/src/directives/intersect/__tests__/intersect.spec.browser.tsx @@ -0,0 +1,92 @@ +// Directives +import Intersect from '../' + +// Utilities +import { scroll, waitIdle } from '@test' +import { render, screen } from '@testing-library/vue' + +describe('v-intersect', () => { + it('binds event on mounted', async () => { + const callback = vi.fn() + + render({ + directives: { Intersect }, + setup () { + return () =>
+ }, + }) + + await waitIdle() + + expect(callback).toHaveBeenCalled() + }) + + // TODO: flaky, sometimes triggers with isIntersecting=false + it.skip('does not callback on mount when quiet', async () => { + const callback = vi.fn() + + render({ + directives: { Intersect }, + setup () { + return () =>
+ }, + }) + + await waitIdle() + + expect(callback).not.toHaveBeenCalled() + }) + + describe('once', () => { + async function setup (height: string, quiet: boolean) { + const callback = vi.fn() + + render({ + directives: { Intersect }, + setup () { + return () => ( + <> +
+ { quiet // directive modifiers are static + ?
el
+ :
el
+ } +
+ + ) + }, + }) + + const el = screen.getByText('el') + expect(Object.keys(el._observe!)).toHaveLength(1) + + await waitIdle() + return { callback, el } + } + + it.each([ + ['initially in', '100px', false, 1, 0, 1], + ['initially out', '120vh', false, 0, 1, 1], + // ['initially in - quiet', '100px', true, 0, 1, 1], // TODO: flaky + // ['initially out - quiet', '120vh', true, 0, 1, 1], + ])('%s', async (name, height, quiet, ...v) => { + const { callback, el } = await setup(height, quiet) + + expect(callback).toHaveBeenCalledTimes(v[0]) + expect(Object.keys(el._observe!)).toHaveLength(v[1]) + + el.scrollIntoView() + await waitIdle() + expect(callback).toHaveBeenCalledTimes(v[2]) + expect(Object.keys(el._observe!)).toHaveLength(0) + callback.mockClear() + + await scroll({ top: 1000 }) + expect(callback).not.toHaveBeenCalled() + + el.scrollIntoView() + await waitIdle() + expect(callback).not.toHaveBeenCalled() + }) + }) +}) diff --git a/packages/vuetify/src/directives/intersect/__tests__/intersect.spec.ts b/packages/vuetify/src/directives/intersect/__tests__/intersect.spec.ts deleted file mode 100644 index b7bbd0cd1de..00000000000 --- a/packages/vuetify/src/directives/intersect/__tests__/intersect.spec.ts +++ /dev/null @@ -1,62 +0,0 @@ -// Directives -import Intersect from '../' - -// Utilities -import { expect } from 'vitest' - -describe('v-intersect', () => { - it('should bind event on mounted', () => { - const callback = vi.fn() - const el = document.createElement('div') - document.body.appendChild(el) - - Intersect.mounted(el, { - value: callback, - modifiers: { quiet: true }, - instance: { - $: { uid: 1 }, - }, - } as any) - - expect((el as any)._observe).toBeTruthy() - expect(callback).not.toHaveBeenCalled() - - document.body.removeChild(el) - - Intersect.unmounted(el, { - instance: { - $: { uid: 1 }, - }, - } as any) - - expect((el as any)._observe[1]).toBeUndefined() - }) - - it('should invoke callback once and unmount', () => { - const el = document.createElement('div') - document.body.appendChild(el) - - const callback = vi.fn() - - Intersect.mounted(el, { - value: callback, - modifiers: { once: true }, - instance: { - $: { uid: 1 }, - }, - } as any) - - expect(callback).toHaveBeenCalledTimes(0) - expect((el as any)._observe[1]).toBeTruthy() - - ;(el as any)._observe[1].observer.callback([{ isIntersecting: false }]) - - expect(callback).toHaveBeenCalledTimes(1) - expect((el as any)._observe[1]).toBeTruthy() - - ;(el as any)._observe[1].observer.callback([{ isIntersecting: true }]) - - expect(callback).toHaveBeenCalledTimes(2) - expect((el as any)._observe[1]).toBeUndefined() - }) -}) diff --git a/packages/vuetify/src/directives/mutate/__tests__/mutate.spec.ts b/packages/vuetify/src/directives/mutate/__tests__/mutate.spec.ts index b95b9c4e4ad..e6bad869796 100644 --- a/packages/vuetify/src/directives/mutate/__tests__/mutate.spec.ts +++ b/packages/vuetify/src/directives/mutate/__tests__/mutate.spec.ts @@ -2,7 +2,6 @@ import Mutate from '..' // Utilities -import { expect, it } from 'vitest' // Utilities diff --git a/packages/vuetify/src/directives/resize/__tests__/resize.spec.ts b/packages/vuetify/src/directives/resize/__tests__/resize.spec.ts index 2b0b9845611..f085bbcedb1 100644 --- a/packages/vuetify/src/directives/resize/__tests__/resize.spec.ts +++ b/packages/vuetify/src/directives/resize/__tests__/resize.spec.ts @@ -2,7 +2,6 @@ import Resize from '../' // Utilities -import { expect, it } from 'vitest' // Types import type { Mock } from 'vitest' diff --git a/packages/vuetify/src/directives/ripple/__tests__/ripple.spec.ts b/packages/vuetify/src/directives/ripple/__tests__/ripple.spec.ts index 090bec38857..44aca60550b 100644 --- a/packages/vuetify/src/directives/ripple/__tests__/ripple.spec.ts +++ b/packages/vuetify/src/directives/ripple/__tests__/ripple.spec.ts @@ -3,7 +3,6 @@ import Ripple from '../' // Utilities import { mount } from '@vue/test-utils' -import { describe, expect, it, vi } from 'vitest' import { defineComponent } from 'vue' import { keyCodes } from '@/util' diff --git a/packages/vuetify/src/directives/ripple/index.ts b/packages/vuetify/src/directives/ripple/index.ts index 2f4a83a7b67..bd3b51db1e2 100644 --- a/packages/vuetify/src/directives/ripple/index.ts +++ b/packages/vuetify/src/directives/ripple/index.ts @@ -5,9 +5,7 @@ import './VRipple.sass' import { isObject, keyCodes } from '@/util' // Types -import type { - DirectiveBinding, -} from 'vue' +import type { DirectiveBinding } from 'vue' const stopSymbol = Symbol('rippleStop') diff --git a/packages/vuetify/src/directives/scroll/__tests__/scroll.spec.browser.tsx b/packages/vuetify/src/directives/scroll/__tests__/scroll.spec.browser.tsx new file mode 100644 index 00000000000..7730239d1e4 --- /dev/null +++ b/packages/vuetify/src/directives/scroll/__tests__/scroll.spec.browser.tsx @@ -0,0 +1,49 @@ +// Directives +import Scroll from '../' + +// Utilities +import { render, scroll } from '@test' +import { defineComponent } from 'vue' + +describe('v-scroll', () => { + function setup (selector = '') { + const callback = vi.fn() + const result = render(defineComponent({ + directives: { Scroll }, + setup () { + return () => ( +
+
el
+
+ ) + }, + })) + + const el = result.getByText('el') + const root = result.getByTestId('root') + + return { callback, result, el, root } + } + + it('listens to scroll on window', async () => { + const { callback, root } = setup() + + await scroll({ top: 100 }) + expect(callback).toHaveBeenCalled() + + callback.mockClear() + await scroll({ top: 100 }, root) + expect(callback).not.toHaveBeenCalled() + }) + + it('listens to scroll on selector', async () => { + const { callback, root } = setup('[data-testid="root"]') + + await scroll({ top: 100 }, root) + expect(callback).toHaveBeenCalled() + + callback.mockClear() + await scroll({ top: 100 }) + expect(callback).not.toHaveBeenCalled() + }) +}) diff --git a/packages/vuetify/src/directives/scroll/__tests__/scroll.spec.ts b/packages/vuetify/src/directives/scroll/__tests__/scroll.spec.ts deleted file mode 100644 index 15830249f3a..00000000000 --- a/packages/vuetify/src/directives/scroll/__tests__/scroll.spec.ts +++ /dev/null @@ -1,102 +0,0 @@ -/// - -// Directives -import Scroll from '../' - -// Utilities -import { expect } from 'vitest' -import { - createApp, - defineComponent, - h, - withDirectives, -} from 'vue' -import { scrollWindow } from '@/../test' - -describe('v-scroll', () => { - const instance = { - $: { uid: 1 }, - } - const el = document.createElement('div') - const mountFunction = (value: EventListenerOrEventListenerObject, selector = ''): HTMLElement => { - const Test = defineComponent(() => () => withDirectives(h('div', { class: 'test' }), [[Scroll, value, selector]])) - - createApp(Test).mount(el) - return el.querySelector('.test')! - } - - it('shoud bind event on inserted (selector)', () => { - const value = () => {} - const targetElement = { addEventListener: vi.fn(), removeEventListener: vi.fn() } as any as Element - const el = {} as HTMLElement - const querySelector = vi.spyOn(window.document, 'querySelector').mockImplementation( - selector => selector === '.selector' ? targetElement : null - ) - - Scroll.mounted(el, { value, arg: '.selector', instance } as any) - expect(targetElement.addEventListener).toHaveBeenCalledWith('scroll', value, { passive: true }) - Scroll.unmounted(el, { instance } as any) - expect(targetElement.removeEventListener).toHaveBeenCalledWith('scroll', value, { passive: true }) - - Scroll.mounted(el, { value, arg: '.selector', instance } as any) - expect(targetElement.addEventListener).toHaveBeenCalledWith('scroll', value, { passive: true }) - Scroll.unmounted(el, { instance } as any) - expect(targetElement.removeEventListener).toHaveBeenCalledWith('scroll', value, { passive: true }) - - querySelector.mockRestore() - }) - - it('shoud bind event on inserted (window)', () => { - const value = () => {} - const addListener = vi.spyOn(window, 'addEventListener') - const removeListener = vi.spyOn(window, 'removeEventListener') - const el = {} - - Scroll.mounted(el as HTMLElement, { value, instance } as any) - expect(addListener).toHaveBeenCalledWith('scroll', value, { passive: true }) - Scroll.unmounted(el as HTMLElement, { instance } as any) - expect(removeListener).toHaveBeenCalledWith('scroll', value, { passive: true }) - - addListener.mockRestore() - removeListener.mockRestore() - }) - - it('shoud rebind event on updated', () => { - const value1 = () => {} - const value2 = () => {} - const addListener = vi.spyOn(window, 'addEventListener') - const removeListener = vi.spyOn(window, 'removeEventListener') - const el = {} - - Scroll.mounted(el as HTMLElement, { value: value1, instance } as any) - expect(addListener).toHaveBeenCalledTimes(1) - expect(addListener).toHaveBeenCalledWith('scroll', value1, { passive: true }) - - Scroll.updated(el as HTMLElement, { value: value2, oldValue: value1, instance } as any) - expect(removeListener).toHaveBeenCalledTimes(1) - expect(removeListener).toHaveBeenCalledWith('scroll', value1, { passive: true }) - expect(addListener).toHaveBeenCalledTimes(2) - expect(addListener).toHaveBeenCalledWith('scroll', value2, { passive: true }) - - addListener.mockRestore() - removeListener.mockRestore() - }) - - it('should not fail when unbinding element without _onScroll', () => { - expect(() => { - Scroll.unmounted({} as HTMLElement, { instance } as any) - }).not.toThrow() - }) - - it('should call the callback on scroll', async () => { - const callback = vi.fn() - - mountFunction(event => callback(event.target)) - - expect(callback).not.toHaveBeenCalled() - - await scrollWindow(400) - - expect(callback).toHaveBeenCalledWith(jsdom.window) - }) -}) diff --git a/packages/vuetify/src/directives/touch/__tests__/touch.spec.browser.tsx b/packages/vuetify/src/directives/touch/__tests__/touch.spec.browser.tsx new file mode 100644 index 00000000000..70b8637870d --- /dev/null +++ b/packages/vuetify/src/directives/touch/__tests__/touch.spec.browser.tsx @@ -0,0 +1,96 @@ +// Directives +import Touch from '../' + +// Utilities +import { render } from '@testing-library/vue' +import { commands } from '@vitest/browser/context' +import { defineComponent } from 'vue' + +// Types +import type { PropType } from 'vue' +import type { TouchValue } from '../' + +const TestComponent = defineComponent({ + directives: { Touch }, + props: { + value: Object as PropType, + }, + setup (props) { + return () => ( +
+ ) + }, +}) + +describe('v-touch', () => { + describe('calls directive handler', () => { + it.each([ + ['down', [100, 140]], + ['up', [100, 60]], + ['left', [60, 100]], + ['right', [140, 100]], + ])('%s', async (name, to) => { + const fn = vi.fn() + const start = vi.fn() + const move = vi.fn() + const end = vi.fn() + + render() + + await commands.drag([100, 100], to) + + expect(fn).toHaveBeenCalled() + expect(start).toHaveBeenCalled() + expect(move).toHaveBeenCalled() + expect(end).toHaveBeenCalled() + }) + }) + + describe('calls directive handler if not straight', () => { + it.each([ + ['down', 'right', [115, 140]], + ['up', 'left', [85, 60]], + ['left', 'down', [60, 115]], + ['right', 'up', [140, 85]], + ])('%s', async (name, not, to) => { + const fn = vi.fn() + const nope = vi.fn() + const start = vi.fn() + const move = vi.fn() + const end = vi.fn() + + render() + + await commands.drag([100, 100], to) + + expect(fn).toHaveBeenCalled() + expect(nope).not.toHaveBeenCalled() + expect(start).toHaveBeenCalled() + expect(move).toHaveBeenCalled() + expect(end).toHaveBeenCalled() + }) + }) + + describe('does not call directive handlers if distance is too small', () => { + it.each([ + ['down', [100, 115]], + ['up', [100, 85]], + ['left', [85, 100]], + ['right', [115, 100]], + ])('%s', async (name, to) => { + const fn = vi.fn() + const start = vi.fn() + const move = vi.fn() + const end = vi.fn() + + render() + + await commands.drag([100, 100], to) + + expect(fn).not.toHaveBeenCalled() + expect(start).toHaveBeenCalled() + expect(move).not.toHaveBeenCalled() + expect(end).toHaveBeenCalled() + }) + }) +}) diff --git a/packages/vuetify/src/directives/touch/__tests__/touch.spec.ts b/packages/vuetify/src/directives/touch/__tests__/touch.spec.ts deleted file mode 100644 index c840b27da1e..00000000000 --- a/packages/vuetify/src/directives/touch/__tests__/touch.spec.ts +++ /dev/null @@ -1,105 +0,0 @@ -// Directives -import Touch from '../' - -// Utilities -import { mount } from '@vue/test-utils' -import { expect, it } from 'vitest' -import { nextTick } from 'vue' -import { touch } from '@/../test' - -// Types -import type { TouchValue } from '../' - -describe('v-touch', () => { - const mountFunction = (value: TouchValue): Element => { - const wrapper = mount({ - directives: { Touch }, - props: { - value: Object, - }, - template: '
', - }, { props: { value } }) - - return wrapper.element - } - - it('should call directive handlers', () => { - const down = vi.fn() - touch(mountFunction({ down })).start(0, 0).end(0, 20) - expect(down).toHaveBeenCalled() - - const up = vi.fn() - touch(mountFunction({ up })).start(0, 0).end(0, -20) - expect(up).toHaveBeenCalled() - - const left = vi.fn() - touch(mountFunction({ left })).start(0, 0).end(-20, 0) - expect(left).toHaveBeenCalled() - - const right = vi.fn() - touch(mountFunction({ right })).start(0, 0).end(20, 0) - expect(right).toHaveBeenCalled() - - const start = vi.fn() - touch(mountFunction({ start })).start(0, 0) - expect(start).toHaveBeenCalled() - - const move = vi.fn() - touch(mountFunction({ move })).move(0, 0) - expect(move).toHaveBeenCalled() - - const end = vi.fn() - touch(mountFunction({ end })).end(0, 0) - expect(end).toHaveBeenCalled() - }) - - it('should call directive handlers if not straight down/up/right/left', async () => { - const nope = vi.fn() - const down = vi.fn() - touch(mountFunction({ down, right: nope })).start(0, 0).end(5, 20) - expect(nope).not.toHaveBeenCalled() - expect(down).toHaveBeenCalled() - }) - - it('should not call directive handlers if distance is too small', async () => { - const down = vi.fn() - touch(mountFunction({ down })).start(0, 0).end(0, 10) - expect(down).not.toHaveBeenCalled() - - const up = vi.fn() - touch(mountFunction({ up })).start(0, 0).end(0, -10) - expect(up).not.toHaveBeenCalled() - - const left = vi.fn() - touch(mountFunction({ left })).start(0, 0).end(-10, 0) - expect(left).not.toHaveBeenCalled() - - const right = vi.fn() - touch(mountFunction({ right })).start(0, 0).end(10, 0) - expect(right).not.toHaveBeenCalled() - }) - - it('should unmount', async () => { - const start = vi.fn() - const wrapper = mount({ - directives: { Touch }, - props: { - value: Object, - bound: Boolean, - }, - template: '
', - }, { - props: { - value: { start }, - bound: true, - }, - }) - const el = wrapper.element - - await nextTick() - await wrapper.setProps({ bound: false }) - - touch(el).start(0, 0) - expect(start.mock.calls).toHaveLength(0) - }) -}) diff --git a/packages/vuetify/src/globals.d.ts b/packages/vuetify/src/globals.d.ts index 0dcfacb906e..8888011e7ab 100644 --- a/packages/vuetify/src/globals.d.ts +++ b/packages/vuetify/src/globals.d.ts @@ -169,13 +169,3 @@ declare module 'vue' { export interface CSSProperties extends CustomProperties {} } - -interface CustomMatchers { - toHaveBeenTipped: () => R - toHaveBeenWarned: () => R -} - -declare module 'vitest' { - interface Assertion extends CustomMatchers {} - interface AsymmetricMatchersContaining extends CustomMatchers {} -} diff --git a/packages/vuetify/src/locale/__tests__/index.spec.ts b/packages/vuetify/src/locale/__tests__/index.spec.ts index 2854a4194c9..beb59bf6bff 100755 --- a/packages/vuetify/src/locale/__tests__/index.spec.ts +++ b/packages/vuetify/src/locale/__tests__/index.spec.ts @@ -1,7 +1,6 @@ // Utilities import fs from 'fs' import path from 'path' -import { expect, it } from 'vitest' import * as locales from '../' describe('locales', () => { diff --git a/packages/vuetify/src/util/__tests__/colorUtils.spec.ts b/packages/vuetify/src/util/__tests__/colorUtils.spec.ts index 13517150611..7b0e3794bcd 100644 --- a/packages/vuetify/src/util/__tests__/colorUtils.spec.ts +++ b/packages/vuetify/src/util/__tests__/colorUtils.spec.ts @@ -1,5 +1,4 @@ // Utilities -import { expect, it } from 'vitest' import { APCAcontrast } from '../color/APCA' import * as transformCIELAB from '../color/transformCIELAB' import * as transformSRGB from '../color/transformSRGB' diff --git a/packages/vuetify/src/util/__tests__/dom.spec.ts b/packages/vuetify/src/util/__tests__/dom.spec.ts index 19e58b96052..eda6f581f6a 100644 --- a/packages/vuetify/src/util/__tests__/dom.spec.ts +++ b/packages/vuetify/src/util/__tests__/dom.spec.ts @@ -1,6 +1,5 @@ // Utilities import { mount } from '@vue/test-utils' -import { expect, it } from 'vitest' import { defineComponent, h } from 'vue' import { attachedRoot, diff --git a/packages/vuetify/src/util/__tests__/getCurrentInstance.spec.tsx b/packages/vuetify/src/util/__tests__/getCurrentInstance.spec.tsx index 03e7f65e0ad..1f8600d764c 100644 --- a/packages/vuetify/src/util/__tests__/getCurrentInstance.spec.tsx +++ b/packages/vuetify/src/util/__tests__/getCurrentInstance.spec.tsx @@ -1,6 +1,5 @@ // Utilities import { mount } from '@vue/test-utils' -import { expect, it } from 'vitest' import { getCurrentInstance } from '../getCurrentInstance' describe('getCurrentInstance.ts', () => { diff --git a/packages/vuetify/src/util/__tests__/helpers.spec.ts b/packages/vuetify/src/util/__tests__/helpers.spec.ts index 85c4b49172a..dce2b5e81aa 100644 --- a/packages/vuetify/src/util/__tests__/helpers.spec.ts +++ b/packages/vuetify/src/util/__tests__/helpers.spec.ts @@ -1,5 +1,4 @@ // Utilities -import { describe, expect, it, vi } from 'vitest' import { isProxy, isRef, ref } from 'vue' import { arrayDiff, diff --git a/packages/vuetify/src/util/__tests__/propsFactory.spec.ts b/packages/vuetify/src/util/__tests__/propsFactory.spec.ts index 8c6022419bb..5961ac1725a 100644 --- a/packages/vuetify/src/util/__tests__/propsFactory.spec.ts +++ b/packages/vuetify/src/util/__tests__/propsFactory.spec.ts @@ -1,5 +1,4 @@ // Utilities -import { expect, it } from 'vitest' import { propsFactory } from '../propsFactory' describe('propsFactory', () => { diff --git a/packages/vuetify/test/globals.d.ts b/packages/vuetify/test/globals.d.ts new file mode 100644 index 00000000000..17b4cf6e93c --- /dev/null +++ b/packages/vuetify/test/globals.d.ts @@ -0,0 +1,15 @@ +import type { CustomCommands } from './setup/browser-commands.ts' + +interface CustomMatchers { + toHaveBeenTipped: () => R + toHaveBeenWarned: () => R +} + +declare module 'vitest' { + interface Assertion extends CustomMatchers {} + interface AsymmetricMatchersContaining extends CustomMatchers {} +} + +declare module '@vitest/browser/context' { + interface BrowserCommands extends CustomCommands {} +} diff --git a/packages/vuetify/test/index.ts b/packages/vuetify/test/index.ts index 72a8928e6e5..843a0ccd996 100644 --- a/packages/vuetify/test/index.ts +++ b/packages/vuetify/test/index.ts @@ -1,20 +1,14 @@ -// Setup -// import type { ComponentOptions } from 'vue' - // Utilities -import toHaveBeenWarnedInit from './util/to-have-been-warned' +import './globals.d' +import { render as _render } from '@testing-library/vue' +import { createVuetify } from '@/framework.ts' +import { afterEach } from 'vitest' +import { mergeDeep } from '@/util' +import { aliases } from '@/iconsets/mdi-svg' -// export function functionalContext (context: ComponentOptions = {}, children = []) { -// if (!Array.isArray(children)) children = [children] -// return { -// context: { -// data: {}, -// props: {}, -// ...context, -// }, -// children, -// } -// } +export { userEvent } from '@vitest/browser/context' +export { screen } from '@testing-library/vue' +export * from './templates' export function touch (element: Element) { const createTrigger = (eventName: string) => (clientX: number, clientY: number) => { @@ -39,73 +33,43 @@ export const wait = (timeout?: number) => { return new Promise(resolve => setTimeout(resolve, timeout)) } -export const waitAnimationFrame = (timeout?: number) => { +export const waitAnimationFrame = () => { return new Promise(resolve => requestAnimationFrame(resolve)) } -export const resizeWindow = (width = window.innerWidth, height = window.innerHeight) => { - (window as any).innerWidth = width - ;(window as any).innerHeight = height - window.dispatchEvent(new Event('resize')) - - return wait(200) -} - -export const scrollWindow = (y: number) => { - (window as any).pageYOffset = y - window.dispatchEvent(new Event('scroll')) - - return wait(200) +export const waitIdle = () => { + return new Promise(resolve => requestIdleCallback(resolve, { timeout: 500 })) } -export const scrollElement = (element: Element, y: number) => { - element.scrollTop = y - element.dispatchEvent(new Event('scroll')) - - return wait(200) +export const scroll = (options: ScrollToOptions, el: Element | Window = window) => { + return Promise.race([ + wait(500), + new Promise(resolve => { + el.addEventListener('scrollend', resolve, { once: true }) + el.scroll(options) + }).then(waitIdle), + ]) } -// Add a global mockup for IntersectionObserver -class IntersectionObserver { - callback?: (entries: any, observer: any) => {} - - constructor (callback: any) { - this.callback = callback - } - - observe () { - this.callback?.([], this) - return null +let vuetify: ReturnType | null +afterEach(() => { + vuetify = null +}) + +export const render = (function render (component, options) { + vuetify = vuetify ?? (vuetify = createVuetify({ icons: { aliases } })) + + const defaultOptions = { + global: { + stubs: { + transition: false, + 'transition-group': false, + }, + plugins: [vuetify], + }, } - unobserve () { - this.callback = undefined - return null - } -} - -(global as any).IntersectionObserver = IntersectionObserver - -class ResizeObserver { - callback?: ResizeObserverCallback - - constructor (callback: ResizeObserverCallback) { - this.callback = callback - } - - observe () { - this.callback?.([], this) - } - - unobserve () { - this.callback = undefined - } - - disconnect () { - this.callback = undefined - } -} - -(global as any).ResizeObserver = ResizeObserver + const mountOptions = mergeDeep(defaultOptions, options!, (a, b) => a.concat(b)) -toHaveBeenWarnedInit() + return _render(component, mountOptions) +}) as typeof _render diff --git a/packages/vuetify/test/setup/browser-commands.ts b/packages/vuetify/test/setup/browser-commands.ts new file mode 100644 index 00000000000..e8f7414b255 --- /dev/null +++ b/packages/vuetify/test/setup/browser-commands.ts @@ -0,0 +1,69 @@ +/// +/// + +import type { BrowserCommandContext } from 'vitest/node' +import percy from '@percy/sdk-utils' +import type { PercyOptions } from '@percy/sdk-utils' +import { createRequire } from 'node:module' +import { readFileSync } from 'node:fs' +import path from 'upath' + +const require = createRequire(import.meta.url) + +const pkg = JSON.parse(readFileSync('../../package.json', 'utf8')) +const wdioPkg = JSON.parse(readFileSync(path.resolve(require.resolve('webdriverio'), '../../../package.json'), 'utf8')) +const CLIENT_INFO = `${pkg.name}/${pkg.version}` +const ENV_INFO = `${wdioPkg.name}/${wdioPkg.version}` + +function drag (ctx: BrowserCommandContext, start: [number, number], ...moves: number[][]) { + const action = ctx.browser.action('pointer', { + parameters: { pointerType: 'touch' }, + }) + action.move({ x: start[0], y: start[1] }) + action.down() + for (const move of moves) { + action.move({ x: move[0], y: move[1], duration: 10 }) + } + action.up() + return action.perform() +} + +function scroll (ctx: BrowserCommandContext, x: number, y: number) { + return ctx.browser.scroll(x, y) +} + +export function isDisplayedInViewport (ctx: BrowserCommandContext, el: any) { + return ctx.browser.$(el).isDisplayedInViewport() +} + +export async function percySnapshot (ctx: BrowserCommandContext, name: string, options?: PercyOptions) { + if (!(await percy.isPercyEnabled())) return + + try { + const dom = await percy.fetchPercyDOM() + await ctx.browser.executeScript(dom, []) + + const domSnapshot = await ctx.browser.executeScript('return PercyDOM.serialize(arguments[0])', [options]) + + await percy.postSnapshot({ + ...options, + environmentInfo: ENV_INFO, + clientInfo: CLIENT_INFO, + url: await ctx.browser.getUrl(), + domSnapshot, + name, + }) + } catch (err) { + const log = percy.logger('webdriverio') + log.error(`Could not take DOM snapshot "${name}"`) + log.error(err) + } +} + +export const commands = { drag, scroll, isDisplayedInViewport, percySnapshot } + +export type CustomCommands = { + [k in keyof typeof commands]: typeof commands[k] extends (ctx: any, ...args: infer A) => any + ? (...args: A) => any + : 'never' +} diff --git a/packages/vuetify/test/setup/browser-setup.ts b/packages/vuetify/test/setup/browser-setup.ts new file mode 100644 index 00000000000..ea3504db1b5 --- /dev/null +++ b/packages/vuetify/test/setup/browser-setup.ts @@ -0,0 +1,12 @@ +import 'roboto-fontface' +import '@/styles/main.sass' +import { beforeEach } from 'vitest' +import { cleanup } from '@testing-library/vue' +import { page } from '@vitest/browser/context' + +beforeEach(async () => { + // Cleanup before not after, so if the test + // fails we can inspect what has happened + cleanup() + await page.viewport(1280, 800) +}) diff --git a/packages/vuetify/test/setup/percy.d.ts b/packages/vuetify/test/setup/percy.d.ts new file mode 100644 index 00000000000..23212247eb4 --- /dev/null +++ b/packages/vuetify/test/setup/percy.d.ts @@ -0,0 +1,13 @@ +declare module '@percy/sdk-utils' { + const utils: { + logger: any + fetchPercyDOM: () => Promise + isPercyEnabled: () => Promise + postSnapshot: (...args: any[]) => Promise + } + export default utils + + export interface PercyOptions { + // + } +} diff --git a/packages/vuetify/test/setup/to-have-been-warned.ts b/packages/vuetify/test/setup/to-have-been-warned.ts new file mode 100644 index 00000000000..1afbe1ef747 --- /dev/null +++ b/packages/vuetify/test/setup/to-have-been-warned.ts @@ -0,0 +1,68 @@ +import type { Mock } from 'vitest' +import { afterEach, beforeAll, beforeEach, expect, vi } from 'vitest' + +function noop () {} +if (typeof console === 'undefined') { + (window as any).console = { + warn: noop, + error: noop, + } +} + +// avoid info messages during test +// eslint-disable-next-line no-console +console.info = noop + +let warn: Mock +let error: Mock +beforeAll(() => { + warn = vi.spyOn(console, 'warn').mockImplementation(noop) as any + error = vi.spyOn(console, 'error').mockImplementation(noop) as any + expect.extend({ + toHaveBeenWarned: createCompareFn(error), + toHaveBeenTipped: createCompareFn(warn), + }) +}) + +const asserted: string[] = [] + +beforeEach(() => { + asserted.length = 0 + warn.mockClear() + error.mockClear() +}) + +afterEach(() => { + for (const type of ['error', 'warn']) { + const warned = (msg: string) => asserted.some(assertedMsg => msg.toString().includes(assertedMsg)) + for (const args of (console as any)[type].mock.calls) { + if (!warned(args[0])) { + throw new Error(`Unexpected console.${type} message: ${args[0]}`) + } + } + } +}) + +function createCompareFn (spy: Mock) { + const hasWarned = (msg: string) => { + for (const args of spy.mock.calls) { + if (args.some((arg: any) => ( + arg.toString().includes(msg) + ))) return true + } + return false + } + + return (msg: string) => { + asserted.push(msg) + const warned = Array.isArray(msg) + ? msg.some(hasWarned) + : hasWarned(msg) + return { + pass: warned, + message: warned + ? () => (`Expected message "${msg}" not to have been warned`) + : () => (`Expected message "${msg}" to have been warned`), + } + } +} diff --git a/packages/vuetify/test/setup/unit-setup.ts b/packages/vuetify/test/setup/unit-setup.ts new file mode 100644 index 00000000000..14ac37ab1d4 --- /dev/null +++ b/packages/vuetify/test/setup/unit-setup.ts @@ -0,0 +1,6 @@ +import { afterEach } from 'vitest' +import { cleanup } from '@testing-library/vue' + +afterEach(() => { + cleanup() +}) diff --git a/packages/vuetify/cypress/templates/Application.tsx b/packages/vuetify/test/templates/Application.tsx similarity index 100% rename from packages/vuetify/cypress/templates/Application.tsx rename to packages/vuetify/test/templates/Application.tsx diff --git a/packages/vuetify/cypress/templates/CenteredGrid.tsx b/packages/vuetify/test/templates/CenteredGrid.tsx similarity index 100% rename from packages/vuetify/cypress/templates/CenteredGrid.tsx rename to packages/vuetify/test/templates/CenteredGrid.tsx diff --git a/packages/vuetify/cypress/templates/generateStories.tsx b/packages/vuetify/test/templates/generateStories.tsx similarity index 66% rename from packages/vuetify/cypress/templates/generateStories.tsx rename to packages/vuetify/test/templates/generateStories.tsx index fdf32e476ca..18f9b210117 100644 --- a/packages/vuetify/cypress/templates/generateStories.tsx +++ b/packages/vuetify/test/templates/generateStories.tsx @@ -2,13 +2,14 @@ * Utilities for generating formatted mount functions * Some utility functions for mounting these generated examples inside of tests */ -import { FunctionalComponent } from 'vue' -import { JSXComponent } from '@/composables' - -const _ = Cypress._ +import type { FunctionalComponent } from 'vue' +import type { JSXComponent } from '@/composables' +import { it } from 'vitest' +import { commands, page } from '@vitest/browser/context' +import { render } from '@test' type Stories = Record -type Props = Record +type Props = Record type GenerateConfiguration = { props: Props component: JSXComponent @@ -20,8 +21,8 @@ type GenerateConfiguration = { } type Example = { - name: string, - mount: JSX.Element + name: string + mount: () => JSX.Element } /** Utility components */ @@ -42,16 +43,17 @@ const Wrapper: FunctionalComponent = (_, { slots }) =>
{ slots }) */ export const makeExamplesFromStories = (stories: Stories): Example[] => { - return Object.entries(stories).reduce((acc: Example[], [key, value]) => { - acc.push({ + return Object.entries(stories).map(([key, value]) => { + return { name: key, - mount: - { title(key) } - { grid(value) } - , - }) - return acc - }, []) + mount: () => ( + + { title(key) } + { grid(value) } + + ), + } + }) } /** @@ -65,30 +67,31 @@ export const makeExamplesFromStories = (stories: Stories): Example[] => { }, VBtn) */ export const makeExamplesFromProps = (props: Props, Component: JSXComponent): Example[] => { - return Object.entries(props).reduce((acc: Example[], [key, value]) => { + return Object.entries(props).map(([key, value]) => { // Collect an array of examples by prop. const variants: JSX.Element[] = [] // Props with boolean values should be rendered with both their true/false states - if (_.isBoolean(value)) { + if (typeof value === 'boolean') { variants.push(Is { key }) variants.push(Is not { key }) - } else if (_.isArray(value)) { + } else if (Array.isArray(value)) { // Props with array values should be iterated over - value.forEach((v) => { + value.forEach(v => { variants.push({ v }) }) } - acc.push({ + return { name: key, - mount: - { title(key) } - { grid(variants) } - - }) - return acc - }, []) + mount: () => ( + + { title(key) } + { grid(variants) } + + ), + } + }) } /** @@ -108,17 +111,35 @@ export const generate = ({ props, stories, component }: GenerateConfiguration) = exampleProps = makeExamplesFromProps(props, component) } - return it('renders everything', () => { - cy.mount(() => <> - { exampleStories && <> -

Stories

- { exampleStories.map(s => s.mount) } - } - { exampleProps && <> -

Props

- { exampleProps.map(s => s.mount) } - } - ).percySnapshot() + return it('renders everything', async () => { + await page.viewport(1280, 825) + + render(() => ( + <> + { exampleStories && ( + <> +

Stories

+ { exampleStories.map(s => s.mount()) } + + )} + { exampleProps && ( + <> +

Props

+ { exampleProps.map(s => s.mount()) } + + )} + + )) + + let suite = (globalThis as any).__vitest_worker__.current + let name = '' + while (suite) { + name = suite.name + ' ' + name + suite = suite.suite + } + + await commands.percySnapshot(name.trim()) + await page.screenshot() }) } @@ -129,7 +150,9 @@ export const generate = ({ props, stories, component }: GenerateConfiguration) = */ export const generateByExample = (stories: Stories) => { return makeExamplesFromStories(stories).map(({ name, mount }) => { - return it(name, () => { cy.mount(() => <>{ mount }) }) + return it(name, () => { + render(mount) + }) }) } @@ -141,6 +164,8 @@ export const generateByExample = (stories: Stories) => { */ export const generateByProps = (props: Props, component: JSXComponent) => { return makeExamplesFromProps(props, component).map(({ mount, name }) => { - return it(name, () => { cy.mount(() => <>{ mount }) }) + return it(name, () => { + render(mount) + }) }) } diff --git a/packages/vuetify/cypress/templates/gridOn.tsx b/packages/vuetify/test/templates/gridOn.tsx similarity index 100% rename from packages/vuetify/cypress/templates/gridOn.tsx rename to packages/vuetify/test/templates/gridOn.tsx diff --git a/packages/vuetify/cypress/templates/index.ts b/packages/vuetify/test/templates/index.ts similarity index 100% rename from packages/vuetify/cypress/templates/index.ts rename to packages/vuetify/test/templates/index.ts diff --git a/packages/vuetify/test/util/to-have-been-warned.ts b/packages/vuetify/test/util/to-have-been-warned.ts deleted file mode 100644 index 3b80582fe66..00000000000 --- a/packages/vuetify/test/util/to-have-been-warned.ts +++ /dev/null @@ -1,74 +0,0 @@ -import type { Mock } from 'vitest' -import { beforeAll, expect, vi } from 'vitest' - -// From Vue, slightly modified -function noop () { } - -if (typeof console === 'undefined') { - (window as any).console = { - warn: noop, - error: noop, - } -} - -// avoid info messages during test -// eslint-disable-next-line no-console -console.info = noop - -const asserted: string[] = [] - -function createCompareFn (spy: Mock) { - const hasWarned = (msg: string) => { - for (const args of spy.mock.calls) { - if (args.some((arg: any) => ( - arg.toString().includes(msg) - ))) return true - } - return false - } - - return (msg: string) => { - asserted.push(msg) - const warned = Array.isArray(msg) - ? msg.some(hasWarned) - : hasWarned(msg) - return { - pass: warned, - message: warned - ? () => (`Expected message "${msg}" not to have been warned`) - : () => (`Expected message "${msg}" to have been warned`), - } - } -} - -function toHaveBeenWarnedInit () { - let warn: Mock - let error: Mock - beforeAll(() => { - warn = vi.spyOn(console, 'warn').mockImplementation(noop) as any - error = vi.spyOn(console, 'error').mockImplementation(noop) as any - expect.extend({ - toHaveBeenWarned: createCompareFn(error), - toHaveBeenTipped: createCompareFn(warn), - }) - }) - - beforeEach(() => { - asserted.length = 0 - warn.mockClear() - error.mockClear() - }) - - afterEach(() => { - for (const type of ['error', 'warn']) { - const warned = (msg: string) => asserted.some(assertedMsg => msg.toString().includes(assertedMsg)) - for (const args of (console as any)[type].mock.calls) { - if (!warned(args[0])) { - throw new Error(`Unexpected console.${type} message: ${args[0]}`) - } - } - } - }) -} - -export default toHaveBeenWarnedInit diff --git a/packages/vuetify/tsconfig.dev.json b/packages/vuetify/tsconfig.dev.json index cd9f5ea4d76..55131eda055 100644 --- a/packages/vuetify/tsconfig.dev.json +++ b/packages/vuetify/tsconfig.dev.json @@ -3,13 +3,18 @@ "include": [ "src", "dev", + "test", "cypress", "cypress.config.ts", "vite.config.mts", - "vitest.config.mts" + "vitest.config.mts", + "vitest.workspace.mts" ], "compilerOptions": { - "allowJs": true + "allowJs": true, + "types": [ + "@vitest/browser/providers/webdriverio" + ] }, "vueCompilerOptions": { "strictTemplates": true diff --git a/packages/vuetify/tsconfig.dist.json b/packages/vuetify/tsconfig.dist.json index d3ed99e75ef..0eccfe9e486 100644 --- a/packages/vuetify/tsconfig.dist.json +++ b/packages/vuetify/tsconfig.dist.json @@ -1,4 +1,4 @@ { "extends": "./tsconfig.json", - "exclude": ["dev", "**/*.spec.*", "cypress"] + "exclude": ["dev", "**/*.spec.*", "test"] } diff --git a/packages/vuetify/tsconfig.json b/packages/vuetify/tsconfig.json index f6190fddd56..71a3cb7a635 100644 --- a/packages/vuetify/tsconfig.json +++ b/packages/vuetify/tsconfig.json @@ -2,23 +2,21 @@ "extends": "../../tsconfig.json", "include": [ "src", - "dev" + "dev", ], - "exclude": ["types-temp"], + "exclude": ["types-temp", "**/*.spec.cy.ts", "**/*.spec.cy.tsx"], "compilerOptions": { "baseUrl": ".", "outDir": "./types-temp", "paths": { - "@/*": [ - "src/*" - ], - "types": [ - "jest", - "node", - "vue-router" - ] + "@/*": ["src/*"], + "@test": ["test/index.ts"] }, + "types": [ + "node", + "vue-router" + ], "stripInternal": true, - "skipLibCheck": false, + "skipLibCheck": false } } diff --git a/packages/vuetify/types/cypress.d.ts b/packages/vuetify/types/cypress.d.ts deleted file mode 100644 index c578b2b0af8..00000000000 --- a/packages/vuetify/types/cypress.d.ts +++ /dev/null @@ -1,49 +0,0 @@ -import 'cypress-file-upload' -import 'cypress-real-events' -import type { mount as cyMount } from 'cypress/vue' -import type { SnapshotOptions } from '@percy/core' -import type { MountingOptions, VueWrapper } from '@vue/test-utils' -import type { AllowedComponentProps, ComponentPublicInstance, DefineSetupFnComponent, FunctionalComponent, VNodeProps } from 'vue' -import type { VuetifyOptions } from '@/framework' - -type Swipe = number[] | string - -type StripProps = keyof VNodeProps | keyof AllowedComponentProps | 'v-slots' | '$children' | `v-slot:${string}` -type Events = T extends { $props: infer P extends object } - ? { - [K in Exclude as K extends `on${infer N}` - ? Uncapitalize - : never - ]: P[K] extends (((...args: any[]) => any) | undefined) - ? Parameters>[] - : never - } - : never - -declare global { - namespace Cypress { - export interface Chainable { - mount: typeof cyMount & ( - (component: FunctionalComponent, options?: MountingOptions | null, vuetifyOptions?: VuetifyOptions) => Chainable - ) & ( - (component: JSX.Element, options?: MountingOptions | null, vuetifyOptions?: VuetifyOptions) => Chainable - ) - setProps (props: Record): Chainable> - getBySel (dataTestAttribute: string, args?: any): Chainable - percySnapshot ( - name?: string, - options?: SnapshotOptions - ): Chainable - vue (): Chainable> - swipe (...path: Swipe[]): Chainable - emitted any, E extends Events>, K extends keyof E> ( - selector: T, - event?: K - ): Chainable - } - } -} - -declare module 'cypress/vue' { - export function mount (component: JSX.Element, options?: MountingOptions | null): Cypress.Chainable -} diff --git a/packages/vuetify/vite.config.mts b/packages/vuetify/vite.config.mts index 87f760be536..72d0a799ba6 100644 --- a/packages/vuetify/vite.config.mts +++ b/packages/vuetify/vite.config.mts @@ -7,7 +7,6 @@ import { defineConfig, loadEnv } from 'vite' import vue from '@vitejs/plugin-vue' import vueJsx from '@vitejs/plugin-vue-jsx' -import viteSSR from 'vite-ssr/plugin.js' import Components from 'unplugin-vue-components/vite' import { warmup } from 'vite-plugin-warmup' @@ -26,6 +25,8 @@ const map = new Map(components.flatMap(file => { return Array.from(matches, m => [m[1] || m[2], file.replace('src/', '@/').replace('.ts', '')]) })) +const viteSSR = process.env.TEST ? () => {} : (await import('vite-ssr/plugin.js').then(m => m.default)) + export default defineConfig(({ mode }) => { Object.assign(process.env, loadEnv(mode, process.cwd(), '')) @@ -33,8 +34,8 @@ export default defineConfig(({ mode }) => { root: resolve('dev'), server: { host: process.env.HOST, - port: process.env.CYPRESS ? undefined : +(process.env.PORT ?? 8090), - strictPort: !!process.env.PORT && !process.env.CYPRESS, + port: process.env.TEST ? undefined : +(process.env.PORT ?? 8090), + strictPort: !!process.env.PORT && !process.env.TEST, }, preview: { host: process.env.HOST, @@ -53,7 +54,7 @@ export default defineConfig(({ mode }) => { vueJsx({ optimize: false, enableObjectSlots: false }), viteSSR(), Components({ - dts: !process.env.CYPRESS, + dts: !process.env.TEST, resolvers: [ name => { if (map.has(name)) { @@ -64,12 +65,7 @@ export default defineConfig(({ mode }) => { ], }), warmup({ - clientFiles: process.env.CYPRESS ? [ - './src/**/*.spec.cy.{js,jsx,ts,tsx}', - './cypress/support/index.ts', - ] : [ - './dev/index.html', - ], + clientFiles: process.env.TEST ? [] : ['./dev/index.html'], }), ], define: { diff --git a/packages/vuetify/vitest.config.mts b/packages/vuetify/vitest.config.mts index 3ad0356b2a6..18aac633fc7 100644 --- a/packages/vuetify/vitest.config.mts +++ b/packages/vuetify/vitest.config.mts @@ -1,39 +1,58 @@ import { defineConfig, mergeConfig } from 'vitest/config' import viteConfig from './vite.config.mjs' import AutoImport from 'unplugin-auto-import/vite' +import { fileURLToPath } from 'url' -export default defineConfig(configEnv => mergeConfig( - viteConfig(configEnv), - defineConfig({ - root: './src', - plugins: [ - AutoImport({ - imports: { - vitest: [ - 'describe', - 'it', - 'expect', - 'assert', - 'vi', - 'beforeAll', - 'afterAll', - 'beforeEach', - 'afterEach', - ], +const IS_RUN = process.argv.slice(2).some(v => v === 'run') + +export default defineConfig(configEnv => { + return mergeConfig( + viteConfig(configEnv), + defineConfig({ + root: './src', + resolve: { + alias: { + vue: 'vue/dist/vue.esm-bundler.js', + '@test': fileURLToPath(new URL('test/index.ts', import.meta.url)), + }, + }, + optimizeDeps: { + exclude: ['@vue/test-utils'], + }, + plugins: [ + AutoImport({ + include: '**/*.spec.?(browser.)@(ts|tsx)', + imports: { + vitest: [ + 'describe', + 'it', + 'expect', + 'assert', + 'vi', + 'beforeAll', + 'afterAll', + 'beforeEach', + 'afterEach', + ], + }, + dts: true, + }), + ], + server: { + hmr: false, + preTransformRequests: false, + }, + clearScreen: !IS_RUN, + test: { + watch: false, + setupFiles: ['../test/setup/to-have-been-warned.ts'], + reporters: process.env.GITHUB_ACTIONS ? ['basic', 'github-actions'] : [IS_RUN ? 'dot' : 'basic'], + coverage: { + provider: 'v8', + reporter: ['html'], + clean: true, }, - dts: true, - }), - ], - test: { - watch: false, - environment: 'jsdom', - setupFiles: ['../test/index.ts'], - reporters: process.env.GITHUB_ACTIONS ? ['dot', 'github-actions'] : ['dot'], - coverage: { - provider: 'v8', - reporter: ['html'], - clean: true, }, - }, - }) -)) + }) + ) +}) diff --git a/packages/vuetify/vitest.workspace.mts b/packages/vuetify/vitest.workspace.mts new file mode 100644 index 00000000000..ff526b370f1 --- /dev/null +++ b/packages/vuetify/vitest.workspace.mts @@ -0,0 +1,42 @@ +import { defineWorkspace } from 'vitest/config' +import { commands } from './test/setup/browser-commands.ts' + +export default defineWorkspace([ + { + extends: './vitest.config.mts', + test: { + name: 'unit', + include: ['**/*.spec.{ts,tsx}'], + setupFiles: ['../test/setup/unit-setup.ts'], + environment: 'jsdom', + }, + }, + { + extends: './vitest.config.mts', + test: { + name: 'browser', + include: ['**/*.spec.browser.{ts,tsx}'], + setupFiles: ['../test/setup/browser-setup.ts'], + bail: process.env.TEST_BAIL ? 1 : undefined, + browser: { + enabled: true, + provider: 'webdriverio', + name: 'chrome', + ui: false, + headless: !process.env.TEST_BAIL, + commands, + viewport: { + width: 1280, + height: 800, + }, + providerOptions: { + capabilities: { + 'goog:chromeOptions': { + args: ['--start-maximized', process.env.BAIL && '--auto-open-devtools-for-tabs'].filter(v => !!v), + }, + }, + }, + }, + }, + }, +]) diff --git a/patches/@testing-library__vue.patch b/patches/@testing-library__vue.patch new file mode 100644 index 00000000000..1d6195da5eb --- /dev/null +++ b/patches/@testing-library__vue.patch @@ -0,0 +1,39 @@ +diff --git a/dist/render.js b/dist/render.js +index 948b5b112ddb6a86516955d45d70791960e22676..47c757c2af9eab0cf9b66f96a7d5038751065551 100644 +--- a/dist/render.js ++++ b/dist/render.js +@@ -43,6 +43,9 @@ function render(Component) { + return _objectSpread({ + container, + baseElement, ++ wrapper, ++ element: wrapper.element, ++ vm: wrapper.vm, + debug: function debug() { + var el = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : baseElement; + var maxLength = arguments.length > 1 ? arguments[1] : undefined; +diff --git a/types/index.d.ts b/types/index.d.ts +index d4edc3bfe9aa77e5ffb39c20d172d0d56aa625b6..9e749cfc116ee78bc8250f28988027921e968f79 100644 +--- a/types/index.d.ts ++++ b/types/index.d.ts +@@ -1,8 +1,8 @@ + // Minimum TypeScript Version: 4.0 + /* eslint-disable @typescript-eslint/no-explicit-any */ + +-import {VNodeChild} from 'vue' +-import {MountingOptions} from '@vue/test-utils' ++import {ComponentPublicInstance, VNodeChild} from 'vue' ++import {MountingOptions, VueWrapper} from '@vue/test-utils' + import {queries, EventType, BoundFunctions} from '@testing-library/dom' + // eslint-disable-next-line import/no-extraneous-dependencies + import {OptionsReceived as PrettyFormatOptions} from 'pretty-format' +@@ -23,6 +23,9 @@ type Debug = ( + export interface RenderResult extends BoundFunctions { + container: Element + baseElement: Element ++ element: Element ++ wrapper: VueWrapper ++ vm: ComponentPublicInstance + debug: Debug + unmount(): void + html(): string diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 531e1121337..87818fafb9c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,6 +5,8 @@ settings: excludeLinksFromLockfile: false overrides: + '@testing-library/dom': npm:@vuetify/testing-library-dom@1.0.2 + '@types/node': 22.5.4 tough-cookie: 5.0.0-rc.4 pnpmfileChecksum: hdycaw5dzspbcs5sui7ue3czcu @@ -13,6 +15,9 @@ patchedDependencies: '@mdi/js@7.4.47': hash: wt4lkgr52gphla2wb445bnli3i path: patches/@mdi__js@7.4.47.patch + '@testing-library/vue': + hash: 3limad3b7od6m3nrz2f3jnaixy + path: patches/@testing-library__vue.patch importers: @@ -161,10 +166,10 @@ importers: version: 2.0.1 vite-plugin-inspect: specifier: ^0.8.3 - version: 0.8.3(rollup@4.14.1)(vite@5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3)) + version: 0.8.3(rollup@4.21.2)(vite@5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3)) vite-plugin-warmup: specifier: ^0.1.0 - version: 0.1.0(vite@5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3)) + version: 0.1.0(vite@5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3)) vue: specifier: ^3.4.27 version: 3.4.27(typescript@5.5.4) @@ -295,7 +300,7 @@ importers: version: 4.3.3 '@intlify/unplugin-vue-i18n': specifier: ^4.0.0 - version: 4.0.0(rollup@4.14.1)(vue-i18n@9.11.1(vue@3.4.27(typescript@5.5.4))) + version: 4.0.0(rollup@4.21.2)(vue-i18n@9.11.1(vue@3.4.27(typescript@5.5.4))) '@mdi/js': specifier: 7.4.47 version: 7.4.47(patch_hash=wt4lkgr52gphla2wb445bnli3i) @@ -322,10 +327,10 @@ importers: version: 1.26.3 '@vitejs/plugin-basic-ssl': specifier: ^1.1.0 - version: 1.1.0(vite@5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3)) + version: 1.1.0(vite@5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3)) '@vitejs/plugin-vue': specifier: ^5.0.4 - version: 5.0.4(vite@5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3))(vue@3.4.27(typescript@5.5.4)) + version: 5.0.4(vite@5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3))(vue@3.4.27(typescript@5.5.4)) '@vue/compiler-sfc': specifier: ^3.4.27 version: 3.4.27 @@ -334,10 +339,10 @@ importers: version: link:../api-generator '@yankeeinlondon/builder-api': specifier: ^1.4.1 - version: 1.4.1(@vitejs/plugin-vue@5.0.4(vite@5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3))(vue@3.4.27(typescript@5.5.4)))(encoding@0.1.13)(vite@5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3)) + version: 1.4.1(@vitejs/plugin-vue@5.0.4(vite@5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3))(vue@3.4.27(typescript@5.5.4)))(encoding@0.1.13)(vite@5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3)) ajv: specifier: ^8.12.0 - version: 8.12.0 + version: 8.17.1 algoliasearch-helper: specifier: ^3.22.3 version: 3.22.3(algoliasearch@4.23.3) @@ -355,10 +360,10 @@ importers: version: 4.0.2 jest: specifier: ^28.1.3 - version: 28.1.3(@types/node@20.12.7) + version: 28.1.3(@types/node@22.5.4) jest-runner-eslint: specifier: ^2.2.0 - version: 2.2.0(@jest/test-result@28.1.3)(eslint@8.57.0)(jest-runner@28.1.3)(jest@28.1.3(@types/node@20.12.7)) + version: 2.2.0(@jest/test-result@28.1.3)(eslint@8.57.0)(jest-runner@28.1.3)(jest@28.1.3(@types/node@22.5.4)) jest-silent-reporter: specifier: ^0.5.0 version: 0.5.0 @@ -394,31 +399,31 @@ importers: version: 0.39.0 unplugin-auto-import: specifier: 0.17.5 - version: 0.17.5(rollup@4.14.1) + version: 0.17.5(rollup@4.21.2) unplugin-fonts: specifier: 1.0.3 - version: 1.0.3(vite@5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3)) + version: 1.0.3(vite@5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3)) unplugin-vue-components: specifier: ^0.27.4 - version: 0.27.4(@babel/parser@7.25.6)(rollup@4.14.1)(vue@3.4.27(typescript@5.5.4)) + version: 0.27.4(@babel/parser@7.25.6)(rollup@4.21.2)(vue@3.4.27(typescript@5.5.4)) vite: - specifier: ^5.4.0 - version: 5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3) + specifier: ^5.4.3 + version: 5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3) vite-plugin-md: specifier: ^0.21.5 - version: 0.21.5(encoding@0.1.13)(vite@5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3)) + version: 0.21.5(encoding@0.1.13)(vite@5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3)) vite-plugin-pages: specifier: ^0.32.1 - version: 0.32.1(@vue/compiler-sfc@3.4.27)(vite@5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3)) + version: 0.32.1(@vue/compiler-sfc@3.4.27)(vite@5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3)) vite-plugin-pwa: specifier: ^0.17.4 - version: 0.17.5(@types/babel__core@7.1.19)(vite@5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3)) + version: 0.17.5(@types/babel__core@7.1.19)(vite@5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3)) vite-plugin-vue-layouts: specifier: ^0.11.0 - version: 0.11.0(vite@5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3))(vue-router@4.3.0(vue@3.4.27(typescript@5.5.4)))(vue@3.4.27(typescript@5.5.4)) + version: 0.11.0(vite@5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3))(vue-router@4.3.0(vue@3.4.27(typescript@5.5.4)))(vue@3.4.27(typescript@5.5.4)) vite-plugin-vuetify: specifier: ^2.0.4 - version: 2.0.4(vite@5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3))(vue@3.4.27(typescript@5.5.4))(vuetify@packages+vuetify) + version: 2.0.4(vite@5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3))(vue@3.4.27(typescript@5.5.4))(vuetify@packages+vuetify) vue-tsc: specifier: ^2.0.29 version: 2.0.29(typescript@5.5.4) @@ -433,7 +438,7 @@ importers: version: 3.0.0(date-fns@3.6.0) '@date-io/dayjs': specifier: ^3.0.0 - version: 3.0.0(dayjs@1.10.4) + version: 3.0.0 '@formatjs/intl': specifier: ^2.10.1 version: 2.10.1(typescript@5.5.4) @@ -447,11 +452,11 @@ importers: specifier: ^3.0.6 version: 3.0.6(@fortawesome/fontawesome-svg-core@6.5.2)(vue@3.4.27(typescript@5.5.4)) '@percy/cli': - specifier: ^1.28.2 - version: 1.28.2(typescript@5.5.4) - '@percy/cypress': - specifier: ^3.1.2 - version: 3.1.2(cypress@13.7.2) + specifier: ^1.29.3 + version: 1.29.3(typescript@5.5.4) + '@percy/sdk-utils': + specifier: ^1.29.3 + version: 1.29.3 '@rollup/plugin-alias': specifier: ^5.1.0 version: 5.1.0(rollup@3.29.4) @@ -464,21 +469,36 @@ importers: '@rollup/plugin-typescript': specifier: ^11.1.6 version: 11.1.6(rollup@3.29.4)(tslib@2.6.2)(typescript@5.5.4) + '@testing-library/dom': + specifier: npm:@vuetify/testing-library-dom@1.0.2 + version: '@vuetify/testing-library-dom@1.0.2' + '@testing-library/user-event': + specifier: ^14.5.2 + version: 14.5.2(@vuetify/testing-library-dom@1.0.2) + '@testing-library/vue': + specifier: ^8.1.0 + version: 8.1.0(patch_hash=3limad3b7od6m3nrz2f3jnaixy)(@vue/compiler-sfc@3.4.27)(vue@3.4.27(typescript@5.5.4)) '@types/node': - specifier: ^20.12.7 - version: 20.12.7 + specifier: 22.5.4 + version: 22.5.4 '@types/resize-observer-browser': specifier: ^0.1.11 version: 0.1.11 '@vitejs/plugin-vue': specifier: ^5.0.4 - version: 5.0.4(vite@5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3))(vue@3.4.27(typescript@5.5.4)) + version: 5.0.4(vite@5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3))(vue@3.4.27(typescript@5.5.4)) '@vitejs/plugin-vue-jsx': specifier: ^3.1.0 - version: 3.1.0(vite@5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3))(vue@3.4.27(typescript@5.5.4)) + version: 3.1.0(vite@5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3))(vue@3.4.27(typescript@5.5.4)) + '@vitest/browser': + specifier: ^2.0.5 + version: 2.0.5(typescript@5.5.4)(vitest@2.0.5)(webdriverio@8.40.5(encoding@0.1.13)) '@vitest/coverage-v8': specifier: ^2.0.5 - version: 2.0.5(vitest@2.0.5(@types/node@20.12.7)(happy-dom@8.9.0(encoding@0.1.13))(jsdom@25.0.0)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3)) + version: 2.0.5(vitest@2.0.5(@types/node@22.5.4)(@vitest/browser@2.0.5)(@vitest/ui@2.0.5)(happy-dom@8.9.0(encoding@0.1.13))(jsdom@25.0.0)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3)) + '@vitest/ui': + specifier: ^2.0.5 + version: 2.0.5(vitest@2.0.5) '@vue/babel-plugin-jsx': specifier: ^1.2.2 version: 1.2.2(@babel/core@7.25.2) @@ -493,7 +513,7 @@ importers: version: 8.3.2 autoprefixer: specifier: ^10.4.19 - version: 10.4.19(postcss@8.4.40) + version: 10.4.19(postcss@8.4.45) babel-plugin-add-import-extension: specifier: 1.5.1 version: 1.5.1(@babel/core@7.25.2) @@ -511,34 +531,25 @@ importers: version: 8.2.2 cssnano: specifier: ^6.1.2 - version: 6.1.2(postcss@8.4.40) + version: 6.1.2(postcss@8.4.45) csstype: specifier: ^3.1.3 version: 3.1.3 cy-mobile-commands: specifier: ^0.3.0 version: 0.3.0 - cypress: - specifier: ^13.7.2 - version: 13.7.2 - cypress-file-upload: - specifier: ^5.0.8 - version: 5.0.8(cypress@13.7.2) - cypress-real-events: - specifier: ^1.12.0 - version: 1.12.0(cypress@13.7.2) date-fns: specifier: ^3.6.0 version: 3.6.0 dotenv: specifier: ^16.4.5 version: 16.4.5 - eslint-plugin-cypress: - specifier: ^2.15.1 - version: 2.15.1(eslint@8.57.0) eslint-plugin-jest: specifier: ^28.7.0 - version: 28.7.0(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(jest@28.1.3(@types/node@20.12.7))(typescript@5.5.4) + version: 28.7.0(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(jest@28.1.3(@types/node@22.5.4))(typescript@5.5.4) + eslint-plugin-vitest: + specifier: 0.4.1 + version: 0.4.1(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4)(vitest@2.0.5(@types/node@22.5.4)(@vitest/browser@2.0.5)(@vitest/ui@2.0.5)(happy-dom@8.9.0(encoding@0.1.13))(jsdom@25.0.0)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3)) expect: specifier: ^28.1.3 version: 28.1.3 @@ -553,10 +564,13 @@ importers: version: 25.0.0 micromatch: specifier: ^4.0.5 - version: 4.0.5 + version: 4.0.8 postcss: specifier: ^8.4.38 - version: 8.4.40 + version: 8.4.45 + roboto-fontface: + specifier: ^0.10.0 + version: 0.10.0 rollup: specifier: ^3.20.7 version: 3.29.4 @@ -568,7 +582,7 @@ importers: version: 1.12.21(rollup@3.29.4) rollup-plugin-sourcemaps: specifier: ^0.6.3 - version: 0.6.3(@types/node@20.12.7)(rollup@3.29.4) + version: 0.6.3(@types/node@22.5.4)(rollup@3.29.4) rollup-plugin-terser: specifier: ^7.0.2 version: 7.0.2(rollup@3.29.4) @@ -585,20 +599,23 @@ importers: specifier: ^2.0.1 version: 2.0.1 vite: - specifier: ^5.4.0 - version: 5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3) + specifier: ^5.4.3 + version: 5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3) vite-ssr: specifier: ^0.17.1 - version: 0.17.1(@vitejs/plugin-vue@5.0.4(vite@5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3))(vue@3.4.27(typescript@5.5.4)))(@vueuse/head@1.3.1(vue@3.4.27(typescript@5.5.4)))(encoding@0.1.13)(rollup@3.29.4)(vite@5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3))(vue-router@4.3.0(vue@3.4.27(typescript@5.5.4)))(vue@3.4.27(typescript@5.5.4)) + version: 0.17.1(@vitejs/plugin-vue@5.0.4(vite@5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3))(vue@3.4.27(typescript@5.5.4)))(@vueuse/head@1.3.1(vue@3.4.27(typescript@5.5.4)))(encoding@0.1.13)(rollup@3.29.4)(vite@5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3))(vue-router@4.3.0(vue@3.4.27(typescript@5.5.4)))(vue@3.4.27(typescript@5.5.4)) vitest: specifier: ^2.0.5 - version: 2.0.5(@types/node@20.12.7)(happy-dom@8.9.0(encoding@0.1.13))(jsdom@25.0.0)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3) + version: 2.0.5(@types/node@22.5.4)(@vitest/browser@2.0.5)(@vitest/ui@2.0.5)(happy-dom@8.9.0(encoding@0.1.13))(jsdom@25.0.0)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3) vue-i18n: specifier: ^9.7.1 version: 9.11.1(vue@3.4.27(typescript@5.5.4)) vue-router: specifier: ^4.3.0 version: 4.3.0(vue@3.4.27(typescript@5.5.4)) + webdriverio: + specifier: ^8.40.5 + version: 8.40.5(encoding@0.1.13) packages: @@ -1288,15 +1305,17 @@ packages: '@bufbuild/protobuf@1.10.0': resolution: {integrity: sha512-QDdVFLoN93Zjg36NoQPZfsVH9tZew7wKDKyV5qRdj8ntT4wQCOradQjRaTdwMhWUYsgKsvCINKKm87FdEk96Ag==} - '@cosmicjs/sdk@1.0.11': - resolution: {integrity: sha512-Zm53TsyAGg2ytsJaBf06NcFA5FVG+tc39ZAYQgANi3uLkojnZFWGCIkwHVAn7CYVBac8dPF4tt0U6pYWNAA+Pg==} + '@bundled-es-modules/cookie@2.0.0': + resolution: {integrity: sha512-Or6YHg/kamKHpxULAdSqhGqnWFneIXu1NKvvfBBzKGwpVsYuFIQ5aBPHDnnoR3ghW1nvSkALd+EF9iMtY7Vjxw==} - '@cypress/request@3.0.1': - resolution: {integrity: sha512-TWivJlJi8ZDx2wGOw1dbLuHJKUYX7bWySw377nlnGOW3hP9/MUKIsEdXT/YngWxVdgNCHRBmFlBipE+5/2ZZlQ==} - engines: {node: '>= 6'} + '@bundled-es-modules/statuses@1.0.1': + resolution: {integrity: sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==} - '@cypress/xvfb@1.2.4': - resolution: {integrity: sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==} + '@bundled-es-modules/tough-cookie@0.1.6': + resolution: {integrity: sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw==} + + '@cosmicjs/sdk@1.0.11': + resolution: {integrity: sha512-Zm53TsyAGg2ytsJaBf06NcFA5FVG+tc39ZAYQgANi3uLkojnZFWGCIkwHVAn7CYVBac8dPF4tt0U6pYWNAA+Pg==} '@date-io/core@3.0.0': resolution: {integrity: sha512-S3j+IAQVBYNkQzchVVhX40eBkGDreBpScy9RXwTS5j2+k07+62pMVPisQ44Gq76Rqy5AOG/EZXCwBpY/jbemvA==} @@ -1709,6 +1728,22 @@ packages: resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} engines: {node: '>=6.9.0'} + '@inquirer/confirm@3.2.0': + resolution: {integrity: sha512-oOIwPs0Dvq5220Z8lGL/6LHRTEr9TgLHmiI99Rj1PJ1p1czTys+olrgBqZk4E2qC0YTzeHprxSQmoHioVdJ7Lw==} + engines: {node: '>=18'} + + '@inquirer/core@9.1.0': + resolution: {integrity: sha512-RZVfH//2ytTjmaBIzeKT1zefcQZzuruwkpTwwbe/i2jTl4o9M+iML5ChULzz6iw1Ok8iUBBsRCjY2IEbD8Ft4w==} + engines: {node: '>=18'} + + '@inquirer/figures@1.0.5': + resolution: {integrity: sha512-79hP/VWdZ2UVc9bFGJnoQ/lQMpL74mGgzSYX1xUqCVk7/v73vJCMw1VuyWN1jGkZ9B3z7THAbySqGbCNefcjfA==} + engines: {node: '>=18'} + + '@inquirer/type@1.5.3': + resolution: {integrity: sha512-xUQ14WQGR/HK5ei+2CvgcwoH9fQ4PgPGmVFSN0pc1+fVyDL3MREhyAY7nxEErSu6CkllBM3D7e3e+kOvtu+eIg==} + engines: {node: '>=18'} + '@intlify/bundle-utils@8.0.0': resolution: {integrity: sha512-1B++zykRnMwQ+20SpsZI1JCnV/YJt9Oq7AGlEurzkWJOFtFAVqaGc/oV36PBRYeiKnTbY9VYfjBimr2Vt42wLQ==} engines: {node: '>= 14.16'} @@ -1874,6 +1909,10 @@ packages: '@mdi/svg@7.4.47': resolution: {integrity: sha512-WQ2gDll12T9WD34fdRFgQVgO8bag3gavrAgJ0frN4phlwdJARpE6gO1YvLEMJR0KKgoc+/Ea/A0Pp11I00xBvw==} + '@mswjs/interceptors@0.29.1': + resolution: {integrity: sha512-3rDakgJZ77+RiQUuSK69t1F0m8BQKA8Vh5DCS5V0DWvNY67zob2JhhQrhCO0AKLGINTRSFd1tBaHcJTkhefoSw==} + engines: {node: '>=18'} + '@napi-rs/wasm-runtime@0.2.4': resolution: {integrity: sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==} @@ -2115,74 +2154,78 @@ packages: '@one-ini/wasm@0.1.1': resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} - '@percy/cli-app@1.28.2': - resolution: {integrity: sha512-UhuxmBRcgeyBnzV7ixiSqUlMdcBg7LyrTtDJWEjQ36SH0jJOAVu020cGcPLNDDTmqXDU7DsDoNifxtPzXT+d5w==} + '@open-draft/deferred-promise@2.2.0': + resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} + + '@open-draft/logger@0.3.0': + resolution: {integrity: sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==} + + '@open-draft/until@2.1.0': + resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} + + '@percy/cli-app@1.29.3': + resolution: {integrity: sha512-7yGEDFIRLMsJ6nzl6aMem9nMj5rfkxODEQIciuIcuao5ZD1x23KhuN3u4QLLwQFOFgy7h4WAePnUTCR6ZtpGCQ==} engines: {node: '>=14'} - '@percy/cli-build@1.28.2': - resolution: {integrity: sha512-VWfrgcOaN6rxSCwifQ5aJuGQDU2Nmq3lvvqZsVVSj3lBbE4KsEaxyoH2Hmm2pCOXi1DzOQ0+zHv+Ra+m4CyBvA==} + '@percy/cli-build@1.29.3': + resolution: {integrity: sha512-fvDr4mUFIG/TQmMWnzQqWi2ga57SWPzXwlh65a4/0PPRKo0dKybFhvZvhCFYhcnVWqXEVYRHM21/oUvFhgnsCw==} engines: {node: '>=14'} - '@percy/cli-command@1.28.2': - resolution: {integrity: sha512-UUa+dSpzTcXVjzvElL4wD315QYDuGrbnXObgaztyGWdufEbvLWflU4AiQZrxC5abDXQdNWQUAAizorA5dGhaCg==} + '@percy/cli-command@1.29.3': + resolution: {integrity: sha512-jSltYf97E5u4jjTaW6gLU+5T/sRBwS0RlvraE21gKa0N9SH1l5nWs4YFfsIwamYg3EnCmIrwAf0gupQcQgAuaA==} engines: {node: '>=14'} hasBin: true - '@percy/cli-config@1.28.2': - resolution: {integrity: sha512-O1O2n16jOm6HCzGM207/NbX+IR7ezUaQGnExi4G5SbOYqZeBIrsKpbEi/SERBfg4Kexv16LrF6NLOs75N2oaSw==} + '@percy/cli-config@1.29.3': + resolution: {integrity: sha512-lVrOqeS1ACaQp9tM4LE7joW/cuGaSJcM/182ci5D3Zr9Yz6Ik/oe1MQnIM9dqnsHmnwasuGBsICsflbVqqcXHQ==} engines: {node: '>=14'} - '@percy/cli-exec@1.28.2': - resolution: {integrity: sha512-tRvmoDJMb94XjA60a0lmN2XphzC/r70ruic+VfhFwEqDVoLY/6LxqjSXjehiSD5huXYDyPtaMeJo7oU1FxJyZg==} + '@percy/cli-exec@1.29.3': + resolution: {integrity: sha512-AfZ2hI/snahjgXHuI0bKhRLJoEOfod8Uph6fu1UdjI2r6gacgBurvJmrwZOT5yChp2i8+B99e+qFqWNUi9AI7Q==} engines: {node: '>=14'} - '@percy/cli-snapshot@1.28.2': - resolution: {integrity: sha512-Qda4MKjKxoM/TEBjl54lCXMJAmQB6ZZheE96pJzEJzlPQtlj9r/moM3etCV+res0qaSOgx9BL0DncruvAwM/4g==} + '@percy/cli-snapshot@1.29.3': + resolution: {integrity: sha512-5buoW+tSdfCu0Df7LYzOpjJlb9u+4aCTDrYlmwBcyEVUq01E39LN1kRWCYL6jU/APNB+ybUKtLr9w0RtcPDYTQ==} engines: {node: '>=14'} - '@percy/cli-upload@1.28.2': - resolution: {integrity: sha512-vzH4wRdAFGvktNlh57p4s9Qq+rT0MsiQ/kh7pDvzQ1lJ6glpCBXSiiahMtkR8AP8gMMzxYONAuV/htB/t8sFUw==} + '@percy/cli-upload@1.29.3': + resolution: {integrity: sha512-KYAtcAzE50lbZ8NTqao/GSVurESUi2iQFCJ0zRwEccxViOJy/dfb5j1i10VPlqP5glCZS+eXXY2YYoxjxVCz3w==} engines: {node: '>=14'} - '@percy/cli@1.28.2': - resolution: {integrity: sha512-hwibBu6zsjfWXIe8WFgrKizGjxkTzYcGQ4eOPcMQXfgK3yUZ24N5v8sqCOobRA/SbdD117zp2WUEkBRWCJ85gg==} + '@percy/cli@1.29.3': + resolution: {integrity: sha512-j+LEHQrrtQV0uOe1u38U6RExPl86rwof+qWtkV8cOvPwucAo0DmeVfperLhZFIU/qrZjA9lHkDdYHZyzRndOBw==} engines: {node: '>=14'} hasBin: true - '@percy/client@1.28.2': - resolution: {integrity: sha512-UoQ4WY8zJhwv/7vKJS+1vbeu/T7YckSmOp/moCoAnHY6QOIXYs7EGkNyeEw5iXoQYzMw6KkkLYPC7YC0rt5pSg==} + '@percy/client@1.29.3': + resolution: {integrity: sha512-BTP/wfgs2/Hjj650tGmp+jkATEIOdNNZFZSRWPXGXF+PFG4zK5jTejBEZlBl3NUqhwMqtfLX/uyvsfKFaWfYDA==} engines: {node: '>=14'} - '@percy/config@1.28.2': - resolution: {integrity: sha512-Q9NoenDuhRiY+eBGrw8FJmmU8hErTsjBxccUOvrfn0A4JXRvcFHitvrh85rXG/HhyT4bcoB9O93QhV6F9KTq7A==} + '@percy/config@1.29.3': + resolution: {integrity: sha512-Jk79XGpiCNI7gmdCoWkn5V7HVa6FFfcYvFg3H1OMd2BqZEDKkPq9bbk0e4AZ93xc2BOjmYWHHj69w7VCu1peug==} engines: {node: '>=14'} - '@percy/core@1.28.2': - resolution: {integrity: sha512-7JkZrsLoHDD2bkhN4u5T/+0sC0UT73Lv1qF3lIMLu+Qjt1BhyKdnitbOnjFlrVOwqC5uNgr7/gvcULLVbJga8Q==} + '@percy/core@1.29.3': + resolution: {integrity: sha512-5RwQyezq/i4fqSMeoKJole/kZ7n7lABITS6py2e9een6svNFRKI8VqWBlMuFsL50Z5mUcbSJDhIl8O8NbIpdwQ==} engines: {node: '>=14'} - '@percy/cypress@3.1.2': - resolution: {integrity: sha512-JXrGDZbqwkzQd2h5T5D7PvqoucNaiMh4ChPp8cLQiEtRuLHta9nf1lEuXH+jnatGL2j+3jJFIHJ0L7XrgVnvQA==} - peerDependencies: - cypress: '>=3' - - '@percy/dom@1.28.2': - resolution: {integrity: sha512-bUU38EMowO+y+pnLzl0naikv0pVQvcrkrBm7K7eVGUt6orRTqr5Tr8bMV7Ooac4mlMwaZvCkAH7gPhiDAONUmw==} + '@percy/dom@1.29.3': + resolution: {integrity: sha512-wz5PV5IW/ooYTmeiq4qFDWyZrVoyp4x+cOQ4ndYStDMkiFMnN5zvvqJlSsUOJ9/YKh/BeMn+ed8hlfKOWW3zEQ==} - '@percy/env@1.28.2': - resolution: {integrity: sha512-40UhiL5MylFN39pzzoyDKgult2ZmSbuc3ADrNGBx9zyMdFEoTLZg5BcFZoSUHHjPboe2jYZFYrRqoXxix++OfA==} + '@percy/env@1.29.3': + resolution: {integrity: sha512-DwWsnrGWsBQkIuNvw//CNQpyd5LY2rzc6wqB/2GMpVf4iuzKvm5ND55GX8j0FYhf0kJan0aS/+mDKEgZfea1LA==} engines: {node: '>=14'} - '@percy/logger@1.28.2': - resolution: {integrity: sha512-ZF1iDjY9oBL+4WEqGuJ4JJaUdyUqGhdJtS+qDV8iqrQ6VngWBpO3lg0Uhy8RIkqUSLGKbwVbnxkfvA5kXx+yAw==} + '@percy/logger@1.29.3': + resolution: {integrity: sha512-nNslGmznG5ChKHFtPtRFcjAeuG/Zhr1OgRapLLeikyXyxy8bT929kUgBuGh4ADhp95iovcN7zlHQmpuwbOPQ2Q==} engines: {node: '>=14'} - '@percy/sdk-utils@1.28.2': - resolution: {integrity: sha512-cMFz8AjZ2KunN0dVwzA+Wosk4B+6G9dUkh2YPhYvqs0KLcCyYs3s91IzOQmtBOYwAUVja/W/u6XmBHw0jaxg0A==} + '@percy/sdk-utils@1.29.3': + resolution: {integrity: sha512-ITUZinf+50O/Izs/X3HaRxnZvLv4Fw8lV2mSqVD/500au6bApUNeMHnoaAHOC57FgyUOUaYldiAAXNtE/zANtw==} engines: {node: '>=14'} - '@percy/webdriver-utils@1.28.2': - resolution: {integrity: sha512-bD0UoR1/69xcsL2mhvZ4xQKhWJYbqUJUFMiNr8xqR55Z4dArbeN9S2ZYU6aMVRemuKyn7ki0ttNFHq0z2GFvGg==} + '@percy/webdriver-utils@1.29.3': + resolution: {integrity: sha512-+0qyRGKLfYdtzhc9U1m7RCBk6c3+aGy8DPLM6FdlvCrX5+Z93PLLMpoQcXid9cUFFTGAnxOKtYUWS2kc6Q32mg==} engines: {node: '>=14'} '@pkgjs/parseargs@0.11.0': @@ -2192,6 +2235,14 @@ packages: '@polka/url@1.0.0-next.25': resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==} + '@promptbook/utils@0.70.0-1': + resolution: {integrity: sha512-qd2lLRRN+sE6UuNMi2tEeUUeb4zmXnxY5EMdfHVXNE+bqBDpUC7/aEfXgA3jnUXEr+xFjQ8PTFQgWvBMaKvw0g==} + + '@puppeteer/browsers@1.9.1': + resolution: {integrity: sha512-PuvK6xZzGhKPvlx3fpfdM2kYY3P/hB1URtK8wA7XUJ6prn6pp22zvJHu48th0SGcHL9SutbPHrFuQgfXTFobWA==} + engines: {node: '>=16.3.0'} + hasBin: true + '@rollup/plugin-alias@5.1.0': resolution: {integrity: sha512-lpA3RZ9PdIG7qqhEfv79tBffNaoDuukFDrmhLqg9ifv99u/ehn+lOg30x2zmhf8AQqQUZaMk/B9fZraQ6/acDQ==} engines: {node: '>=14.0.0'} @@ -2278,78 +2329,83 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.14.1': - resolution: {integrity: sha512-fH8/o8nSUek8ceQnT7K4EQbSiV7jgkHq81m9lWZFIXjJ7lJzpWXbQFpT/Zh6OZYnpFykvzC3fbEvEAFZu03dPA==} + '@rollup/rollup-android-arm-eabi@4.21.2': + resolution: {integrity: sha512-fSuPrt0ZO8uXeS+xP3b+yYTCBUd05MoSp2N/MFOgjhhUhMmchXlpTQrTpI8T+YAwAQuK7MafsCOxW7VrPMrJcg==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.14.1': - resolution: {integrity: sha512-Y/9OHLjzkunF+KGEoJr3heiD5X9OLa8sbT1lm0NYeKyaM3oMhhQFvPB0bNZYJwlq93j8Z6wSxh9+cyKQaxS7PQ==} + '@rollup/rollup-android-arm64@4.21.2': + resolution: {integrity: sha512-xGU5ZQmPlsjQS6tzTTGwMsnKUtu0WVbl0hYpTPauvbRAnmIvpInhJtgjj3mcuJpEiuUw4v1s4BimkdfDWlh7gA==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.14.1': - resolution: {integrity: sha512-+kecg3FY84WadgcuSVm6llrABOdQAEbNdnpi5X3UwWiFVhZIZvKgGrF7kmLguvxHNQy+UuRV66cLVl3S+Rkt+Q==} + '@rollup/rollup-darwin-arm64@4.21.2': + resolution: {integrity: sha512-99AhQ3/ZMxU7jw34Sq8brzXqWH/bMnf7ZVhvLk9QU2cOepbQSVTns6qoErJmSiAvU3InRqC2RRZ5ovh1KN0d0Q==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.14.1': - resolution: {integrity: sha512-2pYRzEjVqq2TB/UNv47BV/8vQiXkFGVmPFwJb+1E0IFFZbIX8/jo1olxqqMbo6xCXf8kabANhp5bzCij2tFLUA==} + '@rollup/rollup-darwin-x64@4.21.2': + resolution: {integrity: sha512-ZbRaUvw2iN/y37x6dY50D8m2BnDbBjlnMPotDi/qITMJ4sIxNY33HArjikDyakhSv0+ybdUxhWxE6kTI4oX26w==} cpu: [x64] os: [darwin] - '@rollup/rollup-linux-arm-gnueabihf@4.14.1': - resolution: {integrity: sha512-mS6wQ6Do6/wmrF9aTFVpIJ3/IDXhg1EZcQFYHZLHqw6AzMBjTHWnCG35HxSqUNphh0EHqSM6wRTT8HsL1C0x5g==} + '@rollup/rollup-linux-arm-gnueabihf@4.21.2': + resolution: {integrity: sha512-ztRJJMiE8nnU1YFcdbd9BcH6bGWG1z+jP+IPW2oDUAPxPjo9dverIOyXz76m6IPA6udEL12reYeLojzW2cYL7w==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.21.2': + resolution: {integrity: sha512-flOcGHDZajGKYpLV0JNc0VFH361M7rnV1ee+NTeC/BQQ1/0pllYcFmxpagltANYt8FYf9+kL6RSk80Ziwyhr7w==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.14.1': - resolution: {integrity: sha512-p9rGKYkHdFMzhckOTFubfxgyIO1vw//7IIjBBRVzyZebWlzRLeNhqxuSaZ7kCEKVkm/kuC9fVRW9HkC/zNRG2w==} + '@rollup/rollup-linux-arm64-gnu@4.21.2': + resolution: {integrity: sha512-69CF19Kp3TdMopyteO/LJbWufOzqqXzkrv4L2sP8kfMaAQ6iwky7NoXTp7bD6/irKgknDKM0P9E/1l5XxVQAhw==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.14.1': - resolution: {integrity: sha512-nDY6Yz5xS/Y4M2i9JLQd3Rofh5OR8Bn8qe3Mv/qCVpHFlwtZSBYSPaU4mrGazWkXrdQ98GB//H0BirGR/SKFSw==} + '@rollup/rollup-linux-arm64-musl@4.21.2': + resolution: {integrity: sha512-48pD/fJkTiHAZTnZwR0VzHrao70/4MlzJrq0ZsILjLW/Ab/1XlVUStYyGt7tdyIiVSlGZbnliqmult/QGA2O2w==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.14.1': - resolution: {integrity: sha512-im7HE4VBL+aDswvcmfx88Mp1soqL9OBsdDBU8NqDEYtkri0qV0THhQsvZtZeNNlLeCUQ16PZyv7cqutjDF35qw==} - cpu: [ppc64le] + '@rollup/rollup-linux-powerpc64le-gnu@4.21.2': + resolution: {integrity: sha512-cZdyuInj0ofc7mAQpKcPR2a2iu4YM4FQfuUzCVA2u4HI95lCwzjoPtdWjdpDKyHxI0UO82bLDoOaLfpZ/wviyQ==} + cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.14.1': - resolution: {integrity: sha512-RWdiHuAxWmzPJgaHJdpvUUlDz8sdQz4P2uv367T2JocdDa98iRw2UjIJ4QxSyt077mXZT2X6pKfT2iYtVEvOFw==} + '@rollup/rollup-linux-riscv64-gnu@4.21.2': + resolution: {integrity: sha512-RL56JMT6NwQ0lXIQmMIWr1SW28z4E4pOhRRNqwWZeXpRlykRIlEpSWdsgNWJbYBEWD84eocjSGDu/XxbYeCmwg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.14.1': - resolution: {integrity: sha512-VMgaGQ5zRX6ZqV/fas65/sUGc9cPmsntq2FiGmayW9KMNfWVG/j0BAqImvU4KTeOOgYSf1F+k6at1UfNONuNjA==} + '@rollup/rollup-linux-s390x-gnu@4.21.2': + resolution: {integrity: sha512-PMxkrWS9z38bCr3rWvDFVGD6sFeZJw4iQlhrup7ReGmfn7Oukrr/zweLhYX6v2/8J6Cep9IEA/SmjXjCmSbrMQ==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.14.1': - resolution: {integrity: sha512-9Q7DGjZN+hTdJomaQ3Iub4m6VPu1r94bmK2z3UeWP3dGUecRC54tmVu9vKHTm1bOt3ASoYtEz6JSRLFzrysKlA==} + '@rollup/rollup-linux-x64-gnu@4.21.2': + resolution: {integrity: sha512-B90tYAUoLhU22olrafY3JQCFLnT3NglazdwkHyxNDYF/zAxJt5fJUB/yBoWFoIQ7SQj+KLe3iL4BhOMa9fzgpw==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.14.1': - resolution: {integrity: sha512-JNEG/Ti55413SsreTguSx0LOVKX902OfXIKVg+TCXO6Gjans/k9O6ww9q3oLGjNDaTLxM+IHFMeXy/0RXL5R/g==} + '@rollup/rollup-linux-x64-musl@4.21.2': + resolution: {integrity: sha512-7twFizNXudESmC9oneLGIUmoHiiLppz/Xs5uJQ4ShvE6234K0VB1/aJYU3f/4g7PhssLGKBVCC37uRkkOi8wjg==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.14.1': - resolution: {integrity: sha512-ryS22I9y0mumlLNwDFYZRDFLwWh3aKaC72CWjFcFvxK0U6v/mOkM5Up1bTbCRAhv3kEIwW2ajROegCIQViUCeA==} + '@rollup/rollup-win32-arm64-msvc@4.21.2': + resolution: {integrity: sha512-9rRero0E7qTeYf6+rFh3AErTNU1VCQg2mn7CQcI44vNUWM9Ze7MSRS/9RFuSsox+vstRt97+x3sOhEey024FRQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.14.1': - resolution: {integrity: sha512-TdloItiGk+T0mTxKx7Hp279xy30LspMso+GzQvV2maYePMAWdmrzqSNZhUpPj3CGw12aGj57I026PgLCTu8CGg==} + '@rollup/rollup-win32-ia32-msvc@4.21.2': + resolution: {integrity: sha512-5rA4vjlqgrpbFVVHX3qkrCo/fZTj1q0Xxpg+Z7yIo3J2AilW7t2+n6Q8Jrx+4MrYpAnjttTYF8rr7bP46BPzRw==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.14.1': - resolution: {integrity: sha512-wQGI+LY/Py20zdUPq+XCem7JcPOyzIJBm3dli+56DJsQOHbnXZFEwgmnC6el1TPAfC8lBT3m+z69RmLykNUbew==} + '@rollup/rollup-win32-x64-msvc@4.21.2': + resolution: {integrity: sha512-6UUxd0+SKomjdzuAcp+HAmxw1FlGBnl1v2yEPSabtx4lBfdXHDVsW7+lQkgz9cNFJGY3AWR7+V8P5BqkD9L9nA==} cpu: [x64] os: [win32] @@ -2387,6 +2443,10 @@ packages: resolution: {integrity: sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==} engines: {node: '>=4'} + '@sindresorhus/is@5.6.0': + resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} + engines: {node: '>=14.16'} + '@sinonjs/commons@1.8.1': resolution: {integrity: sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw==} @@ -2396,6 +2456,29 @@ packages: '@surma/rollup-plugin-off-main-thread@2.2.3': resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} + '@szmarczak/http-timer@5.0.1': + resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} + engines: {node: '>=14.16'} + + '@testing-library/user-event@14.5.2': + resolution: {integrity: sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==} + engines: {node: '>=12', npm: '>=6'} + peerDependencies: + '@testing-library/dom': npm:@vuetify/testing-library-dom@1.0.2 + + '@testing-library/vue@8.1.0': + resolution: {integrity: sha512-ls4RiHO1ta4mxqqajWRh8158uFObVrrtAPoxk7cIp4HrnQUj/ScKzqz53HxYpG3X6Zb7H2v+0eTGLSoy8HQ2nA==} + engines: {node: '>=14'} + peerDependencies: + '@vue/compiler-sfc': '>= 3' + vue: '>= 3' + peerDependenciesMeta: + '@vue/compiler-sfc': + optional: true + + '@tootallnate/quickjs-emscripten@0.23.0': + resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} + '@trysound/sax@0.2.0': resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} engines: {node: '>=10.13.0'} @@ -2414,6 +2497,9 @@ packages: '@tybys/wasm-util@0.9.0': resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} + '@types/aria-query@5.0.4': + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + '@types/babel__core@7.1.19': resolution: {integrity: sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==} @@ -2429,6 +2515,9 @@ packages: '@types/color-name@1.1.1': resolution: {integrity: sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==} + '@types/cookie@0.6.0': + resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} @@ -2450,6 +2539,9 @@ packages: '@types/hogan.js@3.0.1': resolution: {integrity: sha512-D03i/2OY7kGyMq9wdQ7oD8roE49z/ZCZThe/nbahtvuqCNZY9T2MfedOWyeBdbEpY2W8Gnh/dyJLdFtUCOkYbg==} + '@types/http-cache-semantics@4.0.4': + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + '@types/istanbul-lib-coverage@2.0.3': resolution: {integrity: sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==} @@ -2495,8 +2587,11 @@ packages: '@types/ms@0.7.31': resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} - '@types/node@20.12.7': - resolution: {integrity: sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==} + '@types/mute-stream@0.0.4': + resolution: {integrity: sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==} + + '@types/node@22.5.4': + resolution: {integrity: sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -2525,21 +2620,30 @@ packages: '@types/responselike@1.0.3': resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} - '@types/sinonjs__fake-timers@8.1.1': - resolution: {integrity: sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==} - - '@types/sizzle@2.3.2': - resolution: {integrity: sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg==} - '@types/stack-utils@2.0.0': resolution: {integrity: sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==} + '@types/statuses@2.0.5': + resolution: {integrity: sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==} + '@types/stringify-object@4.0.5': resolution: {integrity: sha512-TzX5V+njkbJ8iJ0mrj+Vqveep/1JBH4SSA3J2wYrE1eUrOhdsjTBCb0kao4EquSQ8KgPpqY4zSVP2vCPWKBElg==} + '@types/tough-cookie@4.0.5': + resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} + '@types/trusted-types@2.0.2': resolution: {integrity: sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==} + '@types/which@2.0.2': + resolution: {integrity: sha512-113D3mDkZDjo+EeUEHCFy0qniNc1ZpecGiAU7WSo7YDoSzolZIQKpYFHrPpjkB2nuyahcKfrmLXeQlh7gqJYdw==} + + '@types/wrap-ansi@3.0.0': + resolution: {integrity: sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==} + + '@types/ws@8.5.12': + resolution: {integrity: sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==} + '@types/yargs-parser@15.0.0': resolution: {integrity: sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==} @@ -2549,8 +2653,8 @@ packages: '@types/yargs@17.0.13': resolution: {integrity: sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg==} - '@types/yauzl@2.9.1': - resolution: {integrity: sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA==} + '@types/yauzl@2.10.3': + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} '@typescript-eslint/eslint-plugin@7.18.0': resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} @@ -2683,6 +2787,21 @@ packages: vite: ^5.0.0 vue: ^3.2.25 + '@vitest/browser@2.0.5': + resolution: {integrity: sha512-VbOYtu/6R3d7ASZREcrJmRY/sQuRFO9wMVsEDqfYbWiJRh2fDNi8CL1Csn7Ux31pOcPmmM5QvzFCMpiojvVh8g==} + peerDependencies: + playwright: '*' + safaridriver: '*' + vitest: 2.0.5 + webdriverio: '*' + peerDependenciesMeta: + playwright: + optional: true + safaridriver: + optional: true + webdriverio: + optional: true + '@vitest/coverage-v8@2.0.5': resolution: {integrity: sha512-qeFcySCg5FLO2bHHSa0tAZAOnAUbp4L6/A5JDuj9+bt53JREl8hpLjLHEWF0e/gWc8INVpJaqA7+Ene2rclpZg==} peerDependencies: @@ -2703,6 +2822,11 @@ packages: '@vitest/spy@2.0.5': resolution: {integrity: sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==} + '@vitest/ui@2.0.5': + resolution: {integrity: sha512-m+ZpVt/PVi/nbeRKEjdiYeoh0aOfI9zr3Ria9LO7V2PlMETtAXJS3uETEZkc8Be2oOl8mhd7Ew+5SRBXRYncNw==} + peerDependencies: + vitest: 2.0.5 + '@vitest/utils@2.0.5': resolution: {integrity: sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==} @@ -2834,11 +2958,42 @@ packages: vue: ^3.4.0 vuetify: ^3.6.1 + '@vuetify/testing-library-dom@1.0.2': + resolution: {integrity: sha512-tQo3A63uCq2646IhgYLIFugC8HRVyBssvRidzu+iQLkCWSO8ikz9z6tqDU3NjbAxSXxeAFa5x1Nq7VMDxrQ4Lw==} + engines: {node: '>=18'} + '@vueuse/head@1.3.1': resolution: {integrity: sha512-XCcHGfDzkGlHS7KIPJVYN//L7jpfASLsN7MUE19ndHVQLnPIDxqFLDl7IROsY81PKzawVAUe4OYVWcGixseWxA==} peerDependencies: vue: '>=2.7 || >=3' + '@wdio/config@8.40.3': + resolution: {integrity: sha512-HIi+JnHEDAExhzGRQuZOXw1HWIpe/bsVFHwNISJhY6wS4Nijaigmegs2p14Rv16ydOF19hGrxdKsl8k5STIP2A==} + engines: {node: ^16.13 || >=18} + + '@wdio/logger@8.38.0': + resolution: {integrity: sha512-kcHL86RmNbcQP+Gq/vQUGlArfU6IIcbbnNp32rRIraitomZow+iEoc519rdQmSVusDozMS5DZthkgDdxK+vz6Q==} + engines: {node: ^16.13 || >=18} + + '@wdio/logger@9.0.8': + resolution: {integrity: sha512-uIyYIDBwLczmsp9JE5hN3ME8Xg+9WNBfSNXD69ICHrY9WPTzFf94UeTuavK7kwSKF3ro2eJbmNZItYOfnoovnw==} + engines: {node: '>=18.20.0'} + + '@wdio/protocols@8.40.3': + resolution: {integrity: sha512-wK7+eyrB3TAei8RwbdkcyoNk2dPu+mduMBOdPJjp8jf/mavd15nIUXLID1zA+w5m1Qt1DsT1NbvaeO9+aJQ33A==} + + '@wdio/repl@8.40.3': + resolution: {integrity: sha512-mWEiBbaC7CgxvSd2/ozpbZWebnRIc8KRu/J81Hlw/txUWio27S7IpXBlZGVvhEsNzq0+cuxB/8gDkkXvMPbesw==} + engines: {node: ^16.13 || >=18} + + '@wdio/types@8.40.3': + resolution: {integrity: sha512-zK17uyON3Ise3m+XwiF5VrrdZcXXmvqB8AWXoKe88DiksFUPMVoCOuVL2SSX1KnA2YLlZBA55qcFZT99GORVKQ==} + engines: {node: ^16.13 || >=18} + + '@wdio/utils@8.40.3': + resolution: {integrity: sha512-pv/848KGfPN3YXU4QRfTYGkAu4/lejIfoGzGpvGNDcACiVxgZhyRZkJ2xVaSnGaXzF0R7pMozrkU5/DnEhcxMg==} + engines: {node: ^16.13 || >=18} + '@yankeeinlondon/builder-api@1.4.1': resolution: {integrity: sha512-qc6HyfqtuS06FvA5rK0L62Nmc1LnarVOt8/V/mTX2DBZlpTfIDpudpbE/7/kxjme9pP4PFMCk7cPSrprLEorjw==} @@ -2856,6 +3011,10 @@ packages: resolution: {integrity: sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q==} engines: {node: '>=14.15.0'} + '@zip.js/zip.js@2.7.52': + resolution: {integrity: sha512-+5g7FQswvrCHwYKNMd/KFxZSObctLSsQOgqBSi0LzwHo3li9Eh1w5cF5ndjQw9Zbr3ajVnd2+XyiX85gAetx1Q==} + engines: {bun: '>=0.7.0', deno: '>=1.0.0', node: '>=16.5.0'} + '@zkochan/js-yaml@0.0.7': resolution: {integrity: sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ==} hasBin: true @@ -2871,6 +3030,10 @@ packages: resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -2904,8 +3067,8 @@ packages: ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - ajv@8.12.0: - resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} algoliasearch-helper@3.19.0: resolution: {integrity: sha512-AaSb5DZDMZmDQyIy6lf4aL0OZGgyIdqvLIIvSuVQOIOqfhrYSY7TvotIFI2x0Q3cP3xUpTd7lI1astUC4aXBJw==} @@ -2971,8 +3134,13 @@ packages: aproba@2.0.0: resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} - arch@2.2.0: - resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} + archiver-utils@5.0.2: + resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==} + engines: {node: '>= 14'} + + archiver@7.0.1: + resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==} + engines: {node: '>= 14'} argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} @@ -2980,6 +3148,9 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + array-buffer-byte-length@1.0.1: resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} engines: {node: '>= 0.4'} @@ -3037,20 +3208,13 @@ packages: resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} engines: {node: '>=8'} - asn1@0.2.4: - resolution: {integrity: sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==} - - assert-plus@1.0.0: - resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} - engines: {node: '>=0.8'} - assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} - astral-regex@2.0.0: - resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} - engines: {node: '>=8'} + ast-types@0.13.4: + resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} + engines: {node: '>=4'} async-es@3.2.5: resolution: {integrity: sha512-oXGVkIf1wSg34CtmK7js8brsxUZWwMGjNa63YJFY+fDHb6RQQd7N0d7N2yP53VaqvXh5DTPuOl0hH+vDFKPHuQ==} @@ -3081,15 +3245,12 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} - aws-sign2@0.7.0: - resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} - - aws4@1.9.1: - resolution: {integrity: sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==} - axios@1.7.2: resolution: {integrity: sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==} + b4a@1.6.6: + resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} + babel-eslint@10.1.0: resolution: {integrity: sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==} engines: {node: '>=6'} @@ -3159,11 +3320,27 @@ packages: balanced-match@1.0.0: resolution: {integrity: sha512-9Y0g0Q8rmSt+H33DfKv7FOc3v+iRI+o1lbzt8jGcIosYW37IIW/2XVYq5NPdmaD5NQ59Nk26Kl/vZbwW9Fr8vg==} + bare-events@2.4.2: + resolution: {integrity: sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==} + + bare-fs@2.3.3: + resolution: {integrity: sha512-7RYKL+vZVCyAsMLi5SPu7QGauGGT8avnP/HO571ndEuV4MYdGXvLhtW67FuLPeEI8EiIY7zbbRR9x7x7HU0kgw==} + + bare-os@2.4.2: + resolution: {integrity: sha512-HZoJwzC+rZ9lqEemTMiO0luOePoGYNBgsLLgegKR/cljiJvcDNhDZQkzC+NC5Oh0aHbdBNSOHpghwMuB5tqhjg==} + + bare-path@2.1.3: + resolution: {integrity: sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==} + + bare-stream@2.2.1: + resolution: {integrity: sha512-YTB47kHwBW9zSG8LD77MIBAAQXjU2WjAkMHeeb7hUplVs6+IoM5I7uEVQNPMB7lj9r8I76UMdoMkGnCodHOLqg==} + base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - bcrypt-pbkdf@1.0.2: - resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + basic-ftp@5.0.5: + resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} + engines: {node: '>=10.0.0'} before-after-hook@2.2.2: resolution: {integrity: sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ==} @@ -3179,12 +3356,6 @@ packages: bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - blob-util@2.0.2: - resolution: {integrity: sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==} - - bluebird@3.7.2: - resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} - boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -3194,8 +3365,8 @@ packages: brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} brilliant-errors@0.7.3: @@ -3216,12 +3387,19 @@ packages: buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + buffer-crc32@1.0.0: + resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} + engines: {node: '>=8.0.0'} + buffer-from@1.1.1: resolution: {integrity: sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==} buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} @@ -3245,13 +3423,17 @@ packages: resolution: {integrity: sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==} engines: {node: ^16.14.0 || >=18.0.0} + cacheable-lookup@7.0.0: + resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} + engines: {node: '>=14.16'} + + cacheable-request@10.2.14: + resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} + engines: {node: '>=14.16'} + cacheable-request@2.1.4: resolution: {integrity: sha512-vag0O2LKZ/najSoUwDbVlnlCFvhBE/7mGTY2B5FgCBDcRD+oVV1HYTOwM6JZfMg/hIcM6IwnTZ1uQQL5/X3xIQ==} - cachedir@2.3.0: - resolution: {integrity: sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==} - engines: {node: '>=6'} - call-bind@1.0.7: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} engines: {node: '>= 0.4'} @@ -3310,9 +3492,6 @@ packages: caniuse-lite@1.0.30001646: resolution: {integrity: sha512-dRg00gudiBDDTmUhClSdv3hqRfpbOnU28IpI1T6PBTLWa+kOj0681C8uML3PifYfREuBrVjDGhL3adYpBT6spw==} - caseless@0.12.0: - resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} - chai@5.1.1: resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==} engines: {node: '>=12'} @@ -3329,6 +3508,10 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} + chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + char-regex@1.0.2: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} @@ -3343,10 +3526,6 @@ packages: resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} engines: {node: '>= 16'} - check-more-types@2.24.0: - resolution: {integrity: sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==} - engines: {node: '>= 0.8.0'} - chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -3355,6 +3534,11 @@ packages: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} + chromium-bidi@0.5.8: + resolution: {integrity: sha512-blqh+1cEQbHBKmok3rVJkBlBxt9beKBgOsxbFgs7UJcoVbbeZ+K7+6liAsjgpc8l1Xd55cQUy14fXZdGSb4zIw==} + peerDependencies: + devtools-protocol: '*' + ci-info@2.0.0: resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} @@ -3389,14 +3573,6 @@ packages: resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} engines: {node: '>=6'} - cli-table3@0.6.1: - resolution: {integrity: sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA==} - engines: {node: 10.* || >= 12.*} - - cli-truncate@2.1.0: - resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} - engines: {node: '>=8'} - cli-width@2.2.0: resolution: {integrity: sha512-EJLbKSuvHTrVRynOXCYFTbQKZOFXWNe3/6DN1yrEH3TuuZT1x4dMQnCHnfCrBUUiGjO63enEIfaB17VaRl2d4A==} @@ -3404,6 +3580,10 @@ packages: resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} engines: {node: '>= 10'} + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + cliui@7.0.4: resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} @@ -3456,13 +3636,6 @@ packages: colord@2.9.3: resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} - colorette@1.4.0: - resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} - - colors@1.4.0: - resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} - engines: {node: '>=0.1.90'} - columnify@1.6.0: resolution: {integrity: sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==} engines: {node: '>=8.0.0'} @@ -3490,6 +3663,10 @@ packages: resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} engines: {node: '>= 10'} + commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + common-ancestor-path@1.0.1: resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} @@ -3503,6 +3680,10 @@ packages: compare-func@2.0.0: resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + compress-commons@6.0.2: + resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==} + engines: {node: '>= 14'} + computeds@0.0.1: resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==} @@ -3689,6 +3870,10 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + core-js-compat@3.37.1: resolution: {integrity: sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==} @@ -3716,6 +3901,15 @@ packages: typescript: optional: true + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + crc32-stream@6.0.0: + resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==} + engines: {node: '>= 14'} + create-jest-runner@0.11.2: resolution: {integrity: sha512-6lwspphs4M1PLKV9baBNxHQtWVBPZuDU8kAP4MyrVWa6aEpEcpi2HZeeA6WncwaqgsGNXpP0N2STS7XNM/nHKQ==} hasBin: true @@ -3728,6 +3922,9 @@ packages: jest-runner: optional: true + cross-fetch@4.0.0: + resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} + cross-spawn@6.0.5: resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} engines: {node: '>=4.8'} @@ -3749,6 +3946,9 @@ packages: css-select@5.1.0: resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + css-shorthand-properties@1.1.1: + resolution: {integrity: sha512-Md+Juc7M3uOdbAFwOYlTrccIZ7oCFuzrhKYQjdeUEW/sE1hv17Jp/Bws+ReOPpGVBTYCBoYo+G17V5Qo8QQ75A==} + css-tree@2.2.1: resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} @@ -3757,6 +3957,9 @@ packages: resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + css-value@0.0.1: + resolution: {integrity: sha512-FUV3xaJ63buRLgHrLQVlVgQnQdR4yqdLGaDu7g8CQcWjInDfM9plBTPI9FRfpahju1UBSaMckeb2/46ApS/V1Q==} + css-what@6.1.0: resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} engines: {node: '>= 6'} @@ -3805,22 +4008,6 @@ packages: cy-mobile-commands@0.3.0: resolution: {integrity: sha512-Bj5P2ylw88hPqolLu68xWB6euVH5uNt8zyh+Ju8sBukGv39mWZxpjp6LtnUX/LK/YMthwvILYHhvr9SG1TP+4w==} - cypress-file-upload@5.0.8: - resolution: {integrity: sha512-+8VzNabRk3zG6x8f8BWArF/xA/W0VK4IZNx3MV0jFWrJS/qKn8eHfa5nU73P9fOQAgwHFJx7zjg4lwOnljMO8g==} - engines: {node: '>=8.2.1'} - peerDependencies: - cypress: '>3.0.0' - - cypress-real-events@1.12.0: - resolution: {integrity: sha512-oiy+4kGKkzc2PT36k3GGQqkGxNiVypheWjMtfyi89iIk6bYmTzeqxapaLHS3pnhZOX1IEbTDUVxh8T4Nhs1tyQ==} - peerDependencies: - cypress: ^4.x || ^5.x || ^6.x || ^7.x || ^8.x || ^9.x || ^10.x || ^11.x || ^12.x || ^13.x - - cypress@13.7.2: - resolution: {integrity: sha512-FF5hFI5wlRIHY8urLZjJjj/YvfCBrRpglbZCLr/cYcL9MdDe0+5usa8kTIrDHthlEc9lwihbkb5dmwqBDNS2yw==} - engines: {node: ^16.0.0 || ^18.0.0 || >=20.0.0} - hasBin: true - dargs@4.1.0: resolution: {integrity: sha512-jyweV/k0rbv2WK4r9KLayuBrSh2Py0tNmV7LBoSMH4hMQyrG8OPyIOWB2VEx4DJKXWmK4lopYMVvORlDt2S8Aw==} engines: {node: '>=0.10.0'} @@ -3829,9 +4016,13 @@ packages: resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} engines: {node: '>=8'} - dashdash@1.14.1: - resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} - engines: {node: '>=0.10'} + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + + data-uri-to-buffer@6.0.2: + resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} + engines: {node: '>= 14'} data-urls@5.0.0: resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} @@ -3859,9 +4050,6 @@ packages: dateformat@3.0.3: resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} - dayjs@1.10.4: - resolution: {integrity: sha512-RI/Hh4kqRc1UKLOAf/T5zdMMX5DQIlDxwUe3wSyMMnEbGunnpENCdbUgM+dW7kXidZqCttBrmw7BhN4TMddkCw==} - de-indent@1.0.2: resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} @@ -3881,8 +4069,17 @@ packages: supports-color: optional: true - debug@4.3.6: - resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -3898,6 +4095,10 @@ packages: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} + decamelize@6.0.0: + resolution: {integrity: sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + decimal.js@10.4.3: resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} @@ -3909,6 +4110,10 @@ packages: resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==} engines: {node: '>=4'} + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dedent@0.7.0: resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} @@ -3935,6 +4140,10 @@ packages: deep-is@0.1.3: resolution: {integrity: sha512-GtxAN4HvBachZzm4OnWqc45ESpUCMwkYcsjnsPs23FwJbsO+k4t0k9bQCgOmzIlpHO28+WPK/KRbRk0DDHuuDw==} + deepmerge-ts@5.1.0: + resolution: {integrity: sha512-eS8dRJOckyo9maw9Tu5O5RUi/4inFLrnoLkBe3cPfDMx3WZioXtmOew4TXQaxq7Rhl4xjDtR7c6x8nNTxOvbFw==} + engines: {node: '>=16.0.0'} + deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} @@ -3950,6 +4159,10 @@ packages: defaults@1.0.3: resolution: {integrity: sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==} + defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} @@ -3966,6 +4179,10 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} + degenerator@5.0.1: + resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} + engines: {node: '>= 14'} + delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -3973,6 +4190,10 @@ packages: deprecation@2.3.1: resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + detect-indent@5.0.0: resolution: {integrity: sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==} engines: {node: '>=4'} @@ -3981,6 +4202,12 @@ packages: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} + devtools-protocol@0.0.1232444: + resolution: {integrity: sha512-pM27vqEfxSxRkTMnF+XCmxSEb6duO5R+t8A9DEEJgy4Wz2RVanje2mmj99B6A3zv2r/qGfYlOvYznUhuokizmg==} + + devtools-protocol@0.0.1342118: + resolution: {integrity: sha512-75fMas7PkYNDTmDyb6PRJCH7ILmHLp+BhrZGeMsa4bCh40DTxgCz2NRy5UDzII4C5KuD0oBMZ9vXKhEl6UD/3w==} + diff-sequences@28.1.1: resolution: {integrity: sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -4001,6 +4228,9 @@ packages: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} + dom-accessibility-api@0.5.16: + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + dom-serializer@2.0.0: resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} @@ -4011,8 +4241,8 @@ packages: resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} engines: {node: '>= 4'} - domutils@3.0.1: - resolution: {integrity: sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==} + domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} dot-prop@3.0.0: resolution: {integrity: sha512-k4ELWeEU3uCcwub7+dWydqQBRjAjkV9L33HjVRG5Xo2QybI6ja/v+4W73SRi8ubCqJz0l9XsTP1NbewfyqaSlw==} @@ -4043,8 +4273,13 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - ecc-jsbn@0.1.2: - resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} + edge-paths@3.0.5: + resolution: {integrity: sha512-sB7vSrDnFa4ezWQk9nZ/n0FdpdUuC6R1EOrlU3DL+bovcNFK28rqu2emmAUjujYEJTWIgQGqgVVWUZXMnc8iWg==} + engines: {node: '>=14.0.0'} + + edgedriver@5.6.1: + resolution: {integrity: sha512-3Ve9cd5ziLByUdigw6zovVeWJjVs8QHVmqOB0sJ0WNeVPcwf4p18GnxMmVvlFmYRloUwf5suNuorea4QzwBIOA==} + hasBin: true editorconfig@1.0.4: resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==} @@ -4235,11 +4470,6 @@ packages: eslint-import-resolver-webpack: optional: true - eslint-plugin-cypress@2.15.1: - resolution: {integrity: sha512-eLHLWP5Q+I4j2AWepYq0PgFEei9/s5LvjuSqWrxurkg1YZ8ltxdvMNmdSf0drnsNo57CTgYY/NIHHLRSWejR7w==} - peerDependencies: - eslint: '>= 3.2.1' - eslint-plugin-es-x@7.5.0: resolution: {integrity: sha512-ODswlDSO0HJDzXU0XvgZ3lF3lS3XAZEossh15Q2UHjwrJggWeBoKqqEsLTZLXl+dh5eOAozG0zRcYtuE35oTuQ==} engines: {node: ^14.18.0 || >=16.0.0} @@ -4296,6 +4526,19 @@ packages: peerDependencies: eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + eslint-plugin-vitest@0.4.1: + resolution: {integrity: sha512-+PnZ2u/BS+f5FiuHXz4zKsHPcMKHie+K+1Uvu/x91ovkCMEOJqEI8E9Tw1Wzx2QRz4MHOBHYf1ypO8N1K0aNAA==} + engines: {node: ^18.0.0 || >= 20.0.0} + peerDependencies: + '@typescript-eslint/eslint-plugin': '*' + eslint: '>=8.0.0' + vitest: '*' + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + vitest: + optional: true + eslint-plugin-vue@9.24.1: resolution: {integrity: sha512-wk3SuwmS1pZdcuJlokGYEi/buDOwD6KltvhIZyOnpJ/378dcQ4zchu9PAMbbLAaydCz1iYc5AozszcOOgZIIOg==} engines: {node: ^14.17.0 || >=16.0.0} @@ -4363,20 +4606,21 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - eventemitter2@6.4.7: - resolution: {integrity: sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==} + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + execa@1.0.0: resolution: {integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==} engines: {node: '>=6'} - execa@4.1.0: - resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==} - engines: {node: '>=10'} - execa@5.0.0: resolution: {integrity: sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==} engines: {node: '>=10'} @@ -4389,10 +4633,6 @@ packages: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} - executable@4.1.1: - resolution: {integrity: sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==} - engines: {node: '>=4'} - exit@0.1.2: resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} engines: {node: '>= 0.8.0'} @@ -4408,9 +4648,6 @@ packages: resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} engines: {node: '>=0.10.0'} - extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - external-editor@3.0.3: resolution: {integrity: sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==} engines: {node: '>=4'} @@ -4424,17 +4661,15 @@ packages: engines: {node: '>= 10.17.0'} hasBin: true - extsprintf@1.3.0: - resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} - engines: {'0': node >=0.6.0} - - extsprintf@1.4.0: - resolution: {integrity: sha512-6NW8DZ8pWBc5NbGYUiqqccj9dXnuSzilZYqprdKJBZsQodGH9IyUoFOGxIWVDcBzHMb8ET24aqx9p66tZEWZkA==} - engines: {'0': node >=0.6.0} + fast-deep-equal@2.0.1: + resolution: {integrity: sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==} fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} @@ -4445,6 +4680,13 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fast-uri@3.0.1: + resolution: {integrity: sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==} + + fast-xml-parser@4.5.0: + resolution: {integrity: sha512-/PlTQCI96+fZMAOLMZK4CWG1ItCbfZ/0jx7UIJFChPNrx7tcEgerUgWbeieCM9MfHInUDyK8DWYZ+YrywDJuTg==} + hasBin: true + fastq@1.8.0: resolution: {integrity: sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==} @@ -4454,6 +4696,10 @@ packages: fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + fflate@0.8.2: resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} @@ -4472,8 +4718,8 @@ packages: filelist@1.0.4: resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} - fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} finalhandler@1.1.2: @@ -4512,8 +4758,8 @@ packages: resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} hasBin: true - flatted@3.2.2: - resolution: {integrity: sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==} + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} follow-redirects@1.15.6: resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} @@ -4531,17 +4777,18 @@ packages: resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} engines: {node: '>=14'} - forever-agent@0.6.1: - resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} - - form-data@2.3.3: - resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} - engines: {node: '>= 0.12'} + form-data-encoder@2.1.4: + resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} + engines: {node: '>= 14.17'} form-data@4.0.0: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} engines: {node: '>= 6'} + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + fp-ts@2.16.9: resolution: {integrity: sha512-+I2+FnVB+tVaxcYyQkHUq7ZdKScaBlX53A41mxQtpIccsfyv8PzdzP7fzp2AY832T4aoK6UZ5WRX/ebGd8uZuQ==} @@ -4594,6 +4841,11 @@ packages: functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + geckodriver@4.4.4: + resolution: {integrity: sha512-0zaw19tcmWeluqx7+Y559JGBtidu1D0Lb8ElYKiNEQu8r3sCfrLUf5V10xypl8u29ZLbgRV7WflxCJVTCkCMFA==} + engines: {node: ^16.13 || >=18 || >=20} + hasBin: true + gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -4633,6 +4885,10 @@ packages: resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} engines: {node: '>=8'} + get-port@7.1.0: + resolution: {integrity: sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==} + engines: {node: '>=16'} + get-stdin@4.0.1: resolution: {integrity: sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==} engines: {node: '>=0.10.0'} @@ -4676,11 +4932,9 @@ packages: get-tsconfig@4.7.2: resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} - getos@3.2.1: - resolution: {integrity: sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==} - - getpass@0.1.7: - resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} + get-uri@6.0.3: + resolution: {integrity: sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==} + engines: {node: '>= 14'} gh-got@7.1.0: resolution: {integrity: sha512-KeWkkhresa7sbpzQLYzITMgez5rMigUsijhmSAHcLDORIMUbdlkdoZyaN1wQvIjmUZnyb/wkAPaXb4MQKX0mdQ==} @@ -4754,10 +5008,6 @@ packages: resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} engines: {node: '>=16 || 14 >=14.17'} - global-dirs@3.0.0: - resolution: {integrity: sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==} - engines: {node: '>=10'} - globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} @@ -4777,6 +5027,10 @@ packages: gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + got@12.6.1: + resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} + engines: {node: '>=14.16'} + got@8.3.2: resolution: {integrity: sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==} engines: {node: '>=4'} @@ -4784,6 +5038,9 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + grapheme-splitter@1.0.4: + resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} @@ -4845,6 +5102,9 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true + headers-polyfill@4.0.3: + resolution: {integrity: sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==} + hogan.js@3.0.2: resolution: {integrity: sha512-RqGs4wavGYJWE07t35JQccByczmNUXQT0E12ZYV1VKYu5UiAU9lsos/yBAcf840+zrUQQxgVduCR5/B8nNtibg==} hasBin: true @@ -4887,18 +5147,14 @@ packages: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} - http-signature@1.3.6: - resolution: {integrity: sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==} - engines: {node: '>=0.10'} + http2-wrapper@2.2.1: + resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} + engines: {node: '>=10.19.0'} https-proxy-agent@7.0.5: resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==} engines: {node: '>= 14'} - human-signals@1.1.1: - resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} - engines: {node: '>=8.12.0'} - human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} @@ -4938,11 +5194,14 @@ packages: resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} engines: {node: '>= 4'} - image-size@1.0.0: - resolution: {integrity: sha512-JLJ6OwBfO1KcA+TvJT+v8gbE6iWbj24LyDNFgFEN0lzegn6cC6a/p3NIDaepMsJjQjlUWqIC7wJv8lBFxPNjcw==} - engines: {node: '>=12.0.0'} + image-size@1.1.1: + resolution: {integrity: sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==} + engines: {node: '>=16.x'} hasBin: true + immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + immutable@4.0.0: resolution: {integrity: sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==} @@ -4959,6 +5218,9 @@ packages: engines: {node: '>=8'} hasBin: true + import-meta-resolve@4.1.0: + resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} + imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} @@ -4988,10 +5250,6 @@ packages: ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - ini@2.0.0: - resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} - engines: {node: '>=10'} - ini@4.1.3: resolution: {integrity: sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -5145,10 +5403,6 @@ packages: engines: {node: '>=14.16'} hasBin: true - is-installed-globally@0.4.0: - resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} - engines: {node: '>=10'} - is-interactive@1.0.0: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} @@ -5166,6 +5420,9 @@ packages: resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} engines: {node: '>= 0.4'} + is-node-process@1.2.0: + resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} + is-number-object@1.0.6: resolution: {integrity: sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==} engines: {node: '>= 0.4'} @@ -5197,6 +5454,10 @@ packages: resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} engines: {node: '>=0.10.0'} + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + is-plain-object@2.0.4: resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} engines: {node: '>=0.10.0'} @@ -5242,6 +5503,10 @@ packages: resolution: {integrity: sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==} engines: {node: '>=8'} + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + is-stream@3.0.0: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -5262,9 +5527,6 @@ packages: resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} engines: {node: '>= 0.4'} - is-typedarray@1.0.0: - resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} - is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} @@ -5309,9 +5571,6 @@ packages: isomorphic-fetch@3.0.0: resolution: {integrity: sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==} - isstream@0.1.2: - resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} - istanbul-lib-coverage@3.2.2: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} @@ -5381,7 +5640,7 @@ packages: resolution: {integrity: sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} peerDependencies: - '@types/node': '*' + '@types/node': 22.5.4 ts-node: '>=9.0.0' peerDependenciesMeta: '@types/node': @@ -5530,9 +5789,6 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true - jsbn@0.1.1: - resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} - jsbn@1.1.0: resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} @@ -5557,6 +5813,9 @@ packages: json-buffer@3.0.0: resolution: {integrity: sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==} + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + json-parse-better-errors@1.0.2: resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} @@ -5621,14 +5880,13 @@ packages: resolution: {integrity: sha512-PNYZIdMjVIvVgDSYKTT63Y+KZ6IZvGRNNWcxwD+GNnUz1MKPfv30J8ueCjdwcN0nDx2SlshgyB7Oy0epAzVRRg==} engines: {node: '>=0.10.0'} - jsprim@2.0.2: - resolution: {integrity: sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==} - engines: {'0': node >=0.6.0} - jsx-ast-utils@3.2.0: resolution: {integrity: sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q==} engines: {node: '>=4.0'} + jszip@3.10.1: + resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} + just-diff-apply@5.5.0: resolution: {integrity: sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==} @@ -5638,6 +5896,9 @@ packages: keyv@3.0.0: resolution: {integrity: sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==} + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} @@ -5646,9 +5907,13 @@ packages: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} - lazy-ass@1.6.0: - resolution: {integrity: sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==} - engines: {node: '> 0.8'} + ky@0.33.3: + resolution: {integrity: sha512-CasD9OCEQSFIam2U8efFK81Yeg8vNMTBUqtMOHlrcWQHqUX3HeCl9Dr31u4toV7emlH8Mymk5+9p0lL6mKb/Xw==} + engines: {node: '>=14.16'} + + lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} lerna@8.1.7: resolution: {integrity: sha512-v2kkBn8Vqtroo30Pr5/JQ9MygRhnCsoI1jSOf3DxWmcTbkpC5U7c6rGr+7NPK6QrxKbC0/Cj4kuIBMb/7f79sQ==} @@ -5671,6 +5936,9 @@ packages: resolution: {integrity: sha512-26zzwoBNAvX9AWOPiqqF6FG4HrSCPsHFkQm7nT+xU1ggAujL/eae81RnCv4CJ2In9q9fh10B88sYSzKCUh/Ghg==} engines: {node: ^16.14.0 || >=18.0.0} + lie@3.3.0: + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + lilconfig@3.1.1: resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} engines: {node: '>=14'} @@ -5688,12 +5956,6 @@ packages: linkify-it@5.0.0: resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} - listr2@3.10.0: - resolution: {integrity: sha512-eP40ZHihu70sSmqFNbNy2NL1YwImmlMmPh9WO5sLmPDleurMHt3n+SwEWNu2kzKScexZnkyFtc1VI0z/TGlmpw==} - engines: {node: '>=10.0.0'} - peerDependencies: - enquirer: '>= 2.3.0 < 3' - load-json-file@1.1.0: resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==} engines: {node: '>=0.10.0'} @@ -5710,6 +5972,9 @@ packages: resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} engines: {node: '>=14'} + locate-app@2.4.39: + resolution: {integrity: sha512-hl7NwJrpGKLlmVgNrMRxFLRJTjve6IIav08bnv4MQSjahFRUPPVp+R02PSYpll6wY/YZqMrha68uScTmRJeMeA==} + locate-path@2.0.0: resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} engines: {node: '>=4'} @@ -5732,6 +5997,9 @@ packages: lodash._reinterpolate@3.0.0: resolution: {integrity: sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==} + lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} @@ -5744,9 +6012,6 @@ packages: lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - lodash.once@4.1.1: - resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} - lodash.sortby@4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} @@ -5759,6 +6024,9 @@ packages: lodash.uniq@4.5.0: resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + lodash.zip@4.2.0: + resolution: {integrity: sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==} + lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} @@ -5766,9 +6034,12 @@ packages: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} - log-update@4.0.0: - resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} - engines: {node: '>=10'} + loglevel-plugin-prefix@0.8.4: + resolution: {integrity: sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==} + + loglevel@1.9.2: + resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} + engines: {node: '>= 0.6.0'} loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} @@ -5789,6 +6060,10 @@ packages: resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} engines: {node: '>=0.10.0'} + lowercase-keys@3.0.0: + resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -5803,6 +6078,14 @@ packages: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} + lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + + lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + magic-string@0.25.7: resolution: {integrity: sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==} @@ -5930,8 +6213,8 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} mime-db@1.52.0: @@ -5958,6 +6241,14 @@ packages: resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} engines: {node: '>=4'} + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + mimic-response@4.0.0: + resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} @@ -6046,6 +6337,12 @@ packages: mitt@2.1.0: resolution: {integrity: sha512-ILj2TpLiysu2wkBbWjAmww7TkZb65aiQO+DkVdUTBpBXq+MHYiETENkKFMtsJZX1Lf4pe4QOrTSjIfUwN5lRdg==} + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + + mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + mkdirp@0.3.0: resolution: {integrity: sha512-OHsdUcVAQ6pOtg5JYWpCBo9W/GySVuwvP9hueRMW7UqshC0tbfzLv8wjySTPm3tfUZ/21CE9E1pJagOA91Pxew==} deprecated: Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.) @@ -6080,7 +6377,23 @@ packages: ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - muggle-string@0.4.1: + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + msw@2.4.2: + resolution: {integrity: sha512-GImSQGhn19czhVpxPdiUDK8CMZ6jbBcvOhzfJd8KFErjEER2wDKWs1UYaetJs2GSNlAqt6heZYm7g3eLatTcog==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + graphql: '>= 16.8.x' + typescript: '>= 4.8.x' + peerDependenciesMeta: + graphql: + optional: true + typescript: + optional: true + + muggle-string@0.4.1: resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} multimatch@5.0.0: @@ -6115,6 +6428,10 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + netmask@2.0.2: + resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} + engines: {node: '>= 0.4.0'} + nice-napi@1.0.2: resolution: {integrity: sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==} os: ['!win32'] @@ -6125,6 +6442,10 @@ packages: node-addon-api@3.2.1: resolution: {integrity: sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==} + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + node-fetch@2.6.7: resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} engines: {node: 4.x || >=6.0.0} @@ -6134,6 +6455,19 @@ packages: encoding: optional: true + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + node-gyp-build@4.5.0: resolution: {integrity: sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==} hasBin: true @@ -6184,6 +6518,10 @@ packages: resolution: {integrity: sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==} engines: {node: '>=4'} + normalize-url@8.0.1: + resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==} + engines: {node: '>=14.16'} + npm-bundled@3.0.1: resolution: {integrity: sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -6331,13 +6669,17 @@ packages: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} - ospath@1.2.2: - resolution: {integrity: sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==} + outvariant@1.4.3: + resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==} p-cancelable@0.4.1: resolution: {integrity: sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==} engines: {node: '>=4'} + p-cancelable@3.0.0: + resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} + engines: {node: '>=12.20'} + p-finally@1.0.0: resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} engines: {node: '>=4'} @@ -6414,6 +6756,14 @@ packages: resolution: {integrity: sha512-RRTnDb2TBG/epPRI2yYXsimO0v3BXC8Yd3ogr1545IaqKK17VGhbWVeGGN+XfCm/08OK8635nH31c8bATkHuSw==} engines: {node: '>=8'} + pac-proxy-agent@7.0.2: + resolution: {integrity: sha512-BFi3vZnO9X5Qt6NRz7ZOaPja3ic0PhlsmCRYLOpN11+mWBCR6XJDqW5RF3j8jm4WGGQZtBA+bTfxYzeKW73eHg==} + engines: {node: '>= 14'} + + pac-resolver@7.0.1: + resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} + engines: {node: '>= 14'} + package-json-from-dist@1.0.0: resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} @@ -6422,6 +6772,12 @@ packages: engines: {node: ^16.14.0 || >=18.0.0} hasBin: true + pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + + pako@2.1.0: + resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} + parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -6504,8 +6860,8 @@ packages: resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} engines: {node: 20 || >=22} - path-to-regexp@6.2.0: - resolution: {integrity: sha512-f66KywYG6+43afgE/8j/GoiNyygk/bnoCbps++3ErRKsIYkGGupyv07R2Ok5m9i67Iqc+T2g1eAUGUPzWhYTyg==} + path-to-regexp@6.2.2: + resolution: {integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==} path-type@1.1.0: resolution: {integrity: sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==} @@ -6532,11 +6888,8 @@ packages: perfect-debounce@1.0.0: resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} - performance-now@2.1.0: - resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} - - picocolors@1.0.1: - resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + picocolors@1.1.0: + resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} @@ -6772,8 +7125,8 @@ packages: postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.4.40: - resolution: {integrity: sha512-YF2kKIUzAofPMpfH6hOi2cGnv/HrUlfucspc7pDyvv7kGdqXrfj8SCl/t8owkEgKEuu8ZcRjSOxFxVLqwChZ2Q==} + postcss@8.4.45: + resolution: {integrity: sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==} engines: {node: ^10 || ^12 || >=14} preact@10.11.3: @@ -6800,6 +7153,10 @@ packages: resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} engines: {node: ^14.13.1 || >=16.0.0} + pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + pretty-format@28.1.3: resolution: {integrity: sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -6830,6 +7187,10 @@ packages: resolution: {integrity: sha512-69agxLtnI8xBs9gUGqEnK26UfiexpHy+KUpBQWabiytQjnn5wFY8rklAi7GRfABIuPNnQ/ik48+LGLkYYJcy4A==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + promise-all-reject-late@1.0.1: resolution: {integrity: sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==} @@ -6865,8 +7226,9 @@ packages: protocols@2.0.1: resolution: {integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==} - proxy-from-env@1.0.0: - resolution: {integrity: sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==} + proxy-agent@6.3.1: + resolution: {integrity: sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==} + engines: {node: '>= 14'} proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} @@ -6891,6 +7253,10 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + puppeteer-core@21.11.0: + resolution: {integrity: sha512-ArbnyA3U5SGHokEvkfWjW+O8hOxV1RSJxOgriX/3A4xZRqixt9ZFHD0yPgZQF05Qj0oAqi8H/7stDorjoHY90Q==} + engines: {node: '>=16.13.2'} + q@1.5.1: resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} engines: {node: '>=0.6.0', teleport: '>=0.2.0'} @@ -6899,18 +7265,20 @@ packages: (For a CapTP with native promises, see @endo/eventual-send and @endo/captp) - qs@6.10.4: - resolution: {integrity: sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==} - engines: {node: '>=0.6'} - qs@6.9.7: resolution: {integrity: sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==} engines: {node: '>=0.6'} + query-selector-shadow-dom@1.0.1: + resolution: {integrity: sha512-lT5yCqEBgfoMYpf3F2xQRK7zEr1rhIIZuceDK6+xRkJQ4NMbHTwXqk4NkwDwQMNqXgG9r9fyHnzwNVs6zV5KRw==} + query-string@5.1.1: resolution: {integrity: sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==} engines: {node: '>=0.10.0'} + queue-tick@1.0.1: + resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} + queue@6.0.2: resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} @@ -6922,12 +7290,19 @@ packages: resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} engines: {node: '>=8'} + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + react-is@18.2.0: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} @@ -6974,6 +7349,13 @@ packages: resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==} engines: {node: '>= 6'} + readable-stream@4.5.2: + resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + readdir-glob@1.1.3: + resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} + readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -7036,9 +7418,6 @@ packages: request-light@0.7.0: resolution: {integrity: sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==} - request-progress@3.0.0: - resolution: {integrity: sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==} - require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -7054,6 +7433,9 @@ packages: reselect@4.1.7: resolution: {integrity: sha512-Zu1xbUt3/OPwsXL46hvOOoQrap2azE7ZQbokq61BQfiXvhewsKDwhMeZjTX9sX0nvw1t/U5Audyn1I9P/m9z0A==} + resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + resolve-cwd@3.0.0: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} engines: {node: '>=8'} @@ -7088,6 +7470,13 @@ packages: responselike@1.0.2: resolution: {integrity: sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==} + responselike@3.0.0: + resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} + engines: {node: '>=14.16'} + + resq@1.11.0: + resolution: {integrity: sha512-G10EBz+zAAy3zUd/CDoBbXRL6ia9kOo3xRHrMDsHljI0GDkhYlyjwoCx5+3eCC4swi1uCoZQhskuJkj7Gp57Bw==} + restore-cursor@2.0.0: resolution: {integrity: sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==} engines: {node: '>=4'} @@ -7104,6 +7493,9 @@ packages: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + rgb2hex@0.2.5: + resolution: {integrity: sha512-22MOP1Rh7sAo1BZpDG6R5RFYzR2lYEgwq7HEmyW2qcsOqR2lQKmn+O//xV3YG/0rrhMC6KVX2hU+ZXuaw9a5bw==} + rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} deprecated: Rimraf versions prior to v4 are no longer supported @@ -7137,7 +7529,7 @@ packages: resolution: {integrity: sha512-paFu+nT1xvuO1tPFYXGe+XnQvg4Hjqv/eIhG8i5EspfYYPBKL57X7iVbfv55aNVASg3dzWvES9dmWsL2KhfByw==} engines: {node: '>=10.0.0'} peerDependencies: - '@types/node': '>=10.0.0' + '@types/node': 22.5.4 rollup: '>=0.31.2' peerDependenciesMeta: '@types/node': @@ -7159,8 +7551,8 @@ packages: engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true - rollup@4.14.1: - resolution: {integrity: sha512-4LnHSdd3QK2pa1J6dFbfm1HN0D7vSK/ZuZTsdyUAlA6Rr1yTouUTL13HaDOGJVgby461AhrNGBS7sCGXXtT+SA==} + rollup@4.21.2: + resolution: {integrity: sha512-e3TapAgYf9xjdLvKQCkQTnbTKd4a6jwlpQSJJFokHGaX2IVjoEqkIIhiQfqsi0cdwlOD+tQGuOd5AJkc5RngBw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -7197,6 +7589,9 @@ packages: rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + safaridriver@0.1.2: + resolution: {integrity: sha512-4R309+gWflJktzPXBQCobbWEHlzC4aK3a+Ov3tz2Ib2aBxiwd11phkdIBH1l0EO22x24CJMUQkpKFumRriCSRg==} + safe-array-concat@1.1.2: resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} engines: {node: '>=0.4'} @@ -7372,6 +7767,10 @@ packages: engines: {node: '>=10'} hasBin: true + serialize-error@11.0.3: + resolution: {integrity: sha512-2G2y++21dhj2R7iHAdd0FIzjGwuKZld+7Pl/bTU6YIkrC2ZMbVUjm+luj6A6V34Rv9XfKJDKpTWu9W4Gse1D9g==} + engines: {node: '>=14.16'} + serialize-javascript@4.0.0: resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==} @@ -7386,6 +7785,9 @@ packages: resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} engines: {node: '>= 0.4'} + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + shallow-clone@3.0.1: resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} engines: {node: '>=8'} @@ -7451,14 +7853,6 @@ packages: resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} engines: {node: '>=12'} - slice-ansi@3.0.0: - resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} - engines: {node: '>=8'} - - slice-ansi@4.0.0: - resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} - engines: {node: '>=10'} - smart-buffer@4.2.0: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} @@ -7475,8 +7869,8 @@ packages: resolution: {integrity: sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==} engines: {node: '>=4'} - source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} source-map-resolve@0.6.0: @@ -7501,6 +7895,9 @@ packages: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} deprecated: Please use @jridgewell/sourcemap-codec instead + spacetrim@0.11.39: + resolution: {integrity: sha512-S/baW29azJ7py5ausQRE2S6uEDQnlxgMHOEEq4V770ooBDD1/9kZnxRcco/tjZYuDuqYXblCk/r3N13ZmvHZ2g==} + spawn-command@0.0.2: resolution: {integrity: sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==} @@ -7522,6 +7919,10 @@ packages: split2@3.2.2: resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + split@1.0.1: resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} @@ -7531,11 +7932,6 @@ packages: sprintf-js@1.1.3: resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} - sshpk@1.17.0: - resolution: {integrity: sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==} - engines: {node: '>=0.10.0'} - hasBin: true - ssri@10.0.6: resolution: {integrity: sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -7551,6 +7947,10 @@ packages: resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} engines: {node: '>= 0.6'} + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + std-env@3.7.0: resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} @@ -7558,6 +7958,12 @@ packages: resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} engines: {node: '>= 0.4'} + streamx@2.20.0: + resolution: {integrity: sha512-ZGd1LhDeGFucr1CUCTBOS58ZhEendd0ttpGT3usTvosS4ntIwKN9LJFp+OeCSprsCPL14BXVRZlHGRY1V9PVzQ==} + + strict-event-emitter@0.5.1: + resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} + strict-uri-encode@1.1.0: resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==} engines: {node: '>=0.10.0'} @@ -7675,6 +8081,9 @@ packages: strip-literal@1.3.0: resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} + strnum@1.0.5: + resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} + strong-log-transformer@2.1.0: resolution: {integrity: sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==} engines: {node: '>=4'} @@ -7717,10 +8126,19 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + tar-fs@3.0.4: + resolution: {integrity: sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==} + + tar-fs@3.0.6: + resolution: {integrity: sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==} + tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} engines: {node: '>=6'} + tar-stream@3.1.7: + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + tar@6.2.1: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} @@ -7758,6 +8176,9 @@ packages: resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} engines: {node: '>=18'} + text-decoder@1.1.1: + resolution: {integrity: sha512-8zll7REEv4GDD3x4/0pW+ppIxSNs7H1J10IKFZsuOMscumCdM2a+toDGLPA3T+1+fLBql4zbt5z83GEQGGV5VA==} + text-extensions@1.9.0: resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} engines: {node: '>=0.10'} @@ -7768,9 +8189,6 @@ packages: throat@6.0.2: resolution: {integrity: sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==} - throttleit@1.0.0: - resolution: {integrity: sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g==} - through2@2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} @@ -7910,12 +8328,6 @@ packages: resolution: {integrity: sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA==} engines: {node: ^16.14.0 || >=18.0.0} - tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - - tweetnacl@0.14.5: - resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} - type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -7956,6 +8368,14 @@ packages: resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} engines: {node: '>=8'} + type-fest@2.13.0: + resolution: {integrity: sha512-lPfAm42MxE4/456+QyIaaVBAwgpJb6xZ8PRu09utnhPdWwcyj9vgy6Sq0Z5yNbJ21EdxB5dRU/Qg8bsyAMtlcw==} + engines: {node: '>=12.20'} + + type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + type-fest@4.15.0: resolution: {integrity: sha512-tB9lu0pQpX5KJq54g+oHOLumOx+pMep4RaM6liXh2PKmVRFF+/vAtUP0ZaJ0kOySfVNjF6doBWPHhBhISKdlIA==} engines: {node: '>=16'} @@ -8004,8 +8424,11 @@ packages: unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + unbzip2-stream@1.4.3: + resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} + + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} unhead@1.9.4: resolution: {integrity: sha512-QVU0y3KowRu2cLjXxfemTKNohK4vdEwyahoszlEnRz0E5BTNRZQSs8AnommorGmVM7DvB2t4dwWadB51wDlPzw==} @@ -8094,10 +8517,6 @@ packages: resolution: {integrity: sha512-aXEH9c5qi3uYZHo0niUtxDlT9ylG/luMW/dZslSCkbtC31wCyFkmM0kyoBBh+Grhn7CL+/kvKLfN61/EdxPxMQ==} engines: {node: '>=14.0.0'} - untildify@4.0.0: - resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} - engines: {node: '>=8'} - upath@1.2.0: resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} engines: {node: '>=4'} @@ -8123,6 +8542,13 @@ packages: resolution: {integrity: sha512-0kQLIzG4fdk/G5NONku64rSH/x32NOA39LVQqlK8Le6lvTF6GGRJpqaQFGgU+CLwySIqBSMdwYM0sYcW9f6P4A==} engines: {node: '>= 4'} + urlpattern-polyfill@10.0.0: + resolution: {integrity: sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==} + + userhome@1.0.0: + resolution: {integrity: sha512-ayFKY3H+Pwfy4W98yPdtH1VqH4psDeyW8lYYFzfecR9d6hqLpqhecktvYR3SEEXt7vG0S1JEpciI3g94pMErig==} + engines: {node: '>= 0.8.0'} + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -8139,10 +8565,6 @@ packages: deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. hasBin: true - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - v8-to-istanbul@9.0.1: resolution: {integrity: sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==} engines: {node: '>=10.12.0'} @@ -8162,10 +8584,6 @@ packages: peerDependencies: vue: ^3.3.11 - verror@1.10.0: - resolution: {integrity: sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=} - engines: {'0': node >=0.6.0} - vite-node@2.0.5: resolution: {integrity: sha512-LdsW4pxj0Ot69FAoXZ1yTnA9bjGohr2yNBU7QKRxpz8ITSkhuDl6h3zS/tvgz4qrNjeRnvrWeXQ8ZF7Um4W00Q==} engines: {node: ^18.0.0 || >=20.0.0} @@ -8261,12 +8679,12 @@ packages: vue-router: optional: true - vite@5.4.0: - resolution: {integrity: sha512-5xokfMX0PIiwCMCMb9ZJcMyh5wbBun0zUzKib+L65vAZ8GY9ePZMXxFrHbr/Kyll2+LSCY7xtERPpxkBDKngwg==} + vite@5.4.3: + resolution: {integrity: sha512-IH+nl64eq9lJjFqU+/yrRnrHPVTlgy42/+IzbOdaFDVlyLgI/wDlf+FCobXLX1cT0X5+7LMyH1mIy2xJdLfo8Q==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 + '@types/node': 22.5.4 less: '*' lightningcss: ^1.21.0 sass: '*' @@ -8298,7 +8716,7 @@ packages: hasBin: true peerDependencies: '@edge-runtime/vm': '*' - '@types/node': ^18.0.0 || >=20.0.0 + '@types/node': 22.5.4 '@vitest/browser': 2.0.5 '@vitest/ui': 2.0.5 happy-dom: '*' @@ -8512,6 +8930,11 @@ packages: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'} + wait-port@1.1.0: + resolution: {integrity: sha512-3e04qkoN3LxTMLakdqeWth8nih8usyg+sf1Bgdf9wwUkp05iuK1eSY/QpLvscT/+F/gA89+LpUmmgBtesbqI2Q==} + engines: {node: '>=10'} + hasBin: true + walk-up-path@3.0.1: resolution: {integrity: sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==} @@ -8521,6 +8944,23 @@ packages: wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + + webdriver@8.40.3: + resolution: {integrity: sha512-mc/pxLpgAQphnIaWvix/QXzp9CJpEvIA3YeF9t5plPaTbvbEaCAYYWkTP6e3vYPYWvx57krjGaYkNUnDCBNolA==} + engines: {node: ^16.13 || >=18} + + webdriverio@8.40.5: + resolution: {integrity: sha512-fKzaAF8lbgVFWIP8i0eGk22MpjactVVTWP8qtUXDob5Kdo8ffrg1lCKP8mcyrz6fiZM1OY1m6dvkbFelf23Nxw==} + engines: {node: ^16.13 || >=18} + peerDependencies: + devtools: ^8.14.0 + peerDependenciesMeta: + devtools: + optional: true + webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -8690,6 +9130,18 @@ packages: resolution: {integrity: sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA==} engines: {node: '>=8'} + ws@8.16.0: + resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + ws@8.18.0: resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} engines: {node: '>=10.0.0'} @@ -8735,8 +9187,8 @@ packages: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} - yaml@2.4.1: - resolution: {integrity: sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==} + yaml@2.5.1: + resolution: {integrity: sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==} engines: {node: '>= 14'} hasBin: true @@ -8767,9 +9219,17 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + yoctocolors-cjs@2.1.2: + resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} + engines: {node: '>=18'} + zhead@2.2.4: resolution: {integrity: sha512-8F0OI5dpWIA5IGG5NHUg9staDwz/ZPxZtvGVf01j7vHqSyZ0raHY+78atOVxRqb73AotX22uV1pXt3gYSstGag==} + zip-stream@6.0.1: + resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} + engines: {node: '>= 14'} + snapshots: '@aashutoshrathi/word-wrap@1.2.6': {} @@ -8859,9 +9319,9 @@ snapshots: '@antfu/utils@0.7.10': {} - '@apideck/better-ajv-errors@0.3.1(ajv@8.12.0)': + '@apideck/better-ajv-errors@0.3.1(ajv@8.17.1)': dependencies: - ajv: 8.12.0 + ajv: 8.17.1 json-schema: 0.4.0 jsonpointer: 5.0.0 leven: 3.1.0 @@ -8887,7 +9347,7 @@ snapshots: '@babel/code-frame@7.24.7': dependencies: '@babel/highlight': 7.24.7 - picocolors: 1.0.1 + picocolors: 1.1.0 '@babel/compat-data@7.25.2': {} @@ -8904,7 +9364,7 @@ snapshots: '@babel/traverse': 7.25.3 '@babel/types': 7.25.6 convert-source-map: 2.0.0 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -8962,7 +9422,7 @@ snapshots: '@babel/core': 7.25.2 '@babel/helper-compilation-targets': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7 lodash.debounce: 4.0.8 resolve: 1.22.8 transitivePeerDependencies: @@ -9058,7 +9518,7 @@ snapshots: '@babel/helper-validator-identifier': 7.24.7 chalk: 2.4.2 js-tokens: 4.0.0 - picocolors: 1.0.1 + picocolors: 1.1.0 '@babel/parser@7.25.6': dependencies: @@ -9675,7 +10135,7 @@ snapshots: '@babel/parser': 7.25.6 '@babel/template': 7.25.0 '@babel/types': 7.25.6 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -9690,40 +10150,25 @@ snapshots: '@bufbuild/protobuf@1.10.0': {} - '@cosmicjs/sdk@1.0.11': + '@bundled-es-modules/cookie@2.0.0': dependencies: - axios: 1.7.2 - form-data: 4.0.0 - transitivePeerDependencies: - - debug + cookie: 0.5.0 - '@cypress/request@3.0.1': + '@bundled-es-modules/statuses@1.0.1': dependencies: - aws-sign2: 0.7.0 - aws4: 1.9.1 - caseless: 0.12.0 - combined-stream: 1.0.8 - extend: 3.0.2 - forever-agent: 0.6.1 - form-data: 2.3.3 - http-signature: 1.3.6 - is-typedarray: 1.0.0 - isstream: 0.1.2 - json-stringify-safe: 5.0.1 - mime-types: 2.1.35 - performance-now: 2.1.0 - qs: 6.10.4 - safe-buffer: 5.2.1 + statuses: 2.0.1 + + '@bundled-es-modules/tough-cookie@0.1.6': + dependencies: + '@types/tough-cookie': 4.0.5 tough-cookie: 5.0.0-rc.4 - tunnel-agent: 0.6.0 - uuid: 8.3.2 - '@cypress/xvfb@1.2.4(supports-color@8.1.1)': + '@cosmicjs/sdk@1.0.11': dependencies: - debug: 3.2.7(supports-color@8.1.1) - lodash.once: 4.1.1 + axios: 1.7.2 + form-data: 4.0.0 transitivePeerDependencies: - - supports-color + - debug '@date-io/core@3.0.0': {} @@ -9733,11 +10178,9 @@ snapshots: optionalDependencies: date-fns: 3.6.0 - '@date-io/dayjs@3.0.0(dayjs@1.10.4)': + '@date-io/dayjs@3.0.0': dependencies: '@date-io/core': 3.0.0 - optionalDependencies: - dayjs: 1.10.4 '@emailjs/browser@4.3.3': {} @@ -9925,7 +10368,7 @@ snapshots: '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7 espree: 9.6.1 globals: 13.24.0 ignore: 5.3.1 @@ -10004,7 +10447,7 @@ snapshots: '@humanwhocodes/config-array@0.11.14': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -10015,6 +10458,33 @@ snapshots: '@hutson/parse-repository-url@3.0.2': {} + '@inquirer/confirm@3.2.0': + dependencies: + '@inquirer/core': 9.1.0 + '@inquirer/type': 1.5.3 + + '@inquirer/core@9.1.0': + dependencies: + '@inquirer/figures': 1.0.5 + '@inquirer/type': 1.5.3 + '@types/mute-stream': 0.0.4 + '@types/node': 22.5.4 + '@types/wrap-ansi': 3.0.0 + ansi-escapes: 4.3.2 + cli-spinners: 2.9.2 + cli-width: 4.1.0 + mute-stream: 1.0.0 + signal-exit: 4.1.0 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.2 + + '@inquirer/figures@1.0.5': {} + + '@inquirer/type@1.5.3': + dependencies: + mute-stream: 1.0.0 + '@intlify/bundle-utils@8.0.0(vue-i18n@9.11.1(vue@3.4.27(typescript@5.5.4)))': dependencies: '@intlify/message-compiler': 9.11.1 @@ -10024,7 +10494,7 @@ snapshots: estree-walker: 2.0.2 jsonc-eslint-parser: 2.4.0 mlly: 1.7.1 - source-map-js: 1.2.0 + source-map-js: 1.2.1 yaml-eslint-parser: 1.2.2 optionalDependencies: vue-i18n: 9.11.1(vue@3.4.27(typescript@5.5.4)) @@ -10037,23 +10507,23 @@ snapshots: '@intlify/message-compiler@9.11.1': dependencies: '@intlify/shared': 9.11.1 - source-map-js: 1.2.0 + source-map-js: 1.2.1 '@intlify/shared@9.11.1': {} - '@intlify/unplugin-vue-i18n@4.0.0(rollup@4.14.1)(vue-i18n@9.11.1(vue@3.4.27(typescript@5.5.4)))': + '@intlify/unplugin-vue-i18n@4.0.0(rollup@4.21.2)(vue-i18n@9.11.1(vue@3.4.27(typescript@5.5.4)))': dependencies: '@intlify/bundle-utils': 8.0.0(vue-i18n@9.11.1(vue@3.4.27(typescript@5.5.4))) '@intlify/shared': 9.11.1 - '@rollup/pluginutils': 5.1.0(rollup@4.14.1) + '@rollup/pluginutils': 5.1.0(rollup@4.21.2) '@vue/compiler-sfc': 3.4.27 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7 fast-glob: 3.3.2 js-yaml: 4.1.0 json5: 2.2.3 pathe: 1.1.2 - picocolors: 1.0.1 - source-map-js: 1.2.0 + picocolors: 1.1.0 + source-map-js: 1.2.1 unplugin: 1.12.1 optionalDependencies: vue-i18n: 9.11.1(vue@3.4.27(typescript@5.5.4)) @@ -10085,7 +10555,7 @@ snapshots: '@jest/console@28.1.3': dependencies: '@jest/types': 28.1.3 - '@types/node': 20.12.7 + '@types/node': 22.5.4 chalk: 4.1.2 jest-message-util: 28.1.3 jest-util: 28.1.3 @@ -10098,14 +10568,14 @@ snapshots: '@jest/test-result': 28.1.3 '@jest/transform': 28.1.3 '@jest/types': 28.1.3 - '@types/node': 20.12.7 + '@types/node': 22.5.4 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 28.1.3 - jest-config: 28.1.3(@types/node@20.12.7) + jest-config: 28.1.3(@types/node@22.5.4) jest-haste-map: 28.1.3 jest-message-util: 28.1.3 jest-regex-util: 28.0.2 @@ -10117,7 +10587,7 @@ snapshots: jest-util: 28.1.3 jest-validate: 28.1.3 jest-watcher: 28.1.3 - micromatch: 4.0.5 + micromatch: 4.0.8 pretty-format: 28.1.3 rimraf: 3.0.2 slash: 3.0.0 @@ -10130,7 +10600,7 @@ snapshots: dependencies: '@jest/fake-timers': 28.1.3 '@jest/types': 28.1.3 - '@types/node': 20.12.7 + '@types/node': 22.5.4 jest-mock: 28.1.3 '@jest/expect-utils@28.1.3': @@ -10148,7 +10618,7 @@ snapshots: dependencies: '@jest/types': 28.1.3 '@sinonjs/fake-timers': 9.1.2 - '@types/node': 20.12.7 + '@types/node': 22.5.4 jest-message-util: 28.1.3 jest-mock: 28.1.3 jest-util: 28.1.3 @@ -10169,7 +10639,7 @@ snapshots: '@jest/transform': 28.1.3 '@jest/types': 28.1.3 '@jridgewell/trace-mapping': 0.3.25 - '@types/node': 20.12.7 + '@types/node': 22.5.4 chalk: 4.1.2 collect-v8-coverage: 1.0.1 exit: 0.1.2 @@ -10232,7 +10702,7 @@ snapshots: jest-haste-map: 28.1.3 jest-regex-util: 28.0.2 jest-util: 28.1.3 - micromatch: 4.0.5 + micromatch: 4.0.8 pirates: 4.0.5 slash: 3.0.0 write-file-atomic: 4.0.2 @@ -10243,7 +10713,7 @@ snapshots: dependencies: '@types/istanbul-lib-coverage': 2.0.3 '@types/istanbul-reports': 3.0.0 - '@types/node': 20.12.7 + '@types/node': 22.5.4 '@types/yargs': 15.0.9 chalk: 4.1.2 @@ -10252,7 +10722,7 @@ snapshots: '@jest/schemas': 28.1.3 '@types/istanbul-lib-coverage': 2.0.3 '@types/istanbul-reports': 3.0.0 - '@types/node': 20.12.7 + '@types/node': 22.5.4 '@types/yargs': 17.0.13 chalk: 4.1.2 @@ -10369,6 +10839,15 @@ snapshots: '@mdi/svg@7.4.47': {} + '@mswjs/interceptors@0.29.1': + dependencies: + '@open-draft/deferred-promise': 2.2.0 + '@open-draft/logger': 0.3.0 + '@open-draft/until': 2.1.0 + is-node-process: 1.2.0 + outvariant: 1.4.3 + strict-event-emitter: 0.5.1 + '@napi-rs/wasm-runtime@0.2.4': dependencies: '@emnapi/core': 1.2.0 @@ -10668,7 +11147,7 @@ snapshots: '@octokit/request-error': 3.0.3 '@octokit/types': 9.3.2 is-plain-object: 5.0.0 - node-fetch: 2.6.7(encoding@0.1.13) + node-fetch: 2.7.0(encoding@0.1.13) universal-user-agent: 6.0.0 transitivePeerDependencies: - encoding @@ -10705,48 +11184,58 @@ snapshots: '@one-ini/wasm@0.1.1': {} - '@percy/cli-app@1.28.2(typescript@5.5.4)': + '@open-draft/deferred-promise@2.2.0': {} + + '@open-draft/logger@0.3.0': dependencies: - '@percy/cli-command': 1.28.2(typescript@5.5.4) - '@percy/cli-exec': 1.28.2(typescript@5.5.4) + is-node-process: 1.2.0 + outvariant: 1.4.3 + + '@open-draft/until@2.1.0': {} + + '@percy/cli-app@1.29.3(typescript@5.5.4)': + dependencies: + '@percy/cli-command': 1.29.3(typescript@5.5.4) + '@percy/cli-exec': 1.29.3(typescript@5.5.4) transitivePeerDependencies: - bufferutil - supports-color - typescript - utf-8-validate - '@percy/cli-build@1.28.2(typescript@5.5.4)': + '@percy/cli-build@1.29.3(typescript@5.5.4)': dependencies: - '@percy/cli-command': 1.28.2(typescript@5.5.4) + '@percy/cli-command': 1.29.3(typescript@5.5.4) transitivePeerDependencies: - bufferutil - supports-color - typescript - utf-8-validate - '@percy/cli-command@1.28.2(typescript@5.5.4)': + '@percy/cli-command@1.29.3(typescript@5.5.4)': dependencies: - '@percy/config': 1.28.2(typescript@5.5.4) - '@percy/core': 1.28.2(typescript@5.5.4) - '@percy/logger': 1.28.2 + '@percy/config': 1.29.3(typescript@5.5.4) + '@percy/core': 1.29.3(typescript@5.5.4) + '@percy/logger': 1.29.3 transitivePeerDependencies: - bufferutil - supports-color - typescript - utf-8-validate - '@percy/cli-config@1.28.2(typescript@5.5.4)': + '@percy/cli-config@1.29.3(typescript@5.5.4)': dependencies: - '@percy/cli-command': 1.28.2(typescript@5.5.4) + '@percy/cli-command': 1.29.3(typescript@5.5.4) transitivePeerDependencies: - bufferutil - supports-color - typescript - utf-8-validate - '@percy/cli-exec@1.28.2(typescript@5.5.4)': + '@percy/cli-exec@1.29.3(typescript@5.5.4)': dependencies: - '@percy/cli-command': 1.28.2(typescript@5.5.4) + '@percy/cli-command': 1.29.3(typescript@5.5.4) + '@percy/logger': 1.29.3 cross-spawn: 7.0.3 which: 2.0.2 transitivePeerDependencies: @@ -10755,99 +11244,97 @@ snapshots: - typescript - utf-8-validate - '@percy/cli-snapshot@1.28.2(typescript@5.5.4)': + '@percy/cli-snapshot@1.29.3(typescript@5.5.4)': dependencies: - '@percy/cli-command': 1.28.2(typescript@5.5.4) - yaml: 2.4.1 + '@percy/cli-command': 1.29.3(typescript@5.5.4) + yaml: 2.5.1 transitivePeerDependencies: - bufferutil - supports-color - typescript - utf-8-validate - '@percy/cli-upload@1.28.2(typescript@5.5.4)': + '@percy/cli-upload@1.29.3(typescript@5.5.4)': dependencies: - '@percy/cli-command': 1.28.2(typescript@5.5.4) + '@percy/cli-command': 1.29.3(typescript@5.5.4) fast-glob: 3.3.2 - image-size: 1.0.0 + image-size: 1.1.1 transitivePeerDependencies: - bufferutil - supports-color - typescript - utf-8-validate - '@percy/cli@1.28.2(typescript@5.5.4)': - dependencies: - '@percy/cli-app': 1.28.2(typescript@5.5.4) - '@percy/cli-build': 1.28.2(typescript@5.5.4) - '@percy/cli-command': 1.28.2(typescript@5.5.4) - '@percy/cli-config': 1.28.2(typescript@5.5.4) - '@percy/cli-exec': 1.28.2(typescript@5.5.4) - '@percy/cli-snapshot': 1.28.2(typescript@5.5.4) - '@percy/cli-upload': 1.28.2(typescript@5.5.4) - '@percy/client': 1.28.2 - '@percy/logger': 1.28.2 + '@percy/cli@1.29.3(typescript@5.5.4)': + dependencies: + '@percy/cli-app': 1.29.3(typescript@5.5.4) + '@percy/cli-build': 1.29.3(typescript@5.5.4) + '@percy/cli-command': 1.29.3(typescript@5.5.4) + '@percy/cli-config': 1.29.3(typescript@5.5.4) + '@percy/cli-exec': 1.29.3(typescript@5.5.4) + '@percy/cli-snapshot': 1.29.3(typescript@5.5.4) + '@percy/cli-upload': 1.29.3(typescript@5.5.4) + '@percy/client': 1.29.3 + '@percy/logger': 1.29.3 transitivePeerDependencies: - bufferutil - supports-color - typescript - utf-8-validate - '@percy/client@1.28.2': + '@percy/client@1.29.3': dependencies: - '@percy/env': 1.28.2 - '@percy/logger': 1.28.2 + '@percy/env': 1.29.3 + '@percy/logger': 1.29.3 + pako: 2.1.0 - '@percy/config@1.28.2(typescript@5.5.4)': + '@percy/config@1.29.3(typescript@5.5.4)': dependencies: - '@percy/logger': 1.28.2 - ajv: 8.12.0 + '@percy/logger': 1.29.3 + ajv: 8.17.1 cosmiconfig: 8.3.6(typescript@5.5.4) - yaml: 2.4.1 + yaml: 2.5.1 transitivePeerDependencies: - typescript - '@percy/core@1.28.2(typescript@5.5.4)': + '@percy/core@1.29.3(typescript@5.5.4)': dependencies: - '@percy/client': 1.28.2 - '@percy/config': 1.28.2(typescript@5.5.4) - '@percy/dom': 1.28.2 - '@percy/logger': 1.28.2 - '@percy/webdriver-utils': 1.28.2(typescript@5.5.4) + '@percy/client': 1.29.3 + '@percy/config': 1.29.3(typescript@5.5.4) + '@percy/dom': 1.29.3 + '@percy/logger': 1.29.3 + '@percy/webdriver-utils': 1.29.3(typescript@5.5.4) content-disposition: 0.5.4 cross-spawn: 7.0.3 - extract-zip: 2.0.1(supports-color@8.1.1) + extract-zip: 2.0.1 fast-glob: 3.3.2 - micromatch: 4.0.5 + micromatch: 4.0.8 mime-types: 2.1.35 - path-to-regexp: 6.2.0 + pako: 2.1.0 + path-to-regexp: 6.2.2 rimraf: 3.0.2 ws: 8.18.0 + yaml: 2.5.1 transitivePeerDependencies: - bufferutil - supports-color - typescript - utf-8-validate - '@percy/cypress@3.1.2(cypress@13.7.2)': - dependencies: - '@percy/sdk-utils': 1.28.2 - cypress: 13.7.2 - - '@percy/dom@1.28.2': {} + '@percy/dom@1.29.3': {} - '@percy/env@1.28.2': + '@percy/env@1.29.3': dependencies: - '@percy/logger': 1.28.2 + '@percy/logger': 1.29.3 - '@percy/logger@1.28.2': {} + '@percy/logger@1.29.3': {} - '@percy/sdk-utils@1.28.2': {} + '@percy/sdk-utils@1.29.3': {} - '@percy/webdriver-utils@1.28.2(typescript@5.5.4)': + '@percy/webdriver-utils@1.29.3(typescript@5.5.4)': dependencies: - '@percy/config': 1.28.2(typescript@5.5.4) - '@percy/sdk-utils': 1.28.2 + '@percy/config': 1.29.3(typescript@5.5.4) + '@percy/sdk-utils': 1.29.3 transitivePeerDependencies: - typescript @@ -10856,6 +11343,22 @@ snapshots: '@polka/url@1.0.0-next.25': {} + '@promptbook/utils@0.70.0-1': + dependencies: + spacetrim: 0.11.39 + + '@puppeteer/browsers@1.9.1': + dependencies: + debug: 4.3.4 + extract-zip: 2.0.1 + progress: 2.0.3 + proxy-agent: 6.3.1 + tar-fs: 3.0.4 + unbzip2-stream: 1.4.3 + yargs: 17.7.2 + transitivePeerDependencies: + - supports-color + '@rollup/plugin-alias@5.1.0(rollup@3.29.4)': dependencies: slash: 4.0.0 @@ -10948,57 +11451,60 @@ snapshots: optionalDependencies: rollup: 3.29.4 - '@rollup/pluginutils@5.1.0(rollup@4.14.1)': + '@rollup/pluginutils@5.1.0(rollup@4.21.2)': dependencies: '@types/estree': 1.0.5 estree-walker: 2.0.2 picomatch: 2.3.1 optionalDependencies: - rollup: 4.14.1 + rollup: 4.21.2 - '@rollup/rollup-android-arm-eabi@4.14.1': + '@rollup/rollup-android-arm-eabi@4.21.2': optional: true - '@rollup/rollup-android-arm64@4.14.1': + '@rollup/rollup-android-arm64@4.21.2': optional: true - '@rollup/rollup-darwin-arm64@4.14.1': + '@rollup/rollup-darwin-arm64@4.21.2': optional: true - '@rollup/rollup-darwin-x64@4.14.1': + '@rollup/rollup-darwin-x64@4.21.2': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.14.1': + '@rollup/rollup-linux-arm-gnueabihf@4.21.2': optional: true - '@rollup/rollup-linux-arm64-gnu@4.14.1': + '@rollup/rollup-linux-arm-musleabihf@4.21.2': optional: true - '@rollup/rollup-linux-arm64-musl@4.14.1': + '@rollup/rollup-linux-arm64-gnu@4.21.2': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.14.1': + '@rollup/rollup-linux-arm64-musl@4.21.2': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.14.1': + '@rollup/rollup-linux-powerpc64le-gnu@4.21.2': optional: true - '@rollup/rollup-linux-s390x-gnu@4.14.1': + '@rollup/rollup-linux-riscv64-gnu@4.21.2': optional: true - '@rollup/rollup-linux-x64-gnu@4.14.1': + '@rollup/rollup-linux-s390x-gnu@4.21.2': optional: true - '@rollup/rollup-linux-x64-musl@4.14.1': + '@rollup/rollup-linux-x64-gnu@4.21.2': optional: true - '@rollup/rollup-win32-arm64-msvc@4.14.1': + '@rollup/rollup-linux-x64-musl@4.21.2': optional: true - '@rollup/rollup-win32-ia32-msvc@4.14.1': + '@rollup/rollup-win32-arm64-msvc@4.21.2': optional: true - '@rollup/rollup-win32-x64-msvc@4.14.1': + '@rollup/rollup-win32-ia32-msvc@4.21.2': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.21.2': optional: true '@sigstore/bundle@2.3.2': @@ -11039,6 +11545,8 @@ snapshots: '@sindresorhus/is@0.7.0': {} + '@sindresorhus/is@5.6.0': {} + '@sinonjs/commons@1.8.1': dependencies: type-detect: 4.0.8 @@ -11054,6 +11562,25 @@ snapshots: magic-string: 0.25.7 string.prototype.matchall: 4.0.11 + '@szmarczak/http-timer@5.0.1': + dependencies: + defer-to-connect: 2.0.1 + + '@testing-library/user-event@14.5.2(@vuetify/testing-library-dom@1.0.2)': + dependencies: + '@testing-library/dom': '@vuetify/testing-library-dom@1.0.2' + + '@testing-library/vue@8.1.0(patch_hash=3limad3b7od6m3nrz2f3jnaixy)(@vue/compiler-sfc@3.4.27)(vue@3.4.27(typescript@5.5.4))': + dependencies: + '@babel/runtime': 7.24.4 + '@testing-library/dom': '@vuetify/testing-library-dom@1.0.2' + '@vue/test-utils': 2.4.6 + vue: 3.4.27(typescript@5.5.4) + optionalDependencies: + '@vue/compiler-sfc': 3.4.27 + + '@tootallnate/quickjs-emscripten@0.23.0': {} + '@trysound/sax@0.2.0': {} '@ts-morph/common@0.23.0': @@ -11074,6 +11601,8 @@ snapshots: dependencies: tslib: 2.6.2 + '@types/aria-query@5.0.4': {} + '@types/babel__core@7.1.19': dependencies: '@babel/parser': 7.25.6 @@ -11097,6 +11626,8 @@ snapshots: '@types/color-name@1.1.1': {} + '@types/cookie@0.6.0': {} + '@types/debug@4.1.12': dependencies: '@types/ms': 0.7.31 @@ -11111,10 +11642,12 @@ snapshots: '@types/graceful-fs@4.1.5': dependencies: - '@types/node': 20.12.7 + '@types/node': 22.5.4 '@types/hogan.js@3.0.1': {} + '@types/http-cache-semantics@4.0.4': {} + '@types/istanbul-lib-coverage@2.0.3': {} '@types/istanbul-lib-report@3.0.0': @@ -11129,7 +11662,7 @@ snapshots: '@types/keyv@3.1.4': dependencies: - '@types/node': 20.12.7 + '@types/node': 22.5.4 '@types/linkify-it@3.0.2': {} @@ -11161,9 +11694,13 @@ snapshots: '@types/ms@0.7.31': {} - '@types/node@20.12.7': + '@types/mute-stream@0.0.4': + dependencies: + '@types/node': 22.5.4 + + '@types/node@22.5.4': dependencies: - undici-types: 5.26.5 + undici-types: 6.19.8 '@types/normalize-package-data@2.4.4': {} @@ -11179,24 +11716,32 @@ snapshots: '@types/resolve@1.17.1': dependencies: - '@types/node': 20.12.7 + '@types/node': 22.5.4 '@types/resolve@1.20.2': {} '@types/responselike@1.0.3': dependencies: - '@types/node': 20.12.7 - - '@types/sinonjs__fake-timers@8.1.1': {} - - '@types/sizzle@2.3.2': {} + '@types/node': 22.5.4 '@types/stack-utils@2.0.0': {} + '@types/statuses@2.0.5': {} + '@types/stringify-object@4.0.5': {} + '@types/tough-cookie@4.0.5': {} + '@types/trusted-types@2.0.2': {} + '@types/which@2.0.2': {} + + '@types/wrap-ansi@3.0.0': {} + + '@types/ws@8.5.12': + dependencies: + '@types/node': 22.5.4 + '@types/yargs-parser@15.0.0': {} '@types/yargs@15.0.9': @@ -11207,9 +11752,9 @@ snapshots: dependencies: '@types/yargs-parser': 15.0.0 - '@types/yauzl@2.9.1': + '@types/yauzl@2.10.3': dependencies: - '@types/node': 20.12.7 + '@types/node': 22.5.4 optional: true '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4)': @@ -11236,7 +11781,7 @@ snapshots: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7 eslint: 8.57.0 optionalDependencies: typescript: 5.5.4 @@ -11257,7 +11802,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.5.4) - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7 eslint: 8.57.0 ts-api-utils: 1.3.0(typescript@5.5.4) optionalDependencies: @@ -11273,7 +11818,7 @@ snapshots: dependencies: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 @@ -11288,7 +11833,7 @@ snapshots: dependencies: '@typescript-eslint/types': 8.0.1 '@typescript-eslint/visitor-keys': 8.0.1 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 @@ -11369,30 +11914,48 @@ snapshots: unhead: 1.9.4 vue: 3.4.27(typescript@5.5.4) - '@vitejs/plugin-basic-ssl@1.1.0(vite@5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3))': + '@vitejs/plugin-basic-ssl@1.1.0(vite@5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3))': dependencies: - vite: 5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3) + vite: 5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3) - '@vitejs/plugin-vue-jsx@3.1.0(vite@5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3))(vue@3.4.27(typescript@5.5.4))': + '@vitejs/plugin-vue-jsx@3.1.0(vite@5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3))(vue@3.4.27(typescript@5.5.4))': dependencies: '@babel/core': 7.25.2 '@babel/plugin-transform-typescript': 7.25.2(@babel/core@7.25.2) '@vue/babel-plugin-jsx': 1.2.2(@babel/core@7.25.2) - vite: 5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3) + vite: 5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3) vue: 3.4.27(typescript@5.5.4) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@5.0.4(vite@5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3))(vue@3.4.27(typescript@5.5.4))': + '@vitejs/plugin-vue@5.0.4(vite@5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3))(vue@3.4.27(typescript@5.5.4))': dependencies: - vite: 5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3) + vite: 5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3) vue: 3.4.27(typescript@5.5.4) - '@vitest/coverage-v8@2.0.5(vitest@2.0.5(@types/node@20.12.7)(happy-dom@8.9.0(encoding@0.1.13))(jsdom@25.0.0)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3))': + '@vitest/browser@2.0.5(typescript@5.5.4)(vitest@2.0.5)(webdriverio@8.40.5(encoding@0.1.13))': + dependencies: + '@testing-library/dom': '@vuetify/testing-library-dom@1.0.2' + '@testing-library/user-event': 14.5.2(@vuetify/testing-library-dom@1.0.2) + '@vitest/utils': 2.0.5 + magic-string: 0.30.11 + msw: 2.4.2(typescript@5.5.4) + sirv: 2.0.4 + vitest: 2.0.5(@types/node@22.5.4)(@vitest/browser@2.0.5)(@vitest/ui@2.0.5)(happy-dom@8.9.0(encoding@0.1.13))(jsdom@25.0.0)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3) + ws: 8.18.0 + optionalDependencies: + webdriverio: 8.40.5(encoding@0.1.13) + transitivePeerDependencies: + - bufferutil + - graphql + - typescript + - utf-8-validate + + '@vitest/coverage-v8@2.0.5(vitest@2.0.5(@types/node@22.5.4)(@vitest/browser@2.0.5)(@vitest/ui@2.0.5)(happy-dom@8.9.0(encoding@0.1.13))(jsdom@25.0.0)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 5.0.6 @@ -11402,7 +11965,7 @@ snapshots: std-env: 3.7.0 test-exclude: 7.0.1 tinyrainbow: 1.2.0 - vitest: 2.0.5(@types/node@20.12.7)(happy-dom@8.9.0(encoding@0.1.13))(jsdom@25.0.0)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3) + vitest: 2.0.5(@types/node@22.5.4)(@vitest/browser@2.0.5)(@vitest/ui@2.0.5)(happy-dom@8.9.0(encoding@0.1.13))(jsdom@25.0.0)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3) transitivePeerDependencies: - supports-color @@ -11432,6 +11995,17 @@ snapshots: dependencies: tinyspy: 3.0.0 + '@vitest/ui@2.0.5(vitest@2.0.5)': + dependencies: + '@vitest/utils': 2.0.5 + fast-glob: 3.3.2 + fflate: 0.8.2 + flatted: 3.3.1 + pathe: 1.1.2 + sirv: 2.0.4 + tinyrainbow: 1.2.0 + vitest: 2.0.5(@types/node@22.5.4)(@vitest/browser@2.0.5)(@vitest/ui@2.0.5)(happy-dom@8.9.0(encoding@0.1.13))(jsdom@25.0.0)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3) + '@vitest/utils@2.0.5': dependencies: '@vitest/pretty-format': 2.0.5 @@ -11521,7 +12095,7 @@ snapshots: '@vue/shared': 3.4.27 entities: 4.5.0 estree-walker: 2.0.2 - source-map-js: 1.2.0 + source-map-js: 1.2.1 '@vue/compiler-dom@3.4.27': dependencies: @@ -11537,8 +12111,8 @@ snapshots: '@vue/shared': 3.4.27 estree-walker: 2.0.2 magic-string: 0.30.11 - postcss: 8.4.40 - source-map-js: 1.2.0 + postcss: 8.4.45 + source-map-js: 1.2.1 '@vue/compiler-ssr@3.4.27': dependencies: @@ -11668,6 +12242,17 @@ snapshots: vue: 3.4.27(typescript@5.5.4) vuetify: link:packages/vuetify + '@vuetify/testing-library-dom@1.0.2': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/runtime': 7.24.4 + '@types/aria-query': 5.0.4 + aria-query: 5.3.0 + chalk: 4.1.2 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + pretty-format: 27.5.1 + '@vueuse/head@1.3.1(vue@3.4.27(typescript@5.5.4))': dependencies: '@unhead/dom': 1.9.4 @@ -11676,14 +12261,68 @@ snapshots: '@unhead/vue': 1.9.4(vue@3.4.27(typescript@5.5.4)) vue: 3.4.27(typescript@5.5.4) - '@yankeeinlondon/builder-api@1.4.1(@vitejs/plugin-vue@5.0.4(vite@5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3))(vue@3.4.27(typescript@5.5.4)))(encoding@0.1.13)(vite@5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3))': + '@wdio/config@8.40.3': + dependencies: + '@wdio/logger': 8.38.0 + '@wdio/types': 8.40.3 + '@wdio/utils': 8.40.3 + decamelize: 6.0.0 + deepmerge-ts: 5.1.0 + glob: 10.4.5 + import-meta-resolve: 4.1.0 + transitivePeerDependencies: + - supports-color + + '@wdio/logger@8.38.0': + dependencies: + chalk: 5.3.0 + loglevel: 1.9.2 + loglevel-plugin-prefix: 0.8.4 + strip-ansi: 7.1.0 + + '@wdio/logger@9.0.8': + dependencies: + chalk: 5.3.0 + loglevel: 1.9.2 + loglevel-plugin-prefix: 0.8.4 + strip-ansi: 7.1.0 + + '@wdio/protocols@8.40.3': {} + + '@wdio/repl@8.40.3': + dependencies: + '@types/node': 22.5.4 + + '@wdio/types@8.40.3': + dependencies: + '@types/node': 22.5.4 + + '@wdio/utils@8.40.3': + dependencies: + '@puppeteer/browsers': 1.9.1 + '@wdio/logger': 8.38.0 + '@wdio/types': 8.40.3 + decamelize: 6.0.0 + deepmerge-ts: 5.1.0 + edgedriver: 5.6.1 + geckodriver: 4.4.4 + get-port: 7.1.0 + import-meta-resolve: 4.1.0 + locate-app: 2.4.39 + safaridriver: 0.1.2 + split2: 4.2.0 + wait-port: 1.1.0 + transitivePeerDependencies: + - supports-color + + '@yankeeinlondon/builder-api@1.4.1(@vitejs/plugin-vue@5.0.4(vite@5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3))(vue@3.4.27(typescript@5.5.4)))(encoding@0.1.13)(vite@5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3))': dependencies: '@types/markdown-it': 12.2.3 '@yankeeinlondon/happy-wrapper': 2.10.1(encoding@0.1.13) fp-ts: 2.16.9 inferred-types: 0.37.6 markdown-it: 13.0.2 - vite-plugin-md: 0.22.5(@vitejs/plugin-vue@5.0.4(vite@5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3))(vue@3.4.27(typescript@5.5.4)))(encoding@0.1.13)(vite@5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3)) + vite-plugin-md: 0.22.5(@vitejs/plugin-vue@5.0.4(vite@5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3))(vue@3.4.27(typescript@5.5.4)))(encoding@0.1.13)(vite@5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3)) transitivePeerDependencies: - '@vitejs/plugin-vue' - encoding @@ -11712,6 +12351,8 @@ snapshots: js-yaml: 3.14.1 tslib: 2.6.2 + '@zip.js/zip.js@2.7.52': {} + '@zkochan/js-yaml@0.0.7': dependencies: argparse: 2.0.1 @@ -11725,6 +12366,10 @@ snapshots: abbrev@2.0.0: {} + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + acorn-jsx@5.3.2(acorn@8.12.1): dependencies: acorn: 8.12.1 @@ -11739,7 +12384,7 @@ snapshots: agent-base@7.1.1: dependencies: - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7 transitivePeerDependencies: - supports-color @@ -11755,12 +12400,12 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.2.2 - ajv@8.12.0: + ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 + fast-uri: 3.0.1 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - uri-js: 4.2.2 algoliasearch-helper@3.19.0(algoliasearch@4.23.3): dependencies: @@ -11826,7 +12471,25 @@ snapshots: aproba@2.0.0: {} - arch@2.2.0: {} + archiver-utils@5.0.2: + dependencies: + glob: 10.4.5 + graceful-fs: 4.2.11 + is-stream: 2.0.1 + lazystream: 1.0.1 + lodash: 4.17.21 + normalize-path: 3.0.0 + readable-stream: 4.5.2 + + archiver@7.0.1: + dependencies: + archiver-utils: 5.0.2 + async: 3.2.5 + buffer-crc32: 1.0.0 + readable-stream: 4.5.2 + readdir-glob: 1.1.3 + tar-stream: 3.1.7 + zip-stream: 6.0.1 argparse@1.0.10: dependencies: @@ -11834,6 +12497,10 @@ snapshots: argparse@2.0.1: {} + aria-query@5.3.0: + dependencies: + dequal: 2.0.3 + array-buffer-byte-length@1.0.1: dependencies: call-bind: 1.0.7 @@ -11916,15 +12583,11 @@ snapshots: arrify@2.0.1: {} - asn1@0.2.4: - dependencies: - safer-buffer: 2.1.2 - - assert-plus@1.0.0: {} - assertion-error@2.0.1: {} - astral-regex@2.0.0: {} + ast-types@0.13.4: + dependencies: + tslib: 2.6.2 async-es@3.2.5: {} @@ -11936,24 +12599,20 @@ snapshots: atob@2.1.2: {} - autoprefixer@10.4.19(postcss@8.4.40): + autoprefixer@10.4.19(postcss@8.4.45): dependencies: browserslist: 4.23.3 caniuse-lite: 1.0.30001646 fraction.js: 4.3.7 normalize-range: 0.1.2 - picocolors: 1.0.1 - postcss: 8.4.40 + picocolors: 1.1.0 + postcss: 8.4.45 postcss-value-parser: 4.2.0 available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.0.0 - aws-sign2@0.7.0: {} - - aws4@1.9.1: {} - axios@1.7.2: dependencies: follow-redirects: 1.15.6 @@ -11962,6 +12621,8 @@ snapshots: transitivePeerDependencies: - debug + b4a@1.6.6: {} + babel-eslint@10.1.0(eslint@8.57.0): dependencies: '@babel/code-frame': 7.24.7 @@ -12081,11 +12742,33 @@ snapshots: balanced-match@1.0.0: {} - base64-js@1.5.1: {} + bare-events@2.4.2: + optional: true + + bare-fs@2.3.3: + dependencies: + bare-events: 2.4.2 + bare-path: 2.1.3 + bare-stream: 2.2.1 + optional: true - bcrypt-pbkdf@1.0.2: + bare-os@2.4.2: + optional: true + + bare-path@2.1.3: + dependencies: + bare-os: 2.4.2 + optional: true + + bare-stream@2.2.1: dependencies: - tweetnacl: 0.14.5 + b4a: 1.6.6 + streamx: 2.20.0 + optional: true + + base64-js@1.5.1: {} + + basic-ftp@5.0.5: {} before-after-hook@2.2.2: {} @@ -12104,10 +12787,6 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.0 - blob-util@2.0.2: {} - - bluebird@3.7.2: {} - boolbase@1.0.0: {} brace-expansion@1.1.11: @@ -12119,9 +12798,9 @@ snapshots: dependencies: balanced-match: 1.0.0 - braces@3.0.2: + braces@3.0.3: dependencies: - fill-range: 7.0.1 + fill-range: 7.1.1 brilliant-errors@0.7.3: dependencies: @@ -12143,6 +12822,8 @@ snapshots: buffer-crc32@0.2.13: {} + buffer-crc32@1.0.0: {} + buffer-from@1.1.1: {} buffer@5.7.1: @@ -12150,6 +12831,11 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + builtin-modules@3.3.0: {} builtins@5.0.1: @@ -12179,6 +12865,18 @@ snapshots: tar: 6.2.1 unique-filename: 3.0.0 + cacheable-lookup@7.0.0: {} + + cacheable-request@10.2.14: + dependencies: + '@types/http-cache-semantics': 4.0.4 + get-stream: 6.0.1 + http-cache-semantics: 4.1.1 + keyv: 4.5.4 + mimic-response: 4.0.0 + normalize-url: 8.0.1 + responselike: 3.0.0 + cacheable-request@2.1.4: dependencies: clone-response: 1.0.2 @@ -12189,8 +12887,6 @@ snapshots: normalize-url: 2.0.1 responselike: 1.0.2 - cachedir@2.3.0: {} - call-bind@1.0.7: dependencies: es-define-property: 1.0.0 @@ -12247,8 +12943,6 @@ snapshots: caniuse-lite@1.0.30001646: {} - caseless@0.12.0: {} - chai@5.1.1: dependencies: assertion-error: 2.0.1 @@ -12273,6 +12967,8 @@ snapshots: ansi-styles: 4.2.1 supports-color: 7.2.0 + chalk@5.3.0: {} + char-regex@1.0.2: {} character-parser@2.2.0: @@ -12283,12 +12979,10 @@ snapshots: check-error@2.1.1: {} - check-more-types@2.24.0: {} - chokidar@3.6.0: dependencies: anymatch: 3.1.2 - braces: 3.0.2 + braces: 3.0.3 glob-parent: 5.1.2 is-binary-path: 2.1.0 is-glob: 4.0.3 @@ -12299,6 +12993,12 @@ snapshots: chownr@2.0.0: {} + chromium-bidi@0.5.8(devtools-protocol@0.0.1232444): + dependencies: + devtools-protocol: 0.0.1232444 + mitt: 3.0.1 + urlpattern-polyfill: 10.0.0 + ci-info@2.0.0: {} ci-info@3.9.0: {} @@ -12321,21 +13021,12 @@ snapshots: cli-spinners@2.9.2: {} - cli-table3@0.6.1: - dependencies: - string-width: 4.2.3 - optionalDependencies: - colors: 1.4.0 - - cli-truncate@2.1.0: - dependencies: - slice-ansi: 3.0.0 - string-width: 4.2.3 - cli-width@2.2.0: {} cli-width@3.0.0: {} + cli-width@4.1.0: {} + cliui@7.0.4: dependencies: string-width: 4.2.3 @@ -12384,11 +13075,6 @@ snapshots: colord@2.9.3: {} - colorette@1.4.0: {} - - colors@1.4.0: - optional: true - columnify@1.6.0: dependencies: strip-ansi: 6.0.1 @@ -12408,6 +13094,8 @@ snapshots: commander@7.2.0: {} + commander@9.5.0: {} + common-ancestor-path@1.0.1: {} common-tags@1.8.0: {} @@ -12422,6 +13110,14 @@ snapshots: array-ify: 1.0.0 dot-prop: 5.3.0 + compress-commons@6.0.2: + dependencies: + crc-32: 1.2.2 + crc32-stream: 6.0.0 + is-stream: 2.0.1 + normalize-path: 3.0.0 + readable-stream: 4.5.2 + computeds@0.0.1: {} concat-map@0.0.1: {} @@ -12675,7 +13371,7 @@ snapshots: dependencies: conventional-changelog: 2.0.3 dateformat: 3.0.3 - debug: 3.2.7(supports-color@8.1.1) + debug: 3.2.7 gh-got: 7.1.0 git-semver-tags: 2.0.3 lodash.merge: 4.6.2 @@ -12704,6 +13400,8 @@ snapshots: convert-source-map@2.0.0: {} + cookie@0.5.0: {} + core-js-compat@3.37.1: dependencies: browserslist: 4.23.3 @@ -12736,6 +13434,13 @@ snapshots: optionalDependencies: typescript: 5.5.4 + crc-32@1.2.2: {} + + crc32-stream@6.0.0: + dependencies: + crc-32: 1.2.2 + readable-stream: 4.5.2 + create-jest-runner@0.11.2(@jest/test-result@28.1.3)(jest-runner@28.1.3): dependencies: chalk: 4.1.2 @@ -12745,6 +13450,12 @@ snapshots: '@jest/test-result': 28.1.3 jest-runner: 28.1.3 + cross-fetch@4.0.0(encoding@0.1.13): + dependencies: + node-fetch: 2.7.0(encoding@0.1.13) + transitivePeerDependencies: + - encoding + cross-spawn@6.0.5: dependencies: nice-try: 1.0.5 @@ -12761,27 +13472,31 @@ snapshots: crypto-random-string@2.0.0: {} - css-declaration-sorter@7.2.0(postcss@8.4.40): + css-declaration-sorter@7.2.0(postcss@8.4.45): dependencies: - postcss: 8.4.40 + postcss: 8.4.45 css-select@5.1.0: dependencies: boolbase: 1.0.0 css-what: 6.1.0 domhandler: 5.0.3 - domutils: 3.0.1 + domutils: 3.1.0 nth-check: 2.1.1 + css-shorthand-properties@1.1.1: {} + css-tree@2.2.1: dependencies: mdn-data: 2.0.28 - source-map-js: 1.2.0 + source-map-js: 1.2.1 css-tree@2.3.1: dependencies: mdn-data: 2.0.30 - source-map-js: 1.2.0 + source-map-js: 1.2.1 + + css-value@0.0.1: {} css-what@6.1.0: {} @@ -12789,49 +13504,49 @@ snapshots: cssesc@3.0.0: {} - cssnano-preset-default@6.1.2(postcss@8.4.40): + cssnano-preset-default@6.1.2(postcss@8.4.45): dependencies: browserslist: 4.23.3 - css-declaration-sorter: 7.2.0(postcss@8.4.40) - cssnano-utils: 4.0.2(postcss@8.4.40) - postcss: 8.4.40 - postcss-calc: 9.0.1(postcss@8.4.40) - postcss-colormin: 6.1.0(postcss@8.4.40) - postcss-convert-values: 6.1.0(postcss@8.4.40) - postcss-discard-comments: 6.0.2(postcss@8.4.40) - postcss-discard-duplicates: 6.0.3(postcss@8.4.40) - postcss-discard-empty: 6.0.3(postcss@8.4.40) - postcss-discard-overridden: 6.0.2(postcss@8.4.40) - postcss-merge-longhand: 6.0.5(postcss@8.4.40) - postcss-merge-rules: 6.1.1(postcss@8.4.40) - postcss-minify-font-values: 6.1.0(postcss@8.4.40) - postcss-minify-gradients: 6.0.3(postcss@8.4.40) - postcss-minify-params: 6.1.0(postcss@8.4.40) - postcss-minify-selectors: 6.0.4(postcss@8.4.40) - postcss-normalize-charset: 6.0.2(postcss@8.4.40) - postcss-normalize-display-values: 6.0.2(postcss@8.4.40) - postcss-normalize-positions: 6.0.2(postcss@8.4.40) - postcss-normalize-repeat-style: 6.0.2(postcss@8.4.40) - postcss-normalize-string: 6.0.2(postcss@8.4.40) - postcss-normalize-timing-functions: 6.0.2(postcss@8.4.40) - postcss-normalize-unicode: 6.1.0(postcss@8.4.40) - postcss-normalize-url: 6.0.2(postcss@8.4.40) - postcss-normalize-whitespace: 6.0.2(postcss@8.4.40) - postcss-ordered-values: 6.0.2(postcss@8.4.40) - postcss-reduce-initial: 6.1.0(postcss@8.4.40) - postcss-reduce-transforms: 6.0.2(postcss@8.4.40) - postcss-svgo: 6.0.3(postcss@8.4.40) - postcss-unique-selectors: 6.0.4(postcss@8.4.40) - - cssnano-utils@4.0.2(postcss@8.4.40): - dependencies: - postcss: 8.4.40 - - cssnano@6.1.2(postcss@8.4.40): - dependencies: - cssnano-preset-default: 6.1.2(postcss@8.4.40) + css-declaration-sorter: 7.2.0(postcss@8.4.45) + cssnano-utils: 4.0.2(postcss@8.4.45) + postcss: 8.4.45 + postcss-calc: 9.0.1(postcss@8.4.45) + postcss-colormin: 6.1.0(postcss@8.4.45) + postcss-convert-values: 6.1.0(postcss@8.4.45) + postcss-discard-comments: 6.0.2(postcss@8.4.45) + postcss-discard-duplicates: 6.0.3(postcss@8.4.45) + postcss-discard-empty: 6.0.3(postcss@8.4.45) + postcss-discard-overridden: 6.0.2(postcss@8.4.45) + postcss-merge-longhand: 6.0.5(postcss@8.4.45) + postcss-merge-rules: 6.1.1(postcss@8.4.45) + postcss-minify-font-values: 6.1.0(postcss@8.4.45) + postcss-minify-gradients: 6.0.3(postcss@8.4.45) + postcss-minify-params: 6.1.0(postcss@8.4.45) + postcss-minify-selectors: 6.0.4(postcss@8.4.45) + postcss-normalize-charset: 6.0.2(postcss@8.4.45) + postcss-normalize-display-values: 6.0.2(postcss@8.4.45) + postcss-normalize-positions: 6.0.2(postcss@8.4.45) + postcss-normalize-repeat-style: 6.0.2(postcss@8.4.45) + postcss-normalize-string: 6.0.2(postcss@8.4.45) + postcss-normalize-timing-functions: 6.0.2(postcss@8.4.45) + postcss-normalize-unicode: 6.1.0(postcss@8.4.45) + postcss-normalize-url: 6.0.2(postcss@8.4.45) + postcss-normalize-whitespace: 6.0.2(postcss@8.4.45) + postcss-ordered-values: 6.0.2(postcss@8.4.45) + postcss-reduce-initial: 6.1.0(postcss@8.4.45) + postcss-reduce-transforms: 6.0.2(postcss@8.4.45) + postcss-svgo: 6.0.3(postcss@8.4.45) + postcss-unique-selectors: 6.0.4(postcss@8.4.45) + + cssnano-utils@4.0.2(postcss@8.4.45): + dependencies: + postcss: 8.4.45 + + cssnano@6.1.2(postcss@8.4.45): + dependencies: + cssnano-preset-default: 6.1.2(postcss@8.4.45) lilconfig: 3.1.1 - postcss: 8.4.40 + postcss: 8.4.45 csso@5.0.5: dependencies: @@ -12849,68 +13564,15 @@ snapshots: cy-mobile-commands@0.3.0: {} - cypress-file-upload@5.0.8(cypress@13.7.2): - dependencies: - cypress: 13.7.2 - - cypress-real-events@1.12.0(cypress@13.7.2): - dependencies: - cypress: 13.7.2 - - cypress@13.7.2: - dependencies: - '@cypress/request': 3.0.1 - '@cypress/xvfb': 1.2.4(supports-color@8.1.1) - '@types/sinonjs__fake-timers': 8.1.1 - '@types/sizzle': 2.3.2 - arch: 2.2.0 - blob-util: 2.0.2 - bluebird: 3.7.2 - buffer: 5.7.1 - cachedir: 2.3.0 - chalk: 4.1.2 - check-more-types: 2.24.0 - cli-cursor: 3.1.0 - cli-table3: 0.6.1 - commander: 6.2.1 - common-tags: 1.8.0 - dayjs: 1.10.4 - debug: 4.3.6(supports-color@8.1.1) - enquirer: 2.3.6 - eventemitter2: 6.4.7 - execa: 4.1.0 - executable: 4.1.1 - extract-zip: 2.0.1(supports-color@8.1.1) - figures: 3.2.0 - fs-extra: 9.1.0 - getos: 3.2.1 - is-ci: 3.0.1 - is-installed-globally: 0.4.0 - lazy-ass: 1.6.0 - listr2: 3.10.0(enquirer@2.3.6) - lodash: 4.17.21 - log-symbols: 4.1.0 - minimist: 1.2.8 - ospath: 1.2.2 - pretty-bytes: 5.6.0 - process: 0.11.10 - proxy-from-env: 1.0.0 - request-progress: 3.0.0 - semver: 7.6.3 - supports-color: 8.1.1 - tmp: 0.2.1 - untildify: 4.0.0 - yauzl: 2.10.0 - dargs@4.1.0: dependencies: number-is-nan: 1.0.1 dargs@7.0.0: {} - dashdash@1.14.1: - dependencies: - assert-plus: 1.0.0 + data-uri-to-buffer@4.0.1: {} + + data-uri-to-buffer@6.0.2: {} data-urls@5.0.0: dependencies: @@ -12943,25 +13605,23 @@ snapshots: dateformat@3.0.3: {} - dayjs@1.10.4: {} - de-indent@1.0.2: {} debug@2.6.9: dependencies: ms: 2.0.0 - debug@3.2.7(supports-color@8.1.1): + debug@3.2.7: dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 + ms: 2.1.3 - debug@4.3.6(supports-color@8.1.1): + debug@4.3.4: dependencies: ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 + + debug@4.3.7: + dependencies: + ms: 2.1.3 decamelize-keys@1.1.0: dependencies: @@ -12970,6 +13630,8 @@ snapshots: decamelize@1.2.0: {} + decamelize@6.0.0: {} + decimal.js@10.4.3: {} decode-uri-component@0.2.0: {} @@ -12978,6 +13640,10 @@ snapshots: dependencies: mimic-response: 1.0.1 + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + dedent@0.7.0: {} dedent@1.5.3: {} @@ -13009,6 +13675,8 @@ snapshots: deep-is@0.1.3: {} + deepmerge-ts@5.1.0: {} + deepmerge@4.3.1: {} default-browser-id@5.0.0: {} @@ -13022,6 +13690,8 @@ snapshots: dependencies: clone: 1.0.4 + defer-to-connect@2.0.1: {} + define-data-property@1.1.4: dependencies: es-define-property: 1.0.0 @@ -13038,14 +13708,26 @@ snapshots: has-property-descriptors: 1.0.2 object-keys: 1.1.1 + degenerator@5.0.1: + dependencies: + ast-types: 0.13.4 + escodegen: 2.1.0 + esprima: 4.0.1 + delayed-stream@1.0.0: {} deprecation@2.3.1: {} + dequal@2.0.3: {} + detect-indent@5.0.0: {} detect-newline@3.1.0: {} + devtools-protocol@0.0.1232444: {} + + devtools-protocol@0.0.1342118: {} + diff-sequences@28.1.1: {} diff-sequences@29.6.3: {} @@ -13062,6 +13744,8 @@ snapshots: dependencies: esutils: 2.0.3 + dom-accessibility-api@0.5.16: {} + dom-serializer@2.0.0: dependencies: domelementtype: 2.3.0 @@ -13074,7 +13758,7 @@ snapshots: dependencies: domelementtype: 2.3.0 - domutils@3.0.1: + domutils@3.1.0: dependencies: dom-serializer: 2.0.0 domelementtype: 2.3.0 @@ -13104,10 +13788,20 @@ snapshots: eastasianwidth@0.2.0: {} - ecc-jsbn@0.1.2: + edge-paths@3.0.5: dependencies: - jsbn: 0.1.1 - safer-buffer: 2.1.2 + '@types/which': 2.0.2 + which: 2.0.2 + + edgedriver@5.6.1: + dependencies: + '@wdio/logger': 8.38.0 + '@zip.js/zip.js': 2.7.52 + decamelize: 6.0.0 + edge-paths: 3.0.5 + fast-xml-parser: 4.5.0 + node-fetch: 3.3.2 + which: 4.0.0 editorconfig@1.0.4: dependencies: @@ -13362,7 +14056,7 @@ snapshots: eslint-import-resolver-node@0.3.9: dependencies: - debug: 3.2.7(supports-color@8.1.1) + debug: 3.2.7 is-core-module: 2.13.1 resolve: 1.22.8 transitivePeerDependencies: @@ -13370,7 +14064,7 @@ snapshots: eslint-module-utils@2.8.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): dependencies: - debug: 3.2.7(supports-color@8.1.1) + debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 7.18.0(eslint@8.57.0)(typescript@5.5.4) eslint: 8.57.0 @@ -13378,11 +14072,6 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-cypress@2.15.1(eslint@8.57.0): - dependencies: - eslint: 8.57.0 - globals: 13.24.0 - eslint-plugin-es-x@7.5.0(eslint@8.57.0): dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) @@ -13396,7 +14085,7 @@ snapshots: array.prototype.findlastindex: 1.2.3 array.prototype.flat: 1.3.2 array.prototype.flatmap: 1.3.2 - debug: 3.2.7(supports-color@8.1.1) + debug: 3.2.7 doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 @@ -13417,13 +14106,13 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-jest@28.7.0(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(jest@28.1.3(@types/node@20.12.7))(typescript@5.5.4): + eslint-plugin-jest@28.7.0(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(jest@28.1.3(@types/node@22.5.4))(typescript@5.5.4): dependencies: '@typescript-eslint/utils': 8.0.1(eslint@8.57.0)(typescript@5.5.4) eslint: 8.57.0 optionalDependencies: '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) - jest: 28.1.3(@types/node@20.12.7) + jest: 28.1.3(@types/node@22.5.4) transitivePeerDependencies: - supports-color - typescript @@ -13475,6 +14164,17 @@ snapshots: dependencies: eslint: 8.57.0 + eslint-plugin-vitest@0.4.1(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4)(vitest@2.0.5(@types/node@22.5.4)(@vitest/browser@2.0.5)(@vitest/ui@2.0.5)(happy-dom@8.9.0(encoding@0.1.13))(jsdom@25.0.0)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3)): + dependencies: + '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.5.4) + eslint: 8.57.0 + optionalDependencies: + '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) + vitest: 2.0.5(@types/node@22.5.4)(@vitest/browser@2.0.5)(@vitest/ui@2.0.5)(happy-dom@8.9.0(encoding@0.1.13))(jsdom@25.0.0)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3) + transitivePeerDependencies: + - supports-color + - typescript + eslint-plugin-vue@9.24.1(eslint@8.57.0): dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) @@ -13520,7 +14220,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7 doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -13582,10 +14282,12 @@ snapshots: esutils@2.0.3: {} - eventemitter2@6.4.7: {} + event-target-shim@5.0.1: {} eventemitter3@4.0.7: {} + events@3.3.0: {} + execa@1.0.0: dependencies: cross-spawn: 6.0.5 @@ -13596,24 +14298,12 @@ snapshots: signal-exit: 3.0.7 strip-eof: 1.0.0 - execa@4.1.0: - dependencies: - cross-spawn: 7.0.3 - get-stream: 5.2.0 - human-signals: 1.1.1 - is-stream: 2.0.0 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - execa@5.0.0: dependencies: cross-spawn: 7.0.3 get-stream: 6.0.1 human-signals: 2.1.0 - is-stream: 2.0.0 + is-stream: 2.0.1 merge-stream: 2.0.0 npm-run-path: 4.0.1 onetime: 5.1.2 @@ -13625,7 +14315,7 @@ snapshots: cross-spawn: 7.0.3 get-stream: 6.0.1 human-signals: 2.1.0 - is-stream: 2.0.0 + is-stream: 2.0.1 merge-stream: 2.0.0 npm-run-path: 4.0.1 onetime: 5.1.2 @@ -13644,10 +14334,6 @@ snapshots: signal-exit: 4.1.0 strip-final-newline: 3.0.0 - executable@4.1.1: - dependencies: - pify: 2.3.0 - exit@0.1.2: {} expect@28.1.3: @@ -13664,8 +14350,6 @@ snapshots: dependencies: is-extendable: 0.1.1 - extend@3.0.2: {} - external-editor@3.0.3: dependencies: chardet: 0.7.0 @@ -13677,34 +14361,40 @@ snapshots: esprima-extract-comments: 1.1.0 parse-code-context: 1.0.0 - extract-zip@2.0.1(supports-color@8.1.1): + extract-zip@2.0.1: dependencies: - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7 get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: - '@types/yauzl': 2.9.1 + '@types/yauzl': 2.10.3 transitivePeerDependencies: - supports-color - extsprintf@1.3.0: {} - - extsprintf@1.4.0: {} + fast-deep-equal@2.0.1: {} fast-deep-equal@3.1.3: {} + fast-fifo@1.3.2: {} + fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.5 + micromatch: 4.0.8 fast-json-stable-stringify@2.1.0: {} fast-levenshtein@2.0.6: {} + fast-uri@3.0.1: {} + + fast-xml-parser@4.5.0: + dependencies: + strnum: 1.0.5 + fastq@1.8.0: dependencies: reusify: 1.0.4 @@ -13717,6 +14407,11 @@ snapshots: dependencies: pend: 1.2.0 + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + fflate@0.8.2: {} figures@2.0.0: @@ -13735,7 +14430,7 @@ snapshots: dependencies: minimatch: 5.1.6 - fill-range@7.0.1: + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -13781,12 +14476,12 @@ snapshots: flat-cache@3.0.4: dependencies: - flatted: 3.2.2 + flatted: 3.3.1 rimraf: 3.0.2 flat@5.0.2: {} - flatted@3.2.2: {} + flatted@3.3.1: {} follow-redirects@1.15.6: {} @@ -13799,19 +14494,17 @@ snapshots: cross-spawn: 7.0.3 signal-exit: 4.1.0 - forever-agent@0.6.1: {} + form-data-encoder@2.1.4: {} - form-data@2.3.3: + form-data@4.0.0: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 - form-data@4.0.0: + formdata-polyfill@4.0.10: dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 + fetch-blob: 3.2.0 fp-ts@2.16.9: {} @@ -13867,6 +14560,19 @@ snapshots: functions-have-names@1.2.3: {} + geckodriver@4.4.4: + dependencies: + '@wdio/logger': 9.0.8 + '@zip.js/zip.js': 2.7.52 + decamelize: 6.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.5 + node-fetch: 3.3.2 + tar-fs: 3.0.6 + which: 4.0.0 + transitivePeerDependencies: + - supports-color + gensync@1.0.0-beta.2: {} get-caller-file@2.0.5: {} @@ -13904,6 +14610,8 @@ snapshots: get-port@5.1.1: {} + get-port@7.1.0: {} + get-stdin@4.0.1: {} get-stdin@7.0.0: {} @@ -13936,13 +14644,14 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 - getos@3.2.1: - dependencies: - async: 3.2.5 - - getpass@0.1.7: + get-uri@6.0.3: dependencies: - assert-plus: 1.0.0 + basic-ftp: 5.0.5 + data-uri-to-buffer: 6.0.2 + debug: 4.3.7 + fs-extra: 11.2.0 + transitivePeerDependencies: + - supports-color gh-got@7.1.0: dependencies: @@ -14049,10 +14758,6 @@ snapshots: minipass: 4.2.8 path-scurry: 1.11.1 - global-dirs@3.0.0: - dependencies: - ini: 2.0.0 - globals@11.12.0: {} globals@13.24.0: @@ -14076,6 +14781,20 @@ snapshots: dependencies: get-intrinsic: 1.2.4 + got@12.6.1: + dependencies: + '@sindresorhus/is': 5.6.0 + '@szmarczak/http-timer': 5.0.1 + cacheable-lookup: 7.0.0 + cacheable-request: 10.2.14 + decompress-response: 6.0.0 + form-data-encoder: 2.1.4 + get-stream: 6.0.1 + http2-wrapper: 2.2.1 + lowercase-keys: 3.0.0 + p-cancelable: 3.0.0 + responselike: 3.0.0 + got@8.3.2: dependencies: '@sindresorhus/is': 0.7.0 @@ -14100,6 +14819,8 @@ snapshots: graceful-fs@4.2.11: {} + grapheme-splitter@1.0.4: {} + graphemer@1.4.0: {} handlebars@4.7.8: @@ -14116,7 +14837,7 @@ snapshots: css.escape: 1.5.1 he: 1.2.0 iconv-lite: 0.6.3 - node-fetch: 2.6.7(encoding@0.1.13) + node-fetch: 2.7.0(encoding@0.1.13) webidl-conversions: 7.0.0 whatwg-encoding: 2.0.0 whatwg-mimetype: 3.0.0 @@ -14159,6 +14880,8 @@ snapshots: he@1.2.0: {} + headers-polyfill@4.0.3: {} + hogan.js@3.0.2: dependencies: mkdirp: 0.3.0 @@ -14193,25 +14916,22 @@ snapshots: http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.1 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7 transitivePeerDependencies: - supports-color - http-signature@1.3.6: + http2-wrapper@2.2.1: dependencies: - assert-plus: 1.0.0 - jsprim: 2.0.2 - sshpk: 1.17.0 + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 https-proxy-agent@7.0.5: dependencies: agent-base: 7.1.1 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7 transitivePeerDependencies: - supports-color - human-signals@1.1.1: {} - human-signals@2.1.0: {} human-signals@5.0.0: {} @@ -14252,10 +14972,12 @@ snapshots: ignore@5.3.1: {} - image-size@1.0.0: + image-size@1.1.1: dependencies: queue: 6.0.2 + immediate@3.0.6: {} + immutable@4.0.0: {} import-fresh@2.0.0: @@ -14273,6 +14995,8 @@ snapshots: pkg-dir: 4.2.0 resolve-cwd: 3.0.0 + import-meta-resolve@4.1.0: {} + imurmurhash@0.1.4: {} indent-string@2.1.0: @@ -14296,8 +15020,6 @@ snapshots: ini@1.3.8: {} - ini@2.0.0: {} - ini@4.1.3: {} init-package-json@6.0.3: @@ -14487,11 +15209,6 @@ snapshots: dependencies: is-docker: 3.0.0 - is-installed-globally@0.4.0: - dependencies: - global-dirs: 3.0.0 - is-path-inside: 3.0.3 - is-interactive@1.0.0: {} is-lambda@1.0.1: {} @@ -14502,6 +15219,8 @@ snapshots: is-negative-zero@2.0.3: {} + is-node-process@1.2.0: {} + is-number-object@1.0.6: dependencies: has-tostringtag: 1.0.2 @@ -14520,6 +15239,8 @@ snapshots: is-plain-obj@1.1.0: {} + is-plain-obj@4.1.0: {} + is-plain-object@2.0.4: dependencies: isobject: 3.0.1 @@ -14553,6 +15274,8 @@ snapshots: is-stream@2.0.0: {} + is-stream@2.0.1: {} + is-stream@3.0.0: {} is-string@1.0.7: @@ -14571,8 +15294,6 @@ snapshots: dependencies: which-typed-array: 1.1.15 - is-typedarray@1.0.0: {} - is-unicode-supported@0.1.0: {} is-utf8@0.2.1: {} @@ -14605,13 +15326,11 @@ snapshots: isomorphic-fetch@3.0.0(encoding@0.1.13): dependencies: - node-fetch: 2.6.7(encoding@0.1.13) + node-fetch: 2.7.0(encoding@0.1.13) whatwg-fetch: 3.6.2 transitivePeerDependencies: - encoding - isstream@0.1.2: {} - istanbul-lib-coverage@3.2.2: {} istanbul-lib-instrument@5.2.1: @@ -14632,7 +15351,7 @@ snapshots: istanbul-lib-source-maps@4.0.0: dependencies: - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7 istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: @@ -14641,7 +15360,7 @@ snapshots: istanbul-lib-source-maps@5.0.6: dependencies: '@jridgewell/trace-mapping': 0.3.25 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7 istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: - supports-color @@ -14700,7 +15419,7 @@ snapshots: '@jest/expect': 28.1.3 '@jest/test-result': 28.1.3 '@jest/types': 28.1.3 - '@types/node': 20.12.7 + '@types/node': 22.5.4 chalk: 4.1.2 co: 4.6.0 dedent: 0.7.0 @@ -14718,7 +15437,7 @@ snapshots: transitivePeerDependencies: - supports-color - jest-cli@28.1.3(@types/node@20.12.7): + jest-cli@28.1.3(@types/node@22.5.4): dependencies: '@jest/core': 28.1.3 '@jest/test-result': 28.1.3 @@ -14727,7 +15446,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 import-local: 3.1.0 - jest-config: 28.1.3(@types/node@20.12.7) + jest-config: 28.1.3(@types/node@22.5.4) jest-util: 28.1.3 jest-validate: 28.1.3 prompts: 2.4.2 @@ -14737,7 +15456,7 @@ snapshots: - supports-color - ts-node - jest-config@28.1.3(@types/node@20.12.7): + jest-config@28.1.3(@types/node@22.5.4): dependencies: '@babel/core': 7.25.2 '@jest/test-sequencer': 28.1.3 @@ -14756,13 +15475,13 @@ snapshots: jest-runner: 28.1.3 jest-util: 28.1.3 jest-validate: 28.1.3 - micromatch: 4.0.5 + micromatch: 4.0.8 parse-json: 5.2.0 pretty-format: 28.1.3 slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 20.12.7 + '@types/node': 22.5.4 transitivePeerDependencies: - supports-color @@ -14797,7 +15516,7 @@ snapshots: '@jest/environment': 28.1.3 '@jest/fake-timers': 28.1.3 '@jest/types': 28.1.3 - '@types/node': 20.12.7 + '@types/node': 22.5.4 jest-mock: 28.1.3 jest-util: 28.1.3 @@ -14809,14 +15528,14 @@ snapshots: dependencies: '@jest/types': 28.1.3 '@types/graceful-fs': 4.1.5 - '@types/node': 20.12.7 + '@types/node': 22.5.4 anymatch: 3.1.2 fb-watchman: 2.0.0 graceful-fs: 4.2.11 jest-regex-util: 28.0.2 jest-util: 28.1.3 jest-worker: 28.1.3 - micromatch: 4.0.5 + micromatch: 4.0.8 walker: 1.0.8 optionalDependencies: fsevents: 2.3.3 @@ -14840,7 +15559,7 @@ snapshots: '@types/stack-utils': 2.0.0 chalk: 4.1.2 graceful-fs: 4.2.11 - micromatch: 4.0.5 + micromatch: 4.0.8 pretty-format: 28.1.3 slash: 3.0.0 stack-utils: 2.0.5 @@ -14848,7 +15567,7 @@ snapshots: jest-mock@28.1.3: dependencies: '@jest/types': 28.1.3 - '@types/node': 20.12.7 + '@types/node': 22.5.4 jest-pnp-resolver@1.2.2(jest-resolve@28.1.3): optionalDependencies: @@ -14875,14 +15594,14 @@ snapshots: resolve.exports: 1.1.0 slash: 3.0.0 - jest-runner-eslint@2.2.0(@jest/test-result@28.1.3)(eslint@8.57.0)(jest-runner@28.1.3)(jest@28.1.3(@types/node@20.12.7)): + jest-runner-eslint@2.2.0(@jest/test-result@28.1.3)(eslint@8.57.0)(jest-runner@28.1.3)(jest@28.1.3(@types/node@22.5.4)): dependencies: chalk: 4.1.2 cosmiconfig: 7.1.0 create-jest-runner: 0.11.2(@jest/test-result@28.1.3)(jest-runner@28.1.3) dot-prop: 6.0.1 eslint: 8.57.0 - jest: 28.1.3(@types/node@20.12.7) + jest: 28.1.3(@types/node@22.5.4) transitivePeerDependencies: - '@jest/test-result' - jest-runner @@ -14894,7 +15613,7 @@ snapshots: '@jest/test-result': 28.1.3 '@jest/transform': 28.1.3 '@jest/types': 28.1.3 - '@types/node': 20.12.7 + '@types/node': 22.5.4 chalk: 4.1.2 emittery: 0.10.2 graceful-fs: 4.2.11 @@ -14976,16 +15695,16 @@ snapshots: jest-util@26.6.2: dependencies: '@jest/types': 26.6.2 - '@types/node': 20.12.7 + '@types/node': 22.5.4 chalk: 4.1.2 graceful-fs: 4.2.11 is-ci: 2.0.0 - micromatch: 4.0.5 + micromatch: 4.0.8 jest-util@28.1.3: dependencies: '@jest/types': 28.1.3 - '@types/node': 20.12.7 + '@types/node': 22.5.4 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -15004,7 +15723,7 @@ snapshots: dependencies: '@jest/test-result': 28.1.3 '@jest/types': 28.1.3 - '@types/node': 20.12.7 + '@types/node': 22.5.4 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.10.2 @@ -15013,22 +15732,22 @@ snapshots: jest-worker@26.6.2: dependencies: - '@types/node': 20.12.7 + '@types/node': 22.5.4 merge-stream: 2.0.0 supports-color: 7.2.0 jest-worker@28.1.3: dependencies: - '@types/node': 20.12.7 + '@types/node': 22.5.4 merge-stream: 2.0.0 supports-color: 8.1.1 - jest@28.1.3(@types/node@20.12.7): + jest@28.1.3(@types/node@22.5.4): dependencies: '@jest/core': 28.1.3 '@jest/types': 28.1.3 import-local: 3.1.0 - jest-cli: 28.1.3(@types/node@20.12.7) + jest-cli: 28.1.3(@types/node@22.5.4) transitivePeerDependencies: - '@types/node' - supports-color @@ -15052,8 +15771,6 @@ snapshots: dependencies: argparse: 2.0.1 - jsbn@0.1.1: {} - jsbn@1.1.0: {} jsdom@25.0.0: @@ -15090,6 +15807,8 @@ snapshots: json-buffer@3.0.0: {} + json-buffer@3.0.1: {} + json-parse-better-errors@1.0.2: {} json-parse-even-better-errors@2.3.1: {} @@ -15139,18 +15858,18 @@ snapshots: jsonpointer@5.0.0: {} - jsprim@2.0.2: - dependencies: - assert-plus: 1.0.0 - extsprintf: 1.3.0 - json-schema: 0.4.0 - verror: 1.10.0 - jsx-ast-utils@3.2.0: dependencies: array-includes: 3.1.7 object.assign: 4.1.5 + jszip@3.10.1: + dependencies: + lie: 3.3.0 + pako: 1.0.11 + readable-stream: 2.3.7 + setimmediate: 1.0.5 + just-diff-apply@5.5.0: {} just-diff@6.0.2: {} @@ -15159,11 +15878,19 @@ snapshots: dependencies: json-buffer: 3.0.0 + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + kind-of@6.0.3: {} kleur@3.0.3: {} - lazy-ass@1.6.0: {} + ky@0.33.3: {} + + lazystream@1.0.1: + dependencies: + readable-stream: 2.3.7 lerna@8.1.7(encoding@0.1.13): dependencies: @@ -15284,6 +16011,10 @@ snapshots: transitivePeerDependencies: - supports-color + lie@3.3.0: + dependencies: + immediate: 3.0.6 + lilconfig@3.1.1: {} lines-and-columns@1.1.6: {} @@ -15298,17 +16029,6 @@ snapshots: dependencies: uc.micro: 2.1.0 - listr2@3.10.0(enquirer@2.3.6): - dependencies: - cli-truncate: 2.1.0 - colorette: 1.4.0 - enquirer: 2.3.6 - log-update: 4.0.0 - p-map: 4.0.0 - rxjs: 6.6.7 - through: 2.3.8 - wrap-ansi: 7.0.0 - load-json-file@1.1.0: dependencies: graceful-fs: 4.2.11 @@ -15336,6 +16056,12 @@ snapshots: mlly: 1.7.1 pkg-types: 1.1.3 + locate-app@2.4.39: + dependencies: + '@promptbook/utils': 0.70.0-1 + type-fest: 2.13.0 + userhome: 1.0.0 + locate-path@2.0.0: dependencies: p-locate: 2.0.0 @@ -15358,6 +16084,8 @@ snapshots: lodash._reinterpolate@3.0.0: {} + lodash.clonedeep@4.5.0: {} + lodash.debounce@4.0.8: {} lodash.ismatch@4.4.0: {} @@ -15366,8 +16094,6 @@ snapshots: lodash.merge@4.6.2: {} - lodash.once@4.1.1: {} - lodash.sortby@4.7.0: {} lodash.template@4.5.0: @@ -15381,6 +16107,8 @@ snapshots: lodash.uniq@4.5.0: {} + lodash.zip@4.2.0: {} + lodash@4.17.21: {} log-symbols@4.1.0: @@ -15388,12 +16116,9 @@ snapshots: chalk: 4.1.2 is-unicode-supported: 0.1.0 - log-update@4.0.0: - dependencies: - ansi-escapes: 4.3.2 - cli-cursor: 3.1.0 - slice-ansi: 4.0.0 - wrap-ansi: 6.2.0 + loglevel-plugin-prefix@0.8.4: {} + + loglevel@1.9.2: {} loose-envify@1.4.0: dependencies: @@ -15412,6 +16137,8 @@ snapshots: lowercase-keys@1.0.1: {} + lowercase-keys@3.0.0: {} + lru-cache@10.4.3: {} lru-cache@11.0.0: {} @@ -15424,6 +16151,10 @@ snapshots: dependencies: yallist: 4.0.0 + lru-cache@7.18.3: {} + + lz-string@1.5.0: {} + magic-string@0.25.7: dependencies: sourcemap-codec: 1.4.8 @@ -15436,7 +16167,7 @@ snapshots: dependencies: '@babel/parser': 7.25.6 '@babel/types': 7.25.6 - source-map-js: 1.2.0 + source-map-js: 1.2.1 make-dir@2.1.0: dependencies: @@ -15609,9 +16340,9 @@ snapshots: merge2@1.4.1: {} - micromatch@4.0.5: + micromatch@4.0.8: dependencies: - braces: 3.0.2 + braces: 3.0.3 picomatch: 2.3.1 mime-db@1.52.0: {} @@ -15628,6 +16359,10 @@ snapshots: mimic-response@1.0.1: {} + mimic-response@3.1.0: {} + + mimic-response@4.0.0: {} + min-indent@1.0.1: {} minimatch@10.0.1: @@ -15716,6 +16451,10 @@ snapshots: mitt@2.1.0: {} + mitt@3.0.1: {} + + mkdirp-classic@0.5.3: {} + mkdirp@0.3.0: {} mkdirp@1.0.4: {} @@ -15739,6 +16478,29 @@ snapshots: ms@2.1.2: {} + ms@2.1.3: {} + + msw@2.4.2(typescript@5.5.4): + dependencies: + '@bundled-es-modules/cookie': 2.0.0 + '@bundled-es-modules/statuses': 1.0.1 + '@bundled-es-modules/tough-cookie': 0.1.6 + '@inquirer/confirm': 3.2.0 + '@mswjs/interceptors': 0.29.1 + '@open-draft/until': 2.1.0 + '@types/cookie': 0.6.0 + '@types/statuses': 2.0.5 + chalk: 4.1.2 + headers-polyfill: 4.0.3 + is-node-process: 1.2.0 + outvariant: 1.4.3 + path-to-regexp: 6.2.2 + strict-event-emitter: 0.5.1 + type-fest: 4.15.0 + yargs: 17.7.2 + optionalDependencies: + typescript: 5.5.4 + muggle-string@0.4.1: {} multimatch@5.0.0: @@ -15768,6 +16530,8 @@ snapshots: neo-async@2.6.2: {} + netmask@2.0.2: {} + nice-napi@1.0.2: dependencies: node-addon-api: 3.2.1 @@ -15779,12 +16543,26 @@ snapshots: node-addon-api@3.2.1: optional: true + node-domexception@1.0.0: {} + node-fetch@2.6.7(encoding@0.1.13): dependencies: whatwg-url: 5.0.0 optionalDependencies: encoding: 0.1.13 + node-fetch@2.7.0(encoding@0.1.13): + dependencies: + whatwg-url: 5.0.0 + optionalDependencies: + encoding: 0.1.13 + + node-fetch@3.3.2: + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + node-gyp-build@4.5.0: optional: true @@ -15847,6 +16625,8 @@ snapshots: query-string: 5.1.1 sort-keys: 2.0.0 + normalize-url@8.0.1: {} + npm-bundled@3.0.1: dependencies: npm-normalize-package-bin: 3.0.1 @@ -16077,10 +16857,12 @@ snapshots: os-tmpdir@1.0.2: {} - ospath@1.2.2: {} + outvariant@1.4.3: {} p-cancelable@0.4.1: {} + p-cancelable@3.0.0: {} + p-finally@1.0.0: {} p-is-promise@1.1.0: {} @@ -16144,6 +16926,24 @@ snapshots: dependencies: p-reduce: 2.1.0 + pac-proxy-agent@7.0.2: + dependencies: + '@tootallnate/quickjs-emscripten': 0.23.0 + agent-base: 7.1.1 + debug: 4.3.7 + get-uri: 6.0.3 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.5 + pac-resolver: 7.0.1 + socks-proxy-agent: 8.0.4 + transitivePeerDependencies: + - supports-color + + pac-resolver@7.0.1: + dependencies: + degenerator: 5.0.1 + netmask: 2.0.2 + package-json-from-dist@1.0.0: {} pacote@18.0.6: @@ -16169,6 +16969,10 @@ snapshots: - bluebird - supports-color + pako@1.0.11: {} + + pako@2.1.0: {} + parent-module@1.0.1: dependencies: callsites: 3.1.0 @@ -16243,7 +17047,7 @@ snapshots: lru-cache: 11.0.0 minipass: 7.1.2 - path-to-regexp@6.2.0: {} + path-to-regexp@6.2.2: {} path-type@1.1.0: dependencies: @@ -16265,9 +17069,7 @@ snapshots: perfect-debounce@1.0.0: {} - performance-now@2.1.0: {} - - picocolors@1.0.1: {} + picocolors@1.1.0: {} picomatch@2.3.1: {} @@ -16319,140 +17121,140 @@ snapshots: possible-typed-array-names@1.0.0: {} - postcss-calc@9.0.1(postcss@8.4.40): + postcss-calc@9.0.1(postcss@8.4.45): dependencies: - postcss: 8.4.40 + postcss: 8.4.45 postcss-selector-parser: 6.0.16 postcss-value-parser: 4.2.0 - postcss-colormin@6.1.0(postcss@8.4.40): + postcss-colormin@6.1.0(postcss@8.4.45): dependencies: browserslist: 4.23.3 caniuse-api: 3.0.0 colord: 2.9.3 - postcss: 8.4.40 + postcss: 8.4.45 postcss-value-parser: 4.2.0 - postcss-convert-values@6.1.0(postcss@8.4.40): + postcss-convert-values@6.1.0(postcss@8.4.45): dependencies: browserslist: 4.23.3 - postcss: 8.4.40 + postcss: 8.4.45 postcss-value-parser: 4.2.0 - postcss-discard-comments@6.0.2(postcss@8.4.40): + postcss-discard-comments@6.0.2(postcss@8.4.45): dependencies: - postcss: 8.4.40 + postcss: 8.4.45 - postcss-discard-duplicates@6.0.3(postcss@8.4.40): + postcss-discard-duplicates@6.0.3(postcss@8.4.45): dependencies: - postcss: 8.4.40 + postcss: 8.4.45 - postcss-discard-empty@6.0.3(postcss@8.4.40): + postcss-discard-empty@6.0.3(postcss@8.4.45): dependencies: - postcss: 8.4.40 + postcss: 8.4.45 - postcss-discard-overridden@6.0.2(postcss@8.4.40): + postcss-discard-overridden@6.0.2(postcss@8.4.45): dependencies: - postcss: 8.4.40 + postcss: 8.4.45 - postcss-merge-longhand@6.0.5(postcss@8.4.40): + postcss-merge-longhand@6.0.5(postcss@8.4.45): dependencies: - postcss: 8.4.40 + postcss: 8.4.45 postcss-value-parser: 4.2.0 - stylehacks: 6.1.1(postcss@8.4.40) + stylehacks: 6.1.1(postcss@8.4.45) - postcss-merge-rules@6.1.1(postcss@8.4.40): + postcss-merge-rules@6.1.1(postcss@8.4.45): dependencies: browserslist: 4.23.3 caniuse-api: 3.0.0 - cssnano-utils: 4.0.2(postcss@8.4.40) - postcss: 8.4.40 + cssnano-utils: 4.0.2(postcss@8.4.45) + postcss: 8.4.45 postcss-selector-parser: 6.0.16 - postcss-minify-font-values@6.1.0(postcss@8.4.40): + postcss-minify-font-values@6.1.0(postcss@8.4.45): dependencies: - postcss: 8.4.40 + postcss: 8.4.45 postcss-value-parser: 4.2.0 - postcss-minify-gradients@6.0.3(postcss@8.4.40): + postcss-minify-gradients@6.0.3(postcss@8.4.45): dependencies: colord: 2.9.3 - cssnano-utils: 4.0.2(postcss@8.4.40) - postcss: 8.4.40 + cssnano-utils: 4.0.2(postcss@8.4.45) + postcss: 8.4.45 postcss-value-parser: 4.2.0 - postcss-minify-params@6.1.0(postcss@8.4.40): + postcss-minify-params@6.1.0(postcss@8.4.45): dependencies: browserslist: 4.23.3 - cssnano-utils: 4.0.2(postcss@8.4.40) - postcss: 8.4.40 + cssnano-utils: 4.0.2(postcss@8.4.45) + postcss: 8.4.45 postcss-value-parser: 4.2.0 - postcss-minify-selectors@6.0.4(postcss@8.4.40): + postcss-minify-selectors@6.0.4(postcss@8.4.45): dependencies: - postcss: 8.4.40 + postcss: 8.4.45 postcss-selector-parser: 6.0.16 - postcss-normalize-charset@6.0.2(postcss@8.4.40): + postcss-normalize-charset@6.0.2(postcss@8.4.45): dependencies: - postcss: 8.4.40 + postcss: 8.4.45 - postcss-normalize-display-values@6.0.2(postcss@8.4.40): + postcss-normalize-display-values@6.0.2(postcss@8.4.45): dependencies: - postcss: 8.4.40 + postcss: 8.4.45 postcss-value-parser: 4.2.0 - postcss-normalize-positions@6.0.2(postcss@8.4.40): + postcss-normalize-positions@6.0.2(postcss@8.4.45): dependencies: - postcss: 8.4.40 + postcss: 8.4.45 postcss-value-parser: 4.2.0 - postcss-normalize-repeat-style@6.0.2(postcss@8.4.40): + postcss-normalize-repeat-style@6.0.2(postcss@8.4.45): dependencies: - postcss: 8.4.40 + postcss: 8.4.45 postcss-value-parser: 4.2.0 - postcss-normalize-string@6.0.2(postcss@8.4.40): + postcss-normalize-string@6.0.2(postcss@8.4.45): dependencies: - postcss: 8.4.40 + postcss: 8.4.45 postcss-value-parser: 4.2.0 - postcss-normalize-timing-functions@6.0.2(postcss@8.4.40): + postcss-normalize-timing-functions@6.0.2(postcss@8.4.45): dependencies: - postcss: 8.4.40 + postcss: 8.4.45 postcss-value-parser: 4.2.0 - postcss-normalize-unicode@6.1.0(postcss@8.4.40): + postcss-normalize-unicode@6.1.0(postcss@8.4.45): dependencies: browserslist: 4.23.3 - postcss: 8.4.40 + postcss: 8.4.45 postcss-value-parser: 4.2.0 - postcss-normalize-url@6.0.2(postcss@8.4.40): + postcss-normalize-url@6.0.2(postcss@8.4.45): dependencies: - postcss: 8.4.40 + postcss: 8.4.45 postcss-value-parser: 4.2.0 - postcss-normalize-whitespace@6.0.2(postcss@8.4.40): + postcss-normalize-whitespace@6.0.2(postcss@8.4.45): dependencies: - postcss: 8.4.40 + postcss: 8.4.45 postcss-value-parser: 4.2.0 - postcss-ordered-values@6.0.2(postcss@8.4.40): + postcss-ordered-values@6.0.2(postcss@8.4.45): dependencies: - cssnano-utils: 4.0.2(postcss@8.4.40) - postcss: 8.4.40 + cssnano-utils: 4.0.2(postcss@8.4.45) + postcss: 8.4.45 postcss-value-parser: 4.2.0 - postcss-reduce-initial@6.1.0(postcss@8.4.40): + postcss-reduce-initial@6.1.0(postcss@8.4.45): dependencies: browserslist: 4.23.3 caniuse-api: 3.0.0 - postcss: 8.4.40 + postcss: 8.4.45 - postcss-reduce-transforms@6.0.2(postcss@8.4.40): + postcss-reduce-transforms@6.0.2(postcss@8.4.45): dependencies: - postcss: 8.4.40 + postcss: 8.4.45 postcss-value-parser: 4.2.0 postcss-selector-parser@6.0.16: @@ -16460,24 +17262,24 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss-svgo@6.0.3(postcss@8.4.40): + postcss-svgo@6.0.3(postcss@8.4.45): dependencies: - postcss: 8.4.40 + postcss: 8.4.45 postcss-value-parser: 4.2.0 svgo: 3.2.0 - postcss-unique-selectors@6.0.4(postcss@8.4.40): + postcss-unique-selectors@6.0.4(postcss@8.4.45): dependencies: - postcss: 8.4.40 + postcss: 8.4.45 postcss-selector-parser: 6.0.16 postcss-value-parser@4.2.0: {} - postcss@8.4.40: + postcss@8.4.45: dependencies: nanoid: 3.3.7 - picocolors: 1.0.1 - source-map-js: 1.2.0 + picocolors: 1.1.0 + source-map-js: 1.2.1 preact@10.11.3: {} @@ -16491,6 +17293,12 @@ snapshots: pretty-bytes@6.1.1: {} + pretty-format@27.5.1: + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + pretty-format@28.1.3: dependencies: '@jest/schemas': 28.1.3 @@ -16516,6 +17324,8 @@ snapshots: proggy@2.0.0: {} + progress@2.0.3: {} + promise-all-reject-late@1.0.1: {} promise-call-limit@3.0.1: {} @@ -16546,7 +17356,18 @@ snapshots: protocols@2.0.1: {} - proxy-from-env@1.0.0: {} + proxy-agent@6.3.1: + dependencies: + agent-base: 7.1.1 + debug: 4.3.7 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.5 + lru-cache: 7.18.3 + pac-proxy-agent: 7.0.2 + proxy-from-env: 1.1.0 + socks-proxy-agent: 8.0.4 + transitivePeerDependencies: + - supports-color proxy-from-env@1.1.0: {} @@ -16572,20 +17393,34 @@ snapshots: punycode@2.3.1: {} - q@1.5.1: {} - - qs@6.10.4: + puppeteer-core@21.11.0(encoding@0.1.13): dependencies: - side-channel: 1.0.6 + '@puppeteer/browsers': 1.9.1 + chromium-bidi: 0.5.8(devtools-protocol@0.0.1232444) + cross-fetch: 4.0.0(encoding@0.1.13) + debug: 4.3.4 + devtools-protocol: 0.0.1232444 + ws: 8.16.0 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + + q@1.5.1: {} qs@6.9.7: {} + query-selector-shadow-dom@1.0.1: {} + query-string@5.1.1: dependencies: decode-uri-component: 0.2.0 object-assign: 4.1.1 strict-uri-encode: 1.1.0 + queue-tick@1.0.1: {} + queue@6.0.2: dependencies: inherits: 2.0.4 @@ -16594,12 +17429,16 @@ snapshots: quick-lru@4.0.1: {} + quick-lru@5.1.1: {} + randombytes@2.1.0: dependencies: safe-buffer: 5.2.1 react-is@16.13.1: {} + react-is@17.0.2: {} + react-is@18.2.0: {} read-cmd-shim@4.0.0: {} @@ -16664,6 +17503,18 @@ snapshots: string_decoder: 1.3.0 util-deprecate: 1.0.2 + readable-stream@4.5.2: + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + + readdir-glob@1.1.3: + dependencies: + minimatch: 5.1.6 + readdirp@3.6.0: dependencies: picomatch: 2.3.1 @@ -16738,10 +17589,6 @@ snapshots: request-light@0.7.0: {} - request-progress@3.0.0: - dependencies: - throttleit: 1.0.0 - require-directory@2.1.1: {} require-from-string@2.0.2: {} @@ -16750,6 +17597,8 @@ snapshots: reselect@4.1.7: {} + resolve-alpn@1.2.1: {} + resolve-cwd@3.0.0: dependencies: resolve-from: 5.0.0 @@ -16780,6 +17629,14 @@ snapshots: dependencies: lowercase-keys: 1.0.1 + responselike@3.0.0: + dependencies: + lowercase-keys: 3.0.0 + + resq@1.11.0: + dependencies: + fast-deep-equal: 2.0.1 + restore-cursor@2.0.0: dependencies: onetime: 2.0.1 @@ -16794,6 +17651,8 @@ snapshots: reusify@1.0.4: {} + rgb2hex@0.2.5: {} + rimraf@3.0.2: dependencies: glob: 7.2.3 @@ -16824,13 +17683,13 @@ snapshots: transitivePeerDependencies: - rollup - rollup-plugin-sourcemaps@0.6.3(@types/node@20.12.7)(rollup@3.29.4): + rollup-plugin-sourcemaps@0.6.3(@types/node@22.5.4)(rollup@3.29.4): dependencies: '@rollup/pluginutils': 3.1.0(rollup@3.29.4) rollup: 3.29.4 source-map-resolve: 0.6.0 optionalDependencies: - '@types/node': 20.12.7 + '@types/node': 22.5.4 rollup-plugin-terser@7.0.2(rollup@2.79.1): dependencies: @@ -16856,25 +17715,26 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - rollup@4.14.1: + rollup@4.21.2: dependencies: '@types/estree': 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.14.1 - '@rollup/rollup-android-arm64': 4.14.1 - '@rollup/rollup-darwin-arm64': 4.14.1 - '@rollup/rollup-darwin-x64': 4.14.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.14.1 - '@rollup/rollup-linux-arm64-gnu': 4.14.1 - '@rollup/rollup-linux-arm64-musl': 4.14.1 - '@rollup/rollup-linux-powerpc64le-gnu': 4.14.1 - '@rollup/rollup-linux-riscv64-gnu': 4.14.1 - '@rollup/rollup-linux-s390x-gnu': 4.14.1 - '@rollup/rollup-linux-x64-gnu': 4.14.1 - '@rollup/rollup-linux-x64-musl': 4.14.1 - '@rollup/rollup-win32-arm64-msvc': 4.14.1 - '@rollup/rollup-win32-ia32-msvc': 4.14.1 - '@rollup/rollup-win32-x64-msvc': 4.14.1 + '@rollup/rollup-android-arm-eabi': 4.21.2 + '@rollup/rollup-android-arm64': 4.21.2 + '@rollup/rollup-darwin-arm64': 4.21.2 + '@rollup/rollup-darwin-x64': 4.21.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.21.2 + '@rollup/rollup-linux-arm-musleabihf': 4.21.2 + '@rollup/rollup-linux-arm64-gnu': 4.21.2 + '@rollup/rollup-linux-arm64-musl': 4.21.2 + '@rollup/rollup-linux-powerpc64le-gnu': 4.21.2 + '@rollup/rollup-linux-riscv64-gnu': 4.21.2 + '@rollup/rollup-linux-s390x-gnu': 4.21.2 + '@rollup/rollup-linux-x64-gnu': 4.21.2 + '@rollup/rollup-linux-x64-musl': 4.21.2 + '@rollup/rollup-win32-arm64-msvc': 4.21.2 + '@rollup/rollup-win32-ia32-msvc': 4.21.2 + '@rollup/rollup-win32-x64-msvc': 4.21.2 fsevents: 2.3.3 rrweb-cssom@0.6.0: {} @@ -16904,6 +17764,8 @@ snapshots: dependencies: tslib: 2.6.2 + safaridriver@0.1.2: {} + safe-array-concat@1.1.2: dependencies: call-bind: 1.0.7 @@ -17005,7 +17867,7 @@ snapshots: dependencies: chokidar: 3.6.0 immutable: 4.0.0 - source-map-js: 1.2.0 + source-map-js: 1.2.1 saxes@6.0.0: dependencies: @@ -17030,6 +17892,10 @@ snapshots: semver@7.6.3: {} + serialize-error@11.0.3: + dependencies: + type-fest: 2.19.0 + serialize-javascript@4.0.0: dependencies: randombytes: 2.1.0 @@ -17052,6 +17918,8 @@ snapshots: functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 + setimmediate@1.0.5: {} + shallow-clone@3.0.1: dependencies: kind-of: 6.0.3 @@ -17114,24 +17982,12 @@ snapshots: slash@4.0.0: {} - slice-ansi@3.0.0: - dependencies: - ansi-styles: 4.2.1 - astral-regex: 2.0.0 - is-fullwidth-code-point: 3.0.0 - - slice-ansi@4.0.0: - dependencies: - ansi-styles: 4.2.1 - astral-regex: 2.0.0 - is-fullwidth-code-point: 3.0.0 - smart-buffer@4.2.0: {} socks-proxy-agent@8.0.4: dependencies: agent-base: 7.1.1 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7 socks: 2.8.3 transitivePeerDependencies: - supports-color @@ -17145,7 +18001,7 @@ snapshots: dependencies: is-plain-obj: 1.1.0 - source-map-js@1.2.0: {} + source-map-js@1.2.1: {} source-map-resolve@0.6.0: dependencies: @@ -17170,6 +18026,8 @@ snapshots: sourcemap-codec@1.4.8: {} + spacetrim@0.11.39: {} + spawn-command@0.0.2: {} spdx-correct@3.1.0: @@ -17194,6 +18052,8 @@ snapshots: dependencies: readable-stream: 3.6.0 + split2@4.2.0: {} + split@1.0.1: dependencies: through: 2.3.8 @@ -17202,18 +18062,6 @@ snapshots: sprintf-js@1.1.3: {} - sshpk@1.17.0: - dependencies: - asn1: 0.2.4 - assert-plus: 1.0.0 - bcrypt-pbkdf: 1.0.2 - dashdash: 1.14.1 - ecc-jsbn: 0.1.2 - getpass: 0.1.7 - jsbn: 0.1.1 - safer-buffer: 2.1.2 - tweetnacl: 0.14.5 - ssri@10.0.6: dependencies: minipass: 7.1.2 @@ -17226,12 +18074,24 @@ snapshots: statuses@1.5.0: {} + statuses@2.0.1: {} + std-env@3.7.0: {} stop-iteration-iterator@1.0.0: dependencies: internal-slot: 1.0.7 + streamx@2.20.0: + dependencies: + fast-fifo: 1.3.2 + queue-tick: 1.0.1 + text-decoder: 1.1.1 + optionalDependencies: + bare-events: 2.4.2 + + strict-event-emitter@0.5.1: {} + strict-uri-encode@1.1.0: {} string-length@4.0.1: @@ -17360,16 +18220,18 @@ snapshots: dependencies: acorn: 8.12.1 + strnum@1.0.5: {} + strong-log-transformer@2.1.0: dependencies: duplexer: 0.1.1 minimist: 1.2.8 through: 2.3.8 - stylehacks@6.1.1(postcss@8.4.40): + stylehacks@6.1.1(postcss@8.4.45): dependencies: browserslist: 4.23.3 - postcss: 8.4.40 + postcss: 8.4.45 postcss-selector-parser: 6.0.16 supports-color@5.5.0: @@ -17401,10 +18263,24 @@ snapshots: css-tree: 2.3.1 css-what: 6.1.0 csso: 5.0.5 - picocolors: 1.0.1 + picocolors: 1.1.0 symbol-tree@3.2.4: {} + tar-fs@3.0.4: + dependencies: + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 3.1.7 + + tar-fs@3.0.6: + dependencies: + pump: 3.0.0 + tar-stream: 3.1.7 + optionalDependencies: + bare-fs: 2.3.3 + bare-path: 2.1.3 + tar-stream@2.2.0: dependencies: bl: 4.1.0 @@ -17413,6 +18289,12 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.0 + tar-stream@3.1.7: + dependencies: + b4a: 1.6.6 + fast-fifo: 1.3.2 + streamx: 2.20.0 + tar@6.2.1: dependencies: chownr: 2.0.0 @@ -17433,7 +18315,7 @@ snapshots: tempy@0.6.0: dependencies: - is-stream: 2.0.0 + is-stream: 2.0.1 temp-dir: 2.0.0 type-fest: 0.16.0 unique-string: 2.0.0 @@ -17462,14 +18344,16 @@ snapshots: glob: 10.4.5 minimatch: 9.0.5 + text-decoder@1.1.1: + dependencies: + b4a: 1.6.6 + text-extensions@1.9.0: {} text-table@0.2.0: {} throat@6.0.2: {} - throttleit@1.0.0: {} - through2@2.0.5: dependencies: readable-stream: 2.3.7 @@ -17587,17 +18471,11 @@ snapshots: tuf-js@2.2.1: dependencies: '@tufjs/models': 2.0.1 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7 make-fetch-happen: 13.0.1 transitivePeerDependencies: - supports-color - tunnel-agent@0.6.0: - dependencies: - safe-buffer: 5.2.1 - - tweetnacl@0.14.5: {} - type-check@0.4.0: dependencies: prelude-ls: 1.2.1 @@ -17620,6 +18498,10 @@ snapshots: type-fest@0.8.1: {} + type-fest@2.13.0: {} + + type-fest@2.19.0: {} + type-fest@4.15.0: {} typed-array-buffer@1.0.2: @@ -17678,7 +18560,12 @@ snapshots: has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 - undici-types@5.26.5: {} + unbzip2-stream@1.4.3: + dependencies: + buffer: 5.7.1 + through: 2.3.8 + + undici-types@6.19.8: {} unhead@1.9.4: dependencies: @@ -17716,9 +18603,9 @@ snapshots: transitivePeerDependencies: - rollup - unimport@3.7.1(rollup@4.14.1): + unimport@3.7.1(rollup@4.21.2): dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.14.1) + '@rollup/pluginutils': 5.1.0(rollup@4.21.2) acorn: 8.12.1 escape-string-regexp: 5.0.0 estree-walker: 3.0.3 @@ -17767,31 +18654,31 @@ snapshots: transitivePeerDependencies: - rollup - unplugin-auto-import@0.17.5(rollup@4.14.1): + unplugin-auto-import@0.17.5(rollup@4.21.2): dependencies: '@antfu/utils': 0.7.10 - '@rollup/pluginutils': 5.1.0(rollup@4.14.1) + '@rollup/pluginutils': 5.1.0(rollup@4.21.2) fast-glob: 3.3.2 local-pkg: 0.5.0 magic-string: 0.30.11 minimatch: 9.0.5 - unimport: 3.7.1(rollup@4.14.1) + unimport: 3.7.1(rollup@4.21.2) unplugin: 1.12.1 transitivePeerDependencies: - rollup - unplugin-fonts@1.0.3(vite@5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3)): + unplugin-fonts@1.0.3(vite@5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3)): dependencies: fast-glob: 3.3.2 unplugin: 1.12.1 - vite: 5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3) + vite: 5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3) unplugin-vue-components@0.27.4(@babel/parser@7.25.6)(rollup@3.29.4)(vue@3.4.27(typescript@5.5.4)): dependencies: '@antfu/utils': 0.7.10 '@rollup/pluginutils': 5.1.0(rollup@3.29.4) chokidar: 3.6.0 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7 fast-glob: 3.3.2 local-pkg: 0.5.0 magic-string: 0.30.11 @@ -17805,12 +18692,12 @@ snapshots: - rollup - supports-color - unplugin-vue-components@0.27.4(@babel/parser@7.25.6)(rollup@4.14.1)(vue@3.4.27(typescript@5.5.4)): + unplugin-vue-components@0.27.4(@babel/parser@7.25.6)(rollup@4.21.2)(vue@3.4.27(typescript@5.5.4)): dependencies: '@antfu/utils': 0.7.10 - '@rollup/pluginutils': 5.1.0(rollup@4.14.1) + '@rollup/pluginutils': 5.1.0(rollup@4.21.2) chokidar: 3.6.0 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7 fast-glob: 3.3.2 local-pkg: 0.5.0 magic-string: 0.30.11 @@ -17831,8 +18718,6 @@ snapshots: webpack-sources: 3.2.3 webpack-virtual-modules: 0.6.2 - untildify@4.0.0: {} - upath@1.2.0: {} upath@2.0.1: {} @@ -17841,7 +18726,7 @@ snapshots: dependencies: browserslist: 4.23.3 escalade: 3.1.2 - picocolors: 1.0.1 + picocolors: 1.1.0 uri-js@4.2.2: dependencies: @@ -17853,6 +18738,10 @@ snapshots: url-to-options@1.0.1: {} + urlpattern-polyfill@10.0.0: {} + + userhome@1.0.0: {} + util-deprecate@1.0.2: {} utils-merge@1.0.1: {} @@ -17861,8 +18750,6 @@ snapshots: uuid@3.4.0: {} - uuid@8.3.2: {} - v8-to-istanbul@9.0.1: dependencies: '@jridgewell/trace-mapping': 0.3.25 @@ -17884,19 +18771,13 @@ snapshots: type-fest: 4.15.0 vue: 3.4.27(typescript@5.5.4) - verror@1.10.0: - dependencies: - assert-plus: 1.0.0 - core-util-is: 1.0.2 - extsprintf: 1.4.0 - - vite-node@2.0.5(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3): + vite-node@2.0.5(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3): dependencies: cac: 6.7.14 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7 pathe: 1.1.2 tinyrainbow: 1.2.0 - vite: 5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3) + vite: 5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3) transitivePeerDependencies: - '@types/node' - less @@ -17908,122 +18789,122 @@ snapshots: - supports-color - terser - vite-plugin-inspect@0.8.3(rollup@4.14.1)(vite@5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3)): + vite-plugin-inspect@0.8.3(rollup@4.21.2)(vite@5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3)): dependencies: '@antfu/utils': 0.7.10 - '@rollup/pluginutils': 5.1.0(rollup@4.14.1) - debug: 4.3.6(supports-color@8.1.1) + '@rollup/pluginutils': 5.1.0(rollup@4.21.2) + debug: 4.3.7 error-stack-parser-es: 0.1.1 fs-extra: 11.2.0 open: 10.1.0 perfect-debounce: 1.0.0 - picocolors: 1.0.1 + picocolors: 1.1.0 sirv: 2.0.4 - vite: 5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3) + vite: 5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3) transitivePeerDependencies: - rollup - supports-color - vite-plugin-md@0.21.5(encoding@0.1.13)(vite@5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3)): + vite-plugin-md@0.21.5(encoding@0.1.13)(vite@5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3)): dependencies: - '@yankeeinlondon/builder-api': 1.4.1(@vitejs/plugin-vue@5.0.4(vite@5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3))(vue@3.4.27(typescript@5.5.4)))(encoding@0.1.13)(vite@5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3)) + '@yankeeinlondon/builder-api': 1.4.1(@vitejs/plugin-vue@5.0.4(vite@5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3))(vue@3.4.27(typescript@5.5.4)))(encoding@0.1.13)(vite@5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3)) '@yankeeinlondon/gray-matter': 6.2.1 '@yankeeinlondon/happy-wrapper': 2.10.1(encoding@0.1.13) markdown-it: 13.0.2 - source-map-js: 1.2.0 - vite: 5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3) + source-map-js: 1.2.1 + vite: 5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3) transitivePeerDependencies: - encoding - vite-plugin-md@0.22.5(@vitejs/plugin-vue@5.0.4(vite@5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3))(vue@3.4.27(typescript@5.5.4)))(encoding@0.1.13)(vite@5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3)): + vite-plugin-md@0.22.5(@vitejs/plugin-vue@5.0.4(vite@5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3))(vue@3.4.27(typescript@5.5.4)))(encoding@0.1.13)(vite@5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3)): dependencies: - '@vitejs/plugin-vue': 5.0.4(vite@5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3))(vue@3.4.27(typescript@5.5.4)) - '@yankeeinlondon/builder-api': 1.4.1(@vitejs/plugin-vue@5.0.4(vite@5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3))(vue@3.4.27(typescript@5.5.4)))(encoding@0.1.13)(vite@5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3)) + '@vitejs/plugin-vue': 5.0.4(vite@5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3))(vue@3.4.27(typescript@5.5.4)) + '@yankeeinlondon/builder-api': 1.4.1(@vitejs/plugin-vue@5.0.4(vite@5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3))(vue@3.4.27(typescript@5.5.4)))(encoding@0.1.13)(vite@5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3)) '@yankeeinlondon/gray-matter': 6.2.1 '@yankeeinlondon/happy-wrapper': 2.10.1(encoding@0.1.13) markdown-it: 13.0.2 - source-map-js: 1.2.0 - vite: 5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3) + source-map-js: 1.2.1 + vite: 5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3) transitivePeerDependencies: - encoding - vite-plugin-pages@0.32.1(@vue/compiler-sfc@3.4.27)(vite@5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3)): + vite-plugin-pages@0.32.1(@vue/compiler-sfc@3.4.27)(vite@5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3)): dependencies: '@types/debug': 4.1.12 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7 deep-equal: 2.2.3 extract-comments: 1.1.0 fast-glob: 3.3.2 json5: 2.2.3 local-pkg: 0.5.0 - picocolors: 1.0.1 - vite: 5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3) - yaml: 2.4.1 + picocolors: 1.1.0 + vite: 5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3) + yaml: 2.5.1 optionalDependencies: '@vue/compiler-sfc': 3.4.27 transitivePeerDependencies: - supports-color - vite-plugin-pwa@0.17.5(@types/babel__core@7.1.19)(vite@5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3)): + vite-plugin-pwa@0.17.5(@types/babel__core@7.1.19)(vite@5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3)): dependencies: - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7 fast-glob: 3.3.2 pretty-bytes: 6.1.1 - vite: 5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3) + vite: 5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3) workbox-build: 7.0.0(@types/babel__core@7.1.19) workbox-window: 7.0.0 transitivePeerDependencies: - '@types/babel__core' - supports-color - vite-plugin-vue-layouts@0.11.0(vite@5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3))(vue-router@4.3.0(vue@3.4.27(typescript@5.5.4)))(vue@3.4.27(typescript@5.5.4)): + vite-plugin-vue-layouts@0.11.0(vite@5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3))(vue-router@4.3.0(vue@3.4.27(typescript@5.5.4)))(vue@3.4.27(typescript@5.5.4)): dependencies: - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7 fast-glob: 3.3.2 - vite: 5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3) + vite: 5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3) vue: 3.4.27(typescript@5.5.4) vue-router: 4.3.0(vue@3.4.27(typescript@5.5.4)) transitivePeerDependencies: - supports-color - vite-plugin-vuetify@2.0.4(vite@5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3))(vue@3.4.27(typescript@5.5.4))(vuetify@3.7.1): + vite-plugin-vuetify@2.0.4(vite@5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3))(vue@3.4.27(typescript@5.5.4))(vuetify@3.7.1): dependencies: '@vuetify/loader-shared': 2.0.3(vue@3.4.27(typescript@5.5.4))(vuetify@3.7.1(typescript@5.5.4)(vite-plugin-vuetify@2.0.4)(vue@3.4.27(typescript@5.5.4))) - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7 upath: 2.0.1 - vite: 5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3) + vite: 5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3) vue: 3.4.27(typescript@5.5.4) vuetify: 3.7.1(typescript@5.5.4)(vite-plugin-vuetify@2.0.4)(vue@3.4.27(typescript@5.5.4)) transitivePeerDependencies: - supports-color optional: true - vite-plugin-vuetify@2.0.4(vite@5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3))(vue@3.4.27(typescript@5.5.4))(vuetify@packages+vuetify): + vite-plugin-vuetify@2.0.4(vite@5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3))(vue@3.4.27(typescript@5.5.4))(vuetify@packages+vuetify): dependencies: '@vuetify/loader-shared': 2.0.3(vue@3.4.27(typescript@5.5.4))(vuetify@packages+vuetify) - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7 upath: 2.0.1 - vite: 5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3) + vite: 5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3) vue: 3.4.27(typescript@5.5.4) vuetify: link:packages/vuetify transitivePeerDependencies: - supports-color - vite-plugin-warmup@0.1.0(vite@5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3)): + vite-plugin-warmup@0.1.0(vite@5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3)): dependencies: fast-glob: 3.3.2 - vite: 5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3) + vite: 5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3) - vite-ssr@0.17.1(@vitejs/plugin-vue@5.0.4(vite@5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3))(vue@3.4.27(typescript@5.5.4)))(@vueuse/head@1.3.1(vue@3.4.27(typescript@5.5.4)))(encoding@0.1.13)(rollup@3.29.4)(vite@5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3))(vue-router@4.3.0(vue@3.4.27(typescript@5.5.4)))(vue@3.4.27(typescript@5.5.4)): + vite-ssr@0.17.1(@vitejs/plugin-vue@5.0.4(vite@5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3))(vue@3.4.27(typescript@5.5.4)))(@vueuse/head@1.3.1(vue@3.4.27(typescript@5.5.4)))(encoding@0.1.13)(rollup@3.29.4)(vite@5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3))(vue-router@4.3.0(vue@3.4.27(typescript@5.5.4)))(vue@3.4.27(typescript@5.5.4)): dependencies: '@rollup/plugin-replace': 3.0.0(rollup@3.29.4) '@vue/server-renderer': 3.4.27(vue@3.4.27(typescript@5.5.4)) chalk: 4.1.2 connect: 3.7.0 - node-fetch: 2.6.7(encoding@0.1.13) - vite: 5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3) + node-fetch: 2.7.0(encoding@0.1.13) + vite: 5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3) optionalDependencies: - '@vitejs/plugin-vue': 5.0.4(vite@5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3))(vue@3.4.27(typescript@5.5.4)) + '@vitejs/plugin-vue': 5.0.4(vite@5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3))(vue@3.4.27(typescript@5.5.4)) '@vueuse/head': 1.3.1(vue@3.4.27(typescript@5.5.4)) vue: 3.4.27(typescript@5.5.4) vue-router: 4.3.0(vue@3.4.27(typescript@5.5.4)) @@ -18032,19 +18913,19 @@ snapshots: - rollup - supports-color - vite@5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3): + vite@5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3): dependencies: esbuild: 0.21.5 - postcss: 8.4.40 - rollup: 4.14.1 + postcss: 8.4.45 + rollup: 4.21.2 optionalDependencies: - '@types/node': 20.12.7 + '@types/node': 22.5.4 fsevents: 2.3.3 sass: 1.77.8 sass-embedded: 1.77.8 terser: 5.31.3 - vitest@2.0.5(@types/node@20.12.7)(happy-dom@8.9.0(encoding@0.1.13))(jsdom@25.0.0)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3): + vitest@2.0.5(@types/node@22.5.4)(@vitest/browser@2.0.5)(@vitest/ui@2.0.5)(happy-dom@8.9.0(encoding@0.1.13))(jsdom@25.0.0)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3): dependencies: '@ampproject/remapping': 2.3.0 '@vitest/expect': 2.0.5 @@ -18054,7 +18935,7 @@ snapshots: '@vitest/spy': 2.0.5 '@vitest/utils': 2.0.5 chai: 5.1.1 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7 execa: 8.0.1 magic-string: 0.30.11 pathe: 1.1.2 @@ -18062,11 +18943,13 @@ snapshots: tinybench: 2.9.0 tinypool: 1.0.1 tinyrainbow: 1.2.0 - vite: 5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3) - vite-node: 2.0.5(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3) + vite: 5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3) + vite-node: 2.0.5(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 20.12.7 + '@types/node': 22.5.4 + '@vitest/browser': 2.0.5(typescript@5.5.4)(vitest@2.0.5)(webdriverio@8.40.5(encoding@0.1.13)) + '@vitest/ui': 2.0.5(vitest@2.0.5) happy-dom: 8.9.0(encoding@0.1.13) jsdom: 25.0.0 transitivePeerDependencies: @@ -18201,7 +19084,7 @@ snapshots: vue-eslint-parser@9.4.2(eslint@8.57.0): dependencies: - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7 eslint: 8.57.0 eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 @@ -18262,12 +19145,20 @@ snapshots: vue: 3.4.27(typescript@5.5.4) optionalDependencies: typescript: 5.5.4 - vite-plugin-vuetify: 2.0.4(vite@5.4.0(@types/node@20.12.7)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3))(vue@3.4.27(typescript@5.5.4))(vuetify@3.7.1) + vite-plugin-vuetify: 2.0.4(vite@5.4.3(@types/node@22.5.4)(sass-embedded@1.77.8)(sass@1.77.8)(terser@5.31.3))(vue@3.4.27(typescript@5.5.4))(vuetify@3.7.1) w3c-xmlserializer@5.0.0: dependencies: xml-name-validator: 5.0.0 + wait-port@1.1.0: + dependencies: + chalk: 4.1.2 + commander: 9.5.0 + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + walk-up-path@3.0.1: {} walker@1.0.8: @@ -18278,6 +19169,59 @@ snapshots: dependencies: defaults: 1.0.3 + web-streams-polyfill@3.3.3: {} + + webdriver@8.40.3: + dependencies: + '@types/node': 22.5.4 + '@types/ws': 8.5.12 + '@wdio/config': 8.40.3 + '@wdio/logger': 8.38.0 + '@wdio/protocols': 8.40.3 + '@wdio/types': 8.40.3 + '@wdio/utils': 8.40.3 + deepmerge-ts: 5.1.0 + got: 12.6.1 + ky: 0.33.3 + ws: 8.18.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + webdriverio@8.40.5(encoding@0.1.13): + dependencies: + '@types/node': 22.5.4 + '@wdio/config': 8.40.3 + '@wdio/logger': 8.38.0 + '@wdio/protocols': 8.40.3 + '@wdio/repl': 8.40.3 + '@wdio/types': 8.40.3 + '@wdio/utils': 8.40.3 + archiver: 7.0.1 + aria-query: 5.3.0 + css-shorthand-properties: 1.1.1 + css-value: 0.0.1 + devtools-protocol: 0.0.1342118 + grapheme-splitter: 1.0.4 + import-meta-resolve: 4.1.0 + is-plain-obj: 4.1.0 + jszip: 3.10.1 + lodash.clonedeep: 4.5.0 + lodash.zip: 4.2.0 + minimatch: 9.0.5 + puppeteer-core: 21.11.0(encoding@0.1.13) + query-selector-shadow-dom: 1.0.1 + resq: 1.11.0 + rgb2hex: 0.2.5 + serialize-error: 11.0.3 + webdriver: 8.40.3 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + webidl-conversions@3.0.1: {} webidl-conversions@4.0.2: {} @@ -18390,7 +19334,7 @@ snapshots: workbox-build@7.0.0(@types/babel__core@7.1.19): dependencies: - '@apideck/better-ajv-errors': 0.3.1(ajv@8.12.0) + '@apideck/better-ajv-errors': 0.3.1(ajv@8.17.1) '@babel/core': 7.25.2 '@babel/preset-env': 7.25.3(@babel/core@7.25.2) '@babel/runtime': 7.24.4 @@ -18398,7 +19342,7 @@ snapshots: '@rollup/plugin-node-resolve': 11.2.1(rollup@2.79.1) '@rollup/plugin-replace': 2.4.2(rollup@2.79.1) '@surma/rollup-plugin-off-main-thread': 2.2.3 - ajv: 8.12.0 + ajv: 8.17.1 common-tags: 1.8.0 fast-json-stable-stringify: 2.1.0 fs-extra: 9.1.0 @@ -18543,6 +19487,8 @@ snapshots: type-fest: 0.4.1 write-json-file: 3.2.0 + ws@8.16.0: {} + ws@8.18.0: {} xml-name-validator@4.0.0: {} @@ -18563,11 +19509,11 @@ snapshots: dependencies: eslint-visitor-keys: 3.4.3 lodash: 4.17.21 - yaml: 2.4.1 + yaml: 2.5.1 yaml@1.10.2: {} - yaml@2.4.1: {} + yaml@2.5.1: {} yargs-parser@18.1.3: dependencies: @@ -18605,4 +19551,12 @@ snapshots: yocto-queue@0.1.0: {} + yoctocolors-cjs@2.1.2: {} + zhead@2.2.4: {} + + zip-stream@6.0.1: + dependencies: + archiver-utils: 5.0.2 + compress-commons: 6.0.2 + readable-stream: 4.5.2 diff --git a/scripts/rules/cypress-types-reference.js b/scripts/rules/cypress-types-reference.js deleted file mode 100644 index fb19ce3c829..00000000000 --- a/scripts/rules/cypress-types-reference.js +++ /dev/null @@ -1,33 +0,0 @@ -const path = require('upath') - -module.exports = { - meta: { - fixable: 'code', - }, - create (context) { - return { - Program (node) { - const referencePath = path.relative( - path.dirname(context.getFilename()), - path.resolve(__dirname, '../../packages/vuetify/types/cypress') - ) - const cypressTypesReference = node.comments.find(comment => ( - comment.type === 'Line' && - comment.value.trim() === `/ ` - )) - if (!cypressTypesReference) { - context.report({ - loc: { - start: { line: 0, column: 0 }, - end: { line: 0, column: 0 }, - }, - message: 'Missing Cypress types reference', - fix (fixer) { - return fixer.insertTextAfterRange([0, 0], `/// \n`) - }, - }) - } - }, - } - }, -} diff --git a/scripts/rules/sort-imports.js b/scripts/rules/sort-imports.js index a303c3ef917..4aec82f6c37 100644 --- a/scripts/rules/sort-imports.js +++ b/scripts/rules/sort-imports.js @@ -17,7 +17,7 @@ const groups = [ }, { label: 'Utilities', - match: /^@\/util|^vue$|^vue-|^@vue\/|^@jest|^vitest/, + match: /^@\/util|^vue$|^vue-|^@vue\/|^@jest|^@?vitest|^@test$|^@testing-library\//, }, { label: 'Types', diff --git a/scripts/rules/vitest-global-imports.js b/scripts/rules/vitest-global-imports.js index c6175c89f14..fa9d73d49b7 100644 --- a/scripts/rules/vitest-global-imports.js +++ b/scripts/rules/vitest-global-imports.js @@ -12,18 +12,32 @@ module.exports = { node.source.value === 'vitest' )) - if (!vitestGlobalsImport) { + if (!vitestGlobalsImport) return + + const badNodes = vitestGlobalsImport.specifiers.filter(node => ( + ['afterAll', 'afterEach', 'assert', 'beforeAll', 'beforeEach', 'describe', 'expect', 'it', 'vi'] + .includes(node.imported.name) + )) + + if (badNodes.length === vitestGlobalsImport.specifiers.length) { context.report({ - loc: { - start: { line: 0, column: 0 }, - end: { line: 0, column: 0 }, - }, - message: 'Missing vitest import', + node: vitestGlobalsImport, + message: 'Extraneous vitest imports', fix (fixer) { - const firstImport = node.body.find(node => node.type === 'ImportDeclaration') - return fixer.insertTextBefore(firstImport || node, `import { expect, it } from 'vitest'\n`) + const range = vitestGlobalsImport.range + return fixer.removeRange([range[0], range[1] + 1]) }, }) + } else { + for (const node of badNodes) { + context.report({ + node, + message: 'Extraneous vitest import', + fix (fixer) { + return fixer.remove(node) + }, + }) + } } }, } diff --git a/tsconfig.json b/tsconfig.json index b47e090c342..feefcfe3ca8 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -51,6 +51,7 @@ // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ + "allowImportingTsExtensions": true, /* Source Map Options */ // "sourceRoot": "./", /* Specify the location where debugger should locate TypeScript files instead of source locations. */