From 8928eb899b5846c6824158f6d1c5b34b3c51a9b9 Mon Sep 17 00:00:00 2001 From: braks <78412429+bcakmakoglu@users.noreply.github.com> Date: Fri, 7 Oct 2022 17:50:16 +0200 Subject: [PATCH] refactor(tests): Upgrade to cypress 10 --- e2e/cypress.config.ts | 13 ++ e2e/cypress.json | 7 -- .../component/1-store/setElements.cy.ts | 95 +++++++++++++++ .../1-store/setState.cy.ts} | 0 e2e/cypress/component/2-flow/container.cy.ts | 42 +++++++ .../integration/1-store/setElements.spec.ts | 88 -------------- .../integration/2-flow/container.spec.ts | 51 -------- e2e/cypress/plugins/index.ts | 16 --- e2e/cypress/support/commands.ts | 37 ++++++ e2e/cypress/support/component-index.html | 12 ++ e2e/cypress/support/component.ts | 43 +++++++ e2e/cypress/support/index.js | 19 --- e2e/cypress/utils/elements.ts | 45 +++++++ e2e/cypress/utils/index.ts | 1 + e2e/package.json | 5 +- e2e/tsconfig.json | 11 +- e2e/{cypress/plugins => }/vite.config.ts | 3 +- pnpm-lock.yaml | 113 ++---------------- 18 files changed, 310 insertions(+), 291 deletions(-) create mode 100644 e2e/cypress.config.ts delete mode 100644 e2e/cypress.json create mode 100644 e2e/cypress/component/1-store/setElements.cy.ts rename e2e/cypress/{integration/1-store/setState.spec.ts => component/1-store/setState.cy.ts} (100%) create mode 100644 e2e/cypress/component/2-flow/container.cy.ts delete mode 100644 e2e/cypress/integration/1-store/setElements.spec.ts delete mode 100644 e2e/cypress/integration/2-flow/container.spec.ts delete mode 100644 e2e/cypress/plugins/index.ts create mode 100644 e2e/cypress/support/commands.ts create mode 100644 e2e/cypress/support/component-index.html create mode 100644 e2e/cypress/support/component.ts delete mode 100644 e2e/cypress/support/index.js create mode 100644 e2e/cypress/utils/elements.ts create mode 100644 e2e/cypress/utils/index.ts rename e2e/{cypress/plugins => }/vite.config.ts (55%) diff --git a/e2e/cypress.config.ts b/e2e/cypress.config.ts new file mode 100644 index 00000000..a4c6efb1 --- /dev/null +++ b/e2e/cypress.config.ts @@ -0,0 +1,13 @@ +import { defineConfig } from 'cypress' + +export default defineConfig({ + video: false, + screenshotOnRunFailure: false, + retries: 2, + component: { + devServer: { + framework: 'vue', + bundler: 'vite', + }, + }, +}) diff --git a/e2e/cypress.json b/e2e/cypress.json deleted file mode 100644 index 9bd18a0e..00000000 --- a/e2e/cypress.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "testFiles": "cypress/**/*.spec.ts", - "componentFolder": ".", - "video": false, - "screenshotOnRunFailure": false, - "retries": 2 -} diff --git a/e2e/cypress/component/1-store/setElements.cy.ts b/e2e/cypress/component/1-store/setElements.cy.ts new file mode 100644 index 00000000..2d258819 --- /dev/null +++ b/e2e/cypress/component/1-store/setElements.cy.ts @@ -0,0 +1,95 @@ +import { isEdge, isNode, useVueFlow } from '@braks/vue-flow' +import { getElements } from '../../utils' + +const { nodes, edges } = getElements() + +describe('test store action setElements', () => { + const store = useVueFlow() + + it('sets elements', () => { + store.setElements([...nodes, ...edges]) + + expect(store.nodes.value).to.have.length(nodes.length) + expect(store.edges.value).to.have.length(edges.length) + }) + + context('elements pre-set', () => { + it('parses elements to flow-elements', () => { + store.getEdges.value.forEach((edge) => expect(isEdge(edge)).to.be.true) + store.getNodes.value.forEach((node) => expect(isNode(node)).to.be.true) + }) + + it('has correct element ids', () => { + const nodeIds = nodes.map((node) => node.id) + const edgeIds = edges.map((edge) => edge.id) + + store.nodes.value.forEach((el) => expect(nodeIds).to.include(el.id)) + store.edges.value.forEach((el) => expect(edgeIds).to.include(el.id)) + }) + + it('has correct element types', () => { + const nodeTypes = nodes.map((node) => node.type) + store.nodes.value.forEach((el) => expect(nodeTypes).to.include(el.type)) + const edgeTypes = edges.map((edge) => edge.type) + store.edges.value.forEach((el) => expect(edgeTypes).to.include(el.type)) + }) + + describe('test node properties', () => { + it('has correct label', () => { + store.getNodes.value.forEach((el) => { + const node = nodes.find((node) => node.id === el.id) + expect(el.label).to.eq(node?.label) + }) + }) + + it('has correct position', () => { + store.getNodes.value.forEach((el) => { + const node = nodes.find((node) => node.id === el.id) + expect(JSON.stringify(el.position)).to.eq(JSON.stringify(node?.position || {})) + }) + }) + + it('has correct random data', () => { + store.getNodes.value.forEach((el) => { + const node = nodes.find((node) => node.id === el.id) + expect(el.data.randomData).to.eq(node?.data.randomData) + }) + }) + }) + + describe('test edge properties', () => { + it('has correct target and source', () => { + store.getEdges.value.forEach((el) => { + const edge = edges.find((edge) => edge.id === el.id) + + expect(el.source).to.eq(edge?.source) + expect(el.target).to.eq(edge?.target) + }) + }) + + it('has correct target-node and source-node', () => { + store.getEdges.value.forEach((el) => { + const edge = edges.find((edge) => edge.id === el.id) + + expect(el.sourceNode.id).to.eq(edge?.source) + expect(el.targetNode.id).to.eq(edge?.target) + }) + }) + + it('has correct random data', () => { + store.getEdges.value.forEach((el) => { + const edge = nodes.find((edge) => edge.id === el.id) + expect(el.data.randomData).to.eq(edge?.data.randomData) + }) + }) + + it('is animated', () => { + store.getEdges.value.forEach((el) => { + const edge = edges.find((edge) => edge.id === el.id) + + expect(el.animated).to.eq(edge?.animated) + }) + }) + }) + }) +}) diff --git a/e2e/cypress/integration/1-store/setState.spec.ts b/e2e/cypress/component/1-store/setState.cy.ts similarity index 100% rename from e2e/cypress/integration/1-store/setState.spec.ts rename to e2e/cypress/component/1-store/setState.cy.ts diff --git a/e2e/cypress/component/2-flow/container.cy.ts b/e2e/cypress/component/2-flow/container.cy.ts new file mode 100644 index 00000000..47cf3062 --- /dev/null +++ b/e2e/cypress/component/2-flow/container.cy.ts @@ -0,0 +1,42 @@ +import { VueFlow } from '@braks/vue-flow' +import { getElements } from '../../utils' + +const { nodes, edges } = getElements() + +describe('render Vue Flow', () => { + beforeEach(() => { + cy.mount(VueFlow, { + props: { + modelValue: [...nodes, ...edges], + }, + attrs: { + key: 'flowy', + style: { + height: '100vh', + width: '100vw', + }, + }, + }) + }) + + it('renders a Vue Flow container', () => { + cy.get('.vue-flow').should('exist') + }) + + it('renders nodes', () => { + cy.get('.vue-flow__node').should('have.length', nodes.length) + }) + + it('renders edges', () => cy.get('.vue-flow__edge').should('have.length', edges.length)) + + it('renders correct node labels', () => + cy.get('.vue-flow__node').each((node) => expect(nodes.some((el) => el.label === node.text())).to.be.true)) + + it('renders nodes at correct position', () => + cy + .get('.vue-flow__node') + .each( + (node) => + expect(nodes.some((el) => el.position.x === node.position().left && el.position.y === node.position().top)).to.be.true, + )) +}) diff --git a/e2e/cypress/integration/1-store/setElements.spec.ts b/e2e/cypress/integration/1-store/setElements.spec.ts deleted file mode 100644 index 57c0e8a7..00000000 --- a/e2e/cypress/integration/1-store/setElements.spec.ts +++ /dev/null @@ -1,88 +0,0 @@ -import type { Edge, Node, SetState, VueFlowStore } from '@braks/vue-flow' -import { isEdge, isNode, useVueFlow } from '@braks/vue-flow' -import { getElements } from '../../../../examples/vite/src/Stress/utils' - -describe('test store action setElements', () => { - const setElements = async (setState: SetState) => { - const nodes: Node[] = [ - { id: '1', type: 'input', data: { label: 'Node 1' }, position: { x: 250, y: 5 } }, - { id: '2', data: { label: 'Node 2' }, position: { x: 100, y: 100 } }, - ] - const edges: Edge[] = [{ id: 'e1-2', source: '1', target: '2', animated: true }] - setState({ - nodes, - edges, - }) - } - - it('sets elements', async () => { - const { setState, nodes, edges } = useVueFlow() - await setElements(setState) - expect(nodes.value).to.have.length(2) - expect(edges.value).to.have.length(1) - }) - - context('elements pre-set', () => { - let store: VueFlowStore - beforeEach(async () => { - store = useVueFlow() - await setElements(store.setState) - }) - - it('parses elements to flow-elements', () => { - store.getEdges.value.forEach((edge) => expect(isEdge(edge)).to.be.true) - store.getNodes.value.forEach((node) => expect(isNode(node)).to.be.true) - }) - - it('parses elements to flow-elements (199 elements - stress test)', async () => { - const { nodes, edges } = getElements() - store.setState({ - nodes, - edges, - }) - store.getEdges.value.forEach((edge) => expect(isEdge(edge)).to.be.true) - store.getNodes.value.forEach((node) => expect(isNode(node)).to.be.true) - }) - - it('has correct element ids', () => { - store.nodes.value.forEach((el) => expect(['1', '2']).to.include(el.id)) - store.edges.value.forEach((el) => expect(['e1-2']).to.include(el.id)) - }) - - it('has correct element types', () => { - store.nodes.value.forEach((el) => expect(['input', 'default']).to.include(el.type)) - }) - - it('nodes have correct label', () => { - store.getNodes.value.forEach((el) => { - if (el.id === '1') expect(el.data.label).to.eq('Node 1') - else expect(el.data.label).to.eq('Node 2') - }) - }) - - it('nodes have correct position', () => { - store.getNodes.value.forEach((el) => { - if (el.id === '1') expect(JSON.stringify(el.position)).to.eq(JSON.stringify({ x: 250, y: 5 })) - else expect(JSON.stringify(el.position)).to.eq(JSON.stringify({ x: 100, y: 100 })) - }) - }) - - it('edge has correct target and source', () => { - store.getEdges.value.forEach((el) => { - expect(el.source).to.eq('1') - expect(el.target).to.eq('2') - }) - }) - - it('edge has correct targetnode and sourceNode', () => { - store.getEdges.value.forEach((el) => { - expect(el.sourceNode.id).to.eq('1') - expect(el.targetNode.id).to.eq('2') - }) - }) - - it('edge is animated', () => { - store.getEdges.value.forEach((el) => expect(el.animated).to.eq(true)) - }) - }) -}) diff --git a/e2e/cypress/integration/2-flow/container.spec.ts b/e2e/cypress/integration/2-flow/container.spec.ts deleted file mode 100644 index 54356537..00000000 --- a/e2e/cypress/integration/2-flow/container.spec.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { mount } from '@cypress/vue' -import type { Elements } from '@braks/vue-flow' -import { VueFlow, isEdge, isNode } from '@braks/vue-flow' -import '@braks/vue-flow/dist/style.css' -import '@braks/vue-flow/dist/theme-default.css' - -describe('Render VueFlow', () => { - const elements: Elements = [ - { id: '1', type: 'input', label: 'Node 1', position: { x: 250, y: 5 } }, - { id: '2', label: 'Node 2', position: { x: 100, y: 100 } }, - { id: 'e1-2', source: '1', target: '2', animated: true }, - ] - - beforeEach(() => { - mount(VueFlow, { - props: { - modelValue: elements, - }, - attrs: { - key: 'flowy', - style: { - height: '100vh', - width: '100vw', - }, - }, - }) - }) - - it('renders a Vue Flow container', () => { - cy.get('.vue-flow').should('exist') - }) - - it('renders nodes', () => { - cy.get('.vue-flow__node').should('have.length', elements.filter(isNode).length) - }) - - it('renders edges', () => cy.get('.vue-flow__edge').should('have.length', elements.filter(isEdge).length)) - - it('renders correct node labels', () => - cy.get('.vue-flow__node').each((node) => expect(elements.some((el) => el.label === node.text())).to.be.true)) - - it('renders nodes at correct position', () => - cy - .get('.vue-flow__node') - .each( - (node) => - expect( - elements.filter(isNode).some((el) => el.position.x === node.position().left && el.position.y === node.position().top), - ).to.be.true, - )) -}) diff --git a/e2e/cypress/plugins/index.ts b/e2e/cypress/plugins/index.ts deleted file mode 100644 index fa932fb7..00000000 --- a/e2e/cypress/plugins/index.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { resolve } from 'path' -import { startDevServer } from '@cypress/vite-dev-server' - -export default ((on, config) => { - on('dev-server:start', async (options) => - startDevServer({ - options, - viteConfig: { - mode: 'test', - configFile: resolve(__dirname, 'vite.config.ts'), - }, - }), - ) - - return config -}) as Cypress.PluginConfig diff --git a/e2e/cypress/support/commands.ts b/e2e/cypress/support/commands.ts new file mode 100644 index 00000000..95857aea --- /dev/null +++ b/e2e/cypress/support/commands.ts @@ -0,0 +1,37 @@ +/// +// *********************************************** +// This example commands.ts shows you how to +// create various custom commands and overwrite +// existing commands. +// +// For more comprehensive examples of custom +// commands please read more here: +// https://on.cypress.io/custom-commands +// *********************************************** +// +// +// -- This is a parent command -- +// Cypress.Commands.add('login', (email, password) => { ... }) +// +// +// -- This is a child command -- +// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... }) +// +// +// -- This is a dual command -- +// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... }) +// +// +// -- This will overwrite an existing command -- +// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... }) +// +// declare global { +// namespace Cypress { +// interface Chainable { +// login(email: string, password: string): Chainable +// drag(subject: string, options?: Partial): Chainable +// dismiss(subject: string, options?: Partial): Chainable +// visit(originalFn: CommandOriginalFn, url: string, options: Partial): Chainable +// } +// } +// } diff --git a/e2e/cypress/support/component-index.html b/e2e/cypress/support/component-index.html new file mode 100644 index 00000000..5f9622ae --- /dev/null +++ b/e2e/cypress/support/component-index.html @@ -0,0 +1,12 @@ + + + + + + + Components App + + +
+ + diff --git a/e2e/cypress/support/component.ts b/e2e/cypress/support/component.ts new file mode 100644 index 00000000..a1f07a1d --- /dev/null +++ b/e2e/cypress/support/component.ts @@ -0,0 +1,43 @@ +// *********************************************************** +// This example support/component.ts is processed and +// loaded automatically before your test files. +// +// This is a great place to put global configuration and +// behavior that modifies Cypress. +// +// You can change the location of this file or turn off +// automatically serving support files with the +// 'supportFile' configuration option. +// +// You can read more here: +// https://on.cypress.io/configuration +// *********************************************************** + +// Import necessary styles +import '@braks/vue-flow/dist/style.css' +import '@braks/vue-flow/dist/theme-default.css' + +// Import commands.js using ES2015 syntax: +import './commands' + +// Alternatively you can use CommonJS syntax: +// require('./commands') + +import { mount } from 'cypress/vue' + +// Augment the Cypress namespace to include type definitions for +// your custom command. +// Alternatively, can be defined in cypress/support/component.d.ts +// with a at the top of your spec. +declare global { + namespace Cypress { + interface Chainable { + mount: typeof mount + } + } +} + +Cypress.Commands.add('mount', mount) + +// Example use: +// cy.mount(MyComponent) diff --git a/e2e/cypress/support/index.js b/e2e/cypress/support/index.js deleted file mode 100644 index f7b63f71..00000000 --- a/e2e/cypress/support/index.js +++ /dev/null @@ -1,19 +0,0 @@ -// *********************************************************** -// This example support/index.js is processed and -// loaded automatically before your test files. -// -// This is a great place to put global configuration and -// behavior that modifies Cypress. -// -// You can change the location of this file or turn off -// automatically serving support files with the -// 'supportFile' configuration option. -// -// You can read more here: -// https://on.cypress.io/configuration -// *********************************************************** - -// Import commands.js using ES2015 syntax: - -// Alternatively you can use CommonJS syntax: -// require('./commands') diff --git a/e2e/cypress/utils/elements.ts b/e2e/cypress/utils/elements.ts new file mode 100644 index 00000000..91584d48 --- /dev/null +++ b/e2e/cypress/utils/elements.ts @@ -0,0 +1,45 @@ +import type { Edge, Node } from '@braks/vue-flow' + +export function getElements(xElements = 10, yElements = 10) { + const initialNodes: Node[] = [] + const initialEdges: Edge[] = [] + let nodeId = 1 + let recentNodeId = null + + for (let y = 0; y < yElements; y++) { + for (let x = 0; x < xElements; x++) { + const position = { x: x * 100, y: y * 50 } + const node = { + id: nodeId.toString(), + style: { width: 50, fontSize: 11 }, + label: `Node ${nodeId}`, + type: '', + position, + data: { + randomData: Math.floor(Math.random() * 1e3), + }, + } + initialNodes.push(node) + + if (recentNodeId && nodeId <= xElements * yElements) { + initialEdges.push({ + id: `${x}-${y}`, + source: recentNodeId.toString(), + target: nodeId.toString(), + data: { + randomData: Math.floor(Math.random() * 1e3), + }, + animated: Math.random() > 0.5, + }) + } + + recentNodeId = nodeId + nodeId++ + } + } + + return { + nodes: initialNodes, + edges: initialEdges, + } +} diff --git a/e2e/cypress/utils/index.ts b/e2e/cypress/utils/index.ts new file mode 100644 index 00000000..da844aa6 --- /dev/null +++ b/e2e/cypress/utils/index.ts @@ -0,0 +1 @@ +export * from './elements' diff --git a/e2e/package.json b/e2e/package.json index 2318635a..12a96a86 100644 --- a/e2e/package.json +++ b/e2e/package.json @@ -10,9 +10,6 @@ "@braks/vue-flow": "workspace:*" }, "devDependencies": { - "@cypress/vite-dev-server": "^2.2.3", - "@cypress/vue": "^3.1.2", - "@vitejs/plugin-vue": "^2.3.3", - "cypress": "8.5.0" + "cypress": "^10.9.0" } } diff --git a/e2e/tsconfig.json b/e2e/tsconfig.json index d6f9d4e4..96cce75c 100644 --- a/e2e/tsconfig.json +++ b/e2e/tsconfig.json @@ -3,7 +3,10 @@ "baseUrl": ".", "module": "ESNext", "target": "es2017", - "lib": ["DOM", "ESNext"], + "lib": [ + "DOM", + "ESNext" + ], "noEmit": true, "declaration": false, "strict": true, @@ -15,8 +18,8 @@ "noUnusedLocals": false, "strictNullChecks": true, "forceConsistentCasingInFileNames": true, - "types": ["vite/client"] + "types": [ + "vite/client" + ], }, - "include": ["cypress"], - "exclude": ["node_modules"] } diff --git a/e2e/cypress/plugins/vite.config.ts b/e2e/vite.config.ts similarity index 55% rename from e2e/cypress/plugins/vite.config.ts rename to e2e/vite.config.ts index c40aa3c3..1c56eef4 100644 --- a/e2e/cypress/plugins/vite.config.ts +++ b/e2e/vite.config.ts @@ -1,6 +1,5 @@ import { defineConfig } from 'vite' -import vue from '@vitejs/plugin-vue' export default defineConfig({ - plugins: [vue()], + base: '.', }) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f90ffcfe..f3c38b2c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -76,17 +76,11 @@ importers: e2e: specifiers: '@braks/vue-flow': workspace:* - '@cypress/vite-dev-server': ^2.2.3 - '@cypress/vue': ^3.1.2 - '@vitejs/plugin-vue': ^2.3.3 - cypress: 8.5.0 + cypress: ^10.9.0 dependencies: '@braks/vue-flow': link:../packages/vue-flow devDependencies: - '@cypress/vite-dev-server': 2.2.3_vite@2.9.15 - '@cypress/vue': 3.1.2_cypress@8.5.0+vue@3.2.37 - '@vitejs/plugin-vue': 2.3.3_vite@2.9.15+vue@3.2.37 - cypress: 8.5.0 + cypress: 10.9.0 examples/nuxt3: specifiers: @@ -812,10 +806,6 @@ packages: dev: true optional: true - /@cypress/mount-utils/1.0.2: - resolution: {integrity: sha512-Fn3fdTiyayHoy8Ol0RSu4MlBH2maQ2ZEXeEVKl/zHHXEQpld5HX3vdNLhK5YLij8cLynA4DxOT/nO9iEnIiOXw==} - dev: true - /@cypress/request/2.88.10: resolution: {integrity: sha512-Zp7F+R93N0yZyG34GutyTNr+okam7s/Fzc1+i3kcqOP8vk6OuajuE9qZJ6Rs+10/1JFtXFYMdyarnU1rZuJesg==} engines: {node: '>= 6'} @@ -840,38 +830,6 @@ packages: uuid: 8.3.2 dev: true - /@cypress/vite-dev-server/2.2.3_vite@2.9.15: - resolution: {integrity: sha512-E9cPKwReweYGRsupfR6Va1R1bHv3zPb3gHG68fyQwAjG4oPORaQlgfFWiR2i1pF+tRftvNfM0O2PBuKX3IvPxg==} - peerDependencies: - vite: '>= 2.1.3' - dependencies: - debug: 4.3.4 - get-port: 5.1.1 - vite: 2.9.15 - transitivePeerDependencies: - - supports-color - dev: true - - /@cypress/vue/3.1.2_cypress@8.5.0+vue@3.2.37: - resolution: {integrity: sha512-CqIBupPW6EhXJ7lXE64MBKh3VfdShHnuC3HBV/euHBt9tsgSo7RZHBTZUsKc8aM745VzVnuNiax+JV4CplrtLQ==} - engines: {node: '>=8'} - peerDependencies: - '@cypress/webpack-dev-server': '*' - babel-loader: '*' - cypress: '>=7.0.0' - vue: '>=3.0.0' - peerDependenciesMeta: - '@cypress/webpack-dev-server': - optional: true - babel-loader: - optional: true - dependencies: - '@cypress/mount-utils': 1.0.2 - '@vue/test-utils': 2.0.2_vue@3.2.37 - cypress: 8.5.0 - vue: 3.2.37 - dev: true - /@cypress/xvfb/1.2.4_supports-color@8.1.1: resolution: {integrity: sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==} dependencies: @@ -2000,8 +1958,8 @@ packages: '@types/node': 12.20.55 dev: true - /@types/sinonjs__fake-timers/6.0.4: - resolution: {integrity: sha512-IFQTJARgMUBF+xVd2b+hIgXWrZEjND3vJtRCvIelcFB5SIXfjV4bOHbHJ0eXKh+0COrBRc8MqteKAz/j88rE0A==} + /@types/sinonjs__fake-timers/8.1.1: + resolution: {integrity: sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==} dev: true /@types/sizzle/2.3.3: @@ -2026,7 +1984,7 @@ packages: resolution: {integrity: sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==} requiresBuild: true dependencies: - '@types/node': 14.18.22 + '@types/node': 18.7.8 dev: true optional: true @@ -2222,17 +2180,6 @@ packages: vue: 3.2.37 dev: true - /@vitejs/plugin-vue/2.3.3_vite@2.9.15+vue@3.2.37: - resolution: {integrity: sha512-SmQLDyhz+6lGJhPELsBdzXGc+AcaT8stgkbiTFGpXPe8Tl1tJaBw1A6pxDqDuRsVkD8uscrkx3hA7QDOoKYtyw==} - engines: {node: '>=12.0.0'} - peerDependencies: - vite: ^2.5.10 - vue: ^3.2.25 - dependencies: - vite: 2.9.15 - vue: 3.2.37 - dev: true - /@vitejs/plugin-vue/2.3.4_vite@2.9.15+vue@3.2.37: resolution: {integrity: sha512-IfFNbtkbIm36O9KB8QodlwwYvTEsJb4Lll4c2IwB3VHc2gie2mSPtSzL0eYay7X2jd/2WX02FjSGTWR6OPr/zg==} engines: {node: '>=12.0.0'} @@ -2519,14 +2466,6 @@ packages: resolution: {integrity: sha512-0PLQ6RUtZM0vO3teRfzGi4ltLUO5aO+kLgwh4Um3THSR03rpQWLTuRCkuO5A41ITzwdWeKdPHtSARuPkoo5pCQ==} dev: true - /@vue/test-utils/2.0.2_vue@3.2.37: - resolution: {integrity: sha512-E2P4oXSaWDqTZNbmKZFVLrNN/siVN78YkEqs7pHryWerrlZR9bBFLWdJwRoguX45Ru6HxIflzKl4vQvwRMwm5g==} - peerDependencies: - vue: ^3.0.1 - dependencies: - vue: 3.2.37 - dev: true - /@vueuse/core/8.9.4_vue@3.2.37: resolution: {integrity: sha512-B/Mdj9TK1peFyWaPof+Zf/mP9XuGAngaJZBwPaXBvU3aCTZlx3ltlrFFFyMV4iGBwsjSCeUCgZrtkEj9dS2Y3Q==} peerDependencies: @@ -3834,8 +3773,8 @@ packages: resolution: {integrity: sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw==} dev: true - /cypress/8.5.0: - resolution: {integrity: sha512-MMkXIS+Ro2KETn4gAlG3tIc/7FiljuuCZP0zpd9QsRG6MZSyZW/l1J3D4iQM6WHsVxuX4rFChn5jPFlC2tNSvQ==} + /cypress/10.9.0: + resolution: {integrity: sha512-MjIWrRpc+bQM9U4kSSdATZWZ2hUqHGFEQTF7dfeZRa4MnalMtc88FIE49USWP2ZVtfy5WPBcgfBX+YorFqGElA==} engines: {node: '>=12.0.0'} hasBin: true requiresBuild: true @@ -3843,11 +3782,12 @@ packages: '@cypress/request': 2.88.10 '@cypress/xvfb': 1.2.4_supports-color@8.1.1 '@types/node': 14.18.22 - '@types/sinonjs__fake-timers': 6.0.4 + '@types/sinonjs__fake-timers': 8.1.1 '@types/sizzle': 2.3.3 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 @@ -3858,7 +3798,7 @@ packages: dayjs: 1.11.4 debug: 4.3.4_supports-color@8.1.1 enquirer: 2.3.6 - eventemitter2: 6.4.6 + eventemitter2: 6.4.7 execa: 4.1.0 executable: 4.1.1 extract-zip: 2.0.1_supports-color@8.1.1 @@ -3875,12 +3815,11 @@ packages: ospath: 1.2.2 pretty-bytes: 5.6.0 proxy-from-env: 1.0.0 - ramda: 0.27.2 request-progress: 3.0.0 + semver: 7.3.7 supports-color: 8.1.1 tmp: 0.2.1 untildify: 4.0.0 - url: 0.11.0 yauzl: 2.10.0 dev: true @@ -5477,8 +5416,8 @@ packages: engines: {node: '>= 0.6'} dev: true - /eventemitter2/6.4.6: - resolution: {integrity: sha512-OHqo4wbHX5VbvlbB6o6eDwhYmiTjrpWACjF8Pmof/GTD6rdBNdZFNck3xlhqOiQFGCOoq3uzHvA0cQpFHIGVAQ==} + /eventemitter2/6.4.7: + resolution: {integrity: sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==} dev: true /eventemitter3/4.0.7: @@ -5934,11 +5873,6 @@ packages: fs-memo: 1.2.0 dev: true - /get-port/5.1.1: - resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} - engines: {node: '>=8'} - dev: true - /get-stdin/9.0.0: resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} engines: {node: '>=12'} @@ -9005,10 +8939,6 @@ packages: once: 1.4.0 dev: true - /punycode/1.3.2: - resolution: {integrity: sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==} - dev: true - /punycode/2.1.1: resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} engines: {node: '>=6'} @@ -9054,12 +8984,6 @@ packages: strict-uri-encode: 2.0.0 dev: true - /querystring/0.2.0: - resolution: {integrity: sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==} - engines: {node: '>=0.4.x'} - deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead. - dev: true - /queue-microtask/1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true @@ -9073,10 +8997,6 @@ packages: resolution: {integrity: sha512-Mpfd/OuX0zoJ6ojLD/RTOHvJPg6e6PjINtmYzV87kIXc5iUtDz34i7gg4SV4XjqRJTmSiYO/g9i/mKWGf4z8wg==} dev: true - /ramda/0.27.2: - resolution: {integrity: sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==} - dev: true - /randombytes/2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} dependencies: @@ -11192,13 +11112,6 @@ packages: prepend-http: 2.0.0 dev: true - /url/0.11.0: - resolution: {integrity: sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==} - dependencies: - punycode: 1.3.2 - querystring: 0.2.0 - dev: true - /util-deprecate/1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: true