From e81322657d93a415534af1374d3af1a52620bb13 Mon Sep 17 00:00:00 2001 From: M R DHANUSH <111651814+Dhanush0369@users.noreply.github.com> Date: Wed, 15 May 2024 17:28:57 +0530 Subject: [PATCH] Adding Chaoscenter e2e tests (#405) * Chaoscenter e2e tests Signed-off-by: Dhanush0369 * Updated chaosinfra tests Signed-off-by: Dhanush0369 * Completed chaosInfra tests Signed-off-by: Dhanush0369 * Updated chaosInfra tests Signed-off-by: Dhanush0369 * Added chaosprobes test Signed-off-by: Dhanush0369 * Updated chaosprobes tests Signed-off-by: Dhanush0369 * Added User Managment and Negative tests Signed-off-by: Dhanush0369 * Restructuring files into two groups REST APIs and UI Signed-off-by: Dhanush0369 * Delete Previous Files Signed-off-by: Dhanush0369 * Addition of chaoshub,chaosInfra and Negative test cases Signed-off-by: Dhanush0369 --------- Signed-off-by: Dhanush0369 --- .gitignore | 4 +- chaoscenter/cypress.config.js | 13 + .../cypress/e2e/REST APIs/UserManagment.cy.js | 124 + .../cypress/e2e/REST APIs/chaosProbes.cy.js | 772 +++++++ .../cypress/e2e/REST APIs/chaoshub.cy.js | 193 ++ .../cypress/e2e/REST APIs/chaosinfra.cy.js | 220 ++ chaoscenter/cypress/e2e/REST APIs/login.cy.js | 20 + .../cypress/e2e/UI/Usermanagment.cy.js | 50 + chaoscenter/cypress/e2e/UI/chaoshub.cy.js | 70 + chaoscenter/cypress/e2e/UI/chaosinfra.cy.js | 60 + chaoscenter/cypress/e2e/UI/chaosprobes.cy.js | 252 +++ chaoscenter/cypress/e2e/UI/login.cy.js | 15 + chaoscenter/cypress/fixtures/Users.json | 16 + chaoscenter/cypress/fixtures/chaoshub.js | 59 + chaoscenter/cypress/fixtures/chaosinfra.js | 67 + chaoscenter/cypress/fixtures/chaosprobes.js | 111 + chaoscenter/cypress/support/commands.js | 26 + chaoscenter/cypress/support/e2e.js | 2 + chaoscenter/package-lock.json | 1990 +++++++++++++++++ chaoscenter/package.json | 6 + 20 files changed, 4069 insertions(+), 1 deletion(-) create mode 100644 chaoscenter/cypress.config.js create mode 100644 chaoscenter/cypress/e2e/REST APIs/UserManagment.cy.js create mode 100644 chaoscenter/cypress/e2e/REST APIs/chaosProbes.cy.js create mode 100644 chaoscenter/cypress/e2e/REST APIs/chaoshub.cy.js create mode 100644 chaoscenter/cypress/e2e/REST APIs/chaosinfra.cy.js create mode 100644 chaoscenter/cypress/e2e/REST APIs/login.cy.js create mode 100644 chaoscenter/cypress/e2e/UI/Usermanagment.cy.js create mode 100644 chaoscenter/cypress/e2e/UI/chaoshub.cy.js create mode 100644 chaoscenter/cypress/e2e/UI/chaosinfra.cy.js create mode 100644 chaoscenter/cypress/e2e/UI/chaosprobes.cy.js create mode 100644 chaoscenter/cypress/e2e/UI/login.cy.js create mode 100644 chaoscenter/cypress/fixtures/Users.json create mode 100644 chaoscenter/cypress/fixtures/chaoshub.js create mode 100644 chaoscenter/cypress/fixtures/chaosinfra.js create mode 100644 chaoscenter/cypress/fixtures/chaosprobes.js create mode 100644 chaoscenter/cypress/support/commands.js create mode 100644 chaoscenter/cypress/support/e2e.js create mode 100644 chaoscenter/package-lock.json create mode 100644 chaoscenter/package.json diff --git a/.gitignore b/.gitignore index 782d08b7c..bf4e1b742 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,6 @@ **/videos **/screenshots **/cypress/downloads -agent-manifest.yaml \ No newline at end of file +agent-manifest.yaml +**/chaoscenter/node_modules +**/chaoscenter/cypress/downloads \ No newline at end of file diff --git a/chaoscenter/cypress.config.js b/chaoscenter/cypress.config.js new file mode 100644 index 000000000..4e7378553 --- /dev/null +++ b/chaoscenter/cypress.config.js @@ -0,0 +1,13 @@ +const { defineConfig } = require("cypress"); + +module.exports = defineConfig({ + e2e: { + baseUrl: 'http://192.168.49.2:30829', + requestTimeout: 60000, + responseTimeout: 60000 + }, + env: { + username: 'admin', + password: 'litmus' + }, +}); diff --git a/chaoscenter/cypress/e2e/REST APIs/UserManagment.cy.js b/chaoscenter/cypress/e2e/REST APIs/UserManagment.cy.js new file mode 100644 index 000000000..4fd3f5cfa --- /dev/null +++ b/chaoscenter/cypress/e2e/REST APIs/UserManagment.cy.js @@ -0,0 +1,124 @@ +describe('Test Cases for User-Management', () => { + let user; + beforeEach(() => { + cy.requestLogin(Cypress.env('username'),Cypress.env('password')); + cy.fixture("Users").then((User) => { + user = User.user1; + }); + }); + + it('Create New User', () => { + const accessToken = localStorage.getItem('accessToken'); + + //add user + const add_payload = { + name: user.name, + email: user.email, + username: user.username, + password: user.password, + role: 'user' + }; + + cy.request({ + method: 'POST', + url: '/auth/create_user', + headers: { + Authorization: `Bearer ${accessToken}` + }, + body: add_payload, + }).then((response) => { + expect(response.status).to.equal(200); + expect(response.body.username).to.eq(add_payload.username); + expect(response.body.email).to.eq(add_payload.email); + expect(response.body.name).to.eq(add_payload.name); + }); + }); + + it('Negative test case for User management [Get error when creating User with same name]', () => { + const accessToken = localStorage.getItem('accessToken'); + + //add user + const add_payload = { + name: user.name, + email: user.email, + username: user.username, + password: user.password, + role: 'user' + }; + + cy.request({ + method: 'POST', + url: '/auth/create_user', + headers: { + Authorization: `Bearer ${accessToken}` + }, + body: add_payload, + failOnStatusCode: false, + }).then((response) => { + expect(response.body.error).to.equal('user_exists'); + }); + }) + + it('Edit user password', () => { + const accessToken = localStorage.getItem('accessToken'); + + const edit_payload = { + username: user.username, + oldPassword: '', + newPassword: '1' + }; + + cy.request({ + method: 'POST', + url: '/auth/reset/password', + headers: { + Authorization: `Bearer ${accessToken}` + }, + body: edit_payload, + }).then((response) => { + expect(response.status).to.equal(200); + expect(response.body.message).to.eq('password has been reset successfully'); + }); + }); + + it('Disable user', () => { + const accessToken = localStorage.getItem('accessToken'); + + //negative test case for disable user + const disable_payload1 = { + username: '123', + isDeactivate: true + }; + + cy.request({ + method: 'POST', + url: '/auth/update/state', + failOnStatusCode: false, + headers: { + Authorization: `Bearer ${accessToken}` + }, + body: disable_payload1, + }).then((response) => { + expect(response.body.error).to.equal('user does not exist'); + }); + + + //disable user + const disable_payload = { + username: user.username, + isDeactivate: true + }; + + cy.request({ + method: 'POST', + url: '/auth/update/state', + headers: { + Authorization: `Bearer ${accessToken}` + }, + body: disable_payload, + }).then((response) => { + expect(response.status).to.equal(200); + expect(response.body.message).to.eq("user's state updated successfully"); + }); + }); +}); \ No newline at end of file diff --git a/chaoscenter/cypress/e2e/REST APIs/chaosProbes.cy.js b/chaoscenter/cypress/e2e/REST APIs/chaosProbes.cy.js new file mode 100644 index 000000000..8b59ef1a9 --- /dev/null +++ b/chaoscenter/cypress/e2e/REST APIs/chaosProbes.cy.js @@ -0,0 +1,772 @@ +import { add_httpProbe, add_CMDProbe, delete_httpprobe, update_httpProbe, update_CMDProbe, delete_CMDprobe, add_PROMProbe, update_PROMProbe, delete_PROMProbe, add_k8sProbe, update_k8sProbe, delete_k8sProbe } from "../../fixtures/chaosprobes"; + +describe('Testing http chaos Probes', () => { + beforeEach(() => { + cy.requestLogin(Cypress.env('username'),Cypress.env('password')); + }); + + it('Create chaos probe', () => { + const accessToken = localStorage.getItem('accessToken'); + const projectID = localStorage.getItem('projectID'); + + //add Probe + const add_httpProbe_payload = { + operationName: "addKubernetesHTTPProbe", + variables: { + projectID: projectID, + request: { + name: "exp1111", + description: '', + tags: [], + type: 'httpProbe', + infrastructureType: 'Kubernetes', + kubernetesHTTPProperties: { + probeTimeout: '1s', + interval: '1s', + probePollingInterval: '1s', + evaluationTimeout: '1s', + retry: 5, + url: 'http://localhost:3000', + method: { + get: { criteria: '==', responseCode: '200' } + } + } + } + }, + query: add_httpProbe + }; + + cy.request({ + method: 'POST', + url: '/api/query', + body: add_httpProbe_payload, + headers: { + Authorization: `Bearer ${accessToken}` + } + }).then((response) => { + expect(response.status).to.equal(200); + expect(response.body.data.addProbe.name).to.equal("exp1111"); + }); + }); + + it('negative test case for chaos probe [Get error when creating chaos Probe with same name]', () => { + const accessToken = localStorage.getItem('accessToken'); + const projectID = localStorage.getItem('projectID'); + + //add Probe + const add_httpProbe_payload = { + operationName: "addKubernetesHTTPProbe", + variables: { + projectID: projectID, + request: { + name: "exp1111", + description: '', + tags: [], + type: 'httpProbe', + infrastructureType: 'Kubernetes', + kubernetesHTTPProperties: { + probeTimeout: '1s', + interval: '1s', + probePollingInterval: '1s', + evaluationTimeout: '1s', + retry: 5, + url: 'http://localhost:3000', + method: { + get: { criteria: '==', responseCode: '200' } + } + } + } + }, + query: add_httpProbe + }; + + cy.request({ + method: 'POST', + url: '/api/query', + body: add_httpProbe_payload, + headers: { + Authorization: `Bearer ${accessToken}` + } + }).then((response) => { + expect(response.status).to.equal(200); + expect(response.body.errors[0].message).to.equal('write exception: write errors: [E11000 duplicate key error collection: litmus.chaosProbes index: name_1 dup key: { name: "exp1111" }]'); + }); + }); + + it('Update chaos probe', () => { + const accessToken = localStorage.getItem('accessToken'); + const projectID = localStorage.getItem('projectID'); + const update_httpProbe_payload = { + operationName: "updateProbe", + variables: { + projectID: projectID, + request: { + name: "exp1111", + description: '', + tags: [], + type: 'httpProbe', + infrastructureType: 'Kubernetes', + kubernetesHTTPProperties: { + probeTimeout: '3s', + interval: '1s', + probePollingInterval: '1s', + evaluationTimeout: '1s', + retry: 5, + url: 'http://localhost:3000', + method: { + get: { criteria: '==', responseCode: '200' } + } + } + } + }, + query: update_httpProbe + }; + + cy.request({ + method: 'POST', + url: '/api/query', + body: update_httpProbe_payload, + headers: { + Authorization: `Bearer ${accessToken}` + } + }).then((response) => { + expect(response.status).to.equal(200); + expect(response.body.data.updateProbe).to.equal("Updated successfully"); + }); + }); + + it('Delete chaos probe', () => { + const accessToken = localStorage.getItem('accessToken'); + const projectID = localStorage.getItem('projectID'); + + //negative test case for delete chaos probe + const deleteProbe_payload1 = { + operationName: 'deleteProbe', + variables: { + projectID: projectID, + probeName: "exp0" + }, + query: delete_httpprobe + } + + cy.request({ + method: 'POST', + url: '/api/query', + body: deleteProbe_payload1, + headers: { + Authorization: `Bearer ${accessToken}` + } + }).then((response) => { + expect(response.body.errors[0].message).to.equal('mongo: no documents in result'); + }); + + //delete chaos probe + const deleteProbe_payload = { + operationName: 'deleteProbe', + variables: { + projectID: projectID, + probeName: "exp1111" + }, + query: delete_httpprobe + } + + cy.request({ + method: 'POST', + url: '/api/query', + body: deleteProbe_payload, + headers: { + Authorization: `Bearer ${accessToken}` + } + }).then((response) => { + expect(response.status).to.equal(200); + expect(response.body.data.deleteProbe).to.equal(true); + }); + }); +}); + +describe('testing CMD chaos probes', () => { + beforeEach(() => { + cy.requestLogin(Cypress.env('username'),Cypress.env('password')); + }); + + it('Create chaos probe', () => { + const accessToken = localStorage.getItem('accessToken'); + const projectID = localStorage.getItem('projectID'); + + //add Probe + const addCMDProbe_payload = { + operationName: "addKubernetesCMDProbe", + variables: { + projectID: projectID, + request: { + name: "exp2222", + description: "", + tags: [], + type: "cmdProbe", + infrastructureType: "Kubernetes", + kubernetesCMDProperties: { + probeTimeout: "1s", + interval: "1s", + retry: 1, + attempt: 1, + probePollingInterval: "1s", + evaluationTimeout: "1s", + command: "run", + comparator: { + type: "int", + criteria: "==", + value: "1", + }, + }, + }, + }, + query: add_CMDProbe, + }; + + cy.request({ + method: "POST", + url: "/api/query", + body: addCMDProbe_payload, + headers: { + Authorization: `Bearer ${accessToken}`, + }, + }).then((response) => { + expect(response.status).to.equal(200); + expect(response.body.data.addProbe.name).to.equal("exp2222"); + }); + }); + + it('negative test case for chaos probe [Get error when creating chaos Probe with same name]', () => { + const accessToken = localStorage.getItem('accessToken'); + const projectID = localStorage.getItem('projectID'); + const addCMDProbe_payload = { + operationName: "addKubernetesCMDProbe", + variables: { + projectID: projectID, + request: { + name: "exp2222", + description: "", + tags: [], + type: "cmdProbe", + infrastructureType: "Kubernetes", + kubernetesCMDProperties: { + probeTimeout: "1s", + interval: "1s", + retry: 1, + attempt: 1, + probePollingInterval: "1s", + evaluationTimeout: "1s", + command: "run", + comparator: { + type: "int", + criteria: "==", + value: "1", + }, + }, + }, + }, + query: add_CMDProbe, + }; + cy.request({ + method: "POST", + url: "/api/query", + body: addCMDProbe_payload, + headers: { + Authorization: `Bearer ${accessToken}`, + }, + }).then((response) => { + expect(response.status).to.equal(200); + expect(response.body.errors[0].message).to.equal('write exception: write errors: [E11000 duplicate key error collection: litmus.chaosProbes index: name_1 dup key: { name: "exp2222" }]'); + }); + }); + + it('edit chaos probe', () => { + const accessToken = localStorage.getItem('accessToken'); + const projectID = localStorage.getItem('projectID'); + //update probe + const updateCMDProbe_payload = { + operationName: "updateProbe", + variables: { + projectID: projectID, + request: { + name: "exp2222", + description: "", + tags: [], + type: "cmdProbe", + infrastructureType: "Kubernetes", + kubernetesCMDProperties: { + probeTimeout: "3s", + interval: "1s", + retry: 1, + attempt: 1, + evaluationTimeout: "1s", + probePollingInterval: "1s", + initialDelay: null, + stopOnFailure: null, + command: "run", + comparator: { + type: "int", + value: "1", + criteria: "==", + }, + source: null, + }, + }, + }, + query: update_CMDProbe, + }; + + cy.request({ + method: "POST", + url: "/api/query", + body: updateCMDProbe_payload, + headers: { + Authorization: `Bearer ${accessToken}`, + }, + }).then((response) => { + expect(response.status).to.equal(200); + expect(response.body.data.updateProbe).to.equal("Updated successfully"); + }); + }); + + it('delete chaos probe', () => { + const accessToken = localStorage.getItem('accessToken'); + const projectID = localStorage.getItem('projectID'); + + //negative test case for delete chaos probe + const deleteCMDProbe_payload1 = { + operationName: "deleteProbe", + variables: { + projectID: projectID, + probeName: "exp0", + }, + query: delete_CMDprobe, + }; + + cy.request({ + method: "POST", + url: "/api/query", + body: deleteCMDProbe_payload1, + headers: { + Authorization: `Bearer ${accessToken}`, + }, + }).then((response) => { + expect(response.body.errors[0].message).to.equal('mongo: no documents in result'); + }); + + //delete probe + const deleteCMDProbe_payload = { + operationName: "deleteProbe", + variables: { + projectID: projectID, + probeName: "exp2222", + }, + query: delete_CMDprobe, + }; + + cy.request({ + method: "POST", + url: "/api/query", + body: deleteCMDProbe_payload, + headers: { + Authorization: `Bearer ${accessToken}`, + }, + }).then((response) => { + expect(response.status).to.equal(200); + expect(response.body.data.deleteProbe).to.equal(true); + }); + }); +}); + +describe('testing prometheus chaos probes', () => { + beforeEach(() => { + cy.requestLogin(Cypress.env('username'),Cypress.env('password')); + }); + + it('Create chaos probe', () => { + const accessToken = localStorage.getItem('accessToken'); + const projectID = localStorage.getItem('projectID'); + + //add Probe + const addPROMProbe_payload = { + operationName: "addPROMProbe", + variables: { + projectID: projectID, + request: { + name: "exp3333", + description: "", + tags: [], + type: "promProbe", + infrastructureType: "Kubernetes", + promProperties: { + probeTimeout: "1s", + interval: "1s", + retry: 1, + attempt: 1, + probePollingInterval: "1s", + evaluationTimeout: "1s", + endpoint: "http://localhost:3000", + query: "run", + comparator: { + type: "int", + criteria: "==", + value: "1", + }, + }, + }, + }, + query: add_PROMProbe, + }; + + cy.request({ + method: "POST", + url: "/api/query", + body: addPROMProbe_payload, + headers: { + Authorization: `Bearer ${accessToken}`, + }, + }).then((response) => { + expect(response.status).to.equal(200); + expect(response.body.data.addProbe.name).to.equal("exp3333"); + }); + }); + + it('negative test case for chaos probe [Get error when creating chaos Probe with same name]', () => { + const accessToken = localStorage.getItem('accessToken'); + const projectID = localStorage.getItem('projectID'); + const addPROMProbe_payload = { + operationName: "addPROMProbe", + variables: { + projectID: projectID, + request: { + name: "exp3333", + description: "", + tags: [], + type: "promProbe", + infrastructureType: "Kubernetes", + promProperties: { + probeTimeout: "1s", + interval: "1s", + retry: 1, + attempt: 1, + probePollingInterval: "1s", + evaluationTimeout: "1s", + endpoint: "http://localhost:3000", + query: "run", + comparator: { + type: "int", + criteria: "==", + value: "1", + }, + }, + }, + }, + query: add_PROMProbe, + }; + + cy.request({ + method: "POST", + url: "/api/query", + body: addPROMProbe_payload, + headers: { + Authorization: `Bearer ${accessToken}`, + }, + }).then((response) => { + expect(response.status).to.equal(200); + expect(response.body.errors[0].message).to.equal('write exception: write errors: [E11000 duplicate key error collection: litmus.chaosProbes index: name_1 dup key: { name: "exp3333" }]'); + }); + }); + + it('edit chaos probe', () => { + const accessToken = localStorage.getItem('accessToken'); + const projectID = localStorage.getItem('projectID'); + //update probe + const updatePROMProbe_payload = { + operationName: "updateProbe", + variables: { + projectID: projectID, + request: { + name: "exp3333", + description: "", + tags: [], + type: "promProbe", + infrastructureType: "Kubernetes", + promProperties: { + probeTimeout: "3s", + interval: "1s", + retry: 1, + attempt: 1, + evaluationTimeout: "1s", + probePollingInterval: "1s", + initialDelay: null, + stopOnFailure: null, + endpoint: "http://localhost:3000", + query: "run", + queryPath: null, + comparator: { + type: "int", + value: "1", + criteria: "==", + }, + }, + }, + }, + query: update_PROMProbe, + }; + + cy.request({ + method: "POST", + url: "/api/query", + body: updatePROMProbe_payload, + headers: { + Authorization: `Bearer ${accessToken}`, + }, + }).then((response) => { + expect(response.status).to.equal(200); + expect(response.body.data.updateProbe).to.equal("Updated successfully"); + }); + }); + + it('delete chaos probe', () => { + const accessToken = localStorage.getItem('accessToken'); + const projectID = localStorage.getItem('projectID'); + + //negative test case for delete chaos probe + const deletePROMProbe_payload1 = { + operationName: "deleteProbe", + variables: { + projectID: projectID, + probeName: "exp0", + }, + query: delete_PROMProbe, + }; + + cy.request({ + method: "POST", + url: "/api/query", + body: deletePROMProbe_payload1, + headers: { + Authorization: `Bearer ${accessToken}`, + }, + }).then((response) => { + expect(response.body.errors[0].message).to.equal('mongo: no documents in result'); + }); + + //delete probe + const deletePROMProbe_payload = { + operationName: "deleteProbe", + variables: { + projectID: projectID, + probeName: "exp3333", + }, + query: delete_PROMProbe, + }; + + cy.request({ + method: "POST", + url: "/api/query", + body: deletePROMProbe_payload, + headers: { + Authorization: `Bearer ${accessToken}`, + }, + }).then((response) => { + expect(response.status).to.equal(200); + expect(response.body.data.deleteProbe).to.equal(true); + }); + }); +}); + +describe('testing kubernetes chaos probes', () => { + beforeEach(() => { + cy.requestLogin(Cypress.env('username'),Cypress.env('password')); + }); + + it('Create chaos probe', () => { + const accessToken = localStorage.getItem('accessToken'); + const projectID = localStorage.getItem('projectID'); + + //add Probe + const add_K8SProbe_payload = { + operationName: "addK8SProbe", + variables: { + projectID: projectID, + request: { + name: "exp4444", + description: "", + tags: [], + type: "k8sProbe", + infrastructureType: "Kubernetes", + k8sProperties: { + probeTimeout: "1s", + interval: "1s", + retry: 1, + attempt: 1, + probePollingInterval: "1s", + evaluationTimeout: "1s", + group: "book", + version: "v1", + resource: "store", + namespace: "alpha", + operation: "delete", + }, + }, + }, + query: add_k8sProbe, + }; + + cy.request({ + method: "POST", + url: "/api/query", + body: add_K8SProbe_payload, + headers: { + Authorization: `Bearer ${accessToken}`, + }, + }).then((response) => { + expect(response.status).to.equal(200); + expect(response.body.data.addProbe.name).to.equal("exp4444"); + }); + }); + + it('negative test case for chaos probe [Get error when creating chaos Probe with same name]', () => { + const accessToken = localStorage.getItem('accessToken'); + const projectID = localStorage.getItem('projectID'); + const add_K8SProbe_payload = { + operationName: "addK8SProbe", + variables: { + projectID: projectID, + request: { + name: "exp4444", + description: "", + tags: [], + type: "k8sProbe", + infrastructureType: "Kubernetes", + k8sProperties: { + probeTimeout: "1s", + interval: "1s", + retry: 1, + attempt: 1, + probePollingInterval: "1s", + evaluationTimeout: "1s", + group: "book", + version: "v1", + resource: "store", + namespace: "alpha", + operation: "delete", + }, + }, + }, + query: add_k8sProbe, + }; + + cy.request({ + method: "POST", + url: "/api/query", + body: add_K8SProbe_payload, + headers: { + Authorization: `Bearer ${accessToken}`, + }, + }).then((response) => { + expect(response.status).to.equal(200); + expect(response.body.errors[0].message).to.equal('write exception: write errors: [E11000 duplicate key error collection: litmus.chaosProbes index: name_1 dup key: { name: "exp4444" }]'); + + }); + }); + + it('edit chaos probe', () => { + const accessToken = localStorage.getItem('accessToken'); + const projectID = localStorage.getItem('projectID'); + //update probe + const update_K8SProbe_payload = { + operationName: "updateProbe", + variables: { + projectID: projectID, + request: { + name: "exp4444", + description: "", + tags: [], + type: "k8sProbe", + infrastructureType: "Kubernetes", + k8sProperties: { + probeTimeout: "3s", + interval: "1s", + retry: 1, + attempt: 1, + evaluationTimeout: "1s", + probePollingInterval: "1s", + initialDelay: null, + stopOnFailure: null, + group: "book", + version: "v1", + resource: "store", + resourceNames: null, + namespace: "alpha", + fieldSelector: null, + labelSelector: null, + operation: "delete", + }, + }, + }, + query: update_k8sProbe, + }; + + cy.request({ + method: "POST", + url: "/api/query", + body: update_K8SProbe_payload, + headers: { + Authorization: `Bearer ${accessToken}`, + }, + }).then((response) => { + expect(response.status).to.equal(200); + expect(response.body.data.updateProbe).to.equal("Updated successfully"); + }); + }); + + it('delete chaos probe', () => { + const accessToken = localStorage.getItem('accessToken'); + const projectID = localStorage.getItem('projectID'); + + //negative test case for chaos probe + const delete_K8SProbe_payload1 = { + operationName: "deleteProbe", + variables: { + projectID: projectID, + probeName: "exp0", + }, + query: delete_k8sProbe, + }; + + cy.request({ + method: "POST", + url: "/api/query", + body: delete_K8SProbe_payload1, + headers: { + Authorization: `Bearer ${accessToken}`, + }, + }).then((response) => { + expect(response.body.errors[0].message).to.equal('mongo: no documents in result'); + }); + + //delete probe + const delete_K8SProbe_payload = { + operationName: "deleteProbe", + variables: { + projectID: projectID, + probeName: "exp4444", + }, + query: delete_k8sProbe, + }; + + cy.request({ + method: "POST", + url: "/api/query", + body: delete_K8SProbe_payload, + headers: { + Authorization: `Bearer ${accessToken}`, + }, + }).then((response) => { + expect(response.status).to.equal(200); + expect(response.body.data.deleteProbe).to.equal(true); + }); + }); +}); \ No newline at end of file diff --git a/chaoscenter/cypress/e2e/REST APIs/chaoshub.cy.js b/chaoscenter/cypress/e2e/REST APIs/chaoshub.cy.js new file mode 100644 index 000000000..05ea2680a --- /dev/null +++ b/chaoscenter/cypress/e2e/REST APIs/chaoshub.cy.js @@ -0,0 +1,193 @@ +import { add_hub,update_hub,delete_hub, list_hub } from "../../fixtures/chaoshub"; + +describe('testing chaoshub', () => { + + beforeEach(() => { + cy.restoreLocalStorage(); + cy.requestLogin(Cypress.env('username'),Cypress.env('password')); + }); + + afterEach(() => { + cy.saveLocalStorage(); + }); + + + it('testing ChaosHub functionality via REST APIs', () => { + const accessToken = localStorage.getItem('accessToken'); + const projectID = localStorage.getItem('projectID'); + + + //create chaosHub + const addPayload = { + operationName: 'addChaosHub', + variables: { + projectID: projectID, + request: { + name: 'testing', + repoBranch: 'master', + description: '', + tags: [], + authType: 'NONE', + isPrivate: false, + repoURL: 'https://github.com/litmuschaos/chaos-charts', + }, + }, + query: add_hub, + }; + + //create chaoshub + cy.request({ + method: 'POST', + url: '/api/query', + body: addPayload, + headers: { + Authorization: `Bearer ${accessToken}` + } + }).then((response) => { + expect(response.status).to.equal(200); + expect(response.body.data.addChaosHub.name).to.equal('testing'); + }); + + //get hub id + const listPayload = { + operationName: 'listChaosHub', + variables: { + projectID: projectID, + request: { filter: { chaosHubName: "" } } + }, + query: list_hub, + }; + + cy.request({ + method: 'POST', + url: '/api/query', + body: listPayload, + headers: { + Authorization: `Bearer ${accessToken}` + } + }).then((response) => { + expect(response.status).to.equal(200); + localStorage.setItem('hubID',response.body.data.listChaosHub[1].id); + }); + }); + + it('negative test case for chaoshub', () => { + const accessToken = localStorage.getItem('accessToken'); + const projectID = localStorage.getItem('projectID'); + + const addPayload = { + operationName: 'addChaosHub', + variables: { + projectID: projectID, + request: { + name: 'testing', + repoBranch: 'master', + description: '', + tags: [], + authType: 'NONE', + isPrivate: false, + repoURL: 'https://github.com/litmuschaos/chaos-charts', + }, + }, + query: add_hub, + }; + + //create chaoshub with same name + cy.request({ + method: 'POST', + url: '/api/query', + body: addPayload, + headers: { + Authorization: `Bearer ${accessToken}` + } + }).then((response) => { + expect(response.body.errors[0].message).to.equal('Name Already exists'); + }); + }); + + it('edit chaoshub', () => { + const accessToken = localStorage.getItem('accessToken'); + const projectID = localStorage.getItem('projectID'); + const hubID = localStorage.getItem('hubID'); + + const updatePayload = { + operationName: 'updateChaosHub', + variables: { + projectID: projectID, + request: { + id: hubID, + name: 'sample', + repoBranch: 'master', + description: '', + authType: 'NONE', + isPrivate: false, + repoURL: 'https://github.com/litmuschaos/chaos-charts', + sshPrivateKey: '', + sshPublicKey: '', + tags: [], + token: '' + } + }, + query: update_hub + }; + + cy.request({ + method: 'POST', + url: '/api/query', + body: updatePayload, + headers: { + Authorization: `Bearer ${accessToken}` + } + }).then((response) => { + expect(response.status).to.equal(200); + expect(response.body.data.updateChaosHub.name).to.equal("sample") + }); + }); + + it('delete chaoshub', () => { + const accessToken = localStorage.getItem('accessToken'); + const projectID = localStorage.getItem('projectID'); + const hubID = localStorage.getItem('hubID'); + + //Negative test case for delete chaosHub + const deletePayload1 = { + operationName: 'deleteChaosHub', + variables: { + hubID: '123', + projectID: projectID + }, + query: delete_hub + }; + cy.request({ + method: 'POST', + url: '/api/query', + body: deletePayload1, + headers: { + Authorization: `Bearer ${accessToken}` + } + }).then((response) => { + expect(response.body.errors[0].message).to.equal('mongo: no documents in result'); + }); + + + const deletePayload = { + operationName: 'deleteChaosHub', + variables: { + hubID: hubID, + projectID: projectID + }, + query: delete_hub + }; + cy.request({ + method: 'POST', + url: '/api/query', + body: deletePayload, + headers: { + Authorization: `Bearer ${accessToken}` + } + }).then((response) => { + expect(response.status).to.equal(200); + expect(response.body.data.deleteChaosHub).to.equal(true); + }); + }); +}) diff --git a/chaoscenter/cypress/e2e/REST APIs/chaosinfra.cy.js b/chaoscenter/cypress/e2e/REST APIs/chaosinfra.cy.js new file mode 100644 index 000000000..36935d4b9 --- /dev/null +++ b/chaoscenter/cypress/e2e/REST APIs/chaosinfra.cy.js @@ -0,0 +1,220 @@ +import { create_env, list_infra, register_infra, update_infra, delete_infra } from "../../fixtures/chaosinfra"; + +describe('testing chaosinfra via REST APIs', () => { + + beforeEach(() => { + cy.restoreLocalStorage(); + cy.requestLogin(Cypress.env('username'),Cypress.env('password')); + }); + + afterEach(() => { + cy.saveLocalStorage(); + }); + + + it('Create Environment and Chaos infra', () => { + const accessToken = localStorage.getItem('accessToken'); + const projectID = localStorage.getItem('projectID'); + + //create Environment + const createEnv_payload = { + operatioName: 'createEnvironment', + variables: { + projectID: projectID, + request: { + description: "", + environmentID: "exp99", + name: "exp99", + tags: [], + type: "NON_PROD" + } + }, + query: create_env + }; + + cy.request({ + method: 'POST', + url: '/api/query', + body: createEnv_payload, + headers: { + Authorization: `Bearer ${accessToken}` + } + }).then((response) => { + expect(response.status).to.equal(200); + expect(response.body.data.createEnvironment.name).to.equal("exp99"); + }); + + + //create Infra + const registerInfra_payload = { + operationName: 'registerInfra', + variables: { + projectID: projectID, + request: { + infraScope: 'cluster', + name: "exp99", + environmentID: "exp99", + description: '', + platformName: 'Kubernetes', + infraNamespace: 'litmus', + infraNsExists: false, + infraSaExists: false, + infrastructureType: 'Kubernetes', + serviceAccount: 'litmus', + skipSsl: false, + } + }, + query: register_infra + }; + + cy.request({ + method: 'POST', + url: '/api/query', + body: registerInfra_payload, + headers: { + Authorization: `Bearer ${accessToken}` + } + }).then((response) => { + expect(response.status).to.equal(200); + expect(response.body.data).to.have.property('registerInfra'); + }) + + + //get InfraID + const listInfra_payload = { + operationName: 'listInfras', + variables: { + projectID: projectID, + request: { environmentIDs: ["exp99"] }, + }, + query: list_infra + }; + + cy.request({ + method: 'POST', + url: '/api/query', + headers: { + Authorization: `Bearer ${accessToken}` + }, + body: listInfra_payload, + }).then((response) => { + expect(response.status).to.equal(200); + localStorage.setItem('infraID', response.body.data.listInfras.infras[0].infraID); + }); + }); + + + + it('Negative test case [Get error for creating environment with existing environment name', () => { + const accessToken = localStorage.getItem('accessToken'); + const projectID = localStorage.getItem('projectID'); + + //create Environment + const createEnv_payload = { + operatioName: 'createEnvironment', + variables: { + projectID: projectID, + request: { + description: "", + environmentID: "exp99", + name: "exp99", + tags: [], + type: "NON_PROD" + } + }, + query: create_env + }; + + //create environment with same name + cy.request({ + method: 'POST', + url: '/api/query', + body: createEnv_payload, + headers: { + Authorization: `Bearer ${accessToken}` + } + }).then((response) => { + expect(response.status).to.equal(200); + expect(response.body.errors[0].message).to.equal('write exception: write errors: [E11000 duplicate key error collection: litmus.environment index: environment_id_1 dup key: { environment_id: "exp99" }]'); + }); + }); + + it('Update chaos infra', () => { + const accessToken = localStorage.getItem('accessToken'); + const projectID = localStorage.getItem('projectID'); + const infraID = localStorage.getItem('infraID'); + + //update Infra + const updateInfra_payload = { + operationName: 'getInfraManifest', + variables: { + projectID: projectID, + infraID: infraID, + upgrade: true, + }, + query: update_infra, + }; + + cy.request({ + method: 'POST', + url: '/api/query', + headers: { + Authorization: `Bearer ${accessToken}` + }, + body: updateInfra_payload, + }).then((response) => { + expect(response.status).to.equal(200); + expect(response.body.data).to.have.property('getInfraManifest'); + }); + }); + + it('Disable chaos infra', () => { + const accessToken = localStorage.getItem('accessToken'); + const projectID = localStorage.getItem('projectID'); + const infraID = localStorage.getItem('infraID'); + + //negative test case for disable infra + const deleteInfra_payload1 = { + operationName: 'deleteInfra', + variables: { + projectID: projectID, + infraID: '123', + }, + query: delete_infra, + }; + + cy.request({ + method: 'POST', + url: '/api/query', + headers: { + Authorization: `Bearer ${accessToken}` + }, + body: deleteInfra_payload1, + }).then((response) => { + expect(response.body.errors[0].message).to.equal('mongo: no documents in result'); + }); + + + //disable Infra + const deleteInfra_payload = { + operationName: 'deleteInfra', + variables: { + projectID: projectID, + infraID: infraID, + }, + query: delete_infra, + }; + + cy.request({ + method: 'POST', + url: '/api/query', + headers: { + Authorization: `Bearer ${accessToken}` + }, + body: deleteInfra_payload, + }).then((response) => { + expect(response.status).to.equal(200); + expect(response.body.data.deleteInfra).to.equal("infra deleted successfully"); + }); + }); +}); diff --git a/chaoscenter/cypress/e2e/REST APIs/login.cy.js b/chaoscenter/cypress/e2e/REST APIs/login.cy.js new file mode 100644 index 000000000..eb16e1a9e --- /dev/null +++ b/chaoscenter/cypress/e2e/REST APIs/login.cy.js @@ -0,0 +1,20 @@ +describe('Testing login page of chaoscenter via REST APIs', () => { + it('testing login via REST API', () => { + cy.requestLogin(Cypress.env('username'),Cypress.env('password')); + }); + + it('Negative test case[Login with incorrect username and password]', () => { + cy.request({ + method: "POST", + url: "auth/login", + failOnStatusCode: false, + body: { + username: 'invalid_user', + password: 'invalid_password', + }, + }).then((response) => { + expect(response.status).to.equal(400); + expect(response.body.error).to.equal('user does not exist'); + }); + }) +}); \ No newline at end of file diff --git a/chaoscenter/cypress/e2e/UI/Usermanagment.cy.js b/chaoscenter/cypress/e2e/UI/Usermanagment.cy.js new file mode 100644 index 000000000..3c83da568 --- /dev/null +++ b/chaoscenter/cypress/e2e/UI/Usermanagment.cy.js @@ -0,0 +1,50 @@ +describe('testing for User management', () => { + let user; + before(() => { + cy.fixture("Users").then((User) => { + user = User.user2; + }); + }); + + beforeEach(() => { + cy.login(Cypress.env('username'),Cypress.env('password')); + }); + + it('Create User', () => { + cy.get('.chaos_MainNav-module_navItem_MxEeXl').eq(1).click(); + cy.contains('User Management').click(); + cy.contains('New User').click(); + cy.get('input[name="name"]').type(user.name); + cy.get('input[name="email"]').type(user.email); + cy.get('input[name="username"]').type(user.username); + cy.get('input[name="password"]').type(user.password); + cy.get('input[name="reEnterPassword"]').type(user.password); + cy.intercept('POST','/auth/create_user').as('user'); + cy.get('button[aria-label="Confirm"]').click(); + cy.wait('@user'); + }); + + it('Edit User', () => { + cy.get('.chaos_MainNav-module_navItem_MxEeXl').eq(1).click(); + cy.contains('User Management').click(); + cy.get('.bp3-popover-wrapper .bp3-button').then((buttons) => { + cy.wrap(buttons[buttons.length - 1]).click(); + }); + cy.contains('Reset Password').click(); + cy.get('input[name="password"]').type('22222'); + cy.get('input[name="reEnterPassword"]').type('22222'); + cy.intercept('POST','/auth/reset/password').as('reset'); + cy.contains('Confirm').click(); + cy.wait('@reset'); + }); + + it('Disable User', () => { + cy.get('.chaos_MainNav-module_navItem_MxEeXl').eq(1).click(); + cy.contains('User Management').click(); + cy.get('.bp3-popover-wrapper .bp3-button').then((buttons) => { + cy.wrap(buttons[buttons.length - 1]).click(); + }); + cy.contains('Disable User').click(); + cy.contains('Confirm').click(); + }); +}); \ No newline at end of file diff --git a/chaoscenter/cypress/e2e/UI/chaoshub.cy.js b/chaoscenter/cypress/e2e/UI/chaoshub.cy.js new file mode 100644 index 000000000..a9a86f030 --- /dev/null +++ b/chaoscenter/cypress/e2e/UI/chaoshub.cy.js @@ -0,0 +1,70 @@ +describe('testing chaoshub via UI', () => { + beforeEach(() => { + cy.login(Cypress.env('username'),Cypress.env('password')); + }); + + it('Create new ChaosHub', () => { + cy.visit('/dashboard'); + cy.contains('ChaosHubs').click(); + cy.contains('Litmus ChaosHub').should('exist'); + cy.contains('Connected').should('exist'); + + //Add new chaoshub with public repo + cy.contains('New ChaosHub').click(); + cy.get('input[name="name"]').type('testing1'); + cy.contains('Continue').click(); + cy.get('input[name="repoURL"]').type('https://github.com/litmuschaos/chaos-charts.git'); + cy.get('input[name="repoBranch"]').type('master'); + cy.intercept('POST','/api/query').as('Query'); + cy.get('button[aria-label = "Connect Hub"]').click(); + cy.wait('@Query'); + cy.on('window:alert', () => { + expect(message).to.equal('Chaoshub added successfully'); + }); + + //Checks if chaoshub is connected + cy.get('[class="chaos_ChaosHubs-module_connectionStatus_PWHgAA"]').eq(1).contains('Connected').should('exist'); + cy.get('.bp3-card').eq(1).click(); + cy.contains('ChaosHubs').click(); + + }); + + it('negative test case for chaoshub [Get error when creating chaoshub with same name]', () => { + cy.contains('ChaosHubs').click(); + cy.contains('New ChaosHub').click(); + cy.get('input[name="name"]').type('testing1'); + cy.contains('Continue').click(); + cy.get('input[name="repoURL"]').type('1'); + cy.get('input[name="repoBranch"]').type('1'); + cy.get('button[aria-label = "Connect Hub"]').click(); + cy.on('window:alert', () => { + expect(message).to.equal('Name Already exists'); + }); + }); + + it('Edit ChaosHub [Change chaoshub name]', () => { + cy.visit('/login'); + cy.contains('ChaosHubs').click(); + cy.get('.Card--cardMenu .bp3-button').eq(1).click(); + cy.contains('Edit Hub').click(); + cy.get('input[name="name"]').clear().type('sample1'); + cy.contains('Continue').click(); + cy.intercept('POST','/api/query').as('Query'); + cy.get('button[aria-label = "Edit ChaosHub"]').click(); + cy.wait('@Query'); + cy.reload(); + cy.on('window:alert', () => { + expect(message).to.equal('Chaoshub updated successfully'); + }); + }); + + it('Delete ChaosHub', () => { + cy.visit('/login'); + cy.contains('ChaosHubs').click(); + cy.get('.Card--cardMenu .bp3-button').eq(1).click(); + cy.contains('Delete Hub').click(); + cy.on('window:alert', () => { + expect(message).to.equal('Hub Deleted Successfully'); + }); + }); +}); \ No newline at end of file diff --git a/chaoscenter/cypress/e2e/UI/chaosinfra.cy.js b/chaoscenter/cypress/e2e/UI/chaosinfra.cy.js new file mode 100644 index 000000000..aeba8210f --- /dev/null +++ b/chaoscenter/cypress/e2e/UI/chaosinfra.cy.js @@ -0,0 +1,60 @@ +describe('testing chaosinfra via UI', () => { + beforeEach(() => { + cy.login(Cypress.env('username'),Cypress.env('password')); + }); + + it('Creating chaosinfra', () => { + //create Environment + cy.contains('Environments').click(); + cy.contains('New Environment').click(); + cy.get('input[name="name"]').type('exp1'); + cy.contains('Save').click(); + + //create chaosinfra + cy.get('.TableV2--row').eq(0).click(); + cy.contains('Enable Chaos').click(); + cy.get('.bp3-form-content').type('exp1'); + cy.contains('Next').click(); + cy.contains('Next').click(); + cy.contains('Download').click(); + cy.on('window alert', () => { + expect(message).to.equal('Chaos infrastructure successfully created'); + }); + cy.contains('Done').click(); + }); + + it('negative test case for environment [Get error when creating environment with same name]', () => { + cy.contains('Environments').click(); + cy.contains('New Environment').click(); + cy.get('input[name="name"]').type('exp1'); + cy.contains('Save').click(); + cy.on('alert message', () => { + expect(message).to.equal('write exception: write errors: [E11000 duplicate key error collection: litmus.environment index: environment_id_1 dup key: { environment_id: "exp1" }]'); + }); + }); + + it('Editing chaosinfra', () => { + cy.contains('Environments').click(); + cy.get('.TableV2--row').eq(0).click(); + cy.contains('Update').eq(0).click(); + cy.get('button[aria-label= "Download"]').click(); + cy.on('window alert', () => { + expect(message).to.equal('Download request successfully sent'); + }); + cy.contains('Done').click(); + cy.on('window alert', () => { + expect(message).to.equal('Upgrade manifest downloaded successfully'); + }); + }); + + it('Disable chaosinfra', () => { + cy.contains('Environments').click(); + cy.get('.TableV2--row').eq(0).click(); + cy.get('.Card--dots').eq(0).click(); + cy.contains('Disable').click(); + cy.contains('Confirm').click(); + cy.on('window alert', () => { + expect(message).to.equal('Chaos Infrastructure Successfully Disabled'); + }); + }); +}); \ No newline at end of file diff --git a/chaoscenter/cypress/e2e/UI/chaosprobes.cy.js b/chaoscenter/cypress/e2e/UI/chaosprobes.cy.js new file mode 100644 index 000000000..92aa460aa --- /dev/null +++ b/chaoscenter/cypress/e2e/UI/chaosprobes.cy.js @@ -0,0 +1,252 @@ +describe('testing of HTTP chaos probes', () => { + beforeEach(() => { + cy.login(Cypress.env('username'),Cypress.env('password')); + }); + + it('create chaos probe', () => { + cy.contains('Resilience Probes').click(); + cy.contains('New Probe').click(); + cy.contains('HTTP').click(); + cy.get('input[name="name"]').type('exp11'); + cy.contains('Configure Properties').click(); + cy.get('input[name="kubernetesHTTPProperties.probeTimeout"]').type('1s'); + cy.get('input[name="kubernetesHTTPProperties.interval"]').type('1s'); + cy.get('input[name="kubernetesHTTPProperties.retry"]').type('5'); + cy.get('input[name="kubernetesHTTPProperties.attempt"]').type('5'); + cy.get('input[name="kubernetesHTTPProperties.probePollingInterval"]').type('1s'); + cy.get('input[name="kubernetesHTTPProperties.evaluationTimeout"]').type('1s'); + cy.contains('Configure Details').click(); + cy.get('input[name="kubernetesHTTPProperties.url"]').type('http://localhost:3000'); + cy.get('input[name="kubernetesHTTPProperties.methodDropdown"]').type('GET'); + cy.contains('GET').click(); + cy.get('input[name="kubernetesHTTPProperties.method.get.criteria"]').type('=='); + cy.contains('==').click(); + cy.get('input[name="kubernetesHTTPProperties.method.get.responseCode"]').type('200'); + cy.contains('Setup Probe').click(); + }); + + it('negative test case for chaos probe [Get error when creating chaos Probe with same name]', () => { + cy.contains('Resilience Probes').click(); + cy.contains('New Probe').click(); + cy.contains('HTTP').click(); + cy.get('input[name="name"]').type('exp11'); + cy.contains('Configure Properties').click(); + cy.contains('The name exp11 is not unique and was already used before, please provide a unique name').should('exist'); + }); + + it('update chaos probe', () => { + cy.contains('Resilience Probes').click(); + cy.get('.TableV2--cell .bp3-button').then(buttons => { + cy.wrap(buttons[buttons.length - 1]).click(); + }); + cy.contains('Edit Probe').click(); + cy.contains('Configure Properties').click(); + cy.get('input[name="kubernetesHTTPProperties.probeTimeout"]').clear().type('3s'); + cy.contains('Configure Details').click(); + cy.contains('Setup Probe').click(); + cy.on('window alert', () => { + expect(message).to.equal('Updated successfully'); + }); + }); + + it('delete chaos probe', () => { + cy.contains('Resilience Probes').click(); + cy.get('.TableV2--cell .bp3-button').then(buttons => { + cy.wrap(buttons[buttons.length - 1]).click(); + }); + cy.contains('Delete Probe').click(); + cy.intercept('POST','/api/query').as('Query'); + cy.contains('Confirm').click(); + cy.wait('@Query'); + }); +}); + +describe('testing of CMD chaos probes', () => { + beforeEach(() => { + cy.login(Cypress.env('username'),Cypress.env('password')); + }); + + it('create chaos probe', () => { + cy.contains('Resilience Probes').click(); + cy.contains('New Probe').click(); + cy.contains('Command').click(); + cy.get('input[name="name"]').type('exp22'); + cy.contains('Configure Properties').click(); + cy.get('input[name="kubernetesCMDProperties.probeTimeout"]').type('1s'); + cy.get('input[name="kubernetesCMDProperties.interval"]').type('1s'); + cy.get('input[name="kubernetesCMDProperties.retry"]').type('5'); + cy.get('input[name="kubernetesCMDProperties.attempt"]').type('5'); + cy.get('input[name="kubernetesCMDProperties.probePollingInterval"]').type('1s'); + cy.get('input[name="kubernetesCMDProperties.evaluationTimeout"]').type('1s'); + cy.contains('Configure Details').click(); + cy.get('textarea[name="kubernetesCMDProperties.command"]').type('run'); + cy.get('input[name="kubernetesCMDProperties.comparator.type"]').type('int'); + cy.contains('Int').click(); + cy.get('input[name="kubernetesCMDProperties.comparator.criteria"]').type('=='); + cy.contains('==').click(); + cy.get('input[name="kubernetesCMDProperties.comparator.value"]').type('1'); + cy.contains('Setup Probe').click(); + }); + + it('negative test case for chaos probe [Get error when creating chaos Probe with same name]', () => { + cy.contains('Resilience Probes').click(); + cy.contains('New Probe').click(); + cy.contains('Command').click(); + cy.get('input[name="name"]').type('exp22'); + cy.contains('Configure Properties').click(); + cy.contains('The name exp22 is not unique and was already used before, please provide a unique name').should('exist'); + }); + + it('update chaos probe', () => { + cy.contains('Resilience Probes').click(); + cy.get('.TableV2--cell .bp3-button').then(buttons => { + cy.wrap(buttons[buttons.length - 1]).click(); + }); + cy.contains('Edit Probe').click(); + cy.contains('Configure Properties').click(); + cy.get('input[name="kubernetesCMDProperties.probeTimeout"]').clear().type('3s'); + cy.contains('Configure Details').click(); + cy.contains('Setup Probe').click(); + cy.on('window alert', () => { + expect(message).to.equal('Updated successfully'); + }); + }); + + it('delete chaos probe', () => { + cy.contains('Resilience Probes').click(); + cy.get('.TableV2--cell .bp3-button').then(buttons => { + cy.wrap(buttons[buttons.length - 1]).click(); + }); + cy.contains('Delete Probe').click(); + cy.intercept('POST','/api/query').as('Query'); + cy.contains('Confirm').click(); + cy.wait('@Query'); + }); +}); + +describe('testing of Prometheus chaos probes', () => { + beforeEach(() => { + cy.login(Cypress.env('username'),Cypress.env('password')); + }); + + it('create chaos probe', () => { + cy.contains('Resilience Probes').click(); + cy.contains('New Probe').click(); + cy.contains('Prometheus').click(); + cy.get('input[name="name"]').type('exp33'); + cy.contains('Configure Properties').click(); + cy.get('input[name="promProperties.probeTimeout"]').type('1s'); + cy.get('input[name="promProperties.interval"]').type('1s'); + cy.get('input[name="promProperties.retry"]').type('5'); + cy.get('input[name="promProperties.attempt"]').type('5'); + cy.get('input[name="promProperties.probePollingInterval"]').type('1s'); + cy.get('input[name="promProperties.evaluationTimeout"]').type('1s'); + cy.contains('Configure Details').click(); + cy.get('input[name="promProperties.endpoint"]').type('http://localhost:3000'); + cy.get('textarea[name="promProperties.query"]').type('run'); + cy.get('input[name="promProperties.comparator.type"]').type('int'); + cy.contains('Int').click(); + cy.get('input[name="promProperties.comparator.criteria"]').type('=='); + cy.contains('==').click(); + cy.get('input[name="promProperties.comparator.value"]').type('1'); + cy.contains('Setup Probe').click(); + }); + + it('negative test case for chaos probe [Get error when creating chaos Probe with same name]', () => { + cy.contains('Resilience Probes').click(); + cy.contains('New Probe').click(); + cy.contains('Prometheus').click(); + cy.get('input[name="name"]').type('exp33'); + cy.contains('Configure Properties').click(); + cy.contains('The name exp33 is not unique and was already used before, please provide a unique name').should('exist'); + }); + + it('update chaos probe', () => { + cy.contains('Resilience Probes').click(); + cy.get('.TableV2--cell .bp3-button').then(buttons => { + cy.wrap(buttons[buttons.length - 1]).click(); + }); + cy.contains('Edit Probe').click(); + cy.contains('Configure Properties').click(); + cy.get('input[name="promProperties.probeTimeout"]').clear().type('3s'); + cy.contains('Configure Details').click(); + cy.contains('Setup Probe').click(); + cy.on('window alert', () => { + expect(message).to.equal('Updated successfully'); + }); + }); + + it('delete chaos probe', () => { + cy.contains('Resilience Probes').click(); + cy.get('.TableV2--cell .bp3-button').then(buttons => { + cy.wrap(buttons[buttons.length - 1]).click(); + }); + cy.contains('Delete Probe').click(); + cy.intercept('POST','/api/query').as('Query'); + cy.contains('Confirm').click(); + cy.wait('@Query'); + }); +}); + +describe('testing of kubernetes chaos probes', () => { + beforeEach(() => { + cy.login(Cypress.env('username'),Cypress.env('password')); + }); + + it('create chaos probe', () => { + cy.contains('Resilience Probes').click(); + cy.contains('New Probe').click(); + cy.contains('Kubernetes').click(); + cy.get('input[name="name"]').type('exp44'); + cy.contains('Configure Properties').click(); + cy.get('input[name="k8sProperties.probeTimeout"]').type('1s'); + cy.get('input[name="k8sProperties.interval"]').type('1s'); + cy.get('input[name="k8sProperties.retry"]').type('5'); + cy.get('input[name="k8sProperties.attempt"]').type('5'); + cy.get('input[name="k8sProperties.probePollingInterval"]').type('1s'); + cy.get('input[name="k8sProperties.evaluationTimeout"]').type('1s'); + cy.contains('Configure Details').click(); + cy.get('input[name="k8sProperties.group"]').type('book'); + cy.get('input[name="k8sProperties.version"]').type('v1'); + cy.get('input[name="k8sProperties.resource"]').type('store'); + cy.get('input[name="k8sProperties.namespace"]').type('alpha'); + cy.get('input[name="k8sProperties.operation"]').type('delete'); + cy.contains('Delete').click(); + cy.contains('Setup Probe').click(); + }); + + it('negative test case for chaos probe [Get error when creating chaos Probe with same name]', () => { + cy.contains('Resilience Probes').click(); + cy.contains('New Probe').click(); + cy.contains('Kubernetes').click(); + cy.get('input[name="name"]').type('exp44'); + cy.contains('Configure Properties').click(); + cy.contains('The name exp44 is not unique and was already used before, please provide a unique name').should('exist'); + }); + + it('update chaos probe', () => { + cy.contains('Resilience Probes').click(); + cy.get('.TableV2--cell .bp3-button').then(buttons => { + cy.wrap(buttons[buttons.length - 1]).click(); + }); + cy.contains('Edit Probe').click(); + cy.contains('Configure Properties').click(); + cy.get('input[name="k8sProperties.probeTimeout"]').clear().type('3s'); + cy.contains('Configure Details').click(); + cy.contains('Setup Probe').click(); + cy.on('window alert', () => { + expect(message).to.equal('Updated successfully'); + }); + }); + + it('delete chaos probe', () => { + cy.contains('Resilience Probes').click(); + cy.get('.TableV2--cell .bp3-button').then(buttons => { + cy.wrap(buttons[buttons.length - 1]).click(); + }); + cy.contains('Delete Probe').click(); + cy.intercept('POST','/api/query').as('Query'); + cy.contains('Confirm').click(); + cy.wait('@Query'); + }); +}); \ No newline at end of file diff --git a/chaoscenter/cypress/e2e/UI/login.cy.js b/chaoscenter/cypress/e2e/UI/login.cy.js new file mode 100644 index 000000000..a485b1308 --- /dev/null +++ b/chaoscenter/cypress/e2e/UI/login.cy.js @@ -0,0 +1,15 @@ +describe('Testing login page of chaoscenter via UI', () => { + it('Login with correct username and password', () => { + cy.login(Cypress.env('username'),Cypress.env('password')); + }); + + it('Negative test case[Login with incorrect username and password]', () => { + cy.visit('/login'); + cy.get('input[name="username"]').type('invalid_user'); + cy.get('input[name="password"]').type('invalid_password'); + cy.get('button[type="submit"]').click(); + cy.on('window:alert', (message) => { + expect(message).to.equal('user does not exist'); + }); + }); +}); \ No newline at end of file diff --git a/chaoscenter/cypress/fixtures/Users.json b/chaoscenter/cypress/fixtures/Users.json new file mode 100644 index 000000000..8f4300dbd --- /dev/null +++ b/chaoscenter/cypress/fixtures/Users.json @@ -0,0 +1,16 @@ +{ + "user1": { + "username": "user1", + "password": "user1", + "role": "user", + "email": "user1@litmus.com", + "name": "Test Account 1" + }, + "user2": { + "username": "user2", + "password": "user2", + "role": "user", + "email": "user2@litmus.com", + "name": "Test Account 2" + } +} \ No newline at end of file diff --git a/chaoscenter/cypress/fixtures/chaoshub.js b/chaoscenter/cypress/fixtures/chaoshub.js new file mode 100644 index 000000000..efa57ae13 --- /dev/null +++ b/chaoscenter/cypress/fixtures/chaoshub.js @@ -0,0 +1,59 @@ +export const add_hub = ` + mutation addChaosHub($projectID: ID!, $request: CreateChaosHubRequest!) { + addChaosHub(request: $request, projectID: $projectID) { + name + repoURL + repoBranch + hubType + isPrivate + __typename + } + } + ` + +export const update_hub =` + mutation updateChaosHub($projectID: ID!, $request: UpdateChaosHubRequest!) { + updateChaosHub(projectID: $projectID, request: $request) { + name + repoURL + repoBranch + __typename + } + } + ` + +export const delete_hub =` + mutation deleteChaosHub($hubID: ID!, $projectID: ID!) { + deleteChaosHub(hubID: $hubID, projectID: $projectID) +} +` +export const list_hub = ` + query listChaosHub($projectID: ID!, $request: ListChaosHubRequest!) { + listChaosHub(projectID: $projectID, request: $request) { + id + repoURL + repoBranch + authType + isAvailable + totalFaults + totalExperiments + name + token + sshPublicKey + sshPrivateKey + lastSyncedAt + tags + isDefault + isPrivate + createdBy { + username + } + updatedBy { + username + } + createdAt + updatedAt + description + } +} +` diff --git a/chaoscenter/cypress/fixtures/chaosinfra.js b/chaoscenter/cypress/fixtures/chaosinfra.js new file mode 100644 index 000000000..eb9aeeb3d --- /dev/null +++ b/chaoscenter/cypress/fixtures/chaosinfra.js @@ -0,0 +1,67 @@ +export const create_env = ` + mutation createEnvironment($projectID: ID!, $request: CreateEnvironmentRequest!) { + createEnvironment(request: $request, projectID: $projectID) { + environmentID + name + description + tags + projectID + type + createdAt + updatedAt + isRemoved + infraIDs + __typename + } + }` + +export const register_infra = ` + mutation registerInfra($projectID: ID!, $request: RegisterInfraRequest!) { + registerInfra(projectID: $projectID, request: $request) { + manifest + } + } +` + +export const list_infra = ` + query listInfras($projectID: ID!, $request: ListInfraRequest) { + listInfras(projectID: $projectID, request: $request) { + totalNoOfInfras + infras { + infraID + name + environmentID + description + platformName + isActive + isInfraConfirmed + updatedAt + createdAt + noOfExperiments + noOfExperimentRuns + lastExperimentTimestamp + infraNamespace + serviceAccount + infraScope + startTime + version + tags + updateStatus + __typename + } + __typename + } + } +` + +export const update_infra = ` + query getInfraManifest($projectID: ID!, $infraID: ID!, $upgrade: Boolean!) { + getInfraManifest(projectID: $projectID, infraID: $infraID, upgrade: $upgrade) +} +` + +export const delete_infra = ` + mutation deleteInfra($projectID: ID!, $infraID: String!) { + deleteInfra(projectID: $projectID, infraID: $infraID) + } +` \ No newline at end of file diff --git a/chaoscenter/cypress/fixtures/chaosprobes.js b/chaoscenter/cypress/fixtures/chaosprobes.js new file mode 100644 index 000000000..027ec686c --- /dev/null +++ b/chaoscenter/cypress/fixtures/chaosprobes.js @@ -0,0 +1,111 @@ +export const add_httpProbe = ` + mutation addKubernetesHTTPProbe($projectID: ID!, $request: ProbeRequest!) { + addProbe(projectID: $projectID, request: $request) { + name + description + type + kubernetesHTTPProperties { + probeTimeout + interval + url + insecureSkipVerify + } + } +}` + +export const update_httpProbe = ` + mutation updateProbe($request: ProbeRequest!, $projectID: ID!) { + updateProbe(request: $request, projectID: $projectID) +}` + +export const delete_httpprobe = ` + mutation deleteProbe($probeName: ID!, $projectID: ID!) { + deleteProbe(probeName: $probeName, projectID: $projectID) +}` + + +export const add_CMDProbe = ` + mutation addKubernetesCMDProbe($projectID: ID!, $request: ProbeRequest!) { + addProbe(projectID: $projectID, request: $request) { + name + description + type + kubernetesCMDProperties { + probeTimeout + interval + command + comparator { + type + value + } + } + } +}` + +export const update_CMDProbe = ` + mutation updateProbe($request: ProbeRequest!, $projectID: ID!) { + updateProbe(request: $request, projectID: $projectID) +}` + +export const delete_CMDprobe = ` + mutation deleteProbe($probeName: ID!, $projectID: ID!) { + deleteProbe(probeName: $probeName, projectID: $projectID) +}` + + +export const add_PROMProbe = ` + mutation addPROMProbe($projectID: ID!, $request: ProbeRequest!) { + addProbe(projectID: $projectID, request: $request) { + name + description + type + promProperties { + probeTimeout + interval + retry + comparator { + type + value + } + } + } +}` + +export const update_PROMProbe = ` + mutation updateProbe($request: ProbeRequest!, $projectID: ID!) { + updateProbe(request: $request, projectID: $projectID) +}` + +export const delete_PROMProbe = ` + mutation deleteProbe($probeName: ID!, $projectID: ID!) { + deleteProbe(probeName: $probeName, projectID: $projectID) +}` + + +export const add_k8sProbe = ` + mutation addK8SProbe($projectID: ID!, $request: ProbeRequest!) { + addProbe(projectID: $projectID, request: $request) { + name + description + type + k8sProperties { + probeTimeout + interval + retry + group + version + resource + namespace + } + } +}` + +export const update_k8sProbe = ` + mutation updateProbe($request: ProbeRequest!, $projectID: ID!) { + updateProbe(request: $request, projectID: $projectID) +}` + +export const delete_k8sProbe = ` + mutation deleteProbe($probeName: ID!, $projectID: ID!) { + deleteProbe(probeName: $probeName, projectID: $projectID) +}` \ No newline at end of file diff --git a/chaoscenter/cypress/support/commands.js b/chaoscenter/cypress/support/commands.js new file mode 100644 index 000000000..b5663d773 --- /dev/null +++ b/chaoscenter/cypress/support/commands.js @@ -0,0 +1,26 @@ +// Custom function for login +Cypress.Commands.add('login', (Username,Password) => { + cy.visit('/login'); + cy.get('input[name="username"]').type(Username); + cy.get('input[name="password"]').type(Password); + cy.intercept('POST','auth/login').as('login'); + cy.get('button[type="submit"]').click({ }); + cy.wait('@login'); + cy.url().should('include','/dashboard'); + }); + +// Custom function for login through APIs for setting accessToken and projectID +Cypress.Commands.add("requestLogin", (loginName, loginPassword) => { + cy.request({ + method: "POST", + url: "auth/login", + body: { + username: loginName, + password: loginPassword, + }, + }).then((response) => { + expect(response.status).to.equal(200); + localStorage.setItem("accessToken", response.body.accessToken); + localStorage.setItem('projectID', response.body.projectID); + }); +}); \ No newline at end of file diff --git a/chaoscenter/cypress/support/e2e.js b/chaoscenter/cypress/support/e2e.js new file mode 100644 index 000000000..5978a0ca1 --- /dev/null +++ b/chaoscenter/cypress/support/e2e.js @@ -0,0 +1,2 @@ +import './commands'; +import "cypress-localstorage-commands"; \ No newline at end of file diff --git a/chaoscenter/package-lock.json b/chaoscenter/package-lock.json new file mode 100644 index 000000000..8e2b1bcb3 --- /dev/null +++ b/chaoscenter/package-lock.json @@ -0,0 +1,1990 @@ +{ + "name": "chaoscenter", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "devDependencies": { + "cypress": "^13.7.0", + "cypress-localstorage-commands": "^2.2.5" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@cypress/request": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.1.tgz", + "integrity": "sha512-TWivJlJi8ZDx2wGOw1dbLuHJKUYX7bWySw377nlnGOW3hP9/MUKIsEdXT/YngWxVdgNCHRBmFlBipE+5/2ZZlQ==", + "dev": true, + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "http-signature": "~1.3.6", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "performance-now": "^2.1.0", + "qs": "6.10.4", + "safe-buffer": "^5.1.2", + "tough-cookie": "^4.1.3", + "tunnel-agent": "^0.6.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@cypress/xvfb": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", + "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", + "dev": true, + "dependencies": { + "debug": "^3.1.0", + "lodash.once": "^4.1.1" + } + }, + "node_modules/@cypress/xvfb/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/@types/node": { + "version": "20.11.29", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.29.tgz", + "integrity": "sha512-P99thMkD/1YkCvAtOd6/zGedKNA0p2fj4ZpjCzcNiSCBWgm3cNRTBfa/qjFnsKkkojxu4vVLtWpesnZ9+ap+gA==", + "dev": true, + "optional": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/sinonjs__fake-timers": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz", + "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==", + "dev": true + }, + "node_modules/@types/sizzle": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.8.tgz", + "integrity": "sha512-0vWLNK2D5MT9dg0iOo8GlKguPAU02QjmZitPEsXRuJXU/OGIOt9vT9Fc26wtYuavLxtO45v9PGleoL9Z0k1LHg==", + "dev": true + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "dev": true, + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", + "dev": true + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", + "dev": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/blob-util": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz", + "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==", + "dev": true + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/cachedir": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.4.0.tgz", + "integrity": "sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/check-more-types": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", + "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-table3": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cypress": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.7.0.tgz", + "integrity": "sha512-UimjRSJJYdTlvkChcdcfywKJ6tUYuwYuk/n1uMMglrvi+ZthNhoRYcxnWgTqUtkl17fXrPAsD5XT2rcQYN1xKA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@cypress/request": "^3.0.0", + "@cypress/xvfb": "^1.2.4", + "@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.0", + "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.4", + "enquirer": "^2.3.6", + "eventemitter2": "6.4.7", + "execa": "4.1.0", + "executable": "^4.1.1", + "extract-zip": "2.0.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.8.3", + "lodash": "^4.17.21", + "log-symbols": "^4.0.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.5.3", + "supports-color": "^8.1.1", + "tmp": "~0.2.1", + "untildify": "^4.0.0", + "yauzl": "^2.10.0" + }, + "bin": { + "cypress": "bin/cypress" + }, + "engines": { + "node": "^16.0.0 || ^18.0.0 || >=20.0.0" + } + }, + "node_modules/cypress-localstorage-commands": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/cypress-localstorage-commands/-/cypress-localstorage-commands-2.2.5.tgz", + "integrity": "sha512-07zpwzWdY+uPi1NEHFhWQNylIJqRxR78Ile05L6WT8h1Gz0OaxgBSZRuzp+pqUni/3Pk4d2ieq/cSh++ZmujEA==", + "dev": true, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "cypress": ">=2.1.0" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dayjs": { + "version": "1.11.10", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enquirer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eventemitter2": { + "version": "6.4.7", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz", + "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==", + "dev": true + }, + "node_modules/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/executable": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", + "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", + "dev": true, + "dependencies": { + "pify": "^2.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true, + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/getos": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", + "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==", + "dev": true, + "dependencies": { + "async": "^3.2.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "dev": true, + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-signature": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", + "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^2.0.2", + "sshpk": "^1.14.1" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true, + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dev": true, + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dev": true, + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsprim": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", + "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, + "node_modules/lazy-ass": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", + "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==", + "dev": true, + "engines": { + "node": "> 0.8" + } + }, + "node_modules/listr2": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz", + "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==", + "dev": true, + "dependencies": { + "cli-truncate": "^2.1.0", + "colorette": "^2.0.16", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.5.1", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + }, + "peerDependenciesMeta": { + "enquirer": { + "optional": true + } + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ospath": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", + "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==", + "dev": true + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/proxy-from-env": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", + "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==", + "dev": true + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.10.4", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.4.tgz", + "integrity": "sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "node_modules/request-progress": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", + "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==", + "dev": true, + "dependencies": { + "throttleit": "^1.0.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/rfdc": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz", + "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==", + "dev": true + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sshpk": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", + "dev": true, + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/throttleit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.1.tgz", + "integrity": "sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "node_modules/tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "dev": true, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "dev": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true, + "optional": true + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + } + } +} diff --git a/chaoscenter/package.json b/chaoscenter/package.json new file mode 100644 index 000000000..18371f8b7 --- /dev/null +++ b/chaoscenter/package.json @@ -0,0 +1,6 @@ +{ + "devDependencies": { + "cypress": "^13.7.0", + "cypress-localstorage-commands": "^2.2.5" + } +}