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 01/41] 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 02/41] 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 dc392adc1de46282cf5bdeb87fb612daf1c97ad3 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs Date: Tue, 14 May 2024 19:19:17 +0530 Subject: [PATCH 03/41] feat: add delete folder API --- .../cloud/customRoute/v1/apiV1.js | 4 + .../customRoute/v1/routes/deleteFolder.js | 74 +++++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 apps/OpenSignServer/cloud/customRoute/v1/routes/deleteFolder.js diff --git a/apps/OpenSignServer/cloud/customRoute/v1/apiV1.js b/apps/OpenSignServer/cloud/customRoute/v1/apiV1.js index 867607f22..ac33cff5a 100644 --- a/apps/OpenSignServer/cloud/customRoute/v1/apiV1.js +++ b/apps/OpenSignServer/cloud/customRoute/v1/apiV1.js @@ -30,6 +30,7 @@ import getFolder from './routes/getFolder.js'; import createFolder from './routes/createFolder.js'; import updateFolder from './routes/updateFolder.js'; import getFolderList from './routes/getFolderList.js'; +import deleteFolder from './routes/deleteFolder.js'; dotenv.config(); const storage = multer.memoryStorage(); const upload = multer({ storage: storage }); @@ -116,6 +117,9 @@ app.post('/createfolder', createFolder); // update folder app.put('/folder/:folder_id', updateFolder); +// get folder list +app.delete('/folder/:folder_id', deleteFolder); + // get folder app.get('/folder/:folder_id', getFolder); diff --git a/apps/OpenSignServer/cloud/customRoute/v1/routes/deleteFolder.js b/apps/OpenSignServer/cloud/customRoute/v1/routes/deleteFolder.js new file mode 100644 index 000000000..d443eb390 --- /dev/null +++ b/apps/OpenSignServer/cloud/customRoute/v1/routes/deleteFolder.js @@ -0,0 +1,74 @@ +export default async function deleteFolder(request, response) { + const apiToken = request.headers['x-api-token']; + const folderId = request.params.folder_id; + if (!apiToken) { + return response.status(400).json({ error: 'Please Provide API Token' }); + } + try { + const tokenQuery = new Parse.Query('appToken'); + tokenQuery.equalTo('token', apiToken); + tokenQuery.include('userId'); + const token = await tokenQuery.first({ useMasterKey: true }); + if (token !== undefined) { + // Valid Token then proceed request + const parseUser = JSON.parse(JSON.stringify(token)); + const userPtr = { + __type: 'Pointer', + className: '_User', + objectId: parseUser.userId.objectId, + }; + + const obj = new Parse.Query('contracts_Document'); + obj.equalTo('objectId', folderId); + obj.equalTo('IsArchive', true); + obj.equalTo('CreatedBy', userPtr); + const isFolderDeleted = await obj.first({ useMasterKey: true }); + if (!isFolderDeleted) { + const folder = new Parse.Query('contracts_Document'); + folder.equalTo('Folder', { + __type: 'Pointer', + className: 'contracts_Document', + objectId: folderId, + }); + + folder.notEqualTo('IsArchive', true); + folder.equalTo('CreatedBy', userPtr); + folder.equalTo('Type', 'Folder'); + const isSubItems = await folder.first({ useMasterKey: true }); + // console.log('isSubItems ', isSubItems); + if (isSubItems) { + return response + .status(400) + .json({ error: 'folder is not empty, contains document or folder.' }); + } else { + const deleteFolder = new Parse.Object('contracts_Document'); + deleteFolder.id = folderId; + deleteFolder.set('IsArchive', true); + const deleteRes = await deleteFolder.save(null, { useMasterKey: true }); + if (request.posthog) { + request.posthog?.capture({ + distinctId: parseUser.userId.email, + event: 'api_delete_folder', + properties: { response_code: 200 }, + }); + } + return response.json({ objectId: deleteRes.id, deletedAt: deleteRes.updatedAt }); + } + } else { + if (request.posthog) { + request.posthog?.capture({ + distinctId: parseUser.userId.email, + event: 'api_delete_folder', + properties: { response_code: 404 }, + }); + } + return response.status(404).json({ error: 'folder not found.' }); + } + } else { + return response.status(405).json({ error: 'Invalid API Token!' }); + } + } catch (err) { + console.log('err is delete folder API', err); + return response.status(400).json({ error: 'Something went wrong, please try again later!' }); + } +} From 067ea68d3bd28aaaa253611d9a3d051f76440264 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs Date: Wed, 15 May 2024 13:25:13 +0530 Subject: [PATCH 04/41] feat: add download button in 3 dots beside finish button --- apps/OpenSign/src/components/pdf/PdfHeader.js | 111 ++++++++++++------ 1 file changed, 72 insertions(+), 39 deletions(-) diff --git a/apps/OpenSign/src/components/pdf/PdfHeader.js b/apps/OpenSign/src/components/pdf/PdfHeader.js index da0c45bc1..7a019ed39 100644 --- a/apps/OpenSign/src/components/pdf/PdfHeader.js +++ b/apps/OpenSign/src/components/pdf/PdfHeader.js @@ -326,7 +326,7 @@ function Header({ ) : ( -
+
{/* current signer is checking user send request and check status of pdf sign than if current user exist than show finish button else no */} @@ -334,16 +334,8 @@ function Header({ <> {decline && (
{ - handleDeclinePdfAlert(); - }} - style={{ - color: "red", - border: "none", - fontWeight: "650", - fontSize: "16px", - marginRight: "10px" - }} + onClick={() => handleDeclinePdfAlert()} + className="text-[red] border-none font-[650] text-[14px] mr-2" > Decline
@@ -355,12 +347,8 @@ function Header({ alertSendEmail(); } }} - style={{ - color: isMailSend ? "gray" : themeColor, - border: "none", - fontWeight: "650", - fontSize: "16px" - }} + className="border-none font-[650] text-[14px]" + style={{ color: isMailSend ? "gray" : themeColor }} data-tut={dataTut4} > {completeBtnTitle ? completeBtnTitle : "Send"} @@ -375,16 +363,42 @@ function Header({ embedWidgetsData(); } }} - style={{ - color: themeColor, - border: "none", - fontWeight: "650", - fontSize: "16px" - }} + style={{ color: themeColor }} + className="border-none font-[650] text-[14px]" > Finish
)} + + +
+ +
+
+ + + handleDownloadPdf()} + > + + Download + + + +
)}
@@ -457,7 +471,7 @@ function Header({ ) : isPdfRequestFiles ? ( alreadySign ? ( -
+
{isCompleted && ( + + +
+ +
+
+ + + handleDownloadPdf()} + > + + Download + + + +
)}
) ) : isCompleted ? ( -
+
{isCompleted && (
-
Login diff --git a/apps/OpenSign/src/pages/Login.js b/apps/OpenSign/src/pages/Login.js index a2e4b401c..5d2886564 100644 --- a/apps/OpenSign/src/pages/Login.js +++ b/apps/OpenSign/src/pages/Login.js @@ -1136,34 +1136,16 @@ function Login() { )}
+
+ + Forgot Password? + +
-
-
- -
-
- - Forgot Password ? - -
-
)} +
+ setIsAuthorize(e.target.checked)} + required + /> + + + openInNewTab( + "https://www.opensignlabs.com/terms-and-conditions" + ) + } + > + Terms of Service + + . +
From 4da307315ced4ebfe3c95f8f6b422de4d9ea1f4c Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs Date: Thu, 16 May 2024 19:34:28 +0530 Subject: [PATCH 08/41] feat: add resend mail functionality for inprogress document --- apps/OpenSign/src/json/ReportJson.js | 8 + .../src/primitives/GetReportDisplay.js | 279 +++++++++++++++++- apps/OpenSign/src/primitives/ModalUi.js | 2 +- .../cloud/parsefunction/reportsJson.js | 3 + 4 files changed, 287 insertions(+), 5 deletions(-) diff --git a/apps/OpenSign/src/json/ReportJson.js b/apps/OpenSign/src/json/ReportJson.js index 35553130f..87627b968 100644 --- a/apps/OpenSign/src/json/ReportJson.js +++ b/apps/OpenSign/src/json/ReportJson.js @@ -85,6 +85,14 @@ export default function reportJson(id) { btnIcon: "fa-solid fa-ellipsis-vertical fa-lg", action: "option", subaction: [ + { + btnId: "1630", + btnLabel: "Resend", + hoverLabel: "Resend", + btnIcon: "fa-solid fa-envelope", + redirectUrl: "", + action: "resend" + }, { btnId: "1688", btnLabel: "Revoke", diff --git a/apps/OpenSign/src/primitives/GetReportDisplay.js b/apps/OpenSign/src/primitives/GetReportDisplay.js index 927a0e14f..e5e603d74 100644 --- a/apps/OpenSign/src/primitives/GetReportDisplay.js +++ b/apps/OpenSign/src/primitives/GetReportDisplay.js @@ -11,6 +11,13 @@ 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 EditorToolbar, { + module1, + formats +} from "../components/pdf/EditorToolbar"; +import ReactQuill from "react-quill"; +import "react-quill/dist/quill.snow.css"; const ReportTable = (props) => { const navigate = useNavigate(); @@ -28,6 +35,10 @@ const ReportTable = (props) => { const [alertMsg, setAlertMsg] = useState({ type: "success", message: "" }); const [isTour, setIsTour] = useState(false); const [tourStatusArr, setTourStatusArr] = useState([]); + const [isResendMail, setIsResendMail] = useState({}); + const [mail, setMail] = useState({ subject: "", body: "" }); + const [userDetails, setUserDetails] = useState({}); + const [isNextStep, setIsNextStep] = useState({}); const startIndex = (currentPage - 1) * props.docPerPage; const { isMoreDocs, setIsNextRecord } = props; // For loop is used to calculate page numbers visible below table @@ -89,8 +100,6 @@ const ReportTable = (props) => { } } ); - - // console.log("templateDeatils.data ", templateDeatils.data); const templateData = templateDeatils.data && templateDeatils.data.result; if (!templateData.error) { @@ -149,7 +158,6 @@ const ReportTable = (props) => { } ); - // console.log("Res ", res.data); if (res.data && res.data.objectId) { setActLoader({}); setIsAlert(true); @@ -210,6 +218,8 @@ const ReportTable = (props) => { setIsRevoke({ [item.objectId]: true }); } else if (act.action === "option") { setIsOption({ [item.objectId]: !isOption[item.objectId] }); + } else if (act.action === "resend") { + setIsResendMail({ [item.objectId]: true }); } }; // Get current list @@ -254,7 +264,6 @@ const ReportTable = (props) => { "X-Parse-Session-Token": localStorage.getItem("accesstoken") } }); - // console.log("Res ", res.data); if (res.data && res.data.updatedAt) { setActLoader({}); setIsAlert(true); @@ -437,6 +446,161 @@ 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 expireDate = doc.ExpiryDate.iso; + const newDate = new Date(expireDate); + const localExpireDate = newDate.toLocaleDateString("en-US", { + day: "numeric", + month: "long", + year: "numeric" + }); + const signPdf = `${window.location.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: userDetails.Name, + receiver_email: userDetails.Email, + receiver_phone: userDetails.Phone, + expiry_date: localExpireDate, + company_name: doc.ExtUserPtr.Company, + signing_url: `Sign here` + }; + const res = replaceMailVaribles(subject, "", variables); + + setMail((prev) => ({ ...prev, subject: res.subject })); + }; + // `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 expireDate = doc.ExpiryDate.iso; + const newDate = new Date(expireDate); + const localExpireDate = newDate.toLocaleDateString("en-US", { + day: "numeric", + month: "long", + year: "numeric" + }); + const signPdf = `${window.location.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: userDetails.Name, + receiver_email: userDetails.Email, + receiver_phone: userDetails.Phone, + expiry_date: localExpireDate, + company_name: doc.ExtUserPtr.Company, + signing_url: `Sign here` + }; + const res = replaceMailVaribles("", body, variables); + + if (body) { + setMail((prev) => ({ ...prev, body: res.body })); + } + }; + // `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 expireDate = doc.ExpiryDate.iso; + const newDate = new Date(expireDate); + const localExpireDate = newDate.toLocaleDateString("en-US", { + day: "numeric", + month: "long", + year: "numeric" + }); + const signPdf = `${window.location.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: user.Name, + receiver_email: user.Email, + receiver_phone: user.Phone, + expiry_date: localExpireDate, + company_name: doc.ExtUserPtr.Company, + signing_url: `Sign here` + }; + + const subject = + doc?.RequestSubject || + "{{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™


"; + const res = replaceMailVaribles(subject, body, variables); + setMail((prev) => ({ ...prev, subject: res.subject, body: res.body })); + setIsNextStep({ [user.objectId]: true }); + }; + 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", + "X-Parse-Application-Id": localStorage.getItem("parseAppId"), + sessionToken: localStorage.getItem("accesstoken") + }; + let params = { + mailProvider: doc?.ExtUserPtr?.active_mail_adapter, + extUserId: doc?.ExtUserPtr?.objectId, + recipient: userDetails.Email, + subject: mail.subject, + from: doc?.ExtUserPtr?.Email, + html: mail.body + }; + try { + const res = await axios.post(url, params, { headers: headers }); + if (res) { + setAlertMsg({ type: "success", message: "Mail sent successfully." }); + } + } catch (err) { + console.log("err in sendmail", err); + setAlertMsg({ + type: "danger", + message: "Something went wrong, please try again later!" + }); + } finally { + setTimeout(() => setIsAlert(false), 1500); + setIsNextStep({}); + setUserDetails({}); + setActLoader({}); + } + }; + const fetchUserStatus = (user, doc) => { + const audit = doc.AuditTrail.find( + (x) => x.UserPtr.objectId === user.objectId + ); + return ( +
+
+ {audit?.Activity ? audit?.Activity : "Awaited"} +
+ + +
+ ); + }; return (
{Object.keys(actLoader)?.length > 0 && ( @@ -753,6 +917,113 @@ const ReportTable = (props) => {
)} + {isResendMail[item.objectId] && ( + { + setIsResendMail({}); + setIsNextStep({}); + setUserDetails({}); + }} + > +
+ {item?.Signers.map((user) => ( + + {isNextStep[user.objectId] && ( +
+ {actLoader[user.objectId] && ( +
+
+
+ )} + +
+ handleResendMail(e, item, user) + } + className="w-full flex flex-col gap-2 p-3 text-black" + > +
+ + + handleSubjectChange( + e.target.value, + item + ) + } + required + /> +
+
+ + + + handlebodyChange(value, item) + } + /> +
+ +
+
+ )} + {Object?.keys(isNextStep) <= 0 && ( +
+
+ {user.Name} +
+ <>{fetchUserStatus(user, item)} +
+ )} +
+ ))} +
+
+ )} ) diff --git a/apps/OpenSign/src/primitives/ModalUi.js b/apps/OpenSign/src/primitives/ModalUi.js index 01b59d94b..dcc726f18 100644 --- a/apps/OpenSign/src/primitives/ModalUi.js +++ b/apps/OpenSign/src/primitives/ModalUi.js @@ -16,7 +16,7 @@ const ModalUi = ({ return ( <> {isOpen && ( -
+
Date: Fri, 17 May 2024 10:09:15 +0530 Subject: [PATCH 09/41] 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 10/41] 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 11/41] 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 12/41] 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 13/41] 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 14/41] 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 15/41] 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 16/41] 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 17/41] 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 18/41] 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 19/41] 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 20/41] 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 21/41] 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 22/41] 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 23/41] 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 24/41] 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 25/41] 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 26/41] 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 27/41] 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 28/41] 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 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 29/41] 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 30/41] 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 31/41] 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 32/41] 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 33/41] 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 34/41] 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 35/41] 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 36/41] 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 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 37/41] 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 38/41] 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 39/41] 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 40/41] 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 bf307abe9a98efdc0754b1b275adeef748d54c40 Mon Sep 17 00:00:00 2001 From: Amol <amol@nxglabs.in> Date: Thu, 23 May 2024 18:17:00 +0530 Subject: [PATCH 41/41] 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" ] }, {