diff --git a/aselo-webchat-react-app/cypress/e2e/General/WebchatGeneral.cy.ts b/aselo-webchat-react-app/cypress/e2e/General/WebchatGeneral.cy.ts deleted file mode 100644 index 0857a534a0..0000000000 --- a/aselo-webchat-react-app/cypress/e2e/General/WebchatGeneral.cy.ts +++ /dev/null @@ -1,399 +0,0 @@ -/** - * Copyright (C) 2021-2026 Technology Matters - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see https://www.gnu.org/licenses/. - */ - -import * as Constants from "../../utils/constants"; -import PreEngagementChatForm from "../../pageObjects/preEngagementChatForm"; -import ChatMessagesView from "../../pageObjects/Chat/chatMessagesView"; -import MessageInputBoxView from "../../pageObjects/Chat/messageInputBoxView"; -import EndChatView from "../../pageObjects/endChatView"; -import ChatNotificationView from "../../pageObjects/Chat/chatNotificationView"; - -export {}; - -describe("Webchat Lite general scenario's", () => { - beforeEach(() => { - cy.visit(""); - }); - - it("FLEXEXP-107 - Webchat Lite - Pre-engagement data - Form input fields validation - Invalid email", () => { - PreEngagementChatForm.toggleWebchatExpanded(); - PreEngagementChatForm.getStartChatButton().click(); - PreEngagementChatForm.validateFormExist(); - PreEngagementChatForm.validateFieldErrorMessage( - PreEngagementChatForm.getNameInput(), - Constants.EMPTY_FIELD_ERROR_MESSAGE - ); - PreEngagementChatForm.getNameInput().type(Constants.CUSTOMER_NAME); - PreEngagementChatForm.getStartChatButton().click(); - PreEngagementChatForm.validateFieldErrorMessage( - PreEngagementChatForm.getEmailInput(), - Constants.EMPTY_FIELD_ERROR_MESSAGE - ); - PreEngagementChatForm.validateEmail(); - PreEngagementChatForm.getEmailInput().clear(); - PreEngagementChatForm.getEmailInput().type(Cypress.env("TEST_EMAIL")); - PreEngagementChatForm.getStartChatButton().click(); - PreEngagementChatForm.validateFieldErrorMessage( - PreEngagementChatForm.getQueryTextarea(), - Constants.EMPTY_FIELD_ERROR_MESSAGE - ); - PreEngagementChatForm.getQueryTextarea().type(Constants.CUSTOMER_WELCOME_TEXT); - PreEngagementChatForm.getEmailInput().clear(); - PreEngagementChatForm.validateEmail(); - PreEngagementChatForm.validateFormExist(); - }); - - it("FLEXEXP-106 - Webchat Lite - Pre-engagement data", function flexExp106() { - PreEngagementChatForm.toggleWebchatExpanded(); - cy.createNewWebchat(); - cy.storeWebchatSessionCookie(); - MessageInputBoxView.getMessageInputTextArea().type(Constants.CUSTOMER_MESSAGE).type("{enter}"); - cy.getConversationSid() - .as("convoSid") - .then(() => { - cy.task("getCustomerName", { conversationSid: this.convoSid }).should("not.be.empty"); - }); - }); - - it("FLEXEXP-110 - Webchat Lite - Active chat - Close and open chat box", function flexExp110() { - cy.resumeWebchatSessionCookie(); - PreEngagementChatForm.toggleWebchatExpanded(); - ChatMessagesView.validateMessagesRootContainerExist(); - cy.validateLastTextMessage(Constants.CUSTOMER_MESSAGE); - PreEngagementChatForm.toggleWebchatExpanded(); - ChatMessagesView.validateMessagesRootContainerNotExist(); - PreEngagementChatForm.toggleWebchatExpanded(); - cy.validateLastTextMessage(Constants.CUSTOMER_MESSAGE); - }); - - it("FLEXEXP-111 - Webchat Lite - Active chat - exchange message", function flexExp111() { - cy.resumeWebchatSessionCookie(); - PreEngagementChatForm.toggleWebchatExpanded(); - ChatMessagesView.validateMessagesRootContainerExist(); - cy.validateLastTextMessage(Constants.CUSTOMER_MESSAGE); - cy.getConversationSid() - .as("convoSid") - .then(() => { - cy.task("acceptReservation", { conversationSid: this.convoSid }); - cy.task("sendMessage", { conversationSid: this.convoSid, messageText: Constants.AGENT_MESSAGE }).then( - () => { - cy.validateLastTextMessage(Constants.AGENT_MESSAGE); - } - ); - }); - }); - - it("FLEXEXP-208 - Webchat Lite - Customer new message indicator", function flexExp208() { - cy.resumeWebchatSessionCookie(); - PreEngagementChatForm.toggleWebchatExpanded(); - ChatMessagesView.validateNewMessageSeparatorExist(); - cy.validateLastTextMessage(Constants.AGENT_MESSAGE); - MessageInputBoxView.getMessageInputTextArea().focus(); - cy.wait(1000); - ChatMessagesView.getMessagesRootContainer().click(); - ChatMessagesView.validateNewMessageSeparatorNotExist(); - }); - - it("FLEXEXP-115 - Webchat Lite - file attachments - upload - send - png", function flexExp115() { - cy.resumeWebchatSessionCookie(); - PreEngagementChatForm.toggleWebchatExpanded(); - cy.addAttachmentFileAndSend(Constants.FileTypes.PNG); - cy.getConversationSid() - .as("convoSid") - .then(() => { - cy.task("getLastMessageMediaData", { conversationSid: this.convoSid }).should( - "include", - Constants.FileTypes.PNG - ); - }); - cy.validateLastAttachmentMessage(Constants.FileTypes.PNG); - }); - - it("FLEXEXP-116 Webchat Lite - file attachments - upload - send - txt", function flexExp116() { - cy.resumeWebchatSessionCookie(); - PreEngagementChatForm.toggleWebchatExpanded(); - cy.addAttachmentFileAndSend(Constants.FileTypes.TXT); - cy.getConversationSid() - .as("convoSid") - .then(() => { - cy.task("getLastMessageMediaData", { conversationSid: this.convoSid }).should( - "include", - Constants.FileTypes.TXT - ); - }); - cy.validateLastAttachmentMessage(Constants.FileTypes.TXT); - }); - - it("FLEXEXP-117 Webchat Lite - file attachments - upload - send - jpg", function flexExp117() { - cy.resumeWebchatSessionCookie(); - PreEngagementChatForm.toggleWebchatExpanded(); - cy.addAttachmentFileAndSend(Constants.FileTypes.JPG); - cy.getConversationSid() - .as("convoSid") - .then(() => { - cy.task("getLastMessageMediaData", { conversationSid: this.convoSid }).should( - "include", - Constants.FileTypes.JPG - ); - }); - cy.validateLastAttachmentMessage(Constants.FileTypes.JPG); - }); - - it("FLEXEXP-146 Webchat Lite - file attachments- receive - download - invalid file extension", function flexExp146() { - cy.resumeWebchatSessionCookie(); - PreEngagementChatForm.toggleWebchatExpanded(); - cy.addAttachmentFileAndSend(Constants.FileTypes.JPG); - cy.getConversationSid() - .as("convoSid") - // eslint-disable-next-line sonarjs/no-identical-functions - .then(() => { - cy.task("getLastMessageMediaData", { conversationSid: this.convoSid }).should( - "include", - Constants.FileTypes.JPG - ); - }); - cy.validateLastAttachmentMessage(Constants.FileTypes.JPG); - cy.getConversationSid() - .as("convoSid") - .then(() => { - // find the way to add attachment from agent side - cy.task("sendMessage", { conversationSid: this.convoSid, messageText: Constants.AGENT_MESSAGE }).then( - () => { - cy.validateLastTextMessage(Constants.AGENT_MESSAGE); - } - ); - }); - }); - - it("FLEXEXP-118 Webchat Lite - file attachments - upload - send - pdf", function flexExp118() { - cy.resumeWebchatSessionCookie(); - PreEngagementChatForm.toggleWebchatExpanded(); - cy.addAttachmentFileAndSend(Constants.FileTypes.PDF); - cy.getConversationSid() - .as("convoSid") - .then(() => { - cy.task("getLastMessageMediaData", { conversationSid: this.convoSid }).should( - "include", - Constants.FileTypes.PDF - ); - }); - cy.validateLastAttachmentMessage(Constants.FileTypes.PDF); - }); - - it("FLEXEXP-119 - Webchat Lite - file attachments - upload - choose different file", function flexExp119() { - cy.resumeWebchatSessionCookie(); - PreEngagementChatForm.toggleWebchatExpanded(); - MessageInputBoxView.getMessageFileInput().attachFile(`${Constants.FILEPATH}/${Constants.FileTypes.JPG}`); - MessageInputBoxView.getMessageAttachments().contains(Constants.FileTypes.JPG); - MessageInputBoxView.getMessageFileAttachmentRemoveButton().click(); - MessageInputBoxView.validateMessageFileAttachmentRemoveButtonNotExist(); - MessageInputBoxView.validateMessageAttachmentsNotVisible(); - cy.addAttachmentFileAndSend(Constants.FileTypes.JPG2); - cy.getConversationSid() - .as("convoSid") - .then(() => { - cy.task("getLastMessageMediaData", { conversationSid: this.convoSid }).should( - "include", - Constants.FileTypes.JPG2 - ); - }); - cy.validateLastAttachmentMessage(Constants.FileTypes.JPG2); - }); - - it("FLEXEXP-122 Webchat Lite - file attachments - send - preview/download", function flexExp122() { - cy.resumeWebchatSessionCookie(); - PreEngagementChatForm.toggleWebchatExpanded(); - cy.addAttachmentFileAndSend(Constants.FileTypes.JPG); - cy.getConversationSid() - .as("convoSid") - // eslint-disable-next-line sonarjs/no-identical-functions - .then(() => { - cy.task("getLastMessageMediaData", { conversationSid: this.convoSid }).should( - "include", - Constants.FileTypes.JPG - ); - }); - cy.validateLastAttachmentMessage(Constants.FileTypes.JPG); - }); - - it("FLEXEXP-144 Webchat Lite - file attachments - upload - send - invalid file extension", function flexExp144() { - cy.resumeWebchatSessionCookie(); - PreEngagementChatForm.toggleWebchatExpanded(); - MessageInputBoxView.getMessageFileInput().attachFile(`${Constants.FILEPATH}/${Constants.FileTypes.JSON}`); - ChatNotificationView.getAlertMessageText().contains(Constants.INVALID_FILE_ERROR); - ChatNotificationView.getAlertMessage().within(() => { - ChatNotificationView.getAlertMessageExitButton().click(); - }); - ChatNotificationView.validateAlertMessageNotExist(); - MessageInputBoxView.validateMessageAttachmentsNotVisible(); - }); - - it("FLEXEXP-145 Webchat Lite - file attachments - upload - exceeds allowed file size", function flexExp145() { - cy.resumeWebchatSessionCookie(); - PreEngagementChatForm.toggleWebchatExpanded(); - MessageInputBoxView.getMessageFileInput().attachFile(`${Constants.FILEPATH}/${Constants.FileTypes.LARGE_PDF}`); - ChatNotificationView.getAlertMessageText().contains(Constants.LARGE_FILE_ERROR); - ChatNotificationView.getAlertMessage().within(() => { - ChatNotificationView.getAlertMessageExitButton().click(); - }); - ChatNotificationView.validateAlertMessageNotExist(); - MessageInputBoxView.validateMessageAttachmentsNotVisible(); - }); - - it("FLEXEXP-135 Webchat Lite - file attachments - adding text to message - uploading a file", function flexExp135() { - cy.resumeWebchatSessionCookie(); - PreEngagementChatForm.toggleWebchatExpanded(); - MessageInputBoxView.getMessageInputTextArea().type(Constants.CUSTOMER_MESSAGE_TEXT_ATTACHMENT); - cy.addAttachmentFileAndSend(Constants.FileTypes.JPG); - cy.getConversationSid() - .as("convoSid") - .then(() => { - cy.task("getLastMessageMediaData", { conversationSid: this.convoSid }).should( - "include", - Constants.FileTypes.JPG - ); - cy.task("getLastMessageText", { conversationSid: this.convoSid }).should( - "include", - Constants.CUSTOMER_MESSAGE_TEXT_ATTACHMENT - ); - }); - cy.validateLastAttachmentMessage(Constants.FileTypes.JPG); - cy.validateLastTextMessage(Constants.CUSTOMER_MESSAGE_TEXT_ATTACHMENT); - }); - - it("FLEXEXP-136 Webchat Lite - file attachments - upload file - adding text to message", function flexExp136() { - cy.resumeWebchatSessionCookie(); - PreEngagementChatForm.toggleWebchatExpanded(); - cy.addAttachmentFile(Constants.FileTypes.JPG); - MessageInputBoxView.getMessageInputTextArea().type(Constants.CUSTOMER_MESSAGE_ATTACHMENT_TEXT); - MessageInputBoxView.getMessageSendButton().click(); - cy.getConversationSid() - .as("convoSid") - .then(() => { - cy.task("getLastMessageMediaData", { conversationSid: this.convoSid }).should( - "include", - Constants.FileTypes.JPG - ); - cy.task("getLastMessageText", { conversationSid: this.convoSid }).should( - "include", - Constants.CUSTOMER_MESSAGE_ATTACHMENT_TEXT - ); - }); - cy.validateLastAttachmentMessage(Constants.FileTypes.JPG); - cy.validateLastTextMessage(Constants.CUSTOMER_MESSAGE_ATTACHMENT_TEXT); - }); - - it("FLEXEXP-1070 Webchat Lite - multiple file attachments - upload file - adding text to message", function flexExp1070() { - cy.resumeWebchatSessionCookie(); - PreEngagementChatForm.toggleWebchatExpanded(); - cy.addAttachmentFile(Constants.FileTypes.JPG); - cy.addAttachmentFile(Constants.FileTypes.PNG); - MessageInputBoxView.getMessageInputTextArea().type(Constants.CUSTOMER_MESSAGE_ATTACHMENT_TEXT); - MessageInputBoxView.getMessageSendButton().click(); - cy.getConversationSid() - .as("convoSid") - .then(() => { - cy.task("getLastMessageAllMediaFilenames", { conversationSid: this.convoSid }).should( - "include", - Constants.FileTypes.PNG - ); - cy.task("getLastMessageAllMediaFilenames", { conversationSid: this.convoSid }).should( - "include", - Constants.FileTypes.JPG - ); - cy.task("getLastMessageText", { conversationSid: this.convoSid }).should( - "include", - Constants.CUSTOMER_MESSAGE_ATTACHMENT_TEXT - ); - }); - cy.validateLastAttachmentMessage(Constants.FileTypes.PNG); - cy.validateLastTextMessage(Constants.CUSTOMER_MESSAGE_ATTACHMENT_TEXT); - }); - - it("FLEXEXP-109 - Webchat Lite - Active chat - Agent ends chat", function flexExp109() { - cy.on("uncaught:exception", (error, promise) => { - if (promise) { - return false; - } - }); - cy.resumeWebchatSessionCookie(); - PreEngagementChatForm.toggleWebchatExpanded(); - cy.getConversationSid() - .as("convoSid") - .then(() => { - cy.task("wrapReservation", { conversationSid: this.convoSid }); - cy.task("completeReservation", { conversationSid: this.convoSid }); - EndChatView.validateStartNewChatButtonVisible(10000); - }); - }); - - it("should reuse Customer Identity", () => { - const requestHeaders = { - "x-twilio-sec-decoders": { - audio: { powerEfficient: true, smooth: true, supported: true, keySystemAccess: null }, - video: { powerEfficient: false, smooth: false, supported: false, keySystemAccess: null } - }, - "x-twilio-sec-usersettings": { language: "en-GB", cookieEnabled: true, userTimezone: -330 }, - "x-twilio-sec-webchatinfo": { loginTimestamp: "1711075540530" }, - Origin: "http://localhost:3000", - "Content-Type": "application/x-www-form-urlencoded" - }; - - cy.request({ - method: "POST", - url: "https://flex-api.twilio.com/v2/Webchat/Init", - headers: requestHeaders, - body: { - DeploymentKey: Cypress.env("REACT_APP_DEPLOYMENT_KEY"), - CustomerFriendlyName: "Customer", - PreEngagementData: JSON.stringify({ - friendlyName: "Test Client", - email: "mdeshpande@twilio.com", - query: "Hello" - }) - } - }) - .its("body") - .then((body) => { - let customerIdentity = body.identity; - let conversationSid = body.conversation_sid; - cy.request({ - method: "POST", - url: "https://flex-api.twilio.com/v2/Webchat/Init", - headers: requestHeaders, - body: { - DeploymentKey: Cypress.env("REACT_APP_DEPLOYMENT_KEY"), - CustomerFriendlyName: "Customer", - PreEngagementData: JSON.stringify({ - friendlyName: "Test Client", - email: "mdeshpande@twilio.com", - query: "Hello" - }), - Identity: customerIdentity - } - }).should((response) => { - expect(response.status).to.eq(201); - expect(response.body.identity).to.eq(customerIdentity); - }).request({ - // explicit cleanup of the conversation - method: "DELETE", - url: `https://${Cypress.env("ACCOUNT_SID")}:${Cypress.env("AUTH_TOKEN")}@conversations.twilio.com/v1/Conversations/${conversationSid}`, - }).should((response) => { - expect(response.status).to.eq(204); - }); - }); - }); -}); diff --git a/aselo-webchat-react-app/cypress/fixtures/files/largeFile.pdf b/aselo-webchat-react-app/cypress/fixtures/files/largeFile.pdf deleted file mode 100644 index 92aa8424e3..0000000000 Binary files a/aselo-webchat-react-app/cypress/fixtures/files/largeFile.pdf and /dev/null differ diff --git a/aselo-webchat-react-app/cypress/fixtures/files/test.jpg b/aselo-webchat-react-app/cypress/fixtures/files/test.jpg deleted file mode 100644 index 3a52a95dfd..0000000000 Binary files a/aselo-webchat-react-app/cypress/fixtures/files/test.jpg and /dev/null differ diff --git a/aselo-webchat-react-app/cypress/fixtures/files/test.json b/aselo-webchat-react-app/cypress/fixtures/files/test.json deleted file mode 100644 index 02e4254378..0000000000 --- a/aselo-webchat-react-app/cypress/fixtures/files/test.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "name": "Using fixtures to represent data", - "email": "hello@cypress.io", - "body": "Fixtures are a great way to mock data for responses to routes" -} diff --git a/aselo-webchat-react-app/cypress/fixtures/files/test.pdf b/aselo-webchat-react-app/cypress/fixtures/files/test.pdf deleted file mode 100644 index 4b6eea24d6..0000000000 Binary files a/aselo-webchat-react-app/cypress/fixtures/files/test.pdf and /dev/null differ diff --git a/aselo-webchat-react-app/cypress/fixtures/files/test.png b/aselo-webchat-react-app/cypress/fixtures/files/test.png deleted file mode 100644 index 64632bc996..0000000000 Binary files a/aselo-webchat-react-app/cypress/fixtures/files/test.png and /dev/null differ diff --git a/aselo-webchat-react-app/cypress/fixtures/files/test.txt b/aselo-webchat-react-app/cypress/fixtures/files/test.txt deleted file mode 100644 index de51874268..0000000000 --- a/aselo-webchat-react-app/cypress/fixtures/files/test.txt +++ /dev/null @@ -1,4 +0,0 @@ -Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, -quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. -Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. -Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. \ No newline at end of file diff --git a/aselo-webchat-react-app/cypress/fixtures/files/test2.jpg b/aselo-webchat-react-app/cypress/fixtures/files/test2.jpg deleted file mode 100644 index 3a52a95dfd..0000000000 Binary files a/aselo-webchat-react-app/cypress/fixtures/files/test2.jpg and /dev/null differ diff --git a/aselo-webchat-react-app/cypress/pageObjects/Chat/chatMessagesView.ts b/aselo-webchat-react-app/cypress/pageObjects/Chat/chatMessagesView.ts deleted file mode 100644 index 118bba5520..0000000000 --- a/aselo-webchat-react-app/cypress/pageObjects/Chat/chatMessagesView.ts +++ /dev/null @@ -1,58 +0,0 @@ -/** - * Copyright (C) 2021-2026 Technology Matters - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see https://www.gnu.org/licenses/. - */ - -const ChatMessagesView = { - getChatStarted(time) { - return cy.get('[data-test="chat-started"]', { timeout: time }); - }, - - getMessagesRootContainer() { - return cy.get('[data-test="root-container"]'); - }, - - getNewMessageSeparator() { - return cy.get('[data-test="new-message-separator"]'); - }, - - getAllMessagesBubbles() { - return cy.get('[data-test="all-message-bubbles"]'); - }, - - getMessagesBubblesFile() { - return cy.get('[data-test="file-preview-main-area"]'); - }, - - validateChatStartedVisible(time) { - this.getChatStarted(time).should("be.visible"); - }, - - validateNewMessageSeparatorExist() { - this.getNewMessageSeparator().should("exist"); - }, - - validateNewMessageSeparatorNotExist() { - this.getNewMessageSeparator().should("not.exist"); - }, - - validateMessagesRootContainerExist() { - this.getMessagesRootContainer().should("exist"); - }, - - validateMessagesRootContainerNotExist() { - this.getMessagesRootContainer().should("not.exist"); - } -}; -export default ChatMessagesView; diff --git a/aselo-webchat-react-app/cypress/pageObjects/Chat/chatNotificationView.ts b/aselo-webchat-react-app/cypress/pageObjects/Chat/chatNotificationView.ts deleted file mode 100644 index 7282014611..0000000000 --- a/aselo-webchat-react-app/cypress/pageObjects/Chat/chatNotificationView.ts +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Copyright (C) 2021-2026 Technology Matters - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see https://www.gnu.org/licenses/. - */ - -const ChatNotificationView = { - getAlertMessage() { - return cy.get('[data-test="alert-message"]'); - }, - - getAlertMessageText() { - return cy.get('[data-test="alert-message-text"]'); - }, - - getAlertMessageExitButton() { - return cy.get('[type="button"]'); - }, - - validateAlertMessageNotExist() { - this.getAlertMessage().should("not.exist"); - } -}; -export default ChatNotificationView; diff --git a/aselo-webchat-react-app/cypress/pageObjects/Chat/messageInputBoxView.ts b/aselo-webchat-react-app/cypress/pageObjects/Chat/messageInputBoxView.ts deleted file mode 100644 index d4c23f64a8..0000000000 --- a/aselo-webchat-react-app/cypress/pageObjects/Chat/messageInputBoxView.ts +++ /dev/null @@ -1,46 +0,0 @@ -/** - * Copyright (C) 2021-2026 Technology Matters - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see https://www.gnu.org/licenses/. - */ - -const MessageInputBoxView = { - getMessageInputTextArea() { - return cy.get('[data-test="message-input-textarea"]'); - }, - - getMessageFileInput() { - return cy.get('input[type="file"]'); - }, - - getMessageAttachments() { - return cy.get('[data-test="message-attachments"]'); - }, - - getMessageFileAttachmentRemoveButton() { - return cy.get('[data-test="message-file-attachment-remove-button"]'); - }, - - getMessageSendButton() { - return cy.get('[data-test="message-send-button"]'); - }, - - validateMessageFileAttachmentRemoveButtonNotExist() { - this.getMessageFileAttachmentRemoveButton().should("not.exist"); - }, - - validateMessageAttachmentsNotVisible() { - this.getMessageAttachments().should("not.be.visible"); - } -}; -export default MessageInputBoxView; diff --git a/aselo-webchat-react-app/cypress/pageObjects/endChatView.ts b/aselo-webchat-react-app/cypress/pageObjects/endChatView.ts deleted file mode 100644 index c447cd548d..0000000000 --- a/aselo-webchat-react-app/cypress/pageObjects/endChatView.ts +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Copyright (C) 2021-2026 Technology Matters - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see https://www.gnu.org/licenses/. - */ - -const EndChatView = { - getStartNewChatButton(time) { - return cy.get('[data-test="start-new-chat-button"]', { timeout: time }); - }, - - validateStartNewChatButtonVisible(time) { - this.getStartNewChatButton(time).should("be.visible"); - } -}; -export default EndChatView; diff --git a/aselo-webchat-react-app/cypress/pageObjects/preEngagementChatForm.ts b/aselo-webchat-react-app/cypress/pageObjects/preEngagementChatForm.ts deleted file mode 100644 index c7802f67d0..0000000000 --- a/aselo-webchat-react-app/cypress/pageObjects/preEngagementChatForm.ts +++ /dev/null @@ -1,59 +0,0 @@ -/** - * Copyright (C) 2021-2026 Technology Matters - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see https://www.gnu.org/licenses/. - */ - -import * as Constants from "../utils/constants"; - -const PreEngagementChatForm = { - toggleWebchatExpanded() { - cy.get('[data-test="entry-point-button"]').click(); - }, - - getStartChatButton() { - return cy.get('button[data-test="pre-engagement-start-chat-button"]'); - }, - - getNameInput() { - return cy.get('[data-test="pre-engagement-chat-form-name-input"]'); - }, - - getEmailInput() { - return cy.get('[data-test="pre-engagement-chat-form-email-input"]'); - }, - - getQueryTextarea() { - return cy.get('[data-test="pre-engagement-chat-form-query-textarea"]'); - }, - - validateFormExist() { - cy.get('[data-test="pre-engagement-chat-form"]').should("exist"); - }, - - validateFieldErrorMessage(inputField, errorMessage: RegExp) { - inputField.invoke("prop", "validationMessage").should("match", errorMessage); - }, - - validateEmail() { - this.getEmailInput().type(Constants.INCORRECT_EMAIL); - this.getStartChatButton().click(); - if (Cypress.isBrowser("firefox")) { - this.validateFieldErrorMessage(this.getEmailInput(), Constants.INCORRECT_EMAIL_ERROR_MESSAGE_FIREFOX); - } - if (Cypress.isBrowser(["chrome", "edge"])) { - this.validateFieldErrorMessage(this.getEmailInput(), Constants.INCORRECT_EMAIL_ERROR_MESSAGE_CHROME); - } - } -}; -export default PreEngagementChatForm; diff --git a/aselo-webchat-react-app/cypress/plugins/helpers/getToken.ts b/aselo-webchat-react-app/cypress/plugins/helpers/getToken.ts deleted file mode 100644 index 9a5e7ff60d..0000000000 --- a/aselo-webchat-react-app/cypress/plugins/helpers/getToken.ts +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Copyright (C) 2021-2026 Technology Matters - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see https://www.gnu.org/licenses/. - */ - -import { jwt } from "twilio"; - -import { getWorker } from "./getWorker"; -import { parseRegionForTwilioClient } from "../../../shared/regionUtil"; - -const getJwt = (identity: string, grants: any[], { ttl }: { ttl?: number } = {}) => { - const { AccessToken } = jwt; - const token = new AccessToken(process.env.ACCOUNT_SID!, process.env.API_KEY!, process.env.API_SECRET!, { - identity, - region: parseRegionForTwilioClient(process.env.REACT_APP_REGION), - ttl: ttl || 60 * 5 - }); - - grants.forEach((g) => token.addGrant(g)); - - return token.toJwt(); -}; - -const getToken = async () => { - const worker = await getWorker(); - const attributes = JSON.parse(worker.attributes); - const identity = attributes.contact_uri.replace(/client:/, ""); - const { AccessToken } = jwt; - - const grant = new AccessToken.TaskRouterGrant({ - workspaceSid: worker.workspaceSid, - workerSid: worker.sid, - role: "worker" - }); - return getJwt(identity, [grant]); -}; - -export { getToken }; diff --git a/aselo-webchat-react-app/cypress/plugins/helpers/getWorker.ts b/aselo-webchat-react-app/cypress/plugins/helpers/getWorker.ts deleted file mode 100644 index 9faa3e6a76..0000000000 --- a/aselo-webchat-react-app/cypress/plugins/helpers/getWorker.ts +++ /dev/null @@ -1,127 +0,0 @@ -/** - * Copyright (C) 2021-2026 Technology Matters - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see https://www.gnu.org/licenses/. - */ - -import { WorkerInstance } from "twilio/lib/rest/taskrouter/v1/workspace/worker"; -import { ActivityInstance } from "twilio/lib/rest/taskrouter/v1/workspace/activity"; - -import { getTwilioClient } from "./twilioClient"; - -let worker: WorkerInstance; -let workerActivities: ActivityInstance[]; -const CHAT_CHANNEL_CAPACITY = 10; -const taskByConversationSidCache = new Map(); -export const getWorker = async () => { - if (worker) { - return worker; - } - const client = getTwilioClient(); - - const [workspace] = await client.taskrouter.workspaces.list({ limit: 1 }); - - [worker] = await client.taskrouter.workspaces(workspace.sid).workers.list({ limit: 1 }); - - const channels = await worker.workerChannels().list(); - - if (channels && channels.length > 0) { - for (const c of channels) { - if (c.taskChannelUniqueName === "chat" && c.configuredCapacity !== CHAT_CHANNEL_CAPACITY) { - // increase the capacity of the chat channel to 10 - await client.taskrouter - .workspaces(workspace.sid) - .workers(worker.sid) - .workerChannels(c.sid) - .update({ capacity: CHAT_CHANNEL_CAPACITY }); - } - } - } - - return worker; -}; - -const getWorkerActivities = async () => { - if (!worker) { - await getWorker(); - } - if (workerActivities) { - return workerActivities; - } - const client = getTwilioClient(); - - workerActivities = await client.taskrouter.workspaces(worker.workspaceSid).activities.list(); - - return workerActivities; -}; - -export const setWorkerOnline = async () => { - if (!worker) { - await getWorker(); - } - workerActivities = await getWorkerActivities(); - - const onlineActivitySid = workerActivities.find((a) => a.available)?.sid; - - if (worker.activitySid === onlineActivitySid) { - return; - } - try { - await worker.update({ activitySid: onlineActivitySid }); - } catch (e) { - console.log(e); - } -}; - -export const getTaskAndReservationFromConversationSid = async ( - conversationSid: string, - { fetchReservation } = { fetchReservation: false } -) => { - let { task, reservation } = taskByConversationSidCache.get(conversationSid) || {}; - - if (!task) { - if (!worker) { - await getWorker(); - } - console.log(`getting task for conversation ${conversationSid}`); - const client = getTwilioClient(); - - [task] = await client.taskrouter - .workspaces(worker.workspaceSid) - .tasks.list({ evaluateTaskAttributes: `conversationSid == "${conversationSid}"` }); - - if (!task) { - throw Error(`Couldn't find a task with conversationSid === ${conversationSid}`); - } - - console.log(`got task ${task.sid}`); - - taskByConversationSidCache.set(conversationSid, { task }); - } - - if (fetchReservation && !reservation) { - const reservations = await task.reservations().list({ reservationStatus: "pending" }); - - reservation = reservations.find((r) => r.workerSid === worker.sid); - - if (!reservation) { - throw Error(`Couldn't find a pending reservation for task ${task.sid} for worker ${worker.sid}`); - } - - console.log(`got reservation ${reservation.sid}`); - - taskByConversationSidCache.set(conversationSid, { task, reservation }); - } - - return { task, reservation }; -}; diff --git a/aselo-webchat-react-app/cypress/plugins/helpers/gmail-api-helper.ts b/aselo-webchat-react-app/cypress/plugins/helpers/gmail-api-helper.ts deleted file mode 100644 index d83fc01f48..0000000000 --- a/aselo-webchat-react-app/cypress/plugins/helpers/gmail-api-helper.ts +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Copyright (C) 2021-2026 Technology Matters - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see https://www.gnu.org/licenses/. - */ - -import { Credentials, OAuth2ClientOptions } from "google-auth-library"; -import { google } from "googleapis"; -import { OAuth2Client } from "googleapis-common"; - -export class GmailAPIHelper { - oAuth2Client: OAuth2Client; - - refreshToken: string; - - constructor(oAuthClientOptions: OAuth2ClientOptions, token: Credentials) { - this.oAuth2Client = new google.auth.OAuth2( - oAuthClientOptions.clientId, - oAuthClientOptions.clientSecret, - oAuthClientOptions.redirectUri - ); - this.refreshToken = token.refresh_token; - this.oAuth2Client.setCredentials(token); - } - - public async getReceivedEmails(emailCount: number) { - const gmail = google.gmail({ version: "v1", auth: this.oAuth2Client }); - const response = await gmail.users.messages.list({ userId: "me", labelIds: ["INBOX"], maxResults: emailCount }); - return Promise.all( - response.data.messages.map(async (message) => { - return this.getEmail(message.id); - }) - ); - } - - public async getEmail(messageId) { - const gmail = google.gmail({ version: "v1", auth: this.oAuth2Client }); - const response = await gmail.users.messages.get({ id: messageId, userId: "me" }); - return response.data; - } -} diff --git a/aselo-webchat-react-app/cypress/plugins/helpers/interactionHandler.ts b/aselo-webchat-react-app/cypress/plugins/helpers/interactionHandler.ts deleted file mode 100644 index c38afafe45..0000000000 --- a/aselo-webchat-react-app/cypress/plugins/helpers/interactionHandler.ts +++ /dev/null @@ -1,249 +0,0 @@ -/** - * Copyright (C) 2021-2026 Technology Matters - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see https://www.gnu.org/licenses/. - */ - -import axios, { AxiosError, AxiosRequestConfig, AxiosResponse } from "axios"; -import { TaskInstance } from "twilio/lib/rest/taskrouter/v1/workspace/task"; - -import { getTaskAndReservationFromConversationSid, getWorker, setWorkerOnline } from "./getWorker"; -import { getToken } from "./getToken"; -import { getTwilioClient } from "./twilioClient"; -import { parseRegionForEventBridge, parseRegionForConversations } from "../../../shared/regionUtil"; - -const EVENT_BRIDGE_URL = `https://event-bridge${parseRegionForEventBridge( - process.env.REACT_APP_REGION -)}.twilio.com/v1/wschannels`; - -const buildInteractionEndpoint = ({ - target, - interactionSid, - inviteSid, - channelSid -}: { - target: "Invites" | "Channels"; - interactionSid: string; - channelSid: string; - inviteSid: string; -}) => { - const endpoint = `v1/Interactions/${interactionSid}`; - if (target === "Invites") { - return `${endpoint}/Channels/${channelSid}/Invites/${inviteSid || ""}`; - } - if (target === "Channels") { - return `${endpoint}/Channels/${channelSid}`; - } - - throw Error("wrong target"); -}; - -const postRequest = async ({ - target, - task, - action, - status, - routing -}: { - target: "Channels" | "Invites"; - task: TaskInstance; - action: "accept" | "decline" | undefined; - status: "close" | undefined; - routing: { status: "close" | "wrapup" } | { type: "taskrouter"; properties: any; reservation: any } | undefined; -}): Promise => { - const { flexInteractionSid, flexInteractionChannelSid, flexChannelInviteSid } = JSON.parse(task.attributes); - - let data; - - try { - data = await axios.post(EVENT_BRIDGE_URL, { - url: buildInteractionEndpoint({ - target, - interactionSid: flexInteractionSid, - channelSid: flexInteractionChannelSid, - inviteSid: flexChannelInviteSid - }), - method: "POST", - params: { - action, - status, - routing - }, - token: await getToken() - }); - } catch (e) { - console.log("error on request", (e as AxiosError)?.response || e); - throw (e as AxiosError)?.response?.data?.message || (e as Error).message; - } - - return data; -}; - -export const acceptReservation = async ({ conversationSid }: { conversationSid: string }) => { - await new Promise((res) => setTimeout(res, 5000)); // Add buffer to avoid api calls being made too close together - - await setWorkerOnline(); - - const { task, reservation } = await getTaskAndReservationFromConversationSid(conversationSid, { - fetchReservation: true - }); - - console.log("accepting reservation"); - - try { - await postRequest({ - task, - action: "accept", - target: "Invites", - routing: { - type: "taskrouter", - properties: {}, - reservation: { - sid: reservation.sid - } - }, - status: undefined - }); - } catch (e) { - throw Error(`Couldn't accept reservation: ${e}`); - } - - return "reservation accepted"; -}; - -export const sendMessage = async ({ conversationSid, messageText }) => { - const client = getTwilioClient(); - const worker = await getWorker(); - const message = await client.conversations - .conversations(conversationSid) - .messages.create({ author: worker.friendlyName, body: messageText }); - console.log(`Message ${message.sid} sent by Agent: ${worker.friendlyName}`); - return "The message has been sent by Agent"; -}; - -export const wrapReservation = async ({ conversationSid }: { conversationSid: string }) => { - await new Promise((res) => setTimeout(res, 2000)); // Add buffer to avoid api calls being made too close together - - const { task } = await getTaskAndReservationFromConversationSid(conversationSid); - console.log("wrapping reservation"); - - try { - await postRequest({ - task, - action: undefined, - target: "Channels", - routing: { status: "wrapup" }, - status: "close" - }); - } catch (e) { - throw Error(`Couldn't wrap reservation up: ${e}`); - } - return "reservation wrapped"; -}; - -export const completeReservation = async ({ conversationSid }: { conversationSid: string }) => { - await new Promise((res) => setTimeout(res, 2000)); // Add buffer to avoid api calls being made too close together - - const { task } = await getTaskAndReservationFromConversationSid(conversationSid); - console.log("completing reservation"); - - try { - await postRequest({ - task, - action: undefined, - target: "Channels", - routing: { status: "close" }, - status: "close" - }); - } catch (e) { - throw Error(`Couldn't complete reservation: ${e}`); - } - - await new Promise((res) => setTimeout(res, 5000)); - - const updatedTask = await task.fetch(); - if (!["completed", "canceled"].includes(updatedTask.assignmentStatus)) { - await updatedTask.remove(); - console.log("deleting task"); - } - return "reservation completed"; -}; - -export const getCustomerName = async ({ conversationSid }: { conversationSid: string }) => { - await new Promise((res) => setTimeout(res, 2000)); // Add buffer to avoid api calls being made too close together - - const { task } = await getTaskAndReservationFromConversationSid(conversationSid); - return JSON.parse(task.attributes).from; -}; - -export const getLastMessageMediaData = async ({ conversationSid }: { conversationSid: string }) => { - await new Promise((res) => setTimeout(res, 2000)); // Add buffer to avoid api calls being made too close together - - const client = getTwilioClient(); - const messageIM = await client.conversations - .conversations(conversationSid) - .messages.list({ order: "desc", limit: 1 }); - return messageIM[0].media[0].filename; -}; - -export const getLastMessageAllMediaFilenames = async ({ conversationSid }: { conversationSid: string }) => { - await new Promise((res) => setTimeout(res, 2000)); // Add buffer to avoid api calls being made too close together - const client = getTwilioClient(); - const { 0: lastMessage } = await client.conversations - .conversations(conversationSid) - .messages.list({ order: "desc", limit: 1 }); - return lastMessage.media.map((m) => m.filename); -}; - -export const getLastMessageText = async ({ conversationSid }: { conversationSid: string }) => { - const client = getTwilioClient(); - const messageIM = await client.conversations - .conversations(conversationSid) - .messages.list({ order: "desc", limit: 1 }); - return messageIM[0].body; -}; - -export const validateAttachmentLink = async ({ conversationSid }: { conversationSid: string }) => { - const client = getTwilioClient(); - const messageIM = await client.conversations - .conversations(conversationSid) - .messages.list({ order: "desc", limit: 1 }); - const mediaSid = messageIM[0].media[0].sid; - - const conversationInstance = await client.conversations.conversations(conversationSid).fetch(); - const options = { - method: "GET", - url: `https://mcs.${parseRegionForConversations(process.env.REACT_APP_REGION)}twilio.com/v1/Services/${ - conversationInstance.chatServiceSid - }/Media/${mediaSid}`, - auth: { - username: client.username, - password: client.password - }, - headers: { - Accept: "*/*" - } - } as AxiosRequestConfig; - - return new Promise((resolve, reject) => { - axios - .request(options) - .then((response) => { - resolve(response.data.url); - }) - .catch((err) => { - // result = null; - return reject(err); - }); - }); -}; diff --git a/aselo-webchat-react-app/cypress/plugins/helpers/twilioClient.ts b/aselo-webchat-react-app/cypress/plugins/helpers/twilioClient.ts deleted file mode 100644 index 9992a71f60..0000000000 --- a/aselo-webchat-react-app/cypress/plugins/helpers/twilioClient.ts +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Copyright (C) 2021-2026 Technology Matters - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see https://www.gnu.org/licenses/. - */ - -import { Twilio } from "twilio"; - -import { parseRegionForTwilioClient } from "../../../shared/regionUtil"; - -let twilioClient: Twilio; - -export const getTwilioClient = () => { - if (twilioClient) { - return twilioClient; - } - - twilioClient = new Twilio(process.env.ACCOUNT_SID!, process.env.AUTH_TOKEN!, { - region: parseRegionForTwilioClient(process.env.REACT_APP_REGION) - }); - return twilioClient; -}; diff --git a/aselo-webchat-react-app/cypress/support/commands/addAttachmentFileAndSend.ts b/aselo-webchat-react-app/cypress/support/commands/addAttachmentFileAndSend.ts deleted file mode 100644 index b8cb4dc138..0000000000 --- a/aselo-webchat-react-app/cypress/support/commands/addAttachmentFileAndSend.ts +++ /dev/null @@ -1,39 +0,0 @@ -/** - * Copyright (C) 2021-2026 Technology Matters - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see https://www.gnu.org/licenses/. - */ - -import * as Constants from "../../utils/constants"; -import MessageInputBoxView from "../../pageObjects/Chat/messageInputBoxView"; -import ChatMessagesView from "../../pageObjects/Chat/chatMessagesView"; - -export const addAttachmentFileAndSend = (fileName: string) => { - MessageInputBoxView.getMessageFileInput().attachFile(`${Constants.FILEPATH}/${fileName}`); - MessageInputBoxView.getMessageAttachments().contains(fileName); - MessageInputBoxView.getMessageSendButton().click(); -}; - -export const addAttachmentFile = (fileName: string) => { - MessageInputBoxView.getMessageFileInput().attachFile(`${Constants.FILEPATH}/${fileName}`); - MessageInputBoxView.getMessageAttachments().contains(fileName); -}; - -export const validateLastAttachmentMessage = (fileName: string) => { - ChatMessagesView.getMessagesBubblesFile().last().should("contain", fileName); -}; - -export const validateLastTextMessage = (text: string) => { - cy.wait(1000); - ChatMessagesView.getAllMessagesBubbles().last().should("contain", text); -}; diff --git a/aselo-webchat-react-app/cypress/support/commands/createNewWebchat.ts b/aselo-webchat-react-app/cypress/support/commands/createNewWebchat.ts deleted file mode 100644 index ccdf0671e0..0000000000 --- a/aselo-webchat-react-app/cypress/support/commands/createNewWebchat.ts +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Copyright (C) 2021-2026 Technology Matters - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see https://www.gnu.org/licenses/. - */ - -import * as Constants from "../../utils/constants"; -import PreEngagementChatForm from "../../pageObjects/preEngagementChatForm"; -import ChatMessagesView from "../../pageObjects/Chat/chatMessagesView"; - -export const createNewWebchat = () => { - PreEngagementChatForm.getNameInput().type(Constants.CUSTOMER_NAME); - PreEngagementChatForm.getEmailInput().type(Cypress.env("TEST_EMAIL")); - PreEngagementChatForm.getQueryTextarea().type(Constants.CUSTOMER_WELCOME_TEXT); - PreEngagementChatForm.getStartChatButton().click(); - ChatMessagesView.validateChatStartedVisible(30000); -}; diff --git a/aselo-webchat-react-app/cypress/support/commands/index.ts b/aselo-webchat-react-app/cypress/support/commands/index.ts deleted file mode 100644 index 203dfdbd32..0000000000 --- a/aselo-webchat-react-app/cypress/support/commands/index.ts +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Copyright (C) 2021-2026 Technology Matters - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see https://www.gnu.org/licenses/. - */ - -import { createNewWebchat } from "./createNewWebchat"; -import { - addAttachmentFileAndSend, - addAttachmentFile, - validateLastAttachmentMessage, - validateLastTextMessage -} from "./addAttachmentFileAndSend"; -import { storeWebchatSessionCookie, resumeWebchatSessionCookie, getConversationSid } from "./webchatSessionCookie"; - -Cypress.Commands.add("createNewWebchat", createNewWebchat); -Cypress.Commands.add("addAttachmentFileAndSend", addAttachmentFileAndSend); -Cypress.Commands.add("addAttachmentFile", addAttachmentFile); -Cypress.Commands.add("validateLastTextMessage", validateLastTextMessage); -Cypress.Commands.add("validateLastAttachmentMessage", validateLastAttachmentMessage); -Cypress.Commands.add("getConversationSid", getConversationSid); -Cypress.Commands.add("storeWebchatSessionCookie", storeWebchatSessionCookie); -Cypress.Commands.add("resumeWebchatSessionCookie", resumeWebchatSessionCookie); - -declare global { - // eslint-disable-next-line @typescript-eslint/no-namespace - namespace Cypress { - interface Chainable { - createNewWebchat: typeof createNewWebchat; - addAttachmentFileAndSend: typeof addAttachmentFileAndSend; - addAttachmentFile: typeof addAttachmentFile; - validateLastTextMessage: typeof validateLastTextMessage; - validateLastAttachmentMessage: typeof validateLastAttachmentMessage; - storeWebchatSessionCookie: typeof storeWebchatSessionCookie; - resumeWebchatSessionCookie: typeof resumeWebchatSessionCookie; - getConversationSid: () => Chainable>; - } - } -} diff --git a/aselo-webchat-react-app/cypress/support/commands/webchatSessionCookie.ts b/aselo-webchat-react-app/cypress/support/commands/webchatSessionCookie.ts deleted file mode 100644 index 013e3dd176..0000000000 --- a/aselo-webchat-react-app/cypress/support/commands/webchatSessionCookie.ts +++ /dev/null @@ -1,45 +0,0 @@ -/** - * Copyright (C) 2021-2026 Technology Matters - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see https://www.gnu.org/licenses/. - */ - -const LOCAL_STORAGE_ITEM_ID = "TWILIO_WEBCHAT_WIDGET"; -let webchatSessionCookie; -const error = `It looks like you're trying to restore a webchat session, but there isn't one. - -Make sure to run a test that creates a session and stores it using the "storeWebchatSessionCookie" command.`; - -export const storeWebchatSessionCookie = () => { - webchatSessionCookie = localStorage.getItem(LOCAL_STORAGE_ITEM_ID); - if (!webchatSessionCookie) { - throw Error("No conversation cookie found"); - } - return webchatSessionCookie; -}; - -export const resumeWebchatSessionCookie = () => { - if (!webchatSessionCookie) { - throw Error(error); - } - localStorage.setItem(LOCAL_STORAGE_ITEM_ID, webchatSessionCookie); - - return cy.reload(); -}; - -export const getConversationSid = () => { - if (!webchatSessionCookie) { - throw Error(error); - } - return JSON.parse(webchatSessionCookie).conversationSid; -}; diff --git a/aselo-webchat-react-app/cypress/support/e2e.ts b/aselo-webchat-react-app/cypress/support/e2e.ts deleted file mode 100644 index be38c72a7a..0000000000 --- a/aselo-webchat-react-app/cypress/support/e2e.ts +++ /dev/null @@ -1,18 +0,0 @@ -/** - * Copyright (C) 2021-2026 Technology Matters - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see https://www.gnu.org/licenses/. - */ - -import "./commands"; -import "cypress-file-upload"; diff --git a/aselo-webchat-react-app/cypress/tsconfig.json b/aselo-webchat-react-app/cypress/tsconfig.json deleted file mode 100644 index 6df18740ad..0000000000 --- a/aselo-webchat-react-app/cypress/tsconfig.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "compilerOptions": { - "target": "es5", - "lib": ["es5", "dom"], - "types": ["cypress"] - }, - "include": ["**/*.ts"] -} \ No newline at end of file diff --git a/aselo-webchat-react-app/cypress/utils/constants.ts b/aselo-webchat-react-app/cypress/utils/constants.ts deleted file mode 100644 index 776c333d1d..0000000000 --- a/aselo-webchat-react-app/cypress/utils/constants.ts +++ /dev/null @@ -1,46 +0,0 @@ -/** - * Copyright (C) 2021-2026 Technology Matters - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see https://www.gnu.org/licenses/. - */ - -export enum FileTypes { - JSON = "test.json", - JPG = "test.jpg", - JPG2 = "test2.jpg", - PNG = "test.png", - TXT = "test.txt", - GIF = "test.gif", - PDF = "test.pdf", - LARGE_PDF = "largeFile.pdf" -} - -export const TIMESTAMP = Date.now(); -export const FILEPATH = "/files"; - -export const CUSTOMER_NAME = "Andy"; -export const CORRECT_EMAIL = "customer@example.com"; -export const INCORRECT_EMAIL = "customer.email.com"; -export const CUSTOMER_WELCOME_TEXT = "Hey there"; -export const CUSTOMER_MESSAGE = `Hello from Customer ${TIMESTAMP}`; -export const CUSTOMER_MESSAGE_TEXT_ATTACHMENT = `Text and attachment ${TIMESTAMP}`; -export const CUSTOMER_MESSAGE_ATTACHMENT_TEXT = `Attachment and text ${TIMESTAMP}`; -export const AGENT_MESSAGE = `Hello from Agent ${TIMESTAMP}`; - -export const EMPTY_FIELD_ERROR_MESSAGE = /Please fill (?:in|out) this field/; -export const INVALID_FILE_ERROR = /Please try a different file./; -export const LARGE_FILE_ERROR = /because the file is too large./; -export const INCORRECT_EMAIL_ERROR_MESSAGE_CHROME = new RegExp( - `Please include an '@' in the email address. '${INCORRECT_EMAIL}' is missing an '@'.` -); -export const INCORRECT_EMAIL_ERROR_MESSAGE_FIREFOX = new RegExp(`Please enter an email address.`); diff --git a/aselo-webchat-react-app/package-lock.json b/aselo-webchat-react-app/package-lock.json index e905e397e0..5e36fc0859 100644 --- a/aselo-webchat-react-app/package-lock.json +++ b/aselo-webchat-react-app/package-lock.json @@ -63,8 +63,6 @@ "axios": "^1.18.0", "cors": "^2.8.5", "cross-env": "^10.1.0", - "cypress": "15.10.0", - "cypress-file-upload": "^5.0.8", "dotenv": "^16.0.0", "eslint": "^7.11.0", "eslint-config-prettier": "^7.2.0", @@ -2705,97 +2703,6 @@ "postcss-selector-parser": "^6.0.10" } }, - "node_modules/@cypress/request": { - "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", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~4.0.4", - "http-signature": "~1.4.0", - "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.14.1", - "safe-buffer": "^5.1.2", - "tough-cookie": "^5.0.0", - "tunnel-agent": "^0.6.0", - "uuid": "^8.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@cypress/request/node_modules/form-data": { - "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", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@cypress/request/node_modules/tough-cookie": { - "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" - }, - "engines": { - "node": ">=16" - } - }, - "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, - "license": "MIT", - "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, - "license": "MIT", - "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, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, "node_modules/@discoveryjs/json-ext": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", @@ -10962,20 +10869,6 @@ "@types/node": "*" } }, - "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, - "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/sockjs": { "version": "0.3.36", "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", @@ -11037,13 +10930,6 @@ "@types/jest": "*" } }, - "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/tough-cookie": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", @@ -11095,17 +10981,6 @@ "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "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": { - "@types/node": "*" - } - }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", @@ -12134,27 +12009,6 @@ "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" - } - ], - "license": "MIT" - }, "node_modules/archiver": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.2.tgz", @@ -12464,26 +12318,6 @@ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "license": "MIT" }, - "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, - "license": "MIT", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "dev": true, - "license": "MIT", - "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", @@ -12586,23 +12420,6 @@ "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, - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "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/axe-core": { "version": "4.11.1", "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.1.tgz", @@ -13097,16 +12914,6 @@ "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", "license": "MIT" }, - "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, - "license": "BSD-3-Clause", - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, "node_modules/bfj": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.1.0.tgz", @@ -13165,13 +12972,6 @@ "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, - "license": "Apache-2.0" - }, "node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -13399,16 +13199,6 @@ "node": ">= 0.8" } }, - "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, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/call-bind": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", @@ -13537,13 +13327,6 @@ "node": ">=4" } }, - "node_modules/caseless": { - "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": "3.0.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", @@ -13689,52 +13472,6 @@ "node": ">=6" } }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-table3": { - "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" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "colors": "1.4.0" - } - }, - "node_modules/cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/clipboard-copy": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/clipboard-copy/-/clipboard-copy-3.2.0.tgz", @@ -13955,17 +13692,6 @@ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "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": { - "node": ">=0.1.90" - } - }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -13988,16 +13714,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "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, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, "node_modules/common-tags": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", @@ -14697,158 +14413,12 @@ "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==", "license": "MIT" }, - "node_modules/cypress": { - "version": "15.10.0", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-15.10.0.tgz", - "integrity": "sha512-OtUh7OMrfEjKoXydlAD1CfG2BvKxIqgWGY4/RMjrqQ3BKGBo5JFKoYNH+Tpcj4xKxWH4XK0Xri+9y8WkxhYbqQ==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@cypress/request": "^3.0.10", - "@cypress/xvfb": "^1.2.4", - "@types/sinonjs__fake-timers": "8.1.1", - "@types/sizzle": "^2.3.2", - "@types/tmp": "^0.2.3", - "arch": "^2.2.0", - "blob-util": "^2.0.2", - "bluebird": "^3.7.2", - "buffer": "^5.7.1", - "cachedir": "^2.3.0", - "chalk": "^4.1.0", - "ci-info": "^4.1.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", - "hasha": "5.2.2", - "is-installed-globally": "~0.4.0", - "listr2": "^3.8.3", - "lodash": "^4.17.23", - "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", - "supports-color": "^8.1.1", - "systeminformation": "^5.27.14", - "tmp": "~0.2.4", - "tree-kill": "1.2.2", - "untildify": "^4.0.0", - "yauzl": "^2.10.0" - }, - "bin": { - "cypress": "bin/cypress" - }, - "engines": { - "node": "^20.1.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/cypress-file-upload": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/cypress-file-upload/-/cypress-file-upload-5.0.8.tgz", - "integrity": "sha512-+8VzNabRk3zG6x8f8BWArF/xA/W0VK4IZNx3MV0jFWrJS/qKn8eHfa5nU73P9fOQAgwHFJx7zjg4lwOnljMO8g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.2.1" - }, - "peerDependencies": { - "cypress": ">3.0.0" - } - }, - "node_modules/cypress/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", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/cypress/node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cypress/node_modules/ci-info": { - "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", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "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, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?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==", "license": "BSD-2-Clause" }, - "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" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/data-uri-to-buffer": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", @@ -15504,17 +15074,6 @@ "dev": true, "license": "MIT" }, - "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, - "license": "MIT", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, "node_modules/ecdsa-sig-formatter": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", @@ -16860,13 +16419,6 @@ "node": ">= 0.6" } }, - "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, - "license": "MIT" - }, "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", @@ -16882,43 +16434,6 @@ "node": ">=0.8.x" } }, - "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", - "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, - "license": "MIT", - "dependencies": { - "pify": "^2.2.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", @@ -17124,37 +16639,6 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "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", - "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" - ], - "license": "MIT" - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -17261,16 +16745,6 @@ "bser": "2.1.1" } }, - "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, - "license": "MIT", - "dependencies": { - "pend": "~1.2.0" - } - }, "node_modules/fetch-blob": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", @@ -17362,32 +16836,6 @@ "dev": true, "license": "MIT" }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -17708,16 +17156,6 @@ "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, - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, "node_modules/fork-ts-checker-webpack-plugin": { "version": "6.5.3", "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", @@ -18144,22 +17582,6 @@ "node": ">= 0.4" } }, - "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, - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/get-symbol-description": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", @@ -18177,16 +17599,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "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, - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0" - } - }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -18226,22 +17638,6 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "license": "BSD-2-Clause" }, - "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, - "license": "MIT", - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/global-modules": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", @@ -18606,33 +18002,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hasha": { - "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", - "type-fest": "^0.8.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hasha/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" - } - }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -19053,21 +18422,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/http-signature": { - "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", - "jsprim": "^2.0.2", - "sshpk": "^1.18.0" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", @@ -19081,16 +18435,6 @@ "node": ">= 6" } }, - "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, - "license": "Apache-2.0", - "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", @@ -19257,16 +18601,6 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC" }, - "node_modules/ini": { - "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" - } - }, "node_modules/internal-slot": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", @@ -19596,23 +18930,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "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, - "license": "MIT", - "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-map": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", @@ -19850,19 +19167,6 @@ "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "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" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-weakmap": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", @@ -19956,13 +19260,6 @@ "url": "https://github.com/sponsors/dmonad" } }, - "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/istanbul-lib-coverage": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", @@ -22648,13 +21945,6 @@ "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, - "license": "MIT" - }, "node_modules/jsdom": { "version": "26.1.0", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.1.0.tgz", @@ -22879,13 +22169,6 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "license": "MIT" }, - "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/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -22965,22 +22248,6 @@ "npm": ">=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" - ], - "license": "MIT", - "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", @@ -23256,34 +22523,6 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "license": "MIT" }, - "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, - "license": "MIT", - "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/load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", @@ -23511,92 +22750,6 @@ "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", "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", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-symbols/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", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/log-update/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/loglevel": { "version": "1.9.2", "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.2.tgz", @@ -24700,13 +23853,6 @@ "node": ">= 0.8.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, - "license": "MIT" - }, "node_modules/own-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", @@ -24977,13 +24123,6 @@ "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, - "license": "MIT" - }, "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -26495,16 +25634,6 @@ "node": ">=6" } }, - "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, - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -26585,13 +25714,6 @@ "node": ">= 0.10" } }, - "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, - "license": "MIT" - }, "node_modules/psl": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", @@ -26611,17 +25733,6 @@ "dev": true, "license": "MIT" }, - "node_modules/pump": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", - "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -29475,16 +28586,6 @@ "strip-ansi": "^6.0.1" } }, - "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, - "license": "MIT", - "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", @@ -29628,20 +28729,6 @@ "node": ">=10" } }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/retry": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", @@ -29661,13 +28748,6 @@ "node": ">=0.10.0" } }, - "node_modules/rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "dev": true, - "license": "MIT" - }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -29768,16 +28848,6 @@ "queue-microtask": "^1.2.2" } }, - "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" - } - }, "node_modules/safe-array-concat": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", @@ -30406,21 +29476,6 @@ "node": ">=8" } }, - "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", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/slugify": { "version": "1.6.5", "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.5.tgz", @@ -30615,32 +29670,6 @@ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "license": "BSD-3-Clause" }, - "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, - "license": "MIT", - "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/stable": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", @@ -31417,33 +30446,6 @@ "url": "https://opencollective.com/synckit" } }, - "node_modules/systeminformation": { - "version": "5.31.0", - "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.31.0.tgz", - "integrity": "sha512-z5pjzvC8UnQJ/iu34z+mo3lAeMzTGdArjPQoG5uPyV5XY4BY+M6ZcRTl4XnZqudz6sP713LhWMKv6e0kGFGCgQ==", - "dev": true, - "license": "MIT", - "os": [ - "darwin", - "linux", - "win32", - "freebsd", - "openbsd", - "netbsd", - "sunos", - "android" - ], - "bin": { - "systeminformation": "lib/cli.js" - }, - "engines": { - "node": ">=8.0.0" - }, - "funding": { - "type": "Buy me a coffee", - "url": "https://www.buymeacoffee.com/systeminfo" - } - }, "node_modules/table": { "version": "6.9.0", "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", @@ -31804,23 +30806,6 @@ "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==", "license": "MIT" }, - "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, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true, - "license": "MIT" - }, "node_modules/thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", @@ -31898,16 +30883,6 @@ "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" - } - }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -31988,16 +30963,6 @@ "punycode": "^2.1.0" } }, - "node_modules/tree-kill": { - "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" - } - }, "node_modules/tryer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", @@ -32136,26 +31101,6 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "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" - }, - "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, - "license": "Unlicense" - }, "node_modules/twilio": { "version": "5.12.1", "resolved": "https://registry.npmjs.org/twilio/-/twilio-5.12.1.tgz", @@ -32625,16 +31570,6 @@ "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" } }, - "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, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/upath": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", @@ -32886,21 +31821,6 @@ "node": ">= 0.8" } }, - "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" - ], - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, "node_modules/w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", @@ -33971,17 +32891,6 @@ "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, - "license": "MIT", - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, "node_modules/yjs": { "version": "13.6.30", "resolved": "https://registry.npmjs.org/yjs/-/yjs-13.6.30.tgz", diff --git a/aselo-webchat-react-app/package.json b/aselo-webchat-react-app/package.json index 8e3a5cb835..3fbdb4394d 100644 --- a/aselo-webchat-react-app/package.json +++ b/aselo-webchat-react-app/package.json @@ -60,8 +60,6 @@ "axios": "^1.18.0", "cors": "^2.8.5", "cross-env": "^10.1.0", - "cypress": "15.10.0", - "cypress-file-upload": "^5.0.8", "dotenv": "^16.0.0", "eslint": "^7.11.0", "eslint-config-prettier": "^7.2.0", diff --git a/aselo-webchat-react-app/src/index.tsx b/aselo-webchat-react-app/src/index.tsx index 1a66439552..1e034f637b 100644 --- a/aselo-webchat-react-app/src/index.tsx +++ b/aselo-webchat-react-app/src/index.tsx @@ -35,10 +35,6 @@ const initWebchat = async ( , rootElement, ); - - if (window.Cypress) { - window.store = store; - } }; declare global { @@ -49,7 +45,6 @@ declare global { initLogger: (level?: LogLevelDesc) => void; getLogger: (className: string) => Logger; }; - Cypress: Cypress.Cypress; store: typeof store; } } diff --git a/scripts/package-lock.json b/scripts/package-lock.json index e3574d8fbf..fe6fe86ba7 100644 --- a/scripts/package-lock.json +++ b/scripts/package-lock.json @@ -14,7 +14,6 @@ "axios": "^1.6.0", "dotenv": "^10.0.0", "hrm-form-definitions": "file:../lambdas/packages/hrm-form-definitions", - "node-fetch": "^2.6.4", "prompt": "^1.2.0", "prompt-confirm": "^2.0.4", "twilio": "^4.10.0", @@ -4331,17 +4330,6 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "node_modules/node-fetch": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.4.tgz", - "integrity": "sha512-aD1fO+xtLiSCc9vuD+sYMxpIuQyhHscGSkBEo2o5LTV/3bTEAYvdUii29n8LlO5uLCmWdGP7uVUVXFo5SRdkLA==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - } - }, "node_modules/normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -6029,11 +6017,6 @@ "node": ">=0.10.0" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" - }, "node_modules/ts-node": { "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", @@ -6305,20 +6288,6 @@ "node": ">=0.10.0" } }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -9734,14 +9703,6 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "node-fetch": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.4.tgz", - "integrity": "sha512-aD1fO+xtLiSCc9vuD+sYMxpIuQyhHscGSkBEo2o5LTV/3bTEAYvdUii29n8LlO5uLCmWdGP7uVUVXFo5SRdkLA==", - "requires": { - "whatwg-url": "^5.0.0" - } - }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -11010,11 +10971,6 @@ "isobject": "^3.0.0" } }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" - }, "ts-node": { "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", @@ -11220,20 +11176,6 @@ "resolved": "https://registry.npmjs.org/warning-symbol/-/warning-symbol-0.1.0.tgz", "integrity": "sha1-uzHdEbeg+dZ6su2V9Fe2WCW7rSE=" }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/scripts/package.json b/scripts/package.json index c114e71420..dbb3127f25 100644 --- a/scripts/package.json +++ b/scripts/package.json @@ -22,7 +22,6 @@ "axios": "^1.6.0", "dotenv": "^10.0.0", "hrm-form-definitions": "file:../lambdas/packages/hrm-form-definitions", - "node-fetch": "^2.6.4", "prompt": "^1.2.0", "prompt-confirm": "^2.0.4", "twilio": "^4.10.0", diff --git a/scripts/src/setAppConfigCreds.ts b/scripts/src/setAppConfigCreds.ts index 8f8f65d381..c9a587df87 100644 --- a/scripts/src/setAppConfigCreds.ts +++ b/scripts/src/setAppConfigCreds.ts @@ -1,6 +1,5 @@ import { config } from 'dotenv'; import yargs from 'yargs'; -import fetch from 'node-fetch'; import * as fs from 'node:fs/promises'; import { getSSMParameter, setRoleToAssume } from './helpers/ssm';