From aab7e1e85ad4a0f511b1adaf3fe2b978bb61bf99 Mon Sep 17 00:00:00 2001 From: Alexandre Garbe Date: Mon, 9 Sep 2024 12:57:43 +0200 Subject: [PATCH] Revert "Revert "chore(candidate): cypress tests -> work in progress"" This reverts commit 5ecc1823e8008a0897562084d609ed9a5c59057b. --- packages/reva-candidate/cypress.config.js | 16 + .../cypress/e2e/certificate-list.cy.js | 41 + .../cypress/e2e/certificates.cy.js | 48 + .../reva-candidate/cypress/e2e/contact.cy.js | 59 + .../cypress/e2e/dropped-out.cy.js | 64 + .../cypress/e2e/experiences.cy.js | 72 ++ .../cypress/e2e/funding-request-sent.cy.js | 24 + .../reva-candidate/cypress/e2e/login.cy.js | 32 + .../reva-candidate/cypress/e2e/organism.cy.js | 120 ++ .../reva-candidate/cypress/e2e/project.cy.js | 40 + .../cypress/e2e/submission.cy.js | 33 + .../cypress/e2e/training-program.cy.js | 165 +++ .../cypress/fixtures/added-experience1.json | 11 + .../cypress/fixtures/auth-step1.html | 12 + ...ate1-certification-and-goals-selected.json | 50 + .../cypress/fixtures/candidate1.json | 40 + .../fixtures/candidate2-dropped-out.json | 76 ++ .../candidate2-funding-request-sent.json | 98 ++ .../candidate2-missing-training-fields.json | 76 ++ .../fixtures/candidate2-submitted.json | 69 ++ .../fixtures/candidate2-taken-over.json | 73 ++ ...didate2-training-confirmed-sent-again.json | 98 ++ .../candidate2-training-confirmed.json | 94 ++ .../fixtures/candidate2-training-sent.json | 91 ++ .../cypress/fixtures/candidate2.json | 64 + .../cypress/fixtures/candidate3.json | 58 + .../cypress/fixtures/certifications.json | 28 + .../fixtures/confirm-training-form.json | 8 + .../cypress/fixtures/contact.json | 11 + .../cypress/fixtures/departments.json | 16 + .../cypress/fixtures/example.json | 1 + .../cypress/fixtures/features.json | 5 + .../cypress/fixtures/login-expired.json | 19 + .../cypress/fixtures/login-unknown.json | 14 + .../cypress/fixtures/login.json | 3 + .../cypress/fixtures/organism.json | 37 + .../cypress/fixtures/referencial.json | 19 + .../cypress/fixtures/referential.json | 18 + .../cypress/fixtures/registration.json | 3 + .../cypress/fixtures/selected-organism.json | 10 + .../cypress/fixtures/submitted-candidacy.json | 7 + .../cypress/fixtures/updated-candidacy1.json | 7 + .../cypress/fixtures/updated-experience2.json | 11 + .../reva-candidate/cypress/plugins/index.js | 22 + .../cypress/support/commands.js | 3 + .../reva-candidate/cypress/support/e2e.js | 20 + .../reva-candidate/cypress/utils/graphql.js | 26 + packages/reva-candidate/package-lock.json | 1085 ++++++++++++++++- packages/reva-candidate/package.json | 4 +- .../src/app/(auth)/registration/page.tsx | 2 +- .../src/layouts/page.layout.tsx | 4 +- 51 files changed, 3000 insertions(+), 7 deletions(-) create mode 100644 packages/reva-candidate/cypress.config.js create mode 100644 packages/reva-candidate/cypress/e2e/certificate-list.cy.js create mode 100644 packages/reva-candidate/cypress/e2e/certificates.cy.js create mode 100644 packages/reva-candidate/cypress/e2e/contact.cy.js create mode 100644 packages/reva-candidate/cypress/e2e/dropped-out.cy.js create mode 100644 packages/reva-candidate/cypress/e2e/experiences.cy.js create mode 100644 packages/reva-candidate/cypress/e2e/funding-request-sent.cy.js create mode 100644 packages/reva-candidate/cypress/e2e/login.cy.js create mode 100644 packages/reva-candidate/cypress/e2e/organism.cy.js create mode 100644 packages/reva-candidate/cypress/e2e/project.cy.js create mode 100644 packages/reva-candidate/cypress/e2e/submission.cy.js create mode 100644 packages/reva-candidate/cypress/e2e/training-program.cy.js create mode 100644 packages/reva-candidate/cypress/fixtures/added-experience1.json create mode 100644 packages/reva-candidate/cypress/fixtures/auth-step1.html create mode 100644 packages/reva-candidate/cypress/fixtures/candidate1-certification-and-goals-selected.json create mode 100644 packages/reva-candidate/cypress/fixtures/candidate1.json create mode 100644 packages/reva-candidate/cypress/fixtures/candidate2-dropped-out.json create mode 100644 packages/reva-candidate/cypress/fixtures/candidate2-funding-request-sent.json create mode 100644 packages/reva-candidate/cypress/fixtures/candidate2-missing-training-fields.json create mode 100644 packages/reva-candidate/cypress/fixtures/candidate2-submitted.json create mode 100644 packages/reva-candidate/cypress/fixtures/candidate2-taken-over.json create mode 100644 packages/reva-candidate/cypress/fixtures/candidate2-training-confirmed-sent-again.json create mode 100644 packages/reva-candidate/cypress/fixtures/candidate2-training-confirmed.json create mode 100644 packages/reva-candidate/cypress/fixtures/candidate2-training-sent.json create mode 100644 packages/reva-candidate/cypress/fixtures/candidate2.json create mode 100644 packages/reva-candidate/cypress/fixtures/candidate3.json create mode 100644 packages/reva-candidate/cypress/fixtures/certifications.json create mode 100644 packages/reva-candidate/cypress/fixtures/confirm-training-form.json create mode 100644 packages/reva-candidate/cypress/fixtures/contact.json create mode 100644 packages/reva-candidate/cypress/fixtures/departments.json create mode 100644 packages/reva-candidate/cypress/fixtures/example.json create mode 100644 packages/reva-candidate/cypress/fixtures/features.json create mode 100644 packages/reva-candidate/cypress/fixtures/login-expired.json create mode 100644 packages/reva-candidate/cypress/fixtures/login-unknown.json create mode 100644 packages/reva-candidate/cypress/fixtures/login.json create mode 100644 packages/reva-candidate/cypress/fixtures/organism.json create mode 100644 packages/reva-candidate/cypress/fixtures/referencial.json create mode 100644 packages/reva-candidate/cypress/fixtures/referential.json create mode 100644 packages/reva-candidate/cypress/fixtures/registration.json create mode 100644 packages/reva-candidate/cypress/fixtures/selected-organism.json create mode 100644 packages/reva-candidate/cypress/fixtures/submitted-candidacy.json create mode 100644 packages/reva-candidate/cypress/fixtures/updated-candidacy1.json create mode 100644 packages/reva-candidate/cypress/fixtures/updated-experience2.json create mode 100644 packages/reva-candidate/cypress/plugins/index.js create mode 100644 packages/reva-candidate/cypress/support/commands.js create mode 100644 packages/reva-candidate/cypress/support/e2e.js create mode 100644 packages/reva-candidate/cypress/utils/graphql.js diff --git a/packages/reva-candidate/cypress.config.js b/packages/reva-candidate/cypress.config.js new file mode 100644 index 000000000..f2bcc14ab --- /dev/null +++ b/packages/reva-candidate/cypress.config.js @@ -0,0 +1,16 @@ +import { defineConfig } from "cypress"; + +export default defineConfig({ + experimentalStudio: true, + viewportWidth: 490, + viewportHeight: 844, + e2e: { + // We've imported your old cypress plugins here. + // You may want to clean this up later by importing these. + setupNodeEvents(on, config) { + // eslint-disable-next-line @typescript-eslint/no-var-requires + return require("./cypress/plugins/index.js")(on, config); + }, + baseUrl: "http://localhost:3004/candidat/", + }, +}); diff --git a/packages/reva-candidate/cypress/e2e/certificate-list.cy.js b/packages/reva-candidate/cypress/e2e/certificate-list.cy.js new file mode 100644 index 000000000..0a8b46d8e --- /dev/null +++ b/packages/reva-candidate/cypress/e2e/certificate-list.cy.js @@ -0,0 +1,41 @@ +import { stubMutation, stubQuery } from "../utils/graphql"; + +context("Certificate list", () => { + beforeEach(() => { + cy.intercept("POST", "/api/graphql", (req) => { + stubQuery(req, "getDepartments", "departments.json"); + stubMutation(req, "candidate_login", "candidate1.json"); + stubQuery(req, "getReferential", "referential.json"); + stubQuery(req, "Certifications", "certifications.json"); + stubQuery(req, "activeFeaturesForConnectedUser", "features.json"); + stubMutation( + req, + "candidacy_updateCertification", + "updated-candidacy1.json", + ); + }); + + cy.login(); + cy.wait("@candidate_login"); + cy.wait("@getReferential"); + cy.wait("@activeFeaturesForConnectedUser"); + }); + + it("should show only 2 certifications", function () { + cy.get('[data-test="project-home-select-certification"]').click(); + cy.get("[name='select_department']").select("2"); + cy.wait("@Certifications"); + + cy.get('[data-test="results"]').children("li").should("have.length", 2); + + cy.get('[data-test="results"]') + .children("li") + .eq(0) + .should("have.text", "34691Titre 1"); + + cy.get('[data-test="results"]') + .children("li") + .eq(1) + .should("have.text", "34692Titre 2"); + }); +}); diff --git a/packages/reva-candidate/cypress/e2e/certificates.cy.js b/packages/reva-candidate/cypress/e2e/certificates.cy.js new file mode 100644 index 000000000..7550ad17d --- /dev/null +++ b/packages/reva-candidate/cypress/e2e/certificates.cy.js @@ -0,0 +1,48 @@ +import { stubMutation, stubQuery } from "../utils/graphql"; + +context("Certificates", () => { + beforeEach(() => { + cy.intercept("POST", "/api/graphql", (req) => { + stubQuery(req, "getDepartments", "departments.json"); + stubMutation(req, "candidate_login", "candidate1.json"); + stubQuery(req, "getReferential", "referential.json"); + stubQuery(req, "activeFeaturesForConnectedUser", "features.json"); + stubQuery(req, "Certifications", "certifications.json"); + stubMutation( + req, + "candidacy_updateCertification", + "updated-candidacy1.json", + ); + }); + + cy.login(); + + cy.wait("@candidate_login"); + cy.wait("@getReferential"); + cy.wait("@activeFeaturesForConnectedUser"); + + cy.get('[data-test="project-home-select-certification"]').click(); + cy.get("[name='select_department']").select("2"); + cy.wait("@Certifications"); + }); + + it("display information about the selected certificate", function () { + cy.get('[data-test="certification-select-c2"]').click(); + cy.get('[data-test="certification-label"]').should("contain", "Titre 2"); + cy.get('[data-test="certification-code-rncp"]').should("contain", "34692"); + cy.get('[data-test="certification-more-info-link"]').should( + "have.attr", + "href", + "https://www.francecompetences.fr/recherche/rncp/34692/", + ); + }); + + it("select department and submit certificate via summary", function () { + cy.get('[data-test="certification-select-c2"]').click(); + cy.get('[data-test="submit-certification-button"]').click(); + cy.wait("@candidacy_updateCertification"); + + cy.get('[data-test="project-home-ready"]'); + cy.get('[data-test="certification-label"]').should("contain", "Titre 2"); + }); +}); diff --git a/packages/reva-candidate/cypress/e2e/contact.cy.js b/packages/reva-candidate/cypress/e2e/contact.cy.js new file mode 100644 index 000000000..a8b068bd1 --- /dev/null +++ b/packages/reva-candidate/cypress/e2e/contact.cy.js @@ -0,0 +1,59 @@ +import { stubMutation, stubQuery } from "../utils/graphql"; + +const firstname1 = "John"; +const firstname2 = "John 2"; + +const lastname1 = "Doe"; +const lastname2 = "Doe 2"; + +const email1 = "email@example.com"; +const email2 = "email2@example.com"; + +const phone1 = "06 01 02 03 04"; +const phone2 = "06 01 02 03 05"; + +context("Candidate account", () => { + it("update all account information", function () { + cy.intercept("POST", "/api/graphql", (req) => { + stubMutation(req, "candidate_login", "candidate1.json"); + stubQuery(req, "getReferential", "referential.json"); + stubQuery(req, "getDepartments", "departments.json"); + stubQuery(req, "activeFeaturesForConnectedUser", "features.json"); + stubQuery(req, "update_contact", "contact.json"); + }); + cy.login(); + cy.wait("@candidate_login"); + cy.wait("@getReferential"); + + cy.get('[data-test="project-home-update-contact"]').click(); + + cy.get("[name=firstname]").should("have.value", firstname1); + cy.get("[name=lastname]").should("have.value", lastname1); + cy.get("[name=phone]").should("have.value", phone1); + cy.get("[name=email]").should("have.value", email1); + + cy.get("[name=firstname]").type(`{selectAll}${firstname2}`); + cy.get("[name=lastname]").type(`{selectAll}${lastname2}`); + cy.get("[name=phone]").type(`{selectAll}${phone2}`); + cy.get("[name=email]").type(`{selectAll}${email2}`); + + cy.get('[data-test="project-contact-save"]').click(); + cy.get( + '[title="Fermer"][aria-controls="project-home-modal-email"]', + ).click(); + cy.wait("@update_contact"); + + cy.get('[data-test="project-home-fullname"]').contains( + `${firstname2} ${lastname2}`, + ); + cy.get('[data-test="project-home-contact-phone"]').contains(phone2); + cy.get('[data-test="project-home-contact-email"]').contains(email2); + + cy.get('[data-test="project-home-update-contact"]').click(); + + cy.get("[name=firstname]").should("have.value", firstname2); + cy.get("[name=lastname]").should("have.value", lastname2); + cy.get("[name=phone]").should("have.value", phone2); + cy.get("[name=email]").should("have.value", email2); + }); +}); diff --git a/packages/reva-candidate/cypress/e2e/dropped-out.cy.js b/packages/reva-candidate/cypress/e2e/dropped-out.cy.js new file mode 100644 index 000000000..e38db495b --- /dev/null +++ b/packages/reva-candidate/cypress/e2e/dropped-out.cy.js @@ -0,0 +1,64 @@ +import { stubMutation, stubQuery } from "../utils/graphql"; + +const firstname = "John"; +const lastname = "Doe"; +const email = "email@example.com"; +const supportEmail = "support@vae.gouv.fr"; + +context("Dropped out", () => { + it("log on a dropped-out project", function () { + cy.intercept("POST", "/api/graphql", (req) => { + stubQuery(req, "getDepartments", "departments.json"); + stubMutation(req, "candidate_login", "candidate2-dropped-out.json"); + stubQuery(req, "getReferential", "referential.json"); + stubQuery(req, "activeFeaturesForConnectedUser", "features.json"); + }); + cy.login(); + + cy.wait("@candidate_login"); + cy.wait("@getReferential"); + cy.wait("@activeFeaturesForConnectedUser"); + + cy.get('[data-test="home-project-dropped-out"]'); + }); + + it("dropped-out project page should display candidate info", function () { + cy.intercept("POST", "/api/graphql", (req) => { + stubQuery(req, "getDepartments", "departments.json"); + stubMutation(req, "candidate_login", "candidate2-dropped-out.json"); + stubQuery(req, "getReferential", "referential.json"); + stubQuery(req, "activeFeaturesForConnectedUser", "features.json"); + }); + cy.login(); + cy.wait("@candidate_login"); + cy.wait("@getReferential"); + cy.wait("@activeFeaturesForConnectedUser"); + + cy.get('[data-test="home-dropped-out-name"').should( + "have.text", + `Bonjour ${firstname} ${lastname},`, + ); + cy.get('[data-test="home-dropped-out-email"').should( + "have.text", + `Email: ${email}`, + ); + }); + + it("dropped-out project page should display support email", function () { + cy.intercept("POST", "/api/graphql", (req) => { + stubQuery(req, "getDepartments", "departments.json"); + stubMutation(req, "candidate_login", "candidate2-dropped-out.json"); + stubQuery(req, "getReferential", "referential.json"); + stubQuery(req, "activeFeaturesForConnectedUser", "features.json"); + }); + cy.login(); + cy.wait("@candidate_login"); + cy.wait("@getReferential"); + cy.wait("@activeFeaturesForConnectedUser"); + + cy.get('[data-test="home-dropped-out-support-email"').should( + "have.text", + `${supportEmail}`, + ); + }); +}); diff --git a/packages/reva-candidate/cypress/e2e/experiences.cy.js b/packages/reva-candidate/cypress/e2e/experiences.cy.js new file mode 100644 index 000000000..898345dfb --- /dev/null +++ b/packages/reva-candidate/cypress/e2e/experiences.cy.js @@ -0,0 +1,72 @@ +const experienceTitle1 = "Experience 1"; +const experienceTitle2 = "Experience 2"; + +const experienceDescription1 = "Description 1"; +const experienceDescription2 = "Description 2"; + +import { stubMutation, stubQuery } from "../utils/graphql"; + +context("Experiences", () => { + it("add and edit an experience", function () { + cy.intercept("POST", "/api/graphql", (req) => { + stubQuery(req, "getDepartments", "departments.json"); + stubMutation( + req, + "candidate_login", + "candidate1-certification-and-goals-selected.json", + ); + stubQuery(req, "getReferential", "referential.json"); + stubQuery(req, "add_experience", "added-experience1.json"); + stubQuery(req, "update_experience", "updated-experience2.json"); + stubQuery(req, "activeFeaturesForConnectedUser", "features.json"); + }); + cy.login(); + cy.wait("@candidate_login"); + cy.wait("@getReferential"); + cy.wait("@activeFeaturesForConnectedUser"); + + cy.get('[data-test="timeline-add-experience"]').click(); + cy.get("[name='title']").type(experienceTitle1); + cy.get("[name='startedAt']").type("2019-01-31"); + cy.get("[name='duration']").select("betweenOneAndThreeYears"); + cy.get("textarea[name='description']").type(experienceDescription1); + + cy.get('[data-test="project-experience-add"]').click(); + cy.wait("@add_experience"); + + cy.get('[data-test="timeline-experiences-list"] > li') + .eq(0) + .within(() => { + cy.get('[data-test="timeline-experience-title"]').should( + "have.text", + experienceTitle1, + ); + cy.get('[data-test="timeline-experience-duration"]').should( + "have.text", + "Entre 1 et 3 ans", + ); + }); + + cy.get('[data-test="timeline-experiences-list"] > li').eq(0).click(); + cy.get("[name='startedAt']").type("2017-03-31"); + cy.get("[name='title']").type(`{selectAll}${experienceTitle2}`); + cy.get("[name='duration']").select("moreThanFiveYears"); + cy.get("textarea[name='description']").type( + `{selectAll}${experienceDescription2}`, + ); + cy.get('[data-test="project-experience-save"]').click(); + + cy.get('[data-test="timeline-experiences-list"] > li') + .eq(0) + .within(() => { + cy.get('[data-test="timeline-experience-title"]').should( + "have.text", + experienceTitle2, + ); + cy.get('[data-test="timeline-experience-duration"]').should( + "have.text", + "Plus de 5 ans", + ); + }); + }); +}); diff --git a/packages/reva-candidate/cypress/e2e/funding-request-sent.cy.js b/packages/reva-candidate/cypress/e2e/funding-request-sent.cy.js new file mode 100644 index 000000000..d98833445 --- /dev/null +++ b/packages/reva-candidate/cypress/e2e/funding-request-sent.cy.js @@ -0,0 +1,24 @@ +import { stubMutation, stubQuery } from "../utils/graphql"; + +context("Funding Request Sent", () => { + describe("Testing correct screen", () => { + it("display all fields", () => { + cy.intercept("POST", "/api/graphql", (req) => { + stubQuery(req, "getDepartments", "departments.json"); + stubMutation( + req, + "candidate_login", + "candidate2-funding-request-sent.json", + ); + stubQuery(req, "getReferential", "referential.json"); + stubQuery(req, "activeFeaturesForConnectedUser", "features.json"); + }); + cy.login(); + cy.wait("@candidate_login"); + cy.wait("@getReferential"); + cy.wait("@activeFeaturesForConnectedUser"); + + cy.get('[data-test="view-training-program-button"]').should("exist"); + }); + }); +}); diff --git a/packages/reva-candidate/cypress/e2e/login.cy.js b/packages/reva-candidate/cypress/e2e/login.cy.js new file mode 100644 index 000000000..cf73e9e0f --- /dev/null +++ b/packages/reva-candidate/cypress/e2e/login.cy.js @@ -0,0 +1,32 @@ +import { stubQuery } from "../utils/graphql"; + +const email = "email@example.com"; + +context("Login", () => { + it("submit email", function () { + cy.intercept("POST", "/api/graphql", (req) => { + stubQuery(req, "getDepartments", "departments.json"); + stubQuery(req, "candidate_askForLogin", "login.json"); + }); + + cy.login(); + + cy.get('[data-test="login-home"] #email').type(email); + + cy.get('[data-test="login-home-submit"]').click(); + cy.wait("@candidate_askForLogin"); + + cy.get('[data-test="login-confirmation"]'); + }); + + it("access login page from registration page", function () { + cy.intercept("POST", "/api/graphql", (req) => { + stubQuery(req, "getDepartments", "departments.json"); + stubQuery(req, "activeFeaturesForConnectedUser", "features.json"); + }); + + cy.visit("/registration"); + cy.get('[data-test="navigate-to-login"]').click(); + cy.get('[data-test="login-home"]'); + }); +}); diff --git a/packages/reva-candidate/cypress/e2e/organism.cy.js b/packages/reva-candidate/cypress/e2e/organism.cy.js new file mode 100644 index 000000000..705a06f67 --- /dev/null +++ b/packages/reva-candidate/cypress/e2e/organism.cy.js @@ -0,0 +1,120 @@ +import { stubMutation, stubQuery } from "../utils/graphql"; + +context("Empty candidacy", () => { + it("prevent organism selection", function () { + cy.intercept("POST", "/api/graphql", (req) => { + stubQuery(req, "getDepartments", "departments.json"); + stubMutation(req, "candidate_login", "candidate1.json"); + stubQuery(req, "getReferential", "referential.json"); + stubQuery(req, "activeFeaturesForConnectedUser", "features.json"); + }); + cy.login(); + cy.wait("@candidate_login"); + cy.wait("@getReferential"); + cy.wait("@activeFeaturesForConnectedUser"); + + cy.get('[data-test="project-home-edit-organism').should("be.disabled"); + }); +}); + +context("Candidacy with department certification selected", () => { + it("list all available organisms", function () { + Cypress.on("uncaught:exception", (err) => { + // Suppress the error that started occurring after the DSFR update + if (err.message.includes("this.removeEventListener is not a function")) { + return false; + } + }); + + cy.intercept("POST", "/api/graphql", (req) => { + stubQuery(req, "getDepartments", "departments.json"); + stubMutation(req, "candidate_login", "candidate3.json"); + stubQuery(req, "getReferential", "referential.json"); + stubQuery(req, "getRandomOrganismsForCandidacy", "organism.json"); + stubQuery(req, "activeFeaturesForConnectedUser", "features.json"); + }); + cy.login(); + cy.wait("@candidate_login"); + cy.wait("@getReferential"); + cy.wait("@activeFeaturesForConnectedUser"); + + cy.get('[data-test="project-home-edit-organism').click(); + cy.wait("@getRandomOrganismsForCandidacy"); + + cy.get('[data-test="project-organisms-organism-o1"]').within(() => { + cy.get('[data-test="project-organisms-organism-label"]').should( + "have.text", + "Architecte 1", + ); + cy.get('[data-test="project-organisms-organism-email"]').should( + "have.text", + "email@exemple.com", + ); + cy.get('[data-test="project-organisms-organism-phone"]').should( + "have.text", + "0111111111", + ); + cy.get('[data-test="project-organisms-onsite-tag"]').should("exist"); + cy.get('[data-test="project-organisms-remote-tag"]').should("not.exist"); + }); + + cy.get('[data-test="project-organisms-organism-o2"]').within(() => { + cy.get('[data-test="project-organisms-organism-label"]').should( + "have.text", + "Architecte 2", + ); + cy.get('[data-test="project-organisms-organism-email"]').should( + "have.text", + "email2@exemple.com", + ); + cy.get('[data-test="project-organisms-organism-phone"]').should( + "have.text", + "0222222222", + ); + cy.get('[data-test="project-organisms-onsite-tag"]').should("not.exist"); + cy.get('[data-test="project-organisms-remote-tag"]').should("exist"); + }); + }); + + it("submit first organism", function () { + cy.intercept("POST", "/api/graphql", (req) => { + stubQuery(req, "getDepartments", "departments.json"); + stubMutation(req, "candidate_login", "candidate3.json"); + stubQuery(req, "getReferential", "referential.json"); + stubQuery(req, "getRandomOrganismsForCandidacy", "organism.json"); + stubMutation(req, "candidacy_selectOrganism", "selected-organism.json"); + stubQuery(req, "activeFeaturesForConnectedUser", "features.json"); + }); + + cy.login( + { token: "abc" }, + { + onBeforeLoad(win) { + cy.stub(win.Math, "random").returns(0); + }, + }, + ); + + cy.wait("@candidate_login"); + cy.wait("@activeFeaturesForConnectedUser"); + + cy.get('[data-test="project-home-edit-organism').click(); + cy.wait("@getRandomOrganismsForCandidacy"); + + cy.get('[data-test="project-organisms-submit-organism-o1').click(); + cy.wait("@candidacy_selectOrganism"); + + cy.get('[data-test="project-home-organism-label"]').should( + "have.text", + "Architecte 1", + ); + cy.get('[data-test="project-home-organism-email"]').should( + "have.text", + "email@exemple.com", + ); + cy.get('[data-test="project-home-organism-phone"]').should( + "have.text", + "0111111111", + ); + }); +}); diff --git a/packages/reva-candidate/cypress/e2e/project.cy.js b/packages/reva-candidate/cypress/e2e/project.cy.js new file mode 100644 index 000000000..59f48eda6 --- /dev/null +++ b/packages/reva-candidate/cypress/e2e/project.cy.js @@ -0,0 +1,40 @@ +import { stubMutation, stubQuery } from "../utils/graphql"; + +context("Project", () => { + it("attempt to validate project", function () { + cy.intercept("POST", "/api/graphql", (req) => { + stubQuery(req, "getDepartments", "departments.json"); + stubMutation(req, "candidate_login", "candidate1.json"); + stubQuery(req, "getReferential", "referential.json"); + stubQuery(req, "activeFeaturesForConnectedUser", "features.json"); + }); + cy.login(); + cy.wait("@candidate_login"); + cy.wait("@getReferential"); + cy.wait("@activeFeaturesForConnectedUser"); + + cy.get('[data-test="project-home-validate"]').should("be.disabled"); + }); + + it("confirm registration", function () { + cy.intercept("POST", "/api/graphql", (req) => { + stubQuery(req, "getDepartments", "departments.json"); + stubMutation(req, "candidate_login", "candidate2.json"); + stubQuery(req, "getReferential", "referential.json"); + stubQuery(req, "submit_candidacy", "submitted-candidacy.json"); + stubQuery(req, "activeFeaturesForConnectedUser", "features.json"); + }); + cy.login(); + cy.get('[data-test="project-home-loading"]'); + cy.wait("@candidate_login"); + cy.wait("@getReferential"); + cy.wait("@activeFeaturesForConnectedUser"); + + cy.wait(500); + cy.get('[data-test="project-home-ready"]'); + cy.get('[data-test="project-home-validate"]').click(); + + cy.get('[data-test="project-submit"]').click(); + cy.wait("@submit_candidacy"); + }); +}); diff --git a/packages/reva-candidate/cypress/e2e/submission.cy.js b/packages/reva-candidate/cypress/e2e/submission.cy.js new file mode 100644 index 000000000..2af73cf41 --- /dev/null +++ b/packages/reva-candidate/cypress/e2e/submission.cy.js @@ -0,0 +1,33 @@ +import { stubMutation, stubQuery } from "../utils/graphql"; + +context("Submission", () => { + it("log on a submitted project", function () { + cy.intercept("POST", "/api/graphql", (req) => { + stubQuery(req, "getDepartments", "departments.json"); + stubMutation(req, "candidate_login", "candidate2-submitted.json"); + stubQuery(req, "getReferential", "referential.json"); + stubQuery(req, "activeFeaturesForConnectedUser", "features.json"); + }); + cy.login(); + cy.wait("@candidate_login"); + cy.wait("@getReferential"); + cy.wait("@activeFeaturesForConnectedUser"); + + cy.get('[data-test="project-submitted-label"'); + }); + + it("log on a project taken over", function () { + cy.intercept("POST", "/api/graphql", (req) => { + stubQuery(req, "getDepartments", "departments.json"); + stubMutation(req, "candidate_login", "candidate2-taken-over.json"); + stubQuery(req, "getReferential", "referential.json"); + stubQuery(req, "activeFeaturesForConnectedUser", "features.json"); + }); + cy.login(); + cy.wait("@candidate_login"); + cy.wait("@getReferential"); + cy.wait("@activeFeaturesForConnectedUser"); + + cy.get('[data-test="project-submitted-label"'); + }); +}); diff --git a/packages/reva-candidate/cypress/e2e/training-program.cy.js b/packages/reva-candidate/cypress/e2e/training-program.cy.js new file mode 100644 index 000000000..33237a26e --- /dev/null +++ b/packages/reva-candidate/cypress/e2e/training-program.cy.js @@ -0,0 +1,165 @@ +import { stubMutation, stubQuery } from "../utils/graphql"; + +context("Training Program", () => { + describe("Testing descriptions", () => { + beforeEach(() => { + cy.intercept("POST", "/api/graphql", (req) => { + stubQuery(req, "getDepartments", "departments.json"); + stubMutation( + req, + "candidate_login", + "candidate2-training-confirmed.json", + ); + stubQuery(req, "getReferential", "referential.json"); + stubQuery(req, "activeFeaturesForConnectedUser", "features.json"); + }); + cy.login(); + cy.wait("@candidate_login"); + cy.wait("@getReferential"); + cy.wait("@activeFeaturesForConnectedUser"); + cy.get('[data-test="view-training-program-button"]').click(); + }); + + it("display all fields", () => { + cy.get('[data-test="general-informations"]') + .children("li") + .should("have.length", 3); + + cy.get('[data-test="mandatory-training-section"]') + .children("ul") + .children("li") + .should("have.length", 3); + + cy.get('[data-test="basic-skills-section"]') + .children("ul") + .children("li") + .should("have.length", 2); + + cy.get('[data-test="certificate-skills-section"]') + .children("p") + .should("have.text", "Blocs de compétences métier"); + + cy.get('[data-test="other-training-section"]') + .children("p") + .should("have.text", "Autres actions de formations complémentaires"); + }); + }); + + describe("Testing descriptions with missing fields", () => { + beforeEach(() => { + cy.intercept("POST", "/api/graphql", (req) => { + stubQuery(req, "getDepartments", "departments.json"); + stubQuery( + req, + "candidate_login", + "candidate2-missing-training-fields.json", + ); + stubQuery(req, "getReferential", "referential.json"); + stubQuery(req, "activeFeaturesForConnectedUser", "features.json"); + }); + cy.login(); + cy.wait("@candidate_login"); + cy.wait("@getReferential"); + cy.wait("@activeFeaturesForConnectedUser"); + cy.get('[data-test="view-training-program-button"]').click(); + }); + + it("don't display missing fields", () => { + cy.get('[data-test="general-informations"]') + .children("li") + .should("have.length", 3); + + cy.get('[data-test="mandatory-training-section"]').should("not.exist"); + + cy.get('[data-test="basic-skills-section"]').should("not.exist"); + + cy.get('[data-test="certificate-skills-section"]') + .children("p") + .should("have.text", "Blocs de compétences métier"); + + cy.get('[data-test="other-training-section"]') + .children("p") + .should("have.text", "Autres actions de formations complémentaires"); + }); + }); + + describe("Testing Checkbox logic", () => { + it("validates checked condition and its mechanics", () => { + cy.intercept("POST", "/api/graphql", (req) => { + stubQuery(req, "getDepartments", "departments.json"); + stubMutation(req, "candidate_login", "candidate2-training-sent.json"); + stubQuery(req, "getReferential", "referential.json"); + stubQuery( + req, + "candidacy_confirmTrainingForm", + "confirm-training-form.json", + ); + stubQuery(req, "activeFeaturesForConnectedUser", "features.json"); + }); + cy.login(); + cy.wait("@candidate_login"); + cy.wait("@getReferential"); + cy.wait("@activeFeaturesForConnectedUser"); + cy.get('[data-test="validate-training-program-button"]').click(); + + cy.get('[data-test="accept-conditions-checkbox-group"]') + .find("input") + .not("be.checked"); + + cy.get('[data-test="submit-training-program-button"]').should( + "be.disabled", + ); + + cy.get('[data-test="accept-conditions-checkbox-group"]') + .find("label") + .click({ multiple: true }); + + cy.get('[data-test="submit-training-program-button"]') + .should("be.enabled") + .click(); + + cy.wait("@candidacy_confirmTrainingForm"); + }); + }); + + describe("Testing training confirmed but sent again", () => { + it("should be able to accept and submit the training again", () => { + cy.intercept("POST", "/api/graphql", (req) => { + stubQuery(req, "getDepartments", "departments.json"); + stubMutation( + req, + "candidate_login", + "candidate2-training-confirmed-sent-again.json", + ); + stubQuery(req, "getReferential", "referential.json"); + stubQuery( + req, + "candidacy_confirmTrainingForm", + "confirm-training-form.json", + ); + stubQuery(req, "activeFeaturesForConnectedUser", "features.json"); + }); + cy.login(); + cy.wait("@candidate_login"); + cy.wait("@getReferential"); + cy.wait("@activeFeaturesForConnectedUser"); + cy.get('[data-test="validate-training-program-button"]').click(); + + cy.get('[data-test="accept-conditions-checkbox-group"]') + .find("input") + .not("be.checked"); + + cy.get('[data-test="submit-training-program-button"]').should( + "be.disabled", + ); + cy.get('[data-test="accept-conditions-checkbox-group"]') + .find("label") + .click({ multiple: true }); + + cy.get('[data-test="submit-training-program-button"]') + .should("be.enabled") + .click(); + cy.wait("@candidacy_confirmTrainingForm"); + }); + }); +}); diff --git a/packages/reva-candidate/cypress/fixtures/added-experience1.json b/packages/reva-candidate/cypress/fixtures/added-experience1.json new file mode 100644 index 000000000..5a887a15b --- /dev/null +++ b/packages/reva-candidate/cypress/fixtures/added-experience1.json @@ -0,0 +1,11 @@ +{ + "data": { + "candidacy_addExperience": { + "id": "id1", + "title": "Experience 1", + "startedAt": 1548892800000, + "duration": "betweenOneAndThreeYears", + "description": "Description 1" + } + } +} diff --git a/packages/reva-candidate/cypress/fixtures/auth-step1.html b/packages/reva-candidate/cypress/fixtures/auth-step1.html new file mode 100644 index 000000000..f4bf045a6 --- /dev/null +++ b/packages/reva-candidate/cypress/fixtures/auth-step1.html @@ -0,0 +1,12 @@ + + + + + + diff --git a/packages/reva-candidate/cypress/fixtures/candidate1-certification-and-goals-selected.json b/packages/reva-candidate/cypress/fixtures/candidate1-certification-and-goals-selected.json new file mode 100644 index 000000000..fb28357b1 --- /dev/null +++ b/packages/reva-candidate/cypress/fixtures/candidate1-certification-and-goals-selected.json @@ -0,0 +1,50 @@ +{ + "data": { + "candidateLogged": { + "tokens": { + "accessToken": "abc", + "refreshToken": "def", + "idToken": "ghi" + }, + "candidate": { + "firstname": "John", + "lastname": "Doe", + "email": "email@example.com", + "phone": "06-01-02-03-04", + "candidacy": { + "id": "c1", + "certificationId": null, + "organism": null, + "createdAt": null, + "certification": { + "id": "c1", + "label": "Titre 1", + "summary": "résumé 1", + "codeRncp": "34691", + "status": "AVAILABLE" + }, + "experiences": [], + "goals": [ + { + "id": "goal1" + } + ], + "candidacyStatuses": [ + { + "status": "PROJET", + "isActive": true + } + ], + "appointmentCount": 0, + "certificateSkills": null, + "otherTraining": null, + "individualHourCount": null, + "collectiveHourCount": null, + "additionalHourCount": null, + "basicSkills": [], + "mandatoryTrainings": [] + } + } + } + } +} diff --git a/packages/reva-candidate/cypress/fixtures/candidate1.json b/packages/reva-candidate/cypress/fixtures/candidate1.json new file mode 100644 index 000000000..645f64844 --- /dev/null +++ b/packages/reva-candidate/cypress/fixtures/candidate1.json @@ -0,0 +1,40 @@ +{ + "data": { + "candidateLogged": { + "tokens": { + "accessToken": "abc", + "refreshToken": "def", + "idToken": "ghi" + }, + "candidate": { + "firstname": "John", + "lastname": "Doe", + "email": "email@example.com", + "phone": "06 01 02 03 04", + "candidacy": { + "id": "c1", + "certificationId": null, + "organism": null, + "createdAt": null, + "certification": null, + "experiences": [], + "goals": [], + "candidacyStatuses": [ + { + "status": "PROJET", + "isActive": true + } + ], + "appointmentCount": 0, + "certificateSkills": null, + "otherTraining": null, + "individualHourCount": null, + "collectiveHourCount": null, + "additionalHourCount": null, + "basicSkills": [], + "mandatoryTrainings": [] + } + } + } + } +} diff --git a/packages/reva-candidate/cypress/fixtures/candidate2-dropped-out.json b/packages/reva-candidate/cypress/fixtures/candidate2-dropped-out.json new file mode 100644 index 000000000..7b18c2e37 --- /dev/null +++ b/packages/reva-candidate/cypress/fixtures/candidate2-dropped-out.json @@ -0,0 +1,76 @@ +{ + "data": { + "candidateLogged": { + "tokens": { + "accessToken": "abc", + "refreshToken": "def", + "idToken": "ghi" + }, + "candidate": { + "firstname": "John", + "lastname": "Doe", + "email": "email@example.com", + "phone": "06-01-02-03-04", + "candidacy": { + "id": "c2", + "organism": { + "id": "o1", + "label": "Accompagnateur 1", + "address": "1 rue de l'exemple", + "zip": "75000", + "city": "Paris", + "contactAdministrativeEmail": "contact@example.com" + }, + "createdAt": 1664376421912, + "certification": { + "id": "c1", + "label": "Titre 1", + "summary": "résumé 1", + "codeRncp": "34691", + "status": "AVAILABLE" + }, + + "experiences": [ + { + "id": "e1", + "title": "Experience 1", + "startedAt": 1580428800000, + "duration": "unknown", + "description": "description 1" + } + ], + "goals": [ + { + "id": "goal1" + } + ], + "candidacyStatuses": [ + { + "status": "PROJET", + "isActive": false + }, + { + "status": "VALIDATION", + "isActive": false + }, + { + "status": "PRISE_EN_CHARGE", + "isActive": true + } + ], + "candidacyDropOut": { + "droppedOutAt": 1580428800000 + }, + "appointmentCount": 0, + "certificateSkills": "Blocs de compétences métier", + "otherTraining": null, + "individualHourCount": null, + "collectiveHourCount": null, + "additionalHourCount": null, + "basicSkills": [], + "mandatoryTrainings": [] + } + } + } + } +} diff --git a/packages/reva-candidate/cypress/fixtures/candidate2-funding-request-sent.json b/packages/reva-candidate/cypress/fixtures/candidate2-funding-request-sent.json new file mode 100644 index 000000000..1225510e6 --- /dev/null +++ b/packages/reva-candidate/cypress/fixtures/candidate2-funding-request-sent.json @@ -0,0 +1,98 @@ +{ + "data": { + "candidateLogged": { + "tokens": { + "accessToken": "abc", + "refreshToken": "def", + "idToken": "ghi" + }, + "candidate": { + "firstname": "John", + "lastname": "Doe", + "email": "email@example.com", + "phone": "06-01-02-03-04", + "candidacy": { + "id": "c2", + "organism": { + "id": "o1", + "label": "Accompagnateur 1", + "address": "1 rue de l'exemple", + "zip": "75000", + "city": "Paris", + "contactAdministrativeEmail": "contact@example.com" + }, + "createdAt": 1664376421912, + "certification": { + "id": "c1", + "label": "Titre 1", + "summary": "résumé 1", + "codeRncp": "34691", + "status": "AVAILABLE" + }, + + "experiences": [ + { + "id": "e1", + "title": "Experience 1", + "startedAt": 1580428800000, + "duration": "unknown", + "description": "description 1" + } + ], + "goals": [ + { + "id": "goal1" + } + ], + "candidacyStatuses": [ + { + "status": "PROJET", + "isActive": false + }, + { + "status": "PRISE_EN_CHARGE", + "isActive": false + }, + { + "status": "PARCOURS_ENVOYE", + "isActive": false + }, + { + "status": "PARCOURS_CONFIRME", + "isActive": false + }, + { + "status": "DEMANDE_FINANCEMENT_ENVOYE", + "isActive": true + } + ], + "appointmentCount": 0, + "certificateSkills": "Blocs de compétences métier", + "otherTraining": "Autres actions de formations complémentaires", + "individualHourCount": 1, + "collectiveHourCount": 2, + "additionalHourCount": 3, + "basicSkills": [ + { + "label": "Base 1" + }, + { + "label": "Base 2" + } + ], + "mandatoryTrainings": [ + { + "label": "Obligatoire 1" + }, + { + "label": "Obligatoire 2" + }, + { + "label": "Obligatoire 3" + } + ] + } + } + } + } +} diff --git a/packages/reva-candidate/cypress/fixtures/candidate2-missing-training-fields.json b/packages/reva-candidate/cypress/fixtures/candidate2-missing-training-fields.json new file mode 100644 index 000000000..1ac01ccc2 --- /dev/null +++ b/packages/reva-candidate/cypress/fixtures/candidate2-missing-training-fields.json @@ -0,0 +1,76 @@ +{ + "data": { + "candidateLogged": { + "tokens": { + "accessToken": "abc", + "refreshToken": "def", + "idToken": "ghi" + }, + "candidate": { + "firstname": "John", + "lastname": "Doe", + "email": "email@example.com", + "phone": "06-01-02-03-04", + "candidacy": { + "id": "c2", + "organism": { + "id": "o1", + "label": "Accompagnateur 1", + "address": "1 rue de l'exemple", + "zip": "75000", + "city": "Paris", + "contactAdministrativeEmail": "contact@example.com" + }, + "createdAt": 1664376421912, + "certification": { + "id": "c1", + "label": "Titre 1", + "summary": "résumé 1", + "codeRncp": "34691", + "status": "AVAILABLE" + }, + "experiences": [ + { + "id": "e1", + "title": "Experience 1", + "startedAt": 1580428800000, + "duration": "unknown", + "description": "description 1" + } + ], + "goals": [ + { + "id": "goal1" + } + ], + "candidacyStatuses": [ + { + "status": "PROJET", + "isActive": false + }, + { + "status": "PRISE_EN_CHARGE", + "isActive": false + }, + { + "status": "PARCOURS_ENVOYE", + "isActive": false + }, + { + "status": "PARCOURS_CONFIRME", + "isActive": true + } + ], + "appointmentCount": 0, + "additionalHourCount": null, + "mandatoryTrainings": [], + "certificateSkills": "Blocs de compétences métier", + "otherTraining": "Autres actions de formations complémentaires", + "individualHourCount": 1, + "collectiveHourCount": null, + "basicSkills": null + } + } + } + } +} diff --git a/packages/reva-candidate/cypress/fixtures/candidate2-submitted.json b/packages/reva-candidate/cypress/fixtures/candidate2-submitted.json new file mode 100644 index 000000000..66e26613a --- /dev/null +++ b/packages/reva-candidate/cypress/fixtures/candidate2-submitted.json @@ -0,0 +1,69 @@ +{ + "data": { + "candidateLogged": { + "tokens": { + "accessToken": "abc", + "refreshToken": "def", + "idToken": "ghi" + }, + "candidate": { + "firstname": "John", + "lastname": "Doe", + "email": "email@example.com", + "phone": "06-01-02-03-04", + "candidacy": { + "id": "c2", + "organism": { + "id": "o1", + "label": "Accompagnateur 1", + "address": "1 rue de l'exemple", + "zip": "75000", + "city": "Paris", + "contactAdministrativeEmail": "contact@example.com" + }, + "createdAt": 1664376421912, + "certification": { + "id": "c1", + "label": "Titre 1", + "summary": "résumé 1", + "codeRncp": "34691", + "status": "AVAILABLE" + }, + + "experiences": [ + { + "id": "e1", + "title": "Experience 1", + "startedAt": 1580428800000, + "duration": "unknown", + "description": "description 1" + } + ], + "goals": [ + { + "id": "goal1" + } + ], + "candidacyStatuses": [ + { + "status": "PROJET", + "isActive": false + }, + { + "status": "VALIDATION", + "isActive": true + } + ], + "appointmentCount": 0, + "certificateSkills": "Blocs de compétences métier", + "otherTraining": null, + "individualHourCount": null, + "collectiveHourCount": null, + "additionalHourCount": null, + "basicSkills": [], + "mandatoryTrainings": [] + } + } + } + } +} diff --git a/packages/reva-candidate/cypress/fixtures/candidate2-taken-over.json b/packages/reva-candidate/cypress/fixtures/candidate2-taken-over.json new file mode 100644 index 000000000..4cf7c8e63 --- /dev/null +++ b/packages/reva-candidate/cypress/fixtures/candidate2-taken-over.json @@ -0,0 +1,73 @@ +{ + "data": { + "candidateLogged": { + "tokens": { + "accessToken": "abc", + "refreshToken": "def", + "idToken": "ghi" + }, + "candidate": { + "firstname": "John", + "lastname": "Doe", + "email": "email@example.com", + "phone": "06-01-02-03-04", + "candidacy": { + "id": "c2", + "organism": { + "id": "o1", + "label": "Accompagnateur 1", + "address": "1 rue de l'exemple", + "zip": "75000", + "city": "Paris", + "contactAdministrativeEmail": "contact@example.com" + }, + "createdAt": 1664376421912, + "certification": { + "id": "c1", + "label": "Titre 1", + "summary": "résumé 1", + "codeRncp": "34691", + "status": "AVAILABLE" + }, + + "experiences": [ + { + "id": "e1", + "title": "Experience 1", + "startedAt": 1580428800000, + "duration": "unknown", + "description": "description 1" + } + ], + "goals": [ + { + "id": "goal1" + } + ], + "candidacyStatuses": [ + { + "status": "PROJET", + "isActive": false + }, + { + "status": "VALIDATION", + "isActive": false + }, + { + "status": "PRISE_EN_CHARGE", + "isActive": true + } + ], + "appointmentCount": 0, + "certificateSkills": "Blocs de compétences métier", + "otherTraining": null, + "individualHourCount": null, + "collectiveHourCount": null, + "additionalHourCount": null, + "basicSkills": [], + "mandatoryTrainings": [] + } + } + } + } +} diff --git a/packages/reva-candidate/cypress/fixtures/candidate2-training-confirmed-sent-again.json b/packages/reva-candidate/cypress/fixtures/candidate2-training-confirmed-sent-again.json new file mode 100644 index 000000000..12dae16b0 --- /dev/null +++ b/packages/reva-candidate/cypress/fixtures/candidate2-training-confirmed-sent-again.json @@ -0,0 +1,98 @@ +{ + "data": { + "candidateLogged": { + "tokens": { + "accessToken": "abc", + "refreshToken": "def", + "idToken": "ghi" + }, + "candidate": { + "firstname": "John", + "lastname": "Doe", + "email": "email@example.com", + "phone": "06-01-02-03-04", + "candidacy": { + "id": "c2", + "organism": { + "id": "o1", + "label": "Accompagnateur 1", + "address": "1 rue de l'exemple", + "zip": "75000", + "city": "Paris", + "contactAdministrativeEmail": "contact@example.com" + }, + "createdAt": 1664376421912, + "certification": { + "id": "c1", + "label": "Titre 1", + "summary": "résumé 1", + "codeRncp": "34691", + "status": "AVAILABLE" + }, + + "experiences": [ + { + "id": "e1", + "title": "Experience 1", + "startedAt": 1580428800000, + "duration": "unknown", + "description": "description 1" + } + ], + "goals": [ + { + "id": "goal1" + } + ], + "candidacyStatuses": [ + { + "status": "PROJET", + "isActive": false + }, + { + "status": "PRISE_EN_CHARGE", + "isActive": false + }, + { + "status": "PARCOURS_ENVOYE", + "isActive": false + }, + { + "status": "PARCOURS_CONFIRME", + "isActive": false + }, + { + "status": "PARCOURS_ENVOYE", + "isActive": true + } + ], + "appointmentCount": 0, + "certificateSkills": "Blocs de compétences métier", + "otherTraining": "Autres actions de formations complémentaires", + "individualHourCount": 1, + "collectiveHourCount": 2, + "additionalHourCount": 3, + "basicSkills": [ + { + "label": "Base 1" + }, + { + "label": "Base 2" + } + ], + "mandatoryTrainings": [ + { + "label": "Obligatoire 1" + }, + { + "label": "Obligatoire 2" + }, + { + "label": "Obligatoire 3" + } + ] + } + } + } + } +} diff --git a/packages/reva-candidate/cypress/fixtures/candidate2-training-confirmed.json b/packages/reva-candidate/cypress/fixtures/candidate2-training-confirmed.json new file mode 100644 index 000000000..77a3f274b --- /dev/null +++ b/packages/reva-candidate/cypress/fixtures/candidate2-training-confirmed.json @@ -0,0 +1,94 @@ +{ + "data": { + "candidateLogged": { + "tokens": { + "accessToken": "abc", + "refreshToken": "def", + "idToken": "ghi" + }, + "candidate": { + "firstname": "John", + "lastname": "Doe", + "email": "email@example.com", + "phone": "06-01-02-03-04", + "candidacy": { + "id": "c2", + "organism": { + "id": "o1", + "label": "Accompagnateur 1", + "address": "1 rue de l'exemple", + "zip": "75000", + "city": "Paris", + "contactAdministrativeEmail": "contact@example.com" + }, + "createdAt": 1664376421912, + "certification": { + "id": "c1", + "label": "Titre 1", + "summary": "résumé 1", + "codeRncp": "34691", + "status": "AVAILABLE" + }, + + "experiences": [ + { + "id": "e1", + "title": "Experience 1", + "startedAt": 1580428800000, + "duration": "unknown", + "description": "description 1" + } + ], + "goals": [ + { + "id": "goal1" + } + ], + "candidacyStatuses": [ + { + "status": "PROJET", + "isActive": false + }, + { + "status": "PRISE_EN_CHARGE", + "isActive": false + }, + { + "status": "PARCOURS_ENVOYE", + "isActive": false + }, + { + "status": "PARCOURS_CONFIRME", + "isActive": true + } + ], + "appointmentCount": 0, + "certificateSkills": "Blocs de compétences métier", + "otherTraining": "Autres actions de formations complémentaires", + "individualHourCount": 1, + "collectiveHourCount": 2, + "additionalHourCount": 3, + "basicSkills": [ + { + "label": "Base 1" + }, + { + "label": "Base 2" + } + ], + "mandatoryTrainings": [ + { + "label": "Obligatoire 1" + }, + { + "label": "Obligatoire 2" + }, + { + "label": "Obligatoire 3" + } + ] + } + } + } + } +} diff --git a/packages/reva-candidate/cypress/fixtures/candidate2-training-sent.json b/packages/reva-candidate/cypress/fixtures/candidate2-training-sent.json new file mode 100644 index 000000000..88684f5fe --- /dev/null +++ b/packages/reva-candidate/cypress/fixtures/candidate2-training-sent.json @@ -0,0 +1,91 @@ +{ + "data": { + "candidateLogged": { + "tokens": { + "accessToken": "abc", + "refreshToken": "def", + "idToken": "ghi" + }, + "candidate": { + "firstname": "John", + "lastname": "Doe", + "email": "email@example.com", + "phone": "06-01-02-03-04", + "candidacy": { + "id": "c2", + "organism": { + "id": "o1", + "label": "Accompagnateur 1", + "address": "1 rue de l'exemple", + "zip": "75000", + "city": "Paris", + "contactAdministrativeEmail": "contact@example.com" + }, + "createdAt": 1664376421912, + "certification": { + "id": "c1", + "label": "Titre 1", + "summary": "résumé 1", + "codeRncp": "34691", + "status": "AVAILABLE" + }, + "email": null, + "phone": "0643202050", + "experiences": [ + { + "id": "e1", + "title": "Experience 1", + "startedAt": 1580428800000, + "duration": "unknown", + "description": "description 1" + } + ], + "goals": [ + { + "id": "goal1" + } + ], + "candidacyStatuses": [ + { + "status": "PROJET", + "isActive": false + }, + { + "status": "PRISE_EN_CHARGE", + "isActive": false + }, + { + "status": "PARCOURS_ENVOYE", + "isActive": true + } + ], + "appointmentCount": 0, + "certificateSkills": "Blocs de compétences métier", + "otherTraining": "Autres actions de formations complémentaires", + "individualHourCount": 1, + "collectiveHourCount": 2, + "additionalHourCount": 3, + "basicSkills": [ + { + "label": "Base 1" + }, + { + "label": "Base 2" + } + ], + "mandatoryTrainings": [ + { + "label": "Obligatoire 1" + }, + { + "label": "Obligatoire 2" + }, + { + "label": "Obligatoire 3" + } + ] + } + } + } + } +} diff --git a/packages/reva-candidate/cypress/fixtures/candidate2.json b/packages/reva-candidate/cypress/fixtures/candidate2.json new file mode 100644 index 000000000..6f6df642b --- /dev/null +++ b/packages/reva-candidate/cypress/fixtures/candidate2.json @@ -0,0 +1,64 @@ +{ + "data": { + "candidateLogged": { + "tokens": { + "accessToken": "abc", + "refreshToken": "def", + "idToken": "ghi" + }, + "candidate": { + "firstname": "John", + "lastname": "Doe", + "email": "email@example.com", + "phone": "06-01-02-03-04", + "candidacy": { + "id": "c2", + "organism": { + "id": "o1", + "label": "Accompagnateur 1", + "address": "1 rue de l'exemple", + "zip": "75000", + "city": "Paris", + "contactAdministrativeEmail": "contact@example.com" + }, + "createdAt": 1664376421912, + "certification": { + "id": "c1", + "label": "Titre 1", + "summary": "résumé 1", + "codeRncp": "34691", + "status": "AVAILABLE" + }, + "experiences": [ + { + "id": "e1", + "title": "Experience 1", + "startedAt": 1580428800000, + "duration": "unknown", + "description": "description 1" + } + ], + "goals": [ + { + "id": "goal1" + } + ], + "candidacyStatuses": [ + { + "status": "PROJET", + "isActive": true + } + ], + "appointmentCount": 0, + "certificateSkills": null, + "otherTraining": null, + "individualHourCount": null, + "collectiveHourCount": null, + "additionalHourCount": null, + "basicSkills": [], + "mandatoryTrainings": [] + } + } + } + } +} diff --git a/packages/reva-candidate/cypress/fixtures/candidate3.json b/packages/reva-candidate/cypress/fixtures/candidate3.json new file mode 100644 index 000000000..ee6b4429a --- /dev/null +++ b/packages/reva-candidate/cypress/fixtures/candidate3.json @@ -0,0 +1,58 @@ +{ + "data": { + "candidateLogged": { + "tokens": { + "accessToken": "abc", + "refreshToken": "def", + "idToken": "ghi" + }, + "candidate": { + "firstname": "John", + "lastname": "Doe", + "email": "email@example.com", + "phone": "06-01-02-03-04", + "candidacy": { + "id": "c3", + "organism": null, + "createdAt": 1664376421912, + "certification": { + "id": "c1", + "label": "Titre 1", + "summary": "résumé 1", + "codeRncp": "34691", + "status": "AVAILABLE" + }, + "experiences": [ + { + "id": "e1", + "title": "Experience 1", + "startedAt": 1580428800000, + "duration": "unknown", + "description": "description 1" + } + ], + "goals": [ + { + "id": "goal1" + } + ], + "candidacyStatuses": [ + { + "status": "PROJET", + "isActive": true + } + ], + "appointmentCount": 0, + "certificateSkills": null, + "otherTraining": null, + "individualHourCount": null, + "collectiveHourCount": null, + "additionalHourCount": null, + "basicSkills": [], + "mandatoryTrainings": [], + "department": { "id": "department1" } + } + } + } + } +} diff --git a/packages/reva-candidate/cypress/fixtures/certifications.json b/packages/reva-candidate/cypress/fixtures/certifications.json new file mode 100644 index 000000000..f366ca4b3 --- /dev/null +++ b/packages/reva-candidate/cypress/fixtures/certifications.json @@ -0,0 +1,28 @@ +{ + "data": { + "searchCertificationsForCandidate": { + "rows": [ + { + "id": "c1", + "label": "Titre 1", + "summary": "résumé 1", + "codeRncp": "34691", + "status": "AVAILABLE" + }, + { + "id": "c2", + "label": "Titre 2", + "summary": "résumé 2", + "codeRncp": "34692", + "status": "AVAILABLE" + } + ], + "info": { + "totalRows": 3, + "currentPage": 1, + "totalPages": 1, + "pageLength": 10 + } + } + } +} diff --git a/packages/reva-candidate/cypress/fixtures/confirm-training-form.json b/packages/reva-candidate/cypress/fixtures/confirm-training-form.json new file mode 100644 index 000000000..40ec214a8 --- /dev/null +++ b/packages/reva-candidate/cypress/fixtures/confirm-training-form.json @@ -0,0 +1,8 @@ +{ + "data": { + "candidacy_confirmTrainingForm": { + "createdAt": 1664376421912, + "id": "c1" + } + } +} diff --git a/packages/reva-candidate/cypress/fixtures/contact.json b/packages/reva-candidate/cypress/fixtures/contact.json new file mode 100644 index 000000000..9eefd3a8f --- /dev/null +++ b/packages/reva-candidate/cypress/fixtures/contact.json @@ -0,0 +1,11 @@ +{ + "data": { + "candidacy_updateContact": { + "id": "device1", + "firstname": "John 2", + "lastname": "Doe 2", + "email": "email2@example.com", + "phone": "06 01 02 03 05" + } + } +} diff --git a/packages/reva-candidate/cypress/fixtures/departments.json b/packages/reva-candidate/cypress/fixtures/departments.json new file mode 100644 index 000000000..cf4a0ac6b --- /dev/null +++ b/packages/reva-candidate/cypress/fixtures/departments.json @@ -0,0 +1,16 @@ +{ + "data": { + "getDepartments": [ + { + "id": "department1", + "code": "1", + "label": "Région 1" + }, + { + "id": "department2", + "code": "2", + "label": "Région 2" + } + ] + } +} diff --git a/packages/reva-candidate/cypress/fixtures/example.json b/packages/reva-candidate/cypress/fixtures/example.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/packages/reva-candidate/cypress/fixtures/example.json @@ -0,0 +1 @@ +{} diff --git a/packages/reva-candidate/cypress/fixtures/features.json b/packages/reva-candidate/cypress/fixtures/features.json new file mode 100644 index 000000000..4513aea00 --- /dev/null +++ b/packages/reva-candidate/cypress/fixtures/features.json @@ -0,0 +1,5 @@ +{ + "data": { + "activeFeaturesForConnectedUser": [] + } +} diff --git a/packages/reva-candidate/cypress/fixtures/login-expired.json b/packages/reva-candidate/cypress/fixtures/login-expired.json new file mode 100644 index 000000000..17839aa92 --- /dev/null +++ b/packages/reva-candidate/cypress/fixtures/login-expired.json @@ -0,0 +1,19 @@ +{ + "errors": [ + { + "message": "error", + "locations": [ + { + "line": 6, + "column": 3 + } + ], + "path": ["candidate_login"], + "extensions": { + "code": "CANDIDATE_INVALID_TOKEN", + "message": "error" + } + } + ], + "data": null +} diff --git a/packages/reva-candidate/cypress/fixtures/login-unknown.json b/packages/reva-candidate/cypress/fixtures/login-unknown.json new file mode 100644 index 000000000..bdf0942d3 --- /dev/null +++ b/packages/reva-candidate/cypress/fixtures/login-unknown.json @@ -0,0 +1,14 @@ +{ + "errors": [ + { + "message": "Candidat non trouvé", + "locations": [{ "line": 2, "column": 3 }], + "path": ["candidateLogged"], + "extensions": { + "code": "ACCOUNT_IN_IAM_NOT_FOUND", + "message": "Candidat non trouvé", + "errors": [] + } + } + ] +} diff --git a/packages/reva-candidate/cypress/fixtures/login.json b/packages/reva-candidate/cypress/fixtures/login.json new file mode 100644 index 000000000..ddde01ac8 --- /dev/null +++ b/packages/reva-candidate/cypress/fixtures/login.json @@ -0,0 +1,3 @@ +{ + "data": { "candidate_askForLogin": "result" } +} diff --git a/packages/reva-candidate/cypress/fixtures/organism.json b/packages/reva-candidate/cypress/fixtures/organism.json new file mode 100644 index 000000000..533ec5eb7 --- /dev/null +++ b/packages/reva-candidate/cypress/fixtures/organism.json @@ -0,0 +1,37 @@ +{ + "data": { + "getRandomOrganismsForCandidacy": { + "rows": [ + { + "id": "o1", + "label": "Architecte 1", + "address": "1 rue de l'exemple", + "zip": "75000", + "city": "Paris", + "contactAdministrativeEmail": "email@exemple.com", + "contactAdministrativePhone": "0111111111", + "informationsCommerciales": { + "adresseNumeroEtNomDeRue": "1 rue de l'exemple", + "adresseCodePostal": "75000", + "adresseVille": "Paris", + "conformeNormesAccessbilite": "CONFORME" + }, + "isOnSite": true, + "isRemote": false + }, + { + "id": "o2", + "label": "Architecte 2", + "address": "2 rue de l'exemple", + "zip": "44000", + "city": "Nantes", + "contactAdministrativeEmail": "email2@exemple.com", + "contactAdministrativePhone": "0222222222", + "isOnSite": false, + "isRemote": true + } + ], + "totalRows": 2 + } + } +} diff --git a/packages/reva-candidate/cypress/fixtures/referencial.json b/packages/reva-candidate/cypress/fixtures/referencial.json new file mode 100644 index 000000000..bbe21400c --- /dev/null +++ b/packages/reva-candidate/cypress/fixtures/referencial.json @@ -0,0 +1,19 @@ +{ + "data": { + "getCandidacy": null, + "getReferential": { + "goals": [ + { + "id": "goal1", + "label": "Goal 1", + "order": 1 + }, + { + "id": "goal2", + "label": "Goal 2", + "order": 2 + } + ] + } + } +} diff --git a/packages/reva-candidate/cypress/fixtures/referential.json b/packages/reva-candidate/cypress/fixtures/referential.json new file mode 100644 index 000000000..c1583382b --- /dev/null +++ b/packages/reva-candidate/cypress/fixtures/referential.json @@ -0,0 +1,18 @@ +{ + "data": { + "getReferential": { + "goals": [ + { + "id": "goal1", + "label": "Goal 1", + "order": 1 + }, + { + "id": "goal2", + "label": "Goal 2", + "order": 2 + } + ] + } + } +} diff --git a/packages/reva-candidate/cypress/fixtures/registration.json b/packages/reva-candidate/cypress/fixtures/registration.json new file mode 100644 index 000000000..20c7df31b --- /dev/null +++ b/packages/reva-candidate/cypress/fixtures/registration.json @@ -0,0 +1,3 @@ +{ + "data": { "candidate_askForRegistration": "result" } +} diff --git a/packages/reva-candidate/cypress/fixtures/selected-organism.json b/packages/reva-candidate/cypress/fixtures/selected-organism.json new file mode 100644 index 000000000..c1d5f7317 --- /dev/null +++ b/packages/reva-candidate/cypress/fixtures/selected-organism.json @@ -0,0 +1,10 @@ +{ + "data": { + "candidacy_selectOrganism": { + "id": "c1", + "organismId": "o1", + "departmentId": "department1", + "createdAt": 1666101304602 + } + } +} diff --git a/packages/reva-candidate/cypress/fixtures/submitted-candidacy.json b/packages/reva-candidate/cypress/fixtures/submitted-candidacy.json new file mode 100644 index 000000000..1361ad6f5 --- /dev/null +++ b/packages/reva-candidate/cypress/fixtures/submitted-candidacy.json @@ -0,0 +1,7 @@ +{ + "data": { + "candidacy_submitCandidacy": { + "id": "c1" + } + } +} diff --git a/packages/reva-candidate/cypress/fixtures/updated-candidacy1.json b/packages/reva-candidate/cypress/fixtures/updated-candidacy1.json new file mode 100644 index 000000000..0450af1ed --- /dev/null +++ b/packages/reva-candidate/cypress/fixtures/updated-candidacy1.json @@ -0,0 +1,7 @@ +{ + "data": { + "candidacy_updateCertification": { + "id": "candidacy1" + } + } +} diff --git a/packages/reva-candidate/cypress/fixtures/updated-experience2.json b/packages/reva-candidate/cypress/fixtures/updated-experience2.json new file mode 100644 index 000000000..232b83414 --- /dev/null +++ b/packages/reva-candidate/cypress/fixtures/updated-experience2.json @@ -0,0 +1,11 @@ +{ + "data": { + "candidacy_updateExperience": { + "id": "id1", + "title": "Experience 2", + "startedAt": 1490832000000, + "duration": "moreThanFiveYears", + "description": "Description 2" + } + } +} diff --git a/packages/reva-candidate/cypress/plugins/index.js b/packages/reva-candidate/cypress/plugins/index.js new file mode 100644 index 000000000..8229063ad --- /dev/null +++ b/packages/reva-candidate/cypress/plugins/index.js @@ -0,0 +1,22 @@ +/// +// *********************************************************** +// This example plugins/index.js can be used to load plugins +// +// You can change the location of this file or turn off loading +// the plugins file with the 'pluginsFile' configuration option. +// +// You can read more here: +// https://on.cypress.io/plugins-guide +// *********************************************************** + +// This function is called when a project is opened or re-opened (e.g. due to +// the project's config changing) + +/** + * @type {Cypress.PluginConfig} + */ +// eslint-disable-next-line no-unused-vars +module.exports = (on, config) => { + // `on` is used to hook into various events Cypress emits + // `config` is the resolved Cypress config +}; diff --git a/packages/reva-candidate/cypress/support/commands.js b/packages/reva-candidate/cypress/support/commands.js new file mode 100644 index 000000000..b1cca4314 --- /dev/null +++ b/packages/reva-candidate/cypress/support/commands.js @@ -0,0 +1,3 @@ +Cypress.Commands.add("login", (config = { token: "abc" }, options) => { + cy.visit(`/login/?token=${config.token}`, options); +}); diff --git a/packages/reva-candidate/cypress/support/e2e.js b/packages/reva-candidate/cypress/support/e2e.js new file mode 100644 index 000000000..d076cec9f --- /dev/null +++ b/packages/reva-candidate/cypress/support/e2e.js @@ -0,0 +1,20 @@ +// *********************************************************** +// This example support/index.js is processed and +// loaded automatically before your test files. +// +// This is a great place to put global configuration and +// behavior that modifies Cypress. +// +// You can change the location of this file or turn off +// automatically serving support files with the +// 'supportFile' configuration option. +// +// You can read more here: +// https://on.cypress.io/configuration +// *********************************************************** + +// Import commands.js using ES2015 syntax: +import "./commands"; + +// Alternatively you can use CommonJS syntax: +// require('./commands') diff --git a/packages/reva-candidate/cypress/utils/graphql.js b/packages/reva-candidate/cypress/utils/graphql.js new file mode 100644 index 000000000..3769e707c --- /dev/null +++ b/packages/reva-candidate/cypress/utils/graphql.js @@ -0,0 +1,26 @@ +// Forked from https://docs.cypress.io/guides/end-to-end-testing/working-with-graphql#Alias-multiple-queries-or-mutations +// Add reply with fixtures + +// Utility to match GraphQL mutation based on the operation name +export const hasOperationName = (req, operationName) => { + const { body } = req; + return ( + body.hasOwnProperty("operationName") && body.operationName === operationName + ); +}; + +// Alias query if operationName matches +export const stubQuery = (req, operationName, fixture, statusCode = 200) => { + if (hasOperationName(req, operationName)) { + req.alias = operationName; + fixture && req.reply({ statusCode, fixture }); + } +}; + +// Alias mutation if operationName matches +export const stubMutation = (req, operationName, fixture, statusCode = 200) => { + if (hasOperationName(req, operationName)) { + req.alias = operationName; + fixture && req.reply({ statusCode, fixture }); + } +}; diff --git a/packages/reva-candidate/package-lock.json b/packages/reva-candidate/package-lock.json index c92f34158..68b9f14df 100644 --- a/packages/reva-candidate/package-lock.json +++ b/packages/reva-candidate/package-lock.json @@ -37,6 +37,7 @@ "@types/uuid": "^10.0.0", "@typescript-eslint/eslint-plugin": "^7.16.0", "autoprefixer": "^10.4.19", + "cypress": "^13.13.2", "eslint": "^8", "eslint-config-next": "14.2.4", "eslint-config-prettier": "^9.1.0", @@ -1145,6 +1146,73 @@ "only-include-used-icons": "bin/only-include-used-icons.js" } }, + "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/request/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/@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/@emnapi/runtime": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.2.0.tgz", @@ -3439,6 +3507,18 @@ "@types/react": "*" } }, + "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/uuid": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", @@ -3454,6 +3534,16 @@ "@types/node": "*" } }, + "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/@typescript-eslint/eslint-plugin": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.16.0.tgz", @@ -4048,6 +4138,15 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "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", @@ -4118,6 +4217,26 @@ "node": ">= 8" } }, + "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/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", @@ -4316,6 +4435,15 @@ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true }, + "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/asn1js": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.5.tgz", @@ -4330,6 +4458,15 @@ "node": ">=12.0.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/ast-types-flow": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", @@ -4345,6 +4482,27 @@ "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/auto-bind": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-4.0.0.tgz", @@ -4409,6 +4567,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "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.13.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.0.tgz", + "integrity": "sha512-3AungXC4I8kKsS9PuS4JH2nc+0bVY/mjgrephHTIi8fpEeGsTHBUJeosp0Wc1myYMElmD0B3Oc4XL/HVJ4PV2g==", + "dev": true + }, "node_modules/axe-core": { "version": "4.9.1", "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.9.1.tgz", @@ -4496,6 +4669,15 @@ } ] }, + "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/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -4519,6 +4701,18 @@ "readable-stream": "^3.4.0" } }, + "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/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -4605,6 +4799,15 @@ "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/busboy": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", @@ -4616,6 +4819,15 @@ "node": ">=10.16.0" } }, + "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", @@ -4702,6 +4914,12 @@ "upper-case-first": "^2.0.2" } }, + "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", @@ -4762,6 +4980,15 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, + "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/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -4798,6 +5025,21 @@ "node": ">= 6" } }, + "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/classnames": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", @@ -4836,6 +5078,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cli-table3": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", + "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", + "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", @@ -4949,6 +5206,18 @@ "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": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", @@ -5006,6 +5275,12 @@ "cookie": "^0.6.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/cosmiconfig": { "version": "8.3.6", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", @@ -5088,12 +5363,170 @@ "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", "integrity": "sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw==" }, + "node_modules/cypress": { + "version": "13.13.2", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.13.2.tgz", + "integrity": "sha512-PvJQU33933NvS1StfzEb8/mu2kMy4dABwCF+yd5Bi7Qly1HOVf+Bufrygee/tlmty/6j5lX+KIi8j9Q3JUMbhA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@cypress/request": "^3.0.1", + "@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.3", + "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/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/cypress/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/cypress/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cypress/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/cypress/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/cypress/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/damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", "dev": true }, + "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/data-view-buffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", @@ -5160,6 +5593,12 @@ "url": "https://github.com/sponsors/kossnocorp" } }, + "node_modules/dayjs": { + "version": "1.11.12", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.12.tgz", + "integrity": "sha512-Rt2g+nTbLlDWZTwwrIXjy9MeiZmSDI375FvZs72ngxx8PDC6YXOeR3q5LAuPzjZQxhiWdRKac7RKV+YyQYfYIg==", + "dev": true + }, "node_modules/debounce": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", @@ -5276,6 +5715,15 @@ "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/dependency-graph": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", @@ -5379,6 +5827,16 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true }, + "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/electron-to-chromium": { "version": "1.4.816", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.816.tgz", @@ -5391,6 +5849,15 @@ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "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/enhanced-resolve": { "version": "5.17.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz", @@ -5404,10 +5871,23 @@ "node": ">=10.13.0" } }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "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/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "dependencies": { "is-arrayish": "^0.2.1" @@ -6045,6 +6525,53 @@ "node": ">=0.10.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/external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -6071,6 +6598,35 @@ "url": "https://github.com/sponsors/jaydenseric" } }, + "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/fast-decode-uri-component": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", @@ -6180,6 +6736,15 @@ "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==", "dev": true }, + "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", @@ -6301,6 +6866,29 @@ "url": "https://github.com/sponsors/isaacs" } }, + "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/fraction.js": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", @@ -6314,6 +6902,21 @@ "url": "https://github.com/sponsors/rawify" } }, + "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/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -6407,6 +7010,21 @@ "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/get-symbol-description": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", @@ -6436,6 +7054,24 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, + "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/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -6469,6 +7105,21 @@ "node": ">=10.13.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/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -6739,6 +7390,20 @@ "node": ">= 14" } }, + "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/https-proxy-agent": { "version": "7.0.5", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", @@ -6752,6 +7417,15 @@ "node": ">= 14" } }, + "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/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -6874,6 +7548,15 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "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/inquirer": { "version": "8.2.6", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz", @@ -7041,6 +7724,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "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-core-module": { "version": "2.14.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz", @@ -7143,6 +7838,22 @@ "node": ">=0.10.0" } }, + "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-interactive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", @@ -7273,6 +7984,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "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-string": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", @@ -7318,6 +8041,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "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-unc-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", @@ -7421,6 +8150,12 @@ "ws": "*" } }, + "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/iterator.prototype": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", @@ -7492,6 +8227,12 @@ "js-yaml": "bin/js-yaml.js" } }, + "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/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -7516,6 +8257,12 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "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-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -7528,6 +8275,12 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "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/json-to-pretty-yaml": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/json-to-pretty-yaml/-/json-to-pretty-yaml-1.2.2.tgz", @@ -7553,6 +8306,33 @@ "node": ">=6" } }, + "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/jsx-ast-utils": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", @@ -7612,6 +8392,15 @@ "node": ">=0.10" } }, + "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/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -7711,6 +8500,12 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "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/lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", @@ -7829,6 +8624,12 @@ "node": ">=0.10.0" } }, + "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/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -7879,6 +8680,27 @@ "node": ">=4.0.0" } }, + "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", @@ -8108,6 +8930,18 @@ "node": ">=0.10.0" } }, + "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/nullthrows": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", @@ -8340,6 +9174,12 @@ "node": ">=0.10.0" } }, + "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-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -8562,6 +9402,18 @@ "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/picocolors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", @@ -8806,6 +9658,27 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "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/promise": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", @@ -8826,6 +9699,28 @@ "react-is": "^16.13.1" } }, + "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": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", @@ -8850,6 +9745,27 @@ "node": ">=6.0.0" } }, + "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/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -9026,6 +9942,15 @@ "integrity": "sha512-O3vsMYfWighyFbTd8hk8VaSj9UAGENxAtX+//ugIst2RMk5e03h6RoIS+0ylsFxY1gvmPuAY/PO4It+gPEeySA==", "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/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -9041,6 +9966,12 @@ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, + "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/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -9481,6 +10412,31 @@ "tslib": "^2.0.3" } }, + "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/stop-iteration-iterator": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", @@ -9676,6 +10632,15 @@ "node": ">=4" } }, + "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/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -9903,6 +10868,15 @@ "node": ">=0.8" } }, + "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", @@ -9951,6 +10925,39 @@ "node": ">=8.0" } }, + "node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "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/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/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/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -10014,6 +11021,24 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" }, + "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-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -10165,6 +11190,15 @@ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", "dev": 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/unixify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unixify/-/unixify-1.0.0.tgz", @@ -10189,6 +11223,15 @@ "node": ">=0.10.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/update-browserslist-db": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", @@ -10255,6 +11298,16 @@ "node": ">=6" } }, + "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/urlpattern-polyfill": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-8.0.2.tgz", @@ -10309,6 +11362,20 @@ "node": ">=12" } }, + "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/wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", @@ -10594,6 +11661,16 @@ "node": ">=12" } }, + "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" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/packages/reva-candidate/package.json b/packages/reva-candidate/package.json index 502019e3b..b205df2cc 100644 --- a/packages/reva-candidate/package.json +++ b/packages/reva-candidate/package.json @@ -10,7 +10,8 @@ "start": "next start", "lint": "next lint", "graphql:generate": "graphql-codegen --config codegen.ts", - "graphql:watch": "graphql-codegen --config codegen.ts --watch" + "graphql:watch": "graphql-codegen --config codegen.ts --watch", + "cypress:open": "npm run graphql:generate && cypress open --e2e --browser electron" }, "dependencies": { "@codegouvfr/react-dsfr": "^1.9.21", @@ -42,6 +43,7 @@ "@types/uuid": "^10.0.0", "@typescript-eslint/eslint-plugin": "^7.16.0", "autoprefixer": "^10.4.19", + "cypress": "^13.13.2", "eslint": "^8", "eslint-config-next": "14.2.4", "eslint-config-prettier": "^9.1.0", diff --git a/packages/reva-candidate/src/app/(auth)/registration/page.tsx b/packages/reva-candidate/src/app/(auth)/registration/page.tsx index ece50d813..f54ea0c5d 100644 --- a/packages/reva-candidate/src/app/(auth)/registration/page.tsx +++ b/packages/reva-candidate/src/app/(auth)/registration/page.tsx @@ -204,7 +204,7 @@ export default function Registration() {