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==