From 40214abe64f4ed127aba639b3483b3f07bcc6965 Mon Sep 17 00:00:00 2001 From: Surya Paolo Date: Thu, 29 May 2025 18:23:20 +0200 Subject: [PATCH] =?UTF-8?q?-=20generazione=20del=20PDF=20riscritto=20total?= =?UTF-8?q?mente=20-=20ora=20=C3=A8=20possibile=20generarlo=20anche=20da?= =?UTF-8?q?=20backend=20-=20FIX:=20corretto=20la=20qualit=C3=A0=20del=20PD?= =?UTF-8?q?F=20e=20la=20dimensione=20non=20esatta=20in=20pixel...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/test.htm | 13 +- package.json | 1 + src/server/middleware/authenticate.js | 3 +- src/server/models/myelem.js | 249 ++++++++-------- src/server/models/mypage.js | 3 + src/server/models/myscheda.js | 10 +- src/server/modules/CronMod.js | 307 +++++++++++--------- src/server/modules/GenPdf.js | 401 ++++++++++++++++++++++++++ src/server/router/admin_router.js | 273 ++++++++++++++---- src/server/router/index_router.js | 97 +++---- src/server/tools/general.js | 98 ++++--- yarn.lock | 386 ++++++++++++++++++++++++- 12 files changed, 1413 insertions(+), 428 deletions(-) create mode 100644 src/server/modules/GenPdf.js diff --git a/docs/test.htm b/docs/test.htm index a208101..b7b9453 100644 --- a/docs/test.htm +++ b/docs/test.htm @@ -1 +1,12 @@ -
{autore}
{titolo}
{descrizione}
Pagine: {pagine}
Formato: {misure}
Prezzo: {prezzo} €
+
+ +
{autore} +
{titolo}
+ {descrizione} +
+
+
+ Pagine: {pagine}
Formato: {misure}
Prezzo: {prezzo} €
+
+
\ No newline at end of file diff --git a/package.json b/package.json index a27a412..532a201 100755 --- a/package.json +++ b/package.json @@ -57,6 +57,7 @@ "pem": "^1.14.8", "preview-email": "^3.1.0", "pug": "^3.0.3", + "puppeteer": "^24.9.0", "rate-limiter-flexible": "^5.0.5", "request": "^2.88", "sanitize-html": "^2.14.0", diff --git a/src/server/middleware/authenticate.js b/src/server/middleware/authenticate.js index 07ca10a..17f3985 100755 --- a/src/server/middleware/authenticate.js +++ b/src/server/middleware/authenticate.js @@ -21,7 +21,8 @@ const authenticateMiddleware = async (req, res, next, withUser = false, lean = f req.user = null; req.token = null; req.code = server_constants.RIS_CODE_HTTP_INVALID_TOKEN; - console.log(` ## ${logPrefix}_TOKEN INVALIDO ❌ ...`); + if (!noError) + console.log(` ## ${logPrefix}_TOKEN INVALIDO ❌ ...`); return noError ? next() : res.status(req.code).send(); } diff --git a/src/server/models/myelem.js b/src/server/models/myelem.js index 6cf616f..744199c 100755 --- a/src/server/models/myelem.js +++ b/src/server/models/myelem.js @@ -1,4 +1,4 @@ -const mongoose = require('mongoose').set('debug', false) +const mongoose = require('mongoose').set('debug', false); const Schema = mongoose.Schema; const tools = require('../tools/general'); @@ -6,102 +6,91 @@ const { ObjectId } = require('mongodb'); const { MySchedaSchema, IDimensioni, IImg, IText, IAreaDiStampa } = require('../models/myscheda'); - mongoose.Promise = global.Promise; -mongoose.level = "F"; - +mongoose.level = 'F'; // Resolving error Unknown modifier: $pushAll -mongoose.plugin(schema => { - schema.options.usePushEach = true +mongoose.plugin((schema) => { + schema.options.usePushEach = true; }); const IElementiPagina = new Schema({ isTemplate: Boolean, linkIdTemplate: String, - linkIdTemplatePerStampa: String, name: String, pagina: IDimensioni, }); -const myCard = new Schema( - { - imagefile: String, - vers_img: Number, - alt: String, - description: String, - style: String, - size: String, - color: String, - content: String, - colorsub: String, - link: String, - } -) -const animation = new Schema( - { - name: String, - clduration: String, - cldelay: String, - timingtype: String, - } -); +const myCard = new Schema({ + imagefile: String, + vers_img: Number, + alt: String, + description: String, + style: String, + size: String, + color: String, + content: String, + colorsub: String, + link: String, +}); +const animation = new Schema({ + name: String, + clduration: String, + cldelay: String, + timingtype: String, +}); -const elemText = new Schema( - { - text: String, - color: String, - class: String, - size: String, - anim: animation, - } -); +const elemText = new Schema({ + text: String, + color: String, + class: String, + size: String, + anim: animation, +}); +const catalogo = new Schema({ + //++AddCATALOGO_FIELDS + idCatalogSel: { type: String }, + productTypes: [{ type: Number }], + excludeproductTypes: [{ type: Number }], + editore: [{ type: String }], + argomenti: [{ type: String }], + idCollane: [{ type: String }], + idTipologia: [{ type: Number }], + idTipoFormato: [{ type: Number }], + sort_field: { type: String }, + sort_dir: { type: Number }, + pdf: { type: Boolean }, + pdf_filename: { type: String }, + printable: { type: Boolean }, + indebug: { type: Boolean }, + maxnumlibri: { type: Number }, + showListaArgomenti: { type: Boolean }, + showOnlyCatalogoPDF: { type: Boolean }, + showListaCollane: { type: Boolean }, -const catalogo = new Schema( - { - //++AddCATALOGO_FIELDS - productTypes: [{ type: Number }], - excludeproductTypes: [{ type: Number }], - editore: [{ type: String }], - argomenti: [{ type: String }], - idCollane: [{ type: String }], - idTipologia: [{ type: Number }], - idTipoFormato: [{ type: Number }], - sort_field: { type: String }, - sort_dir: { type: Number }, - pdf: { type: Boolean }, - pdf_filename: { type: String }, - printable: { type: Boolean }, - indebug: { type: Boolean }, - maxnumlibri: { type: Number }, - showListaArgomenti: { type: Boolean}, - showListaCollane: { type: Boolean}, + first_page: IDimensioni, + last_page: IDimensioni, + areadistampa: IAreaDiStampa, - first_page: IDimensioni, - last_page: IDimensioni, - areadistampa: IAreaDiStampa, + print_isTemplate: Boolean, + print_linkIdTemplate: String, - print_isTemplate: Boolean, - print_linkIdTemplate: String, - print_linkIdTemplatePerStampa: String, + dimensioni_def: IElementiPagina, - dimensioni_def: IElementiPagina, - - // ------------------- - arrSchede: [ - { - scheda: MySchedaSchema, - order: { type: Number }, - numPagineMax: { type: Number }, - /*arrProdToShow: { + // ------------------- + arrSchede: [ + { + scheda: MySchedaSchema, + order: { type: Number }, + numPagineMax: { type: Number }, + /*arrProdToShow: { type: [[mongoose.Schema.Types.Mixed]], // Definizione tipo select: false // Imposta il campo come non selezionabile },*/ - } - ], - } -); + }, + ], +}); const MyElemSchema = new Schema({ idapp: { @@ -245,25 +234,25 @@ const MyElemSchema = new Schema({ list: [ { imagefile: { - type: String + type: String, }, vers_img: { type: Number, }, order: { - type: Number + type: Number, }, alt: { - type: String + type: String, }, description: { - type: String - } - } + type: String, + }, + }, ], date_created: { type: Date, - default: Date.now + default: Date.now, }, date_updated: { type: Date, @@ -279,8 +268,10 @@ MyElemSchema.pre('save', async function (next) { }); MyElemSchema.statics.getFieldsForSearch = function () { - return [{ field: 'title', type: tools.FieldType.string }, - { field: 'content', type: tools.FieldType.string }] + return [ + { field: 'title', type: tools.FieldType.string }, + { field: 'content', type: tools.FieldType.string }, + ]; }; MyElemSchema.statics.executeQueryTable = function (idapp, params, user) { @@ -300,7 +291,7 @@ MyElemSchema.statics.SetIdPageInsteadThePah = async function (idapp) { // Utilizza una mappa per accoppiare i path con i loro Id const pathToIdMap = {}; - pages.forEach(page => { + pages.forEach((page) => { pathToIdMap[page.path] = page._id; // Mappa il path all'ID del documento MyPage }); @@ -315,7 +306,7 @@ MyElemSchema.statics.SetIdPageInsteadThePah = async function (idapp) { idPage: id, oldpath: path, }, - $unset: { path: "" } // Rimuove il campo path + $unset: { path: '' }, // Rimuove il campo path } // Imposta IdPage all'ID del documento corrispondente ); } @@ -324,7 +315,7 @@ MyElemSchema.statics.SetIdPageInsteadThePah = async function (idapp) { if (false) { // Utilizza una mappa per accoppiare i path con i loro Id const pathToIdMap2 = {}; - pages.forEach(page => { + pages.forEach((page) => { pathToIdMap2[page.path] = page._id.toString(); // Mappa il path all'ID del documento MyPage }); @@ -333,7 +324,7 @@ MyElemSchema.statics.SetIdPageInsteadThePah = async function (idapp) { await MyElem.updateMany( { oldpath: path }, // Condizione per aggiornare dove il path corrisponde { - $unset: { idPage: "" } // Rimuove il campo path + $unset: { idPage: '' }, // Rimuove il campo path } // Imposta IdPage all'ID del documento corrispondente ); } @@ -342,14 +333,14 @@ MyElemSchema.statics.SetIdPageInsteadThePah = async function (idapp) { await MyElem.updateMany( { oldpath: oldpath }, // Condizione per aggiornare dove il path corrisponde { - $set: { idPage: id } + $set: { idPage: id }, } // Imposta IdPage all'ID del documento corrispondente ); } } const pathToIdMap2 = {}; - pages.forEach(page => { + pages.forEach((page) => { pathToIdMap2[page.path] = page._id.toString(); // Mappa il path all'ID del documento MyPage }); @@ -358,26 +349,23 @@ MyElemSchema.statics.SetIdPageInsteadThePah = async function (idapp) { { idapp }, { oldpath: oldpath }, // Condizione per aggiornare dove il path corrisponde { - $set: { idPage: id } + $set: { idPage: id }, } // Imposta IdPage all'ID del documento corrispondente ); } - console.log('Aggiornamenti effettuati con successo.'); return 'Aggiornamenti effettuati con successo.'; } catch (error) { - console.error('Errore durante l\'aggiornamento:', error); - return 'Errore durante l\'aggiornamento:', error; + console.error("Errore durante l'aggiornamento:", error); + return "Errore durante l'aggiornamento:", error; } - }; MyElemSchema.statics.deleteAllFromThisPage = async function (id) { const MyElem = this; return MyElem.deleteMany({ idPage: id }); - }; MyElemSchema.statics.findAllIdApp = async function (idapp) { const MyElem = this; @@ -405,17 +393,16 @@ MyElemSchema.statics.findAllIdApp = async function (idapp) { async function deleteOldMyElems(idapp) { try { - const { MyPage } = require('../models/mypage'); // 1. Recupera tutti gli _id dalle pagine - const existingPages = await MyPage.find({idapp}).select('_id').lean(); - const existingPageIds = existingPages.map(page => page._id.toString()); + const existingPages = await MyPage.find({ idapp }).select('_id').lean(); + const existingPageIds = existingPages.map((page) => page._id.toString()); // 2. Trova gli MyElem che hanno idPage non esistenti in MyPage const elemsToDelete = await MyElem.find({ idapp, - idPage: { $nin: existingPageIds } + idPage: { $nin: existingPageIds }, }); if (elemsToDelete.length > 0) { @@ -446,24 +433,22 @@ MyElemSchema.statics.findallSchedeTemplate = async function (idapp) { const MyElem = this; try { - const { MyPage } = require('../models/mypage'); const ris = await MyElem.find({ idapp }).lean(); - const schedeTemplate = ris.flatMap(elem => - elem.catalogo && elem.catalogo.arrSchede ? - elem.catalogo.arrSchede - .filter(scheda => scheda.scheda?.isTemplate) - .map(scheda => ({ - ...scheda, // mantieni i dati originali della scheda - idPageOrig: elem.idPage // aggiungi l'idPage - })) + const schedeTemplate = ris.flatMap((elem) => + elem.catalogo && elem.catalogo.arrSchede + ? elem.catalogo.arrSchede + .filter((scheda) => scheda.scheda?.isTemplate) + .map((scheda) => ({ + ...scheda, // mantieni i dati originali della scheda + idPageOrig: elem.idPage, // aggiungi l'idPage + })) : [] ); if (idapp === '18') { - const duplicateIds = schedeTemplate.reduce((acc, scheda) => { const id = scheda.scheda._id; // Ottieni l'ID della scheda if (!acc[id]) { @@ -479,7 +464,7 @@ MyElemSchema.statics.findallSchedeTemplate = async function (idapp) { .map(([id, pages]) => ({ id, pages })); // Ottieni ID e pagine corrispondenti // Recupera i dettagli delle pagine - const pageIds = duplicates.flatMap(dup => dup.pages); // Estrai tutti gli idPage + const pageIds = duplicates.flatMap((dup) => dup.pages); // Estrai tutti gli idPage const pages = await MyPage.find({ idapp, _id: { $in: pageIds } }).lean(); // Crea una mappatura tra idPage e title @@ -489,19 +474,18 @@ MyElemSchema.statics.findallSchedeTemplate = async function (idapp) { }, {}); // Associa i titoli delle pagine agli ID duplicati - const resultWithTitles = duplicates.map(dup => ({ + const resultWithTitles = duplicates.map((dup) => ({ id: dup.id, - pages: dup.pages.map(_id => ({ + pages: dup.pages.map((_id) => ({ _id, - title: pageMap[_id] || 'Titolo non trovato' // Usa la mappatura per trovare il titolo - })) + title: pageMap[_id] || 'Titolo non trovato', // Usa la mappatura per trovare il titolo + })), })); if (resultWithTitles.length > 0) { console.log('Duplicati e titoli delle pagine:', JSON.stringify(resultWithTitles, null, 2)); await deleteOldMyElems(idapp); } - } return schedeTemplate; @@ -511,13 +495,13 @@ MyElemSchema.statics.findallSchedeTemplate = async function (idapp) { }; /** - * Ricerca tra tutte le schede, contenute in catalogo, se esiste un nome di template uguale, + * Ricerca tra tutte le schede, contenute in catalogo, se esiste un nome di template uguale, * se non lo trova allora è quello giusto per crearne uno nuovo - * + * * @param {string} idapp - ID dell'app * @param {string} idPageOrig - ID della pagina originale * @param {string} nomeTemplate - Nome del template - * + * * @returns {string} Il nome del template libero */ MyElemSchema.statics.getNewFreeNameTemplate = async function (idapp, idPageOrig, nomeTemplate) { @@ -529,23 +513,23 @@ MyElemSchema.statics.getNewFreeNameTemplate = async function (idapp, idPageOrig, { idapp, 'catalogo.arrSchede.scheda.isTemplate': true, - 'catalogo.arrSchede.scheda.idPage': { $ne: idPageOrig } + 'catalogo.arrSchede.scheda.idPage': { $ne: idPageOrig }, }, { 'catalogo.arrSchede.scheda.name': 1, 'catalogo.arrSchede.scheda.isTemplate': 1, 'catalogo.arrSchede.scheda.isPagIntro': 1, - 'catalogo.arrSchede.scheda.idPage': 1 - }); + 'catalogo.arrSchede.scheda.idPage': 1, + } + ); // Recupera i nomi dei template già esistenti const existingNames = new Set( - ris.flatMap(elem => - elem.catalogo?.arrSchede?.filter(scheda => - scheda.scheda?.isTemplate && - scheda.scheda?.idPage !== idPageOrig - ) - .map(scheda => scheda.scheda?.name) || [] + ris.flatMap( + (elem) => + elem.catalogo?.arrSchede + ?.filter((scheda) => scheda.scheda?.isTemplate && scheda.scheda?.idPage !== idPageOrig) + .map((scheda) => scheda.scheda?.name) || [] ) ); @@ -568,8 +552,9 @@ MyElemSchema.statics.getNewFreeNameTemplate = async function (idapp, idPageOrig, const MyElem = mongoose.model('MyElem', MyElemSchema); MyElem.createIndexes() - .then(() => { }) - .catch((err) => { throw err; }); - + .then(() => {}) + .catch((err) => { + throw err; + }); module.exports = { MyElem }; diff --git a/src/server/models/mypage.js b/src/server/models/mypage.js index 63103ad..531a5de 100755 --- a/src/server/models/mypage.js +++ b/src/server/models/mypage.js @@ -140,6 +140,9 @@ const MyPageSchema = new Schema({ sottoMenu: [{ type: String }], + hideHeader: { + type: Boolean, + }, date_created: { type: Date, default: Date.now diff --git a/src/server/models/myscheda.js b/src/server/models/myscheda.js index 95ef914..014c0c6 100755 --- a/src/server/models/myscheda.js +++ b/src/server/models/myscheda.js @@ -65,10 +65,13 @@ const IAreaDiStampa = new Schema({ margini: IBorders, unit: String, format: [{ type: Number }], + format_printable: [{ type: Number }], orientation: String, compress: Boolean, - scale: Number, - scale_printable: Number, + scalex: Number, + scaley: Number, + scale_printablex: Number, + scale_printabley: Number, scalecanvas: Number, }); @@ -116,7 +119,8 @@ const scheletroScheda = { isTemplate: { type: Boolean }, isPagIntro: { type: Boolean }, linkIdTemplate: { type: String }, - linkIdTemplatePerStampa: { type: String }, + scalexscheda: Number, + scaleyscheda: Number, name: { type: String }, numschede_perRiga: { type: Number }, numschede_perCol: { type: Number }, diff --git a/src/server/modules/CronMod.js b/src/server/modules/CronMod.js index 9ef8482..5b173f9 100644 --- a/src/server/modules/CronMod.js +++ b/src/server/modules/CronMod.js @@ -30,6 +30,7 @@ const { Circuit } = require('../models/circuit'); const { Province } = require('../models/province'); const { City } = require('../models/city'); const { Account } = require('../models/account'); +const { Catalog } = require('../models/catalog'); const Macro = require('../modules/Macro'); @@ -37,71 +38,91 @@ class CronMod { constructor() {} async eseguiDbOp(idapp, mydata, req, res) { - let ris = await User.DbOp(idapp, mydata); mydata.idapp = idapp; - const populate = require("../populate/populate"); + const populate = require('../populate/populate'); - const globalTables = require("../tools/globalTables"); - const { Reaction } = require("../models/reaction"); + const globalTables = require('../tools/globalTables'); + const { Reaction } = require('../models/reaction'); const AmazonBookScraper = require('../modules/Scraping'); - let mystr = ""; + const GenPdf = require('../modules/GenPdf'); + + let mystr = ''; try { - if (mydata.dbop === "") { + if (mydata.dbop === '') { // } else if (mydata.dbop === 'rigeneraTutto') { // await ListaIngresso.Esegui_CronTab(idapp, mydata); - } else if (mydata.dbop === "ScraperMultipleDataAmazon") { - mystr = await AmazonBookScraper.ScraperMultipleDataAmazon(idapp, {update: true, aggiornasoloSeVuoti: true, forzaricarica: false}); + } else if (mydata.dbop === 'ScraperMultipleDataAmazon') { + mystr = await AmazonBookScraper.ScraperMultipleDataAmazon(idapp, { + update: true, + aggiornasoloSeVuoti: true, + forzaricarica: false, + }); ris = { mystr }; - } else if (mydata.dbop === "ScraperEstraiDatiAmazon-NoUpdate") { - mystr = await AmazonBookScraper.ScraperMultipleDataAmazon(idapp, {update: false, aggiornasoloSeVuoti: false, forzaricarica: true, caricatutti: true}); + } else if (mydata.dbop === 'ScraperEstraiDatiAmazon-NoUpdate') { + mystr = await AmazonBookScraper.ScraperMultipleDataAmazon(idapp, { + update: false, + aggiornasoloSeVuoti: false, + forzaricarica: true, + caricatutti: true, + }); ris = { mystr }; - } else if (mydata.dbop === "ScraperGeneraCSV") { + } else if (mydata.dbop === 'ScraperGeneraCSV') { mystr = await AmazonBookScraper.ScraperGeneraCSV(idapp, mydata.options, res); ris = { mystr }; - } else if (mydata.dbop === "removeDuplicateVariations") { + } else if (mydata.dbop === 'removeDuplicateVariations') { mystr = await AmazonBookScraper.removeDuplicateVariations(idapp, mydata.options); ris = { mystr }; - } else if (mydata.dbop === "ScraperAzzeraFlagProducts") { + } else if (mydata.dbop === 'ScraperAzzeraFlagProducts') { mystr = await AmazonBookScraper.ScraperAzzeraFlagProducts(idapp, mydata.options); ris = { mystr }; - } else if (mydata.dbop === "ReplaceAllCircuits") { + } else if (mydata.dbop === 'GeneraPdfCatalogo') { + + const genPdf = new GenPdf(idapp); + + await genPdf.launch(); + + return await genPdf.generatePdfFromIdCatalog(mydata.options); + } else if (mydata.dbop === 'ReplaceAllCircuits') { // ++ Replace All Circuitname with 'Circuito RIS %s' await Circuit.replaceAllCircuitNames(idapp); - } else if (mydata.dbop === "eliminaCatProds") { + } else if (mydata.dbop === 'eliminaCatProds') { await CatProd.deleteMany({ idapp }); await SubCatProd.deleteMany({ idapp }); - } else if (mydata.dbop === "removeProductInfoWithoutDateUpdatedFromGM") { + } else if (mydata.dbop === 'removeProductInfoWithoutDateUpdatedFromGM') { mystr = await ProductInfo.removeProductInfoWithoutDateUpdatedFromGM(idapp); ris = { mystr }; - } else if (mydata.dbop === "StatMacro") { + } else if (mydata.dbop === 'StatMacro') { const macro = new Macro(idapp, {}); mystr = await macro.getStat(); ris = { mystr }; - } else if (mydata.dbop === "updateAllBook") { + } else if (mydata.dbop === 'updateAllBook') { // chiama updateAllBook - const { updateAllBook } = require("../controllers/articleController"); + const { updateAllBook } = require('../controllers/articleController'); mystr = await updateAllBook(idapp, mydata.options); ris = { mystr }; - } else if (mydata.dbop === "updateAllBooksAndRemoveCanc") { + } else if (mydata.dbop === 'updateAllBooksAndRemoveCanc') { // chiama updateAllBooksAndRemoveCanc - const { updateAllBook } = require("../controllers/articleController"); + const { updateAllBook } = require('../controllers/articleController'); console.log('updateAllBooksAndRemoveCanc...'); - - mystr = await updateAllBook(idapp, {usaDBGMLocale: false, caricatutti: true, rimuovieventualiCancellati: true}); + mystr = await updateAllBook(idapp, { + usaDBGMLocale: false, + caricatutti: true, + rimuovieventualiCancellati: true, + }); ris = { mystr }; - } else if (mydata.dbop === "creaUtentiTest") { + } else if (mydata.dbop === 'creaUtentiTest') { let num = 0; lastrec = await User.find({ idapp }).sort({ _id: -1 }).limit(1); let last = 1; @@ -117,17 +138,17 @@ class CronMod { myuser._id = new ObjectId(); myuser.index = last + ind + 1; myuser.idapp = idapp; - myuser.password = "$2a$12$DEaX1h5saTUVC43f7kubyOAlah1xHDgqQTfSIux0.RFDT9WGbyCaG"; - myuser.lang = "it"; - myuser.email = "miaemail@email.it"; - myuser.name = "U" + myuser.index; - myuser.surname = "Ar" + myuser.index; + myuser.password = '$2a$12$DEaX1h5saTUVC43f7kubyOAlah1xHDgqQTfSIux0.RFDT9WGbyCaG'; + myuser.lang = 'it'; + myuser.email = 'miaemail@email.it'; + myuser.name = 'U' + myuser.index; + myuser.surname = 'Ar' + myuser.index; myuser.verified_email = true; myuser.verified_by_aportador = true; - if (myuser.index < 2) myuser.perm = "3"; - myuser.username = "Userna_" + myuser.name; + if (myuser.index < 2) myuser.perm = '3'; + myuser.username = 'Userna_' + myuser.name; myuser.profile.special_req = true; - myuser.profile.nationality = "IT"; + myuser.profile.nationality = 'IT'; await myuser.save(); num++; } @@ -156,57 +177,57 @@ class CronMod { ris = { mystr }; */ - } else if (mydata.dbop === "CorreggiTabHours") { + } else if (mydata.dbop === 'CorreggiTabHours') { ris = await Hours.correggiHours(idapp); - } else if (mydata.dbop === "setVerifiedByAportadorToALL") { + } else if (mydata.dbop === 'setVerifiedByAportadorToALL') { ris = await User.setVerifiedByAportadorToALL(); - } else if (mydata.dbop === "RewriteContribType") { - ris = populate.rewriteTable("contribtypes"); - } else if (mydata.dbop === "ReplaceUsername") { + } else if (mydata.dbop === 'RewriteContribType') { + ris = populate.rewriteTable('contribtypes'); + } else if (mydata.dbop === 'ReplaceUsername') { if (User.isAdmin(req.user.perm)) { ris = globalTables.replaceUsername(req.body.idapp, mydata.search_username, mydata.replace_username); } - } else if (mydata.dbop === "ExitFromAllCircuitWithZero") { + } else if (mydata.dbop === 'ExitFromAllCircuitWithZero') { if (User.isAdmin(req.user.perm)) { ris = globalTables.ExitFromAllCircuitWithZero(req.body.idapp, mydata.search_username); } - } else if (mydata.dbop === "replaceAportadorSolidario") { + } else if (mydata.dbop === 'replaceAportadorSolidario') { if (User.isAdmin(req.user.perm)) { ris = globalTables.replaceAportadorSolidario(req.body.idapp, mydata.search_username, mydata.replace_username); } - } else if (mydata.dbop === "SearchString") { + } else if (mydata.dbop === 'SearchString') { if (User.isAdmin(req.user.perm)) { mystr = await globalTables.SearchString(req.body.idapp, mydata.search); } ris = { mystr }; - } else if (mydata.dbop === "UpdateCatDeleteEmpty") { + } else if (mydata.dbop === 'UpdateCatDeleteEmpty') { mystr = await CatProd.updateCatDeleteEmpty(req.body.idapp); ris = { mystr }; - } else if (mydata.dbop === "UpdateStatFatturato") { + } else if (mydata.dbop === 'UpdateStatFatturato') { mystr = await ProductInfo.updateProductInfoByStats(req.body.idapp); ris = { mystr }; - } else if (mydata.dbop === "MigrateMSSQLToMongoDb") { - const { mssqlmigrateTables } = require("../controllers/articleController"); + } else if (mydata.dbop === 'MigrateMSSQLToMongoDb') { + const { mssqlmigrateTables } = require('../controllers/articleController'); mystr = await mssqlmigrateTables(req); ris = { mystr }; - } else if (mydata.dbop === "copyFrom1To14") { + } else if (mydata.dbop === 'copyFrom1To14') { const idapporig = 1; const idappdest = 14; if (!idapporig || !idappdest) return; - const globalTables = require("../tools/globalTables"); + const globalTables = require('../tools/globalTables'); //++ Todo: TO FIXIT ! - const mytablesstr = ["settings", "users", "templemail", "destnewsletter", "contribtypes", "bots", "cfgservers"]; + const mytablesstr = ['settings', 'users', 'templemail', 'destnewsletter', 'contribtypes', 'bots', 'cfgservers']; try { let numrectot = 0; for (const table of mytablesstr) { const mytable = globalTables.getTableByTableName(table); - tools.mylogshow("copyfromapptoapp: ", table, mytable); + tools.mylogshow('copyfromapptoapp: ', table, mytable); await mytable.DuplicateAllRecords(idapporig, idappdest).then((numrec) => { // tools.mylogshow(' REC TO MODIFY: ', rec); @@ -216,40 +237,40 @@ class CronMod { ris = true; } catch (e) { - console.log("e", e); + console.log('e', e); } - } else if (mydata.dbop === "removeRecordsFav") { + } else if (mydata.dbop === 'removeRecordsFav') { // Passa le tabelle da users sulle nuove tabelle: await User.removerecordsFavorite(); - } else if (mydata.dbop === "updateReactionsCounts") { + } else if (mydata.dbop === 'updateReactionsCounts') { await Reaction.updateReactionsCounts(); - } else if (mydata.dbop === "GeneraCSVOrdineProdotti") { + } else if (mydata.dbop === 'GeneraCSVOrdineProdotti') { await Order.GeneraCSVOrdineProdotti(); - } else if (mydata.dbop === "RemoveDeletedOrdersInOrderscart") { + } else if (mydata.dbop === 'RemoveDeletedOrdersInOrderscart') { await Order.RemoveDeletedOrdersInOrderscart(); - } else if (mydata.dbop === "CheckTransazioniCircuiti") { + } else if (mydata.dbop === 'CheckTransazioniCircuiti') { await Circuit.CheckTransazioniCircuiti(false); - } else if (mydata.dbop === "CorreggiTransazioniCircuiti") { + } else if (mydata.dbop === 'CorreggiTransazioniCircuiti') { await Circuit.CheckTransazioniCircuiti(true); - } else if (mydata.dbop === "RemovePendentTransactions") { + } else if (mydata.dbop === 'RemovePendentTransactions') { ris = await SendNotif.RemovePendentTransactions(idapp); - } else if (mydata.dbop === "RemoveOldNotif90") { + } else if (mydata.dbop === 'RemoveOldNotif90') { await SendNotif.RemoveOldNotif90(idapp); - } else if (mydata.dbop === "RemoveOldNotif30") { + } else if (mydata.dbop === 'RemoveOldNotif30') { await SendNotif.RemoveOldNotif30(idapp); - } else if (mydata.dbop === "UpdateCoordProv") { + } else if (mydata.dbop === 'UpdateCoordProv') { await Province.setCoordinatesOnDB(); - } else if (mydata.dbop === "insertGeojsonToMongoDB") { - await City.insertGeojsonToMongoDB("comuni_italia.geojson"); - } else if (mydata.dbop === "listCollectionsBySize") { + } else if (mydata.dbop === 'insertGeojsonToMongoDB') { + await City.insertGeojsonToMongoDB('comuni_italia.geojson'); + } else if (mydata.dbop === 'listCollectionsBySize') { mystr = await tools.listCollectionsBySize(); ris = { mystr }; - } else if (mydata.dbop === "EnableNewsOn_ToAll") { + } else if (mydata.dbop === 'EnableNewsOn_ToAll') { mystr = await User.setNewsletterToAll(idapp); - } else if (mydata.dbop === "MyElemSetIdPageInsteadThePah") { + } else if (mydata.dbop === 'MyElemSetIdPageInsteadThePah') { mystr = await MyElem.SetIdPageInsteadThePah(idapp); ris = { mystr }; - } else if (mydata.dbop === "AbilitaNewsletterALL") { + } else if (mydata.dbop === 'AbilitaNewsletterALL') { await User.updateMany( { $or: [{ deleted: { $exists: false } }, { deleted: { $exists: true, $eq: false } }], @@ -257,44 +278,44 @@ class CronMod { { $set: { news_on: true } }, { new: false } ); - } else if (mydata.dbop === "SvuotaTuttiGliAccessiOnlineConToken") { + } else if (mydata.dbop === 'SvuotaTuttiGliAccessiOnlineConToken') { await User.SvuotaTuttiGliAccessiOnlineConToken(idapp); - } else if (mydata.dbop === "SettaAdTypeOffro_In_Hosps") { - const { MyHosp } = require("../models/myhosp"); + } else if (mydata.dbop === 'SettaAdTypeOffro_In_Hosps') { + const { MyHosp } = require('../models/myhosp'); await MyHosp.SettaAdTypeOffro_In_Hosps(idapp); - } else if (mydata.dbop === "removeRegulations") { - await Circuit.updateMany({}, { $set: { regulation: "" } }); - } else if (mydata.dbop === "newRecordsFav") { + } else if (mydata.dbop === 'removeRegulations') { + await Circuit.updateMany({}, { $set: { regulation: '' } }); + } else if (mydata.dbop === 'newRecordsFav') { // Passa le tabelle da users sulle nuove tabelle: await User.moverecordsFavorite(1); await User.moverecordsFavorite(2); await User.moverecordsFavorite(3); await User.moverecordsFavorite(4); await User.moverecordsFavorite(5); - } else if (mydata.dbop === "emptyTabCatServiziBeni") { - const { Sector } = require("../models/sector"); - const { SectorGood } = require("../models/sectorgood"); - const { Skill } = require("../models/skill"); - const { Good } = require("../models/good"); + } else if (mydata.dbop === 'emptyTabCatServiziBeni') { + const { Sector } = require('../models/sector'); + const { SectorGood } = require('../models/sectorgood'); + const { Skill } = require('../models/skill'); + const { Good } = require('../models/good'); await Sector.deleteMany({}); await SectorGood.deleteMany({}); await Skill.deleteMany({}); ris = await Good.deleteMany({}); - } else if (mydata.dbop === "emptyDbSkill") { + } else if (mydata.dbop === 'emptyDbSkill') { // Svuota e Ricrea - const { Sector } = require("../models/sector"); - const { SectorGood } = require("../models/sectorgood"); - const { Skill } = require("../models/skill"); - const { Good } = require("../models/good"); - const { SubSkill } = require("../models/subskill"); - const { Contribtype } = require("../models/contribtype"); - const { AdType } = require("../models/adtype"); - const { AdTypeGood } = require("../models/adtypegood"); - const { StatusSkill } = require("../models/statusSkill"); - const { CatGrp } = require("../models/catgrp"); + const { Sector } = require('../models/sector'); + const { SectorGood } = require('../models/sectorgood'); + const { Skill } = require('../models/skill'); + const { Good } = require('../models/good'); + const { SubSkill } = require('../models/subskill'); + const { Contribtype } = require('../models/contribtype'); + const { AdType } = require('../models/adtype'); + const { AdTypeGood } = require('../models/adtypegood'); + const { StatusSkill } = require('../models/statusSkill'); + const { CatGrp } = require('../models/catgrp'); await Sector.deleteMany({}); await SectorGood.deleteMany({}); @@ -308,19 +329,19 @@ class CronMod { await CatGrp.deleteMany({}); ris = await populate.popolaTabelleNuove(); - } else if (mydata.dbop === "ricreaTabCitiesProvinces") { + } else if (mydata.dbop === 'ricreaTabCitiesProvinces') { // Svuota e Ricrea - const { City } = require("../models/city"); - const { Province } = require("../models/province"); + const { City } = require('../models/city'); + const { Province } = require('../models/province'); await City.deleteMany({}); await Province.deleteMany({}); ris = await populate.popolaTabelleNuove(); - } else if (mydata.dbop === "PopulateTables") { + } else if (mydata.dbop === 'PopulateTables') { ris = populate.popolaTabelleNuove(); - } else if (mydata.dbop === "dropProducts") { + } else if (mydata.dbop === 'dropProducts') { if (idapp) { const deleteProducts = await Product.deleteMany({ idapp }); console.log(`Cancellati ${deleteProducts.deletedCount} record dalla collezione Product.`); @@ -331,11 +352,11 @@ class CronMod { } ris = deleteProductInfo ? true : false; - } else if (mydata.dbop === "dropCatProd") { + } else if (mydata.dbop === 'dropCatProd') { const deleteCatProd = await CatProd.deleteMany({ idapp }); - } else if (mydata.dbop === "dropSubCatProd") { + } else if (mydata.dbop === 'dropSubCatProd') { const deleteSubCatProd = await SubCatProd.deleteMany({ idapp }); - } else if (mydata.dbop === "dropAllOrders") { + } else if (mydata.dbop === 'dropAllOrders') { try { const deleteOrder = await Order.deleteMany({ idapp }); const deleteOrdersCart = await OrdersCart.deleteMany({ idapp }); @@ -343,9 +364,9 @@ class CronMod { ris = deleteCart; } catch (e) { - console.error("Err:", e); + console.error('Err:', e); } - } else if (mydata.dbop === "SistemaGasOrdine") { + } else if (mydata.dbop === 'SistemaGasOrdine') { const arrrec = await Product.find({}).lean(); for (const rec of arrrec) { if (tools.isArray(rec.idGasordines) && rec.idGasordines.length > 0) { @@ -354,7 +375,7 @@ class CronMod { await Product.findByIdAndUpdate(rec._id, { $set: { idGasordine: null } }); } } - } else if (mydata.dbop === "CopyPriceToCalc") { + } else if (mydata.dbop === 'CopyPriceToCalc') { try { const arrrec = await OrdersCart.find({}).lean(); for (const rec of arrrec) { @@ -366,30 +387,30 @@ class CronMod { await Order.findByIdAndUpdate(rec._id, { $set: { TotalPriceProductCalc: rec.TotalPriceProduct } }); } } catch (e) { - console.error("Err:", e); + console.error('Err:', e); } - } else if (mydata.dbop === "dropAllCarts") { + } else if (mydata.dbop === 'dropAllCarts') { ris = await Cart.deleteMany({ idapp }); - } else if (mydata.dbop === "RewriteCitiesTable") { - ris = populate.rewriteTable("cities"); - } else if (mydata.dbop === "RewriteLevelsTable") { - ris = populate.rewriteTable("levels"); - } else if (mydata.dbop === "RewriteProvincesTable") { - ris = populate.rewriteTable("provinces"); - } else if (mydata.dbop === "emptyCityProvinces") { - const { City } = require("../models/city"); - const { Province } = require("../models/province"); + } else if (mydata.dbop === 'RewriteCitiesTable') { + ris = populate.rewriteTable('cities'); + } else if (mydata.dbop === 'RewriteLevelsTable') { + ris = populate.rewriteTable('levels'); + } else if (mydata.dbop === 'RewriteProvincesTable') { + ris = populate.rewriteTable('provinces'); + } else if (mydata.dbop === 'emptyCityProvinces') { + const { City } = require('../models/city'); + const { Province } = require('../models/province'); await City.deleteMany({}); await Province.deleteMany({}); - } else if (mydata.dbop === "ConvTablesFromIntToString") { - const { MySkill } = require("../models/myskill"); - const { MyBacheca } = require("../models/mybacheca"); - const { MyHosp } = require("../models/myhosp"); - const { MyGood } = require("../models/mygood"); + } else if (mydata.dbop === 'ConvTablesFromIntToString') { + const { MySkill } = require('../models/myskill'); + const { MyBacheca } = require('../models/mybacheca'); + const { MyHosp } = require('../models/myhosp'); + const { MyGood } = require('../models/mygood'); // const { MyGroup } = require('../models/mygroup'); - console.log("INIZIO - Conversioni"); + console.log('INIZIO - Conversioni'); // 'myskills', // 'mybachecas', // 'myhosps', @@ -402,15 +423,15 @@ class CronMod { await ConvertiDaIntAStr(MyGood); await ConvertiDaIntAStr(MyGroup); - console.log("FINE - Conversioni"); - } else if (mydata.dbop === "Removeinteger") { - const { MySkill } = require("../models/myskill"); - const { MyBacheca } = require("../models/mybacheca"); - const { MyHosp } = require("../models/myhosp"); - const { MyGood } = require("../models/mygood"); + console.log('FINE - Conversioni'); + } else if (mydata.dbop === 'Removeinteger') { + const { MySkill } = require('../models/myskill'); + const { MyBacheca } = require('../models/mybacheca'); + const { MyHosp } = require('../models/myhosp'); + const { MyGood } = require('../models/mygood'); // const { MyGroup } = require('../models/mygroup'); - console.log("INIZIO - Rimozione"); + console.log('INIZIO - Rimozione'); await RimuoviInteri(MySkill); await RimuoviInteri(MyBacheca); @@ -418,45 +439,45 @@ class CronMod { await RimuoviInteri(MyGood); await RimuoviInteri(MyGroup); - console.log("FINE - Rimozione"); - } else if (mydata.dbop === "createAllCircuits") { - const { Province } = require("../models/province"); + console.log('FINE - Rimozione'); + } else if (mydata.dbop === 'createAllCircuits') { + const { Province } = require('../models/province'); const arrProv = await Province.find({}); for (const recprov of arrProv) { await Circuit.createCircuitIfNotExist(req, idapp, recprov.prov); } - } else if (mydata.dbop === "correggiProductTypes") { + } else if (mydata.dbop === 'correggiProductTypes') { await ProductInfo.correggiProductTypes(); - } else if (mydata.dbop === "replaceProductImgToImageFile") { + } else if (mydata.dbop === 'replaceProductImgToImageFile') { await ProductInfo.replaceProductImgToImageFile(true); - } else if (mydata.dbop === "removeUploadProducts_Path") { + } else if (mydata.dbop === 'removeUploadProducts_Path') { await ProductInfo.replaceProductImgToImageFile(false); - } else if (mydata.dbop === "correggiCircuitiANull") { - await User.updateMany({}, { $pull: { "profile.mycircuits": { circuitname: null } } }); - } else if (mydata.dbop === "ImpostaMinMaxPersonali") { - await Account.SetMinMaxPersonali(idapp, mydata.valmin, mydata.valmax, ""); - } else if (mydata.dbop === "ImpostaMinMaxPersonaliCircuito") { + } else if (mydata.dbop === 'correggiCircuitiANull') { + await User.updateMany({}, { $pull: { 'profile.mycircuits': { circuitname: null } } }); + } else if (mydata.dbop === 'ImpostaMinMaxPersonali') { + await Account.SetMinMaxPersonali(idapp, mydata.valmin, mydata.valmax, ''); + } else if (mydata.dbop === 'ImpostaMinMaxPersonaliCircuito') { await Account.SetMinMaxPersonali(idapp, mydata.valmin, mydata.valmax, mydata.circuitId); - } else if (mydata.dbop === "ImpostaMinMaxComunitari") { + } else if (mydata.dbop === 'ImpostaMinMaxComunitari') { await Account.SetMinMaxComunitari(idapp, mydata.valmin, mydata.valmax); - } else if (mydata.dbop === "ImpostaMinMaxCollettivi") { + } else if (mydata.dbop === 'ImpostaMinMaxCollettivi') { await Account.SetMinMaxCollettivi(idapp, mydata.valmin, mydata.valmax); - } else if (mydata.dbop === "ImpostaDefMinMaxPersonali") { + } else if (mydata.dbop === 'ImpostaDefMinMaxPersonali') { await Circuit.SetDefMinMaxPersonali(idapp, mydata.valmin, mydata.valmax, mydata.circuitId); - } else if (mydata.dbop === "ImpostaDefMinMaxCollettivi") { + } else if (mydata.dbop === 'ImpostaDefMinMaxCollettivi') { await Circuit.SetDefMinMaxCollettivi(idapp, mydata.valmin, mydata.valmax, mydata.circuitId); - } else if (mydata.dbop === "AbilitaTuttiCircuiti") { + } else if (mydata.dbop === 'AbilitaTuttiCircuiti') { await Circuit.AbilitaTuttiCircuiti(idapp); - } else if (mydata.dbop === "AzzeraRegolamentiTuttiCircuiti") { + } else if (mydata.dbop === 'AzzeraRegolamentiTuttiCircuiti') { await Circuit.AzzeraRegolamentiTuttiCircuiti(idapp); - } else if (mydata.dbop === "setstrProvByIdCityCircuits") { + } else if (mydata.dbop === 'setstrProvByIdCityCircuits') { await Circuit.setstrProvByIdCityCircuits(idapp); - } else if (mydata.dbop === "updateSaldoAndTransato_AllAccounts") { + } else if (mydata.dbop === 'updateSaldoAndTransato_AllAccounts') { await Account.updateSaldoAndTransato_AllAccounts(idapp); - } else if (mydata.dbop === "generateBotMenuRecords") { + } else if (mydata.dbop === 'generateBotMenuRecords') { await MyBot.generateBotMenuRecords(idapp); - } else if (mydata.dbop === "GenerateVapiKey") { + } else if (mydata.dbop === 'GenerateVapiKey') { await tools.generateVapiKey(); /*} else if (mydata.dbop === 'visuNave') { diff --git a/src/server/modules/GenPdf.js b/src/server/modules/GenPdf.js new file mode 100644 index 0000000..ccb02f3 --- /dev/null +++ b/src/server/modules/GenPdf.js @@ -0,0 +1,401 @@ +const puppeteer = require('puppeteer'); +const path = require('path'); +const fs = require('fs').promises; + +const gs = require('ghostscript4js'); + +const { PDFDocument, rgb } = require('pdf-lib'); + +const { Catalog } = require('../models/catalog'); +const { MyPage } = require('../models/mypage'); + +const tools = require('../tools/general'); +const shared_consts = require('../tools/shared_nodejs'); + +class GenPdf { + constructor(idapp) { + this.idapp = idapp; + this.browser = null; + } + + async launch() { + this.browser = await puppeteer.launch(); + } + + async close() { + if (this.browser) { + await this.browser.close(); + this.browser = null; + } + } + + inchesToPixels(inches, stampa) { + if (stampa) { + return Math.floor(inches * 300); + } else { + return Math.floor(inches * 96); + } + } + + mmToInches(mm) { + return mm / 25.4; + } + + async autoScroll(page) { + console.log('inizia a scrollare') + await page.evaluate(async () => { + await new Promise((resolve) => { + let totalHeight = 0; + console.log('autoScroll...') + const distance = 100; + const timer = setInterval(() => { + window.scrollBy(0, distance); + totalHeight += distance; + + if (totalHeight >= document.body.scrollHeight) { + clearInterval(timer); + resolve(); + } + }, 40); + + + }); + }); + console.log(' FINE: autoScroll...') + } + + async generatePdfFromUrl(url, filenameOut, options = {}) { + if (!this.browser) { + throw new Error('Browser non avviato. Chiama launch() prima.'); + } + + const page = await this.browser.newPage(); + + try { + await page.goto(url, { waitUntil: 'networkidle0' }); + await tools.attendiNSecondi(5); + await page.waitForSelector('#q-notify', { timeout: 60000 }); + + await this.autoScroll(page); + + await tools.attendiNSecondi(5); + + + // Seleziona tutte le sezioni da stampare + let sectionHandles = await page.$$('.pdf-section'); + let numTentativi = 0; + const maxTentativi = 3; + while (sectionHandles.length === 0 && numTentativi < maxTentativi) { + console.log(`Nessuna sezione .pdf-section trovata nella pagina, quindi ASPETTO DI PIU ${numTentativi + 1}/${maxTentativi}`); + await tools.attendiNSecondi(5); + sectionHandles = await page.$$('.pdf-section'); + numTentativi++; + } + + if (sectionHandles.length === 0) { + throw new Error(`Nessuna sezione .pdf-section trovata nella pagina dopo ${maxTentativi} tentativi`); + } + + const pdfBuffers = []; + + for (const sectionHandle of sectionHandles) { + // Nascondi tutte le sezioni + await page.evaluate(() => { + document.querySelectorAll('.pdf-section').forEach((el) => (el.style.display = 'none')); + }); + + // Mostra solo la sezione corrente + await sectionHandle.evaluate((el) => (el.style.display = 'block')); + + // Calcola dimensioni della sezione + const { width, height } = await sectionHandle.evaluate((el) => ({ + width: el.scrollWidth, // piccolo padding + height: el.scrollHeight, // piccolo padding + })); + + console.log(`Larghezza: ${width}px, Altezza: ${height}px`); + + + // Imposta viewport dinamico + await page.setViewport({ width, height }); + + // Genera pdf buffer per questa pagina + const pdfBuffer = await page.pdf({ + printBackground: true, + width: `${width}px`, + height: `${height}px`, + margin: { top: '0', bottom: '0', left: '0', right: '0' }, + }); + + pdfBuffers.push(pdfBuffer); + } + + // Unisci tutti i PDF + const mergedPdf = await PDFDocument.create(); + + for (const pdfBytes of pdfBuffers) { + const pdf = await PDFDocument.load(pdfBytes); + const copiedPages = await mergedPdf.copyPages(pdf, pdf.getPageIndices()); + copiedPages.forEach((page) => mergedPdf.addPage(page)); + } + + const mergedPdfFile = await mergedPdf.save(); + + const finalFilePath = path.resolve(process.cwd(), filenameOut); + await fs.writeFile(finalFilePath, mergedPdfFile); + + // Ripristina tutte le sezioni visibili + await page.evaluate(() => { + document.querySelectorAll('.pdf-section').forEach((el) => (el.style.display = 'block')); + }); + + console.log(`PDF finale generato: ${finalFilePath}`); + + return finalFilePath; + } catch (error) { + console.error('Errore durante generazione PDF:', error); + throw error; + } finally { + await page.close(); + } + } + + async convertPDF_ChildProcess(inputFile, outputFile, widthpx, heightpx, compressionLevel = 'screen') { + const { spawn } = require('child_process'); + const path = require('path'); + + widthpx = widthpx * 2; + heightpx = heightpx * 2; + + console.log('=== CONVERSIONE CON CHILD_PROCESS E COMPRESSIONE ==='); + + // Verifica input + if (!(await tools.isFileExistsAsync(inputFile))) { + throw new Error(`File input non trovato: ${inputFile}`); + } + + // Assicurati che la directory output esista + const outputDir = path.dirname(outputFile); + const fs = require('fs').promises; + try { + await fs.mkdir(outputDir, { recursive: true }); + } catch (error) { + // Directory già esistente, ok + } + + // Parametri di compressione ottimizzati + const compressionSettings = { + /*maximum: [ + '-dPDFSETTINGS=/screen', + '-dDownsampleColorImages=true', + '-dColorImageResolution=72', + '-dDownsampleGrayImages=true', + '-dGrayImageResolution=72', + '-dDownsampleMonoImages=true', + '-dMonoImageResolution=72', + ], + high: [ + '-dPDFSETTINGS=/ebook', + '-dDownsampleColorImages=true', + '-dColorImageResolution=150', + '-dDownsampleGrayImages=true', + '-dGrayImageResolution=150', + ],*/ + printer: ['-dPDFSETTINGS=/printer', '-dDownsampleColorImages=true', '-dColorImageResolution=300'], + screen: [ + '-dPDFSETTINGS=/screen', + '-dDownsampleColorImages=true', + '-dColorImageResolution=96', + '-dDownsampleGrayImages=true', + '-dGrayImageResolution=96', + ], + }; + + return new Promise((resolve, reject) => { + const args = [ + '-sDEVICE=pdfwrite', + '-dCompatibilityLevel=1.4', + '-dNOPAUSE', + '-dQUIET', + '-dBATCH', + '-dSAFER', + + // Parametri di compressione + ...(compressionSettings[compressionLevel] || compressionSettings['screen']), + '-dCompressFonts=true', + '-dSubsetFonts=true', + '-dColorImageFilter=/DCTEncode', + '-dGrayImageFilter=/DCTEncode', + '-dEmbedAllFonts=true', + + // Dimensioni pagina + `-g${widthpx}x${heightpx}`, + '-dFIXEDMEDIA', + // '-dPDFFitPage', + + // Output + `-sOutputFile=${outputFile}`, + inputFile, + ]; + + console.log('Spawning gs with compression args:', args.join(' ')); + + const gsProcess = spawn('gs', args, { + stdio: ['ignore', 'pipe', 'pipe'], + shell: process.platform === 'win32', + }); + + let stdout = ''; + let stderr = ''; + + gsProcess.stdout.on('data', (data) => { + stdout += data.toString(); + if (stdout.length < 1000) { + // Evita log troppo lunghi + console.log('GS OUT:', data.toString().trim()); + } + }); + + gsProcess.stderr.on('data', (data) => { + stderr += data.toString(); + if (stderr.length < 1000) { + console.log('GS ERR:', data.toString().trim()); + } + }); + + gsProcess.on('close', async (code) => { + console.log(`GS process closed with code: ${code}`); + + if (code === 0) { + // Attendi e verifica + setTimeout(async () => { + try { + const exists = await tools.isFileExistsAsync(outputFile); + if (exists) { + // Verifica dimensioni per confermare compressione + try { + const originalStats = await tools.getFileStatsAsync(inputFile); + const newStats = await tools.getFileStatsAsync(outputFile); + const compressionRatio = (((originalStats.size - newStats.size) / originalStats.size) * 100).toFixed( + 1 + ); + + console.log(`📁 File originale: ${(originalStats.size / 1024 / 1024).toFixed(2)} MB`); + console.log(`📁 File compresso: ${(newStats.size / 1024 / 1024).toFixed(2)} MB`); + console.log(`🗜️ Compressione: ${compressionRatio}%`); + console.log('✅ SUCCESS: File generato e compresso'); + } catch (statsError) { + console.log('Warning: impossibile calcolare statistiche compressione'); + } + + resolve(outputFile); + } else { + console.log('❌ FAIL: File non generato nonostante exit code 0'); + reject(new Error('File non generato nonostante successo processo')); + } + } catch (error) { + reject(error); + } + }, 1000); + } else { + reject(new Error(`Ghostscript failed with code ${code}: ${stderr}`)); + } + }); + + gsProcess.on('error', (error) => { + console.log('GS process error:', error); + reject(new Error(`Failed to start Ghostscript: ${error.message}`)); + }); + }); + } + + async generatePdfFromUrls(urls, outputFilename) { + if (!this.browser) { + throw new Error('Browser non avviato. Chiama launch() prima.'); + } + const pdfBuffers = []; + + outputFilename = tools.getdirByIdApp(idapp) + '/'; + + try { + for (const url of urls) { + // ............ + } + + const mergedPdf = await PDFDocument.create(); + + for (const pdfBytes of pdfBuffers) { + const pdf = await PDFDocument.load(pdfBytes); + const copiedPages = await mergedPdf.copyPages(pdf, pdf.getPageIndices()); + copiedPages.forEach((page) => mergedPdf.addPage(page)); + } + + const mergedPdfFile = await mergedPdf.save(); + + const outputPath = path.resolve(process.cwd(), outputFilename); + await fs.writeFile(outputPath, mergedPdfFile); + + console.log(`PDF unito generato: ${outputPath}`); + return outputPath; + } catch (error) { + console.error('Errore durante la generazione PDF:', error); + throw error; + } + } + + async getPathByPage(idpage) { + const mypage = await MyPage.findById(idpage); + + if (mypage) { + return mypage.path; + } + + return ''; + } + + async generatePdfFromIdCatalog(options) { + try { + if (!options) { + console.error('Opzioni non passate !'); + return null; + } + let filenamerelative = ''; + let fullnamepath = ''; + let stampa = options.stampa; + + /*if (stampa) { + options.width = '227.3mm'; + options.height = '313.5mm'; + } else { + options.width = '210mm'; + options.height = '297mm'; + }*/ + + const catalog = await Catalog.findById(options.idCatalog); + if (catalog) { + const url = tools.getHostByIdApp(this.idapp) + '/cataloghi?id=' + catalog._id + '&stampa=' + (stampa ? '1' : '0'); + + if (url) { + const myfilenameout = await this.getPathByPage(catalog.idPageAssigned); + + + let addstr = (stampa) ? '_stampabile' : ''; + + filenamerelative = options.path + `${myfilenameout}${addstr}_generato.pdf`; + + fullnamepath = tools.getdirByIdApp(this.idapp) + '/' + filenamerelative; + await this.generatePdfFromUrl(url, fullnamepath, options); + } + } + + return {fileout: filenamerelative, filesize: await tools.getSizeFile(fullnamepath)}; + } catch (error) { + console.error('Errore durante la generazione del PDF dal catalogo ID:', error); + return {fileout: '', filesize: 0, error: 'Errore durante la generazione del PDF dal catalogo ID:' + error?.message}; + } + + return {fileout: '', filesize: 0 }; + } +} + +module.exports = GenPdf; diff --git a/src/server/router/admin_router.js b/src/server/router/admin_router.js index 89d7ab4..a4abd4b 100755 --- a/src/server/router/admin_router.js +++ b/src/server/router/admin_router.js @@ -60,6 +60,14 @@ const { exec } = require('child_process'); const execPromise = util.promisify(exec); +const GenPdf = require('../modules/GenPdf'); + +const genPdf = new GenPdf(); + +(async () => { + await genPdf.launch(); +})(); + async function updateProductInfo(recproductInfoAttuale, product, idapp, mycatstr) { if (!recproductInfoAttuale || !mycatstr) return recproductInfoAttuale; @@ -160,7 +168,7 @@ async function compressPdf(inputFile, outputFile, compressione) { } // Valori ammessi per -dPDFSETTINGS di Ghostscript - const validSettings = ['screen', 'ebook', 'printer', 'prepress', 'default']; + const validSettings = ['screen', 'printer', 'high', 'maximum']; if (!validSettings.includes(compressione)) { console.warn(`Compressione '${compressione}' non valida, uso 'ebook'`); compressione = 'ebook'; @@ -228,56 +236,204 @@ async function compressPdfWithPs2Pdf(inputFile, outputFile, compression = 'ebook } } -async function convertPDF_GS(inputFile, outputFile, width, height) { - // Verifica che il file di input esista - if (!(await tools.isFileExistsAsync(inputFile))) { - throw new Error(`Il file di input non esiste: ${inputFile}`); - } - - // Converti cm in punti (1 cm = 28.34646 punti) - const widthPt = width * 28.34646; - const heightPt = height * 28.34646; - - // Arrotonda i valori - const widthPx = Math.round(widthPt); - const heightPx = Math.round(heightPt); - - // Comando Ghostscript - const gsCommand = [ - '-sDEVICE=pdfwrite', - '-dCompatibilityLevel=1.4', - '-dPDFSETTINGS=/prepress', - '-dNOPAUSE', - '-dQUIET', - '-dBATCH', - `-dDEVICEWIDTHPOINTS=${widthPx}`, - `-dDEVICEHEIGHTPOINTS=${heightPx}`, - '-dDPIx=300', - '-dDPIy=300', - `-sOutputFile=${outputFile}`, - inputFile, - ].join(' '); - +// DIAGNOSI COMPLETA DEL PROBLEMA +async function diagnosePDFProblem() { + console.log('=== DIAGNOSI COMPLETA SISTEMA ==='); + + // 1. Test ambiente Node.js + console.log('Node.js version:', process.version); + console.log('Platform:', process.platform); + console.log('Architecture:', process.arch); + console.log('Current working directory:', process.cwd()); + + // 2. Test moduli disponibili try { - console.log(gsCommand); - await gs.executeSync(gsCommand); // Assicurati che executeSync restituisca una promessa o usa la funzione corretta se è sincrona. - console.log('Conversione completata con successo!'); - - // Verifica che il file di output sia stato generato - if (await tools.isFileExistsAsync(outputFile)) { - console.log('File di output generato:', outputFile); - } else { - console.error('Il File di output NON è stato generato! :', outputFile); - } + console.log('Testing gs module...'); + console.log('gs object:', typeof gs, Object.keys(gs || {})); } catch (error) { - if (error.code === 'ENOENT') { - throw new Error(`Il file di input non esiste: ${inputFile}`); - } else if (error instanceof gs.GhostscriptError) { - throw new Error(`Errore Ghostscript: ${error.message}`); - } else { - throw new Error(`Errore durante la conversione: ${error.message}`); - } + console.log('gs module error:', error.message); } + + // 3. Test comando di sistema + const { exec } = require('child_process'); + const util = require('util'); + const execAsync = util.promisify(exec); + + try { + console.log('Testing gs command from system...'); + const { stdout, stderr } = await execAsync('gs -version'); + console.log('GS Version stdout:', stdout); + console.log('GS Version stderr:', stderr); + } catch (error) { + console.log('System gs command failed:', error.message); + } + + // 4. Test scrittura file + const fs = require('fs').promises; + const path = require('path'); + const testFile = path.join(process.cwd(), 'test_write.txt'); + + try { + await fs.writeFile(testFile, 'test content'); + console.log('File write test: SUCCESS'); + await fs.unlink(testFile); + } catch (error) { + console.log('File write test: FAILED -', error.message); + } +} + + +// ALTERNATIVA 1: Usando child_process direttamente +async function convertPDF_ChildProcess(inputFile, outputFile, width, height, compressionLevel = 'screen') { + const { spawn } = require('child_process'); + const path = require('path'); + + console.log('=== CONVERSIONE CON CHILD_PROCESS E COMPRESSIONE ==='); + + // Verifica input + if (!(await tools.isFileExistsAsync(inputFile))) { + throw new Error(`File input non trovato: ${inputFile}`); + } + + // Assicurati che la directory output esista + const outputDir = path.dirname(outputFile); + const fs = require('fs').promises; + try { + await fs.mkdir(outputDir, { recursive: true }); + } catch (error) { + // Directory già esistente, ok + } + + // const widthPt = Math.round(width * 28.34646); + // const heightPt = Math.round(height * 28.34646); + const widthPt = Math.round(width * 28.34646* 10); + const heightPt = Math.round(height * 28.34646 * 10); + + // Parametri di compressione ottimizzati + const compressionSettings = { + 'maximum': [ + '-dPDFSETTINGS=/screen', + '-dDownsampleColorImages=true', + '-dColorImageResolution=72', + '-dDownsampleGrayImages=true', + '-dGrayImageResolution=72', + '-dDownsampleMonoImages=true', + '-dMonoImageResolution=72' + ], + 'high': [ + '-dPDFSETTINGS=/ebook', + '-dDownsampleColorImages=true', + '-dColorImageResolution=150', + '-dDownsampleGrayImages=true', + '-dGrayImageResolution=150' + ], + 'printer': [ + '-dPDFSETTINGS=/printer', + '-dDownsampleColorImages=true', + '-dColorImageResolution=300' + ], + 'screen': [ + '-dPDFSETTINGS=/screen', + '-dDownsampleColorImages=true', + '-dColorImageResolution=96', + '-dDownsampleGrayImages=true', + '-dGrayImageResolution=96' + ] + }; + + return new Promise((resolve, reject) => { + const args = [ + '-sDEVICE=pdfwrite', + '-dCompatibilityLevel=1.4', + '-dNOPAUSE', + '-dQUIET', + '-dBATCH', + '-dSAFER', + + // Parametri di compressione + ...compressionSettings[compressionLevel] || compressionSettings['screen'], + '-dCompressFonts=true', + '-dSubsetFonts=true', + '-dColorImageFilter=/DCTEncode', + '-dGrayImageFilter=/DCTEncode', + '-dEmbedAllFonts=true', + + // Dimensioni pagina + `-g${widthPt}x${heightPt}`, + '-dFIXEDMEDIA', + // '-dPDFFitPage', + + // Output + `-sOutputFile=${outputFile}`, + inputFile + ]; + + console.log('Spawning gs with compression args:', args.join(' ')); + + const gsProcess = spawn('gs', args, { + stdio: ['ignore', 'pipe', 'pipe'], + shell: process.platform === 'win32' + }); + + let stdout = ''; + let stderr = ''; + + gsProcess.stdout.on('data', (data) => { + stdout += data.toString(); + if (stdout.length < 1000) { // Evita log troppo lunghi + console.log('GS OUT:', data.toString().trim()); + } + }); + + gsProcess.stderr.on('data', (data) => { + stderr += data.toString(); + if (stderr.length < 1000) { + console.log('GS ERR:', data.toString().trim()); + } + }); + + gsProcess.on('close', async (code) => { + console.log(`GS process closed with code: ${code}`); + + if (code === 0) { + // Attendi e verifica + setTimeout(async () => { + try { + const exists = await tools.isFileExistsAsync(outputFile); + if (exists) { + // Verifica dimensioni per confermare compressione + try { + const originalStats = await tools.getFileStatsAsync(inputFile); + const newStats = await tools.getFileStatsAsync(outputFile); + const compressionRatio = ((originalStats.size - newStats.size) / originalStats.size * 100).toFixed(1); + + console.log(`📁 File originale: ${(originalStats.size / 1024 / 1024).toFixed(2)} MB`); + console.log(`📁 File compresso: ${(newStats.size / 1024 / 1024).toFixed(2)} MB`); + console.log(`🗜️ Compressione: ${compressionRatio}%`); + console.log('✅ SUCCESS: File generato e compresso'); + } catch (statsError) { + console.log('Warning: impossibile calcolare statistiche compressione'); + } + + resolve(outputFile); + } else { + console.log('❌ FAIL: File non generato nonostante exit code 0'); + reject(new Error('File non generato nonostante successo processo')); + } + } catch (error) { + reject(error); + } + }, 1000); + } else { + reject(new Error(`Ghostscript failed with code ${code}: ${stderr}`)); + } + }); + + gsProcess.on('error', (error) => { + console.log('GS process error:', error); + reject(new Error(`Failed to start Ghostscript: ${error.message}`)); + }); + }); } async function extractPdfInfo(inputFile) { @@ -436,9 +592,11 @@ async function ConvertPDF_Generatore(options, instampa) { if (options.compressione) { const mostrainfo = true; fileout_compressed = tools.removeFileExtension(fileout) + `_compressed.pdf`; + await diagnosePDFProblem(); // await compressPdf(fileout, fileout_compressed, options.compressione); - await compressPdfWithPs2Pdf(fileout, fileout_compressed, options.compressione); + // await compressPdfWithPs2Pdf(fileout, fileout_compressed, options.compressione); + await convertPDF_ChildProcess(fileout, fileout_compressed, options.width, options.height, options.compressione); // if (mostrainfo) extractPdfInfo(fileout_compressed); } @@ -2489,4 +2647,21 @@ router.post('/miab', authenticate, async (req, res) => { } }); +router.post('/generate-pdf', async (req, res) => { + const { url, filename } = req.body; + + if (!url || !filename) { + return res.status(400).json({ error: 'url e filename sono richiesti' }); + } + + try { + const pdfPath = await genPdf.generatePdfFromUrl(url, filename); + res.download(pdfPath); + } catch (error) { + console.error('Errore generazione PDF:', error); + res.status(500).json({ error: 'Errore generazione PDF' }); + } +}); + + module.exports = router; diff --git a/src/server/router/index_router.js b/src/server/router/index_router.js index 69851a9..dbebd14 100755 --- a/src/server/router/index_router.js +++ b/src/server/router/index_router.js @@ -2019,7 +2019,7 @@ async function load(req, res, version = '0') { const { data, totalTime, slowCalls } = await measurePromises(promises); // console.log('Risultati delle promise:', data); - console.log('Tempo di esecuzione:', totalTime, 'secondi'); + // console.log('Tempo di esecuzione:', totalTime, 'secondi'); //console.log('Le 10 chiamate più lente:', slowCalls); // Aggiornamento delle informazioni dell'utente, se presente @@ -2276,68 +2276,63 @@ router.post('/upload_from_other_server/:dir', authenticate, (req, res) => { }); // Funzione principale che gestisce l'upload -async function uploadFile(req, res, version, options) { - quality = options?.quality || 'original'; - const dir = tools.invertescapeslash(req.params.dir); +async function uploadFile(req, res, version, options = {}) { + const quality = options.quality || 'original'; + const dirParam = req.params.dir || ''; + const dir = tools.invertescapeslash(dirParam); const idapp = req.user.idapp; - const form = new formidable.IncomingForm(); - form.parse(req); + // Determina la cartella base + const dirmain = version > 0 && tools.sulServer() ? '' : server_constants.DIR_PUBLIC_LOCALE; + const baseUploadFolder = tools.getdirByIdApp(idapp) + dirmain + server_constants.DIR_UPLOAD; - let dirmain = version > 0 && tools.sulServer() ? '' : server_constants.DIR_PUBLIC_LOCALE; - const mydir2 = folder + '/' + dir; - tools.mkdirpath(mydir2); - form.uploadDir = mydir2; + // Directory di upload specifica + const uploadDir = path.join(baseUploadFolder, dir); try { - form.on('fileBegin', async function (name, file) { - console.log('1) Uploading ' + file.originalFilename); - const mydir = folder + '/' + file.newFilename; - file.path = mydir; + // Crea la cartella se non esiste + await tools.mkdirpath(uploadDir); + + // Configura formidable + const form = new formidable.IncomingForm({ uploadDir }); + + // Promisifica il parsing per usare await + const files = await new Promise((resolve, reject) => { + form.parse(req, (err, fields, files) => { + if (err) reject(err); + else resolve(files); + }); }); - form.on('file', async function (name, file) { - try { - console.log('2) Uploading ' + file.originalFilename); - const mydir = tools.getdirByIdApp(idapp) + dirmain + server_constants.DIR_UPLOAD + '/' + dir; - await tools.mkdirpath(mydir); + // files può contenere uno o più file: gestiamo uno per semplicità + for (const key in files) { + if (Object.prototype.hasOwnProperty.call(files, key)) { + const file = files[key]; - file.name = file.originalFilename; - const resized_img = mydir + server_constants.PREFIX_IMG + file.originalFilename; - const oldpath = file.newFilename; - const fromfile = '.' + server_constants.DIR_UPLOAD + '/' + dir + '/' + oldpath; - const tofile = '.' + server_constants.DIR_UPLOAD + '/' + dir + '/' + file.originalFilename; + console.log('File ricevuto:', file[0].originalFilename); - + const oldFIle = file[0].filepath || file[0].path; - // Copia del file - await moveFile(fromfile, tofile, res); + // Nuovo percorso per il file rinominato + const newFilePath = path.join(uploadDir, file[0].originalFilename); - // Ridimensionamento immagine - await handleImageResizing(tofile, quality); + // Sposta e rinomina il file (move è la funzione ottimizzata) + // await move(file[0].filepath || file[0].path, newFilePath); + await tools.move(oldFIle, newFilePath); - res.end(); - } catch (e) { - console.log('Error during file processing: ', e); - res.status(400).send(); + // Eventuale ridimensionamento immagine + await handleImageResizing(newFilePath, quality); + + console.log(`File processato e salvato in: ${newFilePath}`); } - }); + } - form.on('end', function () { - console.log('-> Upload completed'); - }); - - form.on('aborted', () => { - console.error('Request aborted by the user'); - res.status(400).send(); - }); - - form.on('error', (err) => { - console.error('Error Uploading', err?.message); - res.status(400).send(); - }); - } catch (e) { - console.log('Error', e); + res.status(200).send('Upload completato con successo'); + } catch (err) { + console.error('Errore durante uploadFile:', err); + if (!res.headersSent) { + res.status(500).send("Errore durante l'upload"); + } } } @@ -2345,7 +2340,7 @@ async function uploadFile(req, res, version, options) { async function moveFile(fromfile, tofile, res) { console.log('Moving file from ' + fromfile + ' to ' + tofile); try { - if (!tools.sulServer()) { + if (false && !tools.sulServer()) { console.log('Copying file (locally):', fromfile, 'to', tofile); await tools.execScriptNoOutput("sudo cp -R '" + fromfile + "' '" + tofile + "'"); res.end(); @@ -2367,7 +2362,7 @@ async function handleImageResizing(filePath, quality) { try { // Ridimensionamento per la qualità "small" - + if (quality === 'small' || quality === 'both') { await resizeImage(filePath, resizedSmallPath, 64, 64); } diff --git a/src/server/tools/general.js b/src/server/tools/general.js index c7f99ea..fa01537 100755 --- a/src/server/tools/general.js +++ b/src/server/tools/general.js @@ -3948,45 +3948,58 @@ module.exports = { this.writelogfile(mystr, FILENAVE); }, - async move(oldPath, newPath, callback) { - try { - const ris = await fs.promises.rename(oldPath, newPath); - console.log('... File Rinominato:', oldPath, 'in:', newPath, 'ris', ris); - callback(); // Chiamare il callback senza errori - } catch (err) { - if (err.code === 'EXDEV') { - await copy(); // Se EXDEV, utilizza la funzione copy - } else { - console.error('Errore durante lo spostamento:', err); - callback(err); // Passa l'errore al callback - } - } + async copyFile(src, dest) { + return new Promise((resolve, reject) => { + const readStream = fs.createReadStream(src); + const writeStream = fs.createWriteStream(dest); - async function copy() { - const readStream = fs.createReadStream(oldPath); - const writeStream = fs.createWriteStream(newPath); - - readStream.on('error', (err) => { - console.error('Errore nella lettura del file:', err); - callback(err); // Passa l'errore al callback - }); - writeStream.on('error', (err) => { - console.error('Errore nella scrittura del file:', err); - callback(err); // Passa l'errore al callback - }); + readStream.on('error', reject); + writeStream.on('error', reject); + writeStream.on('finish', resolve); readStream.pipe(writeStream); + }); + }, - writeStream.on('finish', async () => { - console.log('File copiato, ora rimuovo il file di origine:', oldPath); - try { - await fs.promises.unlink(oldPath); // Rimuovi il file originale - callback(); // Chiama il callback al termine - } catch (err) { - console.error('Errore nella rimozione del file originale:', err); - callback(err); // Passa l'errore al callback + /** + * Sposta un file da oldPath a newPath. + * Se rename fallisce con EXDEV (diverso device), fa copia + delete. + * Se la cartella di destinazione non esiste, la crea. + * @param {string} oldPath + * @param {string} newPath + * @param {(err?: Error) => void} [callback] - opzionale, se non passato ritorna Promise + */ + async move(oldPath, newPath, callback) { + const moveOp = async () => { + // Assicurati che la cartella di destinazione esista + const dir = path.dirname(newPath); + await fs.promises.mkdir(dir, { recursive: true }); + + try { + const newOldPath = oldPath.replace(/\/$/, ''); + const newNewPath = newPath.replace(/\/$/, ''); + await fs.promises.rename(newOldPath, newNewPath); + console.log(`File spostato: ${oldPath} -> ${newPath}`); + } catch (err) { + if (err.code === 'EXDEV') { + // Spostamento tra device diversi: copia + elimina + await copyFile(oldPath, newPath); + await fs.promises.unlink(oldPath); + console.log(`File copiato e cancellato: ${oldPath} -> ${newPath}`); + } else if (err.code === 'ENOENT') { + throw new Error(`File non trovato: ${oldPath}`); + } else { + throw err; } - }); + } + }; + + if (callback && typeof callback === 'function') { + moveOp() + .then(() => callback()) + .catch(callback); + } else { + return moveOp(); } }, @@ -5744,13 +5757,24 @@ module.exports = { return 'upload/'; }, + getDirByTable(idapp, table) { + let mydir = this.getdirByIdApp(idapp) + '/'; + + if (table === 'catalog') { + mydir = 'upload/cataloghi/'; + } + + return mydir; + + }, + getURLImg(idapp, table, username, img, checkifExist) { let dirmain = ''; try { // let dir = this.getdirByIdApp(idapp) + dirmain + '/' + this.getDirUpload(); let dir = - this.getHostByIdApp(idapp) + + this.getdirByIdApp(idapp) '/' + this.getDirUpload() + shared_consts.getDirectoryImgByTable(table, username) + @@ -6159,4 +6183,8 @@ module.exports = { const nuovoNomeFile = nomeFile + suffisso + estensione; return path.join(dir, nuovoNomeFile); }, + + async attendiNSecondi(numsec) { + await new Promise(resolve => setTimeout(resolve, numsec * 1000)); + } }; diff --git a/yarn.lock b/yarn.lock index 7c00bda..3c738dd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1013,6 +1013,19 @@ resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== +"@puppeteer/browsers@2.10.5": + version "2.10.5" + resolved "https://registry.yarnpkg.com/@puppeteer/browsers/-/browsers-2.10.5.tgz#dddb8f8716ae6364f6f2d31125e76f311dd4a49d" + integrity sha512-eifa0o+i8dERnngJwKrfp3dEq7ia5XFyoqB17S4gK8GhsQE4/P8nxOfQSE0zQHxzzLo/cmF+7+ywEQ7wK7Fb+w== + dependencies: + debug "^4.4.1" + extract-zip "^2.0.1" + progress "^2.0.3" + proxy-agent "^6.5.0" + semver "^7.7.2" + tar-fs "^3.0.8" + yargs "^17.7.2" + "@selderee/plugin-htmlparser2@^0.11.0": version "0.11.0" resolved "https://registry.yarnpkg.com/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.11.0.tgz#d5b5e29a7ba6d3958a1972c7be16f4b2c188c517" @@ -1050,6 +1063,11 @@ resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz#821f8442f4175d8f0467b9daf26e3a18e2d02af2" integrity sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA== +"@tootallnate/quickjs-emscripten@^0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz#db4ecfd499a9765ab24002c3b696d02e6d32a12c" + integrity sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA== + "@types/babel__core@^7.1.14": version "7.20.5" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" @@ -1193,6 +1211,13 @@ dependencies: "@types/yargs-parser" "*" +"@types/yauzl@^2.9.1": + version "2.10.3" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.3.tgz#e9b2808b4f109504a03cda958259876f61017999" + integrity sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q== + dependencies: + "@types/node" "*" + abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" @@ -1495,6 +1520,13 @@ assign-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== +ast-types@^0.13.4: + version "0.13.4" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.4.tgz#ee0d77b343263965ecc3fb62da16e7222b2b6782" + integrity sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w== + dependencies: + tslib "^2.0.1" + async-done@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/async-done/-/async-done-2.0.0.tgz#f1ec5df738c6383a52b0a30d0902fd897329c15a" @@ -1653,11 +1685,39 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -bare-events@^2.2.0: +bare-events@^2.2.0, bare-events@^2.5.4: version "2.5.4" resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.5.4.tgz#16143d435e1ed9eafd1ab85f12b89b3357a41745" integrity sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA== +bare-fs@^4.0.1: + version "4.1.5" + resolved "https://registry.yarnpkg.com/bare-fs/-/bare-fs-4.1.5.tgz#1d06c076e68cc8bf97010d29af9e3ac3808cdcf7" + integrity sha512-1zccWBMypln0jEE05LzZt+V/8y8AQsQQqxtklqaIyg5nu6OAYFhZxPXinJTSG+kU5qyNmeLgcn9AW7eHiCHVLA== + dependencies: + bare-events "^2.5.4" + bare-path "^3.0.0" + bare-stream "^2.6.4" + +bare-os@^3.0.1: + version "3.6.1" + resolved "https://registry.yarnpkg.com/bare-os/-/bare-os-3.6.1.tgz#9921f6f59edbe81afa9f56910658422c0f4858d4" + integrity sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g== + +bare-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bare-path/-/bare-path-3.0.0.tgz#b59d18130ba52a6af9276db3e96a2e3d3ea52178" + integrity sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw== + dependencies: + bare-os "^3.0.1" + +bare-stream@^2.6.4: + version "2.6.5" + resolved "https://registry.yarnpkg.com/bare-stream/-/bare-stream-2.6.5.tgz#bba8e879674c4c27f7e27805df005c15d7a2ca07" + integrity sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA== + dependencies: + streamx "^2.21.0" + base64-js@^1.3.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" @@ -1668,7 +1728,7 @@ base64id@2.0.0, base64id@~2.0.0: resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== -basic-ftp@^5.0.5: +basic-ftp@^5.0.2, basic-ftp@^5.0.5: version "5.0.5" resolved "https://registry.yarnpkg.com/basic-ftp/-/basic-ftp-5.0.5.tgz#14a474f5fffecca1f4f406f1c26b18f800225ac0" integrity sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg== @@ -1904,6 +1964,11 @@ bson@^6.10.3: resolved "https://registry.yarnpkg.com/bson/-/bson-6.10.3.tgz#5f9a463af6b83e264bedd08b236d1356a30eda47" integrity sha512-MTxGsqgYTwfshYWTRdmZRC+M7FnG1b4y7RO7p2k3X24Wq0yv1m77Wsj0BzlPzd/IowgESfsruQCUToa7vbOpPQ== +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== + buffer-equal-constant-time@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" @@ -2139,6 +2204,14 @@ chownr@^1.1.4: resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== +chromium-bidi@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-5.1.0.tgz#8d0e47f7ac9270262df29792318dd5378e983e62" + integrity sha512-9MSRhWRVoRPDG0TgzkHrshFSJJNZzfY5UFqUMuksg7zL1yoZIZ3jLB0YAgHclbiAxPI86pBnwDX1tbzoiV8aFw== + dependencies: + mitt "^3.0.1" + zod "^3.24.1" + ci-info@^3.2.0, ci-info@^3.8.0: version "3.9.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" @@ -2416,6 +2489,16 @@ cors@^2.8.5, cors@~2.8.5: object-assign "^4" vary "^1" +cosmiconfig@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-9.0.0.tgz#34c3fc58287b915f3ae905ab6dc3de258b55ad9d" + integrity sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg== + dependencies: + env-paths "^2.2.1" + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" + country-codes-list@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/country-codes-list/-/country-codes-list-2.0.0.tgz#162c49028a0a9fe64503ed146980e0bb8529c170" @@ -2552,11 +2635,6 @@ csurf@^1.11.0: csrf "3.1.0" http-errors "~1.7.3" -csv-writer@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/csv-writer/-/csv-writer-1.6.0.tgz#d0cea44b6b4d7d3baa2ecc6f3f7209233514bcf9" - integrity sha512-NOx7YDFWEsM/fTRAJjRpPp8t+MKRVvniAg9wQlUKx20MFrPs73WLJhFf5iteqrxNYnsy924K3Iroh3yNHeYd2g== - dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" @@ -2564,6 +2642,11 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" +data-uri-to-buffer@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz#8a58bb67384b261a38ef18bea1810cb01badd28b" + integrity sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw== + data-urls@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-5.0.0.tgz#2f76906bce1824429ffecb6920f45a0b30f00dde" @@ -2620,6 +2703,13 @@ debug@^3.1.0, debug@^3.2.6, debug@^3.2.7: dependencies: ms "^2.1.1" +debug@^4.4.1: + version "4.4.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b" + integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== + dependencies: + ms "^2.1.3" + debug@~4.3.1, debug@~4.3.2, debug@~4.3.4: version "4.3.7" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" @@ -2693,6 +2783,15 @@ define-properties@^1.2.1: has-property-descriptors "^1.0.0" object-keys "^1.1.1" +degenerator@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-5.0.1.tgz#9403bf297c6dad9a1ece409b37db27954f91f2f5" + integrity sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ== + dependencies: + ast-types "^0.13.4" + escodegen "^2.1.0" + esprima "^4.0.1" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -2748,6 +2847,11 @@ dev-ip@^1.0.1: resolved "https://registry.yarnpkg.com/dev-ip/-/dev-ip-1.0.1.tgz#a76a3ed1855be7a012bb8ac16cb80f3c00dc28f0" integrity sha512-LmVkry/oDShEgSZPNgqCIp2/TlqtExeGmymru3uCELnfyjY11IzpAproLYs+1X88fXO6DBoYP3ul2Xo2yz2j6A== +devtools-protocol@0.0.1439962: + version "0.0.1439962" + resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1439962.tgz#395c5ca1cd83aa451c667056a025f9873c4598c1" + integrity sha512-jJF48UdryzKiWhJ1bLKr7BFWUQCEIT5uCNbDLqkQJBtkFxYzILJH44WN0PDKMIlGDN7Utb8vyUY85C3w4R/t2g== + dezalgo@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.4.tgz#751235260469084c132157dfa857f386d4c33d81" @@ -3099,6 +3203,11 @@ entities@^6.0.0: resolved "https://registry.yarnpkg.com/entities/-/entities-6.0.0.tgz#09c9e29cb79b0a6459a9b9db9efb418ac5bb8e51" integrity sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw== +env-paths@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" @@ -3251,12 +3360,23 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +escodegen@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionalDependencies: + source-map "~0.6.1" + esprima@^1.2.0: version "1.2.5" resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.2.5.tgz#0993502feaf668138325756f30f9a51feeec11e9" integrity sha512-S9VbPDU0adFErpDai3qDkjq8+G05ONtKzcyNrPKg/ZKa+tf879nX2KexNU95b31UoTJjRLInNBHHHjFPoCd7lQ== -esprima@^4.0.0: +esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== @@ -3266,6 +3386,16 @@ estraverse@^1.5.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" integrity sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA== +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + etag@1.8.1, etag@^1.8.1, etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" @@ -3425,6 +3555,17 @@ extract-css@^2.0.0: list-stylesheets "^1.2.10" style-data "^1.4.8" +extract-zip@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" + integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== + dependencies: + debug "^4.1.1" + get-stream "^5.1.0" + yauzl "^2.10.0" + optionalDependencies: + "@types/yauzl" "^2.9.1" + extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" @@ -3450,7 +3591,7 @@ fast-deep-equal@^3.1.1: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-fifo@^1.3.2: +fast-fifo@^1.2.0, fast-fifo@^1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== @@ -3496,6 +3637,13 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== + dependencies: + pend "~1.2.0" + file-type@^3.1.0, file-type@^3.9.0: version "3.9.0" resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9" @@ -3829,6 +3977,13 @@ get-stream@^3.0.0: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" integrity sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ== +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + get-stream@^6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" @@ -3843,6 +3998,15 @@ get-symbol-description@^1.1.0: es-errors "^1.3.0" get-intrinsic "^1.2.6" +get-uri@^6.0.1: + version "6.0.4" + resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-6.0.4.tgz#6daaee9e12f9759e19e55ba313956883ef50e0a7" + integrity sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ== + dependencies: + basic-ftp "^5.0.2" + data-uri-to-buffer "^6.0.2" + debug "^4.3.4" + getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" @@ -4252,7 +4416,7 @@ http-errors@~1.7.3: statuses ">= 1.5.0 < 2" toidentifier "1.0.0" -http-proxy-agent@^7.0.0, http-proxy-agent@^7.0.2: +http-proxy-agent@^7.0.0, http-proxy-agent@^7.0.1, http-proxy-agent@^7.0.2: version "7.0.2" resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e" integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== @@ -4379,6 +4543,14 @@ immutable@^3: resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3" integrity sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg== +import-fresh@^3.3.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" + integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + import-local@^3.0.2: version "3.2.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.2.0.tgz#c3d5c745798c02a6f8b897726aba5100186ee260" @@ -4449,6 +4621,14 @@ interpret@^3.1.1: resolved "https://registry.yarnpkg.com/interpret/-/interpret-3.1.1.tgz#5be0ceed67ca79c6c4bc5cf0d7ee843dcea110c4" integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== +ip-address@^9.0.5: + version "9.0.5" + resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-9.0.5.tgz#117a960819b08780c3bd1f14ef3c1cc1d3f3ea5a" + integrity sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g== + dependencies: + jsbn "1.1.0" + sprintf-js "^1.1.3" + ip-regex@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-1.0.3.tgz#dc589076f659f419c222039a33316f1c7387effd" @@ -5368,6 +5548,11 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" +jsbn@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" + integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== + jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" @@ -5802,6 +5987,11 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" +lru-cache@^7.14.1: + version "7.18.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" + integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== + mailparser@^3.7.1: version "3.7.2" resolved "https://registry.yarnpkg.com/mailparser/-/mailparser-3.7.2.tgz#00feec656e23c0ae805163581b460c2f72ca75d1" @@ -6020,6 +6210,11 @@ mitt@^1.1.3: resolved "https://registry.yarnpkg.com/mitt/-/mitt-1.2.0.tgz#cb24e6569c806e31bd4e3995787fe38a04fdf90d" integrity sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw== +mitt@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/mitt/-/mitt-3.0.1.tgz#ea36cf0cc30403601ae074c8f77b7092cdab36d1" + integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw== + mkdirp@0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" @@ -6204,6 +6399,11 @@ negotiator@0.6.3: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== +netmask@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/netmask/-/netmask-2.0.2.tgz#8b01a07644065d536383835823bc52004ebac5e7" + integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg== + nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" @@ -6632,6 +6832,28 @@ p-wait-for@3.2.0: dependencies: p-timeout "^3.0.0" +pac-proxy-agent@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz#9cfaf33ff25da36f6147a20844230ec92c06e5df" + integrity sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA== + dependencies: + "@tootallnate/quickjs-emscripten" "^0.23.0" + agent-base "^7.1.2" + debug "^4.3.4" + get-uri "^6.0.1" + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.6" + pac-resolver "^7.0.1" + socks-proxy-agent "^8.0.5" + +pac-resolver@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-7.0.1.tgz#54675558ea368b64d210fd9c92a640b5f3b8abb6" + integrity sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg== + dependencies: + degenerator "^5.0.0" + netmask "^2.0.2" + package-json-from-dist@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" @@ -6642,6 +6864,13 @@ pako@^1.0.10, pako@^1.0.11, pako@^1.0.6: resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + parse-bmfont-ascii@^1.0.3: version "1.0.6" resolved "https://registry.yarnpkg.com/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz#11ac3c3ff58f7c2020ab22769079108d4dfa0285" @@ -6831,6 +7060,11 @@ pem@^1.14.8: os-tmpdir "^1.0.2" which "^2.0.2" +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== + performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" @@ -6957,6 +7191,11 @@ process@^0.11.10: resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== +progress@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + promise@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/promise/-/promise-6.1.0.tgz#2ce729f6b94b45c26891ad0602c5c90e04c6eef6" @@ -6994,6 +7233,20 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" +proxy-agent@^6.5.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-6.5.0.tgz#9e49acba8e4ee234aacb539f89ed9c23d02f232d" + integrity sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A== + dependencies: + agent-base "^7.1.2" + debug "^4.3.4" + http-proxy-agent "^7.0.1" + https-proxy-agent "^7.0.6" + lru-cache "^7.14.1" + pac-proxy-agent "^7.1.0" + proxy-from-env "^1.1.0" + socks-proxy-agent "^8.0.5" + proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" @@ -7122,6 +7375,14 @@ pump@^2.0.0: end-of-stream "^1.1.0" once "^1.3.1" +pump@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.2.tgz#836f3edd6bc2ee599256c924ffe0d88573ddcbf8" + integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + punycode.js@2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode.js/-/punycode.js-2.3.1.tgz#6b53e56ad75588234e79f4affa90972c7dd8cdb7" @@ -7132,6 +7393,30 @@ punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== +puppeteer-core@24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-24.9.0.tgz#fc489e83bf65db1dc72e53a78140ee567efd847e" + integrity sha512-HFdCeH/wx6QPz8EncafbCqJBqaCG1ENW75xg3cLFMRUoqZDgByT6HSueiumetT2uClZxwqj0qS4qMVZwLHRHHw== + dependencies: + "@puppeteer/browsers" "2.10.5" + chromium-bidi "5.1.0" + debug "^4.4.1" + devtools-protocol "0.0.1439962" + typed-query-selector "^2.12.0" + ws "^8.18.2" + +puppeteer@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-24.9.0.tgz#1d3f805e0170ca481b637a47c71a09b815594dae" + integrity sha512-L0pOtALIx8rgDt24Y+COm8X52v78gNtBOW6EmUcEPci0TYD72SAuaXKqasRIx4JXxmg2Tkw5ySKcpPOwN8xXnQ== + dependencies: + "@puppeteer/browsers" "2.10.5" + chromium-bidi "5.1.0" + cosmiconfig "^9.0.0" + devtools-protocol "0.0.1439962" + puppeteer-core "24.9.0" + typed-query-selector "^2.12.0" + pure-rand@^6.0.0: version "6.1.0" resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2" @@ -7406,6 +7691,11 @@ resolve-dir@^1.0.0, resolve-dir@^1.0.1: expand-tilde "^2.0.0" global-modules "^1.0.0" +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + resolve-from@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" @@ -7597,6 +7887,11 @@ semver@^7.5.3, semver@^7.5.4, semver@^7.6.3: resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f" integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== +semver@^7.7.2: + version "7.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58" + integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== + send@0.19.0: version "0.19.0" resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8" @@ -7865,6 +8160,11 @@ slick@^1.12.2: resolved "https://registry.yarnpkg.com/slick/-/slick-1.12.2.tgz#bd048ddb74de7d1ca6915faa4a57570b3550c2d7" integrity sha512-4qdtOGcBjral6YIBCWJ0ljFSKNLz9KkhbWtuGvUyRowl1kxfuE1x/Z/aJcaiilpb3do9bl5K7/1h9XC5wWpY/A== +smart-buffer@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + socket.io-adapter@~2.5.2: version "2.5.5" resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz#c7a1f9c703d7756844751b6ff9abfc1780664082" @@ -7904,6 +8204,23 @@ socket.io@^4.4.1: socket.io-adapter "~2.5.2" socket.io-parser "~4.2.4" +socks-proxy-agent@^8.0.5: + version "8.0.5" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz#b9cdb4e7e998509d7659d689ce7697ac21645bee" + integrity sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw== + dependencies: + agent-base "^7.1.2" + debug "^4.3.4" + socks "^2.8.3" + +socks@^2.8.3: + version "2.8.4" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.4.tgz#07109755cdd4da03269bda4725baa061ab56d5cc" + integrity sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ== + dependencies: + ip-address "^9.0.5" + smart-buffer "^4.2.0" + source-map-js@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" @@ -7929,7 +8246,7 @@ source-map@^0.5.1, source-map@~0.5.1: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== -source-map@^0.6.0, source-map@^0.6.1: +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -8072,7 +8389,7 @@ streamsearch@^1.1.0: resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== -streamx@^2.12.0, streamx@^2.12.5, streamx@^2.13.2, streamx@^2.14.0: +streamx@^2.12.0, streamx@^2.12.5, streamx@^2.13.2, streamx@^2.14.0, streamx@^2.15.0, streamx@^2.21.0: version "2.22.0" resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.22.0.tgz#cd7b5e57c95aaef0ff9b2aef7905afa62ec6e4a7" integrity sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw== @@ -8310,6 +8627,26 @@ symbol-tree@^3.2.4: resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== +tar-fs@^3.0.8: + version "3.0.9" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-3.0.9.tgz#d570793c6370d7078926c41fa422891566a0b617" + integrity sha512-XF4w9Xp+ZQgifKakjZYmFdkLoSWd34VGKcsTCwlNWM7QG3ZbaxnTsaBwnjFZqHRf/rROxaR8rXnbtwdvaDI+lA== + dependencies: + pump "^3.0.0" + tar-stream "^3.1.5" + optionalDependencies: + bare-fs "^4.0.1" + bare-path "^3.0.0" + +tar-stream@^3.1.5: + version "3.1.7" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-3.1.7.tgz#24b3fb5eabada19fe7338ed6d26e5f7c482e792b" + integrity sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ== + dependencies: + b4a "^1.6.4" + fast-fifo "^1.2.0" + streamx "^2.15.0" + tar@^4.4.13: version "4.4.19" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3" @@ -8506,7 +8843,7 @@ tslib@^1.11.1: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.2.0, tslib@^2.4.0, tslib@^2.6.2: +tslib@^2.0.1, tslib@^2.2.0, tslib@^2.4.0, tslib@^2.6.2: version "2.8.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== @@ -8591,6 +8928,11 @@ typed-array-length@^1.0.7: possible-typed-array-names "^1.0.0" reflect.getprototypeof "^1.0.6" +typed-query-selector@^2.12.0: + version "2.12.0" + resolved "https://registry.yarnpkg.com/typed-query-selector/-/typed-query-selector-2.12.0.tgz#92b65dbc0a42655fccf4aeb1a08b1dddce8af5f2" + integrity sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg== + typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" @@ -9144,6 +9486,11 @@ ws@^8.18.0: resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.1.tgz#ea131d3784e1dfdff91adb0a4a116b127515e3cb" integrity sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w== +ws@^8.18.2: + version "8.18.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.2.tgz#42738b2be57ced85f46154320aabb51ab003705a" + integrity sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ== + ws@~8.17.1: version "8.17.1" resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" @@ -9276,7 +9623,20 @@ yargs@~3.10.0: decamelize "^1.0.0" window-size "0.1.0" +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zod@^3.24.1: + version "3.25.32" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.25.32.tgz#769cc684072df780fc8f38130b0cd9283a8d3818" + integrity sha512-OSm2xTIRfW8CV5/QKgngwmQW/8aPfGdaQFlrGoErlgg/Epm7cjb6K6VEyExfe65a3VybUOnu381edLb0dfJl0g==