diff --git a/package.json b/package.json index 3c1a4a2..44093f0 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,6 @@ "date-fns": "^4.1.0", "dayjs": "^1.11.19", "dotenv": "^17.2.3", - "ejs": "^3.1.10", "express": "^5.1.0", "he": "^1.2.0", "jsonwebtoken": "^9.0.2", @@ -35,9 +34,6 @@ "nanoid": "^5.1.6", "node-cache": "^5.1.2", "object-hash": "^3.0.0", - "pdf-to-img": "^6.1.0", - "posthtml": "^0.16.7", - "puppeteer": "^24.31.0", "redis": "^5.10.0", "sharp": "^0.34.5", "socket.io": "^4.8.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c608522..0395cff 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -29,9 +29,6 @@ importers: dotenv: specifier: ^17.2.3 version: 17.2.3 - ejs: - specifier: ^3.1.10 - version: 3.1.10 express: specifier: ^5.1.0 version: 5.2.1 @@ -62,15 +59,6 @@ importers: object-hash: specifier: ^3.0.0 version: 3.0.0 - pdf-to-img: - specifier: ^6.1.0 - version: 6.2.0 - posthtml: - specifier: ^0.16.7 - version: 0.16.7 - puppeteer: - specifier: ^24.31.0 - version: 24.36.1 redis: specifier: ^5.10.0 version: 5.10.0 @@ -621,76 +609,6 @@ packages: '@mongodb-js/saslprep@1.4.5': resolution: {integrity: sha512-k64Lbyb7ycCSXHSLzxVdb2xsKGPMvYZfCICXvDsI8Z65CeWQzTEKS4YmGbnqw+U9RBvLPTsB6UCmwkgsDTGWIw==} - '@napi-rs/canvas-android-arm64@0.1.100': - resolution: {integrity: sha512-hjhCKhntPv9+t4ckHymdx0phYNcVW+GKQR6Lzw2zE+pOVjOplSmtx9nNNknTjbEDLcuLZqA1y8ufKg1XfgftzQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [android] - - '@napi-rs/canvas-darwin-arm64@0.1.100': - resolution: {integrity: sha512-2PcswRaC7Ly645DGt88///zuFDhJxJYdKAs1uU3mfk1atYkXufgcgLfBpk6Tm12nCQBaNt1wpybuPZ4qOhTo8A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@napi-rs/canvas-darwin-x64@0.1.100': - resolution: {integrity: sha512-ePNZtj7pNIva/siZMg+HmbeozkIjqUIYdoymH8HaA3qK7LfzFN4WMBM8G6HQ9ZC+H3+Dnn5pqtiXpgLykaPOhw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@napi-rs/canvas-linux-arm-gnueabihf@0.1.100': - resolution: {integrity: sha512-d5cDB48oWFGU8/XPhUOFAlySgb/VAu7D+s8fi55K1Pcfg8aPplHWqMgibhVLU8ky7Pyg/fuiVLz4Nf3JrSTuUA==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - - '@napi-rs/canvas-linux-arm64-gnu@0.1.100': - resolution: {integrity: sha512-rDxgxRu69RvDlX/bh9o22DxLsGr8EqsNgotL9+RwQE1S0b0cqeatqsw6aW45mukm0B42DIAaAacKaYQ8cqS1nw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@napi-rs/canvas-linux-arm64-musl@0.1.100': - resolution: {integrity: sha512-K3mDW66N+xT2/V439u1alFANiBUjdEx2gLiNYnCmUsva5jZMxWTjafBYwTzYK+EMFMHrUoabuU+T1BIP5CgbYQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@napi-rs/canvas-linux-riscv64-gnu@0.1.100': - resolution: {integrity: sha512-mooqUBTIsccZpnoQC4NgrC1v6C1vof39etLNMnBwCY+p0gajWJvAHLGQ6g/gGyS5YrpDW+GefSN4+Cvcr08UWw==} - engines: {node: '>= 10'} - cpu: [riscv64] - os: [linux] - - '@napi-rs/canvas-linux-x64-gnu@0.1.100': - resolution: {integrity: sha512-1eCvkDCazm7FFhsT7DfGOdSaHgZVK3bt/dSBl5EWHOWmnz+I7j8tPseJqqD81NF+MH21jKUK4wQSDjN0mdhnTg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@napi-rs/canvas-linux-x64-musl@0.1.100': - resolution: {integrity: sha512-20arT6lnI19S68qNlii73TSEDbECNgzMz2EpldC1V3mZFuRkeujXkcebRk0LRJe9SEUAooYiLokfMViY8IX7yA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@napi-rs/canvas-win32-arm64-msvc@0.1.100': - resolution: {integrity: sha512-DZFFT1wIAg37LJw37yhMRFfjATd3vTQzjZ1Yki8u2vhO6Hi5VE6BVaGQ1aaDu7xb4iMErz+9EOwjpS7xcxFeBw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - - '@napi-rs/canvas-win32-x64-msvc@0.1.100': - resolution: {integrity: sha512-MyT1j3mHC2+Lu4pBi9mKyMJhtP6U7k7EldY7sj/uS5gJA65gTXt8MefJQXLJo5d/vZbuWmfxzkEUNc/urV3pHA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - - '@napi-rs/canvas@0.1.100': - resolution: {integrity: sha512-xglYA6q3XO5P3BNJYxVZ1IV7DLVjp1Py6nwag88YntrS+3vKHyYcMqXVS4ZztJmwz2uGvz1FWhI/4LgbR5uQDA==} - engines: {node: '>= 10'} - '@napi-rs/wasm-runtime@0.2.12': resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} @@ -736,11 +654,6 @@ packages: resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@puppeteer/browsers@2.11.2': - resolution: {integrity: sha512-GBY0+2lI9fDrjgb5dFL9+enKXqyOPok9PXg/69NVkjW3bikbK9RQrNrI3qccQXmDNN7ln4j/yL89Qgvj/tfqrw==} - engines: {node: '>=18'} - hasBin: true - '@redis/bloom@5.10.0': resolution: {integrity: sha512-doIF37ob+l47n0rkpRNgU8n4iacBlKM9xLiP1LtTZTvz8TloJB8qx/MgvhMhKdYG+CvCY2aPBnN2706izFn/4A==} engines: {node: '>= 18'} @@ -787,9 +700,6 @@ packages: '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} - '@tootallnate/quickjs-emscripten@0.23.0': - resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} - '@tybys/wasm-util@0.10.1': resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} @@ -847,9 +757,6 @@ packages: '@types/yargs@17.0.35': resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} - '@types/yauzl@2.10.3': - resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} @@ -966,10 +873,6 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - agent-base@7.1.4: - resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} - engines: {node: '>= 14'} - ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -1042,17 +945,10 @@ packages: asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} - ast-types@0.13.4: - resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} - engines: {node: '>=4'} - async-function@1.0.0: resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} engines: {node: '>= 0.4'} - async@3.2.6: - resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} - asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -1063,14 +959,6 @@ packages: axios@1.13.4: resolution: {integrity: sha512-1wVkUaAO6WyaYtCkcYCOx12ZgpGf9Zif+qXa4n+oYzK558YryKqiL6UWwd5DqiH3VRW0GYhTZQ/vlgJrCoNQlg==} - b4a@1.7.3: - resolution: {integrity: sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==} - peerDependencies: - react-native-b4a: '*' - peerDependenciesMeta: - react-native-b4a: - optional: true - babel-jest@30.2.0: resolution: {integrity: sha512-0YiBEOxWqKkSQWL9nNGGEgndoeL0ZpWrbLMNL5u/Kaxrli3Eaxlt3ZtIDktEvXt4L/R9r3ODr2zKwGM/2BjxVw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -1099,44 +987,6 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - bare-events@2.8.2: - resolution: {integrity: sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==} - peerDependencies: - bare-abort-controller: '*' - peerDependenciesMeta: - bare-abort-controller: - optional: true - - bare-fs@4.5.3: - resolution: {integrity: sha512-9+kwVx8QYvt3hPWnmb19tPnh38c6Nihz8Lx3t0g9+4GoIf3/fTgYwM4Z6NxgI+B9elLQA7mLE9PpqcWtOMRDiQ==} - engines: {bare: '>=1.16.0'} - peerDependencies: - bare-buffer: '*' - peerDependenciesMeta: - bare-buffer: - optional: true - - bare-os@3.6.2: - resolution: {integrity: sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==} - engines: {bare: '>=1.14.0'} - - bare-path@3.0.0: - resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} - - bare-stream@2.7.0: - resolution: {integrity: sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==} - peerDependencies: - bare-buffer: '*' - bare-events: '*' - peerDependenciesMeta: - bare-buffer: - optional: true - bare-events: - optional: true - - bare-url@2.3.2: - resolution: {integrity: sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==} - base64-js@0.0.2: resolution: {integrity: sha512-Pj9L87dCdGcKlSqPVUjD+q96pbIx1zQQLb2CUiWURfjiBELv84YX+0nGnKmyT/9KkC7PQk7UN1w+Al8bBozaxQ==} engines: {node: '>= 0.4'} @@ -1149,10 +999,6 @@ packages: resolution: {integrity: sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==} hasBin: true - basic-ftp@5.1.0: - resolution: {integrity: sha512-RkaJzeJKDbaDWTIPiJwubyljaEPwpVWkm9Rt5h9Nd6h7tEXTJ3VB4qxdZBioV7JO5yLUaOKwz7vDOzlncUsegw==} - engines: {node: '>=10.0.0'} - binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} @@ -1195,9 +1041,6 @@ packages: resolution: {integrity: sha512-h/C0qe6857pQhcSJHLfsR1uYGj98Ge3wKAD3Ed9KqH3wcVh+BM4Jq4xISD7vs9OPuT07n+q3QQVjslJ286j6ag==} engines: {node: '>=20.19.0'} - buffer-crc32@0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - buffer-equal-constant-time@1.0.1: resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} @@ -1257,11 +1100,6 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} - chromium-bidi@13.0.1: - resolution: {integrity: sha512-c+RLxH0Vg2x2syS9wPw378oJgiJNXtYXUvnVAldUlt5uaHekn0CCU7gPksNgHjrH1qFhmjVXQj4esvuthuC7OQ==} - peerDependencies: - devtools-protocol: '*' - ci-info@4.4.0: resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} engines: {node: '>=8'} @@ -1334,23 +1172,10 @@ packages: resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} engines: {node: '>= 0.10'} - cosmiconfig@9.0.0: - resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} - engines: {node: '>=14'} - peerDependencies: - typescript: '>=4.9.5' - peerDependenciesMeta: - typescript: - optional: true - cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - data-uri-to-buffer@6.0.2: - resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} - engines: {node: '>= 14'} - data-view-buffer@1.0.2: resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} engines: {node: '>= 0.4'} @@ -1421,10 +1246,6 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} - degenerator@5.0.1: - resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} - engines: {node: '>= 14'} - delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -1441,9 +1262,6 @@ packages: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} - devtools-protocol@0.0.1551306: - resolution: {integrity: sha512-CFx8QdSim8iIv+2ZcEOclBKTQY6BI1IEDa7Tm9YkwAXzEWFndTEzpTo5jAUhSnq24IC7xaDw0wvGcm96+Y3PEg==} - dezalgo@1.0.4: resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} @@ -1455,19 +1273,6 @@ packages: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} - dom-serializer@1.4.1: - resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} - - domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - - domhandler@4.3.1: - resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} - engines: {node: '>= 4'} - - domutils@2.8.0: - resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} - dotenv@17.2.3: resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==} engines: {node: '>=12'} @@ -1485,11 +1290,6 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - ejs@3.1.10: - resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} - engines: {node: '>=0.10.0'} - hasBin: true - electron-to-chromium@1.5.283: resolution: {integrity: sha512-3vifjt1HgrGW/h76UEeny+adYApveS9dH2h3p57JYzBSXJIKUJAvtmIytDKjcSCt9xHfrNCFJ7gts6vkhuq++w==} @@ -1507,9 +1307,6 @@ packages: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} - end-of-stream@1.4.5: - resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} - engine.io-parser@5.2.3: resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} engines: {node: '>=10.0.0'} @@ -1518,17 +1315,6 @@ packages: resolution: {integrity: sha512-2RZdgEbXmp5+dVbRm0P7HQUImZpICccJy7rN7Tv+SFa55pH+lxnuw6/K1ZxxBfHoYpSkHLAO92oa8O4SwFXA2A==} engines: {node: '>=10.2.0'} - entities@2.2.0: - resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} - - entities@3.0.1: - resolution: {integrity: sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==} - engines: {node: '>=0.12'} - - env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} - error-ex@1.3.4: resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} @@ -1582,11 +1368,6 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - escodegen@2.1.0: - resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} - engines: {node: '>=6.0'} - hasBin: true - eslint-config-prettier@10.1.8: resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} hasBin: true @@ -1763,9 +1544,6 @@ packages: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} - events-universal@1.0.1: - resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} - execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -1782,20 +1560,12 @@ packages: resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} engines: {node: '>= 18'} - extract-zip@2.0.1: - resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} - engines: {node: '>= 10.17.0'} - hasBin: true - fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} fast-diff@1.3.0: resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - fast-fifo@1.3.2: - resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} - fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} @@ -1811,9 +1581,6 @@ packages: fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} - fd-slicer@1.1.0: - resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} - file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -1822,9 +1589,6 @@ packages: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} - filelist@1.0.4: - resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} - fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -1939,10 +1703,6 @@ packages: resolution: {integrity: sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==} engines: {node: '>=10'} - get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} - get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} @@ -1951,10 +1711,6 @@ packages: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} - get-uri@6.0.5: - resolution: {integrity: sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==} - engines: {node: '>= 14'} - glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -2031,21 +1787,10 @@ packages: html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - htmlparser2@7.2.0: - resolution: {integrity: sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==} - http-errors@2.0.1: resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} engines: {node: '>= 0.8'} - http-proxy-agent@7.0.2: - resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} - engines: {node: '>= 14'} - - https-proxy-agent@7.0.6: - resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} - engines: {node: '>= 14'} - human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} @@ -2156,9 +1901,6 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} - is-json@2.0.1: - resolution: {integrity: sha512-6BEnpVn1rcf3ngfmViLM6vjUjGErbdrL4rwlv+u1NO1XO8kqT4YGL8+19Q+Z/bas8tY90BTWMk2+fW1g6hQjbA==} - is-map@2.0.3: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} @@ -2258,11 +2000,6 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jake@10.9.4: - resolution: {integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==} - engines: {node: '>=10'} - hasBin: true - jest-changed-files@30.2.0: resolution: {integrity: sha512-L8lR1ChrRnSdfeOvTrwZMlnWV8G/LLjQ0nG9MBclwWZidA2N5FviRki0Bvh20WRMOX31/JYvzdqTJrk5oBdydQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -2537,10 +2274,6 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - lru-cache@7.18.3: - resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} - engines: {node: '>=12'} - make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} @@ -2602,10 +2335,6 @@ packages: minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} - minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} @@ -2617,9 +2346,6 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} - mitt@3.0.1: - resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} - mkdirp@1.0.4: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} @@ -2742,10 +2468,6 @@ packages: resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} engines: {node: '>= 0.6'} - netmask@2.0.2: - resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} - engines: {node: '>= 0.4.0'} - node-cache@5.1.2: resolution: {integrity: sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==} engines: {node: '>= 8.0.0'} @@ -2753,9 +2475,6 @@ packages: node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - node-readable-to-web-readable-stream@0.4.2: - resolution: {integrity: sha512-/cMZNI34v//jUTrI+UIo4ieHAB5EZRY/+7OmXZgBxaWBMcW2tGdceIw06RFxWxrKZ5Jp3sI2i5TsRo+CBhtVLQ==} - node-releases@2.0.27: resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} @@ -2854,14 +2573,6 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} - pac-proxy-agent@7.2.0: - resolution: {integrity: sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==} - engines: {node: '>= 14'} - - pac-resolver@7.0.1: - resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} - engines: {node: '>= 14'} - package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} @@ -2907,18 +2618,6 @@ packages: path-to-regexp@8.3.0: resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} - pdf-to-img@6.2.0: - resolution: {integrity: sha512-54CaUwpTXw0SkG6U3Twx7AJNM2ZuFNpDCJ7oHmmW113gT8RwLZSbzv4/GOr+H0PFpFisuHcUirZBKgXkJXA1zg==} - engines: {node: '>=20.19.0 || >=22.13.0 || >=24'} - hasBin: true - - pdfjs-dist@5.6.205: - resolution: {integrity: sha512-tlUj+2IDa7G1SbvBNN74UHRLJybZDWYom+k6p5KIZl7huBvsA4APi6mKL+zCxd3tLjN5hOOEE9Tv7VdzO88pfg==} - engines: {node: '>=20.19.0 || >=22.13.0 || >=24'} - - pend@1.2.0: - resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} - picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -2950,18 +2649,6 @@ packages: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} - posthtml-parser@0.11.0: - resolution: {integrity: sha512-QecJtfLekJbWVo/dMAA+OSwY79wpRmbqS5TeXvXSX+f0c6pW4/SE6inzZ2qkU7oAMCPqIDkZDvd/bQsSFUnKyw==} - engines: {node: '>=12'} - - posthtml-render@3.0.0: - resolution: {integrity: sha512-z+16RoxK3fUPgwaIgH9NGnK1HKY9XIDpydky5eQGgAFVXTCSezalv9U2jQuNV+Z9qV1fDWNzldcw4eK0SSbqKA==} - engines: {node: '>=12'} - - posthtml@0.16.7: - resolution: {integrity: sha512-7Hc+IvlQ7hlaIfQFZnxlRl0jnpWq2qwibORBhQYIb0QbNtuicc5ZxvKkVT71HJ4Py1wSZ/3VR1r8LfkCtoCzhw==} - engines: {node: '>=12.0.0'} - prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -2982,10 +2669,6 @@ packages: process-nextick-args@1.0.7: resolution: {integrity: sha512-yN0WQmuCX63LP/TMvAg31nvT6m4vDqJEiiv2CAZqWOGNWutc9DfDk1NPYYmKUFmaVM2UwDowH4u5AHWYP/jxKw==} - progress@2.0.3: - resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} - engines: {node: '>=0.4.0'} - prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} @@ -2993,32 +2676,16 @@ packages: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} - proxy-agent@6.5.0: - resolution: {integrity: sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==} - engines: {node: '>= 14'} - proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} pstree.remy@1.1.8: resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} - pump@3.0.3: - resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} - punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - puppeteer-core@24.36.1: - resolution: {integrity: sha512-L7ykMWc3lQf3HS7ME3PSjp7wMIjJeW6+bKfH/RSTz5l6VUDGubnrC2BKj3UvM28Y5PMDFW0xniJOZHBZPpW1dQ==} - engines: {node: '>=18'} - - puppeteer@24.36.1: - resolution: {integrity: sha512-uPiDUyf7gd7Il1KnqfNUtHqntL0w1LapEw5Zsuh8oCK8GsqdxySX1PzdIHKB2Dw273gWY4MW0zC5gy3Re9XlqQ==} - engines: {node: '>=18'} - hasBin: true - pure-rand@7.0.1: resolution: {integrity: sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==} @@ -3244,10 +2911,6 @@ packages: socketio-jwt@4.6.2: resolution: {integrity: sha512-bcCnit/cCvqtC921Gwuqor+LpLKrpREmPACVgLfdbFBL95w2nPF7lOxsOxyeRrhc5Kot/1jUSW5+kLo23zJIMA==} - socks-proxy-agent@8.0.5: - resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} - engines: {node: '>= 14'} - socks@2.8.7: resolution: {integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==} engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} @@ -3290,9 +2953,6 @@ packages: resolution: {integrity: sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==} engines: {node: '>=8.0'} - streamx@2.23.0: - resolution: {integrity: sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==} - string-length@4.0.2: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} engines: {node: '>=10'} @@ -3379,19 +3039,10 @@ packages: resolution: {integrity: sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==} engines: {node: ^14.18.0 || >=16.0.0} - tar-fs@3.1.1: - resolution: {integrity: sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==} - - tar-stream@3.1.7: - resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} - test-exclude@6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} - text-decoder@1.2.3: - resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} - text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -3466,9 +3117,6 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typed-query-selector@2.12.0: - resolution: {integrity: sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==} - uid2@0.0.3: resolution: {integrity: sha512-5gSP1liv10Gjp8cMEnFd6shzkL/D6W1uhXSFNCxDC+YI8+L8wkCYCbJ7n77Ezb4wE/xzMogecE+DtamEe9PZjg==} @@ -3524,9 +3172,6 @@ packages: walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} - webdriver-bidi-protocol@0.4.0: - resolution: {integrity: sha512-U9VIlNRrq94d1xxR9JrCEAx5Gv/2W7ERSv8oWRoNe/QYbfccS0V3h/H6qeNeCRJxXGMhhnkqvwNrvPAYeuP9VA==} - webidl-conversions@7.0.0: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} @@ -3587,18 +3232,6 @@ packages: utf-8-validate: optional: true - ws@8.19.0: - resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - xdg-basedir@4.0.0: resolution: {integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==} engines: {node: '>=8'} @@ -3625,16 +3258,10 @@ packages: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} - yauzl@2.10.0: - resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} - yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - zod@3.25.76: - resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} - snapshots: '@babel/code-frame@7.29.0': @@ -4251,54 +3878,6 @@ snapshots: dependencies: sparse-bitfield: 3.0.3 - '@napi-rs/canvas-android-arm64@0.1.100': - optional: true - - '@napi-rs/canvas-darwin-arm64@0.1.100': - optional: true - - '@napi-rs/canvas-darwin-x64@0.1.100': - optional: true - - '@napi-rs/canvas-linux-arm-gnueabihf@0.1.100': - optional: true - - '@napi-rs/canvas-linux-arm64-gnu@0.1.100': - optional: true - - '@napi-rs/canvas-linux-arm64-musl@0.1.100': - optional: true - - '@napi-rs/canvas-linux-riscv64-gnu@0.1.100': - optional: true - - '@napi-rs/canvas-linux-x64-gnu@0.1.100': - optional: true - - '@napi-rs/canvas-linux-x64-musl@0.1.100': - optional: true - - '@napi-rs/canvas-win32-arm64-msvc@0.1.100': - optional: true - - '@napi-rs/canvas-win32-x64-msvc@0.1.100': - optional: true - - '@napi-rs/canvas@0.1.100': - optionalDependencies: - '@napi-rs/canvas-android-arm64': 0.1.100 - '@napi-rs/canvas-darwin-arm64': 0.1.100 - '@napi-rs/canvas-darwin-x64': 0.1.100 - '@napi-rs/canvas-linux-arm-gnueabihf': 0.1.100 - '@napi-rs/canvas-linux-arm64-gnu': 0.1.100 - '@napi-rs/canvas-linux-arm64-musl': 0.1.100 - '@napi-rs/canvas-linux-riscv64-gnu': 0.1.100 - '@napi-rs/canvas-linux-x64-gnu': 0.1.100 - '@napi-rs/canvas-linux-x64-musl': 0.1.100 - '@napi-rs/canvas-win32-arm64-msvc': 0.1.100 - '@napi-rs/canvas-win32-x64-msvc': 0.1.100 - optional: true - '@napi-rs/wasm-runtime@0.2.12': dependencies: '@emnapi/core': 1.8.1 @@ -4346,21 +3925,6 @@ snapshots: '@pkgr/core@0.2.9': {} - '@puppeteer/browsers@2.11.2': - dependencies: - debug: 4.4.3(supports-color@5.5.0) - extract-zip: 2.0.1 - progress: 2.0.3 - proxy-agent: 6.5.0 - semver: 7.7.3 - tar-fs: 3.1.1 - yargs: 17.7.2 - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - - react-native-b4a - - supports-color - '@redis/bloom@5.10.0(@redis/client@5.10.0)': dependencies: '@redis/client': 5.10.0 @@ -4397,8 +3961,6 @@ snapshots: '@standard-schema/spec@1.1.0': {} - '@tootallnate/quickjs-emscripten@0.23.0': {} - '@tybys/wasm-util@0.10.1': dependencies: tslib: 2.8.1 @@ -4467,11 +4029,6 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@types/yauzl@2.10.3': - dependencies: - '@types/node': 25.2.0 - optional: true - '@ungap/structured-clone@1.3.0': {} '@unrs/resolver-binding-android-arm-eabi@1.11.1': @@ -4549,8 +4106,6 @@ snapshots: acorn@8.15.0: {} - agent-base@7.1.4: {} - ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -4654,14 +4209,8 @@ snapshots: asap@2.0.6: {} - ast-types@0.13.4: - dependencies: - tslib: 2.8.1 - async-function@1.0.0: {} - async@3.2.6: {} - asynckit@0.4.0: {} available-typed-arrays@1.0.7: @@ -4676,8 +4225,6 @@ snapshots: transitivePeerDependencies: - debug - b4a@1.7.3: {} - babel-jest@30.2.0(@babel/core@7.29.0): dependencies: '@babel/core': 7.29.0 @@ -4732,51 +4279,12 @@ snapshots: balanced-match@1.0.2: {} - bare-events@2.8.2: {} - - bare-fs@4.5.3: - dependencies: - bare-events: 2.8.2 - bare-path: 3.0.0 - bare-stream: 2.7.0(bare-events@2.8.2) - bare-url: 2.3.2 - fast-fifo: 1.3.2 - transitivePeerDependencies: - - bare-abort-controller - - react-native-b4a - optional: true - - bare-os@3.6.2: - optional: true - - bare-path@3.0.0: - dependencies: - bare-os: 3.6.2 - optional: true - - bare-stream@2.7.0(bare-events@2.8.2): - dependencies: - streamx: 2.23.0 - optionalDependencies: - bare-events: 2.8.2 - transitivePeerDependencies: - - bare-abort-controller - - react-native-b4a - optional: true - - bare-url@2.3.2: - dependencies: - bare-path: 3.0.0 - optional: true - base64-js@0.0.2: {} base64id@2.0.0: {} baseline-browser-mapping@2.9.19: {} - basic-ftp@5.1.0: {} - binary-extensions@2.3.0: {} body-parser@2.2.2: @@ -4829,8 +4337,6 @@ snapshots: bson@7.3.1: {} - buffer-crc32@0.2.13: {} - buffer-equal-constant-time@1.0.1: {} buffer-from@1.1.2: {} @@ -4889,12 +4395,6 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - chromium-bidi@13.0.1(devtools-protocol@0.0.1551306): - dependencies: - devtools-protocol: 0.0.1551306 - mitt: 3.0.1 - zod: 3.25.76 - ci-info@4.4.0: {} cjs-module-lexer@2.2.0: {} @@ -4946,21 +4446,12 @@ snapshots: object-assign: 4.1.1 vary: 1.1.2 - cosmiconfig@9.0.0: - dependencies: - env-paths: 2.2.1 - import-fresh: 3.3.1 - js-yaml: 4.1.1 - parse-json: 5.2.0 - cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - data-uri-to-buffer@6.0.2: {} - data-view-buffer@1.0.2: dependencies: call-bound: 1.0.4 @@ -5017,12 +4508,6 @@ snapshots: has-property-descriptors: 1.0.2 object-keys: 1.1.1 - degenerator@5.0.1: - dependencies: - ast-types: 0.13.4 - escodegen: 2.1.0 - esprima: 4.0.1 - delayed-stream@1.0.0: {} depd@2.0.0: {} @@ -5031,8 +4516,6 @@ snapshots: detect-newline@3.1.0: {} - devtools-protocol@0.0.1551306: {} - dezalgo@1.0.4: dependencies: asap: 2.0.6 @@ -5046,24 +4529,6 @@ snapshots: dependencies: esutils: 2.0.3 - dom-serializer@1.4.1: - dependencies: - domelementtype: 2.3.0 - domhandler: 4.3.1 - entities: 2.2.0 - - domelementtype@2.3.0: {} - - domhandler@4.3.1: - dependencies: - domelementtype: 2.3.0 - - domutils@2.8.0: - dependencies: - dom-serializer: 1.4.1 - domelementtype: 2.3.0 - domhandler: 4.3.1 - dotenv@17.2.3: {} dunder-proto@1.0.1: @@ -5080,10 +4545,6 @@ snapshots: ee-first@1.1.1: {} - ejs@3.1.10: - dependencies: - jake: 10.9.4 - electron-to-chromium@1.5.283: {} emittery@0.13.1: {} @@ -5094,10 +4555,6 @@ snapshots: encodeurl@2.0.0: {} - end-of-stream@1.4.5: - dependencies: - once: 1.4.0 - engine.io-parser@5.2.3: {} engine.io@6.6.5: @@ -5116,12 +4573,6 @@ snapshots: - supports-color - utf-8-validate - entities@2.2.0: {} - - entities@3.0.1: {} - - env-paths@2.2.1: {} - error-ex@1.3.4: dependencies: is-arrayish: 0.2.1 @@ -5237,19 +4688,11 @@ snapshots: escape-string-regexp@4.0.0: {} - escodegen@2.1.0: - dependencies: - esprima: 4.0.1 - estraverse: 5.3.0 - esutils: 2.0.3 - optionalDependencies: - source-map: 0.6.1 - eslint-config-prettier@10.1.8(eslint@9.39.2): dependencies: eslint: 9.39.2 - eslint-config-standard-jsx@11.0.0(eslint-plugin-react@7.37.5(eslint@9.39.2))(eslint@8.57.1): + eslint-config-standard-jsx@11.0.0(eslint-plugin-react@7.37.5(eslint@8.57.1))(eslint@8.57.1): dependencies: eslint: 8.57.1 eslint-plugin-react: 7.37.5(eslint@8.57.1) @@ -5495,12 +4938,6 @@ snapshots: etag@1.8.1: {} - events-universal@1.0.1: - dependencies: - bare-events: 2.8.2 - transitivePeerDependencies: - - bare-abort-controller - execa@5.1.1: dependencies: cross-spawn: 7.0.6 @@ -5557,22 +4994,10 @@ snapshots: transitivePeerDependencies: - supports-color - extract-zip@2.0.1: - dependencies: - debug: 4.4.3(supports-color@5.5.0) - get-stream: 5.2.0 - yauzl: 2.10.0 - optionalDependencies: - '@types/yauzl': 2.10.3 - transitivePeerDependencies: - - supports-color - fast-deep-equal@3.1.3: {} fast-diff@1.3.0: {} - fast-fifo@1.3.2: {} - fast-json-stable-stringify@2.1.0: {} fast-levenshtein@2.0.6: {} @@ -5587,10 +5012,6 @@ snapshots: dependencies: bser: 2.1.1 - fd-slicer@1.1.0: - dependencies: - pend: 1.2.0 - file-entry-cache@6.0.1: dependencies: flat-cache: 3.2.0 @@ -5599,10 +5020,6 @@ snapshots: dependencies: flat-cache: 4.0.1 - filelist@1.0.4: - dependencies: - minimatch: 5.1.6 - fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -5726,10 +5143,6 @@ snapshots: get-stdin@8.0.0: {} - get-stream@5.2.0: - dependencies: - pump: 3.0.3 - get-stream@6.0.1: {} get-symbol-description@1.1.0: @@ -5738,14 +5151,6 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 - get-uri@6.0.5: - dependencies: - basic-ftp: 5.1.0 - data-uri-to-buffer: 6.0.2 - debug: 4.4.3(supports-color@5.5.0) - transitivePeerDependencies: - - supports-color - glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -5817,13 +5222,6 @@ snapshots: html-escaper@2.0.2: {} - htmlparser2@7.2.0: - dependencies: - domelementtype: 2.3.0 - domhandler: 4.3.1 - domutils: 2.8.0 - entities: 3.0.1 - http-errors@2.0.1: dependencies: depd: 2.0.0 @@ -5832,20 +5230,6 @@ snapshots: statuses: 2.0.2 toidentifier: 1.0.1 - http-proxy-agent@7.0.2: - dependencies: - agent-base: 7.1.4 - debug: 4.4.3(supports-color@5.5.0) - transitivePeerDependencies: - - supports-color - - https-proxy-agent@7.0.6: - dependencies: - agent-base: 7.1.4 - debug: 4.4.3(supports-color@5.5.0) - transitivePeerDependencies: - - supports-color - human-signals@2.1.0: {} iconv-lite@0.7.2: @@ -5881,7 +5265,8 @@ snapshots: hasown: 2.0.2 side-channel: 1.1.0 - ip-address@10.1.0: {} + ip-address@10.1.0: + optional: true ipaddr.js@1.9.1: {} @@ -5953,8 +5338,6 @@ snapshots: dependencies: is-extglob: 2.1.1 - is-json@2.0.1: {} - is-map@2.0.3: {} is-negative-zero@2.0.3: {} @@ -6063,12 +5446,6 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jake@10.9.4: - dependencies: - async: 3.2.6 - filelist: 1.0.4 - picocolors: 1.1.1 - jest-changed-files@30.2.0: dependencies: execa: 5.1.1 @@ -6549,8 +5926,6 @@ snapshots: dependencies: yallist: 3.1.1 - lru-cache@7.18.3: {} - make-dir@4.0.0: dependencies: semver: 7.7.3 @@ -6596,10 +5971,6 @@ snapshots: dependencies: brace-expansion: 1.1.12 - minimatch@5.1.6: - dependencies: - brace-expansion: 2.0.2 - minimatch@9.0.5: dependencies: brace-expansion: 2.0.2 @@ -6608,8 +5979,6 @@ snapshots: minipass@7.1.2: {} - mitt@3.0.1: {} - mkdirp@1.0.4: {} mongodb-connection-string-url@3.0.2: @@ -6695,17 +6064,12 @@ snapshots: negotiator@1.0.0: {} - netmask@2.0.2: {} - node-cache@5.1.2: dependencies: clone: 2.1.2 node-int64@0.4.0: {} - node-readable-to-web-readable-stream@0.4.2: - optional: true - node-releases@2.0.27: {} nodemon@3.1.11: @@ -6822,24 +6186,6 @@ snapshots: p-try@2.2.0: {} - pac-proxy-agent@7.2.0: - dependencies: - '@tootallnate/quickjs-emscripten': 0.23.0 - agent-base: 7.1.4 - debug: 4.4.3(supports-color@5.5.0) - get-uri: 6.0.5 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 - pac-resolver: 7.0.1 - socks-proxy-agent: 8.0.5 - transitivePeerDependencies: - - supports-color - - pac-resolver@7.0.1: - dependencies: - degenerator: 5.0.1 - netmask: 2.0.2 - package-json-from-dist@1.0.1: {} parent-module@1.0.1: @@ -6877,17 +6223,6 @@ snapshots: path-to-regexp@8.3.0: {} - pdf-to-img@6.2.0: - dependencies: - pdfjs-dist: 5.6.205 - - pdfjs-dist@5.6.205: - optionalDependencies: - '@napi-rs/canvas': 0.1.100 - node-readable-to-web-readable-stream: 0.4.2 - - pend@1.2.0: {} - picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -6909,19 +6244,6 @@ snapshots: possible-typed-array-names@1.1.0: {} - posthtml-parser@0.11.0: - dependencies: - htmlparser2: 7.2.0 - - posthtml-render@3.0.0: - dependencies: - is-json: 2.0.1 - - posthtml@0.16.7: - dependencies: - posthtml-parser: 0.11.0 - posthtml-render: 3.0.0 - prelude-ls@1.2.1: {} prettier-linter-helpers@1.0.1: @@ -6938,8 +6260,6 @@ snapshots: process-nextick-args@1.0.7: {} - progress@2.0.3: {} - prop-types@15.8.1: dependencies: loose-envify: 1.4.0 @@ -6951,64 +6271,12 @@ snapshots: forwarded: 0.2.0 ipaddr.js: 1.9.1 - proxy-agent@6.5.0: - dependencies: - agent-base: 7.1.4 - debug: 4.4.3(supports-color@5.5.0) - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 - lru-cache: 7.18.3 - pac-proxy-agent: 7.2.0 - proxy-from-env: 1.1.0 - socks-proxy-agent: 8.0.5 - transitivePeerDependencies: - - supports-color - proxy-from-env@1.1.0: {} pstree.remy@1.1.8: {} - pump@3.0.3: - dependencies: - end-of-stream: 1.4.5 - once: 1.4.0 - punycode@2.3.1: {} - puppeteer-core@24.36.1: - dependencies: - '@puppeteer/browsers': 2.11.2 - chromium-bidi: 13.0.1(devtools-protocol@0.0.1551306) - debug: 4.4.3(supports-color@5.5.0) - devtools-protocol: 0.0.1551306 - typed-query-selector: 2.12.0 - webdriver-bidi-protocol: 0.4.0 - ws: 8.19.0 - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - - bufferutil - - react-native-b4a - - supports-color - - utf-8-validate - - puppeteer@24.36.1: - dependencies: - '@puppeteer/browsers': 2.11.2 - chromium-bidi: 13.0.1(devtools-protocol@0.0.1551306) - cosmiconfig: 9.0.0 - devtools-protocol: 0.0.1551306 - puppeteer-core: 24.36.1 - typed-query-selector: 2.12.0 - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - - bufferutil - - react-native-b4a - - supports-color - - typescript - - utf-8-validate - pure-rand@7.0.1: {} qs@6.14.1: @@ -7282,7 +6550,8 @@ snapshots: slash@3.0.0: {} - smart-buffer@4.2.0: {} + smart-buffer@4.2.0: + optional: true socket.io-adapter-mongo@2.0.5: dependencies: @@ -7332,18 +6601,11 @@ snapshots: jsonwebtoken: 8.5.1 xtend: 2.1.2 - socks-proxy-agent@8.0.5: - dependencies: - agent-base: 7.1.4 - debug: 4.4.3(supports-color@5.5.0) - socks: 2.8.7 - transitivePeerDependencies: - - supports-color - socks@2.8.7: dependencies: ip-address: 10.1.0 smart-buffer: 4.2.0 + optional: true source-map-support@0.5.13: dependencies: @@ -7373,7 +6635,7 @@ snapshots: dependencies: eslint: 8.57.1 eslint-config-standard: 17.1.0(eslint-plugin-import@2.32.0(eslint@9.39.2))(eslint-plugin-n@15.7.0(eslint@9.39.2))(eslint-plugin-promise@6.6.0(eslint@9.39.2))(eslint@8.57.1) - eslint-config-standard-jsx: 11.0.0(eslint-plugin-react@7.37.5(eslint@9.39.2))(eslint@8.57.1) + eslint-config-standard-jsx: 11.0.0(eslint-plugin-react@7.37.5(eslint@8.57.1))(eslint@8.57.1) eslint-plugin-import: 2.32.0(eslint@8.57.1) eslint-plugin-n: 15.7.0(eslint@8.57.1) eslint-plugin-promise: 6.6.0(eslint@8.57.1) @@ -7401,15 +6663,6 @@ snapshots: transitivePeerDependencies: - supports-color - streamx@2.23.0: - dependencies: - events-universal: 1.0.1 - fast-fifo: 1.3.2 - text-decoder: 1.2.3 - transitivePeerDependencies: - - bare-abort-controller - - react-native-b4a - string-length@4.0.2: dependencies: char-regex: 1.0.2 @@ -7531,39 +6784,12 @@ snapshots: dependencies: '@pkgr/core': 0.2.9 - tar-fs@3.1.1: - dependencies: - pump: 3.0.3 - tar-stream: 3.1.7 - optionalDependencies: - bare-fs: 4.5.3 - bare-path: 3.0.0 - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - - react-native-b4a - - tar-stream@3.1.7: - dependencies: - b4a: 1.7.3 - fast-fifo: 1.3.2 - streamx: 2.23.0 - transitivePeerDependencies: - - bare-abort-controller - - react-native-b4a - test-exclude@6.0.0: dependencies: '@istanbuljs/schema': 0.1.3 glob: 7.2.3 minimatch: 3.1.2 - text-decoder@1.2.3: - dependencies: - b4a: 1.7.3 - transitivePeerDependencies: - - react-native-b4a - text-table@0.2.0: {} tmpl@1.0.5: {} @@ -7589,7 +6815,8 @@ snapshots: minimist: 1.2.8 strip-bom: 3.0.0 - tslib@2.8.1: {} + tslib@2.8.1: + optional: true tweetnacl@1.0.3: {} @@ -7644,8 +6871,6 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typed-query-selector@2.12.0: {} - uid2@0.0.3: {} unbox-primitive@1.1.0: @@ -7715,8 +6940,6 @@ snapshots: dependencies: makeerror: 1.0.12 - webdriver-bidi-protocol@0.4.0: {} - webidl-conversions@7.0.0: {} whatwg-url@14.2.0: @@ -7792,8 +7015,6 @@ snapshots: ws@8.18.3: {} - ws@8.19.0: {} - xdg-basedir@4.0.0: {} xml@1.0.1: {} @@ -7818,11 +7039,4 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 - yauzl@2.10.0: - dependencies: - buffer-crc32: 0.2.13 - fd-slicer: 1.1.0 - yocto-queue@0.1.0: {} - - zod@3.25.76: {} diff --git a/src/socket/__tests__/sockethost.test.js b/src/socket/__tests__/sockethost.test.js index a03f3ea..d364b48 100644 --- a/src/socket/__tests__/sockethost.test.js +++ b/src/socket/__tests__/sockethost.test.js @@ -52,12 +52,6 @@ jest.unstable_mockModule('../../events/eventmanager.js', () => ({ })) })); -jest.unstable_mockModule('../../templates/templatemanager.js', () => ({ - TemplateManager: jest.fn().mockImplementation(() => ({ - renderPDF: jest.fn() - })) -})); - jest.unstable_mockModule('../../utils.js', () => ({ getModelByName: jest.fn(name => ({ modelName: name })) })); diff --git a/src/socket/__tests__/socketmanager.test.js b/src/socket/__tests__/socketmanager.test.js index ae66142..e805ca1 100644 --- a/src/socket/__tests__/socketmanager.test.js +++ b/src/socket/__tests__/socketmanager.test.js @@ -44,10 +44,6 @@ jest.unstable_mockModule('../../activity/activitymanager.js', () => ({ ActivityManager: jest.fn() })); -jest.unstable_mockModule('../../templates/templatemanager.js', () => ({ - TemplateManager: jest.fn(), -})); - jest.unstable_mockModule('../../config.js', () => ({ loadConfig: jest.fn(() => ({ server: { diff --git a/src/socket/__tests__/socketuser.test.js b/src/socket/__tests__/socketuser.test.js index 4592c45..a8c8e60 100644 --- a/src/socket/__tests__/socketuser.test.js +++ b/src/socket/__tests__/socketuser.test.js @@ -116,12 +116,7 @@ describe('SocketUser', () => { on: jest.fn(), emit: jest.fn() }; - mockSocketManager = { - templateManager: { - renderTemplate: jest.fn(), - renderPDF: jest.fn() - } - }; + mockSocketManager = {}; socketUser = new SocketUser(mockSocket, mockSocketManager); }); diff --git a/src/socket/sockethost.js b/src/socket/sockethost.js index b972742..4138983 100644 --- a/src/socket/sockethost.js +++ b/src/socket/sockethost.js @@ -13,7 +13,6 @@ import { UpdateManager } from '../updates/updatemanager.js'; import { ActionManager } from '../actions/actionmanager.js'; import { getModelByName } from '../utils.js'; import { EventManager } from '../events/eventmanager.js'; -import { TemplateManager } from '../templates/templatemanager.js'; const config = loadConfig(); @@ -31,7 +30,6 @@ export class SocketHost { this.updateManager = new UpdateManager(this); this.actionManager = new ActionManager(this); this.eventManager = new EventManager(this); - this.templateManager = new TemplateManager(this); this.codeAuth = new CodeAuth(); this.setupSocketEventHandlers(); } @@ -64,14 +62,6 @@ export class SocketHost { 'unsubscribeObjectEvent', this.handleUnsubscribeObjectEventEvent.bind(this) ); - this.socket.on( - 'renderTemplatePDF', - this.handleRenderTemplatePDFEvent.bind(this) - ); - this.socket.on( - 'renderTemplateJPG', - this.handleRenderTemplateJPGEvent.bind(this) - ); this.socket.on('objectEvent', this.handleObjectEventEvent.bind(this)); this.socket.on('disconnect', this.handleDisconnect.bind(this)); } @@ -256,26 +246,6 @@ export class SocketHost { ); } - async handleRenderTemplatePDFEvent(data, callback) { - const result = await this.templateManager.renderPDF( - data._id, - data.content, - data.object, - 1 - ); - callback(result); - } - - async handleRenderTemplateJPGEvent(data, callback) { - const result = await this.templateManager.renderJPG( - data._id, - data.content, - data.object, - { width: data.width } - ); - callback(result); - } - async setDevicesState(state, online, connectedAt) { logger.info('Setting devices state to', state, 'and online to', online); diff --git a/src/socket/socketmanager.js b/src/socket/socketmanager.js index 5639730..608d072 100644 --- a/src/socket/socketmanager.js +++ b/src/socket/socketmanager.js @@ -5,7 +5,6 @@ import log4js from 'log4js'; import { loadConfig } from '../config.js'; import { SocketUser } from './socketuser.js'; import { UpdateManager } from '../updates/updatemanager.js'; -import { TemplateManager } from '../templates/templatemanager.js'; import { SocketHost } from './sockethost.js'; const config = loadConfig(); @@ -17,7 +16,6 @@ export class SocketManager { constructor(server) { this.socketUsers = new Map(); this.socketHosts = new Map(); - this.templateManager = new TemplateManager(this); // Use the provided HTTP server // Create Socket.IO server - CORS applies to HTTP long-polling transport diff --git a/src/socket/socketuser.js b/src/socket/socketuser.js index 8fe3f04..840c35c 100644 --- a/src/socket/socketuser.js +++ b/src/socket/socketuser.js @@ -34,7 +34,6 @@ export class SocketUser { this.notificationManager = new NotificationManager(this); this.serverManager = new ServerManager(this); this.userSettingsManager = new UserSettingsManager(this); - this.templateManager = socketManager.templateManager; this.keycloakAuth = new KeycloakAuth(); this.setupSocketEventHandlers(); } @@ -85,18 +84,6 @@ export class SocketUser { 'unsubscribeModelStats', this.handleUnsubscribeToStatsEvent.bind(this) ); - this.socket.on( - 'previewTemplate', - this.handlePreviewTemplateEvent.bind(this) - ); - this.socket.on( - 'renderTemplatePDF', - this.handleRenderTemplatePDFEvent.bind(this) - ); - this.socket.on( - 'renderTemplateJPG', - this.handleRenderTemplateJPGEvent.bind(this) - ); this.socket.on( 'generateHostOtp', this.handleGenerateHostOtpEvent.bind(this) @@ -309,63 +296,6 @@ export class SocketUser { await this.statsManager.removeStatsListener(data.objectType); } - async handlePreviewTemplateEvent(data, callback) { - try { - const result = await this.templateManager.renderTemplate( - data._id, - data.content, - data.testObject, - data.scale - ); - if (typeof callback === 'function') { - callback(result); - } - } catch (err) { - logger.error('Preview template event error:', err); - if (typeof callback === 'function') { - callback({ error: err.message }); - } - } - } - - async handleRenderTemplatePDFEvent(data, callback) { - try { - const result = await this.templateManager.renderPDF( - data._id, - data.content, - data.object, - 1 - ); - if (typeof callback === 'function') { - callback(result); - } - } catch (err) { - logger.error('Render template PDF event error:', err); - if (typeof callback === 'function') { - callback({ error: err.message }); - } - } - } - - async handleRenderTemplateJPGEvent(data, callback) { - try { - const result = await this.templateManager.renderJPG( - data._id, - data.content, - data.object, - { width: data.width } - ); - if (typeof callback === 'function') { - callback(result); - } - } catch (err) { - logger.error('Render template JPG event error:', err); - if (typeof callback === 'function') { - callback({ error: err.message }); - } - } - } - async handleGenerateHostOtpEvent(data, callback) { const result = await generateHostOTP(data._id); callback(result); diff --git a/src/templates/__tests__/templatemanager.test.js b/src/templates/__tests__/templatemanager.test.js deleted file mode 100644 index e027ef9..0000000 --- a/src/templates/__tests__/templatemanager.test.js +++ /dev/null @@ -1,184 +0,0 @@ -import { jest } from '@jest/globals'; -import path from 'path'; - -// Mock fs before importing TemplateManager -jest.unstable_mockModule('fs', () => ({ - default: { - readFileSync: jest.fn(filePath => { - if (filePath.endsWith('basetemplate.ejs')) - return '<%- content %>'; - if (filePath.endsWith('styles.css')) return 'body { color: red; }'; - if (filePath.endsWith('previewtemplate.ejs')) - return '
<%- content %>
'; - if (filePath.endsWith('rendertemplate.ejs')) - return '
<%- content %>
'; - if (filePath.endsWith('contentplaceholder.ejs')) - return '
'; - if (filePath.endsWith('previewpagination.js')) - return 'console.log("pagination");'; - return ''; - }) - } -})); - -jest.unstable_mockModule('ejs', () => ({ - default: { - render: jest.fn(async (content, data) => `rendered: ${content}`), - compile: jest.fn(() => jest.fn()) - } -})); - -jest.unstable_mockModule('posthtml', () => ({ - default: jest.fn(() => ({ - process: jest.fn(async content => ({ html: `transformed: ${content}` })) - })) -})); - -jest.unstable_mockModule('../../database/nats.js', () => ({ - natsServer: { - publish: jest.fn().mockResolvedValue({ success: true }), - subscribe: jest.fn().mockResolvedValue({ success: true }), - removeSubscription: jest.fn().mockResolvedValue({ success: true }) - } -})); - -jest.unstable_mockModule('../../database/redis.js', () => ({ - redisServer: { - setKey: jest.fn().mockResolvedValue(undefined), - getKey: jest.fn().mockResolvedValue(null), - deleteKey: jest.fn().mockResolvedValue(undefined), - getKeysByPattern: jest.fn().mockResolvedValue([]) - } -})); - -jest.unstable_mockModule('../../database/database.js', () => ({ - getObject: jest.fn(), - listObjects: jest.fn() -})); - -jest.unstable_mockModule( - '../../database/schemas/management/documenttemplate.schema.js', - () => ({ - documentTemplateModel: { modelName: 'DocumentTemplate' } - }) -); - -jest.unstable_mockModule('../../utils.js', () => ({ - getModelByName: jest.fn(() => ({ - schema: { - obj: { name: {}, status: {} } - } - })) -})); - -jest.unstable_mockModule('../pdffactory.js', () => ({ - generatePDF: jest.fn().mockResolvedValue(Buffer.from('pdf-data')) -})); - -jest.unstable_mockModule('log4js', () => ({ - default: { - getLogger: () => ({ - level: 'info', - debug: jest.fn(), - error: jest.fn(), - warn: jest.fn(), - trace: jest.fn(), - info: jest.fn() - }) - } -})); - -jest.unstable_mockModule('../../config.js', () => ({ - loadConfig: jest.fn(() => ({ - server: { - logLevel: 'info' - } - })) -})); - -const { TemplateManager } = await import('../templatemanager.js'); -const { getObject } = await import('../../database/database.js'); -const ejs = (await import('ejs')).default; -const { generatePDF } = await import('../pdffactory.js'); - -describe('TemplateManager', () => { - let templateManager; - - beforeEach(() => { - jest.clearAllMocks(); - templateManager = new TemplateManager(); - }); - - describe('renderTemplate', () => { - it('should render a template successfully', async () => { - const mockTemplate = { - documentSize: { width: 100, height: 100, infiniteHeight: false }, - global: false, - objectType: 'printer' - }; - - getObject.mockResolvedValue(mockTemplate); - - const result = await templateManager.renderTemplate( - 'temp-id', - 'some content', - { name: 'Test' } - ); - - expect(getObject).toHaveBeenCalledWith( - expect.objectContaining({ id: 'temp-id' }) - ); - expect(ejs.render).toHaveBeenCalled(); - expect(result).toHaveProperty('html'); - expect(result.width).toBe(100); - expect(result.height).toBe(100); - }); - - it('should return error if template not found', async () => { - getObject.mockResolvedValue(null); - - const result = await templateManager.renderTemplate('invalid', 'content'); - - expect(result).toEqual({ error: 'Document template not found.' }); - }); - }); - - describe('validateTemplate', () => { - it('should return true for valid EJS', () => { - expect(templateManager.validateTemplate('
<%= name %>
')).toBe( - true - ); - }); - - it('should return false for invalid EJS', () => { - ejs.compile.mockImplementationOnce(() => { - throw new Error('syntax error'); - }); - expect(templateManager.validateTemplate('<% invalid %>')).toBe(false); - }); - }); - - describe('renderPDF', () => { - it('should render a PDF successfully', async () => { - const mockTemplate = { - documentSize: { width: 100, height: 100, infiniteHeight: false }, - global: false, - objectType: 'printer' - }; - getObject.mockResolvedValue(mockTemplate); - - const result = await templateManager.renderPDF('temp-id', 'content'); - - expect(generatePDF).toHaveBeenCalled(); - expect(result.pdf).toBeDefined(); - }); - }); - - describe('formatDate', () => { - it('should format date correctly', () => { - const date = new Date('2023-01-01T12:00:00Z'); - const formatted = templateManager.formatDate(date, 'YYYY-MM-DD'); - expect(formatted).toBe('2023-01-01'); - }); - }); -}); diff --git a/src/templates/assets/basetemplate.ejs b/src/templates/assets/basetemplate.ejs deleted file mode 100644 index b236782..0000000 --- a/src/templates/assets/basetemplate.ejs +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - Document - - - - - - - - <%- content %> - - - <% if (typeof previewPaginationScript !== 'undefined' && previewPaginationScript) { %> - - <% } %> - - diff --git a/src/templates/assets/contentplaceholder.ejs b/src/templates/assets/contentplaceholder.ejs deleted file mode 100644 index 6f65d2e..0000000 --- a/src/templates/assets/contentplaceholder.ejs +++ /dev/null @@ -1,3 +0,0 @@ -
-

Content

-
diff --git a/src/templates/assets/previewpagination.js b/src/templates/assets/previewpagination.js deleted file mode 100644 index e69de29..0000000 diff --git a/src/templates/assets/previewtemplate.ejs b/src/templates/assets/previewtemplate.ejs deleted file mode 100644 index 25e4d7b..0000000 --- a/src/templates/assets/previewtemplate.ejs +++ /dev/null @@ -1,5 +0,0 @@ -
-
-
<%- content %>
-
-
diff --git a/src/templates/assets/rendertemplate.ejs b/src/templates/assets/rendertemplate.ejs deleted file mode 100644 index 9415dae..0000000 --- a/src/templates/assets/rendertemplate.ejs +++ /dev/null @@ -1 +0,0 @@ -
<%- content %>
diff --git a/src/templates/assets/styles.css b/src/templates/assets/styles.css deleted file mode 100644 index a25c38d..0000000 --- a/src/templates/assets/styles.css +++ /dev/null @@ -1,131 +0,0 @@ -body { - margin: 0; - font-family: 'Figtree', sans-serif; - font-optical-sizing: auto; - font-weight: 400; - font-style: normal; - overflow: scroll; -} - -.previewContainer { - display: flex; - justify-content: center; /* Horizontal center */ - align-items: center; /* Vertical center */ - padding: 60px; - box-sizing: border-box; - width: fit-content; -} -.previewWrapper { - position: relative; -} -.previewDocument { - background: #ffffff; - border: 1px solid #000; - box-shadow: 0 0 5px rgba(0, 0, 0, 0.2); - transform-origin: top left; - position: relative; - overflow: hidden; -} - -.documentText { - margin: 0; - font-size: 12px; - line-height: 1; -} -.documentTitle { - margin: 0; -} - -h1.documentTitle { - font-weight: 800; - font-size: 34px; -} - -h2.documentTitle { - font-weight: 800; -} - -h3.documentTitle { - font-weight: 700; -} -h4.documentTitle { - font-weight: 700; -} -.documentFlex { - display: flex; -} -.documentDivider { - background: black; - height: 1px; - margin: 4px 0; - border: none; -} - -.contentPlaceholder { - border: 1px solid black; - max-height: 250px; - height: 100%; - width: 100%; - display: flex; - align-items: center; - justify-content: center; - background: repeating-linear-gradient( - 45deg, - /* Angle of the stripes */ #ccc, - /* Light grey */ #ccc 10px, - /* End of first stripe */ #eee 10px, - /* Start of next stripe (slightly lighter grey) */ #eee 20px - /* End of second stripe */ - ); -} - -.contentPlaceholder > p { - text-transform: uppercase; - font-weight: 700; -} - -.documentBarcode { - width: auto !important; - height: 100% !important; -} - -.documentProgressBar { - height: 8px; - width: 260px; - border-radius: 8px; - border: 1px solid #000000; - overflow: hidden; -} - -.documentProgressBarInner { - height: 100%; - background: #000; -} - -.documentTable { - width: 100%; - border-collapse: collapse; - border: 1px solid #000000; -} - -.documentTableRow { - border: 1px solid #000000; -} - -.documentTableRow td, -.documentTableRowHeader th, -.documentTableRowFooter td { - padding: 4px; - border: 1px solid #000000; -} - -.documentTableRowHeader { - background: #0000002e; - text-align: left; - border: 1px solid #000000; -} - -.documentTableRowFooter { - background: #0000002e; - border: 1px solid #000000; -} diff --git a/src/templates/pdfUtils.js b/src/templates/pdfUtils.js deleted file mode 100644 index b0318a4..0000000 --- a/src/templates/pdfUtils.js +++ /dev/null @@ -1,78 +0,0 @@ -/** - * PDF conversion utilities loaded on demand so startup - * does not require ESM-only pdf-to-img at module load time. - */ -import { pathToFileURL } from 'node:url'; -import { createRequire } from 'node:module'; - -const require = createRequire(import.meta.url); - -async function importPackage(name) { - const packagePath = require.resolve(name); - return import(pathToFileURL(packagePath).href); -} - -function resolveDefault(module) { - return module?.default ?? module; -} - -export async function convertPDFToImage(pdfInput, options = {}) { - const [pdfToImgModule, sharpModule] = await Promise.all([ - importPackage('pdf-to-img'), - importPackage('sharp') - ]); - const { pdf } = pdfToImgModule; - const sharp = resolveDefault(sharpModule); - - try { - const { width, height, page_numbers, scale = 2, ...pdfOnlyOptions } = - options; - - const pdfOptions = { - scale, - ...pdfOnlyOptions - }; - - const document = await pdf(pdfInput, pdfOptions); - const outputImages = []; - - if ( - page_numbers && - Array.isArray(page_numbers) && - page_numbers.length > 0 - ) { - for (const pageNum of page_numbers) { - let image = await document.getPage(pageNum); - - if (width || height) { - const resizeOptions = {}; - if (width) resizeOptions.width = width; - if (height) resizeOptions.height = height; - image = await sharp(image).resize(resizeOptions).toBuffer(); - } - - outputImages.push(image); - } - } else { - for await (const image of document) { - let processedImage = image; - - if (width || height) { - const resizeOptions = {}; - if (width) resizeOptions.width = width; - if (height) resizeOptions.height = height; - processedImage = await sharp(image) - .resize(resizeOptions) - .toBuffer(); - } - - outputImages.push(processedImage); - } - } - - return outputImages; - } catch (error) { - console.error('Error converting PDF to image:', error); - throw error; - } -} diff --git a/src/templates/pdffactory.js b/src/templates/pdffactory.js deleted file mode 100644 index a026719..0000000 --- a/src/templates/pdffactory.js +++ /dev/null @@ -1,63 +0,0 @@ -import log4js from 'log4js'; -import { loadConfig } from '../config.js'; - -const config = loadConfig(); -const logger = log4js.getLogger('PDF Factory'); -logger.level = config.server.logLevel; - -/** - * Generates a PDF from HTML content using Puppeteer - * @param {string} html - The HTML content to convert to PDF - * @param {Object} options - PDF generation options - * @param {number} options.width - Document width in mm - * @param {number} options.height - Document height in mm - * @returns {Promise} The PDF buffer - */ -export async function generatePDF(html, options = {}) { - try { - // Dynamically import puppeteer to handle cases where it might not be installed - const puppeteer = await import('puppeteer'); - - const browser = await puppeteer.default.launch({ - headless: true, - args: ['--no-sandbox', '--disable-setuid-sandbox'] - }); - - const page = await browser.newPage(); - - // Set content with HTML - await page.setContent(html, { - waitUntil: 'networkidle0' - }); - - var height = `${options?.height || '50'}mm`; - - if (options.height == 'auto') { - const calculatedHeight = await page.evaluate(() => { - return document.getElementById('content').scrollHeight; - }); - - height = `${calculatedHeight}px`; - } - // Generate PDF with specified dimensions - const pdfBuffer = await page.pdf({ - printBackground: true, - preferCSSPageSize: true, - width: options.width ? `${options.width}mm` : undefined, - height: height ? `${height}` : undefined, - margin: { - top: '0mm', - right: '0mm', - bottom: '0mm', - left: '0mm' - } - }); - - await browser.close(); - - return pdfBuffer; - } catch (error) { - logger.error('Error generating PDF:', error.message); - throw error; - } -} diff --git a/src/templates/templatemanager.js b/src/templates/templatemanager.js deleted file mode 100644 index 2a0a6d7..0000000 --- a/src/templates/templatemanager.js +++ /dev/null @@ -1,657 +0,0 @@ -import ejs from 'ejs'; -import log4js from 'log4js'; -import posthtml from 'posthtml'; - -import { documentTemplateModel } from '../database/schemas/management/documenttemplate.schema.js'; -import '../database/schemas/management/documentsize.schema.js'; -// Load configuration -import { loadConfig } from '../config.js'; -import fs from 'fs'; -import dayjs from 'dayjs'; -import utc from 'dayjs/plugin/utc.js'; -import timezone from 'dayjs/plugin/timezone.js'; -import { fileURLToPath } from 'url'; -import { dirname, join } from 'path'; -import { getObject, listObjects } from '../database/database.js'; -import { getModelByName } from '../utils.js'; -import { generatePDF } from './pdffactory.js'; -import { convertPDFToImage } from './pdfUtils.js'; -const __filename = fileURLToPath(import.meta.url); -const __dirname = dirname(__filename); - -// Extend plugins -dayjs.extend(utc); -dayjs.extend(timezone); - -const config = loadConfig(); - -const logger = log4js.getLogger('Template Manager'); -logger.level = config.server.logLevel; - -let baseTemplate; -let baseCSS; -let previewTemplate; -let renderTemplateEjs; -let contentPlaceholder; -let previewPaginationScript; - -async function loadTemplates() { - // Synchronously load files - baseTemplate = fs.readFileSync( - join(__dirname, '/assets/basetemplate.ejs'), - 'utf8' - ); - baseCSS = fs.readFileSync(join(__dirname, '/assets/styles.css'), 'utf8'); - previewTemplate = fs.readFileSync( - join(__dirname, '/assets/previewtemplate.ejs'), - 'utf8' - ); - renderTemplateEjs = fs.readFileSync( - join(__dirname, '/assets/rendertemplate.ejs'), - 'utf8' - ); - contentPlaceholder = fs.readFileSync( - join(__dirname, '/assets/contentplaceholder.ejs'), - 'utf8' - ); - previewPaginationScript = fs.readFileSync( - join(__dirname, '/assets/previewpagination.js'), - 'utf8' - ); -} - -loadTemplates(); - -function getNodeStyles(attributes) { - var styles = ''; - if (attributes?.padding) { - styles += `padding: ${attributes.padding};`; - } - if (attributes?.width) { - styles += `width: ${attributes.width};`; - } - if (attributes?.height) { - styles += `height: ${attributes.height};`; - } - if (attributes?.maxWidth) { - styles += `max-width: ${attributes.maxWidth};`; - } - if (attributes?.maxHeight) { - styles += `max-height: ${attributes.maxHeight};`; - } - if (attributes?.gap && attributes?.vertical != 'true') { - styles += `column-gap: ${attributes.gap};`; - } - if (attributes?.gap && attributes?.vertical == 'true') { - styles += `row-gap: ${attributes.gap};`; - } - if (attributes?.justify) { - styles += `justify-content: ${attributes.justify};`; - } - if (attributes?.align) { - styles += `align-items: ${attributes.align};`; - } - if (attributes?.border) { - styles += `border: ${attributes.border};`; - } - if (attributes?.borderRadius) { - styles += `border-radius: ${attributes.borderRadius};`; - } - if (attributes?.vertical == 'true') { - styles += `flex-direction: column;`; - } - if (attributes?.grow) { - styles += `flex-grow: ${attributes.grow};`; - } - if (attributes?.shrink) { - styles += `flex-shrink: ${attributes.shrink};`; - } - if (attributes?.color) { - styles += `color: ${attributes.color};`; - } - if (attributes?.background) { - styles += `background: ${attributes.background};`; - } - if (attributes?.scale) { - styles += `transform: scale(${attributes.scale});`; - } - if (attributes?.textAlign) { - styles += `text-align: ${attributes.textAlign};`; - } - if (attributes?.textSize) { - styles += `font-size: ${attributes.textSize};`; - } - if (attributes?.wordWrap) { - styles += `word-wrap: ${attributes.wordWrap};`; - } - return styles; -} - -async function transformCustomElements(content) { - const result = await posthtml([ - tree => - tree.match({ tag: 'Title1' }, node => ({ - ...node, - tag: 'h1', - attrs: { class: 'documentTitle' } - })), - tree => - tree.match({ tag: 'Title2' }, node => ({ - ...node, - tag: 'h2', - attrs: { class: 'documentTitle' } - })), - tree => - tree.match({ tag: 'Title3' }, node => ({ - ...node, - tag: 'h3', - attrs: { class: 'documentText' } - })), - tree => - tree.match({ tag: 'Title4' }, node => ({ - ...node, - tag: 'h4', - attrs: { class: 'documentText' } - })), - tree => - tree.match({ tag: 'Text' }, node => ({ - ...node, - tag: 'p', - attrs: { class: 'documentText', style: getNodeStyles(node.attrs) } - })), - tree => - tree.match({ tag: 'Bold' }, node => ({ - ...node, - tag: 'strong', - attrs: { - style: 'font-weight: bold;', - class: 'documentBoldText', - style: getNodeStyles(node.attrs) - } - })), - tree => - tree.match({ tag: 'Barcode' }, node => { - return { - tag: 'div', - content: [ - { - tag: 'svg', - attrs: { - class: 'documentBarcode', - 'jsbarcode-displayValue': 'false', - 'jsbarcode-value': node.content.at(0) || '', - 'jsbarcode-format': node.attrs.format || 'code128', - 'jsbarcode-width': node.attrs.barcodeWidth || 2, - 'jsbarcode-margin': 0 - } - } - ], - attrs: { - class: 'documentBarcodeContainer', - style: getNodeStyles(node.attrs) - } - }; - }), - tree => - tree.match({ tag: 'Container' }, node => ({ - ...node, - tag: 'div', - attrs: { - class: 'documentContainer', - style: getNodeStyles(node.attrs) - } - })), - tree => - tree.match({ tag: 'Flex' }, node => { - return { - ...node, - tag: 'div', - attrs: { - class: 'documentFlex', - style: getNodeStyles(node.attrs) - } - }; - }), - tree => - tree.match({ tag: 'Divider' }, node => { - return { - ...node, - tag: 'hr', - attrs: { - class: 'documentDivider', - style: getNodeStyles(node.attrs) - } - }; - }), - tree => - tree.match({ tag: 'ProgressBar' }, node => { - return { - ...node, - tag: 'div', - attrs: { - class: 'documentProgressBar', - style: getNodeStyles(node.attrs) - }, - content: [ - { - tag: 'div', - attrs: { - class: 'documentProgressBarInner', - style: `width: ${Math.round((node.content[0] || 0) * 100)}%` - } - } - ] - }; - }), - - tree => - tree.match({ tag: 'DateTime' }, node => { - const dateTime = dayjs.utc(node.content[0]); - return { - content: [dateTime.format('YYYY-MM-DD hh:mm:ss')], - tag: 'span', - attrs: { - class: 'documentDateTime', - style: getNodeStyles(node.attrs) - } - }; - }), - tree => - tree.match({ tag: 'Table' }, node => { - return { - ...node, - tag: 'table', - attrs: { - class: 'documentTable', - style: getNodeStyles(node.attrs) - } - }; - }), - tree => - tree.match({ tag: 'Row' }, node => { - const rowType = node.attrs?.type?.toLowerCase() || ''; - - // Transform Col children based on the row type (header/footer/body) - const transformCols = content => { - if (!Array.isArray(content)) return content; - return content.map(child => { - if (typeof child === 'string' || child == null) { - return child; - } - if (child.tag !== 'Col') { - return child; - } - - const baseAttrs = { - ...child.attrs, - style: getNodeStyles(child.attrs) - }; - - if (rowType === 'header') { - // Header row columns become table headers - return { - ...child, - tag: 'th', - attrs: baseAttrs - }; - } - - // Footer and body rows both use ; footer is distinguished by the row class - return { - ...child, - tag: 'td', - attrs: baseAttrs - }; - }); - }; - - const content = transformCols(node.content); - - if (rowType === 'header') { - return { - ...node, - tag: 'tr', - content, - attrs: { - class: 'documentTableRowHeader', - style: getNodeStyles(node.attrs) - } - }; - } - - if (rowType === 'footer') { - return { - ...node, - tag: 'tr', - content, - attrs: { - class: 'documentTableRowFooter', - style: getNodeStyles(node.attrs) - } - }; - } - - return { - ...node, - tag: 'tr', - content, - attrs: { - class: 'documentTableRow', - style: getNodeStyles(node.attrs) - } - }; - }) - ]).process(content); - - return result.html; -} - -export class TemplateManager { - constructor() { - this.fc = { - listObjects: this.listObjects.bind(this), - getObject: this.getObject.bind(this), - formatDate: this.formatDate.bind(this) - }; - } - /** - * Previews an EJS template by rendering it with provided data - * @param {string} templateString - The EJS template as a string - * @param {Object} data - Data object to pass to the template - * @param {Object} options - EJS rendering options - * @returns {Promise} The rendered HTML string - */ - async renderTemplate( - id, - content, - data = {}, - scale = 1, - options = {}, - preview = true - ) { - try { - // Set default options for EJS rendering - const defaultOptions = { - async: true, - ...options - }; - logger.debug('Rendering template:', id); - - const documentTemplate = await getObject({ - model: documentTemplateModel, - id, - populate: [ - { path: 'documentSize' }, - { path: 'parent', strictPopulate: false } - ], - cached: true - }); - - if (documentTemplate == null) { - return { error: 'Document template not found.' }; - } - - const documentSize = documentTemplate.documentSize; - if (documentSize == null) { - return { error: 'Document template size not found.' }; - } - - // Validate content parameter - if (content == null || typeof content !== 'string') { - return { error: 'Template content is required and must be a string.' }; - } - - // Make sure data has default undefefined values and then merge with data - var templateData = {}; - if (documentTemplate.global == true) { - templateData = { content: contentPlaceholder, fc: this.fc }; - } else { - const objectType = documentTemplate?.objectType; - const model = getModelByName(objectType); - if (model == null) { - return { error: `Unknown object type: ${objectType}` }; - } - const defaultKeys = Object.keys(model.schema.obj); - const defaultValues = {}; - for (const key of defaultKeys) { - defaultValues[key] = null; - } - templateData = { ...defaultValues, ...data, fc: this.fc }; - } - - // Render the template - const templateContent = await ejs.render( - content, - templateData, - defaultOptions - ); - - var templateWithParentContent; - - var parentTemplate = documentTemplate.parent; - - if (documentTemplate.parent != undefined) { - if (typeof parentTemplate === 'string') { - parentTemplate = await getObject({ - model: documentTemplateModel, - id: parentTemplate, - populate: [ - { path: 'documentSize' }, - { path: 'parent', strictPopulate: false } - ], - cached: true - }); - } - // Validate parent content - if ( - parentTemplate.content == null || - typeof parentTemplate.content !== 'string' - ) { - logger.error( - 'Parent template content is required and must be a string.', - parentTemplate.content - ); - return { - error: - 'Parent template content is required and must be a string.' + - parentTemplate.content - }; - } - templateWithParentContent = await ejs.render( - parentTemplate.content, - { content: templateContent, fc: this.fc }, - defaultOptions - ); - } else { - templateWithParentContent = templateContent; - } - - // Validate rendered content before transformation - if ( - templateWithParentContent == null || - typeof templateWithParentContent !== 'string' - ) { - return { error: 'Failed to render template content.' }; - } - - const templateHtml = await transformCustomElements( - templateWithParentContent - ); - - // Validate transformed HTML - if (templateHtml == null || typeof templateHtml !== 'string') { - return { error: 'Failed to transform template content.' }; - } - - var innerHtml = null; - - if (preview == true) { - innerHtml = await ejs.render( - previewTemplate, - { content: templateHtml }, - defaultOptions - ); - } else { - innerHtml = await ejs.render( - renderTemplateEjs, - { content: templateHtml }, - defaultOptions - ); - } - - // Validate inner HTML - if (innerHtml == null || typeof innerHtml !== 'string') { - return { error: 'Failed to render inner template content.' }; - } - - const infiniteHeight = documentSize.infiniteHeight == true; - - const baseHtml = await ejs.render( - baseTemplate, - { - content: innerHtml, - width: `${documentSize.width}mm`, - height: infiniteHeight ? 'fit-content' : `${documentSize.height}mm`, - scaledWidth: `${documentSize.width * scale}mm`, - scaledHeight: infiniteHeight - ? 'auto' - : `${documentSize.height * scale}mm`, - scale: `${scale}`, - baseCSS: baseCSS, - previewPaginationScript: preview ? previewPaginationScript : '' - }, - defaultOptions - ); - - const previewObject = { - html: baseHtml, - width: documentSize.width, - height: infiniteHeight ? 'auto' : documentSize.height, - infiniteHeight: infiniteHeight - }; - - return previewObject; - } catch (error) { - logger.warn('Error whilst previewing template:', error.message); - return { error: error.message }; - } - } - - /** - * Validates if a template string is valid EJS syntax - * @param {string} templateString - The EJS template as a string - * @returns {boolean} True if template is valid, false otherwise - */ - validateTemplate(templateString) { - try { - // Try to compile the template to check for syntax errors - ejs.compile(templateString); - return true; - } catch (error) { - return false; - } - } - - /** - * Renders a template to PDF format - * @param {string} id - The document template ID - * @param {string} content - The template content - * @param {Object} data - Data object to pass to the template - * @param {number} scale - Scale factor for rendering - * @param {Object} options - EJS rendering options - * @returns {Promise} Object containing PDF buffer or error - */ - async renderPDF(id, content, data = {}, options = {}) { - try { - logger.debug('Rendering PDF for template:', id); - - const renderedTemplate = await this.renderTemplate( - id, - content, - data, - 1, - options, - false - ); - - if (renderedTemplate.error != undefined) { - return { error: renderedTemplate.error }; - } - const baseHtml = renderedTemplate.html; - - // Generate PDF using PDF factory - const pdfBuffer = await generatePDF(baseHtml, { - width: renderedTemplate.width, - height: renderedTemplate.height, - infiniteHeight: renderedTemplate.infiniteHeight - }); - - const pdfObject = { - pdf: pdfBuffer - }; - return pdfObject; - } catch (error) { - logger.warn('Error whilst rendering PDF:', error.message); - return { error: error.message }; - } - } - - /** - * Renders a template to image format for receipt printers - * @param {string} id - The document template ID - * @param {string} content - The template content - * @param {Object} data - Data object to pass to the template - * @param {Object} options - Image conversion options (e.g. width, height) - * @returns {Promise} Object containing image buffers or error - */ - async renderJPG(id, content, data = {}, options = {}) { - try { - logger.debug('Rendering JPG for template:', id); - - const pdfResult = await this.renderPDF(id, content, data, options); - if (pdfResult.error != undefined) { - return { error: pdfResult.error }; - } - - const images = await convertPDFToImage(pdfResult.pdf, options); - return { images }; - } catch (error) { - logger.warn('Error whilst rendering JPG:', error.message); - return { error: error.message }; - } - } - - async listObjects(objectType, filter = {}, populate = []) { - const model = getModelByName(objectType); - if (model == undefined) { - throw new Error('Farm Control: Object type not found.'); - } - const objects = await listObjects({ - model, - filter, - populate - }); - return objects; - } - - formatDate(date, format) { - return dayjs(date).format(format); - } - - async getObject(objectType = undefined, id = undefined, populate = []) { - if (objectType == undefined || objectType == '') { - logger.warn('Object type is required'); - return { error: 'Object type is required' }; - } - if (id == undefined || id == '') { - logger.warn('Object ID is required'); - return { error: 'Object ID is required' }; - } - const model = getModelByName(objectType); - if (model == undefined) { - logger.warn('Object type not found:', objectType); - } - const object = await getObject({ model, id, cached: true, populate }); - return object; - } -}