diff --git a/apps/OpenSign/package-lock.json b/apps/OpenSign/package-lock.json index 97e6ce917..c7df85d5b 100644 --- a/apps/OpenSign/package-lock.json +++ b/apps/OpenSign/package-lock.json @@ -16,12 +16,13 @@ "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", "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", @@ -7705,12 +7706,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 +7719,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 +8779,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 +10962,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 +17270,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 +17332,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 +19309,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", @@ -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", @@ -22823,14 +22843,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 5685ff99d..202157caa 100644 --- a/apps/OpenSign/package.json +++ b/apps/OpenSign/package.json @@ -11,12 +11,13 @@ "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", "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/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 ( -
+
@@ -128,6 +157,57 @@ const EditTemplate = ({ template, onSuccess }) => {
No
+
+ {!isEnableSubscription && ( + + )} + + Auto reminder{" "} + {!isSubscribe && isEnableSubscription && } + + +
+ {isSubscribe && formData?.AutomaticReminders === true && ( +
+ + +
+ )} {/* */}
" }; sendMail = await axios.post(url, params, { headers: headers }); + setIsEmailCelebration(true); + setTimeout(() => { + setIsEmailCelebration(false); + }, 3000); } catch (error) { console.log("error", error); setIsLoading(false); @@ -245,22 +249,17 @@ function EmailComponent({
- {isCeleb && ( -
+ {isEmailCelebration && ( +
print img
)} +

{ 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 (

@@ -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/PdfRequestFiles.js b/apps/OpenSign/src/pages/PdfRequestFiles.js index 31be42769..0eda0afe1 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, @@ -61,6 +62,7 @@ function PdfRequestFiles() { const [handleError, setHandleError] = useState(); const [selectWidgetId, setSelectWidgetId] = useState(""); const [otpLoader, setOtpLoader] = useState(false); + const [isCelebration, setIsCelebration] = useState(false); const [isLoading, setIsLoading] = useState({ isLoad: true, message: "This might take some time" @@ -219,7 +221,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); @@ -412,6 +414,27 @@ function PdfRequestFiles() { setSignerPos(documentData[0].Placeholders); } setPdfDetails(documentData); + // Check if the current signer is not a last signer and handle the complete message. + if (isNextUser) { + const getSignedAuditTrail = documentData[0].AuditTrail.filter( + (data) => data.Activity === "Signed" + ); + const isLastSigner = + getSignedAuditTrail?.length === documentData?.[0]?.Signers?.length; + if (!isLastSigner) { + setIsCompleted({ + isModal: true, + message: + "You have successfully signed the document. You can download or print a copy of the partially signed document. A copy of the digitally signed document will be sent to the owner over email once it is signed by all signers." + }); + } else { + setIsCelebration(true); + setTimeout(() => { + setIsCelebration(false); + }, 5000); + } + } + setIsUiLoading(false); } else { alert("No data found!"); @@ -701,19 +724,12 @@ function PdfRequestFiles() { setIsSigned(true); setSignedSigners([]); setUnSignedSigners([]); - getDocumentDetails(); + getDocumentDetails(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; @@ -1120,7 +1136,6 @@ function PdfRequestFiles() { alertMessage: "" }); }; - return ( <DndProvider backend={HTML5Backend}> <Title title={"Request Sign"} /> @@ -1169,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]" 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/SignyourselfPdf.js b/apps/OpenSign/src/pages/SignyourselfPdf.js index db813272f..fda577946 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"; @@ -70,7 +71,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 +109,7 @@ function SignYourSelf() { const [isDontShow, setIsDontShow] = useState(false); const [extUserId, setExtUserId] = useState(""); const [isCompleted, setIsCompleted] = useState(false); + const [isCelebration, setIsCelebration] = useState(false); const [pdfArrayBuffer, setPdfArrayBuffer] = useState(""); const [activeMailAdapter, setActiveMailAdapter] = useState(""); const [isEmailVerified, setIsEmailVerified] = useState(true); @@ -229,8 +230,12 @@ function SignYourSelf() { setIsUiLoading(false); setIsSignPad(false); setIsEmail(true); + setIsCelebration(true); setXyPostion([]); setSignBtnPosition([]); + setTimeout(() => { + setIsCelebration(false); + }, 5000); } } } else if ( @@ -649,10 +654,6 @@ function SignYourSelf() { }); return; } else { - setIsCeleb(true); - setTimeout(() => { - setIsCeleb(false); - }, 3000); setIsUiLoading(true); const existingPdfBytes = pdfArrayBuffer; // Load a PDFDocument from the existing PDF bytes @@ -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 && ( @@ -1258,7 +1264,6 @@ function SignYourSelf() { <EmailComponent isEmail={isEmail} pdfUrl={pdfUrl} - isCeleb={isCeleb} setIsEmail={setIsEmail} pdfName={pdfDetails[0] && pdfDetails[0].Name} setSuccessEmail={setSuccessEmail} 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..de8da2cbd --- /dev/null +++ b/apps/OpenSignServer/cloud/customRoute/autoReminder.js @@ -0,0 +1,184 @@ +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; +} + +// `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`; + const headers = { + 'Content-Type': 'application/json', + 'X-Parse-Application-Id': process.env.APP_ID, + }; + + 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(2000); + 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'); + 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; + 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 mailRes = await sendMail(doc, signer, mailCount); + if (mailRes && mailRes.status === 'success') { + mailCount += mailRes.count; + } + try { + // 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 update document', 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 mailRes = await sendMail(doc, signer, mailCount); + if (mailRes && mailRes.status === 'success') { + mailCount += mailRes.count; + } + } + } + } 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 mailRes = await sendMail(doc, signer, mailCount); + if (mailRes && mailRes.status === 'success') { + mailCount += mailRes.count; + } + } + } + } + // 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', document_count: docsArr.length, mail_count: mailCount }); + } 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..f9fdefaea 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('/sendreminder', 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 { 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/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 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 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 eafa8f752..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,18 +25,16 @@ "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" @@ -41,7 +43,7 @@ "@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", @@ -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 89ebe7ddc..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,18 +34,16 @@ "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" @@ -51,7 +53,7 @@ "@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",