From d9482517363d1f14b96e4c80cd19f8586d6d1410 Mon Sep 17 00:00:00 2001 From: Ivymaster Date: Wed, 27 May 2026 10:29:13 +0200 Subject: [PATCH] WIP: Tempus e2e tests --- .../api/frontend/v1/tempus/Kalender.php | 2 +- application/libraries/KalenderLib.php | 2 +- tests/cypress/cypress.config.js | 8 +- .../cypress/cypress/e2e/specs/ui/tempus.cy.js | 148 ---- .../cypress/e2e/specs/ui/tempus/tempus.cy.js | 710 ++++++++++++++++++ tests/cypress/cypress/support/commands.js | 1 + .../cypress/support/pages/tempus.po.js | 72 ++ tests/cypress/package-lock.json | 187 +---- tests/cypress/package.json | 1 + 9 files changed, 803 insertions(+), 328 deletions(-) delete mode 100644 tests/cypress/cypress/e2e/specs/ui/tempus.cy.js create mode 100644 tests/cypress/cypress/e2e/specs/ui/tempus/tempus.cy.js diff --git a/application/controllers/api/frontend/v1/tempus/Kalender.php b/application/controllers/api/frontend/v1/tempus/Kalender.php index e93d55ee2..20d0bd6de 100644 --- a/application/controllers/api/frontend/v1/tempus/Kalender.php +++ b/application/controllers/api/frontend/v1/tempus/Kalender.php @@ -208,7 +208,7 @@ class Kalender extends FHCAPI_Controller if (isError($result)) $this->terminateWithError(getError($result)); - $this->terminateWithSuccess('Erfolgreich'); + $this->terminateWithSuccess(getData($result)); } public function getRaumvorschlag() diff --git a/application/libraries/KalenderLib.php b/application/libraries/KalenderLib.php index 9c83eaa2d..be1d8a1ef 100644 --- a/application/libraries/KalenderLib.php +++ b/application/libraries/KalenderLib.php @@ -630,7 +630,7 @@ class KalenderLib if (isError($result)) return $result; } - return success('Erfolgreich'); + return success($result); } public function updateZeit($kalender_id, $start_date, $end_date) diff --git a/tests/cypress/cypress.config.js b/tests/cypress/cypress.config.js index e27368ee9..bb7cd2d09 100644 --- a/tests/cypress/cypress.config.js +++ b/tests/cypress/cypress.config.js @@ -6,8 +6,12 @@ module.exports = defineConfig({ e2e: { baseUrl: process.env.BASE_URL || "http://localhost:8080", - defaultCommandTimeout: 40000, - pageLoadTimeout: 20000, + defaultCommandTimeout: 20000, + pageLoadTimeout: 10000, + retries: { + runMode: 2, // when running via CLI / CI + openMode: 2 // when running in interactive mode + } }, env: { adminusername: process.env.USER_NAME || "2", diff --git a/tests/cypress/cypress/e2e/specs/ui/tempus.cy.js b/tests/cypress/cypress/e2e/specs/ui/tempus.cy.js deleted file mode 100644 index 633757930..000000000 --- a/tests/cypress/cypress/e2e/specs/ui/tempus.cy.js +++ /dev/null @@ -1,148 +0,0 @@ -import { tempusPage } from "../../../support/pages/tempus.po"; - -context("Base tempus tests", () => { - beforeEach(() => { - cy.login(); - - cy.intercept({ method: "GET", url: "**/StgTree" }).as("fetchCourseTree"); - cy.intercept({ method: "GET", url: /\/tempus\/Kalender\/getPlan(?:\?|$)/ }).as("fetchPlanData"); - cy.intercept({ method: "GET", url: /\/tempus\/Kalender\/getPlanLecturer(?:\?|$)/ }).as("fetchLecturerPlanData"); - cy.intercept({ method: "GET", url: /\/tempus\/Kalender\/getPlanStudent(?:\?|$)/ }).as("fetchStudentPlanData"); - cy.intercept({ method: "GET", url: "**/tempus/Kalender/getHistory**" }).as("fetchEventHistory"); - cy.intercept({ method: "GET", url: "**/tempus/coursepicker/getByStg**" }).as("fetchCoursePickerCourses"); - - tempusPage.visit(); - - cy.wait("@fetchCourseTree").its("response.statusCode").should("eq", 200); - cy.wait("@fetchPlanData").its("response.statusCode").should("eq", 200); - }); - - it("can access Tempus page with valid credentials", () => { - tempusPage.getTempusOverview().should("be.visible"); - }); - - it ("shows all expected page elements", () => { - tempusPage.getTempusOverview().should("be.visible"); - tempusPage.getSidebarMenu().should("exist"); - tempusPage.getSlideInCoursesMenu().should("exist"); - tempusPage.getCalendarSection().should("be.visible"); - tempusPage.getPreviewRoleOptionsHolder().should("be.visible"); - }); - - it("can open courses menu", () => { - tempusPage.getSlideInCoursesMenu().should("exist").should("be.hidden"); - - tempusPage.openCoursesMenu(); - - tempusPage.getCourseTreeRows().should("have.length.greaterThan", 0); - }); - - it("can select one course and show preview of its events", () => { - tempusPage.getSlideInCoursesMenu().should("exist"); - tempusPage.getCourseTreeRows().should("have.length.greaterThan", 0); - tempusPage.getCoursePicker().should("exist"); - tempusPage.getCoursePickerRows().should("have.length", 0); - - tempusPage.selectFirstCourse(); - cy.wait("@fetchCoursePickerCourses").its("response.statusCode").should("eq", 200); - - tempusPage.getCoursePickerRows().should("have.length.greaterThan", 0); - }); - - it("can search for a course event in the course picker", () => { - const searchTerm = "PHY1 SO"; - - tempusPage.selectFirstCourse(); - cy.wait("@fetchCoursePickerCourses").its("response.statusCode").should("eq", 200); - - tempusPage.getCoursePickerRows().should("have.length.greaterThan", 0); - - tempusPage.getCoursePickerSearchInput().type(searchTerm); - - tempusPage.getCoursePickerRows().should("have.length.greaterThan", 0); - tempusPage.getCoursePickerRows().first().should("contain.text", searchTerm); - }); - - it("can drag and drop one course event into the calendar", () => { - tempusPage.getCalendarSection().should("exist"); - - tempusPage.selectFirstCourse(); - cy.wait("@fetchCoursePickerCourses").its("response.statusCode").should("eq", 200); - - tempusPage.getCoursePickerRows().first().drag(tempusPage.selectors.calendarSection); - - tempusPage.getCalendarEvents().should("have.length", 1); - }); - - it("shows the same number of calendar events for all role previews", () => { - const rolePreviews = [ - { label: "Planer", fetchAlias: "@fetchPlanData" }, - { label: "Lektor", fetchAlias: "@fetchLecturerPlanData" }, - { label: "Student", fetchAlias: "@fetchStudentPlanData" }, - ]; - const eventCounts = {}; - - cy.wrap(rolePreviews).each((rolePreview) => { - tempusPage.selectPreviewRole(rolePreview.label); - cy.wait(rolePreview.fetchAlias).its("response.statusCode").should("eq", 200); - tempusPage.waitForCalendarToFinishLoading(); - - tempusPage.getCalendarEvents().then(($events) => { - eventCounts[rolePreview.label] = $events.length; - }); - }).then(() => { - const expectedCount = eventCounts[rolePreviews[0].label]; - - Object.entries(eventCounts).forEach(([role, count]) => { - expect(count, `${role} calendar event count`).to.eq(expectedCount); - }); - }); - }); - - it("shows event details modal when clicking a calendar event", () => { - tempusPage.waitForCalendarToFinishLoading(); - tempusPage.getCalendarEvents().should("have.length.greaterThan", 0); - - tempusPage.getCalendarEvents().first().click(); - - tempusPage.getCalendarEventModal().should("be.visible"); - }); - - it("shows event context menu when right clicking a calendar event", () => { - tempusPage.waitForCalendarToFinishLoading(); - tempusPage.getCalendarEvents().should("have.length.greaterThan", 0); - - tempusPage.getCalendarEvents().first().rightclick(); - - tempusPage.getEventContextMenu().should("be.visible"); - }); - - it("shows history modal when selecting History from event context menu", () => { - tempusPage.waitForCalendarToFinishLoading(); - tempusPage.getCalendarEvents().should("have.length.greaterThan", 0); - - tempusPage.getCalendarEvents().first().rightclick(); - tempusPage.getEventContextMenuOption("History").click(); - cy.wait("@fetchEventHistory").its("response.statusCode").should("eq", 200); - - tempusPage.getHistoryModal().should("be.visible"); - }); - - it("shows reservation modal when dropping reservation handle on calendar", () => { - tempusPage.waitForCalendarToFinishLoading(); - tempusPage.getCalendarSection().should("be.visible"); - - tempusPage.getReservationDragHandle().drag(tempusPage.selectors.calendarSection); - - tempusPage.getReservationModal().should("be.visible"); - }); - - it("can drop event from calendar into parking slot", () => { - tempusPage.getEventParkingSlot().should("exist"); - tempusPage.getParkedEvents().should("have.length", 0); - - tempusPage.getCalendarEvents().first().drag(tempusPage.selectors.parkingSlot); - - tempusPage.getParkedEvents().should("have.length", 1); - }); -}); diff --git a/tests/cypress/cypress/e2e/specs/ui/tempus/tempus.cy.js b/tests/cypress/cypress/e2e/specs/ui/tempus/tempus.cy.js new file mode 100644 index 000000000..76fa352aa --- /dev/null +++ b/tests/cypress/cypress/e2e/specs/ui/tempus/tempus.cy.js @@ -0,0 +1,710 @@ +import { tempusPage } from "../../../../support/pages/tempus.po"; + +const PLANER = "Planer"; +const LEKTOR = "Lektor"; +const STUDENT = "Student"; +const SYNC = "Sync"; + +const roleFetchAliases = { + [PLANER]: "@fetchPlanData", + [LEKTOR]: "@fetchLecturerPlanData", + [STUDENT]: "@fetchStudentPlanData", +}; + +const waitForOk = (alias) => + cy.wait(alias).its("response.statusCode").should("eq", 200); + +const syncAndReloadPlanner = () => { + tempusPage.selectPreviewRole(SYNC); // ensure all events are loaded + waitForOk("@syncCalendar"); + waitForOk("@fetchPlanData"); + tempusPage.waitForCalendarToFinishLoading(); +}; + +const selectRoleAndWait = (role) => { + tempusPage.selectPreviewRole(role); + waitForOk(roleFetchAliases[role]); + tempusPage.waitForCalendarToFinishLoading(); +}; + +const formatIsoDateTimeForKalenderApi = (isoDateTime) => + isoDateTime.slice(0, 16).replace("T", " "); + +let eventRestoreOnFailure = null; + +context("Base tempus tests", () => { + beforeEach(() => { + cy.login(); + + cy.intercept({ method: "GET", url: "**/StgTree" }).as("fetchCourseTree"); + cy.intercept({ + method: "GET", + url: /\/tempus\/Kalender\/getPlan(?:\?|$)/, + }).as("fetchPlanData"); + cy.intercept({ + method: "GET", + url: /\/tempus\/Kalender\/getPlanLecturer(?:\?|$)/, + }).as("fetchLecturerPlanData"); + cy.intercept({ + method: "GET", + url: /\/tempus\/Kalender\/getPlanStudent(?:\?|$)/, + }).as("fetchStudentPlanData"); + cy.intercept({ method: "GET", url: "**/tempus/Kalender/getHistory**" }).as( + "fetchEventHistory", + ); + cy.intercept({ + method: "GET", + url: "**/tempus/coursepicker/getByStg**", + }).as("fetchCoursePickerCourses"); + cy.intercept({ + method: "POST", + url: "**/tempus/Kalender/addKalenderEvent**", + }).as("addCalendarEvent"); + cy.intercept({ + method: "POST", + url: "**/tempus/Kalender/updateKalenderEvent**", + }).as("updateCalendarEvent"); + cy.intercept({ + method: "POST", + url: "**/tempus/Kalender/sync**", + }).as("syncCalendar"); + cy.intercept({ + method: "POST", + url: "**/tempus/Kalender/syncToLecturer**", + }).as("syncCalendarToLecturer"); + cy.intercept({ + method: "POST", + url: "**/tempus/Kalender/syncToStudent**", + }).as("syncCalendarToStudent"); + cy.intercept({ + method: "POST", + url: "**/tempus/Kalender/deleteEntry**", + }).as("deleteCalendarEvent"); + + tempusPage.visit(); + + waitForOk("@fetchCourseTree"); + waitForOk("@fetchPlanData"); + }); + + afterEach(function () { + const eventRestore = eventRestoreOnFailure; + eventRestoreOnFailure = null; + + if (this.currentTest.state !== "failed" || !eventRestore) { + return; + } + + return tempusPage + .restoreKalenderEventTime( + eventRestore.kalenderId, + eventRestore.startTime, + eventRestore.endTime, + { failOnStatusCode: false }, + ) + .its("status") + .should("eq", 200); + }); + + // it("can access Tempus page with valid credentials", () => { + // tempusPage.getTempusOverview().should("be.visible"); + // }); + + // it("shows all expected page elements", () => { + // tempusPage.getTempusOverview().should("be.visible"); + // tempusPage.getSidebarMenu().should("exist"); + // tempusPage.getSlideInCoursesMenu().should("exist"); + // tempusPage.getCalendarSection().should("be.visible"); + // tempusPage.getPreviewRoleOptionsHolder().should("be.visible"); + // }); + + // it("can open courses menu", () => { + // tempusPage.getSlideInCoursesMenu().should("exist").should("be.hidden"); + + // tempusPage.openCoursesMenu(); + + // tempusPage.getCourseTreeRows().should("have.length.greaterThan", 0); + // }); + + // it("can select one course and show preview of its events", () => { + // tempusPage.getSlideInCoursesMenu().should("exist"); + // tempusPage.getCourseTreeRows().should("have.length.greaterThan", 0); + // tempusPage.getCoursePicker().should("exist"); + // tempusPage.getCoursePickerRows().should("have.length", 0); + + // tempusPage.selectFirstCourse(); + // waitForOk("@fetchCoursePickerCourses"); + + // tempusPage.getCoursePickerRows().should("have.length.greaterThan", 0); + // }); + + // it("can search for a course event in the course picker", () => { + // tempusPage.selectFirstCourse(); + // waitForOk("@fetchCoursePickerCourses"); + + // tempusPage.getCoursePickerRows().should("have.length.greaterThan", 0); + + // tempusPage + // .getCoursePickerRows() + // .last() + // .find("div:first span:first") + // .invoke("text") + // .as("randomCourseText"); + + // cy.get("@randomCourseText").then((randomCourseText) => { + // tempusPage.getCoursePickerSearchInput().type(randomCourseText); + + // tempusPage.getCoursePickerRows().should("have.length.greaterThan", 0); + // tempusPage + // .getCoursePickerRows() + // .first() + // .should("contain.text", randomCourseText); + // }); + // }); + + // it("can drag and drop one course event into the calendar", () => { + // tempusPage.getCalendarSection().should("exist"); + // tempusPage.waitForCalendarToFinishLoading(); + + // tempusPage.selectFirstCourse(); + // waitForOk("@fetchCoursePickerCourses"); + + // tempusPage.getCalendarEvents().then(($events) => { + // cy.wrap($events.length).as("initialEventCount"); + // }); + + // tempusPage.getCoursePickerRows().should("have.length.greaterThan", 0); + // tempusPage.dropCourseOnCalendarPart(0, 10); + + // waitForOk("@addCalendarEvent"); + // waitForOk("@fetchPlanData"); + + // tempusPage.waitForCalendarToFinishLoading(); + + // cy.get("@initialEventCount").then((initialEventCount) => { + // tempusPage + // .getCalendarEvents() + // .should("have.length", initialEventCount + 1); + // }); + // }); + + // it("shows the same number of calendar events for all role previews", () => { + // const rolePreviews = [ + // { label: PLANER, fetchAlias: roleFetchAliases[PLANER] }, + // { label: LEKTOR, fetchAlias: roleFetchAliases[LEKTOR] }, + // { label: STUDENT, fetchAlias: roleFetchAliases[STUDENT] }, + // ]; + // const eventCounts = {}; + + // syncAndReloadPlanner(); + + // cy.wrap(rolePreviews) + // .each((rolePreview) => { + // selectRoleAndWait(rolePreview.label); + + // tempusPage.getCalendarEvents().then(($events) => { + // eventCounts[rolePreview.label] = $events.length; + // }); + // }) + // .then(() => { + // const expectedCount = eventCounts[rolePreviews[0].label]; + + // Object.entries(eventCounts).forEach(([role, count]) => { + // expect(count, `${role} calendar event count`).to.eq(expectedCount); + // }); + // }); + // }); + + // it("shows event details modal when clicking a calendar event", () => { + // tempusPage.waitForCalendarToFinishLoading(); + // tempusPage.getCalendarEvents().should("have.length.greaterThan", 0); + + // tempusPage.getCalendarEvents().first().click(); + + // tempusPage.getCalendarEventModal().should("be.visible"); + // }); + + // it("shows event context menu when right clicking a calendar event", () => { + // tempusPage.waitForCalendarToFinishLoading(); + // tempusPage.getCalendarEvents().should("have.length.greaterThan", 0); + + // tempusPage.getCalendarEvents().first().rightclick(); + + // tempusPage.getEventContextMenu().should("be.visible"); + // }); + + // it("shows history modal when selecting History from event context menu", () => { + // tempusPage.waitForCalendarToFinishLoading(); + // tempusPage.getCalendarEvents().should("have.length.greaterThan", 0); + + // tempusPage.getCalendarEvents().first().rightclick(); + // tempusPage.getEventContextMenuOption("History").click(); + // waitForOk("@fetchEventHistory"); + + // tempusPage.getHistoryModal().should("be.visible"); + // }); + + // it.skip("shows reservation modal when dropping reservation handle on calendar", () => { + // tempusPage.waitForCalendarToFinishLoading(); + // tempusPage.getCalendarBaseGrid().should("be.visible"); + // cy.wait(1000); // wait for potential animations + // tempusPage + // .getReservationDragHandle() + // .drag( + // tempusPage.selectors.calendarBaseGrid + " .part-body:nth-of-type(18)", + // { + // waitForAnimations: false, + // animationDistanceThreshold: 0, + // }, + // ); + + // cy.wait(3000); // wait for potential animations + // tempusPage.getReservationModal().should("be.visible"); + // }); + + // it("can drop event from calendar into parking slot", () => { + // tempusPage.getEventParkingSlot().should("exist"); + // tempusPage.getParkedEvents().should("have.length", 0); + + // tempusPage + // .getCalendarEvents() + // .first() + // .drag(tempusPage.selectors.parkingSlot); + + // tempusPage.getParkedEvents().should("have.length", 1); + // }); + + it("on planner event change shows unchanged event on other roles", () => { + syncAndReloadPlanner(); + + cy.get(".fhc-calendar-base-grid > div") + .last() + .invoke( + "css", + "overflow", + "hidden", + ); + cy.wait(500); // ensure overflow change is applied before dragging, otherwise the drag can fail due to the calendar scrolling + tempusPage + .getCalendarEventsByTimeRange("08:00:00", "08:45:00") + .first() + .invoke("attr", "data-fhc-draggable-value") + .then((eventJSON) => { + expect(eventJSON).to.exist; + + const eventData = JSON.parse(eventJSON); + const originalStartTime = formatIsoDateTimeForKalenderApi( + eventData.orig.isostart, + ); + const originalEndTime = formatIsoDateTimeForKalenderApi( + eventData.orig.isoend, + ); + let eventId = eventData?.id; + expect(eventId).to.exist; + + tempusPage.dropEventOnCalendarPart(eventId, 2); + + cy.wait("@updateCalendarEvent").then((interception) => { + expect(interception.response.statusCode).to.eq(200); + + const updatedEventId = + interception.response.body.data.retval.kalender_id; + + eventRestoreOnFailure = { + kalenderId: updatedEventId, + startTime: originalStartTime, + endTime: originalEndTime, + }; + + cy.wrap(updatedEventId).as("updatedEventId"); + }); + waitForOk("@fetchPlanData"); + + cy.get("@updatedEventId").then((updatedEventId) => { + tempusPage.getEventGridRow(updatedEventId).then((gridRowStyle) => { + selectRoleAndWait(LEKTOR); + tempusPage.getEventGridRow(eventId).then((lecturerGridRow) => { + expect(lecturerGridRow).to.not.eq(gridRowStyle); + }); + + selectRoleAndWait(STUDENT); + tempusPage.getEventGridRow(eventId).then((studentGridRow) => { + expect(studentGridRow).to.not.eq(gridRowStyle); + }); + }); + }); + }); + + cy.get(".fhc-calendar-base-grid > div:last-child()").invoke( + "css", + "overflow", + "auto", + ); + }); + + it("sync after planner preview event change loads event in same way on all previews", () => { + syncAndReloadPlanner(); + + tempusPage + .getCalendarEventsByTimeRange("08:00:00", "08:45:00") + .first() + .invoke("attr", "data-fhc-draggable-value") + .then((eventJSON) => { + expect(eventJSON).to.exist; + + const eventData = JSON.parse(eventJSON); + const originalStartTime = formatIsoDateTimeForKalenderApi( + eventData.orig.isostart, + ); + const originalEndTime = formatIsoDateTimeForKalenderApi( + eventData.orig.isoend, + ); + let eventId = eventData?.id; + expect(eventId).to.exist; + + tempusPage.dropEventOnCalendarPart(eventId, 3, { + scrollIntoView: true, + }); + + cy.wait("@updateCalendarEvent").then((interception) => { + expect(interception.response.statusCode).to.eq(200); + + const updatedEventId = + interception.response.body.data.retval.kalender_id; + + eventRestoreOnFailure = { + kalenderId: updatedEventId, + startTime: originalStartTime, + endTime: originalEndTime, + }; + + cy.wrap(updatedEventId).as("updatedEventId"); + }); + waitForOk("@fetchPlanData"); + + syncAndReloadPlanner(); + + cy.get("@updatedEventId").then((updatedEventId) => { + tempusPage.getEventGridRow(updatedEventId).then((gridRowStyle) => { + selectRoleAndWait(LEKTOR); + tempusPage + .getEventGridRow(updatedEventId) + .then((lecturerGridRow) => { + expect(lecturerGridRow).to.eq(gridRowStyle); + }); + + selectRoleAndWait(STUDENT); + tempusPage + .getEventGridRow(updatedEventId) + .then((studentGridRow) => { + expect(studentGridRow).to.eq(gridRowStyle); + }); + }); + }); + }); + }); + + it("live unlock after planner preview event change loads event in same way on planner and lektor, but not on student preview", () => { + syncAndReloadPlanner(); + + tempusPage + .getCalendarEventsByTimeRange("08:00:00", "08:45:00") + .first() + .invoke("attr", "data-fhc-draggable-value") + .then((eventJSON) => { + expect(eventJSON).to.exist; + + let eventId = JSON.parse(eventJSON)?.id; + expect(eventId).to.exist; + tempusPage.dropEventOnCalendarPart(eventId, 4, { + scrollIntoView: true, + }); + + cy.wait("@updateCalendarEvent") + .its("response.body.data.retval.kalender_id") + .as("updatedEventId"); + waitForOk("@fetchPlanData"); + + tempusPage.waitForCalendarToFinishLoading(); + + cy.get("@updatedEventId").then((updatedEventId) => { + tempusPage + .getCalendarEventById(updatedEventId) + .should("exist") + .rightclick(); + tempusPage.getEventContextMenuOption("Freischalten für Live").click(); // TODO: Check wether live is for studnet + waitForOk("@syncCalendarToStudent"); + + tempusPage.getEventGridRow(updatedEventId).then((gridRowStyle) => { + selectRoleAndWait(LEKTOR); + tempusPage + .getEventGridRow(updatedEventId) + .then((lecturerGridRow) => { + expect(lecturerGridRow).to.eq(gridRowStyle); + }); + + selectRoleAndWait(STUDENT); + tempusPage.getEventGridRow(eventId).then((studentGridRow) => { + expect(studentGridRow).to.not.eq(gridRowStyle); + }); + }); + }); + }); + }); + + it("event change on lector preview is prohibited", () => { + syncAndReloadPlanner(); + + selectRoleAndWait(LEKTOR); + + tempusPage + .getCalendarEventsByTimeRange("08:00:00", "08:45:00") + .first() + .invoke("attr", "data-fhc-draggable-value") + .then((eventJSON) => { + expect(eventJSON).to.exist; + + let eventId = JSON.parse(eventJSON)?.id; + expect(eventId).to.exist; + + tempusPage.dropEventOnCalendarPart(eventId, 15); + + cy.get("@updateCalendarEvent").should("not.exist"); + + tempusPage.getEventGridRow(eventId).then((gridRowStyle) => { + selectRoleAndWait(LEKTOR); + tempusPage.getEventGridRow(eventId).then((lecturerGridRow) => { + expect(lecturerGridRow).to.eq(gridRowStyle); + }); + + selectRoleAndWait(STUDENT); + tempusPage.getEventGridRow(eventId).then((studentGridRow) => { + expect(studentGridRow).to.eq(gridRowStyle); + }); + }); + }); + }); + + it("event change on student preview is prohibited", () => { + syncAndReloadPlanner(); + + selectRoleAndWait(STUDENT); + + tempusPage + .getCalendarEventsByTimeRange("08:00:00", "08:45:00") + .first() + .invoke("attr", "data-fhc-draggable-value") + .then((eventJSON) => { + expect(eventJSON).to.exist; + + let eventId = JSON.parse(eventJSON)?.id; + expect(eventId).to.exist; + + tempusPage.dropEventOnCalendarPart(eventId, 15); + + cy.get("@updateCalendarEvent").should("not.exist"); + + tempusPage.getEventGridRow(eventId).then((gridRowStyle) => { + selectRoleAndWait(LEKTOR); + tempusPage.getEventGridRow(eventId).then((lecturerGridRow) => { + expect(lecturerGridRow).to.eq(gridRowStyle); + }); + + selectRoleAndWait(STUDENT); + tempusPage.getEventGridRow(eventId).then((studentGridRow) => { + expect(studentGridRow).to.eq(gridRowStyle); + }); + }); + }); + }); + + it("event deletion on planner preview preservers event on planner, but shows it as unsynced on lektor and student preview", () => { + syncAndReloadPlanner(); + + tempusPage + .getCalendarEvents() + .first() + .invoke("attr", "data-fhc-draggable-value") + .then((eventJSON) => { + expect(eventJSON).to.exist; + + let eventId = JSON.parse(eventJSON)?.id; + expect(eventId).to.exist; + tempusPage + .getCalendarEventById(eventId) + .should("be.visible") + .rightclick(); + tempusPage.getEventContextMenuOption("Delete").click(); + + cy.wait("@deleteCalendarEvent"); + waitForOk("@fetchPlanData"); + + tempusPage.waitForCalendarToFinishLoading(); + + tempusPage.getCalendarEventById(eventId).should("be.visible"); + + selectRoleAndWait(LEKTOR); + tempusPage.getCalendarEventById(eventId).should("not.exist"); + + selectRoleAndWait(STUDENT); + tempusPage.getCalendarEventById(eventId).should("not.exist"); + }); + }); + + it("syncing event deletion on planner preview removes event from other previews", () => { + syncAndReloadPlanner(); + + tempusPage + .getCalendarEvents() + .first() + .invoke("attr", "data-fhc-draggable-value") + .then((eventJSON) => { + expect(eventJSON).to.exist; + + let eventId = JSON.parse(eventJSON)?.id; + expect(eventId).to.exist; + tempusPage + .getCalendarEventById(eventId) + .should("be.visible") + .rightclick(); + tempusPage.getEventContextMenuOption("Delete").click(); + + cy.wait("@deleteCalendarEvent"); + waitForOk("@fetchPlanData"); + + syncAndReloadPlanner(); + + tempusPage.getCalendarEventById(eventId).should("not.exist"); + + selectRoleAndWait(LEKTOR); + tempusPage.getCalendarEventById(eventId).should("not.exist"); + + selectRoleAndWait(STUDENT); + tempusPage.getCalendarEventById(eventId).should("not.exist"); + }); + }); + + it("can bottom resize an event on planner preview", () => { + tempusPage.getCalendarSection().should("exist"); + tempusPage.waitForCalendarToFinishLoading(); + + tempusPage + .getCalendarEventsByStartTime("08:00:00") + .first() + .invoke("attr", "data-fhc-draggable-value") + .then((eventJSON) => { + cy.wrap(JSON.parse(eventJSON)).its("id").as("eventId"); + cy.wrap(JSON.parse(eventJSON).orig) + .its("beginn") + .as("originalEventStart"); + cy.wrap(JSON.parse(eventJSON).orig).its("ende").as("originalEventEnd"); + }); + + cy.get("@eventId").then((eventId) => { + tempusPage + .getCalendarEventById(eventId) + .find(".fhc-resize-bar--bottom") + .first() + .realHover() + .realMouseDown("center", { + button: "left", + }) + .realMouseMove(0, 120) + .realMouseUp(); + + cy.wait("@updateCalendarEvent").then((interception) => { + expect(interception.response.statusCode).to.eq(200); + + const updatedEventId = + interception.response.body.data.retval.kalender_id; + + cy.wrap(updatedEventId).as("updatedEventId"); + }); + waitForOk("@fetchPlanData"); + + cy.get("@updatedEventId").then((updatedEventId) => { + tempusPage + .getCalendarEventById(updatedEventId) + .invoke("attr", "data-fhc-draggable-value") + .then((eventJSON) => { + let newEventStart = JSON.parse(eventJSON)?.orig?.beginn; + let newEventEnd = JSON.parse(eventJSON)?.orig?.ende; + + cy.get("@originalEventStart").then((originalEventStart) => { + expect(newEventStart).to.eq(originalEventStart); + }); + cy.get("@originalEventEnd").then((originalEventEnd) => { + expect(newEventEnd).to.not.eq(originalEventEnd); + }); + }); + }); + }); + }); + + it("can top resize an event on planner preview", () => { + tempusPage.getCalendarSection().should("exist"); + tempusPage.waitForCalendarToFinishLoading(); + + tempusPage + .getCalendarEventsByStartTime("09:40:00") + .first() + .invoke("attr", "data-fhc-draggable-value") + .then((eventJSON) => { + cy.wrap(JSON.parse(eventJSON)).its("id").as("eventId"); + cy.wrap(JSON.parse(eventJSON).orig) + .its("beginn") + .as("originalEventStart"); + cy.wrap(JSON.parse(eventJSON).orig).its("ende").as("originalEventEnd"); + }); + + cy.get("@eventId").then((eventId) => { + tempusPage + .getCalendarEventById(eventId) + .find(".fhc-resize-bar--top") + .first() + .realHover() + .realMouseDown("center", { + button: "left", + }) + .realMouseMove(0, -40) + .realMouseUp(); + + cy.wait("@updateCalendarEvent").then((interception) => { + expect(interception.response.statusCode).to.eq(200); + + const updatedEventId = + interception.response.body.data.retval.kalender_id; + + cy.wrap(updatedEventId).as("updatedEventId"); + }); + waitForOk("@fetchPlanData"); + + cy.get("@updatedEventId").then((updatedEventId) => { + tempusPage + .getCalendarEventById(updatedEventId) + .invoke("attr", "data-fhc-draggable-value") + .then((eventJSON) => { + let newEventStart = JSON.parse(eventJSON)?.orig?.beginn; + let newEventEnd = JSON.parse(eventJSON)?.orig?.ende; + + cy.get("@originalEventStart").then((originalEventStart) => { + expect(newEventStart).to.not.eq(originalEventStart); + }); + cy.get("@originalEventEnd").then((originalEventEnd) => { + expect(newEventEnd).to.eq(originalEventEnd); + }); + }); + }); + }); + }); + + // check live issue -- done + // check delete -- DONE + // resize - dones + // sve al bez stunden raster + // course picker search + // raumauswal + // btn click to current semester + // filter za raum und fuer person + // filter ode u sidebar +}); diff --git a/tests/cypress/cypress/support/commands.js b/tests/cypress/cypress/support/commands.js index 358165d37..8d22558cb 100644 --- a/tests/cypress/cypress/support/commands.js +++ b/tests/cypress/cypress/support/commands.js @@ -25,6 +25,7 @@ // Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... }) require("@4tw/cypress-drag-drop"); +require("cypress-real-events") Cypress.Commands.add("login", () => { const { adminusername, adminpassword, loginAsUser } = Cypress.env(); diff --git a/tests/cypress/cypress/support/pages/tempus.po.js b/tests/cypress/cypress/support/pages/tempus.po.js index ff25ee4f2..4e3f386f1 100644 --- a/tests/cypress/cypress/support/pages/tempus.po.js +++ b/tests/cypress/cypress/support/pages/tempus.po.js @@ -1,6 +1,7 @@ class TempusPage { selectors = { calendarSection: "div[data-cy='tempus'] .fhc-calendar-base", + calendarBaseGrid: "div[data-cy='tempus'] .fhc-calendar-base-grid", parkingSlot: "div[data-cy='tempus'] #parkingslot", }; @@ -14,6 +15,7 @@ class TempusPage { getSlideInCoursesMenu = () => cy.get("div[data-cy='verbandMenu']"); getSidebarMenu = () => this.getTempusOverview().find("#sidebarMenu"); getCalendarSection = () => this.getTempusOverview().find(".fhc-calendar-base"); + getCalendarBaseGrid = () => this.getCalendarSection().find(".fhc-calendar-base-grid"); getCoursePicker = () => this.getTempusOverview().find(".course-picker"); getPreviewRoleOptionsHolder = () => this.getTempusOverview().find("[data-cy='previewRoleOptionsHolder']"); getAllCoursesSliderBtn = () => this.getSidebarMenu().find("button[title='Verband']").first(); @@ -21,6 +23,76 @@ class TempusPage { getCoursePickerRows = () => this.getCoursePicker().find(".course-picker-row"); getCoursePickerSearchInput = () => this.getCoursePicker().find("input"); getCalendarEvents = () => this.getCalendarSection().find(".fhc-calendar-base-grid-line-event"); + + getCalendarEventById = (id) => this.getCalendarEvents().filter(`div[data-id="event-${id}"]`); + getCalendarPartDropTarget = (partIndex) => + `${this.selectors.calendarBaseGrid} .part-body:nth-of-type(${partIndex})`; + dropEventOnCalendarPart = (eventId, partIndex, options = {}) => { + const { scrollIntoView = false, ...dragOptions } = options; + const event = this.getCalendarEventById(eventId); + const eventToDrag = scrollIntoView ? event.scrollIntoView() : event; + + return eventToDrag.should("be.visible").focus().drag( + this.getCalendarPartDropTarget(partIndex), + { + waitForAnimations: false, + animationDistanceThreshold: 0, + scrollBehavior: false, + ...dragOptions, + }, + ); + }; + dropCourseOnCalendarPart = (courseIndex, partIndex, options = {}) => { + const { scrollIntoView = false, ...dragOptions } = options; + const course = this.getCoursePickerRows().eq(courseIndex); + const courseToDrag = scrollIntoView ? course.scrollIntoView() : course; + + return courseToDrag.should("be.visible").drag( + this.getCalendarPartDropTarget(partIndex), + { + waitForAnimations: false, + animationDistanceThreshold: 0, + ...dragOptions, + }, + ); + }; + updateKalenderEvent = (kalenderId, updatedInfos, options = {}) => + cy.request({ + method: "POST", + url: "/index.ci.php/api/frontend/v1/tempus/Kalender/updateKalenderEvent", + body: { + kalender_id: kalenderId, + updatedInfos, + }, + ...options, + }); + restoreKalenderEventTime = (kalenderId, startTime, endTime, options = {}) => + this.updateKalenderEvent( + kalenderId, + { + start_time: startTime, + end_time: endTime, + }, + options, + ); + getEventGridRowFromStyle = (style) => + /grid-row:\s*([^;]+)/.exec(style)?.[1]?.trim(); + getEventGridRow = (id) => + this.getCalendarEventById(id) + .invoke("attr", "style") + .then((style) => this.getEventGridRowFromStyle(style)); + getCalendarEventsByStartTime = (startTime) => this.getCalendarEvents().filter((index, event) => { + const eventData = JSON.parse(event.getAttribute("data-fhc-draggable-value")); + return eventData?.orig?.beginn === startTime; + }); + getCalendarEventsByEndTime = (endTime) => this.getCalendarEvents().filter((index, event) => { + const eventData = JSON.parse(event.getAttribute("data-fhc-draggable-value")); + return eventData?.orig?.ende === endTime; + }); + getCalendarEventsByTimeRange = (startTime, endTime) => this.getCalendarEvents().filter((index, event) => { + const eventData = JSON.parse(event.getAttribute("data-fhc-draggable-value")); + return eventData?.orig?.beginn === startTime && eventData?.orig?.ende === endTime; + }); getCalendarLoadingEvents = () => this.getCalendarSection().find(".placeholder-glow"); getCalendarEventModal = () => this.getCalendarSection().find(".bootstrap-modal.show"); getEventContextMenu = () => cy.get("[data-cy='eventContextMenu']"); diff --git a/tests/cypress/package-lock.json b/tests/cypress/package-lock.json index 03cf18fcb..e6949669e 100644 --- a/tests/cypress/package-lock.json +++ b/tests/cypress/package-lock.json @@ -1,10 +1,11 @@ { - "name": "cypresstest", + "name": "cypress", "lockfileVersion": 3, "requires": true, "packages": { "": { "dependencies": { + "cypress-real-events": "^1.15.0", "dotenv": "^17.4.2" }, "devDependencies": { @@ -26,7 +27,6 @@ "version": "3.0.10", "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.10.tgz", "integrity": "sha512-hauBrOdvu08vOsagkZ/Aju5XuiZx6ldsLfByg1htFeldhex+PeMrYauANzFsMJeAA0+dyPLbDoX2OYuvVoLDkQ==", - "dev": true, "license": "Apache-2.0", "dependencies": { "aws-sign2": "~0.7.0", @@ -56,7 +56,6 @@ "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, "license": "MIT", "dependencies": { "debug": "^3.1.0", @@ -67,7 +66,6 @@ "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.1" @@ -77,7 +75,6 @@ "version": "25.3.3", "resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.3.tgz", "integrity": "sha512-DpzbrH7wIcBaJibpKo9nnSQL0MTRdnWttGyE5haGwK86xgMOkFLp7vEyfQPGLOJh5wNYiJ3V9PmUMDhV9u8kkQ==", - "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -88,28 +85,24 @@ "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, "license": "MIT" }, "node_modules/@types/sizzle": { "version": "2.3.10", "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.10.tgz", "integrity": "sha512-TC0dmN0K8YcWEAEfiPi5gJP14eJe30TTGjkvek3iM/1NdHHsdCA/Td6GvNndMOo/iSnIsZ4HuuhrYPDAmbxzww==", - "dev": true, "license": "MIT" }, "node_modules/@types/tmp": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.2.6.tgz", "integrity": "sha512-chhaNf2oKHlRkDGt+tiKE2Z5aJ6qalm7Z9rlLdBwmOiAAf09YQvvoLXjWK4HWPF1xU/fqvMgfNfpVoBscA/tKA==", - "dev": true, "license": "MIT" }, "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, "license": "MIT", "optional": true, "dependencies": { @@ -120,7 +113,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, "license": "MIT", "dependencies": { "clean-stack": "^2.0.0", @@ -134,7 +126,6 @@ "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, "license": "MIT", "engines": { "node": ">=6" @@ -144,7 +135,6 @@ "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, "license": "MIT", "dependencies": { "type-fest": "^0.21.3" @@ -160,7 +150,6 @@ "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" @@ -173,7 +162,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -183,7 +171,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -199,7 +186,6 @@ "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", @@ -220,7 +206,6 @@ "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, "license": "MIT", "dependencies": { "safer-buffer": "~2.1.0" @@ -230,7 +215,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.8" @@ -240,7 +224,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -250,14 +233,12 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true, "license": "MIT" }, "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, "license": "ISC", "engines": { "node": ">= 4.0.0" @@ -267,7 +248,6 @@ "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, "license": "Apache-2.0", "engines": { "node": "*" @@ -277,14 +257,12 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", - "dev": true, "license": "MIT" }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, "funding": [ { "type": "github", @@ -305,7 +283,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dev": true, "license": "BSD-3-Clause", "dependencies": { "tweetnacl": "^0.14.3" @@ -315,21 +292,18 @@ "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, "license": "Apache-2.0" }, "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, "license": "MIT" }, "node_modules/buffer": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, "funding": [ { "type": "github", @@ -354,7 +328,6 @@ "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true, "license": "MIT", "engines": { "node": "*" @@ -364,7 +337,6 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.4.0.tgz", "integrity": "sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -374,7 +346,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -388,7 +359,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -405,14 +375,12 @@ "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "dev": true, "license": "Apache-2.0" }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -429,7 +397,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -442,7 +409,6 @@ "version": "4.4.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", - "dev": true, "funding": [ { "type": "github", @@ -458,7 +424,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -468,7 +433,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, "license": "MIT", "dependencies": { "restore-cursor": "^3.1.0" @@ -481,7 +445,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.1.tgz", "integrity": "sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA==", - "dev": true, "license": "MIT", "dependencies": { "string-width": "^4.2.0" @@ -497,7 +460,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dev": true, "license": "MIT", "dependencies": { "slice-ansi": "^3.0.0", @@ -514,7 +476,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -527,21 +488,18 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, "license": "MIT" }, "node_modules/colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true, "license": "MIT" }, "node_modules/colors": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true, "license": "MIT", "optional": true, "engines": { @@ -552,7 +510,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" @@ -565,7 +522,6 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", - "dev": true, "license": "MIT", "engines": { "node": ">= 6" @@ -575,7 +531,6 @@ "version": "1.8.2", "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", - "dev": true, "license": "MIT", "engines": { "node": ">=4.0.0" @@ -585,14 +540,12 @@ "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, "license": "MIT" }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -607,7 +560,6 @@ "version": "15.11.0", "resolved": "https://registry.npmjs.org/cypress/-/cypress-15.11.0.tgz", "integrity": "sha512-NXDE6/fqZuzh1Zr53nyhCCa4lcANNTYWQNP9fJO+tzD3qVTDaTUni5xXMuigYjMujQ7CRiT9RkJJONmPQSsDFw==", - "dev": true, "hasInstallScript": true, "license": "MIT", "dependencies": { @@ -662,11 +614,19 @@ "node": "^20.1.0 || ^22.0.0 || >=24.0.0" } }, + "node_modules/cypress-real-events": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/cypress-real-events/-/cypress-real-events-1.15.0.tgz", + "integrity": "sha512-in98xxTnnM9Z7lZBvvVozm99PBT2eEOjXRG5LKWyYvQnj9mGWXMiPNpfw7e7WiraBFh7XlXIxnE9Cu5o+52kQQ==", + "license": "MIT", + "peerDependencies": { + "cypress": "^4.x || ^5.x || ^6.x || ^7.x || ^8.x || ^9.x || ^10.x || ^11.x || ^12.x || ^13.x || ^14.x || ^15.x" + } + }, "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, "license": "MIT", "dependencies": { "assert-plus": "^1.0.0" @@ -679,14 +639,12 @@ "version": "1.11.19", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.19.tgz", "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==", - "dev": true, "license": "MIT" }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -704,7 +662,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.4.0" @@ -726,7 +683,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", @@ -741,7 +697,6 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dev": true, "license": "MIT", "dependencies": { "jsbn": "~0.1.0", @@ -752,14 +707,12 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, "license": "MIT" }, "node_modules/end-of-stream": { "version": "1.4.5", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", - "dev": true, "license": "MIT", "dependencies": { "once": "^1.4.0" @@ -769,7 +722,6 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", - "dev": true, "license": "MIT", "dependencies": { "ansi-colors": "^4.1.1", @@ -783,7 +735,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -793,7 +744,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -803,7 +753,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -816,7 +765,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -832,7 +780,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.8.0" @@ -842,14 +789,12 @@ "version": "6.4.7", "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz", "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==", - "dev": true, "license": "MIT" }, "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, "license": "MIT", "dependencies": { "cross-spawn": "^7.0.0", @@ -873,7 +818,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", - "dev": true, "license": "MIT", "dependencies": { "pify": "^2.2.0" @@ -886,14 +830,12 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true, "license": "MIT" }, "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, "license": "BSD-2-Clause", "dependencies": { "debug": "^4.1.1", @@ -914,7 +856,6 @@ "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" ], @@ -924,7 +865,6 @@ "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, "license": "MIT", "dependencies": { "pend": "~1.2.0" @@ -934,7 +874,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, "license": "MIT", "dependencies": { "escape-string-regexp": "^1.0.5" @@ -950,7 +889,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "dev": true, "license": "Apache-2.0", "engines": { "node": "*" @@ -960,7 +898,6 @@ "version": "4.0.5", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", - "dev": true, "license": "MIT", "dependencies": { "asynckit": "^0.4.0", @@ -977,7 +914,6 @@ "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, "license": "MIT", "dependencies": { "at-least-node": "^1.0.0", @@ -993,7 +929,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1003,7 +938,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -1028,7 +962,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", @@ -1042,7 +975,6 @@ "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, "license": "MIT", "dependencies": { "pump": "^3.0.0" @@ -1058,7 +990,6 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dev": true, "license": "MIT", "dependencies": { "assert-plus": "^1.0.0" @@ -1068,7 +999,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", - "dev": true, "license": "MIT", "dependencies": { "ini": "2.0.0" @@ -1084,7 +1014,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -1097,14 +1026,12 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, "license": "ISC" }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -1114,7 +1041,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -1127,7 +1053,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" @@ -1143,7 +1068,6 @@ "version": "5.2.2", "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", - "dev": true, "license": "MIT", "dependencies": { "is-stream": "^2.0.0", @@ -1160,7 +1084,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -1173,7 +1096,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.4.0.tgz", "integrity": "sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg==", - "dev": true, "license": "MIT", "dependencies": { "assert-plus": "^1.0.0", @@ -1188,7 +1110,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true, "license": "Apache-2.0", "engines": { "node": ">=8.12.0" @@ -1198,7 +1119,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, "funding": [ { "type": "github", @@ -1219,7 +1139,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -1229,7 +1148,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true, "license": "ISC", "engines": { "node": ">=10" @@ -1239,7 +1157,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -1249,7 +1166,6 @@ "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, "license": "MIT", "dependencies": { "global-dirs": "^3.0.0", @@ -1266,7 +1182,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -1276,7 +1191,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -1289,14 +1203,12 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true, "license": "MIT" }, "node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -1309,42 +1221,36 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, "license": "ISC" }, "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, "license": "MIT" }, "node_modules/jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "dev": true, "license": "MIT" }, "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, "license": "(AFL-2.1 OR BSD-3-Clause)" }, "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, "license": "ISC" }, "node_modules/jsonfile": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, "license": "MIT", "dependencies": { "universalify": "^2.0.0" @@ -1357,7 +1263,6 @@ "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" ], @@ -1373,7 +1278,6 @@ "version": "3.14.0", "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz", "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==", - "dev": true, "license": "MIT", "dependencies": { "cli-truncate": "^2.1.0", @@ -1401,21 +1305,18 @@ "version": "4.17.23", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", - "dev": true, "license": "MIT" }, "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, "license": "MIT" }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, "license": "MIT", "dependencies": { "chalk": "^4.1.0", @@ -1432,7 +1333,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", - "dev": true, "license": "MIT", "dependencies": { "ansi-escapes": "^4.3.0", @@ -1451,7 +1351,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -1469,7 +1368,6 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -1484,7 +1382,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -1494,14 +1391,12 @@ "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, "license": "MIT" }, "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, "license": "MIT", "engines": { "node": ">= 0.6" @@ -1511,7 +1406,6 @@ "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, "license": "MIT", "dependencies": { "mime-db": "1.52.0" @@ -1524,7 +1418,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -1534,7 +1427,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1544,14 +1436,12 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, "license": "MIT" }, "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, "license": "MIT", "dependencies": { "path-key": "^3.0.0" @@ -1564,7 +1454,6 @@ "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -1577,7 +1466,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, "license": "ISC", "dependencies": { "wrappy": "1" @@ -1587,7 +1475,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" @@ -1603,14 +1490,12 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==", - "dev": true, "license": "MIT" }, "node_modules/p-map": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, "license": "MIT", "dependencies": { "aggregate-error": "^3.0.0" @@ -1626,7 +1511,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -1636,21 +1520,18 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true, "license": "MIT" }, "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, "license": "MIT" }, "node_modules/pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -1660,7 +1541,6 @@ "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, "license": "MIT", "engines": { "node": ">=6" @@ -1673,7 +1553,6 @@ "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, "license": "MIT", "engines": { "node": ">= 0.6.0" @@ -1683,14 +1562,12 @@ "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, "license": "MIT" }, "node_modules/pump": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", - "dev": true, "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", @@ -1701,7 +1578,6 @@ "version": "6.14.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", - "dev": true, "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.1.0" @@ -1717,7 +1593,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==", - "dev": true, "license": "MIT", "dependencies": { "throttleit": "^1.0.0" @@ -1727,7 +1602,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, "license": "MIT", "dependencies": { "onetime": "^5.1.0", @@ -1741,14 +1615,12 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "dev": true, "license": "MIT" }, "node_modules/rxjs": { "version": "7.8.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", - "dev": true, "license": "Apache-2.0", "dependencies": { "tslib": "^2.1.0" @@ -1758,14 +1630,12 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, "license": "0BSD" }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, "funding": [ { "type": "github", @@ -1786,14 +1656,12 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, "license": "MIT" }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -1806,7 +1674,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -1816,7 +1683,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -1836,7 +1702,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -1853,7 +1718,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -1872,7 +1736,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -1892,14 +1755,12 @@ "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, "license": "ISC" }, "node_modules/slice-ansi": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -1914,7 +1775,6 @@ "version": "1.18.0", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", - "dev": true, "license": "MIT", "dependencies": { "asn1": "~0.2.3", @@ -1940,7 +1800,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -1955,7 +1814,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -1968,7 +1826,6 @@ "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, "license": "MIT", "engines": { "node": ">=6" @@ -1978,7 +1835,6 @@ "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -1994,7 +1850,6 @@ "version": "5.31.1", "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.31.1.tgz", "integrity": "sha512-6pRwxoGeV/roJYpsfcP6tN9mep6pPeCtXbUOCdVa0nme05Brwcwdge/fVNhIZn2wuUitAKZm4IYa7QjnRIa9zA==", - "dev": true, "license": "MIT", "os": [ "darwin", @@ -2021,7 +1876,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.1.tgz", "integrity": "sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ==", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -2031,14 +1885,12 @@ "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true, "license": "MIT" }, "node_modules/tldts": { "version": "6.1.86", "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz", "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", - "dev": true, "license": "MIT", "dependencies": { "tldts-core": "^6.1.86" @@ -2051,14 +1903,12 @@ "version": "6.1.86", "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", - "dev": true, "license": "MIT" }, "node_modules/tmp": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", - "dev": true, "license": "MIT", "engines": { "node": ">=14.14" @@ -2068,7 +1918,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", - "dev": true, "license": "BSD-3-Clause", "dependencies": { "tldts": "^6.1.32" @@ -2081,7 +1930,6 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, "license": "MIT", "bin": { "tree-kill": "cli.js" @@ -2091,14 +1939,12 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true, "license": "0BSD" }, "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, "license": "Apache-2.0", "dependencies": { "safe-buffer": "^5.0.1" @@ -2111,14 +1957,12 @@ "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "dev": true, "license": "Unlicense" }, "node_modules/type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=8" @@ -2128,7 +1972,6 @@ "version": "7.18.2", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", - "dev": true, "license": "MIT", "optional": true }, @@ -2136,7 +1979,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, "license": "MIT", "engines": { "node": ">= 10.0.0" @@ -2146,7 +1988,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -2156,7 +1997,6 @@ "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, "license": "MIT", "bin": { "uuid": "dist/bin/uuid" @@ -2166,7 +2006,6 @@ "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" ], @@ -2181,7 +2020,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -2197,7 +2035,6 @@ "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, "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -2215,14 +2052,12 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, "license": "ISC" }, "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, "license": "MIT", "dependencies": { "buffer-crc32": "~0.2.3", diff --git a/tests/cypress/package.json b/tests/cypress/package.json index 2c2503671..50b76da37 100644 --- a/tests/cypress/package.json +++ b/tests/cypress/package.json @@ -4,6 +4,7 @@ "cypress": "^15.11.0" }, "dependencies": { + "cypress-real-events": "^1.15.0", "dotenv": "^17.4.2" } }