From 280b812e5bfc058dca831a939a46aa911876b3ed Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 May 2024 12:51:25 +0000 Subject: [PATCH 001/106] build(deps-dev): bump @babel/eslint-parser in /apps/OpenSignServer Bumps [@babel/eslint-parser](https://github.com/babel/babel/tree/HEAD/eslint/babel-eslint-parser) from 7.24.1 to 7.24.5. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.24.5/eslint/babel-eslint-parser) --- updated-dependencies: - dependency-name: "@babel/eslint-parser" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- apps/OpenSignServer/package-lock.json | 10 +++++----- apps/OpenSignServer/package.json | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/OpenSignServer/package-lock.json b/apps/OpenSignServer/package-lock.json index 4d464842a..acc0560e3 100644 --- a/apps/OpenSignServer/package-lock.json +++ b/apps/OpenSignServer/package-lock.json @@ -38,7 +38,7 @@ "posthog-node": "^3.6.3" }, "devDependencies": { - "@babel/eslint-parser": "^7.23.10", + "@babel/eslint-parser": "^7.24.5", "eslint": "^8.57.0", "jasmine": "^5.1.0", "mongodb-runner": "^5.5.4", @@ -1007,9 +1007,9 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.24.1.tgz", - "integrity": "sha512-d5guuzMlPeDfZIbpQ8+g1NaCNuAGBBGNECh0HVqz1sjOeVLh2CEaifuOysCH18URW6R7pqXINvf5PaR/dC6jLQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.24.5.tgz", + "integrity": "sha512-gsUcqS/fPlgAw1kOtpss7uhY6E9SFFANQ6EFX5GTvzUwaV0+sGaZWk6xq22MOdeT9wfxyokW3ceCUvOiRtZciQ==", "dev": true, "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", @@ -1021,7 +1021,7 @@ }, "peerDependencies": { "@babel/core": "^7.11.0", - "eslint": "^7.5.0 || ^8.0.0" + "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" } }, "node_modules/@babel/generator": { diff --git a/apps/OpenSignServer/package.json b/apps/OpenSignServer/package.json index f3773756c..01e370f77 100644 --- a/apps/OpenSignServer/package.json +++ b/apps/OpenSignServer/package.json @@ -48,7 +48,7 @@ }, "type": "module", "devDependencies": { - "@babel/eslint-parser": "^7.23.10", + "@babel/eslint-parser": "^7.24.5", "eslint": "^8.57.0", "jasmine": "^5.1.0", "mongodb-runner": "^5.5.4", From 1e58b35db58947c81c175d768d00b8387cc4e327 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 May 2024 10:51:45 +0000 Subject: [PATCH 002/106] build(deps): bump @reduxjs/toolkit from 2.2.1 to 2.2.4 in /apps/OpenSign Bumps [@reduxjs/toolkit](https://github.com/reduxjs/redux-toolkit) from 2.2.1 to 2.2.4. - [Release notes](https://github.com/reduxjs/redux-toolkit/releases) - [Commits](https://github.com/reduxjs/redux-toolkit/compare/v2.2.1...v2.2.4) --- updated-dependencies: - dependency-name: "@reduxjs/toolkit" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- apps/OpenSign/package-lock.json | 10 +++++----- apps/OpenSign/package.json | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/OpenSign/package-lock.json b/apps/OpenSign/package-lock.json index 95ce733d0..97e6ce917 100644 --- a/apps/OpenSign/package-lock.json +++ b/apps/OpenSign/package-lock.json @@ -11,7 +11,7 @@ "@formkit/auto-animate": "^0.8.2", "@radix-ui/themes": "^2.0.3", "@react-pdf/renderer": "^3.4.4", - "@reduxjs/toolkit": "^2.2.1", + "@reduxjs/toolkit": "^2.2.4", "axios": "^1.6.8", "file-saver": "^2.0.5", "jwt-decode": "^4.0.0", @@ -5534,14 +5534,14 @@ "integrity": "sha512-XsVRkt0hQ60I4e3leAVt+aZR3KJCaJd179BfJHAv4F4x6Vq3yqkry8lcbUWKGKDw1j3/8sW4FsgGR41SFvsG9A==" }, "node_modules/@reduxjs/toolkit": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.2.1.tgz", - "integrity": "sha512-8CREoqJovQW/5I4yvvijm/emUiCCmcs4Ev4XPWd4mizSO+dD3g5G6w34QK5AGeNrSH7qM8Fl66j4vuV7dpOdkw==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.2.4.tgz", + "integrity": "sha512-EoIC9iC2V/DLRBVMXRHrO/oM3QBT7RuJNeBRx8Cpnz/NHINeZBEqgI8YOxAYUjLp+KYxGgc4Wd6KoAKsaUBGhg==", "dependencies": { "immer": "^10.0.3", "redux": "^5.0.1", "redux-thunk": "^3.1.0", - "reselect": "^5.0.1" + "reselect": "^5.1.0" }, "peerDependencies": { "react": "^16.9.0 || ^17.0.0 || ^18", diff --git a/apps/OpenSign/package.json b/apps/OpenSign/package.json index 2b9861354..5685ff99d 100644 --- a/apps/OpenSign/package.json +++ b/apps/OpenSign/package.json @@ -6,7 +6,7 @@ "@formkit/auto-animate": "^0.8.2", "@radix-ui/themes": "^2.0.3", "@react-pdf/renderer": "^3.4.4", - "@reduxjs/toolkit": "^2.2.1", + "@reduxjs/toolkit": "^2.2.4", "axios": "^1.6.8", "file-saver": "^2.0.5", "jwt-decode": "^4.0.0", From 348f7810b9b05a6738150ecdd28804809f196ddf Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs Date: Fri, 17 May 2024 10:09:15 +0530 Subject: [PATCH 003/106] fix: Cannot read properties of undefined (reading 'find') in resend mail & resend mail not available dashboard report --- apps/OpenSign/src/json/ReportJson.js | 8 ++++++++ apps/OpenSign/src/primitives/GetReportDisplay.js | 2 +- apps/OpenSignServer/cloud/parsefunction/reportsJson.js | 3 +++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/apps/OpenSign/src/json/ReportJson.js b/apps/OpenSign/src/json/ReportJson.js index 87627b968..8bc528add 100644 --- a/apps/OpenSign/src/json/ReportJson.js +++ b/apps/OpenSign/src/json/ReportJson.js @@ -231,6 +231,14 @@ export default function reportJson(id) { btnIcon: "fa-solid fa-ellipsis-vertical fa-lg", action: "option", subaction: [ + { + btnId: "1631", + btnLabel: "Resend", + hoverLabel: "Resend", + btnIcon: "fa-solid fa-envelope", + redirectUrl: "", + action: "resend" + }, { btnId: "6788", btnLabel: "Revoke", diff --git a/apps/OpenSign/src/primitives/GetReportDisplay.js b/apps/OpenSign/src/primitives/GetReportDisplay.js index e5e603d74..7721ee6cc 100644 --- a/apps/OpenSign/src/primitives/GetReportDisplay.js +++ b/apps/OpenSign/src/primitives/GetReportDisplay.js @@ -580,7 +580,7 @@ const ReportTable = (props) => { } }; const fetchUserStatus = (user, doc) => { - const audit = doc.AuditTrail.find( + const audit = doc?.AuditTrail?.find( (x) => x.UserPtr.objectId === user.objectId ); return ( diff --git a/apps/OpenSignServer/cloud/parsefunction/reportsJson.js b/apps/OpenSignServer/cloud/parsefunction/reportsJson.js index aa3cf5772..98d2c06b5 100644 --- a/apps/OpenSignServer/cloud/parsefunction/reportsJson.js +++ b/apps/OpenSignServer/cloud/parsefunction/reportsJson.js @@ -216,6 +216,9 @@ export default function reportJson(id, userId) { 'Signers.Name', 'Signers.Email', 'Signers.Phone', + 'AuditTrail', + 'AuditTrail.UserPtr', + 'ExpiryDate', ], }; // Recent signature requests report show on dashboard From f6f7c6cecd790efd38bab66f13de3bc71faa1f00 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs Date: Fri, 17 May 2024 10:56:14 +0530 Subject: [PATCH 004/106] refactor: change in subject & body of resend mail --- apps/OpenSign/src/primitives/GetReportDisplay.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/OpenSign/src/primitives/GetReportDisplay.js b/apps/OpenSign/src/primitives/GetReportDisplay.js index 7721ee6cc..da26b2728 100644 --- a/apps/OpenSign/src/primitives/GetReportDisplay.js +++ b/apps/OpenSign/src/primitives/GetReportDisplay.js @@ -535,10 +535,10 @@ const ReportTable = (props) => { const subject = doc?.RequestSubject || - "{{sender_name}} has requested you to sign {{document_title}}"; + `{{sender_name}} has requested you to sign "{{document_title}}"`; const body = doc?.RequestBody || - "

Hi {{receiver_name}},


We hope this email finds you well. {{sender_name}} has requested you to review and sign {{document_title}}.

Your signature is crucial to proceed with the next steps as it signifies your agreement and authorization.


{{signing_url}}


If you have any questions or need further clarification regarding the document or the signing process, please contact the sender.


Thanks

Team OpenSign™


"; + `

Hi {{receiver_name}},


We hope this email finds you well. {{sender_name}} has requested you to review and sign "{{document_title}}".

Your signature is crucial to proceed with the next steps as it signifies your agreement and authorization.


{{signing_url}}


If you have any questions or need further clarification regarding the document or the signing process, please contact the sender.


Thanks

Team OpenSign™


`; const res = replaceMailVaribles(subject, body, variables); setMail((prev) => ({ ...prev, subject: res.subject, body: res.body })); setIsNextStep({ [user.objectId]: true }); @@ -959,7 +959,7 @@ const ReportTable = (props) => { @@ -985,7 +985,7 @@ const ReportTable = (props) => { From f38d83dbe037ad93e5832da2d776599c119da9c4 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs Date: Fri, 17 May 2024 12:05:18 +0530 Subject: [PATCH 005/106] style: change z-index of alert --- apps/OpenSign/src/primitives/Alert.js | 2 +- apps/OpenSign/src/primitives/GetReportDisplay.js | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/OpenSign/src/primitives/Alert.js b/apps/OpenSign/src/primitives/Alert.js index 4a99792f2..41932a49d 100644 --- a/apps/OpenSign/src/primitives/Alert.js +++ b/apps/OpenSign/src/primitives/Alert.js @@ -18,7 +18,7 @@ const Alert = ({ children, type }) => { <> {children && (
{children}
diff --git a/apps/OpenSign/src/primitives/GetReportDisplay.js b/apps/OpenSign/src/primitives/GetReportDisplay.js index da26b2728..36a08fc5f 100644 --- a/apps/OpenSign/src/primitives/GetReportDisplay.js +++ b/apps/OpenSign/src/primitives/GetReportDisplay.js @@ -546,7 +546,6 @@ const ReportTable = (props) => { const handleResendMail = async (e, doc, user) => { e.preventDefault(); setActLoader({ [user.objectId]: true }); - setIsAlert(true); const url = `${localStorage.getItem("baseUrl")}functions/sendmailv3`; const headers = { "Content-Type": "application/json", @@ -564,10 +563,12 @@ const ReportTable = (props) => { try { const res = await axios.post(url, params, { headers: headers }); if (res) { + setIsAlert(true); setAlertMsg({ type: "success", message: "Mail sent successfully." }); } } catch (err) { console.log("err in sendmail", err); + setIsAlert(true); setAlertMsg({ type: "danger", message: "Something went wrong, please try again later!" From 80fb320ae426246da3d6153ecec1c86f33730949 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs Date: Fri, 17 May 2024 19:20:17 +0530 Subject: [PATCH 006/106] refactor: add mail in resend mail UI --- apps/OpenSign/src/primitives/GetReportDisplay.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/OpenSign/src/primitives/GetReportDisplay.js b/apps/OpenSign/src/primitives/GetReportDisplay.js index 36a08fc5f..6042de100 100644 --- a/apps/OpenSign/src/primitives/GetReportDisplay.js +++ b/apps/OpenSign/src/primitives/GetReportDisplay.js @@ -529,7 +529,7 @@ const ReportTable = (props) => { receiver_email: user.Email, receiver_phone: user.Phone, expiry_date: localExpireDate, - company_name: doc.ExtUserPtr.Company, + company_name: doc?.ExtUserPtr?.Company || "", signing_url: `Sign here` }; @@ -1015,7 +1015,7 @@ const ReportTable = (props) => { {Object?.keys(isNextStep) <= 0 && (
- {user.Name} + {user.Name} {`<${user.Email}>`}
<>{fetchUserStatus(user, item)}
From 82312a1e0d7788f1d3b8967a55cd4c8d0f82704a Mon Sep 17 00:00:00 2001 From: RaktimaNXG Date: Mon, 20 May 2024 11:42:37 +0530 Subject: [PATCH 007/106] feat: celebration confetti on document completion --- .../src/components/pdf/EmailComponent.js | 12 +++++++++--- apps/OpenSign/src/pages/PdfRequestFiles.js | 9 ++++++++- apps/OpenSign/src/pages/SignyourselfPdf.js | 14 ++++++++------ apps/OpenSign/src/primitives/ModalUi.js | 19 ++++++++++++++++++- 4 files changed, 43 insertions(+), 11 deletions(-) diff --git a/apps/OpenSign/src/components/pdf/EmailComponent.js b/apps/OpenSign/src/components/pdf/EmailComponent.js index b1e905719..8cb2b9ade 100644 --- a/apps/OpenSign/src/components/pdf/EmailComponent.js +++ b/apps/OpenSign/src/components/pdf/EmailComponent.js @@ -10,18 +10,19 @@ import loader from "../../assets/images/loader2.gif"; function EmailComponent({ isEmail, pdfUrl, - isCeleb, setIsEmail, setSuccessEmail, pdfName, sender, setIsAlert, extUserId, - activeMailAdapter + activeMailAdapter, + isCompletionCeleb }) { const [emailList, setEmailList] = useState([]); const [emailValue, setEmailValue] = useState(); const [isLoading, setIsLoading] = useState(false); + const [isCeleb, setIsCeleb] = useState(false); //function for send email const sendEmail = async () => { setIsLoading(true); @@ -62,6 +63,10 @@ function EmailComponent({ " target=_blank>here

" }; sendMail = await axios.post(url, params, { headers: headers }); + setIsCeleb(true); + setTimeout(() => { + setIsCeleb(false); + }, 3000); } catch (error) { console.log("error", error); setIsLoading(false); @@ -245,7 +250,7 @@ function EmailComponent({
- {isCeleb && ( + {(isCeleb || isCompletionCeleb) && (
)} +

{ + setIsCompletionCeleb(false); + }, 1500); } else if (declined) { const currentDecline = { currnt: "another", @@ -702,6 +706,7 @@ function PdfRequestFiles() { setSignedSigners([]); setUnSignedSigners([]); getDocumentDetails(); + setIsCompletionCeleb(true); const index = pdfDetails?.[0].Signers.findIndex( (x) => x.Email === jsonSender.email ); @@ -1120,7 +1125,6 @@ function PdfRequestFiles() { alertMessage: "" }); }; - return ( @@ -1358,6 +1362,9 @@ function PdfRequestFiles() { handleClose={() => { setIsCompleted((prev) => ({ ...prev, isModal: false })); }} + isCompletionCeleb={ + !isCompleted?.message && isCompletionCeleb + } > <div style={{ height: "100%", padding: 20 }}> <p> diff --git a/apps/OpenSign/src/pages/SignyourselfPdf.js b/apps/OpenSign/src/pages/SignyourselfPdf.js index db813272f..2ad4ccb0a 100644 --- a/apps/OpenSign/src/pages/SignyourselfPdf.js +++ b/apps/OpenSign/src/pages/SignyourselfPdf.js @@ -70,7 +70,6 @@ function SignYourSelf() { const [dragKey, setDragKey] = useState(); const [signKey, setSignKey] = useState(); const [imgWH, setImgWH] = useState({}); - const [isCeleb, setIsCeleb] = useState(false); const [pdfNewWidth, setPdfNewWidth] = useState(); const [pdfOriginalWidth, setPdfOriginalWidth] = useState(); const [successEmail, setSuccessEmail] = useState(false); @@ -109,6 +108,7 @@ function SignYourSelf() { const [isDontShow, setIsDontShow] = useState(false); const [extUserId, setExtUserId] = useState(""); const [isCompleted, setIsCompleted] = useState(false); + const [isCompletionCeleb, setIsCompletionCeleb] = useState(false); const [pdfArrayBuffer, setPdfArrayBuffer] = useState(""); const [activeMailAdapter, setActiveMailAdapter] = useState(""); const [isEmailVerified, setIsEmailVerified] = useState(true); @@ -231,6 +231,9 @@ function SignYourSelf() { setIsEmail(true); setXyPostion([]); setSignBtnPosition([]); + setTimeout(() => { + setIsCompletionCeleb(false); + }, 1500); } } } else if ( @@ -337,6 +340,7 @@ function SignYourSelf() { setIsLoading(loadObj); } }; + console.log("iscompletion", isCompletionCeleb); const getWidgetValue = (type) => { switch (type) { case "name": @@ -649,10 +653,6 @@ function SignYourSelf() { }); return; } else { - setIsCeleb(true); - setTimeout(() => { - setIsCeleb(false); - }, 3000); setIsUiLoading(true); const existingPdfBytes = pdfArrayBuffer; // Load a PDFDocument from the existing PDF bytes @@ -769,6 +769,7 @@ function SignYourSelf() { setPdfUrl(json.result.data); if (json.result.data) { getDocumentDetails(false); + setIsCompletionCeleb(true); } }) .catch((err) => { @@ -1258,7 +1259,6 @@ function SignYourSelf() { <EmailComponent isEmail={isEmail} pdfUrl={pdfUrl} - isCeleb={isCeleb} setIsEmail={setIsEmail} pdfName={pdfDetails[0] && pdfDetails[0].Name} setSuccessEmail={setSuccessEmail} @@ -1266,6 +1266,8 @@ function SignYourSelf() { setIsAlert={setIsAlert} extUserId={extUserId} activeMailAdapter={activeMailAdapter} + isCompletionCeleb={isCompletionCeleb} + setIsCompletionCeleb={setIsCompletionCeleb} /> {/* pdf header which contain funish back button */} <Header diff --git a/apps/OpenSign/src/primitives/ModalUi.js b/apps/OpenSign/src/primitives/ModalUi.js index dcc726f18..be6122e69 100644 --- a/apps/OpenSign/src/primitives/ModalUi.js +++ b/apps/OpenSign/src/primitives/ModalUi.js @@ -1,6 +1,7 @@ import React from "react"; import { isEnableSubscription } from "../constant/const"; import PremiumAlertHeader from "./PremiumAlertHeader"; +import celebration from "../assets/images/newCeleb.gif"; const ModalUi = ({ children, @@ -11,7 +12,8 @@ const ModalUi = ({ showHeader = true, showClose = true, styleClass, - showHeaderMessage + showHeaderMessage, + isCompletionCeleb }) => { return ( <> @@ -24,6 +26,21 @@ const ModalUi = ({ : "fixed z-[1000] top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2 text-sm bg-white rounded shadow-md max-h-90 min-w-[90%] md:min-w-[500px] overflow-y-auto hide-scrollbar" } > + {isCompletionCeleb && ( + <div + style={{ + position: "absolute", + marginLeft: "50px" + }} + > + <img + alt="print img" + width={300} + height={100} + src={celebration} + /> + </div> + )} {showHeader && ( <div className="flex justify-between rounded-t items-center py-[15px] px-[20px] text-white" From ba06ff72a0aa1d1ce2e641855487821decae8f49 Mon Sep 17 00:00:00 2001 From: RaktimaNXG <raktima.c@nxglabs.com> Date: Mon, 20 May 2024 14:01:06 +0530 Subject: [PATCH 008/106] fix: mismatch complete message issue in multiple signers flow --- apps/OpenSign/src/pages/PdfRequestFiles.js | 25 ++++++++++++++-------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/apps/OpenSign/src/pages/PdfRequestFiles.js b/apps/OpenSign/src/pages/PdfRequestFiles.js index ca8c93813..fc3ab5a9c 100644 --- a/apps/OpenSign/src/pages/PdfRequestFiles.js +++ b/apps/OpenSign/src/pages/PdfRequestFiles.js @@ -220,7 +220,7 @@ function PdfRequestFiles() { } } //function for get document details for perticular signer with signer'object id - const getDocumentDetails = async () => { + const getDocumentDetails = async (isNextUser) => { let currUserId; //getting document details const documentData = await contractDocument(documentId); @@ -416,6 +416,20 @@ function PdfRequestFiles() { setSignerPos(documentData[0].Placeholders); } setPdfDetails(documentData); + // Check if the current signer is the last signer and handle the complete message. + if (isNextUser) { + const isLastSigner = + documentData?.[0]?.AuditTrail?.length === + documentData?.[0]?.Signers?.length; + if (!isLastSigner) { + setIsCompleted({ + isModal: true, + message: + "You have successfully signed the document. You can download or print a copy of the partially signed document. A copy of the digitally signed document will be sent to the owner over email once it is signed by all signers." + }); + } + } + setIsUiLoading(false); } else { alert("No data found!"); @@ -705,20 +719,13 @@ function PdfRequestFiles() { setIsSigned(true); setSignedSigners([]); setUnSignedSigners([]); - getDocumentDetails(); + getDocumentDetails(true); setIsCompletionCeleb(true); const index = pdfDetails?.[0].Signers.findIndex( (x) => x.Email === jsonSender.email ); const newIndex = index + 1; const user = pdfDetails?.[0].Signers[newIndex]; - if (user) { - setIsCompleted({ - isModal: true, - message: - "You have successfully signed the document. You can download or print a copy of the partially signed document. A copy of the digitally signed document will be sent to the owner over email once it is signed by all signers." - }); - } if (sendInOrder) { const requestBody = pdfDetails?.[0]?.RequestBody; const requestSubject = pdfDetails?.[0]?.RequestSubject; From f38e8705de147c49deb0df9572d307907b3268a3 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <prafull.navkar@nxglabs.com> Date: Mon, 20 May 2024 15:31:20 +0530 Subject: [PATCH 009/106] feat: now user can sent automatic reminders --- .../src/components/pdf/EditTemplate.js | 94 ++++++- apps/OpenSign/src/constant/Utils.js | 10 +- apps/OpenSign/src/pages/Form.js | 244 ++++++++++++------ apps/OpenSign/src/pages/PlaceHolderSign.js | 2 +- .../OpenSign/src/pages/TemplatePlaceholder.js | 48 ++-- .../src/primitives/GetReportDisplay.js | 5 +- .../cloud/customRoute/autoReminder.js | 231 +++++++++++++++++ .../cloud/customRoute/customApp.js | 13 +- .../cloud/parsefunction/DocumentAftersave.js | 18 +- .../cloud/parsefunction/GetTemplate.js | 2 +- .../cloud/parsefunction/TemplateAfterSave.js | 9 +- 11 files changed, 539 insertions(+), 137 deletions(-) create mode 100644 apps/OpenSignServer/cloud/customRoute/autoReminder.js diff --git a/apps/OpenSign/src/components/pdf/EditTemplate.js b/apps/OpenSign/src/components/pdf/EditTemplate.js index 8010bf3fe..59c573941 100644 --- a/apps/OpenSign/src/components/pdf/EditTemplate.js +++ b/apps/OpenSign/src/components/pdf/EditTemplate.js @@ -1,6 +1,9 @@ -import React, { useState } from "react"; +import React, { useState, useEffect } from "react"; import "../../styles/AddUser.css"; -import { getFileName } from "../../constant/Utils"; +import { checkIsSubscribed, getFileName } from "../../constant/Utils"; +import PremiumAlertHeader from "../../primitives/PremiumAlertHeader"; +import Upgrade from "../../primitives/Upgrade"; +import { isEnableSubscription } from "../../constant/const"; // import SelectFolder from "../../premitives/SelectFolder"; const EditTemplate = ({ template, onSuccess }) => { @@ -9,9 +12,21 @@ const EditTemplate = ({ template, onSuccess }) => { Name: template?.Name || "", Note: template?.Note || "", Description: template?.Description || "", - SendinOrder: template?.SendinOrder ? `${template?.SendinOrder}` : "false" + SendinOrder: template?.SendinOrder ? `${template?.SendinOrder}` : "false", + AutomaticReminders: template?.AutomaticReminders || false, + RemindOnceInEvery: template?.RemindOnceInEvery || 5 }); - + const [isSubscribe, setIsSubscribe] = useState(false); + useEffect(() => { + fetchSubscription(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + const fetchSubscription = async () => { + if (isEnableSubscription) { + const getIsSubscribe = await checkIsSubscribed(); + setIsSubscribe(getIsSubscribe); + } + }; const handleStrInput = (e) => { setFormData({ ...formData, [e.target.name]: e.target.value }); }; @@ -25,12 +40,26 @@ const EditTemplate = ({ template, onSuccess }) => { e.preventDefault(); e.stopPropagation(); const isChecked = formData.SendinOrder === "true" ? true : false; - const data = { ...formData, SendinOrder: isChecked }; + const AutoReminder = formData?.AutomaticReminders || false; + + let reminderDate = {}; + if (AutoReminder) { + const RemindOnceInEvery = parseInt(formData?.RemindOnceInEvery); + const ReminderDate = new Date(template?.createdAt); + ReminderDate.setDate(ReminderDate.getDate() + RemindOnceInEvery); + reminderDate = { NextReminderDate: ReminderDate }; + } + const data = { ...formData, SendinOrder: isChecked, ...reminderDate }; onSuccess(data); }; - + const handleAutoReminder = () => { + setFormData((prev) => ({ + ...prev, + AutomaticReminders: !formData.AutomaticReminders + })); + }; return ( - <div className="addusercontainer"> + <div className="max-h-[300px] md:max-h-[400px] overflow-y-scroll p-[10px]"> <div className="form-wrapper"> <form onSubmit={handleSubmit}> <div> @@ -128,6 +157,57 @@ const EditTemplate = ({ template, onSuccess }) => { <div style={{ fontSize: 12 }}>No</div> </div> </div> + <div className="text-xs mt-2"> + {!isEnableSubscription && ( + <PremiumAlertHeader + message={ + "Disable Auto reminder is free in beta, this feature will incur a fee later." + } + /> + )} + <span + className={ + isSubscribe || !isEnableSubscription + ? "font-semibold" + : "font-semibold text-gray-300" + } + > + Auto reminder{" "} + {!isSubscribe && isEnableSubscription && <Upgrade />} + </span> + <label + className={`${ + isSubscribe || !isEnableSubscription + ? "cursor-pointer " + : "pointer-events-none opacity-50" + } relative block items-center mb-0`} + > + <input + checked={formData.AutomaticReminders} + onChange={handleAutoReminder} + type="checkbox" + value="" + className="sr-only peer" + /> + <div className="w-9 h-5 bg-gray-200 peer-focus:outline-none peer-focus:ring-1 peer-focus:ring-black rounded-full peer dark:bg-gray-700 peer-checked:after:translate-x-full rtl:peer-checked:after:-translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:start-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-4 after:w-4 after:transition-all dark:border-black peer-checked:bg-blue-600 mt-2"></div> + </label> + </div> + {isSubscribe && formData?.AutomaticReminders === true && ( + <div className="text-xs mt-2"> + <label className="block"> + Remind once in every (Days) + <span className="text-red-500 text-[13px]">*</span> + </label> + <input + type="number" + value={formData.RemindOnceInEvery} + name="RemindOnceInEvery" + className="px-3 py-2 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs" + onChange={handleStrInput} + required + /> + </div> + )} {/* <SelectFolder onSuccess={handleFolder} folderCls={"contracts_Template"} /> */} <div className="buttoncontainer"> <button type="submit" className="submitbutton"> diff --git a/apps/OpenSign/src/constant/Utils.js b/apps/OpenSign/src/constant/Utils.js index 5cf2bcf29..93cefe04c 100644 --- a/apps/OpenSign/src/constant/Utils.js +++ b/apps/OpenSign/src/constant/Utils.js @@ -561,7 +561,7 @@ export const signPdfFun = async ( isCustomCompletionMail = true; } } - + // below for loop is used to get first signature of user to send if to signpdf // for adding it in completion certificate let getSignature; @@ -676,7 +676,9 @@ export const createDocument = async (template, placeholders, signerData) => { objectId: Doc.CreatedBy.objectId }, Signers: signers, - SendinOrder: Doc?.SendinOrder || false + SendinOrder: Doc?.SendinOrder || false, + AutomaticReminders: Doc?.AutomaticReminders || false, + RemindOnceInEvery: parseInt(Doc?.RemindOnceInEvery || 5) }; try { @@ -1349,8 +1351,8 @@ export const multiSignEmbed = async ( position.type === radioButtonWidget ? 10 : position.type === "checkbox" - ? 10 - : newUpdateHeight; + ? 10 + : newUpdateHeight; const newHeight = ind ? (ind > 0 ? widgetHeight : 0) : widgetHeight; if (signyourself) { diff --git a/apps/OpenSign/src/pages/Form.js b/apps/OpenSign/src/pages/Form.js index 546768adf..9765d7432 100644 --- a/apps/OpenSign/src/pages/Form.js +++ b/apps/OpenSign/src/pages/Form.js @@ -11,12 +11,14 @@ import SignersInput from "../components/shared/fields/SignersInput"; import Title from "../components/Title"; import PageNotFound from "./PageNotFound"; import { SaveFileSize } from "../constant/saveFileSize"; -import { getFileName, toDataUrl } from "../constant/Utils"; +import { checkIsSubscribed, getFileName, toDataUrl } from "../constant/Utils"; import { PDFDocument } from "pdf-lib"; import axios from "axios"; import { isEnableSubscription, submitBtn } from "../constant/const"; import ModalUi from "../primitives/ModalUi"; import { Tooltip } from "react-tooltip"; +import Upgrade from "../primitives/Upgrade"; +import PremiumAlertHeader from "../primitives/PremiumAlertHeader"; // `Form` render all type of Form on this basis of their provided in path function Form() { @@ -48,7 +50,9 @@ const Forms = (props) => { TimeToCompleteDays: 15, SendinOrder: "false", password: "", - file: "" + file: "", + remindOnceInEvery: 5, + autoreminder: false }); const [fileupload, setFileUpload] = useState(""); const [fileload, setfileload] = useState(false); @@ -60,6 +64,7 @@ const Forms = (props) => { const [isPassword, setIsPassword] = useState(false); const [isDecrypting, setIsDecrypting] = useState(false); const [isCorrectPass, setIsCorrectPass] = useState(true); + const [isSubscribe, setIsSubscribe] = useState(false); const handleStrInput = (e) => { setIsCorrectPass(true); setFormData({ ...formData, [e.target.name]: e.target.value }); @@ -70,6 +75,17 @@ const Forms = (props) => { // eslint-disable-next-line react-hooks/exhaustive-deps }, [props.title]); + useEffect(() => { + fetchSubscription(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + const fetchSubscription = async () => { + if (isEnableSubscription) { + const getIsSubscribe = await checkIsSubscribed(); + setIsSubscribe(getIsSubscribe); + } + }; + function getFileAsArrayBuffer(file) { return new Promise((resolve, reject) => { const reader = new FileReader(); @@ -383,6 +399,8 @@ const Forms = (props) => { if (props.title !== "Sign Yourself") { const isChecked = formData.SendinOrder === "false" ? false : true; object.set("SendinOrder", isChecked); + object.set("AutomaticReminders", formData.autoreminder); + object.set("RemindOnceInEvery", parseInt(formData.remindOnceInEvery)); } object.set("URL", fileupload); object.set("CreatedBy", Parse.User.createWithoutData(currentUser.id)); @@ -402,7 +420,6 @@ const Forms = (props) => { className: "contracts_Users", objectId: ExtCls[0].objectId }); - const res = await object.save(); if (res) { setSigners([]); @@ -457,7 +474,11 @@ const Forms = (props) => { ? "Note to myself" : "Please review and sign this document", TimeToCompleteDays: 15, - SendinOrder: "true" + SendinOrder: "true", + password: "", + file: "", + remindOnceInEvery: 5, + autoreminder: false }); setFileUpload(""); setpercentage(0); @@ -536,6 +557,9 @@ const Forms = (props) => { inputFileRef.current.value = ""; // Set file input value to empty string } }; + const handleAutoReminder = () => { + setFormData((prev) => ({ ...prev, autoreminder: !formData.autoreminder })); + }; return ( <div className="shadow-md rounded my-2 p-3 bg-[#ffffff] md:border-[1px] md:border-gray-600/50"> <Title title={props?.title} /> @@ -732,89 +756,141 @@ const Forms = (props) => { </div> )} {props.title !== "Sign Yourself" && ( - <div className="text-xs mt-2"> - <label className="block"> - Send In Order - <a data-tooltip-id="sendInOrder-tooltip" className="ml-1"> - <sup> - <i - className="fa-solid fa-question rounded-full" - style={{ - borderColor: "#33bbff", - color: "#33bbff", - fontSize: 13, - borderWidth: 1.5, - padding: "1.5px 4px" - }} - ></i> - </sup> - </a> - <Tooltip id="sendInOrder-tooltip" className="z-50"> - <div className="max-w-[200px] md:max-w-[450px]"> - <p className="font-bold">Send in Order</p> - <p> - Choose how you want the signing requests to be sent to - the document signers: - </p> - <p className="p-[5px]"> - <ol className="list-disc"> - <li> - <span className="font-bold">Yes:</span> - <span> - {" "} - Selecting this option will send the signing - request to the first signer initially. Once the - first signer completes their part, the next signer - in the sequence will receive the request. This - process continues until all signers have signed - the document. This method ensures that the - document is signed in a specific order. - </span> - </li> - <li> - <span className="font-bold">No: </span> - <span> - Selecting this option will send the signing links - to all signers simultaneously. Every signer can - sign the document at their convenience, regardless - of whether other signers have completed their - signatures. This method is faster but does not - enforce any signing order among the participants. - </span> - </li> - </ol> - </p> + <> + <div className="text-xs mt-2"> + <label className="block"> + Send In Order + <a data-tooltip-id="sendInOrder-tooltip" className="ml-1"> + <sup> + <i + className="fa-solid fa-question rounded-full" + style={{ + borderColor: "#33bbff", + color: "#33bbff", + fontSize: 13, + borderWidth: 1.5, + padding: "1.5px 4px" + }} + ></i> + </sup> + </a> + <Tooltip id="sendInOrder-tooltip" className="z-50"> + <div className="max-w-[200px] md:max-w-[450px]"> + <p className="font-bold">Send in Order</p> + <p> + Choose how you want the signing requests to be sent to + the document signers: + </p> + <p className="p-[5px]"> + <ol className="list-disc"> + <li> + <span className="font-bold">Yes:</span> + <span> + {" "} + Selecting this option will send the signing + request to the first signer initially. Once the + first signer completes their part, the next + signer in the sequence will receive the request. + This process continues until all signers have + signed the document. This method ensures that + the document is signed in a specific order. + </span> + </li> + <li> + <span className="font-bold">No: </span> + <span> + Selecting this option will send the signing + links to all signers simultaneously. Every + signer can sign the document at their + convenience, regardless of whether other signers + have completed their signatures. This method is + faster but does not enforce any signing order + among the participants. + </span> + </li> + </ol> + </p> - <p> - Select the option that best suits the needs of your - document processing. - </p> - </div> - </Tooltip> - </label> - - <div className="flex items-center gap-2 ml-2 mb-1"> - <input - type="radio" - value={"true"} - name="SendinOrder" - checked={formData.SendinOrder === "true"} - className="" - onChange={handleStrInput} - /> - <div className="text-center">Yes</div> + <p> + Select the option that best suits the needs of your + document processing. + </p> + </div> + </Tooltip> + </label> + <div className="flex items-center gap-2 ml-2 mb-1"> + <input + type="radio" + value={"true"} + name="SendinOrder" + checked={formData.SendinOrder === "true"} + onChange={handleStrInput} + /> + <div className="text-center">Yes</div> + </div> + <div className="flex items-center gap-2 ml-2 mb-1"> + <input + type="radio" + value={"false"} + name="SendinOrder" + checked={formData.SendinOrder === "false"} + onChange={handleStrInput} + /> + <div className="text-center">No</div> + </div> </div> - <div className="flex items-center gap-2 ml-2 mb-1"> - <input - type="radio" - value={"false"} - name="SendinOrder" - checked={formData.SendinOrder === "false"} - onChange={handleStrInput} - /> - <div className="text-center">No</div> + <div className="text-xs mt-2"> + {!isEnableSubscription && ( + <PremiumAlertHeader + message={ + "Disable Auto reminder is free in beta, this feature will incur a fee later." + } + /> + )} + <span + className={ + isSubscribe || !isEnableSubscription + ? "font-semibold" + : "font-semibold text-gray-300" + } + > + Auto reminder{" "} + {!isSubscribe && isEnableSubscription && <Upgrade />} + </span> + <label + className={`${ + isSubscribe || !isEnableSubscription + ? "cursor-pointer " + : "pointer-events-none opacity-50" + } relative block items-center mb-0`} + > + <input + checked={formData.autoreminder} + onChange={handleAutoReminder} + type="checkbox" + value="" + className="sr-only peer" + /> + <div className="w-9 h-5 bg-gray-200 peer-focus:outline-none peer-focus:ring-1 peer-focus:ring-black rounded-full peer dark:bg-gray-700 peer-checked:after:translate-x-full rtl:peer-checked:after:-translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:start-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-4 after:w-4 after:transition-all dark:border-black peer-checked:bg-blue-600 mt-2"></div> + </label> </div> - </div> + {formData?.autoreminder === true && ( + <div className="text-xs mt-2"> + <label className="block"> + Remind once in every (Days) + <span className="text-red-500 text-[13px]">*</span> + </label> + <input + type="number" + value={formData.remindOnceInEvery} + name="remindOnceInEvery" + className="px-3 py-2 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs" + onChange={handleStrInput} + required + /> + </div> + )} + </> )} <div className="flex items-center mt-3 gap-2 text-white"> <button diff --git a/apps/OpenSign/src/pages/PlaceHolderSign.js b/apps/OpenSign/src/pages/PlaceHolderSign.js index e1d142ca8..07e63cc45 100644 --- a/apps/OpenSign/src/pages/PlaceHolderSign.js +++ b/apps/OpenSign/src/pages/PlaceHolderSign.js @@ -405,7 +405,7 @@ function PlaceHolderSign() { }; setHandleError("Error: Something went wrong!"); setIsLoading(loadObj); - } else if (res[0] && res.length) { + } else if (res.length && res[0]?.objectId) { setActiveMailAdapter(res[0]?.active_mail_adapter); setSignerUserId(res[0].objectId); const tourstatus = res[0].TourStatus && res[0].TourStatus; diff --git a/apps/OpenSign/src/pages/TemplatePlaceholder.js b/apps/OpenSign/src/pages/TemplatePlaceholder.js index f02b3800a..d6fb21f50 100644 --- a/apps/OpenSign/src/pages/TemplatePlaceholder.js +++ b/apps/OpenSign/src/pages/TemplatePlaceholder.js @@ -36,6 +36,7 @@ import AddRoleModal from "../components/pdf/AddRoleModal"; import PlaceholderCopy from "../components/pdf/PlaceholderCopy"; import TourContentWithBtn from "../primitives/TourContentWithBtn"; import DropdownWidgetOption from "../components/pdf/DropdownWidgetOption"; +import Parse from "parse"; const TemplatePlaceholder = () => { const navigate = useNavigate(); const { templateId } = useParams(); @@ -704,35 +705,29 @@ const TemplatePlaceholder = () => { Name: pdfDetails[0]?.Name || "", Note: pdfDetails[0]?.Note || "", Description: pdfDetails[0]?.Description || "", - SendinOrder: pdfDetails[0]?.SendinOrder || false + SendinOrder: pdfDetails[0]?.SendinOrder || false, + AutomaticReminders: pdfDetails[0]?.AutomaticReminders, + RemindOnceInEvery: parseInt(pdfDetails[0]?.RemindOnceInEvery), + NextReminderDate: pdfDetails[0]?.NextReminderDate }; + const updateTemplate = new Parse.Object("contracts_Template"); + updateTemplate.id = templateId; + for (const key in data) { + updateTemplate.set(key, data[key]); + } + await updateTemplate.save(null, { + sessionToken: localStorage.getItem("accesstoken") + }); - await axios - .put( - `${localStorage.getItem("baseUrl")}classes/${localStorage.getItem( - "_appName" - )}_Template/${templateId}`, - data, - { - headers: { - "Content-Type": "application/json", - "X-Parse-Application-Id": localStorage.getItem("parseAppId"), - "X-Parse-Session-Token": localStorage.getItem("accesstoken") - } - } - ) - .then(() => { - setIsCreateDocModal(true); - setIsMailSend(true); - const loadObj = { - isLoad: false - }; - setIsLoading(loadObj); - }) - .catch((err) => { - console.log("axois err ", err); - }); + setIsCreateDocModal(true); + setIsMailSend(true); + const loadObj = { + isLoad: false + }; + setIsLoading(loadObj); } catch (e) { + setIsLoading(false); + alert("Something went wrong, please try again later."); console.log("error", e); } } else { @@ -1207,7 +1202,6 @@ const TemplatePlaceholder = () => { setIsCheckbox(false); }; - console.log("signerpos", signerPos); return ( <div> <Title title={"Template"} /> diff --git a/apps/OpenSign/src/primitives/GetReportDisplay.js b/apps/OpenSign/src/primitives/GetReportDisplay.js index 6042de100..1e82297e5 100644 --- a/apps/OpenSign/src/primitives/GetReportDisplay.js +++ b/apps/OpenSign/src/primitives/GetReportDisplay.js @@ -139,7 +139,10 @@ const ReportTable = (props) => { className: "_User", objectId: Doc.CreatedBy.objectId }, - Signers: signers + Signers: signers, + SendinOrder: Doc?.SendinOrder || false, + AutomaticReminders: Doc?.AutomaticReminders || false, + RemindOnceInEvery: Doc?.RemindOnceInEvery || 5 }; try { const res = await axios.post( diff --git a/apps/OpenSignServer/cloud/customRoute/autoReminder.js b/apps/OpenSignServer/cloud/customRoute/autoReminder.js new file mode 100644 index 000000000..c43e8ed6f --- /dev/null +++ b/apps/OpenSignServer/cloud/customRoute/autoReminder.js @@ -0,0 +1,231 @@ +import axios from 'axios'; + +// `replaceMailVaribles` is used to replace variables from mail with there actual values +function replaceMailVaribles(subject, body, variables) { + let replacedSubject = subject; + let replacedBody = body; + + for (const variable in variables) { + const regex = new RegExp(`{{${variable}}}`, 'g'); + if (subject) { + replacedSubject = replacedSubject.replace(regex, variables[variable]); + } + if (body) { + replacedBody = replacedBody.replace(regex, variables[variable]); + } + } + + const result = { + subject: replacedSubject, + body: replacedBody, + }; + return result; +} + +export default async function autoReminder(request, response) { + const subject = `{{sender_name}} has requested you to sign "{{document_title}}"`; + const body = `<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8' /></head><body><p>Hi {{receiver_name}},</p><br><p>We hope this email finds you well. {{sender_name}} has requested you to review and sign <b>"{{document_title}}"</b>.</p><p>Your signature is crucial to proceed with the next steps as it signifies your agreement and authorization.</p><br><p>{{signing_url}}</p><br><p>If you have any questions or need further clarification regarding the document or the signing process, please contact the sender.</p><br><p>Thanks</p><p> Team OpenSign™</p><br></body> </html>`; + const url = `${process.env.SERVER_URL}/functions/sendmailv3`; + const headers = { + 'Content-Type': 'application/json', + 'X-Parse-Application-Id': process.env.APP_ID, + }; + const limit = request.query.limit || 2000; + const skip = request.query.skip || 0; + const baseUrl = new URL(process.env.PUBLIC_URL); + + // The query below is used to find documents where the reminder date is less than or equal to the current date, and which have existing signers and a signed URL. + try { + const docQuery = new Parse.Query('contracts_Document'); + docQuery.limit(limit); + docQuery.skip(skip); + docQuery.lessThanOrEqualTo('NextReminderDate', new Date()); + docQuery.equalTo('AutomaticReminders', true); + docQuery.exists('NextReminderDate'); + docQuery.exists('Signers'); + docQuery.exists('SignedUrl'); + docQuery.descending('createdAt'); + docQuery.include('Signers,AuditTrail.UserPtr,ExtUserPtr'); + const docsArr = await docQuery.find({ useMasterKey: true }); + + if (docsArr && docsArr.length > 0) { + const _docsArr = JSON.parse(JSON.stringify(docsArr)); + for (const doc of _docsArr) { + // The reminderDate variable is used to calculate the next reminder date. + const RemindOnceInEvery = doc?.RemindOnceInEvery || 5; + const ReminderDate = new Date(doc?.NextReminderDate?.iso); + ReminderDate.setDate(ReminderDate.getDate() + RemindOnceInEvery); + // The sendInOrder variable is used to determine whether to send emails in order or not. + const SendInOrder = doc?.SendinOrder || false; + if (SendInOrder) { + // The auditTrail variable is used to get the count of how many users have already signed the document. + const auditTrail = doc?.AuditTrail?.filter(x => x.Activity === 'Signed'); + const count = auditTrail?.length || 0; + const signer = doc?.Signers?.[count]; + if (signer) { + const encodeBase64 = btoa(`${doc.objectId}/${signer.Email}/${signer.objectId}`); + const expireDate = doc?.ExpiryDate?.iso; + const newDate = new Date(expireDate); + const localExpireDate = newDate.toLocaleDateString('en-US', { + day: 'numeric', + month: 'long', + year: 'numeric', + }); + const signPdf = `${baseUrl.origin}/login/${encodeBase64}`; + const variables = { + document_title: doc.Name, + sender_name: doc.ExtUserPtr.Name, + sender_mail: doc.ExtUserPtr.Email, + sender_phone: doc.ExtUserPtr.Phone, + receiver_name: signer.Name, + receiver_email: signer.Email, + receiver_phone: signer.Phone, + expiry_date: localExpireDate, + company_name: doc?.ExtUserPtr?.Company || '', + signing_url: `<a href=${signPdf}>Sign here</a>`, + }; + const mail = replaceMailVaribles(subject, body, variables); + + let params = { + mailProvider: doc?.ExtUserPtr?.active_mail_adapter, + extUserId: doc?.ExtUserPtr?.objectId, + recipient: signer.Email, + subject: mail.subject, + from: doc?.ExtUserPtr?.Email, + html: mail.body, + }; + try { + // The axios request is used to send a signing reminder email. + const res = await axios.post(url, params, { headers: headers }); + // console.log('res ', res.data.result); + if (res.data.result.status === 'success') { + // The code below is used to update the next reminder date of the document based on the "remind once every X days" setting. + const updateDoc = new Parse.Object('contracts_Document'); + updateDoc.id = doc.objectId; + updateDoc.set('NextReminderDate', ReminderDate); + const updateRes = await updateDoc.save(null, { useMasterKey: true }); + // console.log('updateRes ', updateRes); + } + } catch (err) { + console.log('err in sendmail', err); + } + } + } else { + // The AuditTrail variable is used to check if there is any user who has already signed the document. + const auditTrail = doc?.AuditTrail?.filter(x => x.Activity === 'Signed'); + if (auditTrail?.length > 0) { + // The signers variable is used to get the signers who haven't signed the document. + const signers = doc?.Signers.filter(signer => { + const signedUser = auditTrail?.find(y => y.UserPtr.objectId === signer.objectId); + if (!signedUser) { + return signer; + } + }); + if (signers?.length > 0) { + // The for...of loop below is used to send a signing reminder to every signer who hasn't signed the document yet. + for (const signer of signers) { + const encodeBase64 = btoa(`${doc.objectId}/${signer.Email}/${signer.objectId}`); + const expireDate = doc?.ExpiryDate?.iso; + const newDate = new Date(expireDate); + const localExpireDate = newDate.toLocaleDateString('en-US', { + day: 'numeric', + month: 'long', + year: 'numeric', + }); + const signPdf = `${baseUrl.origin}/login/${encodeBase64}`; + const variables = { + document_title: doc.Name, + sender_name: doc.ExtUserPtr.Name, + sender_mail: doc.ExtUserPtr.Email, + sender_phone: doc.ExtUserPtr.Phone, + receiver_name: signer.Name, + receiver_email: signer.Email, + receiver_phone: signer.Phone, + expiry_date: localExpireDate, + company_name: doc?.ExtUserPtr?.Company || '', + signing_url: `<a href=${signPdf}>Sign here</a>`, + }; + const mail = replaceMailVaribles(subject, body, variables); + let params = { + mailProvider: doc?.ExtUserPtr?.active_mail_adapter, + extUserId: doc?.ExtUserPtr?.objectId, + recipient: signer.Email, + subject: mail.subject, + from: doc?.ExtUserPtr?.Email, + html: mail.body, + }; + try { + const res = await axios.post(url, params, { headers: headers }); + // console.log('res ', res.data.result); + } catch (err) { + console.log('err in sendmail', err); + } + } + } + } else { + // The for...of loop below is used to send a signing reminder to every signer who hasn't signed the document yet. + const signers = doc?.Signers; + if (signers?.length > 0) { + for (const signer of signers) { + const encodeBase64 = btoa(`${doc.objectId}/${signer.Email}/${signer.objectId}`); + const expireDate = doc?.ExpiryDate?.iso; + const newDate = new Date(expireDate); + const localExpireDate = newDate.toLocaleDateString('en-US', { + day: 'numeric', + month: 'long', + year: 'numeric', + }); + const signPdf = `${baseUrl.origin}/login/${encodeBase64}`; + const variables = { + document_title: doc.Name, + sender_name: doc.ExtUserPtr.Name, + sender_mail: doc.ExtUserPtr.Email, + sender_phone: doc.ExtUserPtr.Phone, + receiver_name: signer.Name, + receiver_email: signer.Email, + receiver_phone: signer.Phone, + expiry_date: localExpireDate, + company_name: doc?.ExtUserPtr?.Company || '', + signing_url: `<a href=${signPdf}>Sign here</a>`, + }; + const mail = replaceMailVaribles(subject, body, variables); + let params = { + mailProvider: doc?.ExtUserPtr?.active_mail_adapter, + extUserId: doc?.ExtUserPtr?.objectId, + recipient: signer.Email, + subject: mail.subject, + from: doc?.ExtUserPtr?.Email, + html: mail.body, + }; + try { + const res = await axios.post(url, params, { headers: headers }); + // console.log('res ', res.data.result); + } catch (err) { + console.log('err in sendmail', err); + } + } + } + } + // The code below is used to update the next reminder date of the document based on the "remind once every X days" setting. + try { + const updateDoc = new Parse.Object('contracts_Document'); + updateDoc.id = doc.objectId; + updateDoc.set('NextReminderDate', ReminderDate); + const updateRes = await updateDoc.save(null, { useMasterKey: true }); + // console.log('updateRes ', updateRes); + } catch (err) { + console.log('err in sendmail', err); + } + } + } + response.json({ status: 'success' }); + } else { + response.json({ status: 'no record found' }); + } + } catch (err) { + console.log('err ', err); + const code = err?.code || 400; + const message = err?.message || 'Somehting went wrong!'; + response.status(code).json({ error: message }); + } +} diff --git a/apps/OpenSignServer/cloud/customRoute/customApp.js b/apps/OpenSignServer/cloud/customRoute/customApp.js index aa4dccc89..354621c0b 100644 --- a/apps/OpenSignServer/cloud/customRoute/customApp.js +++ b/apps/OpenSignServer/cloud/customRoute/customApp.js @@ -7,6 +7,7 @@ import saveSubscription from './saveSubscription.js'; import saveInvoice from './saveInvoice.js'; import savePayments from './savePayments.js'; import gooogleauth from './googleauth.js'; +import autoReminder from './autoReminder.js'; export const app = express(); dotenv.config(); @@ -16,10 +17,8 @@ app.use(express.urlencoded({ limit: '50mb', extended: true })); app.post('/file_upload', uploadFile); -app.post('/savesubscription', saveSubscription) -app.post('/saveinvoice', saveInvoice) -app.post('/savepayment', savePayments) -app.post('/googleauth', gooogleauth) - - - +app.post('/savesubscription', saveSubscription); +app.post('/saveinvoice', saveInvoice); +app.post('/savepayment', savePayments); +app.post('/googleauth', gooogleauth); +app.post('/autoreminder', autoReminder); diff --git a/apps/OpenSignServer/cloud/parsefunction/DocumentAftersave.js b/apps/OpenSignServer/cloud/parsefunction/DocumentAftersave.js index fe8744873..3538a0be9 100644 --- a/apps/OpenSignServer/cloud/parsefunction/DocumentAftersave.js +++ b/apps/OpenSignServer/cloud/parsefunction/DocumentAftersave.js @@ -14,19 +14,29 @@ async function DocumentAftersave(request) { const updateQuery = await documentQuery.get(request.object.id, { useMasterKey: true }); updateQuery.set('ExpiryDate', ExpiryDate); updateQuery.set('OriginIp', ip); + const AutoReminder = request?.object?.get('AutomaticReminders') || false; + if (AutoReminder) { + const RemindOnceInEvery = request?.object?.get('RemindOnceInEvery') || 5; + const ReminderDate = new Date(createdAt); + ReminderDate.setDate(ReminderDate.getDate() + RemindOnceInEvery); + updateQuery.set('NextReminderDate', ReminderDate); + } await updateQuery.save(null, { useMasterKey: true }); } else if (createdAt && Folder === 'AIDoc') { const TimeToCompleteDays = request.object.get('TimeToCompleteDays'); const ExpiryDate = new Date(createdAt); - // console.log("ExpiryDate") - // console.log(ExpiryDate) ExpiryDate.setDate(ExpiryDate.getDate() + TimeToCompleteDays); - // console.log("ExpiryDate date after update") - // console.log(ExpiryDate) const documentQuery = new Parse.Query('contracts_Document'); const updateQuery = await documentQuery.get(request.object.id, { useMasterKey: true }); updateQuery.set('ExpiryDate', ExpiryDate); updateQuery.set('OriginIp', ip); + const AutoReminder = request?.object?.get('AutomaticReminders') || false; + if (AutoReminder) { + const RemindOnceInEvery = request?.object?.get('RemindOnceInEvery') || 5; + const ReminderDate = new Date(createdAt); + ReminderDate.setDate(ReminderDate.getDate() + RemindOnceInEvery); + updateQuery.set('NextReminderDate', ReminderDate); + } await updateQuery.save(null, { useMasterKey: true }); } diff --git a/apps/OpenSignServer/cloud/parsefunction/GetTemplate.js b/apps/OpenSignServer/cloud/parsefunction/GetTemplate.js index 768827eee..9d7998697 100644 --- a/apps/OpenSignServer/cloud/parsefunction/GetTemplate.js +++ b/apps/OpenSignServer/cloud/parsefunction/GetTemplate.js @@ -26,7 +26,7 @@ export default async function GetTemplate(request) { if (res) { // console.log("res ",res) const acl = res.getACL(); - console.log("acl", acl.getReadAccess(userId)) + // console.log("acl", acl.getReadAccess(userId)) if (acl && acl.getReadAccess(userId)) { return res; } else { diff --git a/apps/OpenSignServer/cloud/parsefunction/TemplateAfterSave.js b/apps/OpenSignServer/cloud/parsefunction/TemplateAfterSave.js index a1d8e7417..6acfdf188 100644 --- a/apps/OpenSignServer/cloud/parsefunction/TemplateAfterSave.js +++ b/apps/OpenSignServer/cloud/parsefunction/TemplateAfterSave.js @@ -4,7 +4,14 @@ export default async function TemplateAfterSave(request) { console.log('new entry is insert in contracts_Template'); // update acl of New Document If There are signers present in array const signers = request.object.get('Signers'); - + const AutoReminder = request?.object?.get('AutomaticReminders') || false; + if (AutoReminder) { + const RemindOnceInEvery = request?.object?.get('RemindOnceInEvery') || 5; + const ReminderDate = new Date(request?.object?.get('createdAt')); + ReminderDate.setDate(ReminderDate.getDate() + RemindOnceInEvery); + request.object.set('NextReminderDate', ReminderDate); + await request.object.save(null, { useMasterKey: true }); + } if (signers && signers.length > 0) { await updateAclDoc(request.object.id); } else { From 70637d6143e65c28a5719595f50ba3df6ba7a36f Mon Sep 17 00:00:00 2001 From: RaktimaNXG <raktima.c@nxglabs.com> Date: Mon, 20 May 2024 15:39:14 +0530 Subject: [PATCH 010/106] fix: handle condition to show complete message --- apps/OpenSign/src/pages/PdfRequestFiles.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/apps/OpenSign/src/pages/PdfRequestFiles.js b/apps/OpenSign/src/pages/PdfRequestFiles.js index fc3ab5a9c..9112790e1 100644 --- a/apps/OpenSign/src/pages/PdfRequestFiles.js +++ b/apps/OpenSign/src/pages/PdfRequestFiles.js @@ -417,10 +417,13 @@ function PdfRequestFiles() { } setPdfDetails(documentData); // Check if the current signer is the last signer and handle the complete message. + if (isNextUser) { + const getSignedAuditTrail = documentData[0].AuditTrail.filter( + (data) => data.Activity === "Signed" + ); const isLastSigner = - documentData?.[0]?.AuditTrail?.length === - documentData?.[0]?.Signers?.length; + getSignedAuditTrail?.length === documentData?.[0]?.Signers?.length; if (!isLastSigner) { setIsCompleted({ isModal: true, From 090c17c2c0138bc2b8b26248958c24fb4dd23f3b Mon Sep 17 00:00:00 2001 From: RaktimaNXG <raktima.c@nxglabs.com> Date: Mon, 20 May 2024 15:41:04 +0530 Subject: [PATCH 011/106] refactor: add comment --- apps/OpenSign/src/pages/PdfRequestFiles.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/OpenSign/src/pages/PdfRequestFiles.js b/apps/OpenSign/src/pages/PdfRequestFiles.js index 9112790e1..571547473 100644 --- a/apps/OpenSign/src/pages/PdfRequestFiles.js +++ b/apps/OpenSign/src/pages/PdfRequestFiles.js @@ -416,8 +416,7 @@ function PdfRequestFiles() { setSignerPos(documentData[0].Placeholders); } setPdfDetails(documentData); - // Check if the current signer is the last signer and handle the complete message. - + // Check if the current signer is not a last signer and handle the complete message. if (isNextUser) { const getSignedAuditTrail = documentData[0].AuditTrail.filter( (data) => data.Activity === "Signed" From 66c020d903a87d2c8f2baa934ff21c399dafb842 Mon Sep 17 00:00:00 2001 From: RaktimaNXG <raktima.c@nxglabs.com> Date: Mon, 20 May 2024 17:26:18 +0530 Subject: [PATCH 012/106] fix: fix celebration ui for mobile view --- apps/OpenSign/src/components/pdf/EmailComponent.js | 8 +------- apps/OpenSign/src/pages/SignyourselfPdf.js | 1 - apps/OpenSign/src/primitives/ModalUi.js | 7 +------ 3 files changed, 2 insertions(+), 14 deletions(-) diff --git a/apps/OpenSign/src/components/pdf/EmailComponent.js b/apps/OpenSign/src/components/pdf/EmailComponent.js index 8cb2b9ade..7a3357ddf 100644 --- a/apps/OpenSign/src/components/pdf/EmailComponent.js +++ b/apps/OpenSign/src/components/pdf/EmailComponent.js @@ -251,17 +251,11 @@ function EmailComponent({ </div> <div style={{ height: "100%", padding: 20 }}> {(isCeleb || isCompletionCeleb) && ( - <div - style={{ - position: "absolute", - marginLeft: "50px" - }} - > + <div className="absolute w-[100%] flex justify-center items-center"> <img alt="print img" width={300} height={250} - // style={styles.gifCeleb} src={celebration} /> </div> diff --git a/apps/OpenSign/src/pages/SignyourselfPdf.js b/apps/OpenSign/src/pages/SignyourselfPdf.js index 2ad4ccb0a..5e61edb67 100644 --- a/apps/OpenSign/src/pages/SignyourselfPdf.js +++ b/apps/OpenSign/src/pages/SignyourselfPdf.js @@ -340,7 +340,6 @@ function SignYourSelf() { setIsLoading(loadObj); } }; - console.log("iscompletion", isCompletionCeleb); const getWidgetValue = (type) => { switch (type) { case "name": diff --git a/apps/OpenSign/src/primitives/ModalUi.js b/apps/OpenSign/src/primitives/ModalUi.js index be6122e69..d54304953 100644 --- a/apps/OpenSign/src/primitives/ModalUi.js +++ b/apps/OpenSign/src/primitives/ModalUi.js @@ -27,12 +27,7 @@ const ModalUi = ({ } > {isCompletionCeleb && ( - <div - style={{ - position: "absolute", - marginLeft: "50px" - }} - > + <div className="absolute w-[100%] flex justify-center items-center"> <img alt="print img" width={300} From ae740efced29a57e3115ad0bb4dad8a220990340 Mon Sep 17 00:00:00 2001 From: RaktimaNXG <raktima.c@nxglabs.com> Date: Mon, 20 May 2024 17:46:07 +0530 Subject: [PATCH 013/106] refactor: refactor code --- apps/OpenSign/src/components/pdf/EmailComponent.js | 10 +++++----- apps/OpenSign/src/pages/PdfRequestFiles.js | 10 ++++------ apps/OpenSign/src/pages/SignyourselfPdf.js | 2 +- apps/OpenSign/src/primitives/ModalUi.js | 4 ++-- 4 files changed, 12 insertions(+), 14 deletions(-) diff --git a/apps/OpenSign/src/components/pdf/EmailComponent.js b/apps/OpenSign/src/components/pdf/EmailComponent.js index 7a3357ddf..db630a5ad 100644 --- a/apps/OpenSign/src/components/pdf/EmailComponent.js +++ b/apps/OpenSign/src/components/pdf/EmailComponent.js @@ -17,12 +17,12 @@ function EmailComponent({ setIsAlert, extUserId, activeMailAdapter, - isCompletionCeleb + isEmailCelebration }) { const [emailList, setEmailList] = useState([]); const [emailValue, setEmailValue] = useState(); const [isLoading, setIsLoading] = useState(false); - const [isCeleb, setIsCeleb] = useState(false); + const [isCelebration, setIsCelebration] = useState(false); //function for send email const sendEmail = async () => { setIsLoading(true); @@ -63,9 +63,9 @@ function EmailComponent({ " target=_blank>here</a> </p></div></div></body></html>" }; sendMail = await axios.post(url, params, { headers: headers }); - setIsCeleb(true); + setIsCelebration(true); setTimeout(() => { - setIsCeleb(false); + setIsCelebration(false); }, 3000); } catch (error) { console.log("error", error); @@ -250,7 +250,7 @@ function EmailComponent({ </div> </div> <div style={{ height: "100%", padding: 20 }}> - {(isCeleb || isCompletionCeleb) && ( + {(isCelebration || isEmailCelebration) && ( <div className="absolute w-[100%] flex justify-center items-center"> <img alt="print img" diff --git a/apps/OpenSign/src/pages/PdfRequestFiles.js b/apps/OpenSign/src/pages/PdfRequestFiles.js index 571547473..a608ff3b9 100644 --- a/apps/OpenSign/src/pages/PdfRequestFiles.js +++ b/apps/OpenSign/src/pages/PdfRequestFiles.js @@ -61,7 +61,7 @@ function PdfRequestFiles() { const [handleError, setHandleError] = useState(); const [selectWidgetId, setSelectWidgetId] = useState(""); const [otpLoader, setOtpLoader] = useState(false); - const [isCompletionCeleb, setIsCompletionCeleb] = useState(false); + const [isCelebration, setIsCelebration] = useState(false); const [isLoading, setIsLoading] = useState({ isLoad: true, message: "This might take some time" @@ -261,7 +261,7 @@ function PdfRequestFiles() { setAlreadySign(true); setIsCompleted(data); setTimeout(() => { - setIsCompletionCeleb(false); + setIsCelebration(false); }, 1500); } else if (declined) { const currentDecline = { @@ -722,7 +722,7 @@ function PdfRequestFiles() { setSignedSigners([]); setUnSignedSigners([]); getDocumentDetails(true); - setIsCompletionCeleb(true); + setIsCelebration(true); const index = pdfDetails?.[0].Signers.findIndex( (x) => x.Email === jsonSender.email ); @@ -1371,9 +1371,7 @@ function PdfRequestFiles() { handleClose={() => { setIsCompleted((prev) => ({ ...prev, isModal: false })); }} - isCompletionCeleb={ - !isCompleted?.message && isCompletionCeleb - } + isCelebration={!isCompleted?.message && isCelebration} > <div style={{ height: "100%", padding: 20 }}> <p> diff --git a/apps/OpenSign/src/pages/SignyourselfPdf.js b/apps/OpenSign/src/pages/SignyourselfPdf.js index 5e61edb67..0a8f7c7b5 100644 --- a/apps/OpenSign/src/pages/SignyourselfPdf.js +++ b/apps/OpenSign/src/pages/SignyourselfPdf.js @@ -1265,7 +1265,7 @@ function SignYourSelf() { setIsAlert={setIsAlert} extUserId={extUserId} activeMailAdapter={activeMailAdapter} - isCompletionCeleb={isCompletionCeleb} + isEmailCelebration={isCompletionCeleb} setIsCompletionCeleb={setIsCompletionCeleb} /> {/* pdf header which contain funish back button */} diff --git a/apps/OpenSign/src/primitives/ModalUi.js b/apps/OpenSign/src/primitives/ModalUi.js index d54304953..0d54712b0 100644 --- a/apps/OpenSign/src/primitives/ModalUi.js +++ b/apps/OpenSign/src/primitives/ModalUi.js @@ -13,7 +13,7 @@ const ModalUi = ({ showClose = true, styleClass, showHeaderMessage, - isCompletionCeleb + isCelebration }) => { return ( <> @@ -26,7 +26,7 @@ const ModalUi = ({ : "fixed z-[1000] top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2 text-sm bg-white rounded shadow-md max-h-90 min-w-[90%] md:min-w-[500px] overflow-y-auto hide-scrollbar" } > - {isCompletionCeleb && ( + {isCelebration && ( <div className="absolute w-[100%] flex justify-center items-center"> <img alt="print img" From 44639f66b0f7bf5c4735c3da54ee950f8c423c26 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <prafull.navkar@nxglabs.com> Date: Mon, 20 May 2024 18:42:32 +0530 Subject: [PATCH 014/106] fix: autoreminder API not working --- .../cloud/customRoute/autoReminder.js | 193 +++++++----------- .../cloud/customRoute/customApp.js | 2 +- 2 files changed, 74 insertions(+), 121 deletions(-) diff --git a/apps/OpenSignServer/cloud/customRoute/autoReminder.js b/apps/OpenSignServer/cloud/customRoute/autoReminder.js index c43e8ed6f..de8da2cbd 100644 --- a/apps/OpenSignServer/cloud/customRoute/autoReminder.js +++ b/apps/OpenSignServer/cloud/customRoute/autoReminder.js @@ -22,7 +22,8 @@ function replaceMailVaribles(subject, body, variables) { return result; } -export default async function autoReminder(request, response) { +// `sendmail` is used to signing reminder mail to signer +async function sendMail(doc, signer, mailcount) { const subject = `{{sender_name}} has requested you to sign "{{document_title}}"`; const body = `<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8' /></head><body><p>Hi {{receiver_name}},</p><br><p>We hope this email finds you well. {{sender_name}} has requested you to review and sign <b>"{{document_title}}"</b>.</p><p>Your signature is crucial to proceed with the next steps as it signifies your agreement and authorization.</p><br><p>{{signing_url}}</p><br><p>If you have any questions or need further clarification regarding the document or the signing process, please contact the sender.</p><br><p>Thanks</p><p> Team OpenSign™</p><br></body> </html>`; const url = `${process.env.SERVER_URL}/functions/sendmailv3`; @@ -30,15 +31,57 @@ export default async function autoReminder(request, response) { 'Content-Type': 'application/json', 'X-Parse-Application-Id': process.env.APP_ID, }; - const limit = request.query.limit || 2000; - const skip = request.query.skip || 0; - const baseUrl = new URL(process.env.PUBLIC_URL); + const baseUrl = new URL(process.env.PUBLIC_URL); + const encodeBase64 = btoa(`${doc.objectId}/${signer.Email}/${signer.objectId}`); + const expireDate = doc?.ExpiryDate?.iso; + const newDate = new Date(expireDate); + const localExpireDate = newDate.toLocaleDateString('en-US', { + day: 'numeric', + month: 'long', + year: 'numeric', + }); + const signPdf = `${baseUrl.origin}/login/${encodeBase64}`; + const variables = { + document_title: doc.Name, + sender_name: doc.ExtUserPtr.Name, + sender_mail: doc.ExtUserPtr.Email, + sender_phone: doc.ExtUserPtr.Phone, + receiver_name: signer.Name, + receiver_email: signer.Email, + receiver_phone: signer.Phone, + expiry_date: localExpireDate, + company_name: doc?.ExtUserPtr?.Company || '', + signing_url: `<a href=${signPdf}>Sign here</a>`, + }; + const mail = replaceMailVaribles(subject, body, variables); + + let params = { + mailProvider: doc?.ExtUserPtr?.active_mail_adapter, + extUserId: doc?.ExtUserPtr?.objectId, + recipient: signer.Email, + subject: mail.subject, + from: doc?.ExtUserPtr?.Email, + html: mail.body, + }; + try { + // The axios request is used to send a signing reminder email. + const res = await axios.post(url, params, { headers: headers }); + // console.log('res ', res.data.result); + if (res.data.result.status === 'success') { + mailcount += 1; + return { status: 'success', count: mailcount }; + } + } catch (err) { + console.log('err in mail of sendreminder api', err); + return { status: 'error' }; + } +} +export default async function autoReminder(request, response) { // The query below is used to find documents where the reminder date is less than or equal to the current date, and which have existing signers and a signed URL. try { const docQuery = new Parse.Query('contracts_Document'); - docQuery.limit(limit); - docQuery.skip(skip); + docQuery.limit(2000); docQuery.lessThanOrEqualTo('NextReminderDate', new Date()); docQuery.equalTo('AutomaticReminders', true); docQuery.exists('NextReminderDate'); @@ -46,10 +89,16 @@ export default async function autoReminder(request, response) { docQuery.exists('SignedUrl'); docQuery.descending('createdAt'); docQuery.include('Signers,AuditTrail.UserPtr,ExtUserPtr'); + docQuery.notEqualTo('IsCompleted', true); + docQuery.notEqualTo('IsDeclined', true); + docQuery.notEqualTo('IsArchive', true); + docQuery.greaterThanOrEqualTo('ExpiryDate', new Date()); + const docsArr = await docQuery.find({ useMasterKey: true }); if (docsArr && docsArr.length > 0) { const _docsArr = JSON.parse(JSON.stringify(docsArr)); + let mailCount = 0; for (const doc of _docsArr) { // The reminderDate variable is used to calculate the next reminder date. const RemindOnceInEvery = doc?.RemindOnceInEvery || 5; @@ -63,51 +112,19 @@ export default async function autoReminder(request, response) { const count = auditTrail?.length || 0; const signer = doc?.Signers?.[count]; if (signer) { - const encodeBase64 = btoa(`${doc.objectId}/${signer.Email}/${signer.objectId}`); - const expireDate = doc?.ExpiryDate?.iso; - const newDate = new Date(expireDate); - const localExpireDate = newDate.toLocaleDateString('en-US', { - day: 'numeric', - month: 'long', - year: 'numeric', - }); - const signPdf = `${baseUrl.origin}/login/${encodeBase64}`; - const variables = { - document_title: doc.Name, - sender_name: doc.ExtUserPtr.Name, - sender_mail: doc.ExtUserPtr.Email, - sender_phone: doc.ExtUserPtr.Phone, - receiver_name: signer.Name, - receiver_email: signer.Email, - receiver_phone: signer.Phone, - expiry_date: localExpireDate, - company_name: doc?.ExtUserPtr?.Company || '', - signing_url: `<a href=${signPdf}>Sign here</a>`, - }; - const mail = replaceMailVaribles(subject, body, variables); - - let params = { - mailProvider: doc?.ExtUserPtr?.active_mail_adapter, - extUserId: doc?.ExtUserPtr?.objectId, - recipient: signer.Email, - subject: mail.subject, - from: doc?.ExtUserPtr?.Email, - html: mail.body, - }; + const mailRes = await sendMail(doc, signer, mailCount); + if (mailRes && mailRes.status === 'success') { + mailCount += mailRes.count; + } try { - // The axios request is used to send a signing reminder email. - const res = await axios.post(url, params, { headers: headers }); - // console.log('res ', res.data.result); - if (res.data.result.status === 'success') { - // The code below is used to update the next reminder date of the document based on the "remind once every X days" setting. - const updateDoc = new Parse.Object('contracts_Document'); - updateDoc.id = doc.objectId; - updateDoc.set('NextReminderDate', ReminderDate); - const updateRes = await updateDoc.save(null, { useMasterKey: true }); - // console.log('updateRes ', updateRes); - } + // The code below is used to update the next reminder date of the document based on the "remind once every X days" setting. + const updateDoc = new Parse.Object('contracts_Document'); + updateDoc.id = doc.objectId; + updateDoc.set('NextReminderDate', ReminderDate); + const updateRes = await updateDoc.save(null, { useMasterKey: true }); + // console.log('updateRes ', updateRes); } catch (err) { - console.log('err in sendmail', err); + console.log('err in update document', err); } } } else { @@ -124,41 +141,9 @@ export default async function autoReminder(request, response) { if (signers?.length > 0) { // The for...of loop below is used to send a signing reminder to every signer who hasn't signed the document yet. for (const signer of signers) { - const encodeBase64 = btoa(`${doc.objectId}/${signer.Email}/${signer.objectId}`); - const expireDate = doc?.ExpiryDate?.iso; - const newDate = new Date(expireDate); - const localExpireDate = newDate.toLocaleDateString('en-US', { - day: 'numeric', - month: 'long', - year: 'numeric', - }); - const signPdf = `${baseUrl.origin}/login/${encodeBase64}`; - const variables = { - document_title: doc.Name, - sender_name: doc.ExtUserPtr.Name, - sender_mail: doc.ExtUserPtr.Email, - sender_phone: doc.ExtUserPtr.Phone, - receiver_name: signer.Name, - receiver_email: signer.Email, - receiver_phone: signer.Phone, - expiry_date: localExpireDate, - company_name: doc?.ExtUserPtr?.Company || '', - signing_url: `<a href=${signPdf}>Sign here</a>`, - }; - const mail = replaceMailVaribles(subject, body, variables); - let params = { - mailProvider: doc?.ExtUserPtr?.active_mail_adapter, - extUserId: doc?.ExtUserPtr?.objectId, - recipient: signer.Email, - subject: mail.subject, - from: doc?.ExtUserPtr?.Email, - html: mail.body, - }; - try { - const res = await axios.post(url, params, { headers: headers }); - // console.log('res ', res.data.result); - } catch (err) { - console.log('err in sendmail', err); + const mailRes = await sendMail(doc, signer, mailCount); + if (mailRes && mailRes.status === 'success') { + mailCount += mailRes.count; } } } @@ -167,41 +152,9 @@ export default async function autoReminder(request, response) { const signers = doc?.Signers; if (signers?.length > 0) { for (const signer of signers) { - const encodeBase64 = btoa(`${doc.objectId}/${signer.Email}/${signer.objectId}`); - const expireDate = doc?.ExpiryDate?.iso; - const newDate = new Date(expireDate); - const localExpireDate = newDate.toLocaleDateString('en-US', { - day: 'numeric', - month: 'long', - year: 'numeric', - }); - const signPdf = `${baseUrl.origin}/login/${encodeBase64}`; - const variables = { - document_title: doc.Name, - sender_name: doc.ExtUserPtr.Name, - sender_mail: doc.ExtUserPtr.Email, - sender_phone: doc.ExtUserPtr.Phone, - receiver_name: signer.Name, - receiver_email: signer.Email, - receiver_phone: signer.Phone, - expiry_date: localExpireDate, - company_name: doc?.ExtUserPtr?.Company || '', - signing_url: `<a href=${signPdf}>Sign here</a>`, - }; - const mail = replaceMailVaribles(subject, body, variables); - let params = { - mailProvider: doc?.ExtUserPtr?.active_mail_adapter, - extUserId: doc?.ExtUserPtr?.objectId, - recipient: signer.Email, - subject: mail.subject, - from: doc?.ExtUserPtr?.Email, - html: mail.body, - }; - try { - const res = await axios.post(url, params, { headers: headers }); - // console.log('res ', res.data.result); - } catch (err) { - console.log('err in sendmail', err); + const mailRes = await sendMail(doc, signer, mailCount); + if (mailRes && mailRes.status === 'success') { + mailCount += mailRes.count; } } } @@ -218,7 +171,7 @@ export default async function autoReminder(request, response) { } } } - response.json({ status: 'success' }); + response.json({ status: 'success', document_count: docsArr.length, mail_count: mailCount }); } else { response.json({ status: 'no record found' }); } diff --git a/apps/OpenSignServer/cloud/customRoute/customApp.js b/apps/OpenSignServer/cloud/customRoute/customApp.js index 354621c0b..f9fdefaea 100644 --- a/apps/OpenSignServer/cloud/customRoute/customApp.js +++ b/apps/OpenSignServer/cloud/customRoute/customApp.js @@ -21,4 +21,4 @@ app.post('/savesubscription', saveSubscription); app.post('/saveinvoice', saveInvoice); app.post('/savepayment', savePayments); app.post('/googleauth', gooogleauth); -app.post('/autoreminder', autoReminder); +app.post('/sendreminder', autoReminder); From b992d7db248fa5a53ab368b0f6a5f7339803c869 Mon Sep 17 00:00:00 2001 From: RaktimaNXG <raktima.c@nxglabs.com> Date: Tue, 21 May 2024 13:03:51 +0530 Subject: [PATCH 015/106] fix: change celebration effect and add for whole screen --- apps/OpenSign/package-lock.json | 20 +++++++++++++++++++ apps/OpenSign/package.json | 1 + .../src/components/pdf/EmailComponent.js | 11 +++++----- apps/OpenSign/src/pages/PdfRequestFiles.js | 19 +++++++++++++----- apps/OpenSign/src/pages/SignyourselfPdf.js | 16 +++++++++------ apps/OpenSign/src/primitives/ModalUi.js | 14 +------------ 6 files changed, 51 insertions(+), 30 deletions(-) diff --git a/apps/OpenSign/package-lock.json b/apps/OpenSign/package-lock.json index 95ce733d0..10b01f986 100644 --- a/apps/OpenSign/package-lock.json +++ b/apps/OpenSign/package-lock.json @@ -22,6 +22,7 @@ "radix-ui": "^1.0.1", "react": "^18.2.0", "react-bootstrap": "^2.10.2", + "react-confetti": "^6.1.0", "react-cookie": "^7.1.4", "react-datepicker": "^6.4.0", "react-dnd": "^16.0.1", @@ -19458,6 +19459,20 @@ "react": "^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/react-confetti": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/react-confetti/-/react-confetti-6.1.0.tgz", + "integrity": "sha512-7Ypx4vz0+g8ECVxr88W9zhcQpbeujJAVqL14ZnXJ3I23mOI9/oBVTQ3dkJhUmB0D6XOtCZEM6N0Gm9PMngkORw==", + "dependencies": { + "tween-functions": "^1.2.0" + }, + "engines": { + "node": ">=10.18" + }, + "peerDependencies": { + "react": "^16.3.0 || ^17.0.1 || ^18.0.0" + } + }, "node_modules/react-cookie": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/react-cookie/-/react-cookie-7.1.4.tgz", @@ -22575,6 +22590,11 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, + "node_modules/tween-functions": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tween-functions/-/tween-functions-1.2.0.tgz", + "integrity": "sha512-PZBtLYcCLtEcjL14Fzb1gSxPBeL7nWvGhO5ZFPGqziCcr8uvHp0NDmdjBchp6KHL+tExcg0m3NISmKxhU394dA==" + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", diff --git a/apps/OpenSign/package.json b/apps/OpenSign/package.json index 2b9861354..ebf2e291b 100644 --- a/apps/OpenSign/package.json +++ b/apps/OpenSign/package.json @@ -17,6 +17,7 @@ "radix-ui": "^1.0.1", "react": "^18.2.0", "react-bootstrap": "^2.10.2", + "react-confetti": "^6.1.0", "react-cookie": "^7.1.4", "react-datepicker": "^6.4.0", "react-dnd": "^16.0.1", diff --git a/apps/OpenSign/src/components/pdf/EmailComponent.js b/apps/OpenSign/src/components/pdf/EmailComponent.js index db630a5ad..66c4cc682 100644 --- a/apps/OpenSign/src/components/pdf/EmailComponent.js +++ b/apps/OpenSign/src/components/pdf/EmailComponent.js @@ -16,13 +16,12 @@ function EmailComponent({ sender, setIsAlert, extUserId, - activeMailAdapter, - isEmailCelebration + activeMailAdapter }) { const [emailList, setEmailList] = useState([]); const [emailValue, setEmailValue] = useState(); const [isLoading, setIsLoading] = useState(false); - const [isCelebration, setIsCelebration] = useState(false); + const [isEmailCelebration, setIsEmailCelebration] = useState(false); //function for send email const sendEmail = async () => { setIsLoading(true); @@ -63,9 +62,9 @@ function EmailComponent({ " target=_blank>here</a> </p></div></div></body></html>" }; sendMail = await axios.post(url, params, { headers: headers }); - setIsCelebration(true); + setIsEmailCelebration(true); setTimeout(() => { - setIsCelebration(false); + setIsEmailCelebration(false); }, 3000); } catch (error) { console.log("error", error); @@ -250,7 +249,7 @@ function EmailComponent({ </div> </div> <div style={{ height: "100%", padding: 20 }}> - {(isCelebration || isEmailCelebration) && ( + {isEmailCelebration && ( <div className="absolute w-[100%] flex justify-center items-center"> <img alt="print img" diff --git a/apps/OpenSign/src/pages/PdfRequestFiles.js b/apps/OpenSign/src/pages/PdfRequestFiles.js index a608ff3b9..45c77174b 100644 --- a/apps/OpenSign/src/pages/PdfRequestFiles.js +++ b/apps/OpenSign/src/pages/PdfRequestFiles.js @@ -11,6 +11,7 @@ import { useLocation, useNavigate, useParams } from "react-router-dom"; import SignPad from "../components/pdf/SignPad"; import RenderAllPdfPage from "../components/pdf/RenderAllPdfPage"; import Tour from "reactour"; +import Confetti from "react-confetti"; import moment from "moment"; import { contractDocument, @@ -260,9 +261,6 @@ function PdfRequestFiles() { }; setAlreadySign(true); setIsCompleted(data); - setTimeout(() => { - setIsCelebration(false); - }, 1500); } else if (declined) { const currentDecline = { currnt: "another", @@ -429,6 +427,11 @@ function PdfRequestFiles() { message: "You have successfully signed the document. You can download or print a copy of the partially signed document. A copy of the digitally signed document will be sent to the owner over email once it is signed by all signers." }); + } else { + setIsCelebration(true); + setTimeout(() => { + setIsCelebration(false); + }, 2500); } } @@ -722,7 +725,6 @@ function PdfRequestFiles() { setSignedSigners([]); setUnSignedSigners([]); getDocumentDetails(true); - setIsCelebration(true); const index = pdfDetails?.[0].Signers.findIndex( (x) => x.Email === jsonSender.email ); @@ -1182,6 +1184,14 @@ function PdfRequestFiles() { </span> </div> )} + {isCelebration && ( + <div style={{ position: "relative", zIndex: "1000" }}> + <Confetti + width={window.innerWidth} + height={window.innerHeight} + /> + </div> + )} <div className="relative flex flex-col md:flex-row justify-between bg-[#ebebeb]" @@ -1371,7 +1381,6 @@ function PdfRequestFiles() { handleClose={() => { setIsCompleted((prev) => ({ ...prev, isModal: false })); }} - isCelebration={!isCompleted?.message && isCelebration} > <div style={{ height: "100%", padding: 20 }}> <p> diff --git a/apps/OpenSign/src/pages/SignyourselfPdf.js b/apps/OpenSign/src/pages/SignyourselfPdf.js index 0a8f7c7b5..341526ffb 100644 --- a/apps/OpenSign/src/pages/SignyourselfPdf.js +++ b/apps/OpenSign/src/pages/SignyourselfPdf.js @@ -3,6 +3,7 @@ import { PDFDocument } from "pdf-lib"; import "../styles/signature.css"; import Parse from "parse"; import { isEnableSubscription, themeColor } from "../constant/const"; +import Confetti from "react-confetti"; import axios from "axios"; import Loader from "../primitives/LoaderWithMsg"; import loader from "../assets/images/loader2.gif"; @@ -108,7 +109,7 @@ function SignYourSelf() { const [isDontShow, setIsDontShow] = useState(false); const [extUserId, setExtUserId] = useState(""); const [isCompleted, setIsCompleted] = useState(false); - const [isCompletionCeleb, setIsCompletionCeleb] = useState(false); + const [isCelebration, setIsCelebration] = useState(false); const [pdfArrayBuffer, setPdfArrayBuffer] = useState(""); const [activeMailAdapter, setActiveMailAdapter] = useState(""); const [isEmailVerified, setIsEmailVerified] = useState(true); @@ -229,11 +230,12 @@ function SignYourSelf() { setIsUiLoading(false); setIsSignPad(false); setIsEmail(true); + setIsCelebration(true); setXyPostion([]); setSignBtnPosition([]); setTimeout(() => { - setIsCompletionCeleb(false); - }, 1500); + setIsCelebration(false); + }, 2500); } } } else if ( @@ -768,7 +770,6 @@ function SignYourSelf() { setPdfUrl(json.result.data); if (json.result.data) { getDocumentDetails(false); - setIsCompletionCeleb(true); } }) .catch((err) => { @@ -1122,6 +1123,11 @@ function SignYourSelf() { </span> </div> )} + {isCelebration && ( + <div style={{ position: "relative", zIndex: "999" }}> + <Confetti width={window.innerWidth} height={window.innerHeight} /> + </div> + )} <div className="signatureContainer" ref={divRef}> {!isEmailVerified && ( @@ -1265,8 +1271,6 @@ function SignYourSelf() { setIsAlert={setIsAlert} extUserId={extUserId} activeMailAdapter={activeMailAdapter} - isEmailCelebration={isCompletionCeleb} - setIsCompletionCeleb={setIsCompletionCeleb} /> {/* pdf header which contain funish back button */} <Header diff --git a/apps/OpenSign/src/primitives/ModalUi.js b/apps/OpenSign/src/primitives/ModalUi.js index 0d54712b0..dcc726f18 100644 --- a/apps/OpenSign/src/primitives/ModalUi.js +++ b/apps/OpenSign/src/primitives/ModalUi.js @@ -1,7 +1,6 @@ import React from "react"; import { isEnableSubscription } from "../constant/const"; import PremiumAlertHeader from "./PremiumAlertHeader"; -import celebration from "../assets/images/newCeleb.gif"; const ModalUi = ({ children, @@ -12,8 +11,7 @@ const ModalUi = ({ showHeader = true, showClose = true, styleClass, - showHeaderMessage, - isCelebration + showHeaderMessage }) => { return ( <> @@ -26,16 +24,6 @@ const ModalUi = ({ : "fixed z-[1000] top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2 text-sm bg-white rounded shadow-md max-h-90 min-w-[90%] md:min-w-[500px] overflow-y-auto hide-scrollbar" } > - {isCelebration && ( - <div className="absolute w-[100%] flex justify-center items-center"> - <img - alt="print img" - width={300} - height={100} - src={celebration} - /> - </div> - )} {showHeader && ( <div className="flex justify-between rounded-t items-center py-[15px] px-[20px] text-white" From 7894d69cc90861135ce15e6b7b323d30d7d13142 Mon Sep 17 00:00:00 2001 From: RaktimaNXG <raktima.c@nxglabs.com> Date: Tue, 21 May 2024 13:35:22 +0530 Subject: [PATCH 016/106] fix: increase time to show confetti celebration --- apps/OpenSign/src/pages/GuestLogin.js | 10 +++++++++- apps/OpenSign/src/pages/PdfRequestFiles.js | 2 +- apps/OpenSign/src/pages/PlaceHolderSign.js | 2 +- apps/OpenSign/src/pages/SignyourselfPdf.js | 2 +- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/apps/OpenSign/src/pages/GuestLogin.js b/apps/OpenSign/src/pages/GuestLogin.js index 003ef60bb..d3b2c69a3 100644 --- a/apps/OpenSign/src/pages/GuestLogin.js +++ b/apps/OpenSign/src/pages/GuestLogin.js @@ -19,6 +19,7 @@ function GuestLogin() { const [appLogo, setAppLogo] = useState(""); const [documentId, setDocumentId] = useState(id); const [contactId, setContactId] = useState(contactBookId); + const [sendMail, setSendMail] = useState(); useEffect(() => { handleServerUrl(); @@ -54,6 +55,7 @@ function GuestLogin() { setDocumentId(checkSplit[0]); setEmail(checkSplit[1]); setContactId(checkSplit[2]); + setSendMail(checkSplit[3]); } setIsLoading(false); @@ -146,7 +148,13 @@ function GuestLogin() { //save isGuestSigner true in local to handle login flow header in mobile view localStorage.setItem("isGuestSigner", true); setLoading(false); - navigate(`/load/recipientSignPdf/${documentId}/${contactId}`); + if (sendMail === "false") { + navigate( + `/load/recipientSignPdf/${documentId}/${contactId}?sendmail=${sendMail}` + ); + } else { + navigate(`/load/recipientSignPdf/${documentId}/${contactId}`); + } } } catch (error) { console.log("err ", error); diff --git a/apps/OpenSign/src/pages/PdfRequestFiles.js b/apps/OpenSign/src/pages/PdfRequestFiles.js index 45c77174b..0eda0afe1 100644 --- a/apps/OpenSign/src/pages/PdfRequestFiles.js +++ b/apps/OpenSign/src/pages/PdfRequestFiles.js @@ -431,7 +431,7 @@ function PdfRequestFiles() { setIsCelebration(true); setTimeout(() => { setIsCelebration(false); - }, 2500); + }, 5000); } } diff --git a/apps/OpenSign/src/pages/PlaceHolderSign.js b/apps/OpenSign/src/pages/PlaceHolderSign.js index e1d142ca8..093590034 100644 --- a/apps/OpenSign/src/pages/PlaceHolderSign.js +++ b/apps/OpenSign/src/pages/PlaceHolderSign.js @@ -1000,7 +1000,7 @@ function PlaceHolderSign() { const hostUrl = window.location.origin; //encode this url value `${pdfDetails?.[0].objectId}/${signerMail[i].Email}/${objectId}` to base64 using `btoa` function const encodeBase64 = btoa( - `${pdfDetails?.[0].objectId}/${signerMail[i].Email}/${objectId}` + `${pdfDetails?.[0].objectId}/${signerMail[i].Email}/${objectId}/false` ); let signPdf = `${hostUrl}/login/${encodeBase64}`; shareLinkList.push({ signerEmail: signerMail[i].Email, url: signPdf }); diff --git a/apps/OpenSign/src/pages/SignyourselfPdf.js b/apps/OpenSign/src/pages/SignyourselfPdf.js index 341526ffb..fda577946 100644 --- a/apps/OpenSign/src/pages/SignyourselfPdf.js +++ b/apps/OpenSign/src/pages/SignyourselfPdf.js @@ -235,7 +235,7 @@ function SignYourSelf() { setSignBtnPosition([]); setTimeout(() => { setIsCelebration(false); - }, 2500); + }, 5000); } } } else if ( From eeb878b34022c0e7761e315494d6de47baa99482 Mon Sep 17 00:00:00 2001 From: RaktimaNXG <raktima.c@nxglabs.com> Date: Tue, 21 May 2024 13:40:54 +0530 Subject: [PATCH 017/106] refactor:refactor code --- apps/OpenSign/src/pages/GuestLogin.js | 10 +--------- apps/OpenSign/src/pages/PlaceHolderSign.js | 2 +- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/apps/OpenSign/src/pages/GuestLogin.js b/apps/OpenSign/src/pages/GuestLogin.js index d3b2c69a3..003ef60bb 100644 --- a/apps/OpenSign/src/pages/GuestLogin.js +++ b/apps/OpenSign/src/pages/GuestLogin.js @@ -19,7 +19,6 @@ function GuestLogin() { const [appLogo, setAppLogo] = useState(""); const [documentId, setDocumentId] = useState(id); const [contactId, setContactId] = useState(contactBookId); - const [sendMail, setSendMail] = useState(); useEffect(() => { handleServerUrl(); @@ -55,7 +54,6 @@ function GuestLogin() { setDocumentId(checkSplit[0]); setEmail(checkSplit[1]); setContactId(checkSplit[2]); - setSendMail(checkSplit[3]); } setIsLoading(false); @@ -148,13 +146,7 @@ function GuestLogin() { //save isGuestSigner true in local to handle login flow header in mobile view localStorage.setItem("isGuestSigner", true); setLoading(false); - if (sendMail === "false") { - navigate( - `/load/recipientSignPdf/${documentId}/${contactId}?sendmail=${sendMail}` - ); - } else { - navigate(`/load/recipientSignPdf/${documentId}/${contactId}`); - } + navigate(`/load/recipientSignPdf/${documentId}/${contactId}`); } } catch (error) { console.log("err ", error); diff --git a/apps/OpenSign/src/pages/PlaceHolderSign.js b/apps/OpenSign/src/pages/PlaceHolderSign.js index 093590034..e1d142ca8 100644 --- a/apps/OpenSign/src/pages/PlaceHolderSign.js +++ b/apps/OpenSign/src/pages/PlaceHolderSign.js @@ -1000,7 +1000,7 @@ function PlaceHolderSign() { const hostUrl = window.location.origin; //encode this url value `${pdfDetails?.[0].objectId}/${signerMail[i].Email}/${objectId}` to base64 using `btoa` function const encodeBase64 = btoa( - `${pdfDetails?.[0].objectId}/${signerMail[i].Email}/${objectId}/false` + `${pdfDetails?.[0].objectId}/${signerMail[i].Email}/${objectId}` ); let signPdf = `${hostUrl}/login/${encodeBase64}`; shareLinkList.push({ signerEmail: signerMail[i].Email, url: signPdf }); From b289686d4219b7d97413172807fa2ade5de896f1 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <prafull.navkar@nxglabs.com> Date: Tue, 21 May 2024 13:42:50 +0530 Subject: [PATCH 018/106] build(dep): update parse-server package and it's dependencies --- apps/OpenSign/package-lock.json | 58 +- apps/OpenSign/package.json | 2 +- apps/OpenSignServer/index.js | 2 +- apps/OpenSignServer/package-lock.json | 1317 +++++++++++++++---------- apps/OpenSignServer/package.json | 18 +- 5 files changed, 844 insertions(+), 553 deletions(-) diff --git a/apps/OpenSign/package-lock.json b/apps/OpenSign/package-lock.json index 95ce733d0..fe7899402 100644 --- a/apps/OpenSign/package-lock.json +++ b/apps/OpenSign/package-lock.json @@ -16,7 +16,7 @@ "file-saver": "^2.0.5", "jwt-decode": "^4.0.0", "moment": "^2.30.1", - "parse": "^4.3.1", + "parse": "^5.1.0", "pdf-lib": "^1.17.1", "print-js": "^1.6.0", "radix-ui": "^1.0.1", @@ -7705,12 +7705,12 @@ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", "dependencies": { "bytes": "3.1.2", - "content-type": "~1.0.4", + "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", @@ -7718,7 +7718,7 @@ "iconv-lite": "0.4.24", "on-finished": "2.4.1", "qs": "6.11.0", - "raw-body": "2.5.1", + "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" }, @@ -8778,9 +8778,9 @@ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", "engines": { "node": ">= 0.6" } @@ -10961,16 +10961,16 @@ } }, "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.1", + "body-parser": "1.20.2", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.5.0", + "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -17269,19 +17269,19 @@ } }, "node_modules/parse": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/parse/-/parse-4.3.1.tgz", - "integrity": "sha512-ypLPhMPFsJY+C2MXg6HdrVu6ielsL+kUjcSqh7J01lPC5oBuLh70F9YMQSw51QBocEeMSVgB7eUorFOH+MkVpA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse/-/parse-5.1.0.tgz", + "integrity": "sha512-46gVRe1JHsh21Ht0/Ko6PeMDl6wELLMYxnZPFD6iZm2EWsWnzi2txNGE6PvnIv+G7yOufZIOD0BCZLYOFl3toA==", "dependencies": { "@babel/runtime-corejs3": "7.23.2", "idb-keyval": "6.2.1", "react-native-crypto-js": "1.0.0", "uuid": "9.0.1", - "ws": "8.13.0", + "ws": "8.16.0", "xmlhttprequest": "1.8.0" }, "engines": { - "node": ">=14.21.0 <17 || >=18 <20" + "node": ">=18 <21" }, "optionalDependencies": { "crypto-js": "4.2.0" @@ -17331,9 +17331,9 @@ } }, "node_modules/parse/node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", "engines": { "node": ">=10.0.0" }, @@ -19308,9 +19308,9 @@ } }, "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -22823,14 +22823,6 @@ "cookie": "^0.6.0" } }, - "node_modules/universal-cookie/node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", diff --git a/apps/OpenSign/package.json b/apps/OpenSign/package.json index 2b9861354..7797d60d5 100644 --- a/apps/OpenSign/package.json +++ b/apps/OpenSign/package.json @@ -11,7 +11,7 @@ "file-saver": "^2.0.5", "jwt-decode": "^4.0.0", "moment": "^2.30.1", - "parse": "^4.3.1", + "parse": "^5.1.0", "pdf-lib": "^1.17.1", "print-js": "^1.6.0", "radix-ui": "^1.0.1", diff --git a/apps/OpenSignServer/index.js b/apps/OpenSignServer/index.js index d6ba7ad9b..1b459fc3b 100644 --- a/apps/OpenSignServer/index.js +++ b/apps/OpenSignServer/index.js @@ -10,7 +10,7 @@ import formData from 'form-data'; import Mailgun from 'mailgun.js'; import { ApiPayloadConverter } from 'parse-server-api-mail-adapter'; import S3Adapter from '@parse/s3-files-adapter'; -import FSFilesAdapter from 'parse-server-fs-adapter'; +import FSFilesAdapter from '@parse/fs-files-adapter'; import AWS from 'aws-sdk'; import { app as customRoute } from './cloud/customRoute/customApp.js'; import { exec } from 'child_process'; diff --git a/apps/OpenSignServer/package-lock.json b/apps/OpenSignServer/package-lock.json index ba80c14a1..f0a454474 100644 --- a/apps/OpenSignServer/package-lock.json +++ b/apps/OpenSignServer/package-lock.json @@ -9,9 +9,13 @@ "version": "1.4.0", "license": "MIT", "dependencies": { + "@parse/fs-files-adapter": "^3.0.0", "@parse/s3-files-adapter": "^2.2.0", + "@signpdf/placeholder-pdf-lib": "^3.2.4", + "@signpdf/signer-p12": "^3.2.4", + "@signpdf/signpdf": "^3.2.4", "aws-sdk": "^2.1581.0", - "axios": "^1.6.8", + "axios": "^1.7.1", "cors": "^2.8.5", "dotenv": "^16.4.5", "express": "^4.19.2", @@ -21,27 +25,25 @@ "googleapis": "^134.0.0", "jsonschema": "^1.4.1", "mailgun.js": "^10.2.1", - "mongoose": "^8.3.3", + "mongoose": "^8.4.0", "multer": "^1.4.5-lts.1", "multer-s3": "^3.0.1", "node-forge": "^1.3.1", "node-signpdf": "^1.5.1", "nodemailer": "^6.9.13", - "parse": "^5.0.0", + "parse": "^5.1.0", "parse-dbtool": "^1.2.0", - "parse-server": "^6.5.5", + "parse-server": "^7.0.0", "parse-server-api-mail-adapter": "^3.1.1", - "parse-server-fs-adapter": "^1.0.1", - "parse-server-s3-adapter": "^1.2.0", "pdf-lib": "^1.17.1", "pdfkit": "^0.14.0", "posthog-node": "^3.6.3" }, "devDependencies": { - "@babel/eslint-parser": "^7.23.10", + "@babel/eslint-parser": "^7.24.5", "eslint": "^8.57.0", "jasmine": "^5.1.0", - "mongodb-runner": "^5.5.4", + "mongodb-runner": "^5.6.2", "nodemon": "^3.1.0", "nyc": "15.1.0", "prettier": "^3.2.5", @@ -71,6 +73,302 @@ "node": ">=6.0.0" } }, + "node_modules/@apollo/cache-control-types": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@apollo/cache-control-types/-/cache-control-types-1.0.3.tgz", + "integrity": "sha512-F17/vCp7QVwom9eG7ToauIKdAxpSoadsJnqIfyryLFSkLSOEqu+eC5Z3N8OXcUVStuOMcNHlyraRsA6rRICu4g==", + "peerDependencies": { + "graphql": "14.x || 15.x || 16.x" + } + }, + "node_modules/@apollo/protobufjs": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@apollo/protobufjs/-/protobufjs-1.2.7.tgz", + "integrity": "sha512-Lahx5zntHPZia35myYDBRuF58tlwPskwHc5CWBZC/4bMKB6siTBWwtMrkqXcsNwQiFSzSx5hKdRPUmemrEp3Gg==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.0", + "long": "^4.0.0" + }, + "bin": { + "apollo-pbjs": "bin/pbjs", + "apollo-pbts": "bin/pbts" + } + }, + "node_modules/@apollo/protobufjs/node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "node_modules/@apollo/server": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@apollo/server/-/server-4.10.1.tgz", + "integrity": "sha512-XGMOgTyzV4EBHQq0xQVKFry9hZF7AA/6nxxGLamqdxodhdSdGbU9jrlb5/XDveeGuXP3+5JDdrB2HcziVLJcMA==", + "dependencies": { + "@apollo/cache-control-types": "^1.0.3", + "@apollo/server-gateway-interface": "^1.1.1", + "@apollo/usage-reporting-protobuf": "^4.1.1", + "@apollo/utils.createhash": "^2.0.0", + "@apollo/utils.fetcher": "^2.0.0", + "@apollo/utils.isnodelike": "^2.0.0", + "@apollo/utils.keyvaluecache": "^2.1.0", + "@apollo/utils.logger": "^2.0.0", + "@apollo/utils.usagereporting": "^2.1.0", + "@apollo/utils.withrequired": "^2.0.0", + "@graphql-tools/schema": "^9.0.0", + "@josephg/resolvable": "^1.0.0", + "@types/express": "^4.17.13", + "@types/express-serve-static-core": "^4.17.30", + "@types/node-fetch": "^2.6.1", + "async-retry": "^1.2.1", + "cors": "^2.8.5", + "express": "^4.17.1", + "loglevel": "^1.6.8", + "lru-cache": "^7.10.1", + "negotiator": "^0.6.3", + "node-abort-controller": "^3.1.1", + "node-fetch": "^2.6.7", + "uuid": "^9.0.0", + "whatwg-mimetype": "^3.0.0" + }, + "engines": { + "node": ">=14.16.0" + }, + "peerDependencies": { + "graphql": "^16.6.0" + } + }, + "node_modules/@apollo/server-gateway-interface": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@apollo/server-gateway-interface/-/server-gateway-interface-1.1.1.tgz", + "integrity": "sha512-pGwCl/po6+rxRmDMFgozKQo2pbsSwE91TpsDBAOgf74CRDPXHHtM88wbwjab0wMMZh95QfR45GGyDIdhY24bkQ==", + "dependencies": { + "@apollo/usage-reporting-protobuf": "^4.1.1", + "@apollo/utils.fetcher": "^2.0.0", + "@apollo/utils.keyvaluecache": "^2.1.0", + "@apollo/utils.logger": "^2.0.0" + }, + "peerDependencies": { + "graphql": "14.x || 15.x || 16.x" + } + }, + "node_modules/@apollo/server/node_modules/@graphql-tools/merge": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-8.4.2.tgz", + "integrity": "sha512-XbrHAaj8yDuINph+sAfuq3QCZ/tKblrTLOpirK0+CAgNlZUCHs0Fa+xtMUURgwCVThLle1AF7svJCxFizygLsw==", + "dependencies": { + "@graphql-tools/utils": "^9.2.1", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@apollo/server/node_modules/@graphql-tools/schema": { + "version": "9.0.19", + "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-9.0.19.tgz", + "integrity": "sha512-oBRPoNBtCkk0zbUsyP4GaIzCt8C0aCI4ycIRUL67KK5pOHljKLBBtGT+Jr6hkzA74C8Gco8bpZPe7aWFjiaK2w==", + "dependencies": { + "@graphql-tools/merge": "^8.4.1", + "@graphql-tools/utils": "^9.2.1", + "tslib": "^2.4.0", + "value-or-promise": "^1.0.12" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@apollo/server/node_modules/@graphql-tools/utils": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-9.2.1.tgz", + "integrity": "sha512-WUw506Ql6xzmOORlriNrD6Ugx+HjVgYxt9KCXD9mHAak+eaXSwuGGPyE60hy9xaDEoXKBsG7SkG69ybitaVl6A==", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@apollo/server/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/@apollo/server/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@apollo/usage-reporting-protobuf": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@apollo/usage-reporting-protobuf/-/usage-reporting-protobuf-4.1.1.tgz", + "integrity": "sha512-u40dIUePHaSKVshcedO7Wp+mPiZsaU6xjv9J+VyxpoU/zL6Jle+9zWeG98tr/+SZ0nZ4OXhrbb8SNr0rAPpIDA==", + "dependencies": { + "@apollo/protobufjs": "1.2.7" + } + }, + "node_modules/@apollo/utils.createhash": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@apollo/utils.createhash/-/utils.createhash-2.0.1.tgz", + "integrity": "sha512-fQO4/ZOP8LcXWvMNhKiee+2KuKyqIcfHrICA+M4lj/h/Lh1H10ICcUtk6N/chnEo5HXu0yejg64wshdaiFitJg==", + "dependencies": { + "@apollo/utils.isnodelike": "^2.0.1", + "sha.js": "^2.4.11" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@apollo/utils.dropunuseddefinitions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@apollo/utils.dropunuseddefinitions/-/utils.dropunuseddefinitions-2.0.1.tgz", + "integrity": "sha512-EsPIBqsSt2BwDsv8Wu76LK5R1KtsVkNoO4b0M5aK0hx+dGg9xJXuqlr7Fo34Dl+y83jmzn+UvEW+t1/GP2melA==", + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "graphql": "14.x || 15.x || 16.x" + } + }, + "node_modules/@apollo/utils.fetcher": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@apollo/utils.fetcher/-/utils.fetcher-2.0.1.tgz", + "integrity": "sha512-jvvon885hEyWXd4H6zpWeN3tl88QcWnHp5gWF5OPF34uhvoR+DFqcNxs9vrRaBBSY3qda3Qe0bdud7tz2zGx1A==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@apollo/utils.isnodelike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@apollo/utils.isnodelike/-/utils.isnodelike-2.0.1.tgz", + "integrity": "sha512-w41XyepR+jBEuVpoRM715N2ZD0xMD413UiJx8w5xnAZD2ZkSJnMJBoIzauK83kJpSgNuR6ywbV29jG9NmxjK0Q==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@apollo/utils.keyvaluecache": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@apollo/utils.keyvaluecache/-/utils.keyvaluecache-2.1.1.tgz", + "integrity": "sha512-qVo5PvUUMD8oB9oYvq4ViCjYAMWnZ5zZwEjNF37L2m1u528x5mueMlU+Cr1UinupCgdB78g+egA1G98rbJ03Vw==", + "dependencies": { + "@apollo/utils.logger": "^2.0.1", + "lru-cache": "^7.14.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@apollo/utils.keyvaluecache/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/@apollo/utils.logger": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@apollo/utils.logger/-/utils.logger-2.0.1.tgz", + "integrity": "sha512-YuplwLHaHf1oviidB7MxnCXAdHp3IqYV8n0momZ3JfLniae92eYqMIx+j5qJFX6WKJPs6q7bczmV4lXIsTu5Pg==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@apollo/utils.printwithreducedwhitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@apollo/utils.printwithreducedwhitespace/-/utils.printwithreducedwhitespace-2.0.1.tgz", + "integrity": "sha512-9M4LUXV/fQBh8vZWlLvb/HyyhjJ77/I5ZKu+NBWV/BmYGyRmoEP9EVAy7LCVoY3t8BDcyCAGfxJaLFCSuQkPUg==", + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "graphql": "14.x || 15.x || 16.x" + } + }, + "node_modules/@apollo/utils.removealiases": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@apollo/utils.removealiases/-/utils.removealiases-2.0.1.tgz", + "integrity": "sha512-0joRc2HBO4u594Op1nev+mUF6yRnxoUH64xw8x3bX7n8QBDYdeYgY4tF0vJReTy+zdn2xv6fMsquATSgC722FA==", + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "graphql": "14.x || 15.x || 16.x" + } + }, + "node_modules/@apollo/utils.sortast": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@apollo/utils.sortast/-/utils.sortast-2.0.1.tgz", + "integrity": "sha512-eciIavsWpJ09za1pn37wpsCGrQNXUhM0TktnZmHwO+Zy9O4fu/WdB4+5BvVhFiZYOXvfjzJUcc+hsIV8RUOtMw==", + "dependencies": { + "lodash.sortby": "^4.7.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "graphql": "14.x || 15.x || 16.x" + } + }, + "node_modules/@apollo/utils.stripsensitiveliterals": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@apollo/utils.stripsensitiveliterals/-/utils.stripsensitiveliterals-2.0.1.tgz", + "integrity": "sha512-QJs7HtzXS/JIPMKWimFnUMK7VjkGQTzqD9bKD1h3iuPAqLsxd0mUNVbkYOPTsDhUKgcvUOfOqOJWYohAKMvcSA==", + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "graphql": "14.x || 15.x || 16.x" + } + }, + "node_modules/@apollo/utils.usagereporting": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@apollo/utils.usagereporting/-/utils.usagereporting-2.1.0.tgz", + "integrity": "sha512-LPSlBrn+S17oBy5eWkrRSGb98sWmnEzo3DPTZgp8IQc8sJe0prDgDuppGq4NeQlpoqEHz0hQeYHAOA0Z3aQsxQ==", + "dependencies": { + "@apollo/usage-reporting-protobuf": "^4.1.0", + "@apollo/utils.dropunuseddefinitions": "^2.0.1", + "@apollo/utils.printwithreducedwhitespace": "^2.0.1", + "@apollo/utils.removealiases": "2.0.1", + "@apollo/utils.sortast": "^2.0.1", + "@apollo/utils.stripsensitiveliterals": "^2.0.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "graphql": "14.x || 15.x || 16.x" + } + }, + "node_modules/@apollo/utils.withrequired": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@apollo/utils.withrequired/-/utils.withrequired-2.0.1.tgz", + "integrity": "sha512-YBDiuAX9i1lLc6GeTy1m7DGLFn/gMnvXqlalOIMjM7DeOgIacEjjfwPqb0M1CQ2v11HhR15d1NmxJoRCfrNqcA==", + "engines": { + "node": ">=14" + } + }, "node_modules/@aws-crypto/crc32": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", @@ -1007,9 +1305,9 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.24.1.tgz", - "integrity": "sha512-d5guuzMlPeDfZIbpQ8+g1NaCNuAGBBGNECh0HVqz1sjOeVLh2CEaifuOysCH18URW6R7pqXINvf5PaR/dC6jLQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.24.5.tgz", + "integrity": "sha512-gsUcqS/fPlgAw1kOtpss7uhY6E9SFFANQ6EFX5GTvzUwaV0+sGaZWk6xq22MOdeT9wfxyokW3ceCUvOiRtZciQ==", "dev": true, "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", @@ -1021,7 +1319,7 @@ }, "peerDependencies": { "@babel/core": "^7.11.0", - "eslint": "^7.5.0 || ^8.0.0" + "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" } }, "node_modules/@babel/generator": { @@ -1280,92 +1578,6 @@ "kuler": "^2.0.0" } }, - "node_modules/@envelop/core": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@envelop/core/-/core-2.6.0.tgz", - "integrity": "sha512-yTptKinJN//i6m1kXUbnLBl/FobzddI4ehURAMS08eRUOQwAuXqJU9r8VdTav8nIZLb4t6cuDWFb3n331LiwLw==", - "dependencies": { - "@envelop/types": "2.4.0", - "tslib": "2.4.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/@envelop/core/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" - }, - "node_modules/@envelop/parser-cache": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@envelop/parser-cache/-/parser-cache-4.7.0.tgz", - "integrity": "sha512-63NfXDcW/vGn4U6NFxaZ0JbYWAcJb9A6jhTvghsSz1ZS+Dny/ci8bVSgVmM1q+N56hPyGsVPuyI+rIc71mPU5g==", - "dependencies": { - "lru-cache": "^6.0.0", - "tslib": "^2.4.0" - }, - "peerDependencies": { - "@envelop/core": "^2.6.0", - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/@envelop/parser-cache/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@envelop/parser-cache/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/@envelop/types": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@envelop/types/-/types-2.4.0.tgz", - "integrity": "sha512-pjxS98cDQBS84X29VcwzH3aJ/KiLCGwyMxuj7/5FkdiaCXAD1JEvKEj9LARWlFYj1bY43uII4+UptFebrhiIaw==", - "dependencies": { - "tslib": "^2.4.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/@envelop/validation-cache": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@envelop/validation-cache/-/validation-cache-4.7.0.tgz", - "integrity": "sha512-PzL+GfWJRT+JjsJqZAIxHKEkvkM3hxkeytS5O0QLXT8kURNBV28r+Kdnn2RCF5+6ILhyGpiDb60vaquBi7g4lw==", - "dependencies": { - "lru-cache": "^6.0.0", - "tslib": "^2.4.0" - }, - "peerDependencies": { - "@envelop/core": "^2.6.0", - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/@envelop/validation-cache/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@envelop/validation-cache/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -1638,26 +1850,66 @@ } }, "node_modules/@graphql-tools/merge": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-8.3.6.tgz", - "integrity": "sha512-uUBokxXi89bj08P+iCvQk3Vew4vcfL5ZM6NTylWi8PIpoq4r5nJ625bRuN8h2uubEdRiH8ntN9M4xkd/j7AybQ==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-9.0.4.tgz", + "integrity": "sha512-MivbDLUQ+4Q8G/Hp/9V72hbn810IJDEZQ57F01sHnlrrijyadibfVhaQfW/pNH+9T/l8ySZpaR/DpL5i+ruZ+g==", "dependencies": { - "@graphql-tools/utils": "8.12.0", + "@graphql-tools/utils": "^10.0.13", "tslib": "^2.4.0" }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/merge/node_modules/@graphql-tools/utils": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.2.0.tgz", + "integrity": "sha512-HYV7dO6pNA2nGKawygaBpk8y+vXOUjjzzO43W/Kb7EPRmXUEQKjHxPYRvQbiF72u1N3XxwGK5jnnFk9WVhUwYw==", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "cross-inspect": "1.0.0", + "dset": "^3.1.2", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, "node_modules/@graphql-tools/schema": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-9.0.4.tgz", - "integrity": "sha512-B/b8ukjs18fq+/s7p97P8L1VMrwapYc3N2KvdG/uNThSazRRn8GsBK0Nr+FH+mVKiUfb4Dno79e3SumZVoHuOQ==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-10.0.3.tgz", + "integrity": "sha512-p28Oh9EcOna6i0yLaCFOnkcBDQECVf3SCexT6ktb86QNj9idnkhI+tCxnwZDh58Qvjd2nURdkbevvoZkvxzCog==", "dependencies": { - "@graphql-tools/merge": "8.3.6", - "@graphql-tools/utils": "8.12.0", + "@graphql-tools/merge": "^9.0.3", + "@graphql-tools/utils": "^10.0.13", "tslib": "^2.4.0", - "value-or-promise": "1.0.11" + "value-or-promise": "^1.0.12" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/schema/node_modules/@graphql-tools/utils": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.2.0.tgz", + "integrity": "sha512-HYV7dO6pNA2nGKawygaBpk8y+vXOUjjzzO43W/Kb7EPRmXUEQKjHxPYRvQbiF72u1N3XxwGK5jnnFk9WVhUwYw==", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "cross-inspect": "1.0.0", + "dset": "^3.1.2", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" }, "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" @@ -1682,88 +1934,6 @@ "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@graphql-yoga/common": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@graphql-yoga/common/-/common-2.6.0.tgz", - "integrity": "sha512-iG33wMQlBujB1+Q2D/CLEVDW3xTeBVhHKsbaUmVSHV4zpmGRRQMg/YROJ2mU1lONOyZDPIC+9j3AR7+x0dSzoA==", - "dependencies": { - "@envelop/core": "^2.0.0", - "@envelop/parser-cache": "^4.0.0", - "@envelop/validation-cache": "^4.0.0", - "@graphql-tools/schema": "^8.3.1", - "@graphql-tools/utils": "^8.6.0", - "@graphql-typed-document-node/core": "^3.1.1", - "@graphql-yoga/subscription": "2.0.0", - "cross-undici-fetch": "^0.4.2", - "dset": "^3.1.1", - "tslib": "^2.3.1" - }, - "peerDependencies": { - "graphql": "^15.2.0 || ^16.0.0" - } - }, - "node_modules/@graphql-yoga/common/node_modules/@graphql-tools/merge": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-8.3.1.tgz", - "integrity": "sha512-BMm99mqdNZbEYeTPK3it9r9S6rsZsQKtlqJsSBknAclXq2pGEfOxjcIZi+kBSkHZKPKCRrYDd5vY0+rUmIHVLg==", - "dependencies": { - "@graphql-tools/utils": "8.9.0", - "tslib": "^2.4.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-yoga/common/node_modules/@graphql-tools/schema": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-8.5.1.tgz", - "integrity": "sha512-0Esilsh0P/qYcB5DKQpiKeQs/jevzIadNTaT0jeWklPMwNbT7yMX4EqZany7mbeRRlSRwMzNzL5olyFdffHBZg==", - "dependencies": { - "@graphql-tools/merge": "8.3.1", - "@graphql-tools/utils": "8.9.0", - "tslib": "^2.4.0", - "value-or-promise": "1.0.11" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-yoga/common/node_modules/@graphql-tools/utils": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.9.0.tgz", - "integrity": "sha512-pjJIWH0XOVnYGXCqej8g/u/tsfV4LvLlj0eATKQu5zwnxd/TiTHq7Cg313qUPTFFHZ3PP5wJ15chYVtLDwaymg==", - "dependencies": { - "tslib": "^2.4.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-yoga/node": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@graphql-yoga/node/-/node-2.6.0.tgz", - "integrity": "sha512-VkHaiIwDYx+WJI/NnT2x+mGknk1YoNTP/auweDvKzPXdsWR5Za8rEYUloKZX4TxHTpyqbBLMtCt+4TDITriVbA==", - "dependencies": { - "@envelop/core": "^2.0.0", - "@graphql-tools/utils": "^8.6.0", - "@graphql-yoga/common": "2.6.0", - "@graphql-yoga/subscription": "2.0.0", - "cross-undici-fetch": "^0.4.2", - "tslib": "^2.3.1" - }, - "peerDependencies": { - "graphql": "^15.2.0 || ^16.0.0" - } - }, - "node_modules/@graphql-yoga/subscription": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@graphql-yoga/subscription/-/subscription-2.0.0.tgz", - "integrity": "sha512-HlG+gIddjIP3/BDrMZymdzmzDjNdYuSGMxx6+1JA83gAEVRDR4yOoT4QeNKYqRhLK9xca/Hxp1PfBpquSa244Q==", - "dependencies": { - "@repeaterjs/repeater": "^3.0.4", - "tslib": "^2.3.1" - } - }, "node_modules/@grpc/grpc-js": { "version": "1.10.3", "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.3.tgz", @@ -2129,6 +2299,11 @@ "node": ">=8" } }, + "node_modules/@josephg/resolvable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@josephg/resolvable/-/resolvable-1.0.1.tgz", + "integrity": "sha512-CtzORUwWTTOTqfVtHaKRJ0I1kNQd1bpn3sUh8I3nJDVY+5/M/Oe1DnEWzPQvqq/xPIIkzzzIP7mfCoAjFRvDhg==" + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -2187,10 +2362,96 @@ "url": "https://opencollective.com/js-sdsl" } }, + "node_modules/@ldapjs/asn1": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@ldapjs/asn1/-/asn1-2.0.0.tgz", + "integrity": "sha512-G9+DkEOirNgdPmD0I8nu57ygQJKOOgFEMKknEuQvIHbGLwP3ny1mY+OTUYLCbCaGJP4sox5eYgBJRuSUpnAddA==", + "deprecated": "This package has been decomissioned. See https://github.com/ldapjs/node-ldapjs/blob/8ffd0bc9c149088a10ec4c1ec6a18450f76ad05d/README.md" + }, + "node_modules/@ldapjs/attribute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@ldapjs/attribute/-/attribute-1.0.0.tgz", + "integrity": "sha512-ptMl2d/5xJ0q+RgmnqOi3Zgwk/TMJYG7dYMC0Keko+yZU6n+oFM59MjQOUht5pxJeS4FWrImhu/LebX24vJNRQ==", + "deprecated": "This package has been decomissioned. See https://github.com/ldapjs/node-ldapjs/blob/8ffd0bc9c149088a10ec4c1ec6a18450f76ad05d/README.md", + "dependencies": { + "@ldapjs/asn1": "2.0.0", + "@ldapjs/protocol": "^1.2.1", + "process-warning": "^2.1.0" + } + }, + "node_modules/@ldapjs/change": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@ldapjs/change/-/change-1.0.0.tgz", + "integrity": "sha512-EOQNFH1RIku3M1s0OAJOzGfAohuFYXFY4s73wOhRm4KFGhmQQ7MChOh2YtYu9Kwgvuq1B0xKciXVzHCGkB5V+Q==", + "deprecated": "This package has been decomissioned. See https://github.com/ldapjs/node-ldapjs/blob/8ffd0bc9c149088a10ec4c1ec6a18450f76ad05d/README.md", + "dependencies": { + "@ldapjs/asn1": "2.0.0", + "@ldapjs/attribute": "1.0.0" + } + }, + "node_modules/@ldapjs/controls": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@ldapjs/controls/-/controls-2.1.0.tgz", + "integrity": "sha512-2pFdD1yRC9V9hXfAWvCCO2RRWK9OdIEcJIos/9cCVP9O4k72BY1bLDQQ4KpUoJnl4y/JoD4iFgM+YWT3IfITWw==", + "deprecated": "This package has been decomissioned. See https://github.com/ldapjs/node-ldapjs/blob/8ffd0bc9c149088a10ec4c1ec6a18450f76ad05d/README.md", + "dependencies": { + "@ldapjs/asn1": "^1.2.0", + "@ldapjs/protocol": "^1.2.1" + } + }, + "node_modules/@ldapjs/controls/node_modules/@ldapjs/asn1": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ldapjs/asn1/-/asn1-1.2.0.tgz", + "integrity": "sha512-KX/qQJ2xxzvO2/WOvr1UdQ+8P5dVvuOLk/C9b1bIkXxZss8BaR28njXdPgFCpj5aHaf1t8PmuVnea+N9YG9YMw==", + "deprecated": "This package has been decomissioned. See https://github.com/ldapjs/node-ldapjs/blob/8ffd0bc9c149088a10ec4c1ec6a18450f76ad05d/README.md" + }, + "node_modules/@ldapjs/dn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@ldapjs/dn/-/dn-1.1.0.tgz", + "integrity": "sha512-R72zH5ZeBj/Fujf/yBu78YzpJjJXG46YHFo5E4W1EqfNpo1UsVPqdLrRMXeKIsJT3x9dJVIfR6OpzgINlKpi0A==", + "deprecated": "This package has been decomissioned. See https://github.com/ldapjs/node-ldapjs/blob/8ffd0bc9c149088a10ec4c1ec6a18450f76ad05d/README.md", + "dependencies": { + "@ldapjs/asn1": "2.0.0", + "process-warning": "^2.1.0" + } + }, + "node_modules/@ldapjs/filter": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@ldapjs/filter/-/filter-2.1.1.tgz", + "integrity": "sha512-TwPK5eEgNdUO1ABPBUQabcZ+h9heDORE4V9WNZqCtYLKc06+6+UAJ3IAbr0L0bYTnkkWC/JEQD2F+zAFsuikNw==", + "deprecated": "This package has been decomissioned. See https://github.com/ldapjs/node-ldapjs/blob/8ffd0bc9c149088a10ec4c1ec6a18450f76ad05d/README.md", + "dependencies": { + "@ldapjs/asn1": "2.0.0", + "@ldapjs/protocol": "^1.2.1", + "process-warning": "^2.1.0" + } + }, + "node_modules/@ldapjs/messages": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ldapjs/messages/-/messages-1.3.0.tgz", + "integrity": "sha512-K7xZpXJ21bj92jS35wtRbdcNrwmxAtPwy4myeh9duy/eR3xQKvikVycbdWVzkYEAVE5Ce520VXNOwCHjomjCZw==", + "deprecated": "This package has been decomissioned. See https://github.com/ldapjs/node-ldapjs/blob/8ffd0bc9c149088a10ec4c1ec6a18450f76ad05d/README.md", + "dependencies": { + "@ldapjs/asn1": "^2.0.0", + "@ldapjs/attribute": "^1.0.0", + "@ldapjs/change": "^1.0.0", + "@ldapjs/controls": "^2.1.0", + "@ldapjs/dn": "^1.1.0", + "@ldapjs/filter": "^2.1.1", + "@ldapjs/protocol": "^1.2.1", + "process-warning": "^2.2.0" + } + }, + "node_modules/@ldapjs/protocol": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@ldapjs/protocol/-/protocol-1.2.1.tgz", + "integrity": "sha512-O89xFDLW2gBoZWNXuXpBSM32/KealKCTb3JGtJdtUQc7RjAk8XzrRgyz02cPAwGKwKPxy0ivuC7UP9bmN87egQ==", + "deprecated": "This package has been decomissioned. See https://github.com/ldapjs/node-ldapjs/blob/8ffd0bc9c149088a10ec4c1ec6a18450f76ad05d/README.md" + }, "node_modules/@mongodb-js/mongodb-downloader": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/@mongodb-js/mongodb-downloader/-/mongodb-downloader-0.2.10.tgz", - "integrity": "sha512-nM0vUGUcC8DsR6x3AU6032I8b5OaTqAdq9JmanVecq2NyLZu1aacIS9Yqo3QiE2dIlrkn9hcaUg9Z/tL+3QbNA==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@mongodb-js/mongodb-downloader/-/mongodb-downloader-0.3.2.tgz", + "integrity": "sha512-bhMfxzaBy31RveAu7qqON3nVXRHYmxJXyC3lZI+mK+4DhagKZdGHJpMkLmHQRt+wAxMR6ldI9YlcWjHSqceIsQ==", "dev": true, "dependencies": { "debug": "^4.3.4", @@ -2201,9 +2462,9 @@ } }, "node_modules/@mongodb-js/saslprep": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.5.tgz", - "integrity": "sha512-XLNOMH66KhJzUJNwT/qlMnS4WsNDWD5ASdyaSH3EtK+F4r/CFGa3jT4GNi4mfOitGvWXtdLgQJkQjxSVrio+jA==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.7.tgz", + "integrity": "sha512-dCHW/oEX0KJ4NjDULBo3JiOaK5+6axtpBbS+ao2ZInoAL9/YRQLhXzSNAFz7hP4nzLkIqsfYAK/PDE3+XHny0Q==", "dependencies": { "sparse-bitfield": "^3.0.3" } @@ -2426,9 +2687,9 @@ } }, "node_modules/@parse/fs-files-adapter": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@parse/fs-files-adapter/-/fs-files-adapter-2.0.1.tgz", - "integrity": "sha512-9DY0T9lK73Ysw+wxxsBt9rpxWxJpMlHl/fTW175XSajusW0ZP5jERI3BTKeclV28eVmSU690EO2vnwCURsPZ7g==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@parse/fs-files-adapter/-/fs-files-adapter-3.0.0.tgz", + "integrity": "sha512-Bb+qLtXQ/1SA2Ck6JLVhfD9JQf6cCwgeDZZJjcIdHzUtdPTFu1hj51xdD7tUCL47Ed2i3aAx6K/M6AjLWYVs3A==" }, "node_modules/@parse/node-apn": { "version": "6.0.1", @@ -2655,32 +2916,27 @@ "node_modules/@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", - "optional": true + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" }, "node_modules/@protobufjs/base64": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", - "optional": true + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" }, "node_modules/@protobufjs/codegen": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", - "optional": true + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" }, "node_modules/@protobufjs/eventemitter": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", - "optional": true + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" }, "node_modules/@protobufjs/fetch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "optional": true, "dependencies": { "@protobufjs/aspromise": "^1.1.1", "@protobufjs/inquire": "^1.1.0" @@ -2689,32 +2945,27 @@ "node_modules/@protobufjs/float": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", - "optional": true + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" }, "node_modules/@protobufjs/inquire": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", - "optional": true + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" }, "node_modules/@protobufjs/path": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", - "optional": true + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" }, "node_modules/@protobufjs/pool": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", - "optional": true + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" }, "node_modules/@protobufjs/utf8": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", - "optional": true + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" }, "node_modules/@redis/bloom": { "version": "1.2.0", @@ -2774,10 +3025,79 @@ "@redis/client": "^1.0.0" } }, - "node_modules/@repeaterjs/repeater": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@repeaterjs/repeater/-/repeater-3.0.4.tgz", - "integrity": "sha512-AW8PKd6iX3vAZ0vA43nOUOnbq/X5ihgU+mSXXqunMkeQADGiqw/PY0JNeYtD5sr0PAy51YPgAPbDoeapv9r8WA==" + "node_modules/@signpdf/placeholder-pdf-lib": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@signpdf/placeholder-pdf-lib/-/placeholder-pdf-lib-3.2.4.tgz", + "integrity": "sha512-pNYzvLPWiHPir86pDWOK015S0whjNVvItvlTo9kwk1+99l2luIrwmubEvPjxSmDAWQ67UpKxA5lEYQsbZ7Q/og==", + "funding": [ + { + "type": "individual", + "url": "https://buymeacoffee.com/vbuch?utm_source=npm-funding-signpdf" + } + ], + "dependencies": { + "@signpdf/utils": "^3.2.4" + }, + "engines": { + "node": ">=12", + "yarn": ">=1.22.18" + }, + "peerDependencies": { + "pdf-lib": "^1.17.1" + } + }, + "node_modules/@signpdf/signer-p12": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@signpdf/signer-p12/-/signer-p12-3.2.4.tgz", + "integrity": "sha512-DTeYMj1DI30VYmaZXp2zZEg9YwVm3NmqjLF3q6ZxUwlOUSLLOUFkVafIs4YibTAGBmgjWKEMfmNCndK2ACLlzQ==", + "funding": [ + { + "type": "individual", + "url": "https://buymeacoffee.com/vbuch?utm_source=npm-funding-signpdf" + } + ], + "dependencies": { + "@signpdf/utils": "^3.2.4" + }, + "engines": { + "node": ">=12", + "yarn": ">=1.22.18" + }, + "peerDependencies": { + "node-forge": "^1.2.1" + } + }, + "node_modules/@signpdf/signpdf": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@signpdf/signpdf/-/signpdf-3.2.4.tgz", + "integrity": "sha512-X/LlvUNjw2V6fsHej42LZ/DouyEXHcm4S4se53CAiUE+CDUlPrHlKIZOkGuzwl8SKuhFFFusIAs/75ZEN+5pQw==", + "funding": [ + { + "type": "individual", + "url": "https://buymeacoffee.com/vbuch?utm_source=npm-funding-signpdf" + } + ], + "dependencies": { + "@signpdf/utils": "^3.2.4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@signpdf/utils": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@signpdf/utils/-/utils-3.2.4.tgz", + "integrity": "sha512-6e7OZugRY6obyTbAKdj6yCIywCJqN0FDywsIrhkRnOTAKm4J3WVXq18NjzmE6iEXLknxok9EXNW/eVvY9Vp1gg==", + "funding": [ + { + "type": "individual", + "url": "https://buymeacoffee.com/vbuch?utm_source=npm-funding-signpdf" + } + ], + "engines": { + "node": ">=12", + "yarn": ">=1.22.18" + } }, "node_modules/@smithy/abort-controller": { "version": "2.2.0", @@ -3470,6 +3790,14 @@ "@types/node": "*" } }, + "node_modules/@types/busboy": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/busboy/-/busboy-1.5.4.tgz", + "integrity": "sha512-kG7WrUuAKK0NoyxfQHsVE6j1m01s6kMma64E+OZenQABMQyTJop1DumUWcLwAQ2JzpefU7PDYoRDKl8uZosFjw==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/caseless": { "version": "0.12.5", "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.5.tgz", @@ -3522,8 +3850,7 @@ "node_modules/@types/long": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==", - "optional": true + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" }, "node_modules/@types/mime": { "version": "1.3.5", @@ -3538,6 +3865,20 @@ "undici-types": "~5.26.4" } }, + "node_modules/@types/node-fetch": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==", + "dependencies": { + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "node_modules/@types/object-path": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/@types/object-path/-/object-path-0.11.4.tgz", + "integrity": "sha512-4tgJ1Z3elF/tOMpA8JLVuR9spt9Ynsf7+JjqsQ2IqtiPJtcLoHoXcT6qU4E10cPFqyXX5HDm9QwIzZhBSkLxsw==" + }, "node_modules/@types/qs": { "version": "6.9.13", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.13.tgz", @@ -3633,6 +3974,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "optional": true, "dependencies": { "event-target-shim": "^5.0.0" }, @@ -3847,7 +4189,6 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", - "optional": true, "dependencies": { "retry": "0.13.1" } @@ -3926,9 +4267,9 @@ "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" }, "node_modules/axios": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", - "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.1.tgz", + "integrity": "sha512-+LV37nQcd1EpFalkXksWNBiA17NZ5m5/WspmHGmZmdx1qBOg/VNq/c4eRJiA9VQQHBOs+N0ZhhdU10h2TyNK7Q==", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -4134,6 +4475,7 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, "funding": [ { "type": "github", @@ -4466,11 +4808,11 @@ } }, "node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.0.0.tgz", + "integrity": "sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA==", "engines": { - "node": ">=14" + "node": ">=18" } }, "node_modules/commondir": { @@ -4579,6 +4921,17 @@ "node": ">= 0.10" } }, + "node_modules/cross-inspect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cross-inspect/-/cross-inspect-1.0.0.tgz", + "integrity": "sha512-4PFfn4b5ZN6FMNGSZlyb7wUhuN8wvj8t/VQHZdM4JsDcruGJ8L2kf9zao98QIrBPFCpdk27qst/AGTl7pL3ypQ==", + "dependencies": { + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -4592,20 +4945,6 @@ "node": ">= 8" } }, - "node_modules/cross-undici-fetch": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/cross-undici-fetch/-/cross-undici-fetch-0.4.14.tgz", - "integrity": "sha512-CCep44A/baoO8kYJBIR1cRO/tRAk29xzb/tH3O85OtgwZGkL5I0tJZ47ccZdrnAJxrl5tlaYhAOx09fJXMcUqQ==", - "dependencies": { - "abort-controller": "^3.0.0", - "busboy": "^1.6.0", - "form-data-encoder": "^1.7.1", - "formdata-node": "^4.3.1", - "node-fetch": "^2.6.7", - "undici": "5.5.1", - "web-streams-polyfill": "^3.2.0" - } - }, "node_modules/crypto-js": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", @@ -4916,9 +5255,9 @@ } }, "node_modules/dset": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.2.tgz", - "integrity": "sha512-g/M9sqy3oHe477Ar4voQxWtaPIFw1jTdKZuomOjhCcBx9nHUNn0pu6NopuFFrTh/TRZIKEj+76vLWFu9BNKk+Q==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.3.tgz", + "integrity": "sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ==", "engines": { "node": ">=4" } @@ -5437,6 +5776,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "optional": true, "engines": { "node": ">=6" } @@ -5496,11 +5836,11 @@ } }, "node_modules/express-rate-limit": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.7.0.tgz", - "integrity": "sha512-vhwIdRoqcYB/72TK3tRZI+0ttS8Ytrk24GfmsxDXK9o9IhHNO5bXRiXQSExPQ4GbaE5tvIS7j1SGrxsuWs+sGA==", + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.11.2.tgz", + "integrity": "sha512-a7uwwfNTh1U60ssiIkuLFWHt4hAC5yxlLGU2VP0X4YNlyEDZAqF4tK3GD3NSitVBrCQmQ0++0uOyFOgC2y4DDw==", "engines": { - "node": ">= 12.9.0" + "node": ">= 14" }, "peerDependencies": { "express": "^4 || ^5" @@ -5898,31 +6238,6 @@ "node": ">= 6" } }, - "node_modules/form-data-encoder": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.9.0.tgz", - "integrity": "sha512-rahaRMkN8P8d/tgK/BLPX+WBVM27NbvdXBxqQujBtkDAIFspaRqN7Od7lfdGQA6KAD+f82fYCLBq1ipvcu8qLw==" - }, - "node_modules/formdata-node": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", - "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", - "dependencies": { - "node-domexception": "1.0.0", - "web-streams-polyfill": "4.0.0-beta.3" - }, - "engines": { - "node": ">= 12.20" - } - }, - "node_modules/formdata-node/node_modules/web-streams-polyfill": { - "version": "4.0.0-beta.3", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", - "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", - "engines": { - "node": ">= 14" - } - }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -5959,6 +6274,14 @@ } ] }, + "node_modules/fs-capacitor": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/fs-capacitor/-/fs-capacitor-6.2.0.tgz", + "integrity": "sha512-nKcE1UduoSKX27NSZlg879LdQc94OtbOsEmKMN2MBNudXREvijRKx2GEBsTMTfws+BrbkJoEuynbGSVRSpauvw==", + "engines": { + "node": ">=10" + } + }, "node_modules/fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", @@ -6441,6 +6764,39 @@ "graphql": "^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, + "node_modules/graphql-upload": { + "version": "15.0.2", + "resolved": "https://registry.npmjs.org/graphql-upload/-/graphql-upload-15.0.2.tgz", + "integrity": "sha512-ufJAkZJBKWRDD/4wJR3VZMy9QWTwqIYIciPtCEF5fCNgWF+V1p7uIgz+bP2YYLiS4OJBhCKR8rnqE/Wg3XPUiw==", + "dependencies": { + "@types/busboy": "^1.5.0", + "@types/node": "*", + "@types/object-path": "^0.11.1", + "busboy": "^1.6.0", + "fs-capacitor": "^6.2.0", + "http-errors": "^2.0.0", + "object-path": "^0.11.8" + }, + "engines": { + "node": "^14.17.0 || ^16.0.0 || >= 18.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/jaydenseric" + }, + "peerDependencies": { + "@types/express": "^4.0.29", + "@types/koa": "^2.11.4", + "graphql": "^16.3.0" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + }, + "@types/koa": { + "optional": true + } + } + }, "node_modules/gtoken": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz", @@ -7607,33 +7963,26 @@ "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" }, - "node_modules/ldap-filter": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/ldap-filter/-/ldap-filter-0.3.3.tgz", - "integrity": "sha512-/tFkx5WIn4HuO+6w9lsfxq4FN3O+fDZeO9Mek8dCD8rTUpqzRa766BOBO7BcGkn3X86m5+cBm1/2S/Shzz7gMg==", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/ldapjs": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/ldapjs/-/ldapjs-2.3.3.tgz", - "integrity": "sha512-75QiiLJV/PQqtpH+HGls44dXweviFwQ6SiIK27EqzKQ5jU/7UFrl2E5nLdQ3IYRBzJ/AVFJI66u0MZ0uofKYwg==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/ldapjs/-/ldapjs-3.0.7.tgz", + "integrity": "sha512-1ky+WrN+4CFMuoekUOv7Y1037XWdjKpu0xAPwSP+9KdvmV9PG+qOKlssDV6a+U32apwxdD3is/BZcWOYzN30cg==", + "deprecated": "This package has been decomissioned. See https://github.com/ldapjs/node-ldapjs/blob/8ffd0bc9c149088a10ec4c1ec6a18450f76ad05d/README.md", "dependencies": { - "abstract-logging": "^2.0.0", - "asn1": "^0.2.4", + "@ldapjs/asn1": "^2.0.0", + "@ldapjs/attribute": "^1.0.0", + "@ldapjs/change": "^1.0.0", + "@ldapjs/controls": "^2.1.0", + "@ldapjs/dn": "^1.1.0", + "@ldapjs/filter": "^2.1.1", + "@ldapjs/messages": "^1.3.0", + "@ldapjs/protocol": "^1.2.1", + "abstract-logging": "^2.0.1", "assert-plus": "^1.0.0", "backoff": "^2.5.0", - "ldap-filter": "^0.3.3", "once": "^1.4.0", - "vasync": "^2.2.0", - "verror": "^1.8.1" - }, - "engines": { - "node": ">=10.13.0" + "vasync": "^2.2.1", + "verror": "^1.10.1" } }, "node_modules/levn": { @@ -7711,6 +8060,11 @@ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==" + }, "node_modules/logform": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.0.tgz", @@ -7727,6 +8081,18 @@ "node": ">= 12.0.0" } }, + "node_modules/loglevel": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.1.tgz", + "integrity": "sha512-hP3I3kCrDIMuRwAwHltphhDM1r8i55H33GgqjXbrisuJhF4kRhW1dNuxsRklp4bXl8DSdLaNLuiL4A/LWRfxvg==", + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, "node_modules/long": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", @@ -7961,12 +8327,12 @@ } }, "node_modules/mongodb": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.5.0.tgz", - "integrity": "sha512-Fozq68InT+JKABGLqctgtb8P56pRrJFkbhW0ux+x1mdHeyinor8oNzJqwLjV/t5X5nJGfTlluxfyMnOXNggIUA==", + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.6.2.tgz", + "integrity": "sha512-ZF9Ugo2JCG/GfR7DEb4ypfyJJyiKbg5qBYKRintebj8+DNS33CyGMkWbrS9lara+u+h+yEOGSRiLhFO/g1s1aw==", "dependencies": { "@mongodb-js/saslprep": "^1.1.5", - "bson": "^6.4.0", + "bson": "^6.7.0", "mongodb-connection-string-url": "^3.0.0" }, "engines": { @@ -8060,26 +8426,11 @@ "mongodb-download-url": "bin/mongodb-download-url.js" } }, - "node_modules/mongodb-download-url/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/mongodb-download-url/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -8087,20 +8438,14 @@ "node": ">=10" } }, - "node_modules/mongodb-download-url/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/mongodb-runner": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/mongodb-runner/-/mongodb-runner-5.5.4.tgz", - "integrity": "sha512-BCENSrCixOoEOISh2bBUw+rUcnbAhntJdalvap9CRtsoqzEPzRz+KAIR+mh7PnQvU1fSfbRgB2e6+6x9OGCuPA==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/mongodb-runner/-/mongodb-runner-5.6.2.tgz", + "integrity": "sha512-6XF3iGXswbJy8TC4VgYPVxnrMiUTJ7iaehE+Hiox2sZL2y3b6aNKkrD3Rt2w6nO0JKnwlR/mukyXbMlz2Zmuvw==", "dev": true, "dependencies": { - "@mongodb-js/mongodb-downloader": "^0.2.10", - "@mongodb-js/saslprep": "^1.1.5", + "@mongodb-js/mongodb-downloader": "^0.3.2", + "@mongodb-js/saslprep": "^1.1.7", "debug": "^4.3.4", "mongodb": "^6.3.0", "mongodb-connection-string-url": "^3.0.0", @@ -8312,17 +8657,17 @@ } }, "node_modules/mongoose": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.3.3.tgz", - "integrity": "sha512-3kSk0db9DM2tLttCdS6WNRqewPleamFEa4Vz/Qldc0dB4Zow/FiZxb9GExHTJjBZQ9T2xiGleQ3GzRrES3hhsA==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.4.0.tgz", + "integrity": "sha512-fgqRMwVEP1qgRYfh+tUe2YBBFnPO35FIg2lfFH+w9IhRGg1/ataWGIqvf/MjwM29cZ60D5vSnqtN2b8Qp0sOZA==", "dependencies": { - "bson": "^6.5.0", + "bson": "^6.7.0", "kareem": "2.6.3", - "mongodb": "6.5.0", + "mongodb": "6.6.2", "mpath": "0.9.0", "mquery": "5.0.0", "ms": "2.1.3", - "sift": "16.0.1" + "sift": "17.1.3" }, "engines": { "node": ">=16.20.1" @@ -8429,23 +8774,10 @@ "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], - "engines": { - "node": ">=10.5.0" - } + "node_modules/node-abort-controller": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", + "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==" }, "node_modules/node-fetch": { "version": "2.6.11", @@ -8781,6 +9113,14 @@ "node": ">= 0.4" } }, + "node_modules/object-path": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.8.tgz", + "integrity": "sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA==", + "engines": { + "node": ">= 10.12.0" + } + }, "node_modules/object.assign": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", @@ -8938,9 +9278,9 @@ } }, "node_modules/parse": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/parse/-/parse-5.0.0.tgz", - "integrity": "sha512-6gOARZWiHjmGusbTskhC1qlRn527olMEsdt2LLj9cP2GY3n4VFOwFwV8z/vm2+YfzPfPcv8z7qLih1NzmqzO0g==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse/-/parse-5.1.0.tgz", + "integrity": "sha512-46gVRe1JHsh21Ht0/Ko6PeMDl6wELLMYxnZPFD6iZm2EWsWnzi2txNGE6PvnIv+G7yOufZIOD0BCZLYOFl3toA==", "dependencies": { "@babel/runtime-corejs3": "7.23.2", "idb-keyval": "6.2.1", @@ -9185,52 +9525,53 @@ } }, "node_modules/parse-server": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/parse-server/-/parse-server-6.5.5.tgz", - "integrity": "sha512-VQl/J0dc72VsTRkat5GkeZxS6FCEjvjee2yhNzMolDwjyMiEMkCqodJ2mUBnD+SfnG59NV9lSF/EiXsAnd8fZg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse-server/-/parse-server-7.0.0.tgz", + "integrity": "sha512-dlm+bTiDGBbHsezbRO3QJ7ZLX8L7PlbUv921Te6j6rsUAjztt4/JmpPdajt4GWJkIK2KINh1XiP+JKUmPHCmmA==", "hasInstallScript": true, "dependencies": { + "@apollo/server": "4.10.1", "@babel/eslint-parser": "7.21.8", "@graphql-tools/merge": "8.4.1", - "@graphql-tools/schema": "9.0.4", + "@graphql-tools/schema": "10.0.3", "@graphql-tools/utils": "8.12.0", - "@graphql-yoga/node": "2.6.0", "@parse/fs-files-adapter": "2.0.1", "@parse/push-adapter": "5.1.1", "bcryptjs": "2.4.3", "body-parser": "1.20.2", - "commander": "10.0.1", + "commander": "12.0.0", "cors": "2.8.5", "deepcopy": "2.1.0", "express": "4.18.2", - "express-rate-limit": "6.7.0", + "express-rate-limit": "6.11.2", "follow-redirects": "1.15.6", "graphql": "16.8.1", "graphql-list-fields": "2.0.4", "graphql-relay": "0.10.0", "graphql-tag": "2.12.6", + "graphql-upload": "15.0.2", "intersect": "1.0.1", "jsonwebtoken": "9.0.0", "jwks-rsa": "3.1.0", - "ldapjs": "2.3.3", + "ldapjs": "3.0.7", "lodash": "4.17.21", "lru-cache": "10.1.0", "mime": "3.0.0", - "mongodb": "4.10.0", + "mongodb": "5.9.0", "mustache": "4.2.0", "otpauth": "9.2.2", - "parse": "4.1.0", + "parse": "5.0.0", "path-to-regexp": "6.2.1", "pg-monitor": "2.0.0", "pg-promise": "11.5.4", "pluralize": "8.0.0", "rate-limit-redis": "3.0.2", "redis": "4.6.13", - "semver": "7.5.4", + "semver": "7.6.0", "subscriptions-transport-ws": "0.11.0", "tv4": "1.3.0", "uuid": "9.0.1", - "winston": "3.11.0", + "winston": "3.12.0", "winston-daily-rotate-file": "5.0.0", "ws": "8.16.0" }, @@ -9238,7 +9579,7 @@ "parse-server": "bin/parse-server" }, "engines": { - "node": ">=14.21.0 <17 || >=18 <19" + "node": ">=18.0.0 <21" }, "funding": { "type": "opencollective", @@ -9259,21 +9600,6 @@ "node": ">=12" } }, - "node_modules/parse-server-fs-adapter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-server-fs-adapter/-/parse-server-fs-adapter-1.0.1.tgz", - "integrity": "sha512-5IRKAT2QkzHrYrBESY4E8jsV1sl+XVBTKGyUvBPgBR2QzsTTqiyU/lFZD8PAJavA+TH1BLyLTUMZbhZhswNVbQ==", - "deprecated": "use @parse/fs-files-adapter" - }, - "node_modules/parse-server-s3-adapter": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parse-server-s3-adapter/-/parse-server-s3-adapter-1.2.0.tgz", - "integrity": "sha512-a2k11jc8JOsWESVqi1Fm9zxNJzwKmwFCLgGqUbEKqe0XuT0e/6tlsUBqPNDAVwGZQEyF+MgCWZKyIsIA0EaKdA==", - "deprecated": "use @parse/s3-files-adapter", - "dependencies": { - "aws-sdk": "^2.59.0" - } - }, "node_modules/parse-server/node_modules/@babel/eslint-parser": { "version": "7.21.8", "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.21.8.tgz", @@ -9299,18 +9625,6 @@ "semver": "bin/semver.js" } }, - "node_modules/parse-server/node_modules/@babel/runtime-corejs3": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.21.0.tgz", - "integrity": "sha512-TDD4UJzos3JJtM+tHX+w2Uc+KWj7GV+VKKFdMVd2Rx8sdA19hcc3P3AHFYd5LVOw+pYuSd5lICC3gm52B6Rwxw==", - "dependencies": { - "core-js-pure": "^3.25.1", - "regenerator-runtime": "^0.13.11" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/parse-server/node_modules/@graphql-tools/merge": { "version": "8.4.1", "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-8.4.1.tgz", @@ -9335,17 +9649,25 @@ "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, + "node_modules/parse-server/node_modules/@parse/fs-files-adapter": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@parse/fs-files-adapter/-/fs-files-adapter-2.0.1.tgz", + "integrity": "sha512-9DY0T9lK73Ysw+wxxsBt9rpxWxJpMlHl/fTW175XSajusW0ZP5jERI3BTKeclV28eVmSU690EO2vnwCURsPZ7g==" + }, "node_modules/parse-server/node_modules/bson": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.2.tgz", - "integrity": "sha512-Ry9wCtIZ5kGqkJoi6aD8KjxFZEx78guTQDnpXWiNthsxzrxAK/i8E6pCHAIZTbaEFWcOCvbecMukfK7XUvyLpQ==", - "dependencies": { - "buffer": "^5.6.0" - }, + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/bson/-/bson-5.5.1.tgz", + "integrity": "sha512-ix0EwukN2EpC0SRWIj/7B5+A6uQMQy6KMREI9qQqvgpkV2frH63T0UDVd1SYedL6dNCmDBYB3QtXi4ISk9YT+g==", "engines": { - "node": ">=6.9.0" + "node": ">=14.20.1" } }, + "node_modules/parse-server/node_modules/crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", + "optional": true + }, "node_modules/parse-server/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -9354,14 +9676,6 @@ "ms": "2.0.0" } }, - "node_modules/parse-server/node_modules/denque": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", - "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", - "engines": { - "node": ">=0.10" - } - }, "node_modules/parse-server/node_modules/express": { "version": "4.18.2", "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", @@ -9431,14 +9745,6 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, - "node_modules/parse-server/node_modules/idb-keyval": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.2.0.tgz", - "integrity": "sha512-uw+MIyQn2jl3+hroD7hF8J7PUviBU7BPKWw4f/ISf32D4LoGu98yHjrzWWJDASu9QNrX10tCJqk9YY0ClWm8Ng==", - "dependencies": { - "safari-14-idb-fix": "^3.0.0" - } - }, "node_modules/parse-server/node_modules/lru-cache": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", @@ -9448,20 +9754,43 @@ } }, "node_modules/parse-server/node_modules/mongodb": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.10.0.tgz", - "integrity": "sha512-My2QxLTw0Cc1O9gih0mz4mqo145Jq4rLAQx0Glk/Ha9iYBzYpt4I2QFNRIh35uNFNfe8KFQcdwY1/HKxXBkinw==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-5.9.0.tgz", + "integrity": "sha512-g+GCMHN1CoRUA+wb1Agv0TI4YTSiWr42B5ulkiAfLLHitGK1R+PkSAf3Lr5rPZwi/3F04LiaZEW0Kxro9Fi2TA==", "dependencies": { - "bson": "^4.7.0", - "denque": "^2.1.0", - "mongodb-connection-string-url": "^2.5.3", - "socks": "^2.7.0" + "bson": "^5.5.0", + "mongodb-connection-string-url": "^2.6.0", + "socks": "^2.7.1" }, "engines": { - "node": ">=12.9.0" + "node": ">=14.20.1" }, "optionalDependencies": { - "saslprep": "^1.0.3" + "@mongodb-js/saslprep": "^1.1.0" + }, + "peerDependencies": { + "@aws-sdk/credential-providers": "^3.188.0", + "@mongodb-js/zstd": "^1.0.0", + "kerberos": "^1.0.0 || ^2.0.0", + "mongodb-client-encryption": ">=2.3.0 <3", + "snappy": "^7.2.2" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-providers": { + "optional": true + }, + "@mongodb-js/zstd": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "snappy": { + "optional": true + } } }, "node_modules/parse-server/node_modules/ms": { @@ -9470,50 +9799,22 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/parse-server/node_modules/parse": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/parse/-/parse-4.1.0.tgz", - "integrity": "sha512-s0Ti+nWrKWj9DlFcmkEE05fGwa/K5ycZSdqCz01F8YL7Hevqv4WLXAmYGOwzq5UJSZ005seKgb20KwVwLdy/Zg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse/-/parse-5.0.0.tgz", + "integrity": "sha512-6gOARZWiHjmGusbTskhC1qlRn527olMEsdt2LLj9cP2GY3n4VFOwFwV8z/vm2+YfzPfPcv8z7qLih1NzmqzO0g==", "dependencies": { - "@babel/runtime-corejs3": "7.21.0", - "idb-keyval": "6.2.0", + "@babel/runtime-corejs3": "7.23.2", + "idb-keyval": "6.2.1", "react-native-crypto-js": "1.0.0", - "uuid": "9.0.0", - "ws": "8.12.0", + "uuid": "9.0.1", + "ws": "8.16.0", "xmlhttprequest": "1.8.0" }, "engines": { - "node": ">=14.21.0 <17 || >=18 <20" + "node": ">=18 <21" }, "optionalDependencies": { - "crypto-js": "4.1.1" - } - }, - "node_modules/parse-server/node_modules/parse/node_modules/uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/parse-server/node_modules/parse/node_modules/ws": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.0.tgz", - "integrity": "sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "crypto-js": "4.2.0" } }, "node_modules/parse-server/node_modules/path-to-regexp": { @@ -9536,9 +9837,9 @@ } }, "node_modules/parse-server/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -10075,6 +10376,11 @@ "node": ">=8" } }, + "node_modules/process-warning": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-2.3.2.tgz", + "integrity": "sha512-n9wh8tvBe5sFmsqlg+XQhaQLumwpqoAUruLwjCopgTmUBjJ/fjtBsJzKleCaIGBOMXYEhp1YfKl4d7rJ5ZKJGA==" + }, "node_modules/proto3-json-serializer": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-2.0.1.tgz", @@ -10401,7 +10707,6 @@ "version": "0.13.1", "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "optional": true, "engines": { "node": ">= 4" } @@ -10512,18 +10817,6 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, - "node_modules/saslprep": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", - "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", - "optional": true, - "dependencies": { - "sparse-bitfield": "^3.0.3" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/sax": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", @@ -10632,6 +10925,18 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -10665,9 +10970,9 @@ } }, "node_modules/sift": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz", - "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==" + "version": "17.1.3", + "resolved": "https://registry.npmjs.org/sift/-/sift-17.1.3.tgz", + "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==" }, "node_modules/signal-exit": { "version": "3.0.7", @@ -11432,14 +11737,6 @@ "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", "dev": true }, - "node_modules/undici": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.5.1.tgz", - "integrity": "sha512-MEvryPLf18HvlCbLSzCW0U00IMftKGI5udnjrQbC5D4P0Hodwffhv+iGfWuJwg16Y/TK11ZFK8i+BPVW2z/eAw==", - "engines": { - "node": ">=12.18" - } - }, "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", @@ -11571,9 +11868,9 @@ } }, "node_modules/value-or-promise": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/value-or-promise/-/value-or-promise-1.0.11.tgz", - "integrity": "sha512-41BrgH+dIbCFXClcSapVs5M6GkENd3gQOJpEfPDNa71LsUGMXDL0jMWpI/Rh7WhX+Aalfz2TTS3Zt5pUsbnhLg==", + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/value-or-promise/-/value-or-promise-1.0.12.tgz", + "integrity": "sha512-Z6Uz+TYwEqE7ZN50gwn+1LCVo9ZVrpxRPOhOLnncYkY1ZzOYtrX8Fwf/rFktZ8R5mJms6EZf5TqNOMeZmnPq9Q==", "engines": { "node": ">=12" } @@ -11633,14 +11930,6 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" }, - "node_modules/web-streams-polyfill": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", - "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", - "engines": { - "node": ">= 8" - } - }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -11667,6 +11956,14 @@ "node": ">=0.8.0" } }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "engines": { + "node": ">=12" + } + }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", @@ -11753,9 +12050,9 @@ } }, "node_modules/winston": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.11.0.tgz", - "integrity": "sha512-L3yR6/MzZAOl0DsysUXHVjOwv8mKZ71TrA/41EIduGpOOV5LQVodqN+QdQ6BS6PJ/RdIshZhq84P/fStEZkk7g==", + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.12.0.tgz", + "integrity": "sha512-OwbxKaOlESDi01mC9rkM0dQqQt2I8DAUMRLZ/HpbwvDXm85IryEHgoogy5fziQy38PntgZsLlhAYHz//UPHZ5w==", "dependencies": { "@colors/colors": "^1.6.0", "@dabh/diagnostics": "^2.0.2", @@ -11767,7 +12064,7 @@ "safe-stable-stringify": "^2.3.1", "stack-trace": "0.0.x", "triple-beam": "^1.3.0", - "winston-transport": "^4.5.0" + "winston-transport": "^4.7.0" }, "engines": { "node": ">= 12.0.0" diff --git a/apps/OpenSignServer/package.json b/apps/OpenSignServer/package.json index e1546c204..4d07bbda0 100644 --- a/apps/OpenSignServer/package.json +++ b/apps/OpenSignServer/package.json @@ -18,9 +18,13 @@ "watch": "nodemon index.js" }, "dependencies": { + "@parse/fs-files-adapter": "^3.0.0", "@parse/s3-files-adapter": "^2.2.0", + "@signpdf/placeholder-pdf-lib": "^3.2.4", + "@signpdf/signer-p12": "^3.2.4", + "@signpdf/signpdf": "^3.2.4", "aws-sdk": "^2.1581.0", - "axios": "^1.6.8", + "axios": "^1.7.1", "cors": "^2.8.5", "dotenv": "^16.4.5", "express": "^4.19.2", @@ -30,28 +34,26 @@ "googleapis": "^134.0.0", "jsonschema": "^1.4.1", "mailgun.js": "^10.2.1", - "mongoose": "^8.3.3", + "mongoose": "^8.4.0", "multer": "^1.4.5-lts.1", "multer-s3": "^3.0.1", "node-forge": "^1.3.1", "node-signpdf": "^1.5.1", "nodemailer": "^6.9.13", - "parse": "^5.0.0", + "parse": "^5.1.0", "parse-dbtool": "^1.2.0", - "parse-server": "^6.5.5", + "parse-server": "^7.0.0", "parse-server-api-mail-adapter": "^3.1.1", - "parse-server-fs-adapter": "^1.0.1", - "parse-server-s3-adapter": "^1.2.0", "pdf-lib": "^1.17.1", "pdfkit": "^0.14.0", "posthog-node": "^3.6.3" }, "type": "module", "devDependencies": { - "@babel/eslint-parser": "^7.23.10", + "@babel/eslint-parser": "^7.24.5", "eslint": "^8.57.0", "jasmine": "^5.1.0", - "mongodb-runner": "^5.5.4", + "mongodb-runner": "^5.6.2", "nodemon": "^3.1.0", "nyc": "15.1.0", "prettier": "^3.2.5", From 22d064fd38e2b5ee736b3132b4832ceb57c5d2ea Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <prafull.navkar@nxglabs.com> Date: Tue, 21 May 2024 13:49:10 +0530 Subject: [PATCH 019/106] build(dep): update node-signpdf pacakge and it's dependencies, remove customsignpdf folder --- .../cloud/parsefunction/pdf/PDF.min.js | 195 +++++++++--------- .../customSignPdf/PDFAbstractReference.min.js | 1 - .../customSignPdf/PDFKitReferenceMock.min.js | 1 - .../pdf/customSignPdf/SignPdfError.min.js | 20 -- .../pdf/customSignPdf/const.min.js | 1 - .../createBufferPageWithAnnotation.min.js | 3 - .../createBufferRootWithAcroform.min.js | 3 - .../customSignPdf/createBufferTrailer.min.js | 8 - .../pdf/customSignPdf/findObject.min.js | 1 - .../pdf/customSignPdf/getIndexFromRef.min.js | 1 - .../pdf/customSignPdf/getPageRef.min.js | 1 - .../getPagesDictionaryRef.min.js | 1 - .../pdf/customSignPdf/pdfObject.min.js | 1 - .../customSignPdf/pdfkitAddPlaceholder.min.js | 28 --- .../customSignPdf/pdflibplaceholder.min.js | 87 -------- .../pdf/customSignPdf/plainplaceholder.min.js | 2 - .../pdf/customSignPdf/readPdf.min.js | 1 - .../pdf/customSignPdf/readRefTable.min.js | 1 - .../removeTrailingNewLine.min.js | 1 - .../pdf/customSignPdf/xrefToRefMap.min.js | 1 - 20 files changed, 103 insertions(+), 255 deletions(-) delete mode 100644 apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/PDFAbstractReference.min.js delete mode 100644 apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/PDFKitReferenceMock.min.js delete mode 100644 apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/SignPdfError.min.js delete mode 100644 apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/const.min.js delete mode 100644 apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/createBufferPageWithAnnotation.min.js delete mode 100644 apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/createBufferRootWithAcroform.min.js delete mode 100644 apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/createBufferTrailer.min.js delete mode 100644 apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/findObject.min.js delete mode 100644 apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/getIndexFromRef.min.js delete mode 100644 apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/getPageRef.min.js delete mode 100644 apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/getPagesDictionaryRef.min.js delete mode 100644 apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/pdfObject.min.js delete mode 100644 apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/pdfkitAddPlaceholder.min.js delete mode 100644 apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/pdflibplaceholder.min.js delete mode 100644 apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/plainplaceholder.min.js delete mode 100644 apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/readPdf.min.js delete mode 100644 apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/readRefTable.min.js delete mode 100644 apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/removeTrailingNewLine.min.js delete mode 100644 apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/xrefToRefMap.min.js diff --git a/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.min.js b/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.min.js index f7866d420..d29c624c9 100644 --- a/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.min.js +++ b/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.min.js @@ -1,13 +1,16 @@ -import SignPDF from './SignPDF.min.cjs'; import fs from 'node:fs'; import axios from 'axios'; -import { pdflibAddPlaceholder } from './customSignPdf/pdflibplaceholder.min.js'; +import { SignPdf } from '@signpdf/signpdf'; +import { P12Signer } from '@signpdf/signer-p12'; +import { pdflibAddPlaceholder } from '@signpdf/placeholder-pdf-lib'; import { PDFDocument } from 'pdf-lib'; import { replaceMailVaribles, saveFileUsage } from '../../../Utils.js'; import GenerateCertificate from './GenerateCertificate.js'; const serverUrl = process.env.SERVER_URL, APPID = process.env.APP_ID, - masterKEY = process.env.MASTER_KEY; + masterKEY = process.env.MASTER_KEY, + eSignName = 'opensign', + eSigncontact = 'hello@opensignlabs.com'; async function uploadFile(e, t) { try { var a = fs.readFileSync(t), @@ -18,23 +21,23 @@ async function uploadFile(e, t) { console.log('Err ', e), fs.unlinkSync(t); } } -async function updateDoc(a, r, i, s, o, n, l) { +async function updateDoc(a, r, i, n, s, o, l) { try { var c, d, p = { - UserPtr: { __type: 'Pointer', className: n, objectId: i }, + UserPtr: { __type: 'Pointer', className: o, objectId: i }, SignedUrl: r, Activity: 'Signed', - ipAddress: s, + ipAddress: n, SignedOn: new Date(), Signature: l, }; let e; var m = (e = - o.AuditTrail && 0 < o.AuditTrail.length + s.AuditTrail && 0 < s.AuditTrail.length ? (-1 !== - (d = (c = JSON.parse(JSON.stringify(o.AuditTrail))).findIndex( + (d = (c = JSON.parse(JSON.stringify(s.AuditTrail))).findIndex( e => e.UserPtr.objectId === i && 'Created' !== e.Activity )) ? (c[d] = { ...c[d], ...p }) @@ -42,7 +45,7 @@ async function updateDoc(a, r, i, s, o, n, l) { c) : [p]).filter(e => 'Signed' === e.Activity); let t = !1; - !((o.Signers && 0 < o.Signers.length && m.length !== o.Signers.length) || !(t = !0)); + !((s.Signers && 0 < s.Signers.length && m.length !== s.Signers.length) || !(t = !0)); var g = { SignedUrl: r, AuditTrail: e, IsCompleted: t }; await axios.put(serverUrl + '/classes/contracts_Document/' + a, g, { headers: { @@ -61,9 +64,9 @@ async function sendCompletedMail(e) { a = e.doc, r = e.doc.ExtUserPtr, i = a.Name, - s = r.Email; - let o = `Document "${i}" has been signed by all parties`, - n = + n = r.Email; + let s = `Document "${i}" has been signed by all parties`, + o = "<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8' /></head><body> <div style='background-color:#f5f5f5;padding:20px'> <div style='box-shadow: rgba(0, 0, 0, 0.1) 0px 4px 12px;background-color:white;'> <div><img src=https://qikinnovation.ams3.digitaloceanspaces.com/logo.png height='50' style='padding:20px'/> </div><div style='padding:2px;font-family:system-ui; background-color: #47a3ad;'> <p style='font-size:20px;font-weight:400;color:white;padding-left:20px',> Document signed successfully</p></div><div><p style='padding:20px;font-family:system-ui;font-size:14px'>All parties have successfully signed the document " + `<b>"${i}"</b>` + '. Kindly download the document from the attachment.</p></div> </div><div><p>This is an automated email from OpenSign™. For any queries regarding this email, please contact the sender ' + @@ -80,8 +83,8 @@ async function sendCompletedMail(e) { g.equalTo('UserId', { __type: 'Pointer', className: '_User', objectId: r.UserId.objectId }); const f = await g.first(); f && - ((l = JSON.parse(JSON.stringify(f)))?.CompletionSubject && (o = l?.CompletionSubject), - l?.CompletionBody && (n = l?.CompletionBody), + ((l = JSON.parse(JSON.stringify(f)))?.CompletionSubject && (s = l?.CompletionSubject), + l?.CompletionBody && (o = l?.CompletionBody), (c = a.ExpiryDate.iso), (d = new Date(c).toLocaleDateString('en-US', { day: 'numeric', @@ -99,9 +102,9 @@ async function sendCompletedMail(e) { expiry_date: d, company_name: r.Company, }), - (m = replaceMailVaribles(o, n, p)), - (o = m.subject), - (n = m.body)); + (m = replaceMailVaribles(s, o, p)), + (s = m.subject), + (o = m.body)); } catch (e) { console.log('error in fetch tenant in signpdf', e.message); } @@ -109,10 +112,10 @@ async function sendCompletedMail(e) { extUserId: r.objectId, url: t, from: 'OpenSign™', - recipient: s, - subject: o, + recipient: n, + subject: s, pdfName: i, - html: n, + html: o, mailProvider: e.mailProvider, }; await axios.post(serverUrl + '/functions/sendmailv3', g, { @@ -124,8 +127,8 @@ async function sendCompletedMail(e) { }); } async function sendDoctoWebhook(a, e, t, r, i) { - let s = []; - (s = r + let n = []; + (n = r ? { name: r?.Name, email: r?.Email, phone: r?.Phone } : a?.Signers?.map(e => ({ name: e.Name, email: e.Email, phone: e.Phone })) || [ { name: a?.ExtUserPtr?.Name, email: a?.ExtUserPtr?.Email, phone: a?.ExtUserPtr?.Phone }, @@ -133,8 +136,8 @@ async function sendDoctoWebhook(a, e, t, r, i) { a.ExtUserPtr?.Webhook && ((r = 'signed' === t - ? { signer: s, signedAt: new Date() } - : { signers: s, completedAt: new Date() }), + ? { signer: n, signedAt: new Date() } + : { signers: n, completedAt: new Date() }), (t = { event: t, objectId: a?.objectId, @@ -178,24 +181,27 @@ async function sendDoctoWebhook(a, e, t, r, i) { } })); } -const sendMailsaveCertifcate = async (e, t, a, r, i, s) => { - var o = await GenerateCertificate(e), - o = await PDFDocument.load(o), - o = +const sendMailsaveCertifcate = async (e, t, a, r, i, n) => { + var s = await GenerateCertificate(e), + s = await PDFDocument.load(s), + t = new P12Signer(t, { passphrase: process.env.PASS_PHRASE || null }), + s = (pdflibAddPlaceholder({ - pdfDoc: o, + pdfDoc: s, reason: 'Digitally signed by OpenSign.', location: 'n/a', + name: eSignName, + contactInfo: eSigncontact, signatureLength: 15e3, }), - await o.save()), - o = Buffer.from(o), - t = await new SignPDF(o, t).signPDF(), + await s.save()), + s = Buffer.from(s), + t = await new SignPdf().sign(s, t), t = (fs.writeFileSync('./exports/certificate.pdf', t), await uploadFile('certificate.pdf', './exports/certificate.pdf')), - n = { CertificateUrl: t.imageUrl }; - await axios.put(serverUrl + '/classes/contracts_Document/' + e.objectId, n, { + o = { CertificateUrl: t.imageUrl }; + await axios.put(serverUrl + '/classes/contracts_Document/' + e.objectId, o, { headers: { 'Content-Type': 'application/json', 'X-Parse-Application-Id': APPID, @@ -205,20 +211,20 @@ const sendMailsaveCertifcate = async (e, t, a, r, i, s) => { e.IsSendMail && !1 === e.IsSendMail ? console.log("don't send mail") : sendCompletedMail({ url: a, isCustomMail: r, doc: e, mailProvider: i }), - saveFileUsage(o.length, t.imageUrl, s), + saveFileUsage(s.length, t.imageUrl, n), sendDoctoWebhook(e, a, 'completed', '', t.imageUrl); }; -async function PDF(o) { +async function PDF(s) { try { - if (!o?.user) + if (!s?.user) throw new Parse.Error(Parse.Error.INVALID_SESSION_TOKEN, 'User is not authenticated.'); { - var n = o?.user?.toJSON(), - e = o.params.docId; - const F = o.params.userId; - var l = o.params.isCustomCompletionMail || !1, - c = o.params.mailProvider || '', - d = o.params.signature || '', + var o = s?.user?.toJSON(), + e = s.params.docId; + const C = s.params.userId; + var l = s.params.isCustomCompletionMail || !1, + c = s.params.mailProvider || '', + d = s.params.signature || '', t = new Parse.Query('contracts_Document'), a = (t.include('ExtUserPtr,Signers'), @@ -227,95 +233,100 @@ async function PDF(o) { if (!a) throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Document not found.'); var r, p = a?.toJSON(); - let i, s; - F - ? ((r = p.Signers.find(e => e.objectId === F)), + let i, n; + C + ? ((r = p.Signers.find(e => e.objectId === C)), console.log('_contractUser ', r), - r && ((i = r), (s = 'contracts_Contactbook'))) - : ((s = 'contracts_Users'), (i = p.ExtUserPtr)); + r && ((i = r), (n = 'contracts_Contactbook'))) + : ((n = 'contracts_Users'), (i = p.ExtUserPtr)); var m, g = i.Name, f = i.Email; - if (!o.params.pdfFile) throw (((m = new Error('Pdf file not present!')).code = 400), m); + if (!s.params.pdfFile) throw (((m = new Error('Pdf file not present!')).code = 400), m); { - let e = Buffer.from(o.params.pdfFile, 'base64'); + let e = Buffer.from(s.params.pdfFile, 'base64'); var u = process.env.PFX_BASE64, h = Buffer.from(u, 'base64'), - y = { - UserPtr: { __type: 'Pointer', className: s, objectId: i.objectId }, + y = new P12Signer(h, { passphrase: process.env.PASS_PHRASE || null }), + P = { + UserPtr: { __type: 'Pointer', className: n, objectId: i.objectId }, SignedUrl: '', Activity: 'Signed', - ipAddress: o.headers['x-real-ip'], + ipAddress: s.headers['x-real-ip'], }; let t; - var P = (t = p.AuditTrail && 0 < p.AuditTrail.length ? [...p.AuditTrail, y] : [y]).filter( + var v = (t = p.AuditTrail && 0 < p.AuditTrail.length ? [...p.AuditTrail, P] : [P]).filter( e => 'Signed' === e.Activity ); let a = !1; - !((p.Signers && 0 < p.Signers.length && P.length !== p.Signers.length) || !(a = !0)); - var v, + !((p.Signers && 0 < p.Signers.length && v.length !== p.Signers.length) || !(a = !0)); + var S, b, - S, w, U, - D, - I = `exported_file_${Math.floor(5e3 * Math.random())}.pdf`, - _ = './exports/' + I; + I, + _, + E = `exported_file_${Math.floor(5e3 * Math.random())}.pdf`, + D = './exports/' + E; let r = e.length; r = ( a - ? ((v = p.Signers?.map(e => e.Name + ' <' + e.Email + '>')), + ? ((S = p.Signers?.map(e => e.Name + ' <' + e.Email + '>')), (e = - v && 0 < v.length + S && 0 < S.length ? ((b = await PDFDocument.load(e)), pdflibAddPlaceholder({ pdfDoc: b, - reason: 'Digitally signed by OpenSign for ' + v?.join(', '), + reason: 'Digitally signed by OpenSign for ' + S?.join(', '), location: 'n/a', + name: eSignName, + contactInfo: eSigncontact, signatureLength: 15e3, }), - (S = await b.save()), - Buffer.from(S)) - : ((w = await PDFDocument.load(e)), + (w = await b.save()), + Buffer.from(w)) + : ((U = await PDFDocument.load(e)), pdflibAddPlaceholder({ - pdfDoc: w, + pdfDoc: U, reason: 'Digitally signed by OpenSign for ' + g + ' <' + f + '>', location: 'n/a', + name: eSignName, + contactInfo: eSigncontact, signatureLength: 15e3, }), - (U = await w.save()), - Buffer.from(U))), - (D = await new SignPDF(e, h).signPDF()), - fs.writeFileSync(_, D), - D) - : (fs.writeFileSync(_, e), e) + (I = await U.save()), + Buffer.from(I))), + (_ = await new SignPdf().sign(e, y)), + fs.writeFileSync(D, _), + _) + : (fs.writeFileSync(D, e), e) ).length; - var E = await uploadFile(I, _); - if (E && E.imageUrl) { + var A = await uploadFile(E, D); + if (A && A.imageUrl) { var x, - A, - j = await updateDoc( - o.params.docId, - E.imageUrl, + j, + N = await updateDoc( + s.params.docId, + A.imageUrl, i.objectId, - o.headers['x-real-ip'], + s.headers['x-real-ip'], p, - s, + n, d ); if ( - (sendDoctoWebhook(p, E.imageUrl, 'signed', i), - saveFileUsage(r, E.imageUrl, n.objectId), - j && - j.isCompleted && - ((x = { ...p, AuditTrail: j.AuditTrail }), - sendMailsaveCertifcate(x, h, E.imageUrl, l, c, n.objectId)), - fs.unlinkSync(_), - console.log('New Signed PDF created called: ' + _), - 'success' === j.message) + (sendDoctoWebhook(p, A.imageUrl, 'signed', i), + saveFileUsage(r, A.imageUrl, o.objectId), + N && + N.isCompleted && + ((x = { ...p, AuditTrail: N.AuditTrail }), + sendMailsaveCertifcate(x, h, A.imageUrl, l, c, o.objectId)), + fs.unlinkSync(D), + console.log('New Signed PDF created called: ' + D), + 'success' === N.message) ) - return { status: 'success', data: E.imageUrl }; - throw (((A = new Error('Please provide required parameters!')).code = 400), A); + return { status: 'success', data: A.imageUrl }; + throw (((j = new Error('Please provide required parameters!')).code = 400), j); } } } diff --git a/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/PDFAbstractReference.min.js b/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/PDFAbstractReference.min.js deleted file mode 100644 index bcbe3e4f2..000000000 --- a/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/PDFAbstractReference.min.js +++ /dev/null @@ -1 +0,0 @@ -class PDFAbstractReference{toString(){throw new Error("Must be implemented by subclasses")}}export default PDFAbstractReference; \ No newline at end of file diff --git a/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/PDFKitReferenceMock.min.js b/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/PDFKitReferenceMock.min.js deleted file mode 100644 index 0fe5059f5..000000000 --- a/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/PDFKitReferenceMock.min.js +++ /dev/null @@ -1 +0,0 @@ -import PDFAbstractReference from"./PDFAbstractReference.min.js";class PDFKitReferenceMock extends PDFAbstractReference{constructor(e,t=void 0){super(),this.index=e,void 0!==t&&Object.assign(this,t)}toString(){return this.index+" 0 R"}}export default PDFKitReferenceMock; \ No newline at end of file diff --git a/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/SignPdfError.min.js b/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/SignPdfError.min.js deleted file mode 100644 index 4557aca9f..000000000 --- a/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/SignPdfError.min.js +++ /dev/null @@ -1,20 +0,0 @@ -const ERROR_TYPE_UNKNOWN = 1, - ERROR_TYPE_INPUT = 2, - ERROR_TYPE_PARSE = 3, - ERROR_VERIFY_SIGNATURE = 4; -class SignPdfError extends Error { - constructor(R, E = ERROR_TYPE_UNKNOWN) { - super(R), (this.type = E); - } -} -(SignPdfError.TYPE_UNKNOWN = ERROR_TYPE_UNKNOWN), - (SignPdfError.TYPE_INPUT = ERROR_TYPE_INPUT), - (SignPdfError.TYPE_PARSE = ERROR_TYPE_PARSE), - (SignPdfError.VERIFY_SIGNATURE = ERROR_VERIFY_SIGNATURE); -export { - ERROR_TYPE_UNKNOWN, - ERROR_TYPE_INPUT, - ERROR_TYPE_PARSE, - ERROR_VERIFY_SIGNATURE, - SignPdfError, -}; diff --git a/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/const.min.js b/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/const.min.js deleted file mode 100644 index 7018f09c4..000000000 --- a/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/const.min.js +++ /dev/null @@ -1 +0,0 @@ -const DEFAULT_SIGNATURE_LENGTH=8192,DEFAULT_BYTE_RANGE_PLACEHOLDER="**********",SUBFILTER_ADOBE_PKCS7_DETACHED="adbe.pkcs7.detached",SUBFILTER_ADOBE_PKCS7_SHA1="adbe.pkcs7.sha1",SUBFILTER_ADOBE_X509_SHA1="adbe.x509.rsa.sha1",SUBFILTER_ETSI_CADES_DETACHED="ETSI.CAdES.detached";export{DEFAULT_SIGNATURE_LENGTH,DEFAULT_BYTE_RANGE_PLACEHOLDER,SUBFILTER_ADOBE_PKCS7_DETACHED,SUBFILTER_ADOBE_PKCS7_SHA1,SUBFILTER_ADOBE_X509_SHA1,SUBFILTER_ETSI_CADES_DETACHED}; \ No newline at end of file diff --git a/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/createBufferPageWithAnnotation.min.js b/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/createBufferPageWithAnnotation.min.js deleted file mode 100644 index ea4856403..000000000 --- a/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/createBufferPageWithAnnotation.min.js +++ /dev/null @@ -1,3 +0,0 @@ -import findObject from"./findObject.min.js";import getIndexFromRef from"./getIndexFromRef.min.js";const createBufferPageWithAnnotation=(e,t,n,f)=>{e=findObject(e,t.xref,n).toString();let r,o,i;r=e.indexOf("/Annots"),i=-1<r?(o=e.indexOf("]",r),(i=e.substr(r,o+1-r)).substr(0,i.length-1)):(r=e.length,o=e.length,"/Annots [");t=getIndexFromRef(t.xref,n),n=f.toString(),i+=` ${n}]`,f=e.substr(0,r);let m="";return e.length>o&&(m=e.substr(o+1)),Buffer.concat([Buffer.from(t+` 0 obj -`),Buffer.from("<<\n"),Buffer.from(f+i+m+` -`),Buffer.from("\n>>\nendobj\n")])};export default createBufferPageWithAnnotation; \ No newline at end of file diff --git a/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/createBufferRootWithAcroform.min.js b/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/createBufferRootWithAcroform.min.js deleted file mode 100644 index 9783e9b51..000000000 --- a/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/createBufferRootWithAcroform.min.js +++ /dev/null @@ -1,3 +0,0 @@ -import getIndexFromRef from"./getIndexFromRef.min.js";const createBufferRootWithAcroform=(r,f,o)=>{var e=getIndexFromRef(f.xref,f.rootRef);return Buffer.concat([Buffer.from(e+` 0 obj -`),Buffer.from("<<\n"),Buffer.from(f.root+` -`),Buffer.from("/AcroForm "+o),Buffer.from("\n>>\nendobj\n")])};export default createBufferRootWithAcroform; \ No newline at end of file diff --git a/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/createBufferTrailer.min.js b/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/createBufferTrailer.min.js deleted file mode 100644 index 521bef324..000000000 --- a/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/createBufferTrailer.min.js +++ /dev/null @@ -1,8 +0,0 @@ -const createBufferTrailer=(f,r,e)=>{let o=[];return o[0]="0000000000 65535 f ",e.forEach((f,r)=>{f=("0000000000"+f).slice(-10);o[r+1]=r+` 1 -${f} 00000 n `}),o=o.filter(f=>void 0!==f),Buffer.concat([Buffer.from("xref\n"),Buffer.from(r.xref.startingIndex+` 1 -`),Buffer.from(o.join("\n")),Buffer.from("\ntrailer\n"),Buffer.from("<<\n"),Buffer.from(`/Size ${r.xref.maxIndex+1} -`),Buffer.from(`/Root ${r.rootRef} -`),Buffer.from(r.infoRef?`/Info ${r.infoRef} -`:""),Buffer.from(`/Prev ${r.xRefPosition} -`),Buffer.from(">>\n"),Buffer.from("startxref\n"),Buffer.from(f.length+` -`),Buffer.from("%%EOF")])};export default createBufferTrailer; \ No newline at end of file diff --git a/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/findObject.min.js b/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/findObject.min.js deleted file mode 100644 index dd73ad2d9..000000000 --- a/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/findObject.min.js +++ /dev/null @@ -1 +0,0 @@ -import getIndexFromRef from"./getIndexFromRef.min.js";const findObject=(e,t,f)=>{f=getIndexFromRef(t,f),t=t.offsets.get(f);let n=e.slice(t);return n=(n=(n=n.slice(0,n.indexOf("endobj","utf8"))).slice(n.indexOf("<<","utf8")+2)).slice(0,n.lastIndexOf(">>","utf8"))};export default findObject; \ No newline at end of file diff --git a/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/getIndexFromRef.min.js b/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/getIndexFromRef.min.js deleted file mode 100644 index cf34f0b0a..000000000 --- a/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/getIndexFromRef.min.js +++ /dev/null @@ -1 +0,0 @@ -import SignPdfError from"./SignPdfError.min.js";const getIndexFromRef=(r,e)=>{var[o]=e.split(" "),o=parseInt(o);if(r.offsets.has(o))return o;throw new SignPdfError(`Failed to locate object "${e}".`,SignPdfError.TYPE_PARSE)};export default getIndexFromRef; \ No newline at end of file diff --git a/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/getPageRef.min.js b/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/getPageRef.min.js deleted file mode 100644 index 88dd52a0f..000000000 --- a/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/getPageRef.min.js +++ /dev/null @@ -1 +0,0 @@ -import getPagesDictionaryRef from"./getPagesDictionaryRef.min.js";import findObject from"./findObject.min.js";export default function getPageRef(e,t,i){var n=getPagesDictionaryRef(t),e=findObject(e,t.xref,n),t=e.indexOf("/Kids"),n=e.indexOf("[",t)+1,t=e.indexOf("]",t);const f=e.slice(n,t).toString();for(var r=[],o=0;o<f.length;o++)"R"===f[o]&&r.push(o);let a={},g=0;return r.forEach((e,t)=>{a={...a,[t+1]:f.substring(g+1,e+1)},g=e+1}),i?a[i]:a[1]} \ No newline at end of file diff --git a/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/getPagesDictionaryRef.min.js b/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/getPagesDictionaryRef.min.js deleted file mode 100644 index 98d50586e..000000000 --- a/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/getPagesDictionaryRef.min.js +++ /dev/null @@ -1 +0,0 @@ -import SignPdfError from"./SignPdfError.min.js";export default function getPagesDictionaryRef(r){r=/\/Pages\s+(\d+\s+\d+\s+R)/g.exec(r.root);if(null===r)throw new SignPdfError("Failed to find the pages descriptor. This is probably a problem in node-signpdf.",SignPdfError.TYPE_PARSE);return r[1]} \ No newline at end of file diff --git a/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/pdfObject.min.js b/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/pdfObject.min.js deleted file mode 100644 index 9105ea27a..000000000 --- a/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/pdfObject.min.js +++ /dev/null @@ -1 +0,0 @@ -import PDFAbstractReference from"./PDFAbstractReference.min.js";const pad=(e,t)=>(Array(t+1).join("0")+e).slice(-t),escapableRe=/[\n\r\t\b\f()\\]/g,escapable={"\n":"\\n","\r":"\\r","\t":"\\t","\b":"\\b","\f":"\\f","\\":"\\\\","(":"\\(",")":"\\)"},swapBytes=e=>e.swap16();export default class PDFObject{static convert(t,a=null){if("string"==typeof t)return"/"+t;if(t instanceof String){let r=t,n=!1;for(let e=0,t=r.length;e<t;e+=1)if(127<r.charCodeAt(e)){n=!0;break}let e;return e=n?swapBytes(Buffer.from(``+r,"utf16le")):Buffer.from(r,"ascii"),`(${r=(r=(a?a(e):e).toString("binary")).replace(escapableRe,e=>escapable[e])})`}if(Buffer.isBuffer(t))return`<${t.toString("hex")}>`;if(t instanceof PDFAbstractReference)return t.toString();if(t instanceof Date){let e=`D:${pad(t.getUTCFullYear(),4)}${pad(t.getUTCMonth()+1,2)}${pad(t.getUTCDate(),2)}${pad(t.getUTCHours(),2)}${pad(t.getUTCMinutes(),2)}${pad(t.getUTCSeconds(),2)}Z`;return`(${e=a?(e=a(Buffer.from(e,"ascii")).toString("binary")).replace(escapableRe,e=>escapable[e]):e})`}if(Array.isArray(t))return`[${t.map(e=>PDFObject.convert(e,a)).join(" ")}]`;if("[object Object]"!=={}.toString.call(t))return"number"==typeof t?PDFObject.number(t):""+t;{const n=["<<"];return Object.entries(t).forEach(([e,t])=>{let r="";r=t&&-1!==t.toString().indexOf("<<")?t:PDFObject.convert(t,a),n.push(`/${e} `+r)}),n.push(">>"),n.join("\n")}}static number(e){if(-1e21<e&&e<1e21)return Math.round(1e6*e)/1e6;throw new Error("unsupported number: "+e)}} \ No newline at end of file diff --git a/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/pdfkitAddPlaceholder.min.js b/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/pdfkitAddPlaceholder.min.js deleted file mode 100644 index 261553ff8..000000000 --- a/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/pdfkitAddPlaceholder.min.js +++ /dev/null @@ -1,28 +0,0 @@ -import{DEFAULT_BYTE_RANGE_PLACEHOLDER,DEFAULT_SIGNATURE_LENGTH,SUBFILTER_ADOBE_PKCS7_DETACHED}from"./const.min.js";import PDFKitReferenceMock from"./PDFKitReferenceMock.min.js";import PNG from"png-js";import zlib from"zlib";const specialCharacters=["á","Á","é","É","í","Í","ó","Ó","ö","Ö","ő","Ő","ú","Ú","ű","Ű"],MARKERS=[65472,65473,65474,65475,65477,65478,65479,65480,65481,65482,65483,65484,65485,65486,65487],COLOR_SPACE_MAP={1:"DeviceGray",3:"DeviceRGB",4:"DeviceCMYK"};function getImage(e,t){let n;if(255===e[0]&&216===e[1])n=getJpgImage(t,e);else{if(137!==e[0]||"PNG"!==e.toString("ascii",1,4))throw new Error("Unknown image format.");n=getPngImage(t,e)}return n}function getAnnotationApparance(e,t,n){return e.ref({CropBox:[0,10,200,60],Type:"XObject",FormType:1,BBox:[0,10,200,60],Resources:`<</XObject << -/Img${t.index} ${t.index} 0 R ->> -/Font << -/f1 ${n.index} 0 R ->> ->>`,MediaBox:[0,10,200,60],Subtype:"Form"},null,getStream(t.index))}const getStream=e=>getConvertedText(` - 1.0 1.0 1.0 rg - 0.0 0.0 0.0 RG - q - q - 200 0 0 50 0 10 cm - /Img${e} Do - Q - 0 0 0 rg - BT - 0 Tr - /f1 10.0 Tf - 1.4 0 0 1 20 45.97412 Tm - ET - BT - 0 Tr - /f1 10.0 Tf - 1.4 0 0 1 20 33.56006 Tm - ET - Q`),getFont=(e,t)=>e.ref({Type:"Font",BaseFont:t,Encoding:"WinAnsiEncoding",Subtype:"Type1"}),getJpgImage=(e,t)=>{if(65496!==t.readUInt16BE(0))throw"SOI not found in JPEG";let n=2,a;for(;n<t.length&&(a=t.readUInt16BE(n),n+=2,!MARKERS.includes(a));)n+=t.readUInt16BE(n);if(!MARKERS.includes(a))throw"Invalid JPEG.";n+=2;var r=t[n++],o=t.readUInt16BE(n),i=(n+=2,t.readUInt16BE(n)),l=(n+=2,t[n++]),l=COLOR_SPACE_MAP[l],r={Type:"XObject",Subtype:"Image",BitsPerComponent:r,Width:i,Height:o,ColorSpace:l,Filter:"DCTDecode"},i=("DeviceCMYK"===l&&(r.Decode=[1,0,1,0,1,0,1,0]),e.ref(r,null,t));return i},getPngImage=(e,t)=>{var t=new PNG(t),n=t.hasAlphaChannel,a={Type:"XObject",Subtype:"Image",BitsPerComponent:n?8:t.bits,Width:t.width,Height:t.height,Filter:"FlateDecode"};if(n||(r=e.ref({Predictor:15,Colors:t.colors,BitsPerComponent:t.bits,Columns:t.width}),a.DecodeParms=r),0===t.palette.length?a.ColorSpace=t.colorSpace:(r=e.ref({stream:new Buffer(t.palette)}),a.ColorSpace=["Indexed","DeviceRGB",t.palette.length/3-1,r]),null!=t.transparency.grayscale){var r=t.transparency.grayscale;a.Mask=[r,r]}else if(t.transparency.rgb){var o,r=t.transparency["rgb"],i=[];for(o of r)i.push(o,o);a.Mask=i}else t.transparency.indexed?loadIndexedAlphaChannel(t):n&&(splitAlphaChannel(t),r=getSmask(e,t),a.Mask=r);return e.ref(a,null,t.imgData)},loadIndexedAlphaChannel=e=>{const o=e.transparency.indexed;return e.decodePixels(n=>{var a=new Buffer(e.width*e.height);let r=0;for(let e=0,t=n.length;e<t;e++)a[r++]=o[n[e]];e.alphaChannel=zlib.deflateSync(a)})},splitAlphaChannel=d=>{d.decodePixels(t=>{let e,n;var a=d.colors,r=d.width*d.height,o=new Buffer(r*a),i=new Buffer(r);let l=n=e=0;for(var c=t.length,g=16===d.bits?1:0;l<c;){for(let e=0;e<a;e++)o[n++]=t[l++],l+=g;i[e++]=t[l++],l+=g}d.imgData=zlib.deflateSync(o),d.alphaChannel=zlib.deflateSync(i)})},getSmask=(e,t)=>{let n;return console.log("image.hasAlphaChannel ",t.hasAlphaChannel),t.hasAlphaChannel&&(console.log("image.alphaChannel ",t.alphaChannel),n=e.ref({Type:"XObject",Subtype:"Image",Height:t.height,Width:t.width,BitsPerComponent:8,Filter:"FlateDecode",ColorSpace:"DeviceGray",Decode:[0,1],stream:t.alphaChannel})),n},getConvertedText=e=>e.split("").map(e=>specialCharacters.includes(e)?getOctalCodeFromCharacter(e):e).join(""),getOctalCodeFromCharacter=e=>"\\"+e.charCodeAt(0).toString(8),pdfkitAddPlaceholder=({pdf:e,pdfBuffer:a,reason:r,contactInfo:t="emailfromp1289@gmail.com",name:n="Name from p12",location:o="Location from p12",signatureLength:i=DEFAULT_SIGNATURE_LENGTH,byteRangePlaceholder:l=DEFAULT_BYTE_RANGE_PLACEHOLDER,subFilter:c=SUBFILTER_ADOBE_PKCS7_DETACHED,sign:g})=>{var d=getFont(e,"Helvetica"),s=getFont(e,"ZapfDingbats"),p=getFont(e,"Helvetica"),f=g.Base64,f=getAnnotationApparance(e,getImage(Buffer.from(f,"base64"),e),p,g),p=e.ref({Type:"Sig",Filter:"Adobe.PPKLite",SubFilter:c,ByteRange:[0,l,l,l],Contents:Buffer.from(String.fromCharCode(0).repeat(i)),Reason:new String(r),M:new Date,ContactInfo:new String(t),Name:new String(n),Location:new String(o)}),h=a.lastIndexOf("/Type /AcroForm"),c=-1!==h;let m=[],C;if(c){let e=h;var S=h-10;let t="",n=11;for(n;n<22;n+=1){var A=a.slice(h-n,S).toString();if("\n"===A[0])break;t=A,e=h-n}l=a.slice(e),i=l.slice(0,l.indexOf("endobj")).toString(),r=(C=parseInt(t),i.slice(i.indexOf("/Fields [")+9,i.indexOf("]")));m=r.split(" ").filter((e,t)=>t%3==0).map(e=>new PDFKitReferenceMock(e))}t=g.Left,n=g.Bottom,o=t+g.Width,l=n+g.Height,i=e.ref({Type:"Annot",Subtype:"Widget",FT:"Sig",Rect:[t,n,o,l],V:p,T:new String("Signature"+(m.length+1)),F:4,P:e.page.dictionary,AP:`<</N ${f.index} 0 R>>`,DA:new String("/Helvetica 0 Tf 0 g")});e.page.dictionary.data.Annots=[i];let T;return T=c?e.ref({Type:"AcroForm",SigFlags:3,Fields:[...m,i],DR:`<</Font -<</Helvetica ${d.index} 0 R/ZapfDingbats ${s.index} 0 R>> ->>`},C):e.ref({Type:"AcroForm",SigFlags:3,Fields:[...m,i]}),{signature:p,form:e._root.data.AcroForm=T,widget:i}};export default pdfkitAddPlaceholder; \ No newline at end of file diff --git a/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/pdflibplaceholder.min.js b/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/pdflibplaceholder.min.js deleted file mode 100644 index 610e5012d..000000000 --- a/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/pdflibplaceholder.min.js +++ /dev/null @@ -1,87 +0,0 @@ -import { - DEFAULT_BYTE_RANGE_PLACEHOLDER, - DEFAULT_SIGNATURE_LENGTH, - SUBFILTER_ADOBE_PKCS7_DETACHED, -} from './const.min.js'; -import { SignPdfError } from './SignPdfError.min.js'; -import { - PDFArray, - PDFDict, - PDFHexString, - PDFName, - PDFNumber, - PDFInvalidObject, - PDFString, -} from 'pdf-lib'; -const pdflibAddPlaceholder = ({ - pdfDoc: e = void 0, - pdfPage: o = void 0, - reason: t, - contactInfo: r = 'emailfromp1289@gmail.com', - name: i = 'Name from p12', - location: n, - signingTime: a = void 0, - signatureLength: P = DEFAULT_SIGNATURE_LENGTH, - byteRangePlaceholder: F = DEFAULT_BYTE_RANGE_PLACEHOLDER, - subFilter: D = SUBFILTER_ADOBE_PKCS7_DETACHED, - widgetRect: f = [0, 0, 0, 0], - appName: g = void 0, -}) => { - if (void 0 === e && void 0 === o) - throw new SignPdfError('PDFDoc or PDFPage must be set.', SignPdfError.TYPE_INPUT); - var e = e ?? o.doc, - o = o ?? e.getPages()[0], - m = PDFArray.withContext(e.context), - F = - (m.push(PDFNumber.of(0)), - m.push(PDFName.of(F)), - m.push(PDFName.of(F)), - m.push(PDFName.of(F)), - PDFHexString.of(String.fromCharCode(0).repeat(P))), - P = g ? { App: { Name: g } } : {}, - g = e.context.obj({ - Type: 'Sig', - Filter: 'Adobe.PPKLite', - SubFilter: D, - ByteRange: m, - Contents: F, - Reason: PDFString.of(t), - M: PDFString.fromDate(a ?? new Date()), - ContactInfo: PDFString.of(r), - Name: PDFString.of(i), - Location: PDFString.of(n), - Prop_Build: { Filter: { Name: 'Adobe.PPKLite' }, ...P }, - }), - D = new Uint8Array(g.sizeInBytes()), - m = (g.copyBytesInto(D, 0), PDFInvalidObject.of(D)), - F = e.context.register(m); - const s = PDFArray.withContext(e.context); - f.forEach(e => s.push(PDFNumber.of(e))); - (t = e.context.formXObject([], { BBox: f, Resources: {} })), - (a = e.context.obj({ - Type: 'Annot', - Subtype: 'Widget', - FT: 'Sig', - Rect: s, - V: F, - T: PDFString.of('Signature1'), - F: 4, - P: o.ref, - AP: { N: e.context.register(t) }, - })), - (r = e.context.register(a)); - let c = o.node.lookupMaybe(PDFName.of('Annots'), PDFArray), - d = - ((c = void 0 === c ? e.context.obj([]) : c).push(r), - o.node.set(PDFName.of('Annots'), c), - e.catalog.lookupMaybe(PDFName.of('AcroForm'), PDFDict)); - void 0 === d && - ((d = e.context.obj({ Fields: [] })), - (i = e.context.register(d)), - e.catalog.set(PDFName.of('AcroForm'), i)); - let N; - N = d.has(PDFName.of('SigFlags')) ? d.get(PDFName.of('SigFlags')) : PDFNumber.of(0); - n = PDFNumber.of(3 | N.asNumber()); - d.set(PDFName.of('SigFlags'), n), d.get(PDFName.of('Fields')).push(r); -}; -export { pdflibAddPlaceholder }; diff --git a/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/plainplaceholder.min.js b/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/plainplaceholder.min.js deleted file mode 100644 index 648fabb49..000000000 --- a/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/plainplaceholder.min.js +++ /dev/null @@ -1,2 +0,0 @@ -import PDFObject from"./pdfObject.min.js";import PDFKitReferenceMock from"./PDFKitReferenceMock.min.js";import removeTrailingNewLine from"./removeTrailingNewLine.min.js";import{DEFAULT_SIGNATURE_LENGTH,SUBFILTER_ADOBE_PKCS7_DETACHED}from"./const.min.js";import pdfkitAddPlaceholder from"./pdfkitAddPlaceholder.min.js";import getIndexFromRef from"./getIndexFromRef.min.js";import readPdf from"./readPdf.min.js";import getPageRef from"./getPageRef.min.js";import createBufferRootWithAcroform from"./createBufferRootWithAcroform.min.js";import createBufferPageWithAnnotation from"./createBufferPageWithAnnotation.min.js";import createBufferTrailer from"./createBufferTrailer.min.js";const isContainBufferRootWithAcroform=e=>{e=/\/AcroForm\s+(\d+\s\d+\sR)/g.exec(e.toString());return null!=e&&null!=e[1]&&""!==e[1]},getAssembledPdf=(e,r,f,o)=>{let t=e;return t=Buffer.concat([t,Buffer.from("\n"),Buffer.from(r+` 0 obj -`),Buffer.from(PDFObject.convert(f))]),o&&(t=Buffer.concat([t,Buffer.from("\nstream\n"),Buffer.from(o),Buffer.from("\nendstream")])),t=Buffer.concat([t,Buffer.from("\nendobj\n")])},plainAddPlaceholder=({pdfBuffer:e,reason:r,contactInfo:f="emailfromp1289@gmail.com",name:o="Name from p12",location:t="Location from p12",signatureLength:n=DEFAULT_SIGNATURE_LENGTH,subFilter:i=SUBFILTER_ADOBE_PKCS7_DETACHED,sign:m})=>{let a=removeTrailingNewLine(e);const c=readPdf(a);var d=getPageRef(a,c,m.Page),u=getIndexFromRef(c.xref,d);const l=new Map;var s={ref:(e,r,f)=>{c.xref.maxIndex+=1;r=null!=r?r:c.xref.maxIndex;return l.set(r,a.length+1),a=getAssembledPdf(a,r,e,f),new PDFKitReferenceMock(c.xref.maxIndex)},page:{dictionary:new PDFKitReferenceMock(u,{data:{Annots:[]}})},_root:{data:{}}},{form:s,widget:e}=pdfkitAddPlaceholder({pdf:s,pdfBuffer:e,reason:r,contactInfo:f,name:o,location:t,signatureLength:n,subFilter:i,sign:m});return isContainBufferRootWithAcroform(a)||(r=getIndexFromRef(c.xref,c.rootRef),l.set(r,a.length+1),a=Buffer.concat([a,Buffer.from("\n"),createBufferRootWithAcroform(a,c,s)])),l.set(u,a.length+1),a=Buffer.concat([a,Buffer.from("\n"),createBufferPageWithAnnotation(a,c,d,e)]),a=Buffer.concat([a,Buffer.from("\n"),createBufferTrailer(a,c,l)])};export default plainAddPlaceholder; \ No newline at end of file diff --git a/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/readPdf.min.js b/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/readPdf.min.js deleted file mode 100644 index acfa4a753..000000000 --- a/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/readPdf.min.js +++ /dev/null @@ -1 +0,0 @@ -import readRefTable from"./readRefTable.min.js";import findObject from"./findObject.min.js";const getValue=(e,t)=>{let r=e.indexOf(t);if(-1!==r)return e=e.slice(r),-1===(r=e.indexOf("/",1))&&(r=e.indexOf(">",1)),e.slice(t.length+1,r).toString().trim()},readPdf=e=>{var t=e.lastIndexOf("trailer"),r=e.slice(t,e.length-6),f=r.slice(r.lastIndexOf("startxref")+10).toString(),f=parseInt(f),i=readRefTable(e),n=getValue(r,"/Root");return{xref:i,rootRef:n,root:findObject(e,i,n).toString(),infoRef:getValue(r,"/Info"),trailerStart:t,previousXrefs:[],xRefPosition:f}};export default readPdf; \ No newline at end of file diff --git a/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/readRefTable.min.js b/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/readRefTable.min.js deleted file mode 100644 index 1085bb067..000000000 --- a/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/readRefTable.min.js +++ /dev/null @@ -1 +0,0 @@ -import SignPdfError from"./SignPdfError.min.js";import xrefToRefMap from"./xrefToRefMap.min.js";const getLastTrailerPosition=e=>{var r=e.lastIndexOf(Buffer.from("trailer","utf8")),r=e.slice(r,e.length-6),e=r.slice(r.lastIndexOf(Buffer.from("startxref","utf8"))+10).toString();return parseInt(e)},getXref=(e,r)=>{let t=e.slice(r);e=t.indexOf(Buffer.from("xref","utf8"));if(-1===e)throw new SignPdfError(`Could not find xref anywhere at or after ${r}.`,SignPdfError.TYPE_PARSE);if(0<e&&""!==t.slice(0,e).toString().replace(/\s*/g,""))throw new SignPdfError(`Expected xref at ${r} but found other content.`,SignPdfError.TYPE_PARSE);r=t.indexOf(Buffer.from("%%EOF","utf8"));if(-1===r)throw new SignPdfError("Expected EOF after xref and trailer but could not find one.",SignPdfError.TYPE_PARSE);if(!(r=(t=(t=(t=t.slice(0,r)).slice(e+4)).slice(t.indexOf("\n")+1)).toString().split("/Size")[1]))throw new SignPdfError("Size not found in xref table.",SignPdfError.TYPE_PARSE);if(null===(r=/^\s*(\d+)/.exec(r)))throw new SignPdfError("Failed to parse size of xref table.",SignPdfError.TYPE_PARSE);var r=parseInt(r[1]),[e,f]=t.toString().split("trailer");let n;null!=f.split("/Prev")[1]&&([,f]=/Prev (\d+)/g.exec(f),n=f);f=xrefToRefMap(e);return{size:r,prev:n,xRefContent:f}},getFullXrefTable=e=>{var r=getLastTrailerPosition(e),t=getXref(e,r);return void 0===t.prev?t.xRefContent:(e=e.slice(0,r),r=getFullXrefTable(e),new Map([...r,...t.xRefContent]))},readRefTable=e=>{e=getFullXrefTable(e);return{startingIndex:0,maxIndex:Math.max(...e.keys()),offsets:e}};export default readRefTable;export{getLastTrailerPosition,getXref,getFullXrefTable}; \ No newline at end of file diff --git a/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/removeTrailingNewLine.min.js b/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/removeTrailingNewLine.min.js deleted file mode 100644 index 88b4b06b2..000000000 --- a/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/removeTrailingNewLine.min.js +++ /dev/null @@ -1 +0,0 @@ -import SignPdfError from"./SignPdfError.min.js";const sliceLastChar=(r,e)=>{return r.slice(r.length-1).toString()===e?r.slice(0,r.length-1):r},removeTrailingNewLine=r=>{if(!(r instanceof Buffer))throw new SignPdfError("PDF expected as Buffer.",SignPdfError.TYPE_INPUT);r=sliceLastChar(r,"\n");if("\n%%EOF"!==(r=sliceLastChar(r,"\r")).slice(r.length-6).toString())throw new SignPdfError("A PDF file must end with an EOF line.",SignPdfError.TYPE_PARSE);return r};export default removeTrailingNewLine; \ No newline at end of file diff --git a/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/xrefToRefMap.min.js b/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/xrefToRefMap.min.js deleted file mode 100644 index 728676d86..000000000 --- a/apps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/xrefToRefMap.min.js +++ /dev/null @@ -1 +0,0 @@ -import SignPdfError from"./SignPdfError.min.js";const xrefToRefMap=r=>{r=r.split("\n").filter(r=>""!==r);let n=0,t=0;const f=new Map;return r.forEach(r=>{r=r.split(" ");if(2===r.length)n=parseInt(r[0]),t=parseInt(r[1]);else{if(t<=0)throw new SignPdfError("Too many lines in xref table.",SignPdfError.TYPE_PARSE);--t;var[r,,e]=r;if("f"!==e.trim()){if("n"!==e.trim())throw new SignPdfError(`Unknown in-use flag "${e}". Expected "n" or "f".`,SignPdfError.TYPE_PARSE);if(!/^\d+$/.test(r.trim()))throw new SignPdfError(`Expected integer offset. Got "${r}".`,SignPdfError.TYPE_PARSE);e=parseInt(r.trim());f.set(n,e)}n+=1}}),f};export default xrefToRefMap; \ No newline at end of file From ca390bdfa635871bc323607caf7c0508905a75da Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <prafull.navkar@nxglabs.com> Date: Tue, 21 May 2024 13:56:37 +0530 Subject: [PATCH 020/106] refactor: remove Signpdf file --- apps/OpenSignServer/cloud/parsefunction/pdf/SignPDF.min.cjs | 1 - 1 file changed, 1 deletion(-) delete mode 100644 apps/OpenSignServer/cloud/parsefunction/pdf/SignPDF.min.cjs diff --git a/apps/OpenSignServer/cloud/parsefunction/pdf/SignPDF.min.cjs b/apps/OpenSignServer/cloud/parsefunction/pdf/SignPDF.min.cjs deleted file mode 100644 index b84ba4c9b..000000000 --- a/apps/OpenSignServer/cloud/parsefunction/pdf/SignPDF.min.cjs +++ /dev/null @@ -1 +0,0 @@ -const signer=require("node-signpdf").default;class SignPDF{constructor(e,t){this.pdfDoc=e,this.certificate=t}async signPDF(){return signer.sign(this.pdfDoc,this.certificate, process.env.PASS_PHRASE ? {passphrase : process.env.PASS_PHRASE}: null)}static unit8ToBuffer(e){var t=Buffer.alloc(e.byteLength),r=new Uint8Array(e);for(let e=0;e<t.length;++e)t[e]=r[e];return t}}module.exports=SignPDF; \ No newline at end of file From 7de8699437eecc23b9d85d76df5637627a371fd7 Mon Sep 17 00:00:00 2001 From: RaktimaNXG <raktima.c@nxglabs.com> Date: Tue, 21 May 2024 15:08:40 +0530 Subject: [PATCH 021/106] fix: unnecessary emails are sent when a user signs a document via a shared link. --- apps/OpenSign/src/pages/GuestLogin.js | 10 +++++++++- apps/OpenSign/src/pages/PdfRequestFiles.js | 7 ++++++- apps/OpenSign/src/pages/PlaceHolderSign.js | 3 ++- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/apps/OpenSign/src/pages/GuestLogin.js b/apps/OpenSign/src/pages/GuestLogin.js index 003ef60bb..ccd99aad0 100644 --- a/apps/OpenSign/src/pages/GuestLogin.js +++ b/apps/OpenSign/src/pages/GuestLogin.js @@ -19,6 +19,7 @@ function GuestLogin() { const [appLogo, setAppLogo] = useState(""); const [documentId, setDocumentId] = useState(id); const [contactId, setContactId] = useState(contactBookId); + const [sendmail, setSendmail] = useState(); useEffect(() => { handleServerUrl(); @@ -54,6 +55,7 @@ function GuestLogin() { setDocumentId(checkSplit[0]); setEmail(checkSplit[1]); setContactId(checkSplit[2]); + setSendmail(checkSplit[3]); } setIsLoading(false); @@ -146,7 +148,13 @@ function GuestLogin() { //save isGuestSigner true in local to handle login flow header in mobile view localStorage.setItem("isGuestSigner", true); setLoading(false); - navigate(`/load/recipientSignPdf/${documentId}/${contactId}`); + if (sendmail === "false") { + navigate( + `/load/recipientSignPdf/${documentId}/${contactId}?sendmail=${sendmail}` + ); + } else { + navigate(`/load/recipientSignPdf/${documentId}/${contactId}`); + } } } catch (error) { console.log("err ", error); diff --git a/apps/OpenSign/src/pages/PdfRequestFiles.js b/apps/OpenSign/src/pages/PdfRequestFiles.js index 0eda0afe1..1043d8eb5 100644 --- a/apps/OpenSign/src/pages/PdfRequestFiles.js +++ b/apps/OpenSign/src/pages/PdfRequestFiles.js @@ -39,11 +39,16 @@ import Title from "../components/Title"; import DefaultSignature from "../components/pdf/DefaultSignature"; import ModalUi from "../primitives/ModalUi"; import VerifyEmail from "../components/pdf/VerifyEmail"; +function useQuery() { + return new URLSearchParams(useLocation().search); +} function PdfRequestFiles() { const { docId } = useParams(); const navigate = useNavigate(); const location = useLocation(); + const query = useQuery(); + const sendmail = query.get("sendmail"); const [pdfDetails, setPdfDetails] = useState([]); const [signedSigners, setSignedSigners] = useState([]); const [unsignedSigners, setUnSignedSigners] = useState([]); @@ -730,7 +735,7 @@ function PdfRequestFiles() { ); const newIndex = index + 1; const user = pdfDetails?.[0].Signers[newIndex]; - if (sendInOrder) { + if (sendmail !== "false" && sendInOrder) { const requestBody = pdfDetails?.[0]?.RequestBody; const requestSubject = pdfDetails?.[0]?.RequestSubject; if (user) { diff --git a/apps/OpenSign/src/pages/PlaceHolderSign.js b/apps/OpenSign/src/pages/PlaceHolderSign.js index e1d142ca8..e3b6489cb 100644 --- a/apps/OpenSign/src/pages/PlaceHolderSign.js +++ b/apps/OpenSign/src/pages/PlaceHolderSign.js @@ -998,9 +998,10 @@ function PlaceHolderSign() { for (let i = 0; i < signerMail.length; i++) { const objectId = signerMail[i].objectId; const hostUrl = window.location.origin; + const sendMail = false; //encode this url value `${pdfDetails?.[0].objectId}/${signerMail[i].Email}/${objectId}` to base64 using `btoa` function const encodeBase64 = btoa( - `${pdfDetails?.[0].objectId}/${signerMail[i].Email}/${objectId}` + `${pdfDetails?.[0].objectId}/${signerMail[i].Email}/${objectId}/${sendMail}` ); let signPdf = `${hostUrl}/login/${encodeBase64}`; shareLinkList.push({ signerEmail: signerMail[i].Email, url: signPdf }); From 481b9ac1e01f4be0eab95bf261d48922bff15f26 Mon Sep 17 00:00:00 2001 From: RaktimaNXG <raktima.c@nxglabs.com> Date: Tue, 21 May 2024 17:36:41 +0530 Subject: [PATCH 022/106] fix: add send mail false using share link from inprogress report --- apps/OpenSign/src/primitives/GetReportDisplay.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/OpenSign/src/primitives/GetReportDisplay.js b/apps/OpenSign/src/primitives/GetReportDisplay.js index 6042de100..654024778 100644 --- a/apps/OpenSign/src/primitives/GetReportDisplay.js +++ b/apps/OpenSign/src/primitives/GetReportDisplay.js @@ -296,9 +296,12 @@ const ReportTable = (props) => { const handleShare = (item) => { setActLoader({ [item.objectId]: true }); const host = window.location.origin; + const sendMail = false; const getUrl = (x) => { //encode this url value `${item.objectId}/${x.Email}/${x.objectId}` to base64 using `btoa` function - const encodeBase64 = btoa(`${item.objectId}/${x.Email}/${x.objectId}`); + const encodeBase64 = btoa( + `${item.objectId}/${x.Email}/${x.objectId}/${sendMail}` + ); return `${host}/login/${encodeBase64}`; }; From aca28484062729fed67ada3e700922bb9a49cd49 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <prafull.navkar@nxglabs.com> Date: Tue, 21 May 2024 20:26:46 +0530 Subject: [PATCH 023/106] add Ui for bulk send, changes in reportjson --- apps/OpenSign/src/components/BulkSendUi.js | 215 ++++++++++++++++++ .../shared/fields/SuggestionInput.js | 92 ++++++++ apps/OpenSign/src/constant/Utils.js | 21 ++ apps/OpenSign/src/json/ReportJson.js | 8 + .../src/primitives/GetReportDisplay.js | 46 ++++ apps/OpenSignServer/cloud/main.js | 31 ++- .../cloud/parsefunction/createBatchDocs.js | 151 ++++++++++++ .../cloud/parsefunction/getReport.js | 2 +- .../cloud/parsefunction/reportsJson.js | 1 + 9 files changed, 555 insertions(+), 12 deletions(-) create mode 100644 apps/OpenSign/src/components/BulkSendUi.js create mode 100644 apps/OpenSign/src/components/shared/fields/SuggestionInput.js create mode 100644 apps/OpenSignServer/cloud/parsefunction/createBatchDocs.js diff --git a/apps/OpenSign/src/components/BulkSendUi.js b/apps/OpenSign/src/components/BulkSendUi.js new file mode 100644 index 000000000..039f43c39 --- /dev/null +++ b/apps/OpenSign/src/components/BulkSendUi.js @@ -0,0 +1,215 @@ +import React, { useState, useEffect, useRef } from "react"; +import axios from "axios"; +import SuggestionInput from "./shared/fields/SuggestionInput"; + +const BulkSendUi = (props) => { + const [forms, setForms] = useState([]); + const [formId, setFormId] = useState(2); + const formRef = useRef(null); + const [scrollOnNextUpdate, setScrollOnNextUpdate] = useState(false); + const [isSubmit, setIsSubmit] = useState(false); + useEffect(() => { + if (scrollOnNextUpdate && formRef.current) { + formRef.current.scrollIntoView({ + behavior: "smooth", + block: "end", + inline: "nearest" + }); + setScrollOnNextUpdate(false); + } + }, [forms, scrollOnNextUpdate]); + + useEffect(() => { + (() => { + if (props?.Placeholders?.length > 0) { + let users = []; + props?.Placeholders?.forEach((element) => { + if (!element.signerObjId) { + users = [ + ...users, + { + fieldId: element.Id, + email: "", + label: element.Role, + signer: {} + } + ]; + } + }); + setForms((prevForms) => [...prevForms, { Id: 1, fields: users }]); + } + })(); + // eslint-disable-next-line + }, []); + const handleInputChange = (index, signer, fieldIndex) => { + console.log("index", index); + console.log("signer", signer); + console.log("fieldIndex", fieldIndex); + + const newForms = [...forms]; + newForms[index].fields[fieldIndex].email = signer?.Email + ? signer?.Email + : signer || ""; + newForms[index].fields[fieldIndex].signer = signer?.objectId ? signer : ""; + console.log("newForms[index] ", newForms[index]); + setForms(newForms); + }; + + const handleAddForm = (e) => { + e.preventDefault(); + if (props?.Placeholders.length > 0) { + let newForm = []; + props?.Placeholders?.forEach((element) => { + if (!element.signerObjId) { + newForm = [ + ...newForm, + { + fieldId: element.Id, + email: "", + label: element.Role, + signer: {} + } + ]; + } + }); + setForms([...forms, { Id: formId, fields: newForm }]); + } + setFormId(formId + 1); + setScrollOnNextUpdate(true); + }; + + const handleRemoveForm = (index) => { + const updatedForms = forms.filter((_, i) => i !== index); + setForms(updatedForms); + }; + const handleSubmit = async (e) => { + e.preventDefault(); + e.stopPropagation(); + setIsSubmit(true); + + // Create a copy of Placeholders array from props.item + let Placeholders = [...props.item.Placeholders]; + // Initialize an empty array to store updated documents + let Documents = []; + + // Loop through each form + forms.forEach((form) => { + // Map through the copied Placeholders array to update email values + const updatedPlaceholders = Placeholders.map((placeholder) => { + // Find the field in the current form that matches the placeholder Id + const field = form.fields.find( + (element) => parseInt(element.fieldId) === placeholder.Id + ); + // If a matching field is found, update the email value in the placeholder + const signer = field?.signer?.objectId ? field.signer : {}; + console.log("signer ", signer); + if (field) { + return { + ...placeholder, + email: field.email, + signerObjId: field?.signer?.objectId || "", + signerPtr: signer + }; + } + // If no matching field is found, keep the placeholder as is + return placeholder; + }); + + // Push a new document object with updated Placeholders into the Documents array + Documents.push({ ...props.item, Placeholders: updatedPlaceholders }); + }); + console.log("Documents ", Documents); + // await batchQuery(Documents); + }; + + const batchQuery = async (Documents) => { + const serverUrl = localStorage.getItem("baseUrl"); + const functionsUrl = `${serverUrl}functions/batchdocuments`; + const headers = { + "Content-Type": "application/json", + "X-Parse-Application-Id": localStorage.getItem("parseAppId"), + sessionToken: localStorage.getItem("accesstoken") + }; + const params = { + Documents: JSON.stringify(Documents) + }; + try { + const res = await axios.post(functionsUrl, params, { headers: headers }); + // console.log("res ", res); + if (res.data && res.data.result) { + props.handleClose("success", Documents?.length); + } + } catch (err) { + console.log("Err ", err); + props.handleClose("error", 0); + } finally { + setIsSubmit(false); + } + }; + + return ( + <> + {isSubmit && ( + <div className="absolute z-[999] h-full w-full flex justify-center items-center bg-black bg-opacity-40"> + <div + style={{ + fontSize: "45px", + color: "#3dd3e0" + }} + className="loader-37 " + ></div> + </div> + )} + <form onSubmit={handleSubmit}> + <div className=" min-h-max max-h-[250px] overflow-y-auto"> + {forms?.map((form, index) => ( + <div + key={form.Id} + className="p-3 rounded-xl border-[1px] border-gray-400 m-4 bg-white text-black grid grid-cols-1 md:grid-cols-2 gap-2 relative" + > + {form?.fields?.map((field, fieldIndex) => ( + <div className="flex flex-col " key={field.fieldId}> + <label>{field.label}</label> + <SuggestionInput + required + type="email" + value={field.value} + index={fieldIndex} + onChange={(signer) => + handleInputChange(index, signer, fieldIndex) + } + /> + </div> + ))} + {index > 0 && ( + <button + onClick={() => handleRemoveForm(index)} + className="absolute right-3 top-1 border border-gray-300 rounded-lg px-2 py-1" + > + <i className="fa-solid fa-trash"></i> + </button> + )} + <div ref={formRef}></div> + </div> + ))} + </div> + <div className="flex flex-col mx-4 mb-4 gap-3"> + <button + onClick={handleAddForm} + className="bg-[#32a3ac] p-2 text-white w-full rounded-full focus:outline-none" + > + <i className="fa-solid fa-plus"></i> <span>Add new</span> + </button> + <button + type="submit" + className="bg-[#32a3ac] p-2 text-white w-full rounded-full focus:outline-none" + > + <i className="fa-solid fa-paper-plane"></i> <span>Send</span> + </button> + </div> + </form> + </> + ); +}; + +export default BulkSendUi; diff --git a/apps/OpenSign/src/components/shared/fields/SuggestionInput.js b/apps/OpenSign/src/components/shared/fields/SuggestionInput.js new file mode 100644 index 000000000..37f2c0b12 --- /dev/null +++ b/apps/OpenSign/src/components/shared/fields/SuggestionInput.js @@ -0,0 +1,92 @@ +import React, { useState, useEffect, useRef } from "react"; +import { findContact } from "../../../constant/Utils"; +const SuggestionInput = (props) => { + const [inputValue, setInputValue] = useState(props?.value || ""); + const [suggestions, setSuggestions] = useState([]); + const [showSuggestions, setShowSuggestions] = useState(false); + const ref = useRef(null); + + useEffect(() => { + document.addEventListener("mousedown", Clickout); + return () => { + document.removeEventListener("mousedown", Clickout); + }; + }, []); + + const Clickout = (event) => { + if (ref.current && !ref.current.contains(event.target)) { + setShowSuggestions(false); + } + }; + // create debounce to avoid unnecessay api calls + useEffect(() => { + let timer; + if (inputValue) { + if (timer) clearTimeout(timer); + timer = setTimeout(() => { + (async () => { + const res = await findContact(inputValue); + if (res?.length > 0) { + setSuggestions(res); + setShowSuggestions(true); + } else { + setSuggestions(res); + setShowSuggestions(false); + } + })(); + }, 1000); + } + return () => clearTimeout(timer); + }, [inputValue]); + + const handleInputChange = async (e) => { + const value = e.target.value; + setInputValue(value); + if (props.onChange) { + props.onChange(value); + } + + if (value.trim() === "") { + setSuggestions([]); + setShowSuggestions(false); + return; + } + }; + const handleSuggestionClick = (suggestion) => { + setInputValue(suggestion.Email); + setSuggestions([]); + setShowSuggestions(false); + if (props.onChange) { + props.onChange(suggestion); + } + }; + return ( + <div className="flex flex-col items-center relative"> + <input + type={props?.type || "text"} + value={inputValue} + onChange={handleInputChange} + placeholder="Enter text..." + className="w-full border border-gray-300 p-2 text-black rounded" + required={props.required} + /> + {showSuggestions && ( + <ul + ref={ref} + className="absolute z-50 left-0 top-[2.55rem] w-full max-h-[100px] overflow-auto bg-white border border-gray-300 rounded shadow-md" + > + {suggestions.map((suggestion, index) => ( + <li + key={index} + className="py-2 px-2 w-full text-sm cursor-pointer hover:bg-gray-100" + onClick={() => handleSuggestionClick(suggestion)} + > + {suggestion.Email} + </li> + ))} + </ul> + )} + </div> + ); +}; +export default SuggestionInput; diff --git a/apps/OpenSign/src/constant/Utils.js b/apps/OpenSign/src/constant/Utils.js index 93cefe04c..47833399c 100644 --- a/apps/OpenSign/src/constant/Utils.js +++ b/apps/OpenSign/src/constant/Utils.js @@ -2030,3 +2030,24 @@ export const handleSendOTP = async (email) => { alert(error.message); } }; + +export async function findContact(value) { + try { + const currentUser = Parse.User.current(); + const contactbook = new Parse.Query("contracts_Contactbook"); + contactbook.equalTo( + "CreatedBy", + Parse.User.createWithoutData(currentUser.id) + ); + contactbook.notEqualTo("IsDeleted", true); + contactbook.matches("Email", new RegExp(value, "i")); + + const contactRes = await contactbook.find(); + if (contactRes) { + const res = JSON.parse(JSON.stringify(contactRes)); + return res; + } + } catch (error) { + console.error("Error fetching suggestions:", error); + } +} diff --git a/apps/OpenSign/src/json/ReportJson.js b/apps/OpenSign/src/json/ReportJson.js index 8bc528add..f16efca1c 100644 --- a/apps/OpenSign/src/json/ReportJson.js +++ b/apps/OpenSign/src/json/ReportJson.js @@ -360,6 +360,14 @@ export default function reportJson(id) { redirectUrl: "template", action: "redirect" }, + { + btnId: "1631", + btnLabel: "Quick send", + hoverLabel: "Quick send", + btnIcon: "fa-solid fa-envelope", + redirectUrl: "", + action: "bulksend" + }, { btnId: "1834", btnLabel: "Delete", diff --git a/apps/OpenSign/src/primitives/GetReportDisplay.js b/apps/OpenSign/src/primitives/GetReportDisplay.js index 1e82297e5..21b8baf9f 100644 --- a/apps/OpenSign/src/primitives/GetReportDisplay.js +++ b/apps/OpenSign/src/primitives/GetReportDisplay.js @@ -18,6 +18,7 @@ import EditorToolbar, { } from "../components/pdf/EditorToolbar"; import ReactQuill from "react-quill"; import "react-quill/dist/quill.snow.css"; +import BulkSendUi from "../components/BulkSendUi"; const ReportTable = (props) => { const navigate = useNavigate(); @@ -39,6 +40,11 @@ const ReportTable = (props) => { const [mail, setMail] = useState({ subject: "", body: "" }); const [userDetails, setUserDetails] = useState({}); const [isNextStep, setIsNextStep] = useState({}); + const [isBulkSend, setIsBulkSend] = useState({}); + const [templateDeatils, setTemplateDetails] = useState({}); + const [placeholders, setPlaceholders] = useState([]); + const [isErr, setIsErr] = useState(false); + const startIndex = (currentPage - 1) * props.docPerPage; const { isMoreDocs, setIsNextRecord } = props; // For loop is used to calculate page numbers visible below table @@ -211,6 +217,7 @@ const ReportTable = (props) => { }; const handleActionBtn = (act, item) => { + console.log("item", item); if (act.action === "redirect") { handleURL(item, act); } else if (act.action === "delete") { @@ -223,6 +230,8 @@ const ReportTable = (props) => { setIsOption({ [item.objectId]: !isOption[item.objectId] }); } else if (act.action === "resend") { setIsResendMail({ [item.objectId]: true }); + } else if (act.action === "bulksend") { + handleBulkSend(item); } }; // Get current list @@ -605,6 +614,30 @@ const ReportTable = (props) => { </div> ); }; + const handleQuickSendClose = (status, count) => { + setIsBulkSend({}); + setIsAlert(true); + if (status === "success") { + if (count > 1) { + setAlertMsg(count + " Documents sent successfully!"); + } else { + setAlertMsg(count + " Document sent successfully!"); + } + } else { + setIsAlert(true); + setIsErr(true); + } + }; + + const handleBulkSend = (template) => { + if (template?.Placeholders?.length > 0) { + setPlaceholders(template?.Placeholders); + setTemplateDetails(template); + setIsBulkSend({ [template.objectId]: true }); + } else { + setIsDocErr(true); + } + }; return ( <div className="relative"> {Object.keys(actLoader)?.length > 0 && ( @@ -845,6 +878,19 @@ const ReportTable = (props) => { </div> </ModalUi> )} + {isBulkSend[`${item.objectId}`] && ( + <ModalUi + isOpen + title={"Quick send"} + handleClose={() => setIsBulkSend({})} + > + <BulkSendUi + Placeholders={placeholders} + item={templateDeatils} + handleClose={handleQuickSendClose} + /> + </ModalUi> + )} {isShare[item.objectId] && ( <ModalUi isOpen diff --git a/apps/OpenSignServer/cloud/main.js b/apps/OpenSignServer/cloud/main.js index bc6cb66a2..c0c2ae78c 100644 --- a/apps/OpenSignServer/cloud/main.js +++ b/apps/OpenSignServer/cloud/main.js @@ -37,7 +37,26 @@ import saveSubscription from './parsefunction/saveSubscription.js'; import VerifyEmail from './parsefunction/VerifyEmail.js'; import encryptedpdf from './parsefunction/encryptedPdf.js'; import { getSignedUrl } from './parsefunction/getSignedUrl.js'; +import createBatchDocs from './parsefunction/createBatchDocs.js'; +// This afterSave function triggers after an object is added or updated in the specified class, allowing for post-processing logic. +Parse.Cloud.afterSave('contracts_Document', DocumentAftersave); +Parse.Cloud.afterSave('contracts_Contactbook', ContactbookAftersave); +Parse.Cloud.afterSave('contracts_Users', ContractUsersAftersave); +Parse.Cloud.afterSave('contracts_Template', TemplateAfterSave); + +// This beforeSave function triggers before an object is added or updated in the specified class, allowing for validation or modification. +Parse.Cloud.beforeSave('contracts_Document', DocumentBeforesave); +Parse.Cloud.beforeSave('contracts_Template', TemplateBeforeSave); + +// This afterFind function triggers after a query retrieves objects from the specified class, allowing for post-processing of the results. +Parse.Cloud.afterFind(Parse.User, UserAfterFind); +Parse.Cloud.afterFind('contracts_Document', DocumentBeforeFind); +Parse.Cloud.afterFind('contracts_Template', TemplateAfterFind); +Parse.Cloud.afterFind('contracts_Signature', SignatureAfterFind); +Parse.Cloud.afterFind('partners_Tenant', TenantAterFind); + +// This define function creates a custom Cloud Function that can be called from the client-side, enabling custom business logic on the server. Parse.Cloud.define('AddUserToRole', addUserToGroups); Parse.Cloud.define('UserGroups', getUserGroups); Parse.Cloud.define('signPdf', PDF); @@ -62,18 +81,8 @@ Parse.Cloud.define('freesubscription', SubscribeFree); Parse.Cloud.define('getinvoices', getInvoices); Parse.Cloud.define('getpayments', getPayments); Parse.Cloud.define('getsubscriptions', getSubscriptions); -Parse.Cloud.afterSave('contracts_Document', DocumentAftersave); -Parse.Cloud.afterSave('contracts_Contactbook', ContactbookAftersave); -Parse.Cloud.afterSave('contracts_Users', ContractUsersAftersave); -Parse.Cloud.afterSave('contracts_Template', TemplateAfterSave); -Parse.Cloud.beforeSave('contracts_Document', DocumentBeforesave); -Parse.Cloud.beforeSave('contracts_Template', TemplateBeforeSave); -Parse.Cloud.afterFind(Parse.User, UserAfterFind); -Parse.Cloud.afterFind('contracts_Document', DocumentBeforeFind); -Parse.Cloud.afterFind('contracts_Template', TemplateAfterFind); -Parse.Cloud.afterFind('contracts_Signature', SignatureAfterFind); -Parse.Cloud.afterFind('partners_Tenant', TenantAterFind); Parse.Cloud.define('savesubscription', saveSubscription); Parse.Cloud.define('verifyemail', VerifyEmail); Parse.Cloud.define('encryptedpdf', encryptedpdf); Parse.Cloud.define('getsignedurl', getSignedUrl); +Parse.Cloud.define('batchdocuments', createBatchDocs); diff --git a/apps/OpenSignServer/cloud/parsefunction/createBatchDocs.js b/apps/OpenSignServer/cloud/parsefunction/createBatchDocs.js new file mode 100644 index 000000000..7b9ef2f61 --- /dev/null +++ b/apps/OpenSignServer/cloud/parsefunction/createBatchDocs.js @@ -0,0 +1,151 @@ +import axios from 'axios'; + +const serverUrl = process.env.SERVER_URL; +const appId = process.env.APP_ID; + +async function sendMail(document, sessionToken) { + const baseUrl = new URL(process.env.PUBLIC_URL); + + // console.log("pdfDetails", pdfDetails); + const timeToCompleteDays = document?.TimeToCompleteDays || 15; + const ExpireDate = new Date(document.createdAt); + ExpireDate.setDate(ExpireDate.getDate() + timeToCompleteDays); + const newDate = ExpireDate; + const localExpireDate = newDate.toLocaleDateString('en-US', { + day: 'numeric', + month: 'long', + year: 'numeric', + }); + const sender = document.ExtUserPtr.Email; + const signerMail = document.Placeholders; + for (let i = 0; i < signerMail.length; i++) { + try { + const imgPng = 'https://qikinnovation.ams3.digitaloceanspaces.com/logo.png'; + let url = `${serverUrl}/functions/sendmailv3`; + const headers = { + 'Content-Type': 'application/json', + 'X-Parse-Application-Id': appId, + sessionToken: sessionToken, + }; + const objectId = signerMail[i]?.signerObjId; + const hostUrl = baseUrl.origin; + let encodeBase64; + if (objectId) { + encodeBase64 = btoa(`${document.objectId}}/${signerMail[i].signerPtr.Email}/${objectId}`); + } else { + encodeBase64 = btoa(`${document.objectId}}/${signerMail[i].email}/${objectId}`); + } + let signPdf = `${hostUrl}/login/${encodeBase64}`; + const openSignUrl = 'https://www.opensignlabs.com/'; + const orgName = document.ExtUserPtr.Company ? document.ExtUserPtr.Company : ''; + const themeBGcolor = '#47a3ad'; + let params = { + extUserId: document.ExtUserPtr.objectId, + recipient: objectId ? signerMail[i].signerPtr.Email : signerMail[i].email, + subject: `${document.ExtUserPtr.Name} has requested you to sign ${document.Name}`, + from: sender, + html: + "<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8' /> </head> <body> <div style='background-color: #f5f5f5; padding: 20px'> <div style='box-shadow: rgba(0, 0, 0, 0.1) 0px 4px 12px;background: white;padding-bottom: 20px;'> <div style='padding:10px 10px 0 10px'><img src='" + + imgPng + + "' height='50' style='padding:20px; width:170px; height:40px;' /></div><div style='padding: 2px;font-family: system-ui;background-color:" + + themeBGcolor + + ";'><p style='font-size: 20px;font-weight: 400;color: white;padding-left: 20px;' > Digital Signature Request</p></div><div><p style='padding: 20px;font-family: system-ui;font-size: 14px; margin-bottom: 10px;'> " + + document.ExtUserPtr.Name + + ' has requested you to review and sign <strong> ' + + document.Name + + "</strong>.</p><div style='padding: 5px 0px 5px 25px;display: flex;flex-direction: row;justify-content: space-around;'><table> <tr> <td style='font-weight:bold;font-family:sans-serif;font-size:15px'>Sender</td> <td> </td> <td style='color:#626363;font-weight:bold'>" + + sender + + "</td></tr><tr><td style='font-weight:bold;font-family:sans-serif;font-size:15px'>Organization</td> <td> </td><td style='color:#626363;font-weight:bold'> " + + orgName + + "</td></tr> <tr> <td style='font-weight:bold;font-family:sans-serif;font-size:15px'>Expires on</td><td> </td> <td style='color:#626363;font-weight:bold'>" + + localExpireDate + + "</td></tr><tr> <td></td> <td> </td></tr></table> </div> <div style='margin-left:70px'><a href=" + + signPdf + + "> <button style='padding: 12px 12px 12px 12px;background-color: #d46b0f;color: white; border: 0px;box-shadow: rgba(0, 0, 0, 0.05) 0px 6px 24px 0px,rgba(0, 0, 0, 0.08) 0px 0px 0px 1px;font-weight:bold;margin-top:30px;'>Sign here</button></a> </div> <div style='display: flex; justify-content: center;margin-top: 10px;'> </div></div></div><div><p> This is an automated email from OpenSign™. For any queries regarding this email, please contact the sender " + + sender + + ' directly.If you think this email is inappropriate or spam, you may file a complaint with OpenSign™ <a href=' + + openSignUrl + + ' target=_blank>here</a>.</p> </div></div></body> </html>', + }; + const sendMail = await axios.post(url, params, { headers: headers }); + // if (sendMail.data.result.status === 'success') { + // console.log('batch login mail sent'); + // } + } catch (error) { + console.log('error', error); + } + } +} +export default async function createBatchDocs(request) { + const strDocuments = request.params.Documents; + const sessionToken = request.headers['sessiontoken']; + const Documents = JSON.parse(strDocuments); + + // console.log('Documents ', Documents); + const parseConfig = { + baseURL: serverUrl, //localStorage.getItem('baseUrl'), + headers: { + 'X-Parse-Application-Id': appId, + 'X-Parse-Session-Token': sessionToken, + 'Content-Type': 'application/json', + }, + }; + try { + const requests = Documents.map(x => ({ + method: 'POST', + path: '/app/classes/contracts_Document', + body: { + Name: x.Name, + URL: x.URL, + Note: x.Note, + Description: x.Description, + CreatedBy: x.CreatedBy, + ExtUserPtr: { + __type: 'Pointer', + className: x.ExtUserPtr.className, + objectId: x.ExtUserPtr.objectId, + }, + Placeholders: x.Placeholders.map(y => + y?.signerPtr?.objectId + ? { + ...y, + signerPtr: { + __type: 'Pointer', + className: y.signerPtr.className, + objectId: y.signerPtr.objectId, + }, + signerObjId: y.signerObjId, + } + : { ...y, signerPtr: {}, signerObjId: '' } + ), + SignedUrl: x.SignedUrl, + Signers: x.Signers.map(y => ({ + __type: 'Pointer', + className: y.className, + objectId: y.objectId, + })), + }, + })); + // console.log('requests ', requests); + + const response = await axios.post('batch', { requests: requests }, parseConfig); + // // Handle the batch query response + // console.log('Batch query response:', response.data) + if (response.data && response.data.length > 0) { + const updateDocuments = Documents.map((x, i) => ({ + ...x, + objectId: response.data[i]?.success?.objectId, + createdAt: response.data[i]?.success.createdAt, + })); + for (let i = 0; i < updateDocuments.length; i++) { + // console.log('updateDocuments ', updateDocuments); + sendMail(updateDocuments[i], sessionToken); + } + return 'success'; + } + + // Handle individual responses within response.data.results + } catch (error) { + console.error('Error performing batch query:', error); + } +} diff --git a/apps/OpenSignServer/cloud/parsefunction/getReport.js b/apps/OpenSignServer/cloud/parsefunction/getReport.js index 8749c2b28..cd101f7c2 100644 --- a/apps/OpenSignServer/cloud/parsefunction/getReport.js +++ b/apps/OpenSignServer/cloud/parsefunction/getReport.js @@ -30,7 +30,7 @@ export default async function getReport(request) { 'X-Parse-Application-Id': appId, 'X-Parse-Master-Key': process.env.MASTER_KEY, }; - const url = `${serverUrl}/classes/${clsName}?where=${strParams}&keys=${strKeys}&order=${orderBy}&skip=${skip}&limit=${limit}&include=AuditTrail.UserPtr`; + const url = `${serverUrl}/classes/${clsName}?where=${strParams}&keys=${strKeys}&order=${orderBy}&skip=${skip}&limit=${limit}&include=AuditTrail.UserPtr,Placeholders.signerPtr`; const res = await axios.get(url, { headers: headers }); if (res.data && res.data.results) { return res.data.results; diff --git a/apps/OpenSignServer/cloud/parsefunction/reportsJson.js b/apps/OpenSignServer/cloud/parsefunction/reportsJson.js index 98d2c06b5..e541b5439 100644 --- a/apps/OpenSignServer/cloud/parsefunction/reportsJson.js +++ b/apps/OpenSignServer/cloud/parsefunction/reportsJson.js @@ -323,6 +323,7 @@ export default function reportJson(id, userId) { 'Signers.Name', 'Signers.Email', 'Signers.Phone', + 'Placeholders', ], }; default: From 46279efc2c6ea9ea51124d538163bf691f74a85d Mon Sep 17 00:00:00 2001 From: Zathiel <26553418+Zathiel@users.noreply.github.com> Date: Tue, 21 May 2024 15:29:38 +0000 Subject: [PATCH 024/106] build(deps): react-redux, autoprefixer , react-datepicker axios, @reduxjs/toolkit, react-tooltip, tailwindcss react-pdf --- apps/OpenSign/package-lock.json | 62 +++++++++++++++------------------ apps/OpenSign/package.json | 12 +++---- 2 files changed, 35 insertions(+), 39 deletions(-) diff --git a/apps/OpenSign/package-lock.json b/apps/OpenSign/package-lock.json index c7df85d5b..7e853264d 100644 --- a/apps/OpenSign/package-lock.json +++ b/apps/OpenSign/package-lock.json @@ -11,8 +11,8 @@ "@formkit/auto-animate": "^0.8.2", "@radix-ui/themes": "^2.0.3", "@react-pdf/renderer": "^3.4.4", - "@reduxjs/toolkit": "^2.2.4", - "axios": "^1.6.8", + "@reduxjs/toolkit": "^2.2.5", + "axios": "^1.7.1", "file-saver": "^2.0.5", "jwt-decode": "^4.0.0", "moment": "^2.30.1", @@ -24,7 +24,7 @@ "react-bootstrap": "^2.10.2", "react-confetti": "^6.1.0", "react-cookie": "^7.1.4", - "react-datepicker": "^6.4.0", + "react-datepicker": "^6.9.0", "react-dnd": "^16.0.1", "react-dnd-html5-backend": "^16.0.1", "react-dnd-multi-backend": "^8.0.3", @@ -36,14 +36,14 @@ "react-modal": "^3.16.1", "react-pdf": "^7.7.3", "react-quill": "^2.0.0", - "react-redux": "^9.1.0", + "react-redux": "^9.1.2", "react-rnd": "^10.4.10", "react-router-dom": "^6.22.3", "react-scripts": "5.0.1", "react-scrollbars-custom": "^4.1.1", "react-select": "^5.8.0", "react-signature-canvas": "^1.0.6", - "react-tooltip": "^5.26.3", + "react-tooltip": "^5.26.4", "react-web-share": "^2.0.2", "reactour": "^1.19.3", "redux": "^5.0.1", @@ -64,7 +64,7 @@ "postcss": "^8.4.38", "prettier": "^2.8.8", "pretty-quick": "^3.3.1", - "tailwindcss": "^3.4.1" + "tailwindcss": "^3.4.3" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -5535,9 +5535,9 @@ "integrity": "sha512-XsVRkt0hQ60I4e3leAVt+aZR3KJCaJd179BfJHAv4F4x6Vq3yqkry8lcbUWKGKDw1j3/8sW4FsgGR41SFvsG9A==" }, "node_modules/@reduxjs/toolkit": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.2.4.tgz", - "integrity": "sha512-EoIC9iC2V/DLRBVMXRHrO/oM3QBT7RuJNeBRx8Cpnz/NHINeZBEqgI8YOxAYUjLp+KYxGgc4Wd6KoAKsaUBGhg==", + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.2.5.tgz", + "integrity": "sha512-aeFA/s5NCG7NoJe/MhmwREJxRkDs0ZaSqt0MxhWUrwCf1UQXpwR87RROJEql0uAkLI6U7snBOYOcKw83ew3FPg==", "dependencies": { "immer": "^10.0.3", "redux": "^5.0.1", @@ -7296,9 +7296,9 @@ } }, "node_modules/axios": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", - "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.1.tgz", + "integrity": "sha512-+LV37nQcd1EpFalkXksWNBiA17NZ5m5/WspmHGmZmdx1qBOg/VNq/c4eRJiA9VQQHBOs+N0ZhhdU10h2TyNK7Q==", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -15266,9 +15266,9 @@ } }, "node_modules/jiti": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz", - "integrity": "sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==", + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", "bin": { "jiti": "bin/jiti.js" } @@ -19487,12 +19487,12 @@ } }, "node_modules/react-datepicker": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-6.4.0.tgz", - "integrity": "sha512-TXvxJVCOKZVqJGsZgf1fvzqhuSySaGR84OGyppn46BVsvlyOizfBzOnwDMxi+1erIThlVhYyIK7+1Tb5fieXgg==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-6.9.0.tgz", + "integrity": "sha512-QTxuzeem7BUfVFWv+g5WuvzT0c5BPo+XTCNbMTZKSZQLU+cMMwSUHwspaxuIcDlwNcOH0tiJ+bh1fJ2yxOGYWA==", "dependencies": { "@floating-ui/react": "^0.26.2", - "classnames": "^2.2.6", + "clsx": "^2.1.0", "date-fns": "^3.3.1", "prop-types": "^15.7.2", "react-onclickoutside": "^6.13.0" @@ -19894,9 +19894,9 @@ } }, "node_modules/react-redux": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.1.0.tgz", - "integrity": "sha512-6qoDzIO+gbrza8h3hjMA9aq4nwVFCKFtY2iLxCtVT38Swyy2C/dJCGBXHeHLtx6qlg/8qzc2MrhOeduf5K32wQ==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.1.2.tgz", + "integrity": "sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w==", "dependencies": { "@types/use-sync-external-store": "^0.0.3", "use-sync-external-store": "^1.0.0" @@ -19904,16 +19904,12 @@ "peerDependencies": { "@types/react": "^18.2.25", "react": "^18.0", - "react-native": ">=0.69", "redux": "^5.0.0" }, "peerDependenciesMeta": { "@types/react": { "optional": true }, - "react-native": { - "optional": true - }, "redux": { "optional": true } @@ -20175,9 +20171,9 @@ } }, "node_modules/react-tooltip": { - "version": "5.26.3", - "resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-5.26.3.tgz", - "integrity": "sha512-MpYAws8CEHUd/RC4GaDCdoceph/T4KHM5vS5Dbk8FOmLMvvIht2ymP2htWdrke7K6lqPO8rz8+bnwWUIXeDlzg==", + "version": "5.26.4", + "resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-5.26.4.tgz", + "integrity": "sha512-5WyDrsfw1+6qNVSr3IjqElqJ+cCwE8+44b+HpJ8qRLv7v0a3mcKf8wvv+NfgALFS6QpksGFqTLV2JQ60c+okZQ==", "dependencies": { "@floating-ui/dom": "^1.6.1", "classnames": "^2.3.0" @@ -22139,9 +22135,9 @@ "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==" }, "node_modules/tailwindcss": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.1.tgz", - "integrity": "sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", + "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -22151,7 +22147,7 @@ "fast-glob": "^3.3.0", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", - "jiti": "^1.19.1", + "jiti": "^1.21.0", "lilconfig": "^2.1.0", "micromatch": "^4.0.5", "normalize-path": "^3.0.0", diff --git a/apps/OpenSign/package.json b/apps/OpenSign/package.json index 202157caa..8529059f2 100644 --- a/apps/OpenSign/package.json +++ b/apps/OpenSign/package.json @@ -6,8 +6,8 @@ "@formkit/auto-animate": "^0.8.2", "@radix-ui/themes": "^2.0.3", "@react-pdf/renderer": "^3.4.4", - "@reduxjs/toolkit": "^2.2.4", - "axios": "^1.6.8", + "@reduxjs/toolkit": "^2.2.5", + "axios": "^1.7.1", "file-saver": "^2.0.5", "jwt-decode": "^4.0.0", "moment": "^2.30.1", @@ -19,7 +19,7 @@ "react-bootstrap": "^2.10.2", "react-confetti": "^6.1.0", "react-cookie": "^7.1.4", - "react-datepicker": "^6.4.0", + "react-datepicker": "^6.9.0", "react-dnd": "^16.0.1", "react-dnd-html5-backend": "^16.0.1", "react-dnd-multi-backend": "^8.0.3", @@ -31,14 +31,14 @@ "react-modal": "^3.16.1", "react-pdf": "^7.7.3", "react-quill": "^2.0.0", - "react-redux": "^9.1.0", + "react-redux": "^9.1.2", "react-rnd": "^10.4.10", "react-router-dom": "^6.22.3", "react-scripts": "5.0.1", "react-scrollbars-custom": "^4.1.1", "react-select": "^5.8.0", "react-signature-canvas": "^1.0.6", - "react-tooltip": "^5.26.3", + "react-tooltip": "^5.26.4", "react-web-share": "^2.0.2", "reactour": "^1.19.3", "redux": "^5.0.1", @@ -94,6 +94,6 @@ "postcss": "^8.4.38", "prettier": "^2.8.8", "pretty-quick": "^3.3.1", - "tailwindcss": "^3.4.1" + "tailwindcss": "^3.4.3" } } From 71fbde00992549d89bbaabac9a41b81a5fd232da Mon Sep 17 00:00:00 2001 From: RaktimaNXG <raktima.c@nxglabs.com> Date: Wed, 22 May 2024 09:50:12 +0530 Subject: [PATCH 025/106] fix: add migration script to add new filed SendMail and handle email sent using share link from inProgress report --- apps/OpenSign/src/pages/PlaceHolderSign.js | 67 ++++++++++--------- .../src/primitives/GetReportDisplay.js | 2 +- .../cloud/parsefunction/reportsJson.js | 1 + ...4801-update_contracts_document_cls_cjs.cjs | 32 +++++++++ 4 files changed, 70 insertions(+), 32 deletions(-) create mode 100644 apps/OpenSignServer/databases/migrations/20240521184801-update_contracts_document_cls_cjs.cjs diff --git a/apps/OpenSign/src/pages/PlaceHolderSign.js b/apps/OpenSign/src/pages/PlaceHolderSign.js index e3b6489cb..ae3879387 100644 --- a/apps/OpenSign/src/pages/PlaceHolderSign.js +++ b/apps/OpenSign/src/pages/PlaceHolderSign.js @@ -1163,40 +1163,45 @@ function PlaceHolderSign() { } if (sendMail.data.result.status === "success") { setMailStatus("success"); - - if ( - requestBody && - requestSubject && - isCustomize && - (isSubscribe || !isEnableSubscription) - ) { - try { - const data = { + try { + let data; + if ( + requestBody && + requestSubject && + isCustomize && + (isSubscribe || !isEnableSubscription) + ) { + data = { RequestBody: htmlReqBody, - RequestSubject: requestSubject + RequestSubject: requestSubject, + SendMail: true + }; + } else { + data = { + SendMail: true }; - - await axios - .put( - `${localStorage.getItem("baseUrl")}classes/${localStorage.getItem( - "_appName" - )}_Document/${documentId}`, - data, - { - headers: { - "Content-Type": "application/json", - "X-Parse-Application-Id": localStorage.getItem("parseAppId"), - "X-Parse-Session-Token": localStorage.getItem("accesstoken") - } - } - ) - .then(() => {}) - .catch((err) => { - console.log("axois err ", err); - }); - } catch (e) { - console.log("error", e); } + + await axios + .put( + `${localStorage.getItem("baseUrl")}classes/${localStorage.getItem( + "_appName" + )}_Document/${documentId}`, + data, + { + headers: { + "Content-Type": "application/json", + "X-Parse-Application-Id": localStorage.getItem("parseAppId"), + "X-Parse-Session-Token": localStorage.getItem("accesstoken") + } + } + ) + .then(() => {}) + .catch((err) => { + console.log("axois err ", err); + }); + } catch (e) { + console.log("error", e); } setIsSend(true); diff --git a/apps/OpenSign/src/primitives/GetReportDisplay.js b/apps/OpenSign/src/primitives/GetReportDisplay.js index 654024778..5ecd9a3af 100644 --- a/apps/OpenSign/src/primitives/GetReportDisplay.js +++ b/apps/OpenSign/src/primitives/GetReportDisplay.js @@ -296,7 +296,7 @@ const ReportTable = (props) => { const handleShare = (item) => { setActLoader({ [item.objectId]: true }); const host = window.location.origin; - const sendMail = false; + const sendMail = item?.SendMail || false; const getUrl = (x) => { //encode this url value `${item.objectId}/${x.Email}/${x.objectId}` to base64 using `btoa` function const encodeBase64 = btoa( diff --git a/apps/OpenSignServer/cloud/parsefunction/reportsJson.js b/apps/OpenSignServer/cloud/parsefunction/reportsJson.js index 98d2c06b5..f639ec9ed 100644 --- a/apps/OpenSignServer/cloud/parsefunction/reportsJson.js +++ b/apps/OpenSignServer/cloud/parsefunction/reportsJson.js @@ -101,6 +101,7 @@ export default function reportJson(id, userId) { 'AuditTrail', 'AuditTrail.UserPtr', 'ExpiryDate', + 'SendMail', ], }; // completed documents report diff --git a/apps/OpenSignServer/databases/migrations/20240521184801-update_contracts_document_cls_cjs.cjs b/apps/OpenSignServer/databases/migrations/20240521184801-update_contracts_document_cls_cjs.cjs new file mode 100644 index 000000000..3429f64aa --- /dev/null +++ b/apps/OpenSignServer/databases/migrations/20240521184801-update_contracts_document_cls_cjs.cjs @@ -0,0 +1,32 @@ +/** + * + * @param {Parse} Parse + */ +exports.up = async Parse => { + // TODO: set className here + const className = 'contracts_Document'; + const schema = new Parse.Schema(className); + schema.addBoolean('SendMail'); + // TODO: Set the schema here + // Example: + // schema.addString('name').addNumber('cash'); + + return schema.update(); +}; + +/** + * + * @param {Parse} Parse + */ +exports.down = async Parse => { + // TODO: set className here + const className = 'contracts_Document'; + const schema = new Parse.Schema(className); + schema.deleteField('SendMail'); + + // TODO: Set the schema here + // Example: + // schema.deleteField('name').deleteField('cash'); + + return schema.update(); +}; From 37fd7bbeda88aedefedd53917b6258a4c16c61b0 Mon Sep 17 00:00:00 2001 From: RaktimaNXG <raktima.c@nxglabs.com> Date: Wed, 22 May 2024 11:22:35 +0530 Subject: [PATCH 026/106] fix: update migration script add SendCompletionMail filed in contracts_Document class --- .../20240521184801-update_contracts_document_cls_cjs.cjs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/OpenSignServer/databases/migrations/20240521184801-update_contracts_document_cls_cjs.cjs b/apps/OpenSignServer/databases/migrations/20240521184801-update_contracts_document_cls_cjs.cjs index 3429f64aa..8575d42a2 100644 --- a/apps/OpenSignServer/databases/migrations/20240521184801-update_contracts_document_cls_cjs.cjs +++ b/apps/OpenSignServer/databases/migrations/20240521184801-update_contracts_document_cls_cjs.cjs @@ -7,6 +7,7 @@ exports.up = async Parse => { const className = 'contracts_Document'; const schema = new Parse.Schema(className); schema.addBoolean('SendMail'); + schema.addBoolean('SendCompletionMail'); // TODO: Set the schema here // Example: // schema.addString('name').addNumber('cash'); @@ -23,6 +24,7 @@ exports.down = async Parse => { const className = 'contracts_Document'; const schema = new Parse.Schema(className); schema.deleteField('SendMail'); + schema.deleteField('SendCompletionMail'); // TODO: Set the schema here // Example: From 71016ba5e09248353c47ee792eae780a072ebf81 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <prafull.navkar@nxglabs.com> Date: Wed, 22 May 2024 12:46:34 +0530 Subject: [PATCH 027/106] build(deps): update dependecies --- apps/OpenSign/package-lock.json | 173 +-- apps/OpenSign/package.json | 10 +- apps/OpenSignServer/package-lock.json | 1550 +++++++++++-------------- apps/OpenSignServer/package.json | 10 +- 4 files changed, 803 insertions(+), 940 deletions(-) diff --git a/apps/OpenSign/package-lock.json b/apps/OpenSign/package-lock.json index 7e853264d..a59f26945 100644 --- a/apps/OpenSign/package-lock.json +++ b/apps/OpenSign/package-lock.json @@ -12,7 +12,7 @@ "@radix-ui/themes": "^2.0.3", "@react-pdf/renderer": "^3.4.4", "@reduxjs/toolkit": "^2.2.5", - "axios": "^1.7.1", + "axios": "^1.7.2", "file-saver": "^2.0.5", "jwt-decode": "^4.0.0", "moment": "^2.30.1", @@ -34,7 +34,7 @@ "react-helmet": "^6.1.0", "react-konva": "^18.2.10", "react-modal": "^3.16.1", - "react-pdf": "^7.7.3", + "react-pdf": "^8.0.2", "react-quill": "^2.0.0", "react-redux": "^9.1.2", "react-rnd": "^10.4.10", @@ -49,9 +49,9 @@ "redux": "^5.0.1", "redux-thunk": "^3.1.0", "regex-parser": "^2.3.0", - "serve": "^14.2.1", + "serve": "^14.2.3", "styled-components": "^4.4.1", - "web-vitals": "^2.1.4" + "web-vitals": "^4.0.1" }, "devDependencies": { "@babel/runtime-corejs2": "^7.24.5", @@ -60,7 +60,7 @@ "eslint": "^8.57.0", "eslint-plugin-prettier": "^4.2.1", "eslint-plugin-react": "^7.34.1", - "lint-staged": "^15.2.2", + "lint-staged": "^15.2.4", "postcss": "^8.4.38", "prettier": "^2.8.8", "pretty-quick": "^3.3.1", @@ -6715,9 +6715,9 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, "node_modules/@zeit/schemas": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/@zeit/schemas/-/schemas-2.29.0.tgz", - "integrity": "sha512-g5QiLIfbg3pLuYUJPlisNKY+epQJTcMDsOnVNkscrDP1oi7vmJnzOANYJI/1pZcVJ6umUkBv3aFtlg1UvUHGzA==" + "version": "2.36.0", + "resolved": "https://registry.npmjs.org/@zeit/schemas/-/schemas-2.36.0.tgz", + "integrity": "sha512-7kjMwcChYEzMKjeex9ZFXkt1AyNov9R5HZtjBKVsmVpw7pa7ZtlCGvCBC2vnnXctaYN+aRI61HjIqeetZW5ROg==" }, "node_modules/abab": { "version": "2.0.6", @@ -7296,9 +7296,9 @@ } }, "node_modules/axios": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.1.tgz", - "integrity": "sha512-+LV37nQcd1EpFalkXksWNBiA17NZ5m5/WspmHGmZmdx1qBOg/VNq/c4eRJiA9VQQHBOs+N0ZhhdU10h2TyNK7Q==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", + "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -7908,11 +7908,11 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -11224,9 +11224,9 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -15562,21 +15562,21 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/lint-staged": { - "version": "15.2.2", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.2.tgz", - "integrity": "sha512-TiTt93OPh1OZOsb5B7k96A/ATl2AjIZo+vnzFZ6oHK5FuTk63ByDtxGQpHm+kFETjEWqgkF95M8FRXKR/LEBcw==", + "version": "15.2.4", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.4.tgz", + "integrity": "sha512-3F9KRQIS2fVDGtCkBp4Bx0jswjX7zUcKx6OF0ZeY1prksUyKPRIIUqZhIUYAstJfvj6i48VFs4dwVIbCYwvTYQ==", "dev": true, "dependencies": { "chalk": "5.3.0", - "commander": "11.1.0", + "commander": "12.1.0", "debug": "4.3.4", "execa": "8.0.1", - "lilconfig": "3.0.0", - "listr2": "8.0.1", - "micromatch": "4.0.5", + "lilconfig": "3.1.1", + "listr2": "8.2.1", + "micromatch": "4.0.6", "pidtree": "0.6.0", "string-argv": "0.3.2", - "yaml": "2.3.4" + "yaml": "2.4.2" }, "bin": { "lint-staged": "bin/lint-staged.js" @@ -15601,12 +15601,12 @@ } }, "node_modules/lint-staged/node_modules/commander": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", - "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/lint-staged/node_modules/execa": { @@ -15666,12 +15666,15 @@ } }, "node_modules/lint-staged/node_modules/lilconfig": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", - "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", + "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", "dev": true, "engines": { "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" } }, "node_modules/lint-staged/node_modules/mimic-fn": { @@ -15753,25 +15756,28 @@ } }, "node_modules/lint-staged/node_modules/yaml": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", - "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.2.tgz", + "integrity": "sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==", "dev": true, + "bin": { + "yaml": "bin.mjs" + }, "engines": { "node": ">= 14" } }, "node_modules/listr2": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.0.1.tgz", - "integrity": "sha512-ovJXBXkKGfq+CwmKTjluEqFi3p4h8xvkxGQQAQan22YCgef4KZ1mKGjzfGh6PL6AW5Csw0QiQPNuQyH+6Xk3hA==", + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.1.tgz", + "integrity": "sha512-irTfvpib/rNiD637xeevjO2l3Z5loZmuaRi0L0YE5LfijwVY96oyVn0DFD3o/teAok7nfobMG1THvvcHh/BP6g==", "dev": true, "dependencies": { "cli-truncate": "^4.0.0", "colorette": "^2.0.20", "eventemitter3": "^5.0.1", "log-update": "^6.0.0", - "rfdc": "^1.3.0", + "rfdc": "^1.3.1", "wrap-ansi": "^9.0.0" }, "engines": { @@ -16054,13 +16060,10 @@ } }, "node_modules/log-update/node_modules/ansi-escapes": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.0.tgz", - "integrity": "sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz", + "integrity": "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==", "dev": true, - "dependencies": { - "type-fest": "^3.0.0" - }, "engines": { "node": ">=14.16" }, @@ -16192,18 +16195,6 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/log-update/node_modules/type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/log-update/node_modules/wrap-ansi": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", @@ -16371,14 +16362,14 @@ "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" }, "node_modules/merge-refs": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/merge-refs/-/merge-refs-1.2.2.tgz", - "integrity": "sha512-RwcT7GsQR3KbuLw1rRuodq4Nt547BKEBkliZ0qqsrpyNne9bGTFtsFIsIpx82huWhcl3kOlOlH4H0xkPk/DqVw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/merge-refs/-/merge-refs-1.3.0.tgz", + "integrity": "sha512-nqXPXbso+1dcKDpPCXvwZyJILz+vSLqGGOnDrYHQYE+B8n9JTCekVLC65AfCpR4ggVyA/45Y0iR9LDyS2iI+zA==", "funding": { "url": "https://github.com/wojtekmaj/merge-refs?sponsor=1" }, "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -16408,17 +16399,28 @@ } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.6.tgz", + "integrity": "sha512-Y4Ypn3oujJYxJcMacVgcs92wofTHxp9FzfDpQON4msDefoC0lb3ETvQLOdLcbhSwU1bz8HrL/1sygfBIHudrkQ==", "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" + "braces": "^3.0.3", + "picomatch": "^4.0.2" }, "engines": { "node": ">=8.6" } }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -19836,17 +19838,16 @@ } }, "node_modules/react-pdf": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/react-pdf/-/react-pdf-7.7.3.tgz", - "integrity": "sha512-a2VfDl8hiGjugpqezBTUzJHYLNB7IS7a2t7GD52xMI9xHg8LdVaTMsnM9ZlNmKadnStT/tvX5IfV0yLn+JvYmw==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/react-pdf/-/react-pdf-8.0.2.tgz", + "integrity": "sha512-C0PFC+j9vmEIZ82Iq0c85xUWkgsZTUS05syqOk8NC+7PAanyWlVi/ImYkGQe27zYAlBA6IidRYEt1DAAXKq1Ow==", "dependencies": { "clsx": "^2.0.0", "dequal": "^2.0.3", "make-cancellable-promise": "^1.3.1", "make-event-props": "^1.6.0", - "merge-refs": "^1.2.1", + "merge-refs": "^1.3.0", "pdfjs-dist": "3.11.174", - "prop-types": "^15.6.2", "tiny-invariant": "^1.0.0", "warning": "^4.0.0" }, @@ -19854,9 +19855,9 @@ "url": "https://github.com/wojtekmaj/react-pdf?sponsor=1" }, "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -21069,12 +21070,12 @@ } }, "node_modules/serve": { - "version": "14.2.1", - "resolved": "https://registry.npmjs.org/serve/-/serve-14.2.1.tgz", - "integrity": "sha512-48er5fzHh7GCShLnNyPBRPEjs2I6QBozeGr02gaacROiyS/8ARADlj595j39iZXAqBbJHH/ivJJyPRWY9sQWZA==", + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/serve/-/serve-14.2.3.tgz", + "integrity": "sha512-VqUFMC7K3LDGeGnJM9h56D3XGKb6KGgOw0cVNtA26yYXHCcpxf3xwCTUaQoWlVS7i8Jdh3GjQkOB23qsXyjoyQ==", "dependencies": { - "@zeit/schemas": "2.29.0", - "ajv": "8.11.0", + "@zeit/schemas": "2.36.0", + "ajv": "8.12.0", "arg": "5.0.2", "boxen": "7.0.0", "chalk": "5.0.1", @@ -21232,9 +21233,9 @@ } }, "node_modules/serve/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -23137,9 +23138,9 @@ } }, "node_modules/web-vitals": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-2.1.4.tgz", - "integrity": "sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg==" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-4.0.1.tgz", + "integrity": "sha512-AW6qT/vXK3pbf+WgVcEBXY//AWCpXjVKgdb6rt0cARSUdtT+NUtZCOeo+CSLUX7PjSQ275DmxfkAs7QlPbtR6w==" }, "node_modules/webidl-conversions": { "version": "6.1.0", diff --git a/apps/OpenSign/package.json b/apps/OpenSign/package.json index 8529059f2..2c8820be3 100644 --- a/apps/OpenSign/package.json +++ b/apps/OpenSign/package.json @@ -7,7 +7,7 @@ "@radix-ui/themes": "^2.0.3", "@react-pdf/renderer": "^3.4.4", "@reduxjs/toolkit": "^2.2.5", - "axios": "^1.7.1", + "axios": "^1.7.2", "file-saver": "^2.0.5", "jwt-decode": "^4.0.0", "moment": "^2.30.1", @@ -29,7 +29,7 @@ "react-helmet": "^6.1.0", "react-konva": "^18.2.10", "react-modal": "^3.16.1", - "react-pdf": "^7.7.3", + "react-pdf": "^8.0.2", "react-quill": "^2.0.0", "react-redux": "^9.1.2", "react-rnd": "^10.4.10", @@ -44,9 +44,9 @@ "redux": "^5.0.1", "redux-thunk": "^3.1.0", "regex-parser": "^2.3.0", - "serve": "^14.2.1", + "serve": "^14.2.3", "styled-components": "^4.4.1", - "web-vitals": "^2.1.4" + "web-vitals": "^4.0.1" }, "scripts": { "start": "serve -s build", @@ -90,7 +90,7 @@ "eslint": "^8.57.0", "eslint-plugin-prettier": "^4.2.1", "eslint-plugin-react": "^7.34.1", - "lint-staged": "^15.2.2", + "lint-staged": "^15.2.4", "postcss": "^8.4.38", "prettier": "^2.8.8", "pretty-quick": "^3.3.1", diff --git a/apps/OpenSignServer/package-lock.json b/apps/OpenSignServer/package-lock.json index f0a454474..10bcaa5d1 100644 --- a/apps/OpenSignServer/package-lock.json +++ b/apps/OpenSignServer/package-lock.json @@ -14,8 +14,8 @@ "@signpdf/placeholder-pdf-lib": "^3.2.4", "@signpdf/signer-p12": "^3.2.4", "@signpdf/signpdf": "^3.2.4", - "aws-sdk": "^2.1581.0", - "axios": "^1.7.1", + "aws-sdk": "^2.1625.0", + "axios": "^1.7.2", "cors": "^2.8.5", "dotenv": "^16.4.5", "express": "^4.19.2", @@ -29,19 +29,17 @@ "multer": "^1.4.5-lts.1", "multer-s3": "^3.0.1", "node-forge": "^1.3.1", - "node-signpdf": "^1.5.1", "nodemailer": "^6.9.13", "parse": "^5.1.0", "parse-dbtool": "^1.2.0", "parse-server": "^7.0.0", "parse-server-api-mail-adapter": "^3.1.1", "pdf-lib": "^1.17.1", - "pdfkit": "^0.14.0", - "posthog-node": "^3.6.3" + "posthog-node": "^4.0.1" }, "devDependencies": { "@babel/eslint-parser": "^7.24.5", - "eslint": "^8.57.0", + "eslint": "^9.3.0", "jasmine": "^5.1.0", "mongodb-runner": "^5.6.2", "nodemon": "^3.1.0", @@ -1612,14 +1610,14 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", + "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", + "espree": "^10.0.1", + "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -1627,142 +1625,117 @@ "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dependencies": { - "type-fest": "^0.20.2" - }, + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.3.0.tgz", + "integrity": "sha512-niBqk8iwv96+yuTwjM6bWg8ovzAPF9qkICsGtcoa5/dmqcEMfdwNAX7+/OHcJHc7wj7XqPxH98oAHytFYlw6Sw==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@fastify/busboy": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-1.2.1.tgz", - "integrity": "sha512-7PQA7EH43S0CxcOa9OeAnaeA0oQ+e/DHNPZwSQM9CQHW76jle5+OvLdibRp/Aafs9KXbLhxyjOTkRjWUbQEd3Q==", - "dependencies": { - "text-decoding": "^1.0.0" - }, - "engines": { - "node": ">=14" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@firebase/app-check-interop-types": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.0.tgz", - "integrity": "sha512-xAxHPZPIgFXnI+vb4sbBjZcde7ZluzPPaSK7Lx3/nmuVk4TjZvnL8ONnkd4ERQKL8WePQySU+pRcWkh8rDf5Sg==" + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.2.tgz", + "integrity": "sha512-LMs47Vinv2HBMZi49C09dJxp0QT5LwDzFaVGf/+ITHe3BlIhUiLNttkATSXplc89A2lAaeTqjgqVkiRfUGyQiQ==" }, "node_modules/@firebase/app-types": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.0.tgz", - "integrity": "sha512-AeweANOIo0Mb8GiYm3xhTEBVCmPwTYAu9Hcd2qSkLuga/6+j9b1Jskl5bpiSQWy9eJ/j5pavxj6eYogmnuzm+Q==" + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.2.tgz", + "integrity": "sha512-oMEZ1TDlBz479lmABwWsWjzHwheQKiAgnuKxE0pz0IXCVx7/rtlkx1fQ6GfgK24WCrxDKMplZrT50Kh04iMbXQ==" }, "node_modules/@firebase/auth-interop-types": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.1.tgz", - "integrity": "sha512-VOaGzKp65MY6P5FI84TfYKBXEPi6LmOCSMMzys6o2BN2LOsqy7pCuZCup7NYnfbk5OkkQKzvIfHOzTm0UDpkyg==" + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.3.tgz", + "integrity": "sha512-Fc9wuJGgxoxQeavybiuwgyi+0rssr76b+nHpj+eGhXFYAdudMWyfBHvFL/I5fEHniUM/UQdFzi9VXJK2iZF7FQ==" }, "node_modules/@firebase/component": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.5.tgz", - "integrity": "sha512-2tVDk1ixi12sbDmmfITK8lxSjmcb73BMF6Qwc3U44hN/J1Fi1QY/Hnnb6klFlbB9/G16a3J3d4nXykye2EADTw==", + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.7.tgz", + "integrity": "sha512-baH1AA5zxfaz4O8w0vDwETByrKTQqB5CDjRls79Sa4eAGAoERw4Tnung7XbMl3jbJ4B/dmmtsMrdki0KikwDYA==", "dependencies": { - "@firebase/util": "1.9.4", + "@firebase/util": "1.9.6", "tslib": "^2.1.0" } }, "node_modules/@firebase/database": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.0.3.tgz", - "integrity": "sha512-9fjqLt9JzL46gw9+NRqsgQEMjgRwfd8XtzcKqG+UYyhVeFCdVRQ0Wp6Dw/dvYHnbH5vNEKzNv36dcB4p+PIAAA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.0.5.tgz", + "integrity": "sha512-cAfwBqMQuW6HbhwI3Cb/gDqZg7aR0OmaJ85WUxlnoYW2Tm4eR0hFl5FEijI3/gYPUiUcUPQvTkGV222VkT7KPw==", "dependencies": { - "@firebase/app-check-interop-types": "0.3.0", - "@firebase/auth-interop-types": "0.2.1", - "@firebase/component": "0.6.5", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.4", + "@firebase/app-check-interop-types": "0.3.2", + "@firebase/auth-interop-types": "0.2.3", + "@firebase/component": "0.6.7", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.9.6", "faye-websocket": "0.11.4", "tslib": "^2.1.0" } }, "node_modules/@firebase/database-compat": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-1.0.3.tgz", - "integrity": "sha512-7tHEOcMbK5jJzHWyphPux4osogH/adWwncxdMxdBpB9g1DNIyY4dcz1oJdlkXGM/i/AjUBesZsd5CuwTRTBNTw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-1.0.5.tgz", + "integrity": "sha512-NDSMaDjQ+TZEMDMmzJwlTL05kh1+0Y84C+kVMaOmNOzRGRM7VHi29I6YUhCetXH+/b1Wh4ZZRyp1CuWkd8s6hg==", "dependencies": { - "@firebase/component": "0.6.5", - "@firebase/database": "1.0.3", - "@firebase/database-types": "1.0.1", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.4", + "@firebase/component": "0.6.7", + "@firebase/database": "1.0.5", + "@firebase/database-types": "1.0.3", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.9.6", "tslib": "^2.1.0" } }, "node_modules/@firebase/database-types": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.1.tgz", - "integrity": "sha512-Tmcmx5XgiI7UVF/4oGg2P3AOTfq3WKEPsm2yf+uXtN7uG/a4WTWhVMrXGYRY2ZUL1xPxv9V33wQRJ+CcrUhVXw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.3.tgz", + "integrity": "sha512-39V/Riv2R3O/aUjYKh0xypj7NTNXNAK1bcgY5Kx+hdQPRS/aPTS8/5c0CGFYKgVuFbYlnlnhrCTYsh2uNhGwzA==", "dependencies": { - "@firebase/app-types": "0.9.0", - "@firebase/util": "1.9.4" + "@firebase/app-types": "0.9.2", + "@firebase/util": "1.9.6" } }, "node_modules/@firebase/logger": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.0.tgz", - "integrity": "sha512-eRKSeykumZ5+cJPdxxJRgAC3G5NknY2GwEbKfymdnXtnT0Ucm4pspfR6GT4MUQEDuJwRVbVcSx85kgJulMoFFA==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.2.tgz", + "integrity": "sha512-Q1VuA5M1Gjqrwom6I6NUU4lQXdo9IAQieXlujeHZWvRt1b7qQ0KwBaNAjgxG27jgF9/mUwsNmO8ptBCGVYhB0A==", "dependencies": { "tslib": "^2.1.0" } }, "node_modules/@firebase/util": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.9.4.tgz", - "integrity": "sha512-WLonYmS1FGHT97TsUmRN3qnTh5TeeoJp1Gg5fithzuAgdZOUtsYECfy7/noQ3llaguios8r5BuXSEiK82+UrxQ==", + "version": "1.9.6", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.9.6.tgz", + "integrity": "sha512-IBr1MZbp4d5MjBCXL3TW1dK/PDXX4yOGbiwRNh1oAbE/+ci5Uuvy9KIrsFYY80as1I0iOaD5oOMA9Q8j4TJWcw==", "dependencies": { "tslib": "^2.1.0" } }, "node_modules/@google-cloud/firestore": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-7.4.0.tgz", - "integrity": "sha512-PRukAUgeBOZu/4pK9NXkAs8ur6QUpG6bBiwcnSO1qsh0FlR93gqU+VtkCx3EJM46S10jzMhHqpA0NoVbnUs5TQ==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-7.7.0.tgz", + "integrity": "sha512-41/vBFXOeSYjFI/2mJuJrDwg2umGk+FDrI/SCGzBRUe+UZWDN4GoahIbGZ19YQsY0ANNl6DRiAy4wD6JezK02g==", "optional": true, "dependencies": { "fast-deep-equal": "^3.1.1", "functional-red-black-tree": "^1.0.1", - "google-gax": "^4.0.4", - "protobufjs": "^7.2.5" + "google-gax": "^4.3.3", + "protobufjs": "^7.2.6" }, "engines": { "node": ">=14.0.0" @@ -1800,9 +1773,9 @@ } }, "node_modules/@google-cloud/storage": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-7.9.0.tgz", - "integrity": "sha512-PlFl7g3r91NmXtZHXsSEfTZES5ysD3SSBWmX4iBdQ2TFH7tN/Vn/IhnVELCHtgh1vc+uYPZ7XvRYaqtDCdghIA==", + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-7.11.1.tgz", + "integrity": "sha512-tibLSvgw7nDohMyIelt26kBpJ59YGWA2Rzep++DFNzEzKaSuCSp56Se9iM13ZlM3j5nLzR21IBkpRN58CmvCIw==", "optional": true, "dependencies": { "@google-cloud/paginator": "^5.0.0", @@ -1810,14 +1783,12 @@ "@google-cloud/promisify": "^4.0.0", "abort-controller": "^3.0.0", "async-retry": "^1.3.3", - "compressible": "^2.0.12", "duplexify": "^4.1.3", - "ent": "^2.2.0", "fast-xml-parser": "^4.3.0", "gaxios": "^6.0.2", "google-auth-library": "^9.6.3", + "html-entities": "^2.5.2", "mime": "^3.0.0", - "mime-types": "^2.0.8", "p-limit": "^3.0.1", "retry-request": "^7.0.0", "teeny-request": "^9.0.0", @@ -1828,9 +1799,9 @@ } }, "node_modules/@google-cloud/storage/node_modules/fast-xml-parser": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.3.6.tgz", - "integrity": "sha512-M2SovcRxD4+vC493Uc2GZVcZaj66CCJhWurC4viynVSTvrpErCShNcDz1lAho6n9REQKvL/ll4A4/fw6Y9z8nw==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.0.tgz", + "integrity": "sha512-kLY3jFlwIYwBNDojclKsNAC12sfD6NwW74QB2CoNGPvtVxjliYehVunB3HYyNi+n4Tt1dAcgwYvmKF/Z18flqg==", "funding": [ { "type": "github", @@ -1935,12 +1906,12 @@ } }, "node_modules/@grpc/grpc-js": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.3.tgz", - "integrity": "sha512-qiO9MNgYnwbvZ8MK0YLWbnGrNX3zTcj6/Ef7UHu5ZofER3e2nF3Y35GaPo9qNJJ/UJQKa4KL+z/F4Q8Q+uCdUQ==", + "version": "1.10.8", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.8.tgz", + "integrity": "sha512-vYVqYzHicDqyKB+NQhAc54I1QWCBLCrYG6unqOIcBTHx+7x8C9lcoLj3KVJXs2VB4lUbpWY+Kk9NipcbXYWmvg==", "optional": true, "dependencies": { - "@grpc/proto-loader": "^0.7.10", + "@grpc/proto-loader": "^0.7.13", "@js-sdsl/ordered-map": "^4.4.2" }, "engines": { @@ -1948,14 +1919,14 @@ } }, "node_modules/@grpc/proto-loader": { - "version": "0.7.10", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.10.tgz", - "integrity": "sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ==", + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz", + "integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==", "optional": true, "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", - "protobufjs": "^7.2.4", + "protobufjs": "^7.2.5", "yargs": "^17.7.2" }, "bin": { @@ -2066,11 +2037,11 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", + "@humanwhocodes/object-schema": "^2.0.3", "debug": "^4.3.1", "minimatch": "^3.0.5" }, @@ -2091,9 +2062,21 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==" + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.0.tgz", + "integrity": "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } }, "node_modules/@isaacs/cliui": { "version": "8.0.2", @@ -2742,88 +2725,6 @@ "ms": "^2.1.1" } }, - "node_modules/@parse/push-adapter": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@parse/push-adapter/-/push-adapter-5.1.1.tgz", - "integrity": "sha512-gazpr/H8tnEhQtDPPYctsvNU0ICkkZAB0wIOnt5AOFANZ9rldl9vRX/BONtmrpewNinfCnqkGUvI9+tVO+rw4w==", - "dependencies": { - "@parse/node-apn": "6.0.1", - "@parse/node-gcm": "1.0.2", - "firebase-admin": "12.0.0", - "npmlog": "7.0.1", - "parse": "4.2.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@parse/push-adapter/node_modules/@babel/runtime-corejs3": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.21.0.tgz", - "integrity": "sha512-TDD4UJzos3JJtM+tHX+w2Uc+KWj7GV+VKKFdMVd2Rx8sdA19hcc3P3AHFYd5LVOw+pYuSd5lICC3gm52B6Rwxw==", - "dependencies": { - "core-js-pure": "^3.25.1", - "regenerator-runtime": "^0.13.11" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@parse/push-adapter/node_modules/idb-keyval": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.2.0.tgz", - "integrity": "sha512-uw+MIyQn2jl3+hroD7hF8J7PUviBU7BPKWw4f/ISf32D4LoGu98yHjrzWWJDASu9QNrX10tCJqk9YY0ClWm8Ng==", - "dependencies": { - "safari-14-idb-fix": "^3.0.0" - } - }, - "node_modules/@parse/push-adapter/node_modules/parse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/parse/-/parse-4.2.0.tgz", - "integrity": "sha512-K8bWs0wM2qRhkSr6N16j8OvsF6Uallrynqng9e+tzR3RdKuB09vaJh48qrf9MbiJ1Ya4JZI7AfEHYF+ywEKs7Q==", - "dependencies": { - "@babel/runtime-corejs3": "7.21.0", - "idb-keyval": "6.2.0", - "react-native-crypto-js": "1.0.0", - "uuid": "9.0.0", - "ws": "8.13.0", - "xmlhttprequest": "1.8.0" - }, - "engines": { - "node": ">=14.21.0 <17 || >=18 <20" - }, - "optionalDependencies": { - "crypto-js": "4.1.1" - } - }, - "node_modules/@parse/push-adapter/node_modules/uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@parse/push-adapter/node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/@parse/s3-files-adapter": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@parse/s3-files-adapter/-/s3-files-adapter-2.2.0.tgz", @@ -3764,14 +3665,6 @@ "node": ">=14.0.0" } }, - "node_modules/@swc/helpers": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.3.17.tgz", - "integrity": "sha512-tb7Iu+oZ+zWJZ3HJqwx8oNwSDIU440hmVMDPhpACWQWnrZHK99Bxs70gT1L2dnr5Hg50ZRWEFkQCAnOVVV0z1Q==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@tootallnate/once": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", @@ -3962,7 +3855,8 @@ "node_modules/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "peer": true }, "node_modules/abbrev": { "version": "1.1.1", @@ -4130,18 +4024,6 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", - "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -4210,9 +4092,9 @@ } }, "node_modules/aws-sdk": { - "version": "2.1581.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1581.0.tgz", - "integrity": "sha512-lWvpj36dL0HC8i4l8N0NnV2ljedOrij1Ox0SjHwQTIvePes4lNm+khOLV0T7NDA1C6igsGozBO+8OcNGPDhfAw==", + "version": "2.1625.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1625.0.tgz", + "integrity": "sha512-Q96jKdo9PtBYPNOXoGTYvOt78TSRouLOeeFpcVfsN38O0Lc3LmuIMz3GHMofdLZGKRSa22RnpiDTCnpp6Xx1jw==", "hasInstallScript": true, "dependencies": { "buffer": "4.9.2", @@ -4267,9 +4149,9 @@ "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" }, "node_modules/axios": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.1.tgz", - "integrity": "sha512-+LV37nQcd1EpFalkXksWNBiA17NZ5m5/WspmHGmZmdx1qBOg/VNq/c4eRJiA9VQQHBOs+N0ZhhdU10h2TyNK7Q==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", + "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -4428,14 +4310,6 @@ "node": ">=8" } }, - "node_modules/brotli": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz", - "integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==", - "dependencies": { - "base64-js": "^1.1.2" - } - }, "node_modules/browserslist": { "version": "4.21.5", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", @@ -4732,14 +4606,6 @@ "wrap-ansi": "^6.2.0" } }, - "node_modules/clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", - "engines": { - "node": ">=0.8" - } - }, "node_modules/cluster-key-slot": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", @@ -4821,18 +4687,6 @@ "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", "dev": true }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "optional": true, - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -5126,39 +4980,6 @@ "node": ">=0.10.0" } }, - "node_modules/deep-equal": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.2.tgz", - "integrity": "sha512-xjVyBf0w5vH0I42jdAZzOKVldmPgSulmiyPRywoyq7HXC9qdgo17kxJE+rdnif5Tz6+pIrpJI8dCpMNLIGkUiA==", - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.1", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.0", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/deep-equal/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -5187,21 +5008,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", - "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -5227,15 +5033,11 @@ "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/dfa": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/dfa/-/dfa-1.2.0.tgz", - "integrity": "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==" - }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "peer": true, "dependencies": { "esutils": "^2.0.2" }, @@ -5348,36 +5150,6 @@ "once": "^1.4.0" } }, - "node_modules/ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==", - "optional": true - }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-get-iterator/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - }, "node_modules/es5-ext": { "version": "0.10.64", "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", @@ -5440,40 +5212,36 @@ } }, "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.3.0.tgz", + "integrity": "sha512-5Iv4CsZW030lpUqHBapdPo3MJetAPtejVW8B84GIcIIv8+ohFaddXsrn1Gn8uD9ijDb+kcYKFUVmC8qG8B2ORQ==", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "9.3.0", + "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.3.0", "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", - "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", + "eslint-scope": "^8.0.1", + "eslint-visitor-keys": "^4.0.0", + "espree": "^10.0.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", + "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", @@ -5487,7 +5255,7 @@ "eslint": "bin/eslint.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -5570,26 +5338,26 @@ } }, "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.1.tgz", + "integrity": "sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", + "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -5603,20 +5371,6 @@ "node": ">=4.0" } }, - "node_modules/eslint/node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eslint/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -5636,17 +5390,6 @@ "node": ">=8" } }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/esniff": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", @@ -5662,27 +5405,27 @@ } }, "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.0.1.tgz", + "integrity": "sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==", "dependencies": { - "acorn": "^8.9.0", + "acorn": "^8.11.3", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "eslint-visitor-keys": "^4.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", + "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -5990,14 +5733,14 @@ "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" }, "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dependencies": { - "flat-cache": "^3.0.4" + "flat-cache": "^4.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16.0.0" } }, "node_modules/file-stream-rotator": { @@ -6105,56 +5848,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/firebase-admin": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-12.0.0.tgz", - "integrity": "sha512-wBrrSSsKV++/+O8E7O/C7/wL0nbG/x4Xv4yatz/+sohaZ+LsnWtYUcrd3gZutO86hLpDex7xgyrkKbgulmtVyQ==", - "dependencies": { - "@fastify/busboy": "^1.2.1", - "@firebase/database-compat": "^1.0.2", - "@firebase/database-types": "^1.0.0", - "@types/node": "^20.10.3", - "jsonwebtoken": "^9.0.0", - "jwks-rsa": "^3.0.1", - "node-forge": "^1.3.1", - "uuid": "^9.0.0" - }, - "engines": { - "node": ">=14" - }, - "optionalDependencies": { - "@google-cloud/firestore": "^7.1.0", - "@google-cloud/storage": "^7.7.0" - } - }, - "node_modules/firebase-admin/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" + "flatted": "^3.2.9", + "keyv": "^4.5.4" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16" } }, "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==" }, "node_modules/fn.name": { "version": "1.1.0", @@ -6180,22 +5889,6 @@ } } }, - "node_modules/fontkit": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/fontkit/-/fontkit-1.9.0.tgz", - "integrity": "sha512-HkW/8Lrk8jl18kzQHvAw9aTHe1cqsyx5sDnxncx652+CIfhawokEPkeM3BoIC+z/Xv7a0yMr0f3pRRwhGH455g==", - "dependencies": { - "@swc/helpers": "^0.3.13", - "brotli": "^1.3.2", - "clone": "^2.1.2", - "deep-equal": "^2.0.5", - "dfa": "^1.2.0", - "restructure": "^2.0.1", - "tiny-inflate": "^1.0.3", - "unicode-properties": "^1.3.1", - "unicode-trie": "^2.0.0" - } - }, "node_modules/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", @@ -6348,14 +6041,6 @@ "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", "optional": true }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/gauge": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/gauge/-/gauge-5.0.1.tgz", @@ -6629,12 +6314,12 @@ } }, "node_modules/google-gax": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-4.3.1.tgz", - "integrity": "sha512-qpSfslpwqToIgQ+Tf3MjWIDjYK4UFIZ0uz6nLtttlW9N1NQA4PhGf9tlGo6KDYJ4rgL2w4CjXVd0z5yeNpN/Iw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-4.3.3.tgz", + "integrity": "sha512-f4F2Y9X4+mqsrJuLZsuTljYuQpcBnQsCt9ScvZpdM8jGjqrcxyJi5JUiqtq0jtpdHVPzyit0N7f5t07e+kH5EA==", "optional": true, "dependencies": { - "@grpc/grpc-js": "~1.10.0", + "@grpc/grpc-js": "~1.10.3", "@grpc/proto-loader": "^0.7.0", "@types/long": "^4.0.0", "abort-controller": "^3.0.0", @@ -6651,6 +6336,30 @@ "node": ">=14" } }, + "node_modules/google-gax/node_modules/protobufjs": { + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.6.tgz", + "integrity": "sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/google-gax/node_modules/uuid": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", @@ -6724,7 +6433,8 @@ "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "peer": true }, "node_modules/graphql": { "version": "16.8.1", @@ -6841,14 +6551,6 @@ "node": ">= 0.4.0" } }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -6857,17 +6559,6 @@ "node": ">=4" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dependencies": { - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/has-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", @@ -6942,6 +6633,22 @@ "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==" }, + "node_modules/html-entities": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", + "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "optional": true + }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -7115,19 +6822,6 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", - "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/intersect": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/intersect/-/intersect-1.0.1.tgz", @@ -7161,35 +6855,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-arrayish": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -7202,21 +6872,6 @@ "node": ">=8" } }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -7228,20 +6883,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -7283,14 +6924,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-natural-number": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", @@ -7305,20 +6938,6 @@ "node": ">=0.12.0" } }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -7332,40 +6951,6 @@ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -7375,34 +6960,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-typed-array": { "version": "1.1.10", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", @@ -7426,26 +6983,6 @@ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" }, - "node_modules/is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -7772,6 +7309,11 @@ "bignumber.js": "^9.0.0" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + }, "node_modules/json-schema": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", @@ -7958,6 +7500,14 @@ "node": ">=12.0.0" } }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/kuler": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", @@ -8002,23 +7552,6 @@ "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==" }, - "node_modules/linebreak": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/linebreak/-/linebreak-1.1.0.tgz", - "integrity": "sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==", - "dependencies": { - "base64-js": "0.0.8", - "unicode-trie": "^2.0.0" - } - }, - "node_modules/linebreak/node_modules/base64-js": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", - "integrity": "sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==", - "engines": { - "node": ">= 0.4" - } - }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -8823,17 +8356,6 @@ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==" }, - "node_modules/node-signpdf": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/node-signpdf/-/node-signpdf-1.5.1.tgz", - "integrity": "sha512-72pvjj87WOsasSaEXjZCJc4VCFCcAh5mRqznJNqZCqd34KsmwhxoeGA2u03QvQ/p1fm+dA3S17wXIaj7wQzEcQ==", - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "node-forge": "^1.2.1" - } - }, "node_modules/nodemailer": { "version": "6.9.13", "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.13.tgz", @@ -9090,29 +8612,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "engines": { - "node": ">= 0.4" - } - }, "node_modules/object-path": { "version": "0.11.8", "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.8.tgz", @@ -9121,23 +8620,6 @@ "node": ">= 10.12.0" } }, - "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -9625,6 +9107,72 @@ "semver": "bin/semver.js" } }, + "node_modules/parse-server/node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "peer": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/parse-server/node_modules/@eslint/eslintrc/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "peer": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/parse-server/node_modules/@eslint/eslintrc/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "peer": true + }, + "node_modules/parse-server/node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "peer": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/parse-server/node_modules/@fastify/busboy": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-1.2.1.tgz", + "integrity": "sha512-7PQA7EH43S0CxcOa9OeAnaeA0oQ+e/DHNPZwSQM9CQHW76jle5+OvLdibRp/Aafs9KXbLhxyjOTkRjWUbQEd3Q==", + "dependencies": { + "text-decoding": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/parse-server/node_modules/@graphql-tools/merge": { "version": "8.4.1", "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-8.4.1.tgz", @@ -9649,11 +9197,151 @@ "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, + "node_modules/parse-server/node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "peer": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/parse-server/node_modules/@humanwhocodes/config-array/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "peer": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/parse-server/node_modules/@humanwhocodes/config-array/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "peer": true + }, "node_modules/parse-server/node_modules/@parse/fs-files-adapter": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@parse/fs-files-adapter/-/fs-files-adapter-2.0.1.tgz", "integrity": "sha512-9DY0T9lK73Ysw+wxxsBt9rpxWxJpMlHl/fTW175XSajusW0ZP5jERI3BTKeclV28eVmSU690EO2vnwCURsPZ7g==" }, + "node_modules/parse-server/node_modules/@parse/push-adapter": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@parse/push-adapter/-/push-adapter-5.1.1.tgz", + "integrity": "sha512-gazpr/H8tnEhQtDPPYctsvNU0ICkkZAB0wIOnt5AOFANZ9rldl9vRX/BONtmrpewNinfCnqkGUvI9+tVO+rw4w==", + "dependencies": { + "@parse/node-apn": "6.0.1", + "@parse/node-gcm": "1.0.2", + "firebase-admin": "12.0.0", + "npmlog": "7.0.1", + "parse": "4.2.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/parse-server/node_modules/@parse/push-adapter/node_modules/@babel/runtime-corejs3": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.21.0.tgz", + "integrity": "sha512-TDD4UJzos3JJtM+tHX+w2Uc+KWj7GV+VKKFdMVd2Rx8sdA19hcc3P3AHFYd5LVOw+pYuSd5lICC3gm52B6Rwxw==", + "dependencies": { + "core-js-pure": "^3.25.1", + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/parse-server/node_modules/@parse/push-adapter/node_modules/crypto-js": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", + "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==", + "optional": true + }, + "node_modules/parse-server/node_modules/@parse/push-adapter/node_modules/idb-keyval": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.2.0.tgz", + "integrity": "sha512-uw+MIyQn2jl3+hroD7hF8J7PUviBU7BPKWw4f/ISf32D4LoGu98yHjrzWWJDASu9QNrX10tCJqk9YY0ClWm8Ng==", + "dependencies": { + "safari-14-idb-fix": "^3.0.0" + } + }, + "node_modules/parse-server/node_modules/@parse/push-adapter/node_modules/parse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/parse/-/parse-4.2.0.tgz", + "integrity": "sha512-K8bWs0wM2qRhkSr6N16j8OvsF6Uallrynqng9e+tzR3RdKuB09vaJh48qrf9MbiJ1Ya4JZI7AfEHYF+ywEKs7Q==", + "dependencies": { + "@babel/runtime-corejs3": "7.21.0", + "idb-keyval": "6.2.0", + "react-native-crypto-js": "1.0.0", + "uuid": "9.0.0", + "ws": "8.13.0", + "xmlhttprequest": "1.8.0" + }, + "engines": { + "node": ">=14.21.0 <17 || >=18 <20" + }, + "optionalDependencies": { + "crypto-js": "4.1.1" + } + }, + "node_modules/parse-server/node_modules/@parse/push-adapter/node_modules/uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/parse-server/node_modules/@parse/push-adapter/node_modules/ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/parse-server/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/parse-server/node_modules/bson": { "version": "5.5.1", "resolved": "https://registry.npmjs.org/bson/-/bson-5.5.1.tgz", @@ -9662,6 +9350,40 @@ "node": ">=14.20.1" } }, + "node_modules/parse-server/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/parse-server/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/parse-server/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "peer": true + }, "node_modules/parse-server/node_modules/crypto-js": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", @@ -9676,6 +9398,162 @@ "ms": "2.0.0" } }, + "node_modules/parse-server/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-server/node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/parse-server/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "peer": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/parse-server/node_modules/eslint/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "peer": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/parse-server/node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "peer": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/parse-server/node_modules/eslint/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "peer": true + }, + "node_modules/parse-server/node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "peer": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/parse-server/node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "peer": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/parse-server/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "peer": true, + "engines": { + "node": ">=4.0" + } + }, "node_modules/parse-server/node_modules/express": { "version": "4.18.2", "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", @@ -9745,6 +9623,78 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, + "node_modules/parse-server/node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "peer": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/parse-server/node_modules/firebase-admin": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-12.0.0.tgz", + "integrity": "sha512-wBrrSSsKV++/+O8E7O/C7/wL0nbG/x4Xv4yatz/+sohaZ+LsnWtYUcrd3gZutO86hLpDex7xgyrkKbgulmtVyQ==", + "dependencies": { + "@fastify/busboy": "^1.2.1", + "@firebase/database-compat": "^1.0.2", + "@firebase/database-types": "^1.0.0", + "@types/node": "^20.10.3", + "jsonwebtoken": "^9.0.0", + "jwks-rsa": "^3.0.1", + "node-forge": "^1.3.1", + "uuid": "^9.0.0" + }, + "engines": { + "node": ">=14" + }, + "optionalDependencies": { + "@google-cloud/firestore": "^7.1.0", + "@google-cloud/storage": "^7.7.0" + } + }, + "node_modules/parse-server/node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "peer": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/parse-server/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "peer": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-server/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "peer": true, + "engines": { + "node": ">=8" + } + }, "node_modules/parse-server/node_modules/lru-cache": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", @@ -9861,6 +9811,30 @@ "node": ">=10" } }, + "node_modules/parse-server/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==", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/parse-server/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/parse-server/node_modules/uuid": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", @@ -9974,22 +9948,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, - "node_modules/pdfkit": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/pdfkit/-/pdfkit-0.14.0.tgz", - "integrity": "sha512-Hnor8/78jhHm6ONrxWhrqOwAVALlBnFyWOF8sstBZMiqHZgZ5A6RU+Q3yahhw82plxpT7LOfH3b3qcOX6rzMQg==", - "dependencies": { - "crypto-js": "^4.2.0", - "fontkit": "^1.8.1", - "linebreak": "^1.0.2", - "png-js": "^1.0.0" - } - }, - "node_modules/pdfkit/node_modules/crypto-js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", - "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" - }, "node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", @@ -10276,11 +10234,6 @@ "node": ">=4" } }, - "node_modules/png-js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/png-js/-/png-js-1.0.0.tgz", - "integrity": "sha512-k+YsbhpA9e+EFfKjTCH3VW6aoKlyNYI6NYdTfDL4CIvFnvsuO84ttonmZE7rc+v23SLTH8XX+5w/Ak9v0xGY4g==" - }, "node_modules/postgres-array": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", @@ -10317,9 +10270,9 @@ } }, "node_modules/posthog-node": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/posthog-node/-/posthog-node-3.6.3.tgz", - "integrity": "sha512-JB+ei0LkwE+rKHyW5z79Nd1jUaGxU6TvkfjFqY9vQaHxU5aU8dRl0UUaEmZdZbHwjp3WmXCBQQRNyimwbNQfCw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/posthog-node/-/posthog-node-4.0.1.tgz", + "integrity": "sha512-rtqm2h22QxLGBrW2bLYzbRhliIrqgZ0k+gF0LkQ1SNdeD06YE5eilV0MxZppFSxC8TfH0+B0cWCuebEnreIDgQ==", "dependencies": { "axios": "^1.6.2", "rusha": "^0.8.14" @@ -10394,9 +10347,9 @@ } }, "node_modules/protobufjs": { - "version": "7.2.6", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.6.tgz", - "integrity": "sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.0.tgz", + "integrity": "sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g==", "hasInstallScript": true, "optional": true, "dependencies": { @@ -10587,22 +10540,6 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/release-zalgo": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", @@ -10698,11 +10635,6 @@ "node": ">=4" } }, - "node_modules/restructure": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/restructure/-/restructure-2.0.1.tgz", - "integrity": "sha512-e0dOpjm5DseomnXx2M5lpdZ5zoHqF1+bqdMJUohoYVVQa7cBdnk7fdmeI6byNWP/kiME72EeTiSypTCVnpLiDg==" - }, "node_modules/retry": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", @@ -11166,17 +11098,6 @@ "node": ">= 0.8" } }, - "node_modules/stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", - "dependencies": { - "internal-slot": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/stream-browserify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", @@ -11533,11 +11454,6 @@ "next-tick": "1" } }, - "node_modules/tiny-inflate": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", - "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==" - }, "node_modules/to-buffer": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", @@ -11742,29 +11658,6 @@ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, - "node_modules/unicode-properties": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.4.1.tgz", - "integrity": "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==", - "dependencies": { - "base64-js": "^1.3.0", - "unicode-trie": "^2.0.0" - } - }, - "node_modules/unicode-trie": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz", - "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==", - "dependencies": { - "pako": "^0.2.5", - "tiny-inflate": "^1.0.0" - } - }, - "node_modules/unicode-trie/node_modules/pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==" - }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -11987,35 +11880,6 @@ "node": ">= 8" } }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", - "dependencies": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/which-module": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", diff --git a/apps/OpenSignServer/package.json b/apps/OpenSignServer/package.json index 4d07bbda0..8a322d2ef 100644 --- a/apps/OpenSignServer/package.json +++ b/apps/OpenSignServer/package.json @@ -23,8 +23,8 @@ "@signpdf/placeholder-pdf-lib": "^3.2.4", "@signpdf/signer-p12": "^3.2.4", "@signpdf/signpdf": "^3.2.4", - "aws-sdk": "^2.1581.0", - "axios": "^1.7.1", + "aws-sdk": "^2.1625.0", + "axios": "^1.7.2", "cors": "^2.8.5", "dotenv": "^16.4.5", "express": "^4.19.2", @@ -38,20 +38,18 @@ "multer": "^1.4.5-lts.1", "multer-s3": "^3.0.1", "node-forge": "^1.3.1", - "node-signpdf": "^1.5.1", "nodemailer": "^6.9.13", "parse": "^5.1.0", "parse-dbtool": "^1.2.0", "parse-server": "^7.0.0", "parse-server-api-mail-adapter": "^3.1.1", "pdf-lib": "^1.17.1", - "pdfkit": "^0.14.0", - "posthog-node": "^3.6.3" + "posthog-node": "^4.0.1" }, "type": "module", "devDependencies": { "@babel/eslint-parser": "^7.24.5", - "eslint": "^8.57.0", + "eslint": "^9.3.0", "jasmine": "^5.1.0", "mongodb-runner": "^5.6.2", "nodemon": "^3.1.0", From 658c37cc4d137f74e6daa0177313f8d1c14f580b Mon Sep 17 00:00:00 2001 From: RaktimaNXG <raktima.c@nxglabs.com> Date: Wed, 22 May 2024 17:48:15 +0530 Subject: [PATCH 028/106] feat: add tour messages to request signatures flow --- .../src/components/pdf/DefaultSignature.js | 2 +- apps/OpenSign/src/components/pdf/PdfHeader.js | 10 +- apps/OpenSign/src/components/pdf/RenderPdf.js | 2 + apps/OpenSign/src/constant/Utils.js | 3 +- apps/OpenSign/src/pages/PdfRequestFiles.js | 203 +++++++++++++++++- 5 files changed, 206 insertions(+), 14 deletions(-) diff --git a/apps/OpenSign/src/components/pdf/DefaultSignature.js b/apps/OpenSign/src/components/pdf/DefaultSignature.js index a440e807e..1887d5164 100644 --- a/apps/OpenSign/src/components/pdf/DefaultSignature.js +++ b/apps/OpenSign/src/components/pdf/DefaultSignature.js @@ -17,7 +17,7 @@ function DefaultSignature({ defaultSignImg, xyPostion, setDefaultSignAlert }) { }; return ( - <div> + <div data-tut="reactourThird"> <div style={{ background: themeColor, diff --git a/apps/OpenSign/src/components/pdf/PdfHeader.js b/apps/OpenSign/src/components/pdf/PdfHeader.js index 7a019ed39..d3baeaf54 100644 --- a/apps/OpenSign/src/components/pdf/PdfHeader.js +++ b/apps/OpenSign/src/components/pdf/PdfHeader.js @@ -331,7 +331,7 @@ function Header({ user exist than show finish button else no */} {currentSigner && ( - <> + <div className="flex" data-tut="reactourFifth"> {decline && ( <div onClick={() => handleDeclinePdfAlert()} @@ -399,7 +399,7 @@ function Header({ </DropdownMenu.Content> </DropdownMenu.Portal> </DropdownMenu.Root> - </> + </div> )} </div> )} @@ -464,8 +464,8 @@ function Header({ {completeBtnTitle ? completeBtnTitle : isMailSend - ? "Sent" - : "Send"} + ? "Sent" + : "Send"} </button> </div> </> @@ -505,7 +505,7 @@ function Header({ </button> </div> ) : ( - <div className="flex"> + <div className="flex" data-tut="reactourFifth"> <button onClick={() => navigate(-1)} type="button" diff --git a/apps/OpenSign/src/components/pdf/RenderPdf.js b/apps/OpenSign/src/components/pdf/RenderPdf.js index a8298d019..5118dfcc1 100644 --- a/apps/OpenSign/src/components/pdf/RenderPdf.js +++ b/apps/OpenSign/src/components/pdf/RenderPdf.js @@ -334,6 +334,7 @@ function RenderPdf({ {successEmail && <Alert type={"success"}>Email sent successfully!</Alert>} {isMobile && scale ? ( <div + data-tut="reactourForth" style={{ border: "0.1px solid #ebe8e8", marginTop: isGuestSigner && "30px" @@ -517,6 +518,7 @@ function RenderPdf({ noScrollX={pdfNewWidth < pdfOriginalWidth ? false : true} > <div + data-tut="reactourForth" style={{ border: "0.1px solid #ebe8e8", width: pdfOriginalWidth diff --git a/apps/OpenSign/src/constant/Utils.js b/apps/OpenSign/src/constant/Utils.js index 93cefe04c..ffe3b813b 100644 --- a/apps/OpenSign/src/constant/Utils.js +++ b/apps/OpenSign/src/constant/Utils.js @@ -171,11 +171,10 @@ export const contractUsers = async (email) => { .then((Listdata) => { const json = Listdata.data; let data = []; - if (json && json.result) { data.push(json.result); - return data; } + return data; }) .catch((err) => { console.log("Err ", err); diff --git a/apps/OpenSign/src/pages/PdfRequestFiles.js b/apps/OpenSign/src/pages/PdfRequestFiles.js index 1043d8eb5..c9a21ead5 100644 --- a/apps/OpenSign/src/pages/PdfRequestFiles.js +++ b/apps/OpenSign/src/pages/PdfRequestFiles.js @@ -28,7 +28,8 @@ import { fetchSubscription, convertPdfArrayBuffer, contractUsers, - handleSendOTP + handleSendOTP, + contactBook } from "../constant/Utils"; import Loader from "../primitives/LoaderWithMsg"; import HandleError from "../primitives/HandleError"; @@ -39,6 +40,7 @@ import Title from "../components/Title"; import DefaultSignature from "../components/pdf/DefaultSignature"; import ModalUi from "../primitives/ModalUi"; import VerifyEmail from "../components/pdf/VerifyEmail"; +import TourContentWithBtn from "../primitives/TourContentWithBtn"; function useQuery() { return new URLSearchParams(useLocation().search); } @@ -68,6 +70,8 @@ function PdfRequestFiles() { const [selectWidgetId, setSelectWidgetId] = useState(""); const [otpLoader, setOtpLoader] = useState(false); const [isCelebration, setIsCelebration] = useState(false); + const [requestSignTour, setRequestSignTour] = useState(true); + const [tourStatus, setTourStatus] = useState([]); const [isLoading, setIsLoading] = useState({ isLoad: true, message: "This might take some time" @@ -85,6 +89,8 @@ function PdfRequestFiles() { const [isAlert, setIsAlert] = useState({ isShow: false, alertMessage: "" }); const [unSignedWidgetId, setUnSignedWidgetId] = useState(""); const [expiredDate, setExpiredDate] = useState(""); + const [signerUserId, setSignerUserId] = useState(); + const [isDontShow, setIsDontShow] = useState(false); const [defaultSignAlert, setDefaultSignAlert] = useState({ isShow: false, alertMessage: "" @@ -114,6 +120,7 @@ function PdfRequestFiles() { const [isEmailVerified, setIsEmailVerified] = useState(true); const [isVerifyModal, setIsVerifyModal] = useState(false); const [otp, setOtp] = useState(""); + const [contractName, setContractName] = useState(""); const divRef = useRef(null); const isMobile = window.innerWidth < 767; const rowLevel = @@ -439,7 +446,62 @@ function PdfRequestFiles() { }, 5000); } } - + //checking if condition current user already sign or owner does not exist as a signer or document has been declined by someone or document has been expired + //then stop to display tour message + if ( + (checkAlreadySign && + checkAlreadySign[0] && + checkAlreadySign.length > 0) || + !currUserId || + declined || + currDate > expireUpdateDate + ) { + setRequestSignTour(false); + } else { + //else condition to check current user exist in contracts_Users class and check tour message status + //if not then check user exist in contracts_Contactbook class and check tour message status + const currentUser = JSON.parse(JSON.stringify(Parse.User.current())); + const currentUserEmail = currentUser.email; + const res = await contractUsers(currentUserEmail); + if (res === "Error: Something went wrong!") { + setHandleError("Error: Something went wrong!"); + } else if (res[0] && res?.length) { + setContractName("_Users"); + currUserId = res[0].objectId; + setSignerUserId(currUserId); + const tourstatus = res[0].TourStatus && res[0].TourStatus; + if (tourstatus && tourstatus.length > 0) { + setTourStatus(tourstatus); + const checkTourRequestSign = tourstatus.filter( + (data) => data.requestSign + ); + if (checkTourRequestSign && checkTourRequestSign.length > 0) { + setRequestSignTour(checkTourRequestSign[0].requestSign); + } + } + } else if (res?.length === 0) { + const res = await contactBook(currUserId); + if (res === "Error: Something went wrong!") { + setHandleError("Error: Something went wrong!"); + } else if (res[0] && res.length) { + setContractName("_Contactbook"); + const objectId = res[0].objectId; + setSignerUserId(objectId); + const tourstatus = res[0].TourStatus && res[0].TourStatus; + if (tourstatus && tourstatus.length > 0) { + setTourStatus(tourstatus); + const checkTourRequestSign = tourstatus.filter( + (data) => data.requestSign + ); + if (checkTourRequestSign && checkTourRequestSign.length > 0) { + setRequestSignTour(checkTourRequestSign[0].requestSign); + } + } + } else if (res.length === 0) { + setHandleError("Error: User does not exist!"); + } + } + } setIsUiLoading(false); } else { alert("No data found!"); @@ -1141,6 +1203,134 @@ function PdfRequestFiles() { alertMessage: "" }); }; + const handleDontShow = (isChecked) => { + setIsDontShow(isChecked); + }; + //function to close tour and save tour status + const closeRequestSignTour = async () => { + setRequestSignTour(false); + if (isDontShow) { + let updatedTourStatus = []; + if (tourStatus.length > 0) { + updatedTourStatus = [...tourStatus]; + const requestSignIndex = tourStatus.findIndex( + (obj) => obj["requestSign"] === false || obj["requestSign"] === true + ); + if (requestSignIndex !== -1) { + updatedTourStatus[requestSignIndex] = { requestSign: true }; + } else { + updatedTourStatus.push({ requestSign: true }); + } + } else { + updatedTourStatus = [{ requestSign: true }]; + } + try { + await axios.put( + `${localStorage.getItem("baseUrl")}classes/${localStorage.getItem( + "_appName" + )}${contractName}/${signerUserId}`, + { + TourStatus: updatedTourStatus + }, + { + headers: { + "Content-Type": "application/json", + "X-Parse-Application-Id": localStorage.getItem("parseAppId"), + "X-Parse-Session-Token": localStorage.getItem("accesstoken") + } + } + ); + } catch (e) { + console.log("update tour messages error", err); + } + } + }; + const requestSignTourFunction = () => { + const tourConfig = [ + { + selector: '[data-tut="reactourFirst"]', + content: () => ( + <TourContentWithBtn + message={`List of signers who still need to sign the document .`} + isChecked={handleDontShow} + /> + ), + position: "top", + style: { fontSize: "13px" } + }, + { + selector: '[data-tut="reactourForth"]', + content: () => ( + <TourContentWithBtn + message={`Click any of the placeholders appearing on the document to sign. You will then see options to draw your signature, type it, or upload an image .`} + isChecked={handleDontShow} + /> + ), + position: "top", + style: { fontSize: "13px" } + }, + { + selector: '[data-tut="reactourFifth"]', + content: () => ( + <TourContentWithBtn + message={`Click the Back, Decline, or Finish buttons to navigate your document. Use the ellipsis menu for additional options, including the Download button .`} + isChecked={handleDontShow} + /> + ), + position: "top", + style: { fontSize: "13px" } + } + ]; + const signedByStep = { + selector: '[data-tut="reactourSecond"]', + content: () => ( + <TourContentWithBtn + message={`List of signers who have already signed the document .`} + isChecked={handleDontShow} + /> + ), + position: "top", + style: { fontSize: "13px" } + }; + //checking if signed by user component exist then add signed step + const signedBy = + signedSigners.length > 0 + ? [...tourConfig.slice(0, 0), signedByStep, ...tourConfig.slice(0)] + : tourConfig; + + //checking if default signature component exist then add defaultSign step + const defaultSignStep = { + selector: '[data-tut="reactourThird"]', + content: () => ( + <TourContentWithBtn + message={`You can click "Auto Sign All" to automatically sign at all the locations meant to be signed by you. Make sure that you review the document properly before you click this button .`} + isChecked={handleDontShow} + /> + ), + position: "top", + style: { fontSize: "13px" } + }; + //index is handle is signed by exist then 2 else 1 to add tour step + const index = signedSigners.length > 0 ? 2 : 1; + const defaultSignTour = defaultSignImg + ? [...signedBy.slice(0, index), defaultSignStep, ...signedBy.slice(index)] + : signedBy; + + if (isMobile) { + tourConfig.shift(); + } + + return ( + <Tour + onRequestClose={closeRequestSignTour} + steps={isMobile ? tourConfig : defaultSignTour} + isOpen={true} + closeWithMask={false} + rounded={5} + /> + ); + }; + return ( <DndProvider backend={HTML5Backend}> <Title title={"Request Sign"} /> @@ -1209,6 +1399,7 @@ function PdfRequestFiles() { }} ref={divRef} > + {requestSignTour && requestSignTourFunction()} <ModalUi headerColor={"#dc3545"} isOpen={isAlert.isShow} @@ -1496,7 +1687,7 @@ function PdfRequestFiles() { className="autoSignScroll" > {signedSigners.length > 0 && ( - <> + <div data-tut="reactourSecond"> <div style={{ background: themeColor }} className="signedStyle" @@ -1556,11 +1747,11 @@ function PdfRequestFiles() { ); })} </div> - </> + </div> )} {unsignedSigners.length > 0 && ( - <> + <div data-tut="reactourFirst"> <div style={{ background: themeColor, @@ -1626,7 +1817,7 @@ function PdfRequestFiles() { ); })} </div> - </> + </div> )} {defaultSignImg && !alreadySign && ( <DefaultSignature From ef5ac7d6262056f5d0d664a44a2e86acbb83d5cb Mon Sep 17 00:00:00 2001 From: RaktimaNXG <raktima.c@nxglabs.com> Date: Wed, 22 May 2024 17:49:24 +0530 Subject: [PATCH 029/106] fix: err is not defined --- apps/OpenSign/src/pages/PdfRequestFiles.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/OpenSign/src/pages/PdfRequestFiles.js b/apps/OpenSign/src/pages/PdfRequestFiles.js index c9a21ead5..7565d8669 100644 --- a/apps/OpenSign/src/pages/PdfRequestFiles.js +++ b/apps/OpenSign/src/pages/PdfRequestFiles.js @@ -1241,7 +1241,7 @@ function PdfRequestFiles() { } ); } catch (e) { - console.log("update tour messages error", err); + console.log("update tour messages error", e); } } }; From 2e5947279f518d87a0ed762f4e8cfe3337945c3d Mon Sep 17 00:00:00 2001 From: RaktimaNXG <raktima.c@nxglabs.com> Date: Wed, 22 May 2024 18:51:57 +0530 Subject: [PATCH 030/106] fix:onclick upgrade button navigate user to new window --- apps/OpenSign/src/pages/PlaceHolderSign.js | 5 +---- apps/OpenSign/src/primitives/Upgrade.js | 13 +++---------- 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/apps/OpenSign/src/pages/PlaceHolderSign.js b/apps/OpenSign/src/pages/PlaceHolderSign.js index de91d2b92..a705d9525 100644 --- a/apps/OpenSign/src/pages/PlaceHolderSign.js +++ b/apps/OpenSign/src/pages/PlaceHolderSign.js @@ -1804,10 +1804,7 @@ function PlaceHolderSign() { {!isSubscribe && isEnableSubscription && ( <div className="mt-2"> - <Upgrade - message="Upgrade to customize Email" - newWindow={true} - /> + <Upgrade message="Upgrade to customize Email" /> </div> )} </div> diff --git a/apps/OpenSign/src/primitives/Upgrade.js b/apps/OpenSign/src/primitives/Upgrade.js index 4915e6ff8..187d278f3 100644 --- a/apps/OpenSign/src/primitives/Upgrade.js +++ b/apps/OpenSign/src/primitives/Upgrade.js @@ -1,20 +1,13 @@ import React from "react"; -import { useNavigate } from "react-router-dom"; import { openInNewTab } from "../constant/Utils"; -function Upgrade({ message, newWindow }) { - const navigation = useNavigate(); - +function Upgrade({ message }) { return ( <sup> <span onClick={() => { - if (newWindow) { - const url = window.location.origin + "/subscription"; - openInNewTab(url); - } else { - navigation("/subscription"); - } + const url = window.location.origin + "/subscription"; + openInNewTab(url); }} className="text-blue-800 text-sm cursor-pointer underline" > From d75c1d7c0c7e6acff2fbbbb24474e087b60ee400 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <prafull.navkar@nxglabs.com> Date: Wed, 22 May 2024 19:19:33 +0530 Subject: [PATCH 031/106] fix: resend mail not working --- .../src/primitives/GetReportDisplay.js | 23 ++++++++----------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/apps/OpenSign/src/primitives/GetReportDisplay.js b/apps/OpenSign/src/primitives/GetReportDisplay.js index fdfc4422f..28ae7822c 100644 --- a/apps/OpenSign/src/primitives/GetReportDisplay.js +++ b/apps/OpenSign/src/primitives/GetReportDisplay.js @@ -551,6 +551,7 @@ const ReportTable = (props) => { }; const handleResendMail = async (e, doc, user) => { e.preventDefault(); + console.log("first"); setActLoader({ [user.objectId]: true }); const url = `${localStorage.getItem("baseUrl")}functions/sendmailv3`; const headers = { @@ -955,20 +956,22 @@ const ReportTable = (props) => { onSubmit={(e) => handleResendMail(e, item, user) } - className="w-full flex flex-col gap-2 p-3 text-black" + className="w-full flex flex-col gap-2 p-3 text-black relative" > + <div className="absolute right-5 text-xs z-40"> + <Tooltip + id={`${user.objectId}_help`} + message={ + "You can use following variables which will get replaced with their actual values:- {{document_title}}, {{sender_name}}, {{sender_mail}}, {{sender_phone}}, {{receiver_name}}, {{receiver_email}}, {{receiver_phone}}, {{expiry_date}}, {{company_name}}, {{signing_url}}." + } + /> + </div> <div> <label className="text-xs ml-1" htmlFor="mailsubject" > Subject{" "} - <Tooltip - id={isNextStep[user.objectId]} - message={ - "You can use following variables which will get replaced with their actual values:- {{document_title}}, {{sender_name}}, {{sender_mail}}, {{sender_phone}}, {{receiver_name}}, {{receiver_email}}, {{receiver_phone}}, {{expiry_date}}, {{company_name}}, {{signing_url}}." - } - /> </label> <input id="mailsubject" @@ -989,12 +992,6 @@ const ReportTable = (props) => { htmlFor="mailbody" > Body{" "} - <Tooltip - id={isNextStep[user.objectId]} - message={ - "You can use following variables which will get replaced with their actual values:- {{document_title}}, {{sender_name}}, {{sender_mail}}, {{sender_phone}}, {{receiver_name}}, {{receiver_email}}, {{receiver_phone}}, {{expiry_date}}, {{company_name}}, {{signing_url}}." - } - /> </label> <EditorToolbar containerId="toolbar1" /> <ReactQuill From 7e4f12e41a0fa1e2be0b23d280b5c2c41cb10d6a Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <prafull.navkar@nxglabs.com> Date: Wed, 22 May 2024 19:31:32 +0530 Subject: [PATCH 032/106] feat: bulk send is working for exist contact --- apps/OpenSign/src/components/BulkSendUi.js | 4 +- .../src/primitives/GetReportDisplay.js | 26 ++++- .../cloud/parsefunction/createBatchDocs.js | 104 +++++++++++------- 3 files changed, 89 insertions(+), 45 deletions(-) diff --git a/apps/OpenSign/src/components/BulkSendUi.js b/apps/OpenSign/src/components/BulkSendUi.js index 039f43c39..ee93c505a 100644 --- a/apps/OpenSign/src/components/BulkSendUi.js +++ b/apps/OpenSign/src/components/BulkSendUi.js @@ -118,8 +118,8 @@ const BulkSendUi = (props) => { // Push a new document object with updated Placeholders into the Documents array Documents.push({ ...props.item, Placeholders: updatedPlaceholders }); }); - console.log("Documents ", Documents); - // await batchQuery(Documents); + // console.log("Documents ", Documents); + await batchQuery(Documents); }; const batchQuery = async (Documents) => { diff --git a/apps/OpenSign/src/primitives/GetReportDisplay.js b/apps/OpenSign/src/primitives/GetReportDisplay.js index cff85d595..6b7b12145 100644 --- a/apps/OpenSign/src/primitives/GetReportDisplay.js +++ b/apps/OpenSign/src/primitives/GetReportDisplay.js @@ -632,11 +632,27 @@ const ReportTable = (props) => { } }; - const handleBulkSend = (template) => { - if (template?.Placeholders?.length > 0) { - setPlaceholders(template?.Placeholders); - setTemplateDetails(template); - setIsBulkSend({ [template.objectId]: true }); + const handleBulkSend = async (template) => { + const params = { + templateId: template.objectId, + include: ["Placeholders.signerPtr"] + }; + const axiosRes = await axios.post( + `${localStorage.getItem("baseUrl")}functions/getTemplate`, + params, + { + headers: { + "Content-Type": "application/json", + "X-Parse-Application-Id": localStorage.getItem("parseAppId"), + sessionToken: localStorage.getItem("accesstoken") + } + } + ); + const templateRes = axiosRes.data && axiosRes.data.result; + if (templateRes?.Placeholders?.length > 0) { + setPlaceholders(templateRes?.Placeholders); + setTemplateDetails(templateRes); + setIsBulkSend({ [templateRes.objectId]: true }); } else { setIsDocErr(true); } diff --git a/apps/OpenSignServer/cloud/parsefunction/createBatchDocs.js b/apps/OpenSignServer/cloud/parsefunction/createBatchDocs.js index 7b9ef2f61..1fb8e783e 100644 --- a/apps/OpenSignServer/cloud/parsefunction/createBatchDocs.js +++ b/apps/OpenSignServer/cloud/parsefunction/createBatchDocs.js @@ -33,7 +33,7 @@ async function sendMail(document, sessionToken) { if (objectId) { encodeBase64 = btoa(`${document.objectId}}/${signerMail[i].signerPtr.Email}/${objectId}`); } else { - encodeBase64 = btoa(`${document.objectId}}/${signerMail[i].email}/${objectId}`); + encodeBase64 = btoa(`${document.objectId}}/${signerMail[i].email}`); } let signPdf = `${hostUrl}/login/${encodeBase64}`; const openSignUrl = 'https://www.opensignlabs.com/'; @@ -80,7 +80,7 @@ export default async function createBatchDocs(request) { const strDocuments = request.params.Documents; const sessionToken = request.headers['sessiontoken']; const Documents = JSON.parse(strDocuments); - + const Ip = request?.headers?.['x-real-ip'] || ''; // console.log('Documents ', Documents); const parseConfig = { baseURL: serverUrl, //localStorage.getItem('baseUrl'), @@ -91,51 +91,79 @@ export default async function createBatchDocs(request) { }, }; try { - const requests = Documents.map(x => ({ - method: 'POST', - path: '/app/classes/contracts_Document', - body: { - Name: x.Name, - URL: x.URL, - Note: x.Note, - Description: x.Description, - CreatedBy: x.CreatedBy, - ExtUserPtr: { - __type: 'Pointer', - className: x.ExtUserPtr.className, - objectId: x.ExtUserPtr.objectId, + const requests = Documents.map(x => { + const Signers = x.Signers; + const allSigner = x?.Placeholders?.map(item => { + const signer = Signers?.find(e => item?.signerPtr?.objectId === e?.objectId); + if (signer) { + return signer; + } else { + return item?.signerPtr?.objectId && item?.signerPtr; + } + }); + const date = new Date(); + const isoDate = date.toISOString(); + let Acl = { [x.CreatedBy.objectId]: { read: true, write: true } }; + // console.log('allSigner ', allSigner); + if (allSigner && allSigner.length > 0) { + allSigner.forEach(x => { + const obj = { [x.CreatedBy.objectId]: { read: true, write: true } }; + Acl = { ...Acl, ...obj }; + }); + } + return { + method: 'POST', + path: '/app/classes/contracts_Document', + body: { + Name: x.Name, + URL: x.URL, + Note: x.Note, + Description: x.Description, + CreatedBy: x.CreatedBy, + SendinOrder: x.SendinOrder || true, + ExtUserPtr: { + __type: 'Pointer', + className: x.ExtUserPtr.className, + objectId: x.ExtUserPtr.objectId, + }, + Placeholders: x.Placeholders.map(y => + y?.signerPtr?.objectId + ? { + ...y, + signerPtr: { + __type: 'Pointer', + className: 'contracts_Contactbook', + objectId: y.signerPtr.objectId, + }, + signerObjId: y.signerObjId, + } + : { ...y, signerPtr: {}, signerObjId: '' } + ), + SignedUrl: x.URL || x.SignedUrl, + Signers: allSigner?.map(y => ({ + __type: 'Pointer', + className: 'contracts_Contactbook', + objectId: y.objectId, + })), + ACL: Acl, + RemindOnceInEvery: x.RemindOnceInEvery, + AutomaticReminders: x.AutomaticReminders || false, + TimeToCompleteDays: x.TimeToCompleteDays || 15, + OriginIp: Ip, + DocSentAt: { __type: 'Date', iso: isoDate }, }, - Placeholders: x.Placeholders.map(y => - y?.signerPtr?.objectId - ? { - ...y, - signerPtr: { - __type: 'Pointer', - className: y.signerPtr.className, - objectId: y.signerPtr.objectId, - }, - signerObjId: y.signerObjId, - } - : { ...y, signerPtr: {}, signerObjId: '' } - ), - SignedUrl: x.SignedUrl, - Signers: x.Signers.map(y => ({ - __type: 'Pointer', - className: y.className, - objectId: y.objectId, - })), - }, - })); + }; + }); // console.log('requests ', requests); const response = await axios.post('batch', { requests: requests }, parseConfig); // // Handle the batch query response - // console.log('Batch query response:', response.data) + // console.log('Batch query response:', response.data); if (response.data && response.data.length > 0) { const updateDocuments = Documents.map((x, i) => ({ ...x, objectId: response.data[i]?.success?.objectId, - createdAt: response.data[i]?.success.createdAt, + createdAt: response.data[i]?.success?.createdAt, })); for (let i = 0; i < updateDocuments.length; i++) { // console.log('updateDocuments ', updateDocuments); From 950b74789cf53958f067bd4e98e34e9b81db2654 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <prafull.navkar@nxglabs.com> Date: Wed, 22 May 2024 19:46:09 +0530 Subject: [PATCH 033/106] fix: create contact API not working --- .../OpenSignServer/cloud/customRoute/v1/routes/createContact.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/OpenSignServer/cloud/customRoute/v1/routes/createContact.js b/apps/OpenSignServer/cloud/customRoute/v1/routes/createContact.js index 32d4683f5..9be0cd341 100644 --- a/apps/OpenSignServer/cloud/customRoute/v1/routes/createContact.js +++ b/apps/OpenSignServer/cloud/customRoute/v1/routes/createContact.js @@ -128,7 +128,7 @@ export default async function createContact(request, response) { userId: userRes.objectId, }; await axios.post(roleurl, body, { headers: headers }); - contactQuery.set('CreatedBy', userPtr.objectId); + contactQuery.set('CreatedBy', userPtr); contactQuery.set('UserId', { __type: 'Pointer', className: '_User', From c1468112b00540b381672cc24c47b1e7322fb1e4 Mon Sep 17 00:00:00 2001 From: RaktimaNXG <raktima.c@nxglabs.com> Date: Wed, 22 May 2024 19:46:22 +0530 Subject: [PATCH 034/106] fix: download menu is not wokring inProgress report in mobile view --- apps/OpenSign/src/components/pdf/PdfHeader.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/OpenSign/src/components/pdf/PdfHeader.js b/apps/OpenSign/src/components/pdf/PdfHeader.js index d3baeaf54..4d6a280f9 100644 --- a/apps/OpenSign/src/components/pdf/PdfHeader.js +++ b/apps/OpenSign/src/components/pdf/PdfHeader.js @@ -331,7 +331,7 @@ function Header({ user exist than show finish button else no */} {currentSigner && ( - <div className="flex" data-tut="reactourFifth"> + <div className="flex items-center" data-tut="reactourFifth"> {decline && ( <div onClick={() => handleDeclinePdfAlert()} @@ -372,7 +372,7 @@ function Header({ <DropdownMenu.Root> <DropdownMenu.Trigger asChild> <div - className="border-none font-[650] text-[18px] pl-2" + className="border-none font-[650] text-[18px] px-2 ml-[4px]" style={{ color: themeColor }} > <i From 74b81a53634717ff3a5415ce9778de0ac2ec57b6 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <prafull.navkar@nxglabs.com> Date: Wed, 22 May 2024 19:56:44 +0530 Subject: [PATCH 035/106] fix: issue in guestlogin of owner subscription has expired --- apps/OpenSign/src/constant/Utils.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/OpenSign/src/constant/Utils.js b/apps/OpenSign/src/constant/Utils.js index 93cefe04c..c729d8674 100644 --- a/apps/OpenSign/src/constant/Utils.js +++ b/apps/OpenSign/src/constant/Utils.js @@ -21,7 +21,7 @@ export async function fetchSubscription( try { const extClass = localStorage.getItem("Extand_Class"); let extUser; - if (extClass) { + if (extClass && extClass.length > 0) { const jsonSender = JSON.parse(extClass); extUser = jsonSender[0].objectId; } else { @@ -1351,8 +1351,8 @@ export const multiSignEmbed = async ( position.type === radioButtonWidget ? 10 : position.type === "checkbox" - ? 10 - : newUpdateHeight; + ? 10 + : newUpdateHeight; const newHeight = ind ? (ind > 0 ? widgetHeight : 0) : widgetHeight; if (signyourself) { From 32c75d1fc330a343e1206b127d50b2fb689f373e Mon Sep 17 00:00:00 2001 From: RaktimaNXG <raktima.c@nxglabs.com> Date: Thu, 23 May 2024 10:30:41 +0530 Subject: [PATCH 036/106] feat: add help button for text validation --- .../src/components/pdf/WidgetNameModal.js | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/apps/OpenSign/src/components/pdf/WidgetNameModal.js b/apps/OpenSign/src/components/pdf/WidgetNameModal.js index bde504d0e..dfcad24e6 100644 --- a/apps/OpenSign/src/components/pdf/WidgetNameModal.js +++ b/apps/OpenSign/src/components/pdf/WidgetNameModal.js @@ -6,6 +6,7 @@ import { textInputWidget } from "../../constant/Utils"; import PremiumAlertHeader from "../../primitives/PremiumAlertHeader"; import Upgrade from "../../primitives/Upgrade"; import { isEnableSubscription } from "../../constant/const"; +import Tooltip from "../../primitives/Tooltip"; const WidgetNameModal = (props) => { const [formdata, setFormdata] = useState({ @@ -140,16 +141,21 @@ const WidgetNameModal = (props) => { props.widgetName === textInputWidget) && ( <> <div className="form-section"> - <label - htmlFor="textvalidate" - className={ - !props.isSubscribe && isEnableSubscription && "disabled" - } - style={{ fontSize: 13 }} - > - Validation - </label> - {!props.isSubscribe && isEnableSubscription && <Upgrade />} + <div className="flex items-center gap-1"> + <label + htmlFor="textvalidate" + className={ + !props.isSubscribe && isEnableSubscription && "disabled" + } + style={{ fontSize: 13 }} + > + Validation + </label> + <Tooltip + url={"https://www.w3schools.com/jsref/jsref_obj_regexp.asp"} + /> + {!props.isSubscribe && isEnableSubscription && <Upgrade />} + </div> <div className={ !props.isSubscribe && isEnableSubscription && "disabled" @@ -165,7 +171,7 @@ const WidgetNameModal = (props) => { <input className="relative z-20 w-[87%] md:w-[92%] p-2.5 border-[1px] border-[#d1d5db] rounded-l-md outline-none text-xs" name="textvalidate" - placeholder="Enter custom expression" + placeholder="Enter custom regular expression" value={formdata.textvalidate} onChange={(e) => handleChange(e)} // onBlur={() => handleBlurRegex()} From d99fecd46e6a83690a86725e72610bcddb9926db Mon Sep 17 00:00:00 2001 From: RaktimaNXG <raktima.c@nxglabs.com> Date: Thu, 23 May 2024 12:52:10 +0530 Subject: [PATCH 037/106] feat: add download, certificate & print buttons on the document completion popup --- apps/OpenSign/src/components/pdf/PdfHeader.js | 162 ++++-------------- apps/OpenSign/src/constant/Utils.js | 125 +++++++++++++- apps/OpenSign/src/pages/PdfRequestFiles.js | 111 ++++++++---- apps/OpenSign/src/primitives/ModalUi.js | 10 +- 4 files changed, 238 insertions(+), 170 deletions(-) diff --git a/apps/OpenSign/src/components/pdf/PdfHeader.js b/apps/OpenSign/src/components/pdf/PdfHeader.js index 4d6a280f9..075945526 100644 --- a/apps/OpenSign/src/components/pdf/PdfHeader.js +++ b/apps/OpenSign/src/components/pdf/PdfHeader.js @@ -1,15 +1,15 @@ import React, { useState } from "react"; import PrevNext from "./PrevNext"; -import printModule from "print-js"; -import { getBase64FromUrl } from "../../constant/Utils"; -import { saveAs } from "file-saver"; +import { + handleDownloadCertificate, + handleDownloadPdf, + handleToPrint +} from "../../constant/Utils"; import "../../styles/signature.css"; import * as DropdownMenu from "@radix-ui/react-dropdown-menu"; import { useNavigate } from "react-router-dom"; import { themeColor } from "../../constant/const"; -import axios from "axios"; import ModalUi from "../../primitives/ModalUi"; -import { appInfo } from "../../constant/appinfo"; function Header({ isPdfRequestFiles, @@ -59,123 +59,6 @@ function Header({ setIsDecline(currentDecline); }; - //function for print digital sign pdf - const handleToPrint = async (event) => { - event.preventDefault(); - - try { - // const url = await Parse.Cloud.run("getsignedurl", { url: pdfUrl }); - const axiosRes = await axios.post( - `${appInfo.baseUrl}/functions/getsignedurl`, - { url: pdfUrl }, - { - headers: { - "content-type": "Application/json", - "X-Parse-Application-Id": appInfo.appId, - "X-Parse-Session-Token": localStorage.getItem("accesstoken") - } - } - ); - const url = axiosRes.data.result; - const pdf = await getBase64FromUrl(url); - const isAndroidDevice = navigator.userAgent.match(/Android/i); - const isAppleDevice = - (/iPad|iPhone|iPod/.test(navigator.platform) || - (navigator.platform === "MacIntel" && - navigator.maxTouchPoints > 1)) && - !window.MSStream; - if (isAndroidDevice || isAppleDevice) { - const byteArray = Uint8Array.from( - atob(pdf) - .split("") - .map((char) => char.charCodeAt(0)) - ); - const blob = new Blob([byteArray], { type: "application/pdf" }); - const blobUrl = URL.createObjectURL(blob); - window.open(blobUrl, "_blank"); - } else { - printModule({ printable: pdf, type: "pdf", base64: true }); - } - } catch (err) { - console.log("err in getsignedurl", err); - alert("something went wrong, please try again later."); - } - }; - - //handle download signed pdf - const handleDownloadPdf = async () => { - const pdfName = pdfDetails[0] && pdfDetails[0].Name; - try { - // const url = await Parse.Cloud.run("getsignedurl", { url: pdfUrl }); - const axiosRes = await axios.post( - `${appInfo.baseUrl}/functions/getsignedurl`, - { url: pdfUrl }, - { - headers: { - "content-type": "Application/json", - "X-Parse-Application-Id": appInfo.appId, - "X-Parse-Session-Token": localStorage.getItem("accesstoken") - } - } - ); - const url = axiosRes.data.result; - saveAs(url, `${sanitizeFileName(pdfName)}_signed_by_OpenSign™.pdf`); - } catch (err) { - console.log("err in getsignedurl", err); - alert("something went wrong, please try again later."); - } - }; - - const sanitizeFileName = (pdfName) => { - // Replace spaces with underscore - return pdfName.replace(/ /g, "_"); - }; - - //handle download signed pdf - const handleDownloadCertificate = async () => { - if (pdfDetails?.length > 0 && pdfDetails[0]?.CertificateUrl) { - try { - await fetch(pdfDetails[0] && pdfDetails[0]?.CertificateUrl); - const certificateUrl = pdfDetails[0] && pdfDetails[0]?.CertificateUrl; - saveAs(certificateUrl, `Certificate_signed_by_OpenSign™.pdf`); - } catch (err) { - console.log("err in download in certificate", err); - } - } else { - setIsCertificate(true); - try { - const data = { - docId: pdfDetails[0]?.objectId - }; - const docDetails = await axios.post( - `${localStorage.getItem("baseUrl")}functions/getDocument`, - data, - { - headers: { - "Content-Type": "application/json", - "X-Parse-Application-Id": localStorage.getItem("parseAppId"), - sessionToken: localStorage.getItem("accesstoken") - } - } - ); - if (docDetails.data && docDetails.data.result) { - const doc = docDetails.data.result; - if (doc?.CertificateUrl) { - await fetch(doc?.CertificateUrl); - const certificateUrl = doc?.CertificateUrl; - saveAs(certificateUrl, `Certificate_signed_by_OpenSign™.pdf`); - setIsCertificate(false); - } else { - setIsCertificate(true); - } - } - } catch (err) { - console.log("err in download in certificate", err); - alert("something went wrong, please try again later."); - } - } - }; - return ( <div style={{ padding: "5px 0px 5px 0px" }} className="mobileHead"> {isMobile && isShowHeader ? ( @@ -248,7 +131,7 @@ function Header({ > <DropdownMenu.Item className="DropdownMenuItem" - onClick={() => handleDownloadPdf()} + onClick={() => handleDownloadPdf(pdfDetails, pdfUrl)} > <div style={{ @@ -267,7 +150,12 @@ function Header({ {isCompleted && ( <DropdownMenu.Item className="DropdownMenuItem" - onClick={() => handleDownloadCertificate()} + onClick={() => + handleDownloadCertificate( + pdfDetails, + setIsCertificate + ) + } > <div style={{ @@ -306,7 +194,7 @@ function Header({ )} <DropdownMenu.Item className="DropdownMenuItem" - onClick={handleToPrint} + onClick={(e) => handleToPrint(e, pdfUrl)} > <div style={{ @@ -388,7 +276,9 @@ function Header({ > <DropdownMenu.Item className="flex flex-row justify-center items-center text-[13px] focus:outline-none cursor-pointer" - onClick={() => handleDownloadPdf()} + onClick={() => + handleDownloadPdf(pdfDetails, pdfUrl) + } > <i className="fa fa-arrow-down mr-[5px]" @@ -475,7 +365,9 @@ function Header({ {isCompleted && ( <button type="button" - onClick={() => handleDownloadCertificate()} + onClick={() => + handleDownloadCertificate(pdfDetails, setIsCertificate) + } className="flex flex-row items-center shadow rounded-[3px] py-[3px] px-[11px] text-white font-[500] text-[13px] mr-[5px] bg-[#08bc66]" > <i @@ -487,7 +379,7 @@ function Header({ )} <button - onClick={handleToPrint} + onClick={(e) => handleToPrint(e, pdfUrl)} type="button" className="flex flex-row items-center shadow rounded-[3px] py-[3px] px-[11px] text-white font-[500] text-[13px] mr-[5px] bg-[#188ae2]" > @@ -498,7 +390,7 @@ function Header({ <button type="button" className="flex flex-row items-center shadow rounded-[3px] py-[3px] px-[11px] text-white font-[500] text-[13px] mr-[5px] bg-[#f14343]" - onClick={() => handleDownloadPdf()} + onClick={() => handleDownloadPdf(pdfDetails, pdfUrl)} > <i className="fa fa-download py-[3px]" aria-hidden="true"></i> <span className="hidden lg:block ml-1">Download</span> @@ -547,7 +439,9 @@ function Header({ > <DropdownMenu.Item className="flex flex-row justify-center items-center text-[13px] focus:outline-none cursor-pointer" - onClick={() => handleDownloadPdf()} + onClick={() => + handleDownloadPdf(pdfDetails, pdfUrl) + } > <i className="fa fa-arrow-down mr-[5px]" @@ -567,7 +461,9 @@ function Header({ {isCompleted && ( <button type="button" - onClick={() => handleDownloadCertificate()} + onClick={() => + handleDownloadCertificate(pdfDetails, setIsCertificate) + } className="flex flex-row items-center shadow rounded-[3px] py-[3px] px-[11px] text-white font-[500] text-[13px] mr-[5px] bg-[#08bc66]" > <i @@ -578,7 +474,7 @@ function Header({ </button> )} <button - onClick={handleToPrint} + onClick={(e) => handleToPrint(e, pdfUrl)} type="button" className="flex flex-row items-center shadow rounded-[3px] py-[3px] px-[11px] text-white font-[500] text-[13px] mr-[5px] bg-[#188ae2]" > @@ -588,7 +484,7 @@ function Header({ <button type="button" className="flex flex-row items-center shadow rounded-[3px] py-[3px] px-[11px] text-white font-[500] text-[13px] mr-[5px] bg-[#f14343]" - onClick={() => handleDownloadPdf()} + onClick={() => handleDownloadPdf(pdfDetails, pdfUrl)} > <i className="fa fa-download py-[3px]" aria-hidden="true"></i> <span className="hidden lg:block ml-1">Download</span> diff --git a/apps/OpenSign/src/constant/Utils.js b/apps/OpenSign/src/constant/Utils.js index 75c7d3c1c..dfb94fd7c 100644 --- a/apps/OpenSign/src/constant/Utils.js +++ b/apps/OpenSign/src/constant/Utils.js @@ -4,6 +4,9 @@ import { isEnableSubscription, themeColor } from "./const"; import React from "react"; import { rgb } from "pdf-lib"; import Parse from "parse"; +import { appInfo } from "./appinfo"; +import { saveAs } from "file-saver"; +import printModule from "print-js"; export const isMobile = window.innerWidth < 767; export const textInputWidget = "text input"; @@ -1350,8 +1353,8 @@ export const multiSignEmbed = async ( position.type === radioButtonWidget ? 10 : position.type === "checkbox" - ? 10 - : newUpdateHeight; + ? 10 + : newUpdateHeight; const newHeight = ind ? (ind > 0 ? widgetHeight : 0) : widgetHeight; if (signyourself) { @@ -2029,3 +2032,121 @@ export const handleSendOTP = async (email) => { alert(error.message); } }; + +//handle download signed pdf +export const handleDownloadPdf = async (pdfDetails, pdfUrl) => { + const pdfName = pdfDetails[0] && pdfDetails[0].Name; + try { + // const url = await Parse.Cloud.run("getsignedurl", { url: pdfUrl }); + const axiosRes = await axios.post( + `${appInfo.baseUrl}/functions/getsignedurl`, + { url: pdfUrl }, + { + headers: { + "content-type": "Application/json", + "X-Parse-Application-Id": appInfo.appId, + "X-Parse-Session-Token": localStorage.getItem("accesstoken") + } + } + ); + const url = axiosRes.data.result; + saveAs(url, `${sanitizeFileName(pdfName)}_signed_by_OpenSign™.pdf`); + } catch (err) { + console.log("err in getsignedurl", err); + alert("something went wrong, please try again later."); + } +}; + +export const sanitizeFileName = (pdfName) => { + // Replace spaces with underscore + return pdfName.replace(/ /g, "_"); +}; +//function for print digital sign pdf +export const handleToPrint = async (event, pdfUrl) => { + event.preventDefault(); + + try { + // const url = await Parse.Cloud.run("getsignedurl", { url: pdfUrl }); + const axiosRes = await axios.post( + `${appInfo.baseUrl}/functions/getsignedurl`, + { url: pdfUrl }, + { + headers: { + "content-type": "Application/json", + "X-Parse-Application-Id": appInfo.appId, + "X-Parse-Session-Token": localStorage.getItem("accesstoken") + } + } + ); + const url = axiosRes.data.result; + const pdf = await getBase64FromUrl(url); + const isAndroidDevice = navigator.userAgent.match(/Android/i); + const isAppleDevice = + (/iPad|iPhone|iPod/.test(navigator.platform) || + (navigator.platform === "MacIntel" && navigator.maxTouchPoints > 1)) && + !window.MSStream; + if (isAndroidDevice || isAppleDevice) { + const byteArray = Uint8Array.from( + atob(pdf) + .split("") + .map((char) => char.charCodeAt(0)) + ); + const blob = new Blob([byteArray], { type: "application/pdf" }); + const blobUrl = URL.createObjectURL(blob); + window.open(blobUrl, "_blank"); + } else { + printModule({ printable: pdf, type: "pdf", base64: true }); + } + } catch (err) { + console.log("err in getsignedurl", err); + alert("something went wrong, please try again later."); + } +}; + +//handle download signed pdf +export const handleDownloadCertificate = async ( + pdfDetails, + setIsCertificate +) => { + if (pdfDetails?.length > 0 && pdfDetails[0]?.CertificateUrl) { + try { + await fetch(pdfDetails[0] && pdfDetails[0]?.CertificateUrl); + const certificateUrl = pdfDetails[0] && pdfDetails[0]?.CertificateUrl; + saveAs(certificateUrl, `Certificate_signed_by_OpenSign™.pdf`); + } catch (err) { + console.log("err in download in certificate", err); + } + } else { + setIsCertificate(true); + try { + const data = { + docId: pdfDetails[0]?.objectId + }; + const docDetails = await axios.post( + `${localStorage.getItem("baseUrl")}functions/getDocument`, + data, + { + headers: { + "Content-Type": "application/json", + "X-Parse-Application-Id": localStorage.getItem("parseAppId"), + sessionToken: localStorage.getItem("accesstoken") + } + } + ); + if (docDetails.data && docDetails.data.result) { + const doc = docDetails.data.result; + if (doc?.CertificateUrl) { + await fetch(doc?.CertificateUrl); + const certificateUrl = doc?.CertificateUrl; + saveAs(certificateUrl, `Certificate_signed_by_OpenSign™.pdf`); + setIsCertificate(false); + } else { + setIsCertificate(true); + } + } + } catch (err) { + console.log("err in download in certificate", err); + alert("something went wrong, please try again later."); + } + } +}; diff --git a/apps/OpenSign/src/pages/PdfRequestFiles.js b/apps/OpenSign/src/pages/PdfRequestFiles.js index 7565d8669..b38af95c0 100644 --- a/apps/OpenSign/src/pages/PdfRequestFiles.js +++ b/apps/OpenSign/src/pages/PdfRequestFiles.js @@ -29,7 +29,10 @@ import { convertPdfArrayBuffer, contractUsers, handleSendOTP, - contactBook + contactBook, + handleDownloadPdf, + handleToPrint, + handleDownloadCertificate } from "../constant/Utils"; import Loader from "../primitives/LoaderWithMsg"; import HandleError from "../primitives/HandleError"; @@ -91,6 +94,7 @@ function PdfRequestFiles() { const [expiredDate, setExpiredDate] = useState(""); const [signerUserId, setSignerUserId] = useState(); const [isDontShow, setIsDontShow] = useState(false); + const [isCertificate, setIsCertificate] = useState(false); const [defaultSignAlert, setDefaultSignAlert] = useState({ isShow: false, alertMessage: "" @@ -1577,38 +1581,87 @@ function PdfRequestFiles() { handleClose={() => { setIsCompleted((prev) => ({ ...prev, isModal: false })); }} + reduceWidth={!isCompleted?.message} > <div style={{ height: "100%", padding: 20 }}> - <p> - {" "} - {isCompleted?.message || - "This document has been signed by all Signers."} - </p> - - <div - style={{ - height: "1px", - backgroundColor: "#9f9f9f", - width: "100%", - marginTop: "15px", - marginBottom: "15px" - }} - ></div> - <button - type="button" - className="finishBtn cancelBtn" - onClick={() => { - setIsCompleted((prev) => ({ - ...prev, - isModal: false - })); - }} - > - Close - </button> + {isCompleted?.message ? ( + <p>{isCompleted?.message}</p> + ) : ( + <div className="px-[15px]"> + <span> + Congratulations! 🎉 This document has been + successfully + </span> + <br /> + <span>signed by all participants!</span> + </div> + )} + {!isCompleted?.message && ( + <div className="flex mt-4 gap-1 px-[15px]"> + <button + type="button" + onClick={() => + handleDownloadCertificate( + pdfDetails, + setIsCertificate + ) + } + className="flex flex-row items-center shadow rounded-[3px] py-[3px] px-[11px] text-white font-[500] text-[13px] mr-[5px] bg-[#08bc66]" + > + <i + className="fa-solid fa-award py-[3px]" + aria-hidden="true" + ></i> + <span className="hidden lg:block ml-1"> + Certificate + </span> + </button> + <button + onClick={(e) => handleToPrint(e, pdfUrl)} + type="button" + className="flex flex-row items-center shadow rounded-[3px] py-[3px] px-[11px] text-white font-[500] text-[13px] mr-[5px] bg-[#188ae2]" + > + <i + className="fa fa-print py-[3px]" + aria-hidden="true" + ></i> + <span className="hidden lg:block ml-1">Print</span> + </button> + <button + type="button" + className="flex flex-row items-center shadow rounded-[3px] py-[3px] px-[11px] text-white font-[500] text-[13px] mr-[5px] bg-[#f14343]" + onClick={() => + handleDownloadPdf(pdfDetails, pdfUrl) + } + > + <i + className="fa fa-download py-[3px]" + aria-hidden="true" + ></i> + <span className="hidden lg:block ml-1"> + Download + </span> + </button> + </div> + )} + </div> + </ModalUi> + <ModalUi + isOpen={isCertificate} + title={"Generating certificate"} + handleClose={() => setIsCertificate(false)} + > + <div className="p-3 md:p-5 text-[13px] md:text-base text-center"> + <p> + Your completion certificate is being generated. Please + wait momentarily. + </p> + <p> + If the download doesn't start shortly, click the + button again. + </p> </div> </ModalUi> - {/* this component is used for signature pad modal */} <SignPad isSignPad={isSignPad} diff --git a/apps/OpenSign/src/primitives/ModalUi.js b/apps/OpenSign/src/primitives/ModalUi.js index dcc726f18..fdb86c409 100644 --- a/apps/OpenSign/src/primitives/ModalUi.js +++ b/apps/OpenSign/src/primitives/ModalUi.js @@ -10,7 +10,7 @@ const ModalUi = ({ handleClose, showHeader = true, showClose = true, - styleClass, + reduceWidth, showHeaderMessage }) => { return ( @@ -18,11 +18,9 @@ const ModalUi = ({ {isOpen && ( <div className="fixed z-[999] top-0 left-0 w-[100%] h-[100%] bg-black bg-opacity-[75%]"> <div - className={ - styleClass - ? styleClass - : "fixed z-[1000] top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2 text-sm bg-white rounded shadow-md max-h-90 min-w-[90%] md:min-w-[500px] overflow-y-auto hide-scrollbar" - } + className={`${ + reduceWidth ? "md:min-w-[430px]" : "md:min-w-[500px]" + } fixed z-[1000] top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2 text-sm bg-white rounded shadow-md max-h-90 min-w-[90%] overflow-y-auto hide-scrollbar `} > {showHeader && ( <div From 08a97707b7696750cdca8b19adf109f24ead2949 Mon Sep 17 00:00:00 2001 From: RaktimaNXG <raktima.c@nxglabs.com> Date: Thu, 23 May 2024 13:46:17 +0530 Subject: [PATCH 038/106] fix: completion popup design issue in tablet view --- apps/OpenSign/src/pages/PdfRequestFiles.js | 4 +--- apps/OpenSign/src/primitives/ModalUi.js | 6 ++++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/OpenSign/src/pages/PdfRequestFiles.js b/apps/OpenSign/src/pages/PdfRequestFiles.js index b38af95c0..38af925f4 100644 --- a/apps/OpenSign/src/pages/PdfRequestFiles.js +++ b/apps/OpenSign/src/pages/PdfRequestFiles.js @@ -1590,10 +1590,8 @@ function PdfRequestFiles() { <div className="px-[15px]"> <span> Congratulations! 🎉 This document has been - successfully + successfully signed by all participants! </span> - <br /> - <span>signed by all participants!</span> </div> )} {!isCompleted?.message && ( diff --git a/apps/OpenSign/src/primitives/ModalUi.js b/apps/OpenSign/src/primitives/ModalUi.js index fdb86c409..778d483d1 100644 --- a/apps/OpenSign/src/primitives/ModalUi.js +++ b/apps/OpenSign/src/primitives/ModalUi.js @@ -19,8 +19,10 @@ const ModalUi = ({ <div className="fixed z-[999] top-0 left-0 w-[100%] h-[100%] bg-black bg-opacity-[75%]"> <div className={`${ - reduceWidth ? "md:min-w-[430px]" : "md:min-w-[500px]" - } fixed z-[1000] top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2 text-sm bg-white rounded shadow-md max-h-90 min-w-[90%] overflow-y-auto hide-scrollbar `} + reduceWidth + ? "md:min-w-[440px] md:max-w-[400px]" + : "md:min-w-[500px]" + } fixed z-[1000] top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2 text-sm bg-white rounded shadow-md max-h-90 min-w-[90%] overflow-y-auto hide-scrollbar `} > {showHeader && ( <div From bf307abe9a98efdc0754b1b275adeef748d54c40 Mon Sep 17 00:00:00 2001 From: Amol <amol@nxglabs.in> Date: Thu, 23 May 2024 18:17:00 +0530 Subject: [PATCH 039/106] Update plansArr.js --- apps/OpenSign/src/json/plansArr.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/OpenSign/src/json/plansArr.js b/apps/OpenSign/src/json/plansArr.js index f2a116904..3cc7b1696 100644 --- a/apps/OpenSign/src/json/plansArr.js +++ b/apps/OpenSign/src/json/plansArr.js @@ -52,7 +52,8 @@ const plans = [ "API Access", "100 API signatures included", "DocumentId removal from signed docs", - "Custom email templates" + "Custom email templates", + "Auto reminders" ] }, { From fffd907d637229e9d9cddd9f1bd8161120537314 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <prafull.navkar@nxglabs.com> Date: Fri, 24 May 2024 10:13:34 +0530 Subject: [PATCH 040/106] Fix: handle owner subscription has expired error in guest login --- apps/OpenSign/src/constant/Utils.js | 7 ++++--- apps/OpenSign/src/pages/GuestLogin.js | 3 ++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/apps/OpenSign/src/constant/Utils.js b/apps/OpenSign/src/constant/Utils.js index c729d8674..0a9a4e8f0 100644 --- a/apps/OpenSign/src/constant/Utils.js +++ b/apps/OpenSign/src/constant/Utils.js @@ -19,11 +19,12 @@ export async function fetchSubscription( isGuestSign = false ) { try { - const extClass = localStorage.getItem("Extand_Class"); + const Extand_Class = localStorage.getItem("Extand_Class"); + const extClass = Extand_Class && JSON.parse(Extand_Class); + // console.log("extClass ", extClass); let extUser; if (extClass && extClass.length > 0) { - const jsonSender = JSON.parse(extClass); - extUser = jsonSender[0].objectId; + extUser = extClass[0].objectId; } else { extUser = extUserId; } diff --git a/apps/OpenSign/src/pages/GuestLogin.js b/apps/OpenSign/src/pages/GuestLogin.js index ccd99aad0..c0d4bfc19 100644 --- a/apps/OpenSign/src/pages/GuestLogin.js +++ b/apps/OpenSign/src/pages/GuestLogin.js @@ -136,7 +136,8 @@ function GuestLogin() { `Parse/${parseId}/currentUser`, JSON.stringify(_user) ); - if (contractUserDetails) { + // console.log("contractUserDetails ", contractUserDetails); + if (contractUserDetails && contractUserDetails.length > 0) { localStorage.setItem( "Extand_Class", JSON.stringify(contractUserDetails) From 6c77bbfe751eede8d00a89235e1467dd3e69d0fb Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <prafull.navkar@nxglabs.com> Date: Fri, 24 May 2024 16:29:03 +0530 Subject: [PATCH 041/106] feat: quick send feature to create & send multiple documents at a time --- apps/OpenSign/src/components/BulkSendUi.js | 52 +-- .../shared/fields/SuggestionInput.js | 2 +- apps/OpenSign/src/pages/GuestLogin.js | 340 +++++++++--------- apps/OpenSign/src/pages/PdfRequestFiles.js | 6 +- .../src/primitives/GetReportDisplay.js | 124 ++++--- apps/OpenSign/src/styles/loginPage.css | 197 ---------- apps/OpenSignServer/cloud/main.js | 2 + .../cloud/parsefunction/createBatchDocs.js | 18 +- .../cloud/parsefunction/linkContactToDoc.js | 276 ++++++++++++++ 9 files changed, 575 insertions(+), 442 deletions(-) delete mode 100644 apps/OpenSign/src/styles/loginPage.css create mode 100644 apps/OpenSignServer/cloud/parsefunction/linkContactToDoc.js diff --git a/apps/OpenSign/src/components/BulkSendUi.js b/apps/OpenSign/src/components/BulkSendUi.js index ee93c505a..3b84ac5ea 100644 --- a/apps/OpenSign/src/components/BulkSendUi.js +++ b/apps/OpenSign/src/components/BulkSendUi.js @@ -8,6 +8,8 @@ const BulkSendUi = (props) => { const formRef = useRef(null); const [scrollOnNextUpdate, setScrollOnNextUpdate] = useState(false); const [isSubmit, setIsSubmit] = useState(false); + const [allowedForm, setAllowedForm] = useState(0); + const allowedSigners = 50; useEffect(() => { if (scrollOnNextUpdate && formRef.current) { formRef.current.scrollIntoView({ @@ -37,45 +39,48 @@ const BulkSendUi = (props) => { } }); setForms((prevForms) => [...prevForms, { Id: 1, fields: users }]); + const totalForms = Math.floor(allowedSigners / users?.length); + setAllowedForm(totalForms); } })(); // eslint-disable-next-line }, []); const handleInputChange = (index, signer, fieldIndex) => { - console.log("index", index); - console.log("signer", signer); - console.log("fieldIndex", fieldIndex); - const newForms = [...forms]; newForms[index].fields[fieldIndex].email = signer?.Email ? signer?.Email : signer || ""; newForms[index].fields[fieldIndex].signer = signer?.objectId ? signer : ""; - console.log("newForms[index] ", newForms[index]); setForms(newForms); }; const handleAddForm = (e) => { e.preventDefault(); - if (props?.Placeholders.length > 0) { - let newForm = []; - props?.Placeholders?.forEach((element) => { - if (!element.signerObjId) { - newForm = [ - ...newForm, - { - fieldId: element.Id, - email: "", - label: element.Role, - signer: {} - } - ]; - } - }); - setForms([...forms, { Id: formId, fields: newForm }]); + // Check if the quick send limit has been reached + if (forms?.length < allowedForm) { + if (props?.Placeholders.length > 0) { + let newForm = []; + props?.Placeholders?.forEach((element) => { + if (!element.signerObjId) { + newForm = [ + ...newForm, + { + fieldId: element.Id, + email: "", + label: element.Role, + signer: {} + } + ]; + } + }); + setForms([...forms, { Id: formId, fields: newForm }]); + } + setFormId(formId + 1); + setScrollOnNextUpdate(true); + } else { + // If the limit has been reached, throw an error with the appropriate message + alert("Quick send reached limit."); } - setFormId(formId + 1); - setScrollOnNextUpdate(true); }; const handleRemoveForm = (index) => { @@ -102,7 +107,6 @@ const BulkSendUi = (props) => { ); // If a matching field is found, update the email value in the placeholder const signer = field?.signer?.objectId ? field.signer : {}; - console.log("signer ", signer); if (field) { return { ...placeholder, diff --git a/apps/OpenSign/src/components/shared/fields/SuggestionInput.js b/apps/OpenSign/src/components/shared/fields/SuggestionInput.js index 37f2c0b12..6efaf66a8 100644 --- a/apps/OpenSign/src/components/shared/fields/SuggestionInput.js +++ b/apps/OpenSign/src/components/shared/fields/SuggestionInput.js @@ -67,7 +67,7 @@ const SuggestionInput = (props) => { value={inputValue} onChange={handleInputChange} placeholder="Enter text..." - className="w-full border border-gray-300 p-2 text-black rounded" + className="w-full border-[1px] border-gray-400 p-2 text-black rounded" required={props.required} /> {showSuggestions && ( diff --git a/apps/OpenSign/src/pages/GuestLogin.js b/apps/OpenSign/src/pages/GuestLogin.js index c0d4bfc19..6647e1ee5 100644 --- a/apps/OpenSign/src/pages/GuestLogin.js +++ b/apps/OpenSign/src/pages/GuestLogin.js @@ -1,16 +1,20 @@ import React, { useState, useEffect } from "react"; import { useNavigate, useParams } from "react-router-dom"; -import "../styles/loginPage.css"; import loader from "../assets/images/loader2.gif"; import axios from "axios"; -import { isEnableSubscription, themeColor } from "../constant/const"; +import { + isEnableSubscription, + modalSubmitBtnColor, + themeColor +} from "../constant/const"; import { contractUsers, getAppLogo } from "../constant/Utils"; import logo from "../assets/images/logo.png"; import { appInfo } from "../constant/appinfo"; +import Parse from "parse"; function GuestLogin() { const { id, userMail, contactBookId, base64url } = useParams(); - let navigate = useNavigate(); + const navigate = useNavigate(); const [email, setEmail] = useState(userMail); const [OTP, setOTP] = useState(""); const [EnterOTP, setEnterOtp] = useState(false); @@ -20,9 +24,9 @@ function GuestLogin() { const [documentId, setDocumentId] = useState(id); const [contactId, setContactId] = useState(contactBookId); const [sendmail, setSendmail] = useState(); + const [contact, setContact] = useState({ name: "", phone: "", email: "" }); useEffect(() => { handleServerUrl(); - // eslint-disable-next-line react-hooks/exhaustive-deps }, []); @@ -53,54 +57,51 @@ function GuestLogin() { //split url in array from '/' const checkSplit = decodebase64.split("/"); setDocumentId(checkSplit[0]); + setContact((prev) => ({ ...prev, email: checkSplit[1] })); setEmail(checkSplit[1]); - setContactId(checkSplit[2]); + const contactId = checkSplit?.[2]; setSendmail(checkSplit[3]); + if (!contactId) { + const params = { email: checkSplit[1], docId: checkSplit[0] }; + try { + const linkContactRes = await Parse.Cloud.run( + "linkcontacttodoc", + params + ); + // console.log("linkContactRes ", linkContactRes); + setContactId(linkContactRes?.contactId); + } catch (err) { + console.log("Err in link ext contact", err); + } + } else { + setContactId(checkSplit[2]); + } } setIsLoading(false); }; - const handleChange = (event) => { - const { value } = event.target; - setOTP(value); - }; - //send email OTP function - const SendOtp = async (e) => { - const serverUrl = - localStorage.getItem("baseUrl") && localStorage.getItem("baseUrl"); - const parseId = - localStorage.getItem("parseAppId") && localStorage.getItem("parseAppId"); - if (serverUrl && localStorage) { - setLoading(true); - e.preventDefault(); - setEmail(email); - - try { - let url = `${serverUrl}functions/SendOTPMailV1/`; - const headers = { - "Content-Type": "application/json", - "X-Parse-Application-Id": parseId - }; - let body = { - email: email.toString(), - docId: documentId - }; - let Otp = await axios.post(url, body, { headers: headers }); - - if (Otp) { - setLoading(false); - setEnterOtp(true); - } - } catch (error) { - alert("something went wrong!"); + const SendOtp = async () => { + setLoading(true); + setEmail(email); + try { + const params = { email: email.toString(), docId: documentId }; + const Otp = await Parse.Cloud.run("SendOTPMailV1", params); + if (Otp) { + setLoading(false); + setEnterOtp(true); } - } else { + } catch (error) { alert("something went wrong!"); } }; + const handleSendOTPBtn = async (e) => { + e.preventDefault(); + await SendOtp(); + }; + //verify OTP send on via email const VerifyOTP = async (e) => { e.preventDefault(); @@ -164,156 +165,171 @@ function GuestLogin() { alert("Please Enter OTP!"); } }; - + const handleUserData = async (e) => { + e.preventDefault(); + const params = { ...contact, docId: documentId }; + try { + const linkContactRes = await Parse.Cloud.run("linkcontacttodoc", params); + // console.log("linkContactRes ", linkContactRes); + setContactId(linkContactRes.contactId); + setLoading(true); + setEnterOtp(true); + await SendOtp(); + } catch (err) { + setLoading(false); + alert("something went wron, please try agian later."); + console.log("Err in link ext contact", err); + } + }; + const handleInputChange = (e) => { + setContact((prev) => ({ ...prev, [e.target.name]: e.target.value })); + }; return ( <div style={{ padding: "2rem", background: "white" }}> {isLoading ? ( - <div - style={{ - display: "flex", - justifyContent: "center", - alignItems: "center", - height: "100vh", - flexDirection: "column" - }} - > - <img - alt="no img" - src={loader} - style={{ width: "80px", height: "80px" }} - /> + <div className="flex flex-col justify-center items-center h-[100vh]"> + <img className="w-[80px] h-[80px]" alt="loader" src={loader} /> <span style={{ fontSize: "13px", color: "gray" }}> {isLoading.message} </span> </div> ) : ( - <div - style={{ - margin: "10px", - border: "0.5px solid #c5c7c9", - padding: "30px", - boxShadow: "rgba(99, 99, 99, 0.2) 0px 2px 8px 0px" - }} - > - <div className="main_head"> - <div className="w-[250px] h-[66px] inline-block overflow-hidden"> - {appLogo && ( - <img - src={appLogo} - className="object-contain h-full" - alt="logo" - /> - )} - </div> + <div className="m-1 md:m-2 border-[0.5px] border-[#c5c7c9] p-[30px] shadow-md"> + <div className="md:w-[250px] md:h-[66px] inline-block overflow-hidden mt-2 mb-11"> + {appLogo && ( + <img src={appLogo} className="object-contain h-full" alt="logo" /> + )} </div> - - {!EnterOTP ? ( - <div className="row"> - <div className="col-sm-6 KLO"> - <span className="welcomeText">Welcome Back !</span> - <br /> - <span className="KNLO"> - Verification code is sent to your email - </span> - <div className="card card-box" style={{ borderRadius: "0px" }}> - <div className="card-body"> + {contactId ? ( + <> + {!EnterOTP ? ( + <div className="w-full md:w-[50%]"> + <h1 className="text-2xl md:text-[30px]">Welcome Back!</h1> + <legend className="text-[12px] text-[#878787] mt-2"> + Verification code is sent to your email + </legend> + <div className="p-[20px] outline outline-1 outline-slate-300/50 my-2 rounded shadow-md"> <input type="email" name="mobile" value={email} + className="outline-none px-3 py-2 w-full border-[1px] border-gray-300 rounded text-xs disabled:bg-[#e0e5f5]" disabled - className="loginInput" /> - <br /> + </div> + <div className="mt-4"> + <button + className="w-[100px] text-white text-sm font-medium py-1 rounded-sm shadow-md hover:shadow-lg focus:outline-none" + style={{ background: themeColor }} + onClick={(e) => handleSendOTPBtn(e)} + disabled={loading} + > + {loading ? "Loading..." : "Send OTP"} + </button> </div> </div> - <div className="btnContainer"> - {loading ? ( - <button - type="button" - style={{ - background: themeColor, - color: "white" - }} - className="verifyBtn" - disabled - > - <span - className="spinner-border spinner-border-sm " - role="status" - aria-hidden="true" - ></span> - Loading... - </button> - ) : ( - <button - className="verifyBtn" - style={{ - background: themeColor, - color: "white", - marginLeft: "0px !important" - }} - onClick={(e) => SendOtp(e)} - > - Send OTP - </button> - )} - </div> - </div> - </div> - ) : ( - <div className="row"> - <div className="col-sm-6 KLO"> - <span className="welcomeText">Welcome Back !</span> - <br /> - <span className="KNLO">You will get a OTP via Email</span> - <div className="card card-box"> - <div className="card-body"> - <label>Enter Verification Code</label> + ) : ( + <form className="w-full md:w-[50%]" onSubmit={VerifyOTP}> + <h1 className="text-2xl md:text-[30px]">Welcome Back!</h1> + <legend className="text-[12px] text-[#878787] mt-2"> + You will get a OTP via Email + </legend> + <div className="p-[20px] pt-[15px] outline outline-1 outline-slate-300/50 my-2 rounded shadow-md"> + <p>Enter Verification Code</p> <input type="number" - className="loginInput" + className="mt-1 outline-none px-3 py-2 w-full border-[1px] border-gray-300 rounded text-xs bg-[#e0e5f5]" name="OTP" value={OTP} - onChange={handleChange} + onChange={(e) => setOTP(e.target.value)} /> - - <br /> </div> - </div> - <div> - {loading ? ( + <div className="mt-4"> <button - style={{ - background: themeColor, - color: "white" - }} - className="verifyBtn" - type="button" - disabled + style={{ background: themeColor }} + className="w-[100px] text-white text-sm font-medium py-1 rounded-sm shadow-md hover:shadow-lg focus:outline-none" + type="submit" + disabled={loading} > - <span - className="spinner-border spinner-border-sm " - role="status" - aria-hidden="true" - ></span> - Loading... + {loading ? "Loading..." : "Verify"} </button> - ) : ( - <button - type="button" - onClick={(e) => VerifyOTP(e)} - style={{ - background: themeColor, - color: "white" - }} - className="verifyBtn" - > - Verify - </button> - )} + </div> + </form> + )} + </> + ) : ( + <div className="w-full md:w-[50%]"> + <h1 className="text-2xl md:text-[30px]">Welcome</h1> + <legend className="text-[12px] text-[#878787] mt-2"> + Provide your details + </legend> + <form + className="p-[20px] pt-[15px] outline outline-1 outline-slate-300/50 my-2 rounded shadow-md" + onSubmit={handleUserData} + > + <div className="mb-3"> + <label + htmlFor="name" + className="block text-xs text-gray-700 font-semibold" + > + Name + <span className="text-[red] text-[13px]"> *</span> + </label> + <input + type="text" + name="name" + value={contact.name} + onChange={handleInputChange} + className="px-3 py-2 w-full border-[1px] border-gray-300 rounded disabled:bg-[#e0e5f5] focus:outline-none text-xs" + disabled={loading} + required + /> </div> - </div> + <div className="mb-3"> + <label + htmlFor="email" + className="block text-xs text-gray-700 font-semibold" + > + Email + <span className="text-[red] text-[13px]"> *</span> + </label> + <input + type="email" + name="email" + value={contact.email} + onChange={handleInputChange} + className="px-3 py-2 w-full border-[1px] border-gray-300 disabled:bg-[#e0e5f5] rounded focus:outline-none text-xs" + required + disabled + /> + </div> + <div className="mb-3"> + <label + htmlFor="phone" + className="block text-xs text-gray-700 font-semibold" + > + Phone + </label> + <input + type="text" + name="phone" + value={contact.phone} + onChange={handleInputChange} + className="px-3 py-2 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs" + disabled={loading} + /> + </div> + <div className="mt-4 flex justify-start"> + <button + type="submit" + style={{ backgroundColor: modalSubmitBtnColor }} + className="mr-2 px-[20px] py-1.5 text-white rounded shadow-md text-center focus:outline-none " + disabled={loading} + > + {loading ? "Loading..." : "Next"} + </button> + </div> + </form> </div> )} </div> diff --git a/apps/OpenSign/src/pages/PdfRequestFiles.js b/apps/OpenSign/src/pages/PdfRequestFiles.js index 7565d8669..a1387a5f2 100644 --- a/apps/OpenSign/src/pages/PdfRequestFiles.js +++ b/apps/OpenSign/src/pages/PdfRequestFiles.js @@ -41,6 +41,7 @@ import DefaultSignature from "../components/pdf/DefaultSignature"; import ModalUi from "../primitives/ModalUi"; import VerifyEmail from "../components/pdf/VerifyEmail"; import TourContentWithBtn from "../primitives/TourContentWithBtn"; +import { appInfo } from "../constant/appinfo"; function useQuery() { return new URLSearchParams(useLocation().search); } @@ -460,7 +461,10 @@ function PdfRequestFiles() { } else { //else condition to check current user exist in contracts_Users class and check tour message status //if not then check user exist in contracts_Contactbook class and check tour message status - const currentUser = JSON.parse(JSON.stringify(Parse.User.current())); + const localuser = localStorage.getItem( + `Parse/${appInfo.appId}/currentUser` + ); + const currentUser = JSON.parse(JSON.stringify(localuser)); const currentUserEmail = currentUser.email; const res = await contractUsers(currentUserEmail); if (res === "Error: Something went wrong!") { diff --git a/apps/OpenSign/src/primitives/GetReportDisplay.js b/apps/OpenSign/src/primitives/GetReportDisplay.js index f97402c81..9e5b01a63 100644 --- a/apps/OpenSign/src/primitives/GetReportDisplay.js +++ b/apps/OpenSign/src/primitives/GetReportDisplay.js @@ -43,7 +43,7 @@ const ReportTable = (props) => { const [isBulkSend, setIsBulkSend] = useState({}); const [templateDeatils, setTemplateDetails] = useState({}); const [placeholders, setPlaceholders] = useState([]); - const [isErr, setIsErr] = useState(false); + const [isLoader, setIsLoader] = useState({}); const startIndex = (currentPage - 1) * props.docPerPage; const { isMoreDocs, setIsNextRecord } = props; @@ -217,7 +217,6 @@ const ReportTable = (props) => { }; const handleActionBtn = (act, item) => { - console.log("item", item); if (act.action === "redirect") { handleURL(item, act); } else if (act.action === "delete") { @@ -560,7 +559,6 @@ const ReportTable = (props) => { }; const handleResendMail = async (e, doc, user) => { e.preventDefault(); - console.log("first"); setActLoader({ [user.objectId]: true }); const url = `${localStorage.getItem("baseUrl")}functions/sendmailv3`; const headers = { @@ -618,44 +616,73 @@ const ReportTable = (props) => { </div> ); }; + // `handleQuickSendClose` is trigger when bulk send component trigger close event const handleQuickSendClose = (status, count) => { setIsBulkSend({}); setIsAlert(true); if (status === "success") { if (count > 1) { - setAlertMsg(count + " Documents sent successfully!"); + setAlertMsg({ + type: "success", + message: count + " Document sent successfully!" + }); + setTimeout(() => setIsAlert(false), 1500); } else { - setAlertMsg(count + " Document sent successfully!"); + setAlertMsg({ + type: "success", + message: count + " Document sent successfully!" + }); + setTimeout(() => setIsAlert(false), 1500); } } else { - setIsAlert(true); - setIsErr(true); + setAlertMsg({ + type: "danger", + message: "Something went wrong, Please try again later!" + }); + setTimeout(() => setIsAlert(false), 1500); } }; + // `handleBulkSend` is used to open modal as well as fetch template + // and show Ui on the basis template response const handleBulkSend = async (template) => { - const params = { - templateId: template.objectId, - include: ["Placeholders.signerPtr"] - }; - const axiosRes = await axios.post( - `${localStorage.getItem("baseUrl")}functions/getTemplate`, - params, - { - headers: { - "Content-Type": "application/json", - "X-Parse-Application-Id": localStorage.getItem("parseAppId"), - sessionToken: localStorage.getItem("accesstoken") + setIsBulkSend({ [template.objectId]: true }); + setIsLoader({ [template.objectId]: true }); + try { + const params = { + templateId: template.objectId, + include: ["Placeholders.signerPtr"] + }; + const axiosRes = await axios.post( + `${localStorage.getItem("baseUrl")}functions/getTemplate`, + params, + { + headers: { + "Content-Type": "application/json", + "X-Parse-Application-Id": localStorage.getItem("parseAppId"), + sessionToken: localStorage.getItem("accesstoken") + } } + ); + const templateRes = axiosRes.data && axiosRes.data.result; + if (templateRes?.Placeholders?.length > 0) { + setPlaceholders(templateRes?.Placeholders); + setTemplateDetails(templateRes); + setIsLoader({}); + } else { + setIsLoader(false); + setIsDocErr(true); } - ); - const templateRes = axiosRes.data && axiosRes.data.result; - if (templateRes?.Placeholders?.length > 0) { - setPlaceholders(templateRes?.Placeholders); - setTemplateDetails(templateRes); - setIsBulkSend({ [templateRes.objectId]: true }); - } else { - setIsDocErr(true); + } catch (err) { + console.log("err in fetch template in bulk modal", err); + setIsBulkSend({}); + setIsDocErr(false); + setIsAlert(true); + setAlertMsg({ + type: "danger", + message: "Something went wrong, Please try again later!" + }); + setTimeout(() => setIsAlert(false), 1500); } }; return ( @@ -842,11 +869,11 @@ const ReportTable = (props) => { )} {isOption[item.objectId] && act.action === "option" && ( - <div className="absolute -right-2 top-5 bg-white rounded shadow z-[20] overflow-hidden"> + <div className="absolute -right-2 top-5 bg-white text-nowrap rounded shadow z-[20] overflow-hidden"> {act.subaction?.map((subact) => ( <div key={subact.btnId} - className="hover:bg-gray-300 cursor-pointer px-2 py-1.5 flex justify-start items-center text-black" + className="hover:bg-gray-300 cursor-pointer px-2 py-1.5 flex justify-start items-center text-black" onClick={() => handleActionBtn(subact, item) } @@ -898,17 +925,34 @@ const ReportTable = (props) => { </div> </ModalUi> )} - {isBulkSend[`${item.objectId}`] && ( + {isBulkSend[item.objectId] && ( <ModalUi isOpen title={"Quick send"} handleClose={() => setIsBulkSend({})} > - <BulkSendUi - Placeholders={placeholders} - item={templateDeatils} - handleClose={handleQuickSendClose} - /> + {isLoader[item.objectId] ? ( + <div className="w-full h-[100px] md:h-[100px] rounded-b-md flex justify-center items-center bg-black bg-opacity-30 z-30"> + <div + style={{ fontSize: "45px", color: "#3dd3e0" }} + className="loader-37" + ></div> + </div> + ) : ( + <> + {isDocErr ? ( + <div className="text-black bg-white w-full h-[80px] md:h-[100px] text-sm md:text-xl flex justify-center items-center"> + Please add Signers or Roles in template + </div> + ) : ( + <BulkSendUi + Placeholders={placeholders} + item={templateDeatils} + handleClose={handleQuickSendClose} + /> + )} + </> + )} </ModalUi> )} {isShare[item.objectId] && ( @@ -1158,16 +1202,6 @@ const ReportTable = (props) => { closePopup={handleContactFormModal} /> </ModalUi> - <ModalUi - headColor={"#dc3545"} - isOpen={isDocErr} - title={"Receipent required"} - handleClose={() => setIsDocErr(false)} - > - <div style={{ height: "100%", padding: 20 }}> - <p>Please add receipent in template!</p> - </div> - </ModalUi> </div> </div> ); diff --git a/apps/OpenSign/src/styles/loginPage.css b/apps/OpenSign/src/styles/loginPage.css deleted file mode 100644 index 0c18fe779..000000000 --- a/apps/OpenSign/src/styles/loginPage.css +++ /dev/null @@ -1,197 +0,0 @@ -.loginInput { - padding: 10px; - border-radius: 4px; - width: 100%; - font-size: 0.75rem; - border: 1px solid #e2dddd; - background-color: #e0e5f5; - color: black; - padding-left: 1rem !important; - padding-right: 1rem !important; - padding-top: 0.5rem !important; - font-family: inherit; - font-feature-settings: inherit; - font-variation-settings: inherit; - font-weight: inherit; - overflow: visible; -} -.loginInput:focus { - outline: none; - border: none; -} -.verifyBtn { - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1), 0 1px 2px rgba(0, 0, 0, 0.18); - padding: 3px 30px; - color: white; - font-weight: 500 !important; - font-size: 14px !important; - border: none; -} -.verifyBtn:focus { - border: none; - outline: none; -} - -.verifyBtn:hover { - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1), 0 2px 4px rgba(0, 0, 0, 0.18); - color: white; -} -.fakeimg { - height: 200px; - background: #aaa; -} - -.GTRY { - border: 1px solid #dee2e6; - margin-top: 75px; - padding-bottom: 20px; - background-color: #fff; -} - -.main_head { - width: 100%; - height: 66px; - background-color: #fff; - margin-bottom: 52px; - padding-top: 10px; -} - -.main-logo { - width: 250px; - height: 66px; - display: inline-block; -} - -.card-box { - background: #fff; - min-height: 50px; - box-shadow: 0 20px 20px rgba(0, 0, 0, 0.1); - position: relative; - margin-bottom: 20px; - transition: 0.5s; - border: 1px solid #f2f2f2; - border-radius: 7px; - margin-top: 10px; -} - -.LKJH { - display: flex; -} - -.GTR { - text-align: left; -} - -.JUI { - text-align: right; -} - -.btn-info { - color: #fff; - background-color: #15b4e9; - border-color: #15b4e9; -} - -.btn-info:hover { - color: #fff; - background-color: #15b4e9; - border-color: #15b4e9; -} - -.btn-reg { - color: #15b4e9; - background-color: #ffffff; - border-color: #15b4e9; -} - -.btn-reg:hover { - color: #15b4e9; - background-color: #ffffff; - border-color: #15b4e9; -} - -.SYTU { - display: flex; -} - -.MLKI { - float: right; - margin-bottom: 12px; -} - -.login-btn { - width: 100% !important; - display: block !important; -} - -@media only screen and (max-width: 667px) { - .MLKI { - float: inherit; - } - - .login-btn { - width: 210px !important; - } -} - -.MLKI a { - color: #212529; -} - -.KNLO { - color: #878787; - font-size: 13px; -} - -.form-check-label { - margin-left: 17px; - margin-bottom: 12px; -} -.welcomeText { - font-size: 30px; -} - -@media only screen and (max-width: 600px) { - .KLO1 { - display: none; - } - - .MLKI a { - font-size: 12px; - } - - .form-check-label { - font-size: 12px; - margin-bottom: 14px; - } - - .MKUY { - text-align: center; - padding-top: 10px; - } - - .main_head { - margin-bottom: 12px; - padding-top: 10px; - border-bottom: 1px dashed #eeeeee; - } -} -@media screen and (max-width: 366px) { - .main-logo { - width: 150px; - height: 46px; - display: inline-block; - } - .welcomeText { - font-size: 20px; - } - .KNLO { - color: #878787; - font-size: 10px; - } - .btnContainer { - display: flex; - justify-content: center; - align-items: center; - } -} diff --git a/apps/OpenSignServer/cloud/main.js b/apps/OpenSignServer/cloud/main.js index c0c2ae78c..32a047a3f 100644 --- a/apps/OpenSignServer/cloud/main.js +++ b/apps/OpenSignServer/cloud/main.js @@ -38,6 +38,7 @@ import VerifyEmail from './parsefunction/VerifyEmail.js'; import encryptedpdf from './parsefunction/encryptedPdf.js'; import { getSignedUrl } from './parsefunction/getSignedUrl.js'; import createBatchDocs from './parsefunction/createBatchDocs.js'; +import linkContactToDoc from './parsefunction/linkContactToDoc.js'; // This afterSave function triggers after an object is added or updated in the specified class, allowing for post-processing logic. Parse.Cloud.afterSave('contracts_Document', DocumentAftersave); @@ -86,3 +87,4 @@ Parse.Cloud.define('verifyemail', VerifyEmail); Parse.Cloud.define('encryptedpdf', encryptedpdf); Parse.Cloud.define('getsignedurl', getSignedUrl); Parse.Cloud.define('batchdocuments', createBatchDocs); +Parse.Cloud.define('linkcontacttodoc', linkContactToDoc); diff --git a/apps/OpenSignServer/cloud/parsefunction/createBatchDocs.js b/apps/OpenSignServer/cloud/parsefunction/createBatchDocs.js index 1fb8e783e..b18f70a91 100644 --- a/apps/OpenSignServer/cloud/parsefunction/createBatchDocs.js +++ b/apps/OpenSignServer/cloud/parsefunction/createBatchDocs.js @@ -31,9 +31,9 @@ async function sendMail(document, sessionToken) { const hostUrl = baseUrl.origin; let encodeBase64; if (objectId) { - encodeBase64 = btoa(`${document.objectId}}/${signerMail[i].signerPtr.Email}/${objectId}`); + encodeBase64 = btoa(`${document.objectId}/${signerMail[i].signerPtr.Email}/${objectId}`); } else { - encodeBase64 = btoa(`${document.objectId}}/${signerMail[i].email}`); + encodeBase64 = btoa(`${document.objectId}/${signerMail[i].email}`); } let signPdf = `${hostUrl}/login/${encodeBase64}`; const openSignUrl = 'https://www.opensignlabs.com/'; @@ -93,18 +93,12 @@ export default async function createBatchDocs(request) { try { const requests = Documents.map(x => { const Signers = x.Signers; - const allSigner = x?.Placeholders?.map(item => { - const signer = Signers?.find(e => item?.signerPtr?.objectId === e?.objectId); - if (signer) { - return signer; - } else { - return item?.signerPtr?.objectId && item?.signerPtr; - } - }); + const allSigner = x?.Placeholders?.map( + item => Signers?.find(e => item?.signerPtr?.objectId === e?.objectId) || item?.signerPtr + ).filter(signer => Object.keys(signer).length > 0); const date = new Date(); const isoDate = date.toISOString(); let Acl = { [x.CreatedBy.objectId]: { read: true, write: true } }; - // console.log('allSigner ', allSigner); if (allSigner && allSigner.length > 0) { allSigner.forEach(x => { const obj = { [x.CreatedBy.objectId]: { read: true, write: true } }; @@ -146,7 +140,7 @@ export default async function createBatchDocs(request) { objectId: y.objectId, })), ACL: Acl, - RemindOnceInEvery: x.RemindOnceInEvery, + RemindOnceInEvery: x.RemindOnceInEvery || 5, AutomaticReminders: x.AutomaticReminders || false, TimeToCompleteDays: x.TimeToCompleteDays || 15, OriginIp: Ip, diff --git a/apps/OpenSignServer/cloud/parsefunction/linkContactToDoc.js b/apps/OpenSignServer/cloud/parsefunction/linkContactToDoc.js new file mode 100644 index 000000000..5b0f03442 --- /dev/null +++ b/apps/OpenSignServer/cloud/parsefunction/linkContactToDoc.js @@ -0,0 +1,276 @@ +// `saveRoleContact` is used to save user in contracts_Guest role and create contact +const saveRoleContact = async contact => { + try { + const Role = new Parse.Query(Parse.Role); + const guestRole = await Role.equalTo('name', 'contracts_Guest').first(); + if (guestRole) { + // Check if the user is already in the role + const relation = guestRole.relation('users'); + const usersInRoleQuery = relation.query(); + usersInRoleQuery.equalTo('objectId', contact.UserId.objectId); + const usersInRole = await usersInRoleQuery.find(); + if (usersInRole.length > 0) { + console.log('User already added to Guest role.'); + } else { + relation.add({ __type: 'Pointer', className: '_User', id: contact.UserId.objectId }); + await guestRole.save(null, { useMasterKey: true }); + // console.log('User added to Guest role successfully.'); + } + } + } catch (err) { + console.log('err in role save', err); + } + const contactQuery = new Parse.Object('contracts_Contactbook'); + contactQuery.set('Name', contact.Name); + contactQuery.set('Email', contact.Email); + if (contact?.Phone) { + contactQuery.set('Phone', contact.Phone); + } + contactQuery.set('CreatedBy', contact.CreatedBy); + contactQuery.set('UserId', contact.UserId); + contactQuery.set('UserRole', 'contracts_Guest'); + contactQuery.set('TenantId', contact.TenantId); + contactQuery.set('IsDeleted', false); + const acl = new Parse.ACL(); + acl.setReadAccess(contact.CreatedBy.objectId, true); + acl.setWriteAccess(contact.CreatedBy.objectId, true); + acl.setReadAccess(contact.UserId.objectId, true); + acl.setWriteAccess(contact.UserId.objectId, true); + contactQuery.setACL(acl); + const contactRes = await contactQuery.save(); + if (contactRes) { + return contactRes; + } +}; + +// `linkContactToDoc` cloud function is used to create contact, add this contact in contracts_Guest role and +// save contact pointer in placeholder, signers and ACL of Document +export default async function linkContactToDoc(req) { + const email = req.params.email; + const docId = req.params.docId; + const name = req.params.name; + const phone = req.params.phone; + try { + if (docId) { + // Execute the query to get the document with the specified 'docId' + const docQuery = new Parse.Query('contracts_Document'); + docQuery.include('ExtUserPtr'); + const docRes = await docQuery.get(docId, { useMasterKey: true }); + // Check if the document was found; if not, throw an error indicating the document was not found + if (!docRes) { + throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Document not found.'); + } + const _docRes = JSON.parse(JSON.stringify(docRes)); + const Placeholders = _docRes?.Placeholders || []; + const index = Placeholders?.findIndex(x => x.email && x.email === email); + if (index !== -1) { + // `signerObjectId` holds the value of `signerObjId` from the `Placeholders` array at the current index. + // This value is used to check if `signerObjId` is present or not. + const signerObjectId = Placeholders[index]?.signerObjId; + if (signerObjectId) { + return { contactId: signerObjectId }; + } + // Execute the query to check if a contact already exists in the 'contracts_Contactbook' class + const contactCls = new Parse.Query('contracts_Contactbook'); + contactCls.equalTo('Email', email); + contactCls.equalTo('CreatedBy', _docRes.CreatedBy); + contactCls.notEqualTo('IsDeleted', true); + const existContact = await contactCls.first({ useMasterKey: true }); + if (existContact) { + //update contact in placeholder, signers and update ACl in provide document + const updateDoc = new Parse.Object('contracts_Document'); + updateDoc.id = docId; + const signers = _docRes?.Signers || []; + signers.push({ + __type: 'Pointer', + className: 'contracts_Contactbook', + objectId: existContact.id, + }); + updateDoc.set('Signers', signers); + + Placeholders[index] = { + ...Placeholders[index], + signerObjId: existContact.id, + signerPtr: { + __type: 'Pointer', + className: 'contracts_Contactbook', + objectId: existContact.id, + }, + }; + updateDoc.set('Placeholders', Placeholders); + const Acl = docRes.getACL(); + Acl.setReadAccess(existContact.get('CreatedBy').id, true); + Acl.setWriteAccess(existContact.get('CreatedBy').id, true); + updateDoc.setACL(Acl); + // const parseData = JSON.parse(JSON.stringify(res)); + const resDoc = await updateDoc.save(null, { useMasterKey: true }); + if (resDoc) { + return { contactId: existContact.id }; + } + } else { + // Execute the query to check if a user already exists in the 'contracts_Users' class + const extUserQuery = new Parse.Query('contracts_Users'); + extUserQuery.equalTo('Email', email); + const extUser = await extUserQuery.first({ useMasterKey: true }); + if (extUser) { + const _extUser = JSON.parse(JSON.stringify(extUser)); + const contact = { + UserId: _extUser.UserId, + Name: _extUser.Name, + Email: email, + Phone: _extUser?.Phone ? _extUser.Phone : '', + CreatedBy: _docRes.CreatedBy, + TenantId: _docRes.ExtUserPtr.TenantId, + }; + // if user present on platform create contact on the basis of extended user details + const contactRes = await saveRoleContact(contact); + //update contact in placeholder, signers and update ACl in provide document + const updateDoc = new Parse.Object('contracts_Document'); + updateDoc.id = docId; + const signers = _docRes?.Signers || []; + signers.push({ + __type: 'Pointer', + className: 'contracts_Contactbook', + objectId: contactRes.id, + }); + updateDoc.set('Signers', signers); + + Placeholders[index] = { + ...Placeholders[index], + signerObjId: contactRes.id, + signerPtr: { + __type: 'Pointer', + className: 'contracts_Contactbook', + objectId: contactRes.id, + }, + }; + updateDoc.set('Placeholders', Placeholders); + const Acl = docRes.getACL(); + Acl.setReadAccess(_extUser.UserId.objectId, true); + Acl.setWriteAccess(_extUser.UserId.objectId, true); + updateDoc.setACL(Acl); + // const parseData = JSON.parse(JSON.stringify(res)); + const resDoc = await updateDoc.save(null, { useMasterKey: true }); + if (resDoc) { + return { contactId: contactRes.id }; + } + } else if (name) { + try { + // Execute the query to check if a user already exists in the '_User' class + const userQuery = new Parse.Query(Parse.User); + userQuery.equalTo('email', email); + const userRes = await userQuery.first({ useMasterKey: true }); + if (userRes) { + const contact = { + UserId: { __type: 'Pointer', className: '_User', objectId: userRes.id }, + Name: name, + Email: email, + Phone: phone, + CreatedBy: _docRes.CreatedBy, + TenantId: _docRes.ExtUserPtr.TenantId, + }; + // Create new contract on the basis provided contact details by user and userId from _User class + const contactRes = await saveRoleContact(contact); + //update contact in placeholder, signers and update ACl in provide document + const updateDoc = new Parse.Object('contracts_Document'); + updateDoc.id = docId; + const signers = _docRes?.Signers || []; + signers.push({ + __type: 'Pointer', + className: 'contracts_Contactbook', + objectId: contactRes.id, + }); + updateDoc.set('Signers', signers); + + Placeholders[index] = { + ...Placeholders[index], + signerObjId: contactRes.id, + signerPtr: { + __type: 'Pointer', + className: 'contracts_Contactbook', + objectId: contactRes.id, + }, + }; + updateDoc.set('Placeholders', Placeholders); + const Acl = docRes.getACL(); + Acl.setReadAccess(userRes.id, true); + Acl.setWriteAccess(userRes.id, true); + updateDoc.setACL(Acl); + // const parseData = JSON.parse(JSON.stringify(res)); + const resDoc = await updateDoc.save(null, { useMasterKey: true }); + if (resDoc) { + return { contactId: contactRes.id }; + } + } else { + // create new user in _User class on the basis of details provide by user + const _users = Parse.Object.extend('User'); + const _user = new _users(); + _user.set('name', name); + _user.set('username', email); + _user.set('email', email); + if (phone) { + _user.set('phone', phone); + _user.set('password', phone); + } else { + _user.set('password', email); + } + const newUserRes = await _user.save(); + const contact = { + UserId: { __type: 'Pointer', className: '_User', objectId: newUserRes.id }, + Name: name, + Email: email, + Phone: phone, + CreatedBy: _docRes.CreatedBy, + TenantId: _docRes.ExtUserPtr.TenantId, + }; + // Create new contract on the basis provided contact details by user and userId from _User class + const contactRes = await saveRoleContact(contact); + //update contact in placeholder, signers and update ACl in provide document + const updateDoc = new Parse.Object('contracts_Document'); + updateDoc.id = docId; + const signers = _docRes?.Signers || []; + signers.push({ + __type: 'Pointer', + className: 'contracts_Contactbook', + objectId: contactRes.id, + }); + updateDoc.set('Signers', signers); + + Placeholders[index] = { + ...Placeholders[index], + signerObjId: contactRes.id, + signerPtr: { + __type: 'Pointer', + className: 'contracts_Contactbook', + objectId: contactRes.id, + }, + }; + updateDoc.set('Placeholders', Placeholders); + const Acl = docRes.getACL(); + Acl.setReadAccess(newUserRes.id, true); + Acl.setWriteAccess(newUserRes.id, true); + updateDoc.setACL(Acl); + // const parseData = JSON.parse(JSON.stringify(res)); + const resDoc = await updateDoc.save(null, { useMasterKey: true }); + if (resDoc) { + return { contactId: contactRes.id }; + } + } + } catch (err) { + console.log('Err', err); + } + } else { + throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'User not found.'); + } + } + } else { + throw new Parse.Error(Parse.Error.OPERATION_FORBIDDEN, 'unauthorized'); + } + } else { + throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Document not found.'); + } + } catch (err) { + console.log('err in linkcontacttodoc', err); + throw err; + } +} From 6a9408b7b4514f77e5c9769bc0213714ec5c10d6 Mon Sep 17 00:00:00 2001 From: Amol <amol@nxglabs.in> Date: Fri, 24 May 2024 19:24:52 +0530 Subject: [PATCH 042/106] docs: add Zathiel as a contributor for security --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 24e1046fc..ede88954f 100644 --- a/README.md +++ b/README.md @@ -136,7 +136,7 @@ We would like to thank all our contributors and users for their support and feed <td align="center" valign="top" width="14.28%"><a href="https://github.com/VikramNagwal"><img src="https://avatars.githubusercontent.com/u/123088024?v=4?s=100" width="100px;" alt="Vikram"/><br /><sub><b>Vikram</b></sub></a><br /><a href="#code-VikramNagwal" title="Code">💻</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/ugoconsonni"><img src="https://avatars.githubusercontent.com/u/13661702?v=4?s=100" width="100px;" alt="ugoconsonni"/><br /><sub><b>ugoconsonni</b></sub></a><br /><a href="#code-ugoconsonni" title="Code">💻</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/daniel-mutwiri"><img src="https://avatars.githubusercontent.com/u/8936960?v=4?s=100" width="100px;" alt="Daniel Mutwiri"/><br /><sub><b>Daniel Mutwiri</b></sub></a><br /><a href="#code-daniel-mutwiri" title="Code">💻</a></td> - <td align="center" valign="top" width="14.28%"><a href="https://github.com/Zathiel"><img src="https://avatars.githubusercontent.com/u/26553418?v=4?s=100" width="100px;" alt="Zathiel"/><br /><sub><b>Zathiel</b></sub></a><br /><a href="#code-Zathiel" title="Code">💻</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://github.com/Zathiel"><img src="https://avatars.githubusercontent.com/u/26553418?v=4?s=100" width="100px;" alt="Zathiel"/><br /><sub><b>Zathiel</b></sub></a><br /><a href="#code-Zathiel" title="Code">💻</a><a href="#security-Zathiel" title="Security">🛡️</a></td> </tr> </tbody> </table> From 31c861cbe46f6e6a9c226ef8f5a5b582ff926dcb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 May 2024 00:13:57 +0000 Subject: [PATCH 043/106] build(deps-dev): bump @babel/runtime-corejs2 in /apps/OpenSign Bumps [@babel/runtime-corejs2](https://github.com/babel/babel/tree/HEAD/packages/babel-runtime-corejs2) from 7.24.5 to 7.24.6. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.24.6/packages/babel-runtime-corejs2) --- updated-dependencies: - dependency-name: "@babel/runtime-corejs2" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> --- apps/OpenSign/package-lock.json | 8 ++++---- apps/OpenSign/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/OpenSign/package-lock.json b/apps/OpenSign/package-lock.json index a59f26945..c5773d1cf 100644 --- a/apps/OpenSign/package-lock.json +++ b/apps/OpenSign/package-lock.json @@ -54,7 +54,7 @@ "web-vitals": "^4.0.1" }, "devDependencies": { - "@babel/runtime-corejs2": "^7.24.5", + "@babel/runtime-corejs2": "^7.24.6", "autoprefixer": "^10.4.19", "commitizen": "^4.3.0", "eslint": "^8.57.0", @@ -1995,9 +1995,9 @@ } }, "node_modules/@babel/runtime-corejs2": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.24.5.tgz", - "integrity": "sha512-cC9jiO6s/IN+xwCHYy1AGrcFJ4bwgIwb8HX1KaoEpRsznLlO4x9eBP6AX7RIeMSWlQqEj2WHox637OS8cDq6Ew==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.24.6.tgz", + "integrity": "sha512-5UK2PnfpmiCftYGBeJ+SpFIMNaoMPU/eQt1P5ISx0TB7nGGzEMLT4/3PapNZEfGZh+nGxGOGj2t59prGFBhunQ==", "dev": true, "dependencies": { "core-js": "^2.6.12", diff --git a/apps/OpenSign/package.json b/apps/OpenSign/package.json index 2c8820be3..164d943ac 100644 --- a/apps/OpenSign/package.json +++ b/apps/OpenSign/package.json @@ -84,7 +84,7 @@ } }, "devDependencies": { - "@babel/runtime-corejs2": "^7.24.5", + "@babel/runtime-corejs2": "^7.24.6", "autoprefixer": "^10.4.19", "commitizen": "^4.3.0", "eslint": "^8.57.0", From b7beeee260c21d00c058f045c42d69245e43cd58 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 May 2024 00:14:13 +0000 Subject: [PATCH 044/106] build(deps-dev): bump lint-staged in /apps/OpenSign Bumps [lint-staged](https://github.com/okonet/lint-staged) from 15.2.4 to 15.2.5. - [Release notes](https://github.com/okonet/lint-staged/releases) - [Changelog](https://github.com/lint-staged/lint-staged/blob/master/CHANGELOG.md) - [Commits](https://github.com/okonet/lint-staged/compare/v15.2.4...v15.2.5) --- updated-dependencies: - dependency-name: lint-staged dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> --- apps/OpenSign/package-lock.json | 47 +++++++++++++-------------------- apps/OpenSign/package.json | 2 +- 2 files changed, 19 insertions(+), 30 deletions(-) diff --git a/apps/OpenSign/package-lock.json b/apps/OpenSign/package-lock.json index a59f26945..55de2be44 100644 --- a/apps/OpenSign/package-lock.json +++ b/apps/OpenSign/package-lock.json @@ -60,7 +60,7 @@ "eslint": "^8.57.0", "eslint-plugin-prettier": "^4.2.1", "eslint-plugin-react": "^7.34.1", - "lint-staged": "^15.2.4", + "lint-staged": "^15.2.5", "postcss": "^8.4.38", "prettier": "^2.8.8", "pretty-quick": "^3.3.1", @@ -15562,21 +15562,21 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/lint-staged": { - "version": "15.2.4", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.4.tgz", - "integrity": "sha512-3F9KRQIS2fVDGtCkBp4Bx0jswjX7zUcKx6OF0ZeY1prksUyKPRIIUqZhIUYAstJfvj6i48VFs4dwVIbCYwvTYQ==", + "version": "15.2.5", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.5.tgz", + "integrity": "sha512-j+DfX7W9YUvdzEZl3Rk47FhDF6xwDBV5wwsCPw6BwWZVPYJemusQmvb9bRsW23Sqsaa+vRloAWogbK4BUuU2zA==", "dev": true, "dependencies": { - "chalk": "5.3.0", - "commander": "12.1.0", - "debug": "4.3.4", - "execa": "8.0.1", - "lilconfig": "3.1.1", - "listr2": "8.2.1", - "micromatch": "4.0.6", - "pidtree": "0.6.0", - "string-argv": "0.3.2", - "yaml": "2.4.2" + "chalk": "~5.3.0", + "commander": "~12.1.0", + "debug": "~4.3.4", + "execa": "~8.0.1", + "lilconfig": "~3.1.1", + "listr2": "~8.2.1", + "micromatch": "~4.0.7", + "pidtree": "~0.6.0", + "string-argv": "~0.3.2", + "yaml": "~2.4.2" }, "bin": { "lint-staged": "bin/lint-staged.js" @@ -16399,28 +16399,17 @@ } }, "node_modules/micromatch": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.6.tgz", - "integrity": "sha512-Y4Ypn3oujJYxJcMacVgcs92wofTHxp9FzfDpQON4msDefoC0lb3ETvQLOdLcbhSwU1bz8HrL/1sygfBIHudrkQ==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", "dependencies": { "braces": "^3.0.3", - "picomatch": "^4.0.2" + "picomatch": "^2.3.1" }, "engines": { "node": ">=8.6" } }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", diff --git a/apps/OpenSign/package.json b/apps/OpenSign/package.json index 2c8820be3..ffe778fe0 100644 --- a/apps/OpenSign/package.json +++ b/apps/OpenSign/package.json @@ -90,7 +90,7 @@ "eslint": "^8.57.0", "eslint-plugin-prettier": "^4.2.1", "eslint-plugin-react": "^7.34.1", - "lint-staged": "^15.2.4", + "lint-staged": "^15.2.5", "postcss": "^8.4.38", "prettier": "^2.8.8", "pretty-quick": "^3.3.1", From 59f6d022cf228c33aa1dab530f37a7e55a524538 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 May 2024 00:27:04 +0000 Subject: [PATCH 045/106] build(deps-dev): bump @babel/eslint-parser in /apps/OpenSignServer Bumps [@babel/eslint-parser](https://github.com/babel/babel/tree/HEAD/eslint/babel-eslint-parser) from 7.24.5 to 7.24.6. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.24.6/eslint/babel-eslint-parser) --- updated-dependencies: - dependency-name: "@babel/eslint-parser" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> --- apps/OpenSignServer/package-lock.json | 8 ++++---- apps/OpenSignServer/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/OpenSignServer/package-lock.json b/apps/OpenSignServer/package-lock.json index 10bcaa5d1..5efa2c928 100644 --- a/apps/OpenSignServer/package-lock.json +++ b/apps/OpenSignServer/package-lock.json @@ -38,7 +38,7 @@ "posthog-node": "^4.0.1" }, "devDependencies": { - "@babel/eslint-parser": "^7.24.5", + "@babel/eslint-parser": "^7.24.6", "eslint": "^9.3.0", "jasmine": "^5.1.0", "mongodb-runner": "^5.6.2", @@ -1303,9 +1303,9 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.24.5.tgz", - "integrity": "sha512-gsUcqS/fPlgAw1kOtpss7uhY6E9SFFANQ6EFX5GTvzUwaV0+sGaZWk6xq22MOdeT9wfxyokW3ceCUvOiRtZciQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.24.6.tgz", + "integrity": "sha512-Q1BfQX42zXHx732PLW0w4+Y3wJjoZKEMaatFUEAmQ7Z+jCXxinzeqX9bvv2Q8xNPes/H6F0I23oGkcgjaItmLw==", "dev": true, "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", diff --git a/apps/OpenSignServer/package.json b/apps/OpenSignServer/package.json index 8a322d2ef..f706ba2ba 100644 --- a/apps/OpenSignServer/package.json +++ b/apps/OpenSignServer/package.json @@ -48,7 +48,7 @@ }, "type": "module", "devDependencies": { - "@babel/eslint-parser": "^7.24.5", + "@babel/eslint-parser": "^7.24.6", "eslint": "^9.3.0", "jasmine": "^5.1.0", "mongodb-runner": "^5.6.2", From a86f4fd9b7857dd17f543127a31c61cf3e13c62b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 May 2024 00:27:27 +0000 Subject: [PATCH 046/106] build(deps-dev): bump nodemon in /apps/OpenSignServer Bumps [nodemon](https://github.com/remy/nodemon) from 3.1.0 to 3.1.1. - [Release notes](https://github.com/remy/nodemon/releases) - [Commits](https://github.com/remy/nodemon/compare/v3.1.0...v3.1.1) --- updated-dependencies: - dependency-name: nodemon dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> --- apps/OpenSignServer/package-lock.json | 8 ++++---- apps/OpenSignServer/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/OpenSignServer/package-lock.json b/apps/OpenSignServer/package-lock.json index 10bcaa5d1..5ce604ce9 100644 --- a/apps/OpenSignServer/package-lock.json +++ b/apps/OpenSignServer/package-lock.json @@ -42,7 +42,7 @@ "eslint": "^9.3.0", "jasmine": "^5.1.0", "mongodb-runner": "^5.6.2", - "nodemon": "^3.1.0", + "nodemon": "^3.1.1", "nyc": "15.1.0", "prettier": "^3.2.5", "uglify-js": "^3.17.4" @@ -8365,9 +8365,9 @@ } }, "node_modules/nodemon": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.0.tgz", - "integrity": "sha512-xqlktYlDMCepBJd43ZQhjWwMw2obW/JRvkrLxq5RCNcuDDX1DbcPT+qT1IlIIdf+DhnWs90JpTMe+Y5KxOchvA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.1.tgz", + "integrity": "sha512-k43xGaDtaDIcufn0Fc6fTtsdKSkV/hQzoQFigNH//GaKta28yoKVYXCnV+KXRqfT/YzsFaQU9VdeEG+HEyxr6A==", "dev": true, "dependencies": { "chokidar": "^3.5.2", diff --git a/apps/OpenSignServer/package.json b/apps/OpenSignServer/package.json index 8a322d2ef..189acab89 100644 --- a/apps/OpenSignServer/package.json +++ b/apps/OpenSignServer/package.json @@ -52,7 +52,7 @@ "eslint": "^9.3.0", "jasmine": "^5.1.0", "mongodb-runner": "^5.6.2", - "nodemon": "^3.1.0", + "nodemon": "^3.1.1", "nyc": "15.1.0", "prettier": "^3.2.5", "uglify-js": "^3.17.4" From c3c6f6bab34c224e925781da8e485c384868c1a8 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <prafull.navkar@nxglabs.com> Date: Mon, 27 May 2024 11:59:25 +0530 Subject: [PATCH 047/106] fix: send mail only first signer if sendinorder, takeout quick send btn from 3 dots --- .../shared/fields/SuggestionInput.js | 2 +- apps/OpenSign/src/json/ReportJson.js | 23 +++++++++++-------- .../cloud/parsefunction/createBatchDocs.js | 12 +++++++--- 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/apps/OpenSign/src/components/shared/fields/SuggestionInput.js b/apps/OpenSign/src/components/shared/fields/SuggestionInput.js index 6efaf66a8..aaefb2b30 100644 --- a/apps/OpenSign/src/components/shared/fields/SuggestionInput.js +++ b/apps/OpenSign/src/components/shared/fields/SuggestionInput.js @@ -66,7 +66,7 @@ const SuggestionInput = (props) => { type={props?.type || "text"} value={inputValue} onChange={handleInputChange} - placeholder="Enter text..." + placeholder="Enter Email..." className="w-full border-[1px] border-gray-400 p-2 text-black rounded" required={props.required} /> diff --git a/apps/OpenSign/src/json/ReportJson.js b/apps/OpenSign/src/json/ReportJson.js index f16efca1c..705ce8fb9 100644 --- a/apps/OpenSign/src/json/ReportJson.js +++ b/apps/OpenSign/src/json/ReportJson.js @@ -3,7 +3,7 @@ export default function reportJson(id) { const head = ["Sr.No", "Title", "Note", "Folder", "File", "Owner", "Signers"]; const contactbook = ["Sr.No", "Title", "Email", "Phone"]; const dashboardReportHead = ["Title", "File", "Owner", "Signers"]; - + const templateReport = ["Sr.No", "Title", "File", "Owner", "Signers"]; switch (id) { // draft documents report case "ByHuevtCFY": @@ -326,7 +326,7 @@ export default function reportJson(id) { case "6TeaPr321t": return { reportName: "Templates", - heading: head, + heading: templateReport, actions: [ { btnId: "2234", @@ -341,6 +341,17 @@ export default function reportJson(id) { message: "Click the 'Use' button to create a new document from an existing template. " }, + { + btnId: "1631", + btnLabel: "Quick send", + hoverLabel: "Quick send", + btnIcon: "fa-solid fa-envelope", + redirectUrl: "", + action: "bulksend", + selector: "tourbulksend", + message: + "To quickly create and send multiple documents using an existing template, click the 'Quick Send' button." + }, { btnId: "2234", hoverLabel: "option", @@ -360,14 +371,6 @@ export default function reportJson(id) { redirectUrl: "template", action: "redirect" }, - { - btnId: "1631", - btnLabel: "Quick send", - hoverLabel: "Quick send", - btnIcon: "fa-solid fa-envelope", - redirectUrl: "", - action: "bulksend" - }, { btnId: "1834", btnLabel: "Delete", diff --git a/apps/OpenSignServer/cloud/parsefunction/createBatchDocs.js b/apps/OpenSignServer/cloud/parsefunction/createBatchDocs.js index b18f70a91..cb8524998 100644 --- a/apps/OpenSignServer/cloud/parsefunction/createBatchDocs.js +++ b/apps/OpenSignServer/cloud/parsefunction/createBatchDocs.js @@ -17,7 +17,12 @@ async function sendMail(document, sessionToken) { year: 'numeric', }); const sender = document.ExtUserPtr.Email; - const signerMail = document.Placeholders; + let signerMail = document.Placeholders; + + if (document.SendinOrder) { + signerMail = signerMail.slice(); + signerMail.splice(1); + } for (let i = 0; i < signerMail.length; i++) { try { const imgPng = 'https://qikinnovation.ams3.digitaloceanspaces.com/logo.png'; @@ -42,7 +47,7 @@ async function sendMail(document, sessionToken) { let params = { extUserId: document.ExtUserPtr.objectId, recipient: objectId ? signerMail[i].signerPtr.Email : signerMail[i].email, - subject: `${document.ExtUserPtr.Name} has requested you to sign ${document.Name}`, + subject: `${document.ExtUserPtr.Name} has requested you to sign "${document.Name}"`, from: sender, html: "<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8' /> </head> <body> <div style='background-color: #f5f5f5; padding: 20px'> <div style='box-shadow: rgba(0, 0, 0, 0.1) 0px 4px 12px;background: white;padding-bottom: 20px;'> <div style='padding:10px 10px 0 10px'><img src='" + @@ -160,7 +165,8 @@ export default async function createBatchDocs(request) { createdAt: response.data[i]?.success?.createdAt, })); for (let i = 0; i < updateDocuments.length; i++) { - // console.log('updateDocuments ', updateDocuments); + console.log('updateDocuments ', updateDocuments); + sendMail(updateDocuments[i], sessionToken); } return 'success'; From facbc8e76ef2f285e875a96d23ae0542f46397d8 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <prafull.navkar@nxglabs.com> Date: Mon, 27 May 2024 12:59:43 +0530 Subject: [PATCH 048/106] Fix: issue of showing 'Please add Signers or Roles in template' even when roles are already exist in quick send --- apps/OpenSign/src/primitives/GetReportDisplay.js | 1 + apps/OpenSignServer/cloud/parsefunction/createBatchDocs.js | 1 + 2 files changed, 2 insertions(+) diff --git a/apps/OpenSign/src/primitives/GetReportDisplay.js b/apps/OpenSign/src/primitives/GetReportDisplay.js index 9e5b01a63..38b2e6492 100644 --- a/apps/OpenSign/src/primitives/GetReportDisplay.js +++ b/apps/OpenSign/src/primitives/GetReportDisplay.js @@ -648,6 +648,7 @@ const ReportTable = (props) => { const handleBulkSend = async (template) => { setIsBulkSend({ [template.objectId]: true }); setIsLoader({ [template.objectId]: true }); + setIsDocErr(false); try { const params = { templateId: template.objectId, diff --git a/apps/OpenSignServer/cloud/parsefunction/createBatchDocs.js b/apps/OpenSignServer/cloud/parsefunction/createBatchDocs.js index cb8524998..c58485c10 100644 --- a/apps/OpenSignServer/cloud/parsefunction/createBatchDocs.js +++ b/apps/OpenSignServer/cloud/parsefunction/createBatchDocs.js @@ -48,6 +48,7 @@ async function sendMail(document, sessionToken) { extUserId: document.ExtUserPtr.objectId, recipient: objectId ? signerMail[i].signerPtr.Email : signerMail[i].email, subject: `${document.ExtUserPtr.Name} has requested you to sign "${document.Name}"`, + mailProvider: document?.ExtUserPtr?.active_mail_adapter || '', from: sender, html: "<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8' /> </head> <body> <div style='background-color: #f5f5f5; padding: 20px'> <div style='box-shadow: rgba(0, 0, 0, 0.1) 0px 4px 12px;background: white;padding-bottom: 20px;'> <div style='padding:10px 10px 0 10px'><img src='" + From c199c3019eabfc2f6766f4d4cf151ff5574b91a6 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <prafull.navkar@nxglabs.com> Date: Mon, 27 May 2024 14:50:17 +0530 Subject: [PATCH 049/106] feat: add message for all signers linked in template for quick send --- apps/OpenSign/src/components/BulkSendUi.js | 104 ++++++++++-------- .../src/primitives/GetReportDisplay.js | 33 ++---- 2 files changed, 69 insertions(+), 68 deletions(-) diff --git a/apps/OpenSign/src/components/BulkSendUi.js b/apps/OpenSign/src/components/BulkSendUi.js index 3b84ac5ea..c5445ad66 100644 --- a/apps/OpenSign/src/components/BulkSendUi.js +++ b/apps/OpenSign/src/components/BulkSendUi.js @@ -164,54 +164,72 @@ const BulkSendUi = (props) => { ></div> </div> )} - <form onSubmit={handleSubmit}> - <div className=" min-h-max max-h-[250px] overflow-y-auto"> - {forms?.map((form, index) => ( - <div - key={form.Id} - className="p-3 rounded-xl border-[1px] border-gray-400 m-4 bg-white text-black grid grid-cols-1 md:grid-cols-2 gap-2 relative" - > - {form?.fields?.map((field, fieldIndex) => ( - <div className="flex flex-col " key={field.fieldId}> - <label>{field.label}</label> - <SuggestionInput - required - type="email" - value={field.value} - index={fieldIndex} - onChange={(signer) => - handleInputChange(index, signer, fieldIndex) - } - /> - </div> - ))} - {index > 0 && ( + {props.Placeholders?.length > 0 ? ( + <> + {props.Placeholders?.some((x) => !x.signerObjId) ? ( + <form onSubmit={handleSubmit}> + <div className=" min-h-max max-h-[250px] overflow-y-auto"> + {forms?.map((form, index) => ( + <div + key={form.Id} + className="p-3 rounded-xl border-[1px] border-gray-400 m-4 bg-white text-black grid grid-cols-1 md:grid-cols-2 gap-2 relative" + > + {form?.fields?.map((field, fieldIndex) => ( + <div className="flex flex-col " key={field.fieldId}> + <label>{field.label}</label> + <SuggestionInput + required + type="email" + value={field.value} + index={fieldIndex} + onChange={(signer) => + handleInputChange(index, signer, fieldIndex) + } + /> + </div> + ))} + {forms?.length > 1 && ( + <button + onClick={() => handleRemoveForm(index)} + className="absolute right-3 top-1 border border-gray-300 rounded-lg px-2 py-1" + > + <i className="fa-solid fa-trash"></i> + </button> + )} + <div ref={formRef}></div> + </div> + ))} + </div> + <div className="flex flex-col mx-4 mb-4 gap-3"> <button - onClick={() => handleRemoveForm(index)} - className="absolute right-3 top-1 border border-gray-300 rounded-lg px-2 py-1" + onClick={handleAddForm} + className="bg-[#32a3ac] p-2 text-white w-full rounded-full focus:outline-none" > - <i className="fa-solid fa-trash"></i> + <i className="fa-solid fa-plus"></i> <span>Add new</span> </button> - )} - <div ref={formRef}></div> + <button + type="submit" + className="bg-[#32a3ac] p-2 text-white w-full rounded-full focus:outline-none" + > + <i className="fa-solid fa-paper-plane"></i> <span>Send</span> + </button> + </div> + </form> + ) : ( + <div className="text-black p-3 bg-white w-full text-sm md:text-base flex justify-center items-center"> + All roles in this document are currently linked to contacts. To + 'quick send' copies of this template to multiple + signers, please ensure that at least one role is not linked to any + contact. </div> - ))} + )} + </> + ) : ( + <div className="text-black p-3 bg-white w-full text-sm md:text-base flex justify-center items-center"> + Please add at least one role to this template in order to 'quick + send' copies of it to multiple signers. </div> - <div className="flex flex-col mx-4 mb-4 gap-3"> - <button - onClick={handleAddForm} - className="bg-[#32a3ac] p-2 text-white w-full rounded-full focus:outline-none" - > - <i className="fa-solid fa-plus"></i> <span>Add new</span> - </button> - <button - type="submit" - className="bg-[#32a3ac] p-2 text-white w-full rounded-full focus:outline-none" - > - <i className="fa-solid fa-paper-plane"></i> <span>Send</span> - </button> - </div> - </form> + )} </> ); }; diff --git a/apps/OpenSign/src/primitives/GetReportDisplay.js b/apps/OpenSign/src/primitives/GetReportDisplay.js index 38b2e6492..52940e19c 100644 --- a/apps/OpenSign/src/primitives/GetReportDisplay.js +++ b/apps/OpenSign/src/primitives/GetReportDisplay.js @@ -25,7 +25,6 @@ const ReportTable = (props) => { const [currentPage, setCurrentPage] = useState(1); const [actLoader, setActLoader] = useState({}); const [isAlert, setIsAlert] = useState(false); - const [isDocErr, setIsDocErr] = useState(false); const [isContactform, setIsContactform] = useState(false); const [isDeleteModal, setIsDeleteModal] = useState({}); const [isRevoke, setIsRevoke] = useState({}); @@ -186,7 +185,6 @@ const ReportTable = (props) => { setActLoader({}); } } else { - setIsDocErr(true); setActLoader({}); } } else { @@ -648,7 +646,6 @@ const ReportTable = (props) => { const handleBulkSend = async (template) => { setIsBulkSend({ [template.objectId]: true }); setIsLoader({ [template.objectId]: true }); - setIsDocErr(false); try { const params = { templateId: template.objectId, @@ -666,18 +663,12 @@ const ReportTable = (props) => { } ); const templateRes = axiosRes.data && axiosRes.data.result; - if (templateRes?.Placeholders?.length > 0) { - setPlaceholders(templateRes?.Placeholders); - setTemplateDetails(templateRes); - setIsLoader({}); - } else { - setIsLoader(false); - setIsDocErr(true); - } + setPlaceholders(templateRes?.Placeholders); + setTemplateDetails(templateRes); + setIsLoader({}); } catch (err) { console.log("err in fetch template in bulk modal", err); setIsBulkSend({}); - setIsDocErr(false); setIsAlert(true); setAlertMsg({ type: "danger", @@ -940,19 +931,11 @@ const ReportTable = (props) => { ></div> </div> ) : ( - <> - {isDocErr ? ( - <div className="text-black bg-white w-full h-[80px] md:h-[100px] text-sm md:text-xl flex justify-center items-center"> - Please add Signers or Roles in template - </div> - ) : ( - <BulkSendUi - Placeholders={placeholders} - item={templateDeatils} - handleClose={handleQuickSendClose} - /> - )} - </> + <BulkSendUi + Placeholders={placeholders} + item={templateDeatils} + handleClose={handleQuickSendClose} + /> )} </ModalUi> )} From 5bd36f91d9fd39e77d99d38529b87a849fab2f02 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <prafull.navkar@nxglabs.com> Date: Mon, 27 May 2024 18:46:37 +0530 Subject: [PATCH 050/106] Fix: issue with multiple linking user in quick send --- apps/OpenSign/src/pages/GuestLogin.js | 2 +- apps/OpenSign/src/pages/PdfRequestFiles.js | 323 ++++++------ apps/OpenSignServer/cloud/main.js | 2 +- .../cloud/parsefunction/pdf/PDF.js | 473 ++++++++++++++++++ .../cloud/parsefunction/pdf/PDF.min.js | 337 ------------- 5 files changed, 628 insertions(+), 509 deletions(-) create mode 100644 apps/OpenSignServer/cloud/parsefunction/pdf/PDF.js delete mode 100644 apps/OpenSignServer/cloud/parsefunction/pdf/PDF.min.js diff --git a/apps/OpenSign/src/pages/GuestLogin.js b/apps/OpenSign/src/pages/GuestLogin.js index 6647e1ee5..aad55b42a 100644 --- a/apps/OpenSign/src/pages/GuestLogin.js +++ b/apps/OpenSign/src/pages/GuestLogin.js @@ -169,10 +169,10 @@ function GuestLogin() { e.preventDefault(); const params = { ...contact, docId: documentId }; try { + setLoading(true); const linkContactRes = await Parse.Cloud.run("linkcontacttodoc", params); // console.log("linkContactRes ", linkContactRes); setContactId(linkContactRes.contactId); - setLoading(true); setEnterOtp(true); await SendOtp(); } catch (err) { diff --git a/apps/OpenSign/src/pages/PdfRequestFiles.js b/apps/OpenSign/src/pages/PdfRequestFiles.js index a1387a5f2..0cc5fb9c2 100644 --- a/apps/OpenSign/src/pages/PdfRequestFiles.js +++ b/apps/OpenSign/src/pages/PdfRequestFiles.js @@ -274,6 +274,10 @@ function PdfRequestFiles() { }; setAlreadySign(true); setIsCompleted(data); + setIsCelebration(true); + setTimeout(() => { + setIsCelebration(false); + }, 5000); } else if (declined) { const currentDecline = { currnt: "another", @@ -286,6 +290,13 @@ function PdfRequestFiles() { ); setIsExpired(true); setExpiredDate(expireDateFormat); + } // Check if the current signer is not a last signer and handle the complete message. + else if (isNextUser) { + setIsCompleted({ + isModal: true, + message: + "You have successfully signed the document. You can download or print a copy of the partially signed document. A copy of the digitally signed document will be sent to the owner over email once it is signed by all signers." + }); } const isGuestSign = location.pathname.includes("/load/"); @@ -315,164 +326,157 @@ function PdfRequestFiles() { } } } - if (documentData.length > 0) { - const checkDocIdExist = - documentData[0].AuditTrail && - documentData[0].AuditTrail.length > 0 && - documentData[0].AuditTrail.filter( - (data) => data.Activity === "Signed" - ); + const checkDocIdExist = + documentData[0].AuditTrail && + documentData[0].AuditTrail.length > 0 && + documentData[0].AuditTrail.filter((data) => data.Activity === "Signed"); - const checkAlreadySign = - documentData[0].AuditTrail && - documentData[0].AuditTrail.length > 0 && - documentData[0].AuditTrail.filter( - (data) => - data.UserPtr.objectId === currUserId && data.Activity === "Signed" - ); + const checkAlreadySign = + documentData[0].AuditTrail && + documentData[0].AuditTrail.length > 0 && + documentData[0].AuditTrail.filter( + (data) => + data.UserPtr.objectId === currUserId && data.Activity === "Signed" + ); + if ( + checkAlreadySign && + checkAlreadySign[0] && + checkAlreadySign.length > 0 + ) { + setAlreadySign(true); + } else { + const obj = documentData?.[0]; + setSendInOrder(obj?.SendinOrder || false); if ( - checkAlreadySign && - checkAlreadySign[0] && - checkAlreadySign.length > 0 + obj && + obj.Signers && + obj.Signers.length > 0 && + obj.Placeholders && + obj.Placeholders.length > 0 ) { - setAlreadySign(true); - } else { - const obj = documentData?.[0]; - setSendInOrder(obj?.SendinOrder || false); - if ( - obj && - obj.Signers && - obj.Signers.length > 0 && - obj.Placeholders && - obj.Placeholders.length > 0 - ) { - const params = { - event: "viewed", - contactId: currUserId, - body: { - objectId: documentData?.[0].objectId, - file: documentData?.[0]?.SignedUrl || documentData?.[0]?.URL, - name: documentData?.[0].Name, - note: documentData?.[0].Note || "", - description: documentData?.[0].Description || "", - signers: documentData?.[0].Signers?.map((x) => ({ - name: x?.Name, - email: x?.Email, - phone: x?.Phone - })), - viewedBy: jsonSender.email, - viewedAt: new Date(), - createdAt: documentData?.[0].createdAt - } - }; + const params = { + event: "viewed", + contactId: currUserId, + body: { + objectId: documentData?.[0].objectId, + file: documentData?.[0]?.SignedUrl || documentData?.[0]?.URL, + name: documentData?.[0].Name, + note: documentData?.[0].Note || "", + description: documentData?.[0].Description || "", + signers: documentData?.[0].Signers?.map((x) => ({ + name: x?.Name, + email: x?.Email, + phone: x?.Phone + })), + viewedBy: jsonSender.email, + viewedAt: new Date(), + createdAt: documentData?.[0].createdAt + } + }; - try { - await axios.post( - `${localStorage.getItem("baseUrl")}functions/callwebhook`, - params, - { - headers: { - "Content-Type": "application/json", - "X-Parse-Application-Id": - localStorage.getItem("parseAppId"), - sessiontoken: localStorage.getItem("accesstoken") - } + try { + await axios.post( + `${localStorage.getItem("baseUrl")}functions/callwebhook`, + params, + { + headers: { + "Content-Type": "application/json", + "X-Parse-Application-Id": localStorage.getItem("parseAppId"), + sessiontoken: localStorage.getItem("accesstoken") } - ); - } catch (err) { - console.log("Err ", err); - } - } - } - - let signers = []; - let unSignedSigner = []; - - //check document is signed or not - if (checkDocIdExist && checkDocIdExist.length > 0) { - setIsDocId(true); - const signerRes = documentData[0].Signers; - //comparison auditTrail user details with signers user details - for (let i = 0; i < signerRes.length; i++) { - const signerId = signerRes[i].objectId; - - let isSignedSignature = false; - for (let j = 0; j < checkDocIdExist.length; j++) { - const signedExist = - checkDocIdExist[j] && checkDocIdExist[j].UserPtr.objectId; - //checking signerObjId and auditTrail User objId - // if match then add signed data in signer array and break loop - - if (signerId === signedExist) { - signers.push({ ...signerRes[i], ...signerRes[i] }); - isSignedSignature = true; - break; } - // if does not match then add unsigned data in unSignedSigner array - } - if (!isSignedSignature) { - unSignedSigner.push({ ...signerRes[i], ...signerRes[i] }); - } + ); + } catch (err) { + console.log("Err ", err); } - setSignedSigners(signers); - setUnSignedSigners(unSignedSigner); + } + } - setSignerPos(documentData[0].Placeholders); - } else { - let unsigned = []; - for (let i = 0; i < documentData.length; i++) { - unsigned.push(documentData[i].Signers); + let signers = []; + let unSignedSigner = []; + + //check document is signed or not + if (checkDocIdExist && checkDocIdExist.length > 0) { + setIsDocId(true); + const signerRes = documentData[0].Signers; + //comparison auditTrail user details with signers user details + for (let i = 0; i < signerRes.length; i++) { + const signerId = signerRes[i].objectId; + + let isSignedSignature = false; + for (let j = 0; j < checkDocIdExist.length; j++) { + const signedExist = + checkDocIdExist[j] && checkDocIdExist[j].UserPtr.objectId; + //checking signerObjId and auditTrail User objId + // if match then add signed data in signer array and break loop + + if (signerId === signedExist) { + signers.push({ ...signerRes[i], ...signerRes[i] }); + isSignedSignature = true; + break; + } + // if does not match then add unsigned data in unSignedSigner array } - setUnSignedSigners(unsigned[0]); - setSignerPos(documentData[0].Placeholders); - } - setPdfDetails(documentData); - // Check if the current signer is not a last signer and handle the complete message. - if (isNextUser) { - const getSignedAuditTrail = documentData[0].AuditTrail.filter( - (data) => data.Activity === "Signed" - ); - const isLastSigner = - getSignedAuditTrail?.length === documentData?.[0]?.Signers?.length; - if (!isLastSigner) { - setIsCompleted({ - isModal: true, - message: - "You have successfully signed the document. You can download or print a copy of the partially signed document. A copy of the digitally signed document will be sent to the owner over email once it is signed by all signers." - }); - } else { - setIsCelebration(true); - setTimeout(() => { - setIsCelebration(false); - }, 5000); + if (!isSignedSignature) { + unSignedSigner.push({ ...signerRes[i], ...signerRes[i] }); } } - //checking if condition current user already sign or owner does not exist as a signer or document has been declined by someone or document has been expired - //then stop to display tour message - if ( - (checkAlreadySign && - checkAlreadySign[0] && - checkAlreadySign.length > 0) || - !currUserId || - declined || - currDate > expireUpdateDate - ) { - setRequestSignTour(false); - } else { - //else condition to check current user exist in contracts_Users class and check tour message status - //if not then check user exist in contracts_Contactbook class and check tour message status - const localuser = localStorage.getItem( - `Parse/${appInfo.appId}/currentUser` - ); - const currentUser = JSON.parse(JSON.stringify(localuser)); - const currentUserEmail = currentUser.email; - const res = await contractUsers(currentUserEmail); + setSignedSigners(signers); + setUnSignedSigners(unSignedSigner); + setSignerPos(documentData[0].Placeholders); + } else { + let unsigned = []; + for (let i = 0; i < documentData.length; i++) { + unsigned.push(documentData[i].Signers); + } + setUnSignedSigners(unsigned[0]); + setSignerPos(documentData[0].Placeholders); + } + setPdfDetails(documentData); + //checking if condition current user already sign or owner does not exist as a signer or document has been declined by someone or document has been expired + //then stop to display tour message + if ( + (checkAlreadySign && + checkAlreadySign[0] && + checkAlreadySign.length > 0) || + !currUserId || + declined || + currDate > expireUpdateDate + ) { + setRequestSignTour(false); + } else { + //else condition to check current user exist in contracts_Users class and check tour message status + //if not then check user exist in contracts_Contactbook class and check tour message status + const localuser = localStorage.getItem( + `Parse/${appInfo.appId}/currentUser` + ); + const currentUser = JSON.parse(JSON.stringify(localuser)); + const currentUserEmail = currentUser.email; + const res = await contractUsers(currentUserEmail); + if (res === "Error: Something went wrong!") { + setHandleError("Error: Something went wrong!"); + } else if (res[0] && res?.length) { + setContractName("_Users"); + currUserId = res[0].objectId; + setSignerUserId(currUserId); + const tourstatus = res[0].TourStatus && res[0].TourStatus; + if (tourstatus && tourstatus.length > 0) { + setTourStatus(tourstatus); + const checkTourRequestSign = tourstatus.filter( + (data) => data.requestSign + ); + if (checkTourRequestSign && checkTourRequestSign.length > 0) { + setRequestSignTour(checkTourRequestSign[0].requestSign); + } + } + } else if (res?.length === 0) { + const res = await contactBook(currUserId); if (res === "Error: Something went wrong!") { setHandleError("Error: Something went wrong!"); - } else if (res[0] && res?.length) { - setContractName("_Users"); - currUserId = res[0].objectId; - setSignerUserId(currUserId); + } else if (res[0] && res.length) { + setContractName("_Contactbook"); + const objectId = res[0].objectId; + setSignerUserId(objectId); const tourstatus = res[0].TourStatus && res[0].TourStatus; if (tourstatus && tourstatus.length > 0) { setTourStatus(tourstatus); @@ -483,33 +487,12 @@ function PdfRequestFiles() { setRequestSignTour(checkTourRequestSign[0].requestSign); } } - } else if (res?.length === 0) { - const res = await contactBook(currUserId); - if (res === "Error: Something went wrong!") { - setHandleError("Error: Something went wrong!"); - } else if (res[0] && res.length) { - setContractName("_Contactbook"); - const objectId = res[0].objectId; - setSignerUserId(objectId); - const tourstatus = res[0].TourStatus && res[0].TourStatus; - if (tourstatus && tourstatus.length > 0) { - setTourStatus(tourstatus); - const checkTourRequestSign = tourstatus.filter( - (data) => data.requestSign - ); - if (checkTourRequestSign && checkTourRequestSign.length > 0) { - setRequestSignTour(checkTourRequestSign[0].requestSign); - } - } - } else if (res.length === 0) { - setHandleError("Error: User does not exist!"); - } + } else if (res.length === 0) { + setHandleError("Error: User does not exist!"); } } - setIsUiLoading(false); - } else { - alert("No data found!"); } + setIsUiLoading(false); } else if ( documentData === "Error: Something went wrong!" || (documentData.result && documentData.result.error) @@ -824,7 +807,7 @@ function PdfRequestFiles() { "https://qikinnovation.ams3.digitaloceanspaces.com/logo.png"; let url = `${localStorage.getItem( "baseUrl" - )}functions/sendmailv3/`; + )}functions/sendmailv3`; const headers = { "Content-Type": "application/json", "X-Parse-Application-Id": diff --git a/apps/OpenSignServer/cloud/main.js b/apps/OpenSignServer/cloud/main.js index 32a047a3f..0552d2930 100644 --- a/apps/OpenSignServer/cloud/main.js +++ b/apps/OpenSignServer/cloud/main.js @@ -1,4 +1,4 @@ -import PDF from './parsefunction/pdf/PDF.min.js'; +import PDF from './parsefunction/pdf/PDF.js'; import sendmailv3 from './parsefunction/sendMailv3.js'; import GoogleSign from './parsefunction/GoogleSign.js'; import ZohoDetails from './parsefunction/ZohoDetails.js'; diff --git a/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.js b/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.js new file mode 100644 index 000000000..86d5257e8 --- /dev/null +++ b/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.js @@ -0,0 +1,473 @@ +import fs from 'node:fs'; +import axios from 'axios'; +import { SignPdf } from '@signpdf/signpdf'; +import { P12Signer } from '@signpdf/signer-p12'; +import { pdflibAddPlaceholder } from '@signpdf/placeholder-pdf-lib'; +import { PDFDocument } from 'pdf-lib'; +import { replaceMailVaribles, saveFileUsage } from '../../../Utils.js'; +import GenerateCertificate from './GenerateCertificate.js'; +const serverUrl = process.env.SERVER_URL; +const APPID = process.env.APP_ID; +const masterKEY = process.env.MASTER_KEY; +const eSignName = 'opensign'; +const eSigncontact = 'hello@opensignlabs.com'; +// `updateDoc` is used to create url in from pdfFile +async function uploadFile(pdfName, filepath) { + try { + const filedata = fs.readFileSync(filepath); + const file = new Parse.File(pdfName, [...filedata], 'application/pdf'); + await file.save({ useMasterKey: true }); + const fileUrl = file.url(); + return { imageUrl: fileUrl }; + } catch (err) { + console.log('Err ', err); + // `fs.unlinkSync` is used to remove exported signed pdf file from exports folder + fs.unlinkSync(filepath); + } +} + +// `updateDoc` is used to update signedUrl, AuditTrail, Iscompleted in document +async function updateDoc(docId, url, userId, ipAddress, data, className, sign) { + try { + const UserPtr = { + __type: 'Pointer', + className: className, + objectId: userId, + }; + const obj = { + UserPtr: UserPtr, + SignedUrl: url, + Activity: 'Signed', + ipAddress: ipAddress, + SignedOn: new Date(), + Signature: sign, + }; + let updateAuditTrail; + if (data.AuditTrail && data.AuditTrail.length > 0) { + const AuditTrail = JSON.parse(JSON.stringify(data.AuditTrail)); + const existingIndex = AuditTrail.findIndex( + entry => entry.UserPtr.objectId === userId && entry.Activity !== 'Created' + ); + existingIndex !== -1 + ? (AuditTrail[existingIndex] = { ...AuditTrail[existingIndex], ...obj }) + : AuditTrail.push(obj); + + updateAuditTrail = AuditTrail; + } else { + updateAuditTrail = [obj]; + } + + const auditTrail = updateAuditTrail.filter(x => x.Activity === 'Signed'); + let isCompleted = false; + if (data.Signers && data.Signers.length > 0) { + if (auditTrail.length === data.Placeholders.length) { + isCompleted = true; + } + } else { + isCompleted = true; + } + const body = { + SignedUrl: url, + AuditTrail: updateAuditTrail, + IsCompleted: isCompleted, + }; + const signedRes = await axios.put(serverUrl + '/classes/contracts_Document/' + docId, body, { + headers: { + 'Content-Type': 'application/json', + 'X-Parse-Application-Id': APPID, + 'X-Parse-Master-Key': masterKEY, + }, + }); + return { isCompleted: isCompleted, message: 'success', AuditTrail: updateAuditTrail }; + } catch (err) { + console.log('update doc err ', err); + return 'err'; + } +} + +// `sendCompletedMail` is used to send copy of completed document mail +async function sendCompletedMail(obj) { + const url = obj.url; + const doc = obj.doc; + const sender = obj.doc.ExtUserPtr; + const pdfName = doc.Name; + const mailLogo = 'https://qikinnovation.ams3.digitaloceanspaces.com/logo.png'; + const recipient = sender.Email; + let subject = `Document "${pdfName}" has been signed by all parties`; + let body = + "<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8' /></head><body> <div style='background-color:#f5f5f5;padding:20px'> <div style='box-shadow: rgba(0, 0, 0, 0.1) 0px 4px 12px;background-color:white;'> <div><img src=" + + mailLogo + + " height='50' style='padding:20px'/> </div><div style='padding:2px;font-family:system-ui; background-color: #47a3ad;'> <p style='font-size:20px;font-weight:400;color:white;padding-left:20px',> Document signed successfully</p></div><div><p style='padding:20px;font-family:system-ui;font-size:14px'>All parties have successfully signed the document " + + `<b>"${pdfName}"</b>` + + '. Kindly download the document from the attachment.</p></div> </div><div><p>This is an automated email from OpenSign™. For any queries regarding this email, please contact the sender ' + + sender.Email + + ' directly. If you think this email is inappropriate or spam, you may file a complaint with OpenSign™ <a href=www.opensignlabs.com target=_blank>here</a>.</p></div></div></body></html>'; + + if (obj?.isCustomMail) { + try { + const tenantCreditsQuery = new Parse.Query('partners_Tenant'); + tenantCreditsQuery.equalTo('UserId', { + __type: 'Pointer', + className: '_User', + objectId: sender.UserId.objectId, + }); + const res = await tenantCreditsQuery.first(); + if (res) { + const _res = JSON.parse(JSON.stringify(res)); + if (_res?.CompletionSubject) { + subject = _res?.CompletionSubject; + } + if (_res?.CompletionBody) { + body = _res?.CompletionBody; + } + const expireDate = doc.ExpiryDate.iso; + const newDate = new Date(expireDate); + const localExpireDate = newDate.toLocaleDateString('en-US', { + day: 'numeric', + month: 'long', + year: 'numeric', + }); + + const variables = { + document_title: pdfName, + sender_name: sender.Name, + sender_mail: sender.Email, + sender_phone: sender.Phone, + receiver_name: sender.Name, + receiver_email: sender.Email, + receiver_phone: sender.Phone, + expiry_date: localExpireDate, + company_name: sender.Company, + }; + const replaceVar = replaceMailVaribles(subject, body, variables); + subject = replaceVar.subject; + body = replaceVar.body; + } + } catch (err) { + console.log('error in fetch tenant in signpdf', err.message); + } + } + const params = { + extUserId: sender.objectId, + url: url, + from: 'OpenSign™', + recipient: recipient, + subject: subject, + pdfName: pdfName, + html: body, + mailProvider: obj.mailProvider, + }; + const res = await axios.post(serverUrl + '/functions/sendmailv3', params, { + headers: { + 'Content-Type': 'application/json', + 'X-Parse-Application-Id': APPID, + 'X-Parse-Master-Key': masterKEY, + }, + }); + // console.log('Res ', res); +} + +// `sendDoctoWebhook` is used to send res data of document on webhook +async function sendDoctoWebhook(doc, Url, event, signUser, certificateUrl) { + let signers = []; + if (signUser) { + signers = { + name: signUser?.Name, + email: signUser?.Email, + phone: signUser?.Phone, + }; + } else { + signers = doc?.Signers?.map(x => ({ + name: x.Name, + email: x.Email, + phone: x.Phone, + })) || [ + { + name: doc?.ExtUserPtr?.Name, + email: doc?.ExtUserPtr?.Email, + phone: doc?.ExtUserPtr?.Phone, + }, + ]; + } + + if (doc.ExtUserPtr?.Webhook) { + const time = + event === 'signed' + ? { signer: signers, signedAt: new Date() } + : { signers: signers, completedAt: new Date() }; + const certificate = certificateUrl ? { certificate: certificateUrl } : {}; + const params = { + event: event, + objectId: doc?.objectId, + file: Url || '', + ...certificate, + name: doc?.Name, + note: doc?.Note || '', + description: doc?.Description || '', + ...time, + createdAt: doc?.createdAt, + }; + axios + .post(doc?.ExtUserPtr?.Webhook, params, { + headers: { 'Content-Type': 'application/json' }, + }) + .then(res => { + try { + // console.log('res ', res); + const webhook = new Parse.Object('contracts_Webhook'); + webhook.set('Log', res?.status); + webhook.set('UserId', { + __type: 'Pointer', + className: '_User', + objectId: doc.ExtUserPtr.UserId.objectId, + }); + webhook.save(null, { useMasterKey: true }); + } catch (err) { + console.log('err save in contracts_Webhook', err.message); + } + }) + .catch(err => { + console.log('Err send data to webhook', err.message); + try { + const webhook = new Parse.Object('contracts_Webhook'); + webhook.set('Log', err?.status); + webhook.set('UserId', { + __type: 'Pointer', + className: '_User', + objectId: doc.ExtUserPtr.UserId.objectId, + }); + webhook.save(null, { useMasterKey: true }); + } catch (err) { + console.log('err save in contracts_Webhook', err.message); + } + }); + // console.log('res ', res.data); + } +} + +// `sendMailsaveCertifcate` is used send completion mail and update complete status of document +const sendMailsaveCertifcate = async (doc, P12Buffer, url, isCustomMail, mailProvider, userId) => { + const certificate = await GenerateCertificate(doc); + const certificatePdf = await PDFDocument.load(certificate); + const p12 = new P12Signer(P12Buffer, { passphrase: process.env.PASS_PHRASE || null }); + // `pdflibAddPlaceholder` is used to add code of only digitial sign in certificate + pdflibAddPlaceholder({ + pdfDoc: certificatePdf, + reason: 'Digitally signed by OpenSign.', + location: 'n/a', + name: eSignName, + contactInfo: eSigncontact, + signatureLength: 15000, + }); + const pdfWithPlaceholderBytes = await certificatePdf.save(); + const CertificateBuffer = Buffer.from(pdfWithPlaceholderBytes); + //`new signPDF` create new instance of CertificateBuffer and p12Buffer + const certificateOBJ = new SignPdf(); + // `signedCertificate` is used to sign certificate digitally + const signedCertificate = await certificateOBJ.sign(CertificateBuffer, p12); + + //below is used to save signed certificate in exports folder + fs.writeFileSync('./exports/certificate.pdf', signedCertificate); + const file = await uploadFile('certificate.pdf', './exports/certificate.pdf'); + const body = { CertificateUrl: file.imageUrl }; + await axios.put(serverUrl + '/classes/contracts_Document/' + doc.objectId, body, { + headers: { + 'Content-Type': 'application/json', + 'X-Parse-Application-Id': APPID, + 'X-Parse-Master-Key': masterKEY, + }, + }); + // used in API only + if (doc.IsSendMail && doc.IsSendMail === false) { + console.log("don't send mail"); + } else { + const mailObj = { + url: url, + isCustomMail: isCustomMail, + doc: doc, + mailProvider: mailProvider, + }; + sendCompletedMail(mailObj); + } + + saveFileUsage(CertificateBuffer.length, file.imageUrl, userId); + sendDoctoWebhook(doc, url, 'completed', '', file.imageUrl); +}; +/** + * + * @param docId Id of Document in which user is signing + * @param pdfFile base64 of pdfFile which you want sign + * @returns if success {status, data} else {status, message} + */ +async function PDF(req) { + try { + if (!req?.user) { + throw new Parse.Error(Parse.Error.INVALID_SESSION_TOKEN, 'User is not authenticated.'); + } else { + const password = ''; + const authUser = req?.user?.toJSON(); + const docId = req.params.docId; + const reqUserId = req.params.userId; + const isCustomMail = req.params.isCustomCompletionMail || false; + const mailProvider = req.params.mailProvider || ''; + const sign = req.params.signature || ''; + // below bode is used to get info of docId + const docQuery = new Parse.Query('contracts_Document'); + docQuery.include('ExtUserPtr,Signers'); + docQuery.equalTo('objectId', docId); + const resDoc = await docQuery.first({ useMasterKey: true }); + if (!resDoc) { + throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Document not found.'); + } + const _resDoc = resDoc?.toJSON(); + + let signUser; + let className; + // `reqUserId` is send throught pdfrequest signing flow + if (reqUserId) { + // to get contracts_Contactbook details for currentuser from reqUserId + const _contractUser = _resDoc.Signers.find(x => x.objectId === reqUserId); + if (_contractUser) { + signUser = _contractUser; + className = 'contracts_Contactbook'; + } + } else { + className = 'contracts_Users'; + signUser = _resDoc.ExtUserPtr; + } + + const username = signUser.Name; + const userEmail = signUser.Email; + if (req.params.pdfFile) { + // `PdfBuffer` used to create buffer from pdf file + let PdfBuffer = Buffer.from(req.params.pdfFile, 'base64'); + // `P12Buffer` used to create buffer from p12 certificate + const pfxFile = process.env.PFX_BASE64; + // const P12Buffer = fs.readFileSync(); + const P12Buffer = Buffer.from(pfxFile, 'base64'); + const p12Cert = new P12Signer(P12Buffer, { passphrase: process.env.PASS_PHRASE || null }); + + const UserPtr = { + __type: 'Pointer', + className: className, + objectId: signUser.objectId, + }; + const obj = { + UserPtr: UserPtr, + SignedUrl: '', + Activity: 'Signed', + ipAddress: req.headers['x-real-ip'], + }; + let updateAuditTrail; + if (_resDoc.AuditTrail && _resDoc.AuditTrail.length > 0) { + updateAuditTrail = [..._resDoc.AuditTrail, obj]; + } else { + updateAuditTrail = [obj]; + } + + const auditTrail = updateAuditTrail.filter(x => x.Activity === 'Signed'); + let isCompleted = false; + if (_resDoc.Signers && _resDoc.Signers.length > 0) { + if (auditTrail.length === _resDoc.Signers.length) { + isCompleted = true; + } + } else { + isCompleted = true; + } + const randomNumber = Math.floor(Math.random() * 5000); + const name = `exported_file_${randomNumber}.pdf`; + const pdfName = `./exports/${name}`; + let pdfSize = PdfBuffer.length; + if (isCompleted) { + const signersName = _resDoc.Signers?.map(x => x.Name + ' <' + x.Email + '>'); + if (signersName && signersName.length > 0) { + // `pdflibAddPlaceholder` is used to add code of only digitial sign without widget + const pdfDoc = await PDFDocument.load(PdfBuffer); + pdflibAddPlaceholder({ + pdfDoc: pdfDoc, + reason: 'Digitally signed by OpenSign for ' + signersName?.join(', '), + location: 'n/a', + name: eSignName, + contactInfo: eSigncontact, + signatureLength: 15000, + }); + const pdfWithPlaceholderBytes = await pdfDoc.save(); + PdfBuffer = Buffer.from(pdfWithPlaceholderBytes); + } else { + // `pdflibAddPlaceholder` is used to add code of only digitial sign without widget (signyourself) + const pdfDoc = await PDFDocument.load(PdfBuffer); + pdflibAddPlaceholder({ + pdfDoc: pdfDoc, + reason: 'Digitally signed by OpenSign for ' + username + ' <' + userEmail + '>', + location: 'n/a', + name: eSignName, + contactInfo: eSigncontact, + signatureLength: 15000, + }); + const pdfWithPlaceholderBytes = await pdfDoc.save(); + PdfBuffer = Buffer.from(pdfWithPlaceholderBytes); + } + //`new signPDF` create new instance of pdfBuffer and p12Buffer + const OBJ = new SignPdf(); + // `signedDocs` is used to signpdf digitally + const signedDocs = await OBJ.sign(PdfBuffer, p12Cert); + + //`saveUrl` is used to save signed pdf in exports folder + const saveUrl = fs.writeFileSync(pdfName, signedDocs); + pdfSize = signedDocs.length; + } else { + //`saveUrl` is used to save signed pdf in exports folder + const saveUrl = fs.writeFileSync(pdfName, PdfBuffer); + pdfSize = PdfBuffer.length; + } + + // `uploadFile` is used to upload pdf to aws s3 and get it's url + const data = await uploadFile(name, pdfName); + + if (data && data.imageUrl) { + // `axios` is used to update signed pdf url in contracts_Document classes for given DocId + const updatedDoc = await updateDoc( + req.params.docId, //docId + data.imageUrl, // url + signUser.objectId, // userID + req.headers['x-real-ip'], // client ipAddress, + _resDoc, // auditTrail, signers, etc data + className, + sign + ); + sendDoctoWebhook(_resDoc, data.imageUrl, 'signed', signUser); + saveFileUsage(pdfSize, data.imageUrl, authUser.objectId); + if (updatedDoc && updatedDoc.isCompleted) { + const doc = { ..._resDoc, AuditTrail: updatedDoc.AuditTrail }; + sendMailsaveCertifcate( + doc, + P12Buffer, + data.imageUrl, + isCustomMail, + mailProvider, + authUser.objectId + ); + } + // `fs.unlinkSync` is used to remove exported signed pdf file from exports folder + fs.unlinkSync(pdfName); + console.log(`New Signed PDF created called: ${pdfName}`); + if (updatedDoc.message === 'success') { + return { status: 'success', data: data.imageUrl }; + } else { + const error = new Error('Please provide required parameters!'); + error.code = 400; // Set the error code (e.g., 400 for bad request) + throw error; + } + } + } else { + const error = new Error('Pdf file not present!'); + error.code = 400; // Set the error code (e.g., 400 for bad request) + throw error; + } + } + } catch (err) { + console.log('Err in signpdf', err); + throw err; + } +} +export default PDF; diff --git a/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.min.js b/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.min.js deleted file mode 100644 index d29c624c9..000000000 --- a/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.min.js +++ /dev/null @@ -1,337 +0,0 @@ -import fs from 'node:fs'; -import axios from 'axios'; -import { SignPdf } from '@signpdf/signpdf'; -import { P12Signer } from '@signpdf/signer-p12'; -import { pdflibAddPlaceholder } from '@signpdf/placeholder-pdf-lib'; -import { PDFDocument } from 'pdf-lib'; -import { replaceMailVaribles, saveFileUsage } from '../../../Utils.js'; -import GenerateCertificate from './GenerateCertificate.js'; -const serverUrl = process.env.SERVER_URL, - APPID = process.env.APP_ID, - masterKEY = process.env.MASTER_KEY, - eSignName = 'opensign', - eSigncontact = 'hello@opensignlabs.com'; -async function uploadFile(e, t) { - try { - var a = fs.readFileSync(t), - r = new Parse.File(e, [...a], 'application/pdf'), - i = (await r.save({ useMasterKey: !0 }), r.url()); - return { imageUrl: i }; - } catch (e) { - console.log('Err ', e), fs.unlinkSync(t); - } -} -async function updateDoc(a, r, i, n, s, o, l) { - try { - var c, - d, - p = { - UserPtr: { __type: 'Pointer', className: o, objectId: i }, - SignedUrl: r, - Activity: 'Signed', - ipAddress: n, - SignedOn: new Date(), - Signature: l, - }; - let e; - var m = (e = - s.AuditTrail && 0 < s.AuditTrail.length - ? (-1 !== - (d = (c = JSON.parse(JSON.stringify(s.AuditTrail))).findIndex( - e => e.UserPtr.objectId === i && 'Created' !== e.Activity - )) - ? (c[d] = { ...c[d], ...p }) - : c.push(p), - c) - : [p]).filter(e => 'Signed' === e.Activity); - let t = !1; - !((s.Signers && 0 < s.Signers.length && m.length !== s.Signers.length) || !(t = !0)); - var g = { SignedUrl: r, AuditTrail: e, IsCompleted: t }; - await axios.put(serverUrl + '/classes/contracts_Document/' + a, g, { - headers: { - 'Content-Type': 'application/json', - 'X-Parse-Application-Id': APPID, - 'X-Parse-Master-Key': masterKEY, - }, - }); - return { isCompleted: t, message: 'success', AuditTrail: e }; - } catch (e) { - return console.log('update doc err ', e), 'err'; - } -} -async function sendCompletedMail(e) { - var t = e.url, - a = e.doc, - r = e.doc.ExtUserPtr, - i = a.Name, - n = r.Email; - let s = `Document "${i}" has been signed by all parties`, - o = - "<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8' /></head><body> <div style='background-color:#f5f5f5;padding:20px'> <div style='box-shadow: rgba(0, 0, 0, 0.1) 0px 4px 12px;background-color:white;'> <div><img src=https://qikinnovation.ams3.digitaloceanspaces.com/logo.png height='50' style='padding:20px'/> </div><div style='padding:2px;font-family:system-ui; background-color: #47a3ad;'> <p style='font-size:20px;font-weight:400;color:white;padding-left:20px',> Document signed successfully</p></div><div><p style='padding:20px;font-family:system-ui;font-size:14px'>All parties have successfully signed the document " + - `<b>"${i}"</b>` + - '. Kindly download the document from the attachment.</p></div> </div><div><p>This is an automated email from OpenSign™. For any queries regarding this email, please contact the sender ' + - r.Email + - ' directly. If you think this email is inappropriate or spam, you may file a complaint with OpenSign™ <a href=www.opensignlabs.com target=_blank>here</a>.</p></div></div></body></html>'; - if (e?.isCustomMail) - try { - var l, - c, - d, - p, - m, - g = new Parse.Query('partners_Tenant'); - g.equalTo('UserId', { __type: 'Pointer', className: '_User', objectId: r.UserId.objectId }); - const f = await g.first(); - f && - ((l = JSON.parse(JSON.stringify(f)))?.CompletionSubject && (s = l?.CompletionSubject), - l?.CompletionBody && (o = l?.CompletionBody), - (c = a.ExpiryDate.iso), - (d = new Date(c).toLocaleDateString('en-US', { - day: 'numeric', - month: 'long', - year: 'numeric', - })), - (p = { - document_title: i, - sender_name: r.Name, - sender_mail: r.Email, - sender_phone: r.Phone, - receiver_name: r.Name, - receiver_email: r.Email, - receiver_phone: r.Phone, - expiry_date: d, - company_name: r.Company, - }), - (m = replaceMailVaribles(s, o, p)), - (s = m.subject), - (o = m.body)); - } catch (e) { - console.log('error in fetch tenant in signpdf', e.message); - } - g = { - extUserId: r.objectId, - url: t, - from: 'OpenSign™', - recipient: n, - subject: s, - pdfName: i, - html: o, - mailProvider: e.mailProvider, - }; - await axios.post(serverUrl + '/functions/sendmailv3', g, { - headers: { - 'Content-Type': 'application/json', - 'X-Parse-Application-Id': APPID, - 'X-Parse-Master-Key': masterKEY, - }, - }); -} -async function sendDoctoWebhook(a, e, t, r, i) { - let n = []; - (n = r - ? { name: r?.Name, email: r?.Email, phone: r?.Phone } - : a?.Signers?.map(e => ({ name: e.Name, email: e.Email, phone: e.Phone })) || [ - { name: a?.ExtUserPtr?.Name, email: a?.ExtUserPtr?.Email, phone: a?.ExtUserPtr?.Phone }, - ]), - a.ExtUserPtr?.Webhook && - ((r = - 'signed' === t - ? { signer: n, signedAt: new Date() } - : { signers: n, completedAt: new Date() }), - (t = { - event: t, - objectId: a?.objectId, - file: e || '', - ...(i ? { certificate: i } : {}), - name: a?.Name, - note: a?.Note || '', - description: a?.Description || '', - ...r, - createdAt: a?.createdAt, - }), - axios - .post(a?.ExtUserPtr?.Webhook, t, { headers: { 'Content-Type': 'application/json' } }) - .then(e => { - try { - var t = new Parse.Object('contracts_Webhook'); - t.set('Log', e?.status), - t.set('UserId', { - __type: 'Pointer', - className: '_User', - objectId: a.ExtUserPtr.UserId.objectId, - }), - t.save(null, { useMasterKey: !0 }); - } catch (e) { - console.log('err save in contracts_Webhook', e.message); - } - }) - .catch(e => { - console.log('Err send data to webhook', e.message); - try { - var t = new Parse.Object('contracts_Webhook'); - t.set('Log', e?.status), - t.set('UserId', { - __type: 'Pointer', - className: '_User', - objectId: a.ExtUserPtr.UserId.objectId, - }), - t.save(null, { useMasterKey: !0 }); - } catch (e) { - console.log('err save in contracts_Webhook', e.message); - } - })); -} -const sendMailsaveCertifcate = async (e, t, a, r, i, n) => { - var s = await GenerateCertificate(e), - s = await PDFDocument.load(s), - t = new P12Signer(t, { passphrase: process.env.PASS_PHRASE || null }), - s = - (pdflibAddPlaceholder({ - pdfDoc: s, - reason: 'Digitally signed by OpenSign.', - location: 'n/a', - name: eSignName, - contactInfo: eSigncontact, - signatureLength: 15e3, - }), - await s.save()), - s = Buffer.from(s), - t = await new SignPdf().sign(s, t), - t = - (fs.writeFileSync('./exports/certificate.pdf', t), - await uploadFile('certificate.pdf', './exports/certificate.pdf')), - o = { CertificateUrl: t.imageUrl }; - await axios.put(serverUrl + '/classes/contracts_Document/' + e.objectId, o, { - headers: { - 'Content-Type': 'application/json', - 'X-Parse-Application-Id': APPID, - 'X-Parse-Master-Key': masterKEY, - }, - }), - e.IsSendMail && !1 === e.IsSendMail - ? console.log("don't send mail") - : sendCompletedMail({ url: a, isCustomMail: r, doc: e, mailProvider: i }), - saveFileUsage(s.length, t.imageUrl, n), - sendDoctoWebhook(e, a, 'completed', '', t.imageUrl); -}; -async function PDF(s) { - try { - if (!s?.user) - throw new Parse.Error(Parse.Error.INVALID_SESSION_TOKEN, 'User is not authenticated.'); - { - var o = s?.user?.toJSON(), - e = s.params.docId; - const C = s.params.userId; - var l = s.params.isCustomCompletionMail || !1, - c = s.params.mailProvider || '', - d = s.params.signature || '', - t = new Parse.Query('contracts_Document'), - a = - (t.include('ExtUserPtr,Signers'), - t.equalTo('objectId', e), - await t.first({ useMasterKey: !0 })); - if (!a) throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Document not found.'); - var r, - p = a?.toJSON(); - let i, n; - C - ? ((r = p.Signers.find(e => e.objectId === C)), - console.log('_contractUser ', r), - r && ((i = r), (n = 'contracts_Contactbook'))) - : ((n = 'contracts_Users'), (i = p.ExtUserPtr)); - var m, - g = i.Name, - f = i.Email; - if (!s.params.pdfFile) throw (((m = new Error('Pdf file not present!')).code = 400), m); - { - let e = Buffer.from(s.params.pdfFile, 'base64'); - var u = process.env.PFX_BASE64, - h = Buffer.from(u, 'base64'), - y = new P12Signer(h, { passphrase: process.env.PASS_PHRASE || null }), - P = { - UserPtr: { __type: 'Pointer', className: n, objectId: i.objectId }, - SignedUrl: '', - Activity: 'Signed', - ipAddress: s.headers['x-real-ip'], - }; - let t; - var v = (t = p.AuditTrail && 0 < p.AuditTrail.length ? [...p.AuditTrail, P] : [P]).filter( - e => 'Signed' === e.Activity - ); - let a = !1; - !((p.Signers && 0 < p.Signers.length && v.length !== p.Signers.length) || !(a = !0)); - var S, - b, - w, - U, - I, - _, - E = `exported_file_${Math.floor(5e3 * Math.random())}.pdf`, - D = './exports/' + E; - let r = e.length; - r = ( - a - ? ((S = p.Signers?.map(e => e.Name + ' <' + e.Email + '>')), - (e = - S && 0 < S.length - ? ((b = await PDFDocument.load(e)), - pdflibAddPlaceholder({ - pdfDoc: b, - reason: 'Digitally signed by OpenSign for ' + S?.join(', '), - location: 'n/a', - name: eSignName, - contactInfo: eSigncontact, - signatureLength: 15e3, - }), - (w = await b.save()), - Buffer.from(w)) - : ((U = await PDFDocument.load(e)), - pdflibAddPlaceholder({ - pdfDoc: U, - reason: 'Digitally signed by OpenSign for ' + g + ' <' + f + '>', - location: 'n/a', - name: eSignName, - contactInfo: eSigncontact, - signatureLength: 15e3, - }), - (I = await U.save()), - Buffer.from(I))), - (_ = await new SignPdf().sign(e, y)), - fs.writeFileSync(D, _), - _) - : (fs.writeFileSync(D, e), e) - ).length; - var A = await uploadFile(E, D); - if (A && A.imageUrl) { - var x, - j, - N = await updateDoc( - s.params.docId, - A.imageUrl, - i.objectId, - s.headers['x-real-ip'], - p, - n, - d - ); - if ( - (sendDoctoWebhook(p, A.imageUrl, 'signed', i), - saveFileUsage(r, A.imageUrl, o.objectId), - N && - N.isCompleted && - ((x = { ...p, AuditTrail: N.AuditTrail }), - sendMailsaveCertifcate(x, h, A.imageUrl, l, c, o.objectId)), - fs.unlinkSync(D), - console.log('New Signed PDF created called: ' + D), - 'success' === N.message) - ) - return { status: 'success', data: A.imageUrl }; - throw (((j = new Error('Please provide required parameters!')).code = 400), j); - } - } - } - } catch (e) { - throw (console.log('Err in signpdf', e), e); - } -} -export default PDF; From f6ba4db62de7c347c1136cab214fc13ecc77c3c6 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <prafull.navkar@nxglabs.com> Date: Mon, 27 May 2024 20:06:06 +0530 Subject: [PATCH 051/106] Fix: Role, type are not visible on placeholder for non-exist contact --- apps/OpenSign/src/components/pdf/RenderPdf.js | 40 +++++++++---------- .../cloud/parsefunction/reportsJson.js | 4 +- 2 files changed, 21 insertions(+), 23 deletions(-) diff --git a/apps/OpenSign/src/components/pdf/RenderPdf.js b/apps/OpenSign/src/components/pdf/RenderPdf.js index 5118dfcc1..716c404e2 100644 --- a/apps/OpenSign/src/components/pdf/RenderPdf.js +++ b/apps/OpenSign/src/components/pdf/RenderPdf.js @@ -211,27 +211,25 @@ function RenderPdf({ setCurrentSigner(true); } const handleAllUserName = (Id, Role, type) => { - return pdfDetails[0].Signers.map((signerData, key) => { - return ( - signerData.objectId === data.signerObjId && ( - <React.Fragment key={key}> - {signerData?.Name && ( - <div style={{ color: "black", fontSize: 8, fontWeight: "500" }}> - {signerData.Name} - </div> - )} - {type && ( - <div style={{ fontWeight: "700", fontSize: 11 }}>{type}</div> - )} - {Role && ( - <div style={{ color: "black", fontSize: 8, fontWeight: "500" }}> - {`(${Role})`} - </div> - )} - </React.Fragment> - ) - ); - }); + return ( + <React.Fragment> + <div style={{ color: "black", fontSize: 8, fontWeight: "500" }}> + { + pdfDetails[0].Signers?.find( + (signer) => signer.objectId === data.signerObjId + )?.Name + } + </div> + {type && ( + <div style={{ fontWeight: "700", fontSize: 11 }}>{type}</div> + )} + {Role && ( + <div style={{ color: "black", fontSize: 8, fontWeight: "500" }}> + {`(${Role})`} + </div> + )} + </React.Fragment> + ); }; return ( diff --git a/apps/OpenSignServer/cloud/parsefunction/reportsJson.js b/apps/OpenSignServer/cloud/parsefunction/reportsJson.js index b94d2e82d..d3761e5ae 100644 --- a/apps/OpenSignServer/cloud/parsefunction/reportsJson.js +++ b/apps/OpenSignServer/cloud/parsefunction/reportsJson.js @@ -75,7 +75,7 @@ export default function reportJson(id, userId) { reportName: 'In-progress documents', params: { Type: { $ne: 'Folder' }, - Signers: { $exists: true, $ne: [] }, + SignedUrl: { $ne: null }, Placeholders: { $ne: null }, IsCompleted: { $ne: true }, IsDeclined: { $ne: true }, @@ -195,7 +195,7 @@ export default function reportJson(id, userId) { reportName: 'Recently sent for signatures', params: { Type: { $ne: 'Folder' }, - Signers: { $exists: true, $ne: [] }, + SignedUrl: { $ne: null }, Placeholders: { $ne: null }, IsCompleted: { $ne: true }, IsDeclined: { $ne: true }, From 07933b56b1b8ba06f05636bfc4f0d3b241fb2d42 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <prafull.navkar@nxglabs.com> Date: Mon, 27 May 2024 20:53:38 +0530 Subject: [PATCH 052/106] Fix: issue of 'something went wrong' err in guest login flow when using quick send --- .../src/primitives/GetReportDisplay.js | 18 +++++++++++------- .../cloud/parsefunction/createBatchDocs.js | 2 -- .../cloud/parsefunction/reportsJson.js | 2 ++ 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/apps/OpenSign/src/primitives/GetReportDisplay.js b/apps/OpenSign/src/primitives/GetReportDisplay.js index 52940e19c..88cb44c97 100644 --- a/apps/OpenSign/src/primitives/GetReportDisplay.js +++ b/apps/OpenSign/src/primitives/GetReportDisplay.js @@ -308,14 +308,18 @@ const ReportTable = (props) => { const sendMail = item?.SendMail || false; const getUrl = (x) => { //encode this url value `${item.objectId}/${x.Email}/${x.objectId}` to base64 using `btoa` function - const encodeBase64 = btoa( - `${item.objectId}/${x.Email}/${x.objectId}/${sendMail}` - ); - return `${host}/login/${encodeBase64}`; + if (x.objectId) { + const encodeBase64 = btoa( + `${item.objectId}/${x.signerPtr.Email}/${x.signerPtr.objectId}/${sendMail}` + ); + return `${host}/login/${encodeBase64}`; + } else { + const encodeBase64 = btoa(`${item.objectId}/${x.email}`); + return `${host}/login/${encodeBase64}`; + } }; - - const urls = item.Signers.map((x) => ({ - email: x.Email, + const urls = item?.Placeholders?.map((x) => ({ + email: x.email ? x.email : x.signerPtr.Email, url: getUrl(x) })); setShareUrls(urls); diff --git a/apps/OpenSignServer/cloud/parsefunction/createBatchDocs.js b/apps/OpenSignServer/cloud/parsefunction/createBatchDocs.js index c58485c10..2f4aed714 100644 --- a/apps/OpenSignServer/cloud/parsefunction/createBatchDocs.js +++ b/apps/OpenSignServer/cloud/parsefunction/createBatchDocs.js @@ -166,8 +166,6 @@ export default async function createBatchDocs(request) { createdAt: response.data[i]?.success?.createdAt, })); for (let i = 0; i < updateDocuments.length; i++) { - console.log('updateDocuments ', updateDocuments); - sendMail(updateDocuments[i], sessionToken); } return 'success'; diff --git a/apps/OpenSignServer/cloud/parsefunction/reportsJson.js b/apps/OpenSignServer/cloud/parsefunction/reportsJson.js index d3761e5ae..229d0b64c 100644 --- a/apps/OpenSignServer/cloud/parsefunction/reportsJson.js +++ b/apps/OpenSignServer/cloud/parsefunction/reportsJson.js @@ -102,6 +102,7 @@ export default function reportJson(id, userId) { 'AuditTrail.UserPtr', 'ExpiryDate', 'SendMail', + 'Placeholders', ], }; // completed documents report @@ -220,6 +221,7 @@ export default function reportJson(id, userId) { 'AuditTrail', 'AuditTrail.UserPtr', 'ExpiryDate', + 'Placeholders', ], }; // Recent signature requests report show on dashboard From 1764d7f9ba76280b623263e3bc5b10063a4a6c46 Mon Sep 17 00:00:00 2001 From: RaktimaNXG <raktima.c@nxglabs.com> Date: Mon, 27 May 2024 21:08:05 +0530 Subject: [PATCH 053/106] feat: create public profile URLs for users and develop functionality to make the report template public --- apps/OpenSign/src/json/ReportJson.js | 8 + apps/OpenSign/src/pages/UserProfile.js | 123 +++++++++---- .../src/primitives/GetReportDisplay.js | 163 ++++++++++++++++++ apps/OpenSignServer/cloud/main.js | 4 + .../parsefunction/CreatePublicTemplate.js | 40 +++++ .../cloud/parsefunction/GetPublicUserName.js | 14 ++ ...4216-update_contracts_template_cls_cjs.cjs | 33 ++++ apps/OpenSignServer/test.pdf | Bin 164324 -> 174961 bytes 8 files changed, 349 insertions(+), 36 deletions(-) create mode 100644 apps/OpenSignServer/cloud/parsefunction/CreatePublicTemplate.js create mode 100644 apps/OpenSignServer/cloud/parsefunction/GetPublicUserName.js create mode 100644 apps/OpenSignServer/databases/migrations/20240527194216-update_contracts_template_cls_cjs.cjs diff --git a/apps/OpenSign/src/json/ReportJson.js b/apps/OpenSign/src/json/ReportJson.js index f16efca1c..fe21c8d55 100644 --- a/apps/OpenSign/src/json/ReportJson.js +++ b/apps/OpenSign/src/json/ReportJson.js @@ -368,6 +368,14 @@ export default function reportJson(id) { redirectUrl: "", action: "bulksend" }, + { + btnId: "1835", + btnLabel: "Make public", + hoverLabel: "Make public", + btnIcon: "fa-solid fa-users-line", + redirectUrl: "", + action: "public" + }, { btnId: "1834", btnLabel: "Delete", diff --git a/apps/OpenSign/src/pages/UserProfile.js b/apps/OpenSign/src/pages/UserProfile.js index 813d8ab52..a3211f357 100644 --- a/apps/OpenSign/src/pages/UserProfile.js +++ b/apps/OpenSign/src/pages/UserProfile.js @@ -27,6 +27,9 @@ function UserProfile() { const [percentage, setpercentage] = useState(0); const [isDisableDocId, setIsDisableDocId] = useState(false); const [isSubscribe, setIsSubscribe] = useState(false); + const [publicUserName, setPublicUserName] = useState( + (extendUser && extendUser?.[0]?.UserName) || "" + ); const [company, setCompany] = useState( extendUser && extendUser?.[0]?.Company ); @@ -37,6 +40,7 @@ function UserProfile() { const [otp, setOtp] = useState(""); const [otpLoader, setOtpLoader] = useState(false); const [isEmailVerified, setIsEmailVerified] = useState(false); + const [userNameError, setUserNameError] = useState(""); useEffect(() => { getUserDetail(); }, []); @@ -74,46 +78,68 @@ function UserProfile() { } } }; + + const handleCheckPublicUserName = async () => { + try { + const res = await Parse.Cloud.run("getPublicUserName", { + userName: publicUserName + }); + if (res) { + setIsLoader(false); + setUserNameError("user name already exist"); + setTimeout(() => { + setUserNameError(""); + }, 3000); + return res; + } + } catch (e) { + console.log("extend error"); + } + }; const handleSubmit = async (e) => { e.preventDefault(); setIsLoader(true); let phn = Phone; - try { - const tour = Parse.Object.extend("_User"); - const query = new Parse.Query(tour); + const res = await handleCheckPublicUserName(); + if (!res) { + try { + const tour = Parse.Object.extend("_User"); + const query = new Parse.Query(tour); - await query.get(UserProfile.objectId).then((object) => { - object.set("name", name); - object.set("ProfilePic", Image); - object.set("phone", phn); + await query.get(UserProfile.objectId).then((object) => { + object.set("name", name); + object.set("ProfilePic", Image); + object.set("phone", phn); - object.save().then( - async (response) => { - if (response) { - let res = response.toJSON(); - let rr = JSON.stringify(res); - localStorage.setItem("UserInformation", rr); - SetName(res.name); - SetPhone(res.phone); - setImage(res.ProfilePic); - localStorage.setItem("username", res.name); - localStorage.setItem("profileImg", res.ProfilePic); - await updateExtUser({ Name: res.name, Phone: res.phone }); - alert("Profile updated successfully."); - setEditMode(false); - navigate("/dashboard/35KBoSgoAK"); + object.save().then( + async (response) => { + if (response) { + let res = response.toJSON(); + let rr = JSON.stringify(res); + localStorage.setItem("UserInformation", rr); + SetName(res.name); + SetPhone(res.phone); + setImage(res.ProfilePic); + localStorage.setItem("username", res.name); + localStorage.setItem("profileImg", res.ProfilePic); + await updateExtUser({ Name: res.name, Phone: res.phone }); + alert("Profile updated successfully."); + setEditMode(false); + setIsLoader(false); + // navigate("/dashboard/35KBoSgoAK"); + } + }, + (error) => { + alert("Something went wrong."); + console.error("Error while updating tour", error); + setIsLoader(false); } - }, - (error) => { - alert("Something went wrong."); - console.error("Error while updating tour", error); - setIsLoader(false); - } - ); - }); - } catch (error) { - console.log("err", error); + ); + }); + } catch (error) { + console.log("err", error); + } } }; @@ -128,7 +154,8 @@ function UserProfile() { Name: obj.Name, HeaderDocId: isDisableDocId, JobTitle: jobTitle, - Company: company + Company: company, + UserName: publicUserName }; await axios.put( parseBaseUrl + "classes/" + extClass + "/" + ExtUserId, @@ -147,9 +174,7 @@ function UserProfile() { const json = JSON.parse(JSON.stringify([res])); const extRes = JSON.stringify(json); - localStorage.setItem("Extand_Class", extRes); - // console.log("updateRes ", updateRes); }; // file upload function const fileUpload = async (file) => { @@ -241,6 +266,9 @@ function UserProfile() { setOtpLoader(false); alert("OTP sent on you email"); }; + const handlePublicUrl = (e) => { + setPublicUserName(e.target.value); + }; return ( <React.Fragment> <Title title={"Profile"} /> @@ -262,7 +290,15 @@ function UserProfile() { ></div> </div> ) : ( - <div className="flex justify-center items-center w-full"> + <div className="flex justify-center items-center w-full relative"> + {/* <Alert type={alertMsg.type}>{alertMsg.message}</Alert> */} + {userNameError && ( + <div + className={`z-[1000] fixed top-20 transform border-[1px] text-sm border-[#f0a8a8] bg-[#f4bebe] text-[#c42121] rounded py-[.75rem] px-[1.25rem]`} + > + {userNameError} + </div> + )} <div className="bg-white flex flex-col justify-center shadow rounded w-[450px]"> <div className="flex flex-col justify-center items-center my-4"> <div className="w-[200px] h-[200px] overflow-hidden rounded-full"> @@ -390,6 +426,21 @@ function UserProfile() { )} </span> </li> + <li className="flex justify-between items-center border-t-[1px] border-gray-300 py-2 break-all"> + <span className="font-semibold">Public profile:</span> + <div className="flex items-center"> + <span>opensign.me/</span> + + <input + onChange={handlePublicUrl} + value={publicUserName} + disabled={!editmode} + placeholder="enter user name" + className="border-[1px] border-gray-200 rounded-[3px]" + /> + </div> + </li> + <li className="border-y-[1px] border-gray-300 break-all"> <div className="flex justify-between items-center py-2"> <span diff --git a/apps/OpenSign/src/primitives/GetReportDisplay.js b/apps/OpenSign/src/primitives/GetReportDisplay.js index 9e5b01a63..4ca135e24 100644 --- a/apps/OpenSign/src/primitives/GetReportDisplay.js +++ b/apps/OpenSign/src/primitives/GetReportDisplay.js @@ -12,6 +12,7 @@ import Tour from "reactour"; import Parse from "parse"; import { saveAs } from "file-saver"; import { replaceMailVaribles } from "../constant/Utils"; +import Confetti from "react-confetti"; import EditorToolbar, { module1, formats @@ -37,6 +38,7 @@ const ReportTable = (props) => { const [isTour, setIsTour] = useState(false); const [tourStatusArr, setTourStatusArr] = useState([]); const [isResendMail, setIsResendMail] = useState({}); + const [isMakePublic, setIsMakePublic] = useState({}); const [mail, setMail] = useState({ subject: "", body: "" }); const [userDetails, setUserDetails] = useState({}); const [isNextStep, setIsNextStep] = useState({}); @@ -44,6 +46,9 @@ const ReportTable = (props) => { const [templateDeatils, setTemplateDetails] = useState({}); const [placeholders, setPlaceholders] = useState([]); const [isLoader, setIsLoader] = useState({}); + const [role, setRole] = useState([]); + const [selectedPublicRole, setSelectedPublicRole] = useState(""); + const [isCelebration, setIsCelebration] = useState(false); const startIndex = (currentPage - 1) * props.docPerPage; const { isMoreDocs, setIsNextRecord } = props; @@ -231,6 +236,17 @@ const ReportTable = (props) => { setIsResendMail({ [item.objectId]: true }); } else if (act.action === "bulksend") { handleBulkSend(item); + } else if (act.action === "public") { + const getRole = []; + const getPlaceholder = item.Placeholders; + getPlaceholder.map((data) => { + getRole.push(data.Role); + }); + if (getRole.length === 1) { + setSelectedPublicRole(getRole[0]); + } + setRole(getRole); + setIsMakePublic({ [item.objectId]: true }); } }; // Get current list @@ -302,6 +318,7 @@ const ReportTable = (props) => { const handleClose = () => { setIsRevoke({}); setIsDeleteModal({}); + setIsMakePublic({}); }; const handleShare = (item) => { @@ -685,6 +702,70 @@ const ReportTable = (props) => { setTimeout(() => setIsAlert(false), 1500); } }; + + //function to make template public and set public role + const handlePublicTemplate = async (item) => { + if (selectedPublicRole) { + setActLoader({ [item.objectId]: true }); + setIsMakePublic(false); + let params = { + templateId: item.objectId + }; + let url = `${localStorage.getItem( + "baseUrl" + )}functions/createPublicTemplate/`; + const headers = { + "Content-Type": "application/json", + "X-Parse-Application-Id": localStorage.getItem("parseAppId"), + sessionToken: localStorage.getItem("accesstoken") + }; + try { + const res = await axios.post(url, params, { headers: headers }); + if (res.data.result.status === "success") { + const data = { + PublicRole: [selectedPublicRole] + }; + const res = await axios.put( + `${localStorage.getItem("baseUrl")}classes/contracts_Template/${ + item.objectId + }`, + data, + { + headers: { + "Content-Type": "application/json", + "X-Parse-Application-Id": localStorage.getItem("parseAppId"), + "X-Parse-Session-Token": localStorage.getItem("accesstoken") + } + } + ); + if (res) { + setIsAlert(true); + setAlertMsg({ + type: "success", + message: "You have successfully made the template public." + }); + setTimeout(() => setIsAlert(false), 1500); + setIsCelebration(true); + setTimeout(() => { + setIsCelebration(false); + }, 5000); + setSelectedPublicRole(""); + setActLoader({}); + } + } + } catch (e) { + console.log("save public template error", e); + } + } else { + setIsAlert(true); + setAlertMsg({ + type: "danger", + message: "You need to select a role for the public signers." + }); + setTimeout(() => setIsAlert(false), 1500); + } + }; + return ( <div className="relative"> {Object.keys(actLoader)?.length > 0 && ( @@ -696,6 +777,11 @@ const ReportTable = (props) => { </div> )} <div className="p-2 overflow-x-scroll w-full bg-white rounded-md"> + {isCelebration && ( + <div style={{ position: "relative", zIndex: "1000" }}> + <Confetti width={window.innerWidth} height={window.innerHeight} /> + </div> + )} {isAlert && <Alert type={alertMsg.type}>{alertMsg.message}</Alert>} {props.tourData && props.ReportName === "Templates" && ( <Tour @@ -1134,6 +1220,83 @@ const ReportTable = (props) => { </div> </ModalUi> )} + {isMakePublic[item.objectId] && ( + <ModalUi + isOpen + title={"Make template public"} + handleClose={() => { + setIsMakePublic({}); + }} + > + <div className="m-[20px]"> + <div className="font-normal text-black"> + <p className="text-lg"> + {" "} + Are you sure you want to make this template + public? + </p> + <div className="flex mt-2 gap-2 md:items-center"> + <p className="text-[15px]">Public role : </p> + {role.length > 1 ? ( + <select + className="w-[60%] md:w-[70%] border-[1px] border-gray-200 rounded-sm p-[2px]" + name="textvalidate" + value={selectedPublicRole} + onChange={(e) => + setSelectedPublicRole(e.target.value) + } + > + <option + disabled + style={{ fontSize: "13px" }} + value="" + > + Select... + </option> + {role.map((data, ind) => { + return ( + <option + style={{ fontSize: "13px" }} + key={ind} + value={data} + > + {data} + </option> + ); + })} + </select> + ) : ( + <div className="w-[60%] md:w-[70%] border-[1px] border-gray-200 rounded-sm p-[2px]"> + {role} + </div> + )} + </div> + </div> + + <hr className="bg-[#ccc] mt-2 " /> + <div className="flex items-center mt-3 gap-2 text-white"> + <button + onClick={() => handlePublicTemplate(item)} + className="px-4 py-1.5 text-white rounded shadow-md text-center focus:outline-none " + style={{ + backgroundColor: modalSubmitBtnColor + }} + > + Submit + </button> + <button + onClick={handleClose} + className="px-4 py-1.5 text-black border-[1px] border-[#ccc] shadow-md rounded focus:outline-none" + style={{ + backgroundColor: modalCancelBtnColor + }} + > + No + </button> + </div> + </div> + </ModalUi> + )} </td> </tr> ) diff --git a/apps/OpenSignServer/cloud/main.js b/apps/OpenSignServer/cloud/main.js index 32a047a3f..e2d0c6189 100644 --- a/apps/OpenSignServer/cloud/main.js +++ b/apps/OpenSignServer/cloud/main.js @@ -39,6 +39,8 @@ import encryptedpdf from './parsefunction/encryptedPdf.js'; import { getSignedUrl } from './parsefunction/getSignedUrl.js'; import createBatchDocs from './parsefunction/createBatchDocs.js'; import linkContactToDoc from './parsefunction/linkContactToDoc.js'; +import CreatePublicTemplate from './parsefunction/CreatePublicTemplate.js'; +import GetPublicUserName from './parsefunction/getPublicUserName.js'; // This afterSave function triggers after an object is added or updated in the specified class, allowing for post-processing logic. Parse.Cloud.afterSave('contracts_Document', DocumentAftersave); @@ -88,3 +90,5 @@ Parse.Cloud.define('encryptedpdf', encryptedpdf); Parse.Cloud.define('getsignedurl', getSignedUrl); Parse.Cloud.define('batchdocuments', createBatchDocs); Parse.Cloud.define('linkcontacttodoc', linkContactToDoc); +Parse.Cloud.define('createPublicTemplate', CreatePublicTemplate); +Parse.Cloud.define('getPublicUserName', GetPublicUserName); diff --git a/apps/OpenSignServer/cloud/parsefunction/CreatePublicTemplate.js b/apps/OpenSignServer/cloud/parsefunction/CreatePublicTemplate.js new file mode 100644 index 000000000..e43d4450a --- /dev/null +++ b/apps/OpenSignServer/cloud/parsefunction/CreatePublicTemplate.js @@ -0,0 +1,40 @@ +import axios from 'axios'; +export default async function CreatePublicTemplate(request) { + const templateId = request.params.templateId; + const serverUrl = process.env.SERVER_URL; + const appId = process.env.APP_ID; + + try { + const userRes = await axios.get(serverUrl + '/users/me', { + headers: { + 'X-Parse-Application-Id': appId, + 'X-Parse-Session-Token': request.headers['sessiontoken'], + }, + }); + const userId = userRes.data && userRes.data.objectId; + if (userId) { + const Query = new Parse.Query('contracts_Template'); + Query.equalTo('CreatedBy', { + __type: 'Pointer', + className: '_User', + objectId: userId, + }); + const updateACL = await Query.get(templateId, { useMasterKey: true }); + const newACL = new Parse.ACL(); + newACL.setPublicReadAccess(true); + newACL.setPublicWriteAccess(true); + updateACL.setACL(newACL); + updateACL.save(null, { useMasterKey: true }); + return { + status: 'success', + }; + } + } catch (err) { + console.log('err', err); + if (err.code == 209) { + return { error: 'Invalid session token' }; + } else { + return { error: "You don't have access of this document!" }; + } + } +} diff --git a/apps/OpenSignServer/cloud/parsefunction/GetPublicUserName.js b/apps/OpenSignServer/cloud/parsefunction/GetPublicUserName.js new file mode 100644 index 000000000..6ee4eadd9 --- /dev/null +++ b/apps/OpenSignServer/cloud/parsefunction/GetPublicUserName.js @@ -0,0 +1,14 @@ +async function GetPublicUserName(request) { + try { + const userName = request.params.userName; + const userQuery = new Parse.Query('contracts_Users'); + userQuery.equalTo('UserName', userName); + const res = await userQuery.first({ useMasterKey: true }); + console.log('res', res); + return res; + } catch (err) { + console.log('Err ', err); + return err; + } +} +export default GetPublicUserName; diff --git a/apps/OpenSignServer/databases/migrations/20240527194216-update_contracts_template_cls_cjs.cjs b/apps/OpenSignServer/databases/migrations/20240527194216-update_contracts_template_cls_cjs.cjs new file mode 100644 index 000000000..b0221be6a --- /dev/null +++ b/apps/OpenSignServer/databases/migrations/20240527194216-update_contracts_template_cls_cjs.cjs @@ -0,0 +1,33 @@ +/** + * + * @param {Parse} Parse + */ +exports.up = async Parse => { + // TODO: set className here + const className = 'contracts_Template'; + const schema = new Parse.Schema(className); + schema.addArray('PublicRole'); + + // TODO: Set the schema here + // Example: + // schema.addString('name').addNumber('cash'); + + return schema.update(); +}; + +/** + * + * @param {Parse} Parse + */ +exports.down = async Parse => { + // TODO: set className here + const className = 'contracts_Template'; + const schema = new Parse.Schema(className); + schema.deleteField('PublicRole'); + + // TODO: Set the schema here + // Example: + // schema.deleteField('name').deleteField('cash'); + + return schema.update(); +}; diff --git a/apps/OpenSignServer/test.pdf b/apps/OpenSignServer/test.pdf index 5facc82df518e5b4dbb4ddbc6f7787e9b0dbb1e3..dfe01c08824add491d69f9c7715a522a4dfde782 100644 GIT binary patch delta 24286 zcmbrlWmFwc^exyxfZz};1Wm92!7cbj65QQFf=htlP9s5syGw9)4;I`ZxRc=SZm*Ny zTQl=t^Wm*Eb3efCTU}MBs!mm(v-j>bU)19%RIjga)$p&d;n?DBDB-!{RVd+!;W^p= zUMR-D#D=E_-}0ae3ZmNC+ZuhcM0HM44PBH%P(=TFc#79R&^XlB#~e6Xsg3soXBaJ} zk}>$3O7_U|q7Oa_Zj?3B2KqeG1l_~V?UUWj<5RYWALJJddFUu75^uilKYcUvA(LWA znSda+LiXr2AFVQRwN}!6L?4wtUs354bJ(|R$wij!ZfUU+|MK&w*hQmU`5D0sfws{V zjA4*8r>N5~1&72Be=>)XZlfzUdi<DWadqIshn#scd)h~Y-FP$bg?j0*R*~PQN6yO+ zaIED#-0^VaaJcZCTz^OR8f0hx9|PkI5k~z9Lw|S4^KQzAcZf=eokApsk!j&+gO>#U zJHlXR&v`%ohYb&B<~hWi*kkaJq2zLPmCw^^bG)(<HTXFychIWHcM@dtx3U~n44QA# zs>j-K(VLA_-ri_Y7wE$rMY)AawK5xG4H+jQ1||-0tBq}@`>c2l@X&UA!_E*W<6pk| z-v++@XJC9i6+ABZ6NZg=dmmha=ulO6dw?kxNY(!H{R}yF(09|!z-4QtUY4Q3Z;ry1 zwhy;0zg&d`TUIw61sPSvf}I&x-oIta?zYMBH~OBaE!lsZ9g3m3vL%rDDyvMj3mrkp z(f+j07(Y%6-}+OSip-d%Y*Ll1!+=emh61^LHu;O3msqGq@d)H_IPhF7|9i^V{^yi^ z`+rPX(lC_}DR$;By8ri-E&Vl+?cvZP=iJlXy=P?KU5kKQF@|b5^o!1Gx*qQraY4q8 zmU1NWb6YF$qBSA#;*84K!Emz}_jmQ?-WyCo4ho`HoSD<lqN1DR9RFE}!TSq~0_Ek4 ze=`Qh6+QBrAsUAc4`1EP(B71Si-!f3S;EN7#MGXGjhic)lI~^vG$lM9$iu<%KUaN! z5iLb_{if~s3;pGQFiPLkmvvT5LEUr>)Ofo2I=no;1EnNIf_Y!ZljsJC@JLC}^X4l@ zN^=;AF-5z{hW33_0bL#s$CvhNE|ZKB5}PlpOg1j>f23azrp?Bij1=FOnl$g~j#!`r z|32V<|NejdrBH8t^kjFfcEkn%n08;(MhJWMWMK{|Dgcb0b`w9uv`wp(PGCL-fGw0^ z)Li-LFeK<JS8LjuSx&-VfVGV<JAhAAK`aNLnz3V!(a(`MyBN^yoL^1dkmc%`jW z_?)cQWWfP|YiZMPAF5Q$=)YzPl&B5sDd;5mpxPPP*2@vaAG^`_y`U;lVWgs!KHZ@; z2=D+PMdtaIilLm5`W+t)bmOO9Y$vsdhzwE?7c!E?D437oIiK2pMdLJ1YF~Cs=2)S= zF!-Drt9+zls|}zwUU*)2;nA<jq33Hs1AS1*^x<PjU>E;a>m}20D*l37nWGF;BzmOu zv}Gzk^1qAAgM;EWE&zzY!XVp=#Q$+y>Zkz#6g%DFm%XT9cj!1K8UTnb?#+^EwsTIK z1|R~!cdJSI@ZyyeyXp?8U&T7>baAzh^HU{rk#K<57O&0EtRI<{RmNuG&_sSO{Uj=h zpwrOq1vmEzD$d`XQT*lQg9weC*WthV(`D&BL|<RMlW}cyG=#ctO!Js>`}uokaxN15 z+n`q6aEe2mxEjkRpa06atS|E5Hd6_s@a?z1lM(?yU}LgX6i0?sY(#N}tHXXdG{}kB zCvCZKH5N_sul5#;{@qk687=esXRfKDliJb6{C~#2V1e0sRSmP{NckBeQoc9+XR<{X zs&a8cHXOza@T(zWiPnDuvADJcUySC-OQ<RQsQ=H9U%&3~!;?8a9g6`^t2zRP;uvXO zw!7cg%r=bQ9r-%KV7Ys>I|Fb`je%Xba1?oRDJ<!p=47tD)mE1Dswb~;)vNPK`~<Et z61j#*`147bB7{5qb763^YP!TnZQhWDAnf21R%M#!oQ`XO6ZLg;&BjoU)!^w!@?p!k zCxRENcz6=~$eDG@{(QjaB6XciQWBuEb{XVmQ16$r+e}ZdF>I^q>Pc>}8;YcyJ4C(K zrl_i+E3&{v1e`0c+t&JWKQt@vZS795a+>!ZEY;qe%PuzNDr742XWN^NXZjL>JW=Mh zqc{>a%nhB*Hl^Bme>+IyJ76*DPqDAF!m5Exb3X~X-se6H0Izd2>qi$H)Q#o;SS&Ur z&sJsKE=3$VZ2$S}T`GI#M_BEP;5GB*C}R+-Samns?TDc?;`ni5qF7)*O~Cl-OX6~@ zq}6C?Y9co?+aYT2N}P6zC0M4I6(L(;BEP=^z~);#Y-QW~9A~-YosZu|M@5aR^Vo{{ zBbK(@WHTG`t=->t9D91nV30hI+C{Sdit)k}85wYmdvmM~4$bV1>|5RJmQkKGUM?8) z$6q>+mFg04z&Zs^L#q0WinWeTN9K;<U=xgbOv(@Zr{1};Lv|zYKz=VQ!J{(eRdZ^o zUR5mE8vnh0FO7PpNbium;8++I@ZEHh-fqc-tZ7v#N2bndV>LXBurHGG*`QH;17(5M z<Qom_W)`;i7^-vPI&1Fj?UUwEmsz&Hf@jYLEy@x}`KWv=^&ao7`|PY5`+l4R%NSSP zrXDN~jb`S8;C0aw=#n>RZZQgTgw;-#FmN;1!!T8(<Kwh=2|t+j$Fds@B-Oud@V(cY zaXe@^VMwOYbt}pK!o5I2+sWt1vD%$@ygKy#o$=6%D#sE@xv2-@buMzx=atR64ywIF zbjsDM2wwR!^<x|s8<AKO#dNCvcn<qJn0>jZj)Wwnj!x+bplPlgXSk5n%>^g-@@Lnx zh|cXKi#6Aa@9$*iYoGnnb?Td*w~7uTaICXBG`3#ysB^FBYa;?x431<w%Jud!7r74< zvn7nj-*imwq0LfQ67y>qf1OkD{xzPcQOC4arrzq=JG9hX0~zvk9@;ebhh%QJZh<!^ z1C`nnMo#_Uh1VRu_L{M8UQVARs#~We){ezQ1m)SvEZ$}cWmn2R(-PVCJbydc-bk7y znVXD1{KjD9OP?I+_1`TOJ_2rQw+20f>Uw?bw=Gt4R2^vZwSA>7haWU)|7@nOKOkfE zrwZNllJFWj9&!oYQ(-OC474KG30<E^H~3mIs3o9)xY^mhWf<g428b=+v5A-~MyOOx zC#9DBhHz~KH943yTLss!R4WZ7B1_+g{+&*V%BIYn$;GCS-O}hqoxPcg4uj6N1MCjd zQ{#dTg{E3Mof(%P0>(iEtOVM$2#@2s<^EEhI*qFL`koIi*9;iXKWf!-sDB_jnPN+O zX+92iqZ8>bxhu29-R-r(U6S`$;kR?swW3gzp{7~wTU>m!`z^9x{^Q3(;~IUbsn8uu zp1ei$cX6^v5B(LMvWD&uQsROEh6&4=6?y!FR=web^f&U5{c7cv;Atpv4P{uP9_aAM zsa1#BAn7LxxX7CqHr!uCv>cRyv6|*RVW63~qiwqTpBDWJd2*iC2n;hbHq{Jc+0BAI zxbsS*>tmLqqO!Gxo|SesmOqIvCkm;-lpx$w#pb8e=0T+uK7G-Dm$sbu3yg^c{b0+g zUikgCfnKX8k3jg*oW;w-#TJ`VPPCbp#la-%cSTw?QABt|>|ehzMGcUA@Z=c@19Pr) zJR96F{VlzdW!^rCh~JyTS6UQcl0yo%!<nuL#%JhXYgVp2yonSy<nO%9r;)XtZBnan zDkBomD$VTG7~BjIqE}zA3nzJ7rj<i#T7S(%jAGTU%55<*3hmyXYb)&$g>NnrOgoVF z6Dmzd(uy$%sc8CtTON6TD0LgC06*@k(OKTNA>>NoEB|orU2c`YNldW0T(pgAH`a6U z@<=YVEcUpKNWQRp0yHdUioV1TZnW<!S=VMy6YtePahd08*kEE2uJ|C(kaW1E82aTj zB?hknsM6-PJMKCF#ja13T(*yUhO#9$ZVzh^hDzy_7Y+w%D1M%-&%K0)fy3E3e%Vhh zW@s<98h&MM{QlGRuxzzpn&#Sn?Q*)Yk?N$<F*MHgIpW-JzS>3|=_0hzX@_bO-*(Xt zT{^CQc_7im-`%}CY!VX(ux%rwMAp+a3O})JayjLfvunLf8zeazN~&Lh=c)P|ZJ4&$ ztOX9vld!*M+DB))U$fu>EstcCby@`pb+(T8>&Q-D`!I*p93ld?1>|7N>N+gIaWi!e z&ab20mu-^KVA`Xbe0okkwUAWrAui7N;Zmpo%Z&X=a@s5?RbxIZly9y|*ZtNm_xcao zK1}}4w4SUt{K0;qGVP{Y@&y26;?(~-o{T|~Pbz!$=EL4Wopm!f>3)&usL}he1E~P< zQ?z%8D#z|*^t)8G;s~)<xg4e|nCI3YT0?_Fkz*hb;eboadp`pO8e?BYm7-$CE8L=Q z&WAKj{Ol*#jZKjQWJvjFirz1|mGwN8KmMb{r$6;35tkTE=N#RVLAks2SzOsrN&)FB zz)<lhn{OV!sLT$G5f$}M_|Ux89P`F(XCe~is9il0S^llq-tCnEQCFeXB&BHmgX?|e ze22fwlZ&ma;meB-M4+M92Qk;y2*h%{T&zUWvx-SFPxDZd!-!$n1euSIAK(!$Fpw^1 z@EPa>g7;=?q@^sI`caT_yF4#b<y1xlHgUp3*^lm3)wjVXNWg4F+JU{^MFQ`X++13i zY_g%>pOqYM4~84WnKO#|9?ZjM!GVIwWFf?am2dsZYAk4T60-KbG4ogYEH$rBsIC}? zr0fA+gR@K=<?KTalbYcqk?-!4IPGqhEJ|6eTP-j4(HiFaV-LK2vZ+$Na2%!M8}lx% zZG9gfxLrZknSDkBHHDHSnPhZ4rkP4=*JA*70R=ZH%tz;1`}3Q*@NBo2$q)CkW8dXy z`R((sR}c>Qnks#e$wRD)1Akb~8+sNOowe6YCk-WM9q-V}B~*<#njj*gNy+-R4F%z5 z;h+F(Vp;Epf1lo*&yA&|k@CrG4$GNnm!=SLN`VB9gJMV9zJ;nh<^xr~#&aC?kIeko zj0_R?Ws_e${3=yeX)&(yX|qqQwWK6N0M<I$N3L!e+&WXWWzzQS8!(9bV=eM1udpjs zi=GAqK0lh$erZ(7pc*ysoN}kM37R95bWUI7+txB&zDhU%CikT9X2yVM-l?nJpeLKx z3OtJGrIwbvtSB8v#uC8mgW*Wi$VBWa`QrY(zok6a@+RS{Ki{E7Q1+&7U?(4g2N)k8 z>c(wkld?&N3I<axcBan7i3w??&y0gCaGoSnQ9NE9i)$XRA1&AMZ7F8GIuSW+J&eSk zD56ENjHQ1_CL-K@0ytb`@O?QtNq;mI2cru@iDjc{<jCi1EF9Ae*CZ-^?yRm)B5wMI zlKfgLy*+-0XtvLqB(L`5cy$wjYAk?PLZw5|xY7A;9;s|D5{9ja<=Cs+Z>vvC5RZ>P zVc;}~i}=Lw(Cf?)aXdYg@x`T;iF`#C)E>vk7S7Ei*V4Kc^`+$%ur`V%^fpyB9%O=+ zWFc2}Sfm;XfQnC2o__EOFQ!O$I~|JH|GkmialO|5t{Q%*MPDkIJpdWd@8n+YO=64O zLhmS&B?cq9g8SNaG2;!s$kO-jq&!&@xL9fSa5ITEomHw_FRx!G2rq6^f5*=9u}1%$ z^9MA*R)1G5@5(#?lT~Zh`o`V_>~{7=;vs#-0?H`A(G$%67B<8kwpDfgDUog1zv83t z^EA6H1*i?<+NlsCwjCqu4fi4>FOr)FH<O&{Tv=KD?~X8{&kI|7Ek!Dk4AdP;91n9A zqBooEz8yy?z3hUI3o7|5pUI|m<HxgYhDo57xZ^2!cnDJ(5F*I;<~PBRKK0ViEjLnp z847L}5`KwooH&&46C8Gbo(^7oWU05S?XmHac5Q6B8Lc#$1-V8zqk;)ITOXNPn^!R# zT*lu04kiUEDa!}FEi2T<uUc-iSF~4tbjQ&BcA4uGbJ<u)YY+=MLdT($cm0Es$5dg7 zfRxY?P<6^5fazk0SUU?&Oy5km-f>4qcMuB#DW$L))%iH4$uOE;zQcr#p?mLGX6B-i zfb|$}k7v_oB6_#$@htp2C*`5UqQl%ZrjbLN1sY=pr>CJpcW2QBddr|HJRr7wwk_9+ z$G5J$hso=F_1)1j5rv3A)L(+yP(6TzoVjQlE-xmIMi~x4TMlfnHJ&VdBh)vk?q-Mx zolK7<*0VHmdrz=EET(x8wf!;1!#3otTNwuiZoc!L4wgHFR~fq$YfM)c=wQZ0Jxhy+ z39=f?NZ^Yln;T1xq>*U~f8^7v_!&cQ^l&{=E{*{t&NgfFlIw*}<c6Z_cEdM?W2Q7) zE@+@mY%VM`Y=Aeri_-H>Td;N)!)1Srjc(%9p#n+VDyPG3LC1x+P!j4-eAlYmy7U-L zqV^l`dSf;-I(zNkyyV73MU|jcbN5m;|6_L;Mu%OgCgs4Z`dqv@%9_h1w2o*5gYLJ= zpZ2-SnjN*mlZ2Kj8S2lJHZdJnAA5w>`YC|Gu!F^W4^T0ccVmFLCX3a01y-Qs+?_sc zwRy)IsN1x*!tjMPt86kKXQT3>tvmE(6>_@E#)K+1x8+GM>agH^Lq`YJfIOK8$9Hc8 zujOpX;g=0J?~o-WUq+W5G%=$i<T1DIr73CTN9Z8Pjfsd!EVm4ItCgkAwg^=5<>f%D zkBG**4R#(Z+A3KOCcJ)vNzr<{MVY66B+X2RT;*DWo^s>Uu;P<~xkt`tOe2q(h_qn= zUZY79Q~ZJdMmC2x;kiH7k)4}%Hr$?r1;4)<p2~L>r?${4gzAmZ+v>P)+n6Ef5#y^_ zDMn9l<5LlE!BbFicYDaT_1mRgJ@m!KW_kx92l&O-V%i`5#SE8K%B4Uu*ZGVZA(Q<9 zi_Q0xN7QM=24JPYN*8<_uQYPby)=>6N>c6^BGbSiF%2UddZ;3OyHbX`Ykt0)oX8F} z_QjRg33C>+NHtpVP5h@0{@R(}9gtDxHn(cB@Lm#6ClCwOnbFi0{T46wH>R}jBk^8? z6b28owQhBIY3HFejdDb1J6&506EevgOEmixV7WNiaWAUtrQ^ZJ=!+yy*`BbCX}v5G zJ}>v*sZJ@wo8Y4|n!&!72@%cw2N&w(5xcW|mvhxksrTwtt?>4wZ$AzT2^m%uf6!%$ zJ$E^k4d0(qZOGT+y#5_VIu=d}BfIPXvDo5ArcXnjXA*S(aLHAq1fLrX^s992T_1w$ zJ6$2E=6z9YfBIFI0&%vtZ3~BMVljznc=iuln+D8hxjbBZJC>bAJ+H#S*YB_>4tFL8 zmiO&<vI#n-_4wi)db*5GPdY>c1{v#mE31f<ebAU=*6|(>AAgc^M<C4C4LtP%Ewn9X zM%|CRWiB1=7izM929QhPV7Zw9PqV0{?>yuRlz7?E!%0}>1=j67NO=wImIXY2y!jTv zO8#1RZZOe6F6F7y0_-h`z|LR^21oKNQkm+G1=01!AQVTRXTYr~78J16jZSY~#hHh; z%v;&rG`k%R4YThpSq=+KQ<A?1ReH~Moq~f|VQ<QVELM1RM$}q<@Hmg&=OdHH=!L$> z!D03KVS4oiOdqeWkOK(y_H-yeVqLU83R++-H%$v|(i=2AxDJ^`!_-PNeoyT6&lIYi zJNNFE4HV{Lybu#m16(2n&Yqs}jJ4v~tVuNd>c8CKG&gjKTlGfBRb@B?AK00O-{@I+ z-ZHY;AmBi0tUCdJ-OiPB_-$V9jXM70#e9AbD#Zv&3}ONYU18bn^``NTN?udb)t_Pk zejZIV(W5<{5#9m*+s}qRNZ<8W-;cL6_tbh+CbkK<_F9XFhgrn{Cn>QE_sz1W8;Tx_ zE~g?ljYRB~cV9-H9V4QG5>e67&jMi~Z|!^gW_*)3Uj<3W_1-0-F>~~Uiwh_KE)p4R zun8I>8frh1)yo4*0>=KI9k{qg*pqgF8M=H#FyQ3bNN0wJo70ZlUP7ya%Wym)a)dRb z?#`j%!4Gy<=DDi8@dk%|dSCp!z9qY#PY&HP%#=|HDXlBb$~U<{Yg~l*gT?jD`x`Sc z6bgCMC7s5|SMS!6TJlkJEEK+XZVPrE9E*qXZx?@_$1pCN!NI=W>jo<smuV*3(deN$ zf7DRSMuTxd@${iKnKOke^NWP;6$?kb^oDAVMB6Ww%1E`0T2z;CC*{$WceOR<>kC60 z-IGNFSXIqdkpJBkOW|+B`eP#3vA)we_g(eJu1kFliHaV&yN*J4R$~-g9g(hnhMV<* zC*xIgaa*mRM~d4L*vh90c#Y#ED6)LksMec1IAF*88b(5AKnOtzOs)J?k=`pYKrgLN zo%;wP3}H6}yeU|?8_*lv7%Id;=(V(JlynVG;>;3I09V*QwiR67(ptnaq~H8Nh=_ke zGs%CEaJ|EzdB(oF`6t!s&Z%XOE%h@w?7)Z*TTlMG!-GwSf5hq2yk*ym36$r7q(MP! zIiu%e<pn?U()+E`-Ic7;?7}1^$1w3=Ok)jIXT)8>elj1!Dzm9fes7GMS<V;wp>`&5 zFP~k7q<~<{+B^gk7`}9~yRqMY4Y!8W<am7>frwTudYvWq=_AgQk*UTSomUl>$&MMY z5SKmH@Db^*VCb1K1c4)$@p`4Cue=skf*G=VOc&nzBR#MC9Lb(1FT}{XWHHS}%G+z$ z8_Q6ou=2Dwz^ZkTk~Lp%844SN3FE8KQBdYyg7ATsO-=(+#kIQ$Z14E+0G^AwRu?KH zQob7#D#7y@M|VJfKGjJ|Z>%)ckp%epl5t4KHb`85MSB@S@b<5O&hkz%Q15t<eJ&Gt z8eP_U(V|xI<rAF_i(BpAx|7+GztlNC=aV9PmCrR!#?Y@1qoNYTl-=K2AR|-ISc3C3 z;}QLFoV!zI0q_(HQ>6mie*DDT=1}3q8|`kF_Y};@JmV0~%&W@B2C&kUKi~DofVv7y zuv&zIYxa?tU+)3zhzN>Q(E_E7E1P`<Kul>Mjx0#{a0!Bg1BoC26GC6#1t&DS)ri7j zyAYMBzR?&BAuS>$@R}*N2Gi})R0|W9J;yN-VQbg91STY`5;7BE=rHux>T<kav#Ivq z0%8M6oc~Z=Y(jB;V9hC+d%yv?mRmx05~_q}Ik(2D^A|eS093ArS(r4xLxatC`-2kR z`SDmE!iryOHqTAue`0FvC3%|xu>u&@&Co0)aT#$cQGn?XK+Nmi?pw18WUOtb%eHzR zbbefufU1ct)>^VDC^WDUQo&zqxi-o$*-|4xX=VT-MdOmEw&1Phym=2C>~CgOOd*&? z)C+r1s>-EPXe-t$gDiNiQ1P9QRihjR;qzlBH@hbV)?+{KZi*aV1NyM;StwYC5dJ_g zuEj$(Q)DAjym}SDCMICMsF$)?;{V(I(pc7mtG}LmCMl{{LL@80)`TR~RAilDko%H$ z-BcI?><tmmFG|)7N4SX1MVo*(kzAHZkdNp~+E&u(EkSgEV=^=+ueLi;l#AjD6uifg zfdwRtljlql(h%kk>)cyrCI?S{<qU-jnL~@;U92~fB1!?#Hy+ms>29Ten~EBOOR#&o zMvhC<+mmAP49=PNOPfJG0Q)dmSLWXBb}<22QM|L1YJ}r;_h%z{on6qq{%<{v#m1MK z?fB}Z$WJKPwCdtUuGaeIY=FQ|l;TN0{pfUnH4oXO2z=lzSo5J-q|!&Tsu}?v8$$C3 zklp+7pe678@hj(^PB@Y6udjs+FvpKvF_fA1z)@`EWGBEOWY1ayYm!6B?9U-qN9_J4 z3ZEa^D<lvtFdwTfrFPVY0QCj{mZ^NwYDY5$|6N$lOZ_8O{*{!qm`la5OoO_4q{t8j z!}TR21YgG?_P;jnu5&+YDrfrqcQsSNruJo+=f6fyH<P2NsadbKX(3k!yb2T9si|M9 z^!`QnA-+lB{CB{^x}4yR1hkcb4D(5PP_5iJ6k2ltrfOShwxChzGyMVbbpXh()D+GX z0S%$AZ6rcg(2-c_lPL=A5dbKZONr1&<YIWv@n17T8wh@=iC50hyZ~OcOU*{b8Jg_> zT@YKx6lZ9#{&%66bw`aB75!fux$>7Li0NSIKeK9FYlIjQI3)jBwR2^ooEu_@xY%eG z07Cpu_2L&_$Zb>pEjh%XwR%28KOKm-2!P5|EEmm#@gj>?Hj@7}I|pGT#cdl%ZWpHi zie*!_gn~wk;{T0svc)6UShf!p%8-b;OvMqP>as~|<V^L)@9p*y966v#2p@U^5hJun zXoTkf%E6)Z!x7X%bra1e0C3VoCU6%dJP@}LuUGw#YHPXsrQ=>9#JV*-lAULP4Bc}E zot{#0XS7Iv>8HOvG#~j0F}&6og~0WHJ&YW$ZuHUK2MOz>K%wtHT8@^wtFvc7E0~M* zwWiVu)JQ}+BF%G%qiJ~r|Ks{hj`ewbSESLAu%`a9dihC$i|P0?T!w-Fnw%^uyQ%Vl zHcAZL+!*9m0(5k_+T5VNLUDp7w7>r{fBkh6m1Q2Mq5s{FNcc8L*u3yRdp6Vgg4%gD z6RJ7>(Sm6WcCvn`ayY&QJ&?~s{HJSoNF+}{OJ{~G@jt4ua4aho1xdH@zX?3w-=#tl zaQknz9JW@dkg)hONHHK+o2<%<er~^;`|kq(wVSE-;gU`)G{-Gd6<N{Gt3R7v98CUW zJ-3&aCDF~Nxq^b`;NVz4FT7PQj7b#I<HH03!Gx6od^AEX>(&xdY;1#P�ilQcDT` zmX%0Q2O3#mcGtJm&bC^MGEQVH^PVT2UJv&<1g1w_KMZ=35Rf5$55n~;Iv|4K%(LrT zGPN|sRK`$I_j!3)8@AQ%Ob&$*$^3weXr-bZ=z7}ji*x}C5=K}f55O7-ewoV4Lk@a_ z594pNvPlVmEzQP>iGtO$;EUT>h8hF-SBEXPhVRDO2IpA~1`igY(-MX*A<IcA4y7v- zMJ7vb@_cV7;014Go_SRo-6!ARt0(Z-LEU@JR9R~GW_VlbHrbwi{jqwzX(U5Y?y~Hh zrCBQjouGl1(KLxkoT9eA!>L0cL~4G5n{~J<*AZ99^a0(Nv?dn7RtU1=djs@R{~CwZ zJXb6zVxjG!^P&{S#0IvQjs2YU=W}2yQn%=VFyZJSxc8xKUBNu5=Akc)A(*+`>n{vB zJ>$6j2OSfl^;8b@f1m+B|3r!px@__^2&W59NWLGuesCiiZrlXPOsr(?Z*s-4PPg+Q zJ`k2>5MK3g&a7OT5={)bG@d7%y~l0I;LFc5qYd3h3wA~>qa#AoVd%g~V=CW}LAaj` zm-8-Tm32A<qJj{YQ)MzR>1Sh8Nvc-*MzyIYoI3#XFS~g?=#609?h~=F;)^9C6%5@x zzK3MY?hQKZ8p>qIlh5vGRY$ZJ<)w2m|Hyziz%{q|T1jgX33RDgHe8wn>y|N0G?(5u z#*Li#>{*$Qch0ke??WOE_x(-Szd}?c1hr$+vyPz?{aHgg-<1ycILn8+sJYmW7HAoQ zqgUhLUVcM7nH4TY1BD9FD9XwZYXGG5`(uE%YTVA$eh`gdAX3WaRtu$XJd|I~Co54F zZNC{J7O4-w-~bBln>}_ShNo*tIno2d<f}+WF;TDj4C9%UG<(&hPrrYoVsO4TB7&&& zH4HB9r%YBK=LIfJd%n&b?blVh@Ly-|-6Kp^@Y=K7-}H^tSx^79mS{XT(R^|NZ17&B zqiB_sit=kf#&X<2!DD99Y|jwh=)fA9*0bnA1_FaA#SJBs+FB?S2w8bF`Pjsi%nPr# zD6gj>ARf^V{_&>uVG^B~#)9AwqM=^_un~(g$;iZ&1xPwjAReDqN=o!|4dPJ9=ZfMB zw7Cs`hZqkHws}|5w?EwfjsF1szJ-Q|?e+HkVLph<n~Qw;t=5tqjZkXai%ek9VY=^U zr#HCeM<`YETQYjEP<2ibs<K3=*ZZL(mUw0=!&_&t-Xz@7{i*&VX)<^6_V~~@=A=x~ z^$=Jr{mZ<sQt@2J$0w)9t41en&~siK9q9Foie87Wejm#J%l8l1WhC)?$!&<(y8O(t zGbc~luWfx`eRSzTe92YXww8cV=5(X-l3DT9n%;PMrrBhF2#FaPxB!KQ3yJ_NAt$@H zx|+)}`=f0)diyj}L+64`Kul9QyLhRgUUSk*zwt`DyuGvi<0eZ-tcROjCGre6rz+=) zz2kI`DV0JhlP}<2>0{-9VR83Efu*2Y#dj6#oki`7hw<D#h`0+pLkF-e4_mFtJZGTe zEEtc+%paRSv)RUgsELeKM9I%-IW~GxQZmYzipsP#y0^+D(j$+#*>I|idqjY?2+3)m z-tEh+Lp%KJ_DBjHm?P}FmM<i@#D5mCPz}DmJ)cxx2Wh3_`#r&N8g}b69kP0tstav+ zV1>$YkL9qLwy6Y@H2Z`8m%h$%v&q6lHlsCIy@9x9{HH%+>|l$GchzmnbG_ESgWY|b z`|i-nZ*^`LebGbtiW{}_*|Va~$!JifJ1nF(Ty>RuGcW44tODNF=m`}d9Np|zx_b@b zrnxJDau_rBp8DVUPlr?I4lw|)qYAgdScY}fdK^j!Cbw;~xO`C8rRM9buYa?K4nedk z*Gf5S6<n5Ei`w0jJ)zOQrcH!tEW(&|`<^a~yhJ?9wTyY6=4mA*SS+TcZdVX^@J|NW zZ4<1q)~xG=wbuJ9v+CU3=h;x2++7+vV%5R^)Z5E=FFkj~Zq&VH!$;2sE=WalRrqHn zwM>A-^HP`SQ~jYJPXqLbZ-7`Nv$Px=|Bw<>MIM$i1>xL<dFwqJ*YlkyxoV3|Ybd^| zT8^Qk%o9Q-j4QiP%(J7XGAL5&n#h026E3U%K0FSWfh&HdvWrBp_&xv$ppbv-3@R88 zHD9L1$U+GQ!DjP=>+I>=hISHde~G7uiy3jp(eJ44t6cblrILFSC>#NAAXX+quU3ZO z!sEeZR_``R;4?W#Z~D6wxu$!^&5GLlO`((O+7ivIdrT;h`agf5DDD6LP{dz>eHO|{ z|0GoL)|BuV(etm#|IaEae2|5Wh3kI^!TzbJCdt}t#0X!G;Po?v2mY{%5_y$L7n}J? zQCCDtei6HotSglNG`Lhjg{n+UCPqp=^R<7n!q?+sl_}lFix!h~kBtN#cDoDB&Es3o zi@b2-;gowJlk}=-u&j9sq=Vwd|LgPrSw(dWNe3p2;y*hrms}ih{*5F8-=?B3cs9}N zXsq|I&ow%#@;N18Vgi7(eBG5VQi1Uhd^Fsn<<*yQ=okXRhf<5^ReE28<VTiS;>lt7 z(0#@mgApfi%Unjm+kud{2iaaK!t<%O_3o1HqFdR{%-DIy&G{twV8Cky0N7SJQizgB zWUdm7x`nltc4S<p5xa2f{RPXO?1WIb__XN$R`q<x`?`(PDgS(T@_1F4EInq;)i9NJ zXQe$58M2oj`^&X8nDd0s(eR8Gf~Q>FTRkI#{~EF}sg9uRv$iIq1aCRV;V{Hm+PX8z z@ai{YxAopa!O0qm42t6+=C<|aK`ip^<9?+PSpcMj;%EOP@=?6~?po8$-)1$X)pBtz z`870<o~aTv8I<=Sy~C$lVm~j@acTYeqyS*0+3ODi7)x(->Jmm4ixSd8{cNfj#UuiX z>Mf#aksa~wjzllg_h(p57QgN}Kmj~J*>a~8ONYBb^n{nFJgv~h&S6dB?RO|DUD_R| zEzhFZ+`mfVEOd9dou!d^DjowhWN_HB+m9TKrwGM9n~C!^Rq0h`%I7`gzg^@Y15%4h zL0col$wI&V#MXy77p-m*cmR7HqSv9uI+NbLEL0uv+(5$kd0h=@ul9lo9E=bdwf(QJ z)l2Qu?sm&M?$)5+b$(&7LD=zN(_06r$^1`3E|&+NJZ+&RB5=FN7xB}fYcKzlwrARl zeS3Ynp=xH9wg=7Qn%GEMX-tMaXjWE;dUugbuRXOiFjMib%uriOYNgq?>zlxW?%~qK z2S}3hg&FFI_yxz8oF|s^u1!tMttvTEv$xQmw!VbiS)}euCIfZ8j%JDO?zJ4`<V#S+ zv_oi3zWy0~shShaz_2yN`0SRHdw5Cr_|F8-6M%v~gq-~CcW|YLoU&qhv1zhlQ)v?$ z@G`a8QdpS_<dqD3u4lFmQI!jF5c#J-Dc-2$!)5uZ(P??EKSx^Jz7;a4S-(q1vwd$C zXYuxTN1>sl+w`(K?wBr=TYw|{t5PUTtvdH7(%A<29~RqEA!D%HxMxP@;uzVnq0{MN z$-2J14P1g8gv+s*fx7;Hm;F<A_RM7X2u}}89vaoC`Lv@EVlFB=8PE5V^(q5Mjw1t! zAE_$w8Fc7`Pd8|Mw`Y|J<R?C%KmW)E6+Bb!36qmjs4sWjB#mw#Ow2l2i<Ho+VIzX_ z5|pg~avf4cNlE|J>kVSs1YBBlWCQ>v0;1&WRNLnKc7C{1RxP55TpP$+@|^#|0(BG9 z=#Uzd;qEd%c9-Mk#Fut^!2UNQL|LsGNr}l2L4*?4T!fo}@9*fHtWXL}70*vca-r0V zg4KR^!w`{_FDY!}k?S*yngbEw^;NYnX7P%EKHGSRjdbV{!q+eHxArRsWI!krgTWs$ zD=U2ex^21u2_)%Esy&*vA?0MCQz{>yCgeQ1SvJyAw)$>+tm9A)g*_ccYFFYKkz~$G zQP)H6^po$9|NQna7Xcoi@MP3j;b=<bOAez+efLdA6>qATl@xj^9q(Sur*b(>(vOd2 zS9vxwFqkgR*~0*!vkbHwt{`4W6OavfHdvrsT1+8N=5SZPod9(&&Y;eVanKo*o5kb% zj9MqC9n#i8Ns*WHn%)o7!w=(QDZ<|fN{cf-2#mwQ0odX0UEjW2ihOS+6VTBVK3Et_ zZi9@?x<fwMpEKf3Vkc(rj>X@y?8P33<eAud{#bRyv&7aQ2dR|*k{dG%L&gm&0Q{c( z(XiOta-F-az-GUt@KFtRZU6v3d!24GWRssK?5fv({-}0T1}27~K!&hdYQ14(g6PGM zYNLg*|BNQYr<a)5YN)(979Y?2O7Zc9&(gyMx5H7!b~!X8kK4<6yJyK<oTO5w5cS1Y z{SoYYHV$bov2T$uqSR_6a3rzxeL#%&%UmD5{;P3+BUz+XoKVb$jf+X9Vv<gpfX`v| znfDC<;~1O%flJ%J(|EdBl*q1W%uU7TG*_~-F_bIX7yPHo*Pbwi-we9Z>*Y7XqDV^B z%L7Mb=g|^P_E|D#7<Bw&lB@AKf(e+sH`%$}FoBLUcs0@T+RG(&D5IlLs<n!J0-@xS zHAMo(g2dXkmHa_V96Osuk0bZ#EbaCrniEY<5x%!)<GGN~)Y<x2-)yKV9?9^>_MZNh zLTr@&4Stf{Z@&}4!4xyzus2EkJiTL|mzV4z{VH=PQ5HlsP?0~KK_vv^l5u$NC0={n z_FGubDy0fq^2WT;s$=REF4h?Pd$%?Ei){0$LEF_2tu5$OqhP|mHo8%NZz*`yeztqL zL=NT?TSdgD#2E6%6iZ7hU!NfIxZhqRLTMJZn#EK;4y8(iZ6e2VjRhoOqC$3F!%4Ky zU_SMg<9+)D=2=<?YFqVb6^<4}-<*w0v|dP55|9rjt3z<WwnAl&`!$8QWf$t-1^T)9 zjd^1E(X%^FYZFk;?KN!tTo&ncmOm(7zCrUfifW>)Osyn%#3pF9X8;YNt?p00{cS<F ziK541;`P54*0REV>LxfXq{<#@Ek7-#4r2@6tAJ?@7Sn^{zO|M{5=)t)pTgQRq?u!< zA%tN2ZRKu3o)1axn&H3d*)oZ3(e7FAl@eaVJ08TiVM|K>;)xKpg7B?EZSERJODd6* zi9*#ATT}v-BK2fU>ZXk$G+VDiHO{~5N%Ct%fP|$@#^Yy>bj~Hk>RE;w<9R3U4%mr; z@Y}B|;-#Y+c2*r$HKVo<`3rgycvx|=z`TP#v$`A-_KP~(92xZqS(9!AtnP4bQq!r) z0?Kxw(~#}Awksn-MsVwA;%oPpvQV<xo9HDOs95v0JyUdNh<oyU+9ZY;!m$0Z)YCnT zd8bA{FIzd`z0o!2jY(<PtEA|GvKT^HNVnYUeSNBHa&Eds{d8wVc-y&5n>*_a+S!R} z4QA2X8tfdd)ufOV74q!Fj1IBG)@8^wy!Mi~WMk>qQ+|yI>5=m2^X3k^KQ_PMX1a2B zS<YoPa7eE4Y~I%JHJep>^?7>Oo`i?XSSG@$#Z39{d{#1ioNB1C0u_r#Lmx!33Pk+a zq_E5<6d;5Fb7G`GS*bz7nzinglB>lul1s<=@2gY!aY#d5$+WU0{5j`|pm<pRyKfUE zb;eO-5cuf2&pBQ}pBS9)OQ-gRjGmiJ;Kh%FWAM>}mkods>@V&ng=$piYt@h1%kX54 z`!?9Aej^}SM{48&4}Nv6)pvgCpb9BeHE@>u-kM=l_9r9b2|$%3?5ksPQXbF5@tRW= zgCs$5+qk*L+$h&4qUP1F^?2f$8p4AXzFs#z!@$2sg(i-I4~_XI>Ds8gkmQMS;~9~i zFBGpal!<XrS$sALC&O7Ra6&?VdQ$3mX!ZB}P=m55I}kISt;?QcX}(_Z{Gf!X<*l>T zmv%%pZ5H@<*I}f}E+@TYCL<T_dXW${5pl`xNazH3J*oC=wu84G6X_124#cI+Ru{`d zHre4FZN0g%z(UZd?p;!hQCE4YJBk_*6k!4nbH6%Qr#oLIb|oyk#AM6G&CE-WQw<rX zMKT&F1U>Jwt=rK=1NxbU1+`NJ_xnzX$Lg$C+@2@m*8l*|<ssPf_{C?`a-N1;IhYVD zifn6vf|GNwX?JFfY!KT7-uRW6YS(9=Epc!8P=(D<B4MP$AnHvlBQX_s{jF8vPa-CD zotGmno2j4Ne!j+uz#mlyfZWdu`7QTq`}4H%U~@88L5X$_MfpP?Bt|Ve1JC7at?SSR z?6>vP>l~~y*q=NZwN{_66}I(_r0h7oqn7I2>})n3(y>+#iGwgS({h6VUQeC<Icn}E zW##oohdGY(K3XN5%TR8W+Y9rfj}7|!3z`tff99ZGR?5^M_Mn&(Os~n7MRyISU7-(N z2-$9`5q`+$wO2^x?XwFbXC6S!&Q9>8{N6pSS45j0Qz`dwnASov)$@)#_4BDL49YA% zXTA@jQ`R|Dy=#U6y@h(7ipw5(zkaPL-M7J=uZHjJ*X0!GHfu5Jl^PE!U<nlyFvqEB zJl_2{U0cqPp5GnV%58<gHN8%^Iz9)%61odNG``0gn$c~;40F|j{dA$$`wkJmH7Ul` z62&Y9cH~q>mEzZvzUPz2Nt~53pMK8O$usRRH};-CK%!E~iA>R17m?*cIC2lX0}a`6 za{Nko07XRa&;A0P5y<sf!EPhJKzZ_P+cvXA`x@e=FLdiNbEFEoL)YCk%D^<<OC8mw zTAeZVLg<`VaoCX%1s5F(C2;!SAZpVcrnlO99#=ih+>+nupj_5M?{w|30WoBFtCLMv zYq&h)2eXtObK+qV0Pp%+PyX97{iBb!Atj=76{2Z6)@TG0Cf1J+N?Y>CS;{_VE<VHZ zQZWjabNPZE*}@Yj^4~SVdW8=y%oyYIL)-(b{q&1!TA=5jugHo?-KL^|jlnpL*%>4g zcyV80u->m*H^IF~h4Fpq*X6I>UDqO)<{R@q)TrnjNsk*dqIbFJ!rb?VEexda1Mvgf ziriT@h3t$&M^UWYOQy(W<G$!yrVfKe>P3oKhSYzMFyQsve*Y{4KZ!aFFz)yfX49{1 z4B04+2r1vJW-9YN)`^hs>NZs#p-)wJ>UT{Xwz?7Iyu7_^S|Zx01p@JT;jZrNh$ua# zb${*X+J(|<9EB`yZ>BRh-&`(3A{P0BlU<AVi<nl6^ay}G0gkA<dV%YJ|A=5Tq2Na^ zd%A39ERDL-HN`5>ShBU}V9{nNF=IIxhf;?boMm&F%&cF<ba9`rB?~b1@kH)L1;m6F z9pzK$eLKlqI@9n7$|p-1<FBCyP-JNxBHEhNbqAJg52@Ap?tB@yPG5-Uw-0WzOBK@0 z7=yU|ak0W7&;v7}Ic4D_(72!=3jL~e$7xA10L$b=-2vRm|KXB@E~0ay_t_^g2>9Na zDQdnhMMRZbX8sM&Cbf>aLF}0q1m;-laNpC>MdrJaW6;QyFT)+8;<=y4YSqbAGN)2a zl<e-j9}Vq-WIYlg&|3lKhq+Lm_`$W$rK0QGz)%+Y0iDJ<_8(4$QJ(O_5{;UEdk)}P z0%y?S1vsw?$zLPN^}DE$NB1L#vE!KKGn5{;H61+8iJ!4TqI9v4Fj6CQQE&J{BWV;^ z-HX2<=}^55+kn!hbuza&6V;*nW$MkQP%4sQYj=a4FaKU%`WiGV{T})CYw6y~WdMxI za^baZ%uRotB(B3S&u~M&jX{I*Q9lD)HyKFa;mPIpeW^<PfzP4v?62IggOEYJwye11 z;M<yEqE9APz8uxrq*KVRbjio<bVjWwO97Q}r7dSlE{Qf~Gc4WsKwtzetznFM0OqgU ztC6SmceZ9~ADo3Z&|e7@QTO8;`CU$z#=2oREmDtj_s5`+Y}-H%cifZ1u#|Nk1pdep z%7Iu_*LUiAjJi+axR=Vo=VhASpo{3eHSn}-LZyMvW!@4>YE6!lcpcW{+D9{OG?2T| zFo@?4=X=PLG1t)@_oJ>oO0<#F5x$4ta!%*F9Vm_n<i#<?663P|PBhUe`$@l@Wv70B z$fS$jvyqA=_~nD`UFb`QQZ_RKE76B03Vz{h7DU<kZ!c&DZw@A#@V02IHaW3arEDvR zK=?TNp1ho6RN|R-G!2`gO6zxdAx=^&|EaS0FnGNgC~)M^xDWrv%te|Q&t(<!!6#vN z4GvrNEOsIo-_|L^#jc>HXe0&WMX%*75qmZpP`Q~EzE`@JO*NirC~XcF$~+@t>*UOO zd9T)39b)GG=rR5q$?nfri?JQM5ml2^{94sGfWm5TCKF2j3m=xg`0mUq%O%t;(Z@fJ zrjaBf`RZ3wxo=t5B~#|sEqDdPAbCyxY_S$e7VB)JtVvGbJVvXs)4tfM$+2(Zxn2sd z1kiS|Z)?#cP1tZVzS#}JAxzXvOEI?>s<Ks}eX>8w2x$vh&0Nv0m52ove`t+Aj$3c0 z(vm*Sdf&$w^!m5Zua$lVStx14xg20-o6^$zvuGE7259)nzTk`^Sy_*lMJAkfFPf(Q ziOOkari3R^S7q{|*!g@?k+m37WaxO~)8p;0z5*yVFZLo)>u^Du-Y>hf=_;y)5^AF* z$#=n+-o2xQV}5AT!d`1@U$vj`P``VhH<6FSFKW7=(XW|Y7;tpZ^vpMGh<+<(x9nYR zt~@s`I^f*1gX?_2V-^mj+}#24DX%G?6sJ>0*<(7kBRUqOh}Bvq;}M@R-eZ?<b8wz; z;y)f^H68w$VZ8>!G$PkVm{-jK3d~|%hVv~5b?vTFEqG;6Vlr5Mi~3Qj!Pe0zPhOCf zRLcJ94;r0irck=@I6^9qp&98~O8qWVEN%Fk7e-@r)z&lF5BNamYYzfa_V-cV=97lP z8mZ6rW`xsWDyB;d9}xb;s>=jC^MIV>H}cdE^v9Bq!gOFTzPC2?Q13lBXz01_^T$wn zoaOd@g@fb`1QIuHr*q32w-C~27pld=O}bt73&4v7%~tJSywm&o3V|GaQ}B88k3?DX z#^j46@$mlF@Tt;y+4Y_etKo&>ShW7$2$PYNX%Ig2`(#r6*S=Y5&6(<CqeCu&2=9~x zR}nL>@D%7joT=NSk}mj5DQ^S={>4GLM(dL210tHw-Np50Dlk_a=@JiM`$4=k6#JzY zpV8T0T8+cKOsKKgH&7`~;B}v|=U}B~lno`@FD$XNjAaOL`PePZJZtoPgoDBG)Yt^^ zD2loPBJ&#|nJFGgZMOs#i7D@klvykx2@i=Pkn_`lNiCz!>nt{STVFJ$2$6+PW38?H zpIY3N5UyoBA7&qZY0fV+{GR0m*1irSlX*-ew&6E@Tcq_tK%S80o<+7eF&rQ3Y<c%> z4O0YW_2swUFXCuXHM`{&kB#sY!9@o?Un74YAu7&TZ)|Jd8+q*&p5kyJX(~f0;b!QM za8MAHjif@AL9>B!o?a~`%m)rZ#PukSvCvG}WZFiv>IE#O>GA^+MTxxdP!j8;0GIns z!J@fJ5sl~q&WFS1Jo72^K@3Qy(Dzmo0wLHQS=CDws^HJ37r&aM*Enfa=f`BuG;t5y zB6<}=Z@Q?xeyt=XC+M(?L{1U<+WxA198|HK`N*4e#c2{&{2M=lc)_(uW)NjDfZUh^ z?j?eCvyr;kM6#UX&H2DwIs$A9qQ$5UAUO)t8k<8Qp8mVye2p=yH^zf3q*Cw+oC7s@ zl{KMcq~?U7g72s5K98imIn>Gn)pghR?Aw4EGv&DSCjeW9_9G^#N{7E~RKW*bP~akA z+biN-U!NoK@zrXssN{26`NC<vI_oD_wMsc6g?wit;M}-NWvcV-j^dWA$w@SgVk|t& z8PXEz(zm|H;Iz$NXc7B-ec8G{m1!hBo=HWvSd2x^WQ2TY=bOaIu1R#)O}zfeXkf#1 zy2+_&gHiCBD)t?mVKiscC~x8xs2nYauB242haJ7-+#wid)K9fQ-#13dC~I|z{H9>E zA`6cNeW#yc9Zpj6)6DtF`Y_oyg4huR;H%ZP5~pdz8|{pdmuiIVzdMK~6@@wGD@0T6 z!WLhNedHuJlp%+Nx~Y^=yJf0T4z=YTZYz`}J!d=kY4@HdLB&Da^V>(i!9f^YL<6VA z8fur8-oy8ADp~KL?J?|rTe5I=d`?Cw^+ua!93P>OTIej|jhi9Qm$rxNsu6$7JTtRO zv}LmSIukBduN5dC9`-KP-5>AjA{=NXWa1ztu-&`a-8U#Kdyiw;9U2|f{Ls*z6JMAq zY9zDbv^*=6$iqI!w^%I+T2X1re`xuU^p<sS1dAef+k!xk?W2RST&h&_pSO?(&F)0p zp4V1vgHom7Pd~=ar1IlU{QcqOGS;IUc>S)%a(C~*pV()i6^Jkuyq`!cjN2`%+|PPn z@!aC>xzJJ~a(wjnra&)`TSEuMBANV}^#PN|)nw}*bKBpTdEJUtLFwkxFm*n7?DgVX z#FkU}^BwcS=i{s|iy@s-qsLi0qXMi%%ZT^I*Nv(XLn#s1WR_$!|H5i_XrVBIoA_pG zUYaXCAAU5@$&`v^zfa$R<i43APR>b+`%{*isb!VVqjB3b;vEDNiG5tg;lI@3bS|%R z+nXJq)s3dvIUQ*R7fGQM#yIo^tB9_RUr}KH!D4QQNd5g;v|V6NC_5=e<@x}#t`Ww` zMr;E@n(L*mLp$Qd!C7fKm?mWe;~%GkNbypuK4D*(o+nsaQ`x498!x+ky_k!aex%V9 zm*L#0+e=9)C3Cwqi35>&r`}NFv>C@xmL0$%Xt}U8F##II25WHZe<kUu8c}Po<I`KZ zJ-l>pwcB`$A4jjQR`%o1H5r^(h}DbY{;yNeD?7G@V=nN2q7IGir%Q81g~J4nygUvw z#IdGJzV<~6ET2!66xtX}?@=)ui^B(&+pNM{6GdQkvg+MTXCe$NcOqCkS<y7<gGDA= zJ9@;&zX<}xfE(2BVkjngb{k^)c>sSU*m~+vs^GnIX;UhJbF1OB)2Y;817TV`8C}5z z<9U-y&2qEm7HU5Wlp_O$)4A`&U+8$86A{`%OL)fz#4|#3#-BCb>W{IHu$Y6^{Ny;x zTJJWlJ(BXI6?&)(z%9o&Ivqas%ZwgW%u;y(?=C#i@D$|vaWZugp2nAG>)wZEUmnv_ zzmxi<DSq8@o8sqyjSRiY+v59WE8;#{vnqwzAyWj0k^5|1{vz0HYN|3vtKyZd8*+pw z8ewCl5A==>@)ImbmyyKf;GbJH?2zKJLBvxD-X_1XH|6n|<N4#-w3#Lmz+siL@T2?! z{7?|3qFo7LpJEMisVU0hp)Yc?ypb>V?J#X_FaCaYFQU9I^DTF+v0HHX`Oy%ceVIPR z6{75dP2gEGByl$_l2blI{;6$VXy@*B&PIyyqr$mjL2xwSYD;l50D9kIG87fBJiKKZ z5o=_v`BJ4XYB=D_#OsDGfWrKG85B(5o3`h8S_DaFd~biEK|PwdvwuS{M|8id=#TDs zP;GJVzB!UlQ-PkcypzRRU3Y{OQrDm=w<XloPm?(g)%tP)yu0&hC@5myet%J1l|8tE zCG_N>AGC*jlg8(^b$viJnM;mEwNQbIDDZs?v)Ot-<T_WyI@=_(U?e3}F?_ptgm=oi z8ULz?dnrN~amv~u?rOh|=Fe?wI;dvQ(_hei`P=<OvbzO-tn2dp$D!bOCWVaax$OZB z`y>a>kNaAWdIzqA59d3>)BG<8M3>8jA-V2OPBy_SYyo$@!LDzz0X`(R=jxnhQ68|e zdJ*2Z$fqrjOH4Q*3+NfKY&E~}#x0UITzR~$7)rv>%Bnxp*}$_5-$-qYl!cLVlcL&g zOwcu*SeCXDG-cb%{L!fD7CaacB44Wm?|#3~JqicK_*>ZD+IE)qn_5o(uU5W19I7zv zn?Xbil`UZ`Swd#c>}1Q5tz^$`R$B;zNQPvoM998n30b2M*^06+*_T36_T40e_w>E* zcU|xM-*>&&H|L*oo_V%&pL3q)UVitl@D;v!@b?PnnLU$AzhC#;a=-)HDiqMCoKoXu zTnj6|pqK|@M$}b&Zm-i=Wv%BUFSjMi*FLrZ)5Hrc2HH<L4;gXrBt;$9wjai9=u4h$ zdAz@B3>s2d#WtzC)5ovb*;(1mwhAf!Af{k^EhiP%BJJ;F@hc2g`haoi+Diaq1mBY4 zyL;6O*k??j-r9lP!%AHImo0TIBtp@z|B!*Y;{UmI{<PNWS6UD0;ZTtnpPeJPweEpf zDpiM?`+IFy<rqYDX#1Dz2dSKGr33k<M~A;HO!ArU?WCMyllT{}vNTa<Qt~Hl!=@f5 z`@2kDG5SFM5-wb8<{@XQ3#RHSNI+xe*KDR5@<LRr{%(X@>+c#t+%AX%MFi7&e}1K3 zO^o@2_+SXFf?_t90#}chUz<H<T2v7R;S|{u*!jQ;wi`a!&0qXBq3kf}lWHv|8iR5c z&wSW;q!bqpCe9-(d2P<cv{fwiiGY4o&|e`r{eUHB<1;I#!{%IcDPud^r?o~!ukO`a zJ%y9crekB5g@W{L?q&`2P++G-baP*}o9G_JUZW{&WubYe)2-a#f{YdOPvq0$mxTQ^ z!gv^}zfox7fS}dpW+#CAGSYTTF5sLi+Ra2z;hkql=VhY3-1H+5X>cv5xG#U3@M-z% zk6fL+9JN6{pykjcH<xs1Uqt*cez{?EfBGY7gD?`LQ(x(J-Gd3*l^_d_b#=J0vG|Dt z?PS-fTL|9ct3&21VVf@#0ov;_p6p7c?Poh1p}oT;mvCd;M@_+BjTt_M)!c^Thh-fq z{08#Wc)BznOuYVZcz1pfe(vzi5vaC<z<G~=@94lf{a3&1ANIc-n*RdsFrat0MR`^C zS`8Qvj+5vaD>Ikpr?D{iWu9F++h1r((~h=lxbph_^t@rT`gRlTFlTW%{!g#6)uB~+ zw*M;bvj9Vc!Jh1j-C~KKS3DSVlF)#=;9F)ssb8lv?R_T_M)Cd%IvIfG(5oMH&o+M! zCBYXPk5C|~#KT7os{+V2X)K5aEq>I+Y(y$1UfXAS<L9LveVWgvFI)43d|Dx`5m3Ms z7&iOiDqZxX#Tg=;rfBj{zVlonWsY4kGwD@!QIKe1J7_OgM%UgyVffysv;{icy1ejJ zm1eg&=W7clAvupDL5H&Hu%LqYh=0SAbarmg@{GKs!2{;U8XqcXY|Vi=m#g3EBjt@6 z_HPV_tkZ0Kzl!L|GpcS+)PwPdAY0Ez`sl&@GJrf-zf<Tsp&uT~N8Ni{XsV~IxkuO? zu~XkWd*8#Rv7w03=FR5`s2F9zi2v@wQGaPYI+t*Y!M>%`row`lPfx&<rQnQLM)3-= zEx^?JU>`50W~&Fge0lxLS~Isfwyf0A5L5sbl7i+xlbvR}QzhTfO70tf>P(2|K(b$h z&Lzl}tC%;3hwn-5rHq5vOykd;e@=ivNz+#|bz13?^J~*FV&JNhZ4`Oq+GE2#g-^5q z^N?de*(D#=K(X-)iWK>bTh(p_G|%ZE8JWI`nNPN1juC+l+ts~C<l)j1&?{l9%s}&< zbW(V5cjremfUTnuuQ}-CSkt&O9r8r#Zq`%;G_iBXp0<rxZI~Fc4pR;l`L#S*0-}iM z1gq*iQPJsG6_urR|Cw1G`bKL-+I?`vl`hcbw%B{xdG@Zupp^Hp#U?&g5i_X5kCb}- z9@<c1Q{+|$hhc72_fT)CQv0SNM(i+x8efyISmbg4$)x!dn#K*F26Cn=PpiB&AG$pT z462M(Tr97Ebeh|Z4aMHK%F+62$TIu>#f1FBPcmg~%aTW1`Zb<~F6POnKTR`ge12tI zcn80`Y+7=D@vnxQeIQ{58HI2t)QwN$watx4JM935TzTxH=r*IZL(~i9%W(#|`npX+ zX6><y$quxC>vV|vjNf06d!gOcQ>W+#)YZkKh3hwd0}b;CcUybg+-k`T`wYmL82WDG zrtW}8%Zo~vq1X6AjYmy!I&l)tGaCF`C-^qTT|B#sR31kw@hoOCpO9no`2GpIb+}*X zYBjQd^Yx4Km>UOw-z>BRu~jJl-RmIqgZ__}i08C(HLoiaoDQnNw>F5;^9c`3&mni% zp~C3p%_DL9m$}v+CbO_2kmlf<kJa>h!^Vb%*FoAF?t@8LalxS131U80;ki3atCg~~ z{^nm~S=B`i2+ABTA$NDjUVO7I*_~3OJSuk0pT}BuwAR!u=lSIoe}h_T%tWYaz}8V0 z#*Nm+z{Gq1SQ6GyR{`nBd3WX6QrRV`fqcCx1`UBJLB@k<P8Jf&9>BO*Cem`)%tar5 z6$b`d<yqcR<tz(Ki%7}w551>@>X<@U^%h39lT}L_%`ifWX3ks;U%H%s(rN0ssVYak zyPCXy{MN-^rgjupZ}M70*SdzxQ=^Wp8`0|h)y_A#eLLfL((XWaq%4s<Hc@T<vy-)# zx!BLvKw0MlV@qUl6lW49I*TQF^tD=H6wHTh<2ok7?9pJ5oV)E%-cxI!b<BLajf>um zF(Nxot9oyBd;Xy7I|Wr%y5vv#KT&IoP#Syph!ds=E`Fz*nK&!a?q=pT@rIpu$7p0v z!Ea@mZ=)5gqDuBTSWg!!-5b=Cf5mHOqN7u&8m!+RG+s%DGVZW(E(Hv*U$r|{PPsnf zt46b95YPM33Ia37;|+jsJqmi@-eT>zvn;*EKNWze<=NA@9{<xu!P{uWF4NCEX!1Pz zc{`XTDjC{mkbx9b;#97+=r!86r4>G3D#|+IRTZ^*Z`MH%kL6>&J(nTl!a$!FVLFo_ zZ$3p6&I<BfO9-H}pRwrpo|ign*0ww6AXK6}vheWxtNg)_p<Iv8!U%@}bHu5#Oa-b` zTx<SO1w+%~(Bkh2#Cc!d4xdRsAj;4#>jb~(!EuGD(MCJhiG+iKhC|ERZCd_~c;%-) zD<sh%)CJK2MaWYDy~YpIA7XLEcESzS$0Jx2_}B0AQe*FIJ8GTI1D&bIz?5I5gSU%c zE$FLqTdBpNqn-^mKFPH^wmMg+A7O!YC;kq&9&9i4uaq4r;U7F_OM<Ig9{uVjmuGd# zS9ey2RhX8Qf@~MgC!)?@%%QQ14ZARE<fB|j(yCLu;vq5N_jZm2rY;UXvQA?ld?{<} z=-y%B$mIf&kv*_)wK_l7gDwekO>`ufj#!Inj#6#2dIJY3%>5j<en3N7pws*GHnA9v zGpc`e^o(W93L5UeB#O-6ZcTFsgVu373u2*RKC8%s2f=(EbLpjPhP0c;dCY;|C_Rym z&lqMh8t&RPSg)R=uF96wOkQo|wg1T=XH|H3Ftj{Yk;Wf%d+UgTay~c9h?(U3!;<@$ zD~N5h-l_*Z{QIj{f9Ar3gh7IEsg;9*26UDA>$M~mm3792fqzh-vem|^q4_eKr9D?w z-M;+jtbe$u9Z&<MnbyA!ygz5osC3+aX==*)1qfQYhj2J{3N~7y={9ju@_nFfPS}F# zzv{K#odGZ0=Q%Ec7fEIXH?^eIYCMe|fj~U*2Xa;>8#4}F?EMA?AW+IfA9KLCBw=N> zvzjLc!g08&1M6!SFTH<#>tN4_bbChQ9|nUVrvT6PzsA3Tqx}E)DgEy{;rgwj)mGl} zpK!yEVvtLT$zqUG{}=}^Fk=4k%NZp`i$kOwaq$0vEtHuBOkfOG)mb={h)iNk2r)el z4lxdOF=G}4LS2dJtUAI=-OE@^PfX7%bk_QvGw1P{l=DH!lw)_eOj!0ZY91}Ts{M5= zfk%Sp*e{+0_RG80!PX3Jp1iC7MID!TO&Vg&g+ik-2q+u_M`KV>1b{_Xzm<k$N^+qP z00M)6g9ieEMW7I{M3NyyTonPsA<-y+gvDZEI23?KAaN8joCrf;i9|RCLqHSJFdTtQ zKoST<JPwb7A>n8&1&_rdu?P$niA#Jf2N9+ru>cGXgTY7$G>%BZVQ@q&mO??HL6$l! zoQTK3aU?RFLLtDg1R_|43{a400)U6(hy)5AEF@#d1UvvEqhJIa35FzNF(?#*0w+@_ zI6NFcAORelOeO&o7#@d$p^#`2*a!uqzzG-_I5QLtz+)-kBq?Y(Kmv$xB!L1)k>NNP z0!0A;1et<B0RWzi1F$dvO#u+#pkx9JhsWYjXgmNXpz(MLC^k45K$37s0F(v*3JOPt z!|+%F0#8Dd$rKb3MZ%%6I1&*BLt~K`G!cd;U`Q|ui3re;02ziPkdSb2rg$<OL%@^K zNCXiMc8sQ=kr)!1L?PoyC<GBlK@$NC9*MyqU;ucAfT6Gy3<^gk<MBi?9_$c@Mi2=I z9E?mvz|a5^Yz{*rVH5%dOC*3#1iXJ7f(*(Bk4AuVMqx<^1dT#OkpTi0g+fsXNIVIY zD?mUY5d;JUAmJ!D0*Oo@V9_WzfrKE!U?>bIMl6Cz0>GO`U~n)vo`?r0k0as<XatIc zC1TMS5(<yQAdwjGQ3H518I2_qut)+ZW)cj8AfVt_5(N&2k>Et|4Pi%uQbQ7P;Do9- zj3M_p6HFk?iML4*Lz*nq6YoNGa>dKQp;!Lvl<0`}_QZQR`GJM14z75o+n0&%uFBHv z^4FnK8VUdmK*CS}1`bDn57`ndR(E%!;)zrpH;Ow{%8`8gw!5nP9kQF3lY`rBJi+T< zYp~W0yek<h^?&~W3-sNI?0Bk^yBk!>O&*^pNrqenzfWf}q##jB0wS7-q(C@nNCdmQ zmXoI!6$*YBU>mZV1IW7w0LcHz7P?|#<t|WtCUB%|+Uo4Ngu9Z}Y>?5|`16w2PfY0C zv)opTsp|RNW=X8<&^bKV4dZpXs2BBP`U>;Y6&ufX5gcNw>y9?Z=VXGGOy0)tF5pAF zeH42qyF?_d=}FG>l;iE<a~a2<o)P{ClfIzanoE7LC8cy87dL)90EV=Z;Ev1qAz%~A z8bj3e47mF|$@;rNj-5_k@drJ_<D$*aF^<0a9Kl)!<PS&(OCEa*n3&xCXUxzC;x}Bv zRDRTv$6+!NJ%CG7u1}YL$VLWECyu*|KN69Kd*UNYWAWK=O`4l$=CD;2nBP3JWEEV| zlpE{ELMfrxs`GOWxwP#rTe#n$FI162w%WbNn%_(F%DsB@=E>xAw)Jok#qu)K_jg+6 z1#D-KHzRdEyeia|D=*ZUxrNGYxp`2NMw6OwR=|1It&e-ng)l3ohYs}nI~7Zo`zQoU z?0h}fN8={dBl_>Sa<mId2PtH#tep(Jcd)wVc^;?oKG<lT_gKa^)n8%`X-Hj*F2`y` zw7%t=jFq}q`HAGt!=Mf=BKqAWl`7dNzPwG@c**77$?0w4{!B&s+lwX9#~q{WIxJAQ zS1N=v{jrRyLOhI%KR#u<B|5Td-HN%B4N;O$@uztUklwXqcazHNE*9ry`iF>EYW)m% zwzRFoGVT<+nvrigvb6+BUUzg&I$ou#86d#@<XwVy`MQ&iJ~aJx{TjNWRqOC5Z@n@| zGPj$jADucd-UsRFSX{%>Cb0W*X$NX)yS{0SPHCa@5ZB$n7oo9&Y3jnmHuWyeJDtuO znY792TsI0ij_)V3mF3m)X)|ahJTE%3gZBVZ6FI;1T0_zXn^9$2&sI@agI)UaM9FWe zs=71tSja?PMoHcZNK!}VeYj|_l&V&PwUlE$`jlc2S6a1lXRPvyoS0>J<!+fXPgOfK za9k!QaQHm`u*_)bsYO*_)RfJFUSNGAm9|(_lIr-gOae2{FEr2_owK>tJ~4Dr_3B)J z=g9=oA)VP@+IQYH#e@y8>G|b09X>|&j<?sP2+5buUHs8E>Zx05sy!vp=fCYC9?$3% zH<8)7xOZP5>}s^D-xd$f+L~<Lttb8po%#zsCn#QKFEz-Bl<WksOSW8vl(AD&2DI~p z#h>CsDAHbKO68h*U=yw?@M+|irom^EJkQz14on=?{q?->N*jL+UF(aAOldd?806Nx zx~_3PYOqSxUsqaTJpJ*(WURNyS-EGXys0%#uG#W0wCC==K%GjKA-@S5e(Rf|a!*m) zNLl#ATw&mwf;@ULi6D5cDfr&AlaV<zh@IJ52jwayFj`PM!Y_CI%=19r2UA3ruhbIN zh*EC**+8*pGlp7sw8QGdg2dg4Y}nT6;^3|0u`H4~TsIH;&N`k^>fy_(<A^kQ-=v++ zB6Gt0G=%cjW$c<HJ;0|=-8JUQ^JO!(eBqU>8^R289zy;%qw43|Y%t!Z-e3L*rQL|o z9!Dh${nd})6y_G>7NG_f`^JoZIPFnq5@B}Uo9Sp6>(q~RmU-Nrq_qBRL#Ad!=E7TH z=Bak&)H>d)Ee~g{v28N}WkL%!NUF+%MUPeQGO2yTuXOm6TWZnS4<iCtFYa2hg*oO| z>8rb5+BN&#>L$Dkr4L|+?z0!}gG4IdHZ&`LYrafhKYev;bD;aZe;_ArIg0vS<X!$m z(*BGn-6u<C5KY||6Qlm|n_cIz83lR;+n+qISY_=_I_3OVhW7G1<Hc~&U{kcygm~_S zuZAI9iyTt<%Gtdy#S>rtX1$^zFu!nBN-4!HY5q6cFy8eo-*|)5d!M#or}wrrD=wRS z!^UVc9r`*{(U%&c8Pga+bp61zHhAs(r!VBQq361OxIS-9X;X|&_4~z^s`3;$`u*xA z!>M!Gy4n|jxt_2?x^Lmx>wHfF`z1VdKgcE|@%{=oR+oBo=n|7Nfo>CUKi(YqfSPoN zs{Q%>>6vm;Xf*ETWp7BlM)yn~GcDMrv$~0$<BpKI#EKt3S!|{MA>(m@39obs#Xq@+ zSh1%aKHP6xf4s?bU(Y9*eW%2Jv&)Vdjf}XSG3iU&VHTV6{^7p(eD@&W@25GUrF=%G z{^J@dUC=D=h2GAj;7=`G=Gme`%@!J3Suh$mqTVB?%UUD%w>Jta$qhZ{5l-uuzVgjS zaKY6fO`nR7yg?O>%EGBnz$%N7hsdY!@~4h~TuI{G$*uX5Dp@8@8KONzn{3phvaVLA z+avipVFOq<CHK;aKP&nUw#k3mkUvfen<VD<Hlrs>d%HuX4i6MX6>jWR-MP<ofUsd* zAaRzlkz9osp6EV{IK_dk^rp3(qT~Hr99{@qEVnr?ukbn-*XWqe%uRPyQ`9vu8@rpc zSvtNQH6H1CzsB5k?)om?b=)xgp1xISdXslLRC40zLeW&g=t{w;-+=i}!5@)?<Ps@G zJ)h#zmr>|b@p4YzFkg9SE2QQdM_2`Wv&sQQucW6POx8~6a^c-q=F@2#eu6dSznU6< zP28k7tgR<^i!>)F5$ac!3NfE|=v9lZBQFk^Os2ez1`NqDgru>EGox?+mU_?r-cHZ5 zE>ixaoSG%zD|^3=3s)r3dv-9+boe`*H3HUf_S~v*eC$k6VRn3NY2l0o8T-MhpkejX zL@%Abzck^=C2wBcyiK5?GF#1W{iGMBn{(7&GR1kymX5`FdTjsNl#VhR$P*grK6$|O zj>E|KhSY-YJl_cX_wop^y8UM8t@YX3+crUJQB^}Xoa2PN8_U05cs2;%`@GQ($H~sd zrI5dF)_Np4RvKiqREw}P&U*bl*Bkeu?|Vc=v}8`EIB(QFJWG!n?dn0>&(mo~3`z$^ zy=ZYGFR^sa4uQk{0eMA>(zBOyl{nI5WnKiw{g}C1UhLVda__T;X-{+d!7ti);*fWp z(#@$@=>AdurVHx*<u9-Xg80Z@rgVB-uT`#vlY@hS>YJpuMS167&G2uTX>XqY7S0T> z`^)WhMN$6nkk#g~U*!L>9nOIk0}Sd;aAv=9g<am*$)60xAQLYHK}4=y(L!tD)YXBj zpwR%Tn`#&>HFZq@)R8sSG}P2I(Ku!3|3ej<L_rEfkao+6O!;pr7LHxs9BKuHLlIB_ zYQrwC<3=Li1q)!{=-~B#Cu>LbDFNzuzE2xo8PJ$N?{rF|p{2|^B$lqeg5{6;1%uDe z-3p!*FFAQDNXtR?1G{4+x?RZ&*@)Z9^v#%I3EIF0A%awC5J%%<hKF9#ZT#6DbAZfT zgpl>)frIZhv0E*@sd^S>ZIoXXs+3nd+18@b9G5$1+n@T17R^piywtK)_8%eZPG;5? zKRazVS>*ZDaM#-+@nnq%=4Zm~4%g&%!LeA^noe!Y0pTaJmJR!xLOFX!O#6}JZ+ycI z8#h-wgv6An!Z`a2C$|(s8tURRYj|r_0_dH}L~2H2qNF{9k55|mKMl&BU<d~XsCi=n L_KO!a4Yd9Pz%{Qy delta 13750 zcmY+r1ymeC(>97EfdIh*1cC+<EI6yUyF+jSyUSw1-4}v;fZ*;B+=4?0?hxGFCAbqV z@B7{V-v2viX1b@kditrSdd|$L>OPsm+3>^h@kg)0peIb|CB$H%0^tY=;W#+jBVkrJ zu5;?l8Y<Wt%o=ED*dNd*5@3WFB<R2dSSAKt!Z8sBHj0Pmf2n^8Z^9AdCX`@mHIPKX z<gDNz>lhC`(L0gWcCm{3$K^z^XB2_zX&wC`3DWtj^XiNZK-EAYB)8$$h*@p1b8#-} zGD{n1J1h`NrVXFmtvFgvotHmS+(W&O++)v!hd`xi#o2C4E#J++mfe049bs=*pJFPC zy&+40AuveDx#_s*Y~U6+0s=Uk3P@{HM>B3Z5ElTDfFi`8K>@hAq5lhQt+t0N$)|YX zf*-eWTEa2-uc!+xLaj%iVVV<TzaE#2vHq$${;tOPIVSZ>LQkUIYoD<!BHBvdcV?ZU z8rS4b&s13nKh$>+E>d7=2qn(ir7cp#2lEx<lfOYywLAVT+Ea2J96l1RzS{TL7dV2V zt`;1;uQa`0VWTkyqvOU)UO8h=KX@#<#R%a3a^x^Kbl;BBU8=ySc#VeFBL7#rA@_72 z$cbTmPxFiXi{8Q?U9*N!oNttjDODh1eJAz|NzXSYujh^q>QPfR=RqNVKYVUP++>sa z%$awh#65@7*stoU(}ri!+<1fE%xSS%qaF{{Ge+K}-&amHUOD~k@M{Db1;x#|>a3fH z(JWwn6DYNR)6+S0OkmYLk@E)sH_eQ9(vR2P66;3;#z89?tE3TgIF$e1)L|KECGQ2Y zAI~hOxlopT5aty5`=JV3R_nL2*{0An1zMyuXQ{h~?j087RJiGP)G@XII_LNxlMzZd zLa(S_*m(H&>p}hcu$ylNm;~+XH9c1Kc%VP`*v&p?FmzdUD|EKNO)W@-_?u?zVr)?c z#X80tpfRc~iXN4EZyAWR1%LW;|4_f7li2<6vg&o4pE#RxW!sDLFN|LTtzOk0SPfF* z@t(iuPBCJ+AiD>LI$-kS{-aItel?AH;kMwx8W{5!qpeu^=*xP}h+IzuczDNB;SYUD zohK}5I|<z1FH2G9=U*u=Dog%w!&+W?-9C6qF+Lzypv2N@Vn3D}LUZ-Zt~tzQLx+7U z^<WS$b}Vz+j?GWyJu~^q#}d7Y7rGK{Giv+|GRORL7L0Fhx<n+1be{##q)L~dN+%`Y zVe}Huy2PX6<vWQavy<e@5?S(0<QRCz=ru$F8vU7>rN2mI5v08REn!nggcOD5jDgJn z+hd8AaD9%d(QLIG(tEj;rJwb}V%%_L6RBG576`(g=-k+tI7#+9kF4e2cG<W>qQUo% zgETL~XZNaV)KT)q#Fp51Us5?x2?7mfkueNYW~_x%`mDDWU6~Ce@kLo3d|3sB!mX_% z7<E!O)w*3%@p`{;=EZ*6P0>aP=WFA}6?eYf{P8IRVzwO?M_<`pPV(dP{#Im(x{IBx zhNE>DbLR-Um9&7vt-Y+gZnlfwu&*4eLhV<F4vtzV=J$P90XiIC*Y`_*Pzm9StT<%c zOR;gJHdpG6@5mY7c=ds&p>e<5bt)z1Z1Yo>+>NZ$V&=JoOSq1FMyJGxZ*L@~@d^g` zc$luQCPd7$HdF!)IDoJAZ{OF)k$;#XR64;}*jvC=v&$;sBKkBgTv8dNp=hbi3#TC} z`soz0TK~IYyC&4T|GJUv1Iqbh);_3~D_gSfCT#pex0PmAv-Z>$4#{Nd6!L5KnMzFW zo*L%w2n*smGlgM8wJ2UC-Cu~>mz(qrst?zasP_*|bwi@~&*U7fU^v)kze6>|{U>6| z65CAWxOHkI3XKLVYT&G0@TM3h%?J&xR|9P&+$Bl5L*JV%p3{f@(L~8r8uDv>6{abY z4amGDru>cdD}`z&i4k(;27B8J+}pUf5KHQzC8*<2y$-I98(t)Sci_kpqd*$pbqv=D zphoWeKreWKuhY@rY-^CCJv~a29*zG#Pi4{0`jOPSvx0Xs5Ur4WQR>|wL??++SBCCc zFkvyPnFgLUgA?ut{aDnGU!^|?fA9FO&XNS$$E_IZ$EFvYCO{{PY=4wdU*>D+oT?k_ zJNA`nr092k)0N>=Ad><X)poEp=F7m|dumQw&;t|jNzcW!_1XI2DVZ|u6^&q^pl<wl z->7|h*<|xTy?l(MImVl!APQiTT;`~oxqaO1TjAeRpR>|=OUO`bQk7-gWqfbO@qOtt za(r-L=7Ez%i_iCb$##!O*&K6gF{%GXzrWzB8`4M%cF<jiBkILc6tDXHhCl7;f(knt z-9E*J?N}7=5mi=aN&g=1&Ob)S^{R6m#{G-@RurkxC-_?CjS$`FbR;8Eqli_5LKLZ? z>=43jah8Vl-X{^2zX|Z|=G+q>HSUH{{LU6){7{`sc4~$z`|Devym{{GELC4Pi;hC9 zc`4S!cUcO)KIWucHpUdY%S_fe`55pn|EPZjCvNrFthlBF(2lm-T_J`S$RNd=tKpxP z6(%2){QIuTXRs!k?1vg<d)Js$SN?RUq1h+jQ=bL0sNOvk%+Hhc)q{#?WlaBjO*Oh( zwh!X^`gz8opMES9^n0;1e2$~U&Q6RnrpcMZBGn+`5<bXgU<rq=h3gF$#>MQah3E;T zDYR4PaYhs0S{t{cHGd!4aVkj%QaG_m(=U&$<!DmIC+M|k{+(cH;3)n$y;nuENoF|X zF6g0Aw{>rUGT04JUD%!rdhHd2mXJ4(x1Om+j6>IBSrb*8;=BGFAsRUpPZ4MJ!XJZq z=UY2^t61@?e(H0y^3v3Jiaholjt%zGi8!UR;Ps2ZkhmT8zPjzrOkZz~JGH;D{6D+) z__d@m`i}<gE)NNWO85UM);Lf(*k1_Vfdr35wiT%>QCNR}9tn7E{92&qcV>6xs|bK2 z=wbwhW|@Dga-na@PKQ@hoa5iVn4Z_JV;Vp@OCqb2z`W3s*}=KP;X+GrMSh_`zt0P2 zz;*Lbz>18tezUD;^;<{24aY$<bh~ELwR2CK5Oy$D*NMVz4Nvx~IiUl$_vI49@z<9N zVQm}>D1)gwr#Il;!$?EV)9KeJp}PUoX`vc7hl6fu8zZIn>2f8yb(2MzK1qr$^jE7P zS)I5Z&eZ#Ew@F^rw0}<Tc{bf%PYymq{?VS;J(rRiF)^mEQ<0jWz^hOJRq&;J3mICW z#Ba2H-$7D5iFDDCd~3(@<?i2r_`&u<f%vk3FzWo{VzQ~|!1T~}PAnIO86&^~({uY$ z_YO0k5;ng$r^vB=-x%WW)zSzWuzO9P<uF0NNm$6M{`~uOr305WXC`MT_g1GflT<3X z;~ELmlHfw&wN|cr4hOm~S$=X&)ou>?v}?CTrQ7pjuQgy{HpW@{ZmVg>&bA&gC(3E{ zH)`8;P0?W*@uhC(WFEY1pu!J*3Bm6%B8#MSA0R?)HVCrd2`G5Hm0zC85%D)Mzl9hm zDgDH(f_>F9MHcRe&RX{c;_<KJ^eeQkNo7zrEzBHAEk($J@#`y>BZh{CYWzq)s(Hw4 z*LiLv64GgK)nntr)0gPt<6_uGRzBHTq7a;4v%)D;v`;!R+;?x?6_*F>K5&-t-A=XN z(cbkn4zs6yOga(&+aGp4NrB{V;C<<)SzpRx$7i><Zb&11(e5E_#wj`%CgVDsyQmOz zYI(~x>gOj%6sP!NiYD&UM1HJ*z0cV1U|m)Nl722lnBAI-A?jg>!vF8^!E(iV9!gQ! zdU<N7Ic_FiJL;n?(NbjHhjbas_98R+RK@0mYlAghwoLNSmqFt%gDCuCc+A5;nIgy; z_PD?VkdJTTA~Zjm>|My1E=o%`&!h+eHxp9dk_P0-)KKqw=1>?MEH(wsB}(JB#_quL zkxc0v)hjyZAC|<H-7h2lmOpZPWT3o7k4AU*PivBwa;LuACZpe|d?eMmNctY6ijPoI z0qM>(XAW-JxELj1BJeF;j5>Wqv6SpqWU)YoFT30NV)y$)(;iO;b?(p04XHdg8n(eD z9u_@(Ci-iy`vY-H2fue3t>yS$MLwJu3Jaw3i4!nc=g(M=9#Q>H!E`MiGecp-_E>Em zDB#%WnB>G#l&=o?2@yEERV?~7W5v=?9UHZ6KmOL^Gn&2*fw!hrL9Mb~s1R+>tf8(% zHrqCT>{@Q8zm40eryDw4r}-7rG<fBeI}GFqYoK2_tVjBnj6aryr!>B=tA(B@u5}jG zrQloLtSlOuU*Tumhc@VHJwv&zBrqCpZz7Y27$XPjws*oCGgHk$FtRT(;U?YrM@;eM zpM@<35s`n0Xjxjx>_gtx>TyPL)`sRS?S5{W=FpwwD&W-`7-~Zuul~6spuN0hoFJ#( zPFyY%^l&~@*^x3-Vl9tS=bHWl)m+wbk*#H0bfq!{><*?<XQ@ibB%^G9`7<fb*obxc z&nuAg!kS*Xxx1wt7t3qRE6yN)yDI|2gGd?J(@vuccS*JPYOB9r_IP-BIQ>3a+{UU; zdb4zc)h5l4KEwHP9FZycqasOxf{PImUi~Yc;O6_br~FSS=0Oi`MH^Zi#=RV6>~n~U z55w=n=QE!(#R_!%qJE+hVgSw@4L|ag>~spuwf3+brQFnQ^grr(U$CEwr+8d6eS=Z_ zJT3Tm)!N(aeAhC5DI{FuYb78f!(47-bL569OoXRL^(49Hr-26KHI1OuzlHnekI8wu zg0Z`XTng|Llf@FeguMNF>TIwsP(YLO_ywC37Y=|{DyGnd@E;Uxx5;#3Te={f-+nbO zi%GB{kf2sLiF`<Gh=`o^HCU{+$740`tXQDI{HDuf43lazyW+dMKTAQ%9>O(gC#6VO zK~Sb8@m7&l*_{UUDyqPWFUf#Q_;A~OFJtU$OVKc-FeCr=Jh}&G??K~AZ-+lS*uDIA z1n<Hcr&jafuQDpE|F_960f;ylh)LGSYYsa5U1(QBnYu|2xkam_64Ord*36P%3h&W5 z-`KsuJYG|X8OdbY6&3SyC#$uiwEx3#K>J%z99uk56@?yv>&gKM5vEM+eAHU8_*X3Q zuFcl=f(}7bLaPs{x3e9|<Tx8w?mnT-z&YMhXHLV}I789CdUlP#WWsuZrEUI8kBl4} za?LsN{)YEjXUFj{L)`GY$j;e_5blF1yZ^suvi~}3nZ%i*Up@5HTJA(y#(+`3P`}Ll z&dWL|AeSJTgYuPS9QW&tM>uhYfKPktWve#re8NFOjMvW?w6^8CHt)yNhvF-n`8LzG z_LCPs|1P3hwPpvBui(@Bh0T#$(_>~!+w<W1s0bDVoE+wde!BqnrS<s^OVlT~xLwr6 zb+N*U^|H0e{KuKL{cDbV@9pk1g_Ge;eu6`VqmA@MK3@XsuFaH_QIiEK@&VyV!BDWv z*<x`M*qN!xNgX7ck~qU?xlBIa>uA;aFQNy`bAj4_Q)bwj?gjX^Q78D7pggVLMZ(MT zJE-cu4Ch~&2#fFw>a4NP(!DE4arZfQe@EP+W#YvC5t|>IDLYAeaNJ#HLH(DMjedFZ zm0w%ZTl~CyCSQTx=S{tkvS3al`u27q7Nh4Ygo*CBcEb&HA&4$OL5{~&iMEw6Bd!Su zV*7yFBJ|ThiKK(?262aqhf-(tEz7{1U>iUNfNAIjZQqNb1N&d@B8@IiGeHJ|XK!(F z_iyp~8k|DkK@8iKx)uu~)x=}7|7y@p0E8F(t`RrUuP8GuEYsBfkZaN-Hu>`6uw_5M zCA7OQH^k$p4uhQ+)C)lhM5C(O<Pkqee&|cV<O-hZAApJs3~;_9Uo%(@X3iLXu=6*8 zP~6~1sdsXx%rP%7%wThm!A!bF=+NvehFS@LoU`ibYemj&ZM4T%!dAPC|BW;x7-eF- z`%eS}3&jKd-ysl#=st@MF2caS?l{!r;>W~H=D*0*>d<K$RSF2`<Plmb17h(6-gj~g zKwo^BWA3w&<cT4NoZP&=pd?q^_)E2ym}fQQ_%(i_tTCG!GS&>MBhvY@Yn_LDdgPRo z%DHUjr@N`uz>kZmT@&q?vP-B4G=@nLu%Xj_y+O@CU!w1MEJduWnJyuple`fOqtB4@ zQjoTq{VDS!qUleVL($cvcp1+IlkK<^UWxQi=tvHPRfqZzKi*ptes>alG<nfc-T%<k zEY?e;gzijp3J_V%f;^k?fE-{_5yHPRFa{?}`_uo54MO<81y&B@Vmt%X8>#vZ^>9?T zrT^tk_tbEgg3%)UrbiBx9rTzD!|j?n?^cN)ZgaoRhg{^g;4E`0P9?GZmqT>G{~t$6 zNGHU=PtYO6piIbsV!TSQ%)}u5Z-D7P4J-+)a12%yFW3Jayh#Oy@Z(^p;-TH8(${8g zZEl`n(3jMQ1w?$q4KB$x%L?9}W;aeW*?O7sOqcnemw{0O<=>1GFG1>UrLo-Tx?f_6 zrbg`x;-a^z`BSV2A)^m|u|*fU?1QCIM#PovKZ>mi*6Cqt{EViX7WtoR98}{8*E(yu zn?;8+l_9_0(9P4`{?9}hgJUo!bQ5EcpfE)7p5J*&T8Ivr#3twwu67EtS^7VqN2`;t zlbqaL;85fzx&6tHW=nl+<)~SRxEi@`O^-Yy&fl3Bvm>@PRa^gA(0R(BSUS*uDEg67 zY^5+=m9Q|cFcBt#-{Z^&(==+(dg(OeBYi3~IH?xgpFAHi7jBV*>4i?4NOy&UOu(c? zC&B=8{ePssOz0)XAVf9c{1zcZyL$*NeePsqL+e85AN=NjfH8-%JOKj+;EfLoz$isN zcD0p%EV)`==WVsw9*+qr{5Azo#9qf>Bgc}F5&p9vXA=IBk0Mo})cmJ~b*UyJ5hYvG zoV5^#nxg&4MoH?>MC>I;e@tp3h}<Rkd5sT)CpuX^-9`dBE&A&O!%PhN|9M@&Jb?e@ z#)$Z#$O$gIp1)q9>CxoGO#fmC)q>K9usCGSFtFLNp9M(<Z}*(k3=T(1pOz(C$67s9 zpVg%mn4^;W@wX3eAFSNZR!_E<dxV$UJiSZ9^J2wT8{%)yoxTcX2q`&nT<Z0t0uq(m z^6MUY1HR$UpkzXJGcVQtI_7rE5Fi3PwDznjqtL||#LDVzrFY_Rzq_36_Bgr&sg=eH zcKaF@27yF5EsJko4v|`i7@6+t7JeyjAzWb#a8b$qq(bz~y?clvHZo7HsN>-~H`%Lj zZk0SiJvw&cxEG$(-ZN%n@LFhQfKQ*)iCsxQAJ*m7Z<I0F%(9j{0oGlAG);^(;SXEV z_|aF*PJR|Ef$L}yw3#jMD5yv}76?Qr%`Fe>ZT2JEn0jH^B6V7N@`y_^$$3R<85$iF zsNQMQb9pP{(Gb5z?u{0^i70xGtFH5Ge0GEdH?j@EM<gNfg?*xm5Jn#!QH3i=zo9(8 zrHbGA47I>kD;i5hvK6c+<=yw~JHBo7k00b(0cc+l0V%S%(LMwD7N|Lb8$4!17l`hM z4q1scc!<rv3pRSGy;ie$4u*&2j!g<(`^WmMm*w*M>lkHZp*n*<>b;=6@4vj3=bY3P zeKn+Y$cc7D;<(QV?=xQ9RFh@LNt~#ttea}=?n9BNbjB@}a*XWNLkM`%wqq@%)X&T^ z%oDYTc94qq-ekdA+s4tD-7mOqJ>u!f4)&Vmos35`tz*05DMGCX%=9f8B0Vq+K2-K2 zP{Zq%Ewv6fWHxT^q>C?-*VC2muzOXy=4hl#Ju*8;C#E0?#_JLmaIA9Tph7!0-);k{ zSEeQFx_Zp)kbH8ut%_{7oXlZ$sGTylkM2t!wv1Wj*d=B+Y*|5`WKwR*-w@5-G{vUp zMTC;wiiT3ca%Mb9hrfD$ly+TQkhNRbk>JL1<QVoGFp6lgqv<TOk5;Zuo_(x-L|f*` z7yR$EM+YZ3Au#lb0Nh|Ol#Uw+0z<gzz(4?R-5LTTgNX>h%f-w6bV7Lnyr8EVZ$eBM z#(NQjF#>7=fJ05VxsX6O7z%?SVBBC61RMh40UJXB#!y~fC>#z3!jLcsF9={_41j~U zk;VWh0t$qJfC-t#7!(Nv;TW$_+)yrF7_SKu42J-Xp<o0Of&c=LKqwHv4S)iGAY(X! ziwlC}h4UbQya*r&f#fj;A)s&wFA~XZjD+x-K#aMN2woEyw}}ZC2x$TXa|4V4KoedF z1Oxy<o@_Be{-^y(3CwL`%msi0jh}|$K|+vlBot)==YHw}<ORXFczL;vjllq<F*l3{ zWCG@a0>D6SFpmirF9-xdAb}8sF%0r#G33c)7!nRQ;YA`KPzVCb!v*2t0rG%gNE2fi z?~?)oX##kH34@q$!Hkh6CdObS1kPh@!i|JNOt_&yUND#!0pSK9c~MYfAP9s2JyFLC zhMB;5xZx%+5P%y9hjN*iJW&Dx!@*#fu?Y+a0dj$Op(b2BKrj@}4Tb&ZiO?tH5Cj4U z2R@O=%LRS{VPeb+0C6GVFa#XNjQ~U7NT4y22Lj^deZmZYf*~ePzT<*GLEJn5C=ZH< z7r_Ms@^EuK6;I~#LLs0hM*^SNfWQ&Zr(RFvLwUGi;3q!<jX_8-;>kh~01hz*f}ePT zBe-EuZW!o^QZ60@7yttC!k^dzfsH|M2p9>1@j{>oFoFjFc(RC>8x8})zzC=@nCpoQ z6PPjZnF$OIta}%U;YOIi6^ZdYAvqmG6~%(XsYu5x!N<eJ1K<L1adSZdPjGdg#NsyA zjxdCythI>^9W&AjW^QR>Z)0W4%>#jonEvOM17TzJq^AV4Leeq+_xc|Nx+je%se%mx z=4ftXO~-8c|JI&_D)u(EhGI_Umd14d$;wEXTPB2LV6dY@66!KA3ZIInKPhe$kn2B9 z_70A8Pf42ple?h<@qoDh*T>>8^@{^_U36gEzSdyfOdN5@-G@#4()Xc1S(OgrzC%(v zYXjPijIEi~Bxz=++LjBp?OkPP`a=(OwLkztQ;uI~5v|ROukdpDCufzu<nS>uEe8yf z=QT2;n3gw(lXLk>HxBr%_)PtdYGQe>S{>3891rv>^2cR|i(<E8>}tl`4((0ZOh;P& zHaj))R-P@XbK2qmtp0HpZJ&%CYF)a?mL?XZDiCF0`_2(St?!RL`JBcPK<f81jn}{) zhu$)wbgg0ifG&_of*{)WU11{sn+97cahf+FC||L(Dc0@bk1#aJ^b>RCgmm=XT;{Km zQrzCk{4csi*bzhLy>yP68pk!UuOgmx9V-T^4Fsq+;;M2GBfh@w@2JDZC1Kdjo(N%d zA=)a;rHD!hvusipa<jcYT}+vx_Wty_7VG|VO?5<tzS9UTm5@!swhgC6Qz|P>hC0B& z3<aChSf2@|+8PMyI?H=~G?ei98IR!$iVepbH~xn*D<umz@=r<}MTu46n^LgIVSi&! z8J<?k05ihD3+Qu-vr=%2{X1Uk)s7({FTm2=uapzbj6Syjk($su9LxvFG&r%z67#tk z0=s+8D<E0beH~EJW<ahkNAb!Rvkuom0yU(czUdN+MdY@XI+ipa@Q$_HOl8f>KsTJe ziR9`#w}3`}kB+)^%xkf#DZZL*=XZ@sqi}_F=OoaW9)kGNrHM-_$86TPtw3dv_Iac) zxP!e6G2b`uBiW<Jx2E>XN2A-;`i&G#*kH`8x|w4Iw`o|&(U+<ER8q}GGVj}6KU7DX z=j@|$adn7*$1Av56Z_rXT63#e%8`xs+?buqb=5<~ZehTrpw93}{Mq_Z3RaLZYR2;t zt`1Vv%|SO`C$NIBM2(;_iMTm}vA%^*csn{fw>E4vq#Lsw(-i>BTQ#l^*6t5eLMq;z zd#Mg{EC=UJyAa@K9B&kQxv0&bp+;!LUF#ZL=kx!i8~x4nt)bj<e(>Zui^#asRe~Mv z-`q&l#efthR@()87yJeVd+!JQ1~~)XO{*}J7FGsS*lY;OuQ)|fUe(+E=Tf;MHP;nU zc+~mo|CR+#P5X2lVBuR0;ae*p&+mRND_j|-rar8<ucFq^!m<q5{C}`a5)I#%4!qbo z#u|4V5<Rk<z_Q+hn|g1mE~chtC?amg&rAt63hs91hqi_`|KbxY>!%Xf>~Ec}cv4YJ zhzg>-W`=26TLkXYg@ix5I#Ew^xI_;o=_I>2oLw<>e5X_D$bh~!{b!kV-gl!{F{*el zx^%!Jp@KRsG?)sD1*e>aQ2-ycKdYZ^MBiV{=UfVJj@TH|y~j}=_$ZV7MKHa{t&sHF z?I`+hK8YlJ23YQhX^OqO8f{t&UtIXf@feb{aF|gL^8Me&R#qj=T7SyOd|$B*c)a-7 zZv69OgS^Gj=JiGmh3@B1XMCIdF`gmWGU$KU60A@dk1gVmhWZ78o1gmFs)pY;=eYCB zl>>+BV%=FJulE{%eG@=boB6iee%(x}9S5o`>rfZm?KXhMTU;6(n78f~Mx4G6{zX^f zP#nog8&D@a<f-?YNb;QgdCq=;PJZx7(Mgc&wd;t-F7E<gtDCKO3{Mgt%kaRNa9Y~L zS(X!uuUx_Z>$NDKtpM+FSZu2SiR#(ajxQ{cfL&O(-M?hgqekS$fPK_m3)j`5jhOr) z_WMd1_ra%U)XpTLTZK6aVqtAO)x^CQ20a?4MN#8P!*$OQ2a4_Fb@*%^NMRW+X)y3^ zb^UC7RSEaQS|Yo~x#s?kcU6FtOOUO1a=;P_8rkxP8$1LcKGQbha!q1#$#$QiaAvw@ zR=-xgJ0uFG$?sR4LTAn}Ie+b>2=2mymkSKs?4=2=H6gXO`pdABgk(IUu68#(B(WLU zx<BAD;~d_aPkksqO2~XL-?~`JI!IVkq{KA}po%Yauc97?e|b%Qs-Ir!w2@?B`K1=s zv&d5^%97yGpoCj^R43^%Kz2AqR?1-ikIuZ+^{P==xJBLGRXSGE9#6jbYBl@&Q7Fg! ze)fD+`0;Viho15!(s{YF;ogLj4g4&(HU{7Y@1t>^d@e}{RM45tTKzpKw=~u}HIS?u zOYH6bY;a%y8382sNF&2#x`XIwK&J-9;ID(|^a^W=Y*#vRFP0?l(nvQc{l3489Rt{< zxH-G$$hwng`u?(+uzchl+F>qN6w`H*Gm!r*F8d%K+)~0OC$C~88pmR*&B7G-?ey@$ zp4}<mh2@PkP9BEIS(0-s8}pA{whL6*Mg{BdcoA*m1*#*n)m3_FwfrwZCGpOv+|1WW z`?Ks~aam;@(JvV7{TdldiZJuG(gQsD1`)51<osga|GxKZiSIrVh(B$Rbo(+{9O7Xi zbUB{3_&z@1)x4DTKUr!&USgifQ;$0v0`fcq-qwuT`u{ngU+jb{U2N#D7*C6p4rHs( z{9_EiO5PY*WGiG#-soENptQG>C1N<0LH<87sDuTDH2VcrS#1O7SqUNj40)ZAE5w#- z6;w?li~7O`&8G40<NVe|1=}vUL%XxFn+*m_sK(~?ZBsSV(vJ_Nhf0U_AKmk-4d(hB z_zN%er#T%<9R<=dnhFNU(}(|B%^Q?=c+x&7HJM}~N*z2UgY;7hP#H=$?I!%IF4qZ< zw;%HzM1o`1ebX_+kOrOX^(WFqRcEwxWKF>mf4>pNoAP(0mu0X8{UaKqX77j`xO10g zlTUfn5DqKMJxDf-ibo)4Pe=z`X1A;>hUQ(3E~^fU!!8#!YfWj6RIRFkU+cd-+h=QU zi<&a5ge)1^Dg67@iVEtY%}y#NEA6g&J5`oXV?Z(SLw3H3X*#G4SjEJ@*;9>PRuXw6 zMfopuGqyh7yNu#M&adg@-&|C~pREw@g0e7s;3YMmmXmhZPu<R+%U2akcaAG%)j|iX zj<;x2f8Q1@!;qi31`S^!>3Iw1=PHE^kF->+b=r&!wIyAeb5OfITH>E|s(<oUnj&ZM zBR+~K{Qc|m`%W7f(dzf9I{tH*=(cP;6H;Ai#85CX!RqJ!s9~$Q>DiA_r$iwS4|l#t zg%-~nX9stC#xDZSl9AO~i_(V&s~Mj??^ljhTOh(hZLaKwxPNhWvq}5Ng!%Z&Z47Jd z=N`P8=FT6kmT6IV0<9Y-qJociJ+#U+C|AAtF4p0C3yL)^>FHU{1KyB*$GrBBT(i>O zsYiN3hhmw>e_Qi5wHgS-H*&C(<&}k5V8qboFrgap$UoD_lAMl>{SE&^Z1v(Wb^Nlf z|6ZzSnQK%yl|buLc&tsqCuh-=Hg8W43(H4|CBvwUhs`L|qnk&O502r8gDs(Zk3fdY zB^|%bMKg}Qhzc2Ykiq%QuTHbgoYO=C`xwuaBbHxge|&k=9_FaZ_`Z$mZ7<%m6(_ZS zqkqK|3m98I9UT7##Bq0Ka_fjvJ{59vey^N6crZ-f8U*E!CHL;LH{0xLk~i~m2Bj-! z?VMfiZP+`YPRj0f#%!0s?=SO88q<S^g(=Cm`?eN)#ClS|1&2;4-^_Hcy`0Za@2gFv zQOq{M3JIZH+h11aregyhteT!x^CO%8Cg#VzOlXTHu-Kk9{(O|;R(jnsUa*ImcyeBn zPQa7Ro<$&RxCtTgw-qWkx;unlOx}Ots*^lh+lcc=y(yqPxUz-Mw`&<b{0oa!ObOPL z?-yxLK}`&}a@8mnE&oLKn9;=$o_kBOhKLqxc$OfPy;%)%d}uo2XMVigpl$xN^!fWh ztV>tXqw7UuDz<;~QLFH*=X|MlM=XWf(*4zX9aBNa`x$AQt*-moKp`7p5;a_R_gnF+ zXugUglt}shLQvGQ)trM$nW96lc11!2!DkqSfd=DX*yMoNBa`Nb9E(%dLQ6Rujyx_Y zpp06HLXsRJ@yjX@?L}UxCIdF0mtVAxUv8bK#9kdLB5B@MCn;E)_(ix@=2jpLDIDf2 z0laK^#dlr{UotmSx@atTNqlYb+K9yR!ixC|>MwY1`ke2=8W-><sDFa~E}$xt-TseA z@Ra@!J3TdxPc_t1RU*pHyIGlPxO0v(Q&kghZKilaN2jn5FHF-M>FS}{eytxV+n;l; zui#fy_P<G6NnO231J+l!p&d?tnQf`{KbuSBcZ13juSw+R*g7?`x|Yl0652V}hUZX= zqnv6#9C{uz;$_(|Ms#0#vHn=0irKFQngAF-8S0JaO|&xt@kICcJod3@^*NxIeN*ph z{=m=775vnpKt0ECDN5iASA+1Avif*R_N~@D!c>ZWt{v{U_}E?PY5j7=E!8QLV@UYB zpLV%|+O(fIUAXH<qx>kpoN<_^j42)dKyjC{P8S<{06V>@uzr}0^=bg#LM4`a-lbH& z{bDctOzV_zu<(|6EmPm}C)i(l4DWhmsc7pDxxM++q}^yVzwnDZJv)SqO1Wh~pVy#n zzPkImC&ed9-F<2PL}Q1|VI(Ckk4)=id(@7Cai%}s&u{?t$D9kP9(^g{Lh_uSqbRVL zoil|?@-5$`t^Ri3b=8$%ZlYQhZHmJuv!cB7&-AK-$p?3KdxQ#SjVg)uW_V4UIb|^a zJ+%r~Htln?;-6#^6_|}0rlsS4@jQZ&UvV@Q6Gx|bl0Oef@Keae<Of>0spHQ(6l(N& z?Yy>Bo-+NU(waF|A_VaUycOIi*+*S_OK8_<o00DSh=YZ5xV_?6_Y2~<K!|0ejMQS= z(3dE$WKcVq7fqRHh%%1NPcb>FU6sy~Ng2uG39r(~Nm4EZcLr}tSu*&mMfiOt4TK#y zshd%3sSXet>^k7Jh=0*j_46Ab62)sEjE@7v@4?w?Nu$V&s$>Ze&;C&%%2C}t%;*Yi zG?Nb8n!wCOnZ;}!Cw~n>+2d-0$|N5P53c<8>!Hq#lXHkr2>~yBnvNnraj+uJ9HNqa zpC`OwHnoQ+Vt5YdZ&=JLk~TiZGsic<heyaa`aP=X0vcdR!9yk^)p;ycDCaiVKQZ&h zFS&8-&xVRqxdml~8C%v*Ba}~&f9q|f{}R0Fm#89wQvBp)nGtP-&oF~|(r_9fy3<Io zO^GuVo(NS#$xJv+vf?W$Irq*zpCCZE-*bIw%l?hozbh&xZQ~=}Ozp*gu7-X~6EcEL z!>ws%M9=emmFDPqu5!E!9-miGz7;K^KA5tITILoIWeC50E;v%Y0YssG(u&nEVx9Lh z{iWkZ3&mM=vt%>T9a60&OQpq-+kF`IND$@rUvMD$5}M8E<4)mof^$;od$CSff)C16 z^-}h0fd3?mV&a2DzV)hR!H4~dBnCW-iPcpfXP07oN!J~_i@qHMT`8>yRFy72QL3lC zkMMb`nbB(yxb?wD!3(9(Wiso}daV^m^`T<I8}MPCn{uC==}^zk1<mG2lv3eS>NCrH z#dOy<TsSr&<f&%VVdI$bUrS9hNum^ekd?dW^1Jc`OYWs;z<}ro^2l&kF6;36JuVX} zPLl=Y$hV0H48t^_S`{C`DA)?tJaZx;UUFFR2?IpNVndorS{c;~>2Af(cX{y~-Jkq^ z=S5KL$@7AII~h7ExgvYv_)3d?1p?5!7umjB$6!H!U^Y&3txdp@pVf7*|C`wp@!=WS zLruk&t)S+OnX^TYmgth<g9|D43mWC1G@rri96ky97nV$$*<<5kpzw7q+Pw(0;jx+x z70@?Tg1+#Vm^`SYikD~kP!f~(SIYiupJ9d+XyH3mapsseqru-Wm^8a0+|q*U1$J#H z&P9yHYS8|*pD1VxW)rQ85UNrg;^%L^BVNP%z4YDQ5W9<Kf=&nQ-od|=(`<g+teA-= zlMRH9{}6psx%8)?B*&jDpB!y2k|Rw0ZPotzj=N{(TX#Ct+}G{i1-&sTTJa7Q?((nV z@+&dz>VcovKiV~{71-~Dv>acwt}Qq*s`&OEs8Hz(t<H+b1n=<b3Wj&z?N!*%DyKJt zC3xId1_`5SL??IJIdfi?xK>Bu`9rvgGa4c83n$vY82t*8pn;-scmg2Rg+FKnOmh?^ z=Fu*;1Z0Y+UrOjN4umx4b2|JD{bM?UZF*Lx;iJdN0Gxqu7)nGV`>~i9bn2^{Jny#F zA{N#n_6{O$X%L`R2z|c=u0}$Bwl;rR70h=-1Vr%g=wNeRtorEiFqYY;H~KCU!}Ui1 zdgjoQE1MJ{hZfryVI1KYAx0#2H4HN|d_y+imjxAyGH~@6=QGw<sA!Tga!S*;&vxMX zkzip-$BaY*4vTMsYl)4&XfCUuU;9v&Lg`g@ud9%nc@@F>jtafB_ScsnSHsFG^hjPR zG)C;j6-xMTH9VGIGwPh3twjA-4JtDJZ^cW1O=hPXV(26%9IWVr4CvH?7_#xU8n2zd zQsxGra>>H8Uv^6pM}y#F<N=ui_+QC&R!eM`mcS!|{aikBnQ5;1!4Fs39-2JQeY%M4 zV{jQyMevlqNQ*`yC@tR6Jh#<gvC|+Gv1joKrlBp&cBR<w{7yQ-r=v<6ihgXz{Ss@v z*w`SB6<f-a?$1XW+uBJzs;cL4$)4&W!&o~nP}>Sta`xEtp)|}i|Nh<+<xs>hjJ}h% zSRwVXw(MNIBK5T2XhLshOnDGN`3C}}sQ}E&9@%IGAAr9r0t-X9k}Eo7Nbr^-b60fq z1$*b#X?kHY-zlRteX4gTV#=S<^v1srqIzFnIQn)-JTV^LZ4_!{d@sT%0*;yZrjrSj zK%M*JDOJS^Wf!Q3ZTatC0Zr7h7kaxL==JD2nMhUGpXPZYJ0=HV7j^H#=)*f>HF3p! z>EuGYv1f1z<TEcb@?;U3uX2RT(#@|AM?J7f^$80{d^3sasPIU;mI>{%qU#~jKsL*7 zTs9Nrr2jHhbx$lC`clz4qwC&zV#pJ}L#;G%k_VNXiBNGf(J->48g<{ihQ-iL#n4~+ z(i%Iq<btv`#<axH@2MSEI%MS}eocnFyc(613$P$6Si3%^0j(Ia<2SE%AUY0zO)TjW zSEwR%&!1<Jf*8dh^g_ysvZo|3TSFCE%}>NDhyDfcSf>9~&pvEZay}m4dVVz`ha!_y zgJ|DuZ2x56FgIC=)RA8*@>o9MdDD2!cktB^cmo_L-|k)O8?3)Fs5h~N-Y*ZZX;?`} zf3kNSU95ST+S|}>DA)J4_qf=oL4g>;)h{(VBNGGP?4aWky8z#Pb8_=TC&c6lgeV;c zambaMy$6W_lu1Z~+1PHZ714VoQI5IP43O`^tMYGq_s~5Tr9$#`I}2ZkqH`umGkh$2 z)Sa^nl6HBG!+PM;DMi$Dp|b^uVOm;`s@IvM8;(%{U}0QHr3R`W$V&8%$n1498&Z5y zXCP<2T-1Lbq#lq+CY^t)?U79Bj^W9^YN31{j9|n2VrxXE)J9PeXhiaP0)-w2*f~}? zS)utxAY&;17KB3_JNT8Bxcb)neZt#qme*1uWWk2`R>v`5A^~ju%+DXLU+C`!x-j{@ zwG!T830hN%6O#FiSD7#EAx%~0U-dGxz(3e`qlY1ywYtomjzv~-D?3@-Ly#uq-Ywi8 zhv=`uRFKvskKV?QSNQthH>FT9<8m_V!J1Mr?JE%-TILk*M#U#yDF@NCK7$3uYXMp1 zlI3hD($6{Y%#gHHH-JhNG$TdI*o2LumD5fzT|VQ&%ke)_FOSijEUp#rL82kmzV~VL zX>pz;pulJL)1eFzZg=QYC$jw1TLxU?a(^a;u^rAmb;I38f<8ytcpalIhAyI5ADqR* zN@l49V~|vnEql2NPMp#@dHim`@~?9Q26~I$wa!+8lOLTBO%m9P;tY?>iJlh`&TXbe z8iw;lxobx;I~uOFWQ_-IH_c&M{CMMyF<*v+>s;2lRh+ei6GpttE>%V^4N{n=hF;S3 zJA0{tD0=gsaXB=-gwLVKVi)vX=7y^*EnG)5YxcjS%X`gg)zh5XM6=A2NSf|*1UpH0 z*1Q%IVo$ql9^xn4xM?i6`tdQPaHAz}>9S=r+23{kr+{I|H*vCG({a=6S#kypt{yE% zMX`%i1K#N=nEEcEmdomAOBsu4bda*hUMoIa%#w_|*t14c<+&u(gmvBOu5UQpgP~l3 zlD~Pb)jIwa!+0e?P;2RD!vZ!U|E+v=v4)K-dm;O)u|Hn=JH%_#rp~j9l>+nDDbeni zKMr@Xy@@jCX~uuXeUbr3hU}CYyF?nuCQIHHODzcaSJdm7Y7LML)yrFTkvP|`<@2Gw zQM|8fi>fsMdWAU1*IGVa^v&i}55!)ylUW;bd^zFVjytPz^B4m_u1#;GAGSCjE{`~S zW(;eGoP}?Wwg_%~Hj0lhL5nR|-rnDj@5mknb?*&lV|)GooB6|l@ct(c&yD&&X$>CW z|CiO^2LG=uHmQ@}+Ht;$JS`YGBYCV;S`V#%K~MfZO-$pIkXqr5PB75^mHVCMhaFP* z7T4JW@8hptLYiEO4RI+#n2*da0<lhRy9;k-TM)Utz7n{phL@!C&P1acL+Hnyyw0K; zs1s`(KMf>UKg9^l`G+A#e9PH0k+?ctHDypv)yryI<gq4JOZMif1z6T;+M8C4W9l1` z!X1&8E@!z&jIl-q|1|D-bM!L04$WnH6ASCqf$6{Ykw5_d*H#;Kb9W>i1elOtgz=7< z`EqygBLrkxa69~-es8YKoQ00LV>9I$Szrj7*y#E5>RUX0dlou_|Ln<mlknjO1_=fb zoWTDBg8~Hs(i!}(d=GGpUkO8%yzAtzXU^9ZgotP63IuOuW&Sfeo4$|w90jnlD!Y<S zs?;Df%oe?@ozzSroP9WzD#cLgUqeGzi;2m4WlCB~I~!pAg_HKC)`!g36<adM7^QYK zb(YOLgC>Onn4t|TsqXW+=zcsx6tKp0m&%r;a1gUc{P5e9&wz3qpY26SiwNbf^`d_I z<MXT*iG<Zj+Bnj=++xRwpJpj#<H6RWiOyzXO*L2q>-QG|&C?HFjk4-|nR>@_vUWV) zlYLgMe^}-0r5~3qu$H{WmIAIgYOYouG(0kBMmrY51=p96H_JCGCG}^w#F~OW%M)Qd kw;Z0#DG%u73v6xwvwA|W7y}m<#0vpHa6WvHRF?XG09OLyM*si- From 662049d8788018df7b61fa94607263603d1fcd81 Mon Sep 17 00:00:00 2001 From: RaktimaNXG <raktima.c@nxglabs.com> Date: Tue, 28 May 2024 09:50:38 +0530 Subject: [PATCH 054/106] fix: remove console --- apps/OpenSignServer/cloud/parsefunction/CreatePublicTemplate.js | 1 - apps/OpenSignServer/cloud/parsefunction/GetPublicUserName.js | 2 -- 2 files changed, 3 deletions(-) diff --git a/apps/OpenSignServer/cloud/parsefunction/CreatePublicTemplate.js b/apps/OpenSignServer/cloud/parsefunction/CreatePublicTemplate.js index e43d4450a..0da7fb0b7 100644 --- a/apps/OpenSignServer/cloud/parsefunction/CreatePublicTemplate.js +++ b/apps/OpenSignServer/cloud/parsefunction/CreatePublicTemplate.js @@ -30,7 +30,6 @@ export default async function CreatePublicTemplate(request) { }; } } catch (err) { - console.log('err', err); if (err.code == 209) { return { error: 'Invalid session token' }; } else { diff --git a/apps/OpenSignServer/cloud/parsefunction/GetPublicUserName.js b/apps/OpenSignServer/cloud/parsefunction/GetPublicUserName.js index 6ee4eadd9..3397739fc 100644 --- a/apps/OpenSignServer/cloud/parsefunction/GetPublicUserName.js +++ b/apps/OpenSignServer/cloud/parsefunction/GetPublicUserName.js @@ -4,10 +4,8 @@ async function GetPublicUserName(request) { const userQuery = new Parse.Query('contracts_Users'); userQuery.equalTo('UserName', userName); const res = await userQuery.first({ useMasterKey: true }); - console.log('res', res); return res; } catch (err) { - console.log('Err ', err); return err; } } From c491595fc8e633aebe56fea33cef38fb6ad5c11c Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <prafull.navkar@nxglabs.com> Date: Tue, 28 May 2024 18:56:56 +0530 Subject: [PATCH 055/106] Fix: issues in quick send --- apps/OpenSign/src/components/pdf/PdfHeader.js | 36 ++++++-- apps/OpenSign/src/json/ReportJson.js | 2 +- apps/OpenSign/src/pages/PdfRequestFiles.js | 5 +- .../src/primitives/GetReportDisplay.js | 83 ++++++++++++++++--- .../cloud/parsefunction/linkContactToDoc.js | 4 +- .../cloud/parsefunction/reportsJson.js | 7 ++ apps/OpenSignServer/index.js | 2 +- 7 files changed, 116 insertions(+), 23 deletions(-) diff --git a/apps/OpenSign/src/components/pdf/PdfHeader.js b/apps/OpenSign/src/components/pdf/PdfHeader.js index 4d6a280f9..ad230f29d 100644 --- a/apps/OpenSign/src/components/pdf/PdfHeader.js +++ b/apps/OpenSign/src/components/pdf/PdfHeader.js @@ -40,7 +40,7 @@ function Header({ signerPos && signerPos?.filter((data) => data.Role !== "prefill"); const isMobile = window.innerWidth < 767; const navigate = useNavigate(); - const [isCertificate, setIsCertificate] = useState(false); + const [isDownloading, setIsDownloading] = useState(""); const isGuestSigner = localStorage.getItem("isGuestSigner"); //for go to previous page function previousPage() { @@ -62,7 +62,7 @@ function Header({ //function for print digital sign pdf const handleToPrint = async (event) => { event.preventDefault(); - + setIsDownloading("pdf"); try { // const url = await Parse.Cloud.run("getsignedurl", { url: pdfUrl }); const axiosRes = await axios.post( @@ -93,10 +93,13 @@ function Header({ const blob = new Blob([byteArray], { type: "application/pdf" }); const blobUrl = URL.createObjectURL(blob); window.open(blobUrl, "_blank"); + setIsDownloading(""); } else { printModule({ printable: pdf, type: "pdf", base64: true }); + setIsDownloading(""); } } catch (err) { + setIsDownloading(""); console.log("err in getsignedurl", err); alert("something went wrong, please try again later."); } @@ -104,6 +107,7 @@ function Header({ //handle download signed pdf const handleDownloadPdf = async () => { + setIsDownloading("pdf"); const pdfName = pdfDetails[0] && pdfDetails[0].Name; try { // const url = await Parse.Cloud.run("getsignedurl", { url: pdfUrl }); @@ -120,8 +124,10 @@ function Header({ ); const url = axiosRes.data.result; saveAs(url, `${sanitizeFileName(pdfName)}_signed_by_OpenSign™.pdf`); + setIsDownloading(""); } catch (err) { console.log("err in getsignedurl", err); + setIsDownloading(""); alert("something went wrong, please try again later."); } }; @@ -142,7 +148,7 @@ function Header({ console.log("err in download in certificate", err); } } else { - setIsCertificate(true); + setIsDownloading("certificate"); try { const data = { docId: pdfDetails[0]?.objectId @@ -164,12 +170,13 @@ function Header({ await fetch(doc?.CertificateUrl); const certificateUrl = doc?.CertificateUrl; saveAs(certificateUrl, `Certificate_signed_by_OpenSign™.pdf`); - setIsCertificate(false); + setIsDownloading(""); } else { - setIsCertificate(true); + setIsDownloading("certificate"); } } } catch (err) { + setIsDownloading(""); console.log("err in download in certificate", err); alert("something went wrong, please try again later."); } @@ -628,12 +635,25 @@ function Header({ )} </div> )} + {isDownloading === "pdf" && ( + <div className="fixed z-[200] inset-0 flex justify-center items-center bg-black bg-opacity-30"> + <div + style={{ fontSize: "45px", color: "#3dd3e0" }} + className="loader-37" + ></div> + </div> + )} <ModalUi - isOpen={isCertificate} - title={"Generating certificate"} - handleClose={() => setIsCertificate(false)} + isOpen={isDownloading === "certificate"} + title={ + isDownloading === "certificate" + ? "Generating certificate" + : "PDF Download" + } + handleClose={() => setIsDownloading("")} > <div className="p-3 md:p-5 text-[13px] md:text-base text-center"> + {isDownloading === "certificate"}{" "} <p> Your completion certificate is being generated. Please wait momentarily. diff --git a/apps/OpenSign/src/json/ReportJson.js b/apps/OpenSign/src/json/ReportJson.js index 705ce8fb9..e0cceda69 100644 --- a/apps/OpenSign/src/json/ReportJson.js +++ b/apps/OpenSign/src/json/ReportJson.js @@ -3,7 +3,7 @@ export default function reportJson(id) { const head = ["Sr.No", "Title", "Note", "Folder", "File", "Owner", "Signers"]; const contactbook = ["Sr.No", "Title", "Email", "Phone"]; const dashboardReportHead = ["Title", "File", "Owner", "Signers"]; - const templateReport = ["Sr.No", "Title", "File", "Owner", "Signers"]; + const templateReport = ["Sr.No", "Title", "File", "Owner", "Roles"]; switch (id) { // draft documents report case "ByHuevtCFY": diff --git a/apps/OpenSign/src/pages/PdfRequestFiles.js b/apps/OpenSign/src/pages/PdfRequestFiles.js index 0cc5fb9c2..2b3a3f976 100644 --- a/apps/OpenSign/src/pages/PdfRequestFiles.js +++ b/apps/OpenSign/src/pages/PdfRequestFiles.js @@ -783,7 +783,10 @@ function PdfRequestFiles() { (x) => x.Email === jsonSender.email ); const newIndex = index + 1; - const user = pdfDetails?.[0].Signers[newIndex]; + const usermail = { + Email: pdfDetails?.[0]?.Placeholders[newIndex]?.email || "" + }; + const user = usermail || pdfDetails?.[0]?.Signers[newIndex]; if (sendmail !== "false" && sendInOrder) { const requestBody = pdfDetails?.[0]?.RequestBody; const requestSubject = pdfDetails?.[0]?.RequestSubject; diff --git a/apps/OpenSign/src/primitives/GetReportDisplay.js b/apps/OpenSign/src/primitives/GetReportDisplay.js index 88cb44c97..412cb6550 100644 --- a/apps/OpenSign/src/primitives/GetReportDisplay.js +++ b/apps/OpenSign/src/primitives/GetReportDisplay.js @@ -43,7 +43,7 @@ const ReportTable = (props) => { const [templateDeatils, setTemplateDetails] = useState({}); const [placeholders, setPlaceholders] = useState([]); const [isLoader, setIsLoader] = useState({}); - + const [isViewShare, setIsViewShare] = useState({}); const startIndex = (currentPage - 1) * props.docPerPage; const { isMoreDocs, setIsNextRecord } = props; // For loop is used to calculate page numbers visible below table @@ -340,9 +340,9 @@ const ReportTable = (props) => { await axios .put( - `${localStorage.getItem("baseUrl")}classes/${localStorage.getItem( - "_appName" - )}_Document/${item.objectId}`, + `${localStorage.getItem("baseUrl")}classes/contracts_Document/${ + item.objectId + }`, data, { headers: { @@ -578,9 +578,15 @@ const ReportTable = (props) => { }; try { const res = await axios.post(url, params, { headers: headers }); - if (res) { + if (res?.data?.result?.status === "success") { setIsAlert(true); setAlertMsg({ type: "success", message: "Mail sent successfully." }); + } else { + setIsAlert(true); + setAlertMsg({ + type: "danger", + message: "Something went wrong, please try again later!" + }); } } catch (err) { console.log("err in sendmail", err); @@ -681,6 +687,9 @@ const ReportTable = (props) => { setTimeout(() => setIsAlert(false), 1500); } }; + const handleViewSigners = (item) => { + setIsViewShare({ [item.objectId]: true }); + }; return ( <div className="relative"> {Object.keys(actLoader)?.length > 0 && ( @@ -835,7 +844,17 @@ const ReportTable = (props) => { {formatRow(item?.ExtUserPtr)} </td> <td className="px-4 py-2"> - {item?.Signers ? formatRow(item?.Signers) : "-"} + {/* {item?.Signers ? formatRow(item?.Signers) : "-"} */} + {item?.Placeholders ? ( + <button + onClick={() => handleViewSigners(item)} + className="text-[blue] hover:underline focus:outline-none" + > + View + </button> + ) : ( + "-" + )} </td> <td className="px-2 py-2 text-white flex flex-row gap-x-2 gap-y-1 justify-center items-center"> {props.actions?.length > 0 && @@ -865,19 +884,21 @@ const ReportTable = (props) => { )} {isOption[item.objectId] && act.action === "option" && ( - <div className="absolute -right-2 top-5 bg-white text-nowrap rounded shadow z-[20] overflow-hidden"> + <div className="absolute -right-2 top-5 p-1.5 bg-white text-nowrap rounded shadow-md z-[20] overflow-hidden"> {act.subaction?.map((subact) => ( <div key={subact.btnId} - className="hover:bg-gray-300 cursor-pointer px-2 py-1.5 flex justify-start items-center text-black" + className="hover:bg-gray-300 rounded cursor-pointer px-2 py-1.5 flex justify-start items-center text-black" onClick={() => handleActionBtn(subact, item) } title={subact.hoverLabel} > - <i className={subact.btnIcon}></i> + <i + className={`${subact.btnIcon} mr-1.5`} + ></i> {subact.btnLabel && ( - <span className="ml-[4px] text-xs capitalize"> + <span className="ml-[4px] text-[13px] capitalize font-medium"> {subact.btnLabel} </span> )} @@ -887,6 +908,48 @@ const ReportTable = (props) => { )} </button> ))} + {isViewShare[item.objectId] && ( + <div className="fixed z-[999] inset-0 w-full h-full bg-black bg-opacity-[75%]"> + <div className="fixed top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2 text-sm bg-white rounded shadow-md max-h-90 min-w-[90%] md:min-w-[400px] overflow-y-auto max-h-[340px] md:max-h-[400px] hide-scrollbar"> + <div + className="cursor-pointer absolute text-white text-[22px] font-medium rounded-full z-50 top-1 right-3" + onClick={() => setIsViewShare({})} + > + × + </div> + + <table className="table-auto w-full"> + <thead className="text-white h-[38px] sticky top-0 bg-[#32a3ac]"> + <tr> + {props.ReportName === "Templates" && ( + <th className="p-2">Roles</th> + )} + <th className="p-2">Signers</th> + </tr> + </thead> + <tbody> + {item.Placeholders.map((x, i) => ( + <tr + key={i} + className="text-sm font-normal text-black odd:bg-white even:bg-gray-200" + > + {props.ReportName === "Templates" && ( + <td className="text-[13px] md:text-sm font-semibold p-2 "> + {x.Role && x.Role} + </td> + )} + <td className="text-[13px] md:text-sm p-2 break-all"> + {x.email + ? x.email + : x?.signerPtr?.Email || "-"} + </td> + </tr> + ))} + </tbody> + </table> + </div> + </div> + )} {isDeleteModal[item.objectId] && ( <ModalUi isOpen diff --git a/apps/OpenSignServer/cloud/parsefunction/linkContactToDoc.js b/apps/OpenSignServer/cloud/parsefunction/linkContactToDoc.js index 5b0f03442..ddc7be964 100644 --- a/apps/OpenSignServer/cloud/parsefunction/linkContactToDoc.js +++ b/apps/OpenSignServer/cloud/parsefunction/linkContactToDoc.js @@ -99,8 +99,8 @@ export default async function linkContactToDoc(req) { }; updateDoc.set('Placeholders', Placeholders); const Acl = docRes.getACL(); - Acl.setReadAccess(existContact.get('CreatedBy').id, true); - Acl.setWriteAccess(existContact.get('CreatedBy').id, true); + Acl.setReadAccess(existContact.get('UserId').id, true); + Acl.setWriteAccess(existContact.get('UserId').id, true); updateDoc.setACL(Acl); // const parseData = JSON.parse(JSON.stringify(res)); const resDoc = await updateDoc.save(null, { useMasterKey: true }); diff --git a/apps/OpenSignServer/cloud/parsefunction/reportsJson.js b/apps/OpenSignServer/cloud/parsefunction/reportsJson.js index 229d0b64c..64c5cf522 100644 --- a/apps/OpenSignServer/cloud/parsefunction/reportsJson.js +++ b/apps/OpenSignServer/cloud/parsefunction/reportsJson.js @@ -27,6 +27,7 @@ export default function reportJson(id, userId) { 'Signers.Name', 'Signers.Email', 'Signers.Phone', + 'Placeholders', ], }; @@ -67,6 +68,7 @@ export default function reportJson(id, userId) { 'Signers.Phone', 'Signers.UserId', 'AuditTrail', + 'Placeholders', ], }; // In progess report @@ -131,6 +133,7 @@ export default function reportJson(id, userId) { 'Signers.Email', 'Signers.Phone', 'TimeToCompleteDays', + 'Placeholders', ], }; @@ -158,6 +161,7 @@ export default function reportJson(id, userId) { 'Signers.Name', 'Signers.Email', 'Signers.Phone', + 'Placeholders', ], }; // Expired Documents report @@ -188,6 +192,7 @@ export default function reportJson(id, userId) { 'Signers.Name', 'Signers.Email', 'Signers.Phone', + 'Placeholders', ], }; // Recently sent for signatures report show on dashboard @@ -259,6 +264,7 @@ export default function reportJson(id, userId) { 'AuditTrail', 'Signers.Email', 'Signers.Phone', + 'Placeholders', ], }; // Drafts report show on dashboard @@ -286,6 +292,7 @@ export default function reportJson(id, userId) { 'Signers.Name', 'Signers.Email', 'Signers.Phone', + 'Placeholders', ], }; // contact book report diff --git a/apps/OpenSignServer/index.js b/apps/OpenSignServer/index.js index 1b459fc3b..9f7ab88ac 100644 --- a/apps/OpenSignServer/index.js +++ b/apps/OpenSignServer/index.js @@ -101,7 +101,7 @@ export const config = { masterKey: process.env.MASTER_KEY, //Add your master key here. Keep it secret! masterKeyIps: ['0.0.0.0/0', '::/0'], // '::1' serverURL: 'http://localhost:8080/app', // Don't forget to change to https if needed - verifyUserEmails: isMailAdapter === true ? true : false, + verifyUserEmails: false, publicServerURL: process.env.SERVER_URL || 'http://localhost:8080/app', // Your apps name. This will appear in the subject and body of the emails that are sent. appName: 'Opensign', From 903d626c27438ba6e6bf6834f7e928ae840af60b Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <prafull.navkar@nxglabs.com> Date: Wed, 29 May 2024 13:05:57 +0530 Subject: [PATCH 056/106] fix: issue of something went wrong due to quick send --- apps/OpenSign/src/json/ReportJson.js | 2 +- apps/OpenSign/src/pages/PdfRequestFiles.js | 15 +++++++++++---- apps/OpenSign/src/pages/PlanSubscriptions.js | 13 +++++++++++-- apps/OpenSign/src/primitives/GetReportDisplay.js | 6 +++--- .../cloud/parsefunction/ZohoDetails.js | 15 +++++++++------ 5 files changed, 35 insertions(+), 16 deletions(-) diff --git a/apps/OpenSign/src/json/ReportJson.js b/apps/OpenSign/src/json/ReportJson.js index e0cceda69..705ce8fb9 100644 --- a/apps/OpenSign/src/json/ReportJson.js +++ b/apps/OpenSign/src/json/ReportJson.js @@ -3,7 +3,7 @@ export default function reportJson(id) { const head = ["Sr.No", "Title", "Note", "Folder", "File", "Owner", "Signers"]; const contactbook = ["Sr.No", "Title", "Email", "Phone"]; const dashboardReportHead = ["Title", "File", "Owner", "Signers"]; - const templateReport = ["Sr.No", "Title", "File", "Owner", "Roles"]; + const templateReport = ["Sr.No", "Title", "File", "Owner", "Signers"]; switch (id) { // draft documents report case "ByHuevtCFY": diff --git a/apps/OpenSign/src/pages/PdfRequestFiles.js b/apps/OpenSign/src/pages/PdfRequestFiles.js index 505b4b493..b0be26095 100644 --- a/apps/OpenSign/src/pages/PdfRequestFiles.js +++ b/apps/OpenSign/src/pages/PdfRequestFiles.js @@ -821,12 +821,19 @@ function PdfRequestFiles() { localStorage.getItem("parseAppId"), sessionToken: localStorage.getItem("accesstoken") }; - const objectId = user.objectId; + const objectId = user?.objectId; const hostUrl = window.location.origin; //encode this url value `${pdfDetails?.[0].objectId}/${user.Email}/${objectId}` to base64 using `btoa` function - const encodeBase64 = btoa( - `${pdfDetails?.[0].objectId}/${user.Email}/${objectId}` - ); + let encodeBase64; + if (objectId) { + encodeBase64 = btoa( + `${pdfDetails?.[0].objectId}/${user.Email}/${objectId}` + ); + } else { + encodeBase64 = btoa( + `${pdfDetails?.[0].objectId}/${user.Email}` + ); + } let signPdf = `${hostUrl}/login/${encodeBase64}`; const openSignUrl = "https://www.opensignlabs.com/contact-us"; diff --git a/apps/OpenSign/src/pages/PlanSubscriptions.js b/apps/OpenSign/src/pages/PlanSubscriptions.js index 1eeccd4ab..a8bfbd480 100644 --- a/apps/OpenSign/src/pages/PlanSubscriptions.js +++ b/apps/OpenSign/src/pages/PlanSubscriptions.js @@ -16,8 +16,17 @@ const PlanSubscriptions = () => { const navigate = useNavigate(); const [yearlyVisible, setYearlyVisible] = useState(false); const [isLoader, setIsLoader] = useState(true); - - const userDetails = JSON.parse(localStorage.getItem("userDetails")); + const extUser = + localStorage.getItem("Extand_Class") && + JSON.parse(localStorage.getItem("Extand_Class"))?.[0]; + const user = { + name: extUser?.Name, + email: extUser?.Email, + company: extUser?.Company, + phone: extUser?.Phone + }; + const userDetails = JSON.parse(localStorage.getItem("userDetails")) || user; + // console.log("userDetails ", userDetails); const name = userDetails && userDetails.name ? "first_name=" + encodeURIComponent(userDetails.name) diff --git a/apps/OpenSign/src/primitives/GetReportDisplay.js b/apps/OpenSign/src/primitives/GetReportDisplay.js index 412cb6550..e898384ad 100644 --- a/apps/OpenSign/src/primitives/GetReportDisplay.js +++ b/apps/OpenSign/src/primitives/GetReportDisplay.js @@ -922,7 +922,7 @@ const ReportTable = (props) => { <thead className="text-white h-[38px] sticky top-0 bg-[#32a3ac]"> <tr> {props.ReportName === "Templates" && ( - <th className="p-2">Roles</th> + <th className="p-2 pl-3">Roles</th> )} <th className="p-2">Signers</th> </tr> @@ -934,11 +934,11 @@ const ReportTable = (props) => { className="text-sm font-normal text-black odd:bg-white even:bg-gray-200" > {props.ReportName === "Templates" && ( - <td className="text-[13px] md:text-sm font-semibold p-2 "> + <td className="text-[12px] p-2 pl-3"> {x.Role && x.Role} </td> )} - <td className="text-[13px] md:text-sm p-2 break-all"> + <td className="text-[12px] p-2 break-all"> {x.email ? x.email : x?.signerPtr?.Email || "-"} diff --git a/apps/OpenSignServer/cloud/parsefunction/ZohoDetails.js b/apps/OpenSignServer/cloud/parsefunction/ZohoDetails.js index f8ec7fb17..e926877ab 100644 --- a/apps/OpenSignServer/cloud/parsefunction/ZohoDetails.js +++ b/apps/OpenSignServer/cloud/parsefunction/ZohoDetails.js @@ -26,12 +26,15 @@ export default async function ZohoDetails(request) { // console.log("Access Token:", res.data); if (res.data.access_token) { const hostedpages = request.params.hostedpagesId; - const userData = await axios.get('https://billing.zoho.in/api/v1/hostedpages/' + hostedpages, { - headers: { - Authorization: 'Zoho-oauthtoken ' + res.data.access_token, - 'X-com-zoho-subscriptions-organizationid': process.env.ZOHO_BILLING_ORG_ID, - }, - }); + const userData = await axios.get( + 'https://www.zohoapis.in/billing/v1/hostedpages/' + hostedpages, + { + headers: { + Authorization: 'Zoho-oauthtoken ' + res.data.access_token, + 'X-com-zoho-subscriptions-organizationid': process.env.ZOHO_BILLING_ORG_ID, + }, + } + ); const first_name = userData.data.data.subscription.contactpersons[0].first_name || ''; const last_name = userData.data.data.subscription.contactpersons[0].last_name || ''; From ae464274b0993b0193a64862009c8bee39b63eb0 Mon Sep 17 00:00:00 2001 From: RaktimaNXG <raktima.c@nxglabs.com> Date: Wed, 29 May 2024 15:55:07 +0530 Subject: [PATCH 057/106] fix: update ReportJson file --- apps/OpenSign/src/json/ReportJson.js | 8 -------- 1 file changed, 8 deletions(-) diff --git a/apps/OpenSign/src/json/ReportJson.js b/apps/OpenSign/src/json/ReportJson.js index fe21c8d55..f16efca1c 100644 --- a/apps/OpenSign/src/json/ReportJson.js +++ b/apps/OpenSign/src/json/ReportJson.js @@ -368,14 +368,6 @@ export default function reportJson(id) { redirectUrl: "", action: "bulksend" }, - { - btnId: "1835", - btnLabel: "Make public", - hoverLabel: "Make public", - btnIcon: "fa-solid fa-users-line", - redirectUrl: "", - action: "public" - }, { btnId: "1834", btnLabel: "Delete", From 634db83e8e83927609bef3c50563069554a21af5 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <prafull.navkar@nxglabs.com> Date: Wed, 29 May 2024 16:58:35 +0530 Subject: [PATCH 058/106] fix: duplicate contact are creatable, Update the the header 'Document signed' in the success message popup --- apps/OpenSign/src/components/AddSigner.js | 286 +++++++++--------- .../shared/fields/SuggestionInput.js | 4 +- apps/OpenSign/src/pages/Login.js | 12 +- apps/OpenSign/src/pages/PdfRequestFiles.js | 2 +- apps/OpenSign/src/pages/Signup.js | 6 +- apps/OpenSign/src/pages/SignyourselfPdf.js | 2 +- 6 files changed, 165 insertions(+), 147 deletions(-) diff --git a/apps/OpenSign/src/components/AddSigner.js b/apps/OpenSign/src/components/AddSigner.js index 5b0db6873..0e0c4e025 100644 --- a/apps/OpenSign/src/components/AddSigner.js +++ b/apps/OpenSign/src/components/AddSigner.js @@ -50,145 +50,163 @@ const AddSigner = (props) => { e.stopPropagation(); setIsLoader(true); if (localStorage.getItem("TenantId")) { - try { - const contactQuery = new Parse.Object("contracts_Contactbook"); - contactQuery.set("Name", name); - contactQuery.set("Phone", phone); - contactQuery.set("Email", email); - contactQuery.set("UserRole", "contracts_Guest"); - - contactQuery.set("TenantId", { - __type: "Pointer", - className: "partners_Tenant", - objectId: localStorage.getItem("TenantId") - }); - try { - const _users = Parse.Object.extend("User"); - const _user = new _users(); - _user.set("name", name); - _user.set("username", email); - _user.set("email", email); - _user.set("phone", phone); - _user.set("password", phone); - - const user = await _user.save(); - if (user) { - const roleurl = `${parseBaseUrl}functions/AddUserToRole`; - const headers = { - "Content-Type": "application/json", - "X-Parse-Application-Id": parseAppId, - sessionToken: localStorage.getItem("accesstoken") - }; - const body = { - appName: localStorage.getItem("_appName"), - roleName: "contracts_Guest", - userId: user.id - }; - await axios.post(roleurl, body, { headers: headers }); - const currentUser = Parse.User.current(); - contactQuery.set( - "CreatedBy", - Parse.User.createWithoutData(currentUser.id) - ); - - contactQuery.set("UserId", user); - const acl = new Parse.ACL(); - acl.setPublicReadAccess(true); - acl.setPublicWriteAccess(true); - acl.setReadAccess(currentUser.id, true); - acl.setWriteAccess(currentUser.id, true); - - contactQuery.setACL(acl); - - const res = await contactQuery.save(); - - const parseData = JSON.parse(JSON.stringify(res)); - if (props.details) { - props.details({ - value: parseData[props.valueKey], - label: parseData[props.displayKey] - }); - } - if (props.closePopup) { - props.closePopup(); - } - if (props.handleUserData) { - props.handleUserData(parseData); + const user = Parse.User.current(); + const query = new Parse.Query("contracts_Contactbook"); + query.equalTo("CreatedBy", user); + query.notEqualTo("IsDeleted", true); + query.equalTo("Email", email); + const res = await query.first(); + // console.log(res); + if (!res) { + const contactQuery = new Parse.Object("contracts_Contactbook"); + contactQuery.set("Name", name); + if (phone) { + contactQuery.set("Phone", phone); } + contactQuery.set("Email", email); + contactQuery.set("UserRole", "contracts_Guest"); + contactQuery.set("TenantId", { + __type: "Pointer", + className: "partners_Tenant", + objectId: localStorage.getItem("TenantId") + }); + + try { + const _users = Parse.Object.extend("User"); + const _user = new _users(); + _user.set("name", name); + _user.set("username", email); + _user.set("email", email); + if (phone) { + _user.set("phone", phone); + _user.set("password", phone); + } else { + _user.set("password", email); + } + const user = await _user.save(); + if (user) { + const roleurl = `${parseBaseUrl}functions/AddUserToRole`; + const headers = { + "Content-Type": "application/json", + "X-Parse-Application-Id": parseAppId, + sessionToken: localStorage.getItem("accesstoken") + }; + const body = { + appName: localStorage.getItem("_appName"), + roleName: "contracts_Guest", + userId: user.id + }; + await axios.post(roleurl, body, { headers: headers }); + const currentUser = Parse.User.current(); + contactQuery.set( + "CreatedBy", + Parse.User.createWithoutData(currentUser.id) + ); + + contactQuery.set("UserId", user); + const acl = new Parse.ACL(); + acl.setPublicReadAccess(true); + acl.setPublicWriteAccess(true); + acl.setReadAccess(currentUser.id, true); + acl.setWriteAccess(currentUser.id, true); + + contactQuery.setACL(acl); + + const res = await contactQuery.save(); + + const parseData = JSON.parse(JSON.stringify(res)); + if (props.details) { + props.details({ + value: parseData[props.valueKey], + label: parseData[props.displayKey] + }); + } + if (props.closePopup) { + props.closePopup(); + } + if (props.handleUserData) { + props.handleUserData(parseData); + } + + setIsLoader(false); + // Reset the form fields + setAddYourself(false); + setName(""); + setPhone(""); + setEmail(""); + } + } catch (err) { + console.log("err ", err); + if (err.code === 202) { + const params = { email: email }; + const userRes = await Parse.Cloud.run("getUserId", params); + const roleurl = `${parseBaseUrl}functions/AddUserToRole`; + const headers = { + "Content-Type": "application/json", + "X-Parse-Application-Id": parseAppId, + sessionToken: localStorage.getItem("accesstoken") + }; + const body = { + appName: localStorage.getItem("_appName"), + roleName: "contracts_Guest", + userId: userRes.id + }; + await axios.post(roleurl, body, { headers: headers }); + const currentUser = Parse.User.current(); + contactQuery.set( + "CreatedBy", + Parse.User.createWithoutData(currentUser.id) + ); + + contactQuery.set("UserId", { + __type: "Pointer", + className: "_User", + objectId: userRes.id + }); + const acl = new Parse.ACL(); + acl.setPublicReadAccess(true); + acl.setPublicWriteAccess(true); + acl.setReadAccess(currentUser.id, true); + acl.setWriteAccess(currentUser.id, true); + + contactQuery.setACL(acl); + const res = await contactQuery.save(); + + const parseData = JSON.parse(JSON.stringify(res)); + if (props.details) { + props.details({ + value: parseData[props.valueKey], + label: parseData[props.displayKey] + }); + } + if (props.closePopup) { + props.closePopup(); + } + if (props.handleUserData) { + props.handleUserData(parseData); + } + setIsLoader(false); + // Reset the form fields + setAddYourself(false); + setName(""); + setPhone(""); + setEmail(""); + } + } + } else { + alert("Contact already exist!"); setIsLoader(false); - // Reset the form fields - setAddYourself(false); - setName(""); - setPhone(""); - setEmail(""); } } catch (err) { - console.log("err ", err); - if (err.code === 202) { - const params = { email: email }; - const userRes = await Parse.Cloud.run("getUserId", params); - const roleurl = `${parseBaseUrl}functions/AddUserToRole`; - const headers = { - "Content-Type": "application/json", - "X-Parse-Application-Id": parseAppId, - sessionToken: localStorage.getItem("accesstoken") - }; - const body = { - appName: localStorage.getItem("_appName"), - roleName: "contracts_Guest", - userId: userRes.id - }; - await axios.post(roleurl, body, { headers: headers }); - const currentUser = Parse.User.current(); - contactQuery.set( - "CreatedBy", - Parse.User.createWithoutData(currentUser.id) - ); - - contactQuery.set("UserId", { - __type: "Pointer", - className: "_User", - objectId: userRes.id - }); - const acl = new Parse.ACL(); - acl.setPublicReadAccess(true); - acl.setPublicWriteAccess(true); - acl.setReadAccess(currentUser.id, true); - acl.setWriteAccess(currentUser.id, true); - - contactQuery.setACL(acl); - const res = await contactQuery.save(); - - const parseData = JSON.parse(JSON.stringify(res)); - if (props.details) { - props.details({ - value: parseData[props.valueKey], - label: parseData[props.displayKey] - }); - } - if (props.closePopup) { - props.closePopup(); - } - if (props.handleUserData) { - props.handleUserData(parseData); - } - setIsLoader(false); - // Reset the form fields - setAddYourself(false); - setName(""); - setPhone(""); - setEmail(""); - } + console.log("err in fetch contact", err); + setIsLoader(false); + alert("something went wrong, please try again later"); } - } catch (err) { - // console.log("err", err); + } else { setIsLoader(false); - alert("something went wrong!"); - } - }else{ - alert('something went wrong, please try again later') + alert("something went wrong, please try again later"); } }; @@ -266,10 +284,10 @@ const AddSigner = (props) => { type="email" id="email" value={email} - onChange={(e) => setEmail(e.target.value)} + onChange={(e) => setEmail(e.target.value?.toLowerCase())} required disabled={addYourself} - className="px-3 py-2 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs" + className="px-3 py-2 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs lowercase" /> </div> <div className="mb-3"> @@ -278,14 +296,12 @@ const AddSigner = (props) => { className="block text-xs text-gray-700 font-semibold" > Phone - <span style={{ color: "red", fontSize: 13 }}> *</span> </label> <input type="text" id="phone" value={phone} onChange={(e) => setPhone(e.target.value)} - required disabled={addYourself} className="px-3 py-2 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs" /> diff --git a/apps/OpenSign/src/components/shared/fields/SuggestionInput.js b/apps/OpenSign/src/components/shared/fields/SuggestionInput.js index aaefb2b30..62ccab508 100644 --- a/apps/OpenSign/src/components/shared/fields/SuggestionInput.js +++ b/apps/OpenSign/src/components/shared/fields/SuggestionInput.js @@ -41,7 +41,7 @@ const SuggestionInput = (props) => { const handleInputChange = async (e) => { const value = e.target.value; - setInputValue(value); + setInputValue(value?.toLowerCase()); if (props.onChange) { props.onChange(value); } @@ -67,7 +67,7 @@ const SuggestionInput = (props) => { value={inputValue} onChange={handleInputChange} placeholder="Enter Email..." - className="w-full border-[1px] border-gray-400 p-2 text-black rounded" + className="w-full border-[1px] border-gray-400 p-2 text-black rounded lowercase" required={props.required} /> {showSuggestions && ( diff --git a/apps/OpenSign/src/pages/Login.js b/apps/OpenSign/src/pages/Login.js index 5d2886564..24ef4f7b8 100644 --- a/apps/OpenSign/src/pages/Login.js +++ b/apps/OpenSign/src/pages/Login.js @@ -263,7 +263,7 @@ function Login() { const LocalUserDetails = { name: results[0].get("Name"), email: results[0].get("Email"), - phone: results[0].get("Phone"), + phone: results[0]?.get("Phone") || "", company: results[0].get("Company") }; localStorage.setItem( @@ -317,7 +317,7 @@ function Login() { const LocalUserDetails = { name: _user.name, email: email, - phone: _user.phone + phone: _user?.phone || "" // company: results.get("Company"), }; localStorage.setItem( @@ -868,7 +868,7 @@ function Login() { const LocalUserDetails = { name: results[0].get("Name"), email: results[0].get("Email"), - phone: results[0].get("Phone"), + phone: results[0]?.get("Phone") || "", company: results[0].get("Company") }; localStorage.setItem( @@ -905,7 +905,7 @@ function Login() { const LocalUserDetails = { name: results[0].get("Name"), email: results[0].get("Email"), - phone: results[0].get("Phone") + phone: results[0]?.get("Phone") || "" // company: results.get("Company"), }; localStorage.setItem( @@ -982,7 +982,7 @@ function Login() { userDetails: { name: userInformation.name, email: userInformation.email, - phone: userInformation.phone, + phone: userInformation?.phone || "", role: "contracts_User", company: userDetails.Company, jobTitle: userDetails.Destination @@ -994,7 +994,7 @@ function Login() { const LocalUserDetails = { name: userInformation.name, email: userInformation.email, - phone: userInformation.phone, + phone: userInformation?.phone || "", company: userDetails.Company, jobTitle: userDetails.JobTitle }; diff --git a/apps/OpenSign/src/pages/PdfRequestFiles.js b/apps/OpenSign/src/pages/PdfRequestFiles.js index b0be26095..5db2c30ae 100644 --- a/apps/OpenSign/src/pages/PdfRequestFiles.js +++ b/apps/OpenSign/src/pages/PdfRequestFiles.js @@ -1574,7 +1574,7 @@ function PdfRequestFiles() { {/* this modal is used show this document is already sign */} <ModalUi isOpen={isCompleted.isModal} - title={"Sign Documents"} + title={"Document signed"} handleClose={() => { setIsCompleted((prev) => ({ ...prev, isModal: false })); }} diff --git a/apps/OpenSign/src/pages/Signup.js b/apps/OpenSign/src/pages/Signup.js index 673bdea3a..24b437d47 100644 --- a/apps/OpenSign/src/pages/Signup.js +++ b/apps/OpenSign/src/pages/Signup.js @@ -562,9 +562,11 @@ const Signup = () => { <input id="email" type="text" - className="px-3 py-2 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs" + className="px-3 py-2 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs lowercase" value={email} - onChange={(e) => setEmail(e.target.value)} + onChange={(e) => + setEmail(e.target.value?.toLowerCase()) + } required /> <hr className="my-2 border-none" /> diff --git a/apps/OpenSign/src/pages/SignyourselfPdf.js b/apps/OpenSign/src/pages/SignyourselfPdf.js index fda577946..39fdfa1e9 100644 --- a/apps/OpenSign/src/pages/SignyourselfPdf.js +++ b/apps/OpenSign/src/pages/SignyourselfPdf.js @@ -1192,7 +1192,7 @@ function SignYourSelf() { {/* this modal is used show this document is already sign */} <ModalUi isOpen={showAlreadySignDoc.status} - title={"Sign Documents"} + title={"Document signed"} handleClose={() => { setShowAlreadySignDoc({ status: false }); }} From 6f50de1ef1a39d409dc4aca0f48a9576a0f08a52 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <prafull.navkar@nxglabs.com> Date: Wed, 29 May 2024 17:55:22 +0530 Subject: [PATCH 059/106] fix: make phone field optional for contact --- apps/OpenSign/src/components/AddSigner.js | 6 ++-- apps/OpenSign/src/components/AddUser.js | 6 ++-- apps/OpenSign/src/components/LoginFacebook.js | 10 +++--- apps/OpenSign/src/components/LoginGoogle.js | 10 +++--- apps/OpenSign/src/pages/Pgsignup.js | 6 ++-- apps/OpenSign/src/pages/PlaceHolderSign.js | 4 +-- apps/OpenSign/src/pages/UserProfile.js | 8 ++--- apps/OpenSign/src/primitives/AddUser.js | 12 ++++--- .../src/primitives/GetReportDisplay.js | 12 +++---- .../cloud/customRoute/autoReminder.js | 4 +-- .../v1/routes/CreateDocumentWithTemplate.js | 10 ++++-- .../customRoute/v1/routes/createContact.js | 16 +++++---- .../v1/routes/createDocumentwithCoordinate.js | 6 ++-- .../v1/routes/createTemplatewithCoordinate.js | 2 +- .../cloud/customRoute/v1/routes/getContact.js | 2 +- .../customRoute/v1/routes/getContactList.js | 2 +- .../cloud/customRoute/v1/routes/getUser.js | 2 +- .../cloud/customRoute/v1/routes/resendMail.js | 4 +-- .../parsefunction/ContractUsersAftersave.js | 4 ++- .../cloud/parsefunction/FacebookSign.js | 32 ++++++++--------- .../cloud/parsefunction/GoogleSign.js | 36 +++++++++---------- .../cloud/parsefunction/ZohoDetails.js | 2 +- .../cloud/parsefunction/linkContactToDoc.js | 4 +-- .../cloud/parsefunction/pdf/PDF.js | 4 +-- .../cloud/parsefunction/usersignup.js | 12 +++++-- 25 files changed, 117 insertions(+), 99 deletions(-) diff --git a/apps/OpenSign/src/components/AddSigner.js b/apps/OpenSign/src/components/AddSigner.js index 0e0c4e025..c99eff406 100644 --- a/apps/OpenSign/src/components/AddSigner.js +++ b/apps/OpenSign/src/components/AddSigner.js @@ -23,7 +23,7 @@ const AddSigner = (props) => { ); if (savedUserDetails && addYourself) { setName(savedUserDetails.name); - setPhone(savedUserDetails.phone); + setPhone(savedUserDetails?.phone || ""); setEmail(savedUserDetails.email); } }, [addYourself]); @@ -79,11 +79,9 @@ const AddSigner = (props) => { _user.set("name", name); _user.set("username", email); _user.set("email", email); + _user.set("password", email); if (phone) { _user.set("phone", phone); - _user.set("password", phone); - } else { - _user.set("password", email); } const user = await _user.save(); if (user) { diff --git a/apps/OpenSign/src/components/AddUser.js b/apps/OpenSign/src/components/AddUser.js index d812a1cd0..8d40db895 100644 --- a/apps/OpenSign/src/components/AddUser.js +++ b/apps/OpenSign/src/components/AddUser.js @@ -62,8 +62,10 @@ const AddUser = (props) => { _user.set("name", name); _user.set("username", email); _user.set("email", email); - _user.set("phone", phone); - _user.set("password", phone); + _user.set("password", email); + if (phone) { + _user.set("phone", phone); + } const user = await _user.save(); if (user) { diff --git a/apps/OpenSign/src/components/LoginFacebook.js b/apps/OpenSign/src/components/LoginFacebook.js index 033208d57..f9ca16a30 100644 --- a/apps/OpenSign/src/components/LoginFacebook.js +++ b/apps/OpenSign/src/components/LoginFacebook.js @@ -49,7 +49,7 @@ const LoginFacebook = ({ const extRes = await Parse.Cloud.run("getUserDetails", params); // console.log("extRes ", extRes); if (extRes) { - const params = { ...details, Phone: extRes.get("Phone") }; + const params = { ...details, Phone: extRes?.get("Phone") || "" }; const payload = await Parse.Cloud.run("facebooksign", params); // console.log("payload ", payload); if (payload && payload.sessiontoken) { @@ -59,7 +59,7 @@ const LoginFacebook = ({ const LocalUserDetails = { name: details.Name, email: details.Email, - phone: extRes.get("Phone"), + phone: extRes?.get("Phone") || "", company: extRes.get("Company") }; localStorage.setItem("userDetails", JSON.stringify(LocalUserDetails)); @@ -75,7 +75,7 @@ const LoginFacebook = ({ const handleSubmitbtn = async () => { if (userDetails.Phone && userDetails.Company) { setThirdpartyLoader(true); - const params = { ...fBDetails, Phone: userDetails.Phone }; + const params = { ...fBDetails, Phone: userDetails?.Phone || "" }; const payload = await Parse.Cloud.run("facebooksign", params); // console.log("payload ", payload); @@ -85,7 +85,7 @@ const LoginFacebook = ({ name: userDetails.Name, email: userDetails.Email, // "passsword":userDetails.Phone, - phone: userDetails.Phone, + phone: userDetails?.Phone || "", role: "contracts_User", company: userDetails.Company } @@ -96,7 +96,7 @@ const LoginFacebook = ({ const LocalUserDetails = { name: userDetails.Name, email: userDetails.Email, - phone: userDetails.Phone, + phone: userDetails?.Phone || "", company: userDetails.Company }; localStorage.setItem("userDetails", JSON.stringify(LocalUserDetails)); diff --git a/apps/OpenSign/src/components/LoginGoogle.js b/apps/OpenSign/src/components/LoginGoogle.js index 469352b52..7bb53017b 100644 --- a/apps/OpenSign/src/components/LoginGoogle.js +++ b/apps/OpenSign/src/components/LoginGoogle.js @@ -110,7 +110,7 @@ const GoogleSignInBtn = ({ const extRes = await Parse.Cloud.run("getUserDetails", params); // console.log("extRes ", extRes); if (extRes) { - const params = { ...details, Phone: extRes.get("Phone") }; + const params = { ...details, Phone: extRes?.get("Phone") || "" }; const payload = await Parse.Cloud.run("googlesign", params); // console.log("payload ", payload); if (payload && payload.sessiontoken) { @@ -121,7 +121,7 @@ const GoogleSignInBtn = ({ const LocalUserDetails = { name: details.Name, email: details.Gmail, - phone: extRes.get("Phone"), + phone: extRes?.get("Phone") || "", company: extRes.get("Company") }; localStorage.setItem("userDetails", JSON.stringify(LocalUserDetails)); @@ -139,7 +139,7 @@ const GoogleSignInBtn = ({ setThirdpartyLoader(true); // e.preventDefault() // console.log("handelSubmit", userDetails); - const params = { ...googleDetails, Phone: userDetails.Phone }; + const params = { ...googleDetails, Phone: userDetails?.Phone }; const payload = await Parse.Cloud.run("googlesign", params); // console.log("payload ", payload); @@ -149,7 +149,7 @@ const GoogleSignInBtn = ({ name: userDetails.Name, email: userDetails.Email, // "passsword":userDetails.Phone, - phone: userDetails.Phone, + phone: userDetails?.Phone || "", role: "contracts_User", company: userDetails.Company, jobTitle: userDetails.Destination @@ -161,7 +161,7 @@ const GoogleSignInBtn = ({ const LocalUserDetails = { name: userDetails.Name, email: userDetails.Email, - phone: userDetails.Phone, + phone: userDetails?.Phone || "", company: userDetails.Company // jobTitle: userDetails.JobTitle }; diff --git a/apps/OpenSign/src/pages/Pgsignup.js b/apps/OpenSign/src/pages/Pgsignup.js index f0310adce..3570e25b5 100644 --- a/apps/OpenSign/src/pages/Pgsignup.js +++ b/apps/OpenSign/src/pages/Pgsignup.js @@ -127,7 +127,9 @@ const PgSignUp = () => { user.set("username", zohoRes.data.result.email); user.set("password", obj.password); user.set("email", zohoRes.data.result.email); - user.set("phone", zohoRes.data.result.phone); + if (zohoRes?.data?.result?.phone) { + user.set("phone", zohoRes.data.result.phone); + } user.set("name", zohoRes.data.result.name); const res = await user.signUp(); @@ -140,7 +142,7 @@ const PgSignUp = () => { company: zohoRes.data.result.company, name: zohoRes.data.result.name, email: zohoRes.data.result.email, - phone: zohoRes.data.result.phone, + phone: zohoRes?.data?.result?.phone || "", role: obj.role }, subscription: zohoRes.data.result.subscription diff --git a/apps/OpenSign/src/pages/PlaceHolderSign.js b/apps/OpenSign/src/pages/PlaceHolderSign.js index a705d9525..6e9fa46a9 100644 --- a/apps/OpenSign/src/pages/PlaceHolderSign.js +++ b/apps/OpenSign/src/pages/PlaceHolderSign.js @@ -1108,10 +1108,10 @@ function PlaceHolderSign() { document_title: documentName, sender_name: senderName, sender_mail: senderEmail, - sender_phone: senderPhone, + sender_phone: senderPhone || "", receiver_name: signerMail[i].Name, receiver_email: signerMail[i].Email, - receiver_phone: signerMail[i].Phone, + receiver_phone: signerMail[i]?.Phone || "", expiry_date: localExpireDate, company_name: orgName, signing_url: `<a href=${signPdf}>Sign here</a>` diff --git a/apps/OpenSign/src/pages/UserProfile.js b/apps/OpenSign/src/pages/UserProfile.js index 813d8ab52..6b7cd6172 100644 --- a/apps/OpenSign/src/pages/UserProfile.js +++ b/apps/OpenSign/src/pages/UserProfile.js @@ -86,7 +86,7 @@ function UserProfile() { await query.get(UserProfile.objectId).then((object) => { object.set("name", name); object.set("ProfilePic", Image); - object.set("phone", phn); + object.set("phone", phn || ""); object.save().then( async (response) => { @@ -95,11 +95,11 @@ function UserProfile() { let rr = JSON.stringify(res); localStorage.setItem("UserInformation", rr); SetName(res.name); - SetPhone(res.phone); + SetPhone(res?.phone || ""); setImage(res.ProfilePic); localStorage.setItem("username", res.name); localStorage.setItem("profileImg", res.ProfilePic); - await updateExtUser({ Name: res.name, Phone: res.phone }); + await updateExtUser({ Name: res.name, Phone: res?.phone || "" }); alert("Profile updated successfully."); setEditMode(false); navigate("/dashboard/35KBoSgoAK"); @@ -124,7 +124,7 @@ function UserProfile() { const ExtUserId = extData[0].objectId; const body = { - Phone: obj.Phone, + Phone: obj?.Phone || "", Name: obj.Name, HeaderDocId: isDisableDocId, JobTitle: jobTitle, diff --git a/apps/OpenSign/src/primitives/AddUser.js b/apps/OpenSign/src/primitives/AddUser.js index ee24e8ce0..c62fe11eb 100644 --- a/apps/OpenSign/src/primitives/AddUser.js +++ b/apps/OpenSign/src/primitives/AddUser.js @@ -21,7 +21,7 @@ const AddUser = (props) => { ); if (savedUserDetails && addYourself) { setName(savedUserDetails.name); - setPhone(savedUserDetails.phone); + setPhone(savedUserDetails?.phone || ""); setEmail(savedUserDetails.email); } }, [addYourself]); @@ -68,8 +68,10 @@ const AddUser = (props) => { _user.set("name", name); _user.set("username", email); _user.set("email", email); - _user.set("phone", phone); - _user.set("password", phone); + if (phone) { + _user.set("phone", phone); + } + _user.set("email", email); const user = await _user.save(); if (user) { @@ -245,10 +247,10 @@ const AddUser = (props) => { type="email" id="email" value={email} - onChange={(e) => setEmail(e.target.value)} + onChange={(e) => setEmail(e.target.value?.toLowerCase())} required disabled={addYourself} - className="addUserInput" + className="addUserInput lowercase" /> </div> <div className="form-section"> diff --git a/apps/OpenSign/src/primitives/GetReportDisplay.js b/apps/OpenSign/src/primitives/GetReportDisplay.js index e898384ad..2daf17a70 100644 --- a/apps/OpenSign/src/primitives/GetReportDisplay.js +++ b/apps/OpenSign/src/primitives/GetReportDisplay.js @@ -480,10 +480,10 @@ const ReportTable = (props) => { document_title: doc.Name, sender_name: doc.ExtUserPtr.Name, sender_mail: doc.ExtUserPtr.Email, - sender_phone: doc.ExtUserPtr.Phone, + sender_phone: doc.ExtUserPtr?.Phone || "", receiver_name: userDetails.Name, receiver_email: userDetails.Email, - receiver_phone: userDetails.Phone, + receiver_phone: userDetails?.Phone || "", expiry_date: localExpireDate, company_name: doc.ExtUserPtr.Company, signing_url: `<a href=${signPdf}>Sign here</a>` @@ -509,10 +509,10 @@ const ReportTable = (props) => { document_title: doc.Name, sender_name: doc.ExtUserPtr.Name, sender_mail: doc.ExtUserPtr.Email, - sender_phone: doc.ExtUserPtr.Phone, + sender_phone: doc.ExtUserPtr?.Phone || "", receiver_name: userDetails.Name, receiver_email: userDetails.Email, - receiver_phone: userDetails.Phone, + receiver_phone: userDetails?.Phone || "", expiry_date: localExpireDate, company_name: doc.ExtUserPtr.Company, signing_url: `<a href=${signPdf}>Sign here</a>` @@ -540,10 +540,10 @@ const ReportTable = (props) => { document_title: doc.Name, sender_name: doc.ExtUserPtr.Name, sender_mail: doc.ExtUserPtr.Email, - sender_phone: doc.ExtUserPtr.Phone, + sender_phone: doc.ExtUserPtr?.Phone || "", receiver_name: user.Name, receiver_email: user.Email, - receiver_phone: user.Phone, + receiver_phone: user?.Phone || "", expiry_date: localExpireDate, company_name: doc?.ExtUserPtr?.Company || "", signing_url: `<a href=${signPdf}>Sign here</a>` diff --git a/apps/OpenSignServer/cloud/customRoute/autoReminder.js b/apps/OpenSignServer/cloud/customRoute/autoReminder.js index de8da2cbd..b8d92606d 100644 --- a/apps/OpenSignServer/cloud/customRoute/autoReminder.js +++ b/apps/OpenSignServer/cloud/customRoute/autoReminder.js @@ -46,10 +46,10 @@ async function sendMail(doc, signer, mailcount) { document_title: doc.Name, sender_name: doc.ExtUserPtr.Name, sender_mail: doc.ExtUserPtr.Email, - sender_phone: doc.ExtUserPtr.Phone, + sender_phone: doc.ExtUserPtr?.Phone || '', receiver_name: signer.Name, receiver_email: signer.Email, - receiver_phone: signer.Phone, + receiver_phone: signer?.Phone || '', expiry_date: localExpireDate, company_name: doc?.ExtUserPtr?.Company || '', signing_url: `<a href=${signPdf}>Sign here</a>`, diff --git a/apps/OpenSignServer/cloud/customRoute/v1/routes/CreateDocumentWithTemplate.js b/apps/OpenSignServer/cloud/customRoute/v1/routes/CreateDocumentWithTemplate.js index 891cc8f3a..3922e9d94 100644 --- a/apps/OpenSignServer/cloud/customRoute/v1/routes/CreateDocumentWithTemplate.js +++ b/apps/OpenSignServer/cloud/customRoute/v1/routes/CreateDocumentWithTemplate.js @@ -265,10 +265,10 @@ export default async function createDocumentWithTemplate(request, response) { document_title: template.Name, sender_name: template.ExtUserPtr.Name, sender_mail: template.ExtUserPtr.Email, - sender_phone: template.ExtUserPtr.Phone, + sender_phone: template.ExtUserPtr?.Phone || '', receiver_name: contactMail[i].name, receiver_email: contactMail[i].email, - receiver_phone: contactMail[i].phone, + receiver_phone: contactMail[i]?.phone || '', expiry_date: localExpireDate, company_name: orgName, signing_url: signPdf, @@ -314,7 +314,11 @@ export default async function createDocumentWithTemplate(request, response) { name: template?.Name, note: template?.Note || '', description: template?.Description || '', - signers: contact?.map(x => ({ name: x.name, email: x.email, phone: x.phone })), + signers: contact?.map(x => ({ + name: x.name, + email: x.email, + phone: x?.phone || '', + })), createdAt: res.createdAt, }; if (template.ExtUserPtr && template.ExtUserPtr?.Webhook) { diff --git a/apps/OpenSignServer/cloud/customRoute/v1/routes/createContact.js b/apps/OpenSignServer/cloud/customRoute/v1/routes/createContact.js index 9be0cd341..ed23e8f64 100644 --- a/apps/OpenSignServer/cloud/customRoute/v1/routes/createContact.js +++ b/apps/OpenSignServer/cloud/customRoute/v1/routes/createContact.js @@ -3,7 +3,7 @@ export default async function createContact(request, response) { const serverUrl = process.env.SERVER_URL; const appId = process.env.APP_ID; const name = request.body.name; - const phone = request.body.phone; + const phone = request.body?.phone; const email = request.body.email; const reqToken = request.headers['x-api-token']; if (!reqToken) { @@ -49,7 +49,9 @@ export default async function createContact(request, response) { const contactQuery = new Parse.Object('contracts_Contactbook'); contactQuery.set('Name', name); - contactQuery.set('Phone', phone); + if (phone) { + contactQuery.set('Phone', phone); + } contactQuery.set('Email', email); contactQuery.set('UserRole', 'contracts_Guest'); if (tenantRes && tenantRes.id) { @@ -65,8 +67,10 @@ export default async function createContact(request, response) { _user.set('name', name); _user.set('username', email); _user.set('email', email); - _user.set('phone', phone); - _user.set('password', phone); + _user.set('password', email); + if (phone) { + _user.set('phone', phone); + } const user = await _user.save(); if (user) { @@ -106,7 +110,7 @@ export default async function createContact(request, response) { objectId: parseRes.objectId, name: parseRes.Name, email: parseRes.Email, - phone: parseRes.Phone, + phone: parseRes?.Phone || '', createdAt: parseRes.createdAt, updatedAt: parseRes.updatedAt, }); @@ -155,7 +159,7 @@ export default async function createContact(request, response) { objectId: parseRes.objectId, name: parseRes.Name, email: parseRes.Email, - phone: parseRes.Phone, + phone: parseRes?.Phone || '', createdAt: parseRes.createdAt, updatedAt: parseRes.updatedAt, }); diff --git a/apps/OpenSignServer/cloud/customRoute/v1/routes/createDocumentwithCoordinate.js b/apps/OpenSignServer/cloud/customRoute/v1/routes/createDocumentwithCoordinate.js index ba8971b31..602d92cfa 100644 --- a/apps/OpenSignServer/cloud/customRoute/v1/routes/createDocumentwithCoordinate.js +++ b/apps/OpenSignServer/cloud/customRoute/v1/routes/createDocumentwithCoordinate.js @@ -255,7 +255,7 @@ export default async function createDocumentwithCoordinate(request, response) { name: name, note: note || '', description: description || '', - signers: contact?.map(x => ({ name: x.name, email: x.email, phone: x.phone })), + signers: contact?.map(x => ({ name: x.name, email: x.email, phone: x?.phone || '' })), createdAt: res.createdAt, }; if (parseExtUser && parseExtUser.Webhook) { @@ -325,10 +325,10 @@ export default async function createDocumentwithCoordinate(request, response) { document_title: name, sender_name: parseExtUser.Name, sender_mail: parseExtUser.Email, - sender_phone: parseExtUser.Phone, + sender_phone: parseExtUser?.Phone || '', receiver_name: contactMail[i].name, receiver_email: contactMail[i].email, - receiver_phone: contactMail[i].phone, + receiver_phone: contactMail[i]?.phone || '', expiry_date: localExpireDate, company_name: orgName, signing_url: signPdf, diff --git a/apps/OpenSignServer/cloud/customRoute/v1/routes/createTemplatewithCoordinate.js b/apps/OpenSignServer/cloud/customRoute/v1/routes/createTemplatewithCoordinate.js index 6bff19bc2..3ee1c6f32 100644 --- a/apps/OpenSignServer/cloud/customRoute/v1/routes/createTemplatewithCoordinate.js +++ b/apps/OpenSignServer/cloud/customRoute/v1/routes/createTemplatewithCoordinate.js @@ -91,7 +91,7 @@ export default async function createTemplatewithCoordinate(request, response) { let createContactUrl = protocol + '/v1/createcontact'; for (const [index, element] of parseSigners.entries()) { - if (element?.name && element.phone && element?.email) { + if (element?.name && element?.email) { const body = { name: element?.name || '', email: element?.email || '', diff --git a/apps/OpenSignServer/cloud/customRoute/v1/routes/getContact.js b/apps/OpenSignServer/cloud/customRoute/v1/routes/getContact.js index e3d288586..81e15f767 100644 --- a/apps/OpenSignServer/cloud/customRoute/v1/routes/getContact.js +++ b/apps/OpenSignServer/cloud/customRoute/v1/routes/getContact.js @@ -37,7 +37,7 @@ export default async function getContact(request, response) { objectId: parseRes.objectId, name: parseRes.Name, email: parseRes.Email, - phone: parseRes.Phone, + phone: parseRes?.Phone || '', createdAt: parseRes.createdAt, updatedAt: parseRes.updatedAt, }); diff --git a/apps/OpenSignServer/cloud/customRoute/v1/routes/getContactList.js b/apps/OpenSignServer/cloud/customRoute/v1/routes/getContactList.js index f20682c63..bed33476c 100644 --- a/apps/OpenSignServer/cloud/customRoute/v1/routes/getContactList.js +++ b/apps/OpenSignServer/cloud/customRoute/v1/routes/getContactList.js @@ -31,7 +31,7 @@ export default async function getContactList(request, response) { objectId: x.objectId, name: x.Name, email: x.Email, - phone: x.Phone, + phone: x?.Phone || '', createdAt: x.createdAt, updatedAt: x.updatedAt, })); diff --git a/apps/OpenSignServer/cloud/customRoute/v1/routes/getUser.js b/apps/OpenSignServer/cloud/customRoute/v1/routes/getUser.js index 45776036e..20224a63a 100644 --- a/apps/OpenSignServer/cloud/customRoute/v1/routes/getUser.js +++ b/apps/OpenSignServer/cloud/customRoute/v1/routes/getUser.js @@ -37,7 +37,7 @@ export default async function getUser(request, response) { objectId: parseRes.objectId, name: parseRes.Name, email: parseRes.Email, - phone: parseRes.Phone, + phone: parseRes?.Phone || '', jobTitle: parseRes.JobTitle, company: parseRes.Company, createdAt: parseRes.createdAt, diff --git a/apps/OpenSignServer/cloud/customRoute/v1/routes/resendMail.js b/apps/OpenSignServer/cloud/customRoute/v1/routes/resendMail.js index 1b0686c24..c1df00e8c 100644 --- a/apps/OpenSignServer/cloud/customRoute/v1/routes/resendMail.js +++ b/apps/OpenSignServer/cloud/customRoute/v1/routes/resendMail.js @@ -97,10 +97,10 @@ export default async function resendMail(request, response) { document_title: title, sender_name: _resDoc.ExtUserPtr.Name, sender_mail: _resDoc.ExtUserPtr.Email, - sender_phone: _resDoc.ExtUserPtr.Phone, + sender_phone: _resDoc.ExtUserPtr?.Phone || '', receiver_name: contact.Name, receiver_email: contact.Email, - receiver_phone: contact.Phone, + receiver_phone: contact?.Phone || '', expiry_date: localExpireDate, company_name: orgName, signing_url: signPdf, diff --git a/apps/OpenSignServer/cloud/parsefunction/ContractUsersAftersave.js b/apps/OpenSignServer/cloud/parsefunction/ContractUsersAftersave.js index 1306c6b83..a6b41394c 100644 --- a/apps/OpenSignServer/cloud/parsefunction/ContractUsersAftersave.js +++ b/apps/OpenSignServer/cloud/parsefunction/ContractUsersAftersave.js @@ -8,7 +8,9 @@ async function ContractUsersAftersave(request) { contactbook.set('Name', request.object.get('Name')); contactbook.set('Email', request.object.get('Email')); contactbook.set('ExtUserPtr', request.object.get('objectId')); - contactbook.set('Phone', request.object.get('Phone')); + if (request.object?.get('Phone')) { + contactbook.set('Phone', request.object.get('Phone')); + } contactbook.set('ExtUserPtr', { __type: 'Pointer', className: 'contracts_Users', diff --git a/apps/OpenSignServer/cloud/parsefunction/FacebookSign.js b/apps/OpenSignServer/cloud/parsefunction/FacebookSign.js index 9fe510ead..8b7df821e 100644 --- a/apps/OpenSignServer/cloud/parsefunction/FacebookSign.js +++ b/apps/OpenSignServer/cloud/parsefunction/FacebookSign.js @@ -1,4 +1,4 @@ -import axios from "axios"; +import axios from 'axios'; const serverUrl = process.env.SERVER_URL; const APPID = process.env.APP_ID; @@ -18,23 +18,23 @@ export default async function FacebookSign(request) { const userGoogleId = request.params.Id; const userAccessToken = request.params.AccessToken; const userEmail = request.params.Email; - const phone = request.params.Phone; + const phone = request.params?.Phone || ''; const name = request.params.Name; const authData = { facebook: { id: userGoogleId, access_token: userAccessToken }, }; const userQuery = new Parse.Query(Parse.User); - userQuery.equalTo("email", userEmail); + userQuery.equalTo('email', userEmail); const res = await userQuery.first({ useMasterKey: true }); if (res) { try { const SignIn = await axios.put( - serverUrl + "/users/" + res.id, + serverUrl + '/users/' + res.id, { authData: authData }, { headers: { - "X-Parse-Application-Id": APPID, - "X-Parse-Master-key": masterKEY, + 'X-Parse-Application-Id': APPID, + 'X-Parse-Master-key': masterKEY, }, } ); @@ -42,22 +42,22 @@ export default async function FacebookSign(request) { if (SignIn.data) { // console.log("google Sign in", SignIn); const sessiontoken = SignIn.data.sessionToken; - console.log("Google sessiontoken", sessiontoken); + console.log('Google sessiontoken', sessiontoken); return { email: userEmail, - message: "User Sign In", + message: 'User Sign In', sessiontoken: sessiontoken, }; } } catch (err) { - console.log("err in user google sign in", err); - return { message: "Internal server error" }; + console.log('err in user google sign in', err); + return { message: 'Internal server error' }; } } else { // console.log("in sign up condition"); try { const SignUp = await axios.post( - serverUrl + "/users", + serverUrl + '/users', { authData: authData, username: userEmail, @@ -67,8 +67,8 @@ export default async function FacebookSign(request) { }, { headers: { - "X-Parse-Application-Id": APPID, - "X-Parse-Revocable-Session": "1", + 'X-Parse-Application-Id': APPID, + 'X-Parse-Revocable-Session': '1', }, } ); @@ -79,14 +79,14 @@ export default async function FacebookSign(request) { const sessiontoken = SignUp.data.sessionToken; const payload = { email: userEmail, - message: "User Sign Up", + message: 'User Sign Up', sessiontoken: sessiontoken, }; return payload; } } catch (err) { - console.log("err in user google sign up", err); - return { message: "Internal server err" }; + console.log('err in user google sign up', err); + return { message: 'Internal server err' }; } } } diff --git a/apps/OpenSignServer/cloud/parsefunction/GoogleSign.js b/apps/OpenSignServer/cloud/parsefunction/GoogleSign.js index 757e2ba51..57a961ce8 100644 --- a/apps/OpenSignServer/cloud/parsefunction/GoogleSign.js +++ b/apps/OpenSignServer/cloud/parsefunction/GoogleSign.js @@ -1,4 +1,4 @@ -import axios from "axios"; +import axios from 'axios'; const serverUrl = process.env.SERVER_URL; const APPID = process.env.APP_ID; @@ -9,8 +9,8 @@ const masterKEY = process.env.MASTER_KEY; * @param Id It is google Id * @param TokenId It is google token Id * @param Gmail It is user's gmail with user sign in/sign up - * @param Phone It is user's Phone number - * @param Name It is user's Name + * @param Phone It is user's Phone number + * @param Name It is user's Name * @returns if success {email, message, sessiontoken} else on reject {message} */ @@ -18,21 +18,21 @@ export default async function GoogleSign(request) { const userGoogleId = request.params.Id; const userTokenId = request.params.TokenId; const userEmail = request.params.Gmail; - const phone = request.params.Phone; + const phone = request.params?.Phone || ''; const name = request.params.Name; const authData = { google: { id: userGoogleId, id_token: userTokenId } }; const userQuery = new Parse.Query(Parse.User); - userQuery.equalTo("email", userEmail); + userQuery.equalTo('email', userEmail); const res = await userQuery.first({ useMasterKey: true }); if (res) { try { const SignIn = await axios.put( - serverUrl + "/users/" + res.id, + serverUrl + '/users/' + res.id, { authData: authData }, { headers: { - "X-Parse-Application-Id": APPID, - "X-Parse-Master-key": masterKEY, + 'X-Parse-Application-Id': APPID, + 'X-Parse-Master-key': masterKEY, }, } ); @@ -40,22 +40,22 @@ export default async function GoogleSign(request) { if (SignIn.data) { // console.log("google Sign in", SignIn); const sessiontoken = SignIn.data.sessionToken; - console.log("Google sessiontoken", sessiontoken); + console.log('Google sessiontoken', sessiontoken); return { email: userEmail, - message: "User Sign In", + message: 'User Sign In', sessiontoken: sessiontoken, }; } } catch (err) { - console.log("err in user google sign in", err); - return { message: "Internal server error" }; + console.log('err in user google sign in', err); + return { message: 'Internal server error' }; } } else { // console.log("in sign up condition"); try { const SignUp = await axios.post( - serverUrl + "/users", + serverUrl + '/users', { authData: authData, username: userEmail, @@ -65,8 +65,8 @@ export default async function GoogleSign(request) { }, { headers: { - "X-Parse-Application-Id": APPID, - "X-Parse-Revocable-Session": "1", + 'X-Parse-Application-Id': APPID, + 'X-Parse-Revocable-Session': '1', }, } ); @@ -77,14 +77,14 @@ export default async function GoogleSign(request) { const sessiontoken = SignUp.data.sessionToken; const payload = { email: userEmail, - message: "User Sign Up", + message: 'User Sign Up', sessiontoken: sessiontoken, }; return payload; } } catch (err) { - console.log("err in user google sign up", err); - return { message: "Internal server err" }; + console.log('err in user google sign up', err); + return { message: 'Internal server err' }; } } } diff --git a/apps/OpenSignServer/cloud/parsefunction/ZohoDetails.js b/apps/OpenSignServer/cloud/parsefunction/ZohoDetails.js index e926877ab..a92b6829c 100644 --- a/apps/OpenSignServer/cloud/parsefunction/ZohoDetails.js +++ b/apps/OpenSignServer/cloud/parsefunction/ZohoDetails.js @@ -47,7 +47,7 @@ export default async function ZohoDetails(request) { userData.data.data.subscription.customer.cd_job_title) || ''; const resData = { - phone: userData.data.data.subscription.contactpersons[0].mobile, + phone: userData.data.data.subscription.contactpersons[0]?.mobile || '', name: first_name + ' ' + last_name, email: userData.data.data.subscription.contactpersons[0].email, nextBillingDate: userData.data.data.subscription.next_billing_at, diff --git a/apps/OpenSignServer/cloud/parsefunction/linkContactToDoc.js b/apps/OpenSignServer/cloud/parsefunction/linkContactToDoc.js index ddc7be964..6c433a8fd 100644 --- a/apps/OpenSignServer/cloud/parsefunction/linkContactToDoc.js +++ b/apps/OpenSignServer/cloud/parsefunction/linkContactToDoc.js @@ -208,11 +208,9 @@ export default async function linkContactToDoc(req) { _user.set('name', name); _user.set('username', email); _user.set('email', email); + _user.set('password', email); if (phone) { _user.set('phone', phone); - _user.set('password', phone); - } else { - _user.set('password', email); } const newUserRes = await _user.save(); const contact = { diff --git a/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.js b/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.js index 86d5257e8..abd8ab148 100644 --- a/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.js +++ b/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.js @@ -132,10 +132,10 @@ async function sendCompletedMail(obj) { document_title: pdfName, sender_name: sender.Name, sender_mail: sender.Email, - sender_phone: sender.Phone, + sender_phone: sender?.Phone || '', receiver_name: sender.Name, receiver_email: sender.Email, - receiver_phone: sender.Phone, + receiver_phone: sender?.Phone || '', expiry_date: localExpireDate, company_name: sender.Company, }; diff --git a/apps/OpenSignServer/cloud/parsefunction/usersignup.js b/apps/OpenSignServer/cloud/parsefunction/usersignup.js index 9eebdc2e7..84a7a101e 100644 --- a/apps/OpenSignServer/cloud/parsefunction/usersignup.js +++ b/apps/OpenSignServer/cloud/parsefunction/usersignup.js @@ -30,7 +30,9 @@ async function saveUser(userDetails) { user.set('username', userDetails.email); user.set('password', userDetails.password); user.set('email', userDetails.email); - user.set('phone', userDetails.phone); + if (userDetails?.phone) { + user.set('phone', userDetails.phone); + } user.set('name', userDetails.name); const res = await user.signUp(); @@ -77,7 +79,9 @@ export default async function usersignup(request) { objectId: user.id, }); - partnerQuery.set('ContactNumber', userDetails.phone); + if (userDetails?.phone) { + partnerQuery.set('ContactNumber', userDetails.phone); + } partnerQuery.set('TenantName', userDetails.name); partnerQuery.set('EmailAddress', userDetails.email); partnerQuery.set('IsActive', true); @@ -113,7 +117,9 @@ export default async function usersignup(request) { newObj.set('UserRole', userDetails.role); newObj.set('Email', userDetails.email); newObj.set('Name', userDetails.name); - newObj.set('Phone', userDetails.phone); + if (userDetails?.phone) { + newObj.set('Phone', userDetails?.phone); + } newObj.set('TenantId', { __type: 'Pointer', className: 'partners_Tenant', From d85074b127812a81f2cdc96a34c53de966afe580 Mon Sep 17 00:00:00 2001 From: RaktimaNXG <raktima.c@nxglabs.com> Date: Wed, 29 May 2024 18:17:07 +0530 Subject: [PATCH 060/106] fix: username issue to get details from GetPublicUserNmae cloud function --- apps/OpenSign/src/constant/const.js | 3 +- apps/OpenSign/src/pages/PdfRequestFiles.js | 5 +- apps/OpenSign/src/pages/UserProfile.js | 93 +++-- .../src/primitives/GetReportDisplay.js | 344 ++++++++++++------ apps/OpenSign/src/primitives/ModalUi.js | 4 +- apps/OpenSignServer/cloud/main.js | 7 +- .../parsefunction/CreatePublicTemplate.js | 69 ++-- .../cloud/parsefunction/GetPublicTemplate.js | 29 ++ .../cloud/parsefunction/GetPublicUserName.js | 4 +- .../cloud/parsefunction/reportsJson.js | 1 + 10 files changed, 366 insertions(+), 193 deletions(-) create mode 100644 apps/OpenSignServer/cloud/parsefunction/GetPublicTemplate.js diff --git a/apps/OpenSign/src/constant/const.js b/apps/OpenSign/src/constant/const.js index a046b4ae1..abfcce0ae 100644 --- a/apps/OpenSign/src/constant/const.js +++ b/apps/OpenSign/src/constant/const.js @@ -9,4 +9,5 @@ export const modalSubmitBtnColor = "#17a2b8"; export const modalCancelBtnColor = "white"; export const themeColor = "#47a3ad"; export const iconColor = "#686968"; -export const isEnableSubscription = process.env.REACT_APP_ENABLE_SUBSCRIPTION; +export const isEnableSubscription = false; +// process.env.REACT_APP_ENABLE_SUBSCRIPTION; diff --git a/apps/OpenSign/src/pages/PdfRequestFiles.js b/apps/OpenSign/src/pages/PdfRequestFiles.js index b0be26095..3c17139fd 100644 --- a/apps/OpenSign/src/pages/PdfRequestFiles.js +++ b/apps/OpenSign/src/pages/PdfRequestFiles.js @@ -1578,7 +1578,10 @@ function PdfRequestFiles() { handleClose={() => { setIsCompleted((prev) => ({ ...prev, isModal: false })); }} - reduceWidth={!isCompleted?.message} + reduceWidth={ + !isCompleted?.message && + "md:min-w-[440px] md:max-w-[400px]" + } > <div style={{ height: "100%", padding: 20 }}> {isCompleted?.message ? ( diff --git a/apps/OpenSign/src/pages/UserProfile.js b/apps/OpenSign/src/pages/UserProfile.js index a3211f357..3803e43cf 100644 --- a/apps/OpenSign/src/pages/UserProfile.js +++ b/apps/OpenSign/src/pages/UserProfile.js @@ -1,4 +1,4 @@ -import React, { useState, useEffect } from "react"; +import React, { useState, useEffect, useRef } from "react"; import { Navigate, useNavigate } from "react-router-dom"; import Parse from "parse"; import { SaveFileSize } from "../constant/saveFileSize"; @@ -28,8 +28,9 @@ function UserProfile() { const [isDisableDocId, setIsDisableDocId] = useState(false); const [isSubscribe, setIsSubscribe] = useState(false); const [publicUserName, setPublicUserName] = useState( - (extendUser && extendUser?.[0]?.UserName) || "" + extendUser && extendUser?.[0]?.UserName ); + const previousStateValueRef = useRef(publicUserName); const [company, setCompany] = useState( extendUser && extendUser?.[0]?.Company ); @@ -81,8 +82,8 @@ function UserProfile() { const handleCheckPublicUserName = async () => { try { - const res = await Parse.Cloud.run("getPublicUserName", { - userName: publicUserName + const res = await Parse.Cloud.run("getpublicusername", { + username: publicUserName }); if (res) { setIsLoader(false); @@ -98,15 +99,19 @@ function UserProfile() { }; const handleSubmit = async (e) => { e.preventDefault(); - setIsLoader(true); - let phn = Phone; - const res = await handleCheckPublicUserName(); + let phn = Phone, + res; + + if (previousStateValueRef.current !== publicUserName) { + res = await handleCheckPublicUserName(); + } + if (!res) { + setIsLoader(true); try { - const tour = Parse.Object.extend("_User"); - const query = new Parse.Query(tour); - + const userQuery = Parse.Object.extend("_User"); + const query = new Parse.Query(userQuery); await query.get(UserProfile.objectId).then((object) => { object.set("name", name); object.set("ProfilePic", Image); @@ -148,15 +153,26 @@ function UserProfile() { const extClass = localStorage.getItem("extended_class"); const extData = JSON.parse(localStorage.getItem("Extand_Class")); const ExtUserId = extData[0].objectId; + let body; + if (publicUserName) { + body = { + Phone: obj.Phone, + Name: obj.Name, + HeaderDocId: isDisableDocId, + JobTitle: jobTitle, + Company: company, + UserName: publicUserName + }; + } else { + body = { + Phone: obj.Phone, + Name: obj.Name, + HeaderDocId: isDisableDocId, + JobTitle: jobTitle, + Company: company + }; + } - const body = { - Phone: obj.Phone, - Name: obj.Name, - HeaderDocId: isDisableDocId, - JobTitle: jobTitle, - Company: company, - UserName: publicUserName - }; await axios.put( parseBaseUrl + "classes/" + extClass + "/" + ExtUserId, body, @@ -267,7 +283,15 @@ function UserProfile() { alert("OTP sent on you email"); }; const handlePublicUrl = (e) => { - setPublicUserName(e.target.value); + const value = e.target.value; + if (value.length > 6 && !isSubscribe) { + setUserNameError("Please upgrade to allow more than 6 characters."); + setTimeout(() => { + setUserNameError(""); + }, 2000); + } else { + setPublicUserName(e.target.value); + } }; return ( <React.Fragment> @@ -291,10 +315,9 @@ function UserProfile() { </div> ) : ( <div className="flex justify-center items-center w-full relative"> - {/* <Alert type={alertMsg.type}>{alertMsg.message}</Alert> */} {userNameError && ( <div - className={`z-[1000] fixed top-20 transform border-[1px] text-sm border-[#f0a8a8] bg-[#f4bebe] text-[#c42121] rounded py-[.75rem] px-[1.25rem]`} + className={`z-[1000] fixed top-[50%] transform border-[1px] text-sm border-[#f0a8a8] bg-[#f4bebe] text-[#c42121] rounded py-[.75rem] px-[1.25rem]`} > {userNameError} </div> @@ -426,20 +449,22 @@ function UserProfile() { )} </span> </li> - <li className="flex justify-between items-center border-t-[1px] border-gray-300 py-2 break-all"> - <span className="font-semibold">Public profile:</span> - <div className="flex items-center"> - <span>opensign.me/</span> + {!isEnableSubscription && ( + <li className="flex justify-between items-center border-t-[1px] border-gray-300 py-2 break-all"> + <span className="font-semibold">Public profile:</span> + <div className="flex items-center"> + <span>opensign.me/</span> - <input - onChange={handlePublicUrl} - value={publicUserName} - disabled={!editmode} - placeholder="enter user name" - className="border-[1px] border-gray-200 rounded-[3px]" - /> - </div> - </li> + <input + onChange={handlePublicUrl} + value={publicUserName} + disabled={!editmode} + placeholder="enter user name" + className="border-[1px] border-gray-200 rounded-[3px]" + /> + </div> + </li> + )} <li className="border-y-[1px] border-gray-300 break-all"> <div className="flex justify-between items-center py-2"> diff --git a/apps/OpenSign/src/primitives/GetReportDisplay.js b/apps/OpenSign/src/primitives/GetReportDisplay.js index 34a81763b..8cf06e6b0 100644 --- a/apps/OpenSign/src/primitives/GetReportDisplay.js +++ b/apps/OpenSign/src/primitives/GetReportDisplay.js @@ -4,14 +4,18 @@ import { useNavigate } from "react-router-dom"; import axios from "axios"; import ModalUi from "./ModalUi"; import AddSigner from "../components/AddSigner"; -import { modalSubmitBtnColor, modalCancelBtnColor } from "../constant/const"; +import { + modalSubmitBtnColor, + modalCancelBtnColor, + isEnableSubscription +} from "../constant/const"; import Alert from "./Alert"; import Tooltip from "./Tooltip"; import { RWebShare } from "react-web-share"; import Tour from "reactour"; import Parse from "parse"; import { saveAs } from "file-saver"; -import { replaceMailVaribles } from "../constant/Utils"; +import { copytoData, replaceMailVaribles } from "../constant/Utils"; import Confetti from "react-confetti"; import EditorToolbar, { module1, @@ -48,7 +52,9 @@ const ReportTable = (props) => { const [role, setRole] = useState([]); const [selectedPublicRole, setSelectedPublicRole] = useState(""); const [isCelebration, setIsCelebration] = useState(false); - + const [isPublic, setIsPublic] = useState({}); + const [isPublicProfile, setIsPublicProfile] = useState({}); + const [publicUserName, setIsPublicUserName] = useState("raktima"); const [isViewShare, setIsViewShare] = useState({}); const startIndex = (currentPage - 1) * props.docPerPage; const { isMoreDocs, setIsNextRecord } = props; @@ -235,17 +241,6 @@ const ReportTable = (props) => { setIsResendMail({ [item.objectId]: true }); } else if (act.action === "bulksend") { handleBulkSend(item); - } else if (act.action === "public") { - const getRole = []; - const getPlaceholder = item.Placeholders; - getPlaceholder.map((data) => { - getRole.push(data.Role); - }); - if (getRole.length === 1) { - setSelectedPublicRole(getRole[0]); - } - setRole(getRole); - setIsMakePublic({ [item.objectId]: true }); } }; // Get current list @@ -318,6 +313,9 @@ const ReportTable = (props) => { setIsRevoke({}); setIsDeleteModal({}); setIsMakePublic({}); + setSelectedPublicRole(""); + setIsPublic({}); + setIsPublicProfile({}); }; const handleShare = (item) => { @@ -711,50 +709,35 @@ const ReportTable = (props) => { if (selectedPublicRole) { setActLoader({ [item.objectId]: true }); setIsMakePublic(false); - let params = { - templateId: item.objectId - }; - let url = `${localStorage.getItem( - "baseUrl" - )}functions/createPublicTemplate/`; - const headers = { - "Content-Type": "application/json", - "X-Parse-Application-Id": localStorage.getItem("parseAppId"), - sessionToken: localStorage.getItem("accesstoken") - }; try { - const res = await axios.post(url, params, { headers: headers }); - if (res.data.result.status === "success") { - const data = { - PublicRole: [selectedPublicRole] - }; - const res = await axios.put( - `${localStorage.getItem("baseUrl")}classes/contracts_Template/${ - item.objectId - }`, - data, - { - headers: { - "Content-Type": "application/json", - "X-Parse-Application-Id": localStorage.getItem("parseAppId"), - "X-Parse-Session-Token": localStorage.getItem("accesstoken") - } - } - ); - if (res) { - setIsAlert(true); + const res = await Parse.Cloud.run("createpublictemplate", { + templateid: item.objectId, + ispublic: isPublic[item.objectId], + publicrole: [selectedPublicRole] + }); + + if (res.status === "success") { + setIsAlert(true); + setTimeout(() => setIsAlert(false), 1500); + if (isPublic[item.objectId]) { setAlertMsg({ type: "success", message: "You have successfully made the template public." }); - setTimeout(() => setIsAlert(false), 1500); setIsCelebration(true); setTimeout(() => { setIsCelebration(false); }, 5000); + setIsPublicProfile({ [item.objectId]: isPublic[item.objectId] }); + } else { + setAlertMsg({ + type: "success", + message: "You have successfully made the template private." + }); + setSelectedPublicRole(""); - setActLoader({}); } + setActLoader({}); } } catch (e) { console.log("save public template error", e); @@ -768,10 +751,50 @@ const ReportTable = (props) => { setTimeout(() => setIsAlert(false), 1500); } }; - const handleViewSigners = (item) => { setIsViewShare({ [item.objectId]: true }); }; + const handlePublicChange = async (e, item) => { + const getPlaceholder = item?.Placeholders; + if (getPlaceholder && getPlaceholder.length > 0) { + let extendUser = JSON.parse(localStorage.getItem("Extand_Class")); + const userName = extendUser[0]?.UserName; + setIsPublicUserName(extendUser[0]?.UserName); + if (userName) { + setIsPublic({ [item.objectId]: e.target.checked }); + const getRole = []; + getPlaceholder.map((data) => { + getRole.push(data.Role); + }); + if (getRole.length === 1) { + setSelectedPublicRole(getRole[0]); + } + setRole(getRole); + setIsMakePublic({ [item.objectId]: true }); + } else { + setIsPublicProfile({ [item.objectId]: true }); + } + } else { + setIsAlert(true); + setAlertMsg({ + type: "danger", + message: "Please assign at least one role to make this template public." + }); + setTimeout(() => setIsAlert(false), 3000); + } + }; + + const copytoProfileLink = () => { + const url = `https://opensign.me/${publicUserName}`; + copytoData(url); + setIsAlert(true); + setAlertMsg({ + type: "success", + message: "Copied." + }); + setTimeout(() => setIsAlert(false), 1500); + }; + return ( <div className="relative"> {Object.keys(actLoader)?.length > 0 && ( @@ -834,6 +857,9 @@ const ReportTable = (props) => { {props.actions?.length > 0 && ( <th className="px-4 py-2 font-thin">Action</th> )} + {props.ReportName === "Templates" && !isEnableSubscription && ( + <th className="px-4 py-2 font-thin">Public</th> + )} </tr> </thead> <tbody className="text-[12px]"> @@ -1272,84 +1298,168 @@ const ReportTable = (props) => { </div> </ModalUi> )} - {isMakePublic[item.objectId] && ( - <ModalUi - isOpen - title={"Make template public"} - handleClose={() => { - setIsMakePublic({}); - }} - > - <div className="m-[20px]"> - <div className="font-normal text-black"> - <p className="text-lg"> - {" "} - Are you sure you want to make this template - public? - </p> - <div className="flex mt-2 gap-2 md:items-center"> - <p className="text-[15px]">Public role : </p> - {role.length > 1 ? ( - <select - className="w-[60%] md:w-[70%] border-[1px] border-gray-200 rounded-sm p-[2px]" - name="textvalidate" - value={selectedPublicRole} - onChange={(e) => - setSelectedPublicRole(e.target.value) - } - > - <option - disabled - style={{ fontSize: "13px" }} - value="" - > - Select... - </option> - {role.map((data, ind) => { - return ( + </td> + {!isEnableSubscription && ( + <td className=" pl-[20px] py-2 "> + {props.ReportName === "Templates" && ( + <div className=" flex flex-row-"> + <label + className={ + "cursor-pointer relative inline-flex items-center mb-0" + } + > + <input + checked={ + (isPublic && isPublic[item.objectId]) || + item?.IsPublic || + false + } + onChange={(e) => handlePublicChange(e, item)} + type="checkbox" + value="" + className="sr-only peer" + /> + <div className="w-9 h-5 bg-gray-200 peer-focus:outline-none peer-focus:ring-1 peer-focus:ring-black rounded-full peer dark:bg-gray-700 peer-checked:after:translate-x-full rtl:peer-checked:after:-translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:start-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-4 after:w-4 after:transition-all dark:border-black peer-checked:bg-blue-600"></div> + </label> + </div> + )} + {isMakePublic[item.objectId] && ( + <ModalUi + isOpen + title={"Make template public"} + handleClose={() => { + setIsMakePublic({}); + setSelectedPublicRole(""); + setIsPublic({}); + }} + > + <div className="m-[20px]"> + <div className="font-normal text-black"> + <p className="text-lg"> + {" "} + {isPublic[item.objectId] + ? `Are you sure you want to make this template + public ?` + : `Are you sure you want to make this template + private ?`} + </p> + {isPublic[item.objectId] && ( + <div className="flex mt-2 gap-2 md:items-center"> + <p className="text-[15px]"> + Public role :{" "} + </p> + {role.length > 1 ? ( + <select + className="w-[60%] md:w-[70%] border-[1px] border-gray-200 rounded-sm p-[2px]" + name="textvalidate" + value={selectedPublicRole} + onChange={(e) => + setSelectedPublicRole( + e.target.value + ) + } + > <option + disabled style={{ fontSize: "13px" }} - key={ind} - value={data} + value="" > - {data} + Select... </option> - ); - })} - </select> - ) : ( - <div className="w-[60%] md:w-[70%] border-[1px] border-gray-200 rounded-sm p-[2px]"> - {role} + {role.map((data, ind) => { + return ( + <option + style={{ fontSize: "13px" }} + key={ind} + value={data} + > + {data} + </option> + ); + })} + </select> + ) : ( + <div className="w-[60%] md:w-[70%] border-[1px] border-gray-200 rounded-sm p-[2px]"> + {role} + </div> + )} </div> )} </div> - </div> - <hr className="bg-[#ccc] mt-2 " /> - <div className="flex items-center mt-3 gap-2 text-white"> - <button - onClick={() => handlePublicTemplate(item)} - className="px-4 py-1.5 text-white rounded shadow-md text-center focus:outline-none " - style={{ - backgroundColor: modalSubmitBtnColor - }} - > - Submit - </button> - <button - onClick={handleClose} - className="px-4 py-1.5 text-black border-[1px] border-[#ccc] shadow-md rounded focus:outline-none" - style={{ - backgroundColor: modalCancelBtnColor - }} - > - No - </button> + <hr className="bg-[#ccc] mt-2 " /> + <div className="flex items-center mt-3 gap-2 text-white"> + <button + onClick={() => handlePublicTemplate(item)} + className="px-4 py-1.5 text-white rounded shadow-md text-center focus:outline-none " + style={{ + backgroundColor: modalSubmitBtnColor + }} + > + Submit + </button> + <button + onClick={handleClose} + className="px-4 py-1.5 text-black border-[1px] border-[#ccc] shadow-md rounded focus:outline-none" + style={{ + backgroundColor: modalCancelBtnColor + }} + > + No + </button> + </div> </div> - </div> - </ModalUi> - )} - </td> + </ModalUi> + )} + {isPublicProfile[item.objectId] && ( + <ModalUi + isOpen + title={"Public url"} + handleClose={() => { + setIsPublicProfile({}); + }} + reduceWidth={"md:min-w-[440px] md:max-w-[400px]"} + > + <div className="m-[20px]"> + {publicUserName ? ( + <div className="font-normal text-black"> + <p> + Here’s your public URL. Copy or share it + with the signer, and you will be able to + see all your publicly set templates. + </p> + <div className=" flex items-center gap-5 mt-2 p-[2px] w-[75%]"> + <span className="font-bold"> + Public Url :{" "} + </span> + <span + onClick={() => copytoProfileLink()} + className="underline underline-offset-2 cursor-pointer" + >{`https://opensign.me/${publicUserName}`}</span> + </div> + </div> + ) : ( + <div className="font-normal text-black"> + <p> + Please add your public URL, and you will + be able to make a public template. + </p> + <button + className="px-4 py-1.5 mt-3 text-white rounded shadow-md text-center focus:outline-none " + style={{ + backgroundColor: modalSubmitBtnColor + }} + onClick={() => navigate("/profile")} + > + Add + </button> + </div> + )} + </div> + </ModalUi> + )} + </td> + )} </tr> ) )} diff --git a/apps/OpenSign/src/primitives/ModalUi.js b/apps/OpenSign/src/primitives/ModalUi.js index 778d483d1..b0413b430 100644 --- a/apps/OpenSign/src/primitives/ModalUi.js +++ b/apps/OpenSign/src/primitives/ModalUi.js @@ -19,9 +19,7 @@ const ModalUi = ({ <div className="fixed z-[999] top-0 left-0 w-[100%] h-[100%] bg-black bg-opacity-[75%]"> <div className={`${ - reduceWidth - ? "md:min-w-[440px] md:max-w-[400px]" - : "md:min-w-[500px]" + reduceWidth || "md:min-w-[500px]" } fixed z-[1000] top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2 text-sm bg-white rounded shadow-md max-h-90 min-w-[90%] overflow-y-auto hide-scrollbar `} > {showHeader && ( diff --git a/apps/OpenSignServer/cloud/main.js b/apps/OpenSignServer/cloud/main.js index 283e5eb3d..6de2c181a 100644 --- a/apps/OpenSignServer/cloud/main.js +++ b/apps/OpenSignServer/cloud/main.js @@ -40,6 +40,8 @@ import { getSignedUrl } from './parsefunction/getSignedUrl.js'; import createBatchDocs from './parsefunction/createBatchDocs.js'; import linkContactToDoc from './parsefunction/linkContactToDoc.js'; import CreatePublicTemplate from './parsefunction/CreatePublicTemplate.js'; +import GetPublicUserName from './parsefunction/GetPublicUserName.js'; +import GetPublicTemplate from './parsefunction/GetPublicTemplate.js'; // This afterSave function triggers after an object is added or updated in the specified class, allowing for post-processing logic. Parse.Cloud.afterSave('contracts_Document', DocumentAftersave); @@ -89,5 +91,6 @@ Parse.Cloud.define('encryptedpdf', encryptedpdf); Parse.Cloud.define('getsignedurl', getSignedUrl); Parse.Cloud.define('batchdocuments', createBatchDocs); Parse.Cloud.define('linkcontacttodoc', linkContactToDoc); -Parse.Cloud.define('createPublicTemplate', CreatePublicTemplate); -Parse.Cloud.define('getPublicUserName', GetPublicUserName); +Parse.Cloud.define('createpublictemplate', CreatePublicTemplate); +Parse.Cloud.define('getpublicusername', GetPublicUserName); +Parse.Cloud.define('getpublictemplate', GetPublicTemplate); diff --git a/apps/OpenSignServer/cloud/parsefunction/CreatePublicTemplate.js b/apps/OpenSignServer/cloud/parsefunction/CreatePublicTemplate.js index 0da7fb0b7..b7b5fb0b8 100644 --- a/apps/OpenSignServer/cloud/parsefunction/CreatePublicTemplate.js +++ b/apps/OpenSignServer/cloud/parsefunction/CreatePublicTemplate.js @@ -1,39 +1,42 @@ -import axios from 'axios'; export default async function CreatePublicTemplate(request) { - const templateId = request.params.templateId; - const serverUrl = process.env.SERVER_URL; - const appId = process.env.APP_ID; - + const templateid = request.params.templateid; + const ispublic = request.params.ispublic; + const publicrole = request.params.publicrole; try { - const userRes = await axios.get(serverUrl + '/users/me', { - headers: { - 'X-Parse-Application-Id': appId, - 'X-Parse-Session-Token': request.headers['sessiontoken'], - }, - }); - const userId = userRes.data && userRes.data.objectId; - if (userId) { - const Query = new Parse.Query('contracts_Template'); - Query.equalTo('CreatedBy', { - __type: 'Pointer', - className: '_User', - objectId: userId, - }); - const updateACL = await Query.get(templateId, { useMasterKey: true }); - const newACL = new Parse.ACL(); - newACL.setPublicReadAccess(true); - newACL.setPublicWriteAccess(true); - updateACL.setACL(newACL); - updateACL.save(null, { useMasterKey: true }); - return { - status: 'success', - }; + console.log('session token', request); + if (!request?.user) { + throw new Parse.Error(Parse.Error.INVALID_SESSION_TOKEN, 'User is not authenticated.'); + } else { + const userId = request?.user && request?.user?.id; + if (userId) { + const updateTemplate = new Parse.Object('contracts_Template'); + updateTemplate.id = templateid; + if (ispublic) { + updateTemplate.set('PublicRole', publicrole); + } + updateTemplate.set('IsPublic', ispublic); + const Acl = new Parse.ACL(); + if (ispublic) { + Acl.setPublicReadAccess(true); + } + Acl.setReadAccess(userId, true); + Acl.setWriteAccess(userId, true); + updateTemplate.setACL(Acl); + const savedObject = await updateTemplate.save(null, { useMasterKey: true }); + const res = savedObject.toJSON(); + if (res) { + return { + status: 'success', + }; + } + } else { + throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'User does not exist.'); + } } } catch (err) { - if (err.code == 209) { - return { error: 'Invalid session token' }; - } else { - return { error: "You don't have access of this document!" }; - } + const code = err.code || 400; + const msg = err.message; + const error = new Parse.Error(code, msg); + throw error; } } diff --git a/apps/OpenSignServer/cloud/parsefunction/GetPublicTemplate.js b/apps/OpenSignServer/cloud/parsefunction/GetPublicTemplate.js new file mode 100644 index 000000000..33c2a1050 --- /dev/null +++ b/apps/OpenSignServer/cloud/parsefunction/GetPublicTemplate.js @@ -0,0 +1,29 @@ +async function GetPublicTemplate(request) { + try { + const username = request.params.username; + if (username) { + const extUserQuery = new Parse.Query('contracts_Users'); + extUserQuery.equalTo('UserName', username); + const res = await extUserQuery.first({ useMasterKey: true }); + const userId = res.get('UserId').id; + if (userId) { + const templatQuery = new Parse.Query('contracts_Template'); + templatQuery.equalTo('CreatedBy', { + __type: 'Pointer', + className: '_User', + objectId: userId, + }); + templatQuery.equalTo('IsPublic', true); + const getTemplate = await templatQuery.find({ useMasterKey: true }); + return getTemplate; + } + return { error: "You don't have access of this document!" }; + } else { + return { error: 'Please provide username!' }; + } + } catch (err) { + console.log('error', err); + return { error: "You don't have access of this document!" }; + } +} +export default GetPublicTemplate; diff --git a/apps/OpenSignServer/cloud/parsefunction/GetPublicUserName.js b/apps/OpenSignServer/cloud/parsefunction/GetPublicUserName.js index 3397739fc..eb927521c 100644 --- a/apps/OpenSignServer/cloud/parsefunction/GetPublicUserName.js +++ b/apps/OpenSignServer/cloud/parsefunction/GetPublicUserName.js @@ -1,8 +1,8 @@ async function GetPublicUserName(request) { try { - const userName = request.params.userName; + const username = request.params.username; const userQuery = new Parse.Query('contracts_Users'); - userQuery.equalTo('UserName', userName); + userQuery.equalTo('UserName', username); const res = await userQuery.first({ useMasterKey: true }); return res; } catch (err) { diff --git a/apps/OpenSignServer/cloud/parsefunction/reportsJson.js b/apps/OpenSignServer/cloud/parsefunction/reportsJson.js index 64c5cf522..37b53b95a 100644 --- a/apps/OpenSignServer/cloud/parsefunction/reportsJson.js +++ b/apps/OpenSignServer/cloud/parsefunction/reportsJson.js @@ -334,6 +334,7 @@ export default function reportJson(id, userId) { 'Signers.Email', 'Signers.Phone', 'Placeholders', + 'IsPublic', ], }; default: From 48fd9e52b3d7dddff7fd64b3147966a88c6cdd3c Mon Sep 17 00:00:00 2001 From: RaktimaNXG <raktima.c@nxglabs.com> Date: Wed, 29 May 2024 18:20:16 +0530 Subject: [PATCH 061/106] fix: update isEnableSuscription variable nname --- apps/OpenSign/src/constant/const.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/OpenSign/src/constant/const.js b/apps/OpenSign/src/constant/const.js index abfcce0ae..a046b4ae1 100644 --- a/apps/OpenSign/src/constant/const.js +++ b/apps/OpenSign/src/constant/const.js @@ -9,5 +9,4 @@ export const modalSubmitBtnColor = "#17a2b8"; export const modalCancelBtnColor = "white"; export const themeColor = "#47a3ad"; export const iconColor = "#686968"; -export const isEnableSubscription = false; -// process.env.REACT_APP_ENABLE_SUBSCRIPTION; +export const isEnableSubscription = process.env.REACT_APP_ENABLE_SUBSCRIPTION; From 33b0111ed0e8d5cdebe69683072d1249f37c224b Mon Sep 17 00:00:00 2001 From: RaktimaNXG <raktima.c@nxglabs.com> Date: Wed, 29 May 2024 18:43:24 +0530 Subject: [PATCH 062/106] fix: remove console --- apps/OpenSign/src/pages/UserProfile.js | 30 +- .../src/primitives/GetReportDisplay.js | 313 +++++++++--------- .../parsefunction/CreatePublicTemplate.js | 1 - 3 files changed, 171 insertions(+), 173 deletions(-) diff --git a/apps/OpenSign/src/pages/UserProfile.js b/apps/OpenSign/src/pages/UserProfile.js index 3803e43cf..625e103be 100644 --- a/apps/OpenSign/src/pages/UserProfile.js +++ b/apps/OpenSign/src/pages/UserProfile.js @@ -449,22 +449,22 @@ function UserProfile() { )} </span> </li> - {!isEnableSubscription && ( - <li className="flex justify-between items-center border-t-[1px] border-gray-300 py-2 break-all"> - <span className="font-semibold">Public profile:</span> - <div className="flex items-center"> - <span>opensign.me/</span> + {/* {!isEnableSubscription && ( */} + <li className="flex justify-between items-center border-t-[1px] border-gray-300 py-2 break-all"> + <span className="font-semibold">Public profile:</span> + <div className="flex items-center"> + <span>opensign.me/</span> - <input - onChange={handlePublicUrl} - value={publicUserName} - disabled={!editmode} - placeholder="enter user name" - className="border-[1px] border-gray-200 rounded-[3px]" - /> - </div> - </li> - )} + <input + onChange={handlePublicUrl} + value={publicUserName} + disabled={!editmode} + placeholder="enter user name" + className="border-[1px] border-gray-200 rounded-[3px]" + /> + </div> + </li> + {/* )} */} <li className="border-y-[1px] border-gray-300 break-all"> <div className="flex justify-between items-center py-2"> diff --git a/apps/OpenSign/src/primitives/GetReportDisplay.js b/apps/OpenSign/src/primitives/GetReportDisplay.js index 8cf06e6b0..7fb1a0b7f 100644 --- a/apps/OpenSign/src/primitives/GetReportDisplay.js +++ b/apps/OpenSign/src/primitives/GetReportDisplay.js @@ -6,8 +6,8 @@ import ModalUi from "./ModalUi"; import AddSigner from "../components/AddSigner"; import { modalSubmitBtnColor, - modalCancelBtnColor, - isEnableSubscription + modalCancelBtnColor + // isEnableSubscription } from "../constant/const"; import Alert from "./Alert"; import Tooltip from "./Tooltip"; @@ -857,7 +857,8 @@ const ReportTable = (props) => { {props.actions?.length > 0 && ( <th className="px-4 py-2 font-thin">Action</th> )} - {props.ReportName === "Templates" && !isEnableSubscription && ( + {props.ReportName === "Templates" && ( + // && !isEnableSubscription <th className="px-4 py-2 font-thin">Public</th> )} </tr> @@ -1299,167 +1300,165 @@ const ReportTable = (props) => { </ModalUi> )} </td> - {!isEnableSubscription && ( - <td className=" pl-[20px] py-2 "> - {props.ReportName === "Templates" && ( - <div className=" flex flex-row-"> - <label - className={ - "cursor-pointer relative inline-flex items-center mb-0" + {/* {!isEnableSubscription && ( */} + <td className=" pl-[20px] py-2 "> + {props.ReportName === "Templates" && ( + <div className=" flex flex-row-"> + <label + className={ + "cursor-pointer relative inline-flex items-center mb-0" + } + > + <input + checked={ + (isPublic && isPublic[item.objectId]) || + item?.IsPublic || + false } - > - <input - checked={ - (isPublic && isPublic[item.objectId]) || - item?.IsPublic || - false - } - onChange={(e) => handlePublicChange(e, item)} - type="checkbox" - value="" - className="sr-only peer" - /> - <div className="w-9 h-5 bg-gray-200 peer-focus:outline-none peer-focus:ring-1 peer-focus:ring-black rounded-full peer dark:bg-gray-700 peer-checked:after:translate-x-full rtl:peer-checked:after:-translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:start-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-4 after:w-4 after:transition-all dark:border-black peer-checked:bg-blue-600"></div> - </label> - </div> - )} - {isMakePublic[item.objectId] && ( - <ModalUi - isOpen - title={"Make template public"} - handleClose={() => { - setIsMakePublic({}); - setSelectedPublicRole(""); - setIsPublic({}); - }} - > - <div className="m-[20px]"> - <div className="font-normal text-black"> - <p className="text-lg"> - {" "} - {isPublic[item.objectId] - ? `Are you sure you want to make this template + onChange={(e) => handlePublicChange(e, item)} + type="checkbox" + value="" + className="sr-only peer" + /> + <div className="w-9 h-5 bg-gray-200 peer-focus:outline-none peer-focus:ring-1 peer-focus:ring-black rounded-full peer dark:bg-gray-700 peer-checked:after:translate-x-full rtl:peer-checked:after:-translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:start-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-4 after:w-4 after:transition-all dark:border-black peer-checked:bg-blue-600"></div> + </label> + </div> + )} + {isMakePublic[item.objectId] && ( + <ModalUi + isOpen + title={"Make template public"} + handleClose={() => { + setIsMakePublic({}); + setSelectedPublicRole(""); + setIsPublic({}); + }} + > + <div className="m-[20px]"> + <div className="font-normal text-black"> + <p className="text-lg"> + {" "} + {isPublic[item.objectId] + ? `Are you sure you want to make this template public ?` - : `Are you sure you want to make this template + : `Are you sure you want to make this template private ?`} - </p> - {isPublic[item.objectId] && ( - <div className="flex mt-2 gap-2 md:items-center"> - <p className="text-[15px]"> - Public role :{" "} - </p> - {role.length > 1 ? ( - <select - className="w-[60%] md:w-[70%] border-[1px] border-gray-200 rounded-sm p-[2px]" - name="textvalidate" - value={selectedPublicRole} - onChange={(e) => - setSelectedPublicRole( - e.target.value - ) - } + </p> + {isPublic[item.objectId] && ( + <div className="flex mt-2 gap-2 md:items-center"> + <p className="text-[15px]"> + Public role :{" "} + </p> + {role.length > 1 ? ( + <select + className="w-[60%] md:w-[70%] border-[1px] border-gray-200 rounded-sm p-[2px]" + name="textvalidate" + value={selectedPublicRole} + onChange={(e) => + setSelectedPublicRole(e.target.value) + } + > + <option + disabled + style={{ fontSize: "13px" }} + value="" > - <option - disabled - style={{ fontSize: "13px" }} - value="" - > - Select... - </option> - {role.map((data, ind) => { - return ( - <option - style={{ fontSize: "13px" }} - key={ind} - value={data} - > - {data} - </option> - ); - })} - </select> - ) : ( - <div className="w-[60%] md:w-[70%] border-[1px] border-gray-200 rounded-sm p-[2px]"> - {role} - </div> - )} - </div> - )} - </div> - - <hr className="bg-[#ccc] mt-2 " /> - <div className="flex items-center mt-3 gap-2 text-white"> - <button - onClick={() => handlePublicTemplate(item)} - className="px-4 py-1.5 text-white rounded shadow-md text-center focus:outline-none " - style={{ - backgroundColor: modalSubmitBtnColor - }} - > - Submit - </button> - <button - onClick={handleClose} - className="px-4 py-1.5 text-black border-[1px] border-[#ccc] shadow-md rounded focus:outline-none" - style={{ - backgroundColor: modalCancelBtnColor - }} - > - No - </button> - </div> - </div> - </ModalUi> - )} - {isPublicProfile[item.objectId] && ( - <ModalUi - isOpen - title={"Public url"} - handleClose={() => { - setIsPublicProfile({}); - }} - reduceWidth={"md:min-w-[440px] md:max-w-[400px]"} - > - <div className="m-[20px]"> - {publicUserName ? ( - <div className="font-normal text-black"> - <p> - Here’s your public URL. Copy or share it - with the signer, and you will be able to - see all your publicly set templates. - </p> - <div className=" flex items-center gap-5 mt-2 p-[2px] w-[75%]"> - <span className="font-bold"> - Public Url :{" "} - </span> - <span - onClick={() => copytoProfileLink()} - className="underline underline-offset-2 cursor-pointer" - >{`https://opensign.me/${publicUserName}`}</span> - </div> - </div> - ) : ( - <div className="font-normal text-black"> - <p> - Please add your public URL, and you will - be able to make a public template. - </p> - <button - className="px-4 py-1.5 mt-3 text-white rounded shadow-md text-center focus:outline-none " - style={{ - backgroundColor: modalSubmitBtnColor - }} - onClick={() => navigate("/profile")} - > - Add - </button> + Select... + </option> + {role.map((data, ind) => { + return ( + <option + style={{ fontSize: "13px" }} + key={ind} + value={data} + > + {data} + </option> + ); + })} + </select> + ) : ( + <div className="w-[60%] md:w-[70%] border-[1px] border-gray-200 rounded-sm p-[2px]"> + {role} + </div> + )} </div> )} </div> - </ModalUi> - )} - </td> - )} + + <hr className="bg-[#ccc] mt-2 " /> + <div className="flex items-center mt-3 gap-2 text-white"> + <button + onClick={() => handlePublicTemplate(item)} + className="px-4 py-1.5 text-white rounded shadow-md text-center focus:outline-none " + style={{ + backgroundColor: modalSubmitBtnColor + }} + > + Submit + </button> + <button + onClick={handleClose} + className="px-4 py-1.5 text-black border-[1px] border-[#ccc] shadow-md rounded focus:outline-none" + style={{ + backgroundColor: modalCancelBtnColor + }} + > + No + </button> + </div> + </div> + </ModalUi> + )} + {isPublicProfile[item.objectId] && ( + <ModalUi + isOpen + title={"Public url"} + handleClose={() => { + setIsPublicProfile({}); + }} + reduceWidth={"md:min-w-[440px] md:max-w-[400px]"} + > + <div className="m-[20px]"> + {publicUserName ? ( + <div className="font-normal text-black"> + <p> + Here’s your public URL. Copy or share it + with the signer, and you will be able to see + all your publicly set templates. + </p> + <div className=" flex items-center gap-5 mt-2 p-[2px] w-[75%]"> + <span className="font-bold"> + Public Url :{" "} + </span> + <span + onClick={() => copytoProfileLink()} + className="underline underline-offset-2 cursor-pointer" + >{`https://opensign.me/${publicUserName}`}</span> + </div> + </div> + ) : ( + <div className="font-normal text-black"> + <p> + Please add your public URL, and you will be + able to make a public template. + </p> + <button + className="px-4 py-1.5 mt-3 text-white rounded shadow-md text-center focus:outline-none " + style={{ + backgroundColor: modalSubmitBtnColor + }} + onClick={() => navigate("/profile")} + > + Add + </button> + </div> + )} + </div> + </ModalUi> + )} + </td> + {/* )} */} </tr> ) )} diff --git a/apps/OpenSignServer/cloud/parsefunction/CreatePublicTemplate.js b/apps/OpenSignServer/cloud/parsefunction/CreatePublicTemplate.js index b7b5fb0b8..c99b878c2 100644 --- a/apps/OpenSignServer/cloud/parsefunction/CreatePublicTemplate.js +++ b/apps/OpenSignServer/cloud/parsefunction/CreatePublicTemplate.js @@ -3,7 +3,6 @@ export default async function CreatePublicTemplate(request) { const ispublic = request.params.ispublic; const publicrole = request.params.publicrole; try { - console.log('session token', request); if (!request?.user) { throw new Parse.Error(Parse.Error.INVALID_SESSION_TOKEN, 'User is not authenticated.'); } else { From 6b47f6a27b158e1cee9919609fcc72843524f58a Mon Sep 17 00:00:00 2001 From: RaktimaNXG <raktima.c@nxglabs.com> Date: Wed, 29 May 2024 18:56:17 +0530 Subject: [PATCH 063/106] fix: add comment --- apps/OpenSign/src/pages/UserProfile.js | 9 +++------ apps/OpenSign/src/primitives/GetReportDisplay.js | 5 +++++ .../cloud/parsefunction/GetPublicUserName.js | 1 + 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/apps/OpenSign/src/pages/UserProfile.js b/apps/OpenSign/src/pages/UserProfile.js index 625e103be..41937a862 100644 --- a/apps/OpenSign/src/pages/UserProfile.js +++ b/apps/OpenSign/src/pages/UserProfile.js @@ -30,7 +30,7 @@ function UserProfile() { const [publicUserName, setPublicUserName] = useState( extendUser && extendUser?.[0]?.UserName ); - const previousStateValueRef = useRef(publicUserName); + const previousPublicUserName = useRef(publicUserName); const [company, setCompany] = useState( extendUser && extendUser?.[0]?.Company ); @@ -79,7 +79,7 @@ function UserProfile() { } } }; - + //function to check public username already exist const handleCheckPublicUserName = async () => { try { const res = await Parse.Cloud.run("getpublicusername", { @@ -99,14 +99,11 @@ function UserProfile() { }; const handleSubmit = async (e) => { e.preventDefault(); - let phn = Phone, res; - - if (previousStateValueRef.current !== publicUserName) { + if (previousPublicUserName.current !== publicUserName) { res = await handleCheckPublicUserName(); } - if (!res) { setIsLoader(true); try { diff --git a/apps/OpenSign/src/primitives/GetReportDisplay.js b/apps/OpenSign/src/primitives/GetReportDisplay.js index 7fb1a0b7f..b4dac2d5b 100644 --- a/apps/OpenSign/src/primitives/GetReportDisplay.js +++ b/apps/OpenSign/src/primitives/GetReportDisplay.js @@ -754,18 +754,22 @@ const ReportTable = (props) => { const handleViewSigners = (item) => { setIsViewShare({ [item.objectId]: true }); }; + //function to handle change template status is public or private const handlePublicChange = async (e, item) => { const getPlaceholder = item?.Placeholders; + //condiiton to check role is exist or not if (getPlaceholder && getPlaceholder.length > 0) { let extendUser = JSON.parse(localStorage.getItem("Extand_Class")); const userName = extendUser[0]?.UserName; setIsPublicUserName(extendUser[0]?.UserName); + //condition to check user have public url or not if (userName) { setIsPublic({ [item.objectId]: e.target.checked }); const getRole = []; getPlaceholder.map((data) => { getRole.push(data.Role); }); + //condiiton to handle role length if only one then set it default selected role if (getRole.length === 1) { setSelectedPublicRole(getRole[0]); } @@ -784,6 +788,7 @@ const ReportTable = (props) => { } }; + //function to copy public profile link const copytoProfileLink = () => { const url = `https://opensign.me/${publicUserName}`; copytoData(url); diff --git a/apps/OpenSignServer/cloud/parsefunction/GetPublicUserName.js b/apps/OpenSignServer/cloud/parsefunction/GetPublicUserName.js index eb927521c..720027084 100644 --- a/apps/OpenSignServer/cloud/parsefunction/GetPublicUserName.js +++ b/apps/OpenSignServer/cloud/parsefunction/GetPublicUserName.js @@ -4,6 +4,7 @@ async function GetPublicUserName(request) { const userQuery = new Parse.Query('contracts_Users'); userQuery.equalTo('UserName', username); const res = await userQuery.first({ useMasterKey: true }); + return res; } catch (err) { return err; From c6be81923b9712865e5989b26faba9746f2a8cc3 Mon Sep 17 00:00:00 2001 From: RaktimaNXG <raktima.c@nxglabs.com> Date: Wed, 29 May 2024 19:24:04 +0530 Subject: [PATCH 064/106] fix: conflict resolved in userProfile --- apps/OpenSign/src/pages/UserProfile.js | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/apps/OpenSign/src/pages/UserProfile.js b/apps/OpenSign/src/pages/UserProfile.js index 41937a862..fc1d6f43b 100644 --- a/apps/OpenSign/src/pages/UserProfile.js +++ b/apps/OpenSign/src/pages/UserProfile.js @@ -112,7 +112,7 @@ function UserProfile() { await query.get(UserProfile.objectId).then((object) => { object.set("name", name); object.set("ProfilePic", Image); - object.set("phone", phn); + object.set("phone", phn || ""); object.save().then( async (response) => { @@ -121,15 +121,18 @@ function UserProfile() { let rr = JSON.stringify(res); localStorage.setItem("UserInformation", rr); SetName(res.name); - SetPhone(res.phone); + SetPhone(res?.phone || ""); setImage(res.ProfilePic); localStorage.setItem("username", res.name); localStorage.setItem("profileImg", res.ProfilePic); - await updateExtUser({ Name: res.name, Phone: res.phone }); + await updateExtUser({ + Name: res.name, + Phone: res?.phone || "" + }); alert("Profile updated successfully."); setEditMode(false); setIsLoader(false); - // navigate("/dashboard/35KBoSgoAK"); + //navigate("/dashboard/35KBoSgoAK"); } }, (error) => { @@ -169,7 +172,6 @@ function UserProfile() { Company: company }; } - await axios.put( parseBaseUrl + "classes/" + extClass + "/" + ExtUserId, body, @@ -188,6 +190,7 @@ function UserProfile() { const json = JSON.parse(JSON.stringify([res])); const extRes = JSON.stringify(json); localStorage.setItem("Extand_Class", extRes); + // console.log("updateRes ", updateRes); }; // file upload function const fileUpload = async (file) => { @@ -279,7 +282,8 @@ function UserProfile() { setOtpLoader(false); alert("OTP sent on you email"); }; - const handlePublicUrl = (e) => { + //function to handle onchange user name nad restict 6 characters username for free users + const handleOnchangeUserName = (e) => { const value = e.target.value; if (value.length > 6 && !isSubscribe) { setUserNameError("Please upgrade to allow more than 6 characters."); @@ -453,7 +457,7 @@ function UserProfile() { <span>opensign.me/</span> <input - onChange={handlePublicUrl} + onChange={handleOnchangeUserName} value={publicUserName} disabled={!editmode} placeholder="enter user name" @@ -462,7 +466,6 @@ function UserProfile() { </div> </li> {/* )} */} - <li className="border-y-[1px] border-gray-300 break-all"> <div className="flex justify-between items-center py-2"> <span From 3e2c822bbcc0092efc673d863199ae3d558bfdfd Mon Sep 17 00:00:00 2001 From: RaktimaNXG <raktima.c@nxglabs.com> Date: Wed, 29 May 2024 19:39:27 +0530 Subject: [PATCH 065/106] fix: handle condition to save username --- apps/OpenSign/src/pages/UserProfile.js | 28 ++++++++------------------ 1 file changed, 8 insertions(+), 20 deletions(-) diff --git a/apps/OpenSign/src/pages/UserProfile.js b/apps/OpenSign/src/pages/UserProfile.js index 72c75ba97..8cff09052 100644 --- a/apps/OpenSign/src/pages/UserProfile.js +++ b/apps/OpenSign/src/pages/UserProfile.js @@ -152,26 +152,14 @@ function UserProfile() { const extClass = localStorage.getItem("extended_class"); const extData = JSON.parse(localStorage.getItem("Extand_Class")); const ExtUserId = extData[0].objectId; - let body; - if (publicUserName) { - body = { - Phone: obj?.Phone || "", - Name: obj.Name, - HeaderDocId: isDisableDocId, - JobTitle: jobTitle, - Company: company, - UserName: publicUserName - }; - } else { - body = { - Phone: obj?.Phone || "", - Name: obj.Name, - HeaderDocId: isDisableDocId, - JobTitle: jobTitle, - Company: company - }; - } - + const body = { + Phone: obj?.Phone || "", + Name: obj.Name, + HeaderDocId: isDisableDocId, + JobTitle: jobTitle, + Company: company, + UserName: publicUserName + }; await axios.put( parseBaseUrl + "classes/" + extClass + "/" + ExtUserId, body, From dfc6da388c7b50e050d8be99a05ddab680d23d5b Mon Sep 17 00:00:00 2001 From: RaktimaNXG <raktima.c@nxglabs.com> Date: Wed, 29 May 2024 19:44:17 +0530 Subject: [PATCH 066/106] fix: add comment --- apps/OpenSign/src/pages/UserProfile.js | 28 ++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/apps/OpenSign/src/pages/UserProfile.js b/apps/OpenSign/src/pages/UserProfile.js index 8cff09052..330e84ec9 100644 --- a/apps/OpenSign/src/pages/UserProfile.js +++ b/apps/OpenSign/src/pages/UserProfile.js @@ -101,6 +101,7 @@ function UserProfile() { e.preventDefault(); let phn = Phone, res; + //condition to call cloud function when user change publicUserName if (previousPublicUserName.current !== publicUserName) { res = await handleCheckPublicUserName(); } @@ -152,14 +153,25 @@ function UserProfile() { const extClass = localStorage.getItem("extended_class"); const extData = JSON.parse(localStorage.getItem("Extand_Class")); const ExtUserId = extData[0].objectId; - const body = { - Phone: obj?.Phone || "", - Name: obj.Name, - HeaderDocId: isDisableDocId, - JobTitle: jobTitle, - Company: company, - UserName: publicUserName - }; + let body; + if (publicUserName) { + body = { + Phone: obj?.Phone || "", + Name: obj.Name, + HeaderDocId: isDisableDocId, + JobTitle: jobTitle, + Company: company, + UserName: publicUserName + }; + } else { + body = { + Phone: obj?.Phone || "", + Name: obj.Name, + HeaderDocId: isDisableDocId, + JobTitle: jobTitle, + Company: company + }; + } await axios.put( parseBaseUrl + "classes/" + extClass + "/" + ExtUserId, body, From a653df6935abcedfc46d1c9259e36a9535530e52 Mon Sep 17 00:00:00 2001 From: Zathiel <26553418+Zathiel@users.noreply.github.com> Date: Thu, 30 May 2024 01:45:05 +0200 Subject: [PATCH 067/106] FIX : USE_LOCAL variable --- .env.local_dev | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.env.local_dev b/.env.local_dev index 71635fd48..bf88879c4 100644 --- a/.env.local_dev +++ b/.env.local_dev @@ -40,7 +40,7 @@ DO_SECRET_ACCESS_KEY= # Digital ocean spaces region or AWS s3 region DO_REGION=us-west # local storage -USE_LOCAL=TRUE +USE_LOCAL=true # Email mailgun or set SMTP_ENABLE true to use SMTP config (The app will not initialize if any of these 3 variables are not set) ********************************************************************************************************************* MAILGUN_API_KEY= From 83fe88911f9825a4b7a927813004cd286bb70b1d Mon Sep 17 00:00:00 2001 From: RaktimaNXG <raktima.c@nxglabs.com> Date: Thu, 30 May 2024 15:55:16 +0530 Subject: [PATCH 068/106] fix: public toggle issue,cloud function error handling --- apps/OpenSign/src/pages/UserProfile.js | 90 +++-- .../src/primitives/GetReportDisplay.js | 355 +++++++++--------- .../parsefunction/CreatePublicTemplate.js | 4 +- .../cloud/parsefunction/GetPublicTemplate.js | 11 +- .../cloud/parsefunction/GetPublicUserName.js | 24 +- 5 files changed, 264 insertions(+), 220 deletions(-) diff --git a/apps/OpenSign/src/pages/UserProfile.js b/apps/OpenSign/src/pages/UserProfile.js index 330e84ec9..dd684b129 100644 --- a/apps/OpenSign/src/pages/UserProfile.js +++ b/apps/OpenSign/src/pages/UserProfile.js @@ -94,7 +94,7 @@ function UserProfile() { return res; } } catch (e) { - console.log("extend error"); + console.log("error in getpublicusername cloud function"); } }; const handleSubmit = async (e) => { @@ -153,25 +153,15 @@ function UserProfile() { const extClass = localStorage.getItem("extended_class"); const extData = JSON.parse(localStorage.getItem("Extand_Class")); const ExtUserId = extData[0].objectId; - let body; - if (publicUserName) { - body = { - Phone: obj?.Phone || "", - Name: obj.Name, - HeaderDocId: isDisableDocId, - JobTitle: jobTitle, - Company: company, - UserName: publicUserName - }; - } else { - body = { - Phone: obj?.Phone || "", - Name: obj.Name, - HeaderDocId: isDisableDocId, - JobTitle: jobTitle, - Company: company - }; - } + const body = { + Phone: obj?.Phone || "", + Name: obj.Name, + HeaderDocId: isDisableDocId, + JobTitle: jobTitle, + Company: company, + UserName: publicUserName || "" + }; + await axios.put( parseBaseUrl + "classes/" + extClass + "/" + ExtUserId, body, @@ -282,7 +272,7 @@ function UserProfile() { setOtpLoader(false); alert("OTP sent on you email"); }; - //function to handle onchange user name nad restict 6 characters username for free users + //function to handle onchange username and restrict 6-characters username for free users const handleOnchangeUserName = (e) => { const value = e.target.value; if (value.length > 6 && !isSubscribe) { @@ -294,6 +284,15 @@ function UserProfile() { setPublicUserName(e.target.value); } }; + const handleCancel = () => { + setEditMode(false); + SetName(localStorage.getItem("username")); + SetPhone(UserProfile && UserProfile.phone); + setImage(localStorage.getItem("profileImg")); + setPublicUserName(extendUser && extendUser?.[0]?.UserName); + setCompany(extendUser && extendUser?.[0]?.Company); + setJobTitle(extendUser?.[0]?.JobTitle); + }; return ( <React.Fragment> <Title title={"Profile"} /> @@ -450,22 +449,37 @@ function UserProfile() { )} </span> </li> - {/* {!isEnableSubscription && ( */} - <li className="flex justify-between items-center border-t-[1px] border-gray-300 py-2 break-all"> - <span className="font-semibold">Public profile:</span> - <div className="flex items-center"> - <span>opensign.me/</span> - - <input - onChange={handleOnchangeUserName} - value={publicUserName} - disabled={!editmode} - placeholder="enter user name" - className="border-[1px] border-gray-200 rounded-[3px]" - /> - </div> - </li> - {/* )} */} + {!isEnableSubscription && ( + <li className="flex justify-between items-center border-t-[1px] border-gray-300 py-2 break-all"> + <span className="font-semibold"> + Public profile :{" "} + <Tooltip + message={`this is your public URL. Copy or share it + with the signer, and you will be able to see + all your publicly set templates.`} + /> + </span> + <div className="flex items-center"> + <span>opensign.me/</span> + {editmode ? ( + <input + onChange={handleOnchangeUserName} + value={publicUserName} + disabled={!editmode} + placeholder="enter user name" + className="border-[1px] border-gray-200 rounded-[3px]" + /> + ) : ( + <input + value={extendUser?.[0]?.UserName} + disabled + placeholder="enter user name" + className="border-[1px] border-gray-200 rounded-[3px]" + /> + )} + </div> + </li> + )} <li className="border-y-[1px] border-gray-300 break-all"> <div className="flex justify-between items-center py-2"> <span @@ -536,7 +550,7 @@ function UserProfile() { type="button" onClick={() => { if (editmode) { - setEditMode(false); + handleCancel(); } else { navigate("/changepassword"); } diff --git a/apps/OpenSign/src/primitives/GetReportDisplay.js b/apps/OpenSign/src/primitives/GetReportDisplay.js index 9bf42c1e9..b42903dc4 100644 --- a/apps/OpenSign/src/primitives/GetReportDisplay.js +++ b/apps/OpenSign/src/primitives/GetReportDisplay.js @@ -6,8 +6,8 @@ import ModalUi from "./ModalUi"; import AddSigner from "../components/AddSigner"; import { modalSubmitBtnColor, - modalCancelBtnColor - // isEnableSubscription + modalCancelBtnColor, + isEnableSubscription } from "../constant/const"; import Alert from "./Alert"; import Tooltip from "./Tooltip"; @@ -49,12 +49,12 @@ const ReportTable = (props) => { const [templateDeatils, setTemplateDetails] = useState({}); const [placeholders, setPlaceholders] = useState([]); const [isLoader, setIsLoader] = useState({}); - const [role, setRole] = useState([]); const [selectedPublicRole, setSelectedPublicRole] = useState(""); const [isCelebration, setIsCelebration] = useState(false); + const [currentLists, setCurrentLists] = useState([]); const [isPublic, setIsPublic] = useState({}); const [isPublicProfile, setIsPublicProfile] = useState({}); - const [publicUserName, setIsPublicUserName] = useState("raktima"); + const [publicUserName, setIsPublicUserName] = useState(""); const [isViewShare, setIsViewShare] = useState({}); const startIndex = (currentPage - 1) * props.docPerPage; const { isMoreDocs, setIsNextRecord } = props; @@ -246,8 +246,19 @@ const ReportTable = (props) => { // Get current list const indexOfLastDoc = currentPage * props.docPerPage; const indexOfFirstDoc = indexOfLastDoc - props.docPerPage; - // `currentLists` is total record render on current page - const currentLists = props.List?.slice(indexOfFirstDoc, indexOfLastDoc); + useEffect(() => { + // `currentLists` is total record render on current page + const currentList = props.List?.slice(indexOfFirstDoc, indexOfLastDoc); + //check public template and save in a object to show public and private template + setIsPublic( + currentList.reduce((acc, item) => { + acc[item.objectId] = item?.IsPublic || false; + return acc; + }, {}) + ); + setCurrentLists(currentList); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [indexOfLastDoc, indexOfFirstDoc]); // Change page const paginateFront = () => setCurrentPage(currentPage + 1); @@ -309,12 +320,15 @@ const ReportTable = (props) => { setActLoader({}); } }; - const handleClose = () => { + const handleClose = (item) => { setIsRevoke({}); setIsDeleteModal({}); setIsMakePublic({}); setSelectedPublicRole(""); - setIsPublic({}); + setIsPublic((prevStates) => ({ + ...prevStates, + [item.objectId]: !prevStates[item.objectId] + })); setIsPublicProfile({}); }; @@ -706,7 +720,7 @@ const ReportTable = (props) => { //function to make template public and set public role const handlePublicTemplate = async (item) => { - if (selectedPublicRole) { + if (selectedPublicRole || !isPublic[item.objectId]) { setActLoader({ [item.objectId]: true }); setIsMakePublic(false); try { @@ -740,7 +754,7 @@ const ReportTable = (props) => { setActLoader({}); } } catch (e) { - console.log("save public template error", e); + console.log("error in createpublictemplate", e); } } else { setIsAlert(true); @@ -764,16 +778,15 @@ const ReportTable = (props) => { setIsPublicUserName(extendUser[0]?.UserName); //condition to check user have public url or not if (userName) { - setIsPublic({ [item.objectId]: e.target.checked }); - const getRole = []; - getPlaceholder.map((data) => { - getRole.push(data.Role); - }); - //condiiton to handle role length if only one then set it default selected role - if (getRole.length === 1) { - setSelectedPublicRole(getRole[0]); + setIsPublic((prevStates) => ({ + ...prevStates, + [item.objectId]: e.target.checked + })); + const getPlaceholder = item?.Placeholders; + if (getPlaceholder.length === 1) { + setSelectedPublicRole(getPlaceholder[0]?.Role); } - setRole(getRole); + setIsMakePublic({ [item.objectId]: true }); } else { setIsPublicProfile({ [item.objectId]: true }); @@ -788,7 +801,7 @@ const ReportTable = (props) => { } }; - //function to copy public profile link + //function to copy public profile links const copytoProfileLink = () => { const url = `https://opensign.me/${publicUserName}`; copytoData(url); @@ -862,8 +875,7 @@ const ReportTable = (props) => { {props.actions?.length > 0 && ( <th className="px-4 py-2 font-thin">Action</th> )} - {props.ReportName === "Templates" && ( - // && !isEnableSubscription + {props.ReportName === "Templates" && !isEnableSubscription && ( <th className="px-4 py-2 font-thin">Public</th> )} </tr> @@ -1305,165 +1317,170 @@ const ReportTable = (props) => { </ModalUi> )} </td> - {/* {!isEnableSubscription && ( */} - <td className=" pl-[20px] py-2 "> - {props.ReportName === "Templates" && ( - <div className=" flex flex-row-"> - <label - className={ - "cursor-pointer relative inline-flex items-center mb-0" - } - > - <input - checked={ - (isPublic && isPublic[item.objectId]) || - item?.IsPublic || - false + {!isEnableSubscription && ( + <td className=" pl-[20px] py-2 "> + {props.ReportName === "Templates" && ( + <div className=" flex flex-row-"> + <label + className={ + "cursor-pointer relative inline-flex items-center mb-0" } - onChange={(e) => handlePublicChange(e, item)} - type="checkbox" - value="" - className="sr-only peer" - /> - <div className="w-9 h-5 bg-gray-200 peer-focus:outline-none peer-focus:ring-1 peer-focus:ring-black rounded-full peer dark:bg-gray-700 peer-checked:after:translate-x-full rtl:peer-checked:after:-translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:start-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-4 after:w-4 after:transition-all dark:border-black peer-checked:bg-blue-600"></div> - </label> - </div> - )} - {isMakePublic[item.objectId] && ( - <ModalUi - isOpen - title={"Make template public"} - handleClose={() => { - setIsMakePublic({}); - setSelectedPublicRole(""); - setIsPublic({}); - }} - > - <div className="m-[20px]"> - <div className="font-normal text-black"> - <p className="text-lg"> - {" "} - {isPublic[item.objectId] - ? `Are you sure you want to make this template - public ?` - : `Are you sure you want to make this template - private ?`} - </p> - {isPublic[item.objectId] && ( - <div className="flex mt-2 gap-2 md:items-center"> - <p className="text-[15px]"> - Public role :{" "} - </p> - {role.length > 1 ? ( - <select - className="w-[60%] md:w-[70%] border-[1px] border-gray-200 rounded-sm p-[2px]" - name="textvalidate" - value={selectedPublicRole} - onChange={(e) => - setSelectedPublicRole(e.target.value) - } - > - <option - disabled - style={{ fontSize: "13px" }} - value="" - > - Select... - </option> - {role.map((data, ind) => { - return ( - <option - style={{ fontSize: "13px" }} - key={ind} - value={data} - > - {data} - </option> - ); - })} - </select> - ) : ( - <div className="w-[60%] md:w-[70%] border-[1px] border-gray-200 rounded-sm p-[2px]"> - {role} - </div> - )} - </div> - )} - </div> - - <hr className="bg-[#ccc] mt-2 " /> - <div className="flex items-center mt-3 gap-2 text-white"> - <button - onClick={() => handlePublicTemplate(item)} - className="px-4 py-1.5 text-white rounded shadow-md text-center focus:outline-none " - style={{ - backgroundColor: modalSubmitBtnColor - }} - > - Submit - </button> - <button - onClick={handleClose} - className="px-4 py-1.5 text-black border-[1px] border-[#ccc] shadow-md rounded focus:outline-none" - style={{ - backgroundColor: modalCancelBtnColor - }} - > - No - </button> - </div> + > + <input + checked={isPublic[item.objectId]} + onChange={(e) => handlePublicChange(e, item)} + type="checkbox" + value="" + className="sr-only peer" + /> + <div className="w-9 h-5 bg-gray-200 peer-focus:outline-none peer-focus:ring-1 peer-focus:ring-black rounded-full peer dark:bg-gray-700 peer-checked:after:translate-x-full rtl:peer-checked:after:-translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:start-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-4 after:w-4 after:transition-all dark:border-black peer-checked:bg-blue-600"></div> + </label> </div> - </ModalUi> - )} - {isPublicProfile[item.objectId] && ( - <ModalUi - isOpen - title={"Public url"} - handleClose={() => { - setIsPublicProfile({}); - }} - reduceWidth={"md:min-w-[440px] md:max-w-[400px]"} - > - <div className="m-[20px]"> - {publicUserName ? ( + )} + {isMakePublic[item.objectId] && ( + <ModalUi + isOpen + title={ + isPublic[item.objectId] + ? "Make template public" + : "Make template private" + } + handleClose={() => { + setIsMakePublic({}); + setSelectedPublicRole(""); + setIsPublic((prevStates) => ({ + ...prevStates, + [item.objectId]: !prevStates[item.objectId] + })); + }} + > + <div className="m-[20px]"> <div className="font-normal text-black"> - <p> - Here’s your public URL. Copy or share it - with the signer, and you will be able to see - all your publicly set templates. + <p className="text-lg"> + {" "} + {isPublic[item.objectId] + ? `Are you sure you want tof make this templat public ?` + : `Are you sure you want to make this template private? This will remove it from your public profile ?`} </p> - <div className=" flex items-center gap-5 mt-2 p-[2px] w-[75%]"> - <span className="font-bold"> - Public Url :{" "} - </span> - <span - onClick={() => copytoProfileLink()} - className="underline underline-offset-2 cursor-pointer" - >{`https://opensign.me/${publicUserName}`}</span> - </div> + {isPublic[item.objectId] && ( + <div className="flex mt-2 gap-2 md:items-center"> + <p className="text-[15px]"> + Public role :{" "} + </p> + {item?.Placeholders?.length > 1 ? ( + <select + className="w-[60%] md:w-[70%] border-[1px] border-gray-200 rounded-sm p-[2px]" + name="textvalidate" + value={selectedPublicRole} + onChange={(e) => + setSelectedPublicRole( + e.target.value + ) + } + > + <option + disabled + style={{ fontSize: "13px" }} + value="" + > + Select... + </option> + {item?.Placeholders.map( + (data, ind) => { + return ( + <option + style={{ fontSize: "13px" }} + key={ind} + value={data?.Role} + > + {data?.Role} + </option> + ); + } + )} + </select> + ) : ( + <div className="w-[60%] md:w-[70%] border-[1px] border-gray-200 rounded-sm p-[2px]"> + {item?.Placeholders[0]?.Role} + </div> + )} + </div> + )} </div> - ) : ( - <div className="font-normal text-black"> - <p> - Please add your public URL, and you will be - able to make a public template. - </p> + + <hr className="bg-[#ccc] mt-2 " /> + <div className="flex items-center mt-3 gap-2 text-white"> <button - className="px-4 py-1.5 mt-3 text-white rounded shadow-md text-center focus:outline-none " + onClick={() => handlePublicTemplate(item)} + className="px-4 py-1.5 text-white rounded shadow-md text-center focus:outline-none " style={{ backgroundColor: modalSubmitBtnColor }} - onClick={() => navigate("/profile")} > - Add + Submit + </button> + <button + onClick={() => handleClose(item)} + className="px-4 py-1.5 text-black border-[1px] border-[#ccc] shadow-md rounded focus:outline-none" + style={{ + backgroundColor: modalCancelBtnColor + }} + > + No </button> </div> - )} - </div> - </ModalUi> - )} - </td> - {/* )} */} + </div> + </ModalUi> + )} + {isPublicProfile[item.objectId] && ( + <ModalUi + isOpen + title={"Public URL"} + handleClose={() => { + setIsPublicProfile({}); + }} + reduceWidth={"md:min-w-[440px] md:max-w-[400px]"} + > + <div className="m-[20px]"> + {publicUserName ? ( + <div className="font-normal text-black"> + <p> + Here’s your public URL. Copy or share it + with the signer, and you will be able to + see all your publicly set templates. + </p> + <div className=" flex items-center gap-5 mt-2 p-[2px] w-[75%]"> + <span className="font-bold"> + Public URL :{" "} + </span> + <span + onClick={() => copytoProfileLink()} + className="underline underline-offset-2 cursor-pointer" + >{`https://opensign.me/${publicUserName}`}</span> + </div> + </div> + ) : ( + <div className="font-normal text-black"> + <p> + Please add your public URL, and you will + be able to make a public template. + </p> + <button + className="px-4 py-1.5 mt-3 text-white rounded shadow-md text-center focus:outline-none " + style={{ + backgroundColor: modalSubmitBtnColor + }} + onClick={() => navigate("/profile")} + > + Add + </button> + </div> + )} + </div> + </ModalUi> + )} + </td> + )} </tr> ) )} diff --git a/apps/OpenSignServer/cloud/parsefunction/CreatePublicTemplate.js b/apps/OpenSignServer/cloud/parsefunction/CreatePublicTemplate.js index c99b878c2..1831b9f47 100644 --- a/apps/OpenSignServer/cloud/parsefunction/CreatePublicTemplate.js +++ b/apps/OpenSignServer/cloud/parsefunction/CreatePublicTemplate.js @@ -7,7 +7,7 @@ export default async function CreatePublicTemplate(request) { throw new Parse.Error(Parse.Error.INVALID_SESSION_TOKEN, 'User is not authenticated.'); } else { const userId = request?.user && request?.user?.id; - if (userId) { + if (templateid) { const updateTemplate = new Parse.Object('contracts_Template'); updateTemplate.id = templateid; if (ispublic) { @@ -29,7 +29,7 @@ export default async function CreatePublicTemplate(request) { }; } } else { - throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'User does not exist.'); + throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Please provide required parameters!'); } } } catch (err) { diff --git a/apps/OpenSignServer/cloud/parsefunction/GetPublicTemplate.js b/apps/OpenSignServer/cloud/parsefunction/GetPublicTemplate.js index 33c2a1050..2b356bd32 100644 --- a/apps/OpenSignServer/cloud/parsefunction/GetPublicTemplate.js +++ b/apps/OpenSignServer/cloud/parsefunction/GetPublicTemplate.js @@ -16,14 +16,17 @@ async function GetPublicTemplate(request) { templatQuery.equalTo('IsPublic', true); const getTemplate = await templatQuery.find({ useMasterKey: true }); return getTemplate; + } else { + throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Template not found'); } - return { error: "You don't have access of this document!" }; } else { - return { error: 'Please provide username!' }; + throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Please provide required parameters!'); } } catch (err) { - console.log('error', err); - return { error: "You don't have access of this document!" }; + const code = err.code || 400; + const msg = err.message; + const error = new Parse.Error(code, msg); + throw error; } } export default GetPublicTemplate; diff --git a/apps/OpenSignServer/cloud/parsefunction/GetPublicUserName.js b/apps/OpenSignServer/cloud/parsefunction/GetPublicUserName.js index 720027084..94b08a330 100644 --- a/apps/OpenSignServer/cloud/parsefunction/GetPublicUserName.js +++ b/apps/OpenSignServer/cloud/parsefunction/GetPublicUserName.js @@ -1,13 +1,23 @@ async function GetPublicUserName(request) { try { - const username = request.params.username; - const userQuery = new Parse.Query('contracts_Users'); - userQuery.equalTo('UserName', username); - const res = await userQuery.first({ useMasterKey: true }); - - return res; + if (!request?.user) { + throw new Parse.Error(Parse.Error.INVALID_SESSION_TOKEN, 'User is not authenticated.'); + } else { + const username = request.params.username; + if (username) { + const userQuery = new Parse.Query('contracts_Users'); + userQuery.equalTo('UserName', username); + const res = await userQuery.first({ useMasterKey: true }); + return res; + } else { + throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Please provide required parameters!'); + } + } } catch (err) { - return err; + const code = err.code || 400; + const msg = err.message; + const error = new Parse.Error(code, msg); + throw error; } } export default GetPublicUserName; From aeead23c864a110624c0c923b264273f01fcb5d7 Mon Sep 17 00:00:00 2001 From: RaktimaNXG <raktima.c@nxglabs.com> Date: Thu, 30 May 2024 15:57:16 +0530 Subject: [PATCH 069/106] fix: change public profile url --- apps/OpenSign/src/pages/UserProfile.js | 2 +- apps/OpenSign/src/primitives/GetReportDisplay.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/OpenSign/src/pages/UserProfile.js b/apps/OpenSign/src/pages/UserProfile.js index dd684b129..fe27836eb 100644 --- a/apps/OpenSign/src/pages/UserProfile.js +++ b/apps/OpenSign/src/pages/UserProfile.js @@ -460,7 +460,7 @@ function UserProfile() { /> </span> <div className="flex items-center"> - <span>opensign.me/</span> + <span>opensign-me.vercel.app/</span> {editmode ? ( <input onChange={handleOnchangeUserName} diff --git a/apps/OpenSign/src/primitives/GetReportDisplay.js b/apps/OpenSign/src/primitives/GetReportDisplay.js index b42903dc4..8b53afd56 100644 --- a/apps/OpenSign/src/primitives/GetReportDisplay.js +++ b/apps/OpenSign/src/primitives/GetReportDisplay.js @@ -803,7 +803,7 @@ const ReportTable = (props) => { //function to copy public profile links const copytoProfileLink = () => { - const url = `https://opensign.me/${publicUserName}`; + const url = `https://opensign-me.vercel.app/${publicUserName}`; copytoData(url); setIsAlert(true); setAlertMsg({ From c00406e40119ab713980044f8585d432a3e2765a Mon Sep 17 00:00:00 2001 From: RaktimaNXG <raktima.c@nxglabs.com> Date: Thu, 30 May 2024 17:24:33 +0530 Subject: [PATCH 070/106] fix: template list status issue on pagination --- .../src/primitives/GetReportDisplay.js | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/apps/OpenSign/src/primitives/GetReportDisplay.js b/apps/OpenSign/src/primitives/GetReportDisplay.js index 8b53afd56..a20f72c55 100644 --- a/apps/OpenSign/src/primitives/GetReportDisplay.js +++ b/apps/OpenSign/src/primitives/GetReportDisplay.js @@ -748,13 +748,28 @@ const ReportTable = (props) => { type: "success", message: "You have successfully made the template private." }); - setSelectedPublicRole(""); } + const updateList = props.List.map((x) => + x.objectId === item.objectId + ? { ...x, IsPublic: isPublic[item.objectId] } + : x + ); + props.setList(updateList); setActLoader({}); } } catch (e) { console.log("error in createpublictemplate", e); + setIsAlert(true); + setAlertMsg({ + type: "danger", + message: "Something went wrong, Please try again later!" + }); + setTimeout(() => setIsAlert(false), 1500); + setIsPublic((prevStates) => ({ + ...prevStates, + [item.objectId]: !prevStates[item.objectId] + })); } } else { setIsAlert(true); @@ -765,6 +780,7 @@ const ReportTable = (props) => { setTimeout(() => setIsAlert(false), 1500); } }; + const handleViewSigners = (item) => { setIsViewShare({ [item.objectId]: true }); }; @@ -1327,7 +1343,7 @@ const ReportTable = (props) => { } > <input - checked={isPublic[item.objectId]} + checked={isPublic?.[item.objectId]} onChange={(e) => handlePublicChange(e, item)} type="checkbox" value="" From 8a5d3a0368e3978ba7236a4712e078a9da3441f3 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <prafull.navkar@nxglabs.com> Date: Thu, 30 May 2024 17:35:40 +0530 Subject: [PATCH 071/106] Fix: not able to create contract from add user icon in PDF UI --- .../src/primitives/{AddUser.js => AddContact.js} | 12 ++++++------ apps/OpenSign/src/primitives/LinkUserModal.js | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) rename apps/OpenSign/src/primitives/{AddUser.js => AddContact.js} (97%) diff --git a/apps/OpenSign/src/primitives/AddUser.js b/apps/OpenSign/src/primitives/AddContact.js similarity index 97% rename from apps/OpenSign/src/primitives/AddUser.js rename to apps/OpenSign/src/primitives/AddContact.js index c62fe11eb..a7abdbab3 100644 --- a/apps/OpenSign/src/primitives/AddUser.js +++ b/apps/OpenSign/src/primitives/AddContact.js @@ -2,7 +2,7 @@ import React, { useState, useEffect } from "react"; import Parse from "parse"; import axios from "axios"; import "../styles/AddUser.css"; -const AddUser = (props) => { +const AddContact = (props) => { const [name, setName] = useState(""); const [phone, setPhone] = useState(""); const [email, setEmail] = useState(""); @@ -50,7 +50,9 @@ const AddUser = (props) => { try { const contactQuery = new Parse.Object("contracts_Contactbook"); contactQuery.set("Name", name); - contactQuery.set("Phone", phone); + if (phone) { + contactQuery.set("Phone", phone); + } contactQuery.set("Email", email); contactQuery.set("UserRole", "contracts_Guest"); @@ -68,10 +70,10 @@ const AddUser = (props) => { _user.set("name", name); _user.set("username", email); _user.set("email", email); + _user.set("password", email); if (phone) { _user.set("phone", phone); } - _user.set("email", email); const user = await _user.save(); if (user) { @@ -256,14 +258,12 @@ const AddUser = (props) => { <div className="form-section"> <label htmlFor="phone" style={{ fontSize: 13 }}> Phone - <span style={{ color: "red", fontSize: 13 }}> *</span> </label> <input type="text" id="phone" value={phone} onChange={(e) => setPhone(e.target.value)} - required disabled={addYourself} className="addUserInput" /> @@ -287,4 +287,4 @@ const AddUser = (props) => { ); }; -export default AddUser; +export default AddContact; diff --git a/apps/OpenSign/src/primitives/LinkUserModal.js b/apps/OpenSign/src/primitives/LinkUserModal.js index a8caa61b2..4af32dad4 100644 --- a/apps/OpenSign/src/primitives/LinkUserModal.js +++ b/apps/OpenSign/src/primitives/LinkUserModal.js @@ -1,6 +1,6 @@ import React from "react"; import SelectSigners from "../components/shared/fields/SelectSigners"; -import AddUser from "./AddUser"; +import AddContact from "./AddContact"; import ModalUi from "./ModalUi"; const LinkUserModal = (props) => { @@ -43,7 +43,7 @@ const LinkUserModal = (props) => { }} ></span> </div> - <AddUser details={props.handleAddUser} closePopup={props.closePopup} /> + <AddContact details={props.handleAddUser} closePopup={props.closePopup} /> </ModalUi> ); }; From eb3bb77692ce814b55606d679a7a76c848682e5d Mon Sep 17 00:00:00 2001 From: RaktimaNXG <raktima.c@nxglabs.com> Date: Thu, 30 May 2024 18:08:54 +0530 Subject: [PATCH 072/106] fix: incorrect condition implementation for setting template as public based on isEnableSubscription --- apps/OpenSign/src/pages/UserProfile.js | 2 +- apps/OpenSign/src/primitives/GetReportDisplay.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/OpenSign/src/pages/UserProfile.js b/apps/OpenSign/src/pages/UserProfile.js index fe27836eb..cbc0d2429 100644 --- a/apps/OpenSign/src/pages/UserProfile.js +++ b/apps/OpenSign/src/pages/UserProfile.js @@ -449,7 +449,7 @@ function UserProfile() { )} </span> </li> - {!isEnableSubscription && ( + {isEnableSubscription && ( <li className="flex justify-between items-center border-t-[1px] border-gray-300 py-2 break-all"> <span className="font-semibold"> Public profile :{" "} diff --git a/apps/OpenSign/src/primitives/GetReportDisplay.js b/apps/OpenSign/src/primitives/GetReportDisplay.js index a20f72c55..0a04073bf 100644 --- a/apps/OpenSign/src/primitives/GetReportDisplay.js +++ b/apps/OpenSign/src/primitives/GetReportDisplay.js @@ -891,7 +891,7 @@ const ReportTable = (props) => { {props.actions?.length > 0 && ( <th className="px-4 py-2 font-thin">Action</th> )} - {props.ReportName === "Templates" && !isEnableSubscription && ( + {props.ReportName === "Templates" && isEnableSubscription && ( <th className="px-4 py-2 font-thin">Public</th> )} </tr> @@ -1333,7 +1333,7 @@ const ReportTable = (props) => { </ModalUi> )} </td> - {!isEnableSubscription && ( + {isEnableSubscription && ( <td className=" pl-[20px] py-2 "> {props.ReportName === "Templates" && ( <div className=" flex flex-row-"> From bc5c8cac33fa692d828f4edd071564705ebef276 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <prafull.navkar@nxglabs.com> Date: Fri, 31 May 2024 11:41:53 +0530 Subject: [PATCH 073/106] feat: existing user can sign in with sso --- apps/OpenSign/src/App.js | 2 + apps/OpenSign/src/components/Header.js | 4 +- apps/OpenSign/src/pages/Login.js | 225 +++++++++--------- apps/OpenSign/src/pages/SSOVerify.js | 208 ++++++++++++++++ apps/OpenSignServer/auth/authadapter.js | 27 +++ apps/OpenSignServer/cloud/main.js | 2 + .../cloud/parsefunction/SendMailOTPv1.js | 2 +- .../cloud/parsefunction/UserGroups.js | 52 ++-- .../cloud/parsefunction/ssoSignin.js | 115 +++++++++ apps/OpenSignServer/index.js | 11 +- 10 files changed, 497 insertions(+), 151 deletions(-) create mode 100644 apps/OpenSign/src/pages/SSOVerify.js create mode 100644 apps/OpenSignServer/auth/authadapter.js create mode 100644 apps/OpenSignServer/cloud/parsefunction/ssoSignin.js diff --git a/apps/OpenSign/src/App.js b/apps/OpenSign/src/App.js index 40bebb3de..eb6f3dbda 100644 --- a/apps/OpenSign/src/App.js +++ b/apps/OpenSign/src/App.js @@ -16,6 +16,7 @@ import PlaceHolderSign from "./pages/PlaceHolderSign"; import PdfRequestFiles from "./pages/PdfRequestFiles"; import LazyPage from "./primitives/LazyPage"; import { isEnableSubscription } from "./constant/const"; +import SSOVerify from "./pages/SSOVerify"; const DebugPdf = lazy(() => import("./pages/DebugPdf")); const ForgetPassword = lazy(() => import("./pages/ForgetPassword")); const GuestLogin = lazy(() => import("./pages/GuestLogin")); @@ -181,6 +182,7 @@ function App() { element={<PdfRequestFiles />} /> </Route> + <Route path="/sso" element={<SSOVerify />} /> <Route path="*" element={<PageNotFound />} /> </Routes> </BrowserRouter> diff --git a/apps/OpenSign/src/components/Header.js b/apps/OpenSign/src/components/Header.js index 2b1a477cb..90563aac5 100644 --- a/apps/OpenSign/src/components/Header.js +++ b/apps/OpenSign/src/components/Header.js @@ -44,7 +44,9 @@ const Header = ({ showSidebar }) => { const closeDropdown = () => { setIsOpen(false); - Parse.User.logOut(); + if (Parse?.User?.current()) { + Parse.User.logOut(); + } let appdata = localStorage.getItem("userSettings"); let applogo = localStorage.getItem("appLogo"); let appName = localStorage.getItem("appName"); diff --git a/apps/OpenSign/src/pages/Login.js b/apps/OpenSign/src/pages/Login.js index 24ef4f7b8..c5251ed27 100644 --- a/apps/OpenSign/src/pages/Login.js +++ b/apps/OpenSign/src/pages/Login.js @@ -19,7 +19,7 @@ import Alert from "../primitives/Alert"; import { appInfo } from "../constant/appinfo"; import { fetchAppInfo } from "../redux/reducers/infoReducer"; import { showTenant } from "../redux/reducers/ShowTenant"; -import { fetchSubscription, getAppLogo } from "../constant/Utils"; +import { fetchSubscription, getAppLogo, openInNewTab } from "../constant/Utils"; function Login() { const navigate = useNavigate(); const location = useLocation(); @@ -1016,8 +1016,9 @@ function Login() { const handleCloseModal = () => { setIsModal(false); - Parse.User.logOut(); - + if (Parse?.User?.current()) { + Parse.User.logOut(); + } let appdata = localStorage.getItem("userSettings"); let applogo = localStorage.getItem("appLogo"); let appName = localStorage.getItem("appName"); @@ -1040,6 +1041,15 @@ function Login() { localStorage.setItem("baseUrl", baseUrl); localStorage.setItem("parseAppId", appid); }; + const handleSignInWithSSO = () => { + if (state?.email) { + openInNewTab( + `https://osl-jacksonv2.vercel.app/api/oauth/authorize?response_type=code&provider=saml&tenant=Okta-dev-nxglabs-in&product=OpenSign&redirect_uri=http://localhost:3000/sso&state=${state.email}` + ); + } else { + alert("Please provide email."); + } + }; return ( <div className="bg-white"> <Title title={"Login Page"} /> @@ -1087,136 +1097,123 @@ function Login() { </div> <div className="grid grid-cols-1 md:grid-cols-2 gap-x-2"> <div> - <div> - <form onSubmit={handleSubmit} aria-label="Login Form"> - <h1 className="text-[30px] mt-6">Welcome Back!</h1> - <fieldset> - <legend className="text-[12px] text-[#878787]"> - Login to your account - </legend> - <div className="px-6 py-4 outline outline-1 outline-slate-300/50 my-2 rounded shadow-md"> - <label className="block text-xs" htmlFor="email"> - Username - </label> + <form onSubmit={handleSubmit} aria-label="Login Form"> + <h1 className="text-[30px] mt-6">Welcome Back!</h1> + <fieldset> + <legend className="text-[12px] text-[#878787]"> + Login to your account + </legend> + <div className="px-6 py-4 outline outline-1 outline-slate-300/50 my-2 rounded shadow-md"> + <label className="block text-xs" htmlFor="email"> + Email + </label> + <input + id="email" + type="text" + className="px-3 py-2 w-full border-[1px] border-gray-300 rounded text-xs" + name="email" + value={state.email} + onChange={handleChange} + required + /> + <hr className="my-2 border-none" /> + <label className="block text-xs" htmlFor="password"> + Password + </label> + <div className="relative"> <input - id="email" - type="text" + id="password" + type={state.passwordVisible ? "text" : "password"} className="px-3 py-2 w-full border-[1px] border-gray-300 rounded text-xs" - name="email" - value={state.email} + name="password" + value={state.password} onChange={handleChange} required /> - <hr className="my-2 border-none" /> - <label className="block text-xs" htmlFor="password"> - Password - </label> - <div className="relative"> - <input - id="password" - type={state.passwordVisible ? "text" : "password"} - className="px-3 py-2 w-full border-[1px] border-gray-300 rounded text-xs" - name="password" - value={state.password} - onChange={handleChange} - required - /> - <span - className={`absolute top-[50%] right-[10px] -translate-y-[50%] cursor-pointer ${ - state.passwordVisible - ? "text-[#007bff]" - : "text-black" - }`} - onClick={togglePasswordVisibility} - > - {state.passwordVisible ? ( - <i className="fa fa-eye-slash text-xs pb-1" /> // Close eye icon - ) : ( - <i className="fa fa-eye text-xs pb-1 " /> // Open eye icon - )} - </span> - </div> - <div className="relative mt-1"> - <NavLink - to="/forgetpassword" - className="text-[13px] text-[#002864] hover:underline underline-offset-1 focus:outline-none cursor-pointer ml-1" - > - Forgot Password? - </NavLink> - </div> + <span + className={`absolute top-[50%] right-[10px] -translate-y-[50%] cursor-pointer ${ + state.passwordVisible + ? "text-[#007bff]" + : "text-black" + }`} + onClick={togglePasswordVisibility} + > + {state.passwordVisible ? ( + <i className="fa fa-eye-slash text-xs pb-1" /> // Close eye icon + ) : ( + <i className="fa fa-eye text-xs pb-1 " /> // Open eye icon + )} + </span> + </div> + <div className="relative mt-1"> + <NavLink + to="/forgetpassword" + className="text-[13px] text-[#002864] hover:underline underline-offset-1 focus:outline-none cursor-pointer ml-1" + > + Forgot Password? + </NavLink> </div> - </fieldset> - <div className="flex flex-col md:flex-row justify-between items-stretch gap-8 text-center text-xs font-bold mt-2"> - <button - type="submit" - className="rounded-sm bg-[#3ac9d6] text-white w-full py-3 shadow outline-none uppercase focus:ring-2 focus:ring-blue-600" - disabled={state.loading} - > - {state.loading ? "Loading..." : "Login"} - </button> - <NavLink - className="rounded-sm cursor-pointer bg-white border-[1px] border-[#15b4e9] text-[#15b4e9] w-full py-3 shadow uppercase" - to={ - location.search - ? "/signup" + location.search - : "/signup" - } - style={width < 768 ? { textAlign: "center" } : {}} - > - Create Account - </NavLink> </div> - </form> - <br /> - {(appInfo.fbAppId || appInfo.googleClietId) && ( - <div className="text-sm flex justify-center items-center"> - <hr className="border-[1px] border-gray-300 w-full" /> - <span className="px-2 text-gray-500 cursor-default"> - OR - </span> - <hr className="border-[1px] border-gray-300 w-full" /> - </div> - )} - <br /> - <div - style={{ - textAlign: "center", - display: "flex", - alignItems: "center", - justifyContent: "center" - }} - > - {/* {appInfo.fbAppId && appInfo.fbAppId !== "" ? ( + </fieldset> + <div className="flex flex-col md:flex-row justify-between items-stretch gap-8 text-center text-xs font-bold mt-2"> + <button + type="submit" + className="rounded-sm bg-[#3ac9d6] text-white w-full py-3 shadow outline-none uppercase focus:ring-2 focus:ring-blue-600" + disabled={state.loading} + > + {state.loading ? "Loading..." : "Login"} + </button> + <NavLink + className="rounded-sm cursor-pointer bg-white border-[1px] border-[#15b4e9] text-[#15b4e9] w-full py-3 shadow uppercase" + to={ + location.search + ? "/signup" + location.search + : "/signup" + } + style={width < 768 ? { textAlign: "center" } : {}} + > + Create Account + </NavLink> + </div> + </form> + <br /> + {appInfo.googleClietId && ( + <div className="text-sm flex justify-center items-center"> + <hr className="border-[1px] border-gray-300 w-full" /> + <span className="px-2 text-gray-500 cursor-default"> + OR + </span> + <hr className="border-[1px] border-gray-300 w-full" /> + </div> + )} + <br /> + <div className="flex flex-col justify-center items-center gap-y-3"> + {/* {appInfo?.fbAppId && ( <LoginFacebook FBCred={appInfo.fbAppId} thirdpartyLoginfn={thirdpartyLoginfn} thirdpartyLoader={state.thirdpartyLoader} setThirdpartyLoader={setThirdpartyLoader} /> - ) : null} */} - </div> - <div style={{ margin: "10px 0" }}></div> + )} */} + {appInfo?.googleClietId && ( + <GoogleSignInBtn + GoogleCred={appInfo.googleClietId} + thirdpartyLoginfn={thirdpartyLoginfn} + thirdpartyLoader={state.thirdpartyLoader} + setThirdpartyLoader={setThirdpartyLoader} + /> + )} <div - style={{ - textAlign: "center", - display: "flex", - alignItems: "center", - justifyContent: "center" - }} + className="cursor-pointer border-[1px] border-gray-300 rounded px-[40px] py-2 font-semibold text-sm hover:border-[#d2e3fc] hover:bg-[#ecf3feb7]" + onClick={() => handleSignInWithSSO()} > - {appInfo.googleClietId && appInfo.googleClietId !== "" ? ( - <GoogleSignInBtn - GoogleCred={appInfo.googleClietId} - thirdpartyLoginfn={thirdpartyLoginfn} - thirdpartyLoader={state.thirdpartyLoader} - setThirdpartyLoader={setThirdpartyLoader} - /> - ) : null} + Sign in with SSO </div> </div> </div> {width >= 768 && ( - <div className="self-center"> + <div className="place-self-center"> <div className="mx-auto md:w-[300px] lg:w-[400px] xl:w-[500px]"> <img src={login_img} diff --git a/apps/OpenSign/src/pages/SSOVerify.js b/apps/OpenSign/src/pages/SSOVerify.js new file mode 100644 index 000000000..e811b2f08 --- /dev/null +++ b/apps/OpenSign/src/pages/SSOVerify.js @@ -0,0 +1,208 @@ +// import axios from "axios"; +import React, { useEffect } from "react"; +import { useLocation, useNavigate } from "react-router-dom"; +import Parse from "parse"; +import axios from "axios"; +import { appInfo } from "../constant/appinfo"; +import { isEnableSubscription } from "../constant/const"; +import { fetchSubscription } from "../constant/Utils"; +import { useDispatch } from "react-redux"; +import { showTenant } from "../redux/reducers/ShowTenant"; +const SSOVerify = () => { + const location = useLocation(); + const navigate = useNavigate(); + const dispatch = useDispatch(); + + useEffect(() => { + getAccesstoken(); + // eslint-disable-next-line + }, []); + const getAccesstoken = async () => { + const param = new URLSearchParams(location.search); + const code = param?.get("code"); + const state = param?.get("state"); + // console.log("code ", code); + try { + const ssosign = await Parse.Cloud.run("ssosign", { + code: code, + email: state + }); + await checkExtUser(ssosign); + // console.log("ssores ", ssosign); + } catch (err) { + console.log("err", err); + } + }; + const checkExtUser = async (ssosign) => { + // const extUser = new Parse.Query("contracts_Users"); + // extUser.equalTo("Email", details.Gmail); + // const extRes = await extUser.first(); + const params = { email: ssosign?.email }; + const extRes = await Parse.Cloud.run("getUserDetails", params); + // console.log("extRes ", extRes); + if (extRes) { + if (ssosign && ssosign.sessiontoken) { + const LocalUserDetails = { + name: extRes.Name, + email: extRes.email, + phone: extRes?.get("Phone") || "", + company: extRes.get("Company") + }; + localStorage.setItem("userDetails", JSON.stringify(LocalUserDetails)); + thirdpartyLoginfn(ssosign.sessiontoken); + } + return { msg: "exist" }; + } else { + // setIsModal(true); + // setThirdpartyLoader(false); + console.log("not exist"); + return { msg: "notexist" }; + } + }; + const thirdpartyLoginfn = async (sessionToken) => { + const baseUrl = localStorage.getItem("baseUrl"); + const parseAppId = localStorage.getItem("parseAppId"); + try { + const validUser = await Parse.User.become(sessionToken); + if (validUser) { + localStorage.setItem("accesstoken", sessionToken); + const _user = JSON.parse(JSON.stringify(validUser)); + // console.log("_user ", _user); + localStorage.setItem("UserInformation", JSON.stringify(_user)); + if (_user.ProfilePic) { + localStorage.setItem("profileImg", _user.ProfilePic); + } else { + localStorage.setItem("profileImg", ""); + } + // Check extended class user role and tenentId + try { + let userRoles = []; + if (appInfo.settings) { + const userSettings = appInfo.settings; + + //Get Current user roles + let url = `${baseUrl}functions/UserGroups`; + const headers = { + "Content-Type": "application/json", + "X-Parse-Application-Id": parseAppId, + sessionToken: _user.sessionToken + }; + const body = { appname: appInfo.appname }; + const UserGroupsRes = await axios.post(url, JSON.stringify(body), { + headers: headers + }); + userRoles = (UserGroupsRes.data && UserGroupsRes.data.result) || []; + if (userRoles) { + let _currentRole = ""; + // const excludeRoles = ["contracts_Guest", `contracts_appeditor`]; + // const filteredRole = userRoles.filter( + // (x) => !excludeRoles.includes(x) + // ); + // if (filteredRole?.length > 1) { + // _currentRole = userRoles.filter((x) => x === "contracts_User"); + // } else { + // _currentRole = rolesfiltered[0]; + // } + _currentRole = userRoles?.find((x) => x === "contracts_User"); + if (_currentRole) { + const roleSetting = userSettings?.find( + (setting) => setting.role === _currentRole + ); + const redirectUrl = + location?.state?.from || + `/${roleSetting.pageType}/${roleSetting.pageId}`; + const _role = _currentRole.replace(`${appInfo.appname}_`, ""); + localStorage.setItem("_user_role", _role); + // Get TenentID from Extendend Class + localStorage.setItem( + "extended_class", + roleSetting.extended_class + ); + try { + const extUser = await Parse.Cloud.run("getUserDetails", { + email: _user.email + }); + if (extUser) { + const _extUser = JSON.parse(JSON.stringify(extUser)); + localStorage.setItem("userEmail", _extUser.Email); + localStorage.setItem("username", _extUser.Name); + localStorage.setItem("scriptId", true); + // console.log("_extUser", _extUser); + let tenentInfo = []; + const results = [extUser]; + if (results) { + let extendedInfo_stringify = JSON.stringify(results); + localStorage.setItem( + "Extand_Class", + extendedInfo_stringify + ); + if (_extUser.TenantId) { + const obj = { + tenentId: _extUser.TenantId.objectId, + tenentName: _extUser.TenantId.TenantName || "" + }; + localStorage.setItem("TenantId", obj.tenentId); + tenentInfo.push(obj); + dispatch(showTenant(obj.tenentName || "")); + localStorage.setItem( + "TenantName", + obj.tenentName || "" + ); + } + localStorage.setItem("PageLanding", roleSetting.pageId); + localStorage.setItem("defaultmenuid", roleSetting.menuId); + localStorage.setItem("pageType", roleSetting.pageType); + if (isEnableSubscription) { + const res = await fetchSubscription(); + const plan = res.plan; + const billingDate = res.billingDate; + if (plan === "freeplan") { + navigate(redirectUrl); + } else if (billingDate) { + if (new Date(billingDate) > new Date()) { + localStorage.removeItem("userDetails"); + navigate(redirectUrl); + } else { + navigate(`/subscription`, { + replace: true + }); + } + } else { + navigate(`/subscription`, { + replace: true + }); + } + } else { + navigate(redirectUrl); + } + } + } + } catch (err) { + // const payload = { + // sessionToken: sessionToken + // }; + // setThirdpartyLoader(false); + // handleSubmitbtn(payload); + + alert("ext user not exist."); + console.log("err in get extUser", err); + } + } else { + alert("contracts_User role not exist"); + } + } else { + alert("contracts_User role not exist"); + } + } + } catch (err) { + console.log("err in usergroups", err); + } + } + } catch (err) { + console.log("Err in me call", err); + } + }; + return <div>Verifying SSO....</div>; +}; + +export default SSOVerify; diff --git a/apps/OpenSignServer/auth/authadapter.js b/apps/OpenSignServer/auth/authadapter.js new file mode 100644 index 000000000..a48b3cb76 --- /dev/null +++ b/apps/OpenSignServer/auth/authadapter.js @@ -0,0 +1,27 @@ +import axios from 'axios'; + +export const SSOAuth = { + // Returns a promise that fulfills if this user mail is valid. + validateAuthData: async authData => { + try { + const response = await axios.get('https://osl-jacksonv2.vercel.app/api/oauth/userinfo', { + headers: { + Authorization: `Bearer ${authData.access_token}`, + }, + }); + // console.log('response.data.id ', response.data.email); + // console.log('authData.id', authData.id); + if (response.data && response.data.id && response.data.email === authData.id) { + return; + } + throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'SSO auth is invalid for this user.'); + } catch (error) { + throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'SSO auth is invalid for this user.'); + } + }, + + // Returns a promise that fulfills if this app id is valid. + validateAppId: () => { + return Promise.resolve(); + }, +}; diff --git a/apps/OpenSignServer/cloud/main.js b/apps/OpenSignServer/cloud/main.js index 6de2c181a..1bbd9feea 100644 --- a/apps/OpenSignServer/cloud/main.js +++ b/apps/OpenSignServer/cloud/main.js @@ -42,6 +42,7 @@ import linkContactToDoc from './parsefunction/linkContactToDoc.js'; import CreatePublicTemplate from './parsefunction/CreatePublicTemplate.js'; import GetPublicUserName from './parsefunction/GetPublicUserName.js'; import GetPublicTemplate from './parsefunction/GetPublicTemplate.js'; +import ssoSignin from './parsefunction/ssoSignin.js'; // This afterSave function triggers after an object is added or updated in the specified class, allowing for post-processing logic. Parse.Cloud.afterSave('contracts_Document', DocumentAftersave); @@ -94,3 +95,4 @@ Parse.Cloud.define('linkcontacttodoc', linkContactToDoc); Parse.Cloud.define('createpublictemplate', CreatePublicTemplate); Parse.Cloud.define('getpublicusername', GetPublicUserName); Parse.Cloud.define('getpublictemplate', GetPublicTemplate); +Parse.Cloud.define('ssosign', ssoSignin); diff --git a/apps/OpenSignServer/cloud/parsefunction/SendMailOTPv1.js b/apps/OpenSignServer/cloud/parsefunction/SendMailOTPv1.js index 290ff0c3a..52054688b 100644 --- a/apps/OpenSignServer/cloud/parsefunction/SendMailOTPv1.js +++ b/apps/OpenSignServer/cloud/parsefunction/SendMailOTPv1.js @@ -39,7 +39,7 @@ async function sendMailOTPv1(request) { code + '</p></div> </div> </div></body></html>', }); - console.log('OTP sent'); + console.log('OTP sent', code); if (request.params?.docId) { const extUserId = await getDocument(request.params?.docId); if (extUserId) { diff --git a/apps/OpenSignServer/cloud/parsefunction/UserGroups.js b/apps/OpenSignServer/cloud/parsefunction/UserGroups.js index 3e3dc0cb6..5ab2f4724 100644 --- a/apps/OpenSignServer/cloud/parsefunction/UserGroups.js +++ b/apps/OpenSignServer/cloud/parsefunction/UserGroups.js @@ -2,41 +2,41 @@ //-- Export Modules import dotenv from 'dotenv'; -dotenv.config() -import axios from "axios"; +dotenv.config(); +import axios from 'axios'; export async function getUserGroups(request) { try { var appname = request.params.appname; - if (appname == "") { - return Promise.reject("Error:please provide appname"); + if (appname == '') { + return Promise.reject('Error:please provide appname'); } var response = {}; var rolelist = {}; - appname = appname + "_"; + appname = appname + '_'; //--function to get the userid from session token function getuserid(request) { return new Promise(function (resolve, reject) { const options = { - url: process.env.SERVER_URL + "/users/me", - method: "get", + url: process.env.SERVER_URL + '/users/me', + method: 'get', headers: { - "X-Parse-Application-Id": process.env.APP_ID, - "X-Parse-Session-Token": request.headers["sessiontoken"], + 'X-Parse-Application-Id': process.env.APP_ID, + 'X-Parse-Session-Token': request.headers['sessiontoken'], }, }; axios(options) - .then((x) => { + .then(x => { const body = x.data; - var error = body == "" ? true : false; + var error = body == '' ? true : false; if (error) { - reject("result not found!"); + reject('result not found!'); } else { resolve(body); } }) - .catch((err) => { + .catch(err => { if (err) { console.error(err); return; @@ -46,7 +46,7 @@ export async function getUserGroups(request) { } var userData = await getuserid(request); var userid = userData.objectId; - console.log("userid " + userid); + // console.log("userid " + userid); var url = process.env.SERVER_URL + '/roles?where={"users":{"__type":"Pointer","className":"_User","objectId":"' + @@ -60,29 +60,29 @@ export async function getUserGroups(request) { return new Promise(function (resolve, reject) { const options = { url: url, - method: "get", + method: 'get', headers: { - "X-Parse-Application-Id": process.env.APP_ID, + 'X-Parse-Application-Id': process.env.APP_ID, }, }; axios(options) - .then((x) => { + .then(x => { const body = x.data; var roleres = []; - for (var i = 0; i < body["results"].length; i++) { - var rolename = body["results"][i]["name"]; + for (var i = 0; i < body['results'].length; i++) { + var rolename = body['results'][i]['name']; //var roleprefix = rolename.split("_")[0]; roleres.push(rolename); } - var error = roleres == "" ? true : false; + var error = roleres == '' ? true : false; if (error) { - reject("result not found!"); + reject('result not found!'); } else { resolve(roleres); } }) - .catch((err) => { + .catch(err => { if (err) { console.error(err); return; @@ -92,7 +92,7 @@ export async function getUserGroups(request) { } rolelist = await getRoleList(request); - console.log(rolelist); + // console.log(rolelist); //--check user roles according to appId var rolesInapp = []; for (let i = 0; i < rolelist.length; i++) { @@ -102,11 +102,11 @@ export async function getUserGroups(request) { rolesInapp.push(rolelist[i]); } } - console.log(rolesInapp); + // console.log(rolesInapp); return rolesInapp; } catch (err) { - console.log("err in usergroup"); + console.log('err in usergroup'); console.log(err); - return Promise.reject("Error:Result not found"); + return Promise.reject('Error:Result not found'); } } diff --git a/apps/OpenSignServer/cloud/parsefunction/ssoSignin.js b/apps/OpenSignServer/cloud/parsefunction/ssoSignin.js new file mode 100644 index 000000000..ca243cd4f --- /dev/null +++ b/apps/OpenSignServer/cloud/parsefunction/ssoSignin.js @@ -0,0 +1,115 @@ +import axios from 'axios'; + +const serverUrl = process.env.SERVER_URL; +const APPID = process.env.APP_ID; +const masterKEY = process.env.MASTER_KEY; + +/** + * ssoSign is function which is used to sign up/sign in with SSO + * @param code It is code return by jackson using authorize endpoint + * @param email It is user's email with user sign in/sign up + * @returns if success {email, message, sessiontoken} else on reject {message} + */ + +export default async function ssoSignin(request) { + const code = request.params.code; + const userEmail = request.params.email; + + // console.log('code ', code); + try { + const headers = { 'content-type': 'application/x-www-form-urlencoded' }; + const axiosRes = await axios.post( + 'https://osl-jacksonv2.vercel.app/api/oauth/token', + { + grant_type: 'authorization_code', + client_id: 'dummy', + tenant: 'Okta-dev-nxglabs-in', + product: 'OpenSign', + client_secret: 'dummy', + redirect_uri: 'http://localhost:3000/sso', + code: code, + }, + { headers: headers } + ); + const ssoAccessToken = axiosRes.data && axiosRes.data.access_token; + // console.log('ssoAccessToken ', ssoAccessToken); + const authData = { sso: { id: userEmail, access_token: ssoAccessToken } }; + const userQuery = new Parse.Query(Parse.User); + userQuery.equalTo('email', userEmail); + const res = await userQuery.first({ useMasterKey: true }); + if (res) { + try { + const SignIn = await axios.put( + serverUrl + '/users/' + res.id, + { authData: authData }, + { + headers: { + 'X-Parse-Application-Id': APPID, + 'X-Parse-Master-key': masterKEY, + }, + } + ); + + if (SignIn.data) { + const sessiontoken = SignIn.data.sessionToken; + // console.log('sso sessiontoken', sessiontoken); + return { + email: userEmail, + message: 'User Sign In', + sessiontoken: sessiontoken, + }; + } + } catch (err) { + console.log('err in user sso sign in', err); + throw new Parse.Error(Parse.Error.INTERNAL_SERVER_ERROR, 'Internal server error.'); + } + } else { + // console.log("in sign up condition"); + const response = await axios.get('https://osl-jacksonv2.vercel.app/api/oauth/userinfo', { + headers: { + Authorization: `Bearer ${ssoAccessToken}`, + }, + }); + if (response.data && response.data.id) { + try { + const SignUp = await axios.post( + serverUrl + '/users', + { + authData: authData, + username: response.data.email, + email: response.data.email, + phone: response.data?.phone, + name: response.data?.firstName + response.data?.lastName, + }, + { + headers: { + 'X-Parse-Application-Id': APPID, + 'X-Parse-Revocable-Session': '1', + }, + } + ); + + // console.log("SignUp", SignUp); + + if (SignUp.data) { + const sessiontoken = SignUp.data.sessionToken; + const payload = { + email: userEmail, + message: 'User Sign Up', + sessiontoken: sessiontoken, + }; + return payload; + } + } catch (err) { + console.log('err in user sso sign up', err); + throw new Parse.Error(Parse.Error.INTERNAL_SERVER_ERROR, 'Internal server error.'); + } + } + } + } catch (err) { + const errCode = err?.response?.status || err?.code || 400; + const message = err?.response?.data || err?.message || 'Internal server error.'; + console.log('err in ssoSign', errCode, message); + throw new Parse.Error(errCode, message); + } +} diff --git a/apps/OpenSignServer/index.js b/apps/OpenSignServer/index.js index 9f7ab88ac..139f65bcf 100644 --- a/apps/OpenSignServer/index.js +++ b/apps/OpenSignServer/index.js @@ -18,7 +18,7 @@ import { createTransport } from 'nodemailer'; import { app as v1 } from './cloud/customRoute/v1/apiV1.js'; import { PostHog } from 'posthog-node'; import { useLocal } from './Utils.js'; - +import { SSOAuth } from './auth/authadapter.js'; let fsAdapter; if (useLocal !== 'true') { try { @@ -147,14 +147,7 @@ export const config = { google: { enabled: true, }, - ldap: { - enabled: true, - url: 'ldap://ldap.forumsys.com:389', - suffix: 'dc=example,dc=com', - // dn: 'ou=mathematicians, dc=example, dc=com', - groupCn: 'mathematicians', - groupFilter: '(&(uniqueMember=uid=,dc=example,dc=com)(objectClass=groupOfUniqueNames))', - }, + sso: SSOAuth, }, }; // Client-keys like the javascript key or the .NET key are not necessary with parse-server From afb4de9d0c3d78ce6dfe5d6fced2d2b2ed7849f5 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <prafull.navkar@nxglabs.com> Date: Fri, 31 May 2024 18:22:16 +0530 Subject: [PATCH 074/106] Feat: create SSO user account on platform --- apps/OpenSign/src/components/sidebar/Menu.js | 6 +- apps/OpenSign/src/constant/Utils.js | 8 +- apps/OpenSign/src/pages/Login.js | 7 +- apps/OpenSign/src/pages/SSOVerify.js | 466 +++++++++++++----- apps/OpenSignServer/auth/authadapter.js | 9 +- apps/OpenSignServer/cloud/main.js | 2 + .../cloud/parsefunction/isextenduser.js | 30 ++ .../cloud/parsefunction/ssoSignin.js | 51 +- .../cloud/parsefunction/usersignup.js | 4 +- 9 files changed, 423 insertions(+), 160 deletions(-) create mode 100644 apps/OpenSignServer/cloud/parsefunction/isextenduser.js diff --git a/apps/OpenSign/src/components/sidebar/Menu.js b/apps/OpenSign/src/components/sidebar/Menu.js index 584b6f410..0e42c542f 100644 --- a/apps/OpenSign/src/components/sidebar/Menu.js +++ b/apps/OpenSign/src/components/sidebar/Menu.js @@ -10,7 +10,11 @@ const Menu = ({ item, isOpen, closeSidebar }) => { ? `/${item.pageType}/${item.objectId}` : `/${item.objectId}` } - className="mx-auto flex items-center hover:bg-[#eef1f5] p-3 lg:p-4 cursor-pointer focus:text-[#0056b3] focus:bg-[#eef1f5]" + className={({ isActive }) => + `${ + isActive ? "text-[#0056b3] bg-[#eef1f5]" : "" + } mx-auto flex items-center hover:bg-[#eef1f5] p-3 lg:p-4 cursor-pointer` + } onClick={closeSidebar} tabIndex={isOpen ? 0 : -1} role="menuitem" diff --git a/apps/OpenSign/src/constant/Utils.js b/apps/OpenSign/src/constant/Utils.js index 147d360d2..3a24c4398 100644 --- a/apps/OpenSign/src/constant/Utils.js +++ b/apps/OpenSign/src/constant/Utils.js @@ -12,8 +12,12 @@ export const isMobile = window.innerWidth < 767; export const textInputWidget = "text input"; export const textWidget = "text"; export const radioButtonWidget = "radio button"; -export const openInNewTab = (url) => { - window.open(url, "_blank", "noopener,noreferrer"); +export const openInNewTab = (url, target) => { + if (target) { + window.open(url, target, "noopener,noreferrer"); + } else { + window.open(url, "_blank", "noopener,noreferrer"); + } }; export async function fetchSubscription( diff --git a/apps/OpenSign/src/pages/Login.js b/apps/OpenSign/src/pages/Login.js index c5251ed27..9a4d49e75 100644 --- a/apps/OpenSign/src/pages/Login.js +++ b/apps/OpenSign/src/pages/Login.js @@ -1041,10 +1041,15 @@ function Login() { localStorage.setItem("baseUrl", baseUrl); localStorage.setItem("parseAppId", appid); }; + + // `handleSignInWithSSO` is trigger when user click sign in with sso and open sso authorize endpoint const handleSignInWithSSO = () => { if (state?.email) { + const encodedEmail = encodeURIComponent(state.email); + const clientUrl = window.location.origin; openInNewTab( - `https://osl-jacksonv2.vercel.app/api/oauth/authorize?response_type=code&provider=saml&tenant=Okta-dev-nxglabs-in&product=OpenSign&redirect_uri=http://localhost:3000/sso&state=${state.email}` + `https://osl-jacksonv2.vercel.app/api/oauth/authorize?response_type=code&provider=saml&tenant=Okta-dev-nxglabs-in&product=OpenSign&redirect_uri=${clientUrl}/sso&state=${encodedEmail}`, + "_self" ); } else { alert("Please provide email."); diff --git a/apps/OpenSign/src/pages/SSOVerify.js b/apps/OpenSign/src/pages/SSOVerify.js index e811b2f08..988e1e5f8 100644 --- a/apps/OpenSign/src/pages/SSOVerify.js +++ b/apps/OpenSign/src/pages/SSOVerify.js @@ -1,64 +1,143 @@ -// import axios from "axios"; -import React, { useEffect } from "react"; +import React, { useEffect, useState } from "react"; import { useLocation, useNavigate } from "react-router-dom"; import Parse from "parse"; import axios from "axios"; import { appInfo } from "../constant/appinfo"; -import { isEnableSubscription } from "../constant/const"; +import { + isEnableSubscription, + modalCancelBtnColor, + modalSubmitBtnColor +} from "../constant/const"; import { fetchSubscription } from "../constant/Utils"; import { useDispatch } from "react-redux"; import { showTenant } from "../redux/reducers/ShowTenant"; +import ModalUi from "../primitives/ModalUi"; + const SSOVerify = () => { const location = useLocation(); const navigate = useNavigate(); const dispatch = useDispatch(); + const [isModal, setIsModal] = useState(false); + const [ssoErrMsg, setSsoErrMsg] = useState("Verifying SSO..."); + const [isLoader, setIsLoader] = useState(false); + const [userDetails, setUserDetails] = useState({ + name: "", + email: "", + phone: "", + Destination: "", + Company: "" + }); useEffect(() => { - getAccesstoken(); + linkUserWithSSO(); // eslint-disable-next-line }, []); - const getAccesstoken = async () => { + + // `linkUserWithSSO` is used to sign in or sign up a user using an SSO code and check if the user is present in the extended class + const linkUserWithSSO = async () => { const param = new URLSearchParams(location.search); const code = param?.get("code"); const state = param?.get("state"); - // console.log("code ", code); try { + // The `ssosign` cloud function is used to sign in or sign up a user const ssosign = await Parse.Cloud.run("ssosign", { code: code, email: state }); + localStorage.setItem("accesstoken", ssosign.sessiontoken); + // `checkExtUser` checks if the user is present in the extended class `contracts_Users` and if not, initiates the new user flow await checkExtUser(ssosign); - // console.log("ssores ", ssosign); } catch (err) { - console.log("err", err); + setSsoErrMsg(err.message); + console.log("err", err.message); } }; const checkExtUser = async (ssosign) => { - // const extUser = new Parse.Query("contracts_Users"); - // extUser.equalTo("Email", details.Gmail); - // const extRes = await extUser.first(); const params = { email: ssosign?.email }; - const extRes = await Parse.Cloud.run("getUserDetails", params); - // console.log("extRes ", extRes); - if (extRes) { - if (ssosign && ssosign.sessiontoken) { - const LocalUserDetails = { - name: extRes.Name, - email: extRes.email, - phone: extRes?.get("Phone") || "", - company: extRes.get("Company") - }; - localStorage.setItem("userDetails", JSON.stringify(LocalUserDetails)); - thirdpartyLoginfn(ssosign.sessiontoken); + try { + // `isextenduser` checks if the current user is present in the extended class + const extRes = await Parse.Cloud.run("isextenduser", params); + if (extRes?.isUserExist) { + // `getUserDetails` retrieves the current user's details from the extended class + const extRes = await Parse.Cloud.run("getUserDetails", params); + if (ssosign && ssosign.sessiontoken) { + const LocalUserDetails = { + name: extRes.Name, + email: extRes.email, + phone: extRes?.get("Phone") || "", + company: extRes.get("Company") + }; + localStorage.setItem("userDetails", JSON.stringify(LocalUserDetails)); + thirdpartyLoginfn(ssosign.sessiontoken); + } + } else { + setIsModal(true); + setUserDetails((prev) => ({ + ...prev, + name: ssosign.name, + email: ssosign.email, + phone: ssosign?.phone || "" + })); } - return { msg: "exist" }; - } else { - // setIsModal(true); - // setThirdpartyLoader(false); - console.log("not exist"); - return { msg: "notexist" }; + } catch (err) { + console.log("Err in isextenduser or getuserdetails cloud function", err); + alert(err.message); } }; + // `handleSubmitbtn` is used to create a user in the extended class + const handleSubmitbtn = async (e) => { + e.preventDefault(); + setIsLoader(true); + let phone; + if (userDetails?.phone) { + phone = validateInput(userDetails?.phone); + } else { + phone = true; + } + if (userDetails.Destination && userDetails.Company && phone) { + const payload = { sessionToken: localStorage.getItem("accesstoken") }; + if (payload && payload.sessionToken) { + const params = { + userDetails: { + name: userDetails.name, + email: userDetails.email, + phone: userDetails?.phone || "", + role: "contracts_User", + company: userDetails.Company, + jobTitle: userDetails.Destination + } + }; + try { + const userSignUp = await Parse.Cloud.run("usersignup", params); + if (userSignUp && userSignUp.sessionToken) { + const LocalUserDetails = params.userDetails; + localStorage.setItem( + "userDetails", + JSON.stringify(LocalUserDetails) + ); + await thirdpartyLoginfn(userSignUp.sessionToken); + setIsLoader(false); + } else { + alert(userSignUp.message); + setIsLoader(false); + } + } catch (err) { + console.log("error in usersignup", err); + localStorage.removeItem("accesstoken"); + alert("something went wrong, please try again later."); + setIsLoader(false); + } + } else { + localStorage.removeItem("accesstoken"); + alert("Internal server error !"); + setIsLoader(false); + } + } else { + alert("Please fill required details correctly."); + setIsLoader(false); + } + }; + // `thirdpartyLoginfn` is used to save necessary parameters locally for the logged-in user const thirdpartyLoginfn = async (sessionToken) => { const baseUrl = localStorage.getItem("baseUrl"); const parseAppId = localStorage.getItem("parseAppId"); @@ -67,7 +146,6 @@ const SSOVerify = () => { if (validUser) { localStorage.setItem("accesstoken", sessionToken); const _user = JSON.parse(JSON.stringify(validUser)); - // console.log("_user ", _user); localStorage.setItem("UserInformation", JSON.stringify(_user)); if (_user.ProfilePic) { localStorage.setItem("profileImg", _user.ProfilePic); @@ -77,132 +155,252 @@ const SSOVerify = () => { // Check extended class user role and tenentId try { let userRoles = []; - if (appInfo.settings) { - const userSettings = appInfo.settings; - - //Get Current user roles - let url = `${baseUrl}functions/UserGroups`; - const headers = { - "Content-Type": "application/json", - "X-Parse-Application-Id": parseAppId, - sessionToken: _user.sessionToken - }; - const body = { appname: appInfo.appname }; - const UserGroupsRes = await axios.post(url, JSON.stringify(body), { - headers: headers - }); - userRoles = (UserGroupsRes.data && UserGroupsRes.data.result) || []; - if (userRoles) { - let _currentRole = ""; - // const excludeRoles = ["contracts_Guest", `contracts_appeditor`]; - // const filteredRole = userRoles.filter( - // (x) => !excludeRoles.includes(x) - // ); - // if (filteredRole?.length > 1) { - // _currentRole = userRoles.filter((x) => x === "contracts_User"); - // } else { - // _currentRole = rolesfiltered[0]; - // } - _currentRole = userRoles?.find((x) => x === "contracts_User"); - if (_currentRole) { - const roleSetting = userSettings?.find( - (setting) => setting.role === _currentRole - ); - const redirectUrl = - location?.state?.from || - `/${roleSetting.pageType}/${roleSetting.pageId}`; - const _role = _currentRole.replace(`${appInfo.appname}_`, ""); - localStorage.setItem("_user_role", _role); - // Get TenentID from Extendend Class - localStorage.setItem( - "extended_class", - roleSetting.extended_class - ); - try { - const extUser = await Parse.Cloud.run("getUserDetails", { - email: _user.email - }); - if (extUser) { - const _extUser = JSON.parse(JSON.stringify(extUser)); - localStorage.setItem("userEmail", _extUser.Email); - localStorage.setItem("username", _extUser.Name); - localStorage.setItem("scriptId", true); - // console.log("_extUser", _extUser); - let tenentInfo = []; - const results = [extUser]; - if (results) { - let extendedInfo_stringify = JSON.stringify(results); - localStorage.setItem( - "Extand_Class", - extendedInfo_stringify - ); - if (_extUser.TenantId) { - const obj = { - tenentId: _extUser.TenantId.objectId, - tenentName: _extUser.TenantId.TenantName || "" - }; - localStorage.setItem("TenantId", obj.tenentId); - tenentInfo.push(obj); - dispatch(showTenant(obj.tenentName || "")); - localStorage.setItem( - "TenantName", - obj.tenentName || "" - ); - } - localStorage.setItem("PageLanding", roleSetting.pageId); - localStorage.setItem("defaultmenuid", roleSetting.menuId); - localStorage.setItem("pageType", roleSetting.pageType); - if (isEnableSubscription) { - const res = await fetchSubscription(); - const plan = res.plan; - const billingDate = res.billingDate; - if (plan === "freeplan") { + const userSettings = appInfo.settings; + //Get Current user roles + const url = `${baseUrl}functions/UserGroups`; + const headers = { + "Content-Type": "application/json", + "X-Parse-Application-Id": parseAppId, + sessionToken: _user.sessionToken + }; + const body = { appname: appInfo.appname }; + const UserGroupsRes = await axios.post(url, JSON.stringify(body), { + headers: headers + }); + userRoles = (UserGroupsRes.data && UserGroupsRes.data.result) || []; + if (userRoles) { + let _currentRole = ""; + const excludeRoles = ["contracts_Guest", `contracts_appeditor`]; + const filteredRole = userRoles.filter( + (x) => !excludeRoles.includes(x) + ); + if (filteredRole?.length > 1) { + console.log("user has two roles"); + // _currentRole = filteredRole.filter((x) => x === "contracts_User"); + } else { + _currentRole = filteredRole?.[0] || ""; + } + if (_currentRole) { + const roleSetting = userSettings?.find( + (setting) => setting.role === _currentRole + ); + const redirectUrl = + location?.state?.from || + `/${roleSetting.pageType}/${roleSetting.pageId}`; + const _role = _currentRole.replace(`${appInfo.appname}_`, ""); + localStorage.setItem("_user_role", _role); + // Get TenentID from Extendend Class + localStorage.setItem( + "extended_class", + roleSetting.extended_class + ); + try { + const extUser = await Parse.Cloud.run("getUserDetails", { + email: _user.email + }); + if (extUser) { + const _extUser = JSON.parse(JSON.stringify(extUser)); + localStorage.setItem("userEmail", _extUser.Email); + localStorage.setItem("username", _extUser.Name); + localStorage.setItem("scriptId", true); + let tenentInfo = []; + const results = [extUser]; + if (results) { + let extendedInfo_stringify = JSON.stringify(results); + localStorage.setItem( + "Extand_Class", + extendedInfo_stringify + ); + if (_extUser.TenantId) { + const obj = { + tenentId: _extUser.TenantId.objectId, + tenentName: _extUser.TenantId.TenantName || "" + }; + localStorage.setItem("TenantId", obj.tenentId); + tenentInfo.push(obj); + dispatch(showTenant(obj.tenentName || "")); + localStorage.setItem("TenantName", obj.tenentName || ""); + } + localStorage.setItem("PageLanding", roleSetting.pageId); + localStorage.setItem("defaultmenuid", roleSetting.menuId); + localStorage.setItem("pageType", roleSetting.pageType); + if (isEnableSubscription) { + const res = await fetchSubscription(); + const plan = res.plan; + const billingDate = res.billingDate; + if (plan === "freeplan") { + navigate(redirectUrl); + } else if (billingDate) { + if (new Date(billingDate) > new Date()) { + localStorage.removeItem("userDetails"); navigate(redirectUrl); - } else if (billingDate) { - if (new Date(billingDate) > new Date()) { - localStorage.removeItem("userDetails"); - navigate(redirectUrl); - } else { - navigate(`/subscription`, { - replace: true - }); - } } else { navigate(`/subscription`, { replace: true }); } } else { - navigate(redirectUrl); + navigate(`/subscription`, { + replace: true + }); } + } else { + navigate(redirectUrl); } } - } catch (err) { - // const payload = { - // sessionToken: sessionToken - // }; - // setThirdpartyLoader(false); - // handleSubmitbtn(payload); - - alert("ext user not exist."); - console.log("err in get extUser", err); } - } else { - alert("contracts_User role not exist"); + } catch (err) { + alert("user not exist."); + console.log("err in get extUser", err); } } else { - alert("contracts_User role not exist"); + alert("Role does not exists."); } + } else { + alert("Role does not exists."); } } catch (err) { console.log("err in usergroups", err); } } } catch (err) { - console.log("Err in me call", err); + console.log("Err in become method", err); } }; - return <div>Verifying SSO....</div>; + // `handleCloseModal` is triggered when the user wants to close the new user flow modal + const handleCloseModal = () => { + setIsModal(false); + if (Parse?.User?.current()) { + Parse.User.logOut(); + } + }; + + // `validateInput` is used to verify the phone pattern + function validateInput(input) { + if (input) { + const pattern = /^(?!.*\+.*\+)[\d+-]*$/; + return pattern.test(input); + } else { + return true; + } + } + return ( + <div> + <div className="w-full h-screen flex justify-center items-center text-sm md:text-xl "> + {ssoErrMsg} + </div> + <ModalUi isOpen={isModal} title="Additional Info" showClose={false}> + <div className="relative"> + {isLoader && ( + <div className="absolute w-full h-full bg-black bg-opacity-25 flex justify-center items-center"> + <div + style={{ + fontSize: "45px", + color: "#3dd3e0" + }} + className="loader-37" + ></div> + </div> + )} + <form className="px-4 py-3" onSubmit={handleSubmitbtn}> + <div className="mb-3"> + <label + htmlFor="Company" + style={{ display: "flex" }} + className="block text-xs text-gray-700 font-semibold" + > + Phone <span style={{ fontSize: 13, color: "red" }}>*</span> + </label> + <input + type="tel" + className="px-3 py-2 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs" + id="Phone" + value={userDetails.phone} + onChange={(e) => + setUserDetails({ + ...userDetails, + phone: e.target.value + }) + } + disabled={isLoader} + required + /> + <p className="text-[10px] text-[red] ml-2"> + {!validateInput(userDetails.phone) && "Invalid phone value"} + </p> + </div> + <div className="mb-3"> + <label + htmlFor="Company" + style={{ display: "flex" }} + className="block text-xs text-gray-700 font-semibold" + > + Company <span style={{ fontSize: 13, color: "red" }}>*</span> + </label> + <input + type="text" + className="px-3 py-2 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs" + id="Company" + value={userDetails.Company} + onChange={(e) => + setUserDetails({ + ...userDetails, + Company: e.target.value + }) + } + disabled={isLoader} + required + /> + </div> + <div className="mb-3"> + <label + htmlFor="JobTitle" + style={{ display: "flex" }} + className="block text-xs text-gray-700 font-semibold" + > + Job Title + <span style={{ fontSize: 13, color: "red" }}>*</span> + </label> + <input + type="text" + className="px-3 py-2 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs" + id="JobTitle" + value={userDetails.Destination} + onChange={(e) => + setUserDetails({ + ...userDetails, + Destination: e.target.value + }) + } + disabled={isLoader} + required + /> + </div> + <div className="mt-4"> + <button + type="submit" + className="px-3 py-1.5 text-white rounded shadow-md text-center focus:outline-none " + style={{ + marginRight: 10, + backgroundColor: modalSubmitBtnColor + }} + > + Login + </button> + <button + type="button" + className="py-1.5 text-black border-[1px] border-[#ccc] shadow-md rounded focus:outline-none" + onClick={handleCloseModal} + style={{ width: 75, backgroundColor: modalCancelBtnColor }} + > + Cancel + </button> + </div> + </form> + </div> + </ModalUi> + </div> + ); }; export default SSOVerify; diff --git a/apps/OpenSignServer/auth/authadapter.js b/apps/OpenSignServer/auth/authadapter.js index a48b3cb76..528ea8176 100644 --- a/apps/OpenSignServer/auth/authadapter.js +++ b/apps/OpenSignServer/auth/authadapter.js @@ -1,21 +1,22 @@ import axios from 'axios'; - +import dotenv from 'dotenv'; +dotenv.config(); +const ssoApiUrl = process.env.SSO_API_URL || 'https://osl-jacksonv2.vercel.app/api'; export const SSOAuth = { // Returns a promise that fulfills if this user mail is valid. validateAuthData: async authData => { try { - const response = await axios.get('https://osl-jacksonv2.vercel.app/api/oauth/userinfo', { + const response = await axios.get(ssoApiUrl + '/oauth/userinfo', { headers: { Authorization: `Bearer ${authData.access_token}`, }, }); - // console.log('response.data.id ', response.data.email); - // console.log('authData.id', authData.id); if (response.data && response.data.id && response.data.email === authData.id) { return; } throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'SSO auth is invalid for this user.'); } catch (error) { + console.log('error in sso adapter', error?.response); throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'SSO auth is invalid for this user.'); } }, diff --git a/apps/OpenSignServer/cloud/main.js b/apps/OpenSignServer/cloud/main.js index 1bbd9feea..59a903b1b 100644 --- a/apps/OpenSignServer/cloud/main.js +++ b/apps/OpenSignServer/cloud/main.js @@ -43,6 +43,7 @@ import CreatePublicTemplate from './parsefunction/CreatePublicTemplate.js'; import GetPublicUserName from './parsefunction/GetPublicUserName.js'; import GetPublicTemplate from './parsefunction/GetPublicTemplate.js'; import ssoSignin from './parsefunction/ssoSignin.js'; +import isextenduser from './parsefunction/isextenduser.js'; // This afterSave function triggers after an object is added or updated in the specified class, allowing for post-processing logic. Parse.Cloud.afterSave('contracts_Document', DocumentAftersave); @@ -96,3 +97,4 @@ Parse.Cloud.define('createpublictemplate', CreatePublicTemplate); Parse.Cloud.define('getpublicusername', GetPublicUserName); Parse.Cloud.define('getpublictemplate', GetPublicTemplate); Parse.Cloud.define('ssosign', ssoSignin); +Parse.Cloud.define('isextenduser', isextenduser); diff --git a/apps/OpenSignServer/cloud/parsefunction/isextenduser.js b/apps/OpenSignServer/cloud/parsefunction/isextenduser.js new file mode 100644 index 000000000..84111597e --- /dev/null +++ b/apps/OpenSignServer/cloud/parsefunction/isextenduser.js @@ -0,0 +1,30 @@ +/** + * Checks if a user exists in the extended class 'contracts_Users' based on the provided email. + * @param email - The request contains parameters, such as the user's email. + * @returns {Object} - Returns an object indicating whether the user exists. + */ +export default async function isextenduser(request) { + try { + // Query the 'contracts_Users' class in the database based on the provided email + const userQuery = new Parse.Query('contracts_Users'); + userQuery.equalTo('Email', request.params.email); + + // Execute the query + const res = await userQuery.first({ useMasterKey: true }); + + // Check if a user was found + if (res) { + // If user exists, return object with 'isUserExist' set to true + return { isUserExist: true }; + } else { + // If user does not exist, return object with 'isUserExist' set to false + return { isUserExist: false }; + } + } catch (err) { + // Handle errors + console.log('Error in userexist', err); + const code = err?.code || 400; + const message = err?.message || 'Something went wrong.'; + throw new Parse.Error(code, message); + } +} diff --git a/apps/OpenSignServer/cloud/parsefunction/ssoSignin.js b/apps/OpenSignServer/cloud/parsefunction/ssoSignin.js index ca243cd4f..6e50d0639 100644 --- a/apps/OpenSignServer/cloud/parsefunction/ssoSignin.js +++ b/apps/OpenSignServer/cloud/parsefunction/ssoSignin.js @@ -3,39 +3,37 @@ import axios from 'axios'; const serverUrl = process.env.SERVER_URL; const APPID = process.env.APP_ID; const masterKEY = process.env.MASTER_KEY; - +const clientUrl = process.env.PUBLIC_URL; +const ssoApiUrl = process.env.SSO_API_URL || 'https://osl-jacksonv2.vercel.app/api'; /** * ssoSign is function which is used to sign up/sign in with SSO * @param code It is code return by jackson using authorize endpoint * @param email It is user's email with user sign in/sign up - * @returns if success {email, message, sessiontoken} else on reject {message} + * @returns if success {email, name, phone message, sessiontoken} else on reject error {code, message} */ export default async function ssoSignin(request) { const code = request.params.code; const userEmail = request.params.email; - - // console.log('code ', code); try { const headers = { 'content-type': 'application/x-www-form-urlencoded' }; const axiosRes = await axios.post( - 'https://osl-jacksonv2.vercel.app/api/oauth/token', + ssoApiUrl + '/oauth/token', { grant_type: 'authorization_code', client_id: 'dummy', tenant: 'Okta-dev-nxglabs-in', product: 'OpenSign', client_secret: 'dummy', - redirect_uri: 'http://localhost:3000/sso', + redirect_uri: clientUrl + '/sso', code: code, }, { headers: headers } ); const ssoAccessToken = axiosRes.data && axiosRes.data.access_token; - // console.log('ssoAccessToken ', ssoAccessToken); const authData = { sso: { id: userEmail, access_token: ssoAccessToken } }; const userQuery = new Parse.Query(Parse.User); - userQuery.equalTo('email', userEmail); + userQuery.equalTo('username', userEmail); const res = await userQuery.first({ useMasterKey: true }); if (res) { try { @@ -51,17 +49,31 @@ export default async function ssoSignin(request) { ); if (SignIn.data) { + const response = await axios.get(ssoApiUrl + '/oauth/userinfo', { + headers: { + Authorization: `Bearer ${ssoAccessToken}`, + }, + }); const sessiontoken = SignIn.data.sessionToken; // console.log('sso sessiontoken', sessiontoken); - return { + const payload = { email: userEmail, + name: response.data?.firstName + ' ' + response.data?.lastName, + phone: response?.data?.phone || '', message: 'User Sign In', sessiontoken: sessiontoken, }; + return payload; } } catch (err) { - console.log('err in user sso sign in', err); - throw new Parse.Error(Parse.Error.INTERNAL_SERVER_ERROR, 'Internal server error.'); + const errCode = err?.response?.data?.code || err?.response?.status || err?.code || 400; + const message = + err?.response?.data?.error || + err?.response?.data || + err?.message || + 'Internal server error.'; + console.log('err in user sso sign in', errCode, message); + throw new Parse.Error(errCode, message); } } else { // console.log("in sign up condition"); @@ -79,7 +91,7 @@ export default async function ssoSignin(request) { username: response.data.email, email: response.data.email, phone: response.data?.phone, - name: response.data?.firstName + response.data?.lastName, + name: response.data?.firstName + ' ' + response.data?.lastName, }, { headers: { @@ -88,21 +100,26 @@ export default async function ssoSignin(request) { }, } ); - - // console.log("SignUp", SignUp); - if (SignUp.data) { const sessiontoken = SignUp.data.sessionToken; const payload = { email: userEmail, + name: SignUp?.data?.name, + phone: SignUp?.data?.phone || '', message: 'User Sign Up', sessiontoken: sessiontoken, }; return payload; } } catch (err) { - console.log('err in user sso sign up', err); - throw new Parse.Error(Parse.Error.INTERNAL_SERVER_ERROR, 'Internal server error.'); + const errCode = err?.response?.data?.code || err?.response?.status || err?.code || 400; + const message = + err?.response?.data?.error || + err?.response?.data || + err?.message || + 'Internal server error.'; + console.log('err in user sso sign up', errCode, message); + throw new Parse.Error(errCode, message); } } } diff --git a/apps/OpenSignServer/cloud/parsefunction/usersignup.js b/apps/OpenSignServer/cloud/parsefunction/usersignup.js index 84a7a101e..2d4338a5f 100644 --- a/apps/OpenSignServer/cloud/parsefunction/usersignup.js +++ b/apps/OpenSignServer/cloud/parsefunction/usersignup.js @@ -132,7 +132,9 @@ export default async function usersignup(request) { newObj.set('JobTitle', userDetails.jobTitle); } const extRes = await newObj.save(null, { useMasterKey: true }); - await saveSubscription(extRes.id, user.id, tenantRes.id, subscription); + if (subscription) { + await saveSubscription(extRes.id, user.id, tenantRes.id, subscription); + } return { message: 'User sign up', sessionToken: user.sessionToken }; } } catch (err) { From d071986aacdd68be542901522903c90dff9d5fcc Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <prafull.navkar@nxglabs.com> Date: Fri, 31 May 2024 19:00:29 +0530 Subject: [PATCH 075/106] feat: hide password input for sso and restict sso --- apps/OpenSign/src/pages/Login.js | 83 +++++++++++-------- apps/OpenSign/src/pages/SSOVerify.js | 21 +++-- apps/OpenSignServer/auth/authadapter.js | 2 +- .../cloud/parsefunction/ssoSignin.js | 2 +- 4 files changed, 64 insertions(+), 44 deletions(-) diff --git a/apps/OpenSign/src/pages/Login.js b/apps/OpenSign/src/pages/Login.js index 9a4d49e75..c49b1e77e 100644 --- a/apps/OpenSign/src/pages/Login.js +++ b/apps/OpenSign/src/pages/Login.js @@ -45,6 +45,7 @@ function Login() { }); const [isModal, setIsModal] = useState(false); const [image, setImage] = useState(); + const [isLoginSSO, setIsLoginSSO] = useState(false); useEffect(() => { if (localStorage.getItem("accesstoken")) { @@ -1045,10 +1046,14 @@ function Login() { // `handleSignInWithSSO` is trigger when user click sign in with sso and open sso authorize endpoint const handleSignInWithSSO = () => { if (state?.email) { + setIsLoginSSO(true); const encodedEmail = encodeURIComponent(state.email); const clientUrl = window.location.origin; + const domain = state.email.split("@")?.pop(); + const ssoApiUrl = + process.env.SSO_API_URL || "https://sso.opensignlabs.com/api"; openInNewTab( - `https://osl-jacksonv2.vercel.app/api/oauth/authorize?response_type=code&provider=saml&tenant=Okta-dev-nxglabs-in&product=OpenSign&redirect_uri=${clientUrl}/sso&state=${encodedEmail}`, + `${ssoApiUrl}/oauth/authorize?response_type=code&provider=saml&tenant=${domain}&product=OpenSign&redirect_uri=${clientUrl}/sso&state=${encodedEmail}`, "_self" ); } else { @@ -1122,34 +1127,40 @@ function Login() { required /> <hr className="my-2 border-none" /> - <label className="block text-xs" htmlFor="password"> - Password - </label> - <div className="relative"> - <input - id="password" - type={state.passwordVisible ? "text" : "password"} - className="px-3 py-2 w-full border-[1px] border-gray-300 rounded text-xs" - name="password" - value={state.password} - onChange={handleChange} - required - /> - <span - className={`absolute top-[50%] right-[10px] -translate-y-[50%] cursor-pointer ${ - state.passwordVisible - ? "text-[#007bff]" - : "text-black" - }`} - onClick={togglePasswordVisibility} - > - {state.passwordVisible ? ( - <i className="fa fa-eye-slash text-xs pb-1" /> // Close eye icon - ) : ( - <i className="fa fa-eye text-xs pb-1 " /> // Open eye icon - )} - </span> - </div> + {isLoginSSO && ( + <> + <label className="block text-xs" htmlFor="password"> + Password + </label> + <div className="relative"> + <input + id="password" + type={ + state.passwordVisible ? "text" : "password" + } + className="px-3 py-2 w-full border-[1px] border-gray-300 rounded text-xs" + name="password" + value={state.password} + onChange={handleChange} + required + /> + <span + className={`absolute top-[50%] right-[10px] -translate-y-[50%] cursor-pointer ${ + state.passwordVisible + ? "text-[#007bff]" + : "text-black" + }`} + onClick={togglePasswordVisibility} + > + {state.passwordVisible ? ( + <i className="fa fa-eye-slash text-xs pb-1" /> // Close eye icon + ) : ( + <i className="fa fa-eye text-xs pb-1 " /> // Open eye icon + )} + </span> + </div> + </> + )} <div className="relative mt-1"> <NavLink to="/forgetpassword" @@ -1209,12 +1220,14 @@ function Login() { setThirdpartyLoader={setThirdpartyLoader} /> )} - <div - className="cursor-pointer border-[1px] border-gray-300 rounded px-[40px] py-2 font-semibold text-sm hover:border-[#d2e3fc] hover:bg-[#ecf3feb7]" - onClick={() => handleSignInWithSSO()} - > - Sign in with SSO - </div> + {isEnableSubscription && ( + <div + className="cursor-pointer border-[1px] border-gray-300 rounded px-[40px] py-2 font-semibold text-sm hover:border-[#d2e3fc] hover:bg-[#ecf3feb7]" + onClick={() => handleSignInWithSSO()} + > + Sign in with SSO + </div> + )} </div> </div> {width >= 768 && ( diff --git a/apps/OpenSign/src/pages/SSOVerify.js b/apps/OpenSign/src/pages/SSOVerify.js index 988e1e5f8..85dbb70bd 100644 --- a/apps/OpenSign/src/pages/SSOVerify.js +++ b/apps/OpenSign/src/pages/SSOVerify.js @@ -12,13 +12,14 @@ import { fetchSubscription } from "../constant/Utils"; import { useDispatch } from "react-redux"; import { showTenant } from "../redux/reducers/ShowTenant"; import ModalUi from "../primitives/ModalUi"; +import loader from "../assets/images/loader2.gif"; const SSOVerify = () => { const location = useLocation(); const navigate = useNavigate(); const dispatch = useDispatch(); const [isModal, setIsModal] = useState(false); - const [ssoErrMsg, setSsoErrMsg] = useState("Verifying SSO..."); + const [message, setMessage] = useState("Verifying SSO..."); const [isLoader, setIsLoader] = useState(false); const [userDetails, setUserDetails] = useState({ name: "", @@ -48,7 +49,7 @@ const SSOVerify = () => { // `checkExtUser` checks if the user is present in the extended class `contracts_Users` and if not, initiates the new user flow await checkExtUser(ssosign); } catch (err) { - setSsoErrMsg(err.message); + setMessage("Error: " + err.message); console.log("err", err.message); } }; @@ -81,7 +82,7 @@ const SSOVerify = () => { } } catch (err) { console.log("Err in isextenduser or getuserdetails cloud function", err); - alert(err.message); + setMessage("Error: " + err.message); } }; // `handleSubmitbtn` is used to create a user in the extended class @@ -124,12 +125,12 @@ const SSOVerify = () => { } catch (err) { console.log("error in usersignup", err); localStorage.removeItem("accesstoken"); - alert("something went wrong, please try again later."); + alert("Something went wrong."); setIsLoader(false); } } else { localStorage.removeItem("accesstoken"); - alert("Internal server error !"); + alert("Internal server error."); setIsLoader(false); } } else { @@ -251,13 +252,16 @@ const SSOVerify = () => { } } catch (err) { alert("user not exist."); + setMessage("Error: User not exist."); console.log("err in get extUser", err); } } else { alert("Role does not exists."); + setMessage("Error: Role does not exists."); } } else { alert("Role does not exists."); + setMessage("Error: Role does not exists."); } } catch (err) { console.log("err in usergroups", err); @@ -286,8 +290,11 @@ const SSOVerify = () => { } return ( <div> - <div className="w-full h-screen flex justify-center items-center text-sm md:text-xl "> - {ssoErrMsg} + <div className="w-full h-screen flex flex-col justify-center items-center text-sm md:text-xl "> + {message === "Verifying SSO..." && ( + <img alt="loader" src={loader} className="w-[80px] h-[80px]" /> + )} + <div className="text-[gray]">{message}</div> </div> <ModalUi isOpen={isModal} title="Additional Info" showClose={false}> <div className="relative"> diff --git a/apps/OpenSignServer/auth/authadapter.js b/apps/OpenSignServer/auth/authadapter.js index 528ea8176..1e12c7836 100644 --- a/apps/OpenSignServer/auth/authadapter.js +++ b/apps/OpenSignServer/auth/authadapter.js @@ -1,7 +1,7 @@ import axios from 'axios'; import dotenv from 'dotenv'; dotenv.config(); -const ssoApiUrl = process.env.SSO_API_URL || 'https://osl-jacksonv2.vercel.app/api'; +const ssoApiUrl = process.env.SSO_API_URL || 'https://sso.opensignlabs.com/api'; //'https://osl-jacksonv2.vercel.app/api'; export const SSOAuth = { // Returns a promise that fulfills if this user mail is valid. validateAuthData: async authData => { diff --git a/apps/OpenSignServer/cloud/parsefunction/ssoSignin.js b/apps/OpenSignServer/cloud/parsefunction/ssoSignin.js index 6e50d0639..1067db69d 100644 --- a/apps/OpenSignServer/cloud/parsefunction/ssoSignin.js +++ b/apps/OpenSignServer/cloud/parsefunction/ssoSignin.js @@ -4,7 +4,7 @@ const serverUrl = process.env.SERVER_URL; const APPID = process.env.APP_ID; const masterKEY = process.env.MASTER_KEY; const clientUrl = process.env.PUBLIC_URL; -const ssoApiUrl = process.env.SSO_API_URL || 'https://osl-jacksonv2.vercel.app/api'; +const ssoApiUrl = process.env.SSO_API_URL || 'https://sso.opensignlabs.com/api'; //'https://osl-jacksonv2.vercel.app/api'; /** * ssoSign is function which is used to sign up/sign in with SSO * @param code It is code return by jackson using authorize endpoint From 4999dc2b1817520c0cfbdae1d8e5df5fde00a9ac Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <prafull.navkar@nxglabs.com> Date: Fri, 31 May 2024 19:27:18 +0530 Subject: [PATCH 076/106] Fix: password field is not visible for non-sso user --- apps/OpenSign/src/pages/Login.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/OpenSign/src/pages/Login.js b/apps/OpenSign/src/pages/Login.js index c49b1e77e..ba9c6c5a3 100644 --- a/apps/OpenSign/src/pages/Login.js +++ b/apps/OpenSign/src/pages/Login.js @@ -1127,7 +1127,7 @@ function Login() { required /> <hr className="my-2 border-none" /> - {isLoginSSO && ( + {!isLoginSSO && ( <> <label className="block text-xs" htmlFor="password"> Password From 0769101f28b3bf44970725304df0884e2e128d67 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Jun 2024 00:25:47 +0000 Subject: [PATCH 077/106] build(deps): bump reactour from 1.19.3 to 1.19.4 in /apps/OpenSign Bumps [reactour](https://github.com/elrumordelaluz/reactour) from 1.19.3 to 1.19.4. - [Release notes](https://github.com/elrumordelaluz/reactour/releases) - [Commits](https://github.com/elrumordelaluz/reactour/commits) --- updated-dependencies: - dependency-name: reactour dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> --- apps/OpenSign/package-lock.json | 60 ++++++++++++++++++--------------- apps/OpenSign/package.json | 2 +- 2 files changed, 34 insertions(+), 28 deletions(-) diff --git a/apps/OpenSign/package-lock.json b/apps/OpenSign/package-lock.json index 6031673d4..417547878 100644 --- a/apps/OpenSign/package-lock.json +++ b/apps/OpenSign/package-lock.json @@ -45,7 +45,7 @@ "react-signature-canvas": "^1.0.6", "react-tooltip": "^5.26.4", "react-web-share": "^2.0.2", - "reactour": "^1.19.3", + "reactour": "^1.19.4", "redux": "^5.0.1", "redux-thunk": "^3.1.0", "regex-parser": "^2.3.0", @@ -11344,9 +11344,9 @@ "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==" }, "node_modules/focus-lock": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/focus-lock/-/focus-lock-0.9.2.tgz", - "integrity": "sha512-YtHxjX7a0IC0ZACL5wsX8QdncXofWpGPNoVMuI/nZUrPGp6LmNI6+D5j0pPj+v8Kw5EpweA+T5yImK0rnWf7oQ==", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/focus-lock/-/focus-lock-1.3.5.tgz", + "integrity": "sha512-QFaHbhv9WPUeLYBDe/PAuLKJ4Dd9OPvKs9xZBr3yLXnUrDNaVXKu2baDBXe3naPY30hgHYSsf2JW4jzas2mDEQ==", "dependencies": { "tslib": "^2.0.3" }, @@ -19731,6 +19731,28 @@ "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==" }, + "node_modules/react-focus-lock": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/react-focus-lock/-/react-focus-lock-2.12.1.tgz", + "integrity": "sha512-lfp8Dve4yJagkHiFrC1bGtib3mF2ktqwPJw4/WGcgPW+pJ/AVQA5X2vI7xgp13FcxFEpYBBHpXai/N2DBNC0Jw==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "focus-lock": "^1.3.5", + "prop-types": "^15.6.2", + "react-clientside-effect": "^1.2.6", + "use-callback-ref": "^1.3.2", + "use-sidecar": "^1.1.2" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/react-gtm-module": { "version": "2.0.11", "resolved": "https://registry.npmjs.org/react-gtm-module/-/react-gtm-module-2.0.11.tgz", @@ -20198,16 +20220,16 @@ } }, "node_modules/reactour": { - "version": "1.19.3", - "resolved": "https://registry.npmjs.org/reactour/-/reactour-1.19.3.tgz", - "integrity": "sha512-a2/j+xmbGlPMQhMy/zdpSmJN1STc0PcLUxhJbAC+bOcYdWHStFR02j6dhNuF/+IeqpX/d44PvlrRXSTt4LGk6w==", + "version": "1.19.4", + "resolved": "https://registry.npmjs.org/reactour/-/reactour-1.19.4.tgz", + "integrity": "sha512-cMIaUQazGkdXt03m7AXAYXrCdyQl+uvH4nQBGP/oEjIaeSTZqj92C3W3y6doPakIIu21WeoGh1b0hBRKOxIViA==", "dependencies": { "@rooks/use-mutation-observer": "4.11.2", "classnames": "2.3.1", "focus-outline-manager": "^1.0.2", "lodash.debounce": "4.0.8", "prop-types": "15.7.2", - "react-focus-lock": "2.5.2", + "react-focus-lock": "^2.12.1", "scroll-smooth": "1.1.1", "scrollparent": "2.0.1" }, @@ -20233,22 +20255,6 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, - "node_modules/reactour/node_modules/react-focus-lock": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/react-focus-lock/-/react-focus-lock-2.5.2.tgz", - "integrity": "sha512-WzpdOnEqjf+/A3EH9opMZWauag7gV0BxFl+EY4ElA4qFqYsUsBLnmo2sELbN5OC30S16GAWMy16B9DLPpdJKAQ==", - "dependencies": { - "@babel/runtime": "^7.0.0", - "focus-lock": "^0.9.1", - "prop-types": "^15.6.2", - "react-clientside-effect": "^1.2.5", - "use-callback-ref": "^1.2.5", - "use-sidecar": "^1.0.5" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0" - } - }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -22915,9 +22921,9 @@ } }, "node_modules/use-callback-ref": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.0.tgz", - "integrity": "sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.2.tgz", + "integrity": "sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==", "dependencies": { "tslib": "^2.0.0" }, diff --git a/apps/OpenSign/package.json b/apps/OpenSign/package.json index c17af3810..f417a74a2 100644 --- a/apps/OpenSign/package.json +++ b/apps/OpenSign/package.json @@ -40,7 +40,7 @@ "react-signature-canvas": "^1.0.6", "react-tooltip": "^5.26.4", "react-web-share": "^2.0.2", - "reactour": "^1.19.3", + "reactour": "^1.19.4", "redux": "^5.0.1", "redux-thunk": "^3.1.0", "regex-parser": "^2.3.0", From 414e2d819c6a50ce07438023798389bd15520ea2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Jun 2024 01:11:29 +0000 Subject: [PATCH 078/106] build(deps-dev): bump prettier in /apps/OpenSignServer Bumps [prettier](https://github.com/prettier/prettier) from 3.2.5 to 3.3.0. - [Release notes](https://github.com/prettier/prettier/releases) - [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md) - [Commits](https://github.com/prettier/prettier/compare/3.2.5...3.3.0) --- updated-dependencies: - dependency-name: prettier dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> --- apps/OpenSignServer/package-lock.json | 8 ++++---- apps/OpenSignServer/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/OpenSignServer/package-lock.json b/apps/OpenSignServer/package-lock.json index ec1d27ef5..2bd775a9b 100644 --- a/apps/OpenSignServer/package-lock.json +++ b/apps/OpenSignServer/package-lock.json @@ -44,7 +44,7 @@ "mongodb-runner": "^5.6.2", "nodemon": "^3.1.1", "nyc": "15.1.0", - "prettier": "^3.2.5", + "prettier": "^3.3.0", "uglify-js": "^3.17.4" }, "engines": { @@ -10298,9 +10298,9 @@ } }, "node_modules/prettier": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", - "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.0.tgz", + "integrity": "sha512-J9odKxERhCQ10OC2yb93583f6UnYutOeiV5i0zEDS7UGTdUt0u+y8erxl3lBKvwo/JHyyoEdXjwp4dke9oyZ/g==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" diff --git a/apps/OpenSignServer/package.json b/apps/OpenSignServer/package.json index e149c8f19..18413a361 100644 --- a/apps/OpenSignServer/package.json +++ b/apps/OpenSignServer/package.json @@ -54,7 +54,7 @@ "mongodb-runner": "^5.6.2", "nodemon": "^3.1.1", "nyc": "15.1.0", - "prettier": "^3.2.5", + "prettier": "^3.3.0", "uglify-js": "^3.17.4" }, "engines": { From 64a0be8776d8c6c7c5e56da082cbff701aca288c Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <prafull.navkar@nxglabs.com> Date: Mon, 3 Jun 2024 12:38:17 +0530 Subject: [PATCH 079/106] fix: cannot read property of undefined 'email' --- apps/OpenSign/src/pages/PdfRequestFiles.js | 26 +++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/apps/OpenSign/src/pages/PdfRequestFiles.js b/apps/OpenSign/src/pages/PdfRequestFiles.js index 7565d8669..2976359c7 100644 --- a/apps/OpenSign/src/pages/PdfRequestFiles.js +++ b/apps/OpenSign/src/pages/PdfRequestFiles.js @@ -41,6 +41,7 @@ import DefaultSignature from "../components/pdf/DefaultSignature"; import ModalUi from "../primitives/ModalUi"; import VerifyEmail from "../components/pdf/VerifyEmail"; import TourContentWithBtn from "../primitives/TourContentWithBtn"; +import { appInfo } from "../constant/appinfo"; function useQuery() { return new URLSearchParams(useLocation().search); } @@ -164,7 +165,11 @@ function PdfRequestFiles() { const handleResend = async (e) => { e.preventDefault(); setOtpLoader(true); - await handleSendOTP(Parse.User.current().getEmail()); + const localuser = localStorage.getItem( + `Parse/${appInfo.appId}/currentUser` + ); + const currentUser = JSON.parse(JSON.stringify(localuser)); + await handleSendOTP(currentUser?.email); setOtpLoader(false); alert("OTP sent on you email"); }; @@ -172,10 +177,14 @@ function PdfRequestFiles() { const handleVerifyEmail = async (e) => { e.preventDefault(); setOtpLoader(true); + const localuser = localStorage.getItem( + `Parse/${appInfo.appId}/currentUser` + ); + const currentUser = JSON.parse(JSON.stringify(localuser)); try { const resEmail = await Parse.Cloud.run("verifyemail", { otp: otp, - email: Parse.User.current().getEmail() + email: currentUser?.email }); if (resEmail?.message === "Email is verified.") { setIsEmailVerified(true); @@ -196,7 +205,11 @@ function PdfRequestFiles() { //`handleVerifyBtn` function is used to send otp on user mail const handleVerifyBtn = async () => { setIsVerifyModal(true); - await handleSendOTP(Parse.User.current().getEmail()); + const localuser = localStorage.getItem( + `Parse/${appInfo.appId}/currentUser` + ); + const currentUser = JSON.parse(JSON.stringify(localuser)); + await handleSendOTP(currentUser?.email); }; async function checkIsSubscribed(extUserId, contactId) { const isGuestSign = location.pathname.includes("/load/") || false; @@ -460,8 +473,11 @@ function PdfRequestFiles() { } else { //else condition to check current user exist in contracts_Users class and check tour message status //if not then check user exist in contracts_Contactbook class and check tour message status - const currentUser = JSON.parse(JSON.stringify(Parse.User.current())); - const currentUserEmail = currentUser.email; + const localuser = localStorage.getItem( + `Parse/${appInfo.appId}/currentUser` + ); + const currentUser = JSON.parse(JSON.stringify(localuser)); + const currentUserEmail = currentUser?.email; const res = await contractUsers(currentUserEmail); if (res === "Error: Something went wrong!") { setHandleError("Error: Something went wrong!"); From 1ec11b8733e16b01557a37345d6b5a8613e8e6e4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Jun 2024 07:16:39 +0000 Subject: [PATCH 080/106] build(deps-dev): bump nodemon in /apps/OpenSignServer Bumps [nodemon](https://github.com/remy/nodemon) from 3.1.1 to 3.1.2. - [Release notes](https://github.com/remy/nodemon/releases) - [Commits](https://github.com/remy/nodemon/compare/v3.1.1...v3.1.2) --- updated-dependencies: - dependency-name: nodemon dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> --- apps/OpenSignServer/package-lock.json | 8 ++++---- apps/OpenSignServer/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/OpenSignServer/package-lock.json b/apps/OpenSignServer/package-lock.json index 2bd775a9b..8d0c4583a 100644 --- a/apps/OpenSignServer/package-lock.json +++ b/apps/OpenSignServer/package-lock.json @@ -42,7 +42,7 @@ "eslint": "^9.3.0", "jasmine": "^5.1.0", "mongodb-runner": "^5.6.2", - "nodemon": "^3.1.1", + "nodemon": "^3.1.2", "nyc": "15.1.0", "prettier": "^3.3.0", "uglify-js": "^3.17.4" @@ -8365,9 +8365,9 @@ } }, "node_modules/nodemon": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.1.tgz", - "integrity": "sha512-k43xGaDtaDIcufn0Fc6fTtsdKSkV/hQzoQFigNH//GaKta28yoKVYXCnV+KXRqfT/YzsFaQU9VdeEG+HEyxr6A==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.2.tgz", + "integrity": "sha512-/Ib/kloefDy+N0iRTxIUzyGcdW9lzlnca2Jsa5w73bs3npXjg+WInmiX6VY13mIb6SykkthYX/U5t0ukryGqBw==", "dev": true, "dependencies": { "chokidar": "^3.5.2", diff --git a/apps/OpenSignServer/package.json b/apps/OpenSignServer/package.json index 18413a361..86162449d 100644 --- a/apps/OpenSignServer/package.json +++ b/apps/OpenSignServer/package.json @@ -52,7 +52,7 @@ "eslint": "^9.3.0", "jasmine": "^5.1.0", "mongodb-runner": "^5.6.2", - "nodemon": "^3.1.1", + "nodemon": "^3.1.2", "nyc": "15.1.0", "prettier": "^3.3.0", "uglify-js": "^3.17.4" From ba3591c7bc2ae26f73e006caa1dd5c3473c6bea7 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <prafull.navkar@nxglabs.com> Date: Mon, 3 Jun 2024 13:51:15 +0530 Subject: [PATCH 081/106] fix: enable mail send feature for non-quick send documents when sendinorder is true --- apps/OpenSign/package-lock.json | 69 +++++++++++++++------- apps/OpenSign/package.json | 4 +- apps/OpenSign/src/App.js | 3 +- apps/OpenSign/src/pages/PdfRequestFiles.js | 3 +- 4 files changed, 54 insertions(+), 25 deletions(-) diff --git a/apps/OpenSign/package-lock.json b/apps/OpenSign/package-lock.json index 417547878..24df79674 100644 --- a/apps/OpenSign/package-lock.json +++ b/apps/OpenSign/package-lock.json @@ -9,7 +9,7 @@ "version": "0.1.0", "dependencies": { "@formkit/auto-animate": "^0.8.2", - "@radix-ui/themes": "^2.0.3", + "@radix-ui/themes": "^3.0.5", "@react-pdf/renderer": "^3.4.4", "@reduxjs/toolkit": "^2.2.5", "axios": "^1.7.2", @@ -34,7 +34,7 @@ "react-helmet": "^6.1.0", "react-konva": "^18.2.10", "react-modal": "^3.16.1", - "react-pdf": "^8.0.2", + "react-pdf": "^9.0.0", "react-quill": "^2.0.0", "react-redux": "^9.1.2", "react-rnd": "^10.4.10", @@ -5292,9 +5292,9 @@ } }, "node_modules/@radix-ui/themes": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/themes/-/themes-2.0.3.tgz", - "integrity": "sha512-yaXQ8aWT2P1CQ0Xe6YCRD9HXsfMTvKkrIYkrc4aitCzhGTLS0sjtTqKmrxIWMVA+3DIbEuG9K/8aAMRJBhep8g==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@radix-ui/themes/-/themes-3.0.5.tgz", + "integrity": "sha512-fqIxdxer2tVHtrmuT/Wx793sMKIaJBSZQjFSrkorz6BgOCrijjK6pRRi1qa3Sq78vyjixVXR7kRlieBomUzzzQ==", "dependencies": { "@radix-ui/colors": "^3.0.0", "@radix-ui/primitive": "^1.0.1", @@ -5303,26 +5303,34 @@ "@radix-ui/react-aspect-ratio": "^1.0.3", "@radix-ui/react-avatar": "^1.0.4", "@radix-ui/react-checkbox": "^1.0.4", + "@radix-ui/react-compose-refs": "^1.0.1", + "@radix-ui/react-context": "^1.0.1", "@radix-ui/react-context-menu": "^2.1.5", "@radix-ui/react-dialog": "^1.0.5", "@radix-ui/react-direction": "^1.0.1", "@radix-ui/react-dropdown-menu": "^2.0.6", "@radix-ui/react-form": "^0.0.3", "@radix-ui/react-hover-card": "^1.0.7", + "@radix-ui/react-navigation-menu": "^1.1.4", "@radix-ui/react-popover": "^1.0.7", "@radix-ui/react-portal": "^1.0.4", + "@radix-ui/react-primitive": "^1.0.3", + "@radix-ui/react-progress": "^1.0.3", "@radix-ui/react-radio-group": "^1.1.3", + "@radix-ui/react-roving-focus": "^1.0.4", "@radix-ui/react-scroll-area": "^1.0.5", "@radix-ui/react-select": "^2.0.0", - "@radix-ui/react-separator": "^1.0.3", "@radix-ui/react-slider": "^1.1.2", "@radix-ui/react-slot": "^1.0.2", "@radix-ui/react-switch": "^1.0.3", "@radix-ui/react-tabs": "^1.0.4", + "@radix-ui/react-toggle-group": "^1.0.4", "@radix-ui/react-tooltip": "^1.0.7", "@radix-ui/react-use-callback-ref": "^1.0.1", + "@radix-ui/react-use-controllable-state": "^1.0.1", "@radix-ui/react-visually-hidden": "^1.0.3", - "classnames": "^2.3.2" + "classnames": "^2.3.2", + "react-remove-scroll-bar": "2.3.4" }, "peerDependencies": { "@types/react": "*", @@ -5344,6 +5352,27 @@ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" }, + "node_modules/@radix-ui/themes/node_modules/react-remove-scroll-bar": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz", + "integrity": "sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==", + "dependencies": { + "react-style-singleton": "^2.2.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@react-aria/ssr": { "version": "3.9.2", "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.2.tgz", @@ -17411,13 +17440,13 @@ "node": ">=8" } }, - "node_modules/path2d-polyfill": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path2d-polyfill/-/path2d-polyfill-2.0.1.tgz", - "integrity": "sha512-ad/3bsalbbWhmBo0D6FZ4RNMwsLsPpL6gnvhuSaU5Vm7b06Kr5ubSltQQ0T7YKsiJQO+g22zJ4dJKNTXIyOXtA==", + "node_modules/path2d": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/path2d/-/path2d-0.2.0.tgz", + "integrity": "sha512-KdPAykQX6kmLSOO6Jpu2KNcCED7CKjmaBNGGNuctOsG0hgYO1OdYQaan6cYXJiG0WmXOwZZPILPBimu5QAIw3A==", "optional": true, "engines": { - "node": ">=8" + "node": ">=6" } }, "node_modules/pdf-lib": { @@ -17437,15 +17466,15 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/pdfjs-dist": { - "version": "3.11.174", - "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-3.11.174.tgz", - "integrity": "sha512-TdTZPf1trZ8/UFu5Cx/GXB7GZM30LT+wWUNfsi6Bq8ePLnb+woNKtDymI2mxZYBpMbonNFqKmiz684DIfnd8dA==", + "version": "4.3.136", + "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-4.3.136.tgz", + "integrity": "sha512-gzfnt1qc4yA+U46golPGYtU4WM2ssqP2MvFjKga8GEKOrEnzRPrA/9jogLLPYHiA3sGBPJ+p7BdAq+ytmw3jEg==", "engines": { "node": ">=18" }, "optionalDependencies": { "canvas": "^2.11.2", - "path2d-polyfill": "^2.0.1" + "path2d": "^0.2.0" } }, "node_modules/performance-now": { @@ -19849,16 +19878,16 @@ } }, "node_modules/react-pdf": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/react-pdf/-/react-pdf-8.0.2.tgz", - "integrity": "sha512-C0PFC+j9vmEIZ82Iq0c85xUWkgsZTUS05syqOk8NC+7PAanyWlVi/ImYkGQe27zYAlBA6IidRYEt1DAAXKq1Ow==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/react-pdf/-/react-pdf-9.0.0.tgz", + "integrity": "sha512-J+pza8R2p9oNEOJOHIQJI4o5rFK7ji7bBl2IvsHvz1OOyphvuzVDo5tOJwWAFAbxYauCH3Kt8jOvcMJUOpxYZQ==", "dependencies": { "clsx": "^2.0.0", "dequal": "^2.0.3", "make-cancellable-promise": "^1.3.1", "make-event-props": "^1.6.0", "merge-refs": "^1.3.0", - "pdfjs-dist": "3.11.174", + "pdfjs-dist": "4.3.136", "tiny-invariant": "^1.0.0", "warning": "^4.0.0" }, diff --git a/apps/OpenSign/package.json b/apps/OpenSign/package.json index f417a74a2..fcd56a8ec 100644 --- a/apps/OpenSign/package.json +++ b/apps/OpenSign/package.json @@ -4,7 +4,7 @@ "private": true, "dependencies": { "@formkit/auto-animate": "^0.8.2", - "@radix-ui/themes": "^2.0.3", + "@radix-ui/themes": "^3.0.5", "@react-pdf/renderer": "^3.4.4", "@reduxjs/toolkit": "^2.2.5", "axios": "^1.7.2", @@ -29,7 +29,7 @@ "react-helmet": "^6.1.0", "react-konva": "^18.2.10", "react-modal": "^3.16.1", - "react-pdf": "^8.0.2", + "react-pdf": "^9.0.0", "react-quill": "^2.0.0", "react-redux": "^9.1.2", "react-rnd": "^10.4.10", diff --git a/apps/OpenSign/src/App.js b/apps/OpenSign/src/App.js index eb6f3dbda..d21fc6074 100644 --- a/apps/OpenSign/src/App.js +++ b/apps/OpenSign/src/App.js @@ -29,8 +29,7 @@ const Opensigndrive = lazy(() => import("./pages/Opensigndrive")); const ManageSign = lazy(() => import("./pages/Managesign")); const GenerateToken = lazy(() => import("./pages/GenerateToken")); const Webhook = lazy(() => import("./pages/Webhook")); -pdfjs.GlobalWorkerOptions.workerSrc = `//cdnjs.cloudflare.com/ajax/libs/pdf.js/${pdfjs.version}/pdf.worker.js`; - +pdfjs.GlobalWorkerOptions.workerSrc = `//cdnjs.cloudflare.com/ajax/libs/pdf.js/${pdfjs.version}/pdf.worker.min.mjs`; const Loader = () => { return ( <div diff --git a/apps/OpenSign/src/pages/PdfRequestFiles.js b/apps/OpenSign/src/pages/PdfRequestFiles.js index c1b53f17e..f054f7530 100644 --- a/apps/OpenSign/src/pages/PdfRequestFiles.js +++ b/apps/OpenSign/src/pages/PdfRequestFiles.js @@ -790,7 +790,8 @@ function PdfRequestFiles() { const usermail = { Email: pdfDetails?.[0]?.Placeholders[newIndex]?.email || "" }; - const user = usermail || pdfDetails?.[0]?.Signers[newIndex]; + const user = + usermail?.Email || pdfDetails?.[0]?.Signers[newIndex]; if (sendmail !== "false" && sendInOrder) { const requestBody = pdfDetails?.[0]?.RequestBody; const requestSubject = pdfDetails?.[0]?.RequestSubject; From 3f4be1c4f36d45f7509073646a13d0074222f184 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Jun 2024 09:15:34 +0000 Subject: [PATCH 082/106] build(deps): bump react-rnd from 10.4.10 to 10.4.11 in /apps/OpenSign Bumps [react-rnd](https://github.com/bokuweb/react-rnd) from 10.4.10 to 10.4.11. - [Release notes](https://github.com/bokuweb/react-rnd/releases) - [Commits](https://github.com/bokuweb/react-rnd/commits) --- updated-dependencies: - dependency-name: react-rnd dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> --- apps/OpenSign/package-lock.json | 16 ++++++++-------- apps/OpenSign/package.json | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/apps/OpenSign/package-lock.json b/apps/OpenSign/package-lock.json index 24df79674..b8e88fe8b 100644 --- a/apps/OpenSign/package-lock.json +++ b/apps/OpenSign/package-lock.json @@ -37,7 +37,7 @@ "react-pdf": "^9.0.0", "react-quill": "^2.0.0", "react-redux": "^9.1.2", - "react-rnd": "^10.4.10", + "react-rnd": "^10.4.11", "react-router-dom": "^6.22.3", "react-scripts": "5.0.1", "react-scrollbars-custom": "^4.1.1", @@ -19384,9 +19384,9 @@ } }, "node_modules/re-resizable": { - "version": "6.9.14", - "resolved": "https://registry.npmjs.org/re-resizable/-/re-resizable-6.9.14.tgz", - "integrity": "sha512-2UbPrpezMr6gkHKNCRA/N6QGGU237SKOZ78yMHId204A/oXWSAREAIuGZNQ9qlrJosewzcsv2CphZH3u7hC6ng==", + "version": "6.9.17", + "resolved": "https://registry.npmjs.org/re-resizable/-/re-resizable-6.9.17.tgz", + "integrity": "sha512-OBqd1BwVXpEJJn/yYROG+CbeqIDBWIp6wathlpB0kzZWWZIY1gPTsgK2yJEui5hOvkCdC2mcexF2V3DZVfLq2g==", "peerDependencies": { "react": "^16.13.1 || ^17.0.0 || ^18.0.0", "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0" @@ -20010,11 +20010,11 @@ } }, "node_modules/react-rnd": { - "version": "10.4.10", - "resolved": "https://registry.npmjs.org/react-rnd/-/react-rnd-10.4.10.tgz", - "integrity": "sha512-YjQAgEeSbNUoOXSD9ZBvIiLVizFb+bNhpDk8DbIRHA557NW02CXbwsAeOTpJQnsdhEL+NP2I+Ssrwejqcodtjg==", + "version": "10.4.11", + "resolved": "https://registry.npmjs.org/react-rnd/-/react-rnd-10.4.11.tgz", + "integrity": "sha512-XTfNGNcS0ad2vo3to7qNTB0BkFML9k1csIUI0Nlj44M6Uuh7yP/2h8WXiXcV3v3bxxVJck1C9K6FS1LrLH0E0Q==", "dependencies": { - "re-resizable": "6.9.14", + "re-resizable": "6.9.17", "react-draggable": "4.4.6", "tslib": "2.6.2" }, diff --git a/apps/OpenSign/package.json b/apps/OpenSign/package.json index fcd56a8ec..2855aa261 100644 --- a/apps/OpenSign/package.json +++ b/apps/OpenSign/package.json @@ -32,7 +32,7 @@ "react-pdf": "^9.0.0", "react-quill": "^2.0.0", "react-redux": "^9.1.2", - "react-rnd": "^10.4.10", + "react-rnd": "^10.4.11", "react-router-dom": "^6.22.3", "react-scripts": "5.0.1", "react-scrollbars-custom": "^4.1.1", From 3c51baf1c96f610226d55f631b20a0c3bc3a7cfa Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <prafull.navkar@nxglabs.com> Date: Mon, 3 Jun 2024 15:46:24 +0530 Subject: [PATCH 083/106] build(deps): updated nth-check dependency for security --- apps/OpenSign/package-lock.json | 7126 +++++++++++++++++-------------- apps/OpenSign/package.json | 4 + 2 files changed, 3815 insertions(+), 3315 deletions(-) diff --git a/apps/OpenSign/package-lock.json b/apps/OpenSign/package-lock.json index 24df79674..94f9c1c8c 100644 --- a/apps/OpenSign/package-lock.json +++ b/apps/OpenSign/package-lock.json @@ -16,6 +16,7 @@ "file-saver": "^2.0.5", "jwt-decode": "^4.0.0", "moment": "^2.30.1", + "nth-check": "^2.1.1", "parse": "^5.1.0", "pdf-lib": "^1.17.1", "print-js": "^1.6.0", @@ -67,14 +68,6 @@ "tailwindcss": "^3.4.3" } }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", @@ -87,52 +80,68 @@ } }, "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, - "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "node_modules/@apideck/better-ajv-errors": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", + "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" + "json-schema": "^0.4.0", + "jsonpointer": "^5.0.0", + "leven": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "ajv": ">=8" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.6.tgz", + "integrity": "sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA==", + "dependencies": { + "@babel/highlight": "^7.24.6", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.20.tgz", - "integrity": "sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.6.tgz", + "integrity": "sha512-aC2DGhBq5eEdyXWqrDInSqQjO0k8xtPRf5YylULqx8MCd6jBtzqfta/3ETMRpuKIc5hyswfO80ObyA1MvkCcUQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.0.tgz", - "integrity": "sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.6.tgz", + "integrity": "sha512-qAHSfAdVyFmIvl0VHELib8xar7ONuSHrE2hLnsaWkYNTI68dmi1x8GYDhJjMI/e7XWal9QBlZkwbOnkcw7Z8gQ==", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.23.0", - "@babel/helpers": "^7.23.0", - "@babel/parser": "^7.23.0", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.0", - "@babel/types": "^7.23.0", + "@babel/code-frame": "^7.24.6", + "@babel/generator": "^7.24.6", + "@babel/helper-compilation-targets": "^7.24.6", + "@babel/helper-module-transforms": "^7.24.6", + "@babel/helpers": "^7.24.6", + "@babel/parser": "^7.24.6", + "@babel/template": "^7.24.6", + "@babel/traverse": "^7.24.6", + "@babel/types": "^7.24.6", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -147,18 +156,10 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/eslint-parser": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.22.15.tgz", - "integrity": "sha512-yc8OOBIQk1EcRrpizuARSQS0TWAcOMpEJ1aafhNznaeYkeL+OhqnDObGFylB8ka8VFF/sZc+S4RzHyO+3LjQxg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.24.6.tgz", + "integrity": "sha512-Q1BfQX42zXHx732PLW0w4+Y3wJjoZKEMaatFUEAmQ7Z+jCXxinzeqX9bvv2Q8xNPes/H6F0I23oGkcgjaItmLw==", "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", "eslint-visitor-keys": "^2.1.0", @@ -169,7 +170,7 @@ }, "peerDependencies": { "@babel/core": "^7.11.0", - "eslint": "^7.5.0 || ^8.0.0" + "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" } }, "node_modules/@babel/eslint-parser/node_modules/eslint-visitor-keys": { @@ -180,22 +181,14 @@ "node": ">=10" } }, - "node_modules/@babel/eslint-parser/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.6.tgz", + "integrity": "sha512-S7m4eNa6YAPJRHmKsLHIDJhNAGNKoWNiWefz1MBbpnt8g9lvMDl1hir4P9bo/57bQEmuwEhnRU/AMWsD0G/Fbg==", "dependencies": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", + "@babel/types": "^7.24.6", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" }, "engines": { @@ -203,35 +196,35 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.6.tgz", + "integrity": "sha512-DitEzDfOMnd13kZnDqns1ccmftwJTS9DMkyn9pYTxulS7bZxUxpMly3Nf23QQ6NwA4UB8lAqjbqWtyvElEMAkg==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.6.tgz", + "integrity": "sha512-+wnfqc5uHiMYtvRX7qu80Toef8BXeh4HHR1SPeonGb1SKPniNEd4a/nlaJJMv/OIEYvIVavvo0yR7u10Gqz0Iw==", "dependencies": { - "@babel/types": "^7.22.15" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.6.tgz", + "integrity": "sha512-VZQ57UsDGlX/5fFA7GkVPplZhHsVc+vuErWgdOiysI9Ksnw0Pbbd6pnPiR/mmJyKHgyIW0c7KT32gmhiF+cirg==", "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", + "@babel/compat-data": "^7.24.6", + "@babel/helper-validator-option": "^7.24.6", + "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -239,27 +232,19 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", - "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.6.tgz", + "integrity": "sha512-djsosdPJVZE6Vsw3kk7IPRWethP94WHGOhQTc67SNXE0ZzMhHgALw8iGmYS0TD1bbMM0VDROy43od7/hN6WYcA==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.15", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-annotate-as-pure": "^7.24.6", + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-function-name": "^7.24.6", + "@babel/helper-member-expression-to-functions": "^7.24.6", + "@babel/helper-optimise-call-expression": "^7.24.6", + "@babel/helper-replace-supers": "^7.24.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6", + "@babel/helper-split-export-declaration": "^7.24.6", "semver": "^6.3.1" }, "engines": { @@ -269,20 +254,12 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.6.tgz", + "integrity": "sha512-C875lFBIWWwyv6MHZUG9HmRrlTDgOsLWZfYR0nW69gaKJNe0/Mpxx5r0EID2ZdHQkdUmQo2t0uNckTL08/1BgA==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-annotate-as-pure": "^7.24.6", "regexpu-core": "^5.3.1", "semver": "^6.3.1" }, @@ -293,18 +270,10 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz", - "integrity": "sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", + "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", "@babel/helper-plugin-utils": "^7.22.5", @@ -316,69 +285,85 @@ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.6.tgz", + "integrity": "sha512-Y50Cg3k0LKLMjxdPjIl40SdJgMB85iXn27Vk/qbHZCFx/o5XO3PSnpi675h1KEmmDb6OFArfd5SCQEQ5Q4H88g==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.6.tgz", + "integrity": "sha512-xpeLqeeRkbxhnYimfr2PC+iA0Q7ljX/d1eZ9/inYbmfG2jpl8Lu3DyXvpOAnrS5kxkfOWJjioIMQsaMBXFI05w==", "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" + "@babel/template": "^7.24.6", + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.6.tgz", + "integrity": "sha512-SF/EMrC3OD7dSta1bLJIlrsVxwtd0UpjRJqLno6125epQMJ/kyFmpTT4pbvPbdQHzCHg+biQ7Syo8lnDtbR+uA==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.6.tgz", + "integrity": "sha512-OTsCufZTxDUsv2/eDXanw/mUZHWOxSbEmC3pP8cgjcy5rgeVPWWMStnv274DV60JtHxTk0adT0QrCzC4M9NWGg==", "dependencies": { - "@babel/types": "^7.23.0" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.6.tgz", + "integrity": "sha512-a26dmxFJBF62rRO9mmpgrfTLsAuyHk4e1hKTUkD/fcMfynt8gvEKwQPQDVxWhca8dHoDck+55DFt42zV0QMw5g==", "dependencies": { - "@babel/types": "^7.22.15" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", - "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.6.tgz", + "integrity": "sha512-Y/YMPm83mV2HJTbX1Qh2sjgjqcacvOlhbzdCCsSlblOKjSYmQqEbO6rUniWQyRo9ncyfjT8hnUjlG06RXDEmcA==", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-module-imports": "^7.24.6", + "@babel/helper-simple-access": "^7.24.6", + "@babel/helper-split-export-declaration": "^7.24.6", + "@babel/helper-validator-identifier": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -388,32 +373,32 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.6.tgz", + "integrity": "sha512-3SFDJRbx7KuPRl8XDUr8O7GAEB8iGyWPjLKJh/ywP/Iy9WOmEfMrsWbaZpvBu2HSYn4KQygIsz0O7m8y10ncMA==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.6.tgz", + "integrity": "sha512-MZG/JcWfxybKwsA9N9PmtF2lOSFSEMVCpIRrbxccZFLJPrJciJdG/UhSh5W96GEteJI2ARqm5UAHxISwRDLSNg==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.6.tgz", + "integrity": "sha512-1Qursq9ArRZPAMOZf/nuzVW8HgJLkTB9y9LfP4lW2MVp4e9WkLJDovfKBxoDcCk6VuzIxyqWHyBoaCtSRP10yg==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" + "@babel/helper-annotate-as-pure": "^7.24.6", + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-wrap-function": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -423,13 +408,13 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", - "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.6.tgz", + "integrity": "sha512-mRhfPwDqDpba8o1F8ESxsEkJMQkUF8ZIWrAc0FtWhxnjfextxMWxr22RtFizxxSYLjVHDeMgVsRq8BBZR2ikJQ==", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.22.15", - "@babel/helper-optimise-call-expression": "^7.22.5" + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-member-expression-to-functions": "^7.24.6", + "@babel/helper-optimise-call-expression": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -439,105 +424,105 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.6.tgz", + "integrity": "sha512-nZzcMMD4ZhmB35MOOzQuiGO5RzL6tJbsT37Zx8M5L/i9KSrukGXWTjLe1knIbb/RmxoJE9GON9soq0c0VEMM5g==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.6.tgz", + "integrity": "sha512-jhbbkK3IUKc4T43WadP96a27oYti9gEf1LdyGSP2rHGH77kwLwfhO7TgwnWvxxQVmke0ImmCSS47vcuxEMGD3Q==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.6.tgz", + "integrity": "sha512-CvLSkwXGWnYlF9+J3iZUvwgAxKiYzK3BWuo+mLzD/MDGOZDj7Gq8+hqaOkMxmJwmlv0iu86uH5fdADd9Hxkymw==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.6.tgz", + "integrity": "sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.6.tgz", + "integrity": "sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.6.tgz", + "integrity": "sha512-Jktc8KkF3zIkePb48QO+IapbXlSapOW9S+ogZZkcO6bABgYAxtZcjZ/O005111YLf+j4M84uEgwYoidDkXbCkQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.6.tgz", + "integrity": "sha512-f1JLrlw/jbiNfxvdrfBgio/gRBk3yTAEJWirpAkiJG2Hb22E7cEYKHWo0dFPTv/niPovzIdPdEDetrv6tC6gPQ==", "dependencies": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" + "@babel/helper-function-name": "^7.24.6", + "@babel/template": "^7.24.6", + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.23.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.1.tgz", - "integrity": "sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.6.tgz", + "integrity": "sha512-V2PI+NqnyFu1i0GyTd/O/cTpxzQCYioSkUIRmgo7gFEHKKCg5w46+r/A6WeUR1+P3TeQ49dspGPNd/E3n9AnnA==", "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.0", - "@babel/types": "^7.23.0" + "@babel/template": "^7.24.6", + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.6.tgz", + "integrity": "sha512-2YnuOp4HAk2BsBrJJvYCbItHx0zWscI1C3zgWkz+wDyD9I7GIVrfnLyrR4Y1VR+7p+chAEcrgRQYZAGIKMV7vQ==", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.24.6", "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", - "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.6.tgz", + "integrity": "sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q==", "bin": { "parser": "bin/babel-parser.js" }, @@ -545,12 +530,27 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz", - "integrity": "sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==", + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.6.tgz", + "integrity": "sha512-bYndrJ6Ph6Ar+GaB5VAc0JPoP80bQCm4qon6JEzXfRl5QZyQ8Ur1K6k7htxWmPA5z+k7JQvaMUrtXlqclWYzKw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.6.tgz", + "integrity": "sha512-iVuhb6poq5ikqRq2XWU6OQ+R5o9wF+r/or9CeUyovgptz0UlnK4/seOQ1Istu/XybYjAhQv1FRSSfHHufIku5Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -560,13 +560,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz", - "integrity": "sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.6.tgz", + "integrity": "sha512-c8TER5xMDYzzFcGqOEp9l4hvB7dcbhcGjcLVwxWfe4P5DOafdwjsBJZKsmv+o3aXh7NhopvayQIovHrh2zSRUQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.22.15" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6", + "@babel/plugin-transform-optional-chaining": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -575,6 +575,21 @@ "@babel/core": "^7.13.0" } }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.6.tgz", + "integrity": "sha512-z8zEjYmwBUHN/pCF3NuWBhHQjJCrd33qAi8MgANfMrAvn72k2cImT8VjK9LJFu4ysOLJqhfkYYb3MvwANRUNZQ==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-proposal-class-properties": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", @@ -592,15 +607,13 @@ } }, "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.23.0.tgz", - "integrity": "sha512-kYsT+f5ARWF6AdFmqoEEp+hpqxEB8vGmRWfw2aj78M2vTwS2uHW91EF58iFm1Z9U8Y/RrLu2XKJn46P9ca1b0w==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.24.6.tgz", + "integrity": "sha512-8DjR0/DzlBhz2SVi9a19/N2U5+C3y3rseXuyoKL9SP8vnbewscj1eHZtL6kpEn4UCuUmqEo0mvqyDYRFoN2gpA==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/plugin-syntax-decorators": "^7.22.10" + "@babel/helper-create-class-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/plugin-syntax-decorators": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -733,11 +746,11 @@ } }, "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.22.10.tgz", - "integrity": "sha512-z1KTVemBjnz+kSEilAsI4lbkPOl5TvJH7YDSY1CTIzvLWJ+KHXp+mRe8VPmfnyvqOPqar1V2gid2PleKzRUstQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.24.6.tgz", + "integrity": "sha512-gInH8LEqBp+wkwTVihCd/qf+4s28g81FZyvlIbAurHk9eSiItEKG7E0uNK2UdpgsD79aJVAW3R3c85h0YJ0jsw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -769,11 +782,11 @@ } }, "node_modules/@babel/plugin-syntax-flow": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.22.5.tgz", - "integrity": "sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.24.6.tgz", + "integrity": "sha512-gNkksSdV8RbsCoHF9sjVYrHfYACMl/8U32UfUhJ9+84/ASXw8dlx+eHyyF0m6ncQJ9IBSxfuCkB36GJqYdXTOA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -783,11 +796,11 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", - "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.6.tgz", + "integrity": "sha512-BE6o2BogJKJImTmGpkmOic4V0hlRRxVtzqxiSPa8TIFxyhi4EFjHm08nq1M4STK4RytuLMgnSz0/wfflvGFNOg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -797,11 +810,11 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", - "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.6.tgz", + "integrity": "sha512-D+CfsVZousPXIdudSII7RGy52+dYRtbyKAZcvtQKq/NpsivyMVduepzcLqG5pMBugtMdedxdC8Ramdpcne9ZWQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -833,11 +846,11 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", - "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.6.tgz", + "integrity": "sha512-lWfvAIFNWMlCsU0DRUun2GpFwZdGTukLaHJqRh1JRb80NdAP5Sb1HDHB5X9P9OtgZHQl089UzQkpYlBq2VTPRw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -941,11 +954,11 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", - "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.6.tgz", + "integrity": "sha512-TzCtxGgVTEJWWwcYwQhCIQ6WaKlo80/B+Onsk4RRCcYqpYGFcG9etPW94VToGte5AAcxRrhjPUFvUS3Y2qKi4A==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -970,11 +983,11 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", - "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.6.tgz", + "integrity": "sha512-jSSSDt4ZidNMggcLx8SaKsbGNEfIl0PHx/4mFEulorE7bpYLbN0d3pDW3eJ7Y5Z3yPhy3L3NaPCYyTUY7TuugQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -984,13 +997,13 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.15.tgz", - "integrity": "sha512-jBm1Es25Y+tVoTi5rfd5t1KLmL8ogLKpXszboWOTTtGFGz2RKnQe2yn7HbZ+kb/B8N0FVSGQo874NSlOU1T4+w==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.6.tgz", + "integrity": "sha512-VEP2o4iR2DqQU6KPgizTW2mnMx6BG5b5O9iQdrW9HesLkv8GIA8x2daXBQxw1MrsIkFQGA/iJ204CKoQ8UcnAA==", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.9", + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-remap-async-to-generator": "^7.24.6", "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { @@ -1001,13 +1014,13 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", - "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.6.tgz", + "integrity": "sha512-NTBA2SioI3OsHeIn6sQmhvXleSl9T70YY/hostQLveWs0ic+qvbA3fa0kwAwQ0OA/XGaAerNZRQGJyRfhbJK4g==", "dependencies": { - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.5" + "@babel/helper-module-imports": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-remap-async-to-generator": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1017,11 +1030,11 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", - "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.6.tgz", + "integrity": "sha512-XNW7jolYHW9CwORrZgA/97tL/k05qe/HL0z/qqJq1mdWhwwCM6D4BJBV7wAz9HgFziN5dTOG31znkVIzwxv+vw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1031,11 +1044,11 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz", - "integrity": "sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.6.tgz", + "integrity": "sha512-S/t1Xh4ehW7sGA7c1j/hiOBLnEYCp/c2sEG4ZkL8kI1xX9tW2pqJTCHKtdhe/jHKt8nG0pFCrDHUXd4DvjHS9w==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1045,12 +1058,12 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", - "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.6.tgz", + "integrity": "sha512-j6dZ0Z2Z2slWLR3kt9aOmSIrBvnntWjMDN/TVcMPxhXMLmJVqX605CBRlcGI4b32GMbfifTEsdEjGjiE+j/c3A==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-class-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1060,12 +1073,12 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz", - "integrity": "sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.6.tgz", + "integrity": "sha512-1QSRfoPI9RoLRa8Mnakc6v3e0gJxiZQTYrMfLn+mD0sz5+ndSzwymp2hDcYJTyT0MOn0yuWzj8phlIvO72gTHA==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.11", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { @@ -1076,18 +1089,17 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz", - "integrity": "sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.6.tgz", + "integrity": "sha512-+fN+NO2gh8JtRmDSOB6gaCVo36ha8kfCW1nMq2Gc0DABln0VcHN4PrALDvF5/diLzIRKptC7z/d7Lp64zk92Fg==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", - "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-annotate-as-pure": "^7.24.6", + "@babel/helper-compilation-targets": "^7.24.6", + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-function-name": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-replace-supers": "^7.24.6", + "@babel/helper-split-export-declaration": "^7.24.6", "globals": "^11.1.0" }, "engines": { @@ -1097,13 +1109,21 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-classes/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", - "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.6.tgz", + "integrity": "sha512-cRzPobcfRP0ZtuIEkA8QzghoUpSB3X3qSH5W2+FzG+VjWbJXExtx0nbRqwumdBN1x/ot2SlTNQLfBCnPdzp6kg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/template": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1113,11 +1133,11 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz", - "integrity": "sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.6.tgz", + "integrity": "sha512-YLW6AE5LQpk5npNXL7i/O+U9CE4XsBCuRPgyjl1EICZYKmcitV+ayuuUGMJm2lC1WWjXYszeTnIxF/dq/GhIZQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1127,12 +1147,12 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", - "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.6.tgz", + "integrity": "sha512-rCXPnSEKvkm/EjzOtLoGvKseK+dS4kZwx1HexO3BtRtgL0fQ34awHn34aeSHuXtZY2F8a1X8xqBBPRtOxDVmcA==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1142,11 +1162,11 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", - "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.6.tgz", + "integrity": "sha512-/8Odwp/aVkZwPFJMllSbawhDAO3UJi65foB00HYnK/uXvvCPm0TAXSByjz1mpRmp0q6oX2SIxpkUOpPFHk7FLA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1156,11 +1176,11 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz", - "integrity": "sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.6.tgz", + "integrity": "sha512-vpq8SSLRTBLOHUZHSnBqVo0AKX3PBaoPs2vVzYVWslXDTDIpwAcCDtfhUcHSQQoYoUvcFPTdC8TZYXu9ZnLT/w==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { @@ -1171,12 +1191,12 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", - "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.6.tgz", + "integrity": "sha512-EemYpHtmz0lHE7hxxxYEuTYOOBZ43WkDgZ4arQ4r+VX9QHuNZC+WH3wUWmRNvR8ECpTRne29aZV6XO22qpOtdA==", "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1186,11 +1206,11 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz", - "integrity": "sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.6.tgz", + "integrity": "sha512-inXaTM1SVrIxCkIJ5gqWiozHfFMStuGbGJAxZFBoHcRRdDP0ySLb3jH6JOwmfiinPwyMZqMBX+7NBDCO4z0NSA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { @@ -1201,12 +1221,12 @@ } }, "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.22.5.tgz", - "integrity": "sha512-tujNbZdxdG0/54g/oua8ISToaXTFBf8EnSb5PgQSciIXWOWKX3S4+JR7ZE9ol8FZwf9kxitzkGQ+QWeov/mCiA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.24.6.tgz", + "integrity": "sha512-1l8b24NoCpaQ13Vi6FtLG1nv6kNoi8PWvQb1AYO7GHZDpFfBYc3lbXArx1lP2KRt8b4pej1eWc/zrRmsQTfOdQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-flow": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/plugin-syntax-flow": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1216,11 +1236,12 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz", - "integrity": "sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.6.tgz", + "integrity": "sha512-n3Sf72TnqK4nw/jziSqEl1qaWPbCRw2CziHH+jdRYvw4J6yeCzsj4jdw8hIntOEeDGTmHVe2w4MVL44PN0GMzg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1230,13 +1251,13 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", - "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.6.tgz", + "integrity": "sha512-sOajCu6V0P1KPljWHKiDq6ymgqB+vfo3isUS4McqW1DZtvSVU2v/wuMhmRmkg3sFoq6GMaUUf8W4WtoSLkOV/Q==", "dependencies": { - "@babel/helper-compilation-targets": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-compilation-targets": "^7.24.6", + "@babel/helper-function-name": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1246,11 +1267,11 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz", - "integrity": "sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.6.tgz", + "integrity": "sha512-Uvgd9p2gUnzYJxVdBLcU0KurF8aVhkmVyMKW4MIY1/BByvs3EBpv45q01o7pRTVmTvtQq5zDlytP3dcUgm7v9w==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { @@ -1261,11 +1282,11 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", - "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.6.tgz", + "integrity": "sha512-f2wHfR2HF6yMj+y+/y07+SLqnOSwRp8KYLpQKOzS58XLVlULhXbiYcygfXQxJlMbhII9+yXDwOUFLf60/TL5tw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1275,11 +1296,11 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz", - "integrity": "sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.6.tgz", + "integrity": "sha512-EKaWvnezBCMkRIHxMJSIIylzhqK09YpiJtDbr2wsXTwnO0TxyjMUkaw4RlFIZMIS0iDj0KyIg7H7XCguHu/YDA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { @@ -1290,11 +1311,11 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", - "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.6.tgz", + "integrity": "sha512-9g8iV146szUo5GWgXpRbq/GALTnY+WnNuRTuRHWWFfWGbP9ukRL0aO/jpu9dmOPikclkxnNsjY8/gsWl6bmZJQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1304,12 +1325,12 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz", - "integrity": "sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.6.tgz", + "integrity": "sha512-eAGogjZgcwqAxhyFgqghvoHRr+EYRQPFjUXrTYKBRb5qPnAVxOOglaxc4/byHqjvq/bqO2F3/CGwTHsgKJYHhQ==", "dependencies": { - "@babel/helper-module-transforms": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-module-transforms": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1319,13 +1340,13 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz", - "integrity": "sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.6.tgz", + "integrity": "sha512-JEV8l3MHdmmdb7S7Cmx6rbNEjRCgTQMZxllveHO0mx6uiclB0NflCawlQQ6+o5ZrwjUBYPzHm2XoK4wqGVUFuw==", "dependencies": { - "@babel/helper-module-transforms": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5" + "@babel/helper-module-transforms": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-simple-access": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1335,14 +1356,14 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz", - "integrity": "sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.6.tgz", + "integrity": "sha512-xg1Z0J5JVYxtpX954XqaaAT6NpAY6LtZXvYFCJmGFJWwtlz2EmJoR8LycFRGNE8dBKizGWkGQZGegtkV8y8s+w==", "dependencies": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-hoist-variables": "^7.24.6", + "@babel/helper-module-transforms": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-validator-identifier": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1352,12 +1373,12 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", - "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.6.tgz", + "integrity": "sha512-esRCC/KsSEUvrSjv5rFYnjZI6qv4R1e/iHQrqwbZIoRJqk7xCvEUiN7L1XrmW5QSmQe3n1XD88wbgDTWLbVSyg==", "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-module-transforms": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1367,12 +1388,12 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.6.tgz", + "integrity": "sha512-6DneiCiu91wm3YiNIGDWZsl6GfTTbspuj/toTEqLh9d4cx50UIzSdg+T96p8DuT7aJOBRhFyaE9ZvTHkXrXr6Q==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1382,11 +1403,11 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", - "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.6.tgz", + "integrity": "sha512-f8liz9JG2Va8A4J5ZBuaSdwfPqN6axfWRK+y66fjKYbwf9VBLuq4WxtinhJhvp1w6lamKUwLG0slK2RxqFgvHA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1396,11 +1417,11 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz", - "integrity": "sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.6.tgz", + "integrity": "sha512-+QlAiZBMsBK5NqrBWFXCYeXyiU1y7BQ/OYaiPAcQJMomn5Tyg+r5WuVtyEuvTbpV7L25ZSLfE+2E9ywj4FD48A==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { @@ -1411,11 +1432,11 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz", - "integrity": "sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.6.tgz", + "integrity": "sha512-6voawq8T25Jvvnc4/rXcWZQKKxUNZcKMS8ZNrjxQqoRFernJJKjE3s18Qo6VFaatG5aiX5JV1oPD7DbJhn0a4Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { @@ -1426,15 +1447,14 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz", - "integrity": "sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.6.tgz", + "integrity": "sha512-OKmi5wiMoRW5Smttne7BwHM8s/fb5JFs+bVGNSeHWzwZkWXWValR1M30jyXo1s/RaqgwwhEC62u4rFH/FBcBPg==", "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-compilation-targets": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.22.15" + "@babel/plugin-transform-parameters": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1444,12 +1464,12 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", - "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.6.tgz", + "integrity": "sha512-N/C76ihFKlZgKfdkEYKtaRUtXZAgK7sOY4h2qrbVbVTXPrKGIi8aww5WGe/+Wmg8onn8sr2ut6FXlsbu/j6JHg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-replace-supers": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1459,11 +1479,11 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz", - "integrity": "sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.6.tgz", + "integrity": "sha512-L5pZ+b3O1mSzJ71HmxSCmTVd03VOT2GXOigug6vDYJzE5awLI7P1g0wFcdmGuwSDSrQ0L2rDOe/hHws8J1rv3w==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { @@ -1474,12 +1494,12 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz", - "integrity": "sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.6.tgz", + "integrity": "sha512-cHbqF6l1QP11OkYTYQ+hhVx1E017O5ZcSPXk9oODpqhcAD1htsWG2NpHrrhthEO2qZomLK0FXS+u7NfrkF5aOQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { @@ -1490,11 +1510,11 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz", - "integrity": "sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.6.tgz", + "integrity": "sha512-ST7guE8vLV+vI70wmAxuZpIKzVjvFX9Qs8bl5w6tN/6gOypPWUmMQL2p7LJz5E63vEGrDhAiYetniJFyBH1RkA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1504,12 +1524,12 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", - "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.6.tgz", + "integrity": "sha512-T9LtDI0BgwXOzyXrvgLTT8DFjCC/XgWLjflczTLXyvxbnSR/gpv0hbmzlHE/kmh9nOvlygbamLKRo6Op4yB6aw==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-class-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1519,13 +1539,13 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz", - "integrity": "sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.6.tgz", + "integrity": "sha512-Qu/ypFxCY5NkAnEhCF86Mvg3NSabKsh/TPpBVswEdkGl7+FbsYHy1ziRqJpwGH4thBdQHh8zx+z7vMYmcJ7iaQ==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.11", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-annotate-as-pure": "^7.24.6", + "@babel/helper-create-class-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -1536,11 +1556,11 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", - "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.6.tgz", + "integrity": "sha512-oARaglxhRsN18OYsnPTpb8TcKQWDYNsPNmTnx5++WOAsUJ0cSC/FZVlIJCKvPbU4yn/UXsS0551CFKJhN0CaMw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1550,11 +1570,11 @@ } }, "node_modules/@babel/plugin-transform-react-constant-elements": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.22.5.tgz", - "integrity": "sha512-BF5SXoO+nX3h5OhlN78XbbDrBOffv+AxPP2ENaJOVqjWCgBDeOY3WcaUcddutGSfoap+5NEQ/q/4I3WZIvgkXA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.24.6.tgz", + "integrity": "sha512-vQfyXRtG/kNIcTYRd/49uJnwvMig9X3R4XsTVXRml2RFupZFY+2RDuK+/ymb+MfX2WuIHAgUZc2xEvQrnI7QCg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1564,11 +1584,11 @@ } }, "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz", - "integrity": "sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.6.tgz", + "integrity": "sha512-/3iiEEHDsJuj9QU09gbyWGSUxDboFcD7Nj6dnHIlboWSodxXAoaY/zlNMHeYAC0WsERMqgO9a7UaM77CsYgWcg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1578,15 +1598,15 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.15.tgz", - "integrity": "sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.24.6.tgz", + "integrity": "sha512-pCtPHhpRZHfwdA5G1Gpk5mIzMA99hv0R8S/Ket50Rw+S+8hkt3wBWqdqHaPw0CuUYxdshUgsPiLQ5fAs4ASMhw==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-jsx": "^7.22.5", - "@babel/types": "^7.22.15" + "@babel/helper-annotate-as-pure": "^7.24.6", + "@babel/helper-module-imports": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/plugin-syntax-jsx": "^7.24.6", + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1596,11 +1616,11 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", - "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.24.6.tgz", + "integrity": "sha512-F7EsNp5StNDouSSdYyDSxh4J+xvj/JqG+Cb6s2fA+jCyHOzigG5vTwgH8tU2U8Voyiu5zCG9bAK49wTr/wPH0w==", "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.22.5" + "@babel/plugin-transform-react-jsx": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1610,12 +1630,12 @@ } }, "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.22.5.tgz", - "integrity": "sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.6.tgz", + "integrity": "sha512-0HoDQlFJJkXRyV2N+xOpUETbKHcouSwijRQbKWVtxsPoq5bbB30qZag9/pSc5xcWVYjTHlLsBsY+hZDnzQTPNw==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-annotate-as-pure": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1625,11 +1645,11 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz", - "integrity": "sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.6.tgz", + "integrity": "sha512-SMDxO95I8WXRtXhTAc8t/NFQUT7VYbIWwJCJgEli9ml4MhqUMh4S6hxgH6SmAC3eAQNWCDJFxcFeEt9w2sDdXg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.6", "regenerator-transform": "^0.15.2" }, "engines": { @@ -1640,11 +1660,11 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", - "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.6.tgz", + "integrity": "sha512-DcrgFXRRlK64dGE0ZFBPD5egM2uM8mgfrvTMOSB2yKzOtjpGegVYkzh3s1zZg1bBck3nkXiaOamJUqK3Syk+4A==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1654,15 +1674,15 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.15.tgz", - "integrity": "sha512-tEVLhk8NRZSmwQ0DJtxxhTrCht1HVo8VaMzYT4w6lwyKBuHsgoioAUA7/6eT2fRfc5/23fuGdlwIxXhRVgWr4g==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.6.tgz", + "integrity": "sha512-W3gQydMb0SY99y/2lV0Okx2xg/8KzmZLQsLaiCmwNRl1kKomz14VurEm+2TossUb+sRvBCnGe+wx8KtIgDtBbQ==", "dependencies": { - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.5", - "babel-plugin-polyfill-corejs3": "^0.8.3", - "babel-plugin-polyfill-regenerator": "^0.5.2", + "@babel/helper-module-imports": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.1", + "babel-plugin-polyfill-regenerator": "^0.6.1", "semver": "^6.3.1" }, "engines": { @@ -1672,20 +1692,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", - "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.6.tgz", + "integrity": "sha512-xnEUvHSMr9eOWS5Al2YPfc32ten7CXdH7Zwyyk7IqITg4nX61oHj+GxpNvl+y5JHjfN3KXE2IV55wAWowBYMVw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1695,12 +1707,12 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", - "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.6.tgz", + "integrity": "sha512-h/2j7oIUDjS+ULsIrNZ6/TKG97FgmEk1PXryk/HQq6op4XUUUwif2f69fJrzK0wza2zjCS1xhXmouACaWV5uPA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1710,11 +1722,11 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", - "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.6.tgz", + "integrity": "sha512-fN8OcTLfGmYv7FnDrsjodYBo1DhPL3Pze/9mIIE2MGCT1KgADYIOD7rEglpLHZj8PZlC/JFX5WcD+85FLAQusw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1724,11 +1736,11 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", - "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.6.tgz", + "integrity": "sha512-BJbEqJIcKwrqUP+KfUIkxz3q8VzXe2R8Wv8TaNgO1cx+nNavxn/2+H8kp9tgFSOL6wYPPEgFvU6IKS4qoGqhmg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1738,11 +1750,11 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", - "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.6.tgz", + "integrity": "sha512-IshCXQ+G9JIFJI7bUpxTE/oA2lgVLAIK8q1KdJNoPXOpvRaNjMySGuvLfBw/Xi2/1lLo953uE8hyYSDW3TSYig==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1752,14 +1764,14 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.15.tgz", - "integrity": "sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.6.tgz", + "integrity": "sha512-H0i+hDLmaYYSt6KU9cZE0gb3Cbssa/oxWis7PX4ofQzbvsfix9Lbh8SRk7LCPDlLWJHUiFeHU0qRRpF/4Zv7mQ==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-typescript": "^7.22.5" + "@babel/helper-annotate-as-pure": "^7.24.6", + "@babel/helper-create-class-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/plugin-syntax-typescript": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1769,11 +1781,11 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz", - "integrity": "sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.6.tgz", + "integrity": "sha512-bKl3xxcPbkQQo5eX9LjjDpU2xYHeEeNQbOhj0iPvetSzA+Tu9q/o5lujF4Sek60CM6MgYvOS/DJuwGbiEYAnLw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1783,12 +1795,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", - "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.6.tgz", + "integrity": "sha512-8EIgImzVUxy15cZiPii9GvLZwsy7Vxc+8meSlR3cXFmBIl5W5Tn9LGBf7CDKkHj4uVfNXCJB8RsVfnmY61iedA==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1798,12 +1810,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", - "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.6.tgz", + "integrity": "sha512-pssN6ExsvxaKU638qcWb81RrvvgZom3jDgU/r5xFZ7TONkZGFf4MhI2ltMb8OcQWhHyxgIavEU+hgqtbKOmsPA==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1813,12 +1825,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", - "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.6.tgz", + "integrity": "sha512-quiMsb28oXWIDK0gXLALOJRXLgICLiulqdZGOaPPd0vRT7fQp74NtdADAVu+D8s00C+0Xs0MxVP0VKF/sZEUgw==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1828,24 +1840,26 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.20.tgz", - "integrity": "sha512-11MY04gGC4kSzlPHRfvVkNAZhUxOvm7DCJ37hPDnUENwe06npjIRAfInEMTGSb4LZK5ZgDFkv5hw0lGebHeTyg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.6.tgz", + "integrity": "sha512-CrxEAvN7VxfjOG8JNF2Y/eMqMJbZPZ185amwGUBp8D9USK90xQmv7dLdFSa+VbD7fdIqcy/Mfv7WtzG8+/qxKg==", "dependencies": { - "@babel/compat-data": "^7.22.20", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.15", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.15", + "@babel/compat-data": "^7.24.6", + "@babel/helper-compilation-targets": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-validator-option": "^7.24.6", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.6", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.6", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.6", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.22.5", - "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-assertions": "^7.24.6", + "@babel/plugin-syntax-import-attributes": "^7.24.6", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", @@ -1857,59 +1871,58 @@ "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.22.5", - "@babel/plugin-transform-async-generator-functions": "^7.22.15", - "@babel/plugin-transform-async-to-generator": "^7.22.5", - "@babel/plugin-transform-block-scoped-functions": "^7.22.5", - "@babel/plugin-transform-block-scoping": "^7.22.15", - "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-class-static-block": "^7.22.11", - "@babel/plugin-transform-classes": "^7.22.15", - "@babel/plugin-transform-computed-properties": "^7.22.5", - "@babel/plugin-transform-destructuring": "^7.22.15", - "@babel/plugin-transform-dotall-regex": "^7.22.5", - "@babel/plugin-transform-duplicate-keys": "^7.22.5", - "@babel/plugin-transform-dynamic-import": "^7.22.11", - "@babel/plugin-transform-exponentiation-operator": "^7.22.5", - "@babel/plugin-transform-export-namespace-from": "^7.22.11", - "@babel/plugin-transform-for-of": "^7.22.15", - "@babel/plugin-transform-function-name": "^7.22.5", - "@babel/plugin-transform-json-strings": "^7.22.11", - "@babel/plugin-transform-literals": "^7.22.5", - "@babel/plugin-transform-logical-assignment-operators": "^7.22.11", - "@babel/plugin-transform-member-expression-literals": "^7.22.5", - "@babel/plugin-transform-modules-amd": "^7.22.5", - "@babel/plugin-transform-modules-commonjs": "^7.22.15", - "@babel/plugin-transform-modules-systemjs": "^7.22.11", - "@babel/plugin-transform-modules-umd": "^7.22.5", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.22.5", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", - "@babel/plugin-transform-numeric-separator": "^7.22.11", - "@babel/plugin-transform-object-rest-spread": "^7.22.15", - "@babel/plugin-transform-object-super": "^7.22.5", - "@babel/plugin-transform-optional-catch-binding": "^7.22.11", - "@babel/plugin-transform-optional-chaining": "^7.22.15", - "@babel/plugin-transform-parameters": "^7.22.15", - "@babel/plugin-transform-private-methods": "^7.22.5", - "@babel/plugin-transform-private-property-in-object": "^7.22.11", - "@babel/plugin-transform-property-literals": "^7.22.5", - "@babel/plugin-transform-regenerator": "^7.22.10", - "@babel/plugin-transform-reserved-words": "^7.22.5", - "@babel/plugin-transform-shorthand-properties": "^7.22.5", - "@babel/plugin-transform-spread": "^7.22.5", - "@babel/plugin-transform-sticky-regex": "^7.22.5", - "@babel/plugin-transform-template-literals": "^7.22.5", - "@babel/plugin-transform-typeof-symbol": "^7.22.5", - "@babel/plugin-transform-unicode-escapes": "^7.22.10", - "@babel/plugin-transform-unicode-property-regex": "^7.22.5", - "@babel/plugin-transform-unicode-regex": "^7.22.5", - "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", + "@babel/plugin-transform-arrow-functions": "^7.24.6", + "@babel/plugin-transform-async-generator-functions": "^7.24.6", + "@babel/plugin-transform-async-to-generator": "^7.24.6", + "@babel/plugin-transform-block-scoped-functions": "^7.24.6", + "@babel/plugin-transform-block-scoping": "^7.24.6", + "@babel/plugin-transform-class-properties": "^7.24.6", + "@babel/plugin-transform-class-static-block": "^7.24.6", + "@babel/plugin-transform-classes": "^7.24.6", + "@babel/plugin-transform-computed-properties": "^7.24.6", + "@babel/plugin-transform-destructuring": "^7.24.6", + "@babel/plugin-transform-dotall-regex": "^7.24.6", + "@babel/plugin-transform-duplicate-keys": "^7.24.6", + "@babel/plugin-transform-dynamic-import": "^7.24.6", + "@babel/plugin-transform-exponentiation-operator": "^7.24.6", + "@babel/plugin-transform-export-namespace-from": "^7.24.6", + "@babel/plugin-transform-for-of": "^7.24.6", + "@babel/plugin-transform-function-name": "^7.24.6", + "@babel/plugin-transform-json-strings": "^7.24.6", + "@babel/plugin-transform-literals": "^7.24.6", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.6", + "@babel/plugin-transform-member-expression-literals": "^7.24.6", + "@babel/plugin-transform-modules-amd": "^7.24.6", + "@babel/plugin-transform-modules-commonjs": "^7.24.6", + "@babel/plugin-transform-modules-systemjs": "^7.24.6", + "@babel/plugin-transform-modules-umd": "^7.24.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.6", + "@babel/plugin-transform-new-target": "^7.24.6", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.6", + "@babel/plugin-transform-numeric-separator": "^7.24.6", + "@babel/plugin-transform-object-rest-spread": "^7.24.6", + "@babel/plugin-transform-object-super": "^7.24.6", + "@babel/plugin-transform-optional-catch-binding": "^7.24.6", + "@babel/plugin-transform-optional-chaining": "^7.24.6", + "@babel/plugin-transform-parameters": "^7.24.6", + "@babel/plugin-transform-private-methods": "^7.24.6", + "@babel/plugin-transform-private-property-in-object": "^7.24.6", + "@babel/plugin-transform-property-literals": "^7.24.6", + "@babel/plugin-transform-regenerator": "^7.24.6", + "@babel/plugin-transform-reserved-words": "^7.24.6", + "@babel/plugin-transform-shorthand-properties": "^7.24.6", + "@babel/plugin-transform-spread": "^7.24.6", + "@babel/plugin-transform-sticky-regex": "^7.24.6", + "@babel/plugin-transform-template-literals": "^7.24.6", + "@babel/plugin-transform-typeof-symbol": "^7.24.6", + "@babel/plugin-transform-unicode-escapes": "^7.24.6", + "@babel/plugin-transform-unicode-property-regex": "^7.24.6", + "@babel/plugin-transform-unicode-regex": "^7.24.6", + "@babel/plugin-transform-unicode-sets-regex": "^7.24.6", "@babel/preset-modules": "0.1.6-no-external-plugins", - "@babel/types": "^7.22.19", - "babel-plugin-polyfill-corejs2": "^0.4.5", - "babel-plugin-polyfill-corejs3": "^0.8.3", - "babel-plugin-polyfill-regenerator": "^0.5.2", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.4", + "babel-plugin-polyfill-regenerator": "^0.6.1", "core-js-compat": "^3.31.0", "semver": "^6.3.1" }, @@ -1920,14 +1933,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/preset-modules": { "version": "0.1.6-no-external-plugins", "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", @@ -1942,16 +1947,16 @@ } }, "node_modules/@babel/preset-react": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.22.15.tgz", - "integrity": "sha512-Csy1IJ2uEh/PecCBXXoZGAZBeCATTuePzCSB7dLYWS0vOEj6CNpjxIhW4duWwZodBNueH7QO14WbGn8YyeuN9w==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.6.tgz", + "integrity": "sha512-8mpzh1bWvmINmwM3xpz6ahu57mNaWavMm+wBNjQ4AFu1nghKBiIRET7l/Wmj4drXany/BBGjJZngICcD98F1iw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-transform-react-display-name": "^7.22.5", - "@babel/plugin-transform-react-jsx": "^7.22.15", - "@babel/plugin-transform-react-jsx-development": "^7.22.5", - "@babel/plugin-transform-react-pure-annotations": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-validator-option": "^7.24.6", + "@babel/plugin-transform-react-display-name": "^7.24.6", + "@babel/plugin-transform-react-jsx": "^7.24.6", + "@babel/plugin-transform-react-jsx-development": "^7.24.6", + "@babel/plugin-transform-react-pure-annotations": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1961,15 +1966,15 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.0.tgz", - "integrity": "sha512-6P6VVa/NM/VlAYj5s2Aq/gdVg8FSENCg3wlZ6Qau9AcPaoF5LbN1nyGlR9DTRIw9PpxI94e+ReydsJHcjwAweg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.6.tgz", + "integrity": "sha512-U10aHPDnokCFRXgyT/MaIRTivUu2K/mu0vJlwRS9LxJmJet+PFQNKpggPyFCUtC6zWSBPjvxjnpNkAn3Uw2m5w==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-syntax-jsx": "^7.22.5", - "@babel/plugin-transform-modules-commonjs": "^7.23.0", - "@babel/plugin-transform-typescript": "^7.22.15" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-validator-option": "^7.24.6", + "@babel/plugin-syntax-jsx": "^7.24.6", + "@babel/plugin-transform-modules-commonjs": "^7.24.6", + "@babel/plugin-transform-typescript": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1984,9 +1989,9 @@ "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" }, "node_modules/@babel/runtime": { - "version": "7.23.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.1.tgz", - "integrity": "sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.6.tgz", + "integrity": "sha512-Ja18XcETdEl5mzzACGd+DKgaGJzPTCow7EglgwTmHdwokzDFYh/MHua6lU6DV/hjF2IaOJ4oX2nqnjG7RElKOw==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -2020,31 +2025,31 @@ } }, "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.6.tgz", + "integrity": "sha512-3vgazJlLwNXi9jhrR1ef8qiB65L1RK90+lEQwv4OxveHnqC3BfmnHdgySwRLzf6akhlOYenT+b7AfWq+a//AHw==", "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.24.6", + "@babel/parser": "^7.24.6", + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", - "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.6.tgz", + "integrity": "sha512-OsNjaJwT9Zn8ozxcfoBc+RaHdj3gFmCmYoQLUII1o6ZrUwku0BMg80FoOTPx+Gi6XhcQxAYE4xyjPTo4SxEQqw==", "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9", + "@babel/code-frame": "^7.24.6", + "@babel/generator": "^7.24.6", + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-function-name": "^7.24.6", + "@babel/helper-hoist-variables": "^7.24.6", + "@babel/helper-split-export-declaration": "^7.24.6", + "@babel/parser": "^7.24.6", + "@babel/types": "^7.24.6", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2052,13 +2057,21 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/types": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", - "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.6.tgz", + "integrity": "sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ==", "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.24.6", + "@babel/helper-validator-identifier": "^7.24.6", "to-fast-properties": "^2.0.0" }, "engines": { @@ -2071,342 +2084,113 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" }, "node_modules/@commitlint/config-validator": { - "version": "17.6.7", - "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-17.6.7.tgz", - "integrity": "sha512-vJSncmnzwMvpr3lIcm0I8YVVDJTzyjy7NZAeXbTXy+MPUdAr9pKyyg7Tx/ebOQ9kqzE6O9WT6jg2164br5UdsQ==", + "version": "19.0.3", + "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-19.0.3.tgz", + "integrity": "sha512-2D3r4PKjoo59zBc2auodrSCaUnCSALCx54yveOFwwP/i2kfEAQrygwOleFWswLqK0UL/F9r07MFi5ev2ohyM4Q==", "dev": true, "optional": true, "dependencies": { - "@commitlint/types": "^17.4.4", + "@commitlint/types": "^19.0.3", "ajv": "^8.11.0" }, "engines": { - "node": ">=v14" + "node": ">=v18" } }, - "node_modules/@commitlint/config-validator/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "optional": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@commitlint/config-validator/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "optional": true - }, "node_modules/@commitlint/execute-rule": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-17.4.0.tgz", - "integrity": "sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA==", + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-19.0.0.tgz", + "integrity": "sha512-mtsdpY1qyWgAO/iOK0L6gSGeR7GFcdW7tIjcNFxcWkfLDF5qVbPHKuGATFqRMsxcO8OUKNj0+3WOHB7EHm4Jdw==", "dev": true, "optional": true, "engines": { - "node": ">=v14" + "node": ">=v18" } }, "node_modules/@commitlint/load": { - "version": "17.8.0", - "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-17.8.0.tgz", - "integrity": "sha512-9VnGXYJCP4tXmR4YrwP8n5oX6T5ZsHfPQq6WuUQOvAI+QsDQMaTGgTRXr7us+xsjz+b+mMBSagogqfUx2aixyw==", + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-19.2.0.tgz", + "integrity": "sha512-XvxxLJTKqZojCxaBQ7u92qQLFMMZc4+p9qrIq/9kJDy8DOrEa7P1yx7Tjdc2u2JxIalqT4KOGraVgCE7eCYJyQ==", "dev": true, "optional": true, "dependencies": { - "@commitlint/config-validator": "^17.6.7", - "@commitlint/execute-rule": "^17.4.0", - "@commitlint/resolve-extends": "^17.6.7", - "@commitlint/types": "^17.4.4", - "@types/node": "20.5.1", - "chalk": "^4.1.0", - "cosmiconfig": "^8.0.0", - "cosmiconfig-typescript-loader": "^4.0.0", + "@commitlint/config-validator": "^19.0.3", + "@commitlint/execute-rule": "^19.0.0", + "@commitlint/resolve-extends": "^19.1.0", + "@commitlint/types": "^19.0.3", + "chalk": "^5.3.0", + "cosmiconfig": "^9.0.0", + "cosmiconfig-typescript-loader": "^5.0.0", "lodash.isplainobject": "^4.0.6", "lodash.merge": "^4.6.2", - "lodash.uniq": "^4.5.0", - "resolve-from": "^5.0.0", - "ts-node": "^10.8.1", - "typescript": "^4.6.4 || ^5.0.0" + "lodash.uniq": "^4.5.0" }, "engines": { - "node": ">=v14" + "node": ">=v18" } }, - "node_modules/@commitlint/load/node_modules/@types/node": { - "version": "20.5.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.1.tgz", - "integrity": "sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg==", - "dev": true, - "optional": true - }, - "node_modules/@commitlint/load/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "optional": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@commitlint/load/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "optional": true - }, "node_modules/@commitlint/load/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true, "optional": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { - "node": ">=10" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@commitlint/load/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "optional": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@commitlint/load/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "optional": true - }, - "node_modules/@commitlint/load/node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "dev": true, - "optional": true, - "dependencies": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@commitlint/load/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@commitlint/load/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "optional": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@commitlint/load/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, - "optional": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@commitlint/resolve-extends": { - "version": "17.6.7", - "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-17.6.7.tgz", - "integrity": "sha512-PfeoAwLHtbOaC9bGn/FADN156CqkFz6ZKiVDMjuC2N5N0740Ke56rKU7Wxdwya8R8xzLK9vZzHgNbuGhaOVKIg==", + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-19.1.0.tgz", + "integrity": "sha512-z2riI+8G3CET5CPgXJPlzftH+RiWYLMYv4C9tSLdLXdr6pBNimSKukYP9MS27ejmscqCTVA4almdLh0ODD2KYg==", "dev": true, "optional": true, "dependencies": { - "@commitlint/config-validator": "^17.6.7", - "@commitlint/types": "^17.4.4", - "import-fresh": "^3.0.0", + "@commitlint/config-validator": "^19.0.3", + "@commitlint/types": "^19.0.3", + "global-directory": "^4.0.1", + "import-meta-resolve": "^4.0.0", "lodash.mergewith": "^4.6.2", - "resolve-from": "^5.0.0", - "resolve-global": "^1.0.0" + "resolve-from": "^5.0.0" }, "engines": { - "node": ">=v14" + "node": ">=v18" } }, "node_modules/@commitlint/types": { - "version": "17.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-17.4.4.tgz", - "integrity": "sha512-amRN8tRLYOsxRr6mTnGGGvB5EmW/4DDjLMgiwK3CCVEmN6Sr/6xePGEpWaspKkckILuUORCwe6VfDBw6uj4axQ==", + "version": "19.0.3", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-19.0.3.tgz", + "integrity": "sha512-tpyc+7i6bPG9mvaBbtKUeghfyZSDgWquIDfMgqYtTbmZ9Y9VzEm2je9EYcQ0aoz5o7NvGS+rcDec93yO08MHYA==", "dev": true, "optional": true, "dependencies": { - "chalk": "^4.1.0" + "@types/conventional-commits-parser": "^5.0.0", + "chalk": "^5.3.0" }, "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/types/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "optional": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=v18" } }, "node_modules/@commitlint/types/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true, "optional": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { - "node": ">=10" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@commitlint/types/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "optional": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@commitlint/types/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "optional": true - }, - "node_modules/@commitlint/types/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@commitlint/types/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, - "optional": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "optional": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "optional": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, "node_modules/@csstools/normalize.css": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.0.0.tgz", - "integrity": "sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg==" + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.1.1.tgz", + "integrity": "sha512-YAYeJ+Xqh7fUou1d1j9XHl44BmsuThiTr4iNrgCQ3J27IbhXsxXDGZ1cXv8Qvs99d4rBbLiSKy3+WZiet32PcQ==" }, "node_modules/@csstools/postcss-cascade-layers": { "version": "1.1.1", @@ -2691,11 +2475,6 @@ "stylis": "4.2.0" } }, - "node_modules/@emotion/babel-plugin/node_modules/@emotion/memoize": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", - "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" - }, "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", @@ -2720,11 +2499,6 @@ "node": ">=0.10.0" } }, - "node_modules/@emotion/babel-plugin/node_modules/stylis": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", - "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" - }, "node_modules/@emotion/cache": { "version": "11.11.0", "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", @@ -2737,16 +2511,6 @@ "stylis": "4.2.0" } }, - "node_modules/@emotion/cache/node_modules/@emotion/memoize": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", - "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" - }, - "node_modules/@emotion/cache/node_modules/stylis": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", - "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" - }, "node_modules/@emotion/hash": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", @@ -2760,20 +2524,25 @@ "@emotion/memoize": "0.7.4" } }, - "node_modules/@emotion/memoize": { + "node_modules/@emotion/is-prop-valid/node_modules/@emotion/memoize": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" }, + "node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, "node_modules/@emotion/react": { - "version": "11.11.1", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.1.tgz", - "integrity": "sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==", + "version": "11.11.4", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.4.tgz", + "integrity": "sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==", "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.11.0", "@emotion/cache": "^11.11.0", - "@emotion/serialize": "^1.1.2", + "@emotion/serialize": "^1.1.3", "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", "@emotion/utils": "^1.2.1", "@emotion/weak-memoize": "^0.3.1", @@ -2789,9 +2558,9 @@ } }, "node_modules/@emotion/serialize": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz", - "integrity": "sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.4.tgz", + "integrity": "sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==", "dependencies": { "@emotion/hash": "^0.9.1", "@emotion/memoize": "^0.8.1", @@ -2800,25 +2569,15 @@ "csstype": "^3.0.2" } }, - "node_modules/@emotion/serialize/node_modules/@emotion/memoize": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", - "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" - }, - "node_modules/@emotion/serialize/node_modules/@emotion/unitless": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", - "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" - }, "node_modules/@emotion/sheet": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" }, "node_modules/@emotion/unitless": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", - "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" }, "node_modules/@emotion/use-insertion-effect-with-fallbacks": { "version": "1.0.1", @@ -2853,9 +2612,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.9.1.tgz", - "integrity": "sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -2882,46 +2641,25 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "node_modules/@eslint/js": { "version": "8.57.0", @@ -2932,35 +2670,30 @@ } }, "node_modules/@floating-ui/core": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.0.tgz", - "integrity": "sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.2.tgz", + "integrity": "sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==", "dependencies": { - "@floating-ui/utils": "^0.1.3" + "@floating-ui/utils": "^0.2.0" } }, "node_modules/@floating-ui/dom": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.3.tgz", - "integrity": "sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==", + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.5.tgz", + "integrity": "sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==", "dependencies": { "@floating-ui/core": "^1.0.0", "@floating-ui/utils": "^0.2.0" } }, - "node_modules/@floating-ui/dom/node_modules/@floating-ui/utils": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", - "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" - }, "node_modules/@floating-ui/react": { - "version": "0.26.9", - "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.9.tgz", - "integrity": "sha512-p86wynZJVEkEq2BBjY/8p2g3biQ6TlgT4o/3KgFKyTWoJLU1GZ8wpctwRqtkEl2tseYA+kw7dBAIDFcednfI5w==", + "version": "0.26.16", + "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.16.tgz", + "integrity": "sha512-HEf43zxZNAI/E781QIVpYSF3K2VH4TTYZpqecjdsFkjsaU1EbaWcM++kw0HXFffj7gDUcBFevX8s0rQGQpxkow==", "dependencies": { - "@floating-ui/react-dom": "^2.0.8", - "@floating-ui/utils": "^0.2.1", - "tabbable": "^6.0.1" + "@floating-ui/react-dom": "^2.1.0", + "@floating-ui/utils": "^0.2.0", + "tabbable": "^6.0.0" }, "peerDependencies": { "react": ">=16.8.0", @@ -2968,26 +2701,21 @@ } }, "node_modules/@floating-ui/react-dom": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.8.tgz", - "integrity": "sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.0.tgz", + "integrity": "sha512-lNzj5EQmEKn5FFKc04+zasr09h/uX8RtJRNj5gUXsSQIXHVWTVh+hVAg1vOMCexkX8EgvemMvIFpQfkosnVNyA==", "dependencies": { - "@floating-ui/dom": "^1.6.1" + "@floating-ui/dom": "^1.0.0" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, - "node_modules/@floating-ui/react/node_modules/@floating-ui/utils": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", - "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" - }, "node_modules/@floating-ui/utils": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz", - "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==" + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.2.tgz", + "integrity": "sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==" }, "node_modules/@formkit/auto-animate": { "version": "0.8.2", @@ -3020,9 +2748,98 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==" + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", @@ -3039,6 +2856,14 @@ "node": ">=8" } }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -3059,6 +2884,18 @@ "node": ">=8" } }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -3159,11 +2996,6 @@ "node": ">=7.0.0" } }, - "node_modules/@jest/console/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/@jest/console/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -3269,11 +3101,6 @@ "node": ">=7.0.0" } }, - "node_modules/@jest/core/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/@jest/core/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -3419,11 +3246,6 @@ "node": ">=7.0.0" } }, - "node_modules/@jest/reporters/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/@jest/reporters/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -3576,11 +3398,6 @@ "node": ">=7.0.0" } }, - "node_modules/@jest/transform/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/@jest/transform/node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", @@ -3668,11 +3485,6 @@ "node": ">=7.0.0" } }, - "node_modules/@jest/types/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/@jest/types/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -3693,41 +3505,41 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, "node_modules/@jridgewell/sourcemap-codec": { @@ -3736,18 +3548,18 @@ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", - "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==" }, "node_modules/@mapbox/node-pre-gyp": { "version": "1.0.11", @@ -3769,6 +3581,18 @@ "node-pre-gyp": "bin/node-pre-gyp" } }, + "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { "version": "5.1.1-v1", "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", @@ -3845,19 +3669,26 @@ "pako": "^1.0.10" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@pmmmwh/react-refresh-webpack-plugin": { - "version": "0.5.11", - "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.11.tgz", - "integrity": "sha512-7j/6vdTym0+qZ6u4XbSAxrWBGYSdCfTzySkj7WAFgDLmSyWlOrWvpyzxlFh5jtw9dn0oL/jtW+06XfFiisN3JQ==", + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.15.tgz", + "integrity": "sha512-LFWllMA55pzB9D34w/wXUCf8+c+IYKuJDgxiZ3qMhl64KRMBHYM1I3VdGaD2BV5FNPV2/S2596bppxHbv2ZydQ==", "dependencies": { - "ansi-html-community": "^0.0.8", - "common-path-prefix": "^3.0.0", + "ansi-html": "^0.0.9", "core-js-pure": "^3.23.3", "error-stack-parser": "^2.0.6", - "find-up": "^5.0.0", "html-entities": "^2.1.0", "loader-utils": "^2.0.4", - "schema-utils": "^3.0.0", + "schema-utils": "^4.2.0", "source-map": "^0.7.3" }, "engines": { @@ -3869,7 +3700,7 @@ "sockjs-client": "^1.4.0", "type-fest": ">=0.17.0 <5.0.0", "webpack": ">=4.43.0 <6.0.0", - "webpack-dev-server": "3.x || 4.x", + "webpack-dev-server": "3.x || 4.x || 5.x", "webpack-hot-middleware": "2.x", "webpack-plugin-serve": "0.x || 1.x" }, @@ -5347,36 +5178,10 @@ } } }, - "node_modules/@radix-ui/themes/node_modules/classnames": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", - "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" - }, - "node_modules/@radix-ui/themes/node_modules/react-remove-scroll-bar": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz", - "integrity": "sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==", - "dependencies": { - "react-style-singleton": "^2.2.1", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, "node_modules/@react-aria/ssr": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.2.tgz", - "integrity": "sha512-0gKkgDYdnq1w+ey8KzG9l+H5Z821qh9vVjztk55rUg71vTk/Eaebeir+WtzcLLwTjw3m/asIjx8Y59y1lJZhBw==", + "version": "3.9.4", + "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.4.tgz", + "integrity": "sha512-4jmAigVq409qcJvQyuorsmBR4+9r3+JEC60wC+Y0MZV0HCtTmm8D9guYXlJMdx0SSkgj0hHAyFm/HvPNFofCoQ==", "dependencies": { "@swc/helpers": "^0.5.0" }, @@ -5387,6 +5192,14 @@ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, + "node_modules/@react-aria/ssr/node_modules/@swc/helpers": { + "version": "0.5.11", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.11.tgz", + "integrity": "sha512-YNlnKRWF2sVojTpIyzwou9XoTNbzbzONwRhOoniEioF1AtaitTvVZblaQRrAzChWQ1bLYyYSWzM18y4WwgzJ+A==", + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@react-dnd/asap": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/@react-dnd/asap/-/asap-5.0.2.tgz", @@ -5452,11 +5265,6 @@ "yoga-layout": "^2.0.1" } }, - "node_modules/@react-pdf/layout/node_modules/emoji-regex": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", - "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==" - }, "node_modules/@react-pdf/pdfkit": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/@react-pdf/pdfkit/-/pdfkit-3.1.10.tgz", @@ -5523,15 +5331,6 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/@react-pdf/renderer/node_modules/scheduler": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.17.0.tgz", - "integrity": "sha512-7rro8Io3tnCPuY4la/NuI5F2yfESpnfZyT6TtkXnSWVkcu0BCDJ+8gk5ozUaFaxpIyNuWAPXrH0yFcSi28fnDA==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, "node_modules/@react-pdf/stylesheet": { "version": "4.2.5", "resolved": "https://registry.npmjs.org/@react-pdf/stylesheet/-/stylesheet-4.2.5.tgz", @@ -5586,19 +5385,10 @@ } } }, - "node_modules/@reduxjs/toolkit/node_modules/immer": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/immer/-/immer-10.0.3.tgz", - "integrity": "sha512-pwupu3eWfouuaowscykeckFmVTpqbzW+rXFCX8rQLkZzM9ftBmU/++Ra+o+L27mz03zJTlyV4UUr+fdKNffo4A==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/immer" - } - }, "node_modules/@remix-run/router": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.3.tgz", - "integrity": "sha512-Oy8rmScVrVxWZVOpEF57ovlnhpZ8CCPlnIIumVcV9nFdiSIrus99+Lw78ekXyGvVDlIsFJbSfmSovJUhCWYV3w==", + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.16.1.tgz", + "integrity": "sha512-es2g3dq6Nb07iFxGk5GuHN20RwBZOsuDQN7izWIisUcv9r+d2C5jQxqmgkdebXgReWfiyUabcki6Fg77mSNrig==", "engines": { "node": ">=14.0.0" } @@ -5615,9 +5405,9 @@ } }, "node_modules/@restart/ui": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/@restart/ui/-/ui-1.6.8.tgz", - "integrity": "sha512-6ndCv3oZ7r9vuP1Ok9KH55TM1/UkdBnP/fSraW0DFDMbPMzWKhVKeFAIEUCRCSdzayjZDcFYK6xbMlipN9dmMA==", + "version": "1.6.9", + "resolved": "https://registry.npmjs.org/@restart/ui/-/ui-1.6.9.tgz", + "integrity": "sha512-mUbygUsJcRurjZCt1f77gg4DpheD1D+Sc7J3JjAkysUj7t8m4EBJVOqWC9788Qtbc69cJ+HlJc6jBguKwS8Mcw==", "dependencies": { "@babel/runtime": "^7.21.0", "@popperjs/core": "^2.11.6", @@ -5683,6 +5473,22 @@ "rollup": "^1.20.0||^2.0.0" } }, + "node_modules/@rollup/plugin-node-resolve/node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/@rollup/plugin-replace": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", @@ -5725,9 +5531,9 @@ } }, "node_modules/@rushstack/eslint-patch": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.5.1.tgz", - "integrity": "sha512-6i/8UoL0P5y4leBIGzvkZdS85RDMG9y1ihZzmTZQ5LdHUYmZ7pKFoj8X0236s3lusPs1Fa5HTQUpwI+UfTcmeA==" + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.3.tgz", + "integrity": "sha512-qC/xYId4NMebE6w/V33Fh9gWxLgURiNYgVNObbJl2LZv0GUUItCcCqC5axQSwRaAgaxl2mELq1rMzlswaQ0Zxg==" }, "node_modules/@sinclair/typebox": { "version": "0.24.51", @@ -5896,6 +5702,29 @@ "url": "https://github.com/sponsors/gregberge" } }, + "node_modules/@svgr/core/node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@svgr/core/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, "node_modules/@svgr/hast-util-to-babel-ast": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", @@ -5946,6 +5775,29 @@ "url": "https://github.com/sponsors/gregberge" } }, + "node_modules/@svgr/plugin-svgo/node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@svgr/plugin-svgo/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, "node_modules/@svgr/webpack": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", @@ -5969,10 +5821,11 @@ } }, "node_modules/@swc/helpers": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.7.tgz", - "integrity": "sha512-BVvNZhx362+l2tSwSuyEUV4h7+jk9raNdoTSdLfwTshXJSaGmYKluGRJznziCI3KX02Z19DdsQrdfrpXAU3Hfg==", + "version": "0.4.36", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.36.tgz", + "integrity": "sha512-5lxnyLEYFskErRPenYItLRSge5DjrJngYKdVjRSrWfza9G6KkgHEXi0vUZiyUeMU5JfXH1YnvXZzSp8ul88o2Q==", "dependencies": { + "legacy-swc-helpers": "npm:@swc/helpers@=0.4.14", "tslib": "^2.4.0" } }, @@ -5992,34 +5845,10 @@ "node": ">=10.13.0" } }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "optional": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "optional": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "optional": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "optional": true - }, "node_modules/@types/babel__core": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.2.tgz", - "integrity": "sha512-pNpr1T1xLUc2l3xJKuPtsEky3ybxN3m4fJkknfIpTCTfIZCDW57oAg+EfCgIIp2rvCe0Wn++/FfodDS4YXxBwA==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", @@ -6029,96 +5858,106 @@ } }, "node_modules/@types/babel__generator": { - "version": "7.6.5", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.5.tgz", - "integrity": "sha512-h9yIuWbJKdOPLJTbmSpPzkF67e659PbQDba7ifWm5BJ8xTv+sDmS7rFmywkWOvXedGTivCdeGSIIX8WLcRTz8w==", + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", "dependencies": { "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__template": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.2.tgz", - "integrity": "sha512-/AVzPICMhMOMYoSx9MoKpGDKdBRsIXMNByh1PXSZoa+v6ZoLa8xxtsT/uLQ/NJm0XVAWl/BvId4MlDeXJaeIZQ==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__traverse": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.2.tgz", - "integrity": "sha512-ojlGK1Hsfce93J0+kn3H5R73elidKUaZonirN33GSmgTUMpzI/MIFfSpF3haANe3G1bEBS9/9/QEqwTzwqFsKw==", + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", "dependencies": { "@babel/types": "^7.20.7" } }, "node_modules/@types/body-parser": { - "version": "1.19.3", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.3.tgz", - "integrity": "sha512-oyl4jvAfTGX9Bt6Or4H9ni1Z447/tQuxnZsytsCaExKlmJiU8sFgnIBRzJUpKwB5eWn9HuBYlUlVA74q/yN0eQ==", + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", "dependencies": { "@types/connect": "*", "@types/node": "*" } }, "node_modules/@types/bonjour": { - "version": "3.5.11", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.11.tgz", - "integrity": "sha512-isGhjmBtLIxdHBDl2xGwUzEM8AOyOvWsADWq7rqirdi/ZQoHnLWErHvsThcEzTX8juDRiZtzp2Qkv5bgNh6mAg==", + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/connect": { - "version": "3.4.36", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.36.tgz", - "integrity": "sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==", + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/connect-history-api-fallback": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.1.tgz", - "integrity": "sha512-iaQslNbARe8fctL5Lk+DsmgWOM83lM+7FzP0eQUJs1jd3kBE8NWqBTIT2S8SqQOJjxvt2eyIjpOuYeRXq2AdMw==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", "dependencies": { "@types/express-serve-static-core": "*", "@types/node": "*" } }, + "node_modules/@types/conventional-commits-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz", + "integrity": "sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==", + "dev": true, + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/cookie": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==" }, "node_modules/@types/eslint": { - "version": "8.44.4", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.4.tgz", - "integrity": "sha512-lOzjyfY/D9QR4hY9oblZ76B90MYTB3RrQ4z2vBIJKj9ROCRqdkYl2gSUx1x1a4IWPjKJZLL4Aw1Zfay7eMnmnA==", + "version": "8.56.10", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", + "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, "node_modules/@types/eslint-scope": { - "version": "3.7.5", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.5.tgz", - "integrity": "sha512-JNvhIEyxVW6EoMIFIvj93ZOywYFatlpu9deeH6eSx6PE3WHYvHaQtmHmQeNw7aA81bYGBPPQqdtBm6b1SsQMmA==", + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "dependencies": { "@types/eslint": "*", "@types/estree": "*" } }, "node_modules/@types/estree": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.2.tgz", - "integrity": "sha512-VeiPZ9MMwXjO32/Xu7+OwflfmeoRwkE/qzndw42gGtgJwZopBnzy2gD//NN1+go1mADzkDcqf/KnFRSjTJ8xJA==" + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" }, "node_modules/@types/express": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.19.tgz", - "integrity": "sha512-UtOfBtzN9OvpZPPbnnYunfjM7XCI4jyk1NvnFhTVz5krYAnW4o5DCoIekvms+8ApqhB4+9wSge1kBijdfTSmfg==", + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -6127,9 +5966,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.37", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.37.tgz", - "integrity": "sha512-ZohaCYTgGFcOP7u6aJOhY9uIZQgZ2vxC2yWoArY+FeDXlqeH66ZVBjgvg+RLVAS/DWNq4Ap9ZXu1+SUQiiWYMg==", + "version": "4.19.3", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.3.tgz", + "integrity": "sha512-KOzM7MhcBFlmnlr/fzISFF5vGWVSvN6fTd4T+ExOt08bA/dA5kpSzY52nMsI1KDFmUREpJelPYyuslLRSjjgCg==", "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -6138,9 +5977,9 @@ } }, "node_modules/@types/graceful-fs": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.7.tgz", - "integrity": "sha512-MhzcwU8aUygZroVwL2jeYk6JisJrPl/oov/gsgGCue9mkgl9wjGbzReYQClxiUgFDnib9FuHqTndccKeZKxTRw==", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dependencies": { "@types/node": "*" } @@ -6160,43 +5999,43 @@ "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==" }, "node_modules/@types/http-errors": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.2.tgz", - "integrity": "sha512-lPG6KlZs88gef6aD85z3HNkztpj7w2R7HmR3gygjfXCQmsLloWNARFkMuzKiiY8FGdh1XDpgBdrSf4aKDiA7Kg==" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" }, "node_modules/@types/http-proxy": { - "version": "1.17.12", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.12.tgz", - "integrity": "sha512-kQtujO08dVtQ2wXAuSFfk9ASy3sug4+ogFR8Kd8UgP8PEuc1/G/8yjYRmp//PcDNJEUKOza/MrQu15bouEUCiw==", + "version": "1.17.14", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", + "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==" }, "node_modules/@types/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-gPQuzaPR5h/djlAv2apEG1HVOyj1IUs7GpfMZixU0/0KXT3pm64ylHuMUI1/Akh+sq/iikxg6Z2j+fcMDXaaTQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "node_modules/@types/istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-kv43F9eb3Lhj+lr/Hn6OcLCs/sSM8bt+fIaP11rCYngfV6NVjzWXJ17owQtDQTL9tQ8WSLUrGsSJ6rJz0F1w1A==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dependencies": { "@types/istanbul-lib-report": "*" } }, "node_modules/@types/json-schema": { - "version": "7.0.13", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", - "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==" + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" }, "node_modules/@types/json5": { "version": "0.0.29", @@ -6204,22 +6043,30 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" }, "node_modules/@types/mime": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.3.tgz", - "integrity": "sha512-Ys+/St+2VF4+xuY6+kDIXGxbNRO0mesVg0bbxEfB97Od1Vjpjx9KD1qxs64Gcb3CWPirk9Xe+PT4YiiHQ9T+eg==" + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" }, "node_modules/@types/node": { - "version": "20.8.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.4.tgz", - "integrity": "sha512-ZVPnqU58giiCjSxjVUESDtdPk4QR5WQhhINbc9UBrKLU68MX5BF6kbQzTrkwbolyr0X8ChBpXfavr5mZFKZQ5A==", + "version": "20.14.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.0.tgz", + "integrity": "sha512-5cHBxFGJx6L4s56Bubp4fglrEpmyJypsqI6RgzMfBHWUJQGWAAi8cWcgetEbZXHYXo9C2Fa4EEds/uSyS4cxmA==", "dependencies": { - "undici-types": "~5.25.1" + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "dependencies": { + "@types/node": "*" } }, "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" }, "node_modules/@types/prettier": { "version": "2.7.3", @@ -6227,19 +6074,19 @@ "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==" }, "node_modules/@types/prop-types": { - "version": "15.7.8", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.8.tgz", - "integrity": "sha512-kMpQpfZKSCBqltAJwskgePRaYRFukDkm1oItcAbC3gNELR20XIBcN9VRgg4+m8DKsTfkWeA4m4Imp4DDuWy7FQ==" + "version": "15.7.12", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" }, "node_modules/@types/q": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.6.tgz", - "integrity": "sha512-IKjZ8RjTSwD4/YG+2gtj7BPFRB/lNbWKTiSj3M7U/TD2B7HfYCxvp2Zz6xA2WIY7pAuL1QOUPw8gQRbUrrq4fQ==" + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.8.tgz", + "integrity": "sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==" }, "node_modules/@types/qs": { - "version": "6.9.8", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", - "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==" + "version": "6.9.15", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", + "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==" }, "node_modules/@types/quill": { "version": "1.3.10", @@ -6250,17 +6097,16 @@ } }, "node_modules/@types/range-parser": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.5.tgz", - "integrity": "sha512-xrO9OoVPqFuYyR/loIHjnbvvyRZREYKLjxV4+dY6v3FQR3stQ9ZxIGkaclF7YhI9hfjpuTbu14hZEy94qKLtOA==" + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" }, "node_modules/@types/react": { - "version": "18.2.28", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.28.tgz", - "integrity": "sha512-ad4aa/RaaJS3hyGz0BGegdnSRXQBkd1CCYDCdNjBPg90UUpLgo+WlJqb9fMYUxtehmzF3PJaTWqRZjko6BRzBg==", + "version": "18.3.3", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", + "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", "dependencies": { "@types/prop-types": "*", - "@types/scheduler": "*", "csstype": "^3.0.2" } }, @@ -6273,9 +6119,9 @@ } }, "node_modules/@types/react-transition-group": { - "version": "4.4.7", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.7.tgz", - "integrity": "sha512-ICCyBl5mvyqYp8Qeq9B5G/fyBSRC0zx3XM3sCC6KkcMsNeAHqXBKkmat4GqdJET5jtYUpZXrxI5flve5qhi2Eg==", + "version": "4.4.10", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz", + "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==", "dependencies": { "@types/react": "*" } @@ -6293,60 +6139,55 @@ "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" }, - "node_modules/@types/scheduler": { - "version": "0.16.4", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.4.tgz", - "integrity": "sha512-2L9ifAGl7wmXwP4v3pN4p2FLhD0O1qsJpvKmNin5VA8+UvNVb447UDaAEV6UdrkA+m/Xs58U1RFps44x6TFsVQ==" - }, "node_modules/@types/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==" + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==" }, "node_modules/@types/send": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.2.tgz", - "integrity": "sha512-aAG6yRf6r0wQ29bkS+x97BIs64ZLxeE/ARwyS6wrldMm3C1MdKwCcnnEwMC1slI8wuxJOpiUH9MioC0A0i+GJw==", + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", "dependencies": { "@types/mime": "^1", "@types/node": "*" } }, "node_modules/@types/serve-index": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.2.tgz", - "integrity": "sha512-asaEIoc6J+DbBKXtO7p2shWUpKacZOoMBEGBgPG91P8xhO53ohzHWGCs4ScZo5pQMf5ukQzVT9fhX1WzpHihig==", + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", "dependencies": { "@types/express": "*" } }, "node_modules/@types/serve-static": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.3.tgz", - "integrity": "sha512-yVRvFsEMrv7s0lGhzrggJjNOSmZCdgCjw9xWrPr/kNNLp6FaDfMC1KaYl3TSJ0c58bECwNBMoQrZJ8hA8E1eFg==", + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", "dependencies": { "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" + "@types/node": "*", + "@types/send": "*" } }, "node_modules/@types/sockjs": { - "version": "0.3.34", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.34.tgz", - "integrity": "sha512-R+n7qBFnm/6jinlteC9DBL5dGiDGjWAvjo4viUanpnc/dG1y7uDoacXPIQ/PQEg1fI912SMHIa014ZjRpvDw4g==", + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==" }, "node_modules/@types/trusted-types": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.4.tgz", - "integrity": "sha512-IDaobHimLQhjwsQ/NMwRVfa/yL7L/wriQPMhw1ZJall0KX6E1oxk29XMDeilW5qTIg5aoiqf5Udy8U/51aNoQQ==" + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==" }, "node_modules/@types/use-sync-external-store": { "version": "0.0.3", @@ -6359,25 +6200,25 @@ "integrity": "sha512-D1XC7WK8K+zZEveUPY+cf4+kgauk8N4eHr/XIHXGlGYkHLud6hK9lYfZk1ry1TNh798cZUCgb6MqGEG8DkJt6Q==" }, "node_modules/@types/ws": { - "version": "8.5.7", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.7.tgz", - "integrity": "sha512-6UrLjiDUvn40CMrAubXuIVtj2PEfKDffJS7ychvnPU44j+KVeXmdHHTgqcM/dxLUTHxlXHiFM8Skmb8ozGdTnQ==", + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/yargs": { - "version": "16.0.6", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.6.tgz", - "integrity": "sha512-oTP7/Q13GSPrgcwEwdlnkoZSQ1Hg9THe644qq8PG6hhJzjZ3qj1JjEFPIwWV/IXVs5XGIVqtkNOS9kh63WIJ+A==", + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { - "version": "21.0.1", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.1.tgz", - "integrity": "sha512-axdPBuLuEJt0c4yI5OZssC19K2Mq1uKdrfZBzuxLvaztgqUtFYZUNw7lETExPYJR9jdEoIg4mb7RQKRQzOkeGQ==" + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "5.62.0", @@ -6412,6 +6253,17 @@ } } }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@typescript-eslint/experimental-utils": { "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz", @@ -6536,6 +6388,17 @@ } } }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@typescript-eslint/utils": { "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", @@ -6581,6 +6444,17 @@ "node": ">=4.0" } }, + "node_modules/@typescript-eslint/utils/node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@typescript-eslint/visitor-keys": { "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", @@ -6603,9 +6477,9 @@ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -6622,9 +6496,9 @@ "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==" + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==" }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.11.6", @@ -6642,14 +6516,14 @@ "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" + "@webassemblyjs/wasm-gen": "1.12.1" } }, "node_modules/@webassemblyjs/ieee754": { @@ -6674,26 +6548,26 @@ "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", "@webassemblyjs/ieee754": "1.11.6", "@webassemblyjs/leb128": "1.11.6", @@ -6701,22 +6575,22 @@ } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-api-error": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", "@webassemblyjs/ieee754": "1.11.6", @@ -6725,11 +6599,11 @@ } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@xtuc/long": "4.2.2" } }, @@ -6751,7 +6625,8 @@ "node_modules/abab": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==" + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead" }, "node_modules/abbrev": { "version": "1.1.1", @@ -6777,9 +6652,9 @@ } }, "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "bin": { "acorn": "bin/acorn" }, @@ -6863,14 +6738,14 @@ } }, "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.14.0.tgz", + "integrity": "sha512-oYs1UUtO97ZO2lJ4bwnWeQW8/zvOIQLGKcvPTsWmvc2SYgBb+upuNS5NxoLaMU4h8Ju3Nbj6Cq8mD2LQoqVKFA==", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "fast-deep-equal": "^3.1.3", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -6893,32 +6768,15 @@ } } }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, "peerDependencies": { - "ajv": "^6.9.1" + "ajv": "^8.8.2" } }, "node_modules/ansi-align": { @@ -6943,6 +6801,28 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.9.tgz", + "integrity": "sha512-ozbS3LuenHVxNRh/wdnN16QapUHzauqSomAl1jwwJRRsGwFwtj644lIhxfWu0Fy0acCij2+AEgHvjscq3dlVXg==", + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, "node_modules/ansi-html-community": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", @@ -7019,6 +6899,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "deprecated": "This package is no longer supported.", "optional": true, "dependencies": { "delegates": "^1.0.0", @@ -7034,17 +6915,14 @@ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" }, "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" - } + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/aria-hidden": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.3.tgz", - "integrity": "sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz", + "integrity": "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==", "dependencies": { "tslib": "^2.0.0" }, @@ -7076,19 +6954,20 @@ } }, "node_modules/array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, "node_modules/array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", "is-string": "^1.0.7" }, "engines": { @@ -7107,14 +6986,15 @@ } }, "node_modules/array.prototype.findlast": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.4.tgz", - "integrity": "sha512-BMtLxpV+8BD+6ZPFIWmnUBpQoy+A+ujcg4rhp2iwCRJYA7PEh2MS4NL3lz8EiDlLrJPp2hg9qWihr5pd//jcGw==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", "dependencies": { - "call-bind": "^1.0.5", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", + "es-abstract": "^1.23.2", "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", "es-shim-unscopables": "^1.0.2" }, "engines": { @@ -7125,15 +7005,16 @@ } }, "node_modules/array.prototype.findlastindex": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", - "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -7177,14 +7058,16 @@ } }, "node_modules/array.prototype.reduce": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.6.tgz", - "integrity": "sha512-UW+Mz8LG/sPSU8jRDCjVr6J/ZKAGpHfwrZ6kWTG5qCxIEiXdVshqGnu5vEZA8S1y6X4aCSbQZ0/EEsfvEvBiSg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.7.tgz", + "integrity": "sha512-mzmiUCVwtiD4lgxYP8g7IYy8El8p2CSMePvIbTS7gchKir/L1fgJrk0yDKmAX6mnRQFKNADYIk8nNlTris5H1Q==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", "es-array-method-boxes-properly": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", "is-string": "^1.0.7" }, "engines": { @@ -7206,15 +7089,18 @@ } }, "node_modules/array.prototype.tosorted": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", - "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", "dependencies": { - "call-bind": "^1.0.5", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.1.0", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/arraybuffer.prototype.slice": { @@ -7244,14 +7130,14 @@ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" }, "node_modules/ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==" + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==" }, "node_modules/async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" }, "node_modules/asynckit": { "version": "0.4.0", @@ -7317,9 +7203,9 @@ } }, "node_modules/axe-core": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.8.2.tgz", - "integrity": "sha512-/dlp0fxyM3R8YW7MFzaHWXrf4zzbr0vaYb23VBFCl83R7nWNPg/yaQw2Dc8jzCMmDVLhSdzH8MjrsuIUuvX+6g==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", + "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==", "engines": { "node": ">=4" } @@ -7334,19 +7220,6 @@ "proxy-from-env": "^1.1.0" } }, - "node_modules/axios/node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/axobject-query": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", @@ -7416,11 +7289,6 @@ "node": ">=7.0.0" } }, - "node_modules/babel-jest/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/babel-jest/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -7458,6 +7326,34 @@ "webpack": ">=2" } }, + "node_modules/babel-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/babel-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/babel-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, "node_modules/babel-loader/node_modules/schema-utils": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", @@ -7518,6 +7414,45 @@ "npm": ">=6" } }, + "node_modules/babel-plugin-macros/node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/babel-plugin-macros/node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/babel-plugin-macros/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, "node_modules/babel-plugin-named-asset-import": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz", @@ -7527,44 +7462,36 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz", - "integrity": "sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==", + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", + "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.4.2", + "@babel/helper-define-polyfill-provider": "^0.6.2", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.4.tgz", - "integrity": "sha512-9l//BZZsPR+5XjyJMPtZSK4jv0BsTO1zDac2GC6ygx9WLGlcsnRd1Co0B2zT5fF5Ic6BZy+9m3HNZ3QcOeDKfg==", + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz", + "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.2", - "core-js-compat": "^3.32.2" + "@babel/helper-define-polyfill-provider": "^0.6.1", + "core-js-compat": "^3.36.1" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz", - "integrity": "sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", + "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.2" + "@babel/helper-define-polyfill-provider": "^0.6.2" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -7711,11 +7638,14 @@ } }, "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/bl": { @@ -7773,29 +7703,16 @@ "ms": "2.0.0" } }, - "node_modules/body-parser/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/bonjour-service": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", - "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", + "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", "dependencies": { - "array-flatten": "^2.1.2", - "dns-equal": "^1.0.0", "fast-deep-equal": "^3.1.3", "multicast-dns": "^7.2.5" } @@ -7870,6 +7787,11 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/boxen/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, "node_modules/boxen/node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", @@ -8138,9 +8060,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001616", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001616.tgz", - "integrity": "sha512-RHVYKov7IcdNjVHJFNY/78RdG4oGVjbayxv8u5IO74Wv7Hlq4PnJE6mo/OjFijjVFNy5ijnCt6H3IIo4t+wfEw==", + "version": "1.0.30001627", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001627.tgz", + "integrity": "sha512-4zgNiB8nTyV/tHhwZrFs88ryjls/lHiqFhrxCW4qSTeuRByBVnPYpDInchOIySWknznucaf31Z4KYqjfbrecVw==", "funding": [ { "type": "opencollective", @@ -8246,11 +8168,6 @@ "node": ">=7.0.0" } }, - "node_modules/chalk-template/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/chalk-template/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -8290,15 +8207,9 @@ "integrity": "sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==" }, "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -8311,6 +8222,9 @@ "engines": { "node": ">= 8.10.0" }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, "optionalDependencies": { "fsevents": "~2.3.2" } @@ -8336,9 +8250,9 @@ } }, "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", "engines": { "node": ">=6.0" } @@ -8358,19 +8272,19 @@ } }, "node_modules/cjs-module-lexer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==" + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz", + "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==" }, "node_modules/classnames": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz", - "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==" + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" }, "node_modules/clean-css": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz", - "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", "dependencies": { "source-map": "~0.6.0" }, @@ -8410,9 +8324,9 @@ } }, "node_modules/cli-spinners": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.1.tgz", - "integrity": "sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "dev": true, "engines": { "node": ">=6" @@ -8449,12 +8363,6 @@ "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/cli-truncate/node_modules/emoji-regex": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", - "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", - "dev": true - }, "node_modules/cli-truncate/node_modules/string-width": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz", @@ -8512,6 +8420,104 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/clipboardy/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/clipboardy/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clipboardy/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/clipboardy/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clipboardy/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/clipboardy/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/clipboardy/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clipboardy/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/clipboardy/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "engines": { + "node": ">=6" + } + }, "node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -8523,18 +8529,17 @@ } }, "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", "engines": { "node": ">=0.8" } }, "node_modules/clsx": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", - "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", "engines": { "node": ">=6" } @@ -8583,11 +8588,16 @@ "color-name": "1.1.3" } }, - "node_modules/color-name": { + "node_modules/color-convert/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, "node_modules/color-string": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", @@ -8628,11 +8638,12 @@ } }, "node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "dev": true, "engines": { - "node": ">= 12" + "node": ">=18" } }, "node_modules/commitizen": { @@ -8665,35 +8676,6 @@ "node": ">= 12" } }, - "node_modules/commitizen/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/commitizen/node_modules/minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==" - }, "node_modules/common-tags": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", @@ -8778,12 +8760,9 @@ "optional": true }, "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "5.2.1" - }, + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", "engines": { "node": ">= 0.6" } @@ -8829,11 +8808,11 @@ "hasInstallScript": true }, "node_modules/core-js-compat": { - "version": "3.33.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.0.tgz", - "integrity": "sha512-0w4LcLXsVEuNkIqwjjf9rjCoPhK8uqA4tMRh4Ge26vfLtUutshn+aRJU21I9LCJlh2QQHfisNToLjw1XEJLTWw==", + "version": "3.37.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz", + "integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==", "dependencies": { - "browserslist": "^4.22.1" + "browserslist": "^4.23.0" }, "funding": { "type": "opencollective", @@ -8841,9 +8820,9 @@ } }, "node_modules/core-js-pure": { - "version": "3.33.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.33.0.tgz", - "integrity": "sha512-FKSIDtJnds/YFIEaZ4HszRX7hkxGpNKM7FC9aJ9WLJbSd3lD4vOltFuVIBLR8asSx9frkTSqL0dw90SKQxgKrg==", + "version": "3.37.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.37.1.tgz", + "integrity": "sha512-J/r5JTHSmzTxbiYYrzXg9w1VpqrYt+gexenBE9pugeyhwPZTAEJddyiReJWsLO6uNQ8xJZFbod6XC7KKwatCiA==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -8856,42 +8835,50 @@ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "optional": true, "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" }, "engines": { - "node": ">=10" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/cosmiconfig-typescript-loader": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.4.0.tgz", - "integrity": "sha512-BabizFdC3wBHhbI4kJh0VkQP9GkBfoHPydD0COMce1nJ1kJAB3F2TmJ/I7diULBKtmEWSwEbuN/KDtgnmUUVmw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-5.0.0.tgz", + "integrity": "sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==", "dev": true, "optional": true, + "dependencies": { + "jiti": "^1.19.1" + }, "engines": { - "node": ">=v14.21.3" + "node": ">=v16" }, "peerDependencies": { "@types/node": "*", - "cosmiconfig": ">=7", - "ts-node": ">=10", + "cosmiconfig": ">=8.2", "typescript": ">=4" } }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "optional": true - }, "node_modules/cross-fetch": { "version": "3.1.8", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", @@ -8979,31 +8966,6 @@ "postcss": "^8.4" } }, - "node_modules/css-loader": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz", - "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==", - "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.21", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.3", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, "node_modules/css-minimizer-webpack-plugin": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz", @@ -9041,55 +9003,6 @@ } } }, - "node_modules/css-minimizer-webpack-plugin/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/css-minimizer-webpack-plugin/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -9113,18 +9026,14 @@ } }, "node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", "dependencies": { "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" } }, "node_modules/css-select-base-adapter": { @@ -9168,9 +9077,9 @@ } }, "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", "engines": { "node": ">= 6" }, @@ -9179,9 +9088,9 @@ } }, "node_modules/cssdb": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.8.0.tgz", - "integrity": "sha512-SkeezZOQr5AHt9MgJgSFNyiuJwg1p8AwoVln6JwaQJsyxduRW9QJ+HP/gAQzbsz8SIqINtYvpJKjxTRI67zxLg==", + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.11.2.tgz", + "integrity": "sha512-lhQ32TFkc1X4eTefGfYPvgovRSzIMofHkigfH8nWtyRL4XJLsRhJFreRvEgKzept7x1rjBuy3J/MurXLaFxW/A==", "funding": [ { "type": "opencollective", @@ -9277,6 +9186,22 @@ "postcss": "^8.2.15" } }, + "node_modules/cssnano/node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/cssnano/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, "node_modules/csso": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", @@ -9335,9 +9260,9 @@ "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" }, "node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, "node_modules/cz-conventional-changelog": { "version": "3.3.0", @@ -9377,6 +9302,38 @@ "node": ">=10" } }, + "node_modules/data-urls/node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/data-urls/node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/data-view-buffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", @@ -9426,18 +9383,18 @@ } }, "node_modules/date-fns": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.3.1.tgz", - "integrity": "sha512-y8e109LYGgoQDveiEBD3DYXKba1jWf5BA8YU1FL5Tvm0BTdEfy54WLCwnuYWZNnzzvALy/QQ4Hov+Q9RVRv+Zw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", + "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", "funding": { "type": "github", "url": "https://github.com/sponsors/kossnocorp" } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", "dependencies": { "ms": "2.1.2" }, @@ -9523,6 +9480,104 @@ "node": ">= 10" } }, + "node_modules/default-gateway/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/default-gateway/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-gateway/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/default-gateway/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-gateway/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/default-gateway/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/default-gateway/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-gateway/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/default-gateway/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "engines": { + "node": ">=6" + } + }, "node_modules/defaults": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", @@ -9535,6 +9590,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/defaults/node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", @@ -9633,9 +9697,9 @@ } }, "node_modules/detect-libc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", - "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", "optional": true, "engines": { "node": ">=8" @@ -9698,15 +9762,6 @@ "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "optional": true, - "engines": { - "node": ">=0.3.1" - } - }, "node_modules/diff-sequences": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", @@ -9761,11 +9816,6 @@ "dnd-core": "^16.0.1" } }, - "node_modules/dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==" - }, "node_modules/dns-packet": { "version": "5.6.1", "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", @@ -9806,19 +9856,15 @@ } }, "node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", "dependencies": { "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, - "node_modules/domelementtype": { + "node_modules/dom-serializer/node_modules/domelementtype": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", @@ -9829,10 +9875,16 @@ } ] }, + "node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, "node_modules/domexception": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "deprecated": "Use your platform's native DOMException instead", "dependencies": { "webidl-conversions": "^5.0.0" }, @@ -9862,17 +9914,24 @@ "url": "https://github.com/fb55/domhandler?sponsor=1" } }, + "node_modules/domhandler/node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" + "dom-serializer": "0", + "domelementtype": "1" } }, "node_modules/dot-case": { @@ -9927,9 +9986,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.690", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.690.tgz", - "integrity": "sha512-+2OAGjUx68xElQhydpcbqH50hE8Vs2K6TkAeLhICYfndb67CVH0UsZaijmRUE3rHlIxU1u0jxwhgVe6fK3YANA==" + "version": "1.4.788", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.788.tgz", + "integrity": "sha512-ubp5+Ev/VV8KuRoWnfP2QF2Bg+O2ZFdb49DiiNbz2VmgkIqrnyYaqIOqj8A6K/3p1xV0QcU5hBQ1+BmB6ot1OA==" }, "node_modules/emittery": { "version": "0.8.1", @@ -9943,9 +10002,9 @@ } }, "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==" }, "node_modules/emojis-list": { "version": "3.0.0", @@ -9973,9 +10032,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "version": "5.16.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.1.tgz", + "integrity": "sha512-4U5pNsuDl0EhuZpq46M5xPslstkviJuhrdobaRDBk2Jy2KO37FDAJl4lb2KlNabxT0m4MTK2UHNrsAcphE8nyw==", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -9992,6 +10051,16 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "optional": true, + "engines": { + "node": ">=6" + } + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -10009,9 +10078,9 @@ } }, "node_modules/es-abstract": { - "version": "1.23.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.2.tgz", - "integrity": "sha512-60s3Xv2T2p1ICykc7c+DNDPLDMm9t4QxCOUU0K9JxiLjM3C1zB9YVdN7tjxrFd4+AkZ8CdX1ovUga4P2+1e+/w==", + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", "dependencies": { "array-buffer-byte-length": "^1.0.1", "arraybuffer.prototype.slice": "^1.0.3", @@ -10052,11 +10121,11 @@ "safe-regex-test": "^1.0.3", "string.prototype.trim": "^1.2.9", "string.prototype.trimend": "^1.0.8", - "string.prototype.trimstart": "^1.0.7", + "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.2", "typed-array-byte-length": "^1.0.1", "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.5", + "typed-array-length": "^1.0.6", "unbox-primitive": "^1.0.2", "which-typed-array": "^1.1.15" }, @@ -10092,13 +10161,13 @@ } }, "node_modules/es-iterator-helpers": { - "version": "1.0.18", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.18.tgz", - "integrity": "sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==", + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", + "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", + "es-abstract": "^1.23.3", "es-errors": "^1.3.0", "es-set-tostringtag": "^2.0.3", "function-bind": "^1.1.2", @@ -10116,9 +10185,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz", - "integrity": "sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==" + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.3.tgz", + "integrity": "sha512-i1gCgmR9dCl6Vil6UKPI/trA69s08g/syhiDK9TG0Nf1RJjjFI+AzoWW7sPufzkgYAn861skuCwJa0pIIHYxvg==" }, "node_modules/es-object-atoms": { "version": "1.0.0", @@ -10169,9 +10238,9 @@ } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "engines": { "node": ">=6" } @@ -10317,10 +10386,26 @@ "ms": "^2.1.1" } }, + "node_modules/eslint-import-resolver-node/node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", "dependencies": { "debug": "^3.2.7" }, @@ -10359,27 +10444,27 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.28.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz", - "integrity": "sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==", + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.findlastindex": "^1.2.2", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", + "eslint-import-resolver-node": "^0.3.9", "eslint-module-utils": "^2.8.0", - "has": "^1.0.3", - "is-core-module": "^2.13.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.fromentries": "^2.0.6", - "object.groupby": "^1.0.0", - "object.values": "^1.1.6", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", "semver": "^6.3.1", - "tsconfig-paths": "^3.14.2" + "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" @@ -10407,14 +10492,6 @@ "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/eslint-plugin-jest": { "version": "25.7.0", "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz", @@ -10439,26 +10516,26 @@ } }, "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", - "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", + "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==", "dependencies": { - "@babel/runtime": "^7.20.7", - "aria-query": "^5.1.3", - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "ast-types-flow": "^0.0.7", - "axe-core": "^4.6.2", - "axobject-query": "^3.1.1", + "@babel/runtime": "^7.23.2", + "aria-query": "^5.3.0", + "array-includes": "^3.1.7", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "=4.7.0", + "axobject-query": "^3.2.1", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", - "has": "^1.0.3", - "jsx-ast-utils": "^3.3.3", - "language-tags": "=1.0.5", + "es-iterator-helpers": "^1.0.15", + "hasown": "^2.0.0", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "semver": "^6.3.0" + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7" }, "engines": { "node": ">=4.0" @@ -10467,13 +10544,10 @@ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } + "node_modules/eslint-plugin-jsx-a11y/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" }, "node_modules/eslint-plugin-prettier": { "version": "4.2.1", @@ -10497,28 +10571,28 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.34.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz", - "integrity": "sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==", + "version": "7.34.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.2.tgz", + "integrity": "sha512-2HCmrU+/JNigDN6tg55cRDKCQWicYAPB38JGSFDQt95jDm8rrvSUo7YPkOIm5l6ts1j1zCvysNcasvfTMQzUOw==", "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlast": "^1.2.4", + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", "array.prototype.flatmap": "^1.3.2", "array.prototype.toreversed": "^1.1.2", "array.prototype.tosorted": "^1.1.3", "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.17", + "es-iterator-helpers": "^1.0.19", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", - "object.entries": "^1.1.7", - "object.fromentries": "^2.0.7", - "object.hasown": "^1.1.3", - "object.values": "^1.1.7", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.hasown": "^1.1.4", + "object.values": "^1.2.0", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.5", "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.10" + "string.prototype.matchall": "^4.0.11" }, "engines": { "node": ">=4" @@ -10528,9 +10602,9 @@ } }, "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", "engines": { "node": ">=10" }, @@ -10549,30 +10623,6 @@ "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/eslint-plugin-testing-library": { "version": "5.11.1", "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.1.tgz", @@ -10637,32 +10687,6 @@ "webpack": "^5.0.0" } }, - "node_modules/eslint-webpack-plugin/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/eslint-webpack-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, "node_modules/eslint-webpack-plugin/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -10684,29 +10708,6 @@ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "node_modules/eslint-webpack-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/eslint-webpack-plugin/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/eslint-webpack-plugin/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -10721,6 +10722,21 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/eslint/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -10735,11 +10751,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/eslint/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, "node_modules/eslint/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -10766,11 +10777,6 @@ "node": ">=7.0.0" } }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/eslint/node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -10782,20 +10788,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eslint/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -10804,16 +10796,10 @@ "node": ">=8" } }, - "node_modules/eslint/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "node_modules/eslint/node_modules/supports-color": { "version": "7.2.0", @@ -10826,17 +10812,6 @@ "node": ">=8" } }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/espree": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", @@ -10917,9 +10892,10 @@ } }, "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true }, "node_modules/events": { "version": "3.3.0", @@ -10930,22 +10906,23 @@ } }, "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, "dependencies": { "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" }, "engines": { - "node": ">=10" + "node": ">=16.17" }, "funding": { "url": "https://github.com/sindresorhus/execa?sponsor=1" @@ -11031,10 +11008,16 @@ "node": ">= 0.10.0" } }, - "node_modules/express/node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + "node_modules/express/node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } }, "node_modules/express/node_modules/debug": { "version": "2.6.9", @@ -11049,6 +11032,19 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/express/node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/express/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -11068,18 +11064,6 @@ "node": ">=4" } }, - "node_modules/external-editor/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -11092,9 +11076,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -11135,15 +11119,10 @@ "punycode": "^1.3.2" } }, - "node_modules/fast-url-parser/node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" - }, "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dependencies": { "reusify": "^1.0.4" } @@ -11212,6 +11191,51 @@ "webpack": "^4.0.0 || ^5.0.0" } }, + "node_modules/file-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/file-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/file-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/file-saver": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz", @@ -11355,22 +11379,22 @@ } }, "node_modules/flat-cache": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", - "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", "rimraf": "^3.0.2" }, "engines": { - "node": ">=12.0.0" + "node": "^10.12.0 || >=12.0.0" } }, "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==" + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==" }, "node_modules/focus-lock": { "version": "1.3.5", @@ -11423,23 +11447,6 @@ "unicode-trie": "^2.0.0" } }, - "node_modules/fontkit/node_modules/@swc/helpers": { - "version": "0.4.36", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.36.tgz", - "integrity": "sha512-5lxnyLEYFskErRPenYItLRSge5DjrJngYKdVjRSrWfza9G6KkgHEXi0vUZiyUeMU5JfXH1YnvXZzSp8ul88o2Q==", - "dependencies": { - "legacy-swc-helpers": "npm:@swc/helpers@=0.4.14", - "tslib": "^2.4.0" - } - }, - "node_modules/fontkit/node_modules/clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", - "engines": { - "node": ">=0.8" - } - }, "node_modules/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", @@ -11448,6 +11455,21 @@ "is-callable": "^1.1.3" } }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "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", @@ -11486,6 +11508,29 @@ } } }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -11526,11 +11571,6 @@ "node": ">=7.0.0" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", @@ -11546,20 +11586,6 @@ "node": ">=8" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -11568,6 +11594,11 @@ "node": ">=8" } }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", @@ -11585,6 +11616,17 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -11604,10 +11646,18 @@ "node": ">=6" } }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, "node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -11646,16 +11696,17 @@ } }, "node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dependencies": { + "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" }, "engines": { - "node": ">=12" + "node": ">=10" } }, "node_modules/fs-minipass": { @@ -11689,9 +11740,9 @@ "optional": true }, "node_modules/fs-monkey": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", - "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", + "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==" }, "node_modules/fs.realpath": { "version": "1.0.0", @@ -11748,6 +11799,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "deprecated": "This package is no longer supported.", "optional": true, "dependencies": { "aproba": "^1.0.3 || ^2.0.0", @@ -11764,6 +11816,12 @@ "node": ">=10" } }, + "node_modules/gauge/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "optional": true + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -11832,11 +11890,12 @@ } }, "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, "engines": { - "node": ">=10" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -11862,6 +11921,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -11893,17 +11953,20 @@ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" }, - "node_modules/global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", + "node_modules/global-directory": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", + "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", "dev": true, "optional": true, "dependencies": { - "ini": "^1.3.4" + "ini": "4.1.1" }, "engines": { - "node": ">=4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/global-modules": { @@ -11930,6 +11993,11 @@ "node": ">=6" } }, + "node_modules/global-prefix/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, "node_modules/global-prefix/node_modules/which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -11942,19 +12010,26 @@ } }, "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dependencies": { + "type-fest": "^0.20.2" + }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dependencies": { - "define-properties": "^1.1.3" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -12027,14 +12102,6 @@ "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==" }, - "node_modules/has": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", - "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -12224,9 +12291,9 @@ } }, "node_modules/html-entities": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", - "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", + "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", "funding": [ { "type": "github", @@ -12263,26 +12330,12 @@ "node": ">=12" } }, - "node_modules/html-webpack-plugin": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.3.tgz", - "integrity": "sha512-6YrDKTuqaP/TquFH7h4srYWsZx+x6k6+FbsTm0ziCwGHDP78Unr1r9F/H4+sGmMbX08GQcJ+K64x55b+7VM/jg==", - "dependencies": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/html-webpack-plugin" - }, - "peerDependencies": { - "webpack": "^5.20.0" + "node": ">= 12" } }, "node_modules/htmlparser2": { @@ -12303,6 +12356,43 @@ "entities": "^2.0.0" } }, + "node_modules/htmlparser2/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/htmlparser2/node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/htmlparser2/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, "node_modules/http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", @@ -12377,6 +12467,11 @@ } } }, + "node_modules/http-proxy/node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, "node_modules/https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", @@ -12390,11 +12485,12 @@ } }, "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, "engines": { - "node": ">=10.17.0" + "node": ">=16.17.0" } }, "node_modules/hyphen": { @@ -12403,11 +12499,11 @@ "integrity": "sha512-SejXzIpv9gOVdDWXd4suM1fdF1k2dxZGvuTdkOVLoazYfK7O4DykIQbdrvuyG+EaTNlXAGhMndtKrhykgbt0gg==" }, "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "safer-buffer": ">= 2.1.2 < 3" }, "engines": { "node": ">=0.10.0" @@ -12474,9 +12570,9 @@ } }, "node_modules/immer": { - "version": "9.0.21", - "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", - "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/immer/-/immer-10.1.1.tgz", + "integrity": "sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==", "funding": { "type": "opencollective", "url": "https://opencollective.com/immer" @@ -12523,6 +12619,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/import-meta-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", + "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", + "dev": true, + "optional": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -12535,6 +12642,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -12546,9 +12654,14 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", + "dev": true, + "optional": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } }, "node_modules/inquirer": { "version": "8.2.5", @@ -12619,12 +12732,6 @@ "node": ">=7.0.0" } }, - "node_modules/inquirer/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/inquirer/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -12668,9 +12775,9 @@ } }, "node_modules/ipaddr.js": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", - "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", "engines": { "node": ">= 10" } @@ -12773,11 +12880,11 @@ } }, "node_modules/is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -12845,11 +12952,15 @@ } }, "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-generator-fn": { @@ -13043,11 +13154,12 @@ } }, "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -13196,9 +13308,9 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "engines": { "node": ">=8" } @@ -13218,14 +13330,6 @@ "node": ">=8" } }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/istanbul-lib-report": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", @@ -13261,6 +13365,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/istanbul-lib-report/node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/istanbul-lib-report/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -13294,9 +13409,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -13318,9 +13433,9 @@ } }, "node_modules/its-fine": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/its-fine/-/its-fine-1.1.1.tgz", - "integrity": "sha512-v1Ia1xl20KbuSGlwoaGsW0oxsw8Be+TrXweidxD9oT/1lAh6O3K3/GIM95Tt6WCiv6W+h2M7RB1TwdoAjQyyKw==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/its-fine/-/its-fine-1.2.5.tgz", + "integrity": "sha512-fXtDA0X0t0eBYAGLVM5YsgJGsJ5jEmqZEPrGbzdf5awjv0xE7nqv3TVnvtUF060Tkes15DbDAKW/I48vsb6SyA==", "dependencies": { "@types/react-reconciler": "^0.28.0" }, @@ -13328,10 +13443,27 @@ "react": ">=18.0" } }, + "node_modules/jackspeak": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.1.2.tgz", + "integrity": "sha512-kWmLKn2tRtfYMF/BakihVVRzBKOxz4gJMiL2Rj91WnAB5TPZumSH99R/Yf1qE1u4uRimvCSJfm6hnxohXeEXjQ==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jake": { - "version": "10.8.7", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", - "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.1.tgz", + "integrity": "sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==", "dependencies": { "async": "^3.2.3", "chalk": "^4.0.2", @@ -13385,11 +13517,6 @@ "node": ">=7.0.0" } }, - "node_modules/jake/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/jake/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -13454,6 +13581,104 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/jest-changed-files/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/jest-changed-files/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-changed-files/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/jest-changed-files/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-changed-files/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-changed-files/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-changed-files/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-changed-files/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/jest-changed-files/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "engines": { + "node": ">=6" + } + }, "node_modules/jest-circus": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", @@ -13523,11 +13748,6 @@ "node": ">=7.0.0" } }, - "node_modules/jest-circus/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/jest-circus/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -13620,11 +13840,6 @@ "node": ">=7.0.0" } }, - "node_modules/jest-cli/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/jest-cli/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -13726,11 +13941,6 @@ "node": ">=7.0.0" } }, - "node_modules/jest-config/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/jest-config/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -13804,11 +14014,6 @@ "node": ">=7.0.0" } }, - "node_modules/jest-diff/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/jest-diff/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -13894,11 +14099,6 @@ "node": ">=7.0.0" } }, - "node_modules/jest-each/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/jest-each/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -14051,11 +14251,6 @@ "node": ">=7.0.0" } }, - "node_modules/jest-jasmine2/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/jest-jasmine2/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -14141,11 +14336,6 @@ "node": ">=7.0.0" } }, - "node_modules/jest-matcher-utils/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/jest-matcher-utils/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -14224,11 +14414,6 @@ "node": ">=7.0.0" } }, - "node_modules/jest-message-util/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/jest-message-util/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -14357,11 +14542,6 @@ "node": ">=7.0.0" } }, - "node_modules/jest-resolve/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/jest-resolve/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -14370,6 +14550,22 @@ "node": ">=8" } }, + "node_modules/jest-resolve/node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/jest-resolve/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -14452,11 +14648,6 @@ "node": ">=7.0.0" } }, - "node_modules/jest-runner/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/jest-runner/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -14548,10 +14739,38 @@ "node": ">=7.0.0" } }, - "node_modules/jest-runtime/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "node_modules/jest-runtime/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/jest-runtime/node_modules/has-flag": { "version": "4.0.0", @@ -14561,6 +14780,71 @@ "node": ">=8" } }, + "node_modules/jest-runtime/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/jest-runtime/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-runtime/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-runtime/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-runtime/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/jest-runtime/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "engines": { + "node": ">=6" + } + }, "node_modules/jest-runtime/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -14656,11 +14940,6 @@ "node": ">=7.0.0" } }, - "node_modules/jest-snapshot/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/jest-snapshot/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -14669,6 +14948,17 @@ "node": ">=8" } }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/jest-snapshot/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -14736,11 +15026,6 @@ "node": ">=7.0.0" } }, - "node_modules/jest-util/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/jest-util/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -14816,11 +15101,6 @@ "node": ">=7.0.0" } }, - "node_modules/jest-validate/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/jest-validate/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -14915,9 +15195,9 @@ } }, "node_modules/jest-watch-typeahead/node_modules/@types/yargs": { - "version": "17.0.28", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.28.tgz", - "integrity": "sha512-N3e3fkS86hNhtk6BEnc0rj3zcehaxx8QWhCROJkqpl5Zaoi7nAic3jH8q94jVD3zu5LGk+PUB6KAiDmimYOEQw==", + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", "dependencies": { "@types/yargs-parser": "*" } @@ -14962,11 +15242,6 @@ "node": ">=7.0.0" } }, - "node_modules/jest-watch-typeahead/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/jest-watch-typeahead/node_modules/emittery": { "version": "0.10.2", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", @@ -15103,11 +15378,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jest-watch-typeahead/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" - }, "node_modules/jest-watch-typeahead/node_modules/slash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", @@ -15235,11 +15505,6 @@ "node": ">=7.0.0" } }, - "node_modules/jest-watcher/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/jest-watcher/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -15308,12 +15573,11 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" @@ -15364,6 +15628,71 @@ } } }, + "node_modules/jsdom/node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jsdom/node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/jsdom/node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jsdom/node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jsdom/node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -15391,9 +15720,9 @@ "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" }, "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -15507,9 +15836,9 @@ } }, "node_modules/konva": { - "version": "9.3.5", - "resolved": "https://registry.npmjs.org/konva/-/konva-9.3.5.tgz", - "integrity": "sha512-mMs9TAlz5709m41F2dc8Q8vMtN09wJ1se0x72v9jwSnIAiaXWAr5OP4/8qQPtV7/VADYwCMv6NN3+qn6lTJacg==", + "version": "9.3.11", + "resolved": "https://registry.npmjs.org/konva/-/konva-9.3.11.tgz", + "integrity": "sha512-ZkFF4CXKZCDd2+6sBPA0y3hQ+X4uTqIS6JxTl3BEOFJzKr1tId+rxxJgtsk1FQIH3auuvnMj/rkbatUcf9C2Wg==", "funding": [ { "type": "patreon", @@ -15527,16 +15856,19 @@ "peer": true }, "node_modules/language-subtag-registry": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", - "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==" + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==" }, "node_modules/language-tags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", "dependencies": { - "language-subtag-registry": "~0.3.2" + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" } }, "node_modules/launch-editor": { @@ -15578,11 +15910,14 @@ } }, "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", + "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", "engines": { - "node": ">=10" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" } }, "node_modules/lines-and-columns": { @@ -15629,173 +15964,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/lint-staged/node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/lint-staged/node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/lint-staged/node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "dev": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "dev": true, - "engines": { - "node": ">=16.17.0" - } - }, - "node_modules/lint-staged/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/lilconfig": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", - "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/lint-staged/node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", - "dev": true, - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/lint-staged/node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/yaml": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.2.tgz", - "integrity": "sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==", - "dev": true, - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/listr2": { "version": "8.2.1", "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.1.tgz", @@ -15837,18 +16005,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/listr2/node_modules/emoji-regex": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", - "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", - "dev": true - }, - "node_modules/listr2/node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", - "dev": true - }, "node_modules/listr2/node_modules/string-width": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz", @@ -16042,12 +16198,6 @@ "node": ">=7.0.0" } }, - "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/log-symbols/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -16139,12 +16289,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-update/node_modules/emoji-regex": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", - "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", - "dev": true - }, "node_modules/log-update/node_modules/is-fullwidth-code-point": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", @@ -16160,6 +16304,30 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/log-update/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/log-update/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/log-update/node_modules/restore-cursor": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", @@ -16176,6 +16344,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/log-update/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, "node_modules/log-update/node_modules/slice-ansi": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", @@ -16307,20 +16481,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "optional": true - }, "node_modules/make-event-props": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/make-event-props/-/make-event-props-1.6.2.tgz", @@ -16367,9 +16527,9 @@ } }, "node_modules/memoize-one": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", - "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" }, "node_modules/merge": { "version": "2.1.1", @@ -16470,11 +16630,15 @@ } }, "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/mimic-response": { @@ -16490,11 +16654,12 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "2.7.6", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz", - "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.0.tgz", + "integrity": "sha512-Zs1YsZVfemekSZG+44vBsYTLQORkPMwnlv+aehcxK/NLKC+EGhDB39/YePYYqx/sTk6NnYpuqikhSn7+JIevTA==", "dependencies": { - "schema-utils": "^4.0.0" + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" }, "engines": { "node": ">= 12.13.0" @@ -16507,55 +16672,6 @@ "webpack": "^5.0.0" } }, - "node_modules/mini-css-extract-plugin/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -16573,9 +16689,9 @@ } }, "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -16584,7 +16700,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "optional": true, "engines": { "node": ">=8" } @@ -16682,9 +16797,9 @@ } }, "node_modules/nan": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.18.0.tgz", - "integrity": "sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==", + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.19.0.tgz", + "integrity": "sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw==", "optional": true }, "node_modules/nanoid": { @@ -16755,25 +16870,6 @@ } } }, - "node_modules/node-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/node-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/node-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -16843,20 +16939,37 @@ } }, "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, "dependencies": { - "path-key": "^3.0.0" + "path-key": "^4.0.0" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/npmlog": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "deprecated": "This package is no longer supported.", "optional": true, "dependencies": { "are-we-there-yet": "^2.0.0", @@ -16877,9 +16990,9 @@ } }, "node_modules/nwsapi": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", - "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==" + "version": "2.2.10", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.10.tgz", + "integrity": "sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ==" }, "node_modules/object-assign": { "version": "4.1.1", @@ -16946,26 +17059,27 @@ } }, "node_modules/object.entries": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", - "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -16975,15 +17089,17 @@ } }, "node_modules/object.getownpropertydescriptors": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.7.tgz", - "integrity": "sha512-PrJz0C2xJ58FNn11XV2lr4Jt5Gzl94qpy9Lu0JlfEj14z88sqbSBJCBEzdlNUCzY2gburhbrwOZ5BHCmuNUy0g==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.8.tgz", + "integrity": "sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==", "dependencies": { "array.prototype.reduce": "^1.0.6", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "safe-array-concat": "^1.0.0" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "gopd": "^1.0.1", + "safe-array-concat": "^1.1.2" }, "engines": { "node": ">= 0.8" @@ -16993,36 +17109,42 @@ } }, "node_modules/object.groupby": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", - "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/object.hasown": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", - "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz", + "integrity": "sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==", "dependencies": { - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -17064,14 +17186,15 @@ } }, "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, "dependencies": { - "mimic-fn": "^2.1.0" + "mimic-fn": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -17094,16 +17217,16 @@ } }, "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" @@ -17175,12 +17298,6 @@ "node": ">=7.0.0" } }, - "node_modules/ora/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/ora/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -17339,38 +17456,6 @@ "resolved": "https://registry.npmjs.org/parse-svg-path/-/parse-svg-path-0.1.2.tgz", "integrity": "sha512-JyPSBnkTJ0AI8GGJLfMXvKq42cj5c006fnLz6fXy6zfoVjJizi8BNTpu8on8ziI1cKy9d9DGNuY17Ce7wuejpQ==" }, - "node_modules/parse/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/parse/node_modules/ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/parse5": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", @@ -17427,10 +17512,33 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", + "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", + "engines": { + "node": "14 || >=16.14" + } + }, "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", + "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==" }, "node_modules/path-type": { "version": "4.0.0", @@ -17483,9 +17591,9 @@ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -18071,6 +18179,22 @@ "postcss": "^8.0.0" } }, + "node_modules/postcss-import/node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/postcss-initial": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", @@ -18117,20 +18241,26 @@ } }, "node_modules/postcss-load-config": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", - "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^2.1.1" + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" }, "engines": { "node": ">= 14" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, "peerDependencies": { "postcss": ">=8.0.9", "ts-node": ">=9.0.0" @@ -18144,14 +18274,6 @@ } } }, - "node_modules/postcss-load-config/node_modules/yaml": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", - "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", - "engines": { - "node": ">= 14" - } - }, "node_modules/postcss-loader": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", @@ -18173,6 +18295,40 @@ "webpack": "^5.0.0" } }, + "node_modules/postcss-loader/node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postcss-loader/node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postcss-loader/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, "node_modules/postcss-logical": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", @@ -18288,9 +18444,9 @@ } }, "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", "engines": { "node": "^10 || ^12 || >= 14" }, @@ -18299,9 +18455,9 @@ } }, "node_modules/postcss-modules-local-by-default": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", - "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", + "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", "dependencies": { "icss-utils": "^5.0.0", "postcss-selector-parser": "^6.0.2", @@ -18315,9 +18471,9 @@ } }, "node_modules/postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", + "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", "dependencies": { "postcss-selector-parser": "^6.0.4" }, @@ -18741,9 +18897,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz", + "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -18775,6 +18931,21 @@ "node": ">= 10" } }, + "node_modules/postcss-svgo/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, "node_modules/postcss-svgo/node_modules/css-tree": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", @@ -18787,6 +18958,54 @@ "node": ">=8.0.0" } }, + "node_modules/postcss-svgo/node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/postcss-svgo/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/postcss-svgo/node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/postcss-svgo/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, "node_modules/postcss-svgo/node_modules/mdn-data": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", @@ -18918,6 +19137,11 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/pretty-format/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, "node_modules/pretty-quick": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/pretty-quick/-/pretty-quick-3.3.1.tgz", @@ -19002,6 +19226,18 @@ "node": ">=8.12.0" } }, + "node_modules/pretty-quick/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/pretty-quick/node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -19014,6 +19250,42 @@ "node": ">=8" } }, + "node_modules/pretty-quick/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pretty-quick/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pretty-quick/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/pretty-quick/node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -19053,6 +19325,21 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pretty-quick/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/pretty-quick/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/print-js": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/print-js/-/print-js-1.6.0.tgz", @@ -19156,12 +19443,9 @@ } }, "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "engines": { - "node": ">=6" - } + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" }, "node_modules/q": { "version": "1.5.1", @@ -19231,7 +19515,17 @@ "quill-delta": "^3.6.2" } }, - "node_modules/quill-delta": { + "node_modules/quill/node_modules/eventemitter3": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz", + "integrity": "sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg==" + }, + "node_modules/quill/node_modules/fast-diff": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz", + "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==" + }, + "node_modules/quill/node_modules/quill-delta": { "version": "3.6.3", "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-3.6.3.tgz", "integrity": "sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==", @@ -19244,24 +19538,6 @@ "node": ">=0.10" } }, - "node_modules/quill-delta/node_modules/fast-diff": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz", - "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==" - }, - "node_modules/quill/node_modules/clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/quill/node_modules/eventemitter3": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz", - "integrity": "sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg==" - }, "node_modules/radix-ui": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/radix-ui/-/radix-ui-1.0.1.tgz", @@ -19321,9 +19597,9 @@ } }, "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", "engines": { "node": ">= 0.6" } @@ -19350,17 +19626,6 @@ "node": ">= 0.8" } }, - "node_modules/raw-body/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", @@ -19375,6 +19640,11 @@ "rc": "cli.js" } }, + "node_modules/rc/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, "node_modules/rc/node_modules/strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -19384,18 +19654,18 @@ } }, "node_modules/re-resizable": { - "version": "6.9.14", - "resolved": "https://registry.npmjs.org/re-resizable/-/re-resizable-6.9.14.tgz", - "integrity": "sha512-2UbPrpezMr6gkHKNCRA/N6QGGU237SKOZ78yMHId204A/oXWSAREAIuGZNQ9qlrJosewzcsv2CphZH3u7hC6ng==", + "version": "6.9.17", + "resolved": "https://registry.npmjs.org/re-resizable/-/re-resizable-6.9.17.tgz", + "integrity": "sha512-OBqd1BwVXpEJJn/yYROG+CbeqIDBWIp6wathlpB0kzZWWZIY1gPTsgK2yJEui5hOvkCdC2mcexF2V3DZVfLq2g==", "peerDependencies": { "react": "^16.13.1 || ^17.0.0 || ^18.0.0", "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0" } }, "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "dependencies": { "loose-envify": "^1.1.0" }, @@ -19420,9 +19690,9 @@ } }, "node_modules/react-app-polyfill/node_modules/core-js": { - "version": "3.33.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.33.0.tgz", - "integrity": "sha512-HoZr92+ZjFEKar5HS6MC776gYslNOKHt75mEBKWKnPeFDpZ6nH5OeF3S6HFT1mUAUZKrzkez05VboaX8myjSuw==", + "version": "3.37.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.37.1.tgz", + "integrity": "sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -19463,11 +19733,6 @@ } } }, - "node_modules/react-bootstrap/node_modules/classnames": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", - "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" - }, "node_modules/react-clientside-effect": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/react-clientside-effect/-/react-clientside-effect-1.2.6.tgz", @@ -19596,11 +19861,6 @@ "node": ">=7.0.0" } }, - "node_modules/react-dev-utils/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/react-dev-utils/node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -19620,10 +19880,19 @@ "node": ">=8" } }, + "node_modules/react-dev-utils/node_modules/immer": { + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, "node_modules/react-dev-utils/node_modules/loader-utils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", - "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.2.tgz", + "integrity": "sha512-vjJi4vQDasD8t0kMpxe+9URAcgbSuASqoj/Wuk3MawTk97LYa2KfdHreAkd1G/pmPLMvzZEw7/OsydADNemerQ==", "engines": { "node": ">= 12.13.0" } @@ -19718,15 +19987,23 @@ } }, "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "dependencies": { "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" + "scheduler": "^0.23.2" }, "peerDependencies": { - "react": "^18.2.0" + "react": "^18.3.1" + } + }, + "node_modules/react-dom/node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "dependencies": { + "loose-envify": "^1.1.0" } }, "node_modules/react-draggable": { @@ -19802,9 +20079,9 @@ } }, "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" }, "node_modules/react-konva": { "version": "18.2.10", @@ -19836,6 +20113,14 @@ "react-dom": ">=18.0.0" } }, + "node_modules/react-konva/node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, "node_modules/react-lifecycles-compat": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", @@ -19865,9 +20150,9 @@ "integrity": "sha512-FNbLuG/HAdapQoybeZSoes1PWdOj0w242gb+e1R0hicf3Gyj/Mf8M9NaED2AnXVOX01b2FXomwUiw1xP1K+8sA==" }, "node_modules/react-onclickoutside": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/react-onclickoutside/-/react-onclickoutside-6.13.0.tgz", - "integrity": "sha512-ty8So6tcUpIb+ZE+1HAhbLROvAIJYyJe/1vRrrcmW+jLsaM+/powDRqxzo6hSh9CuRZGSL1Q8mvcF5WRD93a0A==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/react-onclickoutside/-/react-onclickoutside-6.13.1.tgz", + "integrity": "sha512-LdrrxK/Yh9zbBQdFbMTXPp3dTSN9B+9YJQucdDu3JNKRrbdU+H+/TVONJoWtOwy4II8Sqf1y/DTI6w/vGPYW0w==", "funding": { "type": "individual", "url": "https://github.com/Pomax/react-onclickoutside/blob/master/FUNDING.md" @@ -19920,18 +20205,26 @@ } }, "node_modules/react-reconciler": { - "version": "0.29.0", - "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.29.0.tgz", - "integrity": "sha512-wa0fGj7Zht1EYMRhKWwoo1H9GApxYLBuhoAuXN0TlltESAjDssB+Apf0T/DngVqaMyPypDmabL37vw/2aRM98Q==", + "version": "0.29.2", + "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.29.2.tgz", + "integrity": "sha512-zZQqIiYgDCTP/f1N/mAR10nJGrPD2ZR+jDSEsKWJHYC7Cm2wodlwbR3upZRdC3cjIjSlTLNVyO7Iu0Yy7t2AYg==", "dependencies": { "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" + "scheduler": "^0.23.2" }, "engines": { "node": ">=0.10.0" }, "peerDependencies": { - "react": "^18.2.0" + "react": "^18.3.1" + } + }, + "node_modules/react-reconciler/node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "dependencies": { + "loose-envify": "^1.1.0" } }, "node_modules/react-redux": { @@ -19989,9 +20282,9 @@ } }, "node_modules/react-remove-scroll-bar": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.5.tgz", - "integrity": "sha512-3cqjOqg6s0XbOjWvmasmqHch+RLxIEk2r/70rzGXuz3iIGQsQheEQyqYCBb5EECoD01Vo2SIbDqW4paLeLTASw==", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz", + "integrity": "sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==", "dependencies": { "react-style-singleton": "^2.2.1", "tslib": "^2.0.0" @@ -20010,11 +20303,11 @@ } }, "node_modules/react-rnd": { - "version": "10.4.10", - "resolved": "https://registry.npmjs.org/react-rnd/-/react-rnd-10.4.10.tgz", - "integrity": "sha512-YjQAgEeSbNUoOXSD9ZBvIiLVizFb+bNhpDk8DbIRHA557NW02CXbwsAeOTpJQnsdhEL+NP2I+Ssrwejqcodtjg==", + "version": "10.4.11", + "resolved": "https://registry.npmjs.org/react-rnd/-/react-rnd-10.4.11.tgz", + "integrity": "sha512-XTfNGNcS0ad2vo3to7qNTB0BkFML9k1csIUI0Nlj44M6Uuh7yP/2h8WXiXcV3v3bxxVJck1C9K6FS1LrLH0E0Q==", "dependencies": { - "re-resizable": "6.9.14", + "re-resizable": "6.9.17", "react-draggable": "4.4.6", "tslib": "2.6.2" }, @@ -20024,11 +20317,11 @@ } }, "node_modules/react-router": { - "version": "6.22.3", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.22.3.tgz", - "integrity": "sha512-dr2eb3Mj5zK2YISHK++foM9w4eBnO23eKnZEDs7c880P6oKbrjz/Svg9+nxqtHQK+oMW4OtjZca0RqPglXxguQ==", + "version": "6.23.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.23.1.tgz", + "integrity": "sha512-fzcOaRF69uvqbbM7OhvQyBTFDVrrGlsFdS3AL+1KfIBtGETibHzi3FkoTRyiDJnWNc2VxrfvR+657ROHjaNjqQ==", "dependencies": { - "@remix-run/router": "1.15.3" + "@remix-run/router": "1.16.1" }, "engines": { "node": ">=14.0.0" @@ -20038,12 +20331,12 @@ } }, "node_modules/react-router-dom": { - "version": "6.22.3", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.22.3.tgz", - "integrity": "sha512-7ZILI7HjcE+p31oQvwbokjk6OA/bnFxrhJ19n82Ex9Ph8fNAq+Hm/7KchpMGlTgWhUxRHMMCut+vEtNpWpowKw==", + "version": "6.23.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.23.1.tgz", + "integrity": "sha512-utP+K+aSTtEdbWpC+4gxhdlPFwuEfDKq8ZrPFU65bbRJY+l706qjR7yaidBpo3MSeA/fzwbXWbKBI6ftOnP3OQ==", "dependencies": { - "@remix-run/router": "1.15.3", - "react-router": "6.22.3" + "@remix-run/router": "1.16.1", + "react-router": "6.23.1" }, "engines": { "node": ">=14.0.0" @@ -20125,6 +20418,111 @@ } } }, + "node_modules/react-scripts/node_modules/css-loader": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/react-scripts/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/react-scripts/node_modules/html-webpack-plugin": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz", + "integrity": "sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==", + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/react-scripts/node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/react-scripts/node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/react-scrollbars-custom": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/react-scrollbars-custom/-/react-scrollbars-custom-4.1.1.tgz", @@ -20162,11 +20560,6 @@ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/react-select/node_modules/memoize-one": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", - "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" - }, "node_modules/react-side-effect": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-2.1.2.tgz", @@ -20269,6 +20662,11 @@ "styled-components": "^4.0.0 || ^5.0.0" } }, + "node_modules/reactour/node_modules/classnames": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz", + "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==" + }, "node_modules/reactour/node_modules/prop-types": { "version": "15.7.2", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", @@ -20377,9 +20775,9 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, "node_modules/regenerator-transform": { "version": "0.15.2", @@ -20486,6 +20884,69 @@ "strip-ansi": "^6.0.1" } }, + "node_modules/renderkid/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/renderkid/node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/renderkid/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/renderkid/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -20508,14 +20969,14 @@ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" }, "node_modules/reselect": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.0.tgz", - "integrity": "sha512-aw7jcGLDpSgNDyWBQLv2cedml85qd95/iszJjN988zX1t7AVRJi19d9kto5+W7oCfQ94gyo40dVbT6g2k4/kXg==" + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz", + "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==" }, "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -20582,6 +21043,12 @@ "node": ">=0.10.0" } }, + "node_modules/resolve-dir/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, "node_modules/resolve-dir/node_modules/which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -20602,19 +21069,6 @@ "node": ">=8" } }, - "node_modules/resolve-global": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", - "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", - "dev": true, - "optional": true, - "dependencies": { - "global-dirs": "^0.1.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/resolve-url-loader": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz", @@ -20697,6 +21151,36 @@ "node": ">=8" } }, + "node_modules/restore-cursor/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, "node_modules/restructure": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/restructure/-/restructure-3.0.1.tgz", @@ -20729,6 +21213,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dependencies": { "glob": "^7.1.3" }, @@ -20964,24 +21449,26 @@ } }, "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.17.0.tgz", + "integrity": "sha512-7rro8Io3tnCPuY4la/NuI5F2yfESpnfZyT6TtkXnSWVkcu0BCDJ+8gk5ozUaFaxpIyNuWAPXrH0yFcSi28fnDA==", "dependencies": { - "loose-envify": "^1.1.0" + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" } }, "node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 10.13.0" + "node": ">= 12.13.0" }, "funding": { "type": "opencollective", @@ -21004,10 +21491,11 @@ "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==" }, "node_modules/selfsigned": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", - "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", "dependencies": { + "@types/node-forge": "^1.3.0", "node-forge": "^1" }, "engines": { @@ -21015,35 +21503,13 @@ } }, "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" } }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", @@ -21085,10 +21551,18 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, + "node_modules/send/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dependencies": { "randombytes": "^2.1.0" } @@ -21132,14 +21606,6 @@ "range-parser": "1.2.0" } }, - "node_modules/serve-handler/node_modules/content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/serve-handler/node_modules/mime-db": { "version": "1.33.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", @@ -21159,19 +21625,6 @@ "node": ">= 0.6" } }, - "node_modules/serve-handler/node_modules/path-to-regexp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", - "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==" - }, - "node_modules/serve-handler/node_modules/range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", @@ -21282,11 +21735,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/serve/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -21310,13 +21758,14 @@ } }, "node_modules/set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dependencies": { - "define-data-property": "^1.0.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -21355,22 +21804,32 @@ } }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, "node_modules/signature_pad": { "version": "2.3.2", @@ -21462,18 +21921,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/sockjs": { "version": "0.3.24", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", @@ -21484,6 +21931,14 @@ "websocket-driver": "^0.7.4" } }, + "node_modules/sockjs/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==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", @@ -21525,6 +21980,17 @@ "webpack": "^5.0.0" } }, + "node_modules/source-map-loader/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", @@ -21759,25 +22225,66 @@ "node": ">=8" } }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, "node_modules/string-width/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, + "node_modules/string-width/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, "node_modules/string.prototype.matchall": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", - "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", + "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "regexp.prototype.flags": "^1.5.0", - "set-function-name": "^2.0.0", - "side-channel": "^1.0.4" + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -21814,13 +22321,16 @@ } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -21850,6 +22360,18 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", @@ -21867,11 +22389,15 @@ } }, "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/strip-json-comments": { @@ -21886,9 +22412,9 @@ } }, "node_modules/style-loader": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.3.tgz", - "integrity": "sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", + "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", "engines": { "node": ">= 12.13.0" }, @@ -21925,11 +22451,34 @@ "react-dom": ">= 16.3.0" } }, + "node_modules/styled-components/node_modules/@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + }, + "node_modules/styled-components/node_modules/memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" + }, "node_modules/styled-components/node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, + "node_modules/styled-components/node_modules/stylis": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-3.5.4.tgz", + "integrity": "sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q==" + }, + "node_modules/styled-components/node_modules/stylis-rule-sheet": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz", + "integrity": "sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw==", + "peerDependencies": { + "stylis": "^3.5.0" + } + }, "node_modules/stylehacks": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", @@ -21946,26 +22495,18 @@ } }, "node_modules/stylis": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-3.5.4.tgz", - "integrity": "sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q==" - }, - "node_modules/stylis-rule-sheet": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz", - "integrity": "sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw==", - "peerDependencies": { - "stylis": "^3.5.0" - } + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" }, "node_modules/sucrase": { - "version": "3.34.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", - "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", - "glob": "7.1.6", + "glob": "^10.3.10", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", @@ -21976,7 +22517,15 @@ "sucrase-node": "bin/sucrase-node" }, "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" } }, "node_modules/sucrase/node_modules/commander": { @@ -21988,24 +22537,48 @@ } }, "node_modules/sucrase/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.1.tgz", + "integrity": "sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/sucrase/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sucrase/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -22096,57 +22669,24 @@ "node": ">=4.0.0" } }, - "node_modules/svgo/node_modules/css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "node_modules/svgo/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" + "sprintf-js": "~1.0.2" } }, - "node_modules/svgo/node_modules/css-what": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", - "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", - "engines": { - "node": ">= 6" + "node_modules/svgo/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/svgo/node_modules/dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "dependencies": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - } - }, - "node_modules/svgo/node_modules/domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "node_modules/svgo/node_modules/domutils/node_modules/domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" - }, - "node_modules/svgo/node_modules/nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "dependencies": { - "boolbase": "~1.0.0" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, "node_modules/symbol-tree": { @@ -22195,6 +22735,30 @@ "node": ">=14.0.0" } }, + "node_modules/tailwindcss/node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/tailwindcss/node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -22263,6 +22827,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/tempy/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/tempy/node_modules/type-fest": { "version": "0.16.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", @@ -22290,9 +22865,9 @@ } }, "node_modules/terser": { - "version": "5.21.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.21.0.tgz", - "integrity": "sha512-WtnFKrxu9kaoXuiZFSGrcAvvBqAdmKx0SFNmVNYdJamMu9yyN3I/QF0FbH4QcqJQ+y1CJnzxGIKH0cSj+FGYRw==", + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.0.tgz", + "integrity": "sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg==", "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -22307,15 +22882,15 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", + "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" + "terser": "^5.26.0" }, "engines": { "node": ">= 10.13.0" @@ -22339,6 +22914,51 @@ } } }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -22452,9 +23072,9 @@ } }, "node_modules/tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", @@ -22465,6 +23085,14 @@ "node": ">=6" } }, + "node_modules/tough-cookie/node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, "node_modules/tough-cookie/node_modules/universalify": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", @@ -22474,15 +23102,9 @@ } }, "node_modules/tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=8" - } + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "node_modules/trim-canvas": { "version": "0.1.2", @@ -22499,68 +23121,10 @@ "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" }, - "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "optional": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/ts-node/node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "optional": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ts-node/node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "optional": true - }, "node_modules/tsconfig-paths": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", @@ -22636,9 +23200,9 @@ } }, "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "engines": { "node": ">=10" }, @@ -22709,9 +23273,9 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", - "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", @@ -22739,6 +23303,7 @@ "version": "4.9.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -22781,9 +23346,9 @@ "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==" }, "node_modules/undici-types": { - "version": "5.25.3", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz", - "integrity": "sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==" + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", @@ -22865,9 +23430,9 @@ } }, "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "engines": { "node": ">= 10.0.0" } @@ -22895,9 +23460,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", + "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", "funding": [ { "type": "opencollective", @@ -22913,8 +23478,8 @@ } ], "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -22940,6 +23505,14 @@ "punycode": "^2.1.0" } }, + "node_modules/uri-js/node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, "node_modules/url-parse": { "version": "1.5.10", "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", @@ -23004,9 +23577,9 @@ } }, "node_modules/use-sync-external-store": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", - "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", + "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } @@ -23044,19 +23617,17 @@ } }, "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==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "bin": { "uuid": "dist/bin/uuid" } }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "optional": true - }, "node_modules/v8-to-istanbul": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", @@ -23133,9 +23704,9 @@ } }, "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", + "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -23175,33 +23746,33 @@ } }, "node_modules/webpack": { - "version": "5.88.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", - "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", + "version": "5.91.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.91.0.tgz", + "integrity": "sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==", "dependencies": { "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", "acorn": "^8.7.1", "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", + "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", + "enhanced-resolve": "^5.16.0", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "bin": { @@ -23242,59 +23813,18 @@ "webpack": "^4.0.0 || ^5.0.0" } }, - "node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, + "node_modules/webpack-dev-middleware/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "node": ">= 0.6" } }, "node_modules/webpack-dev-server": { - "version": "4.15.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", - "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", + "version": "4.15.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", + "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", "dependencies": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", @@ -23324,7 +23854,7 @@ "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.1", + "webpack-dev-middleware": "^5.3.4", "ws": "^8.13.0" }, "bin": { @@ -23349,75 +23879,6 @@ } } }, - "node_modules/webpack-dev-server/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack-dev-server/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.14.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", - "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/webpack-manifest-plugin": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz", @@ -23461,6 +23922,29 @@ "node": ">=10.13.0" } }, + "node_modules/webpack/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, "node_modules/webpack/node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -23481,6 +23965,28 @@ "node": ">=4.0" } }, + "node_modules/webpack/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/websocket-driver": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", @@ -23510,21 +24016,10 @@ "iconv-lite": "0.4.24" } }, - "node_modules/whatwg-encoding/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/whatwg-fetch": { - "version": "3.6.19", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.19.tgz", - "integrity": "sha512-d67JP4dHSbm2TrpFj8AbO8DnL1JXL5J9u0Kq2xW6d0TFDbCA3Muhdt8orXC22utleTVj7Prqt82baN6RBvnEgw==" + "version": "3.6.20", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", + "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==" }, "node_modules/whatwg-mimetype": { "version": "2.3.0", @@ -23532,18 +24027,19 @@ "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" }, "node_modules/whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dependencies": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - }, - "engines": { - "node": ">=10" + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" } }, + "node_modules/whatwg-url/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -23667,6 +24163,11 @@ "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, + "node_modules/widest-line/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, "node_modules/widest-line/node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", @@ -23769,56 +24270,14 @@ "node": ">=10.0.0" } }, - "node_modules/workbox-build/node_modules/@apideck/better-ajv-errors": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", - "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", - "dependencies": { - "json-schema": "^0.4.0", - "jsonpointer": "^5.0.0", - "leven": "^3.1.0" - }, + "node_modules/workbox-build/node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "engines": { - "node": ">=10" - }, - "peerDependencies": { - "ajv": ">=8" + "node": ">=6" } }, - "node_modules/workbox-build/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/workbox-build/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/workbox-build/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, "node_modules/workbox-build/node_modules/source-map": { "version": "0.8.0-beta.0", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", @@ -23880,6 +24339,7 @@ "version": "6.6.0", "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.6.0.tgz", "integrity": "sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==", + "deprecated": "It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained", "dependencies": { "workbox-background-sync": "6.6.0", "workbox-core": "6.6.0", @@ -24016,6 +24476,48 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -24041,11 +24543,6 @@ "node": ">=7.0.0" } }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -24062,16 +24559,21 @@ "typedarray-to-buffer": "^3.1.5" } }, + "node_modules/write-file-atomic/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, "node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", "engines": { - "node": ">=8.3.0" + "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { "bufferutil": { @@ -24114,11 +24616,14 @@ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.3.tgz", + "integrity": "sha512-sntgmxj8o7DE7g/Qi60cqpLBA3HG3STcDA0kO+WfB05jEKhZMbY7umNm2rBpQvsmZ16/lPXCJGW2672dgOUkrg==", + "bin": { + "yaml": "bin.mjs" + }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/yargs": { @@ -24146,15 +24651,6 @@ "node": ">=10" } }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "optional": true, - "engines": { - "node": ">=6" - } - }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/apps/OpenSign/package.json b/apps/OpenSign/package.json index fcd56a8ec..91ee1589d 100644 --- a/apps/OpenSign/package.json +++ b/apps/OpenSign/package.json @@ -11,6 +11,7 @@ "file-saver": "^2.0.5", "jwt-decode": "^4.0.0", "moment": "^2.30.1", + "nth-check": "^2.1.1", "parse": "^5.1.0", "pdf-lib": "^1.17.1", "print-js": "^1.6.0", @@ -95,5 +96,8 @@ "prettier": "^2.8.8", "pretty-quick": "^3.3.1", "tailwindcss": "^3.4.3" + }, + "overrides": { + "nth-check": "$nth-check" } } From 9a0183274f72ee035dd3d8c20371a2e4610c2248 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <prafull.navkar@nxglabs.com> Date: Mon, 3 Jun 2024 18:27:17 +0530 Subject: [PATCH 084/106] fix: Set send_email to false to stop receiving mails through API --- .../customRoute/v1/routes/CreateDocumentWithTemplate.js | 3 --- .../customRoute/v1/routes/createDocumentwithCoordinate.js | 7 ++----- apps/OpenSignServer/cloud/parsefunction/pdf/PDF.js | 2 +- 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/apps/OpenSignServer/cloud/customRoute/v1/routes/CreateDocumentWithTemplate.js b/apps/OpenSignServer/cloud/customRoute/v1/routes/CreateDocumentWithTemplate.js index 3922e9d94..aa3d327ea 100644 --- a/apps/OpenSignServer/cloud/customRoute/v1/routes/CreateDocumentWithTemplate.js +++ b/apps/OpenSignServer/cloud/customRoute/v1/routes/CreateDocumentWithTemplate.js @@ -208,9 +208,6 @@ export default async function createDocumentWithTemplate(request, response) { }); let sender = template.ExtUserPtr.Email; let sendMail; - const serverUrl = process.env.SERVER_URL; - const newServer = serverUrl.replaceAll('/', '%2F'); - const serverParams = `${newServer}%2F&${process.env.APP_ID}&contracts`; if (send_email === false) { console.log("don't send mail"); } else { diff --git a/apps/OpenSignServer/cloud/customRoute/v1/routes/createDocumentwithCoordinate.js b/apps/OpenSignServer/cloud/customRoute/v1/routes/createDocumentwithCoordinate.js index 602d92cfa..32df43ad0 100644 --- a/apps/OpenSignServer/cloud/customRoute/v1/routes/createDocumentwithCoordinate.js +++ b/apps/OpenSignServer/cloud/customRoute/v1/routes/createDocumentwithCoordinate.js @@ -36,7 +36,7 @@ async function sendDoctoWebhook(doc, WebhookUrl, userId) { } }) .catch(err => { - console.log('Err send data to webhook', err); + console.log('Err send data to webhook', err?.message); try { const webhook = new Parse.Object('contracts_Webhook'); webhook.set('Log', err?.status); @@ -47,7 +47,7 @@ async function sendDoctoWebhook(doc, WebhookUrl, userId) { }); webhook.save(null, { useMasterKey: true }); } catch (err) { - console.log('err save in contracts_Webhook', err); + console.log('err save in contracts_Webhook', err?.message); } }); // console.log('res ', res.data); @@ -269,9 +269,6 @@ export default async function createDocumentwithCoordinate(request, response) { year: 'numeric', }); let sender = parseExtUser.Email; - const serverUrl = process.env.SERVER_URL; - const newServer = serverUrl.replaceAll('/', '%2F'); - const serverParams = `${newServer}%2F&${process.env.APP_ID}&contracts`; if (send_email === false) { console.log("don't send mail"); } else { diff --git a/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.js b/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.js index abd8ab148..fc04b5efc 100644 --- a/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.js +++ b/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.js @@ -278,7 +278,7 @@ const sendMailsaveCertifcate = async (doc, P12Buffer, url, isCustomMail, mailPro }, }); // used in API only - if (doc.IsSendMail && doc.IsSendMail === false) { + if (doc.IsSendMail === false) { console.log("don't send mail"); } else { const mailObj = { From cf98e73d139c4594f0d4af208a62544ac689accd Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <prafull.navkar@nxglabs.com> Date: Mon, 3 Jun 2024 18:50:38 +0530 Subject: [PATCH 085/106] fix: freeze sign in with sso button after click --- apps/OpenSign/src/pages/Login.js | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/apps/OpenSign/src/pages/Login.js b/apps/OpenSign/src/pages/Login.js index ba9c6c5a3..382bf79b5 100644 --- a/apps/OpenSign/src/pages/Login.js +++ b/apps/OpenSign/src/pages/Login.js @@ -1045,19 +1045,21 @@ function Login() { // `handleSignInWithSSO` is trigger when user click sign in with sso and open sso authorize endpoint const handleSignInWithSSO = () => { - if (state?.email) { - setIsLoginSSO(true); - const encodedEmail = encodeURIComponent(state.email); - const clientUrl = window.location.origin; - const domain = state.email.split("@")?.pop(); - const ssoApiUrl = - process.env.SSO_API_URL || "https://sso.opensignlabs.com/api"; - openInNewTab( - `${ssoApiUrl}/oauth/authorize?response_type=code&provider=saml&tenant=${domain}&product=OpenSign&redirect_uri=${clientUrl}/sso&state=${encodedEmail}`, - "_self" - ); - } else { - alert("Please provide email."); + if (isLoginSSO === false) { + if (state?.email) { + setIsLoginSSO(true); + const encodedEmail = encodeURIComponent(state.email); + const clientUrl = window.location.origin; + const domain = state.email.split("@")?.pop(); + const ssoApiUrl = + process.env.SSO_API_URL || "https://sso.opensignlabs.com/api"; + openInNewTab( + `${ssoApiUrl}/oauth/authorize?response_type=code&provider=saml&tenant=${domain}&product=OpenSign&redirect_uri=${clientUrl}/sso&state=${encodedEmail}`, + "_self" + ); + } else { + alert("Please provide email."); + } } }; return ( From ed01f4a7a0e6b35cfc5dd18b7dd920135e25d86d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Jun 2024 15:38:51 +0000 Subject: [PATCH 086/106] build(deps): bump mongoose from 8.4.0 to 8.4.1 in /apps/OpenSignServer Bumps [mongoose](https://github.com/Automattic/mongoose) from 8.4.0 to 8.4.1. - [Release notes](https://github.com/Automattic/mongoose/releases) - [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md) - [Commits](https://github.com/Automattic/mongoose/compare/8.4.0...8.4.1) --- updated-dependencies: - dependency-name: mongoose dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> --- apps/OpenSignServer/package-lock.json | 8 ++++---- apps/OpenSignServer/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/OpenSignServer/package-lock.json b/apps/OpenSignServer/package-lock.json index 2bd775a9b..09b5bf8d8 100644 --- a/apps/OpenSignServer/package-lock.json +++ b/apps/OpenSignServer/package-lock.json @@ -25,7 +25,7 @@ "googleapis": "^134.0.0", "jsonschema": "^1.4.1", "mailgun.js": "^10.2.1", - "mongoose": "^8.4.0", + "mongoose": "^8.4.1", "multer": "^1.4.5-lts.1", "multer-s3": "^3.0.1", "node-forge": "^1.3.1", @@ -8190,9 +8190,9 @@ } }, "node_modules/mongoose": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.4.0.tgz", - "integrity": "sha512-fgqRMwVEP1qgRYfh+tUe2YBBFnPO35FIg2lfFH+w9IhRGg1/ataWGIqvf/MjwM29cZ60D5vSnqtN2b8Qp0sOZA==", + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.4.1.tgz", + "integrity": "sha512-odQ2WEWGL3hb0Qex+QMN4eH6D34WdMEw7F1If2MGABApSDmG9cMmqv/G1H6WsXmuaH9mkuuadW/WbLE5+tHJwA==", "dependencies": { "bson": "^6.7.0", "kareem": "2.6.3", diff --git a/apps/OpenSignServer/package.json b/apps/OpenSignServer/package.json index 18413a361..db7bcdef0 100644 --- a/apps/OpenSignServer/package.json +++ b/apps/OpenSignServer/package.json @@ -34,7 +34,7 @@ "googleapis": "^134.0.0", "jsonschema": "^1.4.1", "mailgun.js": "^10.2.1", - "mongoose": "^8.4.0", + "mongoose": "^8.4.1", "multer": "^1.4.5-lts.1", "multer-s3": "^3.0.1", "node-forge": "^1.3.1", From 3b02d2bcdbd7581fb3d2b9410af2701950066a69 Mon Sep 17 00:00:00 2001 From: Amol <amol@nxglabs.in> Date: Tue, 4 Jun 2024 01:01:52 +0530 Subject: [PATCH 087/106] fix: update SSO url --- apps/OpenSignServer/cloud/parsefunction/ssoSignin.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/OpenSignServer/cloud/parsefunction/ssoSignin.js b/apps/OpenSignServer/cloud/parsefunction/ssoSignin.js index 1067db69d..4e9db526c 100644 --- a/apps/OpenSignServer/cloud/parsefunction/ssoSignin.js +++ b/apps/OpenSignServer/cloud/parsefunction/ssoSignin.js @@ -77,7 +77,7 @@ export default async function ssoSignin(request) { } } else { // console.log("in sign up condition"); - const response = await axios.get('https://osl-jacksonv2.vercel.app/api/oauth/userinfo', { + const response = await axios.get('ttps://sso.opensignlabs.com/api/oauth/userinfo', { headers: { Authorization: `Bearer ${ssoAccessToken}`, }, From 85aa6b29476f680c3fa53bd0b012694a1fd5a0d8 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <prafull.navkar@nxglabs.com> Date: Tue, 4 Jun 2024 10:03:30 +0530 Subject: [PATCH 088/106] fix: update sso url --- apps/OpenSignServer/cloud/parsefunction/ssoSignin.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/OpenSignServer/cloud/parsefunction/ssoSignin.js b/apps/OpenSignServer/cloud/parsefunction/ssoSignin.js index 4e9db526c..61ec53173 100644 --- a/apps/OpenSignServer/cloud/parsefunction/ssoSignin.js +++ b/apps/OpenSignServer/cloud/parsefunction/ssoSignin.js @@ -77,7 +77,7 @@ export default async function ssoSignin(request) { } } else { // console.log("in sign up condition"); - const response = await axios.get('ttps://sso.opensignlabs.com/api/oauth/userinfo', { + const response = await axios.get(ssoApiUrl + '/oauth/userinfo', { headers: { Authorization: `Bearer ${ssoAccessToken}`, }, From ba1c3145f3f02dff08b361867b1c33ef33f1e5cc Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <93375423+prafull-opensignlabs@users.noreply.github.com> Date: Wed, 5 Jun 2024 13:49:20 +0530 Subject: [PATCH 089/106] fix: mail and document count in autoreminder API is not correct --- .../cloud/customRoute/autoReminder.js | 29 ++++++++++++------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/apps/OpenSignServer/cloud/customRoute/autoReminder.js b/apps/OpenSignServer/cloud/customRoute/autoReminder.js index b8d92606d..35cd75e04 100644 --- a/apps/OpenSignServer/cloud/customRoute/autoReminder.js +++ b/apps/OpenSignServer/cloud/customRoute/autoReminder.js @@ -23,7 +23,7 @@ function replaceMailVaribles(subject, body, variables) { } // `sendmail` is used to signing reminder mail to signer -async function sendMail(doc, signer, mailcount) { +async function sendMail(doc, signer) { const subject = `{{sender_name}} has requested you to sign "{{document_title}}"`; const body = `<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8' /></head><body><p>Hi {{receiver_name}},</p><br><p>We hope this email finds you well. {{sender_name}} has requested you to review and sign <b>"{{document_title}}"</b>.</p><p>Your signature is crucial to proceed with the next steps as it signifies your agreement and authorization.</p><br><p>{{signing_url}}</p><br><p>If you have any questions or need further clarification regarding the document or the signing process, please contact the sender.</p><br><p>Thanks</p><p> Team OpenSign™</p><br></body> </html>`; const url = `${process.env.SERVER_URL}/functions/sendmailv3`; @@ -69,8 +69,7 @@ async function sendMail(doc, signer, mailcount) { const res = await axios.post(url, params, { headers: headers }); // console.log('res ', res.data.result); if (res.data.result.status === 'success') { - mailcount += 1; - return { status: 'success', count: mailcount }; + return { status: 'success' }; } } catch (err) { console.log('err in mail of sendreminder api', err); @@ -99,10 +98,11 @@ export default async function autoReminder(request, response) { if (docsArr && docsArr.length > 0) { const _docsArr = JSON.parse(JSON.stringify(docsArr)); let mailCount = 0; + let docCount = 0; for (const doc of _docsArr) { // The reminderDate variable is used to calculate the next reminder date. const RemindOnceInEvery = doc?.RemindOnceInEvery || 5; - const ReminderDate = new Date(doc?.NextReminderDate?.iso); + const ReminderDate = new Date(); ReminderDate.setDate(ReminderDate.getDate() + RemindOnceInEvery); // The sendInOrder variable is used to determine whether to send emails in order or not. const SendInOrder = doc?.SendinOrder || false; @@ -112,9 +112,10 @@ export default async function autoReminder(request, response) { const count = auditTrail?.length || 0; const signer = doc?.Signers?.[count]; if (signer) { - const mailRes = await sendMail(doc, signer, mailCount); + docCount += 1; + const mailRes = await sendMail(doc, signer); if (mailRes && mailRes.status === 'success') { - mailCount += mailRes.count; + mailCount += 1; } try { // The code below is used to update the next reminder date of the document based on the "remind once every X days" setting. @@ -139,11 +140,12 @@ export default async function autoReminder(request, response) { } }); if (signers?.length > 0) { + docCount += 1; // The for...of loop below is used to send a signing reminder to every signer who hasn't signed the document yet. for (const signer of signers) { - const mailRes = await sendMail(doc, signer, mailCount); + const mailRes = await sendMail(doc, signer); if (mailRes && mailRes.status === 'success') { - mailCount += mailRes.count; + mailCount += 1; } } } @@ -151,10 +153,11 @@ export default async function autoReminder(request, response) { // The for...of loop below is used to send a signing reminder to every signer who hasn't signed the document yet. const signers = doc?.Signers; if (signers?.length > 0) { + docCount += 1; for (const signer of signers) { - const mailRes = await sendMail(doc, signer, mailCount); + const mailRes = await sendMail(doc, signer); if (mailRes && mailRes.status === 'success') { - mailCount += mailRes.count; + mailCount += 1; } } } @@ -171,7 +174,11 @@ export default async function autoReminder(request, response) { } } } - response.json({ status: 'success', document_count: docsArr.length, mail_count: mailCount }); + if (docCount > 0) { + response.json({ status: 'success', document_count: docCount, mail_count: mailCount }); + } else { + response.json({ status: 'no record found' }); + } } else { response.json({ status: 'no record found' }); } From 290046427242abf85f0e24ab8ec7b1e16935d7cc Mon Sep 17 00:00:00 2001 From: RaktimaNXG <raktima.c@nxglabs.com> Date: Fri, 7 Jun 2024 14:20:36 +0530 Subject: [PATCH 090/106] fix: display the list of unsigned signers in the 'Yet to Sign' panel using the QuickSend flow. --- apps/OpenSign/src/components/pdf/RenderPdf.js | 12 +- apps/OpenSign/src/pages/PdfRequestFiles.js | 123 ++++++++++-------- 2 files changed, 79 insertions(+), 56 deletions(-) diff --git a/apps/OpenSign/src/components/pdf/RenderPdf.js b/apps/OpenSign/src/components/pdf/RenderPdf.js index 716c404e2..44f15881c 100644 --- a/apps/OpenSign/src/components/pdf/RenderPdf.js +++ b/apps/OpenSign/src/components/pdf/RenderPdf.js @@ -204,9 +204,15 @@ function RenderPdf({ }; //function for render placeholder block over pdf document const checkSignedSignes = (data) => { - const checkSign = signedSigners.filter( - (sign) => sign.objectId === data.signerObjId - ); + let checkSign = []; + //condition to handle quick send flow and using normal request sign flow + if (signedSigners[0]?.Id) { + checkSign = signedSigners.filter((sign) => sign.Id === data.Id); + } else { + checkSign = signedSigners.filter( + (sign) => sign.objectId === data.signerObjId + ); + } if (data.signerObjId === signerObjectId) { setCurrentSigner(true); } diff --git a/apps/OpenSign/src/pages/PdfRequestFiles.js b/apps/OpenSign/src/pages/PdfRequestFiles.js index f054f7530..97f2c71be 100644 --- a/apps/OpenSign/src/pages/PdfRequestFiles.js +++ b/apps/OpenSign/src/pages/PdfRequestFiles.js @@ -32,7 +32,8 @@ import { contactBook, handleDownloadPdf, handleToPrint, - handleDownloadCertificate + handleDownloadCertificate, + darkenColor } from "../constant/Utils"; import Loader from "../primitives/LoaderWithMsg"; import HandleError from "../primitives/HandleError"; @@ -74,7 +75,7 @@ function PdfRequestFiles() { const [selectWidgetId, setSelectWidgetId] = useState(""); const [otpLoader, setOtpLoader] = useState(false); const [isCelebration, setIsCelebration] = useState(false); - const [requestSignTour, setRequestSignTour] = useState(true); + const [requestSignTour, setRequestSignTour] = useState(false); const [tourStatus, setTourStatus] = useState([]); const [isLoading, setIsLoading] = useState({ isLoad: true, @@ -296,6 +297,10 @@ function PdfRequestFiles() { setExpiredDate(expireDateFormat); } // Check if the current signer is not a last signer and handle the complete message. else if (isNextUser) { + setIsCelebration(true); + setTimeout(() => { + setIsCelebration(false); + }, 5000); setIsCompleted({ isModal: true, message: @@ -330,7 +335,7 @@ function PdfRequestFiles() { } } } - const checkDocIdExist = + const audittrailData = documentData[0].AuditTrail && documentData[0].AuditTrail.length > 0 && documentData[0].AuditTrail.filter((data) => data.Activity === "Signed"); @@ -398,41 +403,49 @@ function PdfRequestFiles() { let signers = []; let unSignedSigner = []; + //`emailExist` variable to handle condition for quick send flow and show unsigned signers list + const emailExist = documentData[0].Placeholders[0]?.email; - //check document is signed or not - if (checkDocIdExist && checkDocIdExist.length > 0) { + //condition to check already signed document by someone + if (audittrailData && audittrailData.length > 0) { setIsDocId(true); - const signerRes = documentData[0].Signers; - //comparison auditTrail user details with signers user details - for (let i = 0; i < signerRes.length; i++) { - const signerId = signerRes[i].objectId; + const placeholdersOrSigners = emailExist + ? documentData[0].Placeholders + : documentData[0].Signers; + for (const item of placeholdersOrSigners) { + //if email exist then compare user signed by using email else signers objectId + const emailOrId = emailExist ? item.email : item.objectId; + //`isSignedSignature` variable to handle break loop whenever it get true let isSignedSignature = false; - for (let j = 0; j < checkDocIdExist.length; j++) { - const signedExist = - checkDocIdExist[j] && checkDocIdExist[j].UserPtr.objectId; - //checking signerObjId and auditTrail User objId - // if match then add signed data in signer array and break loop + //checking the signer who signed the document by using audit trail details. + //and save signedSigners and unsignedSigners details + for (const doc of audittrailData) { + const signedExist = emailExist + ? doc?.UserPtr.Email + : doc?.UserPtr.objectId; - if (signerId === signedExist) { - signers.push({ ...signerRes[i], ...signerRes[i] }); + if (emailOrId === signedExist) { + signers.push({ ...item }); isSignedSignature = true; break; } - // if does not match then add unsigned data in unSignedSigner array } if (!isSignedSignature) { - unSignedSigner.push({ ...signerRes[i], ...signerRes[i] }); + unSignedSigner.push({ ...item }); } } setSignedSigners(signers); setUnSignedSigners(unSignedSigner); setSignerPos(documentData[0].Placeholders); } else { + //else condition is show there are no details in audit trail then direct push all signers details + //in unsignedsigners array let unsigned = []; - for (let i = 0; i < documentData.length; i++) { - unsigned.push(documentData[i].Signers); - } + const placeholdersOrSigners = emailExist + ? documentData[0].Placeholders + : documentData[0].Signers; + unsigned.push(placeholdersOrSigners); setUnSignedSigners(unsigned[0]); setSignerPos(documentData[0].Placeholders); } @@ -447,7 +460,7 @@ function PdfRequestFiles() { declined || currDate > expireUpdateDate ) { - setRequestSignTour(false); + setRequestSignTour(true); } else { //else condition to check current user exist in contracts_Users class and check tour message status //if not then check user exist in contracts_Contactbook class and check tour message status @@ -463,33 +476,25 @@ function PdfRequestFiles() { setContractName("_Users"); currUserId = res[0].objectId; setSignerUserId(currUserId); - const tourstatus = res[0].TourStatus && res[0].TourStatus; - if (tourstatus && tourstatus.length > 0) { - setTourStatus(tourstatus); - const checkTourRequestSign = tourstatus.filter( - (data) => data.requestSign - ); - if (checkTourRequestSign && checkTourRequestSign.length > 0) { - setRequestSignTour(checkTourRequestSign[0].requestSign); - } + const tourData = res[0].TourStatus && res[0].TourStatus; + if (tourData && tourData.length > 0) { + setTourStatus(tourData); + setRequestSignTour(tourData[0]?.requestSign || false); } } else if (res?.length === 0) { const res = await contactBook(currUserId); + if (res === "Error: Something went wrong!") { setHandleError("Error: Something went wrong!"); } else if (res[0] && res.length) { setContractName("_Contactbook"); const objectId = res[0].objectId; setSignerUserId(objectId); - const tourstatus = res[0].TourStatus && res[0].TourStatus; - if (tourstatus && tourstatus.length > 0) { - setTourStatus(tourstatus); - const checkTourRequestSign = tourstatus.filter( - (data) => data.requestSign - ); - if (checkTourRequestSign && checkTourRequestSign.length > 0) { - setRequestSignTour(checkTourRequestSign[0].requestSign); - } + const tourData = res[0].TourStatus && res[0].TourStatus; + + if (tourData && tourData.length > 0) { + setTourStatus(tourData); + setRequestSignTour(tourData[0]?.requestSign || false); } } else if (res.length === 0) { setHandleError("Error: User does not exist!"); @@ -552,7 +557,6 @@ function PdfRequestFiles() { setIsLoading(loadObj); }); }; - //function for embed signature or image url in pdf async function embedWidgetsData() { try { @@ -1109,9 +1113,19 @@ function PdfRequestFiles() { }; const checkSignerBackColor = (obj) => { - const data = signerPos.filter((data) => data.signerObjId === obj.objectId); + let data = ""; + if (obj?.Id) { + data = signerPos.filter((data) => data.Id === obj.Id); + } else { + data = signerPos.filter((data) => data.signerObjId === obj.objectId); + } return data && data.length > 0 && data[0].blockColor; }; + const checkUserNameColor = (obj) => { + const getBackColor = checkSignerBackColor(obj); + const color = darkenColor(getBackColor, 0.4); + return color; + }; //function for set decline true on press decline button const declineDoc = async () => { @@ -1210,7 +1224,7 @@ function PdfRequestFiles() { }; //function to close tour and save tour status const closeRequestSignTour = async () => { - setRequestSignTour(false); + setRequestSignTour(true); if (isDontShow) { let updatedTourStatus = []; if (tourStatus.length > 0) { @@ -1332,7 +1346,6 @@ function PdfRequestFiles() { /> ); }; - return ( <DndProvider backend={HTML5Backend}> <Title title={"Request Sign"} /> @@ -1401,7 +1414,7 @@ function PdfRequestFiles() { }} ref={divRef} > - {requestSignTour && requestSignTourFunction()} + {!requestSignTour && requestSignTourFunction()} <ModalUi headerColor={"#dc3545"} isOpen={isAlert.isShow} @@ -1781,7 +1794,7 @@ function PdfRequestFiles() { <div className="signerStyle" style={{ - background: "#abd1d0", + background: checkUserNameColor(obj), width: 30, height: 30, display: "flex", @@ -1800,7 +1813,7 @@ function PdfRequestFiles() { textTransform: "uppercase" }} > - {getFirstLetter(obj.Name)} + {getFirstLetter(obj?.Name || obj?.Role)} </span> </div> <div @@ -1809,9 +1822,11 @@ function PdfRequestFiles() { flexDirection: "column" }} > - <span className="userName">{obj.Name}</span> + <span className="userName"> + {obj?.Name || obj?.Role} + </span> <span className="useEmail"> - {obj.Email} + {obj?.Email || obj?.email} </span> </div> </div> @@ -1850,7 +1865,7 @@ function PdfRequestFiles() { <div className="signerStyle" style={{ - background: "#abd1d0", + background: checkUserNameColor(obj), width: 30, height: 30, display: "flex", @@ -1869,7 +1884,7 @@ function PdfRequestFiles() { textTransform: "uppercase" }} > - {getFirstLetter(obj.Name)} + {getFirstLetter(obj?.Name || obj?.email)} </span> </div> <div @@ -1878,9 +1893,11 @@ function PdfRequestFiles() { flexDirection: "column" }} > - <span className="userName">{obj.Name}</span> + <span className="userName"> + {obj?.Name || obj?.Role} + </span> <span className="useEmail"> - {obj.Email} + {obj?.Email || obj?.email} </span> </div> <hr /> From 5c3f967128f7c91f414273cc7e413f738fb2f3d2 Mon Sep 17 00:00:00 2001 From: RaktimaNXG <raktima.c@nxglabs.com> Date: Fri, 7 Jun 2024 19:07:56 +0530 Subject: [PATCH 091/106] fix: add validation of signature widgetat in quick send flow, update SentToOthers field when document is in inProgress , resolve resend nonexist email issue --- apps/OpenSign/src/components/BulkSendUi.js | 137 ++++++++++-------- apps/OpenSign/src/components/pdf/RenderPdf.js | 10 +- apps/OpenSign/src/constant/Utils.js | 1 + apps/OpenSign/src/pages/PdfRequestFiles.js | 44 +++--- apps/OpenSign/src/pages/PlaceHolderSign.js | 4 +- .../src/primitives/GetReportDisplay.js | 121 ++++++++++------ .../v1/routes/CreateDocumentWithTemplate.js | 1 + .../v1/routes/createDocumentwithCoordinate.js | 1 + .../cloud/parsefunction/createBatchDocs.js | 2 + 9 files changed, 194 insertions(+), 127 deletions(-) diff --git a/apps/OpenSign/src/components/BulkSendUi.js b/apps/OpenSign/src/components/BulkSendUi.js index c5445ad66..98ba5c0b8 100644 --- a/apps/OpenSign/src/components/BulkSendUi.js +++ b/apps/OpenSign/src/components/BulkSendUi.js @@ -9,7 +9,22 @@ const BulkSendUi = (props) => { const [scrollOnNextUpdate, setScrollOnNextUpdate] = useState(false); const [isSubmit, setIsSubmit] = useState(false); const [allowedForm, setAllowedForm] = useState(0); + const [isSignatureExist, setIsSignatureExist] = useState(); const allowedSigners = 50; + useEffect(() => { + signatureExist(); + }, []); + + //function to check atleast one signature field exist + const signatureExist = () => { + const getPlaceholder = props.item?.Placeholders; + const checkIsSignatureExistt = getPlaceholder?.every((placeholderObj) => + placeholderObj?.placeHolder?.some((holder) => + holder?.pos?.some((posItem) => posItem?.type === "signature") + ) + ); + setIsSignatureExist(checkIsSignatureExistt); + }; useEffect(() => { if (scrollOnNextUpdate && formRef.current) { formRef.current.scrollIntoView({ @@ -165,65 +180,73 @@ const BulkSendUi = (props) => { </div> )} {props.Placeholders?.length > 0 ? ( - <> - {props.Placeholders?.some((x) => !x.signerObjId) ? ( - <form onSubmit={handleSubmit}> - <div className=" min-h-max max-h-[250px] overflow-y-auto"> - {forms?.map((form, index) => ( - <div - key={form.Id} - className="p-3 rounded-xl border-[1px] border-gray-400 m-4 bg-white text-black grid grid-cols-1 md:grid-cols-2 gap-2 relative" + isSignatureExist ? ( + <> + {props.Placeholders?.some((x) => !x.signerObjId) ? ( + <form onSubmit={handleSubmit}> + <div className=" min-h-max max-h-[250px] overflow-y-auto"> + {forms?.map((form, index) => ( + <div + key={form.Id} + className="p-3 rounded-xl border-[1px] border-gray-400 m-4 bg-white text-black grid grid-cols-1 md:grid-cols-2 gap-2 relative" + > + {form?.fields?.map((field, fieldIndex) => ( + <div className="flex flex-col " key={field.fieldId}> + <label>{field.label}</label> + <SuggestionInput + required + type="email" + value={field.value} + index={fieldIndex} + onChange={(signer) => + handleInputChange(index, signer, fieldIndex) + } + /> + </div> + ))} + {forms?.length > 1 && ( + <button + onClick={() => handleRemoveForm(index)} + className="absolute right-3 top-1 border border-gray-300 rounded-lg px-2 py-1" + > + <i className="fa-solid fa-trash"></i> + </button> + )} + <div ref={formRef}></div> + </div> + ))} + </div> + <div className="flex flex-col mx-4 mb-4 gap-3"> + <button + onClick={handleAddForm} + className="bg-[#32a3ac] p-2 text-white w-full rounded-full focus:outline-none" > - {form?.fields?.map((field, fieldIndex) => ( - <div className="flex flex-col " key={field.fieldId}> - <label>{field.label}</label> - <SuggestionInput - required - type="email" - value={field.value} - index={fieldIndex} - onChange={(signer) => - handleInputChange(index, signer, fieldIndex) - } - /> - </div> - ))} - {forms?.length > 1 && ( - <button - onClick={() => handleRemoveForm(index)} - className="absolute right-3 top-1 border border-gray-300 rounded-lg px-2 py-1" - > - <i className="fa-solid fa-trash"></i> - </button> - )} - <div ref={formRef}></div> - </div> - ))} + <i className="fa-solid fa-plus"></i> <span>Add new</span> + </button> + <button + type="submit" + className="bg-[#32a3ac] p-2 text-white w-full rounded-full focus:outline-none" + > + <i className="fa-solid fa-paper-plane"></i>{" "} + <span>Send</span> + </button> + </div> + </form> + ) : ( + <div className="text-black p-3 bg-white w-full text-sm md:text-base flex justify-center items-center"> + All roles in this document are currently linked to contacts. To + 'quick send' copies of this template to multiple + signers, please ensure that at least one role is not linked to + any contact. </div> - <div className="flex flex-col mx-4 mb-4 gap-3"> - <button - onClick={handleAddForm} - className="bg-[#32a3ac] p-2 text-white w-full rounded-full focus:outline-none" - > - <i className="fa-solid fa-plus"></i> <span>Add new</span> - </button> - <button - type="submit" - className="bg-[#32a3ac] p-2 text-white w-full rounded-full focus:outline-none" - > - <i className="fa-solid fa-paper-plane"></i> <span>Send</span> - </button> - </div> - </form> - ) : ( - <div className="text-black p-3 bg-white w-full text-sm md:text-base flex justify-center items-center"> - All roles in this document are currently linked to contacts. To - 'quick send' copies of this template to multiple - signers, please ensure that at least one role is not linked to any - contact. - </div> - )} - </> + )} + </> + ) : ( + <div className="text-black p-3 bg-white w-full text-sm md:text-base flex justify-center items-center"> + Please ensure there's at least one signature widget added for + all recipients. + </div> + ) ) : ( <div className="text-black p-3 bg-white w-full text-sm md:text-base flex justify-center items-center"> Please add at least one role to this template in order to 'quick diff --git a/apps/OpenSign/src/components/pdf/RenderPdf.js b/apps/OpenSign/src/components/pdf/RenderPdf.js index 44f15881c..2bac6b85e 100644 --- a/apps/OpenSign/src/components/pdf/RenderPdf.js +++ b/apps/OpenSign/src/components/pdf/RenderPdf.js @@ -206,13 +206,9 @@ function RenderPdf({ const checkSignedSignes = (data) => { let checkSign = []; //condition to handle quick send flow and using normal request sign flow - if (signedSigners[0]?.Id) { - checkSign = signedSigners.filter((sign) => sign.Id === data.Id); - } else { - checkSign = signedSigners.filter( - (sign) => sign.objectId === data.signerObjId - ); - } + checkSign = signedSigners.filter( + (sign) => sign?.Id === data?.Id || sign?.objectId === data?.signerObjId + ); if (data.signerObjId === signerObjectId) { setCurrentSigner(true); } diff --git a/apps/OpenSign/src/constant/Utils.js b/apps/OpenSign/src/constant/Utils.js index 3a24c4398..25a91a20c 100644 --- a/apps/OpenSign/src/constant/Utils.js +++ b/apps/OpenSign/src/constant/Utils.js @@ -669,6 +669,7 @@ export const createDocument = async (template, placeholders, signerData) => { Name: Doc.Name, URL: Doc.URL, SignedUrl: Doc.SignedUrl, + SentToOthers: Doc.SentToOthers, Description: Doc.Description, Note: Doc.Note, Placeholders: placeholdersArr, diff --git a/apps/OpenSign/src/pages/PdfRequestFiles.js b/apps/OpenSign/src/pages/PdfRequestFiles.js index 97f2c71be..426a3aadf 100644 --- a/apps/OpenSign/src/pages/PdfRequestFiles.js +++ b/apps/OpenSign/src/pages/PdfRequestFiles.js @@ -403,25 +403,34 @@ function PdfRequestFiles() { let signers = []; let unSignedSigner = []; - //`emailExist` variable to handle condition for quick send flow and show unsigned signers list - const emailExist = documentData[0].Placeholders[0]?.email; + const placeholdersOrSigners = []; + for (const placeholder of documentData[0].Placeholders) { + //`emailExist` variable to handle condition for quick send flow and show unsigned signers list + const emailExist = placeholder?.email; + if (emailExist) { + placeholdersOrSigners.push(placeholder); + } else { + const getSignerData = documentData[0].Signers.filter( + (data) => data.objectId === placeholder?.signerObjId + ); + placeholdersOrSigners.push(getSignerData[0]); + } + } //condition to check already signed document by someone if (audittrailData && audittrailData.length > 0) { setIsDocId(true); - const placeholdersOrSigners = emailExist - ? documentData[0].Placeholders - : documentData[0].Signers; for (const item of placeholdersOrSigners) { + const checkEmail = item?.email; //if email exist then compare user signed by using email else signers objectId - const emailOrId = emailExist ? item.email : item.objectId; + const emailOrId = checkEmail ? item.email : item.objectId; //`isSignedSignature` variable to handle break loop whenever it get true let isSignedSignature = false; //checking the signer who signed the document by using audit trail details. //and save signedSigners and unsignedSigners details for (const doc of audittrailData) { - const signedExist = emailExist + const signedExist = checkEmail ? doc?.UserPtr.Email : doc?.UserPtr.objectId; @@ -441,12 +450,7 @@ function PdfRequestFiles() { } else { //else condition is show there are no details in audit trail then direct push all signers details //in unsignedsigners array - let unsigned = []; - const placeholdersOrSigners = emailExist - ? documentData[0].Placeholders - : documentData[0].Signers; - unsigned.push(placeholdersOrSigners); - setUnSignedSigners(unsigned[0]); + setUnSignedSigners(placeholdersOrSigners); setSignerPos(documentData[0].Placeholders); } setPdfDetails(documentData); @@ -1000,8 +1004,10 @@ function PdfRequestFiles() { } const getFirstLetter = (name) => { - const firstLetter = name.charAt(0); - return firstLetter; + if (name) { + const firstLetter = name.charAt(0); + return firstLetter; + } }; //function for image upload or update const onImageChange = (event) => { @@ -1123,8 +1129,12 @@ function PdfRequestFiles() { }; const checkUserNameColor = (obj) => { const getBackColor = checkSignerBackColor(obj); - const color = darkenColor(getBackColor, 0.4); - return color; + if (getBackColor) { + const color = darkenColor(getBackColor, 0.4); + return color; + } else { + return "#abd1d0"; + } }; //function for set decline true on press decline button diff --git a/apps/OpenSign/src/pages/PlaceHolderSign.js b/apps/OpenSign/src/pages/PlaceHolderSign.js index 6e9fa46a9..3f25695f5 100644 --- a/apps/OpenSign/src/pages/PlaceHolderSign.js +++ b/apps/OpenSign/src/pages/PlaceHolderSign.js @@ -936,6 +936,7 @@ function PlaceHolderSign() { Placeholders: filterPrefill, SignedUrl: pdfUrl, Signers: signers, + SentToOthers: true, ExpiryDate: { iso: updateExpiryDate, __type: "Date" @@ -945,7 +946,8 @@ function PlaceHolderSign() { data = { Placeholders: filterPrefill, SignedUrl: pdfUrl, - Signers: signers + Signers: signers, + SentToOthers: true }; } await axios diff --git a/apps/OpenSign/src/primitives/GetReportDisplay.js b/apps/OpenSign/src/primitives/GetReportDisplay.js index 0a04073bf..45011e213 100644 --- a/apps/OpenSign/src/primitives/GetReportDisplay.js +++ b/apps/OpenSign/src/primitives/GetReportDisplay.js @@ -143,6 +143,7 @@ const ReportTable = (props) => { Name: Doc.Name, URL: Doc.URL, SignedUrl: Doc.SignedUrl, + SentToOthers: Doc?.SentToOthers || false, Description: Doc.Description, Note: Doc.Note, Placeholders: placeholdersArr, @@ -338,7 +339,7 @@ const ReportTable = (props) => { const sendMail = item?.SendMail || false; const getUrl = (x) => { //encode this url value `${item.objectId}/${x.Email}/${x.objectId}` to base64 using `btoa` function - if (x.objectId) { + if (x?.signerObjId) { const encodeBase64 = btoa( `${item.objectId}/${x.signerPtr.Email}/${x.signerPtr.objectId}/${sendMail}` ); @@ -495,9 +496,9 @@ const ReportTable = (props) => { // `handleSubjectChange` is used to add or change subject of resend mail const handleSubjectChange = (subject, doc) => { - const encodeBase64 = btoa( - `${doc.objectId}/${userDetails.Email}/${userDetails.objectId}` - ); + const encodeBase64 = userDetails?.objectId + ? btoa(`${doc.objectId}/${userDetails.Email}/${userDetails.objectId}`) + : btoa(`${doc.objectId}/${userDetails.Email}`); const expireDate = doc.ExpiryDate.iso; const newDate = new Date(expireDate); const localExpireDate = newDate.toLocaleDateString("en-US", { @@ -511,8 +512,8 @@ const ReportTable = (props) => { sender_name: doc.ExtUserPtr.Name, sender_mail: doc.ExtUserPtr.Email, sender_phone: doc.ExtUserPtr?.Phone || "", - receiver_name: userDetails.Name, - receiver_email: userDetails.Email, + receiver_name: userDetails?.Name, + receiver_email: userDetails?.Email, receiver_phone: userDetails?.Phone || "", expiry_date: localExpireDate, company_name: doc.ExtUserPtr.Company, @@ -524,9 +525,9 @@ const ReportTable = (props) => { }; // `handlebodyChange` is used to add or change body of resend mail const handlebodyChange = (body, doc) => { - const encodeBase64 = btoa( - `${doc.objectId}/${userDetails.Email}/${userDetails.objectId}` - ); + const encodeBase64 = userDetails?.objectId + ? btoa(`${doc.objectId}/${userDetails.Email}/${userDetails.objectId}`) + : btoa(`${doc.objectId}/${userDetails.Email}`); const expireDate = doc.ExpiryDate.iso; const newDate = new Date(expireDate); const localExpireDate = newDate.toLocaleDateString("en-US", { @@ -540,8 +541,8 @@ const ReportTable = (props) => { sender_name: doc.ExtUserPtr.Name, sender_mail: doc.ExtUserPtr.Email, sender_phone: doc.ExtUserPtr?.Phone || "", - receiver_name: userDetails.Name, - receiver_email: userDetails.Email, + receiver_name: userDetails?.Name || "", + receiver_email: userDetails?.Email || "", receiver_phone: userDetails?.Phone || "", expiry_date: localExpireDate, company_name: doc.ExtUserPtr.Company, @@ -556,8 +557,18 @@ const ReportTable = (props) => { // `handleNextBtn` is used to open edit mail template screen in resend mail modal // as well as replace variable with original one const handleNextBtn = (user, doc) => { - setUserDetails(user); - const encodeBase64 = btoa(`${doc.objectId}/${user.Email}/${user.objectId}`); + const userdata = { + Name: user?.signerPtr?.Name, + Email: user.email ? user?.email : user.signerPtr?.Email, + Phone: user?.signerPtr?.Phone, + objectId: user?.signerPtr?.objectId + }; + setUserDetails(userdata); + const encodeBase64 = user.email + ? btoa(`${doc.objectId}/${user.email}`) + : btoa( + `${doc.objectId}/${user.signerPtr.Email}/${user.signerPtr.objectId}` + ); const expireDate = doc.ExpiryDate.iso; const newDate = new Date(expireDate); const localExpireDate = newDate.toLocaleDateString("en-US", { @@ -571,9 +582,9 @@ const ReportTable = (props) => { sender_name: doc.ExtUserPtr.Name, sender_mail: doc.ExtUserPtr.Email, sender_phone: doc.ExtUserPtr?.Phone || "", - receiver_name: user.Name, - receiver_email: user.Email, - receiver_phone: user?.Phone || "", + receiver_name: user?.signerPtr?.Name || "", + receiver_email: user?.email ? user?.email : user?.signerPtr?.Email, + receiver_phone: user?.signerPtr?.Phone || "", expiry_date: localExpireDate, company_name: doc?.ExtUserPtr?.Company || "", signing_url: `<a href=${signPdf}>Sign here</a>` @@ -584,14 +595,14 @@ const ReportTable = (props) => { `{{sender_name}} has requested you to sign "{{document_title}}"`; const body = doc?.RequestBody || - `<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8' /></head><body><p>Hi {{receiver_name}},</p><br><p>We hope this email finds you well. {{sender_name}} has requested you to review and sign <b>"{{document_title}}"</b>.</p><p>Your signature is crucial to proceed with the next steps as it signifies your agreement and authorization.</p><br><p>{{signing_url}}</p><br><p>If you have any questions or need further clarification regarding the document or the signing process, please contact the sender.</p><br><p>Thanks</p><p> Team OpenSign™</p><br></body> </html>`; + `<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8' /></head><body><p>Hi {{receiver_name}},</p><br><p>We hope this email finds you well. {{sender_name}} has requested you to review and sign <b>"{{document_title}}"</b>.</p><p>Your signature is crucial to proceed with the next steps as it signifies your agreement and authorization.</p><br><p>{{signing_url}}</p><br><p>If you have any questions or need further clarification regarding the document or the signing process, please contact the sender.</p><br><p>Thanks</p><p> Team OpenSign™</p><br></body> </html>`; const res = replaceMailVaribles(subject, body, variables); setMail((prev) => ({ ...prev, subject: res.subject, body: res.body })); - setIsNextStep({ [user.objectId]: true }); + setIsNextStep({ [user.Id]: true }); }; const handleResendMail = async (e, doc, user) => { e.preventDefault(); - setActLoader({ [user.objectId]: true }); + setActLoader({ [user?.Id]: true }); const url = `${localStorage.getItem("baseUrl")}functions/sendmailv3`; const headers = { "Content-Type": "application/json", @@ -601,7 +612,7 @@ const ReportTable = (props) => { let params = { mailProvider: doc?.ExtUserPtr?.active_mail_adapter, extUserId: doc?.ExtUserPtr?.objectId, - recipient: userDetails.Email, + recipient: userDetails?.Email, subject: mail.subject, from: doc?.ExtUserPtr?.Email, html: mail.body @@ -633,9 +644,9 @@ const ReportTable = (props) => { } }; const fetchUserStatus = (user, doc) => { - const audit = doc?.AuditTrail?.find( - (x) => x.UserPtr.objectId === user.objectId - ); + const email = user.email ? user.email : user.signerPtr.Email; + const audit = doc?.AuditTrail?.find((x) => x.UserPtr.Email === email); + return ( <div className="flex flex-row gap-2 justify-center items-center"> <div className="flex justify-center items-center bg-gray-200 text-xs text-black shadow rounded-full w-[65px] h-[23px] cursor-default"> @@ -789,23 +800,38 @@ const ReportTable = (props) => { const getPlaceholder = item?.Placeholders; //condiiton to check role is exist or not if (getPlaceholder && getPlaceholder.length > 0) { - let extendUser = JSON.parse(localStorage.getItem("Extand_Class")); - const userName = extendUser[0]?.UserName; - setIsPublicUserName(extendUser[0]?.UserName); - //condition to check user have public url or not - if (userName) { - setIsPublic((prevStates) => ({ - ...prevStates, - [item.objectId]: e.target.checked - })); - const getPlaceholder = item?.Placeholders; - if (getPlaceholder.length === 1) { - setSelectedPublicRole(getPlaceholder[0]?.Role); - } + const checkIsSignatureExistt = getPlaceholder?.every((placeholderObj) => + placeholderObj?.placeHolder?.some((holder) => + holder?.pos?.some((posItem) => posItem?.type === "signature") + ) + ); + if (checkIsSignatureExistt) { + let extendUser = JSON.parse(localStorage.getItem("Extand_Class")); + const userName = extendUser[0]?.UserName; + setIsPublicUserName(extendUser[0]?.UserName); + //condition to check user have public url or not + if (userName) { + setIsPublic((prevStates) => ({ + ...prevStates, + [item.objectId]: e.target.checked + })); + const getPlaceholder = item?.Placeholders; + if (getPlaceholder.length === 1) { + setSelectedPublicRole(getPlaceholder[0]?.Role); + } - setIsMakePublic({ [item.objectId]: true }); + setIsMakePublic({ [item.objectId]: true }); + } else { + setIsPublicProfile({ [item.objectId]: true }); + } } else { - setIsPublicProfile({ [item.objectId]: true }); + setIsAlert(true); + setAlertMsg({ + type: "danger", + message: + " Please ensure there's at least one signature widget added for all recipients." + }); + setTimeout(() => setIsAlert(false), 5000); } } else { setIsAlert(true); @@ -813,7 +839,7 @@ const ReportTable = (props) => { type: "danger", message: "Please assign at least one role to make this template public." }); - setTimeout(() => setIsAlert(false), 3000); + setTimeout(() => setIsAlert(false), 5000); } }; @@ -1240,11 +1266,11 @@ const ReportTable = (props) => { }} > <div className=" overflow-y-auto max-h-[340px] md:max-h-[400px]"> - {item?.Signers.map((user) => ( - <React.Fragment key={user.objectId}> - {isNextStep[user.objectId] && ( + {item?.Placeholders?.map((user) => ( + <React.Fragment key={user.Id}> + {isNextStep[user.Id] && ( <div className="relative "> - {actLoader[user.objectId] && ( + {actLoader[user.Id] && ( <div className="absolute w-full h-full flex justify-center items-center bg-black bg-opacity-30 z-30"> <div style={{ @@ -1264,7 +1290,7 @@ const ReportTable = (props) => { > <div className="absolute right-5 text-xs z-40"> <Tooltip - id={`${user.objectId}_help`} + id={`${user.Id}_help`} message={ "You can use following variables which will get replaced with their actual values:- {{document_title}}, {{sender_name}}, {{sender_mail}}, {{sender_phone}}, {{receiver_name}}, {{receiver_email}}, {{receiver_phone}}, {{expiry_date}}, {{company_name}}, {{signing_url}}." } @@ -1322,7 +1348,12 @@ const ReportTable = (props) => { {Object?.keys(isNextStep) <= 0 && ( <div className="flex justify-between items-center gap-2 my-2 px-3"> <div className="text-black"> - {user.Name} {`<${user.Email}>`} + {user?.signerPtr?.Name || "-"}{" "} + {`<${ + user?.email + ? user.email + : user.signerPtr.Email + }>`} </div> <>{fetchUserStatus(user, item)}</> </div> diff --git a/apps/OpenSignServer/cloud/customRoute/v1/routes/CreateDocumentWithTemplate.js b/apps/OpenSignServer/cloud/customRoute/v1/routes/CreateDocumentWithTemplate.js index aa3d327ea..758ff7971 100644 --- a/apps/OpenSignServer/cloud/customRoute/v1/routes/CreateDocumentWithTemplate.js +++ b/apps/OpenSignServer/cloud/customRoute/v1/routes/CreateDocumentWithTemplate.js @@ -179,6 +179,7 @@ export default async function createDocumentWithTemplate(request, response) { } object.set('URL', template.URL); object.set('SignedUrl', template.URL); + object.set('SentToOthers', true); if (TimeToCompleteDays) { object.set('TimeToCompleteDays', TimeToCompleteDays); } diff --git a/apps/OpenSignServer/cloud/customRoute/v1/routes/createDocumentwithCoordinate.js b/apps/OpenSignServer/cloud/customRoute/v1/routes/createDocumentwithCoordinate.js index 32df43ad0..f00161a2b 100644 --- a/apps/OpenSignServer/cloud/customRoute/v1/routes/createDocumentwithCoordinate.js +++ b/apps/OpenSignServer/cloud/customRoute/v1/routes/createDocumentwithCoordinate.js @@ -141,6 +141,7 @@ export default async function createDocumentwithCoordinate(request, response) { } object.set('URL', fileUrl); object.set('SignedUrl', fileUrl); + object.set('SentToOthers', true); object.set('CreatedBy', userPtr); object.set('ExtUserPtr', extUserPtr); if (TimeToCompleteDays) { diff --git a/apps/OpenSignServer/cloud/parsefunction/createBatchDocs.js b/apps/OpenSignServer/cloud/parsefunction/createBatchDocs.js index 2f4aed714..602ddb9db 100644 --- a/apps/OpenSignServer/cloud/parsefunction/createBatchDocs.js +++ b/apps/OpenSignServer/cloud/parsefunction/createBatchDocs.js @@ -140,12 +140,14 @@ export default async function createBatchDocs(request) { : { ...y, signerPtr: {}, signerObjId: '' } ), SignedUrl: x.URL || x.SignedUrl, + SentToOthers: true, Signers: allSigner?.map(y => ({ __type: 'Pointer', className: 'contracts_Contactbook', objectId: y.objectId, })), ACL: Acl, + SentToOthers: true, RemindOnceInEvery: x.RemindOnceInEvery || 5, AutomaticReminders: x.AutomaticReminders || false, TimeToCompleteDays: x.TimeToCompleteDays || 15, From 74f66122712dff9e1a0e90e9feadc7c8146df155 Mon Sep 17 00:00:00 2001 From: RaktimaNXG <raktima.c@nxglabs.com> Date: Fri, 7 Jun 2024 19:33:28 +0530 Subject: [PATCH 092/106] refactor code --- apps/OpenSign/src/components/BulkSendUi.js | 1 + apps/OpenSign/src/pages/UserProfile.js | 94 +++--- .../src/primitives/GetReportDisplay.js | 293 +++++++++--------- 3 files changed, 198 insertions(+), 190 deletions(-) diff --git a/apps/OpenSign/src/components/BulkSendUi.js b/apps/OpenSign/src/components/BulkSendUi.js index 98ba5c0b8..6e4aa5e76 100644 --- a/apps/OpenSign/src/components/BulkSendUi.js +++ b/apps/OpenSign/src/components/BulkSendUi.js @@ -13,6 +13,7 @@ const BulkSendUi = (props) => { const allowedSigners = 50; useEffect(() => { signatureExist(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); //function to check atleast one signature field exist diff --git a/apps/OpenSign/src/pages/UserProfile.js b/apps/OpenSign/src/pages/UserProfile.js index cbc0d2429..a7599666e 100644 --- a/apps/OpenSign/src/pages/UserProfile.js +++ b/apps/OpenSign/src/pages/UserProfile.js @@ -1,4 +1,8 @@ -import React, { useState, useEffect, useRef } from "react"; +import React, { + useState, + useEffect + // useRef +} from "react"; import { Navigate, useNavigate } from "react-router-dom"; import Parse from "parse"; import { SaveFileSize } from "../constant/saveFileSize"; @@ -27,10 +31,10 @@ function UserProfile() { const [percentage, setpercentage] = useState(0); const [isDisableDocId, setIsDisableDocId] = useState(false); const [isSubscribe, setIsSubscribe] = useState(false); - const [publicUserName, setPublicUserName] = useState( - extendUser && extendUser?.[0]?.UserName - ); - const previousPublicUserName = useRef(publicUserName); + // const [publicUserName, setPublicUserName] = useState( + // extendUser && extendUser?.[0]?.UserName + // ); + // const previousPublicUserName = useRef(publicUserName); const [company, setCompany] = useState( extendUser && extendUser?.[0]?.Company ); @@ -41,7 +45,7 @@ function UserProfile() { const [otp, setOtp] = useState(""); const [otpLoader, setOtpLoader] = useState(false); const [isEmailVerified, setIsEmailVerified] = useState(false); - const [userNameError, setUserNameError] = useState(""); + // const [userNameError, setUserNameError] = useState(""); useEffect(() => { getUserDetail(); }, []); @@ -80,31 +84,31 @@ function UserProfile() { } }; //function to check public username already exist - const handleCheckPublicUserName = async () => { - try { - const res = await Parse.Cloud.run("getpublicusername", { - username: publicUserName - }); - if (res) { - setIsLoader(false); - setUserNameError("user name already exist"); - setTimeout(() => { - setUserNameError(""); - }, 3000); - return res; - } - } catch (e) { - console.log("error in getpublicusername cloud function"); - } - }; + // const handleCheckPublicUserName = async () => { + // try { + // const res = await Parse.Cloud.run("getpublicusername", { + // username: publicUserName + // }); + // if (res) { + // setIsLoader(false); + // setUserNameError("user name already exist"); + // setTimeout(() => { + // setUserNameError(""); + // }, 3000); + // return res; + // } + // } catch (e) { + // console.log("error in getpublicusername cloud function"); + // } + // }; const handleSubmit = async (e) => { e.preventDefault(); let phn = Phone, - res; + res = ""; //condition to call cloud function when user change publicUserName - if (previousPublicUserName.current !== publicUserName) { - res = await handleCheckPublicUserName(); - } + // if (previousPublicUserName.current !== publicUserName) { + // res = await handleCheckPublicUserName(); + // } if (!res) { setIsLoader(true); try { @@ -158,8 +162,8 @@ function UserProfile() { Name: obj.Name, HeaderDocId: isDisableDocId, JobTitle: jobTitle, - Company: company, - UserName: publicUserName || "" + Company: company + // UserName: publicUserName || "" }; await axios.put( @@ -273,23 +277,23 @@ function UserProfile() { alert("OTP sent on you email"); }; //function to handle onchange username and restrict 6-characters username for free users - const handleOnchangeUserName = (e) => { - const value = e.target.value; - if (value.length > 6 && !isSubscribe) { - setUserNameError("Please upgrade to allow more than 6 characters."); - setTimeout(() => { - setUserNameError(""); - }, 2000); - } else { - setPublicUserName(e.target.value); - } - }; + // const handleOnchangeUserName = (e) => { + // const value = e.target.value; + // if (value.length > 6 && !isSubscribe) { + // setUserNameError("Please upgrade to allow more than 6 characters."); + // setTimeout(() => { + // setUserNameError(""); + // }, 2000); + // } else { + // setPublicUserName(e.target.value); + // } + // }; const handleCancel = () => { setEditMode(false); SetName(localStorage.getItem("username")); SetPhone(UserProfile && UserProfile.phone); setImage(localStorage.getItem("profileImg")); - setPublicUserName(extendUser && extendUser?.[0]?.UserName); + // setPublicUserName(extendUser && extendUser?.[0]?.UserName); setCompany(extendUser && extendUser?.[0]?.Company); setJobTitle(extendUser?.[0]?.JobTitle); }; @@ -315,13 +319,13 @@ function UserProfile() { </div> ) : ( <div className="flex justify-center items-center w-full relative"> - {userNameError && ( + {/* {userNameError && ( <div className={`z-[1000] fixed top-[50%] transform border-[1px] text-sm border-[#f0a8a8] bg-[#f4bebe] text-[#c42121] rounded py-[.75rem] px-[1.25rem]`} > {userNameError} </div> - )} + )} */} <div className="bg-white flex flex-col justify-center shadow rounded w-[450px]"> <div className="flex flex-col justify-center items-center my-4"> <div className="w-[200px] h-[200px] overflow-hidden rounded-full"> @@ -449,7 +453,7 @@ function UserProfile() { )} </span> </li> - {isEnableSubscription && ( + {/* {isEnableSubscription && ( <li className="flex justify-between items-center border-t-[1px] border-gray-300 py-2 break-all"> <span className="font-semibold"> Public profile :{" "} @@ -479,7 +483,7 @@ function UserProfile() { )} </div> </li> - )} + )} */} <li className="border-y-[1px] border-gray-300 break-all"> <div className="flex justify-between items-center py-2"> <span diff --git a/apps/OpenSign/src/primitives/GetReportDisplay.js b/apps/OpenSign/src/primitives/GetReportDisplay.js index 45011e213..8d599aaac 100644 --- a/apps/OpenSign/src/primitives/GetReportDisplay.js +++ b/apps/OpenSign/src/primitives/GetReportDisplay.js @@ -6,8 +6,8 @@ import ModalUi from "./ModalUi"; import AddSigner from "../components/AddSigner"; import { modalSubmitBtnColor, - modalCancelBtnColor, - isEnableSubscription + modalCancelBtnColor + // isEnableSubscription } from "../constant/const"; import Alert from "./Alert"; import Tooltip from "./Tooltip"; @@ -15,8 +15,11 @@ import { RWebShare } from "react-web-share"; import Tour from "reactour"; import Parse from "parse"; import { saveAs } from "file-saver"; -import { copytoData, replaceMailVaribles } from "../constant/Utils"; -import Confetti from "react-confetti"; +import { + // copytoData, + replaceMailVaribles +} from "../constant/Utils"; +// import Confetti from "react-confetti"; import EditorToolbar, { module1, formats @@ -41,7 +44,7 @@ const ReportTable = (props) => { const [isTour, setIsTour] = useState(false); const [tourStatusArr, setTourStatusArr] = useState([]); const [isResendMail, setIsResendMail] = useState({}); - const [isMakePublic, setIsMakePublic] = useState({}); + // const [isMakePublic, setIsMakePublic] = useState({}); const [mail, setMail] = useState({ subject: "", body: "" }); const [userDetails, setUserDetails] = useState({}); const [isNextStep, setIsNextStep] = useState({}); @@ -49,12 +52,12 @@ const ReportTable = (props) => { const [templateDeatils, setTemplateDetails] = useState({}); const [placeholders, setPlaceholders] = useState([]); const [isLoader, setIsLoader] = useState({}); - const [selectedPublicRole, setSelectedPublicRole] = useState(""); - const [isCelebration, setIsCelebration] = useState(false); + // const [selectedPublicRole, setSelectedPublicRole] = useState(""); + // const [isCelebration, setIsCelebration] = useState(false); const [currentLists, setCurrentLists] = useState([]); - const [isPublic, setIsPublic] = useState({}); - const [isPublicProfile, setIsPublicProfile] = useState({}); - const [publicUserName, setIsPublicUserName] = useState(""); + // const [isPublic, setIsPublic] = useState({}); + // const [isPublicProfile, setIsPublicProfile] = useState({}); + // const [publicUserName, setIsPublicUserName] = useState(""); const [isViewShare, setIsViewShare] = useState({}); const startIndex = (currentPage - 1) * props.docPerPage; const { isMoreDocs, setIsNextRecord } = props; @@ -251,12 +254,12 @@ const ReportTable = (props) => { // `currentLists` is total record render on current page const currentList = props.List?.slice(indexOfFirstDoc, indexOfLastDoc); //check public template and save in a object to show public and private template - setIsPublic( - currentList.reduce((acc, item) => { - acc[item.objectId] = item?.IsPublic || false; - return acc; - }, {}) - ); + // setIsPublic( + // currentList.reduce((acc, item) => { + // acc[item.objectId] = item?.IsPublic || false; + // return acc; + // }, {}) + // ); setCurrentLists(currentList); // eslint-disable-next-line react-hooks/exhaustive-deps }, [indexOfLastDoc, indexOfFirstDoc]); @@ -321,16 +324,16 @@ const ReportTable = (props) => { setActLoader({}); } }; - const handleClose = (item) => { + const handleClose = () => { setIsRevoke({}); setIsDeleteModal({}); - setIsMakePublic({}); - setSelectedPublicRole(""); - setIsPublic((prevStates) => ({ - ...prevStates, - [item.objectId]: !prevStates[item.objectId] - })); - setIsPublicProfile({}); + // setIsMakePublic({}); + // setSelectedPublicRole(""); + // setIsPublic((prevStates) => ({ + // ...prevStates, + // [item.objectId]: !prevStates[item.objectId] + // })); + // setIsPublicProfile({}); }; const handleShare = (item) => { @@ -730,130 +733,130 @@ const ReportTable = (props) => { }; //function to make template public and set public role - const handlePublicTemplate = async (item) => { - if (selectedPublicRole || !isPublic[item.objectId]) { - setActLoader({ [item.objectId]: true }); - setIsMakePublic(false); - try { - const res = await Parse.Cloud.run("createpublictemplate", { - templateid: item.objectId, - ispublic: isPublic[item.objectId], - publicrole: [selectedPublicRole] - }); + // const handlePublicTemplate = async (item) => { + // if (selectedPublicRole || !isPublic[item.objectId]) { + // setActLoader({ [item.objectId]: true }); + // setIsMakePublic(false); + // try { + // const res = await Parse.Cloud.run("createpublictemplate", { + // templateid: item.objectId, + // ispublic: isPublic[item.objectId], + // publicrole: [selectedPublicRole] + // }); - if (res.status === "success") { - setIsAlert(true); - setTimeout(() => setIsAlert(false), 1500); - if (isPublic[item.objectId]) { - setAlertMsg({ - type: "success", - message: "You have successfully made the template public." - }); - setIsCelebration(true); - setTimeout(() => { - setIsCelebration(false); - }, 5000); - setIsPublicProfile({ [item.objectId]: isPublic[item.objectId] }); - } else { - setAlertMsg({ - type: "success", - message: "You have successfully made the template private." - }); - setSelectedPublicRole(""); - } - const updateList = props.List.map((x) => - x.objectId === item.objectId - ? { ...x, IsPublic: isPublic[item.objectId] } - : x - ); - props.setList(updateList); - setActLoader({}); - } - } catch (e) { - console.log("error in createpublictemplate", e); - setIsAlert(true); - setAlertMsg({ - type: "danger", - message: "Something went wrong, Please try again later!" - }); - setTimeout(() => setIsAlert(false), 1500); - setIsPublic((prevStates) => ({ - ...prevStates, - [item.objectId]: !prevStates[item.objectId] - })); - } - } else { - setIsAlert(true); - setAlertMsg({ - type: "danger", - message: "You need to select a role for the public signers." - }); - setTimeout(() => setIsAlert(false), 1500); - } - }; + // if (res.status === "success") { + // setIsAlert(true); + // setTimeout(() => setIsAlert(false), 1500); + // if (isPublic[item.objectId]) { + // setAlertMsg({ + // type: "success", + // message: "You have successfully made the template public." + // }); + // setIsCelebration(true); + // setTimeout(() => { + // setIsCelebration(false); + // }, 5000); + // setIsPublicProfile({ [item.objectId]: isPublic[item.objectId] }); + // } else { + // setAlertMsg({ + // type: "success", + // message: "You have successfully made the template private." + // }); + // setSelectedPublicRole(""); + // } + // const updateList = props.List.map((x) => + // x.objectId === item.objectId + // ? { ...x, IsPublic: isPublic[item.objectId] } + // : x + // ); + // props.setList(updateList); + // setActLoader({}); + // } + // } catch (e) { + // console.log("error in createpublictemplate", e); + // setIsAlert(true); + // setAlertMsg({ + // type: "danger", + // message: "Something went wrong, Please try again later!" + // }); + // setTimeout(() => setIsAlert(false), 1500); + // setIsPublic((prevStates) => ({ + // ...prevStates, + // [item.objectId]: !prevStates[item.objectId] + // })); + // } + // } else { + // setIsAlert(true); + // setAlertMsg({ + // type: "danger", + // message: "You need to select a role for the public signers." + // }); + // setTimeout(() => setIsAlert(false), 1500); + // } + // }; const handleViewSigners = (item) => { setIsViewShare({ [item.objectId]: true }); }; //function to handle change template status is public or private - const handlePublicChange = async (e, item) => { - const getPlaceholder = item?.Placeholders; - //condiiton to check role is exist or not - if (getPlaceholder && getPlaceholder.length > 0) { - const checkIsSignatureExistt = getPlaceholder?.every((placeholderObj) => - placeholderObj?.placeHolder?.some((holder) => - holder?.pos?.some((posItem) => posItem?.type === "signature") - ) - ); - if (checkIsSignatureExistt) { - let extendUser = JSON.parse(localStorage.getItem("Extand_Class")); - const userName = extendUser[0]?.UserName; - setIsPublicUserName(extendUser[0]?.UserName); - //condition to check user have public url or not - if (userName) { - setIsPublic((prevStates) => ({ - ...prevStates, - [item.objectId]: e.target.checked - })); - const getPlaceholder = item?.Placeholders; - if (getPlaceholder.length === 1) { - setSelectedPublicRole(getPlaceholder[0]?.Role); - } + // const handlePublicChange = async (e, item) => { + // const getPlaceholder = item?.Placeholders; + // //condiiton to check role is exist or not + // if (getPlaceholder && getPlaceholder.length > 0) { + // const checkIsSignatureExistt = getPlaceholder?.every((placeholderObj) => + // placeholderObj?.placeHolder?.some((holder) => + // holder?.pos?.some((posItem) => posItem?.type === "signature") + // ) + // ); + // if (checkIsSignatureExistt) { + // let extendUser = JSON.parse(localStorage.getItem("Extand_Class")); + // const userName = extendUser[0]?.UserName; + // setIsPublicUserName(extendUser[0]?.UserName); + // //condition to check user have public url or not + // if (userName) { + // setIsPublic((prevStates) => ({ + // ...prevStates, + // [item.objectId]: e.target.checked + // })); + // const getPlaceholder = item?.Placeholders; + // if (getPlaceholder.length === 1) { + // setSelectedPublicRole(getPlaceholder[0]?.Role); + // } - setIsMakePublic({ [item.objectId]: true }); - } else { - setIsPublicProfile({ [item.objectId]: true }); - } - } else { - setIsAlert(true); - setAlertMsg({ - type: "danger", - message: - " Please ensure there's at least one signature widget added for all recipients." - }); - setTimeout(() => setIsAlert(false), 5000); - } - } else { - setIsAlert(true); - setAlertMsg({ - type: "danger", - message: "Please assign at least one role to make this template public." - }); - setTimeout(() => setIsAlert(false), 5000); - } - }; + // setIsMakePublic({ [item.objectId]: true }); + // } else { + // setIsPublicProfile({ [item.objectId]: true }); + // } + // } else { + // setIsAlert(true); + // setAlertMsg({ + // type: "danger", + // message: + // " Please ensure there's at least one signature widget added for all recipients." + // }); + // setTimeout(() => setIsAlert(false), 5000); + // } + // } else { + // setIsAlert(true); + // setAlertMsg({ + // type: "danger", + // message: "Please assign at least one role to make this template public." + // }); + // setTimeout(() => setIsAlert(false), 5000); + // } + // }; //function to copy public profile links - const copytoProfileLink = () => { - const url = `https://opensign-me.vercel.app/${publicUserName}`; - copytoData(url); - setIsAlert(true); - setAlertMsg({ - type: "success", - message: "Copied." - }); - setTimeout(() => setIsAlert(false), 1500); - }; + // const copytoProfileLink = () => { + // const url = `https://opensign-me.vercel.app/${publicUserName}`; + // copytoData(url); + // setIsAlert(true); + // setAlertMsg({ + // type: "success", + // message: "Copied." + // }); + // setTimeout(() => setIsAlert(false), 1500); + // }; return ( <div className="relative"> @@ -866,11 +869,11 @@ const ReportTable = (props) => { </div> )} <div className="p-2 overflow-x-scroll w-full bg-white rounded-md"> - {isCelebration && ( + {/* {isCelebration && ( <div style={{ position: "relative", zIndex: "1000" }}> <Confetti width={window.innerWidth} height={window.innerHeight} /> </div> - )} + )} */} {isAlert && <Alert type={alertMsg.type}>{alertMsg.message}</Alert>} {props.tourData && props.ReportName === "Templates" && ( <Tour @@ -917,9 +920,9 @@ const ReportTable = (props) => { {props.actions?.length > 0 && ( <th className="px-4 py-2 font-thin">Action</th> )} - {props.ReportName === "Templates" && isEnableSubscription && ( + {/* {props.ReportName === "Templates" && isEnableSubscription && ( <th className="px-4 py-2 font-thin">Public</th> - )} + )} */} </tr> </thead> <tbody className="text-[12px]"> @@ -1364,7 +1367,7 @@ const ReportTable = (props) => { </ModalUi> )} </td> - {isEnableSubscription && ( + {/* {isEnableSubscription && ( <td className=" pl-[20px] py-2 "> {props.ReportName === "Templates" && ( <div className=" flex flex-row-"> @@ -1527,7 +1530,7 @@ const ReportTable = (props) => { </ModalUi> )} </td> - )} + )} */} </tr> ) )} From 90b5e3c860139982564a7e60c60589fcbe04ee87 Mon Sep 17 00:00:00 2001 From: RaktimaNXG <raktima.c@nxglabs.com> Date: Fri, 7 Jun 2024 19:55:40 +0530 Subject: [PATCH 093/106] fix: exist contact not recieving maiin in quick send flow --- apps/OpenSignServer/cloud/parsefunction/createBatchDocs.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/OpenSignServer/cloud/parsefunction/createBatchDocs.js b/apps/OpenSignServer/cloud/parsefunction/createBatchDocs.js index 602ddb9db..d04ece47b 100644 --- a/apps/OpenSignServer/cloud/parsefunction/createBatchDocs.js +++ b/apps/OpenSignServer/cloud/parsefunction/createBatchDocs.js @@ -35,8 +35,10 @@ async function sendMail(document, sessionToken) { const objectId = signerMail[i]?.signerObjId; const hostUrl = baseUrl.origin; let encodeBase64; + let existSigner = {}; if (objectId) { - encodeBase64 = btoa(`${document.objectId}/${signerMail[i].signerPtr.Email}/${objectId}`); + existSigner = document?.Signers?.find(user => user.objectId === objectId); + encodeBase64 = btoa(`${document.objectId}/${existSigner?.Email}/${objectId}`); } else { encodeBase64 = btoa(`${document.objectId}/${signerMail[i].email}`); } @@ -46,7 +48,7 @@ async function sendMail(document, sessionToken) { const themeBGcolor = '#47a3ad'; let params = { extUserId: document.ExtUserPtr.objectId, - recipient: objectId ? signerMail[i].signerPtr.Email : signerMail[i].email, + recipient: objectId ? existSigner?.Email : signerMail[i].email, subject: `${document.ExtUserPtr.Name} has requested you to sign "${document.Name}"`, mailProvider: document?.ExtUserPtr?.active_mail_adapter || '', from: sender, From 9aa31665288b9b0c81ba97068eab596df31d1148 Mon Sep 17 00:00:00 2001 From: RaktimaNXG <raktima.c@nxglabs.com> Date: Mon, 10 Jun 2024 11:24:35 +0530 Subject: [PATCH 094/106] fix: second signer is not receiving the signature request email in the quick-send process. --- apps/OpenSign/src/pages/PdfRequestFiles.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/apps/OpenSign/src/pages/PdfRequestFiles.js b/apps/OpenSign/src/pages/PdfRequestFiles.js index 426a3aadf..744095aba 100644 --- a/apps/OpenSign/src/pages/PdfRequestFiles.js +++ b/apps/OpenSign/src/pages/PdfRequestFiles.js @@ -411,10 +411,10 @@ function PdfRequestFiles() { if (emailExist) { placeholdersOrSigners.push(placeholder); } else { - const getSignerData = documentData[0].Signers.filter( + const getSignerData = documentData[0].Signers.find( (data) => data.objectId === placeholder?.signerObjId ); - placeholdersOrSigners.push(getSignerData[0]); + placeholdersOrSigners.push(getSignerData); } } //condition to check already signed document by someone @@ -799,7 +799,9 @@ function PdfRequestFiles() { Email: pdfDetails?.[0]?.Placeholders[newIndex]?.email || "" }; const user = - usermail?.Email || pdfDetails?.[0]?.Signers[newIndex]; + (usermail?.Email && usermail) || + pdfDetails?.[0]?.Signers[newIndex]; + console.log("user", user); if (sendmail !== "false" && sendInOrder) { const requestBody = pdfDetails?.[0]?.RequestBody; const requestSubject = pdfDetails?.[0]?.RequestSubject; From 901ddf35bb26ada8d5515195ec94cec3ac61ddb9 Mon Sep 17 00:00:00 2001 From: RaktimaNXG <raktima.c@nxglabs.com> Date: Mon, 10 Jun 2024 11:43:56 +0530 Subject: [PATCH 095/106] remove console --- apps/OpenSign/src/pages/PdfRequestFiles.js | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/OpenSign/src/pages/PdfRequestFiles.js b/apps/OpenSign/src/pages/PdfRequestFiles.js index 744095aba..7211d381c 100644 --- a/apps/OpenSign/src/pages/PdfRequestFiles.js +++ b/apps/OpenSign/src/pages/PdfRequestFiles.js @@ -801,7 +801,6 @@ function PdfRequestFiles() { const user = (usermail?.Email && usermail) || pdfDetails?.[0]?.Signers[newIndex]; - console.log("user", user); if (sendmail !== "false" && sendInOrder) { const requestBody = pdfDetails?.[0]?.RequestBody; const requestSubject = pdfDetails?.[0]?.RequestSubject; From f14e301b6c75716de5f7acb106c662ba5cf27081 Mon Sep 17 00:00:00 2001 From: RaktimaNXG <raktima.c@nxglabs.com> Date: Mon, 10 Jun 2024 12:15:48 +0530 Subject: [PATCH 096/106] fix: change condition of email send --- apps/OpenSign/src/pages/PdfRequestFiles.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/OpenSign/src/pages/PdfRequestFiles.js b/apps/OpenSign/src/pages/PdfRequestFiles.js index 7211d381c..d5806506e 100644 --- a/apps/OpenSign/src/pages/PdfRequestFiles.js +++ b/apps/OpenSign/src/pages/PdfRequestFiles.js @@ -798,9 +798,9 @@ function PdfRequestFiles() { const usermail = { Email: pdfDetails?.[0]?.Placeholders[newIndex]?.email || "" }; - const user = - (usermail?.Email && usermail) || - pdfDetails?.[0]?.Signers[newIndex]; + const user = usermail?.Email + ? usermail + : pdfDetails?.[0]?.Signers[newIndex]; if (sendmail !== "false" && sendInOrder) { const requestBody = pdfDetails?.[0]?.RequestBody; const requestSubject = pdfDetails?.[0]?.RequestSubject; From 69140d2139509682da3c9302c36b7ee7e5b9183d Mon Sep 17 00:00:00 2001 From: RaktimaNXG <raktima.c@nxglabs.com> Date: Mon, 10 Jun 2024 18:14:28 +0530 Subject: [PATCH 097/106] fix: a mismatch permits a signer placeholder to sign any placeholder not allocated to that signer issue in the quick send flow. --- apps/OpenSign/src/pages/PdfRequestFiles.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/OpenSign/src/pages/PdfRequestFiles.js b/apps/OpenSign/src/pages/PdfRequestFiles.js index d5806506e..75b918126 100644 --- a/apps/OpenSign/src/pages/PdfRequestFiles.js +++ b/apps/OpenSign/src/pages/PdfRequestFiles.js @@ -265,7 +265,9 @@ function PdfRequestFiles() { currUserId ); } - setSignerObjectId(currUserId); + if (currUserId) { + setSignerObjectId(currUserId); + } if (documentData[0].SignedUrl) { setPdfUrl(documentData[0].SignedUrl); } else { From 7bacca1f78029907e7f16d409606ea76a784820d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Jun 2024 15:51:30 +0000 Subject: [PATCH 098/106] build(deps-dev): bump @babel/eslint-parser in /apps/OpenSignServer Bumps [@babel/eslint-parser](https://github.com/babel/babel/tree/HEAD/eslint/babel-eslint-parser) from 7.24.6 to 7.24.7. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.24.7/eslint/babel-eslint-parser) --- updated-dependencies: - dependency-name: "@babel/eslint-parser" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> --- apps/OpenSignServer/package-lock.json | 8 ++++---- apps/OpenSignServer/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/OpenSignServer/package-lock.json b/apps/OpenSignServer/package-lock.json index 09b5bf8d8..6938f4ff1 100644 --- a/apps/OpenSignServer/package-lock.json +++ b/apps/OpenSignServer/package-lock.json @@ -38,7 +38,7 @@ "posthog-node": "^4.0.1" }, "devDependencies": { - "@babel/eslint-parser": "^7.24.6", + "@babel/eslint-parser": "^7.24.7", "eslint": "^9.3.0", "jasmine": "^5.1.0", "mongodb-runner": "^5.6.2", @@ -1303,9 +1303,9 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.24.6.tgz", - "integrity": "sha512-Q1BfQX42zXHx732PLW0w4+Y3wJjoZKEMaatFUEAmQ7Z+jCXxinzeqX9bvv2Q8xNPes/H6F0I23oGkcgjaItmLw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.24.7.tgz", + "integrity": "sha512-SO5E3bVxDuxyNxM5agFv480YA2HO6ohZbGxbazZdIk3KQOPOGVNw6q78I9/lbviIf95eq6tPozeYnJLbjnC8IA==", "dev": true, "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", diff --git a/apps/OpenSignServer/package.json b/apps/OpenSignServer/package.json index db7bcdef0..ccf298f77 100644 --- a/apps/OpenSignServer/package.json +++ b/apps/OpenSignServer/package.json @@ -48,7 +48,7 @@ }, "type": "module", "devDependencies": { - "@babel/eslint-parser": "^7.24.6", + "@babel/eslint-parser": "^7.24.7", "eslint": "^9.3.0", "jasmine": "^5.1.0", "mongodb-runner": "^5.6.2", From 685e09d406a6803d7461ab0fd499578af1a92644 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Jun 2024 16:00:25 +0000 Subject: [PATCH 099/106] build(deps-dev): bump @babel/runtime-corejs2 in /apps/OpenSign Bumps [@babel/runtime-corejs2](https://github.com/babel/babel/tree/HEAD/packages/babel-runtime-corejs2) from 7.24.6 to 7.24.7. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.24.7/packages/babel-runtime-corejs2) --- updated-dependencies: - dependency-name: "@babel/runtime-corejs2" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> --- apps/OpenSign/package-lock.json | 8 ++++---- apps/OpenSign/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/OpenSign/package-lock.json b/apps/OpenSign/package-lock.json index cf5215567..34aa28472 100644 --- a/apps/OpenSign/package-lock.json +++ b/apps/OpenSign/package-lock.json @@ -55,7 +55,7 @@ "web-vitals": "^4.0.1" }, "devDependencies": { - "@babel/runtime-corejs2": "^7.24.6", + "@babel/runtime-corejs2": "^7.24.7", "autoprefixer": "^10.4.19", "commitizen": "^4.3.0", "eslint": "^8.57.0", @@ -2000,9 +2000,9 @@ } }, "node_modules/@babel/runtime-corejs2": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.24.6.tgz", - "integrity": "sha512-5UK2PnfpmiCftYGBeJ+SpFIMNaoMPU/eQt1P5ISx0TB7nGGzEMLT4/3PapNZEfGZh+nGxGOGj2t59prGFBhunQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.24.7.tgz", + "integrity": "sha512-+Lf6xofiPZLtFwNkpjGHPgJck4b22Yo8h9+WHf3bEbS4ikOyOMNtJk6HSTolEQ2irH1XSoeguaCkrkcgyThrMA==", "dev": true, "dependencies": { "core-js": "^2.6.12", diff --git a/apps/OpenSign/package.json b/apps/OpenSign/package.json index b7babd10b..71bf6e3dd 100644 --- a/apps/OpenSign/package.json +++ b/apps/OpenSign/package.json @@ -85,7 +85,7 @@ } }, "devDependencies": { - "@babel/runtime-corejs2": "^7.24.6", + "@babel/runtime-corejs2": "^7.24.7", "autoprefixer": "^10.4.19", "commitizen": "^4.3.0", "eslint": "^8.57.0", From 01eed3664b457c1a5705d72142f0cdf250d1dc95 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Jun 2024 16:00:42 +0000 Subject: [PATCH 100/106] build(deps-dev): bump tailwindcss from 3.4.3 to 3.4.4 in /apps/OpenSign Bumps [tailwindcss](https://github.com/tailwindlabs/tailwindcss) from 3.4.3 to 3.4.4. - [Release notes](https://github.com/tailwindlabs/tailwindcss/releases) - [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/v3.4.4/CHANGELOG.md) - [Commits](https://github.com/tailwindlabs/tailwindcss/compare/v3.4.3...v3.4.4) --- updated-dependencies: - dependency-name: tailwindcss dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> --- apps/OpenSign/package-lock.json | 8 ++++---- apps/OpenSign/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/OpenSign/package-lock.json b/apps/OpenSign/package-lock.json index cf5215567..f6469dde6 100644 --- a/apps/OpenSign/package-lock.json +++ b/apps/OpenSign/package-lock.json @@ -65,7 +65,7 @@ "postcss": "^8.4.38", "prettier": "^2.8.8", "pretty-quick": "^3.3.1", - "tailwindcss": "^3.4.3" + "tailwindcss": "^3.4.4" } }, "node_modules/@alloc/quick-lru": { @@ -22700,9 +22700,9 @@ "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==" }, "node_modules/tailwindcss": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", - "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.4.tgz", + "integrity": "sha512-ZoyXOdJjISB7/BcLTR6SEsLgKtDStYyYZVLsUtWChO4Ps20CBad7lfJKVDiejocV4ME1hLmyY0WJE3hSDcmQ2A==", "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", diff --git a/apps/OpenSign/package.json b/apps/OpenSign/package.json index b7babd10b..707c95209 100644 --- a/apps/OpenSign/package.json +++ b/apps/OpenSign/package.json @@ -95,7 +95,7 @@ "postcss": "^8.4.38", "prettier": "^2.8.8", "pretty-quick": "^3.3.1", - "tailwindcss": "^3.4.3" + "tailwindcss": "^3.4.4" }, "overrides": { "nth-check": "$nth-check" From 65eef5739d70ff7e8ef89a9be8e5c800f5677090 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Jun 2024 22:22:20 +0000 Subject: [PATCH 101/106] build(deps): bump @grpc/grpc-js in /apps/OpenSignServer Bumps [@grpc/grpc-js](https://github.com/grpc/grpc-node) from 1.10.8 to 1.10.9. - [Release notes](https://github.com/grpc/grpc-node/releases) - [Commits](https://github.com/grpc/grpc-node/compare/@grpc/grpc-js@1.10.8...@grpc/grpc-js@1.10.9) --- updated-dependencies: - dependency-name: "@grpc/grpc-js" dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> --- apps/OpenSignServer/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/OpenSignServer/package-lock.json b/apps/OpenSignServer/package-lock.json index 09b5bf8d8..6b6eb61f8 100644 --- a/apps/OpenSignServer/package-lock.json +++ b/apps/OpenSignServer/package-lock.json @@ -1906,9 +1906,9 @@ } }, "node_modules/@grpc/grpc-js": { - "version": "1.10.8", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.8.tgz", - "integrity": "sha512-vYVqYzHicDqyKB+NQhAc54I1QWCBLCrYG6unqOIcBTHx+7x8C9lcoLj3KVJXs2VB4lUbpWY+Kk9NipcbXYWmvg==", + "version": "1.10.9", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.9.tgz", + "integrity": "sha512-5tcgUctCG0qoNyfChZifz2tJqbRbXVO9J7X6duFcOjY3HUNCxg5D0ZCK7EP9vIcZ0zRpLU9bWkyCqVCLZ46IbQ==", "optional": true, "dependencies": { "@grpc/proto-loader": "^0.7.13", From 07c0390401e98e1c30d127f580fb15b645247747 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Jun 2024 22:27:00 +0000 Subject: [PATCH 102/106] build(deps): bump braces from 3.0.2 to 3.0.3 in /apps/OpenSignServer Bumps [braces](https://github.com/micromatch/braces) from 3.0.2 to 3.0.3. - [Changelog](https://github.com/micromatch/braces/blob/master/CHANGELOG.md) - [Commits](https://github.com/micromatch/braces/compare/3.0.2...3.0.3) --- updated-dependencies: - dependency-name: braces dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> --- apps/OpenSignServer/package-lock.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/apps/OpenSignServer/package-lock.json b/apps/OpenSignServer/package-lock.json index c5d49a9c9..d736603ab 100644 --- a/apps/OpenSignServer/package-lock.json +++ b/apps/OpenSignServer/package-lock.json @@ -4300,11 +4300,11 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -5761,9 +5761,9 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dependencies": { "to-regex-range": "^5.0.1" }, From bc77a9b0a11bf7ca0ad3c879ce3aeb2ffcfbac76 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Jun 2024 22:27:19 +0000 Subject: [PATCH 103/106] build(deps-dev): bump braces from 3.0.2 to 3.0.3 Bumps [braces](https://github.com/micromatch/braces) from 3.0.2 to 3.0.3. - [Changelog](https://github.com/micromatch/braces/blob/master/CHANGELOG.md) - [Commits](https://github.com/micromatch/braces/compare/3.0.2...3.0.3) --- updated-dependencies: - dependency-name: braces dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> --- package-lock.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index bc1cd89fe..05f399c8c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -54,12 +54,12 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -196,9 +196,9 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "dependencies": { "to-regex-range": "^5.0.1" From 06d4c9aeaf951d994c089ad816c20aac2997816b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Jun 2024 22:27:44 +0000 Subject: [PATCH 104/106] build(deps-dev): bump nodemon in /apps/OpenSignServer Bumps [nodemon](https://github.com/remy/nodemon) from 3.1.1 to 3.1.3. - [Release notes](https://github.com/remy/nodemon/releases) - [Commits](https://github.com/remy/nodemon/compare/v3.1.1...v3.1.3) --- updated-dependencies: - dependency-name: nodemon dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> --- apps/OpenSignServer/package-lock.json | 8 ++++---- apps/OpenSignServer/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/OpenSignServer/package-lock.json b/apps/OpenSignServer/package-lock.json index 95d8bb814..26492c81b 100644 --- a/apps/OpenSignServer/package-lock.json +++ b/apps/OpenSignServer/package-lock.json @@ -42,7 +42,7 @@ "eslint": "^9.3.0", "jasmine": "^5.1.0", "mongodb-runner": "^5.6.2", - "nodemon": "^3.1.2", + "nodemon": "^3.1.3", "nyc": "15.1.0", "prettier": "^3.3.0", "uglify-js": "^3.17.4" @@ -8365,9 +8365,9 @@ } }, "node_modules/nodemon": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.2.tgz", - "integrity": "sha512-/Ib/kloefDy+N0iRTxIUzyGcdW9lzlnca2Jsa5w73bs3npXjg+WInmiX6VY13mIb6SykkthYX/U5t0ukryGqBw==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.3.tgz", + "integrity": "sha512-m4Vqs+APdKzDFpuaL9F9EVOF85+h070FnkHVEoU4+rmT6Vw0bmNl7s61VEkY/cJkL7RCv1p4urnUDUMrS5rk2w==", "dev": true, "dependencies": { "chokidar": "^3.5.2", diff --git a/apps/OpenSignServer/package.json b/apps/OpenSignServer/package.json index 4926615fd..d6703bab8 100644 --- a/apps/OpenSignServer/package.json +++ b/apps/OpenSignServer/package.json @@ -52,7 +52,7 @@ "eslint": "^9.3.0", "jasmine": "^5.1.0", "mongodb-runner": "^5.6.2", - "nodemon": "^3.1.2", + "nodemon": "^3.1.3", "nyc": "15.1.0", "prettier": "^3.3.0", "uglify-js": "^3.17.4" From ec68479e98a65e2225a1abebadbf85b583d515a5 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <93375423+prafull-opensignlabs@users.noreply.github.com> Date: Tue, 11 Jun 2024 11:32:37 +0530 Subject: [PATCH 105/106] fix: Ensure real-time updates to records in reports after actions are performed --- .../src/primitives/GetReportDisplay.js | 31 ++++++++++--------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/apps/OpenSign/src/primitives/GetReportDisplay.js b/apps/OpenSign/src/primitives/GetReportDisplay.js index 8d599aaac..94b1000bb 100644 --- a/apps/OpenSign/src/primitives/GetReportDisplay.js +++ b/apps/OpenSign/src/primitives/GetReportDisplay.js @@ -54,7 +54,7 @@ const ReportTable = (props) => { const [isLoader, setIsLoader] = useState({}); // const [selectedPublicRole, setSelectedPublicRole] = useState(""); // const [isCelebration, setIsCelebration] = useState(false); - const [currentLists, setCurrentLists] = useState([]); + // const [currentLists, setCurrentLists] = useState([]); // const [isPublic, setIsPublic] = useState({}); // const [isPublicProfile, setIsPublicProfile] = useState({}); // const [publicUserName, setIsPublicUserName] = useState(""); @@ -250,19 +250,20 @@ const ReportTable = (props) => { // Get current list const indexOfLastDoc = currentPage * props.docPerPage; const indexOfFirstDoc = indexOfLastDoc - props.docPerPage; - useEffect(() => { - // `currentLists` is total record render on current page - const currentList = props.List?.slice(indexOfFirstDoc, indexOfLastDoc); - //check public template and save in a object to show public and private template - // setIsPublic( - // currentList.reduce((acc, item) => { - // acc[item.objectId] = item?.IsPublic || false; - // return acc; - // }, {}) - // ); - setCurrentLists(currentList); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [indexOfLastDoc, indexOfFirstDoc]); + const currentList = props.List?.slice(indexOfFirstDoc, indexOfLastDoc); + // useEffect(() => { + // // `currentLists` is total record render on current page + // const currentList = props.List?.slice(indexOfFirstDoc, indexOfLastDoc); + // //check public template and save in a object to show public and private template + // // setIsPublic( + // // currentList.reduce((acc, item) => { + // // acc[item.objectId] = item?.IsPublic || false; + // // return acc; + // // }, {}) + // // ); + // setCurrentLists(currentList); + // // eslint-disable-next-line react-hooks/exhaustive-deps + // }, [indexOfLastDoc, indexOfFirstDoc]); // Change page const paginateFront = () => setCurrentPage(currentPage + 1); @@ -928,7 +929,7 @@ const ReportTable = (props) => { <tbody className="text-[12px]"> {props.List?.length > 0 && ( <> - {currentLists.map((item, index) => + {currentList.map((item, index) => props.ReportName === "Contactbook" ? ( <tr className="border-y-[1px]" key={index}> {props.heading.includes("Sr.No") && ( From 655401e04b6a6e9c41afebbfeec4a919a01affb5 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <93375423+prafull-opensignlabs@users.noreply.github.com> Date: Wed, 12 Jun 2024 11:10:25 +0530 Subject: [PATCH 106/106] "Fix: Third contact is not receiving mail when second contact is non-existent." --- .../cloud/parsefunction/linkContactToDoc.js | 37 ++++++++++++++----- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/apps/OpenSignServer/cloud/parsefunction/linkContactToDoc.js b/apps/OpenSignServer/cloud/parsefunction/linkContactToDoc.js index 6c433a8fd..ba2c5a44b 100644 --- a/apps/OpenSignServer/cloud/parsefunction/linkContactToDoc.js +++ b/apps/OpenSignServer/cloud/parsefunction/linkContactToDoc.js @@ -81,11 +81,16 @@ export default async function linkContactToDoc(req) { const updateDoc = new Parse.Object('contracts_Document'); updateDoc.id = docId; const signers = _docRes?.Signers || []; - signers.push({ + const signerobj = { __type: 'Pointer', className: 'contracts_Contactbook', objectId: existContact.id, - }); + }; + // The splice method is used to add a signer at the desired index + // index is the variable where the signer needs to be added + // 0 indicates that no elements should be deleted + // signerobj is the reference to the signer object + signers.splice(index, 0, signerobj); updateDoc.set('Signers', signers); Placeholders[index] = { @@ -128,11 +133,16 @@ export default async function linkContactToDoc(req) { const updateDoc = new Parse.Object('contracts_Document'); updateDoc.id = docId; const signers = _docRes?.Signers || []; - signers.push({ + const signerobj = { __type: 'Pointer', className: 'contracts_Contactbook', objectId: contactRes.id, - }); + }; + // The splice method is used to add a signer at the desired index + // index is the variable where the signer needs to be added + // 0 indicates that no elements should be deleted + // signerobj is the reference to the signer object + signers.splice(index, 0, signerobj); updateDoc.set('Signers', signers); Placeholders[index] = { @@ -175,11 +185,16 @@ export default async function linkContactToDoc(req) { const updateDoc = new Parse.Object('contracts_Document'); updateDoc.id = docId; const signers = _docRes?.Signers || []; - signers.push({ + const signerobj = { __type: 'Pointer', className: 'contracts_Contactbook', objectId: contactRes.id, - }); + }; + // The splice method is used to add a signer at the desired index + // index is the variable where the signer needs to be added + // 0 indicates that no elements should be deleted + // signerobj is the reference to the signer object + signers.splice(index, 0, signerobj); updateDoc.set('Signers', signers); Placeholders[index] = { @@ -227,13 +242,17 @@ export default async function linkContactToDoc(req) { const updateDoc = new Parse.Object('contracts_Document'); updateDoc.id = docId; const signers = _docRes?.Signers || []; - signers.push({ + const signerobj = { __type: 'Pointer', className: 'contracts_Contactbook', objectId: contactRes.id, - }); + }; + // The splice method is used to add a signer at the desired index + // index is the variable where the signer needs to be added + // 0 indicates that no elements should be deleted + // signerobj is the reference to the signer object + signers.splice(index, 0, signerobj); updateDoc.set('Signers', signers); - Placeholders[index] = { ...Placeholders[index], signerObjId: contactRes.id,