diff --git a/.github/workflows/Docker.yml b/.github/workflows/Docker.yml index 01c74a80df..098bd4e1f7 100644 --- a/.github/workflows/Docker.yml +++ b/.github/workflows/Docker.yml @@ -1,8 +1,15 @@ name: ci + +# 👇 add this block +permissions: + contents: read # allow checkout & metadata-action to read repo + id-token: write # needed by docker/metadata-action v4 + on: push: branches: - 'main' + - 'staging' jobs: docker: diff --git a/apps/OpenSign/package-lock.json b/apps/OpenSign/package-lock.json index cf882c1383..78f405b6ed 100644 --- a/apps/OpenSign/package-lock.json +++ b/apps/OpenSign/package-lock.json @@ -9,16 +9,16 @@ "version": "0.1.0", "dependencies": { "@formkit/auto-animate": "^0.8.2", - "@lottiefiles/dotlottie-react": "^0.13.2", + "@lottiefiles/dotlottie-react": "^0.13.4", "@pdf-lib/fontkit": "^1.1.1", "@radix-ui/themes": "^3.1.6", - "@reduxjs/toolkit": "^2.5.1", + "@reduxjs/toolkit": "^2.7.0", "axios": "^1.8.4", "css-minimizer-webpack-plugin": "^7.0.2", "date-fns-tz": "^3.2.0", "file-saver": "^2.0.5", "i18next": "^23.16.8", - "i18next-browser-languagedetector": "^8.0.4", + "i18next-browser-languagedetector": "^8.0.5", "i18next-http-backend": "^3.0.2", "jszip": "^3.10.1", "jwt-decode": "^4.0.0", @@ -40,20 +40,20 @@ "react-dom": "^18.2.0", "react-gtm-module": "^2.0.11", "react-helmet": "^6.1.0", - "react-i18next": "^15.4.1", + "react-i18next": "^15.5.0", "react-konva": "^18.2.10", "react-pdf": "^9.2.1", "react-quill-new": "^3.4.6", "react-redux": "^9.2.0", "react-rnd": "^10.5.2", - "react-router": "^7.1.5", + "react-router": "^7.5.2", "react-scripts": "^5.0.1", "react-scrollbars-custom": "^4.1.1", "react-select": "^5.10.1", "react-signature-canvas": "^1.0.7", "react-syntax-highlighter": "^15.6.1", "react-timezone-select": "^3.2.8", - "react-tooltip": "^5.28.0", + "react-tooltip": "^5.28.1", "react-web-share": "^2.0.2", "reactour": "^1.19.4", "redux": "^5.0.1", @@ -75,19 +75,19 @@ "commitizen": "^4.3.1", "concurrently": "^9.1.2", "css-loader": "^7.1.2", - "daisyui": "^4.12.23", - "dotenv": "^16.4.7", + "daisyui": "^4.12.24", + "dotenv": "^16.5.0", "dotenv-webpack": "^8.1.0", - "eslint": "^9.23.0", - "eslint-plugin-prettier": "^5.2.5", - "eslint-plugin-react": "^7.37.4", - "lint-staged": "^15.5.0", + "eslint": "^8.57.1", + "eslint-plugin-prettier": "^5.2.6", + "eslint-plugin-react": "^7.37.5", + "lint-staged": "^15.5.1", "mini-css-extract-plugin": "^2.9.2", "postcss": "^8.5.3", "prettier": "^3.5.3", "pretty-quick": "^4.1.1", "tailwindcss": "^3.4.17", - "terser-webpack-plugin": "^5.3.11", + "terser-webpack-plugin": "^5.3.14", "webpack-cli": "^5.1.4" }, "engines": { @@ -2554,17 +2554,6 @@ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/@eslint-community/regexpp": { "version": "4.12.1", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", @@ -2573,51 +2562,16 @@ "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@eslint/config-array": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.2.tgz", - "integrity": "sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==", - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^2.1.6", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/config-helpers": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.0.tgz", - "integrity": "sha512-yJLLmLexii32mGrhW29qvU3QBVTu0GUmEf/J4XsBtVhp4JkIUFN/BjWqTF63yRvGApIDpZm5fa97LtYtINmfeQ==", - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/core": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz", - "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==", - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, "node_modules/@eslint/eslintrc": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", - "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", + "espree": "^9.6.0", + "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -2625,7 +2579,7 @@ "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -2648,12 +2602,15 @@ } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, "engines": { - "node": ">=18" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -2665,35 +2622,25 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "license": "MIT" }, - "node_modules/@eslint/js": { - "version": "9.23.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.23.0.tgz", - "integrity": "sha512-35MJ8vCPU0ZMxo7zfev2pypqTwWTofFZO6m4KAtdoFhRpLJUpHTZZ+KB3C7Hb1d7bULYwO4lJXGCi5Se+8OMbw==", - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/object-schema": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", - "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", - "license": "Apache-2.0", + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "license": "(MIT OR CC0-1.0)", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@eslint/plugin-kit": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.7.tgz", - "integrity": "sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==", - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.12.0", - "levn": "^0.4.1" - }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "license": "MIT", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@floating-ui/core": { @@ -2751,43 +2698,12 @@ "resolved": "https://registry.npmjs.org/@formkit/auto-animate/-/auto-animate-0.8.2.tgz", "integrity": "sha512-SwPWfeRa5veb1hOIBMdzI+73te5puUBHmqqaF1Bu7FjvxlYSz/kJcZKSa9Cg60zL0uRNeJL2SbRxV6Jp6Q1nFQ==" }, - "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", - "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, "node_modules/@humanwhocodes/config-array": { "version": "0.13.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", "deprecated": "Use @eslint/config-array instead", + "license": "Apache-2.0", "dependencies": { "@humanwhocodes/object-schema": "^2.0.3", "debug": "^4.3.1", @@ -2813,20 +2729,8 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead" - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz", - "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } + "deprecated": "Use @eslint/object-schema instead", + "license": "BSD-3-Clause" }, "node_modules/@isaacs/cliui": { "version": "8.0.2", @@ -3195,21 +3099,6 @@ "node": ">=8" } }, - "node_modules/@jest/core/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@jest/core/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -3678,21 +3567,21 @@ "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==" }, "node_modules/@lottiefiles/dotlottie-react": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/@lottiefiles/dotlottie-react/-/dotlottie-react-0.13.2.tgz", - "integrity": "sha512-l/3xBWPN235/pY8C1nUtCD65F6CfjlAYK1zie1YvVB00r6V86Uljy1wCG76vpHT6tXqNK5cBjwBH5MtlrM0U8Q==", + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/@lottiefiles/dotlottie-react/-/dotlottie-react-0.13.4.tgz", + "integrity": "sha512-QW3hSF1k95B56nswzs5iLY7FFGbwv/DkNDK3Kv1PyaoInAmj0+BE0496YTkWqRaYM2p0jKskjrZrLsHJVvfatg==", "license": "MIT", "dependencies": { - "@lottiefiles/dotlottie-web": "0.41.0" + "@lottiefiles/dotlottie-web": "0.43.0" }, "peerDependencies": { "react": "^17 || ^18 || ^19" } }, "node_modules/@lottiefiles/dotlottie-web": { - "version": "0.41.0", - "resolved": "https://registry.npmjs.org/@lottiefiles/dotlottie-web/-/dotlottie-web-0.41.0.tgz", - "integrity": "sha512-hJR3zN9DiQkNjEA0+OJbuPJPXZtbySrfYa61WD5qFc7dBPHGDUaSC6APvwM2FSrzPy0AU4nrOPfExEe6VNznkg==", + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@lottiefiles/dotlottie-web/-/dotlottie-web-0.43.0.tgz", + "integrity": "sha512-mIfb2aZj1xFY/NTtZ4tQPiOVz8MfWDkdUOCVpzCv3q8C8WRKxZUwPgIG8BdqhkujPksS9eYDXH/4f9qxyfNCwg==", "license": "MIT" }, "node_modules/@mapbox/node-pre-gyp": { @@ -3716,23 +3605,6 @@ "node-pre-gyp": "bin/node-pre-gyp" } }, - "node_modules/@mapbox/node-pre-gyp/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "optional": true, - "peer": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { "version": "7.6.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", @@ -3840,16 +3712,16 @@ } }, "node_modules/@pkgr/core": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.0.tgz", - "integrity": "sha512-vsJDAkYR6qCPu+ioGScGiMYR7LvZYIXh/dlQeviqoTWNCVfKTLYD/LkNWH4Mxsv2a5vpIRc77FN5DnmK1eBggQ==", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.4.tgz", + "integrity": "sha512-ROFF39F6ZrnzSUEmQQZUar0Jt4xVoP9WnDRdWwF4NNcXs3xBTLgBUDoOwW141y1jP+S8nahIbdxbFC7IShw9Iw==", "dev": true, "license": "MIT", "engines": { "node": "^12.20.0 || ^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://opencollective.com/unts" + "url": "https://opencollective.com/pkgr" } }, "node_modules/@pmmmwh/react-refresh-webpack-plugin": { @@ -6107,10 +5979,13 @@ "integrity": "sha512-/RVXdLvJxLg4QKvMoM5WlwNR9ViO9z8B/qPcc+C0Sa/teJY7QG7kJ441DwzOjMYEY7GmU4dj5EcGHIkKZiQZCA==" }, "node_modules/@reduxjs/toolkit": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.5.1.tgz", - "integrity": "sha512-UHhy3p0oUpdhnSxyDjaRDYaw8Xra75UiLbCiRozVPHjfDwNYkh0TsVm/1OmTW8Md+iDAJmYPWUKMvsMc2GtpNg==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.7.0.tgz", + "integrity": "sha512-XVwolG6eTqwV0N8z/oDlN93ITCIGIop6leXlGJI/4EKy+0POYkR+ABHRSdGXY+0MQvJBP8yAzh+EYFxTuvmBiQ==", + "license": "MIT", "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@standard-schema/utils": "^0.3.0", "immer": "^10.0.3", "redux": "^5.0.1", "redux-thunk": "^3.1.0", @@ -6295,6 +6170,18 @@ "@sinonjs/commons": "^1.7.0" } }, + "node_modules/@standard-schema/spec": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", + "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", + "license": "MIT" + }, + "node_modules/@standard-schema/utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz", + "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", + "license": "MIT" + }, "node_modules/@surma/rollup-plugin-off-main-thread": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", @@ -7146,21 +7033,11 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" }, "node_modules/@webassemblyjs/ast": { "version": "1.12.1", @@ -7420,6 +7297,7 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -8664,9 +8542,10 @@ } }, "node_modules/call-bind-apply-helpers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", - "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" @@ -8676,12 +8555,13 @@ } }, "node_modules/call-bound": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", - "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "get-intrinsic": "^1.2.6" + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { "node": ">= 0.4" @@ -10328,9 +10208,9 @@ } }, "node_modules/daisyui": { - "version": "4.12.23", - "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-4.12.23.tgz", - "integrity": "sha512-EM38duvxutJ5PD65lO/AFMpcw+9qEy6XAZrTpzp7WyaPeO/l+F/Qiq0ECHHmFNcFXh5aVoALY4MGrrxtCiaQCQ==", + "version": "4.12.24", + "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-4.12.24.tgz", + "integrity": "sha512-JYg9fhQHOfXyLadrBrEqCDM6D5dWCSSiM6eTNCRrBRzx/VlOCrLS8eDfIw9RVvs64v2mJdLooKXY8EwQzoszAA==", "dev": true, "license": "MIT", "dependencies": { @@ -11023,9 +10903,9 @@ } }, "node_modules/dotenv": { - "version": "16.4.7", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", - "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz", + "integrity": "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -11374,9 +11254,10 @@ "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==" }, "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0" }, @@ -11473,63 +11354,59 @@ } }, "node_modules/eslint": { - "version": "9.23.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.23.0.tgz", - "integrity": "sha512-jV7AbNoFPAY1EkFYpLq5bslU9NLNO8xnEeQXwErNibVryjk67wHVmddTBilc5srIttJDBrB0eMHKZBFbSIABCw==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.19.2", - "@eslint/config-helpers": "^0.2.0", - "@eslint/core": "^0.12.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.23.0", - "@eslint/plugin-kit": "^0.2.7", - "@humanfs/node": "^0.16.6", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", + "cross-spawn": "^7.0.2", "debug": "^4.3.2", + "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.3.0", - "eslint-visitor-keys": "^4.2.0", - "espree": "^10.3.0", - "esquery": "^1.5.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", + "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.3" + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-import-resolver-node": { @@ -11609,14 +11486,14 @@ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" }, "node_modules/eslint-plugin-prettier": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.5.tgz", - "integrity": "sha512-IKKP8R87pJyMl7WWamLgPkloB16dagPIdd2FjBDbyRYPKo93wS/NbCOPh6gH+ieNLC+XZrhJt/kWj0PS/DFdmg==", + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.6.tgz", + "integrity": "sha512-mUcf7QG2Tjk7H055Jk0lGBjbgDnfrvqjhXh9t2xLMSCjZVcw9Rb1V6sVNXO0th3jgeO7zllWPTNRil3JW94TnQ==", "dev": true, "license": "MIT", "dependencies": { "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.10.2" + "synckit": "^0.11.0" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -11640,9 +11517,10 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.37.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.4.tgz", - "integrity": "sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==", + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "license": "MIT", "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", @@ -11654,7 +11532,7 @@ "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", - "object.entries": "^1.1.8", + "object.entries": "^1.1.9", "object.fromentries": "^2.0.8", "object.values": "^1.2.1", "prop-types": "^15.8.1", @@ -11687,28 +11565,28 @@ } }, "node_modules/eslint-scope": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", - "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -11774,6 +11652,18 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/eslint/node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/eslint/node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -11785,6 +11675,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/eslint/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -11809,18 +11714,30 @@ "node": ">=8" } }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/espree": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", - "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.14.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.0" + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -12204,14 +12121,15 @@ } }, "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "license": "MIT", "dependencies": { - "flat-cache": "^4.0.0" + "flat-cache": "^3.0.4" }, "engines": { - "node": ">=16.0.0" + "node": "^10.12.0 || >=12.0.0" } }, "node_modules/file-loader": { @@ -12414,21 +12332,24 @@ } }, "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "license": "MIT", "dependencies": { "flatted": "^3.2.9", - "keyv": "^4.5.4" + "keyv": "^4.5.3", + "rimraf": "^3.0.2" }, "engines": { - "node": ">=16" + "node": "^10.12.0 || >=12.0.0" } }, "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==" + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "license": "ISC" }, "node_modules/focus-lock": { "version": "1.3.5", @@ -12895,16 +12816,17 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", - "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.1", + "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "get-proto": "^1.0.0", + "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", @@ -13486,9 +13408,10 @@ } }, "node_modules/http-proxy-middleware": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", - "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", + "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", + "license": "MIT", "dependencies": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", @@ -13558,9 +13481,9 @@ } }, "node_modules/i18next-browser-languagedetector": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-8.0.4.tgz", - "integrity": "sha512-f3frU3pIxD50/Tz20zx9TD9HobKYg47fmAETb117GKGPrhwcSSPJDoCposXlVycVebQ9GQohC3Efbpq7/nnJ5w==", + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-8.0.5.tgz", + "integrity": "sha512-OstebRKqKiQw8xEvQF5aRyUujsCatanj7Q9eo5iiH2gJpoXGZ7483ol3sVBwfqbobTQPNH1J+NAyJ1aCQoEC+w==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.2" @@ -14280,6 +14203,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "license": "MIT", "engines": { "node": ">=8" } @@ -17017,7 +16941,8 @@ "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", @@ -17128,6 +17053,7 @@ "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } @@ -17246,9 +17172,9 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/lint-staged": { - "version": "15.5.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.5.0.tgz", - "integrity": "sha512-WyCzSbfYGhK7cU+UuDDkzUiytbfbi0ZdPy2orwtM75P3WTtQBzmG40cCxIa8Ii2+XjfxzLH6Be46tUfWS85Xfg==", + "version": "15.5.1", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.5.1.tgz", + "integrity": "sha512-6m7u8mue4Xn6wK6gZvSCQwBvMBR36xfY24nF5bMTf2MHDYG6S3yhJuOgdYVw99hsjyDt2d4z168b3naI8+NWtQ==", "dev": true, "license": "MIT", "dependencies": { @@ -18461,13 +18387,15 @@ } }, "node_modules/object.entries": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", - "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "es-object-atoms": "^1.1.1" }, "engines": { "node": ">= 0.4" @@ -21493,9 +21421,9 @@ } }, "node_modules/react-i18next": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-15.4.1.tgz", - "integrity": "sha512-ahGab+IaSgZmNPYXdV1n+OYky95TGpFwnKRflX/16dY04DsYYKHtVLjeny7sBSCREEcoMbAgSkFiGLF5g5Oofw==", + "version": "15.5.0", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-15.5.0.tgz", + "integrity": "sha512-TK8wpr48D54RlVbwOugOqu4y7A30CRT9kJFQArubT22/fnDuAonFFX1TxETJLZWjF/USTLp8LUwRVk/NoAjpwg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.25.0", @@ -21729,12 +21657,11 @@ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "node_modules/react-router": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.1.5.tgz", - "integrity": "sha512-8BUF+hZEU4/z/JD201yK6S+UYhsf58bzYIDq2NS1iGpwxSXDu7F+DeGSkIXMFBuHZB21FSiCzEcUb18cQNdRkA==", + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.5.2.tgz", + "integrity": "sha512-9Rw8r199klMnlGZ8VAsV/I8WrIF6IyJ90JQUdboupx1cdkgYqwnrYjH+I/nY/7cA1X5zia4mDJqH36npP7sxGQ==", "license": "MIT", "dependencies": { - "@types/cookie": "^0.6.0", "cookie": "^1.0.1", "set-cookie-parser": "^2.6.0", "turbo-stream": "2.4.0" @@ -21833,36 +21760,6 @@ } } }, - "node_modules/react-scripts/node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/react-scripts/node_modules/@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, "node_modules/react-scripts/node_modules/@typescript-eslint/eslint-plugin": { "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", @@ -22008,20 +21905,6 @@ "ajv": "^6.9.1" } }, - "node_modules/react-scripts/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/react-scripts/node_modules/babel-loader": { "version": "8.4.1", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.4.1.tgz", @@ -22057,37 +21940,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/react-scripts/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/react-scripts/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/react-scripts/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/react-scripts/node_modules/commander": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", @@ -22299,17 +22151,6 @@ "postcss": "^8.2.15" } }, - "node_modules/react-scripts/node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/react-scripts/node_modules/dotenv": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", @@ -22318,71 +22159,6 @@ "node": ">=10" } }, - "node_modules/react-scripts/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-scripts/node_modules/eslint": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.1", - "@humanwhocodes/config-array": "^0.13.0", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/react-scripts/node_modules/eslint-config-react-app": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz", @@ -22466,17 +22242,6 @@ "ms": "^2.1.1" } }, - "node_modules/react-scripts/node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/react-scripts/node_modules/eslint-plugin-import/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -22534,32 +22299,6 @@ "eslint": "^7.5.0 || ^8.0.0" } }, - "node_modules/react-scripts/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/react-scripts/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/react-scripts/node_modules/eslint-webpack-plugin": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz", @@ -22583,33 +22322,6 @@ "webpack": "^5.0.0" } }, - "node_modules/react-scripts/node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/react-scripts/node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, "node_modules/react-scripts/node_modules/find-cache-dir": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", @@ -22626,19 +22338,6 @@ "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, - "node_modules/react-scripts/node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, "node_modules/react-scripts/node_modules/fs-extra": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", @@ -22652,20 +22351,6 @@ "node": ">=12" } }, - "node_modules/react-scripts/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/react-scripts/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -23185,21 +22870,6 @@ "postcss": "^8.2.15" } }, - "node_modules/react-scripts/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/react-scripts/node_modules/semver": { "version": "7.6.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", @@ -23236,17 +22906,6 @@ "postcss": "^8.2.15" } }, - "node_modules/react-scripts/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/react-scripts/node_modules/svgo": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", @@ -23268,17 +22927,6 @@ "node": ">=10.13.0" } }, - "node_modules/react-scripts/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/react-scripts/node_modules/yaml": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", @@ -23401,9 +23049,10 @@ } }, "node_modules/react-tooltip": { - "version": "5.28.0", - "resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-5.28.0.tgz", - "integrity": "sha512-R5cO3JPPXk6FRbBHMO0rI9nkUG/JKfalBSQfZedZYzmqaZQgq7GLzF8vcCWx6IhUCKg0yPqJhXIzmIO5ff15xg==", + "version": "5.28.1", + "resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-5.28.1.tgz", + "integrity": "sha512-ZA4oHwoIIK09TS7PvSLFcRlje1wGZaxw6xHvfrzn6T82UcMEfEmHVCad16Gnr4NDNDh93HyN037VK4HDi5odfQ==", + "license": "MIT", "dependencies": { "@floating-ui/dom": "^1.6.1", "classnames": "^2.3.0" @@ -23981,6 +23630,22 @@ "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", "dev": true }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/rollup": { "version": "2.79.2", "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", @@ -25621,20 +25286,20 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" }, "node_modules/synckit": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.10.3.tgz", - "integrity": "sha512-R1urvuyiTaWfeCggqEvpDJwAlDVdsT9NM+IP//Tk2x7qHCkSvBk/fwFgw/TLAHzZlrAnnazMcRw0ZD8HlYFTEQ==", + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.4.tgz", + "integrity": "sha512-Q/XQKRaJiLiFIBNN+mndW7S/RHxvwzuZS6ZwmRzUBqJBv/5QIKCEwkBC8GBf8EQJKYnaFs0wOZbKTXBPj8L9oQ==", "dev": true, "license": "MIT", "dependencies": { - "@pkgr/core": "^0.2.0", + "@pkgr/core": "^0.2.3", "tslib": "^2.8.1" }, "engines": { "node": "^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://opencollective.com/unts" + "url": "https://opencollective.com/synckit" } }, "node_modules/tabbable": { @@ -25853,9 +25518,10 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.11.tgz", - "integrity": "sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==", + "version": "5.3.14", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", + "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", + "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", @@ -26869,21 +26535,6 @@ } } }, - "node_modules/webpack-dev-server/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/webpack-manifest-plugin": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz", diff --git a/apps/OpenSign/package.json b/apps/OpenSign/package.json index c0ec28cd42..a35ec67056 100644 --- a/apps/OpenSign/package.json +++ b/apps/OpenSign/package.json @@ -4,16 +4,16 @@ "private": true, "dependencies": { "@formkit/auto-animate": "^0.8.2", - "@lottiefiles/dotlottie-react": "^0.13.2", + "@lottiefiles/dotlottie-react": "^0.13.4", "@pdf-lib/fontkit": "^1.1.1", "@radix-ui/themes": "^3.1.6", - "@reduxjs/toolkit": "^2.5.1", + "@reduxjs/toolkit": "^2.7.0", "axios": "^1.8.4", "css-minimizer-webpack-plugin": "^7.0.2", "date-fns-tz": "^3.2.0", "file-saver": "^2.0.5", "i18next": "^23.16.8", - "i18next-browser-languagedetector": "^8.0.4", + "i18next-browser-languagedetector": "^8.0.5", "i18next-http-backend": "^3.0.2", "jszip": "^3.10.1", "jwt-decode": "^4.0.0", @@ -35,20 +35,20 @@ "react-dom": "^18.2.0", "react-gtm-module": "^2.0.11", "react-helmet": "^6.1.0", - "react-i18next": "^15.4.1", + "react-i18next": "^15.5.0", "react-konva": "^18.2.10", "react-pdf": "^9.2.1", "react-quill-new": "^3.4.6", "react-redux": "^9.2.0", "react-rnd": "^10.5.2", - "react-router": "^7.1.5", + "react-router": "^7.5.2", "react-scripts": "^5.0.1", "react-scrollbars-custom": "^4.1.1", "react-select": "^5.10.1", "react-signature-canvas": "^1.0.7", "react-syntax-highlighter": "^15.6.1", "react-timezone-select": "^3.2.8", - "react-tooltip": "^5.28.0", + "react-tooltip": "^5.28.1", "react-web-share": "^2.0.2", "reactour": "^1.19.4", "redux": "^5.0.1", @@ -105,19 +105,19 @@ "commitizen": "^4.3.1", "concurrently": "^9.1.2", "css-loader": "^7.1.2", - "daisyui": "^4.12.23", - "dotenv": "^16.4.7", + "daisyui": "^4.12.24", + "dotenv": "^16.5.0", "dotenv-webpack": "^8.1.0", - "eslint": "^9.23.0", - "eslint-plugin-prettier": "^5.2.5", - "eslint-plugin-react": "^7.37.4", - "lint-staged": "^15.5.0", + "eslint": "^8.57.1", + "eslint-plugin-prettier": "^5.2.6", + "eslint-plugin-react": "^7.37.5", + "lint-staged": "^15.5.1", "mini-css-extract-plugin": "^2.9.2", "postcss": "^8.5.3", "prettier": "^3.5.3", "pretty-quick": "^4.1.1", "tailwindcss": "^3.4.17", - "terser-webpack-plugin": "^5.3.11", + "terser-webpack-plugin": "^5.3.14", "webpack-cli": "^5.1.4" }, "overrides": { diff --git a/apps/OpenSign/public/locales/de/translation.json b/apps/OpenSign/public/locales/de/translation.json index e22aec5b4f..d99c9b9894 100644 --- a/apps/OpenSign/public/locales/de/translation.json +++ b/apps/OpenSign/public/locales/de/translation.json @@ -1,4 +1,4 @@ -{ +{ "header-news": "Neue Funktion: Benutzer des Teams-Plans können jetzt ihre eigenen AWS S3-Buckets für die Dateispeicherung integrieren", "header-news-btn": "Jetzt einrichten", "create-account": "Konto erstellen", @@ -341,7 +341,7 @@ "verify-email-1": "E-Mail verifizieren", "resend": "Erneut senden", "contact-details": "Kontaktdetails", - "verify-email": "Bitte verifizieren Sie Ihre E-Mail!", + "verify-email": "Bitte bestätigen Sie Ihre E-Mail, um fortzufahren. Dies ist ein einmaliger Schritt, um die mit Ihrem OpenSign-Konto verknüpfte E-Mail zu bestätigen.", "send-otp": "OTP senden", "otp-placeholder": "Verifizierungscode aus der E-Mail eingeben", "loading-doc": "Dokument wird geladen...", @@ -887,5 +887,83 @@ "do-you-want-recreate-document?": "Dadurch wird ein Entwurf aus diesem Dokument mit allen vorhandenen Feldern erstellt. Sind Sie sicher, dass Sie dieses Dokument neu erstellen möchten?", "start-editing": "Bearbeitung starten", "unsaved-changes-discard-them?": "Sie haben ungespeicherte Änderungen. Verwerfen?", - "yes-discard": "Ja, verwerfen" + "yes-discard": "Ja, verwerfen", + "LTV-enabled-signatures": "LTV-fähige Signaturen", + "BETA": "BETA", + "two-factor-authentication": "Zwei-Faktor-Authentifizierung", + "2fa-help-text": "Die Zwei-Faktor-Authentifizierung fügt Ihrem Konto eine zusätzliche Sicherheitsebene hinzu, indem sie mehr als nur ein Passwort zum Anmelden erfordert.", + "2fa-help-bullet1": "Erhöht die Sicherheit, indem sowohl Ihr Passwort als auch ein Bestätigungscode erforderlich sind.", + "2fa-help-bullet2": "Der Bestätigungscode wird von einer Authentifizierungs-App auf Ihrem Gerät generiert.", + "2fa-help-bullet3": "Schützt Ihr Konto, selbst wenn Ihr Passwort kompromittiert wurde.", + "setup-2fa": "2FA einrichten", + "setup-2fa-again": "2FA erneut einrichten", + "2fa-setup-intro": "Schützen Sie Ihr Konto mit der Zwei-Faktor-Authentifizierung. Wenn aktiviert, müssen Sie bei jeder Anmeldung einen Code aus Ihrer Authentifizierungs-App eingeben.", + "scan-qr-code": "QR-Code scannen", + "scan-qr-instructions": "Verwenden Sie eine Authentifizierungs-App wie Google Authenticator, Microsoft Authenticator oder Authy, um diesen QR-Code zu scannen.", + "manual-setup-instructions": "Können Sie den Code nicht scannen? Sie können Ihre Authentifizierungs-App manuell mit diesem geheimen Schlüssel einrichten:", + "secret-key": "Geheimer Schlüssel", + "copied-to-clipboard": "In die Zwischenablage kopiert", + "copy-to-clipboard": "In die Zwischenablage kopieren", + "recovery-codes": "Wiederherstellungscodes", + "recovery-codes-instructions": "Speichern Sie diese Wiederherstellungscodes an einem sicheren Ort. Wenn Sie den Zugriff auf Ihre Authentifizierungs-App verlieren, können Sie einen dieser Einmal-Codes verwenden, um sich anzumelden.", + "download-recovery-codes": "Wiederherstellungscodes herunterladen", + "verification-code": "Bestätigungscode", + "enter-code-from-authenticator-app": "Geben Sie den 6-stelligen Code aus Ihrer Authentifizierungs-App ein", + "verification-code-required": "Bestätigungscode ist erforderlich", + "verification-code-invalid": "Ungültiger Bestätigungscode. Bitte versuchen Sie es erneut.", + "2fa-enabled": "2FA aktiviert", + "2fa-enabled-successfully": "Zwei-Faktor-Authentifizierung erfolgreich aktiviert", + "2fa-setup-complete": "Einrichtung abgeschlossen!", + "2fa-setup-complete-instructions": "Ihr Konto ist jetzt mit der Zwei-Faktor-Authentifizierung geschützt. Sie müssen bei jeder Anmeldung einen Bestätigungscode eingeben.", + "two-factor-verification": "Zwei-Faktor-Verifizierung", + "enter-verification-code-instructions": "Geben Sie den 6-stelligen Bestätigungscode aus Ihrer Authentifizierungs-App ein, um fortzufahren.", + "recovery-code": "Wiederherstellungscode", + "enter-recovery-code-help": "Geben Sie einen Ihrer Wiederherstellungscodes ein", + "recovery-code-required": "Wiederherstellungscode ist erforderlich", + "use-verification-code-instead": "Stattdessen Bestätigungscode verwenden", + "use-recovery-code-instead": "Stattdessen Wiederherstellungscode verwenden", + "regenerate-2fa-remove-existing": "Sind Sie sicher, dass Sie die Zwei-Faktor-Authentifizierung neu generieren möchten? Diese Aktion entfernt Ihre bestehenden Authentifizierungseinstellungen.", + "use-passkey": "Mit Passkey anmelden", + "security-section": "Sicherheit", + "passkey-authentication": "Passkey-Authentifizierung", + "passkey-not-supported": "Ihr Browser oder Gerät unterstützt keine Passkey-Authentifizierung", + "passkey-description": "Passkeys bieten eine stärkere, phishing-resistente Alternative zu Passwörtern. Sie können Ihren Fingerabdruck, Ihre Gesichtserkennung oder Ihre Geräte-PIN verwenden, um sich sicher anzumelden.", + "passkey-tooltip": "Passkeys sind eine einfachere und sicherere Alternative zu Passwörtern. Sie verwenden biometrische Daten wie Fingerabdrücke oder Gesichtserkennung, die bereits auf Ihrem Gerät gespeichert sind.", + "security-section-help": "Verwalten Sie Sicherheitsoptionen, einschließlich Passkeys und Authentifizierungsmethoden, um Ihr Konto zu schützen.", + "passkey-register": "Passkey registrieren", + "passkey-register-another": "Weiteren Passkey registrieren", + "passkey-registered": "Passkey registriert", + "passkey-registering": "Passkey wird registriert...", + "passkey-registered-success": "Passkey erfolgreich registriert!", + "passkey-registration-failed": "Passkey-Registrierung fehlgeschlagen", + "passkey-auth-failed": "Passkey-Authentifizierung fehlgeschlagen", + "passkey-missing-user-info": "Benutzerinformationen erforderlich", + "passkeys-list": "Ihre Passkeys", + "default-passkey": "Ihr Passkey", + "passkey-rename": "Umbenennen", + "passkey-delete": "Löschen", + "passkey-rename-title": "Passkey umbenennen", + "passkey-delete-title": "Passkey löschen", + "passkey-delete-confirm": "Möchten Sie den Passkey \"{{name}}\" wirklich löschen?", + "passkey-name": "Passkey-Name", + "passkey-name-placeholder": "Geben Sie einen beschreibenden Namen für diesen Passkey ein", + "passkey-renamed-success": "Passkey erfolgreich umbenannt", + "passkey-deleted-success": "Passkey erfolgreich gelöscht", + "passkey-rename-failed": "Passkey konnte nicht umbenannt werden", + "passkey-delete-failed": "Passkey konnte nicht gelöscht werden", + "processing": "Wird verarbeitet...", + "today": "Heute", + "yesterday": "Gestern", + "days-ago": "Vor {{days}} Tagen", + "verify-with-passkey": "Mit Passkey verifizieren", + "verify-with-otp": "Mit OTP verifizieren", + "verify-identity": "Identität verifizieren", + "verify-account": "Verifizieren Sie Ihre Identität", + "verification": "Verifizierung", + "passkey-verification-failed": "Passkey-Verifizierung fehlgeschlagen", + "security-auth-help": { + "p1": "Administre la configuración de seguridad de su cuenta para mantener sus datos seguros. OpenSign admite métodos de autenticación avanzados para mejorar la protección de la cuenta.", + "2fa-auth-help": "Agregue una capa adicional de seguridad activando 2FA. Esto requiere ingresar un código de verificación desde una aplicación autenticadora después de su contraseña.", + "passkey-auth-help": "Use claves de acceso para iniciar sesión sin contraseña con verificación biométrica o basada en el dispositivo, proporcionando una seguridad sólida y comodidad." + } } diff --git a/apps/OpenSign/public/locales/en/translation.json b/apps/OpenSign/public/locales/en/translation.json index 79b2635a82..d5ad9c5eb8 100644 --- a/apps/OpenSign/public/locales/en/translation.json +++ b/apps/OpenSign/public/locales/en/translation.json @@ -1,5 +1,5 @@ { - "header-news": "New feature: Teams plan users can now integrate their own AWS S3 buckets for file storage", + "header-news": "New feature: Protect your account with Two-Factor Authentication (2FA) and enjoy the future of login with Passkeys — no passwords needed.", "header-news-btn": "Setup now", "create-account": "Create account", "login": "Login", @@ -341,7 +341,7 @@ "verify-email-1": "Verify email", "resend": "Resend", "contact-details": "Contact details", - "verify-email": "Please verify your email !", + "verify-email": "Please verify your email to continue. This is a one-time step to confirm the email associated with your OpenSign account.", "send-otp": " Send OTP", "otp-placeholder": "Enter verification code received over email", "loading-doc": "Loading document..", @@ -887,5 +887,83 @@ "do-you-want-recreate-document?": "This will create a draft from this document with all fields intact. Are you sure you want to recreate this document?", "start-editing": "Start Editing", "unsaved-changes-discard-them?": "You have unsaved changes. Discard them?", - "yes-discard": "Yes, Discard" -} + "yes-discard": "Yes, Discard", + "LTV-enabled-signatures": "LTV enabled signatures", + "BETA": "BETA", + "two-factor-authentication": "Two-Factor Authentication", + "2fa-help-text": "Two-factor authentication adds an extra layer of security to your account by requiring more than just a password to sign in.", + "2fa-help-bullet1": "Enhances security by requiring both your password and a verification code.", + "2fa-help-bullet2": "The verification code is generated by an authenticator app on your device.", + "2fa-help-bullet3": "Protects your account even if your password is compromised.", + "setup-2fa": "Setup 2FA", + "setup-2fa-again": "Setup 2FA again", + "2fa-setup-intro": "Protect your account with two-factor authentication. When enabled, you'll need to enter a code from your authenticator app whenever you sign in.", + "scan-qr-code": "Scan QR Code", + "scan-qr-instructions": "Use an authenticator app like Google Authenticator, Microsoft Authenticator, or Authy to scan this QR code.", + "manual-setup-instructions": "Can't scan the code? You can manually set up your authenticator app using this secret key:", + "secret-key": "Secret Key", + "copied-to-clipboard": "Copied to clipboard", + "copy-to-clipboard": "Copy to clipboard", + "recovery-codes": "Recovery Codes", + "recovery-codes-instructions": "Save these recovery codes in a secure location. If you lose access to your authenticator app, you can use one of these one-time codes to sign in.", + "download-recovery-codes": "Download Recovery Codes", + "verification-code": "Verification Code", + "enter-code-from-authenticator-app": "Enter the 6-digit code from your authenticator app", + "verification-code-required": "Verification code is required", + "verification-code-invalid": "Invalid verification code. Please try again.", + "2fa-enabled": "2FA enabled", + "2fa-enabled-successfully": "Two-factor authentication enabled successfully", + "2fa-setup-complete": "Setup Complete!", + "2fa-setup-complete-instructions": "Your account is now protected with two-factor authentication. You'll need to enter a verification code each time you sign in.", + "two-factor-verification": "Two-Factor Verification", + "enter-verification-code-instructions": "Enter the 6-digit verification code from your authenticator app to continue.", + "recovery-code": "Recovery Code", + "enter-recovery-code-help": "Enter one of your recovery codes", + "recovery-code-required": "Recovery code is required", + "use-verification-code-instead": "Use verification code instead", + "use-recovery-code-instead": "Use recovery code instead", + "regenerate-2fa-remove-existing": "Are you sure you want to regenerate two-factor authentication? This action will remove your existing authentication settings.", + "use-passkey": "Sign in with passkey", + "security-section": "Security", + "passkey-authentication": "Passkey Authentication", + "passkey-not-supported": "Your browser or device doesn't support passkey authentication", + "passkey-description": "Passkeys provide a stronger, phishing-resistant alternative to passwords. You can use your fingerprint, face recognition, or device PIN to sign in securely.", + "passkey-tooltip": "Passkeys are a simpler and more secure alternative to passwords. They use biometric data like fingerprints or facial recognition that's already stored on your device.", + "security-section-help": "Manage security options including passkeys and authentication methods to protect your account.", + "passkey-register": "Register passkey", + "passkey-register-another": "Register another passkey", + "passkey-registered": "Passkey registered", + "passkey-registering": "Registering passkey...", + "passkey-registered-success": "Passkey successfully registered!", + "passkey-registration-failed": "Failed to register passkey", + "passkey-auth-failed": "Passkey authentication failed", + "passkey-missing-user-info": "User information is required", + "passkeys-list": "Your Passkeys", + "default-passkey": "Your Passkey", + "passkey-rename": "Rename", + "passkey-delete": "Delete", + "passkey-rename-title": "Rename Passkey", + "passkey-delete-title": "Delete Passkey", + "passkey-delete-confirm": "Are you sure you want to delete passkey \"{{name}}\"?", + "passkey-name": "Passkey Name", + "passkey-name-placeholder": "Enter a descriptive name for this passkey", + "passkey-renamed-success": "Passkey renamed successfully", + "passkey-deleted-success": "Passkey deleted successfully", + "passkey-rename-failed": "Failed to rename passkey", + "passkey-delete-failed": "Failed to delete passkey", + "processing": "Processing...", + "today": "Today", + "yesterday": "Yesterday", + "days-ago": "{{days}} days ago", + "verify-with-passkey": "Verify with passkey", + "verify-with-otp": "Verify with OTP", + "verification": "Verification", + "verify-account": "Verify your account", + "verify-identity": "Verify identity", + "passkey-verification-failed": "Passkey verification failed. Please try again or use OTP.", + "security-auth-help": { + "p1":"Manage your account's security settings to keep your data safe. OpenSign supports advanced authentication methods to enhance account protection.", + "2fa-auth-help":" Add an extra layer of security by enabling 2FA. This requires you to enter a verification code from an authenticator app after your password.", + "passkey-auth-help":"Use passkeys for passwordless sign-in with biometric or device-based verification, providing both strong security and convenience." + } +} \ No newline at end of file diff --git a/apps/OpenSign/public/locales/es/translation.json b/apps/OpenSign/public/locales/es/translation.json index 64bcb350f7..b9c99194ae 100644 --- a/apps/OpenSign/public/locales/es/translation.json +++ b/apps/OpenSign/public/locales/es/translation.json @@ -342,7 +342,7 @@ "verify-email-1": "Verificar correo", "resend": "Reenviar", "contact-details": "Detalles del contacto", - "verify-email": "¡Por favor, verifica tu correo!", + "verify-email": "Por favor verifique su correo electrónico para continuar. Este es un paso único para confirmar el correo electrónico asociado a su cuenta de OpenSign.", "send-otp": " Enviar OTP", "otp-placeholder": "Ingresa el código de verificación enviado por correo", "loading-doc": "Cargando documento...", @@ -887,5 +887,83 @@ "do-you-want-recreate-document?": "Esto creará un borrador a partir de este documento con todos los campos intactos. ¿Está seguro de que desea recrear este documento?", "start-editing": "Comenzar a editar", "unsaved-changes-discard-them?": "Tienes cambios sin guardar. ¿Deseas descartarlos?", - "yes-discard": "Sí, descartar" + "yes-discard": "Sí, descartar", + "LTV-enabled-signatures": "Firmas con LTV habilitado", + "BETA": "BETA", + "two-factor-authentication": "Autenticación de dos factores", + "2fa-help-text": "La autenticación de dos factores agrega una capa adicional de seguridad a su cuenta al requerir más que solo una contraseña para iniciar sesión.", + "2fa-help-bullet1": "Mejora la seguridad al requerir tanto su contraseña como un código de verificación.", + "2fa-help-bullet2": "El código de verificación es generado por una aplicación de autenticación en su dispositivo.", + "2fa-help-bullet3": "Protege su cuenta incluso si su contraseña se ve comprometida.", + "setup-2fa": "Configurar 2FA", + "setup-2fa-again": "Configurar 2FA nuevamente", + "2fa-setup-intro": "Proteja su cuenta con la autenticación de dos factores. Cuando esté habilitada, deberá ingresar un código de su aplicación de autenticación cada vez que inicie sesión.", + "scan-qr-code": "Escanear código QR", + "scan-qr-instructions": "Use una aplicación de autenticación como Google Authenticator, Microsoft Authenticator o Authy para escanear este código QR.", + "manual-setup-instructions": "¿No puede escanear el código? Puede configurar manualmente su aplicación de autenticación utilizando esta clave secreta:", + "secret-key": "Clave secreta", + "copied-to-clipboard": "Copiado al portapapeles", + "copy-to-clipboard": "Copiar al portapapeles", + "recovery-codes": "Códigos de recuperación", + "recovery-codes-instructions": "Guarde estos códigos de recuperación en un lugar seguro. Si pierde el acceso a su aplicación de autenticación, puede usar uno de estos códigos de un solo uso para iniciar sesión.", + "download-recovery-codes": "Descargar códigos de recuperación", + "verification-code": "Código de verificación", + "enter-code-from-authenticator-app": "Ingrese el código de 6 dígitos de su aplicación de autenticación", + "verification-code-required": "Se requiere el código de verificación", + "verification-code-invalid": "Código de verificación inválido. Por favor, inténtelo de nuevo.", + "2fa-enabled": "2FA activado", + "2fa-enabled-successfully": "Autenticación de dos factores habilitada con éxito", + "2fa-setup-complete": "¡Configuración completa!", + "2fa-setup-complete-instructions": "Su cuenta ahora está protegida con autenticación de dos factores. Deberá ingresar un código de verificación cada vez que inicie sesión.", + "two-factor-verification": "Verificación de dos factores", + "enter-verification-code-instructions": "Ingrese el código de verificación de 6 dígitos de su aplicación de autenticación para continuar.", + "recovery-code": "Código de recuperación", + "enter-recovery-code-help": "Ingrese uno de sus códigos de recuperación", + "recovery-code-required": "Se requiere el código de recuperación", + "use-verification-code-instead": "Usar código de verificación en su lugar", + "use-recovery-code-instead": "Usar código de recuperación en su lugar", + "regenerate-2fa-remove-existing": "¿Está seguro de que desea regenerar la autenticación de dos factores? Esta acción eliminará su configuración de autenticación actual.", + "use-passkey": "Iniciar sesión con passkey", + "security-section": "Seguridad", + "passkey-authentication": "Autenticación con passkey", + "passkey-not-supported": "Tu navegador o dispositivo no admite la autenticación con passkey", + "passkey-description": "Las passkeys proporcionan una alternativa más segura y resistente al phishing que las contraseñas. Puedes usar tu huella digital, reconocimiento facial o PIN del dispositivo para iniciar sesión de forma segura.", + "passkey-tooltip": "Las passkeys son una alternativa más simple y segura a las contraseñas. Usan datos biométricos como huellas digitales o reconocimiento facial ya almacenados en tu dispositivo.", + "security-section-help": "Administra las opciones de seguridad, incluidas las passkeys y métodos de autenticación para proteger tu cuenta.", + "passkey-register": "Registrar passkey", + "passkey-register-another": "Registrar otra passkey", + "passkey-registered": "Passkey registrada", + "passkey-registering": "Registrando passkey...", + "passkey-registered-success": "¡Passkey registrada con éxito!", + "passkey-registration-failed": "Fallo al registrar la passkey", + "passkey-auth-failed": "Falló la autenticación con passkey", + "passkey-missing-user-info": "Se requiere información del usuario", + "passkeys-list": "Tus passkeys", + "default-passkey": "Tu passkey", + "passkey-rename": "Renombrar", + "passkey-delete": "Eliminar", + "passkey-rename-title": "Renombrar passkey", + "passkey-delete-title": "Eliminar passkey", + "passkey-delete-confirm": "¿Estás seguro de que deseas eliminar la passkey \"{{name}}\"?", + "passkey-name": "Nombre de la passkey", + "passkey-name-placeholder": "Introduce un nombre descriptivo para esta passkey", + "passkey-renamed-success": "Passkey renombrada con éxito", + "passkey-deleted-success": "Passkey eliminada con éxito", + "passkey-rename-failed": "No se pudo renombrar la passkey", + "passkey-delete-failed": "No se pudo eliminar la passkey", + "processing": "Procesando...", + "today": "Hoy", + "yesterday": "Ayer", + "days-ago": "Hace {{days}} días", + "verify-with-passkey": "Verificar con passkey", + "verify-with-otp": "Verificar con OTP", + "verify-identity": "Verificar identidad", + "verify-account": "Verifique su identidad", + "verification": "Verificación", + "passkey-verification-failed": "La verificación con passkey ha fallado", + "security-auth-help": { + "p1": "Administre la configuración de seguridad de su cuenta para mantener sus datos seguros. OpenSign admite métodos de autenticación avanzados para mejorar la protección de la cuenta.", + "2fa-auth-help": "Agregue una capa adicional de seguridad activando 2FA. Esto requiere ingresar un código de verificación desde una aplicación autenticadora después de su contraseña.", + "passkey-auth-help": "Use claves de acceso para iniciar sesión sin contraseña con verificación biométrica o basada en el dispositivo, proporcionando una seguridad sólida y comodidad." + } } diff --git a/apps/OpenSign/public/locales/fr/translation.json b/apps/OpenSign/public/locales/fr/translation.json index e1b1883caa..b74261c0a1 100644 --- a/apps/OpenSign/public/locales/fr/translation.json +++ b/apps/OpenSign/public/locales/fr/translation.json @@ -341,7 +341,7 @@ "verify-email-1": "Vérifier l'e-mail", "resend": "Renvoyer", "contact-details": "Coordonnées", - "verify-email": "Veuillez vérifier votre email!", + "verify-email": "Veuillez vérifier votre e-mail pour continuer. C'est une étape unique pour confirmer l'adresse e-mail associée à votre compte OpenSign.", "send-otp": "envoyer un code à usage unique", "otp-placeholder": "Entrez le code de vérification reçu par e-mail", "loading-doc": "Chargement du document..", @@ -887,5 +887,83 @@ "do-you-want-recreate-document?": "Cela créera un brouillon à partir de ce document avec tous les champs intacts. Êtes-vous sûr de vouloir recréer ce document ?", "start-editing": "Commencer l'édition", "unsaved-changes-discard-them?": "Vous avez des modifications non enregistrées. Les supprimer ?", - "yes-discard": "Oui, supprimer" + "yes-discard": "Oui, supprimer", + "LTV-enabled-signatures": "Signatures avec LTV activée", + "BETA": "BETA", + "two-factor-authentication": "Authentification à deux facteurs", + "2fa-help-text": "L'authentification à deux facteurs ajoute une couche de sécurité supplémentaire à votre compte en exigeant plus qu'un simple mot de passe pour se connecter.", + "2fa-help-bullet1": "Renforce la sécurité en demandant à la fois votre mot de passe et un code de vérification.", + "2fa-help-bullet2": "Le code de vérification est généré par une application d'authentification sur votre appareil.", + "2fa-help-bullet3": "Protège votre compte même si votre mot de passe est compromis.", + "setup-2fa": "Configurer 2FA", + "setup-2fa-again": "Reconfigurer 2FA", + "2fa-setup-intro": "Protégez votre compte avec l'authentification à deux facteurs. Une fois activée, vous devrez saisir un code provenant de votre application d'authentification à chaque connexion.", + "scan-qr-code": "Scanner le code QR", + "scan-qr-instructions": "Utilisez une application d'authentification comme Google Authenticator, Microsoft Authenticator ou Authy pour scanner ce code QR.", + "manual-setup-instructions": "Vous ne pouvez pas scanner le code ? Configurez manuellement votre application d'authentification avec cette clé secrète :", + "secret-key": "Clé secrète", + "copied-to-clipboard": "Copié dans le presse-papiers", + "copy-to-clipboard": "Copier dans le presse-papiers", + "recovery-codes": "Codes de récupération", + "recovery-codes-instructions": "Enregistrez ces codes de récupération dans un endroit sûr. Si vous perdez l'accès à votre application d'authentification, vous pourrez utiliser l'un de ces codes à usage unique pour vous connecter.", + "download-recovery-codes": "Télécharger les codes de récupération", + "verification-code": "Code de vérification", + "enter-code-from-authenticator-app": "Saisissez le code à 6 chiffres de votre application d'authentification", + "verification-code-required": "Le code de vérification est requis", + "verification-code-invalid": "Code de vérification invalide. Veuillez réessayer.", + "2fa-enabled": "2FA activé", + "2fa-enabled-successfully": "Authentification à deux facteurs activée avec succès", + "2fa-setup-complete": "Configuration terminée !", + "2fa-setup-complete-instructions": "Votre compte est maintenant protégé par l'authentification à deux facteurs. Vous devrez entrer un code de vérification à chaque connexion.", + "two-factor-verification": "Vérification en deux étapes", + "enter-verification-code-instructions": "Saisissez le code de vérification à 6 chiffres de votre application d'authentification pour continuer.", + "recovery-code": "Code de récupération", + "enter-recovery-code-help": "Saisissez l'un de vos codes de récupération", + "recovery-code-required": "Le code de récupération est requis", + "use-verification-code-instead": "Utiliser le code de vérification à la place", + "use-recovery-code-instead": "Utiliser le code de récupération à la place", + "regenerate-2fa-remove-existing": "Êtes-vous sûr de vouloir régénérer l'authentification à deux facteurs ? Cette action supprimera vos paramètres d'authentification existants.", + "use-passkey": "Se connecter avec une clé d'accès", + "security-section": "Sécurité", + "passkey-authentication": "Authentification par clé d'accès", + "passkey-not-supported": "Votre navigateur ou appareil ne prend pas en charge l'authentification par clé d'accès", + "passkey-description": "Les clés d'accès offrent une alternative plus sécurisée et résistante au phishing que les mots de passe. Vous pouvez utiliser votre empreinte digitale, reconnaissance faciale ou code PIN de l'appareil pour vous connecter en toute sécurité.", + "passkey-tooltip": "Les clés d'accès sont une alternative plus simple et plus sécurisée aux mots de passe. Elles utilisent des données biométriques comme les empreintes digitales ou la reconnaissance faciale déjà stockées sur votre appareil.", + "security-section-help": "Gérez les options de sécurité, y compris les clés d'accès et les méthodes d'authentification pour protéger votre compte.", + "passkey-register": "Enregistrer une clé d'accès", + "passkey-register-another": "Enregistrer une autre clé d'accès", + "passkey-registered": "Clé d'accès enregistrée", + "passkey-registering": "Enregistrement de la clé d'accès...", + "passkey-registered-success": "Clé d'accès enregistrée avec succès !", + "passkey-registration-failed": "Échec de l'enregistrement de la clé d'accès", + "passkey-auth-failed": "Échec de l'authentification avec la clé d'accès", + "passkey-missing-user-info": "Informations utilisateur requises", + "passkeys-list": "Vos clés d'accès", + "default-passkey": "Votre clé d'accès", + "passkey-rename": "Renommer", + "passkey-delete": "Supprimer", + "passkey-rename-title": "Renommer la clé d'accès", + "passkey-delete-title": "Supprimer la clé d'accès", + "passkey-delete-confirm": "Êtes-vous sûr de vouloir supprimer la clé d'accès « {{name}} » ?", + "passkey-name": "Nom de la clé d'accès", + "passkey-name-placeholder": "Entrez un nom descriptif pour cette clé d'accès", + "passkey-renamed-success": "Clé d'accès renommée avec succès", + "passkey-deleted-success": "Clé d'accès supprimée avec succès", + "passkey-rename-failed": "Échec du renommage de la clé d'accès", + "passkey-delete-failed": "Échec de la suppression de la clé d'accès", + "processing": "Traitement en cours...", + "today": "Aujourd'hui", + "yesterday": "Hier", + "days-ago": "Il y a {{days}} jours", + "verify-with-passkey": "Vérifier avec une passkey", + "verify-with-otp": "Vérifier avec OTP", + "verify-identity": "Vérifier l'identité", + "verify-account": "Vérifiez votre identité", + "verification": "Vérification", + "passkey-verification-failed": "La vérification par passkey a échoué", + "security-auth-help": { + "p1": "Gérez les paramètres de sécurité de votre compte pour protéger vos données. OpenSign prend en charge des méthodes d'authentification avancées pour renforcer la protection de votre compte.", + "2fa-auth-help": "Ajoutez une couche de sécurité supplémentaire en activant 2FA. Cela vous demandera de saisir un code de vérification provenant d’une application d’authentification après votre mot de passe.", + "passkey-auth-help": "Utilisez des passkeys pour une connexion sans mot de passe grâce à une vérification biométrique ou basée sur l’appareil, offrant à la fois une sécurité renforcée et une grande commodité." + } } diff --git a/apps/OpenSign/public/locales/it/translation.json b/apps/OpenSign/public/locales/it/translation.json index 2d81a2fad7..93bdf22659 100644 --- a/apps/OpenSign/public/locales/it/translation.json +++ b/apps/OpenSign/public/locales/it/translation.json @@ -341,7 +341,7 @@ "verify-email-1": "Verifica email", "resend": "Reinvia", "contact-details": "Dettagli contatto", - "verify-email": "Verifica la tua email!", + "verify-email": "Si prega di verificare l'e-mail per continuare. Questo è un passaggio unico per confermare l'e-mail associata al tuo account OpenSign.", "send-otp": "Invia OTP", "otp-placeholder": "Inserisci il codice di verifica ricevuto via email", "loading-doc": "Caricamento del documento...", @@ -887,5 +887,83 @@ "do-you-want-recreate-document?": "Questo creerà una bozza da questo documento con tutti i campi intatti. Sei sicuro di voler ricreare questo documento?", "start-editing": "Inizia a modificare", "unsaved-changes-discard-them?": "Hai modifiche non salvate. Vuoi scartarle?", - "yes-discard": "Sì, scarta" + "yes-discard": "Sì, scarta", + "LTV-enabled-signatures": "Firme con LTV abilitato", + "BETA": "BETA", + "two-factor-authentication": "Autenticazione a due fattori", + "2fa-help-text": "L'autenticazione a due fattori aggiunge un ulteriore livello di sicurezza al tuo account richiedendo più di una semplice password per accedere.", + "2fa-help-bullet1": "Aumenta la sicurezza richiedendo sia la password che un codice di verifica.", + "2fa-help-bullet2": "Il codice di verifica viene generato da un'app di autenticazione sul tuo dispositivo.", + "2fa-help-bullet3": "Protegge il tuo account anche se la password è stata compromessa.", + "setup-2fa": "Configura 2FA", + "setup-2fa-again": "Configura nuovamente 2FA", + "2fa-setup-intro": "Proteggi il tuo account con l'autenticazione a due fattori. Quando è attiva, dovrai inserire un codice dall'app di autenticazione ogni volta che accedi.", + "scan-qr-code": "Scansiona il codice QR", + "scan-qr-instructions": "Usa un'app di autenticazione come Google Authenticator, Microsoft Authenticator o Authy per scansionare questo codice QR.", + "manual-setup-instructions": "Non riesci a scansionare il codice? Puoi configurare manualmente l'app usando questa chiave segreta:", + "secret-key": "Chiave segreta", + "copied-to-clipboard": "Copiato negli appunti", + "copy-to-clipboard": "Copia negli appunti", + "recovery-codes": "Codici di recupero", + "recovery-codes-instructions": "Salva questi codici di recupero in un luogo sicuro. Se perdi l'accesso all'app di autenticazione, puoi usarne uno per accedere.", + "download-recovery-codes": "Scarica i codici di recupero", + "verification-code": "Codice di verifica", + "enter-code-from-authenticator-app": "Inserisci il codice a 6 cifre dalla tua app di autenticazione", + "verification-code-required": "È richiesto il codice di verifica", + "verification-code-invalid": "Codice di verifica non valido. Riprova.", + "2fa-enabled": "2FA abilitato", + "2fa-enabled-successfully": "Autenticazione a due fattori attivata con successo", + "2fa-setup-complete": "Configurazione completata!", + "2fa-setup-complete-instructions": "Il tuo account è ora protetto da autenticazione a due fattori. Dovrai inserire un codice ogni volta che accedi.", + "two-factor-verification": "Verifica a due fattori", + "enter-verification-code-instructions": "Inserisci il codice di verifica a 6 cifre dalla tua app di autenticazione per continuare.", + "recovery-code": "Codice di recupero", + "enter-recovery-code-help": "Inserisci uno dei tuoi codici di recupero", + "recovery-code-required": "È richiesto il codice di recupero", + "use-verification-code-instead": "Usa il codice di verifica invece", + "use-recovery-code-instead": "Usa il codice di recupero invece", + "regenerate-2fa-remove-existing": "Sei sicuro di voler rigenerare l'autenticazione a due fattori? Questa azione rimuoverà le impostazioni di autenticazione esistenti.", + "use-passkey": "Accedi con passkey", + "security-section": "Sicurezza", + "passkey-authentication": "Autenticazione passkey", + "passkey-not-supported": "Il tuo browser o dispositivo non supporta l'autenticazione passkey", + "passkey-description": "Le passkey offrono un’alternativa più sicura e resistente al phishing rispetto alle password. Puoi usare l’impronta digitale, il riconoscimento facciale o il PIN del dispositivo per accedere in sicurezza.", + "passkey-tooltip": "Le passkey sono un’alternativa più semplice e sicura alle password. Usano dati biometrici come impronte digitali o riconoscimento facciale già presenti sul tuo dispositivo.", + "security-section-help": "Gestisci le opzioni di sicurezza, incluse passkey e metodi di autenticazione, per proteggere il tuo account.", + "passkey-register": "Registra passkey", + "passkey-register-another": "Registra un'altra passkey", + "passkey-registered": "Passkey registrata", + "passkey-registering": "Registrazione passkey in corso...", + "passkey-registered-success": "Passkey registrata con successo!", + "passkey-registration-failed": "Registrazione della passkey non riuscita", + "passkey-auth-failed": "Autenticazione passkey fallita", + "passkey-missing-user-info": "Informazioni utente richieste", + "passkeys-list": "Le tue passkey", + "default-passkey": "La tua passkey", + "passkey-rename": "Rinomina", + "passkey-delete": "Elimina", + "passkey-rename-title": "Rinomina passkey", + "passkey-delete-title": "Elimina passkey", + "passkey-delete-confirm": "Sei sicuro di voler eliminare la passkey \"{{name}}\"?", + "passkey-name": "Nome della passkey", + "passkey-name-placeholder": "Inserisci un nome descrittivo per questa passkey", + "passkey-renamed-success": "Passkey rinominata con successo", + "passkey-deleted-success": "Passkey eliminata con successo", + "passkey-rename-failed": "Impossibile rinominare la passkey", + "passkey-delete-failed": "Impossibile eliminare la passkey", + "processing": "Elaborazione...", + "today": "Oggi", + "yesterday": "Ieri", + "days-ago": "{{days}} giorni fa", + "verify-with-passkey": "Verifica con passkey", + "verify-with-otp": "Verifica con OTP", + "verify-identity": "Verifica identità", + "verify-account": "Verifica la tua identità", + "verification": "Verifica", + "passkey-verification-failed": "Verifica con passkey fallita", + "security-auth-help": { + "p1": "Gestisci le impostazioni di sicurezza del tuo account per proteggere i tuoi dati. OpenSign supporta metodi di autenticazione avanzati per migliorare la protezione dell’account.", + "2fa-auth-help": "Aggiungi un ulteriore livello di sicurezza abilitando 2FA. Ti verrà richiesto di inserire un codice di verifica da un'app di autenticazione dopo la password.", + "passkey-auth-help": "Usa le passkey per accedere senza password con verifica biometrica o basata sul dispositivo, garantendo sicurezza elevata e praticità." + } } diff --git a/apps/OpenSign/src/components/Header.js b/apps/OpenSign/src/components/Header.js index d36c9be6c1..f80a24cd7e 100644 --- a/apps/OpenSign/src/components/Header.js +++ b/apps/OpenSign/src/components/Header.js @@ -31,14 +31,15 @@ const Header = ({ showSidebar, setIsMenu, isConsole }) => { initializeHead(); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); + async function initializeHead() { - const applogo = await getAppLogo(); - if (applogo?.logo) { - setAppLogo(applogo?.logo); - } else { - const logo = localStorage.getItem("appLogo") || appInfo.applogo; - setAppLogo(logo); - } + const applogo = await getAppLogo(); + if (applogo?.logo) { + setAppLogo(applogo?.logo); + } else { + const logo = localStorage.getItem("appLogo") || appInfo.applogo; + setAppLogo(logo); + } } const closeDropdown = async () => { @@ -151,15 +152,15 @@ const Header = ({ showSidebar, setIsMenu, isConsole }) => { > {!isConsole && ( <> -
  • - openInNewTab("https://docs.opensignlabs.com") - } - > - - {t("docs")} - -
  • +
  • + openInNewTab("https://docs.opensignlabs.com") + } + > + + {t("docs")} + +
  • { setIsOpen(false); diff --git a/apps/OpenSign/src/components/shared/fields/CreateFolder.js b/apps/OpenSign/src/components/shared/fields/CreateFolder.js index d40c698ab0..c61bf73494 100644 --- a/apps/OpenSign/src/components/shared/fields/CreateFolder.js +++ b/apps/OpenSign/src/components/shared/fields/CreateFolder.js @@ -1,10 +1,10 @@ -import React, { useEffect, useState } from "react"; +import React, { useState } from "react"; import Parse from "parse"; import Alert from "../../../primitives/Alert"; import Loader from "../../../primitives/Loader"; import { useTranslation } from "react-i18next"; -const CreateFolder = ({ parentFolderId, onSuccess, folderCls }) => { +const CreateFolder = ({ parentFolderId, onSuccess, folderCls, onBack }) => { const folderPtr = { __type: "Pointer", className: folderCls, @@ -12,41 +12,11 @@ const CreateFolder = ({ parentFolderId, onSuccess, folderCls }) => { }; const { t } = useTranslation(); const [name, setName] = useState(""); - const [folderList, setFolderList] = useState([]); - const [isAlert, setIsAlert] = useState(false); const [isLoader, setIsLoader] = useState(false); - const [selectedParent, setSelectedParent] = useState(); const [alert, setAlert] = useState({ type: "info", message: "" }); - useEffect(() => { - fetchFolder(); - // eslint-disable-next-line - }, []); - - const fetchFolder = async () => { - try { - const FolderQuery = new Parse.Query(folderCls); - if (parentFolderId) { - FolderQuery.equalTo("Folder", folderPtr); - FolderQuery.equalTo("Type", "Folder"); - FolderQuery.notEqualTo("IsArchive", true); - FolderQuery.equalTo("CreatedBy", Parse.User.current()); - } else { - FolderQuery.doesNotExist("Folder"); - FolderQuery.equalTo("Type", "Folder"); - FolderQuery.notEqualTo("IsArchive", true); - FolderQuery.equalTo("CreatedBy", Parse.User.current()); - } - - const res = await FolderQuery.find(); - if (res) { - const result = JSON.parse(JSON.stringify(res)); - if (result) { - setFolderList(result); - } - } - } catch (error) { - console.log("Err ", error); - } + const showToast = (type, msg) => { + setAlert({ type: type, message: msg }); + setTimeout(() => setAlert({ type: type, message: "" }), 1000); }; const handleCreateFolder = async (event) => { event.preventDefault(); @@ -62,60 +32,32 @@ const CreateFolder = ({ parentFolderId, onSuccess, folderCls }) => { } const templExist = await exsitQuery.first(); if (templExist) { - setAlert({ type: "danger", message: t("folder-already-exist") }); - setIsAlert(true); - setTimeout(() => { - setIsAlert(false); - }, 1000); + showToast("danger", t("folder-already-exist")); } else { const template = new Parse.Object(folderCls); template.set("Name", name); template.set("Type", "Folder"); - - if (selectedParent) { - template.set("Folder", { - __type: "Pointer", - className: folderCls, - objectId: selectedParent - }); - } else if (parentFolderId) { + if (parentFolderId) { template.set("Folder", folderPtr); } template.set("CreatedBy", Parse.User.createWithoutData(currentUser.id)); const res = await template.save(); if (res) { handleLoader(false); - setAlert({ - type: "success", - message: t("folder-created-successfully") - }); - setIsAlert(true); - setTimeout(() => { - setIsAlert(false); - }, 1000); - if (onSuccess) { - onSuccess(res); - } + showToast("success", t("folder-created-successfully")); + onSuccess && onSuccess(res?.toJSON()); } } } else { handleLoader(false); - setAlert({ type: "info", message: t("fill-folder-name") }); - setIsAlert(true); - setTimeout(() => { - setIsAlert(false); - }, 1000); + showToast("info", t("fill-folder-name")); } }; - const handleOptions = (e) => { - setSelectedParent(e.target.value); - }; - const handleLoader = (status) => { - setIsLoader(status); - }; + const handleLoader = (status) => setIsLoader(status); + return (
    - {isAlert && {alert.message}} + {alert.message && {alert.message}}
    {isLoader && (
    @@ -139,31 +81,25 @@ const CreateFolder = ({ parentFolderId, onSuccess, folderCls }) => { required />
    -
    - - -
    -
    +
    + {onBack && ( +
    onBack()} + > + + {t("back")} +
    + )}
    diff --git a/apps/OpenSign/src/components/shared/fields/FolderModal.js b/apps/OpenSign/src/components/shared/fields/FolderModal.js index 99ae710f5b..16bb967433 100644 --- a/apps/OpenSign/src/components/shared/fields/FolderModal.js +++ b/apps/OpenSign/src/components/shared/fields/FolderModal.js @@ -6,8 +6,7 @@ import { useTranslation } from "react-i18next"; const FolderModal = (props) => { const { t } = useTranslation(); - const appName = - "OpenSign™"; + const appName = "OpenSign™"; const drivename = appName === "OpenSign™" ? "OpenSign™" : ""; const [clickFolder, setClickFolder] = useState(""); const [folderList, setFolderList] = useState([]); @@ -105,49 +104,45 @@ const FolderModal = (props) => { // `handleCancel` is call when user click on folder name from path/tab in popup const removeTabListItem = async (e, i) => { e.preventDefault(); - // setEditable(false); - if (!isAdd) { - setIsLoader(true); - let folderPtr; - if (i) { - setFolderList([]); - let list = tabList.filter((itm, j) => { - if (j <= i) { - return itm; - } - }); - let _len = list.length - 1; - folderPtr = { - __type: "Pointer", - className: props.folderCls, - objectId: list[_len].objectId - }; - setTabList(list); - } else { - setClickFolder({}); - setFolderList([]); - setTabList([]); - } + + setIsLoader(true); + setIsAdd(false); + if (i !== undefined) { + setFolderList([]); + const list = tabList.filter((folder, j) => j <= i && folder); + const index = list.length - 1; + const folderPtr = { + __type: "Pointer", + className: props.folderCls, + objectId: list[index].objectId + }; + setTabList(list); fetchFolder(folderPtr); + } else { + setClickFolder({}); + setFolderList([]); + setTabList([]); + fetchFolder(); } }; // `handleCreate` is used to open folder creation form in popup - const handleCreate = () => { - setIsAdd(!isAdd); - }; + const handleCreate = () => setIsAdd(true); + const handleBack = () => setIsAdd(false); // `handleAddFolder` is call when user folder created successfully and it fetch folder list on the basis of folderPtr or without folderPtr const handleAddFolder = (newFolder) => { - props.setPdfData((prev) => [...prev, newFolder?.toJSON()]); + props.setPdfData((prev) => [...prev, newFolder]); if (clickFolder && clickFolder.ObjectId) { fetchFolder({ __type: "Pointer", className: props.folderCls, - objectId: clickFolder.ObjectId + objectId: newFolder.objectId // clickFolder.ObjectId }); } else { fetchFolder(); } - handleCreate(); + setClickFolder({ ObjectId: newFolder.objectId, Name: newFolder.Name }); + setTabList((prev) => [...prev, newFolder]); + handleBack(); }; return (
    @@ -180,54 +175,57 @@ const FolderModal = (props) => { ))}
    -
    -
    - {!isAdd && folderList.length > 0 - ? folderList.map((folder) => ( -
    - folder.Type === "Folder" && handleSelect(folder) - } - > -
    - {folder.Type === "Folder" ? ( - - - - ) : ( - - - - )} - {folder.Name} +
    + {!isAdd && ( +
    + {folderList.length > 0 + ? folderList.map((folder) => ( +
    + folder.Type === "Folder" && handleSelect(folder) + } + > +
    + {folder.Type === "Folder" ? ( + + + + ) : ( + + + + )} + {folder.Name} +
    -
    - )) - : !isLoader && ( -
    - {t("no-data")} -
    - )} -
    + )) + : !isLoader && ( +
    + {t("no-data")} +
    + )} +
    + )} {isAdd && ( )} {isLoader && ( @@ -238,33 +236,26 @@ const FolderModal = (props) => {

    -
    -
    - {isAdd ? ( - <> - - {t("back")} - - ) : ( - <> - - {t("add-folder")} - - )} -
    -
    - - {t("save-here")} + {!isAdd && ( +
    +
    + + {t("save-here")} +
    +
    + + {t("add-folder")} +
    -
    + )}
    ); diff --git a/apps/OpenSign/src/components/shared/fields/SelectFolder.js b/apps/OpenSign/src/components/shared/fields/SelectFolder.js index 4bb6c41e1a..10f43bb8ae 100644 --- a/apps/OpenSign/src/components/shared/fields/SelectFolder.js +++ b/apps/OpenSign/src/components/shared/fields/SelectFolder.js @@ -6,8 +6,7 @@ import Tooltip from "../../../primitives/Tooltip"; import { useTranslation } from "react-i18next"; const SelectFolder = ({ required, onSuccess, folderCls, isReset }) => { - const appName = - "OpenSign™"; + const appName = "OpenSign™"; const drivename = appName === "OpenSign™" ? "OpenSign™" : ""; const { t } = useTranslation(); const [isOpen, SetIsOpen] = useState(false); @@ -125,50 +124,46 @@ const SelectFolder = ({ required, onSuccess, folderCls, isReset }) => { // `handleCancel` is call when user click on folder name from path/tab in popup const removeTabListItem = async (e, i) => { e.preventDefault(); - // setEditable(false); - if (!isAdd) { - setIsLoader(true); - let folderPtr; - if (i) { - setFolderList([]); - let list = tabList.filter((itm, j) => { - if (j <= i) { - return itm; - } - }); - let _len = list.length - 1; - folderPtr = { - __type: "Pointer", - className: folderCls, - objectId: list[_len].objectId - }; - setTabList(list); - } else { - setClickFolder({}); - setSelectedFolder({}); - setFolderList([]); - setTabList([]); - } + setIsLoader(true); + setIsAdd(false); + if (i !== undefined) { + setFolderList([]); + const list = tabList.filter((folder, j) => j <= i && folder); + const index = list.length - 1; + const folderPtr = { + __type: "Pointer", + className: folderCls, + objectId: list[index].objectId + }; fetchFolder(folderPtr); + setTabList(list); + } else { + setClickFolder({}); + setSelectedFolder({}); + setFolderList([]); + setTabList([]); + fetchFolder(); } }; // `handleCreate` is used to open folder creation form in popup - const handleCreate = () => { - setIsAdd(!isAdd); - }; + const handleCreate = () => setIsAdd(true); + const handleBack = () => setIsAdd(false); + // `handleAddFolder` is call when user folder created successfully and it fetch folder list on the basis of folderPtr or without folderPtr - const handleAddFolder = () => { + const handleAddFolder = (newFolder) => { setFolderList([]); if (clickFolder && clickFolder.ObjectId) { fetchFolder({ __type: "Pointer", className: folderCls, - objectId: clickFolder.ObjectId + objectId: newFolder.objectId // clickFolder.ObjectId }); } else { fetchFolder(); } - handleCreate(); + setClickFolder({ ObjectId: newFolder.objectId, Name: newFolder.Name }); + setTabList((prev) => [...prev, newFolder]); + handleBack(); }; return (
    @@ -246,53 +241,56 @@ const SelectFolder = ({ required, onSuccess, folderCls, isReset }) => {
    -
    - {!isAdd && folderList.length > 0 - ? folderList.map((folder) => ( -
    - folder.Type === "Folder" && handleSelect(folder) - } - > -
    - {folder.Type === "Folder" ? ( - - - - ) : ( - - - - )} - {folder.Name} + {!isAdd && ( +
    + {folderList.length > 0 + ? folderList.map((folder) => ( +
    + folder.Type === "Folder" && handleSelect(folder) + } + > +
    + {folder.Type === "Folder" ? ( + + + + ) : ( + + + + )} + {folder.Name} +
    -
    - )) - : !isLoader && ( -
    - {t("no-data")} -
    - )} -
    + )) + : !isLoader && ( +
    + {t("no-data")} +
    + )} +
    + )} {isAdd && ( )} {isLoader && ( @@ -303,33 +301,26 @@ const SelectFolder = ({ required, onSuccess, folderCls, isReset }) => {

    -
    -
    - {isAdd ? ( - <> - - {t("back")} - - ) : ( - <> - - {t("add-folder")} - - )} -
    -
    - - {t("save-here")} + {!isAdd && ( +
    +
    + + {t("save-here")} +
    +
    + + {t("add-folder")} +
    -
    + )}
    ); diff --git a/apps/OpenSign/src/pages/GuestLogin.js b/apps/OpenSign/src/pages/GuestLogin.js index 8ff60c92fe..edb5d60d8d 100644 --- a/apps/OpenSign/src/pages/GuestLogin.js +++ b/apps/OpenSign/src/pages/GuestLogin.js @@ -10,6 +10,8 @@ import { useTranslation } from "react-i18next"; import SelectLanguage from "../components/pdf/SelectLanguage"; import LoaderWithMsg from "../primitives/LoaderWithMsg"; import Title from "../components/Title"; +import ModalUi from "../primitives/ModalUi"; +import Loader from "../primitives/Loader"; function GuestLogin() { const { t, i18n } = useTranslation(); @@ -30,6 +32,7 @@ function GuestLogin() { const [contactId, setContactId] = useState(contactBookId); const [sendmail, setSendmail] = useState(); const [contact, setContact] = useState({ name: "", phone: "", email: "" }); + const navigateToDoc = async (docId, contactId) => { try { const docDetails = await Parse.Cloud.run("getDocument", { @@ -53,6 +56,7 @@ function GuestLogin() { return false; } }; + useEffect(() => { handleServerUrl(); // eslint-disable-next-line react-hooks/exhaustive-deps @@ -124,6 +128,7 @@ function GuestLogin() { } } catch (error) { alert(t("something-went-wrong-mssg")); + setLoading(false); } }; @@ -188,11 +193,13 @@ function GuestLogin() { } } catch (error) { console.log("err ", error); + setLoading(false); } } else { alert(t("enter-otp-alert")); } }; + const handleUserData = async (e) => { e.preventDefault(); if (!emailRegex.test(contact.email?.toLowerCase()?.replace(/\s/g, ""))) { @@ -221,6 +228,7 @@ function GuestLogin() { } } }; + const handleInputChange = (e) => { if (e.target.name === "email") { setContact((prev) => ({ @@ -231,9 +239,56 @@ function GuestLogin() { setContact((prev) => ({ ...prev, [e.target.name]: e.target.value })); } }; + return (
    + + {/* OTP Verification Modal */} + {EnterOTP && ( + <ModalUi + isOpen + title={t("otp-verification")} + handleClose={() => setEnterOtp(false)} + > + {loading ? ( + <div className="h-[150px] flex justify-center items-center"> + <Loader /> + </div> + ) : ( + <form onSubmit={(e) => VerifyOTP(e)}> + <div className="px-6 py-3 text-base-content"> + <label className="mb-2">{t("enter-otp")}</label> + <input + onInvalid={(e) => + e.target.setCustomValidity(t("input-required")) + } + onInput={(e) => e.target.setCustomValidity("")} + required + type="tel" + pattern="[0-9]{4}" + className="w-full op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content text-xs" + placeholder={t("otp-placeholder")} + value={OTP} + onChange={(e) => setOTP(e.target.value)} + /> + </div> + <div className="px-6 mb-3"> + <button type="submit" className="op-btn op-btn-primary"> + {t("verify")} + </button> + <button + className="op-btn op-btn-secondary ml-2" + onClick={(e) => handleSendOTPBtn(e)} + > + {t("resend")} + </button> + </div> + </form> + )} + </ModalUi> + )} + {isLoading.isLoad ? ( <LoaderWithMsg isLoading={isLoading} /> ) : ( @@ -249,63 +304,34 @@ function GuestLogin() { )} </div> {contactId ? ( - <> - {!EnterOTP ? ( - <div className="w-full md:w-[50%] text-base-content"> - <h1 className="text-2xl md:text-[30px]">{t("welcome")}</h1> - <legend className="text-[12px] text-[#878787] mt-2 mb-1"> - {t("get-otp-alert")} - </legend> - <div className="p-[20px] outline outline-1 outline-slate-300/50 my-2 op-card shadow-md"> - <input - type="email" - name="email" - value={email} - className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full disabled:text-[#5c5c5c] text-xs" - disabled - /> - </div> - <div className="mt-3"> - <button - className="op-btn op-btn-primary" - onClick={(e) => handleSendOTPBtn(e)} - disabled={loading} - > - {loading ? t("loading") : t("get-verification-code")} - </button> - </div> - </div> - ) : ( - <form - className="w-full md:w-[50%] text-base-content" - onSubmit={VerifyOTP} + <div className="w-full md:w-[50%] text-base-content"> + <h1 className="text-2xl md:text-[30px]">{t("welcome")}</h1> + <legend className="text-[12px] text-[#878787] mt-2 mb-1"> + {t("get-otp-alert")} + </legend> + <div className="p-[20px] outline outline-1 outline-slate-300/50 my-2 op-card shadow-md"> + <input + type="email" + name="email" + value={email} + className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full disabled:text-[#5c5c5c] text-xs" + disabled + /> + </div> + <div className="mt-3"> + <button + className="op-btn op-btn-primary flex items-center" + onClick={(e) => { + e.preventDefault(); + SendOtp(); + }} + disabled={loading} > - <h1 className="text-2xl md:text-[30px]">{t("welcome")}</h1> - <legend className="text-[12px] text-[#878787] mt-2"> - {t("guest-email-alert")} - </legend> - <div className="p-[20px] pt-[15px] outline outline-1 outline-slate-300/50 op-card my-2 shadow-md"> - <p className="text-sm">{t("enter-verification-code")}</p> - <input - type="number" - className="mt-2 op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs" - name="OTP" - value={OTP} - onChange={(e) => setOTP(e.target.value)} - /> - </div> - <div className="mt-2.5"> - <button - className="op-btn op-btn-primary" - type="submit" - disabled={loading} - > - {loading ? t("loading") : t("verify")} - </button> - </div> - </form> - )} - </> + <i className="fa-light fa-message-sms mr-2"></i> + {loading ? t("loading") : t("get-verification-code")} + </button> + </div> + </div> ) : ( <div className="w-full md:w-[50%] text-base-content"> <h1 className="text-2xl md:text-[30px]">{t("welcome")}</h1> diff --git a/apps/OpenSign/src/pages/Login.js b/apps/OpenSign/src/pages/Login.js index 4a3df40717..f09ee2c0ec 100644 --- a/apps/OpenSign/src/pages/Login.js +++ b/apps/OpenSign/src/pages/Login.js @@ -87,100 +87,47 @@ function Login() { const handleSubmit = async (event) => { localStorage.removeItem("accesstoken"); event.preventDefault(); + if (!emailRegex.test(state.email)) { alert("Please enter a valid email address."); - } else { - const { email, password } = state; - if (email && password) { - try { - setState({ ...state, loading: true }); - localStorage.setItem("appLogo", appInfo.applogo); - // Pass the username and password to logIn function - const user = await Parse.User.logIn(email, password); - if (user) { - let _user = user.toJSON(); - localStorage.setItem("UserInformation", JSON.stringify(_user)); - localStorage.setItem("userEmail", email); - localStorage.setItem("accesstoken", _user.sessionToken); - localStorage.setItem("scriptId", true); - if (_user.ProfilePic) { - localStorage.setItem("profileImg", _user.ProfilePic); - } else { - localStorage.setItem("profileImg", ""); - } - // Check extended class user role and tenentId - try { - const userSettings = appInfo.settings; - await Parse.Cloud.run("getUserDetails") - .then(async (extUser) => { - if (extUser) { - // console.log("extUser", extUser, extUser?.get("IsDisabled")); - const IsDisabled = extUser?.get("IsDisabled") || false; - if (!IsDisabled) { - const userRole = extUser?.get("UserRole"); - const menu = - userRole && - userSettings.find((menu) => menu.role === userRole); - if (menu) { - const _currentRole = userRole; - const redirectUrl = - location?.state?.from || - `/${menu.pageType}/${menu.pageId}`; - let _role = _currentRole.replace("contracts_", ""); - localStorage.setItem("_user_role", _role); - const checkLanguage = extUser?.get("Language"); - if (checkLanguage) { - checkLanguage && i18n.changeLanguage(checkLanguage); - } + return; + } - const results = [extUser]; - const extUser_str = JSON.stringify(results); + const { email, password } = state; + if (!email || !password) { + return; + } - localStorage.setItem("Extand_Class", extUser_str); - const extInfo = JSON.parse(JSON.stringify(extUser)); - localStorage.setItem("userEmail", extInfo.Email); - localStorage.setItem("username", extInfo.Name); - if (extInfo?.TenantId) { - const tenant = { - Id: extInfo?.TenantId?.objectId || "", - Name: extInfo?.TenantId?.TenantName || "" - }; - localStorage.setItem("TenantId", tenant?.Id); - dispatch(showTenant(tenant?.Name)); - localStorage.setItem("TenantName", tenant?.Name); - } - localStorage.setItem("PageLanding", menu.pageId); - localStorage.setItem("defaultmenuid", menu.menuId); - localStorage.setItem("pageType", menu.pageType); - setState({ ...state, loading: false }); - // Redirect to the appropriate URL after successful login - navigate(redirectUrl); - } else { - setState({ ...state, loading: false }); - setIsModal(true); - } - } else { - showToast("danger", t("do-not-access-contact-admin")); - logOutUser(); - } - } else { - showToast("danger", t("user-not-found")); - logOutUser(); - } - }) - .catch((error) => { - showToast("danger", t("something-went-wrong-mssg")); - console.error("Error while fetching Follow", error); - }); - } catch (error) { - showToast("danger", `${error.message}`); - } - } - } catch (error) { - console.error("Error while logging in user", error); - showToast("danger", "Invalid username/password or region"); + try { + setState({ ...state, loading: true }); + localStorage.setItem("appLogo", appInfo.applogo); + const _user = await Parse.Cloud.run("loginuser", { email, password }); + if (!_user) { + setState({ ...state, loading: false }); + return; + } + // Get extended user data (including 2FA status) using cloud function + try { + await Parse.User.become(_user.sessionToken); + // Store basic user info needed for further steps + localStorage.setItem("UserInformation", JSON.stringify(_user)); + localStorage.setItem("userEmail", email); + localStorage.setItem("accesstoken", _user.sessionToken); + localStorage.setItem("scriptId", true); + if (_user.ProfilePic) { + localStorage.setItem("profileImg", _user.ProfilePic); + } else { + localStorage.setItem("profileImg", ""); } + await continueLoginFlow(); + } catch (error) { + console.error("Error checking 2FA status:", error); + showToast("danger", t("something-went-wrong-mssg")); + setState({ ...state, loading: false }); } + } catch (error) { + console.error("Error while logging in user", error); + showToast("danger", "Invalid username/password or region"); } }; @@ -289,52 +236,51 @@ function Login() { localStorage.setItem("profileImg", ""); } const userSettings = appInfo.settings; - await Parse.Cloud.run("getUserDetails").then(async (extUser) => { - if (extUser) { - const IsDisabled = extUser?.get("IsDisabled") || false; - if (!IsDisabled) { - const userRole = extUser.get("UserRole"); - const _currentRole = userRole; - const menu = - userRole && userSettings.find((menu) => menu.role === userRole); - if (menu) { - const _role = _currentRole.replace("contracts_", ""); - localStorage.setItem("_user_role", _role); - const redirectUrl = - location?.state?.from || `/${menu.pageType}/${menu.pageId}`; - const results = [extUser]; - const extendedInfo_stringify = JSON.stringify(results); - localStorage.setItem("Extand_Class", extendedInfo_stringify); - const extInfo = JSON.parse(JSON.stringify(extUser)); - localStorage.setItem("userEmail", extInfo.Email); - localStorage.setItem("username", extInfo.Name); - if (extInfo?.TenantId) { - const tenant = { - Id: extInfo?.TenantId?.objectId || "", - Name: extInfo?.TenantId?.TenantName || "" - }; - localStorage.setItem("TenantId", tenant?.Id); - dispatch(showTenant(tenant?.Name)); - localStorage.setItem("TenantName", tenant?.Name); - } - localStorage.setItem("PageLanding", menu.pageId); - localStorage.setItem("defaultmenuid", menu.menuId); - localStorage.setItem("pageType", menu.pageType); - // Redirect to the appropriate URL after successful login - navigate(redirectUrl); - } else { - setState({ ...state, loading: false }); - logOutUser(); + const extUser = await Parse.Cloud.run("getUserDetails"); + if (extUser) { + const IsDisabled = extUser?.get("IsDisabled") || false; + if (!IsDisabled) { + const userRole = extUser.get("UserRole"); + const _currentRole = userRole; + const menu = + userRole && userSettings.find((menu) => menu.role === userRole); + if (menu) { + const _role = _currentRole.replace("contracts_", ""); + localStorage.setItem("_user_role", _role); + const redirectUrl = + location?.state?.from || `/${menu.pageType}/${menu.pageId}`; + const results = [extUser]; + const extendedInfo_stringify = JSON.stringify(results); + localStorage.setItem("Extand_Class", extendedInfo_stringify); + const extInfo = JSON.parse(JSON.stringify(extUser)); + localStorage.setItem("userEmail", extInfo.Email); + localStorage.setItem("username", extInfo.Name); + if (extInfo?.TenantId) { + const tenant = { + Id: extInfo?.TenantId?.objectId || "", + Name: extInfo?.TenantId?.TenantName || "" + }; + localStorage.setItem("TenantId", tenant?.Id); + dispatch(showTenant(tenant?.Name)); + localStorage.setItem("TenantName", tenant?.Name); } + localStorage.setItem("PageLanding", menu.pageId); + localStorage.setItem("defaultmenuid", menu.menuId); + localStorage.setItem("pageType", menu.pageType); + // Redirect to the appropriate URL after successful login + navigate(redirectUrl); } else { - showToast("danger", t("do-not-access-contact-admin")); + setState({ ...state, loading: false }); logOutUser(); } } else { - showToast("danger", t("user-not-found")); + showToast("danger", t("do-not-access-contact-admin")); logOutUser(); } - }); + } else { + showToast("danger", t("user-not-found")); + logOutUser(); + } } catch (error) { showToast("danger", t("something-went-wrong-mssg")); console.log("err", error); @@ -417,6 +363,67 @@ function Login() { localStorage.setItem("parseAppId", appid); }; + const continueLoginFlow = async () => { + try { + const userSettings = appInfo.settings; + const extUser = await Parse.Cloud.run("getUserDetails"); + if (extUser) { + const IsDisabled = extUser?.get("IsDisabled") || false; + if (!IsDisabled) { + const userRole = extUser?.get("UserRole"); + const menu = + userRole && userSettings?.find((menu) => menu.role === userRole); + if (menu) { + const _currentRole = userRole; + const redirectUrl = + location?.state?.from || `/${menu.pageType}/${menu.pageId}`; + let _role = _currentRole.replace("contracts_", ""); + localStorage.setItem("_user_role", _role); + const checkLanguage = extUser?.get("Language"); + if (checkLanguage) { + checkLanguage && i18n.changeLanguage(checkLanguage); + } + + // Continue with storing user data and redirecting + const results = [extUser]; + const extUser_str = JSON.stringify(results); + localStorage.setItem("Extand_Class", extUser_str); + const extInfo = JSON.parse(JSON.stringify(extUser)); + localStorage.setItem("userEmail", extInfo.Email); + localStorage.setItem("username", extInfo.Name); + if (extInfo?.TenantId) { + const tenant = { + Id: extInfo?.TenantId?.objectId || "", + Name: extInfo?.TenantId?.TenantName || "" + }; + localStorage.setItem("TenantId", tenant?.Id); + dispatch(showTenant(tenant?.Name)); + localStorage.setItem("TenantName", tenant?.Name); + } + localStorage.setItem("PageLanding", menu.pageId); + localStorage.setItem("defaultmenuid", menu.menuId); + localStorage.setItem("pageType", menu.pageType); + + setState({ ...state, loading: false }); + navigate(redirectUrl); + } else { + setState({ ...state, loading: false }); + setIsModal(true); + } + } else { + showToast("danger", t("do-not-access-contact-admin")); + logOutUser(); + } + } else { + showToast("danger", t("user-not-found")); + logOutUser(); + } + } catch (error) { + console.error("Error during login flow", error); + showToast("danger", error.message || t("something-went-wrong-mssg")); + } + }; + return errMsg ? ( <div className="h-screen flex justify-center text-center items-center p-4 text-gray-500 text-base"> {errMsg} @@ -437,7 +444,7 @@ function Login() { <div aria-labelledby="loginHeading" role="region" - className="pb-1 md:pb-4 pt-10 md:px-10 lg:px-16 h-screen" + className="pb-1 md:pb-4 pt-10 md:px-10 lg:px-16 h-full" > <div className="md:p-4 lg:p-10 p-4 bg-base-100 text-base-content op-card"> <div className="w-[250px] h-[66px] inline-block overflow-hidden"> diff --git a/apps/OpenSign/src/pages/Opensigndrive.js b/apps/OpenSign/src/pages/Opensigndrive.js index 6b6e32a632..474eb2d631 100644 --- a/apps/OpenSign/src/pages/Opensigndrive.js +++ b/apps/OpenSign/src/pages/Opensigndrive.js @@ -58,6 +58,9 @@ function Opensigndrive() { const [isDontShow, setIsDontShow] = useState(false); const [tourData, setTourData] = useState(); const [showTourFirstTIme, setShowTourFirstTime] = useState(true); + const [searchTerm, setSearchTerm] = useState(""); + const [mobileSearchOpen, setMobileSearchOpen] = useState(false); + const debounceTimer = useRef(null); const orderName = { Ascending: "Ascending", Descending: "Descending", @@ -209,9 +212,7 @@ function Opensigndrive() { }); } finally { setLoading(false); - setIsLoading({ - isLoad: false - }); + setIsLoading({ isLoad: false }); } }; @@ -219,15 +220,16 @@ function Opensigndrive() { const handleScroll = () => { //get document of render openSign-drive component using id const documentList = document.getElementById("renderList"); - //documentList.clientHeight property returns the height of an element's content area, including padding but not including borders, margins, or scrollbars. - //documentList.scrollHeight property returns the entire height of an element,including the parts that are not visible due to overflow.. - // documentList.scrollTop property show height of element, how much the content has been scrolled from the top. + const { scrollTop, clientHeight, scrollHeight } = documentList; + const scrolled = Math.ceil(scrollTop + clientHeight); // ceil return e.g 3.14 => 4 + const totalHeight = Math.floor(scrollHeight); // floor return e.g 3.14 => 3 + + // clientHeight property returns the height of an element's content area, including padding but not including borders, margins, or scrollbars. + // scrollHeight property returns the entire height of an element,including the parts that are not visible due to overflow.. + // scrollTop property show height of element, how much the content has been scrolled from the top. // When the sum of scrollTop and clientHeight is equal to scrollHeight, it means that the user has scrolled to the bottom of the div. - if ( - documentList && - documentList.scrollTop + documentList.clientHeight >= - documentList.scrollHeight - ) { + + if (scrolled >= totalHeight) { //disableLoading is used disable initial loader const disableLoading = true; // If the fetched data length is less than the limit, it means there's no more data to fetch @@ -252,11 +254,7 @@ function Opensigndrive() { const handleRoute = (index, folderData) => { setSkip(0); // after onclick on route filter route from that index - const updateFolderName = folderName.filter((x, i) => { - if (i <= index) { - return x; - } - }); + const updateFolderName = folderName.filter((_, i) => i <= index); setFolderName(updateFolderName); //get route details after onclick path of folder name const getCurrentId = folderData[index]; @@ -517,6 +515,34 @@ function Opensigndrive() { setIsTour(true); } } + + const handleSearchChange = async (e) => { + const name = e.target.value.toLowerCase(); + setSearchTerm(name); + // Clear previous timer + if (debounceTimer.current) { + clearTimeout(debounceTimer.current); + } + // Start new debounce timer + debounceTimer.current = setTimeout(async () => { + try { + const res = await Parse.Cloud.run("filterdocs", { searchTerm: name }); + setPdfData(JSON.parse(JSON.stringify(res))); + } catch (err) { + console.error("Search error:", err); + alert(`Error: ${err.message}`); + } + }, 300); + }; + // Cleanup on unmount + useEffect(() => { + return () => { + if (debounceTimer.current) { + clearTimeout(debounceTimer.current); + } + }; + }, []); + return ( <div className="bg-base-100 text-base-content rounded-box w-full shadow-md"> <Title title={`${drivename} Drive`} drive={true} /> @@ -524,22 +550,14 @@ function Opensigndrive() { isOpen={isAlert.isShow} title={t("alert")} handleClose={() => { - setIsAlert({ - isShow: false, - alertMessage: "" - }); + setIsAlert({ isShow: false, alertMessage: "" }); }} > <div className="h-full p-[20px] pb-[15px]"> <p>{isAlert.alertMessage}</p> <div className="h-[1px] bg-[#9f9f9f] w-full my-[15px]"></div> <button - onClick={() => - setIsAlert({ - isShow: false, - alertMessage: "" - }) - } + onClick={() => setIsAlert({ isShow: false, alertMessage: "" })} type="button" className="op-btn op-btn-neutral op-btn-sm" > @@ -608,7 +626,7 @@ function Opensigndrive() { </div> ) : ( <> - <div className="flex flex-row justify-between items-center px-[15px] md:px-[25px] pt-[20px]"> + <div className="flex flex-row justify-between items-center px-[15px] md:px-[25px] pt-2 md:pt-[20px]"> {tourData && ( <Tour onRequestClose={closeTour} @@ -627,24 +645,44 @@ function Opensigndrive() { > {handleFolderTab(folderName)} </div> - <div className="flex flex-row items-center"> + <div className="flex flex-row items-center justify-center md:gap-1"> + {/* Desktop search input */} + <div className="hidden md:block p-2"> + <input + type="search" + value={searchTerm} + onChange={handleSearchChange} + placeholder="Search documents…" + className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-64 text-xs" + /> + </div> + {/* Mobile search toggle */} + <button + className="md:hidden p-2 flex justify-center items-center focus:outline-none rounded-md hover:bg-gray-200 text-[18px]" + aria-label="Search" + onClick={() => setMobileSearchOpen((open) => !open)} + > + <i + style={{ color: `${iconColor}` }} + className="fa-solid fa-magnifying-glass" + ></i> + </button> <div id="folder-menu" className={`${ isOptions ? "dropdown show dropDownStyle" : "dropdown" - } hidden md:block`} + } hidden md:block cursor-pointer hover:bg-gray-200 p-2 rounded-md`} onClick={() => setIsOptions(!isOptions)} > - <div className="sort" data-tut="reactourSecond"> + <div data-tut="reactourSecond"> <i - className="fa-light fa-plus-square" + className="fa-light fa-plus-square text-[24px]" aria-hidden="true" - style={{ fontSize: "25px", color: `${iconColor}` }} + style={{ color: `${iconColor}` }} ></i> </div> <div className={`${isOptions ? "block" : "hidden"} ${dropdowncss}`} - // className={isOptions ? "dropdown-menu show" : "dropdown-menu"} aria-labelledby="dropdownMenuButton" aria-expanded={isOptions ? "true" : "false"} > @@ -683,11 +721,11 @@ function Opensigndrive() { > <div data-tut="reactourThird" - className="sort " + className="cursor-pointer flex flex-row items-center justify-center p-2 hover:bg-gray-200 rounded-md" data-toggle="dropdown" > <i - className="fa-light fa-sort-amount-asc mr-[5px] text-[14px]" + className="fa-light fa-sort-amount-asc mr-[5px] text-[19px]" aria-hidden="true" style={{ color: `${iconColor}` }} ></i> @@ -702,69 +740,59 @@ function Opensigndrive() { aria-labelledby="dropdownMenuButton" aria-expanded={isShowSort ? "true" : "false"} > - {sortingValue.map((value, ind) => { - return ( - <span - key={ind} - onClick={() => { - setSelectedSort(value); - sortingData(value, null, pdfData); - }} - className="dropdown-item text-[10px] md:text-[13px]" - style={{ - paddingLeft: selectedSort !== value && "31px" - }} - > - {selectedSort === value && ( - <i - className="fa-light fa-check" - aria-hidden="true" - ></i> - )} - <span className="ml-[5px]"> - {t(`sort-order.${value}`)} - </span> + {sortingValue.map((value, ind) => ( + <span + key={ind} + onClick={() => { + setSelectedSort(value); + sortingData(value, null, pdfData); + }} + className="dropdown-item text-[10px] md:text-[13px]" + style={{ + paddingLeft: selectedSort !== value && "31px" + }} + > + {selectedSort === value && ( + <i className="fa-light fa-check" aria-hidden="true"></i> + )} + <span className="ml-[5px]"> + {t(`sort-order.${value}`)} </span> - ); - })} + </span> + ))} <hr className="hrStyle" /> - {sortOrder.map((order, ind) => { - return ( - <span - key={ind} - onClick={() => { - setSortingOrder(order); - sortingData(null, order, pdfData); - }} - className="dropdown-item text-[10px] md:text-[13px]" - style={{ - paddingLeft: sortingOrder !== order && "31px" - }} - > - {sortingOrder === order && ( - <i - className="fa-light fa-check" - aria-hidden="true" - ></i> - )} - <span className="ml-[5px]"> - {t(`sort-order.${order}`)} - </span> + {sortOrder.map((order, ind) => ( + <span + key={ind} + onClick={() => { + setSortingOrder(order); + sortingData(null, order, pdfData); + }} + className="dropdown-item text-[10px] md:text-[13px]" + style={{ + paddingLeft: sortingOrder !== order && "31px" + }} + > + {sortingOrder === order && ( + <i className="fa-light fa-check" aria-hidden="true"></i> + )} + <span className="ml-[5px]"> + {t(`sort-order.${order}`)} </span> - ); - })} + </span> + ))} </div> </div> <div + className="cursor-pointer p-2 hover:bg-gray-200 rounded-md flex justify-center items-center" data-tut="reactourForth" - className="sort" onClick={() => setIsList(!isList)} > <i - className={ + className={`${ isList ? "fa-light fa-th-large" : "fa-light fa-list" - } - style={{ fontSize: "24px", color: `${iconColor}` }} + } text-[20px]`} + style={{ color: `${iconColor}` }} aria-hidden="true" ></i> </div> @@ -776,7 +804,7 @@ function Opensigndrive() { onClick={() => setIsOptions(!isOptions)} > <div - className="p-[19px] my-2 flex items-center justify-center cursor-pointer hover:bg-[var(--mauve-3)] rounded-[2px] shadow-[0_2px_4px_rgba(168,204,206,0.1)]" + className="p-3 flex items-center justify-center cursor-pointer rounded-md hover:bg-gray-200" data-tut="reactourSecond" > <i @@ -820,7 +848,18 @@ function Opensigndrive() { </div> </div> </div> - + {/* Mobile search overlay */} + {mobileSearchOpen && ( + <div className="top-full left-0 w-full bg-white px-4 py-2 shadow-md md:hidden"> + <input + type="search" + value={searchTerm} + onChange={handleSearchChange} + placeholder="Search documents…" + className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs" + /> + </div> + )} {pdfData && pdfData.length === 0 ? ( <div className="flex justify-center items-center w-full h-[50vh]"> <span className="text-base-content font-bold"> diff --git a/apps/OpenSign/src/pages/Preferences.js b/apps/OpenSign/src/pages/Preferences.js index fda74fc813..95ad0aa7ab 100644 --- a/apps/OpenSign/src/pages/Preferences.js +++ b/apps/OpenSign/src/pages/Preferences.js @@ -50,7 +50,7 @@ const Preferences = () => { const [isTourEnabled, setIsTourEnabled] = useState(false); const [dateFormat, setDateFormat] = useState("MM/DD/YYYY"); const [is12HourTime, setIs12HourTime] = useState(false); - + const [isLTVEnabled, setIsLTVEnabled] = useState(false); useEffect(() => { fetchSignType(); // eslint-disable-next-line react-hooks/exhaustive-deps @@ -110,6 +110,9 @@ const Preferences = () => { const is12Hr = _getUser?.Is12HourTime !== undefined ? _getUser?.Is12HourTime : false; setIs12HourTime(is12Hr); + const isLTVEnabled = + _getUser?.IsLTVEnabled !== undefined ? _getUser?.IsLTVEnabled : false; + setIsLTVEnabled(isLTVEnabled); } } catch (err) { console.log("err while getting user details", err); @@ -167,7 +170,8 @@ const Preferences = () => { SendinOrder: sendinOrder, IsTourEnabled: isTourEnabled, DateFormat: dateFormat, - Is12HourTime: is12HourTime + Is12HourTime: is12HourTime, + IsLTVEnabled: isLTVEnabled }; const updateRes = await Parse.Cloud.run("updatepreferences", params); if (updateRes) { @@ -673,7 +677,6 @@ const Preferences = () => { </div> </div> </div> - {/* Right Column - Timezone & Date Settings */} <div className="md:col-span-7 flex flex-col"> <div className="mb-6"> @@ -693,7 +696,6 @@ const Preferences = () => { /> </div> </div> - {/* Save Button - Full Width */} <div className="md:col-span-12 flex justify-start mt-2"> <button @@ -704,7 +706,7 @@ const Preferences = () => { </button> </div> </div> - ) : ( + ) : activeTab === 1 ? ( <div className="flex flex-col mb-4"> <div className="flex flex-col"> <h1 className="text-[14px] mb-[0.7rem] font-medium"> @@ -849,6 +851,8 @@ const Preferences = () => { </div> </div> </div> + ) : ( + <></> )} </div> </div> diff --git a/apps/OpenSign/src/primitives/GetReportDisplay.js b/apps/OpenSign/src/primitives/GetReportDisplay.js index b71175ee0b..b9364ea93a 100644 --- a/apps/OpenSign/src/primitives/GetReportDisplay.js +++ b/apps/OpenSign/src/primitives/GetReportDisplay.js @@ -741,12 +741,13 @@ const ReportTable = (props) => { company_name: doc?.ExtUserPtr?.Company || "", signing_url: `<a href=${signPdf} target=_blank>Sign here</a>` }; - const subject = doc?.RequestSubject || + doc?.ExtUserPtr?.TenantId?.RequestSubject || `{{sender_name}} has requested you to sign "{{document_title}}"`; const body = doc?.RequestBody || + doc?.ExtUserPtr?.TenantId?.RequestBody || `<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8' /></head><body><p>Hi {{receiver_name}},</p><br><p>We hope this email finds you well. {{sender_name}} has requested you to review and sign <b>"{{document_title}}"</b>.</p><p>Your signature is crucial to proceed with the next steps as it signifies your agreement and authorization.</p><br><p>{{signing_url}}</p><br><p>If you have any questions or need further clarification regarding the document or the signing process, please contact the sender.</p><br><p>Thanks</p><p> Team ${appName}</p><br></body> </html>`; const res = replaceMailVaribles(subject, body, variables); setMail((prev) => ({ ...prev, subject: res.subject, body: res.body })); diff --git a/apps/OpenSign/src/styles/opensigndrive.css b/apps/OpenSign/src/styles/opensigndrive.css index 0925a0e45f..bd1fd4ea84 100644 --- a/apps/OpenSign/src/styles/opensigndrive.css +++ b/apps/OpenSign/src/styles/opensigndrive.css @@ -168,21 +168,6 @@ } -.sort { - padding: 8px 15px; - margin: 5px; - display: flex; - align-items: center; - justify-content: center; - cursor: pointer; -} - -.sort:hover { - box-shadow: 0 2px 4px rgba(168, 204, 206, 0.1); - background-color: var(--mauve-3); - border-radius: 2px; -} - .fileName { display: inline-block; width: 100px; @@ -286,15 +271,3 @@ a { transform: translateX(0); } } - -@media (min-width: 310px) and (max-width: 550px) { - .sort { - padding: 2px; - } -} - -@media screen and (max-width: 309px) { - .sort { - padding: 2px; - } -} diff --git a/apps/OpenSignServer/cloud/customRoute/uploadFile.js b/apps/OpenSignServer/cloud/customRoute/uploadFile.js index 70dd1ed293..73389319fb 100644 --- a/apps/OpenSignServer/cloud/customRoute/uploadFile.js +++ b/apps/OpenSignServer/cloud/customRoute/uploadFile.js @@ -67,7 +67,7 @@ async function uploadFile(req, res) { newFileName = sanitizeFileName( newFileName + '_' + new Date().toISOString() + '.' + extension ); - console.log(newFileName); + // console.log(newFileName); cb(null, newFileName); }, }); @@ -96,7 +96,7 @@ async function uploadFile(req, res) { newFileName = sanitizeFileName( newFileName + '_' + new Date().toISOString() + '.' + extension ); - console.log(newFileName); + // console.log(newFileName); cb(null, newFileName); }, }); @@ -115,7 +115,7 @@ async function uploadFile(req, res) { newFileName = sanitizeFileName( newFileName + '_' + new Date().toISOString() + '.' + extension ); - console.log(newFileName); + // console.log(newFileName); cb(null, newFileName); }, }); @@ -149,7 +149,7 @@ async function uploadFile(req, res) { //res.header("Access-Control-Allow-Headers", "Content-Type"); //res.setHeader("Access-Control-Allow-Origin", "*"); if (useLocal === 'true') { - console.log(req.file); + // console.log(req.file); var fileUrl = `${parseBaseUrl}/files/${parseAppId}/${req.file.filename}`; } else { var fileUrl = req.file.location; diff --git a/apps/OpenSignServer/cloud/main.js b/apps/OpenSignServer/cloud/main.js index f97e68b5be..6dc8b976b1 100644 --- a/apps/OpenSignServer/cloud/main.js +++ b/apps/OpenSignServer/cloud/main.js @@ -52,7 +52,9 @@ import forwardDoc from './parsefunction/ForwardDoc.js'; import saveAsTemplate from './parsefunction/saveAsTemplate.js'; import updateTenant from './parsefunction/updateTenant.js'; import recreateDocument from './parsefunction/recreateDocument.js'; +import loginUser from './parsefunction/loginUser.js'; import addUser from './parsefunction/addUser.js'; +import filterDocs from './parsefunction/filterDocs.js'; // This afterSave function triggers after an object is added or updated in the specified class, allowing for post-processing logic. Parse.Cloud.afterSave('contracts_Document', DocumentAftersave); @@ -115,4 +117,6 @@ Parse.Cloud.define('forwarddoc', forwardDoc); Parse.Cloud.define('saveastemplate', saveAsTemplate); Parse.Cloud.define('updatetenant', updateTenant); Parse.Cloud.define('recreatedoc', recreateDocument); +Parse.Cloud.define('loginuser', loginUser); Parse.Cloud.define('adduser', addUser); +Parse.Cloud.define('filterdocs', filterDocs); diff --git a/apps/OpenSignServer/cloud/parsefunction/filterDocs.js b/apps/OpenSignServer/cloud/parsefunction/filterDocs.js new file mode 100644 index 0000000000..5f71e7c49d --- /dev/null +++ b/apps/OpenSignServer/cloud/parsefunction/filterDocs.js @@ -0,0 +1,80 @@ +/** + * Escapes special characters in a string so it can safely be used in a RegExp. + */ +function escapeRegExp(str) { + return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); +} + +/** + * Fetches contracts_Document objects whose Name matches searchTerm + * and whose CreatedBy pointer is the current user. + * + * @param {Parse.User} user – the logged-in Parse.User (e.g. request.user) + * @param {string} searchTerm – substring (or full name) to match + * @param {object} [options] + * @param {number} [options.limit=100] – max results + * @param {number} [options.skip=0] – offset for pagination + * @param {boolean} [options.caseSensitive=false] – regex case sensitivity + */ +async function fetchDocumentsByName( + user, + searchTerm, + { limit = 300, skip = 0, caseSensitive = false } = {} +) { + const query = new Parse.Query('contracts_Document'); + + // 1) Filter by Name substring (case-insensitive by default) + if (searchTerm) { + const escaped = escapeRegExp(searchTerm); + const pattern = `.*${escaped}.*`; + query.matches('Name', pattern, caseSensitive ? undefined : 'i'); + } + + // 2) Filter by CreatedBy pointer + query.equalTo('CreatedBy', user); + + // 3) Pagination & sorting + query.limit(limit); + query.skip(skip); + // query.ascending('Name'); //sort alphabetically: + query.include('ExtUserPtr'); + query.include('ExtUserPtr.TenantId'); + query.include('Signers'); + query.notEqualTo('IsArchive', true); + query.descending('updatedAt'); + query.exclude('AuditTrail'); + query.notEqualTo('Type', 'Folder'); + try { + return await query.find({ useMasterKey: true }); + } catch (err) { + console.error('Error fetching contracts_Document by Name:', err); + // Wrap low-level or network errors in a script-level error + throw new Parse.Error( + Parse.Error.SCRIPT_FAILED, + 'Unable to retrieve your documents at this time' + ); + } +} + +export default async function filterDocs(request) { + const { searchTerm = '', limit, skip, caseSensitive } = request.params; + if (!request.user) { + throw new Parse.Error(Parse.Error.INVALID_SESSION_TOKEN, 'User is not authenticated.'); + } + if (typeof searchTerm !== 'string') { + throw new Parse.Error(Parse.Error.INVALID_PARAMETER, 'searchTerm must be a string'); + } + + try { + const docs = await fetchDocumentsByName(request.user, searchTerm, { + limit, + skip, + caseSensitive, + }); + return docs; + } catch (error) { + // handle error + console.log('err while filtering doc', error); + throw error; + } +} diff --git a/apps/OpenSignServer/cloud/parsefunction/generateCertificatebydocId.js b/apps/OpenSignServer/cloud/parsefunction/generateCertificatebydocId.js index d84dfa5732..84a2f32df6 100644 --- a/apps/OpenSignServer/cloud/parsefunction/generateCertificatebydocId.js +++ b/apps/OpenSignServer/cloud/parsefunction/generateCertificatebydocId.js @@ -72,7 +72,7 @@ export default async function generateCertificatebydocId(req) { location: 'n/a', name: eSignName, contactInfo: eSigncontact, - signatureLength: 15000, + signatureLength: 16000, }); const pdfWithPlaceholderBytes = await certificatePdf.save(); const CertificateBuffer = Buffer.from(pdfWithPlaceholderBytes); diff --git a/apps/OpenSignServer/cloud/parsefunction/getDrive.js b/apps/OpenSignServer/cloud/parsefunction/getDrive.js index 9899e3e86f..346a5f6bf3 100644 --- a/apps/OpenSignServer/cloud/parsefunction/getDrive.js +++ b/apps/OpenSignServer/cloud/parsefunction/getDrive.js @@ -5,7 +5,6 @@ export default async function getDrive(request) { const appId = process.env.APP_ID; const limit = request.params.limit; const skip = request.params.skip; - const classUrl = serverUrl + '/classes/contracts_Document'; const docId = request.params.docId; try { const userRes = await axios.get(serverUrl + '/users/me', { diff --git a/apps/OpenSignServer/cloud/parsefunction/loginUser.js b/apps/OpenSignServer/cloud/parsefunction/loginUser.js new file mode 100644 index 0000000000..11f622678e --- /dev/null +++ b/apps/OpenSignServer/cloud/parsefunction/loginUser.js @@ -0,0 +1,26 @@ +import crypto from 'node:crypto'; +export default async function loginUser(request) { + const username = request.params.email; + const password = request.params.password; + + if (username && password) { + try { + // Pass the username and password to logIn function + const user = await Parse.User.logIn(username, password); + // console.log('user ', user); + if (user) { + const _user = user?.toJSON(); + return { + ..._user, + }; + } else { + throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'user not found.'); + } + } catch (err) { + console.log('err in login user', err); + throw err; + } + } else { + throw new Parse.Error(Parse.Error.PASSWORD_MISSING, 'username/password is missing.'); + } +} diff --git a/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.js b/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.js index f210686f5f..661452107f 100644 --- a/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.js +++ b/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.js @@ -270,7 +270,7 @@ async function sendMailsaveCertifcate(doc, pfx, isCustomMail, mailProvider, file location: 'n/a', name: eSignName, contactInfo: eSigncontact, - signatureLength: 15000, + signatureLength: 16000, }); const pdfWithPlaceholderBytes = await certificatePdf.save(); const CertificateBuffer = Buffer.from(pdfWithPlaceholderBytes); @@ -408,7 +408,7 @@ async function PDF(req) { location: 'n/a', name: eSignName, contactInfo: eSigncontact, - signatureLength: 15000, + signatureLength: 16000, }); const pdfWithPlaceholderBytes = await pdfDoc.save(); PdfBuffer = Buffer.from(pdfWithPlaceholderBytes); diff --git a/apps/OpenSignServer/cloud/parsefunction/reportsJson.js b/apps/OpenSignServer/cloud/parsefunction/reportsJson.js index ad1b620cc1..9dec1e2282 100644 --- a/apps/OpenSignServer/cloud/parsefunction/reportsJson.js +++ b/apps/OpenSignServer/cloud/parsefunction/reportsJson.js @@ -96,6 +96,10 @@ export default function reportJson(id, userId) { 'Placeholders', 'SignedUrl', 'TemplateId', + 'RequestBody', + 'RequestSubject', + 'ExtUserPtr.TenantId.RequestBody', + 'ExtUserPtr.TenantId.RequestSubject', ], }; // completed documents report @@ -227,6 +231,10 @@ export default function reportJson(id, userId) { 'Placeholders', 'SignedUrl', 'TemplateId', + 'RequestBody', + 'RequestSubject', + 'ExtUserPtr.TenantId.RequestBody', + 'ExtUserPtr.TenantId.RequestSubject', ], }; // Recent signature requests report show on dashboard diff --git a/apps/OpenSignServer/cloud/parsefunction/updatePreferences.js b/apps/OpenSignServer/cloud/parsefunction/updatePreferences.js index 31770a5b82..fc90c02fb8 100644 --- a/apps/OpenSignServer/cloud/parsefunction/updatePreferences.js +++ b/apps/OpenSignServer/cloud/parsefunction/updatePreferences.js @@ -54,6 +54,9 @@ export default async function updatePreferences(request) { if (request.params.Is12HourTime !== undefined) { newOrg.set('Is12HourTime', request.params.Is12HourTime); } + if (request.params.IsLTVEnabled !== undefined) { + newOrg.set('IsLTVEnabled', request.params.IsLTVEnabled); + } const updateUserRes = await newOrg.save(null, { useMasterKey: true }); if (updateUserRes) { const _updateUserRes = JSON.parse(JSON.stringify(updateUserRes)); diff --git a/apps/OpenSignServer/databases/migrations/20250424104819-change_permission.cjs b/apps/OpenSignServer/databases/migrations/20250424104819-change_permission.cjs new file mode 100644 index 0000000000..19f655268a --- /dev/null +++ b/apps/OpenSignServer/databases/migrations/20250424104819-change_permission.cjs @@ -0,0 +1,211 @@ +/** + * + * @param {Parse} Parse + */ +exports.up = async Parse => { + const schema = new Parse.Schema('contracts_Signature'); + schema.setCLP({ + get: { '*': true }, + find: { '*': true }, + count: { '*': true }, + create: { '*': true }, + update: { '*': true }, + delete: {}, + addField: {}, + }); + await schema.update(); + const docSchema = new Parse.Schema('contracts_Document'); + docSchema.setCLP({ + get: { '*': true }, + find: { requiresAuthentication: true }, + count: { '*': true }, + create: { '*': true }, + update: { '*': true }, + delete: {}, + addField: { requiresAuthentication: true }, + }); + await docSchema.update(); + const templateSchema = new Parse.Schema('contracts_Template'); + templateSchema.setCLP({ + get: { '*': true }, + find: {}, + count: { '*': true }, + create: { '*': true }, + update: { '*': true }, + delete: {}, + addField: { requiresAuthentication: true }, + }); + await templateSchema.update(); + const dataFiles = new Parse.Schema('partners_DataFiles'); + dataFiles.setCLP({ + get: {}, + find: {}, + count: {}, + create: { '*': true }, + update: {}, + delete: {}, + addField: { '*': true }, + }); + await dataFiles.update(); + const pTenant = new Parse.Schema('partners_Tenant'); + pTenant.setCLP({ + get: {}, + find: {}, + count: {}, + create: {}, + update: {}, + delete: {}, + addField: {}, + }); + await pTenant.update(); + const TenantCredits = new Parse.Schema('partners_TenantCredits'); + TenantCredits.setCLP({ + get: { '*': true }, + find: { '*': true }, + count: { '*': true }, + create: { '*': true }, + update: { '*': true }, + delete: {}, + addField: { '*': true }, + }); + await TenantCredits.update(); + const _user = new Parse.Schema('_User'); + _user.setCLP({ + get: { '*': true }, + find: { '*': true }, + count: { '*': true }, + create: { '*': true }, + update: { '*': true }, + delete: {}, + addField: {}, + }); + await _user.update(); + const Migrationdb = new Parse.Schema('Migrationdb'); + Migrationdb.setCLP({ + get: {}, + find: {}, + count: {}, + create: {}, + update: {}, + delete: {}, + addField: {}, + }); + await Migrationdb.update(); + const contactbook = new Parse.Schema('contracts_Contactbook'); + contactbook.setCLP({ + get: { '*': true }, + find: { '*': true }, + count: { '*': true }, + create: { '*': true }, + update: { '*': true }, + delete: {}, + addField: {}, + }); + return contactbook.update(); +}; + +/** + * + * @param {Parse} Parse + */ +exports.down = async Parse => { + const schema = new Parse.Schema('contracts_Signature'); + schema.setCLP({ + get: { '*': true }, + find: { '*': true }, + count: { '*': true }, + create: { '*': true }, + update: { '*': true }, + delete: { '*': true }, + addField: { '*': true }, + }); + await schema.update(); + const docSchema = new Parse.Schema('contracts_Document'); + docSchema.setCLP({ + get: { '*': true }, + find: { '*': true }, + count: { '*': true }, + create: { '*': true }, + update: { '*': true }, + delete: { '*': true }, + addField: { '*': true }, + }); + await docSchema.update(); + const templateSchema = new Parse.Schema('contracts_Template'); + templateSchema.setCLP({ + get: { '*': true }, + find: { '*': true }, + count: { '*': true }, + create: { '*': true }, + update: { '*': true }, + delete: { '*': true }, + addField: { '*': true }, + }); + await templateSchema.update(); + const dataFiles = new Parse.Schema('partners_DataFiles'); + dataFiles.setCLP({ + get: { '*': true }, + find: { '*': true }, + count: { '*': true }, + create: { '*': true }, + update: { '*': true }, + delete: { '*': true }, + addField: { '*': true }, + }); + await dataFiles.update(); + const pTenant = new Parse.Schema('partners_Tenant'); + pTenant.setCLP({ + get: { '*': true }, + find: { '*': true }, + count: { '*': true }, + create: { '*': true }, + update: { '*': true }, + delete: { '*': true }, + addField: { '*': true }, + }); + await pTenant.update(); + const TenantCredits = new Parse.Schema('partners_TenantCredits'); + TenantCredits.setCLP({ + get: { '*': true }, + find: { '*': true }, + count: { '*': true }, + create: { '*': true }, + update: { '*': true }, + delete: { '*': true }, + addField: { '*': true }, + }); + await TenantCredits.update(); + const _user = new Parse.Schema('_User'); + _user.setCLP({ + get: { '*': true }, + find: { '*': true }, + count: { '*': true }, + create: { '*': true }, + update: { '*': true }, + delete: { '*': true }, + addField: { '*': true }, + }); + await _user.update(); + const Migrationdb = new Parse.Schema('Migrationdb'); + Migrationdb.setCLP({ + get: { '*': true }, + find: { '*': true }, + count: { '*': true }, + create: { '*': true }, + update: { '*': true }, + delete: { '*': true }, + addField: { '*': true }, + }); + await Migrationdb.update(); + const contactbook = new Parse.Schema('contracts_Contactbook'); + contactbook.setCLP({ + get: { '*': true }, + find: { '*': true }, + count: { '*': true }, + create: { '*': true }, + update: { '*': true }, + delete: { '*': true }, + addField: { '*': true }, + }); + return contactbook.update(); +}; diff --git a/apps/OpenSignServer/index.js b/apps/OpenSignServer/index.js index 1575f068b7..437ff922f0 100644 --- a/apps/OpenSignServer/index.js +++ b/apps/OpenSignServer/index.js @@ -160,7 +160,7 @@ app.use(express.json({ limit: '50mb' })); app.use(express.urlencoded({ limit: '50mb', extended: true })); app.use(function (req, res, next) { req.headers['x-real-ip'] = getUserIP(req); - const publicUrl = req?.protocol + '://' + req?.get('host'); + const publicUrl = 'https://' + req?.get('host'); req.headers['public_url'] = publicUrl; // process.env.PUBLIC_URL next(); }); diff --git a/apps/OpenSignServer/package-lock.json b/apps/OpenSignServer/package-lock.json index 54008f8602..a2e280feb8 100644 --- a/apps/OpenSignServer/package-lock.json +++ b/apps/OpenSignServer/package-lock.json @@ -9,42 +9,44 @@ "version": "1.4.0", "license": "MIT", "dependencies": { - "@aws-sdk/client-s3": "^3.775.0", - "@aws-sdk/s3-request-presigner": "^3.775.0", + "@aws-sdk/client-s3": "^3.787.0", + "@aws-sdk/s3-request-presigner": "^3.787.0", "@parse/fs-files-adapter": "^3.0.0", "@parse/s3-files-adapter": "^4.1.0", "@pdf-lib/fontkit": "^1.1.1", - "@signpdf/placeholder-pdf-lib": "^3.2.4", + "@signpdf/placeholder-pdf-lib": "^3.2.6", "@signpdf/signer-p12": "^3.2.4", "@signpdf/signpdf": "^3.2.5", "aws-sdk": "^2.1692.0", "axios": "^1.8.4", "cors": "^2.8.5", "date-fns-tz": "^3.2.0", - "dotenv": "^16.4.7", - "express": "^4.21.1", + "dotenv": "^16.5.0", + "express": "^4.21.2", "form-data": "^4.0.2", "generate-api-key": "^1.0.2", "googleapis": "^148.0.0", "mailgun.js": "^11.1.0", - "mongodb": "^6.15.0", + "mongodb": "^6.16.0", "multer": "^1.4.5-lts.2", "multer-s3": "^3.0.1", "node-forge": "^1.3.1", - "nodemailer": "^6.10.0", + "nodemailer": "^6.10.1", "parse": "^5.3.0", "parse-dbtool": "^1.2.0", "parse-server": "^7.4.0", "parse-server-api-mail-adapter": "^4.1.0", "pdf-lib": "^1.17.1", - "posthog-node": "^4.10.2", + "posthog-node": "^4.13.0", + "qrcode": "^1.5.4", + "speakeasy": "^2.0.0", "ws": "^8.18.1" }, "devDependencies": { "@babel/eslint-parser": "^7.27.0", - "eslint": "^9.23.0", + "eslint": "^9.25.1", "jasmine": "^5.6.0", - "mongodb-runner": "^5.8.0", + "mongodb-runner": "^5.8.2", "nodemon": "^3.1.9", "nyc": "^17.1.0", "prettier": "^3.5.3" @@ -530,32 +532,32 @@ } }, "node_modules/@aws-sdk/client-s3": { - "version": "3.775.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.775.0.tgz", - "integrity": "sha512-Z/BeVmYc3nj4FNE46MtvBYeCVvBZwlujMEvr5UOChP14899QWkBfOvf74RwQY9qy5/DvhVFkHlA8en1L6+0NrA==", + "version": "3.787.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.787.0.tgz", + "integrity": "sha512-eGLCWkN0NlntJ9yPU6OKUggVS4cFvuZJog+cFg1KD5hniLqz7Y0YRtB4uBxW212fK3XCfddgyscEOEeHaTQQTw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.775.0", - "@aws-sdk/credential-provider-node": "3.775.0", + "@aws-sdk/credential-provider-node": "3.787.0", "@aws-sdk/middleware-bucket-endpoint": "3.775.0", "@aws-sdk/middleware-expect-continue": "3.775.0", - "@aws-sdk/middleware-flexible-checksums": "3.775.0", + "@aws-sdk/middleware-flexible-checksums": "3.787.0", "@aws-sdk/middleware-host-header": "3.775.0", "@aws-sdk/middleware-location-constraint": "3.775.0", "@aws-sdk/middleware-logger": "3.775.0", "@aws-sdk/middleware-recursion-detection": "3.775.0", "@aws-sdk/middleware-sdk-s3": "3.775.0", "@aws-sdk/middleware-ssec": "3.775.0", - "@aws-sdk/middleware-user-agent": "3.775.0", + "@aws-sdk/middleware-user-agent": "3.787.0", "@aws-sdk/region-config-resolver": "3.775.0", "@aws-sdk/signature-v4-multi-region": "3.775.0", "@aws-sdk/types": "3.775.0", - "@aws-sdk/util-endpoints": "3.775.0", + "@aws-sdk/util-endpoints": "3.787.0", "@aws-sdk/util-user-agent-browser": "3.775.0", - "@aws-sdk/util-user-agent-node": "3.775.0", + "@aws-sdk/util-user-agent-node": "3.787.0", "@aws-sdk/xml-builder": "3.775.0", "@smithy/config-resolver": "^4.1.0", "@smithy/core": "^3.2.0", @@ -951,9 +953,9 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.775.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.775.0.tgz", - "integrity": "sha512-vqG1S2ap77WP4D5qt4bEPE0duQ4myN+cDr1NeP8QpSTajetbkDGVo7h1VViYMcUoFUVWBj6Qf1X1VfOq+uaxbA==", + "version": "3.787.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.787.0.tgz", + "integrity": "sha512-L8R+Mh258G0DC73ktpSVrG4TT9i2vmDLecARTDR/4q5sRivdDQSL5bUp3LKcK80Bx+FRw3UETIlX6mYMLL9PJQ==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", @@ -962,12 +964,12 @@ "@aws-sdk/middleware-host-header": "3.775.0", "@aws-sdk/middleware-logger": "3.775.0", "@aws-sdk/middleware-recursion-detection": "3.775.0", - "@aws-sdk/middleware-user-agent": "3.775.0", + "@aws-sdk/middleware-user-agent": "3.787.0", "@aws-sdk/region-config-resolver": "3.775.0", "@aws-sdk/types": "3.775.0", - "@aws-sdk/util-endpoints": "3.775.0", + "@aws-sdk/util-endpoints": "3.787.0", "@aws-sdk/util-user-agent-browser": "3.775.0", - "@aws-sdk/util-user-agent-node": "3.775.0", + "@aws-sdk/util-user-agent-node": "3.787.0", "@smithy/config-resolver": "^4.1.0", "@smithy/core": "^3.2.0", "@smithy/fetch-http-handler": "^5.0.2", @@ -3346,18 +3348,18 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.775.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.775.0.tgz", - "integrity": "sha512-0gJc6cALsgrjeC5U3qDjbz4myIC/j49+gPz9nkvY+C0OYWt1KH1tyfiZUuCRGfuFHhQ+3KMMDSL229TkBP3E7g==", + "version": "3.787.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.787.0.tgz", + "integrity": "sha512-hc2taRoDlXn2uuNuHWDJljVWYrp3r9JF1a/8XmOAZhVUNY+ImeeStylHXhXXKEA4JOjW+5PdJj0f1UDkVCHJiQ==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "3.775.0", "@aws-sdk/credential-provider-env": "3.775.0", "@aws-sdk/credential-provider-http": "3.775.0", "@aws-sdk/credential-provider-process": "3.775.0", - "@aws-sdk/credential-provider-sso": "3.775.0", - "@aws-sdk/credential-provider-web-identity": "3.775.0", - "@aws-sdk/nested-clients": "3.775.0", + "@aws-sdk/credential-provider-sso": "3.787.0", + "@aws-sdk/credential-provider-web-identity": "3.787.0", + "@aws-sdk/nested-clients": "3.787.0", "@aws-sdk/types": "3.775.0", "@smithy/credential-provider-imds": "^4.0.2", "@smithy/property-provider": "^4.0.2", @@ -3408,17 +3410,17 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.775.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.775.0.tgz", - "integrity": "sha512-D8Zre5W2sXC/ANPqCWPqwYpU1cKY9DF6ckFZyDrqlcBC0gANgpY6fLrBtYo2fwJsbj+1A24iIpBINV7erdprgA==", + "version": "3.787.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.787.0.tgz", + "integrity": "sha512-JioVi44B1vDMaK2CdzqimwvJD3uzvzbQhaEWXsGMBcMcNHajXAXf08EF50JG3ZhLrhhUsT1ObXpbTaPINOhh+g==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/credential-provider-env": "3.775.0", "@aws-sdk/credential-provider-http": "3.775.0", - "@aws-sdk/credential-provider-ini": "3.775.0", + "@aws-sdk/credential-provider-ini": "3.787.0", "@aws-sdk/credential-provider-process": "3.775.0", - "@aws-sdk/credential-provider-sso": "3.775.0", - "@aws-sdk/credential-provider-web-identity": "3.775.0", + "@aws-sdk/credential-provider-sso": "3.787.0", + "@aws-sdk/credential-provider-web-identity": "3.787.0", "@aws-sdk/types": "3.775.0", "@smithy/credential-provider-imds": "^4.0.2", "@smithy/property-provider": "^4.0.2", @@ -3524,14 +3526,14 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.775.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.775.0.tgz", - "integrity": "sha512-du06V7u9HDmRuwZnRjf85shO3dffeKOkQplV5/2vf3LgTPNEI9caNomi/cCGyxKGOeSUHAKrQ1HvpPfOaI6t5Q==", + "version": "3.787.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.787.0.tgz", + "integrity": "sha512-fHc08bsvwm4+dEMEQKnQ7c1irEQmmxbgS+Fq41y09pPvPh31nAhoMcjBSTWAaPHvvsRbTYvmP4Mf12ZGr8/nfg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.775.0", + "@aws-sdk/client-sso": "3.787.0", "@aws-sdk/core": "3.775.0", - "@aws-sdk/token-providers": "3.775.0", + "@aws-sdk/token-providers": "3.787.0", "@aws-sdk/types": "3.775.0", "@smithy/property-provider": "^4.0.2", "@smithy/shared-ini-file-loader": "^4.0.2", @@ -3581,13 +3583,13 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.775.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.775.0.tgz", - "integrity": "sha512-z4XLYui5aHsr78mbd5BtZfm55OM5V55qK/X17OPrEqjYDDk3GlI8Oe2ZjTmOVrKwMpmzXKhsakeFHKfDyOvv1A==", + "version": "3.787.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.787.0.tgz", + "integrity": "sha512-SobmCwNbk6TfEsF283mZPQEI5vV2j6eY5tOCj8Er4Lzraxu9fBPADV+Bib2A8F6jlB1lMPJzOuDCbEasSt/RIw==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "3.775.0", - "@aws-sdk/nested-clients": "3.775.0", + "@aws-sdk/nested-clients": "3.787.0", "@aws-sdk/types": "3.775.0", "@smithy/property-provider": "^4.0.2", "@smithy/types": "^4.2.0", @@ -3784,9 +3786,9 @@ } }, "node_modules/@aws-sdk/middleware-flexible-checksums": { - "version": "3.775.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.775.0.tgz", - "integrity": "sha512-OmHLfRIb7IIXsf9/X/pMOlcSV3gzW/MmtPSZTkrz5jCTKzWXd7eRoyOJqewjsaC6KMAxIpNU77FoAd16jOZ21A==", + "version": "3.787.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.787.0.tgz", + "integrity": "sha512-X71qEwWoixFmwowWzlPoZUR3u1CWJ7iAzU0EzIxqmPhQpQJLFmdL1+SRjqATynDPZQzLs1a5HBtPT++EnZ+Quw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/crc32": "5.2.0", @@ -4578,14 +4580,14 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.775.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.775.0.tgz", - "integrity": "sha512-7Lffpr1ptOEDE1ZYH1T78pheEY1YmeXWBfFt/amZ6AGsKSLG+JPXvof3ltporTGR2bhH/eJPo7UHCglIuXfzYg==", + "version": "3.787.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.787.0.tgz", + "integrity": "sha512-Lnfj8SmPLYtrDFthNIaNj66zZsBCam+E4XiUDr55DIHTGstH6qZ/q6vg0GfbukxwSmUcGMwSR4Qbn8rb8yd77g==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "3.775.0", "@aws-sdk/types": "3.775.0", - "@aws-sdk/util-endpoints": "3.775.0", + "@aws-sdk/util-endpoints": "3.787.0", "@smithy/core": "^3.2.0", "@smithy/protocol-http": "^5.1.0", "@smithy/types": "^4.2.0", @@ -4832,9 +4834,9 @@ } }, "node_modules/@aws-sdk/nested-clients": { - "version": "3.775.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.775.0.tgz", - "integrity": "sha512-f37jmAzkuIhKyhtA6s0LGpqQvm218vq+RNMUDkGm1Zz2fxJ5pBIUTDtygiI3vXTcmt9DTIB8S6JQhjrgtboktw==", + "version": "3.787.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.787.0.tgz", + "integrity": "sha512-xk03q1xpKNHgbuo+trEf1dFrI239kuMmjKKsqLEsHlAZbuFq4yRGMlHBrVMnKYOPBhVFDS/VineM991XI52fKg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", @@ -4843,12 +4845,12 @@ "@aws-sdk/middleware-host-header": "3.775.0", "@aws-sdk/middleware-logger": "3.775.0", "@aws-sdk/middleware-recursion-detection": "3.775.0", - "@aws-sdk/middleware-user-agent": "3.775.0", + "@aws-sdk/middleware-user-agent": "3.787.0", "@aws-sdk/region-config-resolver": "3.775.0", "@aws-sdk/types": "3.775.0", - "@aws-sdk/util-endpoints": "3.775.0", + "@aws-sdk/util-endpoints": "3.787.0", "@aws-sdk/util-user-agent-browser": "3.775.0", - "@aws-sdk/util-user-agent-node": "3.775.0", + "@aws-sdk/util-user-agent-node": "3.787.0", "@smithy/config-resolver": "^4.1.0", "@smithy/core": "^3.2.0", "@smithy/fetch-http-handler": "^5.0.2", @@ -5318,9 +5320,9 @@ } }, "node_modules/@aws-sdk/s3-request-presigner": { - "version": "3.775.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.775.0.tgz", - "integrity": "sha512-NpACBvEdT3VERGX1cWGIITZ5Qq2MknrEugY3ivs8CDGze1uunm6+oTh8YPMUlHOZq2TuI9ktKWh7YZoHBRRUTw==", + "version": "3.787.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.787.0.tgz", + "integrity": "sha512-WBm0AS3RRURNN0yjYXHaiI692boVwWXGt3RLdI7tYBX58E1Zb5nzC8rlk81O9Xe7ZTgTC1KCr8y4+jcBD+zwJg==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/signature-v4-multi-region": "3.775.0", @@ -5733,12 +5735,12 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.775.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.775.0.tgz", - "integrity": "sha512-Q6MtbEhkOggVSz/dN89rIY/ry80U3v89o0Lrrc+Rpvaiaaz8pEN0DsfEcg0IjpzBQ8Owoa6lNWyglHbzPhaJpA==", + "version": "3.787.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.787.0.tgz", + "integrity": "sha512-d7/NIqxq308Zg0RPMNrmn0QvzniL4Hx8Qdwzr6YZWLYAbUSvZYS2ppLR3BFWSkV6SsTJUx8BuDaj3P8vttkrog==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/nested-clients": "3.775.0", + "@aws-sdk/nested-clients": "3.787.0", "@aws-sdk/types": "3.775.0", "@smithy/property-provider": "^4.0.2", "@smithy/shared-ini-file-loader": "^4.0.2", @@ -5824,9 +5826,9 @@ } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.775.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.775.0.tgz", - "integrity": "sha512-yjWmUgZC9tUxAo8Uaplqmq0eUh0zrbZJdwxGRKdYxfm4RG6fMw1tj52+KkatH7o+mNZvg1GDcVp/INktxonJLw==", + "version": "3.787.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.787.0.tgz", + "integrity": "sha512-fd3zkiOkwnbdbN0Xp9TsP5SWrmv0SpT70YEdbb8wAj2DWQwiCmFszaSs+YCvhoCdmlR3Wl9Spu0pGpSAGKeYvQ==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.775.0", @@ -5939,12 +5941,12 @@ } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.775.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.775.0.tgz", - "integrity": "sha512-N9yhTevbizTOMo3drH7Eoy6OkJ3iVPxhV7dwb6CMAObbLneS36CSfA6xQXupmHWcRvZPTz8rd1JGG3HzFOau+g==", + "version": "3.787.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.787.0.tgz", + "integrity": "sha512-mG7Lz8ydfG4SF9e8WSXiPQ/Lsn3n8A5B5jtPROidafi06I3ckV2WxyMLdwG14m919NoS6IOfWHyRGSqWIwbVKA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-user-agent": "3.775.0", + "@aws-sdk/middleware-user-agent": "3.787.0", "@aws-sdk/types": "3.775.0", "@smithy/node-config-provider": "^4.0.2", "@smithy/types": "^4.2.0", @@ -6382,9 +6384,9 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.2.tgz", - "integrity": "sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz", + "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==", "license": "Apache-2.0", "dependencies": { "@eslint/object-schema": "^2.1.6", @@ -6396,18 +6398,18 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.0.tgz", - "integrity": "sha512-yJLLmLexii32mGrhW29qvU3QBVTu0GUmEf/J4XsBtVhp4JkIUFN/BjWqTF63yRvGApIDpZm5fa97LtYtINmfeQ==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.1.tgz", + "integrity": "sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==", "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/core": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz", - "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz", + "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==", "license": "Apache-2.0", "dependencies": { "@types/json-schema": "^7.0.15" @@ -6452,9 +6454,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.23.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.23.0.tgz", - "integrity": "sha512-35MJ8vCPU0ZMxo7zfev2pypqTwWTofFZO6m4KAtdoFhRpLJUpHTZZ+KB3C7Hb1d7bULYwO4lJXGCi5Se+8OMbw==", + "version": "9.25.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.25.1.tgz", + "integrity": "sha512-dEIwmjntEx8u3Uvv+kr3PDeeArL8Hw07H9kyYxCjnM9pBjfEhk6uLXSchxxzgiwtRhhzVzqmUSDFBOi1TuZ7qg==", "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6470,12 +6472,12 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.7.tgz", - "integrity": "sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==", + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz", + "integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==", "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.12.0", + "@eslint/core": "^0.13.0", "levn": "^0.4.1" }, "engines": { @@ -7170,22 +7172,23 @@ "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.3.7", - "resolved": "https://registry.npmjs.org/@mongodb-js/mongodb-downloader/-/mongodb-downloader-0.3.7.tgz", - "integrity": "sha512-zX18NlZNvN9Yao94VOxubeVOU0BaYX7X1giew1o0fWoIbUIiGzDDVQFRwRNybN+wD7dMFJYvLc6EOlmB9shd5w==", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@mongodb-js/mongodb-downloader/-/mongodb-downloader-0.3.9.tgz", + "integrity": "sha512-6lEIESINiIAeQUw95+hkfxG6129r6KiPU2TNOcxb30PsGgFHPJFg7QY8UoSQXjDE9YaENlr6oQm3c1XDixWeEg==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "debug": "^4.3.4", + "debug": "^4.4.0", "decompress": "^4.2.1", - "mongodb-download-url": "^1.5.5", - "node-fetch": "^2.6.11", + "mongodb-download-url": "^1.5.7", + "node-fetch": "^2.7.0", "tar": "^6.1.15" } }, "node_modules/@mongodb-js/saslprep": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.2.0.tgz", - "integrity": "sha512-+ywrb0AqkfaYuhHs6LxKWgqbh3I72EpEgESCw37o+9qPx9WTCkgDm2B+eMrwehGtHBWHFU4GXvnSCNiFhhausg==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.2.2.tgz", + "integrity": "sha512-EB0O3SCSNRUFk66iRCpI+cXzIjdswfCs7F6nOC3RAGJ7xr5YhaicvsRwJ9eyzYvYRlCSDUO/c7g4yNulxKC1WA==", "license": "MIT", "dependencies": { "sparse-bitfield": "^3.0.3" @@ -8749,15 +8752,16 @@ } }, "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==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@signpdf/placeholder-pdf-lib/-/placeholder-pdf-lib-3.2.6.tgz", + "integrity": "sha512-3iSKYo796aZzmPWCubrc2iXRidkMctDUdP+VvZnuy1e2pjoUa1sxh3a4ohgidJsNOrtMXMwgFk6Q/Y+xQgKOWg==", "funding": [ { "type": "individual", "url": "https://buymeacoffee.com/vbuch?utm_source=npm-funding-signpdf" } ], + "license": "MIT", "dependencies": { "@signpdf/utils": "^3.2.4" }, @@ -11554,6 +11558,39 @@ "node": ">=8" } }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansi-styles/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/ansi-styles/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -11775,6 +11812,12 @@ "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz", "integrity": "sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==" }, + "node_modules/base32.js": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/base32.js/-/base32.js-0.0.1.tgz", + "integrity": "sha512-EGHIRiegFa62/SsA1J+Xs2tIzludPdzM064N9wjbiEgHnGnJ1V0WEpA4pEwCYT5nDvZk3ubf0shqaCS7k6xeUQ==", + "license": "MIT" + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -11832,6 +11875,7 @@ "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", "dev": true, + "license": "MIT", "dependencies": { "readable-stream": "^2.3.5", "safe-buffer": "^5.1.1" @@ -11958,6 +12002,7 @@ "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", "dev": true, + "license": "MIT", "dependencies": { "buffer-alloc-unsafe": "^1.1.0", "buffer-fill": "^1.0.0" @@ -11967,13 +12012,15 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", "dev": true, + "license": "MIT", "engines": { "node": "*" } @@ -11987,7 +12034,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/buffer-from": { "version": "1.1.2", @@ -12087,7 +12135,6 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, "engines": { "node": ">=6" } @@ -12162,6 +12209,7 @@ "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } @@ -12203,36 +12251,6 @@ "node": ">=12" } }, - "node_modules/cliui/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/cliui/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/cliui/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/cliui/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -12508,11 +12526,12 @@ } }, "node_modules/debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -12523,11 +12542,16 @@ } } }, + "node_modules/debug/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, "node_modules/decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -12537,6 +12561,7 @@ "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz", "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==", "dev": true, + "license": "MIT", "dependencies": { "decompress-tar": "^4.0.0", "decompress-tarbz2": "^4.0.0", @@ -12556,6 +12581,7 @@ "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", "dev": true, + "license": "MIT", "dependencies": { "file-type": "^5.2.0", "is-stream": "^1.1.0", @@ -12570,6 +12596,7 @@ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -12579,6 +12606,7 @@ "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", "dev": true, + "license": "MIT", "dependencies": { "decompress-tar": "^4.1.0", "file-type": "^6.1.0", @@ -12595,6 +12623,7 @@ "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -12604,6 +12633,7 @@ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -12613,6 +12643,7 @@ "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", "dev": true, + "license": "MIT", "dependencies": { "decompress-tar": "^4.1.1", "file-type": "^5.2.0", @@ -12627,6 +12658,7 @@ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -12636,6 +12668,7 @@ "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", "integrity": "sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==", "dev": true, + "license": "MIT", "dependencies": { "file-type": "^3.8.0", "get-stream": "^2.2.0", @@ -12651,6 +12684,7 @@ "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -12724,10 +12758,17 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/dijkstrajs": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz", + "integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==", + "license": "MIT" + }, "node_modules/dotenv": { - "version": "16.4.7", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", - "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz", + "integrity": "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==", + "license": "BSD-2-Clause", "engines": { "node": ">=12" }, @@ -12961,19 +13002,19 @@ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "node_modules/eslint": { - "version": "9.23.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.23.0.tgz", - "integrity": "sha512-jV7AbNoFPAY1EkFYpLq5bslU9NLNO8xnEeQXwErNibVryjk67wHVmddTBilc5srIttJDBrB0eMHKZBFbSIABCw==", + "version": "9.25.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.25.1.tgz", + "integrity": "sha512-E6Mtz9oGQWDCpV12319d59n4tx9zOTXSTmc8BLVxBx+G/0RdM5MvEEJLU9c0+aleoePYYgVTOsRblx433qmhWQ==", "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.19.2", - "@eslint/config-helpers": "^0.2.0", - "@eslint/core": "^0.12.0", + "@eslint/config-array": "^0.20.0", + "@eslint/config-helpers": "^0.2.1", + "@eslint/core": "^0.13.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.23.0", - "@eslint/plugin-kit": "^0.2.7", + "@eslint/js": "9.25.1", + "@eslint/plugin-kit": "^0.2.8", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", @@ -13040,20 +13081,6 @@ "node": ">=10" } }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/eslint/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -13069,22 +13096,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/eslint/node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -13314,6 +13325,7 @@ "version": "4.21.2", "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -13505,6 +13517,7 @@ "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", "dev": true, + "license": "MIT", "dependencies": { "pend": "~1.2.0" } @@ -13538,6 +13551,7 @@ "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -13810,13 +13824,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fs-minipass": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -13829,6 +13845,7 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -13840,7 +13857,8 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/fs.realpath": { "version": "1.0.0", @@ -14082,6 +14100,7 @@ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", "integrity": "sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==", "dev": true, + "license": "MIT", "dependencies": { "object-assign": "^4.0.1", "pinkie-promise": "^2.0.0" @@ -14763,7 +14782,8 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", "integrity": "sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-number": { "version": "7.0.0", @@ -15460,6 +15480,7 @@ "version": "11.1.0", "resolved": "https://registry.npmjs.org/mailgun.js/-/mailgun.js-11.1.0.tgz", "integrity": "sha512-pXYcQT3nU32gMjUjZpl2FdQN4Vv2iobqYiXqyyevk0vXTKQj8Or0ifLXLNAGqMHnymTjV0OphBpurkchvHsRAg==", + "license": "MIT", "dependencies": { "axios": "^1.7.4", "base-64": "^1.0.0", @@ -15474,6 +15495,7 @@ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "dev": true, + "license": "MIT", "dependencies": { "pify": "^3.0.0" }, @@ -15486,6 +15508,7 @@ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -15638,6 +15661,7 @@ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "dev": true, + "license": "MIT", "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" @@ -15651,6 +15675,7 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -15662,7 +15687,8 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/mkdirp": { "version": "0.5.6", @@ -15684,9 +15710,9 @@ } }, "node_modules/mongodb": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.15.0.tgz", - "integrity": "sha512-ifBhQ0rRzHDzqp9jAQP6OwHSH7dbYIQjD3SbJs9YYk9AikKEettW/9s/tbSFDTpXcRbF+u1aLrhHxDFaYtZpFQ==", + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.16.0.tgz", + "integrity": "sha512-D1PNcdT0y4Grhou5Zi/qgipZOYeWrhLEpk33n3nm6LGtz61jvO88WlrWCK/bigMjpnOdAUKKQwsGIl0NtWMyYw==", "license": "Apache-2.0", "dependencies": { "@mongodb-js/saslprep": "^1.1.9", @@ -15739,25 +15765,27 @@ } }, "node_modules/mongodb-download-url": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/mongodb-download-url/-/mongodb-download-url-1.5.5.tgz", - "integrity": "sha512-8HLqKVVuKQBinKRZbDu0YSzwLfD/Wb//vOIm3CMk0/2AzZzp0pg+8E+DAkx7VLEdoyuPVWLU5v/doODjXlPYSA==", + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/mongodb-download-url/-/mongodb-download-url-1.5.7.tgz", + "integrity": "sha512-GpQJAfYmfYwqVXUyfIUQXe5kFoiCK5kORBJnPixAmQGmabZix6fBTpX7vSy3J46VgiAe+VEOjSikK/TcGKTw+A==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "debug": "^4.1.1", - "minimist": "^1.2.3", - "node-fetch": "^2.6.1", - "semver": "^7.1.1" + "debug": "^4.4.0", + "minimist": "^1.2.8", + "node-fetch": "^2.7.0", + "semver": "^7.7.1" }, "bin": { "mongodb-download-url": "bin/mongodb-download-url.js" } }, "node_modules/mongodb-download-url/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -15766,15 +15794,15 @@ } }, "node_modules/mongodb-runner": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/mongodb-runner/-/mongodb-runner-5.8.0.tgz", - "integrity": "sha512-1rUgrM4MSscj0tc2DTWNQpzLNBepOzKhmdKOVYctjyo2E92IdXJYQL+NfN1TiI+GTCXH+MWH1EFciNOgdO7Q8g==", + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/mongodb-runner/-/mongodb-runner-5.8.2.tgz", + "integrity": "sha512-Fsr87S3P75jAd/D1ly0/lODpjtFpHd+q9Ml2KjQQmPeGisdjCDO9bFOJ1F9xrdtvww2eeR8xKBXrtZYdP5P59A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@mongodb-js/mongodb-downloader": "^0.3.7", - "@mongodb-js/saslprep": "^1.2.0", - "debug": "^4.3.4", + "@mongodb-js/mongodb-downloader": "^0.3.9", + "@mongodb-js/saslprep": "^1.2.2", + "debug": "^4.4.0", "mongodb": "^6.9.0", "mongodb-connection-string-url": "^3.0.0", "yargs": "^17.7.2" @@ -15926,9 +15954,10 @@ "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" }, "node_modules/nodemailer": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.10.0.tgz", - "integrity": "sha512-SQ3wZCExjeSatLE/HBaXS5vqUOQk6GtBdIIKxiFdmm01mOQZX/POJkO3SUX1wDiYcwUOJwT23scFSC9fY2H8IA==", + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.10.1.tgz", + "integrity": "sha512-Z+iLaBGVaSjbIzQ4pX6XV41HrooLsQ10ZWPUehGmuantvzWoDVBnmsdUcOIDM1t+yPor5pDhVlDESgOMEGxhHA==", + "license": "MIT-0", "engines": { "node": ">=6.0.0" } @@ -16038,21 +16067,6 @@ "node": ">=18" } }, - "node_modules/nyc/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/nyc/node_modules/cliui": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", @@ -16064,24 +16078,6 @@ "wrap-ansi": "^6.2.0" } }, - "node_modules/nyc/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/nyc/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/nyc/node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", @@ -16407,7 +16403,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, "engines": { "node": ">=6" } @@ -16488,20 +16483,6 @@ "parse-dbtool": "src/parse-dbtool.js" } }, - "node_modules/parse-dbtool/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/parse-dbtool/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -16517,22 +16498,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/parse-dbtool/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/parse-dbtool/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/parse-dbtool/node_modules/date-fns": { "version": "2.30.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", @@ -16855,7 +16820,8 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/performance-now": { "version": "2.1.0", @@ -17021,6 +16987,7 @@ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -17030,6 +16997,7 @@ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -17039,6 +17007,7 @@ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", "dev": true, + "license": "MIT", "dependencies": { "pinkie": "^2.0.0" }, @@ -17118,6 +17087,15 @@ "node": ">=4" } }, + "node_modules/pngjs": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", + "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/possible-typed-array-names": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", @@ -17162,12 +17140,12 @@ } }, "node_modules/posthog-node": { - "version": "4.10.2", - "resolved": "https://registry.npmjs.org/posthog-node/-/posthog-node-4.10.2.tgz", - "integrity": "sha512-mylSjhI3R69FF+2T/HT5ZcFnS0q22/U/JrvfkI4vEr+BLwjSOE8a3CvbXJEDzDXw44wg5iJuXBZYAEu15rvERg==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/posthog-node/-/posthog-node-4.13.0.tgz", + "integrity": "sha512-4rGi+9hf4WmMcKjWuzBtQYzFRltfVmSPCB5N364AhchFAT2Eoclx1M7KUWJZ0C2fMObdNGRNw1NQYEO4iGnviQ==", "license": "MIT", "dependencies": { - "axios": "^1.7.4" + "axios": "^1.8.2" }, "engines": { "node": ">=15.0.0" @@ -17336,6 +17314,161 @@ "node": ">=6" } }, + "node_modules/qrcode": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.4.tgz", + "integrity": "sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==", + "license": "MIT", + "dependencies": { + "dijkstrajs": "^1.0.1", + "pngjs": "^5.0.0", + "yargs": "^15.3.1" + }, + "bin": { + "qrcode": "bin/qrcode" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/qrcode/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/qrcode/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/qrcode/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/qrcode/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/qrcode/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/qrcode/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/qrcode/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/qrcode/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/qrcode/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "license": "ISC" + }, + "node_modules/qrcode/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "license": "MIT", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/qrcode/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/qs": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", @@ -17549,8 +17682,7 @@ "node_modules/require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" }, "node_modules/resolve-from": { "version": "4.0.0", @@ -17698,6 +17830,7 @@ "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz", "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==", "dev": true, + "license": "MIT", "dependencies": { "commander": "^2.8.1" }, @@ -17710,7 +17843,8 @@ "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/semver": { "version": "6.3.1", @@ -18005,6 +18139,18 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, + "node_modules/speakeasy": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/speakeasy/-/speakeasy-2.0.0.tgz", + "integrity": "sha512-lW2A2s5LKi8rwu77ewisuUOtlCydF/hmQSOJjpTqTj1gZLkNgTaYnyvfxy2WBr4T/h+9c4g8HIITfj83OkFQFw==", + "license": "MIT", + "dependencies": { + "base32.js": "0.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, "node_modules/spex": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/spex/-/spex-3.4.0.tgz", @@ -18228,6 +18374,7 @@ "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", "dev": true, + "license": "MIT", "dependencies": { "is-natural-number": "^4.0.1" } @@ -18296,6 +18443,7 @@ "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", "dev": true, + "license": "ISC", "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -18313,6 +18461,7 @@ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", "dev": true, + "license": "MIT", "dependencies": { "bl": "^1.0.0", "buffer-alloc": "^1.2.0", @@ -18331,6 +18480,7 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "dev": true, + "license": "ISC", "engines": { "node": ">=8" } @@ -18340,6 +18490,7 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, + "license": "MIT", "bin": { "mkdirp": "bin/cmd.js" }, @@ -18351,7 +18502,8 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/teeny-request": { "version": "9.0.0", @@ -18438,7 +18590,8 @@ "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/timers-ext": { "version": "0.1.8", @@ -18456,7 +18609,8 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/to-regex-range": { "version": "5.0.1", @@ -18623,6 +18777,7 @@ "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", "dev": true, + "license": "MIT", "dependencies": { "buffer": "^5.2.1", "through": "^2.3.8" @@ -18647,6 +18802,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -18916,8 +19072,7 @@ "node_modules/which-module": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", - "dev": true + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==" }, "node_modules/which-typed-array": { "version": "1.1.15", @@ -19083,39 +19238,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -19316,6 +19438,7 @@ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", "dev": true, + "license": "MIT", "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" diff --git a/apps/OpenSignServer/package.json b/apps/OpenSignServer/package.json index fc85ffc155..73361fcbff 100644 --- a/apps/OpenSignServer/package.json +++ b/apps/OpenSignServer/package.json @@ -18,43 +18,45 @@ "watch": "nodemon index.js" }, "dependencies": { - "@aws-sdk/client-s3": "^3.775.0", - "@aws-sdk/s3-request-presigner": "^3.775.0", + "@aws-sdk/client-s3": "^3.787.0", + "@aws-sdk/s3-request-presigner": "^3.787.0", "@parse/fs-files-adapter": "^3.0.0", "@parse/s3-files-adapter": "^4.1.0", "@pdf-lib/fontkit": "^1.1.1", - "@signpdf/placeholder-pdf-lib": "^3.2.4", + "@signpdf/placeholder-pdf-lib": "^3.2.6", "@signpdf/signer-p12": "^3.2.4", "@signpdf/signpdf": "^3.2.5", "aws-sdk": "^2.1692.0", "axios": "^1.8.4", "cors": "^2.8.5", "date-fns-tz": "^3.2.0", - "dotenv": "^16.4.7", - "express": "^4.21.1", + "dotenv": "^16.5.0", + "express": "^4.21.2", "form-data": "^4.0.2", "generate-api-key": "^1.0.2", "googleapis": "^148.0.0", "mailgun.js": "^11.1.0", - "mongodb": "^6.15.0", + "mongodb": "^6.16.0", "multer": "^1.4.5-lts.2", "multer-s3": "^3.0.1", "node-forge": "^1.3.1", - "nodemailer": "^6.10.0", + "nodemailer": "^6.10.1", "parse": "^5.3.0", "parse-dbtool": "^1.2.0", "parse-server": "^7.4.0", "parse-server-api-mail-adapter": "^4.1.0", "pdf-lib": "^1.17.1", - "posthog-node": "^4.10.2", + "posthog-node": "^4.13.0", + "qrcode": "^1.5.4", + "speakeasy": "^2.0.0", "ws": "^8.18.1" }, "type": "module", "devDependencies": { "@babel/eslint-parser": "^7.27.0", - "eslint": "^9.23.0", + "eslint": "^9.25.1", "jasmine": "^5.6.0", - "mongodb-runner": "^5.8.0", + "mongodb-runner": "^5.8.2", "nodemon": "^3.1.9", "nyc": "^17.1.0", "prettier": "^3.5.3"