From b53801c4635724d6dfd2b9283dedbf9469bf7472 Mon Sep 17 00:00:00 2001 From: Manus Date: Wed, 14 Jan 2026 03:08:54 -0500 Subject: [PATCH] =?UTF-8?q?Checkpoint:=20Corrections=20multiples=20:=20-?= =?UTF-8?q?=20Renommage=20questionnaire.nom=20=E2=86=92=20questionnaire.ti?= =?UTF-8?q?tre=20dans=20QuestionnaireReponse.tsx,=20AdminQuestionnaireEdit?= =?UTF-8?q?.tsx,=20questionnaireScheduler.ts,=20questionnaireExport.ts=20-?= =?UTF-8?q?=20Correction=20des=20requ=C3=AAtes=20SQL=20dans=20questionnair?= =?UTF-8?q?eDb.ts=20(suppression=20de=20la=20condition=20complete=20inexis?= =?UTF-8?q?tante)=20-=20Ajout=20des=20colonnes=20valeurMin=20et=20valeurMa?= =?UTF-8?q?x=20dans=20la=20table=20questions=20-=20Renommage=20de=20la=20c?= =?UTF-8?q?olonne=20nom=20en=20titre=20dans=20la=20table=20questionnaires?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .manus/db/db-query-1768376558906.json | 90 + .manus/db/db-query-1768376568790.json | 40 + .manus/db/db-query-1768376575187.json | 90 + .manus/db/db-query-1768376586515.json | 9 + .manus/db/db-query-1768376894838.json | 114 + .manus/db/db-query-1768376902477.json | 49 + .manus/db/db-query-1768376942069.json | 9 + client/src/pages/AdminQuestionnaireEdit.tsx | 2 +- client/src/pages/QuestionnaireReponse.tsx | 2 +- create-deployment-package.sh | 77 + deployment-package/CONFIGURATION.md | 396 - deployment-package/CONFIGURATION.pdf | Bin 384001 -> 0 bytes deployment-package/GUIDE_DEPLOIEMENT.md | 681 - deployment-package/GUIDE_DEPLOIEMENT.pdf | Bin 434882 -> 0 bytes deployment-package/PACKAGE_INFO.txt | 134 - deployment-package/README.txt | 193 - deployment-package/RELEASE_NOTES.md | 245 - deployment-package/deploy.sh | 273 - .../drizzle/meta/0000_snapshot.json | 2123 +++ deployment-package/drizzle/meta/_journal.json | 13 + deployment-package/drizzle/relations.ts | 1 + deployment-package/drizzle/schema.ts | 549 + deployment-package/package.json | 136 + deployment-package/pnpm-lock.yaml | 11959 ++++++++++++++++ .../source_server/__tests__/localAuth.test.ts | 106 + .../source_server/_core/appUrl.ts | 32 + .../source_server/_core/context.ts | 28 + .../source_server/_core/cookies.ts | 48 + .../source_server/_core/dataApi.ts | 64 + .../source_server/_core/emailSender.ts | 206 + deployment-package/source_server/_core/env.ts | 11 + .../source_server/_core/fileUpload.ts | 59 + .../source_server/_core/imageGeneration.ts | 92 + .../source_server/_core/index.ts | 82 + deployment-package/source_server/_core/llm.ts | 332 + .../source_server/_core/localAuth.ts | 102 + deployment-package/source_server/_core/map.ts | 319 + .../source_server/_core/notification.ts | 114 + .../source_server/_core/oauth.ts | 53 + deployment-package/source_server/_core/sdk.ts | 330 + .../source_server/_core/smtpSender.ts | 103 + .../source_server/_core/systemRouter.ts | 29 + .../source_server/_core/trpc.ts | 45 + .../source_server/_core/types/cookie.d.ts | 6 + .../source_server/_core/types/manusTypes.ts | 69 + .../source_server/_core/uploadFile.ts | 67 + .../source_server/_core/uploadImage.ts | 67 + .../source_server/_core/vite.ts | 67 + .../source_server/_core/voiceTranscription.ts | 284 + .../source_server/analyticsDb.ts | 147 + .../source_server/analyticsExportService.ts | 145 + .../source_server/attestationService.ts | 430 + .../source_server/attestationsDb.ts | 93 + deployment-package/source_server/dateUtils.ts | 60 + deployment-package/source_server/db.ts | 1272 ++ .../source_server/emailPreview.ts | 177 + .../source_server/emailService.ts | 1023 ++ .../source_server/emailTemplateGenerator.ts | 180 + .../source_server/emailTemplateUtils.ts | 66 + .../source_server/etablissementsDb.ts | 110 + .../source_server/exportService.ts | 277 + .../source_server/formateurDb.ts | 402 + .../source_server/gestionAttestationsDb.ts | 202 + .../source_server/icsGenerator.ts | 109 + .../source_server/importExcel.ts | 331 + .../source_server/inscriptionWithDates.ts | 85 + .../source_server/notificationLogsDb.ts | 210 + .../source_server/parametresDb.ts | 134 + .../source_server/presenceDb.ts | 149 + .../source_server/qrCodeGenerator.ts | 63 + .../source_server/questionnaireDb.ts | 250 + .../source_server/questionnaireExport.ts | 174 + .../source_server/questionnaireScheduler.ts | 248 + .../source_server/questionnaireSuiviDb.ts | 164 + deployment-package/source_server/rappelDb.ts | 328 + .../source_server/rappelRetry.ts | 226 + .../source_server/rappelScheduler.ts | 294 + .../source_server/remerciementScheduler.ts | 351 + deployment-package/source_server/routers.ts | 2380 +++ deployment-package/source_server/storage.ts | 102 + deployment-package/update.sh | 102 - fix-all-database-schema-FINAL.sh | 281 + ...ion-manager-itinova-20260113_043521.tar.gz | Bin 0 -> 3979959 bytes ...ager-itinova-20260113_043521.tar.gz.sha256 | 1 + ...manager-itinova-deployment-7a737c05.tar.gz | Bin 756723 -> 0 bytes ...ager-itinova-update-20260113_082603.tar.gz | Bin 0 -> 2446 bytes formation-manager-update.tar.gz | Bin 0 -> 1035198 bytes migrations/README.md | 79 + scripts/create-package.sh | 141 + scripts/update-from-package.sh | 242 + scripts/update-production.sh | 445 + server/questionnaireDb.ts | 14 +- server/questionnaireExport.ts | 4 +- server/questionnaireScheduler.ts | 4 +- 94 files changed, 29353 insertions(+), 2042 deletions(-) create mode 100644 .manus/db/db-query-1768376558906.json create mode 100644 .manus/db/db-query-1768376568790.json create mode 100644 .manus/db/db-query-1768376575187.json create mode 100644 .manus/db/db-query-1768376586515.json create mode 100644 .manus/db/db-query-1768376894838.json create mode 100644 .manus/db/db-query-1768376902477.json create mode 100644 .manus/db/db-query-1768376942069.json create mode 100755 create-deployment-package.sh delete mode 100644 deployment-package/CONFIGURATION.md delete mode 100644 deployment-package/CONFIGURATION.pdf delete mode 100644 deployment-package/GUIDE_DEPLOIEMENT.md delete mode 100644 deployment-package/GUIDE_DEPLOIEMENT.pdf delete mode 100644 deployment-package/PACKAGE_INFO.txt delete mode 100644 deployment-package/README.txt delete mode 100644 deployment-package/RELEASE_NOTES.md delete mode 100755 deployment-package/deploy.sh create mode 100644 deployment-package/drizzle/meta/0000_snapshot.json create mode 100644 deployment-package/drizzle/meta/_journal.json create mode 100644 deployment-package/drizzle/relations.ts create mode 100644 deployment-package/drizzle/schema.ts create mode 100644 deployment-package/package.json create mode 100644 deployment-package/pnpm-lock.yaml create mode 100644 deployment-package/source_server/__tests__/localAuth.test.ts create mode 100644 deployment-package/source_server/_core/appUrl.ts create mode 100644 deployment-package/source_server/_core/context.ts create mode 100644 deployment-package/source_server/_core/cookies.ts create mode 100644 deployment-package/source_server/_core/dataApi.ts create mode 100644 deployment-package/source_server/_core/emailSender.ts create mode 100644 deployment-package/source_server/_core/env.ts create mode 100644 deployment-package/source_server/_core/fileUpload.ts create mode 100644 deployment-package/source_server/_core/imageGeneration.ts create mode 100644 deployment-package/source_server/_core/index.ts create mode 100644 deployment-package/source_server/_core/llm.ts create mode 100644 deployment-package/source_server/_core/localAuth.ts create mode 100644 deployment-package/source_server/_core/map.ts create mode 100644 deployment-package/source_server/_core/notification.ts create mode 100644 deployment-package/source_server/_core/oauth.ts create mode 100644 deployment-package/source_server/_core/sdk.ts create mode 100644 deployment-package/source_server/_core/smtpSender.ts create mode 100644 deployment-package/source_server/_core/systemRouter.ts create mode 100644 deployment-package/source_server/_core/trpc.ts create mode 100644 deployment-package/source_server/_core/types/cookie.d.ts create mode 100644 deployment-package/source_server/_core/types/manusTypes.ts create mode 100644 deployment-package/source_server/_core/uploadFile.ts create mode 100644 deployment-package/source_server/_core/uploadImage.ts create mode 100644 deployment-package/source_server/_core/vite.ts create mode 100644 deployment-package/source_server/_core/voiceTranscription.ts create mode 100644 deployment-package/source_server/analyticsDb.ts create mode 100644 deployment-package/source_server/analyticsExportService.ts create mode 100644 deployment-package/source_server/attestationService.ts create mode 100644 deployment-package/source_server/attestationsDb.ts create mode 100644 deployment-package/source_server/dateUtils.ts create mode 100644 deployment-package/source_server/db.ts create mode 100644 deployment-package/source_server/emailPreview.ts create mode 100644 deployment-package/source_server/emailService.ts create mode 100644 deployment-package/source_server/emailTemplateGenerator.ts create mode 100644 deployment-package/source_server/emailTemplateUtils.ts create mode 100644 deployment-package/source_server/etablissementsDb.ts create mode 100644 deployment-package/source_server/exportService.ts create mode 100644 deployment-package/source_server/formateurDb.ts create mode 100644 deployment-package/source_server/gestionAttestationsDb.ts create mode 100644 deployment-package/source_server/icsGenerator.ts create mode 100644 deployment-package/source_server/importExcel.ts create mode 100644 deployment-package/source_server/inscriptionWithDates.ts create mode 100644 deployment-package/source_server/notificationLogsDb.ts create mode 100644 deployment-package/source_server/parametresDb.ts create mode 100644 deployment-package/source_server/presenceDb.ts create mode 100644 deployment-package/source_server/qrCodeGenerator.ts create mode 100644 deployment-package/source_server/questionnaireDb.ts create mode 100644 deployment-package/source_server/questionnaireExport.ts create mode 100644 deployment-package/source_server/questionnaireScheduler.ts create mode 100644 deployment-package/source_server/questionnaireSuiviDb.ts create mode 100644 deployment-package/source_server/rappelDb.ts create mode 100644 deployment-package/source_server/rappelRetry.ts create mode 100644 deployment-package/source_server/rappelScheduler.ts create mode 100644 deployment-package/source_server/remerciementScheduler.ts create mode 100644 deployment-package/source_server/routers.ts create mode 100644 deployment-package/source_server/storage.ts delete mode 100755 deployment-package/update.sh create mode 100755 fix-all-database-schema-FINAL.sh create mode 100644 formation-manager-itinova-20260113_043521.tar.gz create mode 100644 formation-manager-itinova-20260113_043521.tar.gz.sha256 delete mode 100644 formation-manager-itinova-deployment-7a737c05.tar.gz create mode 100644 formation-manager-itinova-update-20260113_082603.tar.gz create mode 100644 formation-manager-update.tar.gz create mode 100644 migrations/README.md create mode 100755 scripts/create-package.sh create mode 100755 scripts/update-from-package.sh create mode 100755 scripts/update-production.sh diff --git a/.manus/db/db-query-1768376558906.json b/.manus/db/db-query-1768376558906.json new file mode 100644 index 0000000..1b02d95 --- /dev/null +++ b/.manus/db/db-query-1768376558906.json @@ -0,0 +1,90 @@ +{ + "query": "DESCRIBE questionnaires;", + "command": "mysql --batch --raw --column-names --default-character-set=utf8mb4 --host gateway02.us-east-1.prod.aws.tidbcloud.com --port 4000 --user 4CrrYuB5tme73Qo.root --database 7PAT67UmWoxv8vwp8Bbcv6 --execute DESCRIBE questionnaires;", + "rows": [ + { + "Field": "id", + "Type": "int(11)", + "Null": "NO", + "Key": "PRI", + "Default": "NULL", + "Extra": "auto_increment" + }, + { + "Field": "nom", + "Type": "varchar(255)", + "Null": "NO", + "Key": "", + "Default": "NULL", + "Extra": "" + }, + { + "Field": "type", + "Type": "enum('satisfaction','evaluation_pre','evaluation_post')", + "Null": "NO", + "Key": "", + "Default": "NULL", + "Extra": "" + }, + { + "Field": "description", + "Type": "text", + "Null": "YES", + "Key": "", + "Default": "NULL", + "Extra": "" + }, + { + "Field": "formationId", + "Type": "int(11)", + "Null": "YES", + "Key": "", + "Default": "NULL", + "Extra": "" + }, + { + "Field": "actif", + "Type": "tinyint(1)", + "Null": "NO", + "Key": "", + "Default": "1", + "Extra": "" + }, + { + "Field": "envoiAutomatique", + "Type": "tinyint(1)", + "Null": "NO", + "Key": "", + "Default": "0", + "Extra": "" + }, + { + "Field": "delaiEnvoiJours", + "Type": "int(11)", + "Null": "NO", + "Key": "", + "Default": "1", + "Extra": "" + }, + { + "Field": "createdAt", + "Type": "timestamp", + "Null": "NO", + "Key": "", + "Default": "CURRENT_TIMESTAMP", + "Extra": "" + }, + { + "Field": "updatedAt", + "Type": "timestamp", + "Null": "NO", + "Key": "", + "Default": "CURRENT_TIMESTAMP", + "Extra": "DEFAULT_GENERATED on update CURRENT_TIMESTAMP" + } + ], + "messages": [], + "stdout": "Field\tType\tNull\tKey\tDefault\tExtra\nid\tint(11)\tNO\tPRI\tNULL\tauto_increment\nnom\tvarchar(255)\tNO\t\tNULL\t\ntype\tenum('satisfaction','evaluation_pre','evaluation_post')\tNO\t\tNULL\t\ndescription\ttext\tYES\t\tNULL\t\nformationId\tint(11)\tYES\t\tNULL\t\nactif\ttinyint(1)\tNO\t\t1\t\nenvoiAutomatique\ttinyint(1)\tNO\t\t0\t\ndelaiEnvoiJours\tint(11)\tNO\t\t1\t\ncreatedAt\ttimestamp\tNO\t\tCURRENT_TIMESTAMP\t\nupdatedAt\ttimestamp\tNO\t\tCURRENT_TIMESTAMP\tDEFAULT_GENERATED on update CURRENT_TIMESTAMP\n", + "stderr": "", + "execution_time_ms": 710 +} \ No newline at end of file diff --git a/.manus/db/db-query-1768376568790.json b/.manus/db/db-query-1768376568790.json new file mode 100644 index 0000000..2790218 --- /dev/null +++ b/.manus/db/db-query-1768376568790.json @@ -0,0 +1,40 @@ +{ + "query": "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'questionnaires';", + "command": "mysql --batch --raw --column-names --default-character-set=utf8mb4 --host gateway02.us-east-1.prod.aws.tidbcloud.com --port 4000 --user 4CrrYuB5tme73Qo.root --database 7PAT67UmWoxv8vwp8Bbcv6 --execute SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'questionnaires';", + "rows": [ + { + "COLUMN_NAME": "id" + }, + { + "COLUMN_NAME": "nom" + }, + { + "COLUMN_NAME": "type" + }, + { + "COLUMN_NAME": "description" + }, + { + "COLUMN_NAME": "formationId" + }, + { + "COLUMN_NAME": "actif" + }, + { + "COLUMN_NAME": "envoiAutomatique" + }, + { + "COLUMN_NAME": "delaiEnvoiJours" + }, + { + "COLUMN_NAME": "createdAt" + }, + { + "COLUMN_NAME": "updatedAt" + } + ], + "messages": [], + "stdout": "COLUMN_NAME\nid\nnom\ntype\ndescription\nformationId\nactif\nenvoiAutomatique\ndelaiEnvoiJours\ncreatedAt\nupdatedAt\n", + "stderr": "", + "execution_time_ms": 61 +} \ No newline at end of file diff --git a/.manus/db/db-query-1768376575187.json b/.manus/db/db-query-1768376575187.json new file mode 100644 index 0000000..91d5f70 --- /dev/null +++ b/.manus/db/db-query-1768376575187.json @@ -0,0 +1,90 @@ +{ + "query": "SHOW COLUMNS FROM questionnaires;", + "command": "mysql --batch --raw --column-names --default-character-set=utf8mb4 --host gateway02.us-east-1.prod.aws.tidbcloud.com --port 4000 --user 4CrrYuB5tme73Qo.root --database 7PAT67UmWoxv8vwp8Bbcv6 --execute SHOW COLUMNS FROM questionnaires;", + "rows": [ + { + "Field": "id", + "Type": "int(11)", + "Null": "NO", + "Key": "PRI", + "Default": "NULL", + "Extra": "auto_increment" + }, + { + "Field": "nom", + "Type": "varchar(255)", + "Null": "NO", + "Key": "", + "Default": "NULL", + "Extra": "" + }, + { + "Field": "type", + "Type": "enum('satisfaction','evaluation_pre','evaluation_post')", + "Null": "NO", + "Key": "", + "Default": "NULL", + "Extra": "" + }, + { + "Field": "description", + "Type": "text", + "Null": "YES", + "Key": "", + "Default": "NULL", + "Extra": "" + }, + { + "Field": "formationId", + "Type": "int(11)", + "Null": "YES", + "Key": "", + "Default": "NULL", + "Extra": "" + }, + { + "Field": "actif", + "Type": "tinyint(1)", + "Null": "NO", + "Key": "", + "Default": "1", + "Extra": "" + }, + { + "Field": "envoiAutomatique", + "Type": "tinyint(1)", + "Null": "NO", + "Key": "", + "Default": "0", + "Extra": "" + }, + { + "Field": "delaiEnvoiJours", + "Type": "int(11)", + "Null": "NO", + "Key": "", + "Default": "1", + "Extra": "" + }, + { + "Field": "createdAt", + "Type": "timestamp", + "Null": "NO", + "Key": "", + "Default": "CURRENT_TIMESTAMP", + "Extra": "" + }, + { + "Field": "updatedAt", + "Type": "timestamp", + "Null": "NO", + "Key": "", + "Default": "CURRENT_TIMESTAMP", + "Extra": "DEFAULT_GENERATED on update CURRENT_TIMESTAMP" + } + ], + "messages": [], + "stdout": "Field\tType\tNull\tKey\tDefault\tExtra\nid\tint(11)\tNO\tPRI\tNULL\tauto_increment\nnom\tvarchar(255)\tNO\t\tNULL\t\ntype\tenum('satisfaction','evaluation_pre','evaluation_post')\tNO\t\tNULL\t\ndescription\ttext\tYES\t\tNULL\t\nformationId\tint(11)\tYES\t\tNULL\t\nactif\ttinyint(1)\tNO\t\t1\t\nenvoiAutomatique\ttinyint(1)\tNO\t\t0\t\ndelaiEnvoiJours\tint(11)\tNO\t\t1\t\ncreatedAt\ttimestamp\tNO\t\tCURRENT_TIMESTAMP\t\nupdatedAt\ttimestamp\tNO\t\tCURRENT_TIMESTAMP\tDEFAULT_GENERATED on update CURRENT_TIMESTAMP\n", + "stderr": "", + "execution_time_ms": 62 +} \ No newline at end of file diff --git a/.manus/db/db-query-1768376586515.json b/.manus/db/db-query-1768376586515.json new file mode 100644 index 0000000..2b0f649 --- /dev/null +++ b/.manus/db/db-query-1768376586515.json @@ -0,0 +1,9 @@ +{ + "query": "ALTER TABLE questionnaires CHANGE COLUMN nom titre VARCHAR(255) NOT NULL;", + "command": "mysql --batch --raw --column-names --default-character-set=utf8mb4 --host gateway02.us-east-1.prod.aws.tidbcloud.com --port 4000 --user 4CrrYuB5tme73Qo.root --database 7PAT67UmWoxv8vwp8Bbcv6 --execute ALTER TABLE questionnaires CHANGE COLUMN nom titre VARCHAR(255) NOT NULL;", + "rows": [], + "messages": [], + "stdout": "", + "stderr": "", + "execution_time_ms": 172 +} \ No newline at end of file diff --git a/.manus/db/db-query-1768376894838.json b/.manus/db/db-query-1768376894838.json new file mode 100644 index 0000000..062587c --- /dev/null +++ b/.manus/db/db-query-1768376894838.json @@ -0,0 +1,114 @@ +{ + "query": "SHOW COLUMNS FROM questions;", + "command": "mysql --batch --raw --column-names --default-character-set=utf8mb4 --host gateway02.us-east-1.prod.aws.tidbcloud.com --port 4000 --user 4CrrYuB5tme73Qo.root --database 7PAT67UmWoxv8vwp8Bbcv6 --execute SHOW COLUMNS FROM questions;", + "rows": [ + { + "Field": "id", + "Type": "int(11)", + "Null": "NO", + "Key": "PRI", + "Default": "NULL", + "Extra": "auto_increment" + }, + { + "Field": "questionnaireId", + "Type": "int(11)", + "Null": "NO", + "Key": "", + "Default": "NULL", + "Extra": "" + }, + { + "Field": "ordre", + "Type": "int(11)", + "Null": "NO", + "Key": "", + "Default": "NULL", + "Extra": "" + }, + { + "Field": "texte", + "Type": "text", + "Null": "NO", + "Key": "", + "Default": "NULL", + "Extra": "" + }, + { + "Field": "typeQuestion", + "Type": "enum('choix_multiple','echelle','texte_libre','oui_non')", + "Null": "NO", + "Key": "", + "Default": "NULL", + "Extra": "" + }, + { + "Field": "options", + "Type": "text", + "Null": "YES", + "Key": "", + "Default": "NULL", + "Extra": "" + }, + { + "Field": "echelleMin", + "Type": "int(11)", + "Null": "YES", + "Key": "", + "Default": "NULL", + "Extra": "" + }, + { + "Field": "echelleMax", + "Type": "int(11)", + "Null": "YES", + "Key": "", + "Default": "NULL", + "Extra": "" + }, + { + "Field": "echelleLabelMin", + "Type": "varchar(255)", + "Null": "YES", + "Key": "", + "Default": "NULL", + "Extra": "" + }, + { + "Field": "echelleLabelMax", + "Type": "varchar(255)", + "Null": "YES", + "Key": "", + "Default": "NULL", + "Extra": "" + }, + { + "Field": "obligatoire", + "Type": "tinyint(1)", + "Null": "NO", + "Key": "", + "Default": "0", + "Extra": "" + }, + { + "Field": "createdAt", + "Type": "timestamp", + "Null": "NO", + "Key": "", + "Default": "CURRENT_TIMESTAMP", + "Extra": "" + }, + { + "Field": "updatedAt", + "Type": "timestamp", + "Null": "NO", + "Key": "", + "Default": "CURRENT_TIMESTAMP", + "Extra": "DEFAULT_GENERATED on update CURRENT_TIMESTAMP" + } + ], + "messages": [], + "stdout": "Field\tType\tNull\tKey\tDefault\tExtra\nid\tint(11)\tNO\tPRI\tNULL\tauto_increment\nquestionnaireId\tint(11)\tNO\t\tNULL\t\nordre\tint(11)\tNO\t\tNULL\t\ntexte\ttext\tNO\t\tNULL\t\ntypeQuestion\tenum('choix_multiple','echelle','texte_libre','oui_non')\tNO\t\tNULL\t\noptions\ttext\tYES\t\tNULL\t\nechelleMin\tint(11)\tYES\t\tNULL\t\nechelleMax\tint(11)\tYES\t\tNULL\t\nechelleLabelMin\tvarchar(255)\tYES\t\tNULL\t\nechelleLabelMax\tvarchar(255)\tYES\t\tNULL\t\nobligatoire\ttinyint(1)\tNO\t\t0\t\ncreatedAt\ttimestamp\tNO\t\tCURRENT_TIMESTAMP\t\nupdatedAt\ttimestamp\tNO\t\tCURRENT_TIMESTAMP\tDEFAULT_GENERATED on update CURRENT_TIMESTAMP\n", + "stderr": "", + "execution_time_ms": 57 +} \ No newline at end of file diff --git a/.manus/db/db-query-1768376902477.json b/.manus/db/db-query-1768376902477.json new file mode 100644 index 0000000..178bfb4 --- /dev/null +++ b/.manus/db/db-query-1768376902477.json @@ -0,0 +1,49 @@ +{ + "query": "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'questions';", + "command": "mysql --batch --raw --column-names --default-character-set=utf8mb4 --host gateway02.us-east-1.prod.aws.tidbcloud.com --port 4000 --user 4CrrYuB5tme73Qo.root --database 7PAT67UmWoxv8vwp8Bbcv6 --execute SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'questions';", + "rows": [ + { + "COLUMN_NAME": "id" + }, + { + "COLUMN_NAME": "questionnaireId" + }, + { + "COLUMN_NAME": "ordre" + }, + { + "COLUMN_NAME": "texte" + }, + { + "COLUMN_NAME": "typeQuestion" + }, + { + "COLUMN_NAME": "options" + }, + { + "COLUMN_NAME": "echelleMin" + }, + { + "COLUMN_NAME": "echelleMax" + }, + { + "COLUMN_NAME": "echelleLabelMin" + }, + { + "COLUMN_NAME": "echelleLabelMax" + }, + { + "COLUMN_NAME": "obligatoire" + }, + { + "COLUMN_NAME": "createdAt" + }, + { + "COLUMN_NAME": "updatedAt" + } + ], + "messages": [], + "stdout": "COLUMN_NAME\nid\nquestionnaireId\nordre\ntexte\ntypeQuestion\noptions\nechelleMin\nechelleMax\nechelleLabelMin\nechelleLabelMax\nobligatoire\ncreatedAt\nupdatedAt\n", + "stderr": "", + "execution_time_ms": 62 +} \ No newline at end of file diff --git a/.manus/db/db-query-1768376942069.json b/.manus/db/db-query-1768376942069.json new file mode 100644 index 0000000..24ee7e2 --- /dev/null +++ b/.manus/db/db-query-1768376942069.json @@ -0,0 +1,9 @@ +{ + "query": "ALTER TABLE questions ADD COLUMN IF NOT EXISTS valeurMin INT DEFAULT NULL; ALTER TABLE questions ADD COLUMN IF NOT EXISTS valeurMax INT DEFAULT NULL;", + "command": "mysql --batch --raw --column-names --default-character-set=utf8mb4 --host gateway02.us-east-1.prod.aws.tidbcloud.com --port 4000 --user 4CrrYuB5tme73Qo.root --database 7PAT67UmWoxv8vwp8Bbcv6 --execute ALTER TABLE questions ADD COLUMN IF NOT EXISTS valeurMin INT DEFAULT NULL; ALTER TABLE questions ADD COLUMN IF NOT EXISTS valeurMax INT DEFAULT NULL;", + "rows": [], + "messages": [], + "stdout": "", + "stderr": "", + "execution_time_ms": 950 +} \ No newline at end of file diff --git a/client/src/pages/AdminQuestionnaireEdit.tsx b/client/src/pages/AdminQuestionnaireEdit.tsx index 35888a5..4cdcafe 100644 --- a/client/src/pages/AdminQuestionnaireEdit.tsx +++ b/client/src/pages/AdminQuestionnaireEdit.tsx @@ -436,7 +436,7 @@ export default function AdminQuestionnaireEdit() { - {nom || "Questionnaire sans titre"} + {titre || "Questionnaire sans titre"} {description &&

{description}

}
diff --git a/client/src/pages/QuestionnaireReponse.tsx b/client/src/pages/QuestionnaireReponse.tsx index 8aa9f50..c182f71 100644 --- a/client/src/pages/QuestionnaireReponse.tsx +++ b/client/src/pages/QuestionnaireReponse.tsx @@ -113,7 +113,7 @@ export default function QuestionnaireReponse() { {APP_LOGO && ( {APP_TITLE} )} -

{data.questionnaire?.nom || 'Questionnaire'}

+

{data.questionnaire?.titre || 'Questionnaire'}

{data.questionnaire?.description && (

{data.questionnaire.description}

)} diff --git a/create-deployment-package.sh b/create-deployment-package.sh new file mode 100755 index 0000000..62ccea3 --- /dev/null +++ b/create-deployment-package.sh @@ -0,0 +1,77 @@ +#!/bin/bash + +# Script de création du package de déploiement +# Version: 1.0 +# Date: 13 janvier 2026 + +set -e + +echo "=== Création du package de déploiement ===" +echo "" + +# Variables +PROJECT_DIR="/home/ubuntu/formation-manager-itinova" +PACKAGE_DIR="$PROJECT_DIR/deployment-package" +TIMESTAMP=$(date +%Y%m%d_%H%M%S) +ARCHIVE_NAME="formation-manager-itinova-${TIMESTAMP}.tar.gz" + +# Nettoyer le répertoire de package +echo "Nettoyage du répertoire de package..." +rm -rf "$PACKAGE_DIR" +mkdir -p "$PACKAGE_DIR" + +# Créer la structure du package +echo "Création de la structure du package..." +mkdir -p "$PACKAGE_DIR/scripts" +mkdir -p "$PACKAGE_DIR/docs" +mkdir -p "$PACKAGE_DIR/source" + +# Copier les scripts de déploiement +echo "Copie des scripts de déploiement..." +cp "$PROJECT_DIR/deploy.sh" "$PACKAGE_DIR/scripts/" 2>/dev/null || true +cp "$PROJECT_DIR/deploy-update.sh" "$PACKAGE_DIR/scripts/" 2>/dev/null || true +cp "$PROJECT_DIR/deploy-update-manual.sh" "$PACKAGE_DIR/scripts/" 2>/dev/null || true +cp "$PROJECT_DIR/deploy-update-targz.sh" "$PACKAGE_DIR/scripts/" 2>/dev/null || true +cp "$PROJECT_DIR/setup-env.sh" "$PACKAGE_DIR/scripts/" 2>/dev/null || true +cp "$PROJECT_DIR/setup-https.sh" "$PACKAGE_DIR/scripts/" 2>/dev/null || true +cp "$PROJECT_DIR/create-admin.sh" "$PACKAGE_DIR/scripts/" 2>/dev/null || true +cp "$PROJECT_DIR/reset-admin.sh" "$PACKAGE_DIR/scripts/" 2>/dev/null || true +cp "$PROJECT_DIR/diagnose.sh" "$PACKAGE_DIR/scripts/" 2>/dev/null || true + +# Rendre les scripts exécutables +chmod +x "$PACKAGE_DIR/scripts/"*.sh + +# Copier la documentation +echo "Copie de la documentation..." +cp "$PROJECT_DIR/GUIDE_DEPLOIEMENT.md" "$PACKAGE_DIR/docs/" 2>/dev/null || true +cp "$PROJECT_DIR/DEPLOIEMENT-MANUEL.md" "$PACKAGE_DIR/docs/" 2>/dev/null || true +cp "$PROJECT_DIR/DEPLOIEMENT-TARGZ.md" "$PACKAGE_DIR/docs/" 2>/dev/null || true +cp "$PROJECT_DIR/INSTRUCTIONS-DEPLOIEMENT.md" "$PACKAGE_DIR/docs/" 2>/dev/null || true +cp "$PROJECT_DIR/GUIDE_CONFIGURATION_ATTESTATIONS.md" "$PACKAGE_DIR/docs/" 2>/dev/null || true +cp "$PROJECT_DIR/README.md" "$PACKAGE_DIR/docs/" 2>/dev/null || true + +# Copier les sources (sans node_modules et fichiers de build) +echo "Copie des sources de l'application..." +rsync -av --progress \ + --exclude 'node_modules' \ + --exclude 'dist' \ + --exclude '.git' \ + --exclude 'deployment-package' \ + --exclude '*.log' \ + --exclude '.env' \ + --exclude '.DS_Store' \ + "$PROJECT_DIR/" "$PACKAGE_DIR/source/" + +# Créer l'archive +echo "Création de l'archive..." +cd "$PROJECT_DIR" +tar -czf "$ARCHIVE_NAME" -C deployment-package . + +echo "" +echo "=== Package créé avec succès ===" +echo "Archive: $PROJECT_DIR/$ARCHIVE_NAME" +echo "Taille: $(du -h "$ARCHIVE_NAME" | cut -f1)" +echo "" +echo "Pour transférer vers votre serveur VPS:" +echo "scp $ARCHIVE_NAME user@your-server:/path/to/destination/" +echo "" diff --git a/deployment-package/CONFIGURATION.md b/deployment-package/CONFIGURATION.md deleted file mode 100644 index 22b961c..0000000 --- a/deployment-package/CONFIGURATION.md +++ /dev/null @@ -1,396 +0,0 @@ -# Documentation de Configuration - Formation Manager Itinova - -**Version:** 7a737c05 -**Date:** 24 novembre 2025 -**Auteur:** Manus AI - ---- - -## Vue d'ensemble - -Ce document détaille toutes les variables de configuration et les paramètres nécessaires pour personnaliser et sécuriser votre installation de Formation Manager Itinova. - ---- - -## Variables d'environnement - -Toutes les variables d'environnement doivent être définies dans le fichier `.env` à la racine du projet. Ce fichier ne doit **jamais** être commité dans le dépôt Git pour des raisons de sécurité. - -### Base de données - -#### DATABASE_URL - -**Type:** String (URL de connexion) -**Requis:** Oui -**Format:** `mysql://utilisateur:motdepasse@hote:port/nombase` - -La chaîne de connexion complète à votre base de données MySQL ou TiDB. Cette URL contient toutes les informations nécessaires pour établir la connexion : utilisateur, mot de passe, hôte, port et nom de la base de données. - -**Exemple:** -``` -DATABASE_URL=mysql://formation_user:SecureP@ssw0rd@localhost:3306/formation_manager -``` - -**Recommandations de sécurité:** -- Utilisez un mot de passe fort d'au moins 16 caractères -- Créez un utilisateur dédié avec uniquement les permissions nécessaires -- Si possible, utilisez une connexion SSL/TLS (ajoutez `?ssl=true` à la fin de l'URL) -- Pour TiDB Cloud, utilisez toujours SSL et les certificats fournis - ---- - -### Authentification et sécurité - -#### JWT_SECRET - -**Type:** String (clé secrète) -**Requis:** Oui -**Longueur minimale:** 32 caractères (64 recommandés) - -La clé secrète utilisée pour signer les tokens JWT (JSON Web Tokens) qui gèrent les sessions utilisateur. Cette clé est critique pour la sécurité de votre application. - -**Génération d'une clé sécurisée:** -```bash -openssl rand -hex 32 -``` - -**Exemple:** -``` -JWT_SECRET=a3f8b2c9d1e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0 -``` - -**Important:** Ne réutilisez jamais la même clé entre différents environnements (développement, staging, production). - -#### OAUTH_SERVER_URL - -**Type:** URL -**Requis:** Oui -**Valeur par défaut:** `https://api.manus.im` - -L'URL du serveur OAuth Manus utilisé pour l'authentification des utilisateurs. Cette valeur ne doit généralement pas être modifiée sauf si vous utilisez une instance Manus personnalisée. - -#### VITE_OAUTH_PORTAL_URL - -**Type:** URL -**Requis:** Oui -**Valeur par défaut:** `https://auth.manus.im` - -L'URL du portail de connexion Manus où les utilisateurs sont redirigés pour s'authentifier. Cette URL est utilisée côté client (frontend). - ---- - -### Identité du propriétaire - -#### OWNER_OPEN_ID - -**Type:** String -**Requis:** Oui - -L'identifiant OpenID unique du propriétaire de l'application. Cet utilisateur aura automatiquement le rôle `admin` lors de sa première connexion et recevra les notifications système. - -**Comment obtenir votre Open ID:** -1. Connectez-vous à votre compte Manus -2. Accédez à votre profil utilisateur -3. Copiez votre Open ID depuis les paramètres du compte - -#### OWNER_NAME - -**Type:** String -**Requis:** Oui - -Le nom complet du propriétaire de l'application, utilisé dans les notifications et les logs système. - -**Exemple:** -``` -OWNER_OPEN_ID=usr_abc123def456 -OWNER_NAME=Olivier Pareige -``` - ---- - -### Configuration de l'application - -#### VITE_APP_ID - -**Type:** String -**Requis:** Oui - -L'identifiant unique de votre application Manus. Cette valeur est fournie lors de la création de votre application sur la plateforme Manus. - -#### VITE_APP_TITLE - -**Type:** String -**Requis:** Non -**Valeur par défaut:** `Gestion des Formations Manager Itinova` - -Le titre de l'application affiché dans l'interface utilisateur, les onglets du navigateur et les emails. Vous pouvez personnaliser ce titre selon vos besoins. - -**Exemple:** -``` -VITE_APP_TITLE=Formation Manager - Itinova -``` - -#### VITE_APP_LOGO - -**Type:** String (chemin relatif) -**Requis:** Non -**Valeur par défaut:** `/logo.png` - -Le chemin vers le fichier logo de l'application. Le fichier doit être placé dans le répertoire `client/public/`. Le logo est affiché dans le header et les emails. - -**Formats supportés:** PNG, SVG, JPG -**Taille recommandée:** 200x50 pixels (ratio 4:1) - ---- - -### APIs Manus intégrées - -Ces variables sont généralement fournies automatiquement par la plateforme Manus lors du déploiement. Elles donnent accès aux services intégrés (LLM, stockage, notifications, etc.). - -#### BUILT_IN_FORGE_API_URL - -**Type:** URL -**Requis:** Oui (pour les fonctionnalités avancées) - -L'URL de base des APIs Manus Forge utilisées côté serveur. - -#### BUILT_IN_FORGE_API_KEY - -**Type:** String (clé API) -**Requis:** Oui (pour les fonctionnalités avancées) - -La clé d'authentification pour accéder aux APIs Manus côté serveur. Cette clé ne doit **jamais** être exposée côté client. - -#### VITE_FRONTEND_FORGE_API_KEY - -**Type:** String (clé API) -**Requis:** Non - -Une clé API distincte pour les appels côté client (frontend). Cette clé a des permissions limitées pour des raisons de sécurité. - -#### VITE_FRONTEND_FORGE_API_URL - -**Type:** URL -**Requis:** Non - -L'URL des APIs Manus accessibles depuis le frontend. - ---- - -### Analytics (optionnel) - -#### VITE_ANALYTICS_ENDPOINT - -**Type:** URL -**Requis:** Non - -L'URL de votre service d'analytics (compatible Plausible/Umami). Si défini, les statistiques de visite seront envoyées à ce endpoint. - -#### VITE_ANALYTICS_WEBSITE_ID - -**Type:** String -**Requis:** Non (sauf si VITE_ANALYTICS_ENDPOINT est défini) - -L'identifiant unique de votre site dans le système d'analytics. - -**Exemple:** -``` -VITE_ANALYTICS_ENDPOINT=https://analytics.example.com -VITE_ANALYTICS_WEBSITE_ID=formation-manager-prod -``` - ---- - -### Configuration de l'environnement - -#### NODE_ENV - -**Type:** String -**Requis:** Oui -**Valeurs possibles:** `development`, `production`, `test` - -Définit l'environnement d'exécution de l'application. En production, cette valeur **doit** être `production` pour activer les optimisations et désactiver les outils de développement. - -#### PORT - -**Type:** Number -**Requis:** Non -**Valeur par défaut:** `3000` - -Le port sur lequel le serveur Express écoute les connexions. Si vous utilisez Nginx comme reverse proxy, gardez la valeur par défaut. - ---- - -## Configuration SMTP (emails) - -L'application utilise un serveur SMTP pour envoyer les emails automatiques (confirmations, rappels, teasers). La configuration SMTP se fait via l'interface web dans la section "Configuration SMTP" du menu. - -### Paramètres SMTP requis - -| Paramètre | Description | Exemple | -|-----------|-------------|---------| -| Hôte SMTP | Adresse du serveur SMTP | `smtp.gmail.com` | -| Port | Port du serveur (25, 465, 587) | `587` | -| Sécurité | TLS ou SSL | `TLS` | -| Utilisateur | Adresse email d'envoi | `noreply@itinova.org` | -| Mot de passe | Mot de passe ou app password | `****************` | - -### Fournisseurs SMTP recommandés - -**Gmail** : Gratuit jusqu'à 500 emails/jour. Nécessite un "App Password" si 2FA activé. -**SendGrid** : 100 emails/jour gratuits, excellent pour la délivrabilité. -**Amazon SES** : Très économique, $0.10 pour 1000 emails. -**Mailgun** : 5000 emails/mois gratuits les 3 premiers mois. - -### Test de configuration - -Après avoir configuré SMTP, utilisez la fonction "Envoyer un email de test" dans l'interface pour vérifier que les emails sont bien envoyés et reçus. - ---- - -## Configuration Nginx - -### Certificat SSL - -Pour activer HTTPS, vous devez obtenir un certificat SSL. La méthode recommandée est d'utiliser Let's Encrypt (gratuit) : - -```bash -sudo apt install certbot python3-certbot-nginx -sudo certbot --nginx -d votre-domaine.com -``` - -Certbot configurera automatiquement Nginx et renouvellera le certificat avant expiration. - -### Optimisations recommandées - -**Compression Gzip** : Déjà activée dans la configuration fournie, réduit la bande passante de 70%. - -**Cache des assets statiques** : Les fichiers CSS, JS et images sont mis en cache 1 an côté client pour améliorer les performances. - -**HTTP/2** : Activé par défaut avec `http2` dans la directive `listen 443 ssl http2`. - -**Rate limiting** : Pour protéger contre les attaques DDoS, ajoutez dans votre configuration Nginx : - -```nginx -limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s; - -location /api/ { - limit_req zone=api burst=20 nodelay; - proxy_pass http://formation_backend; -} -``` - ---- - -## Sécurité avancée - -### Rotation des secrets - -Les clés sensibles (JWT_SECRET, mots de passe DB) doivent être changées régulièrement : - -1. **Générer une nouvelle clé JWT** -2. **Mettre à jour `.env`** -3. **Redémarrer l'application** -4. **Tous les utilisateurs devront se reconnecter** - -### Sauvegarde des configurations - -Sauvegardez régulièrement votre fichier `.env` dans un gestionnaire de secrets sécurisé (pas dans Git) : - -- **Vault** (HashiCorp) -- **AWS Secrets Manager** -- **Azure Key Vault** -- **1Password** (pour les petites équipes) - -### Audit de sécurité - -Vérifiez régulièrement : - -- [ ] Les permissions de fichiers (`.env` doit être en 600) -- [ ] Les logs d'accès pour détecter des comportements suspects -- [ ] Les mises à jour de sécurité des dépendances (`pnpm audit`) -- [ ] La force des mots de passe de base de données -- [ ] L'expiration des certificats SSL - ---- - -## Personnalisation - -### Modification du logo - -1. Placez votre nouveau logo dans `client/public/` -2. Mettez à jour `VITE_APP_LOGO` dans `.env` -3. Modifiez également `APP_LOGO` dans `client/src/const.ts` -4. Rebuild l'application : `pnpm run build` -5. Mettez à jour le favicon via l'interface de gestion - -### Personnalisation des couleurs - -Les couleurs de l'interface sont définies dans `client/src/index.css`. Modifiez les variables CSS dans la section `:root` pour personnaliser le thème : - -```css -:root { - --primary: 221.2 83.2% 53.3%; /* Bleu principal */ - --secondary: 210 40% 96.1%; - --accent: 210 40% 96.1%; - /* ... */ -} -``` - -### Ajout de fonctions personnalisées - -Pour ajouter des fonctions spécifiques à votre organisation : - -1. **Schéma** : Ajoutez les tables dans `drizzle/schema.ts` -2. **Backend** : Créez les fonctions dans `server/db.ts` -3. **API** : Ajoutez les procédures dans `server/routers.ts` -4. **Frontend** : Créez les pages dans `client/src/pages/` -5. **Navigation** : Ajoutez les liens dans `client/src/components/DashboardLayout.tsx` - ---- - -## Troubleshooting - -### L'application ne démarre pas - -**Vérifiez le fichier `.env`** : Assurez-vous que toutes les variables requises sont définies. - -**Testez la connexion DB** : -```bash -mysql -h HOST -u USER -p DATABASE -``` - -**Consultez les logs** : -```bash -sudo journalctl -u formation-manager -n 100 -``` - -### Les emails ne sont pas envoyés - -**Vérifiez la configuration SMTP** : Utilisez la fonction de test dans l'interface. - -**Consultez les logs** : Les erreurs SMTP sont loguées dans les journaux système. - -**Vérifiez les ports** : Assurez-vous que les ports SMTP (587, 465) ne sont pas bloqués par le pare-feu. - -### Erreurs de base de données - -**Migrations non appliquées** : Exécutez `pnpm db:push` pour synchroniser le schéma. - -**Connexion refusée** : Vérifiez que MySQL est démarré et accessible. - -**Erreur d'authentification** : Vérifiez les identifiants dans `DATABASE_URL`. - ---- - -## Support - -Pour toute question sur la configuration : - -- **Documentation technique** : README.md du projet -- **Support Manus** : https://help.manus.im -- **Contact** : o.pareige@itinova.org - ---- - -**Fin de la documentation de configuration** diff --git a/deployment-package/CONFIGURATION.pdf b/deployment-package/CONFIGURATION.pdf deleted file mode 100644 index ec67f5e939acbfac4d82881fecbca2605957e078..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 384001 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

1{7yph1A`y_9@$!+0o>_it7Ci8}QU?v5d=% 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≤~*clh1}r?>iT)I4+AU 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

QNELy+Rya8K=Gg6Z*Km6n4v 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 za Configuration SMTP) - 2. Créez vos premiers utilisateurs (Gestion > Utilisateurs) - 3. Personnalisez les templates d'emails (Configuration > Templates d'emails) - 4. Testez l'envoi d'emails - -================================================================================ - MISES À JOUR FUTURES -================================================================================ - -Pour mettre à jour l'application vers une version plus récente : - - 1. Transférez le nouveau fichier update.sh sur le serveur - 2. Exécutez : chmod +x update.sh && ./update.sh - 3. Le script sauvegarde automatiquement la base de données avant la mise à jour - -================================================================================ - STRUCTURE DE L'APPLICATION -================================================================================ - -Après installation, l'application sera installée dans : - /opt/formation-manager/ - -Fichiers de configuration : - /opt/formation-manager/.env - -Logs de l'application : - sudo journalctl -u formation-manager -f - -Service systemd : - sudo systemctl status formation-manager - sudo systemctl restart formation-manager - sudo systemctl stop formation-manager - -Configuration Nginx : - /etc/nginx/sites-available/formation-manager - -================================================================================ - IDENTIFIANTS PAR DÉFAUT -================================================================================ - -Après l'installation, connectez-vous avec : - - Identifiant : adminServFormation - Mot de passe : Itinova69! - -⚠️ IMPORTANT : Changez ce mot de passe immédiatement après la première connexion - via le menu Gestion > Utilisateurs > Modifier l'utilisateur adminServFormation - -================================================================================ - SUPPORT ET ASSISTANCE -================================================================================ - -Documentation technique : - - README.md du projet (dans le dépôt Git) - - GUIDE_DEPLOIEMENT.pdf (ce package) - - CONFIGURATION.pdf (ce package) - -Support Manus : - https://help.manus.im - -Contact développeur : - o.pareige@itinova.org - -================================================================================ - SÉCURITÉ -================================================================================ - -Recommandations de sécurité importantes : - - ✓ Changez le mot de passe administrateur par défaut - ✓ Utilisez HTTPS (SSL/TLS) avec Let's Encrypt - ✓ Configurez un pare-feu (ufw) pour limiter les ports ouverts - ✓ Sauvegardez régulièrement la base de données - ✓ Gardez le système à jour (apt update && apt upgrade) - ✓ Utilisez des mots de passe forts pour la base de données - ✓ Ne commitez jamais le fichier .env dans Git - ✓ Limitez les accès SSH (clés SSH uniquement) - -================================================================================ - DÉPANNAGE -================================================================================ - -L'application ne démarre pas : - - Vérifiez les logs : sudo journalctl -u formation-manager -n 100 - - Vérifiez le fichier .env : toutes les variables sont-elles définies ? - - Testez la connexion DB : mysql -h HOST -u USER -p DATABASE - -Les emails ne sont pas envoyés : - - Vérifiez la configuration SMTP dans l'interface - - Utilisez la fonction "Test d'envoi" dans Configuration > Configuration SMTP - - Consultez les logs pour les erreurs SMTP - -Erreur 502 Bad Gateway : - - Le service formation-manager est-il démarré ? sudo systemctl status formation-manager - - Vérifiez les logs Nginx : sudo tail -f /var/log/nginx/error.log - -================================================================================ - LICENCE ET COPYRIGHT -================================================================================ - -Formation Manager Itinova -Version 7a737c05 - -Développé par Manus AI pour Itinova -© 2025 Itinova - Tous droits réservés - -Ce logiciel est fourni "tel quel", sans garantie d'aucune sorte. - -================================================================================ - FIN DU README -================================================================================ diff --git a/deployment-package/RELEASE_NOTES.md b/deployment-package/RELEASE_NOTES.md deleted file mode 100644 index 7f6a8b2..0000000 --- a/deployment-package/RELEASE_NOTES.md +++ /dev/null @@ -1,245 +0,0 @@ -# Notes de version - Formation Manager Itinova - -## Version 7a737c05 (24 novembre 2025) - -### 🎉 Nouvelles fonctionnalités - -#### Gestion des templates d'emails -- **Éditeur de texte riche (TipTap)** : Interface WYSIWYG complète pour formater les emails (gras, italique, titres, listes) -- **Variables dynamiques** : 7 boutons pour insérer rapidement des variables ({{nomApprenant}}, {{nomFormation}}, {{dateDebut}}, etc.) -- **Prévisualisation en temps réel** : Visualisation instantanée du rendu final pendant la modification -- **Bouton "Aperçu email"** : Modal affichant l'email complet avec variables remplacées par des données d'exemple -- **Remplacement automatique** : Les variables sont remplacées par les données réelles lors de l'envoi des emails - -#### Tableau de bord analytique avancé -- **Graphiques d'évolution temporelle** : Visualisation des inscriptions par mois sur 12 mois -- **Taux de remplissage mensuel** : Graphique linéaire montrant l'évolution du taux de remplissage -- **Top 10 établissements** : Graphique à barres des établissements les plus actifs -- **Répartition par fonction** : Graphique circulaire (Directeurs, Chefs de service, Autre) -- **Filtres de période** : Sélection rapide (dernier mois, trimestre, année, toutes les données) -- **Export Excel** : Téléchargement d'un rapport complet avec 5 feuilles détaillées - -#### Gestion des établissements -- **Page dédiée** : Liste complète de tous les établissements avec statistiques -- **Statistiques par établissement** : Nombre d'apprenants, apprenants actifs, taux de participation -- **Code couleur** : Indicateur visuel du taux de participation (vert >70%, orange 40-70%, rouge <40%) -- **Tri et recherche** : Filtrage rapide par nom d'établissement - -#### Badges de statut des apprenants -- **Badge "Actif"** (vert) : Apprenant inscrit à au moins une séquence -- **Badge "Inactif"** (gris) : Apprenant sans inscription active -- **Colonne dédiée** : Nouvelle colonne dans le tableau des apprenants - -### 🎨 Améliorations visuelles - -#### Interface générale -- **Menu réorganisé** : 4 zones distinctes avec séparateurs et titres en bleu - - Zone 1 : Tableau de bord - - Zone 2 : Gestion (Formations, Séquences, Calendrier, Apprenants) - - Zone 3 : Configuration (Utilisateurs, Rappels, Templates d'emails, Configuration SMTP) - - Zone 4 : Analyses (Établissements, Tableau de bord analytique, Rapport public cible) - -#### Gestion des séquences -- **Taux de remplissage coloré** : Vert (<70%), Orange (70-90%), Rouge (>90%) -- **Formations en couleur** : Chaque formation a une couleur unique (10 couleurs disponibles) -- **Icônes colorées** : Œil en bleu (visualisation), Corbeille en rouge (suppression) - -#### Gestion des apprenants -- **Fonction en couleur** : Directeurs (bleu), Chefs de service (vert), Autre (gris) -- **Icônes colorées** : Œil en bleu, Corbeille en rouge -- **Badge de statut** : Actif/Inactif visible immédiatement - -#### Tableau de bord principal -- **Graphique par établissement** : Ajout d'un second graphique à côté de la répartition par fonction -- **Cohérence des données** : Uniformisation des calculs entre tableau de bord principal et analytique - -### 🐛 Corrections de bugs - -- **Erreur calendrier** : Correction de l'erreur React #31 au clic sur un événement (objets Date convertis en string) -- **Menu invisible** : Ajout du wrapper DashboardLayout sur la page Établissements -- **Incohérence statistiques** : Uniformisation du calcul de répartition par fonction (comptage des apprenants uniques) -- **Couleurs formations** : Correction de l'algorithme pour assigner une couleur unique à chaque formation - -### 📚 Documentation - -- **Guide de déploiement complet** : Instructions détaillées pour déployer sur VPS (GUIDE_DEPLOIEMENT.md) -- **Script de déploiement** : Script bash automatisé pour installation initiale (deploy.sh) -- **Script de mise à jour** : Script simplifié pour les mises à jour rapides (update.sh) -- **Documentation de configuration** : Guide complet des variables d'environnement et paramètres (CONFIGURATION.md) - -### 🔧 Améliorations techniques - -- **React Quill remplacé par TipTap** : Compatibilité avec React 19 -- **Recharts intégré** : Bibliothèque de graphiques pour le tableau de bord analytique -- **ExcelJS intégré** : Export Excel des rapports analytiques -- **Requêtes analytiques optimisées** : Nouvelles fonctions dans analyticsDb.ts et etablissementsDb.ts - -### 📊 Statistiques de cette version - -- **Nouvelles pages** : 2 (AdminAnalytics, AdminEtablissements) -- **Nouveaux composants** : 1 (CapacityProgressBar amélioré) -- **Nouvelles fonctions backend** : 15+ (analytics, établissements, templates) -- **Lignes de code ajoutées** : ~3000 -- **Dépendances ajoutées** : 4 (@tiptap/react, @tiptap/starter-kit, recharts, exceljs) - ---- - -## Versions précédentes - -### Version 65a2d003 (23 novembre 2025) - -#### Corrections -- Correction de l'erreur d'affichage au clic sur un événement du calendrier -- Correction du problème de menu invisible sur la page Établissements - -### Version a0049436 (23 novembre 2025) - -#### Nouvelles fonctionnalités -- Badges de statut Actif/Inactif pour les apprenants -- Page Établissements avec statistiques de participation - -### Version 193ffd7e (23 novembre 2025) - -#### Corrections -- Correction de l'algorithme de couleur des formations (mapping basé sur l'ordre) - -### Version 9a38fc9d (23 novembre 2025) - -#### Améliorations visuelles -- Icône corbeille en rouge et icône œil en bleu dans la page des apprenants -- Fonction colorée (Directeurs, Chefs de service) dans le tableau des apprenants - -### Version d2bb185e (23 novembre 2025) - -#### Améliorations visuelles -- Icône œil en bleu dans la gestion des séquences -- Texte des formations coloré avec une couleur unique par formation - -### Version 41fc4874 (23 novembre 2025) - -#### Améliorations visuelles -- Taux de remplissage coloré dans la gestion des séquences (vert/orange/rouge) -- Icône corbeille en rouge - -### Version 3ec648f8 (23 novembre 2025) - -#### Nouvelles fonctionnalités -- Graphique de répartition par établissement sur le tableau de bord principal - -### Version a807183e (23 novembre 2025) - -#### Corrections -- Correction de l'incohérence des statistiques de répartition par fonction - -### Version 03efb59c (23 novembre 2025) - -#### Nouvelles fonctionnalités -- Filtres de période dans le tableau de bord analytique -- Export Excel des rapports analytiques - -### Version 64db3f1a (23 novembre 2025) - -#### Nouvelles fonctionnalités -- Tableau de bord analytique avancé avec graphiques Recharts - -### Version 33161d1a (23 novembre 2025) - -#### Nouvelles fonctionnalités -- Remplacement automatique des variables dans les emails -- Bouton "Aperçu email" avec modal de prévisualisation - -### Version 4e825dbf (23 novembre 2025) - -#### Corrections -- Remplacement de React Quill par TipTap (compatibilité React 19) - -### Version e16bdb22 (23 novembre 2025) - -#### Nouvelles fonctionnalités -- Éditeur WYSIWYG (React Quill) pour les templates d'emails -- Boutons de variables dynamiques - -### Version 3de0e393 (23 novembre 2025) - -#### Améliorations -- Prévisualisation en temps réel du contenu des templates d'emails - -### Version e4abeb5d (23 novembre 2025) - -#### Nouvelles fonctionnalités -- Champ "Corps du message" dans les templates d'emails avec validation backend - -### Version 62644d54 (23 novembre 2025) - -#### Nouvelles fonctionnalités -- Champ "Corps du message" dans l'interface de gestion des templates d'emails - ---- - -## Roadmap future - -### Fonctionnalités planifiées - -#### Court terme (1-2 mois) -- [ ] Système d'alertes automatiques configurables -- [ ] Export PDF des rapports analytiques -- [ ] Vue calendrier des séquences avec code couleur -- [ ] Filtre par formation dans le calendrier -- [ ] Recherche globale dans le header -- [ ] Badges de notification dans le menu - -#### Moyen terme (3-6 mois) -- [ ] Système de tags pour formations et séquences -- [ ] Rapports mensuels automatiques par email -- [ ] Vue détaillée par établissement avec liste des apprenants -- [ ] Statistiques d'emails envoyés -- [ ] Templates d'emails prédéfinis -- [ ] Comparaison de périodes dans les analytics - -#### Long terme (6-12 mois) -- [ ] API REST publique pour intégrations tierces -- [ ] Application mobile (React Native) -- [ ] Système de notifications push -- [ ] Intégration avec calendriers externes (Google Calendar, Outlook) -- [ ] Module de facturation et paiements -- [ ] Gestion multi-organisations - ---- - -## Migration depuis une version antérieure - -### Depuis la version 65a2d003 ou antérieure - -1. Sauvegardez votre base de données -2. Mettez à jour le code : `git pull origin main && git checkout 7a737c05` -3. Installez les nouvelles dépendances : `pnpm install` -4. Appliquez les migrations : `pnpm db:push` -5. Recompilez : `pnpm run build` -6. Redémarrez le service : `sudo systemctl restart formation-manager` - -**Nouvelles tables créées** : `alertes` -**Colonnes ajoutées** : `emailTemplates.bodyContent` - -### Vérification post-migration - -- [ ] Accès à la page Tableau de bord analytique -- [ ] Accès à la page Établissements -- [ ] Modification d'un template d'email avec le nouvel éditeur -- [ ] Export Excel depuis le tableau de bord analytique -- [ ] Vérification des badges de statut dans la liste des apprenants - ---- - -## Support et contact - -Pour toute question concernant cette version : - -- **Documentation** : Consultez GUIDE_DEPLOIEMENT.md et CONFIGURATION.md -- **Support Manus** : https://help.manus.im -- **Contact développeur** : o.pareige@itinova.org - ---- - -**Équipe de développement** -Manus AI - Formation Manager Itinova -© 2025 Itinova diff --git a/deployment-package/deploy.sh b/deployment-package/deploy.sh deleted file mode 100755 index bfa7d9a..0000000 --- a/deployment-package/deploy.sh +++ /dev/null @@ -1,273 +0,0 @@ -#!/bin/bash - -############################################################################### -# Script de déploiement - Gestion des Formations Manager Itinova -# Version: 1.0.0 -# Description: Script automatisé pour déployer l'application en production -############################################################################### - -set -e # Arrêter en cas d'erreur - -# Couleurs pour les messages -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -NC='\033[0m' # No Color - -# Fonction pour afficher les messages -log_info() { - echo -e "${GREEN}[INFO]${NC} $1" -} - -log_warn() { - echo -e "${YELLOW}[WARN]${NC} $1" -} - -log_error() { - echo -e "${RED}[ERROR]${NC} $1" -} - -# Fonction pour vérifier les prérequis -check_prerequisites() { - log_info "Vérification des prérequis..." - - # Vérifier Node.js - if ! command -v node &> /dev/null; then - log_error "Node.js n'est pas installé" - exit 1 - fi - - NODE_VERSION=$(node -v | cut -d'v' -f2 | cut -d'.' -f1) - if [ "$NODE_VERSION" -lt 18 ]; then - log_error "Node.js version 18+ est requis (version actuelle: $(node -v))" - exit 1 - fi - log_info "Node.js version: $(node -v) ✓" - - # Vérifier pnpm - if ! command -v pnpm &> /dev/null; then - log_warn "pnpm n'est pas installé. Installation..." - npm install -g pnpm - fi - log_info "pnpm version: $(pnpm -v) ✓" - - # Vérifier MySQL - if ! command -v mysql &> /dev/null; then - log_warn "MySQL client n'est pas installé" - else - log_info "MySQL client: ✓" - fi -} - -# Fonction pour créer le fichier .env si nécessaire -setup_env() { - log_info "Configuration des variables d'environnement..." - - if [ ! -f .env ]; then - log_warn "Fichier .env non trouvé. Création à partir du template..." - - cat > .env << 'EOF' -# Base de données -DATABASE_URL=mysql://user:password@localhost:3306/formation_manager - -# JWT Secret (IMPORTANT: Générer une clé aléatoire sécurisée) -JWT_SECRET=changez_cette_cle_secrete_par_une_valeur_aleatoire_tres_longue - -# OAuth Manus -OAUTH_SERVER_URL=https://api.manus.im -VITE_OAUTH_PORTAL_URL=https://login.manus.im -VITE_APP_ID= - -# Propriétaire -OWNER_OPEN_ID= -OWNER_NAME= - -# Application -VITE_APP_TITLE=Gestion des Formations Manager Itinova -VITE_APP_LOGO=/logo.svg - -# APIs Manus (optionnel) -BUILT_IN_FORGE_API_URL=https://forge.manus.im -BUILT_IN_FORGE_API_KEY= -VITE_FRONTEND_FORGE_API_KEY= -VITE_FRONTEND_FORGE_API_URL=https://forge.manus.im - -# Analytics (optionnel) -VITE_ANALYTICS_ENDPOINT= -VITE_ANALYTICS_WEBSITE_ID= - -# Environnement -NODE_ENV=production -EOF - - log_warn "Fichier .env créé. IMPORTANT: Modifiez les valeurs avant de continuer!" - log_warn "Éditez le fichier .env avec vos paramètres de production" - read -p "Appuyez sur Entrée après avoir configuré le fichier .env..." - else - log_info "Fichier .env trouvé ✓" - fi -} - -# Fonction pour installer les dépendances -install_dependencies() { - log_info "Installation des dépendances..." - pnpm install --frozen-lockfile - log_info "Dépendances installées ✓" -} - -# Fonction pour sauvegarder la base de données -backup_database() { - if [ -z "$DATABASE_URL" ]; then - log_warn "DATABASE_URL non définie, sauvegarde de la base de données ignorée" - return - fi - - log_info "Sauvegarde de la base de données..." - - BACKUP_DIR="./backups" - mkdir -p $BACKUP_DIR - - TIMESTAMP=$(date +%Y%m%d_%H%M%S) - BACKUP_FILE="$BACKUP_DIR/db_backup_$TIMESTAMP.sql" - - # Extraire les informations de connexion de DATABASE_URL - # Format: mysql://user:password@host:port/database - DB_USER=$(echo $DATABASE_URL | sed -n 's/.*:\/\/\([^:]*\):.*/\1/p') - DB_PASS=$(echo $DATABASE_URL | sed -n 's/.*:\/\/[^:]*:\([^@]*\)@.*/\1/p') - DB_HOST=$(echo $DATABASE_URL | sed -n 's/.*@\([^:]*\):.*/\1/p') - DB_PORT=$(echo $DATABASE_URL | sed -n 's/.*:\([0-9]*\)\/.*/\1/p') - DB_NAME=$(echo $DATABASE_URL | sed -n 's/.*\/\([^?]*\).*/\1/p') - - if command -v mysqldump &> /dev/null; then - mysqldump -h $DB_HOST -P $DB_PORT -u $DB_USER -p$DB_PASS $DB_NAME > $BACKUP_FILE 2>/dev/null || { - log_warn "Impossible de créer la sauvegarde de la base de données" - return - } - - gzip $BACKUP_FILE - log_info "Sauvegarde créée: $BACKUP_FILE.gz ✓" - - # Supprimer les sauvegardes de plus de 30 jours - find $BACKUP_DIR -name "db_backup_*.sql.gz" -mtime +30 -delete - else - log_warn "mysqldump non disponible, sauvegarde ignorée" - fi -} - -# Fonction pour appliquer les migrations -run_migrations() { - log_info "Application des migrations de base de données..." - pnpm db:push - log_info "Migrations appliquées ✓" -} - -# Fonction pour build l'application -build_app() { - log_info "Build de l'application..." - pnpm build - log_info "Build terminé ✓" -} - -# Fonction pour redémarrer le service -restart_service() { - if command -v systemctl &> /dev/null; then - SERVICE_NAME="formation-manager" - - if systemctl is-active --quiet $SERVICE_NAME; then - log_info "Redémarrage du service $SERVICE_NAME..." - sudo systemctl restart $SERVICE_NAME - - # Attendre que le service soit actif - sleep 3 - - if systemctl is-active --quiet $SERVICE_NAME; then - log_info "Service redémarré avec succès ✓" - else - log_error "Échec du redémarrage du service" - sudo systemctl status $SERVICE_NAME - exit 1 - fi - else - log_warn "Le service $SERVICE_NAME n'est pas actif" - log_info "Démarrage du service..." - sudo systemctl start $SERVICE_NAME - fi - else - log_warn "systemctl non disponible. Redémarrage manuel requis." - fi -} - -# Fonction pour vérifier le déploiement -verify_deployment() { - log_info "Vérification du déploiement..." - - # Vérifier que le serveur répond - if command -v curl &> /dev/null; then - sleep 2 - HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:3000 || echo "000") - - if [ "$HTTP_CODE" = "200" ] || [ "$HTTP_CODE" = "302" ]; then - log_info "Application accessible ✓" - else - log_warn "L'application ne répond pas correctement (HTTP $HTTP_CODE)" - fi - fi -} - -# Fonction principale -main() { - echo "╔════════════════════════════════════════════════════════════════╗" - echo "║ Déploiement - Gestion des Formations Manager Itinova ║" - echo "╚════════════════════════════════════════════════════════════════╝" - echo "" - - # Vérifier que nous sommes dans le bon répertoire - if [ ! -f "package.json" ]; then - log_error "Ce script doit être exécuté depuis la racine du projet" - exit 1 - fi - - # Étapes de déploiement - check_prerequisites - setup_env - - # Charger les variables d'environnement - if [ -f .env ]; then - export $(cat .env | grep -v '^#' | xargs) - fi - - # Demander confirmation avant de continuer - echo "" - log_warn "Le déploiement va:" - echo " 1. Sauvegarder la base de données" - echo " 2. Installer les dépendances" - echo " 3. Appliquer les migrations" - echo " 4. Builder l'application" - echo " 5. Redémarrer le service" - echo "" - read -p "Continuer? (y/N) " -n 1 -r - echo "" - - if [[ ! $REPLY =~ ^[Yy]$ ]]; then - log_info "Déploiement annulé" - exit 0 - fi - - backup_database - install_dependencies - run_migrations - build_app - restart_service - verify_deployment - - echo "" - echo "╔════════════════════════════════════════════════════════════════╗" - echo "║ Déploiement terminé avec succès! ✓ ║" - echo "╚════════════════════════════════════════════════════════════════╝" - echo "" - log_info "L'application est maintenant accessible" - log_info "Vérifiez les logs avec: sudo journalctl -u formation-manager -f" -} - -# Exécuter le script -main "$@" diff --git a/deployment-package/drizzle/meta/0000_snapshot.json b/deployment-package/drizzle/meta/0000_snapshot.json new file mode 100644 index 0000000..d0ae91e --- /dev/null +++ b/deployment-package/drizzle/meta/0000_snapshot.json @@ -0,0 +1,2123 @@ +{ + "version": "5", + "dialect": "mysql", + "id": "aa771876-44ab-4786-a5db-87b71c6e5674", + "prevId": "00000000-0000-0000-0000-000000000000", + "tables": { + "apprenants": { + "name": "apprenants", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "nom": { + "name": "nom", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "prenom": { + "name": "prenom", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "varchar(320)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "codeEtablissement": { + "name": "codeEtablissement", + "type": "varchar(50)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "fonction": { + "name": "fonction", + "type": "varchar(100)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "onUpdate": true, + "default": "(now())" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "apprenants_id": { + "name": "apprenants_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": { + "apprenants_email_unique": { + "name": "apprenants_email_unique", + "columns": [ + "email" + ] + } + }, + "checkConstraint": {} + }, + "attestations": { + "name": "attestations", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "apprenantId": { + "name": "apprenantId", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "sequenceId": { + "name": "sequenceId", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "inscriptionId": { + "name": "inscriptionId", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "urlPdf": { + "name": "urlPdf", + "type": "varchar(500)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "s3Key": { + "name": "s3Key", + "type": "varchar(500)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "documentUrl": { + "name": "documentUrl", + "type": "varchar(500)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "documentS3Key": { + "name": "documentS3Key", + "type": "varchar(500)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "uploadedBy": { + "name": "uploadedBy", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "uploadedAt": { + "name": "uploadedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "emailEnvoye": { + "name": "emailEnvoye", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "dateEnvoiEmail": { + "name": "dateEnvoiEmail", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "dateGeneration": { + "name": "dateGeneration", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "attestations_id": { + "name": "attestations_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "configAttestation": { + "name": "configAttestation", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "texteAttestation": { + "name": "texteAttestation", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "nomSignataire": { + "name": "nomSignataire", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "fonctionSignataire": { + "name": "fonctionSignataire", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "logoUrl": { + "name": "logoUrl", + "type": "varchar(500)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "logoS3Key": { + "name": "logoS3Key", + "type": "varchar(500)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "signatureUrl": { + "name": "signatureUrl", + "type": "varchar(500)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "signatureS3Key": { + "name": "signatureS3Key", + "type": "varchar(500)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "onUpdate": true, + "default": "(now())" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "configAttestation_id": { + "name": "configAttestation_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "datesFormation": { + "name": "datesFormation", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "sequenceId": { + "name": "sequenceId", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "ordre": { + "name": "ordre", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "dateDebut": { + "name": "dateDebut", + "type": "datetime", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "dateFin": { + "name": "dateFin", + "type": "datetime", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "datesFormation_id": { + "name": "datesFormation_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "emailConfig": { + "name": "emailConfig", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "provider": { + "name": "provider", + "type": "enum('resend','smtp','simulation')", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'simulation'" + }, + "resendApiKey": { + "name": "resendApiKey", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "smtpHost": { + "name": "smtpHost", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "smtpPort": { + "name": "smtpPort", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "smtpSecure": { + "name": "smtpSecure", + "type": "enum('tls','ssl','none')", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "smtpUser": { + "name": "smtpUser", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "smtpPassword": { + "name": "smtpPassword", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "fromEmail": { + "name": "fromEmail", + "type": "varchar(320)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "fromName": { + "name": "fromName", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "mode": { + "name": "mode", + "type": "enum('simulation','production')", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'simulation'" + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "onUpdate": true, + "default": "(now())" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "emailConfig_id": { + "name": "emailConfig_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "emailTemplates": { + "name": "emailTemplates", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "type": { + "name": "type", + "type": "enum('inscription','teaser','rappel','rappelJ1','rappel3','rappel4','rappel5','rappel6')", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "titre": { + "name": "titre", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "bodyContent": { + "name": "bodyContent", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "couleurPrincipale": { + "name": "couleurPrincipale", + "type": "varchar(7)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'#283581'" + }, + "couleurSecondaire": { + "name": "couleurSecondaire", + "type": "varchar(7)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'#0578BE'" + }, + "piedDePage": { + "name": "piedDePage", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "onUpdate": true, + "default": "(now())" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "emailTemplates_id": { + "name": "emailTemplates_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": { + "emailTemplates_type_unique": { + "name": "emailTemplates_type_unique", + "columns": [ + "type" + ] + } + }, + "checkConstraint": {} + }, + "envoisQuestionnaires": { + "name": "envoisQuestionnaires", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "questionnaireId": { + "name": "questionnaireId", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "sequenceId": { + "name": "sequenceId", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "apprenantId": { + "name": "apprenantId", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "varchar(100)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "dateEnvoi": { + "name": "dateEnvoi", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "dateReponse": { + "name": "dateReponse", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "statut": { + "name": "statut", + "type": "enum('envoye','repondu')", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'envoye'" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "envoisQuestionnaires_id": { + "name": "envoisQuestionnaires_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": { + "envoisQuestionnaires_token_unique": { + "name": "envoisQuestionnaires_token_unique", + "columns": [ + "token" + ] + } + }, + "checkConstraint": {} + }, + "formateurs": { + "name": "formateurs", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "nom": { + "name": "nom", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "varchar(320)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "onUpdate": true, + "default": "(now())" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "formateurs_id": { + "name": "formateurs_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "formations": { + "name": "formations", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "nom": { + "name": "nom", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "lienUnique": { + "name": "lienUnique", + "type": "varchar(100)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "actif": { + "name": "actif", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + }, + "modeAttestation": { + "name": "modeAttestation", + "type": "enum('auto','manuel')", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'auto'" + }, + "modeEnvoi": { + "name": "modeEnvoi", + "type": "enum('auto','manuel')", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'manuel'" + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "onUpdate": true, + "default": "(now())" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "formations_id": { + "name": "formations_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": { + "formations_lienUnique_unique": { + "name": "formations_lienUnique_unique", + "columns": [ + "lienUnique" + ] + } + }, + "checkConstraint": {} + }, + "historiqueAttestations": { + "name": "historiqueAttestations", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "sequenceId": { + "name": "sequenceId", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "apprenantId": { + "name": "apprenantId", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "dateEnvoi": { + "name": "dateEnvoi", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "statut": { + "name": "statut", + "type": "enum('envoye','erreur')", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "messageErreur": { + "name": "messageErreur", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "urlAttestation": { + "name": "urlAttestation", + "type": "varchar(500)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "historiqueAttestations_id": { + "name": "historiqueAttestations_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "historiqueParametres": { + "name": "historiqueParametres", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "userId": { + "name": "userId", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "userName": { + "name": "userName", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "champModifie": { + "name": "champModifie", + "type": "varchar(100)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "ancienneValeur": { + "name": "ancienneValeur", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "nouvelleValeur": { + "name": "nouvelleValeur", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "dateModification": { + "name": "dateModification", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "historiqueParametres_id": { + "name": "historiqueParametres_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "inscriptions": { + "name": "inscriptions", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "sequenceId": { + "name": "sequenceId", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "apprenantId": { + "name": "apprenantId", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "statut": { + "name": "statut", + "type": "enum('confirmee','en_attente','annulee')", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'confirmee'" + }, + "dateInscription": { + "name": "dateInscription", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "onUpdate": true, + "default": "(now())" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "inscriptions_id": { + "name": "inscriptions_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "logsNotifications": { + "name": "logsNotifications", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "type": { + "name": "type", + "type": "enum('inscription','annulation','capacite_atteinte','place_disponible','remerciement','formateur_inscription','formateur_annulation')", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "destinataire": { + "name": "destinataire", + "type": "varchar(320)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "sequenceId": { + "name": "sequenceId", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "apprenantId": { + "name": "apprenantId", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "statut": { + "name": "statut", + "type": "enum('succes','echec')", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "messageErreur": { + "name": "messageErreur", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "dateEnvoi": { + "name": "dateEnvoi", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "logsNotifications_id": { + "name": "logsNotifications_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "logsRappels": { + "name": "logsRappels", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "rappelId": { + "name": "rappelId", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "sequenceId": { + "name": "sequenceId", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "apprenantId": { + "name": "apprenantId", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "varchar(320)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "type": { + "name": "type", + "type": "enum('rappel','rappelJ1','rappel3','rappel4','rappel5','rappel6')", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "statut": { + "name": "statut", + "type": "enum('succes','echec')", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "messageErreur": { + "name": "messageErreur", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "nbTentatives": { + "name": "nbTentatives", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 1 + }, + "prochainEssai": { + "name": "prochainEssai", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "dateEnvoi": { + "name": "dateEnvoi", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "logsRappels_id": { + "name": "logsRappels_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "parametres": { + "name": "parametres", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "urlPublique": { + "name": "urlPublique", + "type": "varchar(500)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'https://formations.itinova.org'" + }, + "delaiExpirationQR": { + "name": "delaiExpirationQR", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 30 + }, + "dureeValiditeToken": { + "name": "dureeValiditeToken", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 24 + }, + "notificationsActives": { + "name": "notificationsActives", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "onUpdate": true, + "default": "(now())" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "parametres_id": { + "name": "parametres_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "passwordResetTokens": { + "name": "passwordResetTokens", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "userId": { + "name": "userId", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expiresAt": { + "name": "expiresAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "passwordResetTokens_id": { + "name": "passwordResetTokens_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": { + "passwordResetTokens_token_unique": { + "name": "passwordResetTokens_token_unique", + "columns": [ + "token" + ] + } + }, + "checkConstraint": {} + }, + "presences": { + "name": "presences", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "inscriptionId": { + "name": "inscriptionId", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "dateFormationId": { + "name": "dateFormationId", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "heurePresence": { + "name": "heurePresence", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "modeValidation": { + "name": "modeValidation", + "type": "enum('qrcode','manuel')", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "validateurId": { + "name": "validateurId", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "presences_id": { + "name": "presences_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "questionnaires": { + "name": "questionnaires", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "titre": { + "name": "titre", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "type": { + "name": "type", + "type": "enum('satisfaction','evaluation_pre','evaluation_post')", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "actif": { + "name": "actif", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "onUpdate": true, + "default": "(now())" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "questionnaires_id": { + "name": "questionnaires_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "questions": { + "name": "questions", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "questionnaireId": { + "name": "questionnaireId", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "texte": { + "name": "texte", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "typeQuestion": { + "name": "typeQuestion", + "type": "enum('choix_multiple','echelle','texte_libre','oui_non')", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "options": { + "name": "options", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "valeurMin": { + "name": "valeurMin", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "valeurMax": { + "name": "valeurMax", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "obligatoire": { + "name": "obligatoire", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "ordre": { + "name": "ordre", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "questions_id": { + "name": "questions_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "rappelDates": { + "name": "rappelDates", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "rappelId": { + "name": "rappelId", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "dateFormationId": { + "name": "dateFormationId", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "rappelDates_id": { + "name": "rappelDates_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "rappels": { + "name": "rappels", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "nom": { + "name": "nom", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "templateType": { + "name": "templateType", + "type": "enum('rappel','rappelJ1','rappel3','rappel4','rappel5','rappel6')", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "joursAvant": { + "name": "joursAvant", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "heureEnvoi": { + "name": "heureEnvoi", + "type": "varchar(5)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'09:00'" + }, + "timing": { + "name": "timing", + "type": "enum('pre_formation','post_formation')", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'pre_formation'" + }, + "nomFichier": { + "name": "nomFichier", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "urlFichier": { + "name": "urlFichier", + "type": "varchar(500)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "s3Key": { + "name": "s3Key", + "type": "varchar(500)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "typeFichier": { + "name": "typeFichier", + "type": "varchar(100)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "tailleFichier": { + "name": "tailleFichier", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "actif": { + "name": "actif", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + }, + "derniereExecution": { + "name": "derniereExecution", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "onUpdate": true, + "default": "(now())" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "rappels_id": { + "name": "rappels_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "reponsesQuestionnaires": { + "name": "reponsesQuestionnaires", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "questionnaireId": { + "name": "questionnaireId", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "sequenceId": { + "name": "sequenceId", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "apprenantId": { + "name": "apprenantId", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "dateReponse": { + "name": "dateReponse", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "reponsesQuestionnaires_id": { + "name": "reponsesQuestionnaires_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "reponsesQuestions": { + "name": "reponsesQuestions", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "reponseQuestionnaireId": { + "name": "reponseQuestionnaireId", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "questionId": { + "name": "questionId", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "reponseTexte": { + "name": "reponseTexte", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "reponseNumerique": { + "name": "reponseNumerique", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "reponsesQuestions_id": { + "name": "reponsesQuestions_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "sequences": { + "name": "sequences", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "formationId": { + "name": "formationId", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "nom": { + "name": "nom", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "lieu": { + "name": "lieu", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "capaciteMax": { + "name": "capaciteMax", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "statut": { + "name": "statut", + "type": "enum('ouverte','bloquee','terminee','fermee','annulee')", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'ouverte'" + }, + "publicCible": { + "name": "publicCible", + "type": "enum('directeur','chef_service','autre','tous')", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'tous'" + }, + "formateurId": { + "name": "formateurId", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "qrCodeToken": { + "name": "qrCodeToken", + "type": "varchar(100)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "onUpdate": true, + "default": "(now())" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "sequences_id": { + "name": "sequences_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": { + "sequences_qrCodeToken_unique": { + "name": "sequences_qrCodeToken_unique", + "columns": [ + "qrCodeToken" + ] + } + }, + "checkConstraint": {} + }, + "supportsFormation": { + "name": "supportsFormation", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "sequenceId": { + "name": "sequenceId", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "formateurId": { + "name": "formateurId", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "nomFichier": { + "name": "nomFichier", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "typeFichier": { + "name": "typeFichier", + "type": "varchar(100)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "tailleFichier": { + "name": "tailleFichier", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "urlFichier": { + "name": "urlFichier", + "type": "varchar(500)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "s3Key": { + "name": "s3Key", + "type": "varchar(500)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "supportsFormation_id": { + "name": "supportsFormation_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "users": { + "name": "users", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "openId": { + "name": "openId", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "varchar(320)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "username": { + "name": "username", + "type": "varchar(100)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "password": { + "name": "password", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "loginMethod": { + "name": "loginMethod", + "type": "varchar(64)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "role": { + "name": "role", + "type": "enum('user','admin','formateur')", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'user'" + }, + "isActive": { + "name": "isActive", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + }, + "formateurId": { + "name": "formateurId", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "onUpdate": true, + "default": "(now())" + }, + "lastSignedIn": { + "name": "lastSignedIn", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "users_id": { + "name": "users_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": { + "users_openId_unique": { + "name": "users_openId_unique", + "columns": [ + "openId" + ] + }, + "users_username_unique": { + "name": "users_username_unique", + "columns": [ + "username" + ] + } + }, + "checkConstraint": {} + } + }, + "views": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + }, + "internal": { + "tables": {}, + "indexes": {} + } +} \ No newline at end of file diff --git a/deployment-package/drizzle/meta/_journal.json b/deployment-package/drizzle/meta/_journal.json new file mode 100644 index 0000000..6f7b99a --- /dev/null +++ b/deployment-package/drizzle/meta/_journal.json @@ -0,0 +1,13 @@ +{ + "version": "7", + "dialect": "mysql", + "entries": [ + { + "idx": 0, + "version": "5", + "when": 1768296151204, + "tag": "0000_clean_justice", + "breakpoints": true + } + ] +} \ No newline at end of file diff --git a/deployment-package/drizzle/relations.ts b/deployment-package/drizzle/relations.ts new file mode 100644 index 0000000..941a268 --- /dev/null +++ b/deployment-package/drizzle/relations.ts @@ -0,0 +1 @@ +import {} from "./schema"; diff --git a/deployment-package/drizzle/schema.ts b/deployment-package/drizzle/schema.ts new file mode 100644 index 0000000..e0d9b2d --- /dev/null +++ b/deployment-package/drizzle/schema.ts @@ -0,0 +1,549 @@ +import { boolean, int, mysqlEnum, mysqlTable, text, timestamp, varchar, datetime, decimal } from "drizzle-orm/mysql-core"; + +/** + * Core user table backing auth flow. + * Extend this file with additional tables as your product grows. + * Columns use camelCase to match both database fields and generated types. + */ +export const users = mysqlTable("users", { + /** + * Surrogate primary key. Auto-incremented numeric value managed by the database. + * Use this for relations between tables. + */ + id: int("id").autoincrement().primaryKey(), + /** Manus OAuth identifier (openId) returned from the OAuth callback. Unique per user. */ + openId: varchar("openId", { length: 64 }).notNull().unique(), + name: text("name"), + email: varchar("email", { length: 320 }), + /** Identifiant de connexion unique pour l'utilisateur */ + username: varchar("username", { length: 100 }).unique(), + /** Mot de passe hashé (bcrypt) */ + password: varchar("password", { length: 255 }), + loginMethod: varchar("loginMethod", { length: 64 }), + role: mysqlEnum("role", ["user", "admin", "formateur"]).default("user").notNull(), + /** Statut du compte (actif/inactif) */ + isActive: boolean("isActive").default(true).notNull(), + /** ID du formateur associé (si role = formateur) */ + formateurId: int("formateurId"), + createdAt: timestamp("createdAt").defaultNow().notNull(), + updatedAt: timestamp("updatedAt").defaultNow().onUpdateNow().notNull(), + lastSignedIn: timestamp("lastSignedIn").defaultNow().notNull(), +}); + +export type User = typeof users.$inferSelect; +export type InsertUser = typeof users.$inferInsert; + +/** + * Table des tokens de réinitialisation de mot de passe + */ +export const passwordResetTokens = mysqlTable("passwordResetTokens", { + id: int("id").autoincrement().primaryKey(), + userId: int("userId").notNull(), + token: varchar("token", { length: 255 }).notNull().unique(), + expiresAt: timestamp("expiresAt").notNull(), + createdAt: timestamp("createdAt").defaultNow().notNull(), +}); + +export type PasswordResetToken = typeof passwordResetTokens.$inferSelect; +export type InsertPasswordResetToken = typeof passwordResetTokens.$inferInsert; + +/** + * Table des formations (ex: Manager Itinova) + */ +export const formations = mysqlTable("formations", { + id: int("id").autoincrement().primaryKey(), + nom: varchar("nom", { length: 255 }).notNull(), + description: text("description"), + /** Lien unique pour l'inscription à cette formation */ + lienUnique: varchar("lienUnique", { length: 100 }).notNull().unique(), + actif: boolean("actif").default(true).notNull(), + /** Mode de génération des attestations (auto = génération automatique, manuel = import de documents) */ + modeAttestation: mysqlEnum("modeAttestation", ["auto", "manuel"]).default("auto").notNull(), + /** Mode d'envoi des attestations (auto = envoi automatique, manuel = envoi manuel) */ + modeEnvoi: mysqlEnum("modeEnvoi", ["auto", "manuel"]).default("manuel").notNull(), + createdAt: timestamp("createdAt").defaultNow().notNull(), + updatedAt: timestamp("updatedAt").defaultNow().onUpdateNow().notNull(), +}); + +export type Formation = typeof formations.$inferSelect; +export type InsertFormation = typeof formations.$inferInsert; + +/** + * Table des séquences de formation (ex: Groupe A, Groupe B) + * Chaque séquence peut avoir jusqu'à 4 dates de formation + */ +export const sequences = mysqlTable("sequences", { + id: int("id").autoincrement().primaryKey(), + formationId: int("formationId").notNull(), + nom: varchar("nom", { length: 255 }).notNull(), + lieu: varchar("lieu", { length: 255 }).notNull(), + capaciteMax: int("capaciteMax").notNull(), + statut: mysqlEnum("statut", ["ouverte", "bloquee", "terminee", "fermee", "annulee"]).default("ouverte").notNull(), + /** Public cible de la séquence (Directeur, Chef de service, Autre, Tous) */ + publicCible: mysqlEnum("publicCible", ["directeur", "chef_service", "autre", "tous"]).default("tous").notNull(), + /** ID du formateur assigné à cette séquence */ + formateurId: int("formateurId"), + /** Token unique pour le QR code d'émargement */ + qrCodeToken: varchar("qrCodeToken", { length: 100 }).unique(), + createdAt: timestamp("createdAt").defaultNow().notNull(), + updatedAt: timestamp("updatedAt").defaultNow().onUpdateNow().notNull(), +}); + +export type Sequence = typeof sequences.$inferSelect; +export type InsertSequence = typeof sequences.$inferInsert; + +/** + * Table des dates de formation pour chaque séquence + * Une séquence peut avoir jusqu'à 4 dates + */ +export const datesFormation = mysqlTable("datesFormation", { + id: int("id").autoincrement().primaryKey(), + sequenceId: int("sequenceId").notNull(), + /** Ordre de la date (1, 2, 3 ou 4) */ + ordre: int("ordre").notNull(), + dateDebut: datetime("dateDebut").notNull(), + dateFin: datetime("dateFin").notNull(), + createdAt: timestamp("createdAt").defaultNow().notNull(), +}); + +export type DateFormation = typeof datesFormation.$inferSelect; +export type InsertDateFormation = typeof datesFormation.$inferInsert; + +/** + * Table des apprenants + */ +export const apprenants = mysqlTable("apprenants", { + id: int("id").autoincrement().primaryKey(), + nom: varchar("nom", { length: 255 }).notNull(), + prenom: varchar("prenom", { length: 255 }).notNull(), + email: varchar("email", { length: 320 }).notNull().unique(), + codeEtablissement: varchar("codeEtablissement", { length: 50 }), + /** Fonction de l'apprenant (Directeur, Chef de service, Autre) */ + fonction: varchar("fonction", { length: 100 }), + createdAt: timestamp("createdAt").defaultNow().notNull(), + updatedAt: timestamp("updatedAt").defaultNow().onUpdateNow().notNull(), +}); + +export type Apprenant = typeof apprenants.$inferSelect; +export type InsertApprenant = typeof apprenants.$inferInsert; + +/** + * Table des inscriptions + */ +export const inscriptions = mysqlTable("inscriptions", { + id: int("id").autoincrement().primaryKey(), + sequenceId: int("sequenceId").notNull(), + apprenantId: int("apprenantId").notNull(), + statut: mysqlEnum("statut", ["confirmee", "en_attente", "annulee"]).default("confirmee").notNull(), + dateInscription: timestamp("dateInscription").defaultNow().notNull(), + updatedAt: timestamp("updatedAt").defaultNow().onUpdateNow().notNull(), +}); + +export type Inscription = typeof inscriptions.$inferSelect; +export type InsertInscription = typeof inscriptions.$inferInsert; + +/** + * Table de configuration des emails + */ +export const emailConfig = mysqlTable("emailConfig", { + id: int("id").autoincrement().primaryKey(), + /** Provider d'envoi d'emails (resend, smtp, simulation) */ + provider: mysqlEnum("provider", ["resend", "smtp", "simulation"]).default("simulation").notNull(), + /** Clé API Resend */ + resendApiKey: varchar("resendApiKey", { length: 255 }), + /** Hôte SMTP */ + smtpHost: varchar("smtpHost", { length: 255 }), + /** Port SMTP */ + smtpPort: int("smtpPort"), + /** Sécurité SMTP (TLS, SSL, None) */ + smtpSecure: mysqlEnum("smtpSecure", ["tls", "ssl", "none"]), + /** Utilisateur SMTP */ + smtpUser: varchar("smtpUser", { length: 255 }), + /** Mot de passe SMTP */ + smtpPassword: varchar("smtpPassword", { length: 255 }), + /** Email expéditeur */ + fromEmail: varchar("fromEmail", { length: 320 }).notNull(), + /** Nom de l'expéditeur */ + fromName: varchar("fromName", { length: 255 }).notNull(), + /** Mode de fonctionnement (simulation ou production) */ + mode: mysqlEnum("mode", ["simulation", "production"]).default("simulation").notNull(), + createdAt: timestamp("createdAt").defaultNow().notNull(), + updatedAt: timestamp("updatedAt").defaultNow().onUpdateNow().notNull(), +}); + +export type EmailConfig = typeof emailConfig.$inferSelect; +export type InsertEmailConfig = typeof emailConfig.$inferInsert; + +/** + * Table des templates d'emails + */ +export const emailTemplates = mysqlTable("emailTemplates", { + id: int("id").autoincrement().primaryKey(), + /** Type de template (inscription, teaser, rappel, rappelJ1, rappel3, rappel4, rappel5, rappel6) */ + type: mysqlEnum("type", ["inscription", "teaser", "rappel", "rappelJ1", "rappel3", "rappel4", "rappel5", "rappel6"]).notNull().unique(), + titre: varchar("titre", { length: 255 }).notNull(), + /** Corps du message avec variables dynamiques */ + bodyContent: text("bodyContent").notNull(), + couleurPrincipale: varchar("couleurPrincipale", { length: 7 }).default("#283581").notNull(), + couleurSecondaire: varchar("couleurSecondaire", { length: 7 }).default("#0578BE").notNull(), + piedDePage: text("piedDePage"), + createdAt: timestamp("createdAt").defaultNow().notNull(), + updatedAt: timestamp("updatedAt").defaultNow().onUpdateNow().notNull(), +}); + +export type EmailTemplate = typeof emailTemplates.$inferSelect; +export type InsertEmailTemplate = typeof emailTemplates.$inferInsert; + +/** + * Table des formateurs + */ +export const formateurs = mysqlTable("formateurs", { + id: int("id").autoincrement().primaryKey(), + nom: varchar("nom", { length: 255 }).notNull(), + email: varchar("email", { length: 320 }), + createdAt: timestamp("createdAt").defaultNow().notNull(), + updatedAt: timestamp("updatedAt").defaultNow().onUpdateNow().notNull(), +}); + +export type Formateur = typeof formateurs.$inferSelect; +export type InsertFormateur = typeof formateurs.$inferInsert; + +/** + * Table des rappels automatiques + */ +export const rappels = mysqlTable("rappels", { + id: int("id").autoincrement().primaryKey(), + nom: varchar("nom", { length: 255 }).notNull(), + /** Type de template d'email à utiliser (rappel, rappelJ1, rappel3, rappel4, rappel5, rappel6) */ + templateType: mysqlEnum("templateType", ["rappel", "rappelJ1", "rappel3", "rappel4", "rappel5", "rappel6"]).notNull(), + /** Nombre de jours avant la séquence */ + joursAvant: int("joursAvant").notNull(), + /** Heure d'envoi (format HH:mm) */ + heureEnvoi: varchar("heureEnvoi", { length: 5 }).default("09:00").notNull(), + /** Timing du rappel (pre_formation ou post_formation) */ + timing: mysqlEnum("timing", ["pre_formation", "post_formation"]).default("pre_formation").notNull(), + /** Nom du fichier joint (optionnel) */ + nomFichier: varchar("nomFichier", { length: 255 }), + /** URL du fichier sur S3 (optionnel) */ + urlFichier: varchar("urlFichier", { length: 500 }), + /** Clé S3 du fichier (optionnel) */ + s3Key: varchar("s3Key", { length: 500 }), + /** Type MIME du fichier (optionnel) */ + typeFichier: varchar("typeFichier", { length: 100 }), + /** Taille du fichier en octets (optionnel) */ + tailleFichier: int("tailleFichier"), + actif: boolean("actif").default(true).notNull(), + derniereExecution: datetime("derniereExecution"), + createdAt: timestamp("createdAt").defaultNow().notNull(), + updatedAt: timestamp("updatedAt").defaultNow().onUpdateNow().notNull(), +}); + +export type Rappel = typeof rappels.$inferSelect; +export type InsertRappel = typeof rappels.$inferInsert; + +/** + * Table de liaison entre rappels et dates de formation + * Si aucune date n'est associée, le rappel s'applique à toutes les dates + */ +export const rappelDates = mysqlTable("rappelDates", { + id: int("id").autoincrement().primaryKey(), + rappelId: int("rappelId").notNull(), + dateFormationId: int("dateFormationId").notNull(), + createdAt: timestamp("createdAt").defaultNow().notNull(), +}); + +export type RappelDate = typeof rappelDates.$inferSelect; +export type InsertRappelDate = typeof rappelDates.$inferInsert; + +/** + * Table des logs de rappels envoyés + */ +export const logsRappels = mysqlTable("logsRappels", { + id: int("id").autoincrement().primaryKey(), + rappelId: int("rappelId").notNull(), + sequenceId: int("sequenceId").notNull(), + apprenantId: int("apprenantId").notNull(), + email: varchar("email", { length: 320 }).notNull(), + /** Type de rappel (rappel, rappelJ1, rappel3, rappel4, rappel5, rappel6) */ + type: mysqlEnum("type", ["rappel", "rappelJ1", "rappel3", "rappel4", "rappel5", "rappel6"]).notNull(), + statut: mysqlEnum("statut", ["succes", "echec"]).notNull(), + messageErreur: text("messageErreur"), + /** Nombre de tentatives d'envoi */ + nbTentatives: int("nbTentatives").default(1).notNull(), + /** Date du prochain essai en cas d'échec */ + prochainEssai: datetime("prochainEssai"), + dateEnvoi: timestamp("dateEnvoi").defaultNow().notNull(), +}); + +export type LogRappel = typeof logsRappels.$inferSelect; +export type InsertLogRappel = typeof logsRappels.$inferInsert; + +/** + * Table des questionnaires de satisfaction et d'évaluation + */ +export const questionnaires = mysqlTable("questionnaires", { + id: int("id").autoincrement().primaryKey(), + titre: varchar("titre", { length: 255 }).notNull(), + description: text("description"), + /** Type de questionnaire (satisfaction, evaluation_pre, evaluation_post) */ + type: mysqlEnum("type", ["satisfaction", "evaluation_pre", "evaluation_post"]).notNull(), + actif: boolean("actif").default(true).notNull(), + createdAt: timestamp("createdAt").defaultNow().notNull(), + updatedAt: timestamp("updatedAt").defaultNow().onUpdateNow().notNull(), +}); + +export type Questionnaire = typeof questionnaires.$inferSelect; +export type InsertQuestionnaire = typeof questionnaires.$inferInsert; + +/** + * Table des questions d'un questionnaire + */ +export const questions = mysqlTable("questions", { + id: int("id").autoincrement().primaryKey(), + questionnaireId: int("questionnaireId").notNull(), + texte: text("texte").notNull(), + /** Type de question (choix_multiple, echelle, texte_libre, oui_non) */ + typeQuestion: mysqlEnum("typeQuestion", ["choix_multiple", "echelle", "texte_libre", "oui_non"]).notNull(), + /** Options pour les questions à choix multiples (JSON) */ + options: text("options"), + /** Valeur minimale pour les échelles */ + valeurMin: int("valeurMin"), + /** Valeur maximale pour les échelles */ + valeurMax: int("valeurMax"), + obligatoire: boolean("obligatoire").default(false).notNull(), + ordre: int("ordre").notNull(), + createdAt: timestamp("createdAt").defaultNow().notNull(), +}); + +export type Question = typeof questions.$inferSelect; +export type InsertQuestion = typeof questions.$inferInsert; + +/** + * Table des réponses aux questionnaires + */ +export const reponsesQuestionnaires = mysqlTable("reponsesQuestionnaires", { + id: int("id").autoincrement().primaryKey(), + questionnaireId: int("questionnaireId").notNull(), + sequenceId: int("sequenceId").notNull(), + apprenantId: int("apprenantId").notNull(), + dateReponse: timestamp("dateReponse").defaultNow().notNull(), +}); + +export type ReponseQuestionnaire = typeof reponsesQuestionnaires.$inferSelect; +export type InsertReponseQuestionnaire = typeof reponsesQuestionnaires.$inferInsert; + +/** + * Table des réponses individuelles aux questions + */ +export const reponsesQuestions = mysqlTable("reponsesQuestions", { + id: int("id").autoincrement().primaryKey(), + reponseQuestionnaireId: int("reponseQuestionnaireId").notNull(), + questionId: int("questionId").notNull(), + /** Réponse textuelle */ + reponseTexte: text("reponseTexte"), + /** Réponse numérique (pour échelles et oui/non) */ + reponseNumerique: int("reponseNumerique"), + createdAt: timestamp("createdAt").defaultNow().notNull(), +}); + +export type ReponseQuestion = typeof reponsesQuestions.$inferSelect; +export type InsertReponseQuestion = typeof reponsesQuestions.$inferInsert; + +/** + * Table des envois de questionnaires + */ +export const envoisQuestionnaires = mysqlTable("envoisQuestionnaires", { + id: int("id").autoincrement().primaryKey(), + questionnaireId: int("questionnaireId").notNull(), + sequenceId: int("sequenceId").notNull(), + apprenantId: int("apprenantId").notNull(), + /** Token unique pour accéder au questionnaire */ + token: varchar("token", { length: 100 }).notNull().unique(), + dateEnvoi: timestamp("dateEnvoi").defaultNow().notNull(), + dateReponse: timestamp("dateReponse"), + statut: mysqlEnum("statut", ["envoye", "repondu"]).default("envoye").notNull(), +}); + +export type EnvoiQuestionnaire = typeof envoisQuestionnaires.$inferSelect; +export type InsertEnvoiQuestionnaire = typeof envoisQuestionnaires.$inferInsert; + +/** + * Table des supports de formation uploadés par les formateurs + */ +export const supportsFormation = mysqlTable("supportsFormation", { + id: int("id").autoincrement().primaryKey(), + sequenceId: int("sequenceId").notNull(), + formateurId: int("formateurId").notNull(), + nomFichier: varchar("nomFichier", { length: 255 }).notNull(), + typeFichier: varchar("typeFichier", { length: 100 }).notNull(), + tailleFichier: int("tailleFichier").notNull(), + urlFichier: varchar("urlFichier", { length: 500 }).notNull(), + s3Key: varchar("s3Key", { length: 500 }).notNull(), + description: text("description"), + createdAt: timestamp("createdAt").defaultNow().notNull(), +}); + +export type SupportFormation = typeof supportsFormation.$inferSelect; +export type InsertSupportFormation = typeof supportsFormation.$inferInsert; + +/** + * Table des présences (émargement) + */ +export const presences = mysqlTable("presences", { + id: int("id").autoincrement().primaryKey(), + inscriptionId: int("inscriptionId").notNull(), + dateFormationId: int("dateFormationId").notNull(), + heurePresence: timestamp("heurePresence").defaultNow().notNull(), + /** Mode de validation (qrcode, manuel) */ + modeValidation: mysqlEnum("modeValidation", ["qrcode", "manuel"]).notNull(), + /** ID de l'utilisateur qui a validé (formateur ou admin) */ + validateurId: int("validateurId"), + createdAt: timestamp("createdAt").defaultNow().notNull(), +}); + +export type Presence = typeof presences.$inferSelect; +export type InsertPresence = typeof presences.$inferInsert; + +/** + * Table des attestations de formation + */ +export const attestations = mysqlTable("attestations", { + id: int("id").autoincrement().primaryKey(), + apprenantId: int("apprenantId").notNull(), + sequenceId: int("sequenceId").notNull(), + inscriptionId: int("inscriptionId").notNull(), + urlPdf: varchar("urlPdf", { length: 500 }), + s3Key: varchar("s3Key", { length: 500 }), + /** URL du document uploadé manuellement */ + documentUrl: varchar("documentUrl", { length: 500 }), + /** Clé S3 du document uploadé manuellement */ + documentS3Key: varchar("documentS3Key", { length: 500 }), + /** ID de l'utilisateur qui a uploadé le document */ + uploadedBy: int("uploadedBy"), + /** Date d'upload du document */ + uploadedAt: timestamp("uploadedAt"), + /** Email envoyé ou non */ + emailEnvoye: boolean("emailEnvoye").default(false).notNull(), + /** Date d'envoi de l'email */ + dateEnvoiEmail: timestamp("dateEnvoiEmail"), + dateGeneration: timestamp("dateGeneration").defaultNow().notNull(), +}); + +export type Attestation = typeof attestations.$inferSelect; +export type InsertAttestation = typeof attestations.$inferInsert; + +/** + * Table de configuration des attestations + */ +export const configAttestation = mysqlTable("configAttestation", { + id: int("id").autoincrement().primaryKey(), + /** Texte personnalisable de l'attestation avec variables dynamiques */ + texteAttestation: text("texteAttestation").notNull(), + /** Nom du signataire */ + nomSignataire: varchar("nomSignataire", { length: 255 }).notNull(), + /** Fonction du signataire */ + fonctionSignataire: varchar("fonctionSignataire", { length: 255 }).notNull(), + /** URL du logo sur S3 */ + logoUrl: varchar("logoUrl", { length: 500 }), + /** Clé S3 du logo */ + logoS3Key: varchar("logoS3Key", { length: 500 }), + /** URL de la signature sur S3 */ + signatureUrl: varchar("signatureUrl", { length: 500 }), + /** Clé S3 de la signature */ + signatureS3Key: varchar("signatureS3Key", { length: 500 }), + updatedAt: timestamp("updatedAt").defaultNow().onUpdateNow().notNull(), +}); + +export type ConfigAttestation = typeof configAttestation.$inferSelect; +export type InsertConfigAttestation = typeof configAttestation.$inferInsert; + +/** + * Table des notifications envoyées + */ +export const logsNotifications = mysqlTable("logsNotifications", { + id: int("id").autoincrement().primaryKey(), + /** Type de notification */ + type: mysqlEnum("type", [ + "inscription", + "annulation", + "capacite_atteinte", + "place_disponible", + "remerciement", + "formateur_inscription", + "formateur_annulation" + ]).notNull(), + /** Email du destinataire */ + destinataire: varchar("destinataire", { length: 320 }).notNull(), + /** ID de la séquence concernée */ + sequenceId: int("sequenceId"), + /** ID de l'apprenant concerné */ + apprenantId: int("apprenantId"), + /** Statut de l'envoi */ + statut: mysqlEnum("statut", ["succes", "echec"]).notNull(), + /** Message d'erreur en cas d'échec */ + messageErreur: text("messageErreur"), + dateEnvoi: timestamp("dateEnvoi").defaultNow().notNull(), +}); + +export type LogNotification = typeof logsNotifications.$inferSelect; +export type InsertLogNotification = typeof logsNotifications.$inferInsert; + +/** + * Table des paramètres de l'application + * Stocke les paramètres globaux de configuration + */ +export const parametres = mysqlTable("parametres", { + id: int("id").autoincrement().primaryKey(), + /** URL publique de l'application pour les QR codes d'émargement */ + urlPublique: varchar("urlPublique", { length: 500 }).notNull().default("https://formations.itinova.org"), + /** Délai d'expiration des QR codes en minutes (par défaut 30 minutes) */ + delaiExpirationQR: int("delaiExpirationQR").default(30).notNull(), + /** Durée de validité des tokens d'émargement en heures (par défaut 24 heures) */ + dureeValiditeToken: int("dureeValiditeToken").default(24).notNull(), + /** Activer ou désactiver les notifications automatiques */ + notificationsActives: boolean("notificationsActives").default(true).notNull(), + updatedAt: timestamp("updatedAt").defaultNow().onUpdateNow().notNull(), +}); + +export type Parametre = typeof parametres.$inferSelect; +export type InsertParametre = typeof parametres.$inferInsert; + +/** + * Table de l'historique des modifications des paramètres + * Permet de tracer qui a modifié quoi et quand + */ +export const historiqueParametres = mysqlTable("historiqueParametres", { + id: int("id").autoincrement().primaryKey(), + /** ID de l'utilisateur qui a effectué la modification */ + userId: int("userId").notNull(), + /** Nom de l'utilisateur (pour historique même si user supprimé) */ + userName: varchar("userName", { length: 255 }).notNull(), + /** Champ modifié */ + champModifie: varchar("champModifie", { length: 100 }).notNull(), + /** Ancienne valeur (JSON) */ + ancienneValeur: text("ancienneValeur"), + /** Nouvelle valeur (JSON) */ + nouvelleValeur: text("nouvelleValeur"), + dateModification: timestamp("dateModification").defaultNow().notNull(), +}); + +export type HistoriqueParametre = typeof historiqueParametres.$inferSelect; +export type InsertHistoriqueParametre = typeof historiqueParametres.$inferInsert; + +/** + * Table de l'historique des envois d'attestations de formation + * Permet de tracer tous les envois d'attestations + */ +export const historiqueAttestations = mysqlTable("historiqueAttestations", { + id: int("id").autoincrement().primaryKey(), + sequenceId: int("sequenceId").notNull(), + apprenantId: int("apprenantId").notNull(), + dateEnvoi: timestamp("dateEnvoi").defaultNow().notNull(), + statut: mysqlEnum("statut", ["envoye", "erreur"]).notNull(), + messageErreur: text("messageErreur"), + urlAttestation: varchar("urlAttestation", { length: 500 }), + createdAt: timestamp("createdAt").defaultNow().notNull(), +}); + +export type HistoriqueAttestation = typeof historiqueAttestations.$inferSelect; +export type InsertHistoriqueAttestation = typeof historiqueAttestations.$inferInsert; diff --git a/deployment-package/package.json b/deployment-package/package.json new file mode 100644 index 0000000..6ed978c --- /dev/null +++ b/deployment-package/package.json @@ -0,0 +1,136 @@ +{ + "name": "formation-manager-itinova", + "version": "1.0.0", + "type": "module", + "license": "MIT", + "scripts": { + "dev": "NODE_ENV=development tsx watch server/_core/index.ts", + "build": "vite build && esbuild server/_core/index.ts --platform=node --packages=external --bundle --format=esm --outdir=dist", + "start": "NODE_ENV=production node dist/index.js", + "check": "tsc --noEmit", + "format": "prettier --write .", + "test": "vitest run", + "db:push": "drizzle-kit generate && drizzle-kit migrate" + }, + "dependencies": { + "@aws-sdk/client-s3": "^3.693.0", + "@aws-sdk/s3-request-presigner": "^3.693.0", + "@radix-ui/react-accordion": "^1.2.12", + "@radix-ui/react-alert-dialog": "^1.1.15", + "@radix-ui/react-aspect-ratio": "^1.1.7", + "@radix-ui/react-avatar": "^1.1.10", + "@radix-ui/react-checkbox": "^1.3.3", + "@radix-ui/react-collapsible": "^1.1.12", + "@radix-ui/react-context-menu": "^2.2.16", + "@radix-ui/react-dialog": "^1.1.15", + "@radix-ui/react-dropdown-menu": "^2.1.16", + "@radix-ui/react-hover-card": "^1.1.15", + "@radix-ui/react-label": "^2.1.7", + "@radix-ui/react-menubar": "^1.1.16", + "@radix-ui/react-navigation-menu": "^1.2.14", + "@radix-ui/react-popover": "^1.1.15", + "@radix-ui/react-progress": "^1.1.7", + "@radix-ui/react-radio-group": "^1.3.8", + "@radix-ui/react-scroll-area": "^1.2.10", + "@radix-ui/react-select": "^2.2.6", + "@radix-ui/react-separator": "^1.1.7", + "@radix-ui/react-slider": "^1.3.6", + "@radix-ui/react-slot": "^1.2.3", + "@radix-ui/react-switch": "^1.2.6", + "@radix-ui/react-tabs": "^1.1.13", + "@radix-ui/react-toggle": "^1.1.10", + "@radix-ui/react-toggle-group": "^1.1.11", + "@radix-ui/react-tooltip": "^1.2.8", + "@tanstack/react-query": "^5.90.2", + "@tiptap/extension-color": "^3.11.0", + "@tiptap/extension-link": "^3.11.0", + "@tiptap/extension-text-style": "^3.11.0", + "@tiptap/react": "^3.11.0", + "@tiptap/starter-kit": "^3.11.0", + "@trpc/client": "^11.6.0", + "@trpc/react-query": "^11.6.0", + "@trpc/server": "^11.6.0", + "@types/multer": "^2.0.0", + "@types/pdfkit": "^0.17.4", + "axios": "^1.12.0", + "bcryptjs": "^3.0.3", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "cmdk": "^1.1.1", + "cookie": "^1.0.2", + "date-fns": "^4.1.0", + "dotenv": "^17.2.2", + "drizzle-orm": "^0.44.5", + "embla-carousel-react": "^8.6.0", + "exceljs": "^4.4.0", + "express": "^4.21.2", + "framer-motion": "^12.23.22", + "input-otp": "^1.4.2", + "jose": "6.1.0", + "jsonwebtoken": "^9.0.2", + "jspdf": "^3.0.3", + "jspdf-autotable": "^5.0.2", + "lucide-react": "^0.453.0", + "multer": "^2.0.2", + "mysql2": "^3.15.0", + "nanoid": "^5.1.5", + "next-themes": "^0.4.6", + "nodemailer": "^7.0.11", + "openai": "^4.67.0", + "pdfkit": "^0.17.2", + "qrcode": "^1.5.4", + "react": "^19.1.1", + "react-day-picker": "^9.11.1", + "react-dom": "^19.1.1", + "react-hook-form": "^7.64.0", + "react-resizable-panels": "^3.0.6", + "recharts": "^2.15.4", + "sonner": "^2.0.7", + "streamdown": "^1.4.0", + "superjson": "^1.13.3", + "tailwind-merge": "^3.3.1", + "tailwindcss-animate": "^1.0.7", + "vaul": "^1.1.2", + "wouter": "^3.3.5", + "xlsx": "^0.18.5", + "zod": "^4.1.12" + }, + "devDependencies": { + "@builder.io/vite-plugin-jsx-loc": "^0.1.1", + "@tailwindcss/typography": "^0.5.15", + "@tailwindcss/vite": "^4.1.3", + "@types/bcryptjs": "^3.0.0", + "@types/express": "4.17.21", + "@types/google.maps": "^3.58.1", + "@types/jsonwebtoken": "^9.0.10", + "@types/node": "^24.7.0", + "@types/nodemailer": "^7.0.4", + "@types/qrcode": "^1.5.6", + "@types/react": "^19.1.16", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.4", + "add": "^2.0.6", + "autoprefixer": "^10.4.20", + "drizzle-kit": "^0.31.4", + "esbuild": "^0.25.0", + "pnpm": "^10.15.1", + "postcss": "^8.4.47", + "prettier": "^3.6.2", + "tailwindcss": "^4.1.14", + "tsx": "^4.19.1", + "tw-animate-css": "^1.4.0", + "typescript": "5.9.3", + "vite": "^7.1.7", + "vite-plugin-manus-runtime": "^0.0.56", + "vitest": "^2.1.4" + }, + "packageManager": "pnpm@10.4.1+sha512.c753b6c3ad7afa13af388fa6d808035a008e30ea9993f58c6663e2bc5ff21679aa834db094987129aa4d488b86df57f7b634981b2f827cdcacc698cc0cfb88af", + "pnpm": { + "patchedDependencies": { + "wouter@3.7.1": "patches/wouter@3.7.1.patch" + }, + "overrides": { + "tailwindcss>nanoid": "3.3.7" + } + } +} \ No newline at end of file diff --git a/deployment-package/pnpm-lock.yaml b/deployment-package/pnpm-lock.yaml new file mode 100644 index 0000000..5bf8408 --- /dev/null +++ b/deployment-package/pnpm-lock.yaml @@ -0,0 +1,11959 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +overrides: + tailwindcss>nanoid: 3.3.7 + +patchedDependencies: + wouter@3.7.1: + hash: 4e16e6ff3fde7d6c1024d3e0c8605dc9eb6afb690d0d49958c2f449091813072 + path: patches/wouter@3.7.1.patch + +importers: + + .: + dependencies: + '@aws-sdk/client-s3': + specifier: ^3.693.0 + version: 3.907.0 + '@aws-sdk/s3-request-presigner': + specifier: ^3.693.0 + version: 3.907.0 + '@radix-ui/react-accordion': + specifier: ^1.2.12 + version: 1.2.12(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-alert-dialog': + specifier: ^1.1.15 + version: 1.1.15(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-aspect-ratio': + specifier: ^1.1.7 + version: 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-avatar': + specifier: ^1.1.10 + version: 1.1.10(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-checkbox': + specifier: ^1.3.3 + version: 1.3.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-collapsible': + specifier: ^1.1.12 + version: 1.1.12(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-context-menu': + specifier: ^2.2.16 + version: 2.2.16(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-dialog': + specifier: ^1.1.15 + version: 1.1.15(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-dropdown-menu': + specifier: ^2.1.16 + version: 2.1.16(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-hover-card': + specifier: ^1.1.15 + version: 1.1.15(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-label': + specifier: ^2.1.7 + version: 2.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-menubar': + specifier: ^1.1.16 + version: 1.1.16(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-navigation-menu': + specifier: ^1.2.14 + version: 1.2.14(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-popover': + specifier: ^1.1.15 + version: 1.1.15(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-progress': + specifier: ^1.1.7 + version: 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-radio-group': + specifier: ^1.3.8 + version: 1.3.8(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-scroll-area': + specifier: ^1.2.10 + version: 1.2.10(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-select': + specifier: ^2.2.6 + version: 2.2.6(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-separator': + specifier: ^1.1.7 + version: 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slider': + specifier: ^1.3.6 + version: 1.3.6(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slot': + specifier: ^1.2.3 + version: 1.2.3(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-switch': + specifier: ^1.2.6 + version: 1.2.6(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-tabs': + specifier: ^1.1.13 + version: 1.1.13(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-toggle': + specifier: ^1.1.10 + version: 1.1.10(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-toggle-group': + specifier: ^1.1.11 + version: 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-tooltip': + specifier: ^1.2.8 + version: 1.2.8(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@tanstack/react-query': + specifier: ^5.90.2 + version: 5.90.2(react@19.2.0) + '@tiptap/extension-color': + specifier: ^3.11.0 + version: 3.11.0(@tiptap/extension-text-style@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))) + '@tiptap/extension-link': + specifier: ^3.11.0 + version: 3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0) + '@tiptap/extension-text-style': + specifier: ^3.11.0 + version: 3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0)) + '@tiptap/react': + specifier: ^3.11.0 + version: 3.11.0(@floating-ui/dom@1.7.4)(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0)(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@tiptap/starter-kit': + specifier: ^3.11.0 + version: 3.11.0 + '@trpc/client': + specifier: ^11.6.0 + version: 11.6.0(@trpc/server@11.6.0(typescript@5.9.3))(typescript@5.9.3) + '@trpc/react-query': + specifier: ^11.6.0 + version: 11.6.0(@tanstack/react-query@5.90.2(react@19.2.0))(@trpc/client@11.6.0(@trpc/server@11.6.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.6.0(typescript@5.9.3))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + '@trpc/server': + specifier: ^11.6.0 + version: 11.6.0(typescript@5.9.3) + '@types/multer': + specifier: ^2.0.0 + version: 2.0.0 + '@types/pdfkit': + specifier: ^0.17.4 + version: 0.17.4 + axios: + specifier: ^1.12.0 + version: 1.12.2 + bcryptjs: + specifier: ^3.0.3 + version: 3.0.3 + class-variance-authority: + specifier: ^0.7.1 + version: 0.7.1 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + cmdk: + specifier: ^1.1.1 + version: 1.1.1(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + cookie: + specifier: ^1.0.2 + version: 1.0.2 + date-fns: + specifier: ^4.1.0 + version: 4.1.0 + dotenv: + specifier: ^17.2.2 + version: 17.2.3 + drizzle-orm: + specifier: ^0.44.5 + version: 0.44.6(mysql2@3.15.1) + embla-carousel-react: + specifier: ^8.6.0 + version: 8.6.0(react@19.2.0) + exceljs: + specifier: ^4.4.0 + version: 4.4.0 + express: + specifier: ^4.21.2 + version: 4.21.2 + framer-motion: + specifier: ^12.23.22 + version: 12.23.22(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + input-otp: + specifier: ^1.4.2 + version: 1.4.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + jose: + specifier: 6.1.0 + version: 6.1.0 + jsonwebtoken: + specifier: ^9.0.2 + version: 9.0.2 + jspdf: + specifier: ^3.0.3 + version: 3.0.3 + jspdf-autotable: + specifier: ^5.0.2 + version: 5.0.2(jspdf@3.0.3) + lucide-react: + specifier: ^0.453.0 + version: 0.453.0(react@19.2.0) + multer: + specifier: ^2.0.2 + version: 2.0.2 + mysql2: + specifier: ^3.15.0 + version: 3.15.1 + nanoid: + specifier: ^5.1.5 + version: 5.1.6 + next-themes: + specifier: ^0.4.6 + version: 0.4.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + nodemailer: + specifier: ^7.0.11 + version: 7.0.11 + openai: + specifier: ^4.67.0 + version: 4.104.0(zod@4.1.12) + pdfkit: + specifier: ^0.17.2 + version: 0.17.2 + qrcode: + specifier: ^1.5.4 + version: 1.5.4 + react: + specifier: ^19.1.1 + version: 19.2.0 + react-day-picker: + specifier: ^9.11.1 + version: 9.11.1(react@19.2.0) + react-dom: + specifier: ^19.1.1 + version: 19.2.0(react@19.2.0) + react-hook-form: + specifier: ^7.64.0 + version: 7.64.0(react@19.2.0) + react-resizable-panels: + specifier: ^3.0.6 + version: 3.0.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + recharts: + specifier: ^2.15.4 + version: 2.15.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + sonner: + specifier: ^2.0.7 + version: 2.0.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + streamdown: + specifier: ^1.4.0 + version: 1.4.0(@types/react@19.2.2)(react@19.2.0) + superjson: + specifier: ^1.13.3 + version: 1.13.3 + tailwind-merge: + specifier: ^3.3.1 + version: 3.3.1 + tailwindcss-animate: + specifier: ^1.0.7 + version: 1.0.7(tailwindcss@4.1.14) + vaul: + specifier: ^1.1.2 + version: 1.1.2(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + wouter: + specifier: ^3.3.5 + version: 3.7.1(patch_hash=4e16e6ff3fde7d6c1024d3e0c8605dc9eb6afb690d0d49958c2f449091813072)(react@19.2.0) + xlsx: + specifier: ^0.18.5 + version: 0.18.5 + zod: + specifier: ^4.1.12 + version: 4.1.12 + devDependencies: + '@builder.io/vite-plugin-jsx-loc': + specifier: ^0.1.1 + version: 0.1.1(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.20.6)) + '@tailwindcss/typography': + specifier: ^0.5.15 + version: 0.5.19(tailwindcss@4.1.14) + '@tailwindcss/vite': + specifier: ^4.1.3 + version: 4.1.14(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.20.6)) + '@types/bcryptjs': + specifier: ^3.0.0 + version: 3.0.0 + '@types/express': + specifier: 4.17.21 + version: 4.17.21 + '@types/google.maps': + specifier: ^3.58.1 + version: 3.58.1 + '@types/jsonwebtoken': + specifier: ^9.0.10 + version: 9.0.10 + '@types/node': + specifier: ^24.7.0 + version: 24.7.0 + '@types/nodemailer': + specifier: ^7.0.4 + version: 7.0.4 + '@types/qrcode': + specifier: ^1.5.6 + version: 1.5.6 + '@types/react': + specifier: ^19.1.16 + version: 19.2.2 + '@types/react-dom': + specifier: ^19.1.9 + version: 19.2.1(@types/react@19.2.2) + '@vitejs/plugin-react': + specifier: ^5.0.4 + version: 5.0.4(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.20.6)) + add: + specifier: ^2.0.6 + version: 2.0.6 + autoprefixer: + specifier: ^10.4.20 + version: 10.4.21(postcss@8.5.6) + drizzle-kit: + specifier: ^0.31.4 + version: 0.31.5 + esbuild: + specifier: ^0.25.0 + version: 0.25.10 + pnpm: + specifier: ^10.15.1 + version: 10.18.0 + postcss: + specifier: ^8.4.47 + version: 8.5.6 + prettier: + specifier: ^3.6.2 + version: 3.6.2 + tailwindcss: + specifier: ^4.1.14 + version: 4.1.14 + tsx: + specifier: ^4.19.1 + version: 4.20.6 + tw-animate-css: + specifier: ^1.4.0 + version: 1.4.0 + typescript: + specifier: 5.9.3 + version: 5.9.3 + vite: + specifier: ^7.1.7 + version: 7.1.9(@types/node@24.7.0)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.20.6) + vite-plugin-manus-runtime: + specifier: ^0.0.56 + version: 0.0.56 + vitest: + specifier: ^2.1.4 + version: 2.1.9(@types/node@24.7.0)(lightningcss@1.30.1) + +packages: + + '@antfu/install-pkg@1.1.0': + resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} + + '@antfu/utils@9.3.0': + resolution: {integrity: sha512-9hFT4RauhcUzqOE4f1+frMKLZrgNog5b06I7VmZQV1BkvwvqrbC8EBZf3L1eEL2AKb6rNKjER0sEvJiSP1FXEA==} + + '@aws-crypto/crc32@5.2.0': + resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} + engines: {node: '>=16.0.0'} + + '@aws-crypto/crc32c@5.2.0': + resolution: {integrity: sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==} + + '@aws-crypto/sha1-browser@5.2.0': + resolution: {integrity: sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==} + + '@aws-crypto/sha256-browser@5.2.0': + resolution: {integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==} + + '@aws-crypto/sha256-js@5.2.0': + resolution: {integrity: sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==} + engines: {node: '>=16.0.0'} + + '@aws-crypto/supports-web-crypto@5.2.0': + resolution: {integrity: sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==} + + '@aws-crypto/util@5.2.0': + resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} + + '@aws-sdk/client-s3@3.907.0': + resolution: {integrity: sha512-A606SYZtnrVDuuQTsG5fEurHMUeJeqh5TFLx0m3t2x27USuLH0dlw9s2ygFFdAcyzVG7u+my0CIMNQPWida/NA==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/client-sesv2@3.940.0': + resolution: {integrity: sha512-jDQ4x2HwB2/UXBS7CTeSDiIb+sVsYGDyxTeXdrRAtqNdGv8kC54fbwokDiJ/mnMyB2gyXWw57BqeDJNkZuLmsw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/client-sso@3.907.0': + resolution: {integrity: sha512-ANuu0duNTcQHv0g5YrEuWImT8o9t6li3A+MtAaKxIbTA3eFQnl6xHDxyrbsrU19FtKPg3CWhvfY04j6DaDvR8g==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/client-sso@3.940.0': + resolution: {integrity: sha512-SdqJGWVhmIURvCSgkDditHRO+ozubwZk9aCX9MK8qxyOndhobCndW1ozl3hX9psvMAo9Q4bppjuqy/GHWpjB+A==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/core@3.907.0': + resolution: {integrity: sha512-vuIHL8qUcA5oNi7IWSZauCMaXstWTcSsnK1iHcvg92ddGDo1LMd2kQNo0G9UANa8vOfc908+8xKO40gfL8+M7w==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/core@3.940.0': + resolution: {integrity: sha512-KsGD2FLaX5ngJao1mHxodIVU9VYd1E8810fcYiGwO1PFHDzf5BEkp6D9IdMeQwT8Q6JLYtiiT1Y/o3UCScnGoA==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-env@3.907.0': + resolution: {integrity: sha512-orqT6djon57y09Ci5q0kezisrEvr78Z+7WvZbq0ZC0Ncul4RgJfCmhcgmzNPaWA18NEI0wGytaxYh3YFE7kIBQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-env@3.940.0': + resolution: {integrity: sha512-/G3l5/wbZYP2XEQiOoIkRJmlv15f1P3MSd1a0gz27lHEMrOJOGq66rF1Ca4OJLzapWt3Fy9BPrZAepoAX11kMw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-http@3.907.0': + resolution: {integrity: sha512-CKG/0hT4o8K2aQKOe+xwGP3keSNOyryhZNmKuHPuMRVlsJfO6wNxlu37HcUPzihJ+S2pOmTVGUbeVMCxJVUJmw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-http@3.940.0': + resolution: {integrity: sha512-dOrc03DHElNBD6N9Okt4U0zhrG4Wix5QUBSZPr5VN8SvmjD9dkrrxOkkJaMCl/bzrW7kbQEp7LuBdbxArMmOZQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-ini@3.907.0': + resolution: {integrity: sha512-Clz1YdXrgQ5WIlcRE7odHbgM/INBxy49EA3csDITafHaDPtPRL39zkQtB5+Lwrrt/Gg0xBlyTbvP5Snan+0lqA==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-ini@3.940.0': + resolution: {integrity: sha512-gn7PJQEzb/cnInNFTOaDoCN/hOKqMejNmLof1W5VW95Qk0TPO52lH8R4RmJPnRrwFMswOWswTOpR1roKNLIrcw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-login@3.940.0': + resolution: {integrity: sha512-fOKC3VZkwa9T2l2VFKWRtfHQPQuISqqNl35ZhcXjWKVwRwl/o7THPMkqI4XwgT2noGa7LLYVbWMwnsgSsBqglg==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-node@3.907.0': + resolution: {integrity: sha512-w6Hhc4rV/CFaBliIh9Ph/T59xdGcTF6WmPGzzpykjl68+jcJyUem82hbTVIGaMCpvhx8VRqEr5AEXCXdbDbojw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-node@3.940.0': + resolution: {integrity: sha512-M8NFAvgvO6xZjiti5kztFiAYmSmSlG3eUfr4ZHSfXYZUA/KUdZU/D6xJyaLnU8cYRWBludb6K9XPKKVwKfqm4g==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-process@3.907.0': + resolution: {integrity: sha512-MBWpZqZtKkpM/LOGD5quXvlHJJN8YIP4GKo2ad8y1fEEVydwI8cggyXuauMPV7GllW8d0u3kQUs+4rxm1VaS4w==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-process@3.940.0': + resolution: {integrity: sha512-pILBzt5/TYCqRsJb7vZlxmRIe0/T+FZPeml417EK75060ajDGnVJjHcuVdLVIeKoTKm9gmJc9l45gon6PbHyUQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-sso@3.907.0': + resolution: {integrity: sha512-F8I7xwIt0mhdg8NrC70HDmhDRx3ValBvmWH3YkWsjZltWIFozhQCCDISRPhanMkXVhSFmZY0FJ5Lo+B/SZvAAA==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-sso@3.940.0': + resolution: {integrity: sha512-q6JMHIkBlDCOMnA3RAzf8cGfup+8ukhhb50fNpghMs1SNBGhanmaMbZSgLigBRsPQW7fOk2l8jnzdVLS+BB9Uw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-web-identity@3.907.0': + resolution: {integrity: sha512-1CmRE/M8LJ/joXm5vUsKkQS35MoWA4xvUH9J1jyCuL3J9A8M+bnTe6ER8fnNLgmEs6ikdmYEIdfijPpBjBpFig==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-web-identity@3.940.0': + resolution: {integrity: sha512-9QLTIkDJHHaYL0nyymO41H8g3ui1yz6Y3GmAN1gYQa6plXisuFBnGAbmKVj7zNvjWaOKdF0dV3dd3AFKEDoJ/w==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-bucket-endpoint@3.901.0': + resolution: {integrity: sha512-mPF3N6eZlVs9G8aBSzvtoxR1RZqMo1aIwR+X8BAZSkhfj55fVF2no4IfPXfdFO3I66N+zEQ8nKoB0uTATWrogQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-expect-continue@3.901.0': + resolution: {integrity: sha512-bwq9nj6MH38hlJwOY9QXIDwa6lI48UsaZpaXbdD71BljEIRlxDzfB4JaYb+ZNNK7RIAdzsP/K05mJty6KJAQHw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-flexible-checksums@3.907.0': + resolution: {integrity: sha512-rrJFVsaeGr+bYOzUO2ph9LihFPNq9wcdg/9gcDI3oC9LtOgKeidFgU4t9603WGKGc2eXf4MxzYnaf7LXDOnVvQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-host-header@3.901.0': + resolution: {integrity: sha512-yWX7GvRmqBtbNnUW7qbre3GvZmyYwU0WHefpZzDTYDoNgatuYq6LgUIQ+z5C04/kCRoFkAFrHag8a3BXqFzq5A==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-host-header@3.936.0': + resolution: {integrity: sha512-tAaObaAnsP1XnLGndfkGWFuzrJYuk9W0b/nLvol66t8FZExIAf/WdkT2NNAWOYxljVs++oHnyHBCxIlaHrzSiw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-location-constraint@3.901.0': + resolution: {integrity: sha512-MuCS5R2ngNoYifkVt05CTULvYVWX0dvRT0/Md4jE3a0u0yMygYy31C1zorwfE/SUgAQXyLmUx8ATmPp9PppImQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-logger@3.901.0': + resolution: {integrity: sha512-UoHebjE7el/tfRo8/CQTj91oNUm+5Heus5/a4ECdmWaSCHCS/hXTsU3PTTHAY67oAQR8wBLFPfp3mMvXjB+L2A==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-logger@3.936.0': + resolution: {integrity: sha512-aPSJ12d3a3Ea5nyEnLbijCaaYJT2QjQ9iW+zGh5QcZYXmOGWbKVyPSxmVOboZQG+c1M8t6d2O7tqrwzIq8L8qw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-recursion-detection@3.901.0': + resolution: {integrity: sha512-Wd2t8qa/4OL0v/oDpCHHYkgsXJr8/ttCxrvCKAt0H1zZe2LlRhY9gpDVKqdertfHrHDj786fOvEQA28G1L75Dg==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-recursion-detection@3.936.0': + resolution: {integrity: sha512-l4aGbHpXM45YNgXggIux1HgsCVAvvBoqHPkqLnqMl9QVapfuSTjJHfDYDsx1Xxct6/m7qSMUzanBALhiaGO2fA==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-sdk-s3@3.907.0': + resolution: {integrity: sha512-8VVxcZPmJOKI8P08v5ARvoXbLV41abpAIIkt388fp/lwtfzbnXt6sWhhAk/pHgvCR1NnuvkbGuXGVcux59648Q==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-sdk-s3@3.940.0': + resolution: {integrity: sha512-JYkLjgS1wLoKHJ40G63+afM1ehmsPsjcmrHirKh8+kSCx4ip7+nL1e/twV4Zicxr8RJi9Y0Ahq5mDvneilDDKQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-ssec@3.901.0': + resolution: {integrity: sha512-YiLLJmA3RvjL38mFLuu8fhTTGWtp2qT24VqpucgfoyziYcTgIQkJJmKi90Xp6R6/3VcArqilyRgM1+x8i/em+Q==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-user-agent@3.907.0': + resolution: {integrity: sha512-j/h3lk4X6AAXvusx/h8rr0zlo7G0l0quZM4k4rS/9jzatI53HCsrMaiGu6YXbxuVqtfMqv0MAj0MVhaMsAIs4A==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-user-agent@3.940.0': + resolution: {integrity: sha512-nJbLrUj6fY+l2W2rIB9P4Qvpiy0tnTdg/dmixRxrU1z3e8wBdspJlyE+AZN4fuVbeL6rrRrO/zxQC1bB3cw5IA==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/nested-clients@3.907.0': + resolution: {integrity: sha512-LycXsdC5sMIc+Az5z1Mo2eYShr2kLo2gUgx7Rja3udG0GdqgdR/NNJ6ArmDCeKk2O5RFS5EgEg89bT55ecl5Uw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/nested-clients@3.940.0': + resolution: {integrity: sha512-x0mdv6DkjXqXEcQj3URbCltEzW6hoy/1uIL+i8gExP6YKrnhiZ7SzuB4gPls2UOpK5UqLiqXjhRLfBb1C9i4Dw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/region-config-resolver@3.901.0': + resolution: {integrity: sha512-7F0N888qVLHo4CSQOsnkZ4QAp8uHLKJ4v3u09Ly5k4AEStrSlFpckTPyUx6elwGL+fxGjNE2aakK8vEgzzCV0A==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/region-config-resolver@3.936.0': + resolution: {integrity: sha512-wOKhzzWsshXGduxO4pqSiNyL9oUtk4BEvjWm9aaq6Hmfdoydq6v6t0rAGHWPjFwy9z2haovGRi3C8IxdMB4muw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/s3-request-presigner@3.907.0': + resolution: {integrity: sha512-7RZH4fhCRVq8bacAZd6x+Ko04cmV+Zq4Axk1HZqL3epZ+r4HLR/0NklYZjr/dqMlMx9VbexzNkpBY1VgWxOSyQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/signature-v4-multi-region@3.907.0': + resolution: {integrity: sha512-f5XHRu6MTbjB/ud5RwBZzntYMgThRaDur5PJRZ1CaYAL8gZLNuEpJLzUA7o3queeSfE9JboO+cm1gZnOfnYJkg==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/signature-v4-multi-region@3.940.0': + resolution: {integrity: sha512-ugHZEoktD/bG6mdgmhzLDjMP2VrYRAUPRPF1DpCyiZexkH7DCU7XrSJyXMvkcf0DHV+URk0q2sLf/oqn1D2uYw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/token-providers@3.907.0': + resolution: {integrity: sha512-HjPbNft1Ad8X1lHQG21QXy9pitdXA+OKH6NtcXg57A31002tM+SkyUmU6ty1jbsRBEScxziIVe5doI1NmkHheA==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/token-providers@3.940.0': + resolution: {integrity: sha512-k5qbRe/ZFjW9oWEdzLIa2twRVIEx7p/9rutofyrRysrtEnYh3HAWCngAnwbgKMoiwa806UzcTRx0TjyEpnKcCg==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/types@3.901.0': + resolution: {integrity: sha512-FfEM25hLEs4LoXsLXQ/q6X6L4JmKkKkbVFpKD4mwfVHtRVQG6QxJiCPcrkcPISquiy6esbwK2eh64TWbiD60cg==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/types@3.936.0': + resolution: {integrity: sha512-uz0/VlMd2pP5MepdrHizd+T+OKfyK4r3OA9JI+L/lPKg0YFQosdJNCKisr6o70E3dh8iMpFYxF1UN/4uZsyARg==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/util-arn-parser@3.893.0': + resolution: {integrity: sha512-u8H4f2Zsi19DGnwj5FSZzDMhytYF/bCh37vAtBsn3cNDL3YG578X5oc+wSX54pM3tOxS+NY7tvOAo52SW7koUA==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/util-endpoints@3.901.0': + resolution: {integrity: sha512-5nZP3hGA8FHEtKvEQf4Aww5QZOkjLW1Z+NixSd+0XKfHvA39Ah5sZboScjLx0C9kti/K3OGW1RCx5K9Zc3bZqg==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/util-endpoints@3.936.0': + resolution: {integrity: sha512-0Zx3Ntdpu+z9Wlm7JKUBOzS9EunwKAb4KdGUQQxDqh5Lc3ta5uBoub+FgmVuzwnmBu9U1Os8UuwVTH0Lgu+P5w==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/util-format-url@3.901.0': + resolution: {integrity: sha512-GGUnJKrh3OF1F3YRSWtwPLbN904Fcfxf03gujyq1rcrDRPEkzoZB+2BzNkB27SsU6lAlwNq+4aRlZRVUloPiag==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/util-locate-window@3.893.0': + resolution: {integrity: sha512-T89pFfgat6c8nMmpI8eKjBcDcgJq36+m9oiXbcUzeU55MP9ZuGgBomGjGnHaEyF36jenW9gmg3NfZDm0AO2XPg==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/util-user-agent-browser@3.907.0': + resolution: {integrity: sha512-Hus/2YCQmtCEfr4Ls88d07Q99Ex59uvtktiPTV963Q7w7LHuIT/JBjrbwNxtSm2KlJR9PHNdqxwN+fSuNsMGMQ==} + + '@aws-sdk/util-user-agent-browser@3.936.0': + resolution: {integrity: sha512-eZ/XF6NxMtu+iCma58GRNRxSq4lHo6zHQLOZRIeL/ghqYJirqHdenMOwrzPettj60KWlv827RVebP9oNVrwZbw==} + + '@aws-sdk/util-user-agent-node@3.907.0': + resolution: {integrity: sha512-r2Bc8VCU6ymkuem+QWT6oDdGvaYnK0YHg77SGUF47k+JsztSt1kZR0Y0q8jRH97bOsXldThyEcYsNbqDERa1Uw==} + engines: {node: '>=18.0.0'} + peerDependencies: + aws-crt: '>=1.0.0' + peerDependenciesMeta: + aws-crt: + optional: true + + '@aws-sdk/util-user-agent-node@3.940.0': + resolution: {integrity: sha512-dlD/F+L/jN26I8Zg5x0oDGJiA+/WEQmnSE27fi5ydvYnpfQLwThtQo9SsNS47XSR/SOULaaoC9qx929rZuo74A==} + engines: {node: '>=18.0.0'} + peerDependencies: + aws-crt: '>=1.0.0' + peerDependenciesMeta: + aws-crt: + optional: true + + '@aws-sdk/xml-builder@3.901.0': + resolution: {integrity: sha512-pxFCkuAP7Q94wMTNPAwi6hEtNrp/BdFf+HOrIEeFQsk4EoOmpKY3I6S+u6A9Wg295J80Kh74LqDWM22ux3z6Aw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/xml-builder@3.930.0': + resolution: {integrity: sha512-YIfkD17GocxdmlUVc3ia52QhcWuRIUJonbF8A2CYfcWNV3HzvAqpcPeC0bYUhkK+8e8YO1ARnLKZQE0TlwzorA==} + engines: {node: '>=18.0.0'} + + '@aws/lambda-invoke-store@0.0.1': + resolution: {integrity: sha512-ORHRQ2tmvnBXc8t/X9Z8IcSbBA4xTLKuN873FopzklHMeqBst7YG0d+AX97inkvDX+NChYtSr+qGfcqGFaI8Zw==} + engines: {node: '>=18.0.0'} + + '@aws/lambda-invoke-store@0.2.1': + resolution: {integrity: sha512-sIyFcoPZkTtNu9xFeEoynMef3bPJIAbOfUh+ueYcfhVl6xm2VRtMcMclSxmZCMnHHd4hlYKJeq/aggmBEWynww==} + engines: {node: '>=18.0.0'} + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.28.4': + resolution: {integrity: sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.28.4': + resolution: {integrity: sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.28.3': + resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.28.3': + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.28.4': + resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.4': + resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-transform-react-jsx-self@7.27.1': + resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.27.1': + resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime@7.28.4': + resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.28.4': + resolution: {integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.4': + resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} + engines: {node: '>=6.9.0'} + + '@braintree/sanitize-url@7.1.1': + resolution: {integrity: sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==} + + '@builder.io/jsx-loc-internals@0.0.1': + resolution: {integrity: sha512-cSADapVCi07DDhcuDmcAVItqSVmji7DNyD3xxYTHyNCwhWMNnTpZjyvDIWwYFJLleyDCJ9VUtbaXtUjjqBiRqw==} + + '@builder.io/vite-plugin-jsx-loc@0.1.1': + resolution: {integrity: sha512-iAHFkaLBDJBC+EkGO1hF7hnIW2+oKKYVOl8NFAQH//3xeNEzvGdS9tOALRPR+JjR/M5NLyj+FG0VV7WFb1aJmw==} + peerDependencies: + vite: ^4.0.0 || ^5.0.0 + + '@chevrotain/cst-dts-gen@11.0.3': + resolution: {integrity: sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==} + + '@chevrotain/gast@11.0.3': + resolution: {integrity: sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==} + + '@chevrotain/regexp-to-ast@11.0.3': + resolution: {integrity: sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==} + + '@chevrotain/types@11.0.3': + resolution: {integrity: sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==} + + '@chevrotain/utils@11.0.3': + resolution: {integrity: sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==} + + '@date-fns/tz@1.4.1': + resolution: {integrity: sha512-P5LUNhtbj6YfI3iJjw5EL9eUAG6OitD0W3fWQcpQjDRc/QIsL0tRNuO1PcDvPccWL1fSTXXdE1ds+l95DV/OFA==} + + '@drizzle-team/brocli@0.10.2': + resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==} + + '@esbuild-kit/core-utils@3.3.2': + resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==} + deprecated: 'Merged into tsx: https://tsx.is' + + '@esbuild-kit/esm-loader@2.6.5': + resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==} + deprecated: 'Merged into tsx: https://tsx.is' + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.25.10': + resolution: {integrity: sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.18.20': + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.25.10': + resolution: {integrity: sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.18.20': + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.25.10': + resolution: {integrity: sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.18.20': + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.25.10': + resolution: {integrity: sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.18.20': + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.25.10': + resolution: {integrity: sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.18.20': + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.10': + resolution: {integrity: sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.18.20': + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.25.10': + resolution: {integrity: sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.18.20': + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.10': + resolution: {integrity: sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.18.20': + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.25.10': + resolution: {integrity: sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.18.20': + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.25.10': + resolution: {integrity: sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.18.20': + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.25.10': + resolution: {integrity: sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.18.20': + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.25.10': + resolution: {integrity: sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.18.20': + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.25.10': + resolution: {integrity: sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.18.20': + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.25.10': + resolution: {integrity: sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.18.20': + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.10': + resolution: {integrity: sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.18.20': + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.25.10': + resolution: {integrity: sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.18.20': + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.25.10': + resolution: {integrity: sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.10': + resolution: {integrity: sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.18.20': + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.10': + resolution: {integrity: sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.10': + resolution: {integrity: sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.18.20': + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.10': + resolution: {integrity: sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.10': + resolution: {integrity: sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.18.20': + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.25.10': + resolution: {integrity: sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.18.20': + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.25.10': + resolution: {integrity: sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.18.20': + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.25.10': + resolution: {integrity: sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.18.20': + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.25.10': + resolution: {integrity: sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@fast-csv/format@4.3.5': + resolution: {integrity: sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A==} + + '@fast-csv/parse@4.3.6': + resolution: {integrity: sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA==} + + '@floating-ui/core@1.7.3': + resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} + + '@floating-ui/dom@1.7.4': + resolution: {integrity: sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==} + + '@floating-ui/react-dom@2.1.6': + resolution: {integrity: sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.10': + resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} + + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@iconify/utils@3.0.2': + resolution: {integrity: sha512-EfJS0rLfVuRuJRn4psJHtK2A9TqVnkxPpHY6lYHiB9+8eSuudsxbwMiavocG45ujOo6FJ+CIRlRnlOGinzkaGQ==} + + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@medv/finder@4.0.2': + resolution: {integrity: sha512-RraNY9SCcx4KZV0Dh6BEW6XEW2swkqYca74pkFFRw6hHItSHiy+O/xMnpbofjYbzXj0tSpBGthUF1hHTsr3vIQ==} + + '@mermaid-js/parser@0.6.3': + resolution: {integrity: sha512-lnjOhe7zyHjc+If7yT4zoedx2vo4sHaTmtkl1+or8BRTnCtDmcTpAjpzDSfCZrshM5bCoz0GyidzadJAH1xobA==} + + '@radix-ui/number@1.1.1': + resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==} + + '@radix-ui/primitive@1.1.3': + resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==} + + '@radix-ui/react-accordion@1.2.12': + resolution: {integrity: sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-alert-dialog@1.1.15': + resolution: {integrity: sha512-oTVLkEw5GpdRe29BqJ0LSDFWI3qu0vR1M0mUkOQWDIUnY/QIkLpgDMWuKxP94c2NAC2LGcgVhG1ImF3jkZ5wXw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-arrow@1.1.7': + resolution: {integrity: sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-aspect-ratio@1.1.7': + resolution: {integrity: sha512-Yq6lvO9HQyPwev1onK1daHCHqXVLzPhSVjmsNjCa2Zcxy2f7uJD2itDtxknv6FzAKCwD1qQkeVDmX/cev13n/g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-avatar@1.1.10': + resolution: {integrity: sha512-V8piFfWapM5OmNCXTzVQY+E1rDa53zY+MQ4Y7356v4fFz6vqCyUtIz2rUD44ZEdwg78/jKmMJHj07+C/Z/rcog==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-checkbox@1.3.3': + resolution: {integrity: sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-collapsible@1.1.12': + resolution: {integrity: sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-collection@1.1.7': + resolution: {integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-compose-refs@1.1.2': + resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-context-menu@2.2.16': + resolution: {integrity: sha512-O8morBEW+HsVG28gYDZPTrT9UUovQUlJue5YO836tiTJhuIWBm/zQHc7j388sHWtdH/xUZurK9olD2+pcqx5ww==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-context@1.1.2': + resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dialog@1.1.15': + resolution: {integrity: sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-direction@1.1.1': + resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dismissable-layer@1.1.11': + resolution: {integrity: sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-dropdown-menu@2.1.16': + resolution: {integrity: sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-focus-guards@1.1.3': + resolution: {integrity: sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-focus-scope@1.1.7': + resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-hover-card@1.1.15': + resolution: {integrity: sha512-qgTkjNT1CfKMoP0rcasmlH2r1DAiYicWsDsufxl940sT2wHNEWWv6FMWIQXWhVdmC1d/HYfbhQx60KYyAtKxjg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-id@1.1.1': + resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-label@2.1.7': + resolution: {integrity: sha512-YT1GqPSL8kJn20djelMX7/cTRp/Y9w5IZHvfxQTVHrOqa2yMl7i/UfMqKRU5V7mEyKTrUVgJXhNQPVCG8PBLoQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-menu@2.1.16': + resolution: {integrity: sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-menubar@1.1.16': + resolution: {integrity: sha512-EB1FktTz5xRRi2Er974AUQZWg2yVBb1yjip38/lgwtCVRd3a+maUoGHN/xs9Yv8SY8QwbSEb+YrxGadVWbEutA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-navigation-menu@1.2.14': + resolution: {integrity: sha512-YB9mTFQvCOAQMHU+C/jVl96WmuWeltyUEpRJJky51huhds5W2FQr1J8D/16sQlf0ozxkPK8uF3niQMdUwZPv5w==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popover@1.1.15': + resolution: {integrity: sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popper@1.2.8': + resolution: {integrity: sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-portal@1.1.9': + resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-presence@1.1.5': + resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-primitive@2.1.3': + resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-progress@1.1.7': + resolution: {integrity: sha512-vPdg/tF6YC/ynuBIJlk1mm7Le0VgW6ub6J2UWnTQ7/D23KXcPI1qy+0vBkgKgd38RCMJavBXpB83HPNFMTb0Fg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-radio-group@1.3.8': + resolution: {integrity: sha512-VBKYIYImA5zsxACdisNQ3BjCBfmbGH3kQlnFVqlWU4tXwjy7cGX8ta80BcrO+WJXIn5iBylEH3K6ZTlee//lgQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-roving-focus@1.1.11': + resolution: {integrity: sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-scroll-area@1.2.10': + resolution: {integrity: sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-select@2.2.6': + resolution: {integrity: sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-separator@1.1.7': + resolution: {integrity: sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slider@1.3.6': + resolution: {integrity: sha512-JPYb1GuM1bxfjMRlNLE+BcmBC8onfCi60Blk7OBqi2MLTFdS+8401U4uFjnwkOr49BLmXxLC6JHkvAsx5OJvHw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slot@1.2.3': + resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-switch@1.2.6': + resolution: {integrity: sha512-bByzr1+ep1zk4VubeEVViV592vu2lHE2BZY5OnzehZqOOgogN80+mNtCqPkhn2gklJqOpxWgPoYTSnhBCqpOXQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-tabs@1.1.13': + resolution: {integrity: sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-toggle-group@1.1.11': + resolution: {integrity: sha512-5umnS0T8JQzQT6HbPyO7Hh9dgd82NmS36DQr+X/YJ9ctFNCiiQd6IJAYYZ33LUwm8M+taCz5t2ui29fHZc4Y6Q==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-toggle@1.1.10': + resolution: {integrity: sha512-lS1odchhFTeZv3xwHH31YPObmJn8gOg7Lq12inrr0+BH/l3Tsq32VfjqH1oh80ARM3mlkfMic15n0kg4sD1poQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-tooltip@1.2.8': + resolution: {integrity: sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-use-callback-ref@1.1.1': + resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-controllable-state@1.2.2': + resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-effect-event@0.0.2': + resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-escape-keydown@1.1.1': + resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-is-hydrated@0.1.0': + resolution: {integrity: sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-layout-effect@1.1.1': + resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-previous@1.1.1': + resolution: {integrity: sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-rect@1.1.1': + resolution: {integrity: sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-size@1.1.1': + resolution: {integrity: sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-visually-hidden@1.2.3': + resolution: {integrity: sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/rect@1.1.1': + resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} + + '@remirror/core-constants@3.0.0': + resolution: {integrity: sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==} + + '@rolldown/pluginutils@1.0.0-beta.38': + resolution: {integrity: sha512-N/ICGKleNhA5nc9XXQG/kkKHJ7S55u0x0XUJbbkmdCnFuoRkM1Il12q9q0eX19+M7KKUEPw/daUPIRnxhcxAIw==} + + '@rollup/rollup-android-arm-eabi@4.52.4': + resolution: {integrity: sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.52.4': + resolution: {integrity: sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.52.4': + resolution: {integrity: sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.52.4': + resolution: {integrity: sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.52.4': + resolution: {integrity: sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.52.4': + resolution: {integrity: sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.52.4': + resolution: {integrity: sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.52.4': + resolution: {integrity: sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.52.4': + resolution: {integrity: sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.52.4': + resolution: {integrity: sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.52.4': + resolution: {integrity: sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.52.4': + resolution: {integrity: sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.52.4': + resolution: {integrity: sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.52.4': + resolution: {integrity: sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.52.4': + resolution: {integrity: sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.52.4': + resolution: {integrity: sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.52.4': + resolution: {integrity: sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openharmony-arm64@4.52.4': + resolution: {integrity: sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.52.4': + resolution: {integrity: sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.52.4': + resolution: {integrity: sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.52.4': + resolution: {integrity: sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.52.4': + resolution: {integrity: sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w==} + cpu: [x64] + os: [win32] + + '@shikijs/core@3.14.0': + resolution: {integrity: sha512-qRSeuP5vlYHCNUIrpEBQFO7vSkR7jn7Kv+5X3FO/zBKVDGQbcnlScD3XhkrHi/R8Ltz0kEjvFR9Szp/XMRbFMw==} + + '@shikijs/engine-javascript@3.14.0': + resolution: {integrity: sha512-3v1kAXI2TsWQuwv86cREH/+FK9Pjw3dorVEykzQDhwrZj0lwsHYlfyARaKmn6vr5Gasf8aeVpb8JkzeWspxOLQ==} + + '@shikijs/engine-oniguruma@3.14.0': + resolution: {integrity: sha512-TNcYTYMbJyy+ZjzWtt0bG5y4YyMIWC2nyePz+CFMWqm+HnZZyy9SWMgo8Z6KBJVIZnx8XUXS8U2afO6Y0g1Oug==} + + '@shikijs/langs@3.14.0': + resolution: {integrity: sha512-DIB2EQY7yPX1/ZH7lMcwrK5pl+ZkP/xoSpUzg9YC8R+evRCCiSQ7yyrvEyBsMnfZq4eBzLzBlugMyTAf13+pzg==} + + '@shikijs/themes@3.14.0': + resolution: {integrity: sha512-fAo/OnfWckNmv4uBoUu6dSlkcBc+SA1xzj5oUSaz5z3KqHtEbUypg/9xxgJARtM6+7RVm0Q6Xnty41xA1ma1IA==} + + '@shikijs/types@3.14.0': + resolution: {integrity: sha512-bQGgC6vrY8U/9ObG1Z/vTro+uclbjjD/uG58RvfxKZVD5p9Yc1ka3tVyEFy7BNJLzxuWyHH5NWynP9zZZS59eQ==} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + + '@smithy/abort-controller@4.2.0': + resolution: {integrity: sha512-PLUYa+SUKOEZtXFURBu/CNxlsxfaFGxSBPcStL13KpVeVWIfdezWyDqkz7iDLmwnxojXD0s5KzuB5HGHvt4Aeg==} + engines: {node: '>=18.0.0'} + + '@smithy/abort-controller@4.2.5': + resolution: {integrity: sha512-j7HwVkBw68YW8UmFRcjZOmssE77Rvk0GWAIN1oFBhsaovQmZWYCIcGa9/pwRB0ExI8Sk9MWNALTjftjHZea7VA==} + engines: {node: '>=18.0.0'} + + '@smithy/chunked-blob-reader-native@4.2.1': + resolution: {integrity: sha512-lX9Ay+6LisTfpLid2zZtIhSEjHMZoAR5hHCR4H7tBz/Zkfr5ea8RcQ7Tk4mi0P76p4cN+Btz16Ffno7YHpKXnQ==} + engines: {node: '>=18.0.0'} + + '@smithy/chunked-blob-reader@5.2.0': + resolution: {integrity: sha512-WmU0TnhEAJLWvfSeMxBNe5xtbselEO8+4wG0NtZeL8oR21WgH1xiO37El+/Y+H/Ie4SCwBy3MxYWmOYaGgZueA==} + engines: {node: '>=18.0.0'} + + '@smithy/config-resolver@4.3.0': + resolution: {integrity: sha512-9oH+n8AVNiLPK/iK/agOsoWfrKZ3FGP3502tkksd6SRsKMYiu7AFX0YXo6YBADdsAj7C+G/aLKdsafIJHxuCkQ==} + engines: {node: '>=18.0.0'} + + '@smithy/config-resolver@4.4.3': + resolution: {integrity: sha512-ezHLe1tKLUxDJo2LHtDuEDyWXolw8WGOR92qb4bQdWq/zKenO5BvctZGrVJBK08zjezSk7bmbKFOXIVyChvDLw==} + engines: {node: '>=18.0.0'} + + '@smithy/core@3.15.0': + resolution: {integrity: sha512-VJWncXgt+ExNn0U2+Y7UywuATtRYaodGQKFo9mDyh70q+fJGedfrqi2XuKU1BhiLeXgg6RZrW7VEKfeqFhHAJA==} + engines: {node: '>=18.0.0'} + + '@smithy/core@3.18.5': + resolution: {integrity: sha512-6gnIz3h+PEPQGDj8MnRSjDvKBah042jEoPgjFGJ4iJLBE78L4lY/n98x14XyPF4u3lN179Ub/ZKFY5za9GeLQw==} + engines: {node: '>=18.0.0'} + + '@smithy/credential-provider-imds@4.2.0': + resolution: {integrity: sha512-SOhFVvFH4D5HJZytb0bLKxCrSnwcqPiNlrw+S4ZXjMnsC+o9JcUQzbZOEQcA8yv9wJFNhfsUiIUKiEnYL68Big==} + engines: {node: '>=18.0.0'} + + '@smithy/credential-provider-imds@4.2.5': + resolution: {integrity: sha512-BZwotjoZWn9+36nimwm/OLIcVe+KYRwzMjfhd4QT7QxPm9WY0HiOV8t/Wlh+HVUif0SBVV7ksq8//hPaBC/okQ==} + engines: {node: '>=18.0.0'} + + '@smithy/eventstream-codec@4.2.0': + resolution: {integrity: sha512-XE7CtKfyxYiNZ5vz7OvyTf1osrdbJfmUy+rbh+NLQmZumMGvY0mT0Cq1qKSfhrvLtRYzMsOBuRpi10dyI0EBPg==} + engines: {node: '>=18.0.0'} + + '@smithy/eventstream-serde-browser@4.2.0': + resolution: {integrity: sha512-U53p7fcrk27k8irLhOwUu+UYnBqsXNLKl1XevOpsxK3y1Lndk8R7CSiZV6FN3fYFuTPuJy5pP6qa/bjDzEkRvA==} + engines: {node: '>=18.0.0'} + + '@smithy/eventstream-serde-config-resolver@4.3.0': + resolution: {integrity: sha512-uwx54t8W2Yo9Jr3nVF5cNnkAAnMCJ8Wrm+wDlQY6rY/IrEgZS3OqagtCu/9ceIcZFQ1zVW/zbN9dxb5esuojfA==} + engines: {node: '>=18.0.0'} + + '@smithy/eventstream-serde-node@4.2.0': + resolution: {integrity: sha512-yjM2L6QGmWgJjVu/IgYd6hMzwm/tf4VFX0lm8/SvGbGBwc+aFl3hOzvO/e9IJ2XI+22Tx1Zg3vRpFRs04SWFcg==} + engines: {node: '>=18.0.0'} + + '@smithy/eventstream-serde-universal@4.2.0': + resolution: {integrity: sha512-C3jxz6GeRzNyGKhU7oV656ZbuHY93mrfkT12rmjDdZch142ykjn8do+VOkeRNjSGKw01p4g+hdalPYPhmMwk1g==} + engines: {node: '>=18.0.0'} + + '@smithy/fetch-http-handler@5.3.1': + resolution: {integrity: sha512-3AvYYbB+Dv5EPLqnJIAgYw/9+WzeBiUYS8B+rU0pHq5NMQMvrZmevUROS4V2GAt0jEOn9viBzPLrZE+riTNd5Q==} + engines: {node: '>=18.0.0'} + + '@smithy/fetch-http-handler@5.3.6': + resolution: {integrity: sha512-3+RG3EA6BBJ/ofZUeTFJA7mHfSYrZtQIrDP9dI8Lf7X6Jbos2jptuLrAAteDiFVrmbEmLSuRG/bUKzfAXk7dhg==} + engines: {node: '>=18.0.0'} + + '@smithy/hash-blob-browser@4.2.1': + resolution: {integrity: sha512-Os9cg1fTXMwuqbvjemELlf+HB5oEeVyZmYsTbAtDQBmjGyibjmbeeqcaw7xOJLIHrkH/u0wAYabNcN6FRTqMRg==} + engines: {node: '>=18.0.0'} + + '@smithy/hash-node@4.2.0': + resolution: {integrity: sha512-ugv93gOhZGysTctZh9qdgng8B+xO0cj+zN0qAZ+Sgh7qTQGPOJbMdIuyP89KNfUyfAqFSNh5tMvC+h2uCpmTtA==} + engines: {node: '>=18.0.0'} + + '@smithy/hash-node@4.2.5': + resolution: {integrity: sha512-DpYX914YOfA3UDT9CN1BM787PcHfWRBB43fFGCYrZFUH0Jv+5t8yYl+Pd5PW4+QzoGEDvn5d5QIO4j2HyYZQSA==} + engines: {node: '>=18.0.0'} + + '@smithy/hash-stream-node@4.2.0': + resolution: {integrity: sha512-8dELAuGv+UEjtzrpMeNBZc1sJhO8GxFVV/Yh21wE35oX4lOE697+lsMHBoUIFAUuYkTMIeu0EuJSEsH7/8Y+UQ==} + engines: {node: '>=18.0.0'} + + '@smithy/invalid-dependency@4.2.0': + resolution: {integrity: sha512-ZmK5X5fUPAbtvRcUPtk28aqIClVhbfcmfoS4M7UQBTnDdrNxhsrxYVv0ZEl5NaPSyExsPWqL4GsPlRvtlwg+2A==} + engines: {node: '>=18.0.0'} + + '@smithy/invalid-dependency@4.2.5': + resolution: {integrity: sha512-2L2erASEro1WC5nV+plwIMxrTXpvpfzl4e+Nre6vBVRR2HKeGGcvpJyyL3/PpiSg+cJG2KpTmZmq934Olb6e5A==} + engines: {node: '>=18.0.0'} + + '@smithy/is-array-buffer@2.2.0': + resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} + engines: {node: '>=14.0.0'} + + '@smithy/is-array-buffer@4.2.0': + resolution: {integrity: sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==} + engines: {node: '>=18.0.0'} + + '@smithy/md5-js@4.2.0': + resolution: {integrity: sha512-LFEPniXGKRQArFmDQ3MgArXlClFJMsXDteuQQY8WG1/zzv6gVSo96+qpkuu1oJp4MZsKrwchY0cuAoPKzEbaNA==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-content-length@4.2.0': + resolution: {integrity: sha512-6ZAnwrXFecrA4kIDOcz6aLBhU5ih2is2NdcZtobBDSdSHtE9a+MThB5uqyK4XXesdOCvOcbCm2IGB95birTSOQ==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-content-length@4.2.5': + resolution: {integrity: sha512-Y/RabVa5vbl5FuHYV2vUCwvh/dqzrEY/K2yWPSqvhFUwIY0atLqO4TienjBXakoy4zrKAMCZwg+YEqmH7jaN7A==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-endpoint@4.3.1': + resolution: {integrity: sha512-JtM4SjEgImLEJVXdsbvWHYiJ9dtuKE8bqLlvkvGi96LbejDL6qnVpVxEFUximFodoQbg0Gnkyff9EKUhFhVJFw==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-endpoint@4.3.12': + resolution: {integrity: sha512-9pAX/H+VQPzNbouhDhkW723igBMLgrI8OtX+++M7iKJgg/zY/Ig3i1e6seCcx22FWhE6Q/S61BRdi2wXBORT+A==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-retry@4.4.1': + resolution: {integrity: sha512-wXxS4ex8cJJteL0PPQmWYkNi9QKDWZIpsndr0wZI2EL+pSSvA/qqxXU60gBOJoIc2YgtZSWY/PE86qhKCCKP1w==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-retry@4.4.12': + resolution: {integrity: sha512-S4kWNKFowYd0lID7/DBqWHOQxmxlsf0jBaos9chQZUWTVOjSW1Ogyh8/ib5tM+agFDJ/TCxuCTvrnlc+9cIBcQ==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-serde@4.2.0': + resolution: {integrity: sha512-rpTQ7D65/EAbC6VydXlxjvbifTf4IH+sADKg6JmAvhkflJO2NvDeyU9qsWUNBelJiQFcXKejUHWRSdmpJmEmiw==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-serde@4.2.6': + resolution: {integrity: sha512-VkLoE/z7e2g8pirwisLz8XJWedUSY8my/qrp81VmAdyrhi94T+riBfwP+AOEEFR9rFTSonC/5D2eWNmFabHyGQ==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-stack@4.2.0': + resolution: {integrity: sha512-G5CJ//eqRd9OARrQu9MK1H8fNm2sMtqFh6j8/rPozhEL+Dokpvi1Og+aCixTuwDAGZUkJPk6hJT5jchbk/WCyg==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-stack@4.2.5': + resolution: {integrity: sha512-bYrutc+neOyWxtZdbB2USbQttZN0mXaOyYLIsaTbJhFsfpXyGWUxJpEuO1rJ8IIJm2qH4+xJT0mxUSsEDTYwdQ==} + engines: {node: '>=18.0.0'} + + '@smithy/node-config-provider@4.3.0': + resolution: {integrity: sha512-5QgHNuWdT9j9GwMPPJCKxy2KDxZ3E5l4M3/5TatSZrqYVoEiqQrDfAq8I6KWZw7RZOHtVtCzEPdYz7rHZixwcA==} + engines: {node: '>=18.0.0'} + + '@smithy/node-config-provider@4.3.5': + resolution: {integrity: sha512-UTurh1C4qkVCtqggI36DGbLB2Kv8UlcFdMXDcWMbqVY2uRg0XmT9Pb4Vj6oSQ34eizO1fvR0RnFV4Axw4IrrAg==} + engines: {node: '>=18.0.0'} + + '@smithy/node-http-handler@4.3.0': + resolution: {integrity: sha512-RHZ/uWCmSNZ8cneoWEVsVwMZBKy/8123hEpm57vgGXA3Irf/Ja4v9TVshHK2ML5/IqzAZn0WhINHOP9xl+Qy6Q==} + engines: {node: '>=18.0.0'} + + '@smithy/node-http-handler@4.4.5': + resolution: {integrity: sha512-CMnzM9R2WqlqXQGtIlsHMEZfXKJVTIrqCNoSd/QpAyp+Dw0a1Vps13l6ma1fH8g7zSPNsA59B/kWgeylFuA/lw==} + engines: {node: '>=18.0.0'} + + '@smithy/property-provider@4.2.0': + resolution: {integrity: sha512-rV6wFre0BU6n/tx2Ztn5LdvEdNZ2FasQbPQmDOPfV9QQyDmsCkOAB0osQjotRCQg+nSKFmINhyda0D3AnjSBJw==} + engines: {node: '>=18.0.0'} + + '@smithy/property-provider@4.2.5': + resolution: {integrity: sha512-8iLN1XSE1rl4MuxvQ+5OSk/Zb5El7NJZ1td6Tn+8dQQHIjp59Lwl6bd0+nzw6SKm2wSSriH2v/I9LPzUic7EOg==} + engines: {node: '>=18.0.0'} + + '@smithy/protocol-http@5.3.0': + resolution: {integrity: sha512-6POSYlmDnsLKb7r1D3SVm7RaYW6H1vcNcTWGWrF7s9+2noNYvUsm7E4tz5ZQ9HXPmKn6Hb67pBDRIjrT4w/d7Q==} + engines: {node: '>=18.0.0'} + + '@smithy/protocol-http@5.3.5': + resolution: {integrity: sha512-RlaL+sA0LNMp03bf7XPbFmT5gN+w3besXSWMkA8rcmxLSVfiEXElQi4O2IWwPfxzcHkxqrwBFMbngB8yx/RvaQ==} + engines: {node: '>=18.0.0'} + + '@smithy/querystring-builder@4.2.0': + resolution: {integrity: sha512-Q4oFD0ZmI8yJkiPPeGUITZj++4HHYCW3pYBYfIobUCkYpI6mbkzmG1MAQQ3lJYYWj3iNqfzOenUZu+jqdPQ16A==} + engines: {node: '>=18.0.0'} + + '@smithy/querystring-builder@4.2.5': + resolution: {integrity: sha512-y98otMI1saoajeik2kLfGyRp11e5U/iJYH/wLCh3aTV/XutbGT9nziKGkgCaMD1ghK7p6htHMm6b6scl9JRUWg==} + engines: {node: '>=18.0.0'} + + '@smithy/querystring-parser@4.2.0': + resolution: {integrity: sha512-BjATSNNyvVbQxOOlKse0b0pSezTWGMvA87SvoFoFlkRsKXVsN3bEtjCxvsNXJXfnAzlWFPaT9DmhWy1vn0sNEA==} + engines: {node: '>=18.0.0'} + + '@smithy/querystring-parser@4.2.5': + resolution: {integrity: sha512-031WCTdPYgiQRYNPXznHXof2YM0GwL6SeaSyTH/P72M1Vz73TvCNH2Nq8Iu2IEPq9QP2yx0/nrw5YmSeAi/AjQ==} + engines: {node: '>=18.0.0'} + + '@smithy/service-error-classification@4.2.0': + resolution: {integrity: sha512-Ylv1ttUeKatpR0wEOMnHf1hXMktPUMObDClSWl2TpCVT4DwtJhCeighLzSLbgH3jr5pBNM0LDXT5yYxUvZ9WpA==} + engines: {node: '>=18.0.0'} + + '@smithy/service-error-classification@4.2.5': + resolution: {integrity: sha512-8fEvK+WPE3wUAcDvqDQG1Vk3ANLR8Px979te96m84CbKAjBVf25rPYSzb4xU4hlTyho7VhOGnh5i62D/JVF0JQ==} + engines: {node: '>=18.0.0'} + + '@smithy/shared-ini-file-loader@4.3.0': + resolution: {integrity: sha512-VCUPPtNs+rKWlqqntX0CbVvWyjhmX30JCtzO+s5dlzzxrvSfRh5SY0yxnkirvc1c80vdKQttahL71a9EsdolSQ==} + engines: {node: '>=18.0.0'} + + '@smithy/shared-ini-file-loader@4.4.0': + resolution: {integrity: sha512-5WmZ5+kJgJDjwXXIzr1vDTG+RhF9wzSODQBfkrQ2VVkYALKGvZX1lgVSxEkgicSAFnFhPj5rudJV0zoinqS0bA==} + engines: {node: '>=18.0.0'} + + '@smithy/signature-v4@5.3.0': + resolution: {integrity: sha512-MKNyhXEs99xAZaFhm88h+3/V+tCRDQ+PrDzRqL0xdDpq4gjxcMmf5rBA3YXgqZqMZ/XwemZEurCBQMfxZOWq/g==} + engines: {node: '>=18.0.0'} + + '@smithy/signature-v4@5.3.5': + resolution: {integrity: sha512-xSUfMu1FT7ccfSXkoLl/QRQBi2rOvi3tiBZU2Tdy3I6cgvZ6SEi9QNey+lqps/sJRnogIS+lq+B1gxxbra2a/w==} + engines: {node: '>=18.0.0'} + + '@smithy/smithy-client@4.7.1': + resolution: {integrity: sha512-WXVbiyNf/WOS/RHUoFMkJ6leEVpln5ojCjNBnzoZeMsnCg3A0BRhLK3WYc4V7PmYcYPZh9IYzzAg9XcNSzYxYQ==} + engines: {node: '>=18.0.0'} + + '@smithy/smithy-client@4.9.8': + resolution: {integrity: sha512-8xgq3LgKDEFoIrLWBho/oYKyWByw9/corz7vuh1upv7ZBm0ZMjGYBhbn6v643WoIqA9UTcx5A5htEp/YatUwMA==} + engines: {node: '>=18.0.0'} + + '@smithy/types@4.6.0': + resolution: {integrity: sha512-4lI9C8NzRPOv66FaY1LL1O/0v0aLVrq/mXP/keUa9mJOApEeae43LsLd2kZRUJw91gxOQfLIrV3OvqPgWz1YsA==} + engines: {node: '>=18.0.0'} + + '@smithy/types@4.9.0': + resolution: {integrity: sha512-MvUbdnXDTwykR8cB1WZvNNwqoWVaTRA0RLlLmf/cIFNMM2cKWz01X4Ly6SMC4Kks30r8tT3Cty0jmeWfiuyHTA==} + engines: {node: '>=18.0.0'} + + '@smithy/url-parser@4.2.0': + resolution: {integrity: sha512-AlBmD6Idav2ugmoAL6UtR6ItS7jU5h5RNqLMZC7QrLCoITA9NzIN3nx9GWi8g4z1pfWh2r9r96SX/jHiNwPJ9A==} + engines: {node: '>=18.0.0'} + + '@smithy/url-parser@4.2.5': + resolution: {integrity: sha512-VaxMGsilqFnK1CeBX+LXnSuaMx4sTL/6znSZh2829txWieazdVxr54HmiyTsIbpOTLcf5nYpq9lpzmwRdxj6rQ==} + engines: {node: '>=18.0.0'} + + '@smithy/util-base64@4.3.0': + resolution: {integrity: sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==} + engines: {node: '>=18.0.0'} + + '@smithy/util-body-length-browser@4.2.0': + resolution: {integrity: sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==} + engines: {node: '>=18.0.0'} + + '@smithy/util-body-length-node@4.2.1': + resolution: {integrity: sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==} + engines: {node: '>=18.0.0'} + + '@smithy/util-buffer-from@2.2.0': + resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} + engines: {node: '>=14.0.0'} + + '@smithy/util-buffer-from@4.2.0': + resolution: {integrity: sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==} + engines: {node: '>=18.0.0'} + + '@smithy/util-config-provider@4.2.0': + resolution: {integrity: sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==} + engines: {node: '>=18.0.0'} + + '@smithy/util-defaults-mode-browser@4.3.0': + resolution: {integrity: sha512-H4MAj8j8Yp19Mr7vVtGgi7noJjvjJbsKQJkvNnLlrIFduRFT5jq5Eri1k838YW7rN2g5FTnXpz5ktKVr1KVgPQ==} + engines: {node: '>=18.0.0'} + + '@smithy/util-defaults-mode-browser@4.3.11': + resolution: {integrity: sha512-yHv+r6wSQXEXTPVCIQTNmXVWs7ekBTpMVErjqZoWkYN75HIFN5y9+/+sYOejfAuvxWGvgzgxbTHa/oz61YTbKw==} + engines: {node: '>=18.0.0'} + + '@smithy/util-defaults-mode-node@4.2.1': + resolution: {integrity: sha512-PuDcgx7/qKEMzV1QFHJ7E4/MMeEjaA7+zS5UNcHCLPvvn59AeZQ0DSDGMpqC2xecfa/1cNGm4l8Ec/VxCuY7Ug==} + engines: {node: '>=18.0.0'} + + '@smithy/util-defaults-mode-node@4.2.14': + resolution: {integrity: sha512-ljZN3iRvaJUgulfvobIuG97q1iUuCMrvXAlkZ4msY+ZuVHQHDIqn7FKZCEj+bx8omz6kF5yQXms/xhzjIO5XiA==} + engines: {node: '>=18.0.0'} + + '@smithy/util-endpoints@3.2.0': + resolution: {integrity: sha512-TXeCn22D56vvWr/5xPqALc9oO+LN+QpFjrSM7peG/ckqEPoI3zaKZFp+bFwfmiHhn5MGWPaLCqDOJPPIixk9Wg==} + engines: {node: '>=18.0.0'} + + '@smithy/util-endpoints@3.2.5': + resolution: {integrity: sha512-3O63AAWu2cSNQZp+ayl9I3NapW1p1rR5mlVHcF6hAB1dPZUQFfRPYtplWX/3xrzWthPGj5FqB12taJJCfH6s8A==} + engines: {node: '>=18.0.0'} + + '@smithy/util-hex-encoding@4.2.0': + resolution: {integrity: sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==} + engines: {node: '>=18.0.0'} + + '@smithy/util-middleware@4.2.0': + resolution: {integrity: sha512-u9OOfDa43MjagtJZ8AapJcmimP+K2Z7szXn8xbty4aza+7P1wjFmy2ewjSbhEiYQoW1unTlOAIV165weYAaowA==} + engines: {node: '>=18.0.0'} + + '@smithy/util-middleware@4.2.5': + resolution: {integrity: sha512-6Y3+rvBF7+PZOc40ybeZMcGln6xJGVeY60E7jy9Mv5iKpMJpHgRE6dKy9ScsVxvfAYuEX4Q9a65DQX90KaQ3bA==} + engines: {node: '>=18.0.0'} + + '@smithy/util-retry@4.2.0': + resolution: {integrity: sha512-BWSiuGbwRnEE2SFfaAZEX0TqaxtvtSYPM/J73PFVm+A29Fg1HTPiYFb8TmX1DXp4hgcdyJcNQmprfd5foeORsg==} + engines: {node: '>=18.0.0'} + + '@smithy/util-retry@4.2.5': + resolution: {integrity: sha512-GBj3+EZBbN4NAqJ/7pAhsXdfzdlznOh8PydUijy6FpNIMnHPSMO2/rP4HKu+UFeikJxShERk528oy7GT79YiJg==} + engines: {node: '>=18.0.0'} + + '@smithy/util-stream@4.5.0': + resolution: {integrity: sha512-0TD5M5HCGu5diEvZ/O/WquSjhJPasqv7trjoqHyWjNh/FBeBl7a0ztl9uFMOsauYtRfd8jvpzIAQhDHbx+nvZw==} + engines: {node: '>=18.0.0'} + + '@smithy/util-stream@4.5.6': + resolution: {integrity: sha512-qWw/UM59TiaFrPevefOZ8CNBKbYEP6wBAIlLqxn3VAIo9rgnTNc4ASbVrqDmhuwI87usnjhdQrxodzAGFFzbRQ==} + engines: {node: '>=18.0.0'} + + '@smithy/util-uri-escape@4.2.0': + resolution: {integrity: sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==} + engines: {node: '>=18.0.0'} + + '@smithy/util-utf8@2.3.0': + resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} + engines: {node: '>=14.0.0'} + + '@smithy/util-utf8@4.2.0': + resolution: {integrity: sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==} + engines: {node: '>=18.0.0'} + + '@smithy/util-waiter@4.2.0': + resolution: {integrity: sha512-0Z+nxUU4/4T+SL8BCNN4ztKdQjToNvUYmkF1kXO5T7Yz3Gafzh0HeIG6mrkN8Fz3gn9hSyxuAT+6h4vM+iQSBQ==} + engines: {node: '>=18.0.0'} + + '@smithy/uuid@1.1.0': + resolution: {integrity: sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==} + engines: {node: '>=18.0.0'} + + '@swc/helpers@0.5.18': + resolution: {integrity: sha512-TXTnIcNJQEKwThMMqBXsZ4VGAza6bvN4pa41Rkqoio6QBKMvo+5lexeTMScGCIxtzgQJzElcvIltani+adC5PQ==} + + '@tailwindcss/node@4.1.14': + resolution: {integrity: sha512-hpz+8vFk3Ic2xssIA3e01R6jkmsAhvkQdXlEbRTk6S10xDAtiQiM3FyvZVGsucefq764euO/b8WUW9ysLdThHw==} + + '@tailwindcss/oxide-android-arm64@4.1.14': + resolution: {integrity: sha512-a94ifZrGwMvbdeAxWoSuGcIl6/DOP5cdxagid7xJv6bwFp3oebp7y2ImYsnZBMTwjn5Ev5xESvS3FFYUGgPODQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.1.14': + resolution: {integrity: sha512-HkFP/CqfSh09xCnrPJA7jud7hij5ahKyWomrC3oiO2U9i0UjP17o9pJbxUN0IJ471GTQQmzwhp0DEcpbp4MZTA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.1.14': + resolution: {integrity: sha512-eVNaWmCgdLf5iv6Qd3s7JI5SEFBFRtfm6W0mphJYXgvnDEAZ5sZzqmI06bK6xo0IErDHdTA5/t7d4eTfWbWOFw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.1.14': + resolution: {integrity: sha512-QWLoRXNikEuqtNb0dhQN6wsSVVjX6dmUFzuuiL09ZeXju25dsei2uIPl71y2Ic6QbNBsB4scwBoFnlBfabHkEw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.14': + resolution: {integrity: sha512-VB4gjQni9+F0VCASU+L8zSIyjrLLsy03sjcR3bM0V2g4SNamo0FakZFKyUQ96ZVwGK4CaJsc9zd/obQy74o0Fw==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.14': + resolution: {integrity: sha512-qaEy0dIZ6d9vyLnmeg24yzA8XuEAD9WjpM5nIM1sUgQ/Zv7cVkharPDQcmm/t/TvXoKo/0knI3me3AGfdx6w1w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-musl@4.1.14': + resolution: {integrity: sha512-ISZjT44s59O8xKsPEIesiIydMG/sCXoMBCqsphDm/WcbnuWLxxb+GcvSIIA5NjUw6F8Tex7s5/LM2yDy8RqYBQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-gnu@4.1.14': + resolution: {integrity: sha512-02c6JhLPJj10L2caH4U0zF8Hji4dOeahmuMl23stk0MU1wfd1OraE7rOloidSF8W5JTHkFdVo/O7uRUJJnUAJg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-musl@4.1.14': + resolution: {integrity: sha512-TNGeLiN1XS66kQhxHG/7wMeQDOoL0S33x9BgmydbrWAb9Qw0KYdd8o1ifx4HOGDWhVmJ+Ul+JQ7lyknQFilO3Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-wasm32-wasi@4.1.14': + resolution: {integrity: sha512-uZYAsaW/jS/IYkd6EWPJKW/NlPNSkWkBlaeVBi/WsFQNP05/bzkebUL8FH1pdsqx4f2fH/bWFcUABOM9nfiJkQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.14': + resolution: {integrity: sha512-Az0RnnkcvRqsuoLH2Z4n3JfAef0wElgzHD5Aky/e+0tBUxUhIeIqFBTMNQvmMRSP15fWwmvjBxZ3Q8RhsDnxAA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.1.14': + resolution: {integrity: sha512-ttblVGHgf68kEE4om1n/n44I0yGPkCPbLsqzjvybhpwa6mKKtgFfAzy6btc3HRmuW7nHe0OOrSeNP9sQmmH9XA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.1.14': + resolution: {integrity: sha512-23yx+VUbBwCg2x5XWdB8+1lkPajzLmALEfMb51zZUBYaYVPDQvBSD/WYDqiVyBIo2BZFa3yw1Rpy3G2Jp+K0dw==} + engines: {node: '>= 10'} + + '@tailwindcss/typography@0.5.19': + resolution: {integrity: sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1' + + '@tailwindcss/vite@4.1.14': + resolution: {integrity: sha512-BoFUoU0XqgCUS1UXWhmDJroKKhNXeDzD7/XwabjkDIAbMnc4ULn5e2FuEuBbhZ6ENZoSYzKlzvZ44Yr6EUDUSA==} + peerDependencies: + vite: ^5.2.0 || ^6 || ^7 + + '@tanstack/query-core@5.90.2': + resolution: {integrity: sha512-k/TcR3YalnzibscALLwxeiLUub6jN5EDLwKDiO7q5f4ICEoptJ+n9+7vcEFy5/x/i6Q+Lb/tXrsKCggf5uQJXQ==} + + '@tanstack/react-query@5.90.2': + resolution: {integrity: sha512-CLABiR+h5PYfOWr/z+vWFt5VsOA2ekQeRQBFSKlcoW6Ndx/f8rfyVmq4LbgOM4GG2qtxAxjLYLOpCNTYm4uKzw==} + peerDependencies: + react: ^18 || ^19 + + '@tiptap/core@3.11.0': + resolution: {integrity: sha512-kmS7ZVpHm1EMnW1Wmft9H5ZLM7E0G0NGBx+aGEHGDcNxZBXD2ZUa76CuWjIhOGpwsPbELp684ZdpF2JWoNi4Dg==} + peerDependencies: + '@tiptap/pm': ^3.11.0 + + '@tiptap/extension-blockquote@3.11.0': + resolution: {integrity: sha512-0H8WVW6Vn4GJ7sQ6wfyDgUU+DqM8fp62g8N0fFPiEhoYtpIYUmCqGhpKnqYR0tet6ofFa648XmA6n2VX7sugzw==} + peerDependencies: + '@tiptap/core': ^3.11.0 + + '@tiptap/extension-bold@3.11.0': + resolution: {integrity: sha512-V/c3XYO09Le9GlBGq1MK4c97Fffi0GADQTbZ+LFoi65nUrAwutn5wYnXBcEyWQI6RmFWVDJTieamqtc4j9teyw==} + peerDependencies: + '@tiptap/core': ^3.11.0 + + '@tiptap/extension-bubble-menu@3.11.0': + resolution: {integrity: sha512-P3j9lQ+EZ5Zg/isJzLpCPX7bp7WUBmz8GPs/HPlyMyN2su8LqXntITBZr8IP1JNBlB/wR83k/W0XqdC57mG7cA==} + peerDependencies: + '@tiptap/core': ^3.11.0 + '@tiptap/pm': ^3.11.0 + + '@tiptap/extension-bullet-list@3.11.0': + resolution: {integrity: sha512-IKdb1C3bHA1sGPiUcntkL+wHebRg71K5+tgaaRnMw0qmtcpcOQb5zhQOSm5bXUsgCk/WgT04dkZPnpn6Gg1PvQ==} + peerDependencies: + '@tiptap/extension-list': ^3.11.0 + + '@tiptap/extension-code-block@3.11.0': + resolution: {integrity: sha512-y01RJVbygDJWYXxZ0SiCYwvUF2X91RANCLSdb8X0qiwVPgNOzsDrrzS/iqoXkiYmM93pJw+ZWelEZxRvxEwsrg==} + peerDependencies: + '@tiptap/core': ^3.11.0 + '@tiptap/pm': ^3.11.0 + + '@tiptap/extension-code@3.11.0': + resolution: {integrity: sha512-5OpR5O4bveHe1KG9CJsto86NgkuerYq3OLY78vzh9uFCLdv7xgXA2aZYJfRMhbZ7hKsR7hHg1etBJUCk+TKsMg==} + peerDependencies: + '@tiptap/core': ^3.11.0 + + '@tiptap/extension-color@3.11.0': + resolution: {integrity: sha512-4H+3nyheow0tBt+q/Pkkm/pR/F6vUAdKZaq1HtWFi7LcFzCYxdB3Si625EparKO3kMvGvULjdd+/zt68NS7Acw==} + peerDependencies: + '@tiptap/extension-text-style': ^3.11.0 + + '@tiptap/extension-document@3.11.0': + resolution: {integrity: sha512-N2G3cwL2Dtur/CgD/byJmFx9T5no6fTO/U462VP3rthQYrRA1AB3TCYqtlwJkmyoxRTNd4qIg4imaPl8ej6Heg==} + peerDependencies: + '@tiptap/core': ^3.11.0 + + '@tiptap/extension-dropcursor@3.11.0': + resolution: {integrity: sha512-gW/QMGAyiXGSpO+X/lTeiBQn1Or8T8UVB3y9Cv2Lh6zx0SWU+FA28EH+y6s3fm872reN4dH/9rEvMuJjhU/BEw==} + peerDependencies: + '@tiptap/extensions': ^3.11.0 + + '@tiptap/extension-floating-menu@3.11.0': + resolution: {integrity: sha512-nEHdWZHEJYX1II1oJQ4aeZ8O/Kss4BRbYFXQFGIvPelCfCYEATpUJh3aq3767ARSq40bOWyu+Dcd4SCW0We6Sw==} + peerDependencies: + '@floating-ui/dom': ^1.0.0 + '@tiptap/core': ^3.11.0 + '@tiptap/pm': ^3.11.0 + + '@tiptap/extension-gapcursor@3.11.0': + resolution: {integrity: sha512-lXGEZiYX7k/pEFr8BgDE91vqjLTwuf+qhHLTgIpfhbt562nShLPIDj9Vzu3xrR4fwUAMiUNiLyaeInb8j3I4kg==} + peerDependencies: + '@tiptap/extensions': ^3.11.0 + + '@tiptap/extension-hard-break@3.11.0': + resolution: {integrity: sha512-NJEHTj++kFOayQXKSQSi9j9eAG33eSiJqai2pf4U+snW94fmb8cYLUurDmfYRe20O6EzBSX0X3GjVlkOz+5b7A==} + peerDependencies: + '@tiptap/core': ^3.11.0 + + '@tiptap/extension-heading@3.11.0': + resolution: {integrity: sha512-4Eo67Yo7vsYLkizcMoGdZAR9aHbC7FFTrqfNEd4Em3ajRi0iNqyWMaI90UCYlitDdRdqFlq/njWrMqBOLUgaWQ==} + peerDependencies: + '@tiptap/core': ^3.11.0 + + '@tiptap/extension-horizontal-rule@3.11.0': + resolution: {integrity: sha512-FugFHZG+oiMBV6k42hn9NOA4wRNc2b9UeEIMR+XwEMpWJInV4VwSwDvu8JClgkDo8z7FEnker9e51DZ00CLWqg==} + peerDependencies: + '@tiptap/core': ^3.11.0 + '@tiptap/pm': ^3.11.0 + + '@tiptap/extension-italic@3.11.0': + resolution: {integrity: sha512-WP6wL2b//8bLVdeUCWOpYA7nUStvrAMMD0nRn0F9CEW+l7vH6El2PZFhHmJ9uqXo5MnyugBpARiwgxfoAlef5w==} + peerDependencies: + '@tiptap/core': ^3.11.0 + + '@tiptap/extension-link@3.11.0': + resolution: {integrity: sha512-RoUkGqowVMKLE76KktNOGhzNMyKtwrSDRqeYCe1ODPuOMZvDGexOE8cIuA4A1ODkgN6ji9qE/9Sf8uhpZdH39Q==} + peerDependencies: + '@tiptap/core': ^3.11.0 + '@tiptap/pm': ^3.11.0 + + '@tiptap/extension-list-item@3.11.0': + resolution: {integrity: sha512-KXTTSBH/T/WW8O1YhK/lVmwlSGh2w2VVucUkMLhgk1VPchahAkn2LfgbgKrCRG/F8M8Jlfvz67iJDo6+bbNqew==} + peerDependencies: + '@tiptap/extension-list': ^3.11.0 + + '@tiptap/extension-list-keymap@3.11.0': + resolution: {integrity: sha512-vm1zGdEqcbQnrGlVXchk1ibmTsyxyfGcGPVWsc4MG+UAFcNfcpAnvCar71BF4RGGPtpzOWdqGkvJENyh0L5/Hw==} + peerDependencies: + '@tiptap/extension-list': ^3.11.0 + + '@tiptap/extension-list@3.11.0': + resolution: {integrity: sha512-4Ane7VCVZ+GFOQNuy2nMP+SoWH7EemC3geTTqvgHm1H0tbSosxLJAVaZ9dF06F35RJmYCm+jLJUhRVd156eCRQ==} + peerDependencies: + '@tiptap/core': ^3.11.0 + '@tiptap/pm': ^3.11.0 + + '@tiptap/extension-ordered-list@3.11.0': + resolution: {integrity: sha512-kO8GH4w4Xil+qPiHJLAyILdGHF9hCjkhoVtPD8YEfqK6Qx3bZql5FPySCQNs+MU6rLSCCdam8SUPGY/+SCufqA==} + peerDependencies: + '@tiptap/extension-list': ^3.11.0 + + '@tiptap/extension-paragraph@3.11.0': + resolution: {integrity: sha512-hxgjZOXOqstRTWv+QjWJjK23rD5qzIV9ePlhX3imLeq/MgX0aU9VBDaG5SGKbSjaBNQnpLw6+sABJi3CDP6Z5A==} + peerDependencies: + '@tiptap/core': ^3.11.0 + + '@tiptap/extension-strike@3.11.0': + resolution: {integrity: sha512-XVP/WMYLrqLBfUsGPu2H9MrOUZLhGUaxtZ3hSRffDi/lsw53x/coZ9eO0FxOB9R7z2ksHWmticIs+0YnKt9LNQ==} + peerDependencies: + '@tiptap/core': ^3.11.0 + + '@tiptap/extension-text-style@3.11.0': + resolution: {integrity: sha512-q8RM4gzmdnUHosL65SIJzTTmL29bm+3hNPdloOuJyLd4sTYs2q+cues5mH5/n85HqX3+TvKrfrTVb1Yj62E1NA==} + peerDependencies: + '@tiptap/core': ^3.11.0 + + '@tiptap/extension-text@3.11.0': + resolution: {integrity: sha512-ELAYm2BuChzZOqDG9B0k3W6zqM4pwNvXkam28KgHGiT2y7Ni68Rb+NXp16uVR+5zR6hkqnQ/BmJSKzAW59MXpA==} + peerDependencies: + '@tiptap/core': ^3.11.0 + + '@tiptap/extension-underline@3.11.0': + resolution: {integrity: sha512-D3PsS/84RlQKFjd5eerMIUioC0mNh4yy1RRV/WbXx6ugu+6T+0hT42gNk9Ap8pDsVQZCk0SHfDyBEUFC2KOwKw==} + peerDependencies: + '@tiptap/core': ^3.11.0 + + '@tiptap/extensions@3.11.0': + resolution: {integrity: sha512-g43beA73ZMLezez1st9LEwYrRHZ0FLzlsSlOZKk7sdmtHLmuqWHf4oyb0XAHol1HZIdGv104rYaGNgmQXr1ecQ==} + peerDependencies: + '@tiptap/core': ^3.11.0 + '@tiptap/pm': ^3.11.0 + + '@tiptap/pm@3.11.0': + resolution: {integrity: sha512-plCQDLCZIOc92cizB8NNhBRN0szvYR3cx9i5IXo6v9Xsgcun8KHNcJkesc2AyeqdIs0BtOJZaqQ9adHThz8UDw==} + + '@tiptap/react@3.11.0': + resolution: {integrity: sha512-SDGei/2DjwmhzsxIQNr6dkB6NxLgXZjQ6hF36NfDm4937r5NLrWrNk5tCsoDQiKZ0DHEzuJ6yZM5C7I7LZLB6w==} + peerDependencies: + '@tiptap/core': ^3.11.0 + '@tiptap/pm': ^3.11.0 + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + '@types/react-dom': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 + + '@tiptap/starter-kit@3.11.0': + resolution: {integrity: sha512-8kMMYqVSZ2Oqji+mY1o9meTjCRWp4DplFegu7APqDEQRhlb6mBI0wNuazYb7FKJIHJTtf0F6cYglJrxpu9c/fA==} + + '@trpc/client@11.6.0': + resolution: {integrity: sha512-DyWbYk2hd50BaVrXWVkaUnaSwgAF5g/lfBkXtkF1Aqlk6BtSzGUo3owPkgqQO2I5LwWy1+ra9TsSfBBvIZpTwg==} + peerDependencies: + '@trpc/server': 11.6.0 + typescript: '>=5.7.2' + + '@trpc/react-query@11.6.0': + resolution: {integrity: sha512-xljUCzROa23cC89SEd5fwbKiWrGus2NDwtg8zszPlsFvaByWW50Jx6y5sLPXhp/g1FBsEtCInNNhEEL0UCHwGw==} + peerDependencies: + '@tanstack/react-query': ^5.80.3 + '@trpc/client': 11.6.0 + '@trpc/server': 11.6.0 + react: '>=18.2.0' + react-dom: '>=18.2.0' + typescript: '>=5.7.2' + + '@trpc/server@11.6.0': + resolution: {integrity: sha512-skTso0AWbOZck40jwNeYv++AMZXNWLUWdyk+pB5iVaYmEKTuEeMoPrEudR12VafbEU6tZa8HK3QhBfTYYHDCdg==} + peerDependencies: + typescript: '>=5.7.2' + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + + '@types/bcryptjs@3.0.0': + resolution: {integrity: sha512-WRZOuCuaz8UcZZE4R5HXTco2goQSI2XxjGY3hbM/xDvwmqFWd4ivooImsMx65OKM6CtNKbnZ5YL+YwAwK7c1dg==} + deprecated: This is a stub types definition. bcryptjs provides its own type definitions, so you do not need this installed. + + '@types/body-parser@1.19.6': + resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/d3-array@3.2.2': + resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==} + + '@types/d3-axis@3.0.6': + resolution: {integrity: sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==} + + '@types/d3-brush@3.0.6': + resolution: {integrity: sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==} + + '@types/d3-chord@3.0.6': + resolution: {integrity: sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==} + + '@types/d3-color@3.1.3': + resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} + + '@types/d3-contour@3.0.6': + resolution: {integrity: sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==} + + '@types/d3-delaunay@6.0.4': + resolution: {integrity: sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==} + + '@types/d3-dispatch@3.0.7': + resolution: {integrity: sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==} + + '@types/d3-drag@3.0.7': + resolution: {integrity: sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==} + + '@types/d3-dsv@3.0.7': + resolution: {integrity: sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==} + + '@types/d3-ease@3.0.2': + resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} + + '@types/d3-fetch@3.0.7': + resolution: {integrity: sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==} + + '@types/d3-force@3.0.10': + resolution: {integrity: sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==} + + '@types/d3-format@3.0.4': + resolution: {integrity: sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==} + + '@types/d3-geo@3.1.0': + resolution: {integrity: sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==} + + '@types/d3-hierarchy@3.1.7': + resolution: {integrity: sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==} + + '@types/d3-interpolate@3.0.4': + resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} + + '@types/d3-path@3.1.1': + resolution: {integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==} + + '@types/d3-polygon@3.0.2': + resolution: {integrity: sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==} + + '@types/d3-quadtree@3.0.6': + resolution: {integrity: sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==} + + '@types/d3-random@3.0.3': + resolution: {integrity: sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==} + + '@types/d3-scale-chromatic@3.1.0': + resolution: {integrity: sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==} + + '@types/d3-scale@4.0.9': + resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==} + + '@types/d3-selection@3.0.11': + resolution: {integrity: sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==} + + '@types/d3-shape@3.1.7': + resolution: {integrity: sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==} + + '@types/d3-time-format@4.0.3': + resolution: {integrity: sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==} + + '@types/d3-time@3.0.4': + resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==} + + '@types/d3-timer@3.0.2': + resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} + + '@types/d3-transition@3.0.9': + resolution: {integrity: sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==} + + '@types/d3-zoom@3.0.8': + resolution: {integrity: sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==} + + '@types/d3@7.4.3': + resolution: {integrity: sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/estree-jsx@1.0.5': + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/express-serve-static-core@4.19.6': + resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==} + + '@types/express@4.17.21': + resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + + '@types/geojson@7946.0.16': + resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} + + '@types/google.maps@3.58.1': + resolution: {integrity: sha512-X9QTSvGJ0nCfMzYOnaVs/k6/4L+7F5uCS+4iUmkLEls6J9S/Phv+m/i3mDeyc49ZBgwab3EFO1HEoBY7k98EGQ==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/http-errors@2.0.5': + resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} + + '@types/jsonwebtoken@9.0.10': + resolution: {integrity: sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==} + + '@types/katex@0.16.7': + resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==} + + '@types/linkify-it@5.0.0': + resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} + + '@types/markdown-it@14.1.2': + resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/mdurl@2.0.0': + resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + + '@types/mime@1.3.5': + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/multer@2.0.0': + resolution: {integrity: sha512-C3Z9v9Evij2yST3RSBktxP9STm6OdMc5uR1xF1SGr98uv8dUlAL2hqwrZ3GVB3uyMyiegnscEK6PGtYvNrjTjw==} + + '@types/node-fetch@2.6.13': + resolution: {integrity: sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==} + + '@types/node@14.18.63': + resolution: {integrity: sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==} + + '@types/node@18.19.130': + resolution: {integrity: sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==} + + '@types/node@24.7.0': + resolution: {integrity: sha512-IbKooQVqUBrlzWTi79E8Fw78l8k1RNtlDDNWsFZs7XonuQSJ8oNYfEeclhprUldXISRMLzBpILuKgPlIxm+/Yw==} + + '@types/nodemailer@7.0.4': + resolution: {integrity: sha512-ee8fxWqOchH+Hv6MDDNNy028kwvVnLplrStm4Zf/3uHWw5zzo8FoYYeffpJtGs2wWysEumMH0ZIdMGMY1eMAow==} + + '@types/pako@2.0.4': + resolution: {integrity: sha512-VWDCbrLeVXJM9fihYodcLiIv0ku+AlOa/TQ1SvYOaBuyrSKgEcro95LJyIsJ4vSo6BXIxOKxiJAat04CmST9Fw==} + + '@types/pdfkit@0.17.4': + resolution: {integrity: sha512-odAmVuuguRxKh1X4pbMrJMp8ecwNqHRw6lweupvzK+wuyNmi6wzlUlGVZ9EqMvp3Bs2+L9Ty0sRlrvKL+gsQZg==} + + '@types/qrcode@1.5.6': + resolution: {integrity: sha512-te7NQcV2BOvdj2b1hCAHzAoMNuj65kNBMz0KBaxM6c3VGBOhU0dURQKOtH8CFNI/dsKkwlv32p26qYQTWoB5bw==} + + '@types/qs@6.14.0': + resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} + + '@types/raf@3.4.3': + resolution: {integrity: sha512-c4YAvMedbPZ5tEyxzQdMoOhhJ4RD3rngZIdwC2/qDN3d7JpEhB6fiBRKVY1lg5B7Wk+uPBjn5f39j1/2MY1oOw==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + + '@types/react-dom@19.2.1': + resolution: {integrity: sha512-/EEvYBdT3BflCWvTMO7YkYBHVE9Ci6XdqZciZANQgKpaiDRGOLIlRo91jbTNRQjgPFWVaRxcYc0luVNFitz57A==} + peerDependencies: + '@types/react': ^19.2.0 + + '@types/react@19.2.2': + resolution: {integrity: sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==} + + '@types/send@0.17.5': + resolution: {integrity: sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==} + + '@types/send@1.2.0': + resolution: {integrity: sha512-zBF6vZJn1IaMpg3xUF25VK3gd3l8zwE0ZLRX7dsQyQi+jp4E8mMDJNGDYnYse+bQhYwWERTxVwHpi3dMOq7RKQ==} + + '@types/serve-static@1.15.9': + resolution: {integrity: sha512-dOTIuqpWLyl3BBXU3maNQsS4A3zuuoYRNIvYSxxhebPfXg2mzWQEPne/nlJ37yOse6uGgR386uTpdsx4D0QZWA==} + + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@types/use-sync-external-store@0.0.6': + resolution: {integrity: sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==} + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + '@vitejs/plugin-react@5.0.4': + resolution: {integrity: sha512-La0KD0vGkVkSk6K+piWDKRUyg8Rl5iAIKRMH0vMJI0Eg47bq1eOxmoObAaQG37WMW9MSyk7Cs8EIWwJC1PtzKA==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + + '@vitest/expect@2.1.9': + resolution: {integrity: sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==} + + '@vitest/mocker@2.1.9': + resolution: {integrity: sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@2.1.9': + resolution: {integrity: sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==} + + '@vitest/runner@2.1.9': + resolution: {integrity: sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==} + + '@vitest/snapshot@2.1.9': + resolution: {integrity: sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==} + + '@vitest/spy@2.1.9': + resolution: {integrity: sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ==} + + '@vitest/utils@2.1.9': + resolution: {integrity: sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==} + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + add@2.0.6: + resolution: {integrity: sha512-j5QzrmsokwWWp6kUcJQySpbG+xfOBqqKnup3OIk1pz+kB/80SLorZ9V8zHFLO92Lcd+hbvq8bT+zOGoPkmBV0Q==} + + adler-32@1.3.1: + resolution: {integrity: sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==} + engines: {node: '>=0.8'} + + agentkeepalive@4.6.0: + resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} + engines: {node: '>= 8.0.0'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + append-field@1.0.0: + resolution: {integrity: sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==} + + archiver-utils@2.1.0: + resolution: {integrity: sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==} + engines: {node: '>= 6'} + + archiver-utils@3.0.4: + resolution: {integrity: sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==} + engines: {node: '>= 10'} + + archiver@5.3.2: + resolution: {integrity: sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==} + engines: {node: '>= 10'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-hidden@1.2.6: + resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} + engines: {node: '>=10'} + + array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + autoprefixer@10.4.21: + resolution: {integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + aws-ssl-profiles@1.1.2: + resolution: {integrity: sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==} + engines: {node: '>= 6.0.0'} + + axios@1.12.2: + resolution: {integrity: sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==} + + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base64-arraybuffer@1.0.2: + resolution: {integrity: sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==} + engines: {node: '>= 0.6.0'} + + base64-js@0.0.8: + resolution: {integrity: sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==} + engines: {node: '>= 0.4'} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + baseline-browser-mapping@2.8.12: + resolution: {integrity: sha512-vAPMQdnyKCBtkmQA6FMCBvU9qFIppS3nzyXnEM+Lo2IAhG4Mpjv9cCxMudhgV3YdNNJv6TNqXy97dfRVL2LmaQ==} + hasBin: true + + bcryptjs@3.0.3: + resolution: {integrity: sha512-GlF5wPWnSa/X5LKM1o0wz0suXIINz1iHRLvTS+sLyi7XPbe5ycmYI3DlZqVGZZtDgl4DmasFg7gOB3JYbphV5g==} + hasBin: true + + big-integer@1.6.52: + resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} + engines: {node: '>=0.6'} + + binary@0.3.0: + resolution: {integrity: sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + bluebird@3.4.7: + resolution: {integrity: sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==} + + body-parser@1.20.3: + resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + bowser@2.12.1: + resolution: {integrity: sha512-z4rE2Gxh7tvshQ4hluIT7XcFrgLIQaw9X3A+kTTRdovCz5PMukm/0QC/BKSYPj3omF5Qfypn9O/c5kgpmvYUCw==} + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + brotli@1.3.3: + resolution: {integrity: sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==} + + browserslist@4.26.3: + resolution: {integrity: sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + buffer-equal-constant-time@1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer-indexof-polyfill@1.0.2: + resolution: {integrity: sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==} + engines: {node: '>=0.10'} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + buffers@0.1.1: + resolution: {integrity: sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==} + engines: {node: '>=0.2.0'} + + busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001748: + resolution: {integrity: sha512-5P5UgAr0+aBmNiplks08JLw+AW/XG/SurlgZLgB1dDLfAw7EfRGxIwzPHxdSCGY/BTKDqIVyJL87cCN6s0ZR0w==} + + canvg@3.0.11: + resolution: {integrity: sha512-5ON+q7jCTgMp9cjpu4Jo6XbvfYwSB2Ow3kzHKfIyJfaCAOHLbdKPQqGKgfED/R5B+3TFFfe8pegYA+b423SRyA==} + engines: {node: '>=10.0.0'} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + cfb@1.2.2: + resolution: {integrity: sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==} + engines: {node: '>=0.8'} + + chai@5.3.3: + resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} + engines: {node: '>=18'} + + chainsaw@0.1.0: + resolution: {integrity: sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + + chevrotain-allstar@0.3.1: + resolution: {integrity: sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==} + peerDependencies: + chevrotain: ^11.0.0 + + chevrotain@11.0.3: + resolution: {integrity: sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==} + + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + + class-variance-authority@0.7.1: + resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + + cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + + clone@2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + cmdk@1.1.1: + resolution: {integrity: sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg==} + peerDependencies: + react: ^18 || ^19 || ^19.0.0-rc + react-dom: ^18 || ^19 || ^19.0.0-rc + + codepage@1.15.0: + resolution: {integrity: sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==} + engines: {node: '>=0.8'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + compress-commons@4.1.2: + resolution: {integrity: sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==} + engines: {node: '>= 10'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + concat-stream@2.0.0: + resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} + engines: {'0': node >= 6.0} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + confbox@0.2.2: + resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + + cookie@0.7.1: + resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} + engines: {node: '>= 0.6'} + + cookie@1.0.2: + resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} + engines: {node: '>=18'} + + copy-anything@3.0.5: + resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} + engines: {node: '>=12.13'} + + core-js@3.46.0: + resolution: {integrity: sha512-vDMm9B0xnqqZ8uSBpZ8sNtRtOdmfShrvT6h2TuQGLs0Is+cR0DYbj/KWP6ALVNbWPpqA/qPLoOuppJN07humpA==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cose-base@1.0.3: + resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} + + cose-base@2.2.0: + resolution: {integrity: sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==} + + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + crc32-stream@4.0.3: + resolution: {integrity: sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==} + engines: {node: '>= 10'} + + crelt@1.0.6: + resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} + + crypto-js@4.2.0: + resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} + + css-line-break@2.1.0: + resolution: {integrity: sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + cytoscape-cose-bilkent@4.1.0: + resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} + peerDependencies: + cytoscape: ^3.2.0 + + cytoscape-fcose@2.2.0: + resolution: {integrity: sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==} + peerDependencies: + cytoscape: ^3.2.0 + + cytoscape@3.33.1: + resolution: {integrity: sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==} + engines: {node: '>=0.10'} + + d3-array@2.12.1: + resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} + + d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + + d3-axis@3.0.0: + resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} + engines: {node: '>=12'} + + d3-brush@3.0.0: + resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} + engines: {node: '>=12'} + + d3-chord@3.0.1: + resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} + engines: {node: '>=12'} + + d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + + d3-contour@4.0.2: + resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} + engines: {node: '>=12'} + + d3-delaunay@6.0.4: + resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} + engines: {node: '>=12'} + + d3-dispatch@3.0.1: + resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} + engines: {node: '>=12'} + + d3-drag@3.0.0: + resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} + engines: {node: '>=12'} + + d3-dsv@3.0.1: + resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} + engines: {node: '>=12'} + hasBin: true + + d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + + d3-fetch@3.0.1: + resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} + engines: {node: '>=12'} + + d3-force@3.0.0: + resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} + engines: {node: '>=12'} + + d3-format@3.1.0: + resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} + engines: {node: '>=12'} + + d3-geo@3.1.1: + resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==} + engines: {node: '>=12'} + + d3-hierarchy@3.1.2: + resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} + engines: {node: '>=12'} + + d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + + d3-path@1.0.9: + resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} + + d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + + d3-polygon@3.0.1: + resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} + engines: {node: '>=12'} + + d3-quadtree@3.0.1: + resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} + engines: {node: '>=12'} + + d3-random@3.0.1: + resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} + engines: {node: '>=12'} + + d3-sankey@0.12.3: + resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==} + + d3-scale-chromatic@3.1.0: + resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==} + engines: {node: '>=12'} + + d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + + d3-selection@3.0.0: + resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} + engines: {node: '>=12'} + + d3-shape@1.3.7: + resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} + + d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} + + d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + + d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + + d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + + d3-transition@3.0.1: + resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} + engines: {node: '>=12'} + peerDependencies: + d3-selection: 2 - 3 + + d3-zoom@3.0.0: + resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} + engines: {node: '>=12'} + + d3@7.9.0: + resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==} + engines: {node: '>=12'} + + dagre-d3-es@7.0.11: + resolution: {integrity: sha512-tvlJLyQf834SylNKax8Wkzco/1ias1OPw8DcUMDE7oUIoSEW25riQVuiu/0OWEFqT0cxHT3Pa9/D82Jr47IONw==} + + date-fns-jalali@4.1.0-0: + resolution: {integrity: sha512-hTIP/z+t+qKwBDcmmsnmjWTduxCg+5KfdqWQvb2X/8C9+knYY6epN/pfxdDuyVlSVeFz0sM5eEfwIUQ70U4ckg==} + + date-fns@4.1.0: + resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} + + dayjs@1.11.18: + resolution: {integrity: sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + decimal.js-light@2.5.1: + resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} + + decode-named-character-reference@1.2.0: + resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} + + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + + delaunator@5.0.1: + resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + denque@2.1.0: + resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} + engines: {node: '>=0.10'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + dfa@1.2.0: + resolution: {integrity: sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==} + + dijkstrajs@1.0.3: + resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} + + dom-helpers@5.2.1: + resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} + + dompurify@3.3.0: + resolution: {integrity: sha512-r+f6MYR1gGN1eJv0TVQbhA7if/U7P87cdPl3HN5rikqaBSBxLiCb/b9O+2eG0cxz0ghyU+mU1QkbsOwERMYlWQ==} + + dotenv@17.2.3: + resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==} + engines: {node: '>=12'} + + drizzle-kit@0.31.5: + resolution: {integrity: sha512-+CHgPFzuoTQTt7cOYCV6MOw2w8vqEn/ap1yv4bpZOWL03u7rlVRQhUY0WYT3rHsgVTXwYQDZaSUJSQrMBUKuWg==} + hasBin: true + + drizzle-orm@0.44.6: + resolution: {integrity: sha512-uy6uarrrEOc9K1u5/uhBFJbdF5VJ5xQ/Yzbecw3eAYOunv5FDeYkR2m8iitocdHBOHbvorviKOW5GVw0U1j4LQ==} + peerDependencies: + '@aws-sdk/client-rds-data': '>=3' + '@cloudflare/workers-types': '>=4' + '@electric-sql/pglite': '>=0.2.0' + '@libsql/client': '>=0.10.0' + '@libsql/client-wasm': '>=0.10.0' + '@neondatabase/serverless': '>=0.10.0' + '@op-engineering/op-sqlite': '>=2' + '@opentelemetry/api': ^1.4.1 + '@planetscale/database': '>=1.13' + '@prisma/client': '*' + '@tidbcloud/serverless': '*' + '@types/better-sqlite3': '*' + '@types/pg': '*' + '@types/sql.js': '*' + '@upstash/redis': '>=1.34.7' + '@vercel/postgres': '>=0.8.0' + '@xata.io/client': '*' + better-sqlite3: '>=7' + bun-types: '*' + expo-sqlite: '>=14.0.0' + gel: '>=2' + knex: '*' + kysely: '*' + mysql2: '>=2' + pg: '>=8' + postgres: '>=3' + prisma: '*' + sql.js: '>=1' + sqlite3: '>=5' + peerDependenciesMeta: + '@aws-sdk/client-rds-data': + optional: true + '@cloudflare/workers-types': + optional: true + '@electric-sql/pglite': + optional: true + '@libsql/client': + optional: true + '@libsql/client-wasm': + optional: true + '@neondatabase/serverless': + optional: true + '@op-engineering/op-sqlite': + optional: true + '@opentelemetry/api': + optional: true + '@planetscale/database': + optional: true + '@prisma/client': + optional: true + '@tidbcloud/serverless': + optional: true + '@types/better-sqlite3': + optional: true + '@types/pg': + optional: true + '@types/sql.js': + optional: true + '@upstash/redis': + optional: true + '@vercel/postgres': + optional: true + '@xata.io/client': + optional: true + better-sqlite3: + optional: true + bun-types: + optional: true + expo-sqlite: + optional: true + gel: + optional: true + knex: + optional: true + kysely: + optional: true + mysql2: + optional: true + pg: + optional: true + postgres: + optional: true + prisma: + optional: true + sql.js: + optional: true + sqlite3: + optional: true + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + duplexer2@0.1.4: + resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} + + ecdsa-sig-formatter@1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + electron-to-chromium@1.5.230: + resolution: {integrity: sha512-A6A6Fd3+gMdaed9wX83CvHYJb4UuapPD5X5SLq72VZJzxHSY0/LUweGXRWmQlh2ln7KV7iw7jnwXK7dlPoOnHQ==} + + embla-carousel-react@8.6.0: + resolution: {integrity: sha512-0/PjqU7geVmo6F734pmPqpyHqiM99olvyecY7zdweCw+6tKEXnrE90pBiBbMMU8s5tICemzpQ3hi5EpxzGW+JA==} + peerDependencies: + react: ^16.8.0 || ^17.0.1 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + + embla-carousel-reactive-utils@8.6.0: + resolution: {integrity: sha512-fMVUDUEx0/uIEDM0Mz3dHznDhfX+znCCDCeIophYb1QGVM7YThSWX+wz11zlYwWFOr74b4QLGg0hrGPJeG2s4A==} + peerDependencies: + embla-carousel: 8.6.0 + + embla-carousel@8.6.0: + resolution: {integrity: sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + + enhanced-resolve@5.18.3: + resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} + engines: {node: '>=10.13.0'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + esbuild-register@3.6.0: + resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} + peerDependencies: + esbuild: '>=0.12 <1' + + esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.25.10: + resolution: {integrity: sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + + exceljs@4.4.0: + resolution: {integrity: sha512-XctvKaEMaj1Ii9oDOqbW/6e1gXknSY4g/aLCDicOXqBE4M0nRWkUu0PTp++UPNzoFY12BNHMfs/VadKIS6llvg==} + engines: {node: '>=8.3.0'} + + expect-type@1.2.2: + resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} + engines: {node: '>=12.0.0'} + + express@4.21.2: + resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} + engines: {node: '>= 0.10.0'} + + exsolve@1.0.7: + resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + fast-csv@4.3.6: + resolution: {integrity: sha512-2RNSpuwwsJGP0frGsOmTb9oUF+VkFSM4SyLTDgwf2ciHWTarN0lQTC+F2f/t5J9QjW+c65VFIAAu85GsvMIusw==} + engines: {node: '>=10.0.0'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-equals@5.3.2: + resolution: {integrity: sha512-6rxyATwPCkaFIL3JLqw8qXqMpIZ942pTX/tbQFkRsDGblS8tNGtlUauA/+mt6RUfqn/4MoEr+WDkYoIQbibWuQ==} + engines: {node: '>=6.0.0'} + + fast-png@6.4.0: + resolution: {integrity: sha512-kAqZq1TlgBjZcLr5mcN6NP5Rv4V2f22z00c3g8vRrwkcqjerx7BEhPbOnWCPqaHUl2XWQBJQvOT/FQhdMT7X/Q==} + + fast-xml-parser@5.2.5: + resolution: {integrity: sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==} + hasBin: true + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fflate@0.8.2: + resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + + finalhandler@1.3.1: + resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} + engines: {node: '>= 0.8'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + follow-redirects@1.15.11: + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + fontkit@2.0.4: + resolution: {integrity: sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g==} + + form-data-encoder@1.7.2: + resolution: {integrity: sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==} + + form-data@4.0.4: + resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} + engines: {node: '>= 6'} + + formdata-node@4.4.1: + resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} + engines: {node: '>= 12.20'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + frac@1.1.2: + resolution: {integrity: sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==} + engines: {node: '>=0.8'} + + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + + framer-motion@12.23.22: + resolution: {integrity: sha512-ZgGvdxXCw55ZYvhoZChTlG6pUuehecgvEAJz0BHoC5pQKW1EC5xf1Mul1ej5+ai+pVY0pylyFfdl45qnM1/GsA==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + fstream@1.0.12: + resolution: {integrity: sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==} + engines: {node: '>=0.6'} + deprecated: This package is no longer supported. + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + generate-function@2.3.1: + resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.10.1: + resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + globals@15.15.0: + resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} + engines: {node: '>=18'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + hachure-fill@0.5.2: + resolution: {integrity: sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hast-util-from-dom@5.0.1: + resolution: {integrity: sha512-N+LqofjR2zuzTjCPzyDUdSshy4Ma6li7p/c3pA78uTwzFgENbgbUrm2ugwsOdcjI1muO+o6Dgzp9p8WHtn/39Q==} + + hast-util-from-html-isomorphic@2.0.0: + resolution: {integrity: sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==} + + hast-util-from-html@2.0.3: + resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} + + hast-util-from-parse5@8.0.3: + resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} + + hast-util-is-element@3.0.0: + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + + hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + + hast-util-raw@9.1.0: + resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} + + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + + hast-util-to-jsx-runtime@2.3.6: + resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} + + hast-util-to-parse5@8.0.0: + resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} + + hast-util-to-text@4.0.2: + resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + hastscript@9.0.1: + resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} + + html-url-attributes@3.0.1: + resolution: {integrity: sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + html2canvas@1.4.1: + resolution: {integrity: sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==} + engines: {node: '>=8.0.0'} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + iconv-lite@0.7.0: + resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + inline-style-parser@0.2.4: + resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} + + input-otp@1.4.2: + resolution: {integrity: sha512-l3jWwYNvrEa6NTCt7BECfCm48GvwuZzkoeG3gBL2w4CHeOXW3eKFmf9UNYkNfYc3mxMrthMnxjIE07MT0zLBQA==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc + + internmap@1.0.1: + resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} + + internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + + iobuffer@5.4.0: + resolution: {integrity: sha512-DRebOWuqDvxunfkNJAlc3IzWIPD5xVxwUNbHr7xKB8E6aLJxIPfNX3CoMJghcFjpv6RWQsrcJbghtEwSPoJqMA==} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-property@1.0.2: + resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==} + + is-what@4.1.16: + resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} + engines: {node: '>=12.13'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + hasBin: true + + jose@6.1.0: + resolution: {integrity: sha512-TTQJyoEoKcC1lscpVDCSsVgYzUDg/0Bt3WE//WiTPK6uOCQC2KZS4MpugbMWt/zyjkopgZoXhZuCi00gLudfUA==} + + jpeg-exif@1.1.4: + resolution: {integrity: sha512-a+bKEcCjtuW5WTdgeXFzswSrdqi0jk4XlEtZlx5A94wCoBpFjfFTbo/Tra5SpNCl/YFZPvcV1dJc+TAYeg6ROQ==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonwebtoken@9.0.2: + resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} + engines: {node: '>=12', npm: '>=6'} + + jspdf-autotable@5.0.2: + resolution: {integrity: sha512-YNKeB7qmx3pxOLcNeoqAv3qTS7KuvVwkFe5AduCawpop3NOkBUtqDToxNc225MlNecxT4kP2Zy3z/y/yvGdXUQ==} + peerDependencies: + jspdf: ^2 || ^3 + + jspdf@3.0.3: + resolution: {integrity: sha512-eURjAyz5iX1H8BOYAfzvdPfIKK53V7mCpBTe7Kb16PaM8JSXEcUQNBQaiWMI8wY5RvNOPj4GccMjTlfwRBd+oQ==} + + jszip@3.10.1: + resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} + + jwa@1.4.2: + resolution: {integrity: sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==} + + jws@3.2.2: + resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} + + katex@0.16.25: + resolution: {integrity: sha512-woHRUZ/iF23GBP1dkDQMh1QBad9dmr8/PAwNA54VrSOVYgI12MAcE14TqnDdQOdzyEonGzMepYnqBMYdsoAr8Q==} + hasBin: true + + khroma@2.1.0: + resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} + + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + + langium@3.3.1: + resolution: {integrity: sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w==} + engines: {node: '>=16.0.0'} + + layout-base@1.0.2: + resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} + + layout-base@2.0.1: + resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==} + + lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} + + lie@3.3.0: + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + + lightningcss-darwin-arm64@1.30.1: + resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.30.1: + resolution: {integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.30.1: + resolution: {integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.30.1: + resolution: {integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.30.1: + resolution: {integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.30.1: + resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.30.1: + resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.30.1: + resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.30.1: + resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.30.1: + resolution: {integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.30.1: + resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==} + engines: {node: '>= 12.0.0'} + + linebreak@1.1.0: + resolution: {integrity: sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==} + + linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + + linkifyjs@4.3.2: + resolution: {integrity: sha512-NT1CJtq3hHIreOianA8aSXn6Cw0JzYOuDQbOrSPe7gqFnCpKP++MQe3ODgO3oh2GJFORkAAdqredOa60z63GbA==} + + listenercount@1.0.1: + resolution: {integrity: sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==} + + local-pkg@1.1.2: + resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==} + engines: {node: '>=14'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash.defaults@4.2.0: + resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} + + lodash.difference@4.5.0: + resolution: {integrity: sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==} + + lodash.escaperegexp@4.1.2: + resolution: {integrity: sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==} + + lodash.flatten@4.4.0: + resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==} + + lodash.groupby@4.6.0: + resolution: {integrity: sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw==} + + lodash.includes@4.3.0: + resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} + + lodash.isboolean@3.0.3: + resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} + + lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. + + lodash.isfunction@3.0.9: + resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==} + + lodash.isinteger@4.0.4: + resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} + + lodash.isnil@4.0.0: + resolution: {integrity: sha512-up2Mzq3545mwVnMhTDMdfoG1OurpA/s5t88JmQX809eH3C8491iu2sfKhTfhQtKY78oPNhiaHJUpT/dUDAAtng==} + + lodash.isnumber@3.0.3: + resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.isstring@4.0.1: + resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + + lodash.isundefined@3.0.1: + resolution: {integrity: sha512-MXB1is3s899/cD8jheYYE2V9qTHwKvt+npCwpD+1Sxm3Q3cECXCiYHjeHWXNwr6Q0SOBPrYUDxendrO6goVTEA==} + + lodash.once@4.1.1: + resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + + lodash.union@4.6.0: + resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==} + + lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + long@5.3.2: + resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + loupe@3.2.1: + resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + + lru.min@1.1.2: + resolution: {integrity: sha512-Nv9KddBcQSlQopmBHXSsZVY5xsdlZkdH/Iey0BlcBYggMd4two7cZnKOK9vmy3nY0O5RGH99z1PCeTpPqszUYg==} + engines: {bun: '>=1.0.0', deno: '>=1.30.0', node: '>=8.0.0'} + + lucide-react@0.453.0: + resolution: {integrity: sha512-kL+RGZCcJi9BvJtzg2kshO192Ddy9hv3ij+cPrVPWSRzgCWCVazoQJxOjAwgK53NomL07HB7GPHW120FimjNhQ==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc + + lucide-react@0.542.0: + resolution: {integrity: sha512-w3hD8/SQB7+lzU2r4VdFyzzOzKnUjTZIF/MQJGSSvni7Llewni4vuViRppfRAa2guOsY5k4jZyxw/i9DQHv+dw==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + magic-string@0.30.19: + resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} + + markdown-it@14.1.0: + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} + hasBin: true + + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + + marked@16.4.1: + resolution: {integrity: sha512-ntROs7RaN3EvWfy3EZi14H4YxmT6A5YvywfhO+0pm+cH/dnSQRmdAmoFIc3B9aiwTehyk7pESH4ofyBY+V5hZg==} + engines: {node: '>= 20'} + hasBin: true + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mdast-util-find-and-replace@3.0.2: + resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} + + mdast-util-from-markdown@2.0.2: + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + + mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + + mdast-util-gfm-footnote@2.1.0: + resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.1.0: + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} + + mdast-util-math@3.0.0: + resolution: {integrity: sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==} + + mdast-util-mdx-expression@2.0.1: + resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} + + mdast-util-mdx-jsx@3.2.0: + resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==} + + mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.2.0: + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + merge-descriptors@1.0.3: + resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + + mermaid@11.12.0: + resolution: {integrity: sha512-ZudVx73BwrMJfCFmSSJT84y6u5brEoV8DOItdHomNLz32uBjNrelm7mg95X7g+C6UoQH/W6mBLGDEDv73JdxBg==} + + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.1: + resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + + micromark-extension-math@3.1.0: + resolution: {integrity: sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@3.1.0: + resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} + engines: {node: '>= 18'} + + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + + mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + + mlly@1.8.0: + resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} + + modern-screenshot@4.6.6: + resolution: {integrity: sha512-8tF0xEpe7yx37mK95UcIghSCWYeu628K2hLJl+ZNY2ANmRzYLlRLpquPHAQcL8keF6BoeEzTEw4GrgmUpGuZ8w==} + + motion-dom@12.23.21: + resolution: {integrity: sha512-5xDXx/AbhrfgsQmSE7YESMn4Dpo6x5/DTZ4Iyy4xqDvVHWvFVoV+V2Ri2S/ksx+D40wrZ7gPYiMWshkdoqNgNQ==} + + motion-utils@12.23.6: + resolution: {integrity: sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ==} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + multer@2.0.2: + resolution: {integrity: sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw==} + engines: {node: '>= 10.16.0'} + + mysql2@3.15.1: + resolution: {integrity: sha512-WZMIRZstT2MFfouEaDz/AGFnGi1A2GwaDe7XvKTdRJEYiAHbOrh4S3d8KFmQeh11U85G+BFjIvS1Di5alusZsw==} + engines: {node: '>= 8.0'} + + named-placeholders@1.1.3: + resolution: {integrity: sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==} + engines: {node: '>=12.0.0'} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + nanoid@5.1.6: + resolution: {integrity: sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==} + engines: {node: ^18 || >=20} + hasBin: true + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + next-themes@0.4.6: + resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==} + peerDependencies: + react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc + react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc + + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + deprecated: Use your platform's native DOMException instead + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-releases@2.0.23: + resolution: {integrity: sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg==} + + nodemailer@7.0.11: + resolution: {integrity: sha512-gnXhNRE0FNhD7wPSCGhdNh46Hs6nm+uTyg+Kq0cZukNQiYdnCsoQjodNP9BQVG9XrcK/v6/MgpAPBUFyzh9pvw==} + engines: {node: '>=6.0.0'} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + oniguruma-parser@0.12.1: + resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} + + oniguruma-to-es@4.3.3: + resolution: {integrity: sha512-rPiZhzC3wXwE59YQMRDodUwwT9FZ9nNBwQQfsd1wfdtlKEyCdRV0avrTcSZ5xlIvGRVPd/cx6ZN45ECmS39xvg==} + + openai@4.104.0: + resolution: {integrity: sha512-p99EFNsA/yX6UhVO93f5kJsDRLAg+CTA2RBqdHK4RtK8u5IJw32Hyb2dTGKbnnFmnuoBv5r7Z2CURI9sGZpSuA==} + hasBin: true + peerDependencies: + ws: ^8.18.0 + zod: ^3.23.8 + peerDependenciesMeta: + ws: + optional: true + zod: + optional: true + + orderedmap@2.1.1: + resolution: {integrity: sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-manager-detector@1.5.0: + resolution: {integrity: sha512-uBj69dVlYe/+wxj8JOpr97XfsxH/eumMt6HqjNTmJDf/6NO9s+0uxeOneIz3AsPt2m6y9PqzDzd3ATcU17MNfw==} + + pako@0.2.9: + resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} + + pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + + pako@2.1.0: + resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} + + parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-data-parser@0.1.0: + resolution: {integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-to-regexp@0.1.12: + resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} + + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + pathval@2.0.1: + resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} + engines: {node: '>= 14.16'} + + pdfkit@0.17.2: + resolution: {integrity: sha512-UnwF5fXy08f0dnp4jchFYAROKMNTaPqb/xgR8GtCzIcqoTnbOqtp3bwKvO4688oHI6vzEEs8Q6vqqEnC5IUELw==} + + performance-now@2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + pkg-types@2.3.0: + resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} + + png-js@1.0.0: + resolution: {integrity: sha512-k+YsbhpA9e+EFfKjTCH3VW6aoKlyNYI6NYdTfDL4CIvFnvsuO84ttonmZE7rc+v23SLTH8XX+5w/Ak9v0xGY4g==} + + pngjs@5.0.0: + resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} + engines: {node: '>=10.13.0'} + + pnpm@10.18.0: + resolution: {integrity: sha512-6AT4ifHOzEDVctsITuw+SIFzn43sacD/ENLRvv+aTjCTg7ontbdQBZ1/TBSVNbbNDSyx7Trrc5I5pChKaPQM+g==} + engines: {node: '>=18.12'} + hasBin: true + + points-on-curve@0.2.0: + resolution: {integrity: sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==} + + points-on-path@0.2.1: + resolution: {integrity: sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==} + + postcss-selector-parser@6.0.10: + resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + prettier@3.6.2: + resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} + engines: {node: '>=14'} + hasBin: true + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + property-information@6.5.0: + resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + + prosemirror-changeset@2.3.1: + resolution: {integrity: sha512-j0kORIBm8ayJNl3zQvD1TTPHJX3g042et6y/KQhZhnPrruO8exkTgG8X+NRpj7kIyMMEx74Xb3DyMIBtO0IKkQ==} + + prosemirror-collab@1.3.1: + resolution: {integrity: sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==} + + prosemirror-commands@1.7.1: + resolution: {integrity: sha512-rT7qZnQtx5c0/y/KlYaGvtG411S97UaL6gdp6RIZ23DLHanMYLyfGBV5DtSnZdthQql7W+lEVbpSfwtO8T+L2w==} + + prosemirror-dropcursor@1.8.2: + resolution: {integrity: sha512-CCk6Gyx9+Tt2sbYk5NK0nB1ukHi2ryaRgadV/LvyNuO3ena1payM2z6Cg0vO1ebK8cxbzo41ku2DE5Axj1Zuiw==} + + prosemirror-gapcursor@1.4.0: + resolution: {integrity: sha512-z00qvurSdCEWUIulij/isHaqu4uLS8r/Fi61IbjdIPJEonQgggbJsLnstW7Lgdk4zQ68/yr6B6bf7sJXowIgdQ==} + + prosemirror-history@1.5.0: + resolution: {integrity: sha512-zlzTiH01eKA55UAf1MEjtssJeHnGxO0j4K4Dpx+gnmX9n+SHNlDqI2oO1Kv1iPN5B1dm5fsljCfqKF9nFL6HRg==} + + prosemirror-inputrules@1.5.1: + resolution: {integrity: sha512-7wj4uMjKaXWAQ1CDgxNzNtR9AlsuwzHfdFH1ygEHA2KHF2DOEaXl1CJfNPAKCg9qNEh4rum975QLaCiQPyY6Fw==} + + prosemirror-keymap@1.2.3: + resolution: {integrity: sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==} + + prosemirror-markdown@1.13.2: + resolution: {integrity: sha512-FPD9rHPdA9fqzNmIIDhhnYQ6WgNoSWX9StUZ8LEKapaXU9i6XgykaHKhp6XMyXlOWetmaFgGDS/nu/w9/vUc5g==} + + prosemirror-menu@1.2.5: + resolution: {integrity: sha512-qwXzynnpBIeg1D7BAtjOusR+81xCp53j7iWu/IargiRZqRjGIlQuu1f3jFi+ehrHhWMLoyOQTSRx/IWZJqOYtQ==} + + prosemirror-model@1.25.4: + resolution: {integrity: sha512-PIM7E43PBxKce8OQeezAs9j4TP+5yDpZVbuurd1h5phUxEKIu+G2a+EUZzIC5nS1mJktDJWzbqS23n1tsAf5QA==} + + prosemirror-schema-basic@1.2.4: + resolution: {integrity: sha512-ELxP4TlX3yr2v5rM7Sb70SqStq5NvI15c0j9j/gjsrO5vaw+fnnpovCLEGIcpeGfifkuqJwl4fon6b+KdrODYQ==} + + prosemirror-schema-list@1.5.1: + resolution: {integrity: sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==} + + prosemirror-state@1.4.4: + resolution: {integrity: sha512-6jiYHH2CIGbCfnxdHbXZ12gySFY/fz/ulZE333G6bPqIZ4F+TXo9ifiR86nAHpWnfoNjOb3o5ESi7J8Uz1jXHw==} + + prosemirror-tables@1.8.1: + resolution: {integrity: sha512-DAgDoUYHCcc6tOGpLVPSU1k84kCUWTWnfWX3UDy2Delv4ryH0KqTD6RBI6k4yi9j9I8gl3j8MkPpRD/vWPZbug==} + + prosemirror-trailing-node@3.0.0: + resolution: {integrity: sha512-xiun5/3q0w5eRnGYfNlW1uU9W6x5MoFKWwq/0TIRgt09lv7Hcser2QYV8t4muXbEr+Fwo0geYn79Xs4GKywrRQ==} + peerDependencies: + prosemirror-model: ^1.22.1 + prosemirror-state: ^1.4.2 + prosemirror-view: ^1.33.8 + + prosemirror-transform@1.10.5: + resolution: {integrity: sha512-RPDQCxIDhIBb1o36xxwsaeAvivO8VLJcgBtzmOwQ64bMtsVFh5SSuJ6dWSxO1UsHTiTXPCgQm3PDJt7p6IOLbw==} + + prosemirror-view@1.41.3: + resolution: {integrity: sha512-SqMiYMUQNNBP9kfPhLO8WXEk/fon47vc52FQsUiJzTBuyjKgEcoAwMyF04eQ4WZ2ArMn7+ReypYL60aKngbACQ==} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + + qrcode@1.5.4: + resolution: {integrity: sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==} + engines: {node: '>=10.13.0'} + hasBin: true + + qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + engines: {node: '>=0.6'} + + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + + raf@3.4.1: + resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + + react-day-picker@9.11.1: + resolution: {integrity: sha512-l3ub6o8NlchqIjPKrRFUCkTUEq6KwemQlfv3XZzzwpUeGwmDJ+0u0Upmt38hJyd7D/vn2dQoOoLV/qAp0o3uUw==} + engines: {node: '>=18'} + peerDependencies: + react: '>=16.8.0' + + react-dom@19.2.0: + resolution: {integrity: sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==} + peerDependencies: + react: ^19.2.0 + + react-hook-form@7.64.0: + resolution: {integrity: sha512-fnN+vvTiMLnRqKNTVhDysdrUay0kUUAymQnFIznmgDvapjveUWOOPqMNzPg+A+0yf9DuE2h6xzBjN1s+Qx8wcg==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^16.8.0 || ^17 || ^18 || ^19 + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + react-markdown@10.1.0: + resolution: {integrity: sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==} + peerDependencies: + '@types/react': '>=18' + react: '>=18' + + react-refresh@0.17.0: + resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} + engines: {node: '>=0.10.0'} + + react-remove-scroll-bar@2.3.8: + resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-remove-scroll@2.7.1: + resolution: {integrity: sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react-resizable-panels@3.0.6: + resolution: {integrity: sha512-b3qKHQ3MLqOgSS+FRYKapNkJZf5EQzuf6+RLiq1/IlTHw99YrZ2NJZLk4hQIzTnnIkRg2LUqyVinu6YWWpUYew==} + peerDependencies: + react: ^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + + react-smooth@4.0.4: + resolution: {integrity: sha512-gnGKTpYwqL0Iii09gHobNolvX4Kiq4PKx6eWBCYYix+8cdw+cGo3do906l1NBPKkSWx1DghC1dlWG9L2uGd61Q==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + react-style-singleton@2.2.3: + resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react-transition-group@4.4.5: + resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} + peerDependencies: + react: '>=16.6.0' + react-dom: '>=16.6.0' + + react@19.2.0: + resolution: {integrity: sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==} + engines: {node: '>=0.10.0'} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdir-glob@1.1.3: + resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} + + recharts-scale@0.4.5: + resolution: {integrity: sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==} + + recharts@2.15.4: + resolution: {integrity: sha512-UT/q6fwS3c1dHbXv2uFgYJ9BMFHu3fwnd7AYZaEQhXuYQ4hgsxLvsUXzGdKeZrW5xopzDCvuA2N41WJ88I7zIw==} + engines: {node: '>=14'} + peerDependencies: + react: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + regenerator-runtime@0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + + regex-recursion@6.0.2: + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@6.0.1: + resolution: {integrity: sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==} + + regexparam@3.0.0: + resolution: {integrity: sha512-RSYAtP31mvYLkAHrOlh25pCNQ5hWnT106VukGaaFfuJrZFkGRX5GhUAdPqpSDXxOhA2c4akmRuplv1mRqnBn6Q==} + engines: {node: '>=8'} + + rehype-harden@1.1.5: + resolution: {integrity: sha512-JrtBj5BVd/5vf3H3/blyJatXJbzQfRT9pJBmjafbTaPouQCAKxHwRyCc7dle9BXQKxv4z1OzZylz/tNamoiG3A==} + + rehype-katex@7.0.1: + resolution: {integrity: sha512-OiM2wrZ/wuhKkigASodFoo8wimG3H12LWQaH8qSPVJn9apWKFSH3YOCtbKpBorTVw/eI7cuT21XBbvwEswbIOA==} + + rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + + remark-gfm@4.0.1: + resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} + + remark-math@6.0.0: + resolution: {integrity: sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-rehype@11.1.2: + resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + restructure@3.0.2: + resolution: {integrity: sha512-gSfoiOEA0VPE6Tukkrr7I0RBdE0s7H1eFCDBk05l1KIQT1UIKNc5JZy6jdyW6eYH3aR3g5b3PuL77rq0hvwtAw==} + + rgbcolor@1.0.1: + resolution: {integrity: sha512-9aZLIrhRaD97sgVhtJOW6ckOEh6/GnvQtdVNfdZ6s67+3/XwLS9lBcQYzEEhYVeUowN7pRzMLsyGhK2i/xvWbw==} + engines: {node: '>= 0.8.15'} + + rimraf@2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + robust-predicates@3.0.2: + resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} + + rollup@4.52.4: + resolution: {integrity: sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + rope-sequence@1.3.4: + resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==} + + roughjs@4.6.6: + resolution: {integrity: sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==} + + rw@1.3.3: + resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + saxes@5.0.1: + resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} + engines: {node: '>=10'} + + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + + send@0.19.0: + resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} + engines: {node: '>= 0.8.0'} + + seq-queue@0.0.5: + resolution: {integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==} + + serve-static@1.16.2: + resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} + engines: {node: '>= 0.8.0'} + + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shiki@3.14.0: + resolution: {integrity: sha512-J0yvpLI7LSig3Z3acIuDLouV5UCKQqu8qOArwMx+/yPVC3WRMgrP67beaG8F+j4xfEWE0eVC4GeBCIXeOPra1g==} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + sonner@2.0.7: + resolution: {integrity: sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w==} + peerDependencies: + react: ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-rc + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + sqlstring@2.3.3: + resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==} + engines: {node: '>= 0.6'} + + ssf@0.11.2: + resolution: {integrity: sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==} + engines: {node: '>=0.8'} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + stackblur-canvas@2.7.0: + resolution: {integrity: sha512-yf7OENo23AGJhBriGx0QivY5JP6Y1HbrrDI6WLt6C5auYZXlQrheoY8hD4ibekFKz1HOfE48Ww8kMWMnJD/zcQ==} + engines: {node: '>=0.1.14'} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + std-env@3.9.0: + resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} + + streamdown@1.4.0: + resolution: {integrity: sha512-ylhDSQ4HpK5/nAH9v7OgIIdGJxlJB2HoYrYkJNGrO8lMpnWuKUcrz/A8xAMwA6eILA27469vIavcOTjmxctrKg==} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + + streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strnum@2.1.1: + resolution: {integrity: sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==} + + style-to-js@1.1.18: + resolution: {integrity: sha512-JFPn62D4kJaPTnhFUI244MThx+FEGbi+9dw1b9yBBQ+1CZpV7QAT8kUtJ7b7EUNdHajjF/0x8fT+16oLJoojLg==} + + style-to-object@1.0.11: + resolution: {integrity: sha512-5A560JmXr7wDyGLK12Nq/EYS38VkGlglVzkis1JEdbGWSnbQIEhZzTJhzURXN5/8WwwFCs/f/VVcmkTppbXLow==} + + stylis@4.3.6: + resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} + + superjson@1.13.3: + resolution: {integrity: sha512-mJiVjfd2vokfDxsQPOwJ/PtanO87LhpYY88ubI5dUB1Ab58Txbyje3+jpm+/83R/fevaq/107NNhtYBLuoTrFg==} + engines: {node: '>=10'} + + svg-pathdata@6.0.3: + resolution: {integrity: sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw==} + engines: {node: '>=12.0.0'} + + tailwind-merge@3.3.1: + resolution: {integrity: sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g==} + + tailwindcss-animate@1.0.7: + resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders' + + tailwindcss@4.1.14: + resolution: {integrity: sha512-b7pCxjGO98LnxVkKjaZSDeNuljC4ueKUddjENJOADtubtdo8llTaJy7HwBMeLNSSo2N5QIAgklslK1+Ir8r6CA==} + + tapable@2.3.0: + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} + engines: {node: '>=6'} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + + tar@7.5.1: + resolution: {integrity: sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==} + engines: {node: '>=18'} + + text-segmentation@1.0.3: + resolution: {integrity: sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==} + + tiny-inflate@1.0.3: + resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} + + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + + tinyexec@1.0.1: + resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + tinypool@1.1.1: + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@1.2.0: + resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} + engines: {node: '>=14.0.0'} + + tinyspy@3.0.2: + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} + engines: {node: '>=14.0.0'} + + tmp@0.2.5: + resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} + engines: {node: '>=14.14'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + traverse@0.3.9: + resolution: {integrity: sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==} + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + + ts-dedent@2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsx@4.20.6: + resolution: {integrity: sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==} + engines: {node: '>=18.0.0'} + hasBin: true + + tw-animate-css@1.4.0: + resolution: {integrity: sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==} + + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + + typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + + ufo@1.6.1: + resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + undici-types@7.14.0: + resolution: {integrity: sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==} + + unicode-properties@1.4.1: + resolution: {integrity: sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==} + + unicode-trie@2.0.0: + resolution: {integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==} + + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + + unist-util-find-after@5.0.0: + resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} + + unist-util-is@6.0.1: + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.2: + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + unzipper@0.10.14: + resolution: {integrity: sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==} + + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + use-callback-ref@1.3.3: + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + use-sidecar@1.1.3: + resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + use-sync-external-store@1.6.0: + resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + utrie@1.0.2: + resolution: {integrity: sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==} + + uuid@11.1.0: + resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} + hasBin: true + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vaul@1.1.2: + resolution: {integrity: sha512-ZFkClGpWyI2WUQjdLJ/BaGuV6AVQiJ3uELGk3OYtP+B6yCO7Cmn9vPFXVJkRaGkOJu3m8bQMgtyzNHixULceQA==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc + + vfile-location@5.0.3: + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} + + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + victory-vendor@36.9.2: + resolution: {integrity: sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==} + + vite-node@2.1.9: + resolution: {integrity: sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + + vite-plugin-manus-runtime@0.0.56: + resolution: {integrity: sha512-BkRMoFzUtT5enXBl+PO0h81KH+4uK4WpLGOp1tvljafb6fp9UX0b1klfxQz9QZFEdB8IPQTEkNzfqv09fHrkMw==} + + vite@5.4.20: + resolution: {integrity: sha512-j3lYzGC3P+B5Yfy/pfKNgVEg4+UtcIJcVRt2cDjIOmhLourAqPqf8P7acgxeiSgUB7E3p2P8/3gNIgDLpwzs4g==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vite@7.1.9: + resolution: {integrity: sha512-4nVGliEpxmhCL8DslSAUdxlB6+SMrhB0a1v5ijlh1xB1nEPuy1mxaHxysVucLHuWryAxLWg6a5ei+U4TLn/rFg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitest@2.1.9: + resolution: {integrity: sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 2.1.9 + '@vitest/ui': 2.1.9 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + vscode-jsonrpc@8.2.0: + resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} + engines: {node: '>=14.0.0'} + + vscode-languageserver-protocol@3.17.5: + resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} + + vscode-languageserver-textdocument@1.0.12: + resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} + + vscode-languageserver-types@3.17.5: + resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} + + vscode-languageserver@9.0.1: + resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==} + hasBin: true + + vscode-uri@3.0.8: + resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + + w3c-keyname@2.2.8: + resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} + + web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + + web-streams-polyfill@4.0.0-beta.3: + resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==} + engines: {node: '>= 14'} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + wmf@1.0.2: + resolution: {integrity: sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==} + engines: {node: '>=0.8'} + + word@0.3.0: + resolution: {integrity: sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==} + engines: {node: '>=0.8'} + + wouter@3.7.1: + resolution: {integrity: sha512-od5LGmndSUzntZkE2R5CHhoiJ7YMuTIbiXsa0Anytc2RATekgv4sfWRAxLEULBrp7ADzinWQw8g470lkT8+fOw==} + peerDependencies: + react: '>=16.8.0' + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + xlsx@0.18.5: + resolution: {integrity: sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==} + engines: {node: '>=0.8'} + hasBin: true + + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + + yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + + yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + + zip-stream@4.1.1: + resolution: {integrity: sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==} + engines: {node: '>= 10'} + + zod@4.1.12: + resolution: {integrity: sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@antfu/install-pkg@1.1.0': + dependencies: + package-manager-detector: 1.5.0 + tinyexec: 1.0.1 + + '@antfu/utils@9.3.0': {} + + '@aws-crypto/crc32@5.2.0': + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.901.0 + tslib: 2.8.1 + + '@aws-crypto/crc32c@5.2.0': + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.901.0 + tslib: 2.8.1 + + '@aws-crypto/sha1-browser@5.2.0': + dependencies: + '@aws-crypto/supports-web-crypto': 5.2.0 + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.901.0 + '@aws-sdk/util-locate-window': 3.893.0 + '@smithy/util-utf8': 2.3.0 + tslib: 2.8.1 + + '@aws-crypto/sha256-browser@5.2.0': + dependencies: + '@aws-crypto/sha256-js': 5.2.0 + '@aws-crypto/supports-web-crypto': 5.2.0 + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.901.0 + '@aws-sdk/util-locate-window': 3.893.0 + '@smithy/util-utf8': 2.3.0 + tslib: 2.8.1 + + '@aws-crypto/sha256-js@5.2.0': + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.901.0 + tslib: 2.8.1 + + '@aws-crypto/supports-web-crypto@5.2.0': + dependencies: + tslib: 2.8.1 + + '@aws-crypto/util@5.2.0': + dependencies: + '@aws-sdk/types': 3.901.0 + '@smithy/util-utf8': 2.3.0 + tslib: 2.8.1 + + '@aws-sdk/client-s3@3.907.0': + dependencies: + '@aws-crypto/sha1-browser': 5.2.0 + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.907.0 + '@aws-sdk/credential-provider-node': 3.907.0 + '@aws-sdk/middleware-bucket-endpoint': 3.901.0 + '@aws-sdk/middleware-expect-continue': 3.901.0 + '@aws-sdk/middleware-flexible-checksums': 3.907.0 + '@aws-sdk/middleware-host-header': 3.901.0 + '@aws-sdk/middleware-location-constraint': 3.901.0 + '@aws-sdk/middleware-logger': 3.901.0 + '@aws-sdk/middleware-recursion-detection': 3.901.0 + '@aws-sdk/middleware-sdk-s3': 3.907.0 + '@aws-sdk/middleware-ssec': 3.901.0 + '@aws-sdk/middleware-user-agent': 3.907.0 + '@aws-sdk/region-config-resolver': 3.901.0 + '@aws-sdk/signature-v4-multi-region': 3.907.0 + '@aws-sdk/types': 3.901.0 + '@aws-sdk/util-endpoints': 3.901.0 + '@aws-sdk/util-user-agent-browser': 3.907.0 + '@aws-sdk/util-user-agent-node': 3.907.0 + '@aws-sdk/xml-builder': 3.901.0 + '@smithy/config-resolver': 4.3.0 + '@smithy/core': 3.15.0 + '@smithy/eventstream-serde-browser': 4.2.0 + '@smithy/eventstream-serde-config-resolver': 4.3.0 + '@smithy/eventstream-serde-node': 4.2.0 + '@smithy/fetch-http-handler': 5.3.1 + '@smithy/hash-blob-browser': 4.2.1 + '@smithy/hash-node': 4.2.0 + '@smithy/hash-stream-node': 4.2.0 + '@smithy/invalid-dependency': 4.2.0 + '@smithy/md5-js': 4.2.0 + '@smithy/middleware-content-length': 4.2.0 + '@smithy/middleware-endpoint': 4.3.1 + '@smithy/middleware-retry': 4.4.1 + '@smithy/middleware-serde': 4.2.0 + '@smithy/middleware-stack': 4.2.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/node-http-handler': 4.3.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/smithy-client': 4.7.1 + '@smithy/types': 4.6.0 + '@smithy/url-parser': 4.2.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.0 + '@smithy/util-defaults-mode-node': 4.2.1 + '@smithy/util-endpoints': 3.2.0 + '@smithy/util-middleware': 4.2.0 + '@smithy/util-retry': 4.2.0 + '@smithy/util-stream': 4.5.0 + '@smithy/util-utf8': 4.2.0 + '@smithy/util-waiter': 4.2.0 + '@smithy/uuid': 1.1.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-sesv2@3.940.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.940.0 + '@aws-sdk/credential-provider-node': 3.940.0 + '@aws-sdk/middleware-host-header': 3.936.0 + '@aws-sdk/middleware-logger': 3.936.0 + '@aws-sdk/middleware-recursion-detection': 3.936.0 + '@aws-sdk/middleware-user-agent': 3.940.0 + '@aws-sdk/region-config-resolver': 3.936.0 + '@aws-sdk/signature-v4-multi-region': 3.940.0 + '@aws-sdk/types': 3.936.0 + '@aws-sdk/util-endpoints': 3.936.0 + '@aws-sdk/util-user-agent-browser': 3.936.0 + '@aws-sdk/util-user-agent-node': 3.940.0 + '@smithy/config-resolver': 4.4.3 + '@smithy/core': 3.18.5 + '@smithy/fetch-http-handler': 5.3.6 + '@smithy/hash-node': 4.2.5 + '@smithy/invalid-dependency': 4.2.5 + '@smithy/middleware-content-length': 4.2.5 + '@smithy/middleware-endpoint': 4.3.12 + '@smithy/middleware-retry': 4.4.12 + '@smithy/middleware-serde': 4.2.6 + '@smithy/middleware-stack': 4.2.5 + '@smithy/node-config-provider': 4.3.5 + '@smithy/node-http-handler': 4.4.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/smithy-client': 4.9.8 + '@smithy/types': 4.9.0 + '@smithy/url-parser': 4.2.5 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.11 + '@smithy/util-defaults-mode-node': 4.2.14 + '@smithy/util-endpoints': 3.2.5 + '@smithy/util-middleware': 4.2.5 + '@smithy/util-retry': 4.2.5 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-sso@3.907.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.907.0 + '@aws-sdk/middleware-host-header': 3.901.0 + '@aws-sdk/middleware-logger': 3.901.0 + '@aws-sdk/middleware-recursion-detection': 3.901.0 + '@aws-sdk/middleware-user-agent': 3.907.0 + '@aws-sdk/region-config-resolver': 3.901.0 + '@aws-sdk/types': 3.901.0 + '@aws-sdk/util-endpoints': 3.901.0 + '@aws-sdk/util-user-agent-browser': 3.907.0 + '@aws-sdk/util-user-agent-node': 3.907.0 + '@smithy/config-resolver': 4.3.0 + '@smithy/core': 3.15.0 + '@smithy/fetch-http-handler': 5.3.1 + '@smithy/hash-node': 4.2.0 + '@smithy/invalid-dependency': 4.2.0 + '@smithy/middleware-content-length': 4.2.0 + '@smithy/middleware-endpoint': 4.3.1 + '@smithy/middleware-retry': 4.4.1 + '@smithy/middleware-serde': 4.2.0 + '@smithy/middleware-stack': 4.2.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/node-http-handler': 4.3.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/smithy-client': 4.7.1 + '@smithy/types': 4.6.0 + '@smithy/url-parser': 4.2.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.0 + '@smithy/util-defaults-mode-node': 4.2.1 + '@smithy/util-endpoints': 3.2.0 + '@smithy/util-middleware': 4.2.0 + '@smithy/util-retry': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-sso@3.940.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.940.0 + '@aws-sdk/middleware-host-header': 3.936.0 + '@aws-sdk/middleware-logger': 3.936.0 + '@aws-sdk/middleware-recursion-detection': 3.936.0 + '@aws-sdk/middleware-user-agent': 3.940.0 + '@aws-sdk/region-config-resolver': 3.936.0 + '@aws-sdk/types': 3.936.0 + '@aws-sdk/util-endpoints': 3.936.0 + '@aws-sdk/util-user-agent-browser': 3.936.0 + '@aws-sdk/util-user-agent-node': 3.940.0 + '@smithy/config-resolver': 4.4.3 + '@smithy/core': 3.18.5 + '@smithy/fetch-http-handler': 5.3.6 + '@smithy/hash-node': 4.2.5 + '@smithy/invalid-dependency': 4.2.5 + '@smithy/middleware-content-length': 4.2.5 + '@smithy/middleware-endpoint': 4.3.12 + '@smithy/middleware-retry': 4.4.12 + '@smithy/middleware-serde': 4.2.6 + '@smithy/middleware-stack': 4.2.5 + '@smithy/node-config-provider': 4.3.5 + '@smithy/node-http-handler': 4.4.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/smithy-client': 4.9.8 + '@smithy/types': 4.9.0 + '@smithy/url-parser': 4.2.5 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.11 + '@smithy/util-defaults-mode-node': 4.2.14 + '@smithy/util-endpoints': 3.2.5 + '@smithy/util-middleware': 4.2.5 + '@smithy/util-retry': 4.2.5 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/core@3.907.0': + dependencies: + '@aws-sdk/types': 3.901.0 + '@aws-sdk/xml-builder': 3.901.0 + '@smithy/core': 3.15.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/property-provider': 4.2.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/signature-v4': 5.3.0 + '@smithy/smithy-client': 4.7.1 + '@smithy/types': 4.6.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-middleware': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@aws-sdk/core@3.940.0': + dependencies: + '@aws-sdk/types': 3.936.0 + '@aws-sdk/xml-builder': 3.930.0 + '@smithy/core': 3.18.5 + '@smithy/node-config-provider': 4.3.5 + '@smithy/property-provider': 4.2.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/signature-v4': 5.3.5 + '@smithy/smithy-client': 4.9.8 + '@smithy/types': 4.9.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-middleware': 4.2.5 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-env@3.907.0': + dependencies: + '@aws-sdk/core': 3.907.0 + '@aws-sdk/types': 3.901.0 + '@smithy/property-provider': 4.2.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-env@3.940.0': + dependencies: + '@aws-sdk/core': 3.940.0 + '@aws-sdk/types': 3.936.0 + '@smithy/property-provider': 4.2.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-http@3.907.0': + dependencies: + '@aws-sdk/core': 3.907.0 + '@aws-sdk/types': 3.901.0 + '@smithy/fetch-http-handler': 5.3.1 + '@smithy/node-http-handler': 4.3.0 + '@smithy/property-provider': 4.2.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/smithy-client': 4.7.1 + '@smithy/types': 4.6.0 + '@smithy/util-stream': 4.5.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-http@3.940.0': + dependencies: + '@aws-sdk/core': 3.940.0 + '@aws-sdk/types': 3.936.0 + '@smithy/fetch-http-handler': 5.3.6 + '@smithy/node-http-handler': 4.4.5 + '@smithy/property-provider': 4.2.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/smithy-client': 4.9.8 + '@smithy/types': 4.9.0 + '@smithy/util-stream': 4.5.6 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-ini@3.907.0': + dependencies: + '@aws-sdk/core': 3.907.0 + '@aws-sdk/credential-provider-env': 3.907.0 + '@aws-sdk/credential-provider-http': 3.907.0 + '@aws-sdk/credential-provider-process': 3.907.0 + '@aws-sdk/credential-provider-sso': 3.907.0 + '@aws-sdk/credential-provider-web-identity': 3.907.0 + '@aws-sdk/nested-clients': 3.907.0 + '@aws-sdk/types': 3.901.0 + '@smithy/credential-provider-imds': 4.2.0 + '@smithy/property-provider': 4.2.0 + '@smithy/shared-ini-file-loader': 4.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-ini@3.940.0': + dependencies: + '@aws-sdk/core': 3.940.0 + '@aws-sdk/credential-provider-env': 3.940.0 + '@aws-sdk/credential-provider-http': 3.940.0 + '@aws-sdk/credential-provider-login': 3.940.0 + '@aws-sdk/credential-provider-process': 3.940.0 + '@aws-sdk/credential-provider-sso': 3.940.0 + '@aws-sdk/credential-provider-web-identity': 3.940.0 + '@aws-sdk/nested-clients': 3.940.0 + '@aws-sdk/types': 3.936.0 + '@smithy/credential-provider-imds': 4.2.5 + '@smithy/property-provider': 4.2.5 + '@smithy/shared-ini-file-loader': 4.4.0 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-login@3.940.0': + dependencies: + '@aws-sdk/core': 3.940.0 + '@aws-sdk/nested-clients': 3.940.0 + '@aws-sdk/types': 3.936.0 + '@smithy/property-provider': 4.2.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/shared-ini-file-loader': 4.4.0 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-node@3.907.0': + dependencies: + '@aws-sdk/credential-provider-env': 3.907.0 + '@aws-sdk/credential-provider-http': 3.907.0 + '@aws-sdk/credential-provider-ini': 3.907.0 + '@aws-sdk/credential-provider-process': 3.907.0 + '@aws-sdk/credential-provider-sso': 3.907.0 + '@aws-sdk/credential-provider-web-identity': 3.907.0 + '@aws-sdk/types': 3.901.0 + '@smithy/credential-provider-imds': 4.2.0 + '@smithy/property-provider': 4.2.0 + '@smithy/shared-ini-file-loader': 4.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-node@3.940.0': + dependencies: + '@aws-sdk/credential-provider-env': 3.940.0 + '@aws-sdk/credential-provider-http': 3.940.0 + '@aws-sdk/credential-provider-ini': 3.940.0 + '@aws-sdk/credential-provider-process': 3.940.0 + '@aws-sdk/credential-provider-sso': 3.940.0 + '@aws-sdk/credential-provider-web-identity': 3.940.0 + '@aws-sdk/types': 3.936.0 + '@smithy/credential-provider-imds': 4.2.5 + '@smithy/property-provider': 4.2.5 + '@smithy/shared-ini-file-loader': 4.4.0 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-process@3.907.0': + dependencies: + '@aws-sdk/core': 3.907.0 + '@aws-sdk/types': 3.901.0 + '@smithy/property-provider': 4.2.0 + '@smithy/shared-ini-file-loader': 4.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-process@3.940.0': + dependencies: + '@aws-sdk/core': 3.940.0 + '@aws-sdk/types': 3.936.0 + '@smithy/property-provider': 4.2.5 + '@smithy/shared-ini-file-loader': 4.4.0 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-sso@3.907.0': + dependencies: + '@aws-sdk/client-sso': 3.907.0 + '@aws-sdk/core': 3.907.0 + '@aws-sdk/token-providers': 3.907.0 + '@aws-sdk/types': 3.901.0 + '@smithy/property-provider': 4.2.0 + '@smithy/shared-ini-file-loader': 4.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-sso@3.940.0': + dependencies: + '@aws-sdk/client-sso': 3.940.0 + '@aws-sdk/core': 3.940.0 + '@aws-sdk/token-providers': 3.940.0 + '@aws-sdk/types': 3.936.0 + '@smithy/property-provider': 4.2.5 + '@smithy/shared-ini-file-loader': 4.4.0 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-web-identity@3.907.0': + dependencies: + '@aws-sdk/core': 3.907.0 + '@aws-sdk/nested-clients': 3.907.0 + '@aws-sdk/types': 3.901.0 + '@smithy/property-provider': 4.2.0 + '@smithy/shared-ini-file-loader': 4.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-web-identity@3.940.0': + dependencies: + '@aws-sdk/core': 3.940.0 + '@aws-sdk/nested-clients': 3.940.0 + '@aws-sdk/types': 3.936.0 + '@smithy/property-provider': 4.2.5 + '@smithy/shared-ini-file-loader': 4.4.0 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/middleware-bucket-endpoint@3.901.0': + dependencies: + '@aws-sdk/types': 3.901.0 + '@aws-sdk/util-arn-parser': 3.893.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/types': 4.6.0 + '@smithy/util-config-provider': 4.2.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-expect-continue@3.901.0': + dependencies: + '@aws-sdk/types': 3.901.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-flexible-checksums@3.907.0': + dependencies: + '@aws-crypto/crc32': 5.2.0 + '@aws-crypto/crc32c': 5.2.0 + '@aws-crypto/util': 5.2.0 + '@aws-sdk/core': 3.907.0 + '@aws-sdk/types': 3.901.0 + '@smithy/is-array-buffer': 4.2.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/types': 4.6.0 + '@smithy/util-middleware': 4.2.0 + '@smithy/util-stream': 4.5.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-host-header@3.901.0': + dependencies: + '@aws-sdk/types': 3.901.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-host-header@3.936.0': + dependencies: + '@aws-sdk/types': 3.936.0 + '@smithy/protocol-http': 5.3.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-location-constraint@3.901.0': + dependencies: + '@aws-sdk/types': 3.901.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-logger@3.901.0': + dependencies: + '@aws-sdk/types': 3.901.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-logger@3.936.0': + dependencies: + '@aws-sdk/types': 3.936.0 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-recursion-detection@3.901.0': + dependencies: + '@aws-sdk/types': 3.901.0 + '@aws/lambda-invoke-store': 0.0.1 + '@smithy/protocol-http': 5.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-recursion-detection@3.936.0': + dependencies: + '@aws-sdk/types': 3.936.0 + '@aws/lambda-invoke-store': 0.2.1 + '@smithy/protocol-http': 5.3.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-sdk-s3@3.907.0': + dependencies: + '@aws-sdk/core': 3.907.0 + '@aws-sdk/types': 3.901.0 + '@aws-sdk/util-arn-parser': 3.893.0 + '@smithy/core': 3.15.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/signature-v4': 5.3.0 + '@smithy/smithy-client': 4.7.1 + '@smithy/types': 4.6.0 + '@smithy/util-config-provider': 4.2.0 + '@smithy/util-middleware': 4.2.0 + '@smithy/util-stream': 4.5.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-sdk-s3@3.940.0': + dependencies: + '@aws-sdk/core': 3.940.0 + '@aws-sdk/types': 3.936.0 + '@aws-sdk/util-arn-parser': 3.893.0 + '@smithy/core': 3.18.5 + '@smithy/node-config-provider': 4.3.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/signature-v4': 5.3.5 + '@smithy/smithy-client': 4.9.8 + '@smithy/types': 4.9.0 + '@smithy/util-config-provider': 4.2.0 + '@smithy/util-middleware': 4.2.5 + '@smithy/util-stream': 4.5.6 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-ssec@3.901.0': + dependencies: + '@aws-sdk/types': 3.901.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-user-agent@3.907.0': + dependencies: + '@aws-sdk/core': 3.907.0 + '@aws-sdk/types': 3.901.0 + '@aws-sdk/util-endpoints': 3.901.0 + '@smithy/core': 3.15.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-user-agent@3.940.0': + dependencies: + '@aws-sdk/core': 3.940.0 + '@aws-sdk/types': 3.936.0 + '@aws-sdk/util-endpoints': 3.936.0 + '@smithy/core': 3.18.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@aws-sdk/nested-clients@3.907.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.907.0 + '@aws-sdk/middleware-host-header': 3.901.0 + '@aws-sdk/middleware-logger': 3.901.0 + '@aws-sdk/middleware-recursion-detection': 3.901.0 + '@aws-sdk/middleware-user-agent': 3.907.0 + '@aws-sdk/region-config-resolver': 3.901.0 + '@aws-sdk/types': 3.901.0 + '@aws-sdk/util-endpoints': 3.901.0 + '@aws-sdk/util-user-agent-browser': 3.907.0 + '@aws-sdk/util-user-agent-node': 3.907.0 + '@smithy/config-resolver': 4.3.0 + '@smithy/core': 3.15.0 + '@smithy/fetch-http-handler': 5.3.1 + '@smithy/hash-node': 4.2.0 + '@smithy/invalid-dependency': 4.2.0 + '@smithy/middleware-content-length': 4.2.0 + '@smithy/middleware-endpoint': 4.3.1 + '@smithy/middleware-retry': 4.4.1 + '@smithy/middleware-serde': 4.2.0 + '@smithy/middleware-stack': 4.2.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/node-http-handler': 4.3.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/smithy-client': 4.7.1 + '@smithy/types': 4.6.0 + '@smithy/url-parser': 4.2.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.0 + '@smithy/util-defaults-mode-node': 4.2.1 + '@smithy/util-endpoints': 3.2.0 + '@smithy/util-middleware': 4.2.0 + '@smithy/util-retry': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/nested-clients@3.940.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.940.0 + '@aws-sdk/middleware-host-header': 3.936.0 + '@aws-sdk/middleware-logger': 3.936.0 + '@aws-sdk/middleware-recursion-detection': 3.936.0 + '@aws-sdk/middleware-user-agent': 3.940.0 + '@aws-sdk/region-config-resolver': 3.936.0 + '@aws-sdk/types': 3.936.0 + '@aws-sdk/util-endpoints': 3.936.0 + '@aws-sdk/util-user-agent-browser': 3.936.0 + '@aws-sdk/util-user-agent-node': 3.940.0 + '@smithy/config-resolver': 4.4.3 + '@smithy/core': 3.18.5 + '@smithy/fetch-http-handler': 5.3.6 + '@smithy/hash-node': 4.2.5 + '@smithy/invalid-dependency': 4.2.5 + '@smithy/middleware-content-length': 4.2.5 + '@smithy/middleware-endpoint': 4.3.12 + '@smithy/middleware-retry': 4.4.12 + '@smithy/middleware-serde': 4.2.6 + '@smithy/middleware-stack': 4.2.5 + '@smithy/node-config-provider': 4.3.5 + '@smithy/node-http-handler': 4.4.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/smithy-client': 4.9.8 + '@smithy/types': 4.9.0 + '@smithy/url-parser': 4.2.5 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.11 + '@smithy/util-defaults-mode-node': 4.2.14 + '@smithy/util-endpoints': 3.2.5 + '@smithy/util-middleware': 4.2.5 + '@smithy/util-retry': 4.2.5 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/region-config-resolver@3.901.0': + dependencies: + '@aws-sdk/types': 3.901.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/types': 4.6.0 + '@smithy/util-config-provider': 4.2.0 + '@smithy/util-middleware': 4.2.0 + tslib: 2.8.1 + + '@aws-sdk/region-config-resolver@3.936.0': + dependencies: + '@aws-sdk/types': 3.936.0 + '@smithy/config-resolver': 4.4.3 + '@smithy/node-config-provider': 4.3.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@aws-sdk/s3-request-presigner@3.907.0': + dependencies: + '@aws-sdk/signature-v4-multi-region': 3.907.0 + '@aws-sdk/types': 3.901.0 + '@aws-sdk/util-format-url': 3.901.0 + '@smithy/middleware-endpoint': 4.3.1 + '@smithy/protocol-http': 5.3.0 + '@smithy/smithy-client': 4.7.1 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + + '@aws-sdk/signature-v4-multi-region@3.907.0': + dependencies: + '@aws-sdk/middleware-sdk-s3': 3.907.0 + '@aws-sdk/types': 3.901.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/signature-v4': 5.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + + '@aws-sdk/signature-v4-multi-region@3.940.0': + dependencies: + '@aws-sdk/middleware-sdk-s3': 3.940.0 + '@aws-sdk/types': 3.936.0 + '@smithy/protocol-http': 5.3.5 + '@smithy/signature-v4': 5.3.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@aws-sdk/token-providers@3.907.0': + dependencies: + '@aws-sdk/core': 3.907.0 + '@aws-sdk/nested-clients': 3.907.0 + '@aws-sdk/types': 3.901.0 + '@smithy/property-provider': 4.2.0 + '@smithy/shared-ini-file-loader': 4.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/token-providers@3.940.0': + dependencies: + '@aws-sdk/core': 3.940.0 + '@aws-sdk/nested-clients': 3.940.0 + '@aws-sdk/types': 3.936.0 + '@smithy/property-provider': 4.2.5 + '@smithy/shared-ini-file-loader': 4.4.0 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/types@3.901.0': + dependencies: + '@smithy/types': 4.6.0 + tslib: 2.8.1 + + '@aws-sdk/types@3.936.0': + dependencies: + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@aws-sdk/util-arn-parser@3.893.0': + dependencies: + tslib: 2.8.1 + + '@aws-sdk/util-endpoints@3.901.0': + dependencies: + '@aws-sdk/types': 3.901.0 + '@smithy/types': 4.6.0 + '@smithy/url-parser': 4.2.0 + '@smithy/util-endpoints': 3.2.0 + tslib: 2.8.1 + + '@aws-sdk/util-endpoints@3.936.0': + dependencies: + '@aws-sdk/types': 3.936.0 + '@smithy/types': 4.9.0 + '@smithy/url-parser': 4.2.5 + '@smithy/util-endpoints': 3.2.5 + tslib: 2.8.1 + + '@aws-sdk/util-format-url@3.901.0': + dependencies: + '@aws-sdk/types': 3.901.0 + '@smithy/querystring-builder': 4.2.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + + '@aws-sdk/util-locate-window@3.893.0': + dependencies: + tslib: 2.8.1 + + '@aws-sdk/util-user-agent-browser@3.907.0': + dependencies: + '@aws-sdk/types': 3.901.0 + '@smithy/types': 4.6.0 + bowser: 2.12.1 + tslib: 2.8.1 + + '@aws-sdk/util-user-agent-browser@3.936.0': + dependencies: + '@aws-sdk/types': 3.936.0 + '@smithy/types': 4.9.0 + bowser: 2.12.1 + tslib: 2.8.1 + + '@aws-sdk/util-user-agent-node@3.907.0': + dependencies: + '@aws-sdk/middleware-user-agent': 3.907.0 + '@aws-sdk/types': 3.901.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + + '@aws-sdk/util-user-agent-node@3.940.0': + dependencies: + '@aws-sdk/middleware-user-agent': 3.940.0 + '@aws-sdk/types': 3.936.0 + '@smithy/node-config-provider': 4.3.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@aws-sdk/xml-builder@3.901.0': + dependencies: + '@smithy/types': 4.6.0 + fast-xml-parser: 5.2.5 + tslib: 2.8.1 + + '@aws-sdk/xml-builder@3.930.0': + dependencies: + '@smithy/types': 4.9.0 + fast-xml-parser: 5.2.5 + tslib: 2.8.1 + + '@aws/lambda-invoke-store@0.0.1': {} + + '@aws/lambda-invoke-store@0.2.1': {} + + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.28.4': {} + + '@babel/core@7.28.4': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.4 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.28.3': + dependencies: + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.27.2': + dependencies: + '@babel/compat-data': 7.28.4 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.26.3 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.28.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.27.1': {} + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.27.1': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helpers@7.28.4': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.4 + + '@babel/parser@7.28.4': + dependencies: + '@babel/types': 7.28.4 + + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/runtime@7.28.4': {} + + '@babel/template@7.27.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + + '@babel/traverse@7.28.4': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.4 + '@babel/template': 7.27.2 + '@babel/types': 7.28.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.28.4': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + + '@braintree/sanitize-url@7.1.1': {} + + '@builder.io/jsx-loc-internals@0.0.1': + dependencies: + '@babel/parser': 7.28.4 + estree-walker: 2.0.2 + magic-string: 0.30.19 + + '@builder.io/vite-plugin-jsx-loc@0.1.1(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.20.6))': + dependencies: + '@builder.io/jsx-loc-internals': 0.0.1 + vite: 7.1.9(@types/node@24.7.0)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.20.6) + + '@chevrotain/cst-dts-gen@11.0.3': + dependencies: + '@chevrotain/gast': 11.0.3 + '@chevrotain/types': 11.0.3 + lodash-es: 4.17.21 + + '@chevrotain/gast@11.0.3': + dependencies: + '@chevrotain/types': 11.0.3 + lodash-es: 4.17.21 + + '@chevrotain/regexp-to-ast@11.0.3': {} + + '@chevrotain/types@11.0.3': {} + + '@chevrotain/utils@11.0.3': {} + + '@date-fns/tz@1.4.1': {} + + '@drizzle-team/brocli@0.10.2': {} + + '@esbuild-kit/core-utils@3.3.2': + dependencies: + esbuild: 0.18.20 + source-map-support: 0.5.21 + + '@esbuild-kit/esm-loader@2.6.5': + dependencies: + '@esbuild-kit/core-utils': 3.3.2 + get-tsconfig: 4.10.1 + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/aix-ppc64@0.25.10': + optional: true + + '@esbuild/android-arm64@0.18.20': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.25.10': + optional: true + + '@esbuild/android-arm@0.18.20': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-arm@0.25.10': + optional: true + + '@esbuild/android-x64@0.18.20': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/android-x64@0.25.10': + optional: true + + '@esbuild/darwin-arm64@0.18.20': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.25.10': + optional: true + + '@esbuild/darwin-x64@0.18.20': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.25.10': + optional: true + + '@esbuild/freebsd-arm64@0.18.20': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.25.10': + optional: true + + '@esbuild/freebsd-x64@0.18.20': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.25.10': + optional: true + + '@esbuild/linux-arm64@0.18.20': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.25.10': + optional: true + + '@esbuild/linux-arm@0.18.20': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-arm@0.25.10': + optional: true + + '@esbuild/linux-ia32@0.18.20': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.25.10': + optional: true + + '@esbuild/linux-loong64@0.18.20': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.25.10': + optional: true + + '@esbuild/linux-mips64el@0.18.20': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.25.10': + optional: true + + '@esbuild/linux-ppc64@0.18.20': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.25.10': + optional: true + + '@esbuild/linux-riscv64@0.18.20': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.25.10': + optional: true + + '@esbuild/linux-s390x@0.18.20': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.25.10': + optional: true + + '@esbuild/linux-x64@0.18.20': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/linux-x64@0.25.10': + optional: true + + '@esbuild/netbsd-arm64@0.25.10': + optional: true + + '@esbuild/netbsd-x64@0.18.20': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.25.10': + optional: true + + '@esbuild/openbsd-arm64@0.25.10': + optional: true + + '@esbuild/openbsd-x64@0.18.20': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.25.10': + optional: true + + '@esbuild/openharmony-arm64@0.25.10': + optional: true + + '@esbuild/sunos-x64@0.18.20': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.25.10': + optional: true + + '@esbuild/win32-arm64@0.18.20': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.25.10': + optional: true + + '@esbuild/win32-ia32@0.18.20': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.25.10': + optional: true + + '@esbuild/win32-x64@0.18.20': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@esbuild/win32-x64@0.25.10': + optional: true + + '@fast-csv/format@4.3.5': + dependencies: + '@types/node': 14.18.63 + lodash.escaperegexp: 4.1.2 + lodash.isboolean: 3.0.3 + lodash.isequal: 4.5.0 + lodash.isfunction: 3.0.9 + lodash.isnil: 4.0.0 + + '@fast-csv/parse@4.3.6': + dependencies: + '@types/node': 14.18.63 + lodash.escaperegexp: 4.1.2 + lodash.groupby: 4.6.0 + lodash.isfunction: 3.0.9 + lodash.isnil: 4.0.0 + lodash.isundefined: 3.0.1 + lodash.uniq: 4.5.0 + + '@floating-ui/core@1.7.3': + dependencies: + '@floating-ui/utils': 0.2.10 + + '@floating-ui/dom@1.7.4': + dependencies: + '@floating-ui/core': 1.7.3 + '@floating-ui/utils': 0.2.10 + + '@floating-ui/react-dom@2.1.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@floating-ui/dom': 1.7.4 + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + + '@floating-ui/utils@0.2.10': {} + + '@iconify/types@2.0.0': {} + + '@iconify/utils@3.0.2': + dependencies: + '@antfu/install-pkg': 1.1.0 + '@antfu/utils': 9.3.0 + '@iconify/types': 2.0.0 + debug: 4.4.3 + globals: 15.15.0 + kolorist: 1.8.0 + local-pkg: 1.1.2 + mlly: 1.8.0 + transitivePeerDependencies: + - supports-color + + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.2 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@medv/finder@4.0.2': {} + + '@mermaid-js/parser@0.6.3': + dependencies: + langium: 3.3.1 + + '@radix-ui/number@1.1.1': {} + + '@radix-ui/primitive@1.1.3': {} + + '@radix-ui/react-accordion@1.2.12(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.1(@types/react@19.2.2) + + '@radix-ui/react-alert-dialog@1.1.15(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.1(@types/react@19.2.2) + + '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.1(@types/react@19.2.2) + + '@radix-ui/react-aspect-ratio@1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.1(@types/react@19.2.2) + + '@radix-ui/react-avatar@1.1.10(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.1(@types/react@19.2.2) + + '@radix-ui/react-checkbox@1.3.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.1(@types/react@19.2.2) + + '@radix-ui/react-collapsible@1.1.12(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.1(@types/react@19.2.2) + + '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.1(@types/react@19.2.2) + + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.2)(react@19.2.0)': + dependencies: + react: 19.2.0 + optionalDependencies: + '@types/react': 19.2.2 + + '@radix-ui/react-context-menu@2.2.16(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.1(@types/react@19.2.2) + + '@radix-ui/react-context@1.1.2(@types/react@19.2.2)(react@19.2.0)': + dependencies: + react: 19.2.0 + optionalDependencies: + '@types/react': 19.2.2 + + '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + aria-hidden: 1.2.6 + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + react-remove-scroll: 2.7.1(@types/react@19.2.2)(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.1(@types/react@19.2.2) + + '@radix-ui/react-direction@1.1.1(@types/react@19.2.2)(react@19.2.0)': + dependencies: + react: 19.2.0 + optionalDependencies: + '@types/react': 19.2.2 + + '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.1(@types/react@19.2.2) + + '@radix-ui/react-dropdown-menu@2.1.16(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.1(@types/react@19.2.2) + + '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.2)(react@19.2.0)': + dependencies: + react: 19.2.0 + optionalDependencies: + '@types/react': 19.2.2 + + '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.1(@types/react@19.2.2) + + '@radix-ui/react-hover-card@1.1.15(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.1(@types/react@19.2.2) + + '@radix-ui/react-id@1.1.1(@types/react@19.2.2)(react@19.2.0)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + optionalDependencies: + '@types/react': 19.2.2 + + '@radix-ui/react-label@2.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.1(@types/react@19.2.2) + + '@radix-ui/react-menu@2.1.16(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) + aria-hidden: 1.2.6 + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + react-remove-scroll: 2.7.1(@types/react@19.2.2)(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.1(@types/react@19.2.2) + + '@radix-ui/react-menubar@1.1.16(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.1(@types/react@19.2.2) + + '@radix-ui/react-navigation-menu@1.2.14(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.1(@types/react@19.2.2) + + '@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + aria-hidden: 1.2.6 + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + react-remove-scroll: 2.7.1(@types/react@19.2.2)(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.1(@types/react@19.2.2) + + '@radix-ui/react-popper@1.2.8(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@floating-ui/react-dom': 2.1.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-rect': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/rect': 1.1.1 + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.1(@types/react@19.2.2) + + '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.1(@types/react@19.2.2) + + '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.1(@types/react@19.2.2) + + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.1(@types/react@19.2.2) + + '@radix-ui/react-progress@1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.1(@types/react@19.2.2) + + '@radix-ui/react-radio-group@1.3.8(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.1(@types/react@19.2.2) + + '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.1(@types/react@19.2.2) + + '@radix-ui/react-scroll-area@1.2.10(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/number': 1.1.1 + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.1(@types/react@19.2.2) + + '@radix-ui/react-select@2.2.6(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/number': 1.1.1 + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + aria-hidden: 1.2.6 + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + react-remove-scroll: 2.7.1(@types/react@19.2.2)(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.1(@types/react@19.2.2) + + '@radix-ui/react-separator@1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.1(@types/react@19.2.2) + + '@radix-ui/react-slider@1.3.6(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/number': 1.1.1 + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.1(@types/react@19.2.2) + + '@radix-ui/react-slot@1.2.3(@types/react@19.2.2)(react@19.2.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + optionalDependencies: + '@types/react': 19.2.2 + + '@radix-ui/react-switch@1.2.6(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.1(@types/react@19.2.2) + + '@radix-ui/react-tabs@1.1.13(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.1(@types/react@19.2.2) + + '@radix-ui/react-toggle-group@1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-toggle': 1.1.10(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.1(@types/react@19.2.2) + + '@radix-ui/react-toggle@1.1.10(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.1(@types/react@19.2.2) + + '@radix-ui/react-tooltip@1.2.8(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.1(@types/react@19.2.2) + + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.2)(react@19.2.0)': + dependencies: + react: 19.2.0 + optionalDependencies: + '@types/react': 19.2.2 + + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.2)(react@19.2.0)': + dependencies: + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + optionalDependencies: + '@types/react': 19.2.2 + + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.2)(react@19.2.0)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + optionalDependencies: + '@types/react': 19.2.2 + + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.2)(react@19.2.0)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + optionalDependencies: + '@types/react': 19.2.2 + + '@radix-ui/react-use-is-hydrated@0.1.0(@types/react@19.2.2)(react@19.2.0)': + dependencies: + react: 19.2.0 + use-sync-external-store: 1.6.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.2 + + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.2)(react@19.2.0)': + dependencies: + react: 19.2.0 + optionalDependencies: + '@types/react': 19.2.2 + + '@radix-ui/react-use-previous@1.1.1(@types/react@19.2.2)(react@19.2.0)': + dependencies: + react: 19.2.0 + optionalDependencies: + '@types/react': 19.2.2 + + '@radix-ui/react-use-rect@1.1.1(@types/react@19.2.2)(react@19.2.0)': + dependencies: + '@radix-ui/rect': 1.1.1 + react: 19.2.0 + optionalDependencies: + '@types/react': 19.2.2 + + '@radix-ui/react-use-size@1.1.1(@types/react@19.2.2)(react@19.2.0)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + optionalDependencies: + '@types/react': 19.2.2 + + '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.1(@types/react@19.2.2) + + '@radix-ui/rect@1.1.1': {} + + '@remirror/core-constants@3.0.0': {} + + '@rolldown/pluginutils@1.0.0-beta.38': {} + + '@rollup/rollup-android-arm-eabi@4.52.4': + optional: true + + '@rollup/rollup-android-arm64@4.52.4': + optional: true + + '@rollup/rollup-darwin-arm64@4.52.4': + optional: true + + '@rollup/rollup-darwin-x64@4.52.4': + optional: true + + '@rollup/rollup-freebsd-arm64@4.52.4': + optional: true + + '@rollup/rollup-freebsd-x64@4.52.4': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.52.4': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.52.4': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.52.4': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.52.4': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.52.4': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.52.4': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.52.4': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.52.4': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.52.4': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.52.4': + optional: true + + '@rollup/rollup-linux-x64-musl@4.52.4': + optional: true + + '@rollup/rollup-openharmony-arm64@4.52.4': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.52.4': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.52.4': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.52.4': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.52.4': + optional: true + + '@shikijs/core@3.14.0': + dependencies: + '@shikijs/types': 3.14.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + + '@shikijs/engine-javascript@3.14.0': + dependencies: + '@shikijs/types': 3.14.0 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 4.3.3 + + '@shikijs/engine-oniguruma@3.14.0': + dependencies: + '@shikijs/types': 3.14.0 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@3.14.0': + dependencies: + '@shikijs/types': 3.14.0 + + '@shikijs/themes@3.14.0': + dependencies: + '@shikijs/types': 3.14.0 + + '@shikijs/types@3.14.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@10.0.2': {} + + '@smithy/abort-controller@4.2.0': + dependencies: + '@smithy/types': 4.6.0 + tslib: 2.8.1 + + '@smithy/abort-controller@4.2.5': + dependencies: + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@smithy/chunked-blob-reader-native@4.2.1': + dependencies: + '@smithy/util-base64': 4.3.0 + tslib: 2.8.1 + + '@smithy/chunked-blob-reader@5.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/config-resolver@4.3.0': + dependencies: + '@smithy/node-config-provider': 4.3.0 + '@smithy/types': 4.6.0 + '@smithy/util-config-provider': 4.2.0 + '@smithy/util-middleware': 4.2.0 + tslib: 2.8.1 + + '@smithy/config-resolver@4.4.3': + dependencies: + '@smithy/node-config-provider': 4.3.5 + '@smithy/types': 4.9.0 + '@smithy/util-config-provider': 4.2.0 + '@smithy/util-endpoints': 3.2.5 + '@smithy/util-middleware': 4.2.5 + tslib: 2.8.1 + + '@smithy/core@3.15.0': + dependencies: + '@smithy/middleware-serde': 4.2.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/types': 4.6.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-middleware': 4.2.0 + '@smithy/util-stream': 4.5.0 + '@smithy/util-utf8': 4.2.0 + '@smithy/uuid': 1.1.0 + tslib: 2.8.1 + + '@smithy/core@3.18.5': + dependencies: + '@smithy/middleware-serde': 4.2.6 + '@smithy/protocol-http': 5.3.5 + '@smithy/types': 4.9.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-middleware': 4.2.5 + '@smithy/util-stream': 4.5.6 + '@smithy/util-utf8': 4.2.0 + '@smithy/uuid': 1.1.0 + tslib: 2.8.1 + + '@smithy/credential-provider-imds@4.2.0': + dependencies: + '@smithy/node-config-provider': 4.3.0 + '@smithy/property-provider': 4.2.0 + '@smithy/types': 4.6.0 + '@smithy/url-parser': 4.2.0 + tslib: 2.8.1 + + '@smithy/credential-provider-imds@4.2.5': + dependencies: + '@smithy/node-config-provider': 4.3.5 + '@smithy/property-provider': 4.2.5 + '@smithy/types': 4.9.0 + '@smithy/url-parser': 4.2.5 + tslib: 2.8.1 + + '@smithy/eventstream-codec@4.2.0': + dependencies: + '@aws-crypto/crc32': 5.2.0 + '@smithy/types': 4.6.0 + '@smithy/util-hex-encoding': 4.2.0 + tslib: 2.8.1 + + '@smithy/eventstream-serde-browser@4.2.0': + dependencies: + '@smithy/eventstream-serde-universal': 4.2.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + + '@smithy/eventstream-serde-config-resolver@4.3.0': + dependencies: + '@smithy/types': 4.6.0 + tslib: 2.8.1 + + '@smithy/eventstream-serde-node@4.2.0': + dependencies: + '@smithy/eventstream-serde-universal': 4.2.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + + '@smithy/eventstream-serde-universal@4.2.0': + dependencies: + '@smithy/eventstream-codec': 4.2.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + + '@smithy/fetch-http-handler@5.3.1': + dependencies: + '@smithy/protocol-http': 5.3.0 + '@smithy/querystring-builder': 4.2.0 + '@smithy/types': 4.6.0 + '@smithy/util-base64': 4.3.0 + tslib: 2.8.1 + + '@smithy/fetch-http-handler@5.3.6': + dependencies: + '@smithy/protocol-http': 5.3.5 + '@smithy/querystring-builder': 4.2.5 + '@smithy/types': 4.9.0 + '@smithy/util-base64': 4.3.0 + tslib: 2.8.1 + + '@smithy/hash-blob-browser@4.2.1': + dependencies: + '@smithy/chunked-blob-reader': 5.2.0 + '@smithy/chunked-blob-reader-native': 4.2.1 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + + '@smithy/hash-node@4.2.0': + dependencies: + '@smithy/types': 4.6.0 + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@smithy/hash-node@4.2.5': + dependencies: + '@smithy/types': 4.9.0 + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@smithy/hash-stream-node@4.2.0': + dependencies: + '@smithy/types': 4.6.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@smithy/invalid-dependency@4.2.0': + dependencies: + '@smithy/types': 4.6.0 + tslib: 2.8.1 + + '@smithy/invalid-dependency@4.2.5': + dependencies: + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@smithy/is-array-buffer@2.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/is-array-buffer@4.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/md5-js@4.2.0': + dependencies: + '@smithy/types': 4.6.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@smithy/middleware-content-length@4.2.0': + dependencies: + '@smithy/protocol-http': 5.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + + '@smithy/middleware-content-length@4.2.5': + dependencies: + '@smithy/protocol-http': 5.3.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@smithy/middleware-endpoint@4.3.1': + dependencies: + '@smithy/core': 3.15.0 + '@smithy/middleware-serde': 4.2.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/shared-ini-file-loader': 4.3.0 + '@smithy/types': 4.6.0 + '@smithy/url-parser': 4.2.0 + '@smithy/util-middleware': 4.2.0 + tslib: 2.8.1 + + '@smithy/middleware-endpoint@4.3.12': + dependencies: + '@smithy/core': 3.18.5 + '@smithy/middleware-serde': 4.2.6 + '@smithy/node-config-provider': 4.3.5 + '@smithy/shared-ini-file-loader': 4.4.0 + '@smithy/types': 4.9.0 + '@smithy/url-parser': 4.2.5 + '@smithy/util-middleware': 4.2.5 + tslib: 2.8.1 + + '@smithy/middleware-retry@4.4.1': + dependencies: + '@smithy/node-config-provider': 4.3.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/service-error-classification': 4.2.0 + '@smithy/smithy-client': 4.7.1 + '@smithy/types': 4.6.0 + '@smithy/util-middleware': 4.2.0 + '@smithy/util-retry': 4.2.0 + '@smithy/uuid': 1.1.0 + tslib: 2.8.1 + + '@smithy/middleware-retry@4.4.12': + dependencies: + '@smithy/node-config-provider': 4.3.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/service-error-classification': 4.2.5 + '@smithy/smithy-client': 4.9.8 + '@smithy/types': 4.9.0 + '@smithy/util-middleware': 4.2.5 + '@smithy/util-retry': 4.2.5 + '@smithy/uuid': 1.1.0 + tslib: 2.8.1 + + '@smithy/middleware-serde@4.2.0': + dependencies: + '@smithy/protocol-http': 5.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + + '@smithy/middleware-serde@4.2.6': + dependencies: + '@smithy/protocol-http': 5.3.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@smithy/middleware-stack@4.2.0': + dependencies: + '@smithy/types': 4.6.0 + tslib: 2.8.1 + + '@smithy/middleware-stack@4.2.5': + dependencies: + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@smithy/node-config-provider@4.3.0': + dependencies: + '@smithy/property-provider': 4.2.0 + '@smithy/shared-ini-file-loader': 4.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + + '@smithy/node-config-provider@4.3.5': + dependencies: + '@smithy/property-provider': 4.2.5 + '@smithy/shared-ini-file-loader': 4.4.0 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@smithy/node-http-handler@4.3.0': + dependencies: + '@smithy/abort-controller': 4.2.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/querystring-builder': 4.2.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + + '@smithy/node-http-handler@4.4.5': + dependencies: + '@smithy/abort-controller': 4.2.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/querystring-builder': 4.2.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@smithy/property-provider@4.2.0': + dependencies: + '@smithy/types': 4.6.0 + tslib: 2.8.1 + + '@smithy/property-provider@4.2.5': + dependencies: + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@smithy/protocol-http@5.3.0': + dependencies: + '@smithy/types': 4.6.0 + tslib: 2.8.1 + + '@smithy/protocol-http@5.3.5': + dependencies: + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@smithy/querystring-builder@4.2.0': + dependencies: + '@smithy/types': 4.6.0 + '@smithy/util-uri-escape': 4.2.0 + tslib: 2.8.1 + + '@smithy/querystring-builder@4.2.5': + dependencies: + '@smithy/types': 4.9.0 + '@smithy/util-uri-escape': 4.2.0 + tslib: 2.8.1 + + '@smithy/querystring-parser@4.2.0': + dependencies: + '@smithy/types': 4.6.0 + tslib: 2.8.1 + + '@smithy/querystring-parser@4.2.5': + dependencies: + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@smithy/service-error-classification@4.2.0': + dependencies: + '@smithy/types': 4.6.0 + + '@smithy/service-error-classification@4.2.5': + dependencies: + '@smithy/types': 4.9.0 + + '@smithy/shared-ini-file-loader@4.3.0': + dependencies: + '@smithy/types': 4.6.0 + tslib: 2.8.1 + + '@smithy/shared-ini-file-loader@4.4.0': + dependencies: + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@smithy/signature-v4@5.3.0': + dependencies: + '@smithy/is-array-buffer': 4.2.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/types': 4.6.0 + '@smithy/util-hex-encoding': 4.2.0 + '@smithy/util-middleware': 4.2.0 + '@smithy/util-uri-escape': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@smithy/signature-v4@5.3.5': + dependencies: + '@smithy/is-array-buffer': 4.2.0 + '@smithy/protocol-http': 5.3.5 + '@smithy/types': 4.9.0 + '@smithy/util-hex-encoding': 4.2.0 + '@smithy/util-middleware': 4.2.5 + '@smithy/util-uri-escape': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@smithy/smithy-client@4.7.1': + dependencies: + '@smithy/core': 3.15.0 + '@smithy/middleware-endpoint': 4.3.1 + '@smithy/middleware-stack': 4.2.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/types': 4.6.0 + '@smithy/util-stream': 4.5.0 + tslib: 2.8.1 + + '@smithy/smithy-client@4.9.8': + dependencies: + '@smithy/core': 3.18.5 + '@smithy/middleware-endpoint': 4.3.12 + '@smithy/middleware-stack': 4.2.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/types': 4.9.0 + '@smithy/util-stream': 4.5.6 + tslib: 2.8.1 + + '@smithy/types@4.6.0': + dependencies: + tslib: 2.8.1 + + '@smithy/types@4.9.0': + dependencies: + tslib: 2.8.1 + + '@smithy/url-parser@4.2.0': + dependencies: + '@smithy/querystring-parser': 4.2.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + + '@smithy/url-parser@4.2.5': + dependencies: + '@smithy/querystring-parser': 4.2.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@smithy/util-base64@4.3.0': + dependencies: + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@smithy/util-body-length-browser@4.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/util-body-length-node@4.2.1': + dependencies: + tslib: 2.8.1 + + '@smithy/util-buffer-from@2.2.0': + dependencies: + '@smithy/is-array-buffer': 2.2.0 + tslib: 2.8.1 + + '@smithy/util-buffer-from@4.2.0': + dependencies: + '@smithy/is-array-buffer': 4.2.0 + tslib: 2.8.1 + + '@smithy/util-config-provider@4.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/util-defaults-mode-browser@4.3.0': + dependencies: + '@smithy/property-provider': 4.2.0 + '@smithy/smithy-client': 4.7.1 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + + '@smithy/util-defaults-mode-browser@4.3.11': + dependencies: + '@smithy/property-provider': 4.2.5 + '@smithy/smithy-client': 4.9.8 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@smithy/util-defaults-mode-node@4.2.1': + dependencies: + '@smithy/config-resolver': 4.3.0 + '@smithy/credential-provider-imds': 4.2.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/property-provider': 4.2.0 + '@smithy/smithy-client': 4.7.1 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + + '@smithy/util-defaults-mode-node@4.2.14': + dependencies: + '@smithy/config-resolver': 4.4.3 + '@smithy/credential-provider-imds': 4.2.5 + '@smithy/node-config-provider': 4.3.5 + '@smithy/property-provider': 4.2.5 + '@smithy/smithy-client': 4.9.8 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@smithy/util-endpoints@3.2.0': + dependencies: + '@smithy/node-config-provider': 4.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + + '@smithy/util-endpoints@3.2.5': + dependencies: + '@smithy/node-config-provider': 4.3.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@smithy/util-hex-encoding@4.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/util-middleware@4.2.0': + dependencies: + '@smithy/types': 4.6.0 + tslib: 2.8.1 + + '@smithy/util-middleware@4.2.5': + dependencies: + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@smithy/util-retry@4.2.0': + dependencies: + '@smithy/service-error-classification': 4.2.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + + '@smithy/util-retry@4.2.5': + dependencies: + '@smithy/service-error-classification': 4.2.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@smithy/util-stream@4.5.0': + dependencies: + '@smithy/fetch-http-handler': 5.3.1 + '@smithy/node-http-handler': 4.3.0 + '@smithy/types': 4.6.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-hex-encoding': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@smithy/util-stream@4.5.6': + dependencies: + '@smithy/fetch-http-handler': 5.3.6 + '@smithy/node-http-handler': 4.4.5 + '@smithy/types': 4.9.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-hex-encoding': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@smithy/util-uri-escape@4.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/util-utf8@2.3.0': + dependencies: + '@smithy/util-buffer-from': 2.2.0 + tslib: 2.8.1 + + '@smithy/util-utf8@4.2.0': + dependencies: + '@smithy/util-buffer-from': 4.2.0 + tslib: 2.8.1 + + '@smithy/util-waiter@4.2.0': + dependencies: + '@smithy/abort-controller': 4.2.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + + '@smithy/uuid@1.1.0': + dependencies: + tslib: 2.8.1 + + '@swc/helpers@0.5.18': + dependencies: + tslib: 2.8.1 + + '@tailwindcss/node@4.1.14': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.18.3 + jiti: 2.6.1 + lightningcss: 1.30.1 + magic-string: 0.30.19 + source-map-js: 1.2.1 + tailwindcss: 4.1.14 + + '@tailwindcss/oxide-android-arm64@4.1.14': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.1.14': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.1.14': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.1.14': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.14': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.14': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.1.14': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.1.14': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.1.14': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.1.14': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.14': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.1.14': + optional: true + + '@tailwindcss/oxide@4.1.14': + dependencies: + detect-libc: 2.1.2 + tar: 7.5.1 + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.1.14 + '@tailwindcss/oxide-darwin-arm64': 4.1.14 + '@tailwindcss/oxide-darwin-x64': 4.1.14 + '@tailwindcss/oxide-freebsd-x64': 4.1.14 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.14 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.14 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.14 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.14 + '@tailwindcss/oxide-linux-x64-musl': 4.1.14 + '@tailwindcss/oxide-wasm32-wasi': 4.1.14 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.14 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.14 + + '@tailwindcss/typography@0.5.19(tailwindcss@4.1.14)': + dependencies: + postcss-selector-parser: 6.0.10 + tailwindcss: 4.1.14 + + '@tailwindcss/vite@4.1.14(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.20.6))': + dependencies: + '@tailwindcss/node': 4.1.14 + '@tailwindcss/oxide': 4.1.14 + tailwindcss: 4.1.14 + vite: 7.1.9(@types/node@24.7.0)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.20.6) + + '@tanstack/query-core@5.90.2': {} + + '@tanstack/react-query@5.90.2(react@19.2.0)': + dependencies: + '@tanstack/query-core': 5.90.2 + react: 19.2.0 + + '@tiptap/core@3.11.0(@tiptap/pm@3.11.0)': + dependencies: + '@tiptap/pm': 3.11.0 + + '@tiptap/extension-blockquote@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))': + dependencies: + '@tiptap/core': 3.11.0(@tiptap/pm@3.11.0) + + '@tiptap/extension-bold@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))': + dependencies: + '@tiptap/core': 3.11.0(@tiptap/pm@3.11.0) + + '@tiptap/extension-bubble-menu@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0)': + dependencies: + '@floating-ui/dom': 1.7.4 + '@tiptap/core': 3.11.0(@tiptap/pm@3.11.0) + '@tiptap/pm': 3.11.0 + optional: true + + '@tiptap/extension-bullet-list@3.11.0(@tiptap/extension-list@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0))': + dependencies: + '@tiptap/extension-list': 3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0) + + '@tiptap/extension-code-block@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0)': + dependencies: + '@tiptap/core': 3.11.0(@tiptap/pm@3.11.0) + '@tiptap/pm': 3.11.0 + + '@tiptap/extension-code@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))': + dependencies: + '@tiptap/core': 3.11.0(@tiptap/pm@3.11.0) + + '@tiptap/extension-color@3.11.0(@tiptap/extension-text-style@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0)))': + dependencies: + '@tiptap/extension-text-style': 3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0)) + + '@tiptap/extension-document@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))': + dependencies: + '@tiptap/core': 3.11.0(@tiptap/pm@3.11.0) + + '@tiptap/extension-dropcursor@3.11.0(@tiptap/extensions@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0))': + dependencies: + '@tiptap/extensions': 3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0) + + '@tiptap/extension-floating-menu@3.11.0(@floating-ui/dom@1.7.4)(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0)': + dependencies: + '@floating-ui/dom': 1.7.4 + '@tiptap/core': 3.11.0(@tiptap/pm@3.11.0) + '@tiptap/pm': 3.11.0 + optional: true + + '@tiptap/extension-gapcursor@3.11.0(@tiptap/extensions@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0))': + dependencies: + '@tiptap/extensions': 3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0) + + '@tiptap/extension-hard-break@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))': + dependencies: + '@tiptap/core': 3.11.0(@tiptap/pm@3.11.0) + + '@tiptap/extension-heading@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))': + dependencies: + '@tiptap/core': 3.11.0(@tiptap/pm@3.11.0) + + '@tiptap/extension-horizontal-rule@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0)': + dependencies: + '@tiptap/core': 3.11.0(@tiptap/pm@3.11.0) + '@tiptap/pm': 3.11.0 + + '@tiptap/extension-italic@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))': + dependencies: + '@tiptap/core': 3.11.0(@tiptap/pm@3.11.0) + + '@tiptap/extension-link@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0)': + dependencies: + '@tiptap/core': 3.11.0(@tiptap/pm@3.11.0) + '@tiptap/pm': 3.11.0 + linkifyjs: 4.3.2 + + '@tiptap/extension-list-item@3.11.0(@tiptap/extension-list@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0))': + dependencies: + '@tiptap/extension-list': 3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0) + + '@tiptap/extension-list-keymap@3.11.0(@tiptap/extension-list@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0))': + dependencies: + '@tiptap/extension-list': 3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0) + + '@tiptap/extension-list@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0)': + dependencies: + '@tiptap/core': 3.11.0(@tiptap/pm@3.11.0) + '@tiptap/pm': 3.11.0 + + '@tiptap/extension-ordered-list@3.11.0(@tiptap/extension-list@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0))': + dependencies: + '@tiptap/extension-list': 3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0) + + '@tiptap/extension-paragraph@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))': + dependencies: + '@tiptap/core': 3.11.0(@tiptap/pm@3.11.0) + + '@tiptap/extension-strike@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))': + dependencies: + '@tiptap/core': 3.11.0(@tiptap/pm@3.11.0) + + '@tiptap/extension-text-style@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))': + dependencies: + '@tiptap/core': 3.11.0(@tiptap/pm@3.11.0) + + '@tiptap/extension-text@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))': + dependencies: + '@tiptap/core': 3.11.0(@tiptap/pm@3.11.0) + + '@tiptap/extension-underline@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))': + dependencies: + '@tiptap/core': 3.11.0(@tiptap/pm@3.11.0) + + '@tiptap/extensions@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0)': + dependencies: + '@tiptap/core': 3.11.0(@tiptap/pm@3.11.0) + '@tiptap/pm': 3.11.0 + + '@tiptap/pm@3.11.0': + dependencies: + prosemirror-changeset: 2.3.1 + prosemirror-collab: 1.3.1 + prosemirror-commands: 1.7.1 + prosemirror-dropcursor: 1.8.2 + prosemirror-gapcursor: 1.4.0 + prosemirror-history: 1.5.0 + prosemirror-inputrules: 1.5.1 + prosemirror-keymap: 1.2.3 + prosemirror-markdown: 1.13.2 + prosemirror-menu: 1.2.5 + prosemirror-model: 1.25.4 + prosemirror-schema-basic: 1.2.4 + prosemirror-schema-list: 1.5.1 + prosemirror-state: 1.4.4 + prosemirror-tables: 1.8.1 + prosemirror-trailing-node: 3.0.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.3) + prosemirror-transform: 1.10.5 + prosemirror-view: 1.41.3 + + '@tiptap/react@3.11.0(@floating-ui/dom@1.7.4)(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0)(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@tiptap/core': 3.11.0(@tiptap/pm@3.11.0) + '@tiptap/pm': 3.11.0 + '@types/react': 19.2.2 + '@types/react-dom': 19.2.1(@types/react@19.2.2) + '@types/use-sync-external-store': 0.0.6 + fast-deep-equal: 3.1.3 + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + use-sync-external-store: 1.6.0(react@19.2.0) + optionalDependencies: + '@tiptap/extension-bubble-menu': 3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0) + '@tiptap/extension-floating-menu': 3.11.0(@floating-ui/dom@1.7.4)(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0) + transitivePeerDependencies: + - '@floating-ui/dom' + + '@tiptap/starter-kit@3.11.0': + dependencies: + '@tiptap/core': 3.11.0(@tiptap/pm@3.11.0) + '@tiptap/extension-blockquote': 3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0)) + '@tiptap/extension-bold': 3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0)) + '@tiptap/extension-bullet-list': 3.11.0(@tiptap/extension-list@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0)) + '@tiptap/extension-code': 3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0)) + '@tiptap/extension-code-block': 3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0) + '@tiptap/extension-document': 3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0)) + '@tiptap/extension-dropcursor': 3.11.0(@tiptap/extensions@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0)) + '@tiptap/extension-gapcursor': 3.11.0(@tiptap/extensions@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0)) + '@tiptap/extension-hard-break': 3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0)) + '@tiptap/extension-heading': 3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0)) + '@tiptap/extension-horizontal-rule': 3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0) + '@tiptap/extension-italic': 3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0)) + '@tiptap/extension-link': 3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0) + '@tiptap/extension-list': 3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0) + '@tiptap/extension-list-item': 3.11.0(@tiptap/extension-list@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0)) + '@tiptap/extension-list-keymap': 3.11.0(@tiptap/extension-list@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0)) + '@tiptap/extension-ordered-list': 3.11.0(@tiptap/extension-list@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0)) + '@tiptap/extension-paragraph': 3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0)) + '@tiptap/extension-strike': 3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0)) + '@tiptap/extension-text': 3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0)) + '@tiptap/extension-underline': 3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0)) + '@tiptap/extensions': 3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0) + '@tiptap/pm': 3.11.0 + + '@trpc/client@11.6.0(@trpc/server@11.6.0(typescript@5.9.3))(typescript@5.9.3)': + dependencies: + '@trpc/server': 11.6.0(typescript@5.9.3) + typescript: 5.9.3 + + '@trpc/react-query@11.6.0(@tanstack/react-query@5.90.2(react@19.2.0))(@trpc/client@11.6.0(@trpc/server@11.6.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.6.0(typescript@5.9.3))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)': + dependencies: + '@tanstack/react-query': 5.90.2(react@19.2.0) + '@trpc/client': 11.6.0(@trpc/server@11.6.0(typescript@5.9.3))(typescript@5.9.3) + '@trpc/server': 11.6.0(typescript@5.9.3) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + typescript: 5.9.3 + + '@trpc/server@11.6.0(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + '@types/babel__generator': 7.27.0 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.28.0 + + '@types/babel__generator@7.27.0': + dependencies: + '@babel/types': 7.28.4 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + + '@types/babel__traverse@7.28.0': + dependencies: + '@babel/types': 7.28.4 + + '@types/bcryptjs@3.0.0': + dependencies: + bcryptjs: 3.0.3 + + '@types/body-parser@1.19.6': + dependencies: + '@types/connect': 3.4.38 + '@types/node': 24.7.0 + + '@types/connect@3.4.38': + dependencies: + '@types/node': 24.7.0 + + '@types/d3-array@3.2.2': {} + + '@types/d3-axis@3.0.6': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-brush@3.0.6': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-chord@3.0.6': {} + + '@types/d3-color@3.1.3': {} + + '@types/d3-contour@3.0.6': + dependencies: + '@types/d3-array': 3.2.2 + '@types/geojson': 7946.0.16 + + '@types/d3-delaunay@6.0.4': {} + + '@types/d3-dispatch@3.0.7': {} + + '@types/d3-drag@3.0.7': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-dsv@3.0.7': {} + + '@types/d3-ease@3.0.2': {} + + '@types/d3-fetch@3.0.7': + dependencies: + '@types/d3-dsv': 3.0.7 + + '@types/d3-force@3.0.10': {} + + '@types/d3-format@3.0.4': {} + + '@types/d3-geo@3.1.0': + dependencies: + '@types/geojson': 7946.0.16 + + '@types/d3-hierarchy@3.1.7': {} + + '@types/d3-interpolate@3.0.4': + dependencies: + '@types/d3-color': 3.1.3 + + '@types/d3-path@3.1.1': {} + + '@types/d3-polygon@3.0.2': {} + + '@types/d3-quadtree@3.0.6': {} + + '@types/d3-random@3.0.3': {} + + '@types/d3-scale-chromatic@3.1.0': {} + + '@types/d3-scale@4.0.9': + dependencies: + '@types/d3-time': 3.0.4 + + '@types/d3-selection@3.0.11': {} + + '@types/d3-shape@3.1.7': + dependencies: + '@types/d3-path': 3.1.1 + + '@types/d3-time-format@4.0.3': {} + + '@types/d3-time@3.0.4': {} + + '@types/d3-timer@3.0.2': {} + + '@types/d3-transition@3.0.9': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-zoom@3.0.8': + dependencies: + '@types/d3-interpolate': 3.0.4 + '@types/d3-selection': 3.0.11 + + '@types/d3@7.4.3': + dependencies: + '@types/d3-array': 3.2.2 + '@types/d3-axis': 3.0.6 + '@types/d3-brush': 3.0.6 + '@types/d3-chord': 3.0.6 + '@types/d3-color': 3.1.3 + '@types/d3-contour': 3.0.6 + '@types/d3-delaunay': 6.0.4 + '@types/d3-dispatch': 3.0.7 + '@types/d3-drag': 3.0.7 + '@types/d3-dsv': 3.0.7 + '@types/d3-ease': 3.0.2 + '@types/d3-fetch': 3.0.7 + '@types/d3-force': 3.0.10 + '@types/d3-format': 3.0.4 + '@types/d3-geo': 3.1.0 + '@types/d3-hierarchy': 3.1.7 + '@types/d3-interpolate': 3.0.4 + '@types/d3-path': 3.1.1 + '@types/d3-polygon': 3.0.2 + '@types/d3-quadtree': 3.0.6 + '@types/d3-random': 3.0.3 + '@types/d3-scale': 4.0.9 + '@types/d3-scale-chromatic': 3.1.0 + '@types/d3-selection': 3.0.11 + '@types/d3-shape': 3.1.7 + '@types/d3-time': 3.0.4 + '@types/d3-time-format': 4.0.3 + '@types/d3-timer': 3.0.2 + '@types/d3-transition': 3.0.9 + '@types/d3-zoom': 3.0.8 + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 2.1.0 + + '@types/estree-jsx@1.0.5': + dependencies: + '@types/estree': 1.0.8 + + '@types/estree@1.0.8': {} + + '@types/express-serve-static-core@4.19.6': + dependencies: + '@types/node': 24.7.0 + '@types/qs': 6.14.0 + '@types/range-parser': 1.2.7 + '@types/send': 1.2.0 + + '@types/express@4.17.21': + dependencies: + '@types/body-parser': 1.19.6 + '@types/express-serve-static-core': 4.19.6 + '@types/qs': 6.14.0 + '@types/serve-static': 1.15.9 + + '@types/geojson@7946.0.16': {} + + '@types/google.maps@3.58.1': {} + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/http-errors@2.0.5': {} + + '@types/jsonwebtoken@9.0.10': + dependencies: + '@types/ms': 2.1.0 + '@types/node': 24.7.0 + + '@types/katex@0.16.7': {} + + '@types/linkify-it@5.0.0': {} + + '@types/markdown-it@14.1.2': + dependencies: + '@types/linkify-it': 5.0.0 + '@types/mdurl': 2.0.0 + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/mdurl@2.0.0': {} + + '@types/mime@1.3.5': {} + + '@types/ms@2.1.0': {} + + '@types/multer@2.0.0': + dependencies: + '@types/express': 4.17.21 + + '@types/node-fetch@2.6.13': + dependencies: + '@types/node': 24.7.0 + form-data: 4.0.4 + + '@types/node@14.18.63': {} + + '@types/node@18.19.130': + dependencies: + undici-types: 5.26.5 + + '@types/node@24.7.0': + dependencies: + undici-types: 7.14.0 + + '@types/nodemailer@7.0.4': + dependencies: + '@aws-sdk/client-sesv2': 3.940.0 + '@types/node': 24.7.0 + transitivePeerDependencies: + - aws-crt + + '@types/pako@2.0.4': {} + + '@types/pdfkit@0.17.4': + dependencies: + '@types/node': 24.7.0 + + '@types/qrcode@1.5.6': + dependencies: + '@types/node': 24.7.0 + + '@types/qs@6.14.0': {} + + '@types/raf@3.4.3': + optional: true + + '@types/range-parser@1.2.7': {} + + '@types/react-dom@19.2.1(@types/react@19.2.2)': + dependencies: + '@types/react': 19.2.2 + + '@types/react@19.2.2': + dependencies: + csstype: 3.1.3 + + '@types/send@0.17.5': + dependencies: + '@types/mime': 1.3.5 + '@types/node': 24.7.0 + + '@types/send@1.2.0': + dependencies: + '@types/node': 24.7.0 + + '@types/serve-static@1.15.9': + dependencies: + '@types/http-errors': 2.0.5 + '@types/node': 24.7.0 + '@types/send': 0.17.5 + + '@types/trusted-types@2.0.7': + optional: true + + '@types/unist@2.0.11': {} + + '@types/unist@3.0.3': {} + + '@types/use-sync-external-store@0.0.6': {} + + '@ungap/structured-clone@1.3.0': {} + + '@vitejs/plugin-react@5.0.4(vite@7.1.9(@types/node@24.7.0)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.20.6))': + dependencies: + '@babel/core': 7.28.4 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.4) + '@rolldown/pluginutils': 1.0.0-beta.38 + '@types/babel__core': 7.20.5 + react-refresh: 0.17.0 + vite: 7.1.9(@types/node@24.7.0)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.20.6) + transitivePeerDependencies: + - supports-color + + '@vitest/expect@2.1.9': + dependencies: + '@vitest/spy': 2.1.9 + '@vitest/utils': 2.1.9 + chai: 5.3.3 + tinyrainbow: 1.2.0 + + '@vitest/mocker@2.1.9(vite@5.4.20(@types/node@24.7.0)(lightningcss@1.30.1))': + dependencies: + '@vitest/spy': 2.1.9 + estree-walker: 3.0.3 + magic-string: 0.30.19 + optionalDependencies: + vite: 5.4.20(@types/node@24.7.0)(lightningcss@1.30.1) + + '@vitest/pretty-format@2.1.9': + dependencies: + tinyrainbow: 1.2.0 + + '@vitest/runner@2.1.9': + dependencies: + '@vitest/utils': 2.1.9 + pathe: 1.1.2 + + '@vitest/snapshot@2.1.9': + dependencies: + '@vitest/pretty-format': 2.1.9 + magic-string: 0.30.19 + pathe: 1.1.2 + + '@vitest/spy@2.1.9': + dependencies: + tinyspy: 3.0.2 + + '@vitest/utils@2.1.9': + dependencies: + '@vitest/pretty-format': 2.1.9 + loupe: 3.2.1 + tinyrainbow: 1.2.0 + + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + acorn@8.15.0: {} + + add@2.0.6: {} + + adler-32@1.3.1: {} + + agentkeepalive@4.6.0: + dependencies: + humanize-ms: 1.2.1 + + ansi-regex@5.0.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + append-field@1.0.0: {} + + archiver-utils@2.1.0: + dependencies: + glob: 7.2.3 + graceful-fs: 4.2.11 + lazystream: 1.0.1 + lodash.defaults: 4.2.0 + lodash.difference: 4.5.0 + lodash.flatten: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.union: 4.6.0 + normalize-path: 3.0.0 + readable-stream: 2.3.8 + + archiver-utils@3.0.4: + dependencies: + glob: 7.2.3 + graceful-fs: 4.2.11 + lazystream: 1.0.1 + lodash.defaults: 4.2.0 + lodash.difference: 4.5.0 + lodash.flatten: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.union: 4.6.0 + normalize-path: 3.0.0 + readable-stream: 3.6.2 + + archiver@5.3.2: + dependencies: + archiver-utils: 2.1.0 + async: 3.2.6 + buffer-crc32: 0.2.13 + readable-stream: 3.6.2 + readdir-glob: 1.1.3 + tar-stream: 2.2.0 + zip-stream: 4.1.1 + + argparse@2.0.1: {} + + aria-hidden@1.2.6: + dependencies: + tslib: 2.8.1 + + array-flatten@1.1.1: {} + + assertion-error@2.0.1: {} + + async@3.2.6: {} + + asynckit@0.4.0: {} + + autoprefixer@10.4.21(postcss@8.5.6): + dependencies: + browserslist: 4.26.3 + caniuse-lite: 1.0.30001748 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.1.1 + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + aws-ssl-profiles@1.1.2: {} + + axios@1.12.2: + dependencies: + follow-redirects: 1.15.11 + form-data: 4.0.4 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + bail@2.0.2: {} + + balanced-match@1.0.2: {} + + base64-arraybuffer@1.0.2: + optional: true + + base64-js@0.0.8: {} + + base64-js@1.5.1: {} + + baseline-browser-mapping@2.8.12: {} + + bcryptjs@3.0.3: {} + + big-integer@1.6.52: {} + + binary@0.3.0: + dependencies: + buffers: 0.1.1 + chainsaw: 0.1.0 + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + bluebird@3.4.7: {} + + body-parser@1.20.3: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.13.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + bowser@2.12.1: {} + + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + brotli@1.3.3: + dependencies: + base64-js: 1.5.1 + + browserslist@4.26.3: + dependencies: + baseline-browser-mapping: 2.8.12 + caniuse-lite: 1.0.30001748 + electron-to-chromium: 1.5.230 + node-releases: 2.0.23 + update-browserslist-db: 1.1.3(browserslist@4.26.3) + + buffer-crc32@0.2.13: {} + + buffer-equal-constant-time@1.0.1: {} + + buffer-from@1.1.2: {} + + buffer-indexof-polyfill@1.0.2: {} + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + buffers@0.1.1: {} + + busboy@1.6.0: + dependencies: + streamsearch: 1.1.0 + + bytes@3.1.2: {} + + cac@6.7.14: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + camelcase@5.3.1: {} + + caniuse-lite@1.0.30001748: {} + + canvg@3.0.11: + dependencies: + '@babel/runtime': 7.28.4 + '@types/raf': 3.4.3 + core-js: 3.46.0 + raf: 3.4.1 + regenerator-runtime: 0.13.11 + rgbcolor: 1.0.1 + stackblur-canvas: 2.7.0 + svg-pathdata: 6.0.3 + optional: true + + ccount@2.0.1: {} + + cfb@1.2.2: + dependencies: + adler-32: 1.3.1 + crc-32: 1.2.2 + + chai@5.3.3: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.2.1 + pathval: 2.0.1 + + chainsaw@0.1.0: + dependencies: + traverse: 0.3.9 + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + character-reference-invalid@2.0.1: {} + + check-error@2.1.1: {} + + chevrotain-allstar@0.3.1(chevrotain@11.0.3): + dependencies: + chevrotain: 11.0.3 + lodash-es: 4.17.21 + + chevrotain@11.0.3: + dependencies: + '@chevrotain/cst-dts-gen': 11.0.3 + '@chevrotain/gast': 11.0.3 + '@chevrotain/regexp-to-ast': 11.0.3 + '@chevrotain/types': 11.0.3 + '@chevrotain/utils': 11.0.3 + lodash-es: 4.17.21 + + chownr@3.0.0: {} + + class-variance-authority@0.7.1: + dependencies: + clsx: 2.1.1 + + cliui@6.0.0: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + + clone@2.1.2: {} + + clsx@2.1.1: {} + + cmdk@1.1.1(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + + codepage@1.15.0: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + comma-separated-tokens@2.0.3: {} + + commander@7.2.0: {} + + commander@8.3.0: {} + + compress-commons@4.1.2: + dependencies: + buffer-crc32: 0.2.13 + crc32-stream: 4.0.3 + normalize-path: 3.0.0 + readable-stream: 3.6.2 + + concat-map@0.0.1: {} + + concat-stream@2.0.0: + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.2 + typedarray: 0.0.6 + + confbox@0.1.8: {} + + confbox@0.2.2: {} + + content-disposition@0.5.4: + dependencies: + safe-buffer: 5.2.1 + + content-type@1.0.5: {} + + convert-source-map@2.0.0: {} + + cookie-signature@1.0.6: {} + + cookie@0.7.1: {} + + cookie@1.0.2: {} + + copy-anything@3.0.5: + dependencies: + is-what: 4.1.16 + + core-js@3.46.0: + optional: true + + core-util-is@1.0.3: {} + + cose-base@1.0.3: + dependencies: + layout-base: 1.0.2 + + cose-base@2.2.0: + dependencies: + layout-base: 2.0.1 + + crc-32@1.2.2: {} + + crc32-stream@4.0.3: + dependencies: + crc-32: 1.2.2 + readable-stream: 3.6.2 + + crelt@1.0.6: {} + + crypto-js@4.2.0: {} + + css-line-break@2.1.0: + dependencies: + utrie: 1.0.2 + optional: true + + cssesc@3.0.0: {} + + csstype@3.1.3: {} + + cytoscape-cose-bilkent@4.1.0(cytoscape@3.33.1): + dependencies: + cose-base: 1.0.3 + cytoscape: 3.33.1 + + cytoscape-fcose@2.2.0(cytoscape@3.33.1): + dependencies: + cose-base: 2.2.0 + cytoscape: 3.33.1 + + cytoscape@3.33.1: {} + + d3-array@2.12.1: + dependencies: + internmap: 1.0.1 + + d3-array@3.2.4: + dependencies: + internmap: 2.0.3 + + d3-axis@3.0.0: {} + + d3-brush@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + d3-chord@3.0.1: + dependencies: + d3-path: 3.1.0 + + d3-color@3.1.0: {} + + d3-contour@4.0.2: + dependencies: + d3-array: 3.2.4 + + d3-delaunay@6.0.4: + dependencies: + delaunator: 5.0.1 + + d3-dispatch@3.0.1: {} + + d3-drag@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-selection: 3.0.0 + + d3-dsv@3.0.1: + dependencies: + commander: 7.2.0 + iconv-lite: 0.6.3 + rw: 1.3.3 + + d3-ease@3.0.1: {} + + d3-fetch@3.0.1: + dependencies: + d3-dsv: 3.0.1 + + d3-force@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-quadtree: 3.0.1 + d3-timer: 3.0.1 + + d3-format@3.1.0: {} + + d3-geo@3.1.1: + dependencies: + d3-array: 3.2.4 + + d3-hierarchy@3.1.2: {} + + d3-interpolate@3.0.1: + dependencies: + d3-color: 3.1.0 + + d3-path@1.0.9: {} + + d3-path@3.1.0: {} + + d3-polygon@3.0.1: {} + + d3-quadtree@3.0.1: {} + + d3-random@3.0.1: {} + + d3-sankey@0.12.3: + dependencies: + d3-array: 2.12.1 + d3-shape: 1.3.7 + + d3-scale-chromatic@3.1.0: + dependencies: + d3-color: 3.1.0 + d3-interpolate: 3.0.1 + + d3-scale@4.0.2: + dependencies: + d3-array: 3.2.4 + d3-format: 3.1.0 + d3-interpolate: 3.0.1 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + + d3-selection@3.0.0: {} + + d3-shape@1.3.7: + dependencies: + d3-path: 1.0.9 + + d3-shape@3.2.0: + dependencies: + d3-path: 3.1.0 + + d3-time-format@4.1.0: + dependencies: + d3-time: 3.1.0 + + d3-time@3.1.0: + dependencies: + d3-array: 3.2.4 + + d3-timer@3.0.1: {} + + d3-transition@3.0.1(d3-selection@3.0.0): + dependencies: + d3-color: 3.1.0 + d3-dispatch: 3.0.1 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-timer: 3.0.1 + + d3-zoom@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + d3@7.9.0: + dependencies: + d3-array: 3.2.4 + d3-axis: 3.0.0 + d3-brush: 3.0.0 + d3-chord: 3.0.1 + d3-color: 3.1.0 + d3-contour: 4.0.2 + d3-delaunay: 6.0.4 + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-dsv: 3.0.1 + d3-ease: 3.0.1 + d3-fetch: 3.0.1 + d3-force: 3.0.0 + d3-format: 3.1.0 + d3-geo: 3.1.1 + d3-hierarchy: 3.1.2 + d3-interpolate: 3.0.1 + d3-path: 3.1.0 + d3-polygon: 3.0.1 + d3-quadtree: 3.0.1 + d3-random: 3.0.1 + d3-scale: 4.0.2 + d3-scale-chromatic: 3.1.0 + d3-selection: 3.0.0 + d3-shape: 3.2.0 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + d3-timer: 3.0.1 + d3-transition: 3.0.1(d3-selection@3.0.0) + d3-zoom: 3.0.0 + + dagre-d3-es@7.0.11: + dependencies: + d3: 7.9.0 + lodash-es: 4.17.21 + + date-fns-jalali@4.1.0-0: {} + + date-fns@4.1.0: {} + + dayjs@1.11.18: {} + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + decamelize@1.2.0: {} + + decimal.js-light@2.5.1: {} + + decode-named-character-reference@1.2.0: + dependencies: + character-entities: 2.0.2 + + deep-eql@5.0.2: {} + + delaunator@5.0.1: + dependencies: + robust-predicates: 3.0.2 + + delayed-stream@1.0.0: {} + + denque@2.1.0: {} + + depd@2.0.0: {} + + dequal@2.0.3: {} + + destroy@1.2.0: {} + + detect-libc@2.1.2: {} + + detect-node-es@1.1.0: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + dfa@1.2.0: {} + + dijkstrajs@1.0.3: {} + + dom-helpers@5.2.1: + dependencies: + '@babel/runtime': 7.28.4 + csstype: 3.1.3 + + dompurify@3.3.0: + optionalDependencies: + '@types/trusted-types': 2.0.7 + + dotenv@17.2.3: {} + + drizzle-kit@0.31.5: + dependencies: + '@drizzle-team/brocli': 0.10.2 + '@esbuild-kit/esm-loader': 2.6.5 + esbuild: 0.25.10 + esbuild-register: 3.6.0(esbuild@0.25.10) + transitivePeerDependencies: + - supports-color + + drizzle-orm@0.44.6(mysql2@3.15.1): + optionalDependencies: + mysql2: 3.15.1 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + duplexer2@0.1.4: + dependencies: + readable-stream: 2.3.8 + + ecdsa-sig-formatter@1.0.11: + dependencies: + safe-buffer: 5.2.1 + + ee-first@1.1.1: {} + + electron-to-chromium@1.5.230: {} + + embla-carousel-react@8.6.0(react@19.2.0): + dependencies: + embla-carousel: 8.6.0 + embla-carousel-reactive-utils: 8.6.0(embla-carousel@8.6.0) + react: 19.2.0 + + embla-carousel-reactive-utils@8.6.0(embla-carousel@8.6.0): + dependencies: + embla-carousel: 8.6.0 + + embla-carousel@8.6.0: {} + + emoji-regex@8.0.0: {} + + encodeurl@1.0.2: {} + + encodeurl@2.0.0: {} + + end-of-stream@1.4.5: + dependencies: + once: 1.4.0 + + enhanced-resolve@5.18.3: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.0 + + entities@4.5.0: {} + + entities@6.0.1: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-module-lexer@1.7.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + esbuild-register@3.6.0(esbuild@0.25.10): + dependencies: + debug: 4.4.3 + esbuild: 0.25.10 + transitivePeerDependencies: + - supports-color + + esbuild@0.18.20: + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + esbuild@0.25.10: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.10 + '@esbuild/android-arm': 0.25.10 + '@esbuild/android-arm64': 0.25.10 + '@esbuild/android-x64': 0.25.10 + '@esbuild/darwin-arm64': 0.25.10 + '@esbuild/darwin-x64': 0.25.10 + '@esbuild/freebsd-arm64': 0.25.10 + '@esbuild/freebsd-x64': 0.25.10 + '@esbuild/linux-arm': 0.25.10 + '@esbuild/linux-arm64': 0.25.10 + '@esbuild/linux-ia32': 0.25.10 + '@esbuild/linux-loong64': 0.25.10 + '@esbuild/linux-mips64el': 0.25.10 + '@esbuild/linux-ppc64': 0.25.10 + '@esbuild/linux-riscv64': 0.25.10 + '@esbuild/linux-s390x': 0.25.10 + '@esbuild/linux-x64': 0.25.10 + '@esbuild/netbsd-arm64': 0.25.10 + '@esbuild/netbsd-x64': 0.25.10 + '@esbuild/openbsd-arm64': 0.25.10 + '@esbuild/openbsd-x64': 0.25.10 + '@esbuild/openharmony-arm64': 0.25.10 + '@esbuild/sunos-x64': 0.25.10 + '@esbuild/win32-arm64': 0.25.10 + '@esbuild/win32-ia32': 0.25.10 + '@esbuild/win32-x64': 0.25.10 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + escape-string-regexp@4.0.0: {} + + escape-string-regexp@5.0.0: {} + + estree-util-is-identifier-name@3.0.0: {} + + estree-walker@2.0.2: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.8 + + etag@1.8.1: {} + + event-target-shim@5.0.1: {} + + eventemitter3@4.0.7: {} + + exceljs@4.4.0: + dependencies: + archiver: 5.3.2 + dayjs: 1.11.18 + fast-csv: 4.3.6 + jszip: 3.10.1 + readable-stream: 3.6.2 + saxes: 5.0.1 + tmp: 0.2.5 + unzipper: 0.10.14 + uuid: 8.3.2 + + expect-type@1.2.2: {} + + express@4.21.2: + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.3 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.7.1 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.3.1 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.3 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.12 + proxy-addr: 2.0.7 + qs: 6.13.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.19.0 + serve-static: 1.16.2 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + exsolve@1.0.7: {} + + extend@3.0.2: {} + + fast-csv@4.3.6: + dependencies: + '@fast-csv/format': 4.3.5 + '@fast-csv/parse': 4.3.6 + + fast-deep-equal@3.1.3: {} + + fast-equals@5.3.2: {} + + fast-png@6.4.0: + dependencies: + '@types/pako': 2.0.4 + iobuffer: 5.4.0 + pako: 2.1.0 + + fast-xml-parser@5.2.5: + dependencies: + strnum: 2.1.1 + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + fflate@0.8.2: {} + + finalhandler@1.3.1: + dependencies: + debug: 2.6.9 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + follow-redirects@1.15.11: {} + + fontkit@2.0.4: + dependencies: + '@swc/helpers': 0.5.18 + brotli: 1.3.3 + clone: 2.1.2 + dfa: 1.2.0 + fast-deep-equal: 3.1.3 + restructure: 3.0.2 + tiny-inflate: 1.0.3 + unicode-properties: 1.4.1 + unicode-trie: 2.0.0 + + form-data-encoder@1.7.2: {} + + form-data@4.0.4: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + + formdata-node@4.4.1: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 4.0.0-beta.3 + + forwarded@0.2.0: {} + + frac@1.1.2: {} + + fraction.js@4.3.7: {} + + framer-motion@12.23.22(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + dependencies: + motion-dom: 12.23.21 + motion-utils: 12.23.6 + tslib: 2.8.1 + optionalDependencies: + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + + fresh@0.5.2: {} + + fs-constants@1.0.0: {} + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + fstream@1.0.12: + dependencies: + graceful-fs: 4.2.11 + inherits: 2.0.4 + mkdirp: 0.5.6 + rimraf: 2.7.1 + + function-bind@1.1.2: {} + + generate-function@2.3.1: + dependencies: + is-property: 1.0.2 + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-nonce@1.0.1: {} + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-tsconfig@4.10.1: + dependencies: + resolve-pkg-maps: 1.0.0 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + globals@15.15.0: {} + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + hachure-fill@0.5.2: {} + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hast-util-from-dom@5.0.1: + dependencies: + '@types/hast': 3.0.4 + hastscript: 9.0.1 + web-namespaces: 2.0.1 + + hast-util-from-html-isomorphic@2.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-from-dom: 5.0.1 + hast-util-from-html: 2.0.3 + unist-util-remove-position: 5.0.0 + + hast-util-from-html@2.0.3: + dependencies: + '@types/hast': 3.0.4 + devlop: 1.1.0 + hast-util-from-parse5: 8.0.3 + parse5: 7.3.0 + vfile: 6.0.3 + vfile-message: 4.0.3 + + hast-util-from-parse5@8.0.3: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + devlop: 1.1.0 + hastscript: 9.0.1 + property-information: 7.1.0 + vfile: 6.0.3 + vfile-location: 5.0.3 + web-namespaces: 2.0.1 + + hast-util-is-element@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-parse-selector@4.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-raw@9.1.0: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + '@ungap/structured-clone': 1.3.0 + hast-util-from-parse5: 8.0.3 + hast-util-to-parse5: 8.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + parse5: 7.3.0 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-to-jsx-runtime@2.3.6: + dependencies: + '@types/estree': 1.0.8 + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.18 + unist-util-position: 5.0.0 + vfile-message: 4.0.3 + transitivePeerDependencies: + - supports-color + + hast-util-to-parse5@8.0.0: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-to-text@4.0.2: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + hast-util-is-element: 3.0.0 + unist-util-find-after: 5.0.0 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hastscript@9.0.1: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + + html-url-attributes@3.0.1: {} + + html-void-elements@3.0.0: {} + + html2canvas@1.4.1: + dependencies: + css-line-break: 2.1.0 + text-segmentation: 1.0.3 + optional: true + + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + humanize-ms@1.2.1: + dependencies: + ms: 2.1.3 + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + iconv-lite@0.7.0: + dependencies: + safer-buffer: 2.1.2 + + ieee754@1.2.1: {} + + immediate@3.0.6: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + inline-style-parser@0.2.4: {} + + input-otp@1.4.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + dependencies: + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + + internmap@1.0.1: {} + + internmap@2.0.3: {} + + iobuffer@5.4.0: {} + + ipaddr.js@1.9.1: {} + + is-alphabetical@2.0.1: {} + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + + is-decimal@2.0.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-hexadecimal@2.0.1: {} + + is-plain-obj@4.1.0: {} + + is-property@1.0.2: {} + + is-what@4.1.16: {} + + isarray@1.0.0: {} + + jiti@2.6.1: {} + + jose@6.1.0: {} + + jpeg-exif@1.1.4: {} + + js-tokens@4.0.0: {} + + jsesc@3.1.0: {} + + json5@2.2.3: {} + + jsonwebtoken@9.0.2: + dependencies: + jws: 3.2.2 + lodash.includes: 4.3.0 + lodash.isboolean: 3.0.3 + lodash.isinteger: 4.0.4 + lodash.isnumber: 3.0.3 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.once: 4.1.1 + ms: 2.1.3 + semver: 7.7.3 + + jspdf-autotable@5.0.2(jspdf@3.0.3): + dependencies: + jspdf: 3.0.3 + + jspdf@3.0.3: + dependencies: + '@babel/runtime': 7.28.4 + fast-png: 6.4.0 + fflate: 0.8.2 + optionalDependencies: + canvg: 3.0.11 + core-js: 3.46.0 + dompurify: 3.3.0 + html2canvas: 1.4.1 + + jszip@3.10.1: + dependencies: + lie: 3.3.0 + pako: 1.0.11 + readable-stream: 2.3.8 + setimmediate: 1.0.5 + + jwa@1.4.2: + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + + jws@3.2.2: + dependencies: + jwa: 1.4.2 + safe-buffer: 5.2.1 + + katex@0.16.25: + dependencies: + commander: 8.3.0 + + khroma@2.1.0: {} + + kolorist@1.8.0: {} + + langium@3.3.1: + dependencies: + chevrotain: 11.0.3 + chevrotain-allstar: 0.3.1(chevrotain@11.0.3) + vscode-languageserver: 9.0.1 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.0.8 + + layout-base@1.0.2: {} + + layout-base@2.0.1: {} + + lazystream@1.0.1: + dependencies: + readable-stream: 2.3.8 + + lie@3.3.0: + dependencies: + immediate: 3.0.6 + + lightningcss-darwin-arm64@1.30.1: + optional: true + + lightningcss-darwin-x64@1.30.1: + optional: true + + lightningcss-freebsd-x64@1.30.1: + optional: true + + lightningcss-linux-arm-gnueabihf@1.30.1: + optional: true + + lightningcss-linux-arm64-gnu@1.30.1: + optional: true + + lightningcss-linux-arm64-musl@1.30.1: + optional: true + + lightningcss-linux-x64-gnu@1.30.1: + optional: true + + lightningcss-linux-x64-musl@1.30.1: + optional: true + + lightningcss-win32-arm64-msvc@1.30.1: + optional: true + + lightningcss-win32-x64-msvc@1.30.1: + optional: true + + lightningcss@1.30.1: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-darwin-arm64: 1.30.1 + lightningcss-darwin-x64: 1.30.1 + lightningcss-freebsd-x64: 1.30.1 + lightningcss-linux-arm-gnueabihf: 1.30.1 + lightningcss-linux-arm64-gnu: 1.30.1 + lightningcss-linux-arm64-musl: 1.30.1 + lightningcss-linux-x64-gnu: 1.30.1 + lightningcss-linux-x64-musl: 1.30.1 + lightningcss-win32-arm64-msvc: 1.30.1 + lightningcss-win32-x64-msvc: 1.30.1 + + linebreak@1.1.0: + dependencies: + base64-js: 0.0.8 + unicode-trie: 2.0.0 + + linkify-it@5.0.0: + dependencies: + uc.micro: 2.1.0 + + linkifyjs@4.3.2: {} + + listenercount@1.0.1: {} + + local-pkg@1.1.2: + dependencies: + mlly: 1.8.0 + pkg-types: 2.3.0 + quansync: 0.2.11 + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + lodash-es@4.17.21: {} + + lodash.defaults@4.2.0: {} + + lodash.difference@4.5.0: {} + + lodash.escaperegexp@4.1.2: {} + + lodash.flatten@4.4.0: {} + + lodash.groupby@4.6.0: {} + + lodash.includes@4.3.0: {} + + lodash.isboolean@3.0.3: {} + + lodash.isequal@4.5.0: {} + + lodash.isfunction@3.0.9: {} + + lodash.isinteger@4.0.4: {} + + lodash.isnil@4.0.0: {} + + lodash.isnumber@3.0.3: {} + + lodash.isplainobject@4.0.6: {} + + lodash.isstring@4.0.1: {} + + lodash.isundefined@3.0.1: {} + + lodash.once@4.1.1: {} + + lodash.union@4.6.0: {} + + lodash.uniq@4.5.0: {} + + lodash@4.17.21: {} + + long@5.3.2: {} + + longest-streak@3.1.0: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + loupe@3.2.1: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + lru-cache@7.18.3: {} + + lru.min@1.1.2: {} + + lucide-react@0.453.0(react@19.2.0): + dependencies: + react: 19.2.0 + + lucide-react@0.542.0(react@19.2.0): + dependencies: + react: 19.2.0 + + magic-string@0.30.19: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + markdown-it@14.1.0: + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 + + markdown-table@3.0.4: {} + + marked@16.4.1: {} + + math-intrinsics@1.1.0: {} + + mdast-util-find-and-replace@3.0.2: + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + mdast-util-from-markdown@2.0.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.2 + micromark-util-character: 2.1.1 + + mdast-util-gfm-footnote@2.1.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + micromark-util-normalize-identifier: 2.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.1.0: + dependencies: + mdast-util-from-markdown: 2.0.2 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.1.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-math@3.0.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + longest-streak: 3.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + unist-util-remove-position: 5.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-expression@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-jsx@3.2.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.3 + transitivePeerDependencies: + - supports-color + + mdast-util-mdxjs-esm@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.1 + + mdast-util-to-hast@13.2.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + + mdurl@2.0.0: {} + + media-typer@0.3.0: {} + + merge-descriptors@1.0.3: {} + + mermaid@11.12.0: + dependencies: + '@braintree/sanitize-url': 7.1.1 + '@iconify/utils': 3.0.2 + '@mermaid-js/parser': 0.6.3 + '@types/d3': 7.4.3 + cytoscape: 3.33.1 + cytoscape-cose-bilkent: 4.1.0(cytoscape@3.33.1) + cytoscape-fcose: 2.2.0(cytoscape@3.33.1) + d3: 7.9.0 + d3-sankey: 0.12.3 + dagre-d3-es: 7.0.11 + dayjs: 1.11.18 + dompurify: 3.3.0 + katex: 0.16.25 + khroma: 2.1.0 + lodash-es: 4.17.21 + marked: 16.4.1 + roughjs: 4.6.6 + stylis: 4.3.6 + ts-dedent: 2.2.0 + uuid: 11.1.0 + transitivePeerDependencies: + - supports-color + + methods@1.1.2: {} + + micromark-core-commonmark@2.0.3: + dependencies: + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-table@2.1.1: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.1 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-math@3.1.0: + dependencies: + '@types/katex': 0.16.7 + devlop: 1.1.0 + katex: 0.16.25 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.2.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 + + micromark-util-encode@2.0.1: {} + + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.2 + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-subtokenize@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + + micromark@4.0.2: + dependencies: + '@types/debug': 4.1.12 + debug: 4.4.3 + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + transitivePeerDependencies: + - supports-color + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@1.6.0: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.2 + + minimist@1.2.8: {} + + minipass@7.1.2: {} + + minizlib@3.1.0: + dependencies: + minipass: 7.1.2 + + mitt@3.0.1: {} + + mkdirp@0.5.6: + dependencies: + minimist: 1.2.8 + + mlly@1.8.0: + dependencies: + acorn: 8.15.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.1 + + modern-screenshot@4.6.6: {} + + motion-dom@12.23.21: + dependencies: + motion-utils: 12.23.6 + + motion-utils@12.23.6: {} + + ms@2.0.0: {} + + ms@2.1.3: {} + + multer@2.0.2: + dependencies: + append-field: 1.0.0 + busboy: 1.6.0 + concat-stream: 2.0.0 + mkdirp: 0.5.6 + object-assign: 4.1.1 + type-is: 1.6.18 + xtend: 4.0.2 + + mysql2@3.15.1: + dependencies: + aws-ssl-profiles: 1.1.2 + denque: 2.1.0 + generate-function: 2.3.1 + iconv-lite: 0.7.0 + long: 5.3.2 + lru.min: 1.1.2 + named-placeholders: 1.1.3 + seq-queue: 0.0.5 + sqlstring: 2.3.3 + + named-placeholders@1.1.3: + dependencies: + lru-cache: 7.18.3 + + nanoid@3.3.11: {} + + nanoid@5.1.6: {} + + negotiator@0.6.3: {} + + next-themes@0.4.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + dependencies: + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + + node-domexception@1.0.0: {} + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-releases@2.0.23: {} + + nodemailer@7.0.11: {} + + normalize-path@3.0.0: {} + + normalize-range@0.1.2: {} + + object-assign@4.1.1: {} + + object-inspect@1.13.4: {} + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + oniguruma-parser@0.12.1: {} + + oniguruma-to-es@4.3.3: + dependencies: + oniguruma-parser: 0.12.1 + regex: 6.0.1 + regex-recursion: 6.0.2 + + openai@4.104.0(zod@4.1.12): + dependencies: + '@types/node': 18.19.130 + '@types/node-fetch': 2.6.13 + abort-controller: 3.0.0 + agentkeepalive: 4.6.0 + form-data-encoder: 1.7.2 + formdata-node: 4.4.1 + node-fetch: 2.7.0 + optionalDependencies: + zod: 4.1.12 + transitivePeerDependencies: + - encoding + + orderedmap@2.1.1: {} + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-try@2.2.0: {} + + package-manager-detector@1.5.0: {} + + pako@0.2.9: {} + + pako@1.0.11: {} + + pako@2.1.0: {} + + parse-entities@4.0.2: + dependencies: + '@types/unist': 2.0.11 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.2.0 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + + parse5@7.3.0: + dependencies: + entities: 6.0.1 + + parseurl@1.3.3: {} + + path-data-parser@0.1.0: {} + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-to-regexp@0.1.12: {} + + pathe@1.1.2: {} + + pathe@2.0.3: {} + + pathval@2.0.1: {} + + pdfkit@0.17.2: + dependencies: + crypto-js: 4.2.0 + fontkit: 2.0.4 + jpeg-exif: 1.1.4 + linebreak: 1.1.0 + png-js: 1.0.0 + + performance-now@2.1.0: + optional: true + + picocolors@1.1.1: {} + + picomatch@4.0.3: {} + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.8.0 + pathe: 2.0.3 + + pkg-types@2.3.0: + dependencies: + confbox: 0.2.2 + exsolve: 1.0.7 + pathe: 2.0.3 + + png-js@1.0.0: {} + + pngjs@5.0.0: {} + + pnpm@10.18.0: {} + + points-on-curve@0.2.0: {} + + points-on-path@0.2.1: + dependencies: + path-data-parser: 0.1.0 + points-on-curve: 0.2.0 + + postcss-selector-parser@6.0.10: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-value-parser@4.2.0: {} + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prettier@3.6.2: {} + + process-nextick-args@2.0.1: {} + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + property-information@6.5.0: {} + + property-information@7.1.0: {} + + prosemirror-changeset@2.3.1: + dependencies: + prosemirror-transform: 1.10.5 + + prosemirror-collab@1.3.1: + dependencies: + prosemirror-state: 1.4.4 + + prosemirror-commands@1.7.1: + dependencies: + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-transform: 1.10.5 + + prosemirror-dropcursor@1.8.2: + dependencies: + prosemirror-state: 1.4.4 + prosemirror-transform: 1.10.5 + prosemirror-view: 1.41.3 + + prosemirror-gapcursor@1.4.0: + dependencies: + prosemirror-keymap: 1.2.3 + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-view: 1.41.3 + + prosemirror-history@1.5.0: + dependencies: + prosemirror-state: 1.4.4 + prosemirror-transform: 1.10.5 + prosemirror-view: 1.41.3 + rope-sequence: 1.3.4 + + prosemirror-inputrules@1.5.1: + dependencies: + prosemirror-state: 1.4.4 + prosemirror-transform: 1.10.5 + + prosemirror-keymap@1.2.3: + dependencies: + prosemirror-state: 1.4.4 + w3c-keyname: 2.2.8 + + prosemirror-markdown@1.13.2: + dependencies: + '@types/markdown-it': 14.1.2 + markdown-it: 14.1.0 + prosemirror-model: 1.25.4 + + prosemirror-menu@1.2.5: + dependencies: + crelt: 1.0.6 + prosemirror-commands: 1.7.1 + prosemirror-history: 1.5.0 + prosemirror-state: 1.4.4 + + prosemirror-model@1.25.4: + dependencies: + orderedmap: 2.1.1 + + prosemirror-schema-basic@1.2.4: + dependencies: + prosemirror-model: 1.25.4 + + prosemirror-schema-list@1.5.1: + dependencies: + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-transform: 1.10.5 + + prosemirror-state@1.4.4: + dependencies: + prosemirror-model: 1.25.4 + prosemirror-transform: 1.10.5 + prosemirror-view: 1.41.3 + + prosemirror-tables@1.8.1: + dependencies: + prosemirror-keymap: 1.2.3 + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-transform: 1.10.5 + prosemirror-view: 1.41.3 + + prosemirror-trailing-node@3.0.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.3): + dependencies: + '@remirror/core-constants': 3.0.0 + escape-string-regexp: 4.0.0 + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-view: 1.41.3 + + prosemirror-transform@1.10.5: + dependencies: + prosemirror-model: 1.25.4 + + prosemirror-view@1.41.3: + dependencies: + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-transform: 1.10.5 + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + proxy-from-env@1.1.0: {} + + punycode.js@2.3.1: {} + + qrcode@1.5.4: + dependencies: + dijkstrajs: 1.0.3 + pngjs: 5.0.0 + yargs: 15.4.1 + + qs@6.13.0: + dependencies: + side-channel: 1.1.0 + + quansync@0.2.11: {} + + raf@3.4.1: + dependencies: + performance-now: 2.1.0 + optional: true + + range-parser@1.2.1: {} + + raw-body@2.5.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + react-day-picker@9.11.1(react@19.2.0): + dependencies: + '@date-fns/tz': 1.4.1 + date-fns: 4.1.0 + date-fns-jalali: 4.1.0-0 + react: 19.2.0 + + react-dom@19.2.0(react@19.2.0): + dependencies: + react: 19.2.0 + scheduler: 0.27.0 + + react-hook-form@7.64.0(react@19.2.0): + dependencies: + react: 19.2.0 + + react-is@16.13.1: {} + + react-is@18.3.1: {} + + react-markdown@10.1.0(@types/react@19.2.2)(react@19.2.0): + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/react': 19.2.2 + devlop: 1.1.0 + hast-util-to-jsx-runtime: 2.3.6 + html-url-attributes: 3.0.1 + mdast-util-to-hast: 13.2.0 + react: 19.2.0 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + unified: 11.0.5 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + + react-refresh@0.17.0: {} + + react-remove-scroll-bar@2.3.8(@types/react@19.2.2)(react@19.2.0): + dependencies: + react: 19.2.0 + react-style-singleton: 2.2.3(@types/react@19.2.2)(react@19.2.0) + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.2 + + react-remove-scroll@2.7.1(@types/react@19.2.2)(react@19.2.0): + dependencies: + react: 19.2.0 + react-remove-scroll-bar: 2.3.8(@types/react@19.2.2)(react@19.2.0) + react-style-singleton: 2.2.3(@types/react@19.2.2)(react@19.2.0) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@19.2.2)(react@19.2.0) + use-sidecar: 1.1.3(@types/react@19.2.2)(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.2 + + react-resizable-panels@3.0.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + dependencies: + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + + react-smooth@4.0.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + dependencies: + fast-equals: 5.3.2 + prop-types: 15.8.1 + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + react-transition-group: 4.4.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + + react-style-singleton@2.2.3(@types/react@19.2.2)(react@19.2.0): + dependencies: + get-nonce: 1.0.1 + react: 19.2.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.2 + + react-transition-group@4.4.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + dependencies: + '@babel/runtime': 7.28.4 + dom-helpers: 5.2.1 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + + react@19.2.0: {} + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdir-glob@1.1.3: + dependencies: + minimatch: 5.1.6 + + recharts-scale@0.4.5: + dependencies: + decimal.js-light: 2.5.1 + + recharts@2.15.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + dependencies: + clsx: 2.1.1 + eventemitter3: 4.0.7 + lodash: 4.17.21 + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + react-is: 18.3.1 + react-smooth: 4.0.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + recharts-scale: 0.4.5 + tiny-invariant: 1.3.3 + victory-vendor: 36.9.2 + + regenerator-runtime@0.13.11: + optional: true + + regex-recursion@6.0.2: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@6.0.1: + dependencies: + regex-utilities: 2.3.0 + + regexparam@3.0.0: {} + + rehype-harden@1.1.5: {} + + rehype-katex@7.0.1: + dependencies: + '@types/hast': 3.0.4 + '@types/katex': 0.16.7 + hast-util-from-html-isomorphic: 2.0.0 + hast-util-to-text: 4.0.2 + katex: 0.16.25 + unist-util-visit-parents: 6.0.2 + vfile: 6.0.3 + + rehype-raw@7.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-raw: 9.1.0 + vfile: 6.0.3 + + remark-gfm@4.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-gfm: 3.1.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-math@6.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-math: 3.0.0 + micromark-extension-math: 3.1.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + micromark-util-types: 2.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-rehype@11.1.2: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + mdast-util-to-hast: 13.2.0 + unified: 11.0.5 + vfile: 6.0.3 + + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.1.2 + unified: 11.0.5 + + require-directory@2.1.1: {} + + require-main-filename@2.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + restructure@3.0.2: {} + + rgbcolor@1.0.1: + optional: true + + rimraf@2.7.1: + dependencies: + glob: 7.2.3 + + robust-predicates@3.0.2: {} + + rollup@4.52.4: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.52.4 + '@rollup/rollup-android-arm64': 4.52.4 + '@rollup/rollup-darwin-arm64': 4.52.4 + '@rollup/rollup-darwin-x64': 4.52.4 + '@rollup/rollup-freebsd-arm64': 4.52.4 + '@rollup/rollup-freebsd-x64': 4.52.4 + '@rollup/rollup-linux-arm-gnueabihf': 4.52.4 + '@rollup/rollup-linux-arm-musleabihf': 4.52.4 + '@rollup/rollup-linux-arm64-gnu': 4.52.4 + '@rollup/rollup-linux-arm64-musl': 4.52.4 + '@rollup/rollup-linux-loong64-gnu': 4.52.4 + '@rollup/rollup-linux-ppc64-gnu': 4.52.4 + '@rollup/rollup-linux-riscv64-gnu': 4.52.4 + '@rollup/rollup-linux-riscv64-musl': 4.52.4 + '@rollup/rollup-linux-s390x-gnu': 4.52.4 + '@rollup/rollup-linux-x64-gnu': 4.52.4 + '@rollup/rollup-linux-x64-musl': 4.52.4 + '@rollup/rollup-openharmony-arm64': 4.52.4 + '@rollup/rollup-win32-arm64-msvc': 4.52.4 + '@rollup/rollup-win32-ia32-msvc': 4.52.4 + '@rollup/rollup-win32-x64-gnu': 4.52.4 + '@rollup/rollup-win32-x64-msvc': 4.52.4 + fsevents: 2.3.3 + + rope-sequence@1.3.4: {} + + roughjs@4.6.6: + dependencies: + hachure-fill: 0.5.2 + path-data-parser: 0.1.0 + points-on-curve: 0.2.0 + points-on-path: 0.2.1 + + rw@1.3.3: {} + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + saxes@5.0.1: + dependencies: + xmlchars: 2.2.0 + + scheduler@0.27.0: {} + + semver@6.3.1: {} + + semver@7.7.3: {} + + send@0.19.0: + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + + seq-queue@0.0.5: {} + + serve-static@1.16.2: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.19.0 + transitivePeerDependencies: + - supports-color + + set-blocking@2.0.0: {} + + setimmediate@1.0.5: {} + + setprototypeof@1.2.0: {} + + shiki@3.14.0: + dependencies: + '@shikijs/core': 3.14.0 + '@shikijs/engine-javascript': 3.14.0 + '@shikijs/engine-oniguruma': 3.14.0 + '@shikijs/langs': 3.14.0 + '@shikijs/themes': 3.14.0 + '@shikijs/types': 3.14.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + siginfo@2.0.0: {} + + sonner@2.0.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + dependencies: + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + + source-map-js@1.2.1: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + space-separated-tokens@2.0.2: {} + + sqlstring@2.3.3: {} + + ssf@0.11.2: + dependencies: + frac: 1.1.2 + + stackback@0.0.2: {} + + stackblur-canvas@2.7.0: + optional: true + + statuses@2.0.1: {} + + std-env@3.9.0: {} + + streamdown@1.4.0(@types/react@19.2.2)(react@19.2.0): + dependencies: + clsx: 2.1.1 + katex: 0.16.25 + lucide-react: 0.542.0(react@19.2.0) + marked: 16.4.1 + mermaid: 11.12.0 + react: 19.2.0 + react-markdown: 10.1.0(@types/react@19.2.2)(react@19.2.0) + rehype-harden: 1.1.5 + rehype-katex: 7.0.1 + rehype-raw: 7.0.0 + remark-gfm: 4.0.1 + remark-math: 6.0.0 + shiki: 3.14.0 + tailwind-merge: 3.3.1 + transitivePeerDependencies: + - '@types/react' + - supports-color + + streamsearch@1.1.0: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strnum@2.1.1: {} + + style-to-js@1.1.18: + dependencies: + style-to-object: 1.0.11 + + style-to-object@1.0.11: + dependencies: + inline-style-parser: 0.2.4 + + stylis@4.3.6: {} + + superjson@1.13.3: + dependencies: + copy-anything: 3.0.5 + + svg-pathdata@6.0.3: + optional: true + + tailwind-merge@3.3.1: {} + + tailwindcss-animate@1.0.7(tailwindcss@4.1.14): + dependencies: + tailwindcss: 4.1.14 + + tailwindcss@4.1.14: {} + + tapable@2.3.0: {} + + tar-stream@2.2.0: + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.5 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + + tar@7.5.1: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.1.0 + yallist: 5.0.0 + + text-segmentation@1.0.3: + dependencies: + utrie: 1.0.2 + optional: true + + tiny-inflate@1.0.3: {} + + tiny-invariant@1.3.3: {} + + tinybench@2.9.0: {} + + tinyexec@0.3.2: {} + + tinyexec@1.0.1: {} + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + tinypool@1.1.1: {} + + tinyrainbow@1.2.0: {} + + tinyspy@3.0.2: {} + + tmp@0.2.5: {} + + toidentifier@1.0.1: {} + + tr46@0.0.3: {} + + traverse@0.3.9: {} + + trim-lines@3.0.1: {} + + trough@2.2.0: {} + + ts-dedent@2.2.0: {} + + tslib@2.8.1: {} + + tsx@4.20.6: + dependencies: + esbuild: 0.25.10 + get-tsconfig: 4.10.1 + optionalDependencies: + fsevents: 2.3.3 + + tw-animate-css@1.4.0: {} + + type-is@1.6.18: + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + + typedarray@0.0.6: {} + + typescript@5.9.3: {} + + uc.micro@2.1.0: {} + + ufo@1.6.1: {} + + undici-types@5.26.5: {} + + undici-types@7.14.0: {} + + unicode-properties@1.4.1: + dependencies: + base64-js: 1.5.1 + unicode-trie: 2.0.0 + + unicode-trie@2.0.0: + dependencies: + pako: 0.2.9 + tiny-inflate: 1.0.3 + + unified@11.0.5: + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + + unist-util-find-after@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + unist-util-is@6.0.1: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-remove-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-visit: 5.0.0 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + unist-util-visit@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + unpipe@1.0.0: {} + + unzipper@0.10.14: + dependencies: + big-integer: 1.6.52 + binary: 0.3.0 + bluebird: 3.4.7 + buffer-indexof-polyfill: 1.0.2 + duplexer2: 0.1.4 + fstream: 1.0.12 + graceful-fs: 4.2.11 + listenercount: 1.0.1 + readable-stream: 2.3.8 + setimmediate: 1.0.5 + + update-browserslist-db@1.1.3(browserslist@4.26.3): + dependencies: + browserslist: 4.26.3 + escalade: 3.2.0 + picocolors: 1.1.1 + + use-callback-ref@1.3.3(@types/react@19.2.2)(react@19.2.0): + dependencies: + react: 19.2.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.2 + + use-sidecar@1.1.3(@types/react@19.2.2)(react@19.2.0): + dependencies: + detect-node-es: 1.1.0 + react: 19.2.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.2 + + use-sync-external-store@1.6.0(react@19.2.0): + dependencies: + react: 19.2.0 + + util-deprecate@1.0.2: {} + + utils-merge@1.0.1: {} + + utrie@1.0.2: + dependencies: + base64-arraybuffer: 1.0.2 + optional: true + + uuid@11.1.0: {} + + uuid@8.3.2: {} + + vary@1.1.2: {} + + vaul@1.1.2(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + dependencies: + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + + vfile-location@5.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile: 6.0.3 + + vfile-message@4.0.3: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.3 + + victory-vendor@36.9.2: + dependencies: + '@types/d3-array': 3.2.2 + '@types/d3-ease': 3.0.2 + '@types/d3-interpolate': 3.0.4 + '@types/d3-scale': 4.0.9 + '@types/d3-shape': 3.1.7 + '@types/d3-time': 3.0.4 + '@types/d3-timer': 3.0.2 + d3-array: 3.2.4 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-scale: 4.0.2 + d3-shape: 3.2.0 + d3-time: 3.1.0 + d3-timer: 3.0.1 + + vite-node@2.1.9(@types/node@24.7.0)(lightningcss@1.30.1): + dependencies: + cac: 6.7.14 + debug: 4.4.3 + es-module-lexer: 1.7.0 + pathe: 1.1.2 + vite: 5.4.20(@types/node@24.7.0)(lightningcss@1.30.1) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + vite-plugin-manus-runtime@0.0.56: + dependencies: + '@medv/finder': 4.0.2 + clsx: 2.1.1 + modern-screenshot: 4.6.6 + nanoid: 5.1.6 + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + tailwind-merge: 3.3.1 + + vite@5.4.20(@types/node@24.7.0)(lightningcss@1.30.1): + dependencies: + esbuild: 0.21.5 + postcss: 8.5.6 + rollup: 4.52.4 + optionalDependencies: + '@types/node': 24.7.0 + fsevents: 2.3.3 + lightningcss: 1.30.1 + + vite@7.1.9(@types/node@24.7.0)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.20.6): + dependencies: + esbuild: 0.25.10 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.52.4 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 24.7.0 + fsevents: 2.3.3 + jiti: 2.6.1 + lightningcss: 1.30.1 + tsx: 4.20.6 + + vitest@2.1.9(@types/node@24.7.0)(lightningcss@1.30.1): + dependencies: + '@vitest/expect': 2.1.9 + '@vitest/mocker': 2.1.9(vite@5.4.20(@types/node@24.7.0)(lightningcss@1.30.1)) + '@vitest/pretty-format': 2.1.9 + '@vitest/runner': 2.1.9 + '@vitest/snapshot': 2.1.9 + '@vitest/spy': 2.1.9 + '@vitest/utils': 2.1.9 + chai: 5.3.3 + debug: 4.4.3 + expect-type: 1.2.2 + magic-string: 0.30.19 + pathe: 1.1.2 + std-env: 3.9.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinypool: 1.1.1 + tinyrainbow: 1.2.0 + vite: 5.4.20(@types/node@24.7.0)(lightningcss@1.30.1) + vite-node: 2.1.9(@types/node@24.7.0)(lightningcss@1.30.1) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 24.7.0 + transitivePeerDependencies: + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + vscode-jsonrpc@8.2.0: {} + + vscode-languageserver-protocol@3.17.5: + dependencies: + vscode-jsonrpc: 8.2.0 + vscode-languageserver-types: 3.17.5 + + vscode-languageserver-textdocument@1.0.12: {} + + vscode-languageserver-types@3.17.5: {} + + vscode-languageserver@9.0.1: + dependencies: + vscode-languageserver-protocol: 3.17.5 + + vscode-uri@3.0.8: {} + + w3c-keyname@2.2.8: {} + + web-namespaces@2.0.1: {} + + web-streams-polyfill@4.0.0-beta.3: {} + + webidl-conversions@3.0.1: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which-module@2.0.1: {} + + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + wmf@1.0.2: {} + + word@0.3.0: {} + + wouter@3.7.1(patch_hash=4e16e6ff3fde7d6c1024d3e0c8605dc9eb6afb690d0d49958c2f449091813072)(react@19.2.0): + dependencies: + mitt: 3.0.1 + react: 19.2.0 + regexparam: 3.0.0 + use-sync-external-store: 1.6.0(react@19.2.0) + + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrappy@1.0.2: {} + + xlsx@0.18.5: + dependencies: + adler-32: 1.3.1 + cfb: 1.2.2 + codepage: 1.15.0 + crc-32: 1.2.2 + ssf: 0.11.2 + wmf: 1.0.2 + word: 0.3.0 + + xmlchars@2.2.0: {} + + xtend@4.0.2: {} + + y18n@4.0.3: {} + + yallist@3.1.1: {} + + yallist@5.0.0: {} + + yargs-parser@18.1.3: + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + + yargs@15.4.1: + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 + + zip-stream@4.1.1: + dependencies: + archiver-utils: 3.0.4 + compress-commons: 4.1.2 + readable-stream: 3.6.2 + + zod@4.1.12: {} + + zwitch@2.0.4: {} diff --git a/deployment-package/source_server/__tests__/localAuth.test.ts b/deployment-package/source_server/__tests__/localAuth.test.ts new file mode 100644 index 0000000..4385110 --- /dev/null +++ b/deployment-package/source_server/__tests__/localAuth.test.ts @@ -0,0 +1,106 @@ +import { describe, it, expect, beforeAll } from "vitest"; +import { getDb } from "../db"; +import { users } from "../../drizzle/schema"; +import { eq } from "drizzle-orm"; + +describe("Local Authentication", () => { + beforeAll(async () => { + // Vérifier que la base de données est accessible + const db = await getDb(); + expect(db).toBeDefined(); + }); + + it("should have an admin user with username adminServFormation", async () => { + const db = await getDb(); + if (!db) { + throw new Error("Database not available"); + } + + const result = await db + .select() + .from(users) + .where(eq(users.username, "adminServFormation")) + .limit(1); + + expect(result.length).toBe(1); + expect(result[0].username).toBe("adminServFormation"); + expect(result[0].role).toBe("admin"); + expect(result[0].password).toBeDefined(); + expect(result[0].password).not.toBeNull(); + }); + + it("should authenticate with correct credentials", async () => { + const response = await fetch("http://localhost:3000/api/auth/local/login", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + username: "adminServFormation", + password: "Itinova69!", + }), + }); + + expect(response.status).toBe(200); + const data = await response.json(); + expect(data.success).toBe(true); + expect(data.user).toBeDefined(); + expect(data.user.username).toBe("adminServFormation"); + expect(data.user.role).toBe("admin"); + expect(data.user.password).toBeUndefined(); // Le mot de passe ne doit pas être retourné + }); + + it("should reject authentication with incorrect password", async () => { + const response = await fetch("http://localhost:3000/api/auth/local/login", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + username: "adminServFormation", + password: "wrongpassword", + }), + }); + + expect(response.status).toBe(401); + const data = await response.json(); + expect(data.success).toBe(false); + expect(data.message).toContain("incorrect"); + }); + + it("should reject authentication with non-existent username", async () => { + const response = await fetch("http://localhost:3000/api/auth/local/login", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + username: "nonexistentuser", + password: "anypassword", + }), + }); + + expect(response.status).toBe(401); + const data = await response.json(); + expect(data.success).toBe(false); + expect(data.message).toContain("incorrect"); + }); + + it("should reject authentication with missing credentials", async () => { + const response = await fetch("http://localhost:3000/api/auth/local/login", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + username: "adminServFormation", + // password manquant + }), + }); + + expect(response.status).toBe(400); + const data = await response.json(); + expect(data.success).toBe(false); + expect(data.message).toContain("requis"); + }); +}); diff --git a/deployment-package/source_server/_core/appUrl.ts b/deployment-package/source_server/_core/appUrl.ts new file mode 100644 index 0000000..5bc793a --- /dev/null +++ b/deployment-package/source_server/_core/appUrl.ts @@ -0,0 +1,32 @@ +/** + * Récupère l'URL de base de l'application + * En production, utilise l'URL publique configurée + * En développement, utilise localhost + */ +export function getAppBaseUrl(): string { + // Si une URL publique est configurée, l'utiliser + if (process.env.APP_PUBLIC_URL) { + return process.env.APP_PUBLIC_URL; + } + + // En production, essayer de détecter l'URL depuis les variables d'environnement Manus + if (process.env.NODE_ENV === "production") { + // Pour les applications Manus déployées, l'URL est généralement disponible + // via les variables d'environnement du système + const port = process.env.PORT || 3000; + + // Si on est sur un serveur VPS avec un domaine configuré + if (process.env.DOMAIN_NAME) { + return `https://${process.env.DOMAIN_NAME}`; + } + + // Sinon, utiliser l'URL du serveur si disponible + if (process.env.SERVER_URL) { + return process.env.SERVER_URL; + } + } + + // Par défaut, utiliser localhost (développement) + const port = process.env.PORT || 3000; + return `http://localhost:${port}`; +} diff --git a/deployment-package/source_server/_core/context.ts b/deployment-package/source_server/_core/context.ts new file mode 100644 index 0000000..e4ae108 --- /dev/null +++ b/deployment-package/source_server/_core/context.ts @@ -0,0 +1,28 @@ +import type { CreateExpressContextOptions } from "@trpc/server/adapters/express"; +import type { User } from "../../drizzle/schema"; +import { sdk } from "./sdk"; + +export type TrpcContext = { + req: CreateExpressContextOptions["req"]; + res: CreateExpressContextOptions["res"]; + user: User | null; +}; + +export async function createContext( + opts: CreateExpressContextOptions +): Promise { + let user: User | null = null; + + try { + user = await sdk.authenticateRequest(opts.req); + } catch (error) { + // Authentication is optional for public procedures. + user = null; + } + + return { + req: opts.req, + res: opts.res, + user, + }; +} diff --git a/deployment-package/source_server/_core/cookies.ts b/deployment-package/source_server/_core/cookies.ts new file mode 100644 index 0000000..664b6de --- /dev/null +++ b/deployment-package/source_server/_core/cookies.ts @@ -0,0 +1,48 @@ +import type { CookieOptions, Request } from "express"; + +const LOCAL_HOSTS = new Set(["localhost", "127.0.0.1", "::1"]); + +function isIpAddress(host: string) { + // Basic IPv4 check and IPv6 presence detection. + if (/^\d{1,3}(\.\d{1,3}){3}$/.test(host)) return true; + return host.includes(":"); +} + +function isSecureRequest(req: Request) { + if (req.protocol === "https") return true; + + const forwardedProto = req.headers["x-forwarded-proto"]; + if (!forwardedProto) return false; + + const protoList = Array.isArray(forwardedProto) + ? forwardedProto + : forwardedProto.split(","); + + return protoList.some(proto => proto.trim().toLowerCase() === "https"); +} + +export function getSessionCookieOptions( + req: Request +): Pick { + // const hostname = req.hostname; + // const shouldSetDomain = + // hostname && + // !LOCAL_HOSTS.has(hostname) && + // !isIpAddress(hostname) && + // hostname !== "127.0.0.1" && + // hostname !== "::1"; + + // const domain = + // shouldSetDomain && !hostname.startsWith(".") + // ? `.${hostname}` + // : shouldSetDomain + // ? hostname + // : undefined; + + return { + httpOnly: true, + path: "/", + sameSite: "lax", + secure: isSecureRequest(req), + }; +} diff --git a/deployment-package/source_server/_core/dataApi.ts b/deployment-package/source_server/_core/dataApi.ts new file mode 100644 index 0000000..7ef81b5 --- /dev/null +++ b/deployment-package/source_server/_core/dataApi.ts @@ -0,0 +1,64 @@ +/** + * Quick example (matches curl usage): + * await callDataApi("Youtube/search", { + * query: { gl: "US", hl: "en", q: "manus" }, + * }) + */ +import { ENV } from "./env"; + +export type DataApiCallOptions = { + query?: Record; + body?: Record; + pathParams?: Record; + formData?: Record; +}; + +export async function callDataApi( + apiId: string, + options: DataApiCallOptions = {} +): Promise { + if (!ENV.forgeApiUrl) { + throw new Error("BUILT_IN_FORGE_API_URL is not configured"); + } + if (!ENV.forgeApiKey) { + throw new Error("BUILT_IN_FORGE_API_KEY is not configured"); + } + + // Build the full URL by appending the service path to the base URL + const baseUrl = ENV.forgeApiUrl.endsWith("/") ? ENV.forgeApiUrl : `${ENV.forgeApiUrl}/`; + const fullUrl = new URL("webdevtoken.v1.WebDevService/CallApi", baseUrl).toString(); + + const response = await fetch(fullUrl, { + method: "POST", + headers: { + accept: "application/json", + "content-type": "application/json", + "connect-protocol-version": "1", + authorization: `Bearer ${ENV.forgeApiKey}`, + }, + body: JSON.stringify({ + apiId, + query: options.query, + body: options.body, + path_params: options.pathParams, + multipart_form_data: options.formData, + }), + }); + + if (!response.ok) { + const detail = await response.text().catch(() => ""); + throw new Error( + `Data API request failed (${response.status} ${response.statusText})${detail ? `: ${detail}` : ""}` + ); + } + + const payload = await response.json().catch(() => ({})); + if (payload && typeof payload === "object" && "jsonData" in payload) { + try { + return JSON.parse((payload as Record).jsonData ?? "{}"); + } catch { + return (payload as Record).jsonData; + } + } + return payload; +} diff --git a/deployment-package/source_server/_core/emailSender.ts b/deployment-package/source_server/_core/emailSender.ts new file mode 100644 index 0000000..9d6fd7d --- /dev/null +++ b/deployment-package/source_server/_core/emailSender.ts @@ -0,0 +1,206 @@ +/** + * Service d'envoi d'emails réels via Resend API + * + * Configuration requise: + * - RESEND_API_KEY: Clé API Resend (obtenir sur https://resend.com) + * - RESEND_FROM_EMAIL: Adresse email d'envoi (doit être vérifiée dans Resend) + * + * Si ces variables ne sont pas configurées, les emails seront simulés + * et envoyés comme notifications au propriétaire du projet. + */ + +import { ENV } from "./env"; +import { notifyOwner } from "./notification"; +import { getActiveEmailConfig } from "../db"; +import { sendViaSMTP } from "./smtpSender"; + +interface EmailParams { + to: string; + subject: string; + html: string; + attachments?: Array<{ + filename: string; + content: string; + contentType: string; + }>; +} + +interface ResendEmailRequest { + from: string; + to: string[]; + subject: string; + html: string; + attachments?: Array<{ + filename: string; + content: string; + }>; +} + +/** + * Envoie un email via Resend API + */ +async function sendViaResend(params: EmailParams, config?: { apiKey: string; fromEmail: string; fromName: string }): Promise { + // Utiliser la config fournie ou les variables d'environnement + const resendApiKey = config?.apiKey || process.env.RESEND_API_KEY; + const fromEmail = config?.fromEmail || process.env.RESEND_FROM_EMAIL || 'noreply@manusvm.computer'; + const fromName = config?.fromName || 'Formation Manager Itinova'; + + if (!resendApiKey) { + console.warn('[Email] RESEND_API_KEY non configurée, email simulé'); + return false; + } + + try { + const payload: ResendEmailRequest = { + from: `${fromName} <${fromEmail}>`, + to: [params.to], + subject: params.subject, + html: params.html, + }; + + // Ajouter les pièces jointes si présentes + if (params.attachments && params.attachments.length > 0) { + payload.attachments = params.attachments.map(att => ({ + filename: att.filename, + content: att.content, // Resend accepte base64 ou string + })); + } + + const response = await fetch('https://api.resend.com/emails', { + method: 'POST', + headers: { + 'Authorization': `Bearer ${resendApiKey}`, + 'Content-Type': 'application/json', + }, + body: JSON.stringify(payload), + }); + + if (!response.ok) { + const error = await response.text(); + console.error('[Email] Erreur Resend:', response.status, error); + return false; + } + + const result = await response.json(); + console.log('[Email] Email envoyé via Resend:', result.id); + return true; + } catch (error) { + console.error('[Email] Exception lors de l\'envoi via Resend:', error); + return false; + } +} + +/** + * Simule l'envoi d'un email en créant une notification pour le propriétaire + */ +async function simulateEmail(params: EmailParams): Promise { + console.log('=== EMAIL SIMULÉ ==='); + console.log('To:', params.to); + console.log('Subject:', params.subject); + + const emailContent = ` +Destinataire: ${params.to} +Sujet: ${params.subject} + +${params.html.replace(/<[^>]*>/g, '').substring(0, 500)}... + +${params.attachments ? `Pièces jointes: ${params.attachments.map(a => a.filename).join(', ')}` : ''} + +⚠️ Cet email est simulé. Pour envoyer de vrais emails: +1. Créez un compte sur https://resend.com +2. Ajoutez RESEND_API_KEY dans les secrets du projet +3. Ajoutez RESEND_FROM_EMAIL (ex: noreply@votredomaine.com)`; + + try { + await notifyOwner({ + title: `📧 Email simulé: ${params.subject}`, + content: emailContent, + }); + console.log('✓ Email simulé (notification envoyée au propriétaire)'); + } catch (error) { + console.error('Erreur lors de la simulation d\'email:', error); + } + + console.log('==================='); + + return true; +} + +/** + * Envoie un email (réel ou simulé selon la configuration) + */ +export async function sendEmail(params: EmailParams): Promise { + // Récupérer la configuration depuis la base de données + const config = await getActiveEmailConfig(); + + console.log('[Email] Configuration récupérée:', config ? { + provider: config.provider, + mode: config.mode, + fromEmail: config.fromEmail, + hasSmtpHost: !!config.smtpHost, + hasSmtpUser: !!config.smtpUser, + hasSmtpPassword: !!config.smtpPassword, + } : 'Aucune configuration'); + + // Si mode simulation ou pas de config, simuler + if (!config || config.mode === 'simulation') { + console.log('[Email] Mode simulation activé ou pas de config'); + return await simulateEmail(params); + } + + // Si mode production + if (config.mode === 'production') { + console.log('[Email] Mode production activé'); + + // Essayer SMTP en priorité si configuré + if (config.provider === 'smtp' && config.smtpHost && config.smtpPort && config.smtpUser && config.smtpPassword) { + console.log('[Email] Tentative d\'envoi via SMTP...'); + + const sent = await sendViaSMTP(params, { + host: config.smtpHost, + port: config.smtpPort, + secure: config.smtpSecure || 'tls', + user: config.smtpUser, + password: config.smtpPassword, + fromEmail: config.fromEmail, + fromName: config.fromName, + }); + + // Si l'envoi échoue, simuler en fallback + if (!sent) { + console.log('[Email] Échec de l\'envoi SMTP, basculement en simulation'); + return await simulateEmail(params); + } + + console.log('[Email] Email envoyé avec succès via SMTP'); + return true; + } + + // Sinon essayer Resend + if (config.provider === 'resend' && config.apiKey) { + console.log('[Email] Tentative d\'envoi via Resend...'); + const sent = await sendViaResend(params, { + apiKey: config.apiKey, + fromEmail: config.fromEmail, + fromName: config.fromName, + }); + + // Si l'envoi échoue, simuler en fallback + if (!sent) { + return await simulateEmail(params); + } + + return true; + } + } + + // Fallback: simuler + return await simulateEmail(params); +} + +/** + * Vérifie si le service d'envoi d'emails réel est configuré + */ +export function isEmailServiceConfigured(): boolean { + return !!process.env.RESEND_API_KEY; +} diff --git a/deployment-package/source_server/_core/env.ts b/deployment-package/source_server/_core/env.ts new file mode 100644 index 0000000..305082c --- /dev/null +++ b/deployment-package/source_server/_core/env.ts @@ -0,0 +1,11 @@ +export const ENV = { + appId: process.env.VITE_APP_ID ?? "", + cookieSecret: process.env.JWT_SECRET ?? "", + jwtSecret: process.env.JWT_SECRET ?? "", + databaseUrl: process.env.DATABASE_URL ?? "", + oAuthServerUrl: process.env.OAUTH_SERVER_URL ?? "", + ownerOpenId: process.env.OWNER_OPEN_ID ?? "", + isProduction: process.env.NODE_ENV === "production", + forgeApiUrl: process.env.BUILT_IN_FORGE_API_URL ?? "", + forgeApiKey: process.env.BUILT_IN_FORGE_API_KEY ?? "", +}; diff --git a/deployment-package/source_server/_core/fileUpload.ts b/deployment-package/source_server/_core/fileUpload.ts new file mode 100644 index 0000000..c050be1 --- /dev/null +++ b/deployment-package/source_server/_core/fileUpload.ts @@ -0,0 +1,59 @@ +import { Request, Response } from "express"; +import multer from "multer"; +import { storagePut } from "../storage"; +import crypto from "crypto"; +import path from "path"; + +// Configuration de multer pour l'upload en mémoire +const upload = multer({ + storage: multer.memoryStorage(), + limits: { + fileSize: 10 * 1024 * 1024, // 10 Mo max + }, +}); + +// Middleware pour l'upload d'un seul fichier +export const uploadSingle = upload.single("file"); + +// Handler pour l'upload de fichier vers S3 +export async function handleFileUpload(req: Request, res: Response) { + try { + if (!req.file) { + return res.status(400).json({ error: "Aucun fichier fourni" }); + } + + const file = req.file; + + // Générer un nom de fichier unique + const randomSuffix = crypto.randomBytes(8).toString("hex"); + const ext = path.extname(file.originalname); + const baseName = path.basename(file.originalname, ext); + const safeBaseName = baseName.replace(/[^a-zA-Z0-9-_]/g, "_"); + const fileName = `${safeBaseName}-${randomSuffix}${ext}`; + + // Chemin S3 pour les pièces jointes de rappels + const s3Key = `rappels-attachments/${fileName}`; + + // Upload vers S3 + const { url, key } = await storagePut( + s3Key, + file.buffer, + file.mimetype + ); + + console.log(`[FileUpload] Fichier uploadé: ${fileName} (${file.size} octets)`); + + return res.json({ + url, + key, + filename: file.originalname, + mimetype: file.mimetype, + size: file.size, + }); + } catch (error) { + console.error("[FileUpload] Erreur:", error); + return res.status(500).json({ + error: "Erreur lors de l'upload du fichier" + }); + } +} diff --git a/deployment-package/source_server/_core/imageGeneration.ts b/deployment-package/source_server/_core/imageGeneration.ts new file mode 100644 index 0000000..0ba0c98 --- /dev/null +++ b/deployment-package/source_server/_core/imageGeneration.ts @@ -0,0 +1,92 @@ +/** + * Image generation helper using internal ImageService + * + * Example usage: + * const { url: imageUrl } = await generateImage({ + * prompt: "A serene landscape with mountains" + * }); + * + * For editing: + * const { url: imageUrl } = await generateImage({ + * prompt: "Add a rainbow to this landscape", + * originalImages: [{ + * url: "https://example.com/original.jpg", + * mimeType: "image/jpeg" + * }] + * }); + */ +import { storagePut } from "server/storage"; +import { ENV } from "./env"; + +export type GenerateImageOptions = { + prompt: string; + originalImages?: Array<{ + url?: string; + b64Json?: string; + mimeType?: string; + }>; +}; + +export type GenerateImageResponse = { + url?: string; +}; + +export async function generateImage( + options: GenerateImageOptions +): Promise { + if (!ENV.forgeApiUrl) { + throw new Error("BUILT_IN_FORGE_API_URL is not configured"); + } + if (!ENV.forgeApiKey) { + throw new Error("BUILT_IN_FORGE_API_KEY is not configured"); + } + + // Build the full URL by appending the service path to the base URL + const baseUrl = ENV.forgeApiUrl.endsWith("/") + ? ENV.forgeApiUrl + : `${ENV.forgeApiUrl}/`; + const fullUrl = new URL( + "images.v1.ImageService/GenerateImage", + baseUrl + ).toString(); + + const response = await fetch(fullUrl, { + method: "POST", + headers: { + accept: "application/json", + "content-type": "application/json", + "connect-protocol-version": "1", + authorization: `Bearer ${ENV.forgeApiKey}`, + }, + body: JSON.stringify({ + prompt: options.prompt, + original_images: options.originalImages || [], + }), + }); + + if (!response.ok) { + const detail = await response.text().catch(() => ""); + throw new Error( + `Image generation request failed (${response.status} ${response.statusText})${detail ? `: ${detail}` : ""}` + ); + } + + const result = (await response.json()) as { + image: { + b64Json: string; + mimeType: string; + }; + }; + const base64Data = result.image.b64Json; + const buffer = Buffer.from(base64Data, "base64"); + + // Save to S3 + const { url } = await storagePut( + `generated/${Date.now()}.png`, + buffer, + result.image.mimeType + ); + return { + url, + }; +} diff --git a/deployment-package/source_server/_core/index.ts b/deployment-package/source_server/_core/index.ts new file mode 100644 index 0000000..47aaafc --- /dev/null +++ b/deployment-package/source_server/_core/index.ts @@ -0,0 +1,82 @@ +import "dotenv/config"; +import express from "express"; +import { createServer } from "http"; +import net from "net"; +import { createExpressMiddleware } from "@trpc/server/adapters/express"; +import { registerOAuthRoutes } from "./oauth"; +import { appRouter } from "../routers"; +import { createContext } from "./context"; +import localAuthRouter from "./localAuth"; +import uploadImageRouter from "./uploadImage"; +import uploadFileRouter from "./uploadFile"; +import { serveStatic, setupVite } from "./vite"; +import { initRappelScheduler } from "../rappelScheduler"; +import { initRappelRetryScheduler } from "../rappelRetry"; + +function isPortAvailable(port: number): Promise { + return new Promise(resolve => { + const server = net.createServer(); + server.listen(port, () => { + server.close(() => resolve(true)); + }); + server.on("error", () => resolve(false)); + }); +} + +async function findAvailablePort(startPort: number = 3000): Promise { + for (let port = startPort; port < startPort + 20; port++) { + if (await isPortAvailable(port)) { + return port; + } + } + throw new Error(`No available port found starting from ${startPort}`); +} + +async function startServer() { + const app = express(); + const server = createServer(app); + // Configure body parser with larger size limit for file uploads + app.use(express.json({ limit: "50mb" })); + app.use(express.urlencoded({ limit: "50mb", extended: true })); + // OAuth callback under /api/oauth/callback + registerOAuthRoutes(app); + // Local authentication under /api/auth/local + app.use("/api/auth/local", localAuthRouter); + // Image upload under /api/upload-image + app.use("/api/upload-image", uploadImageRouter); + // File upload under /api/upload-file + app.use("/api/upload-file", uploadFileRouter); + // tRPC API + app.use( + "/api/trpc", + createExpressMiddleware({ + router: appRouter, + createContext, + }) + ); + // development mode uses Vite, production mode uses static files + if (process.env.NODE_ENV === "development") { + await setupVite(app, server); + } else { + serveStatic(app); + } + + const preferredPort = parseInt(process.env.PORT || "3000"); + const port = await findAvailablePort(preferredPort); + + if (port !== preferredPort) { + console.log(`Port ${preferredPort} is busy, using port ${port} instead`); + } + + server.listen(port, () => { + console.log(`Server running on http://localhost:${port}/`); + + // Initialiser le scheduler de rappels automatiques + initRappelScheduler(); + + // Initialiser le scheduler de réessai automatique + initRappelRetryScheduler(); + }); +} + +startServer().catch(console.error); diff --git a/deployment-package/source_server/_core/llm.ts b/deployment-package/source_server/_core/llm.ts new file mode 100644 index 0000000..8ea4c4a --- /dev/null +++ b/deployment-package/source_server/_core/llm.ts @@ -0,0 +1,332 @@ +import { ENV } from "./env"; + +export type Role = "system" | "user" | "assistant" | "tool" | "function"; + +export type TextContent = { + type: "text"; + text: string; +}; + +export type ImageContent = { + type: "image_url"; + image_url: { + url: string; + detail?: "auto" | "low" | "high"; + }; +}; + +export type FileContent = { + type: "file_url"; + file_url: { + url: string; + mime_type?: "audio/mpeg" | "audio/wav" | "application/pdf" | "audio/mp4" | "video/mp4" ; + }; +}; + +export type MessageContent = string | TextContent | ImageContent | FileContent; + +export type Message = { + role: Role; + content: MessageContent | MessageContent[]; + name?: string; + tool_call_id?: string; +}; + +export type Tool = { + type: "function"; + function: { + name: string; + description?: string; + parameters?: Record; + }; +}; + +export type ToolChoicePrimitive = "none" | "auto" | "required"; +export type ToolChoiceByName = { name: string }; +export type ToolChoiceExplicit = { + type: "function"; + function: { + name: string; + }; +}; + +export type ToolChoice = + | ToolChoicePrimitive + | ToolChoiceByName + | ToolChoiceExplicit; + +export type InvokeParams = { + messages: Message[]; + tools?: Tool[]; + toolChoice?: ToolChoice; + tool_choice?: ToolChoice; + maxTokens?: number; + max_tokens?: number; + outputSchema?: OutputSchema; + output_schema?: OutputSchema; + responseFormat?: ResponseFormat; + response_format?: ResponseFormat; +}; + +export type ToolCall = { + id: string; + type: "function"; + function: { + name: string; + arguments: string; + }; +}; + +export type InvokeResult = { + id: string; + created: number; + model: string; + choices: Array<{ + index: number; + message: { + role: Role; + content: string | Array; + tool_calls?: ToolCall[]; + }; + finish_reason: string | null; + }>; + usage?: { + prompt_tokens: number; + completion_tokens: number; + total_tokens: number; + }; +}; + +export type JsonSchema = { + name: string; + schema: Record; + strict?: boolean; +}; + +export type OutputSchema = JsonSchema; + +export type ResponseFormat = + | { type: "text" } + | { type: "json_object" } + | { type: "json_schema"; json_schema: JsonSchema }; + +const ensureArray = ( + value: MessageContent | MessageContent[] +): MessageContent[] => (Array.isArray(value) ? value : [value]); + +const normalizeContentPart = ( + part: MessageContent +): TextContent | ImageContent | FileContent => { + if (typeof part === "string") { + return { type: "text", text: part }; + } + + if (part.type === "text") { + return part; + } + + if (part.type === "image_url") { + return part; + } + + if (part.type === "file_url") { + return part; + } + + throw new Error("Unsupported message content part"); +}; + +const normalizeMessage = (message: Message) => { + const { role, name, tool_call_id } = message; + + if (role === "tool" || role === "function") { + const content = ensureArray(message.content) + .map(part => (typeof part === "string" ? part : JSON.stringify(part))) + .join("\n"); + + return { + role, + name, + tool_call_id, + content, + }; + } + + const contentParts = ensureArray(message.content).map(normalizeContentPart); + + // If there's only text content, collapse to a single string for compatibility + if (contentParts.length === 1 && contentParts[0].type === "text") { + return { + role, + name, + content: contentParts[0].text, + }; + } + + return { + role, + name, + content: contentParts, + }; +}; + +const normalizeToolChoice = ( + toolChoice: ToolChoice | undefined, + tools: Tool[] | undefined +): "none" | "auto" | ToolChoiceExplicit | undefined => { + if (!toolChoice) return undefined; + + if (toolChoice === "none" || toolChoice === "auto") { + return toolChoice; + } + + if (toolChoice === "required") { + if (!tools || tools.length === 0) { + throw new Error( + "tool_choice 'required' was provided but no tools were configured" + ); + } + + if (tools.length > 1) { + throw new Error( + "tool_choice 'required' needs a single tool or specify the tool name explicitly" + ); + } + + return { + type: "function", + function: { name: tools[0].function.name }, + }; + } + + if ("name" in toolChoice) { + return { + type: "function", + function: { name: toolChoice.name }, + }; + } + + return toolChoice; +}; + +const resolveApiUrl = () => + ENV.forgeApiUrl && ENV.forgeApiUrl.trim().length > 0 + ? `${ENV.forgeApiUrl.replace(/\/$/, "")}/v1/chat/completions` + : "https://forge.manus.im/v1/chat/completions"; + +const assertApiKey = () => { + if (!ENV.forgeApiKey) { + throw new Error("OPENAI_API_KEY is not configured"); + } +}; + +const normalizeResponseFormat = ({ + responseFormat, + response_format, + outputSchema, + output_schema, +}: { + responseFormat?: ResponseFormat; + response_format?: ResponseFormat; + outputSchema?: OutputSchema; + output_schema?: OutputSchema; +}): + | { type: "json_schema"; json_schema: JsonSchema } + | { type: "text" } + | { type: "json_object" } + | undefined => { + const explicitFormat = responseFormat || response_format; + if (explicitFormat) { + if ( + explicitFormat.type === "json_schema" && + !explicitFormat.json_schema?.schema + ) { + throw new Error( + "responseFormat json_schema requires a defined schema object" + ); + } + return explicitFormat; + } + + const schema = outputSchema || output_schema; + if (!schema) return undefined; + + if (!schema.name || !schema.schema) { + throw new Error("outputSchema requires both name and schema"); + } + + return { + type: "json_schema", + json_schema: { + name: schema.name, + schema: schema.schema, + ...(typeof schema.strict === "boolean" ? { strict: schema.strict } : {}), + }, + }; +}; + +export async function invokeLLM(params: InvokeParams): Promise { + assertApiKey(); + + const { + messages, + tools, + toolChoice, + tool_choice, + outputSchema, + output_schema, + responseFormat, + response_format, + } = params; + + const payload: Record = { + model: "gemini-2.5-flash", + messages: messages.map(normalizeMessage), + }; + + if (tools && tools.length > 0) { + payload.tools = tools; + } + + const normalizedToolChoice = normalizeToolChoice( + toolChoice || tool_choice, + tools + ); + if (normalizedToolChoice) { + payload.tool_choice = normalizedToolChoice; + } + + payload.max_tokens = 32768 + payload.thinking = { + "budget_tokens": 128 + } + + const normalizedResponseFormat = normalizeResponseFormat({ + responseFormat, + response_format, + outputSchema, + output_schema, + }); + + if (normalizedResponseFormat) { + payload.response_format = normalizedResponseFormat; + } + + const response = await fetch(resolveApiUrl(), { + method: "POST", + headers: { + "content-type": "application/json", + authorization: `Bearer ${ENV.forgeApiKey}`, + }, + body: JSON.stringify(payload), + }); + + if (!response.ok) { + const errorText = await response.text(); + throw new Error( + `LLM invoke failed: ${response.status} ${response.statusText} – ${errorText}` + ); + } + + return (await response.json()) as InvokeResult; +} diff --git a/deployment-package/source_server/_core/localAuth.ts b/deployment-package/source_server/_core/localAuth.ts new file mode 100644 index 0000000..b020893 --- /dev/null +++ b/deployment-package/source_server/_core/localAuth.ts @@ -0,0 +1,102 @@ +import { Router } from "express"; +import bcrypt from "bcryptjs"; +import { getDb } from "../db"; +import { users } from "../../drizzle/schema"; +import { eq } from "drizzle-orm"; +import { COOKIE_NAME } from "@shared/const"; +import { getSessionCookieOptions } from "./cookies"; +import { sdk } from "./sdk"; + +const router = Router(); + +/** + * Route d'authentification locale avec username/password + * POST /api/auth/local/login + * Body: { username: string, password: string } + */ +router.post("/login", async (req, res) => { + try { + const { username, password } = req.body; + + // Validation des champs + if (!username || !password) { + return res.status(400).json({ + success: false, + message: "Identifiant et mot de passe requis", + }); + } + + // Récupérer l'utilisateur par username + const db = await getDb(); + if (!db) { + return res.status(500).json({ + success: false, + message: "Erreur de connexion à la base de données", + }); + } + + const result = await db + .select() + .from(users) + .where(eq(users.username, username)) + .limit(1); + + if (result.length === 0) { + return res.status(401).json({ + success: false, + message: "Identifiant ou mot de passe incorrect", + }); + } + + const user = result[0]; + + // Vérifier que l'utilisateur a un mot de passe défini + if (!user.password) { + return res.status(401).json({ + success: false, + message: "Cet utilisateur n'a pas de mot de passe défini", + }); + } + + // Comparer le mot de passe + const isPasswordValid = await bcrypt.compare(password, user.password); + + if (!isPasswordValid) { + return res.status(401).json({ + success: false, + message: "Identifiant ou mot de passe incorrect", + }); + } + + // Mettre à jour la date de dernière connexion + await db + .update(users) + .set({ lastSignedIn: new Date() }) + .where(eq(users.id, user.id)); + + // Créer le token de session (compatible avec le système OAuth) + const token = await sdk.createSessionToken(user.openId, { + name: user.name || "", + expiresInMs: 7 * 24 * 60 * 60 * 1000, // 7 jours + }); + + // Définir le cookie de session + const cookieOptions = getSessionCookieOptions(req); + res.cookie(COOKIE_NAME, token, cookieOptions); + + // Retourner l'utilisateur (sans le mot de passe) + const { password: _, ...userWithoutPassword } = user; + return res.json({ + success: true, + user: userWithoutPassword, + }); + } catch (error) { + console.error("[LocalAuth] Error during login:", error); + return res.status(500).json({ + success: false, + message: "Erreur lors de la connexion", + }); + } +}); + +export default router; diff --git a/deployment-package/source_server/_core/map.ts b/deployment-package/source_server/_core/map.ts new file mode 100644 index 0000000..ac2c28c --- /dev/null +++ b/deployment-package/source_server/_core/map.ts @@ -0,0 +1,319 @@ +/** + * Google Maps API Integration for Manus WebDev Templates + * + * Main function: makeRequest(endpoint, params) - Makes authenticated requests to Google Maps APIs + * All credentials are automatically injected. Array parameters use | as separator. + * + * See API examples below the type definitions for usage patterns. + */ + +import { ENV } from "./env"; + +// ============================================================================ +// Configuration +// ============================================================================ + +type MapsConfig = { + baseUrl: string; + apiKey: string; +}; + +function getMapsConfig(): MapsConfig { + const baseUrl = ENV.forgeApiUrl; + const apiKey = ENV.forgeApiKey; + + if (!baseUrl || !apiKey) { + throw new Error( + "Google Maps proxy credentials missing: set BUILT_IN_FORGE_API_URL and BUILT_IN_FORGE_API_KEY" + ); + } + + return { + baseUrl: baseUrl.replace(/\/+$/, ""), + apiKey, + }; +} + +// ============================================================================ +// Core Request Handler +// ============================================================================ + +interface RequestOptions { + method?: "GET" | "POST"; + body?: Record; +} + +/** + * Make authenticated requests to Google Maps APIs + * + * @param endpoint - The API endpoint (e.g., "/maps/api/geocode/json") + * @param params - Query parameters for the request + * @param options - Additional request options + * @returns The API response + */ +export async function makeRequest( + endpoint: string, + params: Record = {}, + options: RequestOptions = {} +): Promise { + const { baseUrl, apiKey } = getMapsConfig(); + + // Construct full URL: baseUrl + /v1/maps/proxy + endpoint + const url = new URL(`${baseUrl}/v1/maps/proxy${endpoint}`); + + // Add API key as query parameter (standard Google Maps API authentication) + url.searchParams.append("key", apiKey); + + // Add other query parameters + Object.entries(params).forEach(([key, value]) => { + if (value !== undefined && value !== null) { + url.searchParams.append(key, String(value)); + } + }); + + const response = await fetch(url.toString(), { + method: options.method || "GET", + headers: { + "Content-Type": "application/json", + }, + body: options.body ? JSON.stringify(options.body) : undefined, + }); + + if (!response.ok) { + const errorText = await response.text(); + throw new Error( + `Google Maps API request failed (${response.status} ${response.statusText}): ${errorText}` + ); + } + + return (await response.json()) as T; +} + +// ============================================================================ +// Type Definitions +// ============================================================================ + +export type TravelMode = "driving" | "walking" | "bicycling" | "transit"; +export type MapType = "roadmap" | "satellite" | "terrain" | "hybrid"; +export type SpeedUnit = "KPH" | "MPH"; + +export type LatLng = { + lat: number; + lng: number; +}; + +export type DirectionsResult = { + routes: Array<{ + legs: Array<{ + distance: { text: string; value: number }; + duration: { text: string; value: number }; + start_address: string; + end_address: string; + start_location: LatLng; + end_location: LatLng; + steps: Array<{ + distance: { text: string; value: number }; + duration: { text: string; value: number }; + html_instructions: string; + travel_mode: string; + start_location: LatLng; + end_location: LatLng; + }>; + }>; + overview_polyline: { points: string }; + summary: string; + warnings: string[]; + waypoint_order: number[]; + }>; + status: string; +}; + +export type DistanceMatrixResult = { + rows: Array<{ + elements: Array<{ + distance: { text: string; value: number }; + duration: { text: string; value: number }; + status: string; + }>; + }>; + origin_addresses: string[]; + destination_addresses: string[]; + status: string; +}; + +export type GeocodingResult = { + results: Array<{ + address_components: Array<{ + long_name: string; + short_name: string; + types: string[]; + }>; + formatted_address: string; + geometry: { + location: LatLng; + location_type: string; + viewport: { + northeast: LatLng; + southwest: LatLng; + }; + }; + place_id: string; + types: string[]; + }>; + status: string; +}; + +export type PlacesSearchResult = { + results: Array<{ + place_id: string; + name: string; + formatted_address: string; + geometry: { + location: LatLng; + }; + rating?: number; + user_ratings_total?: number; + business_status?: string; + types: string[]; + }>; + status: string; +}; + +export type PlaceDetailsResult = { + result: { + place_id: string; + name: string; + formatted_address: string; + formatted_phone_number?: string; + international_phone_number?: string; + website?: string; + rating?: number; + user_ratings_total?: number; + reviews?: Array<{ + author_name: string; + rating: number; + text: string; + time: number; + }>; + opening_hours?: { + open_now: boolean; + weekday_text: string[]; + }; + geometry: { + location: LatLng; + }; + }; + status: string; +}; + +export type ElevationResult = { + results: Array<{ + elevation: number; + location: LatLng; + resolution: number; + }>; + status: string; +}; + +export type TimeZoneResult = { + dstOffset: number; + rawOffset: number; + status: string; + timeZoneId: string; + timeZoneName: string; +}; + +export type RoadsResult = { + snappedPoints: Array<{ + location: LatLng; + originalIndex?: number; + placeId: string; + }>; +}; + +// ============================================================================ +// Google Maps API Reference +// ============================================================================ + +/** + * GEOCODING - Convert between addresses and coordinates + * Endpoint: /maps/api/geocode/json + * Input: { address: string } OR { latlng: string } // latlng: "37.42,-122.08" + * Output: GeocodingResult // results[0].geometry.location, results[0].formatted_address + */ + +/** + * DIRECTIONS - Get navigation routes between locations + * Endpoint: /maps/api/directions/json + * Input: { origin: string, destination: string, mode?: TravelMode, waypoints?: string, alternatives?: boolean } + * Output: DirectionsResult // routes[0].legs[0].distance, duration, steps + */ + +/** + * DISTANCE MATRIX - Calculate travel times/distances for multiple origin-destination pairs + * Endpoint: /maps/api/distancematrix/json + * Input: { origins: string, destinations: string, mode?: TravelMode, units?: "metric"|"imperial" } // origins: "NYC|Boston" + * Output: DistanceMatrixResult // rows[0].elements[1] = first origin to second destination + */ + +/** + * PLACE SEARCH - Find businesses/POIs by text query + * Endpoint: /maps/api/place/textsearch/json + * Input: { query: string, location?: string, radius?: number, type?: string } // location: "40.7,-74.0" + * Output: PlacesSearchResult // results[].name, rating, geometry.location, place_id + */ + +/** + * NEARBY SEARCH - Find places near a specific location + * Endpoint: /maps/api/place/nearbysearch/json + * Input: { location: string, radius: number, type?: string, keyword?: string } // location: "40.7,-74.0" + * Output: PlacesSearchResult + */ + +/** + * PLACE DETAILS - Get comprehensive information about a specific place + * Endpoint: /maps/api/place/details/json + * Input: { place_id: string, fields?: string } // fields: "name,rating,opening_hours,website" + * Output: PlaceDetailsResult // result.name, rating, opening_hours, etc. + */ + +/** + * ELEVATION - Get altitude data for geographic points + * Endpoint: /maps/api/elevation/json + * Input: { locations?: string, path?: string, samples?: number } // locations: "39.73,-104.98|36.45,-116.86" + * Output: ElevationResult // results[].elevation (meters) + */ + +/** + * TIME ZONE - Get timezone information for a location + * Endpoint: /maps/api/timezone/json + * Input: { location: string, timestamp: number } // timestamp: Math.floor(Date.now()/1000) + * Output: TimeZoneResult // timeZoneId, timeZoneName + */ + +/** + * ROADS - Snap GPS traces to roads, find nearest roads, get speed limits + * - /v1/snapToRoads: Input: { path: string, interpolate?: boolean } // path: "lat,lng|lat,lng" + * - /v1/nearestRoads: Input: { points: string } // points: "lat,lng|lat,lng" + * - /v1/speedLimits: Input: { path: string, units?: SpeedUnit } + * Output: RoadsResult + */ + +/** + * PLACE AUTOCOMPLETE - Real-time place suggestions as user types + * Endpoint: /maps/api/place/autocomplete/json + * Input: { input: string, location?: string, radius?: number } + * Output: { predictions: Array<{ description: string, place_id: string }> } + */ + +/** + * STATIC MAPS - Generate map images as URLs (for emails, reports, tags) + * Endpoint: /maps/api/staticmap + * Input: URL params - center: string, zoom: number, size: string, markers?: string, maptype?: MapType + * Output: Image URL (not JSON) - use directly in + * Note: Construct URL manually with getMapsConfig() for auth + */ + + + + diff --git a/deployment-package/source_server/_core/notification.ts b/deployment-package/source_server/_core/notification.ts new file mode 100644 index 0000000..889a573 --- /dev/null +++ b/deployment-package/source_server/_core/notification.ts @@ -0,0 +1,114 @@ +import { TRPCError } from "@trpc/server"; +import { ENV } from "./env"; + +export type NotificationPayload = { + title: string; + content: string; +}; + +const TITLE_MAX_LENGTH = 1200; +const CONTENT_MAX_LENGTH = 20000; + +const trimValue = (value: string): string => value.trim(); +const isNonEmptyString = (value: unknown): value is string => + typeof value === "string" && value.trim().length > 0; + +const buildEndpointUrl = (baseUrl: string): string => { + const normalizedBase = baseUrl.endsWith("/") + ? baseUrl + : `${baseUrl}/`; + return new URL( + "webdevtoken.v1.WebDevService/SendNotification", + normalizedBase + ).toString(); +}; + +const validatePayload = (input: NotificationPayload): NotificationPayload => { + if (!isNonEmptyString(input.title)) { + throw new TRPCError({ + code: "BAD_REQUEST", + message: "Notification title is required.", + }); + } + if (!isNonEmptyString(input.content)) { + throw new TRPCError({ + code: "BAD_REQUEST", + message: "Notification content is required.", + }); + } + + const title = trimValue(input.title); + const content = trimValue(input.content); + + if (title.length > TITLE_MAX_LENGTH) { + throw new TRPCError({ + code: "BAD_REQUEST", + message: `Notification title must be at most ${TITLE_MAX_LENGTH} characters.`, + }); + } + + if (content.length > CONTENT_MAX_LENGTH) { + throw new TRPCError({ + code: "BAD_REQUEST", + message: `Notification content must be at most ${CONTENT_MAX_LENGTH} characters.`, + }); + } + + return { title, content }; +}; + +/** + * Dispatches a project-owner notification through the Manus Notification Service. + * Returns `true` if the request was accepted, `false` when the upstream service + * cannot be reached (callers can fall back to email/slack). Validation errors + * bubble up as TRPC errors so callers can fix the payload. + */ +export async function notifyOwner( + payload: NotificationPayload +): Promise { + const { title, content } = validatePayload(payload); + + if (!ENV.forgeApiUrl) { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: "Notification service URL is not configured.", + }); + } + + if (!ENV.forgeApiKey) { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: "Notification service API key is not configured.", + }); + } + + const endpoint = buildEndpointUrl(ENV.forgeApiUrl); + + try { + const response = await fetch(endpoint, { + method: "POST", + headers: { + accept: "application/json", + authorization: `Bearer ${ENV.forgeApiKey}`, + "content-type": "application/json", + "connect-protocol-version": "1", + }, + body: JSON.stringify({ title, content }), + }); + + if (!response.ok) { + const detail = await response.text().catch(() => ""); + console.warn( + `[Notification] Failed to notify owner (${response.status} ${response.statusText})${ + detail ? `: ${detail}` : "" + }` + ); + return false; + } + + return true; + } catch (error) { + console.warn("[Notification] Error calling notification service:", error); + return false; + } +} diff --git a/deployment-package/source_server/_core/oauth.ts b/deployment-package/source_server/_core/oauth.ts new file mode 100644 index 0000000..fd45373 --- /dev/null +++ b/deployment-package/source_server/_core/oauth.ts @@ -0,0 +1,53 @@ +import { COOKIE_NAME, ONE_YEAR_MS } from "@shared/const"; +import type { Express, Request, Response } from "express"; +import * as db from "../db"; +import { getSessionCookieOptions } from "./cookies"; +import { sdk } from "./sdk"; + +function getQueryParam(req: Request, key: string): string | undefined { + const value = req.query[key]; + return typeof value === "string" ? value : undefined; +} + +export function registerOAuthRoutes(app: Express) { + app.get("/api/oauth/callback", async (req: Request, res: Response) => { + const code = getQueryParam(req, "code"); + const state = getQueryParam(req, "state"); + + if (!code || !state) { + res.status(400).json({ error: "code and state are required" }); + return; + } + + try { + const tokenResponse = await sdk.exchangeCodeForToken(code, state); + const userInfo = await sdk.getUserInfo(tokenResponse.accessToken); + + if (!userInfo.openId) { + res.status(400).json({ error: "openId missing from user info" }); + return; + } + + await db.upsertUser({ + openId: userInfo.openId, + name: userInfo.name || null, + email: userInfo.email ?? null, + loginMethod: userInfo.loginMethod ?? userInfo.platform ?? null, + lastSignedIn: new Date(), + }); + + const sessionToken = await sdk.createSessionToken(userInfo.openId, { + name: userInfo.name || "", + expiresInMs: ONE_YEAR_MS, + }); + + const cookieOptions = getSessionCookieOptions(req); + res.cookie(COOKIE_NAME, sessionToken, { ...cookieOptions, maxAge: ONE_YEAR_MS }); + + res.redirect(302, "/"); + } catch (error) { + console.error("[OAuth] Callback failed", error); + res.status(500).json({ error: "OAuth callback failed" }); + } + }); +} diff --git a/deployment-package/source_server/_core/sdk.ts b/deployment-package/source_server/_core/sdk.ts new file mode 100644 index 0000000..956239b --- /dev/null +++ b/deployment-package/source_server/_core/sdk.ts @@ -0,0 +1,330 @@ +import { AXIOS_TIMEOUT_MS, COOKIE_NAME, ONE_YEAR_MS } from "@shared/const"; +import { ForbiddenError } from "@shared/_core/errors"; +import axios, { type AxiosInstance } from "axios"; +import { parse as parseCookieHeader } from "cookie"; +import type { Request } from "express"; +import { SignJWT, jwtVerify } from "jose"; +import type { User } from "../../drizzle/schema"; +import * as db from "../db"; +import { ENV } from "./env"; +import type { + ExchangeTokenRequest, + ExchangeTokenResponse, + GetUserInfoResponse, + GetUserInfoWithJwtRequest, + GetUserInfoWithJwtResponse, +} from "./types/manusTypes"; +// Utility function +const isNonEmptyString = (value: unknown): value is string => + typeof value === "string" && value.length > 0; + +export type SessionPayload = { + openId: string; + appId: string; + name: string; +}; + +const EXCHANGE_TOKEN_PATH = `/webdev.v1.WebDevAuthPublicService/ExchangeToken`; +const GET_USER_INFO_PATH = `/webdev.v1.WebDevAuthPublicService/GetUserInfo`; +const GET_USER_INFO_WITH_JWT_PATH = `/webdev.v1.WebDevAuthPublicService/GetUserInfoWithJwt`; + +class OAuthService { + constructor(private client: ReturnType) { + console.log("[OAuth] Initialized with baseURL:", ENV.oAuthServerUrl); + if (!ENV.oAuthServerUrl) { + console.error( + "[OAuth] ERROR: OAUTH_SERVER_URL is not configured! Set OAUTH_SERVER_URL environment variable." + ); + } + } + + private decodeState(state: string): string { + const redirectUri = atob(state); + return redirectUri; + } + + async getTokenByCode( + code: string, + state: string + ): Promise { + const payload: ExchangeTokenRequest = { + clientId: ENV.appId, + grantType: "authorization_code", + code, + redirectUri: this.decodeState(state), + }; + + const { data } = await this.client.post( + EXCHANGE_TOKEN_PATH, + payload + ); + + return data; + } + + async getUserInfoByToken( + token: ExchangeTokenResponse + ): Promise { + const { data } = await this.client.post( + GET_USER_INFO_PATH, + { + accessToken: token.accessToken, + } + ); + + return data; + } +} + +const createOAuthHttpClient = (): AxiosInstance => + axios.create({ + baseURL: ENV.oAuthServerUrl, + timeout: AXIOS_TIMEOUT_MS, + }); + +class SDKServer { + private readonly client: AxiosInstance; + private readonly oauthService: OAuthService; + + constructor(client: AxiosInstance = createOAuthHttpClient()) { + this.client = client; + this.oauthService = new OAuthService(this.client); + } + + private deriveLoginMethod( + platforms: unknown, + fallback: string | null | undefined + ): string | null { + if (fallback && fallback.length > 0) return fallback; + if (!Array.isArray(platforms) || platforms.length === 0) return null; + const set = new Set( + platforms.filter((p): p is string => typeof p === "string") + ); + if (set.has("REGISTERED_PLATFORM_EMAIL")) return "email"; + if (set.has("REGISTERED_PLATFORM_GOOGLE")) return "google"; + if (set.has("REGISTERED_PLATFORM_APPLE")) return "apple"; + if ( + set.has("REGISTERED_PLATFORM_MICROSOFT") || + set.has("REGISTERED_PLATFORM_AZURE") + ) + return "microsoft"; + if (set.has("REGISTERED_PLATFORM_GITHUB")) return "github"; + const first = Array.from(set)[0]; + return first ? first.toLowerCase() : null; + } + + /** + * Exchange OAuth authorization code for access token + * @example + * const tokenResponse = await sdk.exchangeCodeForToken(code, state); + */ + async exchangeCodeForToken( + code: string, + state: string + ): Promise { + return this.oauthService.getTokenByCode(code, state); + } + + /** + * Get user information using access token + * @example + * const userInfo = await sdk.getUserInfo(tokenResponse.accessToken); + */ + async getUserInfo(accessToken: string): Promise { + const data = await this.oauthService.getUserInfoByToken({ + accessToken, + } as ExchangeTokenResponse); + const loginMethod = this.deriveLoginMethod( + (data as any)?.platforms, + (data as any)?.platform ?? data.platform ?? null + ); + return { + ...(data as any), + platform: loginMethod, + loginMethod, + } as GetUserInfoResponse; + } + + private parseCookies(cookieHeader: string | undefined) { + if (!cookieHeader) { + return new Map(); + } + + const parsed = parseCookieHeader(cookieHeader); + return new Map(Object.entries(parsed)); + } + + private getSessionSecret() { + const secret = ENV.cookieSecret; + return new TextEncoder().encode(secret); + } + + /** + * Create a session token for a Manus user openId + * @example + * const sessionToken = await sdk.createSessionToken(userInfo.openId); + */ + async createSessionToken( + openId: string, + options: { expiresInMs?: number; name?: string } = {} + ): Promise { + return this.signSession( + { + openId, + appId: ENV.appId, + name: options.name || "", + }, + options + ); + } + + async signSession( + payload: SessionPayload, + options: { expiresInMs?: number } = {} + ): Promise { + const issuedAt = Date.now(); + const expiresInMs = options.expiresInMs ?? ONE_YEAR_MS; + const expirationSeconds = Math.floor((issuedAt + expiresInMs) / 1000); + const secretKey = this.getSessionSecret(); + + return new SignJWT({ + openId: payload.openId, + appId: payload.appId, + name: payload.name, + }) + .setProtectedHeader({ alg: "HS256", typ: "JWT" }) + .setExpirationTime(expirationSeconds) + .sign(secretKey); + } + + async verifySession( + cookieValue: string | undefined | null + ): Promise<{ openId: string; appId: string; name: string } | null> { + if (!cookieValue) { + console.warn("[Auth] Missing session cookie"); + return null; + } + + try { + const secretKey = this.getSessionSecret(); + const { payload } = await jwtVerify(cookieValue, secretKey, { + algorithms: ["HS256"], + }); + const { openId, appId, name } = payload as Record; + + if ( + !isNonEmptyString(openId) || + !isNonEmptyString(appId) || + !isNonEmptyString(name) + ) { + console.warn("[Auth] Session payload missing required fields"); + return null; + } + + return { + openId, + appId, + name, + }; + } catch (error) { + console.warn("[Auth] Session verification failed", String(error)); + return null; + } + } + + async getUserInfoWithJwt( + jwtToken: string + ): Promise { + const payload: GetUserInfoWithJwtRequest = { + jwtToken, + projectId: ENV.appId, + }; + + const { data } = await this.client.post( + GET_USER_INFO_WITH_JWT_PATH, + payload + ); + + const loginMethod = this.deriveLoginMethod( + (data as any)?.platforms, + (data as any)?.platform ?? data.platform ?? null + ); + return { + ...(data as any), + platform: loginMethod, + loginMethod, + } as GetUserInfoWithJwtResponse; + } + + async authenticateRequest(req: Request): Promise { + // Regular authentication flow + const cookies = this.parseCookies(req.headers.cookie); + const sessionCookie = cookies.get(COOKIE_NAME); + + // Try to verify as local JWT first + let session: { openId: string; appId?: string; name: string } | null = null; + let isLocalAuth = false; + + if (sessionCookie) { + try { + const secretKey = this.getSessionSecret(); + const { payload } = await jwtVerify(sessionCookie, secretKey, { + algorithms: ["HS256"], + }); + const { openId, name, appId } = payload as Record; + + // Check if it's a local JWT (has openId but may not have appId) + if (isNonEmptyString(openId) && isNonEmptyString(name)) { + session = { openId, name, appId: appId as string | undefined }; + isLocalAuth = !appId; // Local auth doesn't have appId + } + } catch (error) { + console.warn("[Auth] JWT verification failed:", error); + } + } + + // If local JWT verification failed, try OAuth session + if (!session) { + session = await this.verifySession(sessionCookie); + } + + if (!session) { + throw ForbiddenError("Invalid session cookie"); + } + + const sessionUserId = session.openId; + const signedInAt = new Date(); + let user = await db.getUserByOpenId(sessionUserId); + + // If user not in DB, sync from OAuth server automatically (only for OAuth sessions) + if (!user && !isLocalAuth) { + try { + const userInfo = await this.getUserInfoWithJwt(sessionCookie ?? ""); + await db.upsertUser({ + openId: userInfo.openId, + name: userInfo.name || null, + email: userInfo.email ?? null, + loginMethod: userInfo.loginMethod ?? userInfo.platform ?? null, + lastSignedIn: signedInAt, + }); + user = await db.getUserByOpenId(userInfo.openId); + } catch (error) { + console.error("[Auth] Failed to sync user from OAuth:", error); + throw ForbiddenError("Failed to sync user info"); + } + } + + if (!user) { + throw ForbiddenError("User not found"); + } + + await db.upsertUser({ + openId: user.openId, + lastSignedIn: signedInAt, + }); + + return user; + } +} + +export const sdk = new SDKServer(); diff --git a/deployment-package/source_server/_core/smtpSender.ts b/deployment-package/source_server/_core/smtpSender.ts new file mode 100644 index 0000000..64c0b30 --- /dev/null +++ b/deployment-package/source_server/_core/smtpSender.ts @@ -0,0 +1,103 @@ +/** + * Service d'envoi d'emails via SMTP avec nodemailer + */ + +import nodemailer from 'nodemailer'; +import type { Transporter } from 'nodemailer'; + +interface EmailParams { + to: string; + subject: string; + html: string; + attachments?: Array<{ + filename: string; + content: string; + contentType: string; + }>; +} + +interface SMTPConfig { + host: string; + port: number; + secure: 'none' | 'tls' | 'ssl'; + user: string; + password: string; + fromEmail: string; + fromName: string; +} + +/** + * Crée un transporteur nodemailer à partir de la configuration SMTP + */ +function createTransporter(config: SMTPConfig): Transporter { + const secure = config.secure === 'ssl'; // true pour SSL (port 465), false pour TLS/STARTTLS + + return nodemailer.createTransport({ + host: config.host, + port: config.port, + secure: secure, + auth: { + user: config.user, + pass: config.password, + }, + // Options supplémentaires pour améliorer la compatibilité + tls: { + // Ne pas échouer sur les certificats invalides (à utiliser avec précaution en production) + rejectUnauthorized: false, + }, + }); +} + +/** + * Envoie un email via SMTP + */ +export async function sendViaSMTP(params: EmailParams, config: SMTPConfig): Promise { + try { + const transporter = createTransporter(config); + + // Préparer les pièces jointes + const attachments = params.attachments?.map(att => ({ + filename: att.filename, + content: att.content, + contentType: att.contentType, + })); + + // Envoyer l'email + const info = await transporter.sendMail({ + from: `${config.fromName} <${config.fromEmail}>`, + to: params.to, + subject: params.subject, + html: params.html, + attachments: attachments, + }); + + console.log('[Email] Email envoyé via SMTP:', info.messageId); + return true; + } catch (error) { + console.error('[Email] Erreur lors de l\'envoi via SMTP:', error); + return false; + } +} + +/** + * Teste la connexion SMTP + */ +export async function testSMTPConnection(config: SMTPConfig): Promise<{ success: boolean; message: string }> { + try { + const transporter = createTransporter(config); + + // Vérifier la connexion + await transporter.verify(); + + return { + success: true, + message: 'Connexion SMTP réussie', + }; + } catch (error) { + console.error('[Email] Erreur de connexion SMTP:', error); + return { + success: false, + message: error instanceof Error ? error.message : 'Erreur de connexion SMTP', + }; + } +} diff --git a/deployment-package/source_server/_core/systemRouter.ts b/deployment-package/source_server/_core/systemRouter.ts new file mode 100644 index 0000000..babf6a4 --- /dev/null +++ b/deployment-package/source_server/_core/systemRouter.ts @@ -0,0 +1,29 @@ +import { z } from "zod"; +import { notifyOwner } from "./notification"; +import { adminProcedure, publicProcedure, router } from "./trpc"; + +export const systemRouter = router({ + health: publicProcedure + .input( + z.object({ + timestamp: z.number().min(0, "timestamp cannot be negative"), + }) + ) + .query(() => ({ + ok: true, + })), + + notifyOwner: adminProcedure + .input( + z.object({ + title: z.string().min(1, "title is required"), + content: z.string().min(1, "content is required"), + }) + ) + .mutation(async ({ input }) => { + const delivered = await notifyOwner(input); + return { + success: delivered, + } as const; + }), +}); diff --git a/deployment-package/source_server/_core/trpc.ts b/deployment-package/source_server/_core/trpc.ts new file mode 100644 index 0000000..a0bcc05 --- /dev/null +++ b/deployment-package/source_server/_core/trpc.ts @@ -0,0 +1,45 @@ +import { NOT_ADMIN_ERR_MSG, UNAUTHED_ERR_MSG } from '@shared/const'; +import { initTRPC, TRPCError } from "@trpc/server"; +import superjson from "superjson"; +import type { TrpcContext } from "./context"; + +const t = initTRPC.context().create({ + transformer: superjson, +}); + +export const router = t.router; +export const publicProcedure = t.procedure; + +const requireUser = t.middleware(async opts => { + const { ctx, next } = opts; + + if (!ctx.user) { + throw new TRPCError({ code: "UNAUTHORIZED", message: UNAUTHED_ERR_MSG }); + } + + return next({ + ctx: { + ...ctx, + user: ctx.user, + }, + }); +}); + +export const protectedProcedure = t.procedure.use(requireUser); + +export const adminProcedure = t.procedure.use( + t.middleware(async opts => { + const { ctx, next } = opts; + + if (!ctx.user || ctx.user.role !== 'admin') { + throw new TRPCError({ code: "FORBIDDEN", message: NOT_ADMIN_ERR_MSG }); + } + + return next({ + ctx: { + ...ctx, + user: ctx.user, + }, + }); + }), +); diff --git a/deployment-package/source_server/_core/types/cookie.d.ts b/deployment-package/source_server/_core/types/cookie.d.ts new file mode 100644 index 0000000..d6d4e88 --- /dev/null +++ b/deployment-package/source_server/_core/types/cookie.d.ts @@ -0,0 +1,6 @@ +declare module "cookie" { + export function parse( + str: string, + options?: Record + ): Record; +} diff --git a/deployment-package/source_server/_core/types/manusTypes.ts b/deployment-package/source_server/_core/types/manusTypes.ts new file mode 100644 index 0000000..89a3819 --- /dev/null +++ b/deployment-package/source_server/_core/types/manusTypes.ts @@ -0,0 +1,69 @@ +// WebDev Auth TypeScript types +// Auto-generated from protobuf definitions +// Generated on: 2025-09-24T05:57:57.338Z + +export interface AuthorizeRequest { + redirectUri: string; + projectId: string; + state: string; + responseType: string; + scope: string; +} + +export interface AuthorizeResponse { + redirectUrl: string; +} + +export interface ExchangeTokenRequest { + grantType: string; + code: string; + refreshToken?: string; + clientId: string; + clientSecret?: string; + redirectUri: string; +} + +export interface ExchangeTokenResponse { + accessToken: string; + tokenType: string; + expiresIn: number; + refreshToken?: string; + scope: string; + idToken: string; +} + +export interface GetUserInfoRequest { + accessToken: string; +} + +export interface GetUserInfoResponse { + openId: string; + projectId: string; + name: string; + email?: string | null; + platform?: string | null; + loginMethod?: string | null; +} + +export interface CanAccessRequest { + openId: string; + projectId: string; +} + +export interface CanAccessResponse { + canAccess: boolean; +} + +export interface GetUserInfoWithJwtRequest { + jwtToken: string; + projectId: string; +} + +export interface GetUserInfoWithJwtResponse { + openId: string; + projectId: string; + name: string; + email?: string | null; + platform?: string | null; + loginMethod?: string | null; +} diff --git a/deployment-package/source_server/_core/uploadFile.ts b/deployment-package/source_server/_core/uploadFile.ts new file mode 100644 index 0000000..af6351a --- /dev/null +++ b/deployment-package/source_server/_core/uploadFile.ts @@ -0,0 +1,67 @@ +import { Router } from "express"; +import multer from "multer"; +import { storagePut } from "../storage"; +import { randomBytes } from "crypto"; +import path from "path"; + +const router = Router(); + +// Configuration de multer pour gérer les uploads en mémoire +const upload = multer({ + storage: multer.memoryStorage(), + limits: { + fileSize: 10 * 1024 * 1024, // 10MB max + }, +}); + +/** + * Route d'upload de fichiers vers S3 + * POST /api/upload-file + * Body: multipart/form-data avec un champ "file" + */ +router.post("/", upload.single("file"), async (req, res) => { + try { + if (!req.file) { + return res.status(400).json({ + success: false, + message: "Aucun fichier fourni", + }); + } + + const file = req.file; + + // Générer un nom de fichier unique + const randomSuffix = randomBytes(8).toString("hex"); + const ext = path.extname(file.originalname); + const baseName = path.basename(file.originalname, ext); + const safeBaseName = baseName.replace(/[^a-zA-Z0-9-_]/g, "_"); + const fileName = `rappels-attachments/${Date.now()}-${randomSuffix}-${safeBaseName}${ext}`; + + // Upload vers S3 + const result = await storagePut( + fileName, + file.buffer, + file.mimetype + ); + + console.log(`[UploadFile] Fichier uploadé: ${file.originalname} (${file.size} octets)`); + + return res.json({ + success: true, + url: result.url, + key: fileName, + filename: file.originalname, + mimetype: file.mimetype, + size: file.size, + message: "Fichier uploadé avec succès", + }); + } catch (error) { + console.error("[UploadFile] Error:", error); + return res.status(500).json({ + success: false, + message: "Erreur lors de l'upload du fichier", + }); + } +}); + +export default router; diff --git a/deployment-package/source_server/_core/uploadImage.ts b/deployment-package/source_server/_core/uploadImage.ts new file mode 100644 index 0000000..78f0c01 --- /dev/null +++ b/deployment-package/source_server/_core/uploadImage.ts @@ -0,0 +1,67 @@ +import { Router } from "express"; +import multer from "multer"; +import { storagePut } from "../storage"; +import { randomBytes } from "crypto"; + +const router = Router(); + +// Configuration de multer pour gérer les uploads en mémoire +const upload = multer({ + storage: multer.memoryStorage(), + limits: { + fileSize: 5 * 1024 * 1024, // 5MB max + }, + fileFilter: (req, file, cb) => { + // Vérifier que c'est bien une image + if (file.mimetype.startsWith("image/")) { + cb(null, true); + } else { + cb(new Error("Le fichier doit être une image")); + } + }, +}); + +/** + * Route d'upload d'images vers S3 + * POST /api/upload-image + * Body: multipart/form-data avec un champ "file" + */ +router.post("/", upload.single("file"), async (req, res) => { + try { + if (!req.file) { + return res.status(400).json({ + success: false, + message: "Aucun fichier fourni", + }); + } + + const file = req.file; + + // Générer un nom de fichier unique + const randomSuffix = randomBytes(8).toString("hex"); + const extension = file.originalname.split(".").pop() || "jpg"; + const fileName = `attestations/${Date.now()}-${randomSuffix}.${extension}`; + + // Upload vers S3 + const result = await storagePut( + fileName, + file.buffer, + file.mimetype + ); + + return res.json({ + success: true, + url: result.url, + s3Key: fileName, + message: "Image uploadée avec succès", + }); + } catch (error) { + console.error("[UploadImage] Error:", error); + return res.status(500).json({ + success: false, + message: "Erreur lors de l'upload de l'image", + }); + } +}); + +export default router; diff --git a/deployment-package/source_server/_core/vite.ts b/deployment-package/source_server/_core/vite.ts new file mode 100644 index 0000000..86d07f6 --- /dev/null +++ b/deployment-package/source_server/_core/vite.ts @@ -0,0 +1,67 @@ +import express, { type Express } from "express"; +import fs from "fs"; +import { type Server } from "http"; +import { nanoid } from "nanoid"; +import path from "path"; +import { createServer as createViteServer } from "vite"; +import viteConfig from "../../vite.config"; + +export async function setupVite(app: Express, server: Server) { + const serverOptions = { + middlewareMode: true, + hmr: { server }, + allowedHosts: true as const, + }; + + const vite = await createViteServer({ + ...viteConfig, + configFile: false, + server: serverOptions, + appType: "custom", + }); + + app.use(vite.middlewares); + app.use("*", async (req, res, next) => { + const url = req.originalUrl; + + try { + const clientTemplate = path.resolve( + import.meta.dirname, + "../..", + "client", + "index.html" + ); + + // always reload the index.html file from disk incase it changes + let template = await fs.promises.readFile(clientTemplate, "utf-8"); + template = template.replace( + `src="/src/main.tsx"`, + `src="/src/main.tsx?v=${nanoid()}"` + ); + const page = await vite.transformIndexHtml(url, template); + res.status(200).set({ "Content-Type": "text/html" }).end(page); + } catch (e) { + vite.ssrFixStacktrace(e as Error); + next(e); + } + }); +} + +export function serveStatic(app: Express) { + const distPath = + process.env.NODE_ENV === "development" + ? path.resolve(import.meta.dirname, "../..", "dist", "public") + : path.resolve(import.meta.dirname, "public"); + if (!fs.existsSync(distPath)) { + console.error( + `Could not find the build directory: ${distPath}, make sure to build the client first` + ); + } + + app.use(express.static(distPath)); + + // fall through to index.html if the file doesn't exist + app.use("*", (_req, res) => { + res.sendFile(path.resolve(distPath, "index.html")); + }); +} diff --git a/deployment-package/source_server/_core/voiceTranscription.ts b/deployment-package/source_server/_core/voiceTranscription.ts new file mode 100644 index 0000000..ed511f6 --- /dev/null +++ b/deployment-package/source_server/_core/voiceTranscription.ts @@ -0,0 +1,284 @@ +/** + * Voice transcription helper using internal Speech-to-Text service + * + * Frontend implementation guide: + * 1. Capture audio using MediaRecorder API + * 2. Upload audio to storage (e.g., S3) to get URL + * 3. Call transcription with the URL + * + * Example usage: + * ```tsx + * // Frontend component + * const transcribeMutation = trpc.voice.transcribe.useMutation({ + * onSuccess: (data) => { + * console.log(data.text); // Full transcription + * console.log(data.language); // Detected language + * console.log(data.segments); // Timestamped segments + * } + * }); + * + * // After uploading audio to storage + * transcribeMutation.mutate({ + * audioUrl: uploadedAudioUrl, + * language: 'en', // optional + * prompt: 'Transcribe the meeting' // optional + * }); + * ``` + */ +import { ENV } from "./env"; + +export type TranscribeOptions = { + audioUrl: string; // URL to the audio file (e.g., S3 URL) + language?: string; // Optional: specify language code (e.g., "en", "es", "zh") + prompt?: string; // Optional: custom prompt for the transcription +}; + +// Native Whisper API segment format +export type WhisperSegment = { + id: number; + seek: number; + start: number; + end: number; + text: string; + tokens: number[]; + temperature: number; + avg_logprob: number; + compression_ratio: number; + no_speech_prob: number; +}; + +// Native Whisper API response format +export type WhisperResponse = { + task: "transcribe"; + language: string; + duration: number; + text: string; + segments: WhisperSegment[]; +}; + +export type TranscriptionResponse = WhisperResponse; // Return native Whisper API response directly + +export type TranscriptionError = { + error: string; + code: "FILE_TOO_LARGE" | "INVALID_FORMAT" | "TRANSCRIPTION_FAILED" | "UPLOAD_FAILED" | "SERVICE_ERROR"; + details?: string; +}; + +/** + * Transcribe audio to text using the internal Speech-to-Text service + * + * @param options - Audio data and metadata + * @returns Transcription result or error + */ +export async function transcribeAudio( + options: TranscribeOptions +): Promise { + try { + // Step 1: Validate environment configuration + if (!ENV.forgeApiUrl) { + return { + error: "Voice transcription service is not configured", + code: "SERVICE_ERROR", + details: "BUILT_IN_FORGE_API_URL is not set" + }; + } + if (!ENV.forgeApiKey) { + return { + error: "Voice transcription service authentication is missing", + code: "SERVICE_ERROR", + details: "BUILT_IN_FORGE_API_KEY is not set" + }; + } + + // Step 2: Download audio from URL + let audioBuffer: Buffer; + let mimeType: string; + try { + const response = await fetch(options.audioUrl); + if (!response.ok) { + return { + error: "Failed to download audio file", + code: "INVALID_FORMAT", + details: `HTTP ${response.status}: ${response.statusText}` + }; + } + + audioBuffer = Buffer.from(await response.arrayBuffer()); + mimeType = response.headers.get('content-type') || 'audio/mpeg'; + + // Check file size (16MB limit) + const sizeMB = audioBuffer.length / (1024 * 1024); + if (sizeMB > 16) { + return { + error: "Audio file exceeds maximum size limit", + code: "FILE_TOO_LARGE", + details: `File size is ${sizeMB.toFixed(2)}MB, maximum allowed is 16MB` + }; + } + } catch (error) { + return { + error: "Failed to fetch audio file", + code: "SERVICE_ERROR", + details: error instanceof Error ? error.message : "Unknown error" + }; + } + + // Step 3: Create FormData for multipart upload to Whisper API + const formData = new FormData(); + + // Create a Blob from the buffer and append to form + const filename = `audio.${getFileExtension(mimeType)}`; + const audioBlob = new Blob([new Uint8Array(audioBuffer)], { type: mimeType }); + formData.append("file", audioBlob, filename); + + formData.append("model", "whisper-1"); + formData.append("response_format", "verbose_json"); + + // Add prompt - use custom prompt if provided, otherwise generate based on language + const prompt = options.prompt || ( + options.language + ? `Transcribe the user's voice to text, the user's working language is ${getLanguageName(options.language)}` + : "Transcribe the user's voice to text" + ); + formData.append("prompt", prompt); + + // Step 4: Call the transcription service + const baseUrl = ENV.forgeApiUrl.endsWith("/") + ? ENV.forgeApiUrl + : `${ENV.forgeApiUrl}/`; + + const fullUrl = new URL( + "v1/audio/transcriptions", + baseUrl + ).toString(); + + const response = await fetch(fullUrl, { + method: "POST", + headers: { + authorization: `Bearer ${ENV.forgeApiKey}`, + "Accept-Encoding": "identity", + }, + body: formData, + }); + + if (!response.ok) { + const errorText = await response.text().catch(() => ""); + return { + error: "Transcription service request failed", + code: "TRANSCRIPTION_FAILED", + details: `${response.status} ${response.statusText}${errorText ? `: ${errorText}` : ""}` + }; + } + + // Step 5: Parse and return the transcription result + const whisperResponse = await response.json() as WhisperResponse; + + // Validate response structure + if (!whisperResponse.text || typeof whisperResponse.text !== 'string') { + return { + error: "Invalid transcription response", + code: "SERVICE_ERROR", + details: "Transcription service returned an invalid response format" + }; + } + + return whisperResponse; // Return native Whisper API response directly + + } catch (error) { + // Handle unexpected errors + return { + error: "Voice transcription failed", + code: "SERVICE_ERROR", + details: error instanceof Error ? error.message : "An unexpected error occurred" + }; + } +} + +/** + * Helper function to get file extension from MIME type + */ +function getFileExtension(mimeType: string): string { + const mimeToExt: Record = { + 'audio/webm': 'webm', + 'audio/mp3': 'mp3', + 'audio/mpeg': 'mp3', + 'audio/wav': 'wav', + 'audio/wave': 'wav', + 'audio/ogg': 'ogg', + 'audio/m4a': 'm4a', + 'audio/mp4': 'm4a', + }; + + return mimeToExt[mimeType] || 'audio'; +} + +/** + * Helper function to get full language name from ISO code + */ +function getLanguageName(langCode: string): string { + const langMap: Record = { + 'en': 'English', + 'es': 'Spanish', + 'fr': 'French', + 'de': 'German', + 'it': 'Italian', + 'pt': 'Portuguese', + 'ru': 'Russian', + 'ja': 'Japanese', + 'ko': 'Korean', + 'zh': 'Chinese', + 'ar': 'Arabic', + 'hi': 'Hindi', + 'nl': 'Dutch', + 'pl': 'Polish', + 'tr': 'Turkish', + 'sv': 'Swedish', + 'da': 'Danish', + 'no': 'Norwegian', + 'fi': 'Finnish', + }; + + return langMap[langCode] || langCode; +} + +/** + * Example tRPC procedure implementation: + * + * ```ts + * // In server/routers.ts + * import { transcribeAudio } from "./_core/voiceTranscription"; + * + * export const voiceRouter = router({ + * transcribe: protectedProcedure + * .input(z.object({ + * audioUrl: z.string(), + * language: z.string().optional(), + * prompt: z.string().optional(), + * })) + * .mutation(async ({ input, ctx }) => { + * const result = await transcribeAudio(input); + * + * // Check if it's an error + * if ('error' in result) { + * throw new TRPCError({ + * code: 'BAD_REQUEST', + * message: result.error, + * cause: result, + * }); + * } + * + * // Optionally save transcription to database + * await db.insert(transcriptions).values({ + * userId: ctx.user.id, + * text: result.text, + * duration: result.duration, + * language: result.language, + * audioUrl: input.audioUrl, + * createdAt: new Date(), + * }); + * + * return result; + * }), + * }); + * ``` + */ diff --git a/deployment-package/source_server/analyticsDb.ts b/deployment-package/source_server/analyticsDb.ts new file mode 100644 index 0000000..5f1bcc4 --- /dev/null +++ b/deployment-package/source_server/analyticsDb.ts @@ -0,0 +1,147 @@ +/** + * Requêtes analytiques pour le tableau de bord + */ + +import { eq, sql, and, gte, lte, desc } from "drizzle-orm"; +import { getDb } from "./db"; +import { inscriptions, sequences, apprenants, datesFormation, formations } from "../drizzle/schema"; + +/** + * Récupère les statistiques d'inscriptions par mois + * @param startDate - Date de début de la période + * @param endDate - Date de fin de la période + */ +export async function getInscriptionsByMonth(startDate?: Date, endDate?: Date) { + const db = await getDb(); + if (!db) return []; + + const conditions = []; + if (startDate) { + conditions.push(gte(inscriptions.dateInscription, startDate)); + } + if (endDate) { + conditions.push(lte(inscriptions.dateInscription, endDate)); + } + + const result = await db + .select({ + mois: sql`DATE_FORMAT(${inscriptions.dateInscription}, '%Y-%m')`, + total: sql`COUNT(*)`, + confirmees: sql`SUM(CASE WHEN ${inscriptions.statut} = 'confirmee' THEN 1 ELSE 0 END)`, + listeAttente: sql`SUM(CASE WHEN ${inscriptions.statut} = 'liste_attente' THEN 1 ELSE 0 END)`, + annulees: sql`SUM(CASE WHEN ${inscriptions.statut} = 'annulee' THEN 1 ELSE 0 END)`, + }) + .from(inscriptions) + .where(conditions.length > 0 ? and(...conditions) : undefined) + .groupBy(sql`DATE_FORMAT(${inscriptions.dateInscription}, '%Y-%m')`) + .orderBy(sql`DATE_FORMAT(${inscriptions.dateInscription}, '%Y-%m')`); + + return result; +} + +/** + * Récupère le taux de remplissage des séquences par mois + */ +export async function getTauxRemplissageByMonth() { + const db = await getDb(); + if (!db) return []; + + const result = await db + .select({ + mois: sql`DATE_FORMAT(${sequences.createdAt}, '%Y-%m')`, + capaciteTotale: sql`SUM(${sequences.capaciteMax})`, + inscritsConfirmes: sql`SUM( + (SELECT COUNT(*) + FROM ${inscriptions} + WHERE ${inscriptions.sequenceId} = ${sequences.id} + AND ${inscriptions.statut} = 'confirmee') + )`, + tauxRemplissage: sql`ROUND( + (SUM( + (SELECT COUNT(*) + FROM ${inscriptions} + WHERE ${inscriptions.sequenceId} = ${sequences.id} + AND ${inscriptions.statut} = 'confirmee') + ) / SUM(${sequences.capaciteMax})) * 100, + 2 + )`, + }) + .from(sequences) + .groupBy(sql`DATE_FORMAT(${sequences.createdAt}, '%Y-%m')`) + .orderBy(sql`DATE_FORMAT(${sequences.createdAt}, '%Y-%m')`); + + return result; +} + +/** + * Récupère les statistiques de participation par établissement + */ +export async function getParticipationByEtablissement() { + const db = await getDb(); + if (!db) return []; + + const result = await db + .select({ + codeEtablissement: apprenants.codeEtablissement, + totalApprenants: sql`COUNT(DISTINCT ${apprenants.id})`, + totalInscriptions: sql`COUNT(${inscriptions.id})`, + inscriptionsConfirmees: sql`SUM(CASE WHEN ${inscriptions.statut} = 'confirmee' THEN 1 ELSE 0 END)`, + inscriptionsListeAttente: sql`SUM(CASE WHEN ${inscriptions.statut} = 'liste_attente' THEN 1 ELSE 0 END)`, + inscriptionsAnnulees: sql`SUM(CASE WHEN ${inscriptions.statut} = 'annulee' THEN 1 ELSE 0 END)`, + }) + .from(apprenants) + .leftJoin(inscriptions, eq(apprenants.id, inscriptions.apprenantId)) + .groupBy(apprenants.codeEtablissement) + .orderBy(desc(sql`COUNT(${inscriptions.id})`)); + + return result; +} + +/** + * Récupère les statistiques globales du tableau de bord + */ +export async function getGlobalStats() { + const db = await getDb(); + if (!db) return null; + + const [stats] = await db + .select({ + totalFormations: sql`(SELECT COUNT(*) FROM ${formations} WHERE ${formations.actif} = 1)`, + totalSequences: sql`(SELECT COUNT(*) FROM ${sequences})`, + sequencesOuvertes: sql`(SELECT COUNT(*) FROM ${sequences} WHERE ${sequences.statut} = 'ouverte')`, + totalApprenants: sql`(SELECT COUNT(*) FROM ${apprenants})`, + totalInscriptions: sql`(SELECT COUNT(*) FROM ${inscriptions})`, + inscriptionsConfirmees: sql`(SELECT COUNT(*) FROM ${inscriptions} WHERE ${inscriptions.statut} = 'confirmee')`, + inscriptionsListeAttente: sql`(SELECT COUNT(*) FROM ${inscriptions} WHERE ${inscriptions.statut} = 'liste_attente')`, + tauxRemplissageMoyen: sql`ROUND( + (SELECT COUNT(*) FROM ${inscriptions} WHERE ${inscriptions.statut} = 'confirmee') / + (SELECT SUM(${sequences.capaciteMax}) FROM ${sequences}) * 100, + 2 + )`, + }) + .from(sql`dual`); + + return stats; +} + +/** + * Récupère les statistiques de participation par fonction + */ +export async function getParticipationByFonction() { + const db = await getDb(); + if (!db) return []; + + const result = await db + .select({ + fonction: apprenants.fonction, + totalApprenants: sql`COUNT(DISTINCT ${apprenants.id})`, + totalInscriptions: sql`COUNT(${inscriptions.id})`, + inscriptionsConfirmees: sql`SUM(CASE WHEN ${inscriptions.statut} = 'confirmee' THEN 1 ELSE 0 END)`, + }) + .from(apprenants) + .leftJoin(inscriptions, eq(apprenants.id, inscriptions.apprenantId)) + .groupBy(apprenants.fonction) + .orderBy(desc(sql`COUNT(${inscriptions.id})`)); + + return result; +} diff --git a/deployment-package/source_server/analyticsExportService.ts b/deployment-package/source_server/analyticsExportService.ts new file mode 100644 index 0000000..392774c --- /dev/null +++ b/deployment-package/source_server/analyticsExportService.ts @@ -0,0 +1,145 @@ +/** + * Service d'export des rapports analytiques en PDF et Excel + */ + +import ExcelJS from 'exceljs'; +import { getGlobalStats, getInscriptionsByMonth, getTauxRemplissageByMonth, getParticipationByEtablissement, getParticipationByFonction } from './analyticsDb'; + +/** + * Génère un rapport Excel des statistiques analytiques + */ +export async function generateAnalyticsExcel(startDate?: Date, endDate?: Date): Promise { + const workbook = new ExcelJS.Workbook(); + + // Récupérer toutes les données + const globalStats = await getGlobalStats(); + const inscriptionsByMonth = await getInscriptionsByMonth(startDate, endDate); + const tauxRemplissage = await getTauxRemplissageByMonth(); + const participationEtablissement = await getParticipationByEtablissement(); + const participationFonction = await getParticipationByFonction(); + + // Feuille 1: Statistiques globales + const statsSheet = workbook.addWorksheet('Statistiques globales'); + statsSheet.columns = [ + { header: 'Indicateur', key: 'indicateur', width: 30 }, + { header: 'Valeur', key: 'valeur', width: 15 }, + ]; + + if (globalStats) { + statsSheet.addRows([ + { indicateur: 'Total Formations actives', valeur: globalStats.totalFormations }, + { indicateur: 'Total Séquences', valeur: globalStats.totalSequences }, + { indicateur: 'Séquences ouvertes', valeur: globalStats.sequencesOuvertes }, + { indicateur: 'Total Apprenants', valeur: globalStats.totalApprenants }, + { indicateur: 'Total Inscriptions', valeur: globalStats.totalInscriptions }, + { indicateur: 'Inscriptions confirmées', valeur: globalStats.inscriptionsConfirmees }, + { indicateur: 'Inscriptions en liste d\'attente', valeur: globalStats.inscriptionsListeAttente }, + { indicateur: 'Taux de remplissage moyen (%)', valeur: globalStats.tauxRemplissageMoyen }, + ]); + } + + // Feuille 2: Inscriptions par mois + const inscriptionsSheet = workbook.addWorksheet('Inscriptions par mois'); + inscriptionsSheet.columns = [ + { header: 'Mois', key: 'mois', width: 15 }, + { header: 'Total', key: 'total', width: 12 }, + { header: 'Confirmées', key: 'confirmees', width: 12 }, + { header: 'Liste d\'attente', key: 'listeAttente', width: 15 }, + { header: 'Annulées', key: 'annulees', width: 12 }, + ]; + + inscriptionsByMonth.forEach(item => { + inscriptionsSheet.addRow({ + mois: item.mois, + total: Number(item.total), + confirmees: Number(item.confirmees), + listeAttente: Number(item.listeAttente), + annulees: Number(item.annulees), + }); + }); + + // Feuille 3: Taux de remplissage + const tauxSheet = workbook.addWorksheet('Taux de remplissage'); + tauxSheet.columns = [ + { header: 'Mois', key: 'mois', width: 15 }, + { header: 'Capacité totale', key: 'capaciteTotale', width: 15 }, + { header: 'Inscrits confirmés', key: 'inscritsConfirmes', width: 18 }, + { header: 'Taux de remplissage (%)', key: 'tauxRemplissage', width: 20 }, + ]; + + tauxRemplissage.forEach(item => { + tauxSheet.addRow({ + mois: item.mois, + capaciteTotale: Number(item.capaciteTotale), + inscritsConfirmes: Number(item.inscritsConfirmes), + tauxRemplissage: Number(item.tauxRemplissage), + }); + }); + + // Feuille 4: Participation par établissement + const etablissementSheet = workbook.addWorksheet('Participation par établissement'); + etablissementSheet.columns = [ + { header: 'Code établissement', key: 'codeEtablissement', width: 20 }, + { header: 'Total apprenants', key: 'totalApprenants', width: 15 }, + { header: 'Total inscriptions', key: 'totalInscriptions', width: 18 }, + { header: 'Confirmées', key: 'confirmees', width: 12 }, + { header: 'Liste d\'attente', key: 'listeAttente', width: 15 }, + { header: 'Annulées', key: 'annulees', width: 12 }, + ]; + + participationEtablissement.forEach(item => { + etablissementSheet.addRow({ + codeEtablissement: item.codeEtablissement, + totalApprenants: Number(item.totalApprenants), + totalInscriptions: Number(item.totalInscriptions), + confirmees: Number(item.inscriptionsConfirmees), + listeAttente: Number(item.inscriptionsListeAttente), + annulees: Number(item.inscriptionsAnnulees), + }); + }); + + // Feuille 5: Participation par fonction + const fonctionSheet = workbook.addWorksheet('Participation par fonction'); + fonctionSheet.columns = [ + { header: 'Fonction', key: 'fonction', width: 20 }, + { header: 'Total apprenants', key: 'totalApprenants', width: 15 }, + { header: 'Total inscriptions', key: 'totalInscriptions', width: 18 }, + { header: 'Confirmées', key: 'confirmees', width: 12 }, + ]; + + participationFonction.forEach(item => { + fonctionSheet.addRow({ + fonction: item.fonction === 'directeur' ? 'Directeurs' : + item.fonction === 'chef_service' ? 'Chefs de service' : 'Autres', + totalApprenants: Number(item.totalApprenants), + totalInscriptions: Number(item.totalInscriptions), + confirmees: Number(item.inscriptionsConfirmees), + }); + }); + + // Styliser les en-têtes + [statsSheet, inscriptionsSheet, tauxSheet, etablissementSheet, fonctionSheet].forEach(sheet => { + sheet.getRow(1).font = { bold: true }; + sheet.getRow(1).fill = { + type: 'pattern', + pattern: 'solid', + fgColor: { argb: 'FF3B82F6' }, + }; + sheet.getRow(1).font = { bold: true, color: { argb: 'FFFFFFFF' } }; + }); + + // Générer le buffer + const buffer = await workbook.xlsx.writeBuffer(); + return Buffer.from(buffer); +} + +/** + * Génère un rapport PDF des statistiques analytiques + * Note: Cette fonction retourne actuellement un placeholder + * Une implémentation complète nécessiterait une bibliothèque comme puppeteer ou pdfkit + */ +export async function generateAnalyticsPDF(startDate?: Date, endDate?: Date): Promise { + // Pour l'instant, retourner un message indiquant que la fonctionnalité est en développement + // Une implémentation complète nécessiterait de générer un HTML et de le convertir en PDF + throw new Error("L'export PDF sera implémenté dans une prochaine version"); +} diff --git a/deployment-package/source_server/attestationService.ts b/deployment-package/source_server/attestationService.ts new file mode 100644 index 0000000..b8a2dad --- /dev/null +++ b/deployment-package/source_server/attestationService.ts @@ -0,0 +1,430 @@ +import { getDb } from "./db"; +import { attestations, configAttestation, inscriptions, apprenants, sequences, formations, datesFormation } from "../drizzle/schema"; +import { eq, and } from "drizzle-orm"; +import { storagePut } from "./storage"; +import PDFDocument from "pdfkit"; +import { format } from "date-fns"; +import { fr } from "date-fns/locale"; +import crypto from "crypto"; + +/** + * Génère une attestation de formation en PDF + */ +export async function genererAttestationPDF(inscriptionId: number): Promise<{ s3Key: string; pdfUrl: string }> { + const db = await getDb(); + if (!db) { + throw new Error("Base de données non disponible"); + } + + // Récupérer les données de l'inscription + const [inscriptionData] = await db + .select({ + inscription: inscriptions, + apprenant: apprenants, + sequence: sequences, + formation: formations, + }) + .from(inscriptions) + .innerJoin(apprenants, eq(inscriptions.apprenantId, apprenants.id)) + .innerJoin(sequences, eq(inscriptions.sequenceId, sequences.id)) + .innerJoin(formations, eq(sequences.formationId, formations.id)) + .where(eq(inscriptions.id, inscriptionId)) + .limit(1); + + if (!inscriptionData) { + throw new Error("Inscription introuvable"); + } + + const { inscription, apprenant, sequence, formation } = inscriptionData; + + // Récupérer les dates de la séquence + const dates = await db + .select() + .from(datesFormation) + .where(eq(datesFormation.sequenceId, sequence.id)); + + // Récupérer la configuration de l'attestation + const [config] = await db + .select() + .from(configAttestation) + .limit(1); + + // Créer le PDF + const doc = new PDFDocument({ + size: "A4", + margins: { top: 50, bottom: 50, left: 50, right: 50 }, + }); + + const chunks: Buffer[] = []; + doc.on("data", (chunk: Buffer) => chunks.push(chunk)); + + return new Promise((resolve, reject) => { + doc.on("end", async () => { + try { + const pdfBuffer = Buffer.concat(chunks); + + // Générer une clé S3 unique + const randomSuffix = crypto.randomBytes(8).toString("hex"); + const s3Key = `attestations/${apprenant.id}-${sequence.id}-${randomSuffix}.pdf`; + + // Upload vers S3 + const { url } = await storagePut(s3Key, pdfBuffer, "application/pdf"); + + resolve({ s3Key, pdfUrl: url }); + } catch (error) { + reject(error); + } + }); + + doc.on("error", reject); + + // Construction du PDF + (async () => { + try { + // Logo en haut à droite si disponible + if (config?.logoUrl) { + try { + const logoResponse = await fetch(config.logoUrl); + const logoBuffer = Buffer.from(await logoResponse.arrayBuffer()); + doc.image(logoBuffer, doc.page.width - 150, 50, { width: 100 }); + } catch (error) { + console.error("Erreur lors du chargement du logo:", error); + } + } + + // Titre + doc.fontSize(24).font("Helvetica-Bold").text("ATTESTATION DE FORMATION", { align: "center" }); + doc.moveDown(2); + + // Texte personnalisable ou texte par défaut + const texteAttestation = config?.texteAttestation || + "Nous attestons que {{nomComplet}} a suivi avec assiduité la formation \"{{nomFormation}}\" organisée du {{dateDebut}} au {{dateFin}}."; + + // Remplacer les variables + const nomComplet = `${apprenant.prenom} ${apprenant.nom}`; + const dateDebut = dates.length > 0 ? format(new Date(dates[0].dateDebut), "dd MMMM yyyy", { locale: fr }) : ""; + const dateFin = dates.length > 0 ? format(new Date(dates[dates.length - 1].dateFin), "dd MMMM yyyy", { locale: fr }) : ""; + + const texteRempli = texteAttestation + .replace(/\{\{nomComplet\}\}/g, nomComplet) + .replace(/\{\{nomFormation\}\}/g, formation.nom) + .replace(/\{\{dateDebut\}\}/g, dateDebut) + .replace(/\{\{dateFin\}\}/g, dateFin); + + doc.fontSize(12).font("Helvetica").text(texteRempli, { align: "justify" }); + doc.moveDown(2); + + // Détails de la formation + doc.fontSize(10).font("Helvetica-Bold").text("Détails de la formation :", { underline: true }); + doc.moveDown(0.5); + doc.font("Helvetica"); + doc.text(`Formation : ${formation.nom}`); + doc.text(`Séquence : ${sequence.nom}`); + doc.text(`Lieu : ${sequence.lieu}`); + doc.moveDown(0.5); + doc.text("Dates :"); + dates.forEach((date) => { + const dateStr = format(new Date(date.dateDebut), "dd/MM/yyyy", { locale: fr }); + const heureDebut = format(new Date(date.dateDebut), "HH:mm"); + const heureFin = format(new Date(date.dateFin), "HH:mm"); + doc.text(` • ${dateStr} de ${heureDebut} à ${heureFin}`); + }); + + doc.moveDown(3); + + // Signature + doc.fontSize(10); + doc.text(`Fait le ${format(new Date(), "dd MMMM yyyy", { locale: fr })}`, { align: "right" }); + doc.moveDown(3); + + // Signature si disponible + if (config?.signatureUrl) { + try { + const signatureResponse = await fetch(config.signatureUrl); + const signatureBuffer = Buffer.from(await signatureResponse.arrayBuffer()); + const signatureX = doc.page.width - 200; + const signatureY = doc.y; + doc.image(signatureBuffer, signatureX, signatureY, { width: 150, height: 50 }); + doc.moveDown(3); + } catch (error) { + console.error("Erreur lors du chargement de la signature:", error); + } + } + + if (config?.nomSignataire) { + doc.text(config.nomSignataire, { align: "right" }); + } + if (config?.fonctionSignataire) { + doc.text(config.fonctionSignataire, { align: "right" }); + } + + doc.end(); + } catch (error) { + doc.end(); + reject(error); + } + })(); + }); +} + +/** + * Enregistre une attestation dans la base de données + */ +export async function enregistrerAttestation( + inscriptionId: number, + apprenantId: number, + sequenceId: number, + s3Key: string, + pdfUrl: string +): Promise { + const db = await getDb(); + if (!db) { + throw new Error("Base de données non disponible"); + } + + const [result] = await db.insert(attestations).values({ + inscriptionId, + apprenantId, + sequenceId, + s3Key, + pdfUrl, + emailEnvoye: false, + }); + + return result.insertId; +} + +/** + * Récupère l'attestation d'un apprenant pour une séquence + */ +export async function getAttestation(apprenantId: number, sequenceId: number) { + const db = await getDb(); + if (!db) return null; + + const [attestation] = await db + .select() + .from(attestations) + .where( + and( + eq(attestations.apprenantId, apprenantId), + eq(attestations.sequenceId, sequenceId) + ) + ) + .limit(1); + + return attestation || null; +} + +/** + * Récupère toutes les attestations d'un apprenant + */ +export async function getAttestationsApprenant(apprenantId: number) { + const db = await getDb(); + if (!db) return []; + + return db + .select({ + attestation: attestations, + sequence: sequences, + formation: formations, + }) + .from(attestations) + .innerJoin(sequences, eq(attestations.sequenceId, sequences.id)) + .innerJoin(formations, eq(sequences.formationId, formations.id)) + .where(eq(attestations.apprenantId, apprenantId)); +} + +/** + * Marque une attestation comme envoyée par email + */ +export async function marquerAttestationEnvoyee(attestationId: number) { + const db = await getDb(); + if (!db) return; + + await db + .update(attestations) + .set({ + emailEnvoye: true, + dateEnvoiEmail: new Date(), + }) + .where(eq(attestations.id, attestationId)); +} + +/** + * Récupère ou crée la configuration des attestations + */ +export async function getOrCreateConfigAttestation() { + const db = await getDb(); + if (!db) return null; + + let [config] = await db.select().from(configAttestation).limit(1); + + if (!config) { + // Créer une configuration par défaut + await db.insert(configAttestation).values({ + texteAttestation: "Nous attestons que {{nomComplet}} a suivi avec assiduité la formation \"{{nomFormation}}\" organisée du {{dateDebut}} au {{dateFin}}.", + }); + + [config] = await db.select().from(configAttestation).limit(1); + } + + return config; +} + +/** + * Met à jour la configuration des attestations + */ +export async function updateConfigAttestation(data: { + logoS3Key?: string; + logoUrl?: string; + signatureS3Key?: string; + signatureUrl?: string; + nomSignataire?: string; + fonctionSignataire?: string; + texteAttestation?: string; +}) { + const db = await getDb(); + if (!db) return; + + const [existing] = await db.select().from(configAttestation).limit(1); + + if (existing) { + await db.update(configAttestation).set(data).where(eq(configAttestation.id, existing.id)); + } else { + await db.insert(configAttestation).values(data); + } +} + +/** + * Génère une prévisualisation du modèle d'attestation avec des données fictives + */ +export async function genererPreviewAttestation(): Promise<{ pdfUrl: string }> { + const db = await getDb(); + if (!db) { + throw new Error("Base de données non disponible"); + } + + // Récupérer la configuration de l'attestation + const config = await getOrCreateConfigAttestation(); + if (!config) { + throw new Error("Configuration d'attestation introuvable"); + } + + // Données fictives pour la prévisualisation + const donneesFictives = { + apprenant: { + nom: "Dupont", + prenom: "Jean", + email: "jean.dupont@example.com", + }, + formation: { + nom: "Formation Manager Itinova", + nbJours: 5, + }, + sequence: { + nom: "Groupe A", + lieu: "Paris", + }, + dates: [ + { date: new Date("2026-02-10") }, + { date: new Date("2026-02-11") }, + { date: new Date("2026-02-12") }, + { date: new Date("2026-02-13") }, + { date: new Date("2026-02-14") }, + ], + }; + + // Créer le PDF + const doc = new PDFDocument({ size: "A4", margin: 50 }); + const chunks: Buffer[] = []; + + doc.on("data", (chunk) => chunks.push(chunk)); + + // En-tête avec logo si disponible + if (config.logoUrl) { + try { + const response = await fetch(config.logoUrl); + const arrayBuffer = await response.arrayBuffer(); + const buffer = Buffer.from(arrayBuffer); + doc.image(buffer, 50, 45, { width: 100 }); + } catch (error) { + console.error("Erreur lors du chargement du logo:", error); + } + } + + // Titre + doc + .fontSize(24) + .font("Helvetica-Bold") + .text("ATTESTATION DE FORMATION", 0, 150, { align: "center" }); + + doc.moveDown(2); + + // Texte de l'attestation avec remplacement des variables + let texte = config.texteAttestation || "Nous attestons que {{nomComplet}} a suivi avec assiduité la formation \"{{nomFormation}}\" organisée du {{dateDebut}} au {{dateFin}}."; + + const dateDebut = format(donneesFictives.dates[0].date, "d MMMM yyyy", { locale: fr }); + const dateFin = format(donneesFictives.dates[donneesFictives.dates.length - 1].date, "d MMMM yyyy", { locale: fr }); + + texte = texte + .replace(/\{\{nomComplet\}\}/g, `${donneesFictives.apprenant.prenom} ${donneesFictives.apprenant.nom}`) + .replace(/\{\{nomFormation\}\}/g, donneesFictives.formation.nom) + .replace(/\{\{dateDebut\}\}/g, dateDebut) + .replace(/\{\{dateFin\}\}/g, dateFin) + .replace(/\{\{lieu\}\}/g, donneesFictives.sequence.lieu) + .replace(/\{\{nbJours\}\}/g, donneesFictives.formation.nbJours.toString()); + + doc + .fontSize(12) + .font("Helvetica") + .text(texte, { align: "justify", lineGap: 5 }); + + doc.moveDown(2); + + // Dates de formation + doc.fontSize(10).font("Helvetica-Bold").text("Dates de formation :"); + doc.font("Helvetica"); + donneesFictives.dates.forEach((d) => { + doc.text(`• ${format(d.date, "EEEE d MMMM yyyy", { locale: fr })}`, { indent: 20 }); + }); + + doc.moveDown(2); + + // Signature + doc.fontSize(10).font("Helvetica").text(`Fait à ${donneesFictives.sequence.lieu}, le ${format(new Date(), "d MMMM yyyy", { locale: fr })}`); + + doc.moveDown(1); + + if (config.signatureUrl) { + try { + const response = await fetch(config.signatureUrl); + const arrayBuffer = await response.arrayBuffer(); + const buffer = Buffer.from(arrayBuffer); + doc.image(buffer, doc.x, doc.y, { width: 150 }); + doc.moveDown(3); + } catch (error) { + console.error("Erreur lors du chargement de la signature:", error); + } + } + + if (config.nomSignataire) { + doc.font("Helvetica-Bold").text(config.nomSignataire); + } + if (config.fonctionSignataire) { + doc.font("Helvetica").text(config.fonctionSignataire); + } + + // Finaliser le PDF + doc.end(); + + await new Promise((resolve) => doc.on("end", resolve)); + + const pdfBuffer = Buffer.concat(chunks); + + // Uploader sur S3 + const randomSuffix = crypto.randomBytes(8).toString("hex"); + const s3Key = `attestations/preview/preview-${randomSuffix}.pdf`; + const { url: pdfUrl } = await storagePut(s3Key, pdfBuffer, "application/pdf"); + + return { pdfUrl }; +} diff --git a/deployment-package/source_server/attestationsDb.ts b/deployment-package/source_server/attestationsDb.ts new file mode 100644 index 0000000..3bf46e8 --- /dev/null +++ b/deployment-package/source_server/attestationsDb.ts @@ -0,0 +1,93 @@ +import { desc, eq } from "drizzle-orm"; +import { getDb } from "./db"; +import { historiqueAttestations, sequences, apprenants, formations } from "../drizzle/schema"; + +/** + * Enregistrer un envoi d'attestation dans l'historique + */ +export async function enregistrerEnvoiAttestation(data: { + sequenceId: number; + apprenantId: number; + statut: "envoye" | "erreur"; + messageErreur?: string; + urlAttestation?: string; +}) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + await db.insert(historiqueAttestations).values({ + sequenceId: data.sequenceId, + apprenantId: data.apprenantId, + statut: data.statut, + messageErreur: data.messageErreur || null, + urlAttestation: data.urlAttestation || null, + }); +} + +/** + * Récupérer l'historique des envois d'attestations + * Avec les informations de la séquence, formation et apprenant + */ +export async function getHistoriqueAttestations() { + const db = await getDb(); + if (!db) return []; + + const results = await db + .select({ + id: historiqueAttestations.id, + dateEnvoi: historiqueAttestations.dateEnvoi, + statut: historiqueAttestations.statut, + messageErreur: historiqueAttestations.messageErreur, + urlAttestation: historiqueAttestations.urlAttestation, + sequence: { + id: sequences.id, + nom: sequences.nom, + }, + formation: { + id: formations.id, + nom: formations.nom, + }, + apprenant: { + id: apprenants.id, + nom: apprenants.nom, + prenom: apprenants.prenom, + email: apprenants.email, + }, + }) + .from(historiqueAttestations) + .innerJoin(sequences, eq(historiqueAttestations.sequenceId, sequences.id)) + .innerJoin(formations, eq(sequences.formationId, formations.id)) + .innerJoin(apprenants, eq(historiqueAttestations.apprenantId, apprenants.id)) + .orderBy(desc(historiqueAttestations.dateEnvoi)); + + return results; +} + +/** + * Récupérer l'historique des attestations pour une séquence spécifique + */ +export async function getHistoriqueAttestationsBySequence(sequenceId: number) { + const db = await getDb(); + if (!db) return []; + + const results = await db + .select({ + id: historiqueAttestations.id, + dateEnvoi: historiqueAttestations.dateEnvoi, + statut: historiqueAttestations.statut, + messageErreur: historiqueAttestations.messageErreur, + urlAttestation: historiqueAttestations.urlAttestation, + apprenant: { + id: apprenants.id, + nom: apprenants.nom, + prenom: apprenants.prenom, + email: apprenants.email, + }, + }) + .from(historiqueAttestations) + .innerJoin(apprenants, eq(historiqueAttestations.apprenantId, apprenants.id)) + .where(eq(historiqueAttestations.sequenceId, sequenceId)) + .orderBy(desc(historiqueAttestations.dateEnvoi)); + + return results; +} diff --git a/deployment-package/source_server/dateUtils.ts b/deployment-package/source_server/dateUtils.ts new file mode 100644 index 0000000..6f1c294 --- /dev/null +++ b/deployment-package/source_server/dateUtils.ts @@ -0,0 +1,60 @@ +/** + * Utilitaires pour la gestion des dates + * Gère correctement les conversions entre heure locale et UTC + */ + +/** + * Convertit une chaîne datetime-local (format: "2025-01-15T14:30") en Date + * en construisant la date avec une chaîne ISO qui force l'heure locale + * Préserve l'heure locale sans conversion UTC + */ +export function parseLocalDateTime(dateTimeString: string): Date { + if (!dateTimeString) { + throw new Error('Date string is required'); + } + + // Le format datetime-local est "YYYY-MM-DDTHH:mm" + const match = dateTimeString.match(/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})/); + + if (!match) { + throw new Error(`Invalid date format: ${dateTimeString}. Expected YYYY-MM-DDTHH:mm`); + } + + const [, year, month, day, hours, minutes] = match; + + // Créer un objet Date en utilisant le constructeur avec composants + // MySQL stocke en UTC, donc on doit compenser le décalage horaire + const date = new Date( + parseInt(year), + parseInt(month) - 1, + parseInt(day), + parseInt(hours), + parseInt(minutes), + 0 + ); + + // Compenser le décalage UTC en ajoutant le décalage du fuseau horaire + // Cela garantit que l'heure stockée en UTC correspond à l'heure locale saisie + const offset = date.getTimezoneOffset(); // en minutes (négatif pour Europe/Paris) + date.setMinutes(date.getMinutes() - offset); + + if (isNaN(date.getTime())) { + throw new Error(`Invalid date string: ${dateTimeString}`); + } + + return date; +} + +/** + * Formate une Date en chaîne datetime-local pour les inputs HTML + * Format: "YYYY-MM-DDTHH:mm" + */ +export function formatToLocalDateTime(date: Date): string { + const year = date.getFullYear(); + const month = String(date.getMonth() + 1).padStart(2, '0'); + const day = String(date.getDate()).padStart(2, '0'); + const hours = String(date.getHours()).padStart(2, '0'); + const minutes = String(date.getMinutes()).padStart(2, '0'); + + return `${year}-${month}-${day}T${hours}:${minutes}`; +} diff --git a/deployment-package/source_server/db.ts b/deployment-package/source_server/db.ts new file mode 100644 index 0000000..dc0b2b3 --- /dev/null +++ b/deployment-package/source_server/db.ts @@ -0,0 +1,1272 @@ +import { eq, and, ne, sql } from "drizzle-orm"; +import { drizzle } from "drizzle-orm/mysql2"; +import { + InsertUser, + users, + formations, + apprenants, + sequences, + datesFormation, + inscriptions, + passwordResetTokens, + InsertPasswordResetToken, + emailTemplates, + emailConfig, + InsertEmailConfig, + InsertSequence, + InsertDateFormation, + InsertInscription, + InsertFormation, + InsertApprenant, + Sequence, + DateFormation, + Apprenant, + Formation, + EmailTemplate, + InsertEmailTemplate, + formateurs, + InsertFormateur, + Formateur, + rappels, + InsertRappel, + Rappel, + rappelDates +} from "../drizzle/schema"; +import { ENV } from './_core/env'; + +let _db: ReturnType | null = null; + +// Lazily create the drizzle instance so local tooling can run without a DB. +export async function getDb() { + if (!_db && process.env.DATABASE_URL) { + try { + _db = drizzle(process.env.DATABASE_URL); + } catch (error) { + console.warn("[Database] Failed to connect:", error); + _db = null; + } + } + return _db; +} + +export async function upsertUser(user: InsertUser): Promise { + if (!user.openId) { + throw new Error("User openId is required for upsert"); + } + + const db = await getDb(); + if (!db) { + console.warn("[Database] Cannot upsert user: database not available"); + return; + } + + try { + const values: InsertUser = { + openId: user.openId, + }; + const updateSet: Record = {}; + + const textFields = ["name", "email", "loginMethod"] as const; + type TextField = (typeof textFields)[number]; + + const assignNullable = (field: TextField) => { + const value = user[field]; + if (value === undefined) return; + const normalized = value ?? null; + values[field] = normalized; + updateSet[field] = normalized; + }; + + textFields.forEach(assignNullable); + + if (user.lastSignedIn !== undefined) { + values.lastSignedIn = user.lastSignedIn; + updateSet.lastSignedIn = user.lastSignedIn; + } + if (user.role !== undefined) { + values.role = user.role; + updateSet.role = user.role; + } else if (user.openId === ENV.ownerOpenId) { + values.role = 'admin'; + updateSet.role = 'admin'; + } + + if (!values.lastSignedIn) { + values.lastSignedIn = new Date(); + } + + if (Object.keys(updateSet).length === 0) { + updateSet.lastSignedIn = new Date(); + } + + await db.insert(users).values(values).onDuplicateKeyUpdate({ + set: updateSet, + }); + } catch (error) { + console.error("[Database] Failed to upsert user:", error); + throw error; + } +} + +export async function getUserByOpenId(openId: string) { + const db = await getDb(); + if (!db) { + console.warn("[Database] Cannot get user: database not available"); + return undefined; + } + + const result = await db.select().from(users).where(eq(users.openId, openId)).limit(1); + + return result.length > 0 ? result[0] : undefined; +} + +// ==================== FORMATIONS ==================== + +export async function createFormation(data: InsertFormation) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + const result = await db.insert(formations).values(data); + return result; +} + +export async function getFormations() { + const db = await getDb(); + if (!db) return []; + + return await db.select().from(formations); +} + +export async function getFormationsByFormateur(formateurId: number) { + const db = await getDb(); + if (!db) return []; + + // Récupérer les IDs de formations uniques pour lesquelles le formateur a des séquences + const seqs = await db.select({ formationId: sequences.formationId }) + .from(sequences) + .where(eq(sequences.formateurId, formateurId)); + + const formationIds = Array.from(new Set(seqs.map(s => s.formationId))); + + if (formationIds.length === 0) return []; + + // Récupérer les formations correspondantes + const result = await db.select().from(formations).where( + sql`${formations.id} IN (${sql.join(formationIds.map(id => sql`${id}`), sql`, `)})` + ); + + return result; +} + +export async function getFormationById(id: number) { + const db = await getDb(); + if (!db) return undefined; + + const result = await db.select().from(formations).where(eq(formations.id, id)).limit(1); + return result.length > 0 ? result[0] : undefined; +} + +export async function getFormationByLien(lien: string) { + const db = await getDb(); + if (!db) return undefined; + + const result = await db.select().from(formations).where(eq(formations.lienUnique, lien)).limit(1); + return result.length > 0 ? result[0] : undefined; +} + +export async function updateFormation(id: number, data: Partial) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + await db.update(formations).set(data).where(eq(formations.id, id)); +} + +export async function deleteFormation(id: number) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + await db.delete(formations).where(eq(formations.id, id)); +} + +// ==================== SÉQUENCES ==================== + +export async function createSequence(data: InsertSequence) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + const result = await db.insert(sequences).values(data); + return result; +} + +export async function getSequences() { + const db = await getDb(); + if (!db) return []; + + return await db.select().from(sequences); +} + +export async function getSequencesWithFormation() { + const db = await getDb(); + if (!db) return []; + + const seqs = await db.select().from(sequences); + + // Récupérer les informations de formation et de formateur pour chaque séquence + return await Promise.all( + seqs.map(async (seq) => { + const formation = await db.select().from(formations).where(eq(formations.id, seq.formationId)).limit(1); + + let formateur = null; + if (seq.formateurId) { + const formateurResult = await db.select().from(formateurs).where(eq(formateurs.id, seq.formateurId)).limit(1); + if (formateurResult.length > 0) { + formateur = { id: formateurResult[0].id, nom: formateurResult[0].nom }; + } + } + + return { + ...seq, + formation: formation.length > 0 ? { id: formation[0].id, nom: formation[0].nom } : null, + formateur, + }; + }) + ); +} + +export async function getSequencesByFormateur(formateurId: number) { + const db = await getDb(); + if (!db) return []; + + // Récupérer uniquement les séquences de ce formateur + const seqs = await db.select().from(sequences).where(eq(sequences.formateurId, formateurId)); + + // Récupérer les informations de formation et de formateur pour chaque séquence + return await Promise.all( + seqs.map(async (seq) => { + const formation = await db.select().from(formations).where(eq(formations.id, seq.formationId)).limit(1); + + let formateur = null; + if (seq.formateurId) { + const formateurResult = await db.select().from(formateurs).where(eq(formateurs.id, seq.formateurId)).limit(1); + if (formateurResult.length > 0) { + formateur = { id: formateurResult[0].id, nom: formateurResult[0].nom }; + } + } + + return { + ...seq, + formation: formation.length > 0 ? { id: formation[0].id, nom: formation[0].nom } : null, + formateur, + }; + }) + ); +} + +export async function getSequenceById(id: number): Promise { + const db = await getDb(); + if (!db) return undefined; + + const result = await db.select().from(sequences).where(eq(sequences.id, id)).limit(1); + return result.length > 0 ? result[0] : undefined; +} + +export async function getSequencesByFormation(formationId: number) { + const db = await getDb(); + if (!db) return []; + + return await db.select().from(sequences).where(eq(sequences.formationId, formationId)); +} + +export async function updateSequence(id: number, data: Partial) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + await db.update(sequences).set(data).where(eq(sequences.id, id)); +} + +export async function deleteSequence(id: number) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + await db.delete(sequences).where(eq(sequences.id, id)); +} + +// ==================== DATES DE FORMATION ==================== + +export async function createDateFormation(data: InsertDateFormation) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + const result = await db.insert(datesFormation).values(data); + return result; +} + +export async function getDatesBySequence(sequenceId: number): Promise { + const db = await getDb(); + if (!db) return []; + + const results = await db.select() + .from(datesFormation) + .where(eq(datesFormation.sequenceId, sequenceId)) + .orderBy(datesFormation.ordre); + + return results; +} + +export async function deleteDatesBySequence(sequenceId: number) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + await db.delete(datesFormation).where(eq(datesFormation.sequenceId, sequenceId)); +} + +// ==================== APPRENANTS ==================== + +export async function createApprenant(data: InsertApprenant) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + const result = await db.insert(apprenants).values(data); + return result; +} + +export async function getApprenants() { + const db = await getDb(); + if (!db) return []; + + const apprenantsData = await db.select().from(apprenants); + + // Pour chaque apprenant, récupérer ses inscriptions + const apprenantsWithInscriptions = await Promise.all( + apprenantsData.map(async (apprenant) => { + const inscriptionsData = await db + .select() + .from(inscriptions) + .where(eq(inscriptions.apprenantId, apprenant.id)); + + return { + ...apprenant, + inscriptions: inscriptionsData, + }; + }) + ); + + return apprenantsWithInscriptions; +} + +export async function getApprenantsByFormateur(formateurId: number) { + const db = await getDb(); + if (!db) return []; + + // Récupérer les IDs de séquences du formateur + const seqs = await db.select({ id: sequences.id }) + .from(sequences) + .where(eq(sequences.formateurId, formateurId)); + + const sequenceIds = seqs.map(s => s.id); + + if (sequenceIds.length === 0) return []; + + // Récupérer les IDs d'apprenants inscrits à ces séquences + const inscriptionsData = await db.select({ apprenantId: inscriptions.apprenantId }) + .from(inscriptions) + .where( + sql`${inscriptions.sequenceId} IN (${sql.join(sequenceIds.map(id => sql`${id}`), sql`, `)})` + ); + + const apprenantIds = Array.from(new Set(inscriptionsData.map(i => i.apprenantId))); + + if (apprenantIds.length === 0) return []; + + // Récupérer les apprenants correspondants + const apprenantsData = await db.select().from(apprenants).where( + sql`${apprenants.id} IN (${sql.join(apprenantIds.map(id => sql`${id}`), sql`, `)})` + ); + + // Pour chaque apprenant, récupérer ses inscriptions (filtrées par les séquences du formateur) + const apprenantsWithInscriptions = await Promise.all( + apprenantsData.map(async (apprenant) => { + const inscriptionsFiltered = await db + .select() + .from(inscriptions) + .where( + and( + eq(inscriptions.apprenantId, apprenant.id), + sql`${inscriptions.sequenceId} IN (${sql.join(sequenceIds.map(id => sql`${id}`), sql`, `)})` + ) + ); + + return { + ...apprenant, + inscriptions: inscriptionsFiltered, + }; + }) + ); + + return apprenantsWithInscriptions; +} + +export async function getApprenantById(id: number): Promise { + const db = await getDb(); + if (!db) return undefined; + + const result = await db.select().from(apprenants).where(eq(apprenants.id, id)).limit(1); + return result.length > 0 ? result[0] : undefined; +} + +export async function getApprenantByEmail(email: string) { + const db = await getDb(); + if (!db) return undefined; + + const result = await db.select().from(apprenants).where(eq(apprenants.email, email)).limit(1); + return result.length > 0 ? result[0] : undefined; +} + +export async function updateApprenant(id: number, data: Partial) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + await db.update(apprenants).set(data).where(eq(apprenants.id, id)); +} + +export async function deleteApprenant(id: number) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + await db.delete(apprenants).where(eq(apprenants.id, id)); +} + +// ==================== INSCRIPTIONS ==================== + +export async function createInscription(data: InsertInscription) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + const result = await db.insert(inscriptions).values(data); + return result; +} + +export async function getAllInscriptions() { + const db = await getDb(); + if (!db) return []; + + const results = await db.select({ + inscription: inscriptions, + apprenant: apprenants, + }) + .from(inscriptions) + .leftJoin(apprenants, eq(inscriptions.apprenantId, apprenants.id)); + + return results; +} + +export async function getInscriptionsBySequence(sequenceId: number) { + const db = await getDb(); + if (!db) return []; + + const results = await db.select({ + inscription: inscriptions, + apprenant: apprenants, + }) + .from(inscriptions) + .leftJoin(apprenants, eq(inscriptions.apprenantId, apprenants.id)) + .where(and( + eq(inscriptions.sequenceId, sequenceId), + ne(inscriptions.statut, 'annulee') + )); + + return results; +} + +export async function getInscriptionsByApprenant(apprenantId: number) { + const db = await getDb(); + if (!db) return []; + + const results = await db.select({ + inscription: inscriptions, + sequence: sequences, + }) + .from(inscriptions) + .leftJoin(sequences, eq(inscriptions.sequenceId, sequences.id)) + .where(and( + eq(inscriptions.apprenantId, apprenantId), + ne(inscriptions.statut, 'annulee') + )); + + return results; +} + +export async function checkExistingInscription(apprenantId: number, sequenceId: number) { + const db = await getDb(); + if (!db) return undefined; + + const result = await db.select() + .from(inscriptions) + .where(and( + eq(inscriptions.apprenantId, apprenantId), + eq(inscriptions.sequenceId, sequenceId), + ne(inscriptions.statut, 'annulee') + )) + .limit(1); + + return result.length > 0 ? result[0] : undefined; +} + +export async function countInscriptionsBySequence(sequenceId: number, statut?: string) { + const db = await getDb(); + if (!db) return 0; + + const conditions = [eq(inscriptions.sequenceId, sequenceId)]; + if (statut) { + conditions.push(eq(inscriptions.statut, statut as any)); + } + + const result = await db.select({ count: sql`count(*)` }) + .from(inscriptions) + .where(and(...conditions)); + + return result[0]?.count || 0; +} + +export async function getInscriptionById(id: number) { + const db = await getDb(); + if (!db) return undefined; + + const result = await db.select().from(inscriptions).where(eq(inscriptions.id, id)).limit(1); + return result.length > 0 ? result[0] : undefined; +} + +export async function updateInscription(id: number, data: Partial) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + await db.update(inscriptions).set(data).where(eq(inscriptions.id, id)); +} + +export async function deleteInscription(id: number) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + await db.delete(inscriptions).where(eq(inscriptions.id, id)); +} + +// ==================== GESTION DES UTILISATEURS ==================== + +export async function createUser(data: InsertUser) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + // Hasher le mot de passe si fourni + if (data.password) { + const bcrypt = await import('bcryptjs'); + data.password = await bcrypt.hash(data.password, 10); + } + + const result = await db.insert(users).values(data); + return result; +} + +export async function getAllUsers() { + const db = await getDb(); + if (!db) return []; + + return await db.select().from(users); +} + +export async function getUserById(id: number) { + const db = await getDb(); + if (!db) return undefined; + + const result = await db.select().from(users).where(eq(users.id, id)).limit(1); + return result.length > 0 ? result[0] : undefined; +} + +export async function updateUser(id: number, data: Partial) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + // Hasher le mot de passe si fourni + if (data.password) { + const bcrypt = await import('bcryptjs'); + data.password = await bcrypt.hash(data.password, 10); + } + + await db.update(users).set(data).where(eq(users.id, id)); +} + +export async function toggleUserStatus(id: number, isActive: boolean) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + await db.update(users).set({ isActive }).where(eq(users.id, id)); +} + +export async function deleteUser(id: number) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + await db.delete(users).where(eq(users.id, id)); +} + + +// ==================== GESTION DES TOKENS DE RÉINITIALISATION ==================== + +export async function createPasswordResetToken(userId: number, token: string, expiresAt: Date) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + const result = await db.insert(passwordResetTokens).values({ + userId, + token, + expiresAt, + used: false, + }); + return result; +} + +export async function getPasswordResetToken(token: string) { + const db = await getDb(); + if (!db) return undefined; + + const result = await db.select() + .from(passwordResetTokens) + .where(eq(passwordResetTokens.token, token)) + .limit(1); + + return result.length > 0 ? result[0] : undefined; +} + +export async function markTokenAsUsed(tokenId: number) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + await db.update(passwordResetTokens) + .set({ used: true }) + .where(eq(passwordResetTokens.id, tokenId)); +} + +export async function deleteExpiredTokens() { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + const now = new Date(); + await db.delete(passwordResetTokens) + .where(sql`${passwordResetTokens.expiresAt} < ${now}`); +} + +// ============================================ +// Email Templates Management +// ============================================ + +/** + * Récupère tous les templates d'emails + */ +export async function getAllEmailTemplates() { + const db = await getDb(); + if (!db) return []; + + return await db.select().from(emailTemplates); +} + +/** + * Récupère un template par son type + */ +export async function getEmailTemplateByType(type: string) { + const db = await getDb(); + if (!db) return null; + + const results = await db.select().from(emailTemplates).where(eq(emailTemplates.type, type)).limit(1); + return results.length > 0 ? results[0] : null; +} + +/** + * Crée ou met à jour un template d'email + */ +export async function upsertEmailTemplate(template: InsertEmailTemplate) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + const existing = await getEmailTemplateByType(template.type); + + if (existing) { + // Mise à jour + await db.update(emailTemplates) + .set({ + name: template.name, + logoUrl: template.logoUrl, + primaryColor: template.primaryColor, + headerBgColor: template.headerBgColor, + headerTextColor: template.headerTextColor, + headerTitle: template.headerTitle, + bodyContent: template.bodyContent, + footerText: template.footerText, + active: template.active, + updatedAt: new Date(), + }) + .where(eq(emailTemplates.type, template.type)); + + return await getEmailTemplateByType(template.type); + } else { + // Création + await db.insert(emailTemplates).values(template); + return await getEmailTemplateByType(template.type); + } +} + +/** + * Supprime un template d'email + */ +export async function deleteEmailTemplate(type: string) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + await db.delete(emailTemplates).where(eq(emailTemplates.type, type)); +} + +/** + * Initialise les templates par défaut si la table est vide + */ +export async function initializeDefaultEmailTemplates() { + const db = await getDb(); + if (!db) return; + + const existing = await getAllEmailTemplates(); + if (existing.length > 0) return; // Déjà initialisé + + const defaultTemplates: InsertEmailTemplate[] = [ + { + type: "inscription", + name: "Confirmation d'inscription", + logoUrl: null, + primaryColor: "#2563eb", + headerBgColor: "#2563eb", + headerTextColor: "#ffffff", + headerTitle: "Formation Manager Itinova", + footerText: "Cet email a été envoyé automatiquement par le système de gestion des formations Itinova. Pour toute question, veuillez contacter le service RH.", + active: true, + }, + { + type: "teaser", + name: "Email teaser", + logoUrl: null, + primaryColor: "#2563eb", + headerBgColor: "#2563eb", + headerTextColor: "#ffffff", + headerTitle: "Formation Manager Itinova", + footerText: "Cet email a été envoyé automatiquement par le système de gestion des formations Itinova. Pour toute question, veuillez contacter le service RH.", + active: true, + }, + { + type: "rappel", + name: "Rappel J-7", + logoUrl: null, + primaryColor: "#2563eb", + headerBgColor: "#2563eb", + headerTextColor: "#ffffff", + headerTitle: "Formation Manager Itinova", + bodyContent: `

Rappel : Votre formation commence bientôt !

+

Bonjour {{prenomApprenant}} {{nomApprenant}},

+ +

Nous vous rappelons que votre formation {{nomFormation}} commence dans une semaine.

+ +
+

Séquence : {{nomSequence}}

+

Dates :

+ {{datesHTML}} +

Lieu : {{lieu}}

+

Formateur : {{formateur}}

+
+ +

N'oubliez pas d'apporter le matériel nécessaire et de vous présenter à l'heure indiquée.

+ +

À très bientôt !

`, + footerText: "Cet email a été envoyé automatiquement par le système de gestion des formations Itinova. Pour toute question, veuillez contacter le service RH.", + active: true, + }, + { + type: "rappelJ1", + name: "Rappel J-1", + logoUrl: null, + primaryColor: "#2563eb", + headerBgColor: "#2563eb", + headerTextColor: "#ffffff", + headerTitle: "Formation Manager Itinova", + bodyContent: `

Rappel : Votre formation commence demain !

+

Bonjour {{prenomApprenant}} {{nomApprenant}},

+ +

Nous vous rappelons que votre formation {{nomFormation}} commence demain.

+ +
+

Séquence : {{nomSequence}}

+

Dates :

+ {{datesHTML}} +

Lieu : {{lieu}}

+

Formateur : {{formateur}}

+
+ +

Merci de vous présenter à l'heure indiquée.

+

N'oubliez pas d'apporter le matériel nécessaire.

+ +

À demain !

`, + footerText: "Cet email a été envoyé automatiquement par le système de gestion des formations Itinova. Pour toute question, veuillez contacter le service RH.", + active: true, + }, + { + type: "rappel3", + name: "Rappel 3", + logoUrl: null, + primaryColor: "#2563eb", + headerBgColor: "#2563eb", + headerTextColor: "#ffffff", + headerTitle: "Formation Manager Itinova", + bodyContent: `

Rappel : Votre formation commence bientôt !

+

Bonjour {{prenomApprenant}} {{nomApprenant}},

+ +

Nous vous rappelons que votre formation {{nomFormation}} commence dans une semaine.

+ +
+

Séquence : {{nomSequence}}

+

Dates :

+ {{datesHTML}} +

Lieu : {{lieu}}

+

Formateur : {{formateur}}

+
+ +

N'oubliez pas d'apporter le matériel nécessaire et de vous présenter à l'heure indiquée.

+ +

À très bientôt !

`, + footerText: "Cet email a été envoyé automatiquement par le système de gestion des formations Itinova. Pour toute question, veuillez contacter le service RH.", + active: true, + }, + { + type: "rappel4", + name: "Rappel 4", + logoUrl: null, + primaryColor: "#2563eb", + headerBgColor: "#2563eb", + headerTextColor: "#ffffff", + headerTitle: "Formation Manager Itinova", + bodyContent: `

Rappel : Votre formation commence bientôt !

+

Bonjour {{prenomApprenant}} {{nomApprenant}},

+ +

Nous vous rappelons que votre formation {{nomFormation}} commence dans une semaine.

+ +
+

Séquence : {{nomSequence}}

+

Dates :

+ {{datesHTML}} +

Lieu : {{lieu}}

+

Formateur : {{formateur}}

+
+ +

N'oubliez pas d'apporter le matériel nécessaire et de vous présenter à l'heure indiquée.

+ +

À très bientôt !

`, + footerText: "Cet email a été envoyé automatiquement par le système de gestion des formations Itinova. Pour toute question, veuillez contacter le service RH.", + active: true, + }, + { + type: "rappel5", + name: "Rappel 5", + logoUrl: null, + primaryColor: "#2563eb", + headerBgColor: "#2563eb", + headerTextColor: "#ffffff", + headerTitle: "Formation Manager Itinova", + bodyContent: `

Rappel : Votre formation commence bientôt !

+

Bonjour {{prenomApprenant}} {{nomApprenant}},

+ +

Nous vous rappelons que votre formation {{nomFormation}} commence dans une semaine.

+ +
+

Séquence : {{nomSequence}}

+

Dates :

+ {{datesHTML}} +

Lieu : {{lieu}}

+

Formateur : {{formateur}}

+
+ +

N'oubliez pas d'apporter le matériel nécessaire et de vous présenter à l'heure indiquée.

+ +

À très bientôt !

`, + footerText: "Cet email a été envoyé automatiquement par le système de gestion des formations Itinova. Pour toute question, veuillez contacter le service RH.", + active: true, + }, + { + type: "rappel6", + name: "Rappel 6", + logoUrl: null, + primaryColor: "#2563eb", + headerBgColor: "#2563eb", + headerTextColor: "#ffffff", + headerTitle: "Formation Manager Itinova", + bodyContent: `

Rappel : Votre formation commence bientôt !

+

Bonjour {{prenomApprenant}} {{nomApprenant}},

+ +

Nous vous rappelons que votre formation {{nomFormation}} commence dans une semaine.

+ +
+

Séquence : {{nomSequence}}

+

Dates :

+ {{datesHTML}} +

Lieu : {{lieu}}

+

Formateur : {{formateur}}

+
+ +

N'oubliez pas d'apporter le matériel nécessaire et de vous présenter à l'heure indiquée.

+ +

À très bientôt !

`, + footerText: "Cet email a été envoyé automatiquement par le système de gestion des formations Itinova. Pour toute question, veuillez contacter le service RH.", + active: true, + }, + { + type: "reset_password", + name: "Réinitialisation de mot de passe", + logoUrl: null, + primaryColor: "#2563eb", + headerBgColor: "#2563eb", + headerTextColor: "#ffffff", + headerTitle: "Formation Manager Itinova", + footerText: "Cet email a été envoyé automatiquement par le système de gestion des formations Itinova. Pour toute question, veuillez contacter le service RH.", + active: true, + }, + ]; + + for (const template of defaultTemplates) { + await db.insert(emailTemplates).values(template); + } + + console.log("[DB] Templates d'emails par défaut initialisés"); +} + + +// ==================== Email Config ==================== + +/** + * Récupère la configuration email active + */ +export async function getActiveEmailConfig() { + const db = await getDb(); + if (!db) return undefined; + + const result = await db + .select() + .from(emailConfig) + .where(eq(emailConfig.active, true)) + .limit(1); + + return result.length > 0 ? result[0] : undefined; +} + +/** + * Crée ou met à jour la configuration email + */ +export async function upsertEmailConfig(data: InsertEmailConfig) { + const db = await getDb(); + if (!db) return; + + // Vérifier s'il existe déjà une configuration active + const existing = await db + .select() + .from(emailConfig) + .where(eq(emailConfig.active, true)) + .limit(1); + + if (existing.length > 0) { + // Mettre à jour la configuration existante + await db + .update(emailConfig) + .set({ + ...data, + updatedAt: new Date(), + }) + .where(eq(emailConfig.id, existing[0].id)); + } else { + // Créer une nouvelle configuration + await db.insert(emailConfig).values({ + ...data, + active: true, + }); + } +} + +/** + * Met à jour la configuration email + */ +export async function updateEmailConfig(id: number, data: Partial) { + const db = await getDb(); + if (!db) return; + + await db + .update(emailConfig) + .set({ + ...data, + updatedAt: new Date(), + }) + .where(eq(emailConfig.id, id)); +} + + +// ==================== FORMATEURS ==================== + +export async function createFormateur(data: InsertFormateur) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + const result = await db.insert(formateurs).values(data); + return result; +} + +export async function getFormateurs() { + const db = await getDb(); + if (!db) return []; + + return await db.select().from(formateurs); +} + +export async function getFormateurById(id: number): Promise { + const db = await getDb(); + if (!db) return undefined; + + const result = await db.select().from(formateurs).where(eq(formateurs.id, id)).limit(1); + return result.length > 0 ? result[0] : undefined; +} + +export async function updateFormateur(id: number, data: Partial) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + await db.update(formateurs).set(data).where(eq(formateurs.id, id)); +} + +export async function deleteFormateur(id: number) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + await db.delete(formateurs).where(eq(formateurs.id, id)); +} + + +// ==================== RAPPELS ==================== + +export async function createRappel(data: InsertRappel & { fichier?: { nomFichier: string; urlFichier: string; s3Key: string; typeFichier: string; tailleFichier: number; } | null }) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + // Construire un objet d'insertion explicite + const insertData: Partial = { + nom: data.nom, + templateType: data.templateType, + timing: data.timing, + joursAvant: data.joursAvant, + heureEnvoi: data.heureEnvoi, + actif: data.actif, + }; + + // Ajouter les champs de fichier si présents + if (data.fichier) { + insertData.nomFichier = data.fichier.nomFichier; + insertData.urlFichier = data.fichier.urlFichier; + insertData.s3Key = data.fichier.s3Key; + insertData.typeFichier = data.fichier.typeFichier; + insertData.tailleFichier = data.fichier.tailleFichier; + } + + const result = await db.insert(rappels).values(insertData as InsertRappel); + return result; +} + +export async function getRappels() { + const db = await getDb(); + if (!db) return []; + + const allRappels = await db.select().from(rappels).orderBy(rappels.joursAvant); + + // Pour chaque rappel, récupérer les dates de formation associées avec leurs infos + const rappelsWithDates = await Promise.all( + allRappels.map(async (rappel) => { + const dateFormationIds = await getRappelDates(rappel.id); + + // Récupérer les détails des dates de formation + const datesDetails = await Promise.all( + dateFormationIds.map(async (dateId) => { + const dateFormationResult = await db.select().from(datesFormation).where(eq(datesFormation.id, dateId)).limit(1); + if (dateFormationResult.length === 0) return null; + + const dateFormation = dateFormationResult[0]; + const sequenceResult = await db.select().from(sequences).where(eq(sequences.id, dateFormation.sequenceId)).limit(1); + if (sequenceResult.length === 0) return null; + + const sequence = sequenceResult[0]; + const formationResult = await db.select().from(formations).where(eq(formations.id, sequence.formationId)).limit(1); + if (formationResult.length === 0) return null; + + const formation = formationResult[0]; + + return { + dateFormationId: dateFormation.id, + dateDebut: dateFormation.dateDebut, + dateFin: dateFormation.dateFin, + ordre: dateFormation.ordre, + sequenceId: sequence.id, + sequenceNom: sequence.nom, + formationId: formation.id, + formationNom: formation.nom, + }; + }) + ); + + return { + ...rappel, + dateFormationIds, + datesDetails: datesDetails.filter(d => d !== null), + }; + }) + ); + + return rappelsWithDates; +} + +export async function getRappelById(id: number): Promise { + const db = await getDb(); + if (!db) return undefined; + + const result = await db.select().from(rappels).where(eq(rappels.id, id)).limit(1); + return result.length > 0 ? result[0] : undefined; +} + +export async function getActiveRappels(): Promise { + const db = await getDb(); + if (!db) return []; + + return await db.select().from(rappels).where(eq(rappels.actif, true)); +} + +export async function updateRappel(id: number, data: Partial & { fichier?: { nomFichier: string; urlFichier: string; s3Key: string; typeFichier: string; tailleFichier: number; } | null }) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + const updateData: any = { ...data }; + + // Gérer les champs de fichier + if ('fichier' in data) { + delete updateData.fichier; + if (data.fichier) { + updateData.nomFichier = data.fichier.nomFichier; + updateData.urlFichier = data.fichier.urlFichier; + updateData.s3Key = data.fichier.s3Key; + updateData.typeFichier = data.fichier.typeFichier; + updateData.tailleFichier = data.fichier.tailleFichier; + } else { + // Supprimer le fichier + updateData.nomFichier = null; + updateData.urlFichier = null; + updateData.s3Key = null; + updateData.typeFichier = null; + updateData.tailleFichier = null; + } + } + + await db.update(rappels).set({ + ...updateData, + updatedAt: new Date(), + }).where(eq(rappels.id, id)); +} + +export async function deleteRappel(id: number) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + // Supprimer d'abord les associations + await db.delete(rappelDates).where(eq(rappelDates.rappelId, id)); + // Puis le rappel + await db.delete(rappels).where(eq(rappels.id, id)); +} + +// ==================== RAPPEL DATES ==================== + +export async function createRappelDates(rappelId: number, dateFormationIds: number[]) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + if (dateFormationIds.length === 0) return; + + const values = dateFormationIds.map(dateFormationId => ({ + rappelId, + dateFormationId, + })); + + await db.insert(rappelDates).values(values); +} + +export async function deleteRappelDates(rappelId: number) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + await db.delete(rappelDates).where(eq(rappelDates.rappelId, rappelId)); +} + +export async function getRappelDates(rappelId: number): Promise { + const db = await getDb(); + if (!db) return []; + + const results = await db.select().from(rappelDates).where(eq(rappelDates.rappelId, rappelId)); + return results.map(r => r.dateFormationId); +} + +export async function updateRappelExecution(id: number) { + const db = await getDb(); + if (!db) return; + + await db.update(rappels).set({ + derniereExecution: new Date(), + }).where(eq(rappels.id, id)); +} + +export async function getRappelsByDateFormation(dateFormationId: number) { + const db = await getDb(); + if (!db) return []; + + // Récupérer les IDs des rappels associés à cette date + const rappelDatesResults = await db.select().from(rappelDates).where(eq(rappelDates.dateFormationId, dateFormationId)); + const rappelIds = rappelDatesResults.map(rd => rd.rappelId); + + if (rappelIds.length === 0) { + // Retourner tous les rappels actifs qui n'ont pas de dates spécifiques (rappels globaux) + const allRappels = await db.select().from(rappels).where(eq(rappels.actif, true)); + const globalRappels = []; + + for (const rappel of allRappels) { + const dates = await getRappelDates(rappel.id); + if (dates.length === 0) { + globalRappels.push(rappel); + } + } + + return globalRappels; + } + + // Récupérer les détails des rappels + const rappelsResults = await Promise.all( + rappelIds.map(async (id) => { + const rappelResult = await db.select().from(rappels).where(eq(rappels.id, id)).limit(1); + return rappelResult.length > 0 ? rappelResult[0] : null; + }) + ); + + // Filtrer les null et retourner + return rappelsResults.filter((r): r is Rappel => r !== null); +} + + +// ==================== UTILISATEURS ADMIN ==================== + +/** + * Récupère tous les utilisateurs avec le rôle admin + */ +export async function getAdminUsers() { + const db = await getDb(); + if (!db) return []; + + return await db.select().from(users).where(eq(users.role, 'admin')); +} diff --git a/deployment-package/source_server/emailPreview.ts b/deployment-package/source_server/emailPreview.ts new file mode 100644 index 0000000..9628c4d --- /dev/null +++ b/deployment-package/source_server/emailPreview.ts @@ -0,0 +1,177 @@ +/** + * Génération d'aperçus d'emails avec données réelles + */ + +import * as db from "./db"; +import { generateEmailFromTemplate } from "./emailTemplateGenerator"; + +export interface EmailPreviewParams { + sequenceId: number; + type: 'teaser' | 'rappel' | 'rappel_j1'; + apprenantId?: number; // Si non fourni, prendre le premier apprenant inscrit +} + +export async function generateEmailPreview(params: EmailPreviewParams): Promise<{ + html: string; + subject: string; + recipient: { + email: string; + nom: string; + prenom: string; + }; +}> { + // Récupérer la séquence + const sequence = await db.getSequenceById(params.sequenceId); + if (!sequence) { + throw new Error('Séquence non trouvée'); + } + + // Récupérer la formation + const formation = await db.getFormationById(sequence.formationId); + if (!formation) { + throw new Error('Formation non trouvée'); + } + + // Récupérer les dates + const dates = await db.getDatesBySequence(sequence.id); + if (dates.length === 0) { + throw new Error('Aucune date trouvée pour cette séquence'); + } + + // Récupérer le formateur si disponible + let formateurNom: string | undefined; + if (sequence.formateurId) { + const formateur = await db.getFormateurById(sequence.formateurId); + formateurNom = formateur?.nom; + } + + // Récupérer un apprenant inscrit + const inscriptions = await db.getInscriptionsBySequence(params.sequenceId); + const confirmedInscriptions = inscriptions.filter(i => i.inscription.statut === 'confirmee' && i.apprenant); + + if (confirmedInscriptions.length === 0) { + throw new Error('Aucun apprenant confirmé trouvé pour cette séquence'); + } + + // Utiliser l'apprenant spécifié ou le premier de la liste + let selectedInscription = confirmedInscriptions[0]; + if (params.apprenantId) { + const found = confirmedInscriptions.find(i => i.apprenant!.id === params.apprenantId); + if (found) { + selectedInscription = found; + } + } + + const apprenant = selectedInscription.apprenant!; + + // Préparer les données pour l'email + const fonctionLabel = apprenant.fonction === 'directeur' ? 'Directeur' : + apprenant.fonction === 'chef_service' ? 'Chef de service' : ''; + const salutation = fonctionLabel ? `${fonctionLabel} ${apprenant.prenom} ${apprenant.nom}` : apprenant.prenom; + + const datesHTML = dates.map(date => ` +
+ Date ${date.ordre} : ${new Date(date.dateDebut).toLocaleDateString('fr-FR', { + weekday: 'long', + year: 'numeric', + month: 'long', + day: 'numeric' + })} +
+ `).join(''); + + // Générer le contenu selon le type + let content: string; + let subject: string; + + if (params.type === 'teaser') { + content = ` +

Votre formation approche !

+

Bonjour ${salutation},

+ +

Nous sommes ravis de vous accueillir prochainement pour la formation ${formation.nom}.

+ +
+

Séquence : ${sequence.nom}

+

Dates :

+ ${datesHTML} + ${sequence.lieu ? `

Lieu : ${sequence.lieu}

` : ''} + ${formateurNom ? `

Formateur : ${formateurNom}

` : ''} +
+ +

Préparez-vous à vivre une expérience enrichissante qui vous permettra de développer vos compétences managériales.

+ +

À très bientôt !

+ `; + subject = `Votre formation ${formation.nom} approche !`; + } else if (params.type === 'rappel') { + // Rappel J-7 + content = ` +

Rappel : Votre formation commence bientôt !

+

Bonjour ${salutation},

+ +

Nous vous rappelons que votre formation ${formation.nom} commence dans une semaine.

+ +
+

Séquence : ${sequence.nom}

+

Dates :

+ ${datesHTML} + ${sequence.lieu ? `

Lieu : ${sequence.lieu}

` : ''} + ${formateurNom ? `

Formateur : ${formateurNom}

` : ''} +
+ +

N'oubliez pas d'apporter le matériel nécessaire et de vous présenter à l'heure indiquée.

+ +

À très bientôt !

+ `; + subject = `Rappel J-7 : Formation ${formation.nom}`; + } else { + // Rappel J-1 + content = ` +

Rappel : Votre formation commence demain !

+

Bonjour ${salutation},

+ +

Nous vous rappelons que votre formation ${formation.nom} commence demain.

+ +
+

Séquence : ${sequence.nom}

+

Dates :

+ ${datesHTML} + ${sequence.lieu ? `

Lieu : ${sequence.lieu}

` : ''} + ${formateurNom ? `

Formateur : ${formateurNom}

` : ''} +
+ +

Merci de vous présenter à l'heure indiquée.

+

N'oubliez pas d'apporter le matériel nécessaire.

+ +

À demain !

+ `; + subject = `Rappel J-1 : Formation ${formation.nom} - C'est demain !`; + } + + // Préparer les variables + const variables = { + nomApprenant: apprenant.nom, + prenomApprenant: apprenant.prenom, + nomFormation: formation.nom, + nomSequence: sequence.nom, + dateDebut: new Date(dates[0].dateDebut).toLocaleDateString('fr-FR'), + dateFin: new Date(dates[dates.length - 1].dateFin).toLocaleDateString('fr-FR'), + datesHTML: datesHTML, // Ajouter le HTML des dates + lieu: sequence.lieu || '', + formateur: formateurNom || '', + }; + + // Générer le HTML final avec le template + const html = await generateEmailFromTemplate(params.type === 'teaser' ? 'teaser' : 'rappel', content, variables); + + return { + html, + subject, + recipient: { + email: apprenant.email, + nom: apprenant.nom, + prenom: apprenant.prenom, + }, + }; +} diff --git a/deployment-package/source_server/emailService.ts b/deployment-package/source_server/emailService.ts new file mode 100644 index 0000000..68f2790 --- /dev/null +++ b/deployment-package/source_server/emailService.ts @@ -0,0 +1,1023 @@ +/** + * Service d'envoi d'emails pour les formations + * Utilise le système de notification Manus pour envoyer des emails + */ + +import { generateFormationICS } from "./icsGenerator"; +import { sendEmail as sendEmailViaService, isEmailServiceConfigured } from "./_core/emailSender"; +import { generateEmailFromTemplate } from "./emailTemplateGenerator"; +import { EmailVariables } from "./emailTemplateUtils"; + +interface EmailParams { + to: string; + subject: string; + html: string; + attachments?: Array<{ + filename: string; + content: string; + contentType: string; + }>; +} + +/** + * Envoie un email via le service d'envoi configuré + * Utilise Resend si RESEND_API_KEY est configuré, sinon simule l'envoi + */ +async function sendEmail(params: EmailParams): Promise { + return await sendEmailViaService(params); +} + +/** + * Template HTML de base pour les emails (avec template personnalisé) + */ +async function getEmailTemplate( + content: string, + templateType: string = 'inscription', + variables?: EmailVariables +): Promise { + return await generateEmailFromTemplate(templateType, content, variables); +} + +/** + * Envoie un email de confirmation d'inscription avec invitations Outlook pour toutes les dates + */ +export async function sendInscriptionConfirmation(params: { + apprenantEmail: string; + apprenantNom: string; + apprenantPrenom: string; + apprenantFonction: string; + formationNom: string; + sequenceNom: string; + dates: Array<{ dateDebut: Date; dateFin: Date; ordre: number }>; + lieu: string; + statut: 'confirmee' | 'liste_attente'; +}): Promise { + const isConfirmed = params.statut === 'confirmee'; + const fonctionLabel = params.apprenantFonction === 'directeur' ? 'Directeur' : + params.apprenantFonction === 'chef_service' ? 'Chef de service' : 'Autre'; + + // Générer la liste des dates + const datesHTML = params.dates.map(date => ` +
+ Date ${date.ordre} :
+ Du ${date.dateDebut.toLocaleDateString('fr-FR', { + weekday: 'long', + year: 'numeric', + month: 'long', + day: 'numeric', + hour: '2-digit', + minute: '2-digit' + })}
+ au ${date.dateFin.toLocaleDateString('fr-FR', { + weekday: 'long', + year: 'numeric', + month: 'long', + day: 'numeric', + hour: '2-digit', + minute: '2-digit' + })} +
+ `).join(''); + + const content = ` +

Confirmation d'inscription

+

Bonjour ${fonctionLabel} ${params.apprenantPrenom} ${params.apprenantNom},

+ + ${isConfirmed + ? '

Votre inscription a été confirmée !

' + : '

Vous avez été ajouté à la liste d\'attente.

' + } + +
+

Détails de la formation

+

Formation : ${params.formationNom}

+

Séquence : ${params.sequenceNom}

+

Lieu : ${params.lieu}

+

Dates de formation (${params.dates.length} séance${params.dates.length > 1 ? 's' : ''}) :

+ ${datesHTML} +
+ + ${isConfirmed + ? `

Des invitations Outlook sont jointes à cet email pour chaque date de formation. Merci de les ajouter à votre calendrier pour bloquer votre agenda.

+

Important : Les inscriptions seront bloquées 15 jours avant le début de la séquence. Après cette date, aucune modification ne sera possible.

` + : '

Nous vous contacterons dès qu\'une place se libère.

' + } + +

À bientôt pour cette formation !

+ `; + + // Générer une invitation ICS pour chaque date + const attachments = isConfirmed ? params.dates.map((date, index) => ({ + filename: `invitation_date_${date.ordre}.ics`, + content: generateFormationICS({ + formationNom: params.formationNom, + sessionNom: `${params.sequenceNom} - Date ${date.ordre}`, + dateDebut: date.dateDebut, + dateFin: date.dateFin, + lieu: params.lieu, + apprenantNom: params.apprenantNom, + apprenantPrenom: params.apprenantPrenom, + apprenantEmail: params.apprenantEmail, + }), + contentType: 'text/calendar', + })) : undefined; + + // Préparer les variables pour le remplacement (avec alias pour compatibilité) + const variables: EmailVariables = { + nomApprenant: params.apprenantNom, + prenomApprenant: params.apprenantPrenom, + nomFormation: params.formationNom, + nomSequence: params.sequenceNom, + dateDebut: params.dates[0]?.dateDebut.toLocaleDateString('fr-FR') || '', + dateFin: params.dates[params.dates.length - 1]?.dateFin.toLocaleDateString('fr-FR') || '', + lieu: params.lieu, + datesHTML: datesHTML, // HTML formaté de toutes les dates + // Alias pour compatibilité avec les templates utilisant les noms courts + nom: params.apprenantNom, + prenom: params.apprenantPrenom, + formation: params.formationNom, + sequence: params.sequenceNom, + }; + + return sendEmail({ + to: params.apprenantEmail, + subject: isConfirmed + ? `Confirmation d'inscription - ${params.formationNom}` + : `Liste d'attente - ${params.formationNom}`, + html: await getEmailTemplate(content, 'inscription', variables), + attachments, + }); +} + +/** + * Envoie un email teaser pour une séquence + */ +export async function sendTeaserEmail(params: { + apprenantEmail: string; + apprenantPrenom: string; + apprenantNom: string; + apprenantFonction: string; + formationNom: string; + sequenceNom: string; + dates: Array<{ dateDebut: Date; dateFin: Date; ordre: number }>; + lieu?: string; + formateur?: string; +}): Promise { + const fonctionLabel = params.apprenantFonction === 'directeur' ? 'Directeur' : + params.apprenantFonction === 'chef_service' ? 'Chef de service' : ''; + const salutation = fonctionLabel ? `${fonctionLabel} ${params.apprenantPrenom} ${params.apprenantNom}` : params.apprenantPrenom; + + const datesHTML = params.dates.map(date => ` +
+ Date ${date.ordre} : ${date.dateDebut.toLocaleDateString('fr-FR', { + weekday: 'long', + year: 'numeric', + month: 'long', + day: 'numeric' + })} +
+ `).join(''); + + const content = ` +

Votre formation approche !

+

Bonjour ${salutation},

+ +

Nous sommes ravis de vous accueillir prochainement pour la formation ${params.formationNom}.

+ +
+

Séquence : ${params.sequenceNom}

+

Dates :

+ ${datesHTML} + ${params.lieu ? `

Lieu : ${params.lieu}

` : ''} + ${params.formateur ? `

Formateur : ${params.formateur}

` : ''} +
+ +

Préparez-vous à vivre une expérience enrichissante qui vous permettra de développer vos compétences managériales.

+ +

À très bientôt !

+ `; + + const variables = { + nomApprenant: params.apprenantNom, + prenomApprenant: params.apprenantPrenom, + nomFormation: params.formationNom, + nomSequence: params.sequenceNom, + dateDebut: params.dates[0]?.dateDebut.toLocaleDateString('fr-FR') || '', + dateFin: params.dates[params.dates.length - 1]?.dateFin.toLocaleDateString('fr-FR') || '', + datesHTML: datesHTML, // Ajouter le HTML des dates + lieu: params.lieu || '', + formateur: params.formateur || '', + }; + + return sendEmail({ + to: params.apprenantEmail, + subject: `Votre formation ${params.formationNom} approche !`, + html: await getEmailTemplate(content, 'teaser', variables), + }); +} + +/** + * Envoie un email de rappel J-7 + */ +export async function sendRappelJ7Email(params: { + apprenantEmail: string; + apprenantPrenom: string; + apprenantNom: string; + apprenantFonction: string; + formationNom: string; + sequenceNom: string; + dates: Array<{ dateDebut: Date; dateFin: Date; ordre: number }>; + lieu: string; + formateur?: string; + attachmentUrl?: string; + attachmentFilename?: string; + attachmentMimeType?: string; +}): Promise { + const fonctionLabel = params.apprenantFonction === 'directeur' ? 'Directeur' : + params.apprenantFonction === 'chef_service' ? 'Chef de service' : ''; + const salutation = fonctionLabel ? `${fonctionLabel} ${params.apprenantPrenom} ${params.apprenantNom}` : params.apprenantPrenom; + + const datesHTML = params.dates.map(date => ` +
+ Date ${date.ordre} :
+ ${date.dateDebut.toLocaleDateString('fr-FR', { + weekday: 'long', + year: 'numeric', + month: 'long', + day: 'numeric', + hour: '2-digit', + minute: '2-digit' + })} +
+ `).join(''); + + const content = ` +

Rappel : Votre formation dans 7 jours

+

Bonjour ${salutation},

+ +

Nous vous rappelons que votre formation ${params.formationNom} commence dans 7 jours.

+ +
+

Informations pratiques

+

Séquence : ${params.sequenceNom}

+

Lieu : ${params.lieu}

+ ${params.formateur ? `

Formateur : ${params.formateur}

` : ''} +

Dates :

+ ${datesHTML} +
+ +

Merci de vous présenter à l'heure indiquée.

+ +

Si vous avez des questions, n'hésitez pas à contacter le service RH.

+ +

À très bientôt !

+ `; + + const variables = { + nomApprenant: params.apprenantNom, + prenomApprenant: params.apprenantPrenom, + nomFormation: params.formationNom, + nomSequence: params.sequenceNom, + dateDebut: params.dates[0]?.dateDebut.toLocaleDateString('fr-FR') || '', + dateFin: params.dates[params.dates.length - 1]?.dateFin.toLocaleDateString('fr-FR') || '', + datesHTML: datesHTML, // Ajouter le HTML des dates + lieu: params.lieu, + formateur: params.formateur || '', + }; + + // Préparer les pièces jointes si nécessaire + const attachments: Array<{ filename: string; content: string; contentType: string }> = []; + + if (params.attachmentUrl && params.attachmentFilename && params.attachmentMimeType) { + try { + // Télécharger le fichier depuis S3 et le convertir en base64 + const response = await fetch(params.attachmentUrl); + const buffer = await response.arrayBuffer(); + const base64 = Buffer.from(buffer).toString('base64'); + + attachments.push({ + filename: params.attachmentFilename, + content: base64, + contentType: params.attachmentMimeType, + }); + } catch (error) { + console.error('[Email] Erreur lors du téléchargement de la pièce jointe:', error); + // Continuer l'envoi sans la pièce jointe + } + } + + return sendEmail({ + to: params.apprenantEmail, + subject: `Rappel J-7 : ${params.formationNom}`, + html: await getEmailTemplate(content, 'rappel', variables), + attachments: attachments.length > 0 ? attachments : undefined, + }); +} + +/** + * Envoie un email de rappel J-1 à un apprenant + */ +export async function sendRappelJ1Email(params: { + apprenantEmail: string; + apprenantNom: string; + apprenantPrenom: string; + apprenantFonction: string; + formationNom: string; + sequenceNom: string; + dates: Array<{ dateDebut: Date; dateFin: Date; ordre: number }>; + lieu?: string; + formateur?: string; + attachmentUrl?: string; + attachmentFilename?: string; + attachmentMimeType?: string; +}): Promise { + const fonctionLabel = params.apprenantFonction === 'directeur' ? 'Directeur' : + params.apprenantFonction === 'chef_service' ? 'Chef de service' : ''; + const salutation = fonctionLabel ? `${fonctionLabel} ${params.apprenantPrenom} ${params.apprenantNom}` : params.apprenantPrenom; + + const datesHTML = params.dates.map(date => ` +
+ Date ${date.ordre} : ${date.dateDebut.toLocaleDateString('fr-FR', { + weekday: 'long', + year: 'numeric', + month: 'long', + day: 'numeric', + hour: '2-digit', + minute: '2-digit' + })} - ${date.dateFin.toLocaleDateString('fr-FR', { + hour: '2-digit', + minute: '2-digit' + })} +
+ `).join(''); + + const content = ` +

Rappel : Votre formation commence demain !

+

Bonjour ${salutation},

+ +

Nous vous rappelons que votre formation ${params.formationNom} commence demain.

+ +
+

Informations pratiques

+

Séquence : ${params.sequenceNom}

+ ${params.lieu ? `

Lieu : ${params.lieu}

` : ''} + ${params.formateur ? `

Formateur : ${params.formateur}

` : ''} +

Dates :

+ ${datesHTML} +
+ +

Merci de vous présenter à l'heure indiquée.

+

N'oubliez pas d'apporter le matériel nécessaire.

+ +

Si vous avez des questions de dernière minute, n'hésitez pas à contacter le service RH.

+ +

À demain !

+ `; + + const variables = { + nomApprenant: params.apprenantNom, + prenomApprenant: params.apprenantPrenom, + nomFormation: params.formationNom, + nomSequence: params.sequenceNom, + dateDebut: params.dates[0]?.dateDebut.toLocaleDateString('fr-FR') || '', + dateFin: params.dates[params.dates.length - 1]?.dateFin.toLocaleDateString('fr-FR') || '', + datesHTML: datesHTML, // Ajouter le HTML des dates + lieu: params.lieu || '', + formateur: params.formateur || '', + }; + + // Préparer les pièces jointes si nécessaire + const attachments: Array<{ filename: string; content: string; contentType: string }> = []; + + if (params.attachmentUrl && params.attachmentFilename && params.attachmentMimeType) { + try { + // Télécharger le fichier depuis S3 et le convertir en base64 + const response = await fetch(params.attachmentUrl); + const buffer = await response.arrayBuffer(); + const base64 = Buffer.from(buffer).toString('base64'); + + attachments.push({ + filename: params.attachmentFilename, + content: base64, + contentType: params.attachmentMimeType, + }); + } catch (error) { + console.error('[Email] Erreur lors du téléchargement de la pièce jointe:', error); + // Continuer l'envoi sans la pièce jointe + } + } + + return sendEmail({ + to: params.apprenantEmail, + subject: `Rappel J-1 : ${params.formationNom} - C'est demain !`, + html: await getEmailTemplate(content, 'rappel', variables), + attachments: attachments.length > 0 ? attachments : undefined, + }); +} + +/** + * Envoie des emails groupés à tous les inscrits d'une séquence + */ +export async function sendGroupEmail(params: { + recipients: Array<{ email: string; prenom: string; nom: string; fonction: string }>; + formationNom: string; + sequenceNom: string; + type: 'teaser' | 'rappel' | 'rappel_j1'; + dates: Array<{ dateDebut: Date; dateFin: Date; ordre: number }>; + lieu?: string; + formateur?: string; +}): Promise<{ sent: number; failed: number }> { + let sent = 0; + let failed = 0; + + for (const recipient of params.recipients) { + try { + if (params.type === 'teaser') { + await sendTeaserEmail({ + apprenantEmail: recipient.email, + apprenantPrenom: recipient.prenom, + apprenantNom: recipient.nom, + apprenantFonction: recipient.fonction, + formationNom: params.formationNom, + sequenceNom: params.sequenceNom, + dates: params.dates, + lieu: params.lieu, + formateur: params.formateur, + }); + } else if (params.type === 'rappel') { + await sendRappelJ7Email({ + apprenantEmail: recipient.email, + apprenantPrenom: recipient.prenom, + apprenantNom: recipient.nom, + apprenantFonction: recipient.fonction, + formationNom: params.formationNom, + sequenceNom: params.sequenceNom, + dates: params.dates, + lieu: params.lieu || '', + formateur: params.formateur, + }); + } else { + // rappel_j1 + await sendRappelJ1Email({ + apprenantEmail: recipient.email, + apprenantPrenom: recipient.prenom, + apprenantNom: recipient.nom, + apprenantFonction: recipient.fonction, + formationNom: params.formationNom, + sequenceNom: params.sequenceNom, + dates: params.dates, + lieu: params.lieu, + formateur: params.formateur, + }); + } + sent++; + } catch (error) { + console.error(`Erreur envoi email à ${recipient.email}:`, error); + failed++; + } + } + + return { sent, failed }; +} + +/** + * Envoie un email de réinitialisation de mot de passe + */ +export async function sendPasswordResetEmail(params: { + apprenantEmail: string; + apprenantNom: string; + apprenantPrenom: string; + resetLink: string; +}): Promise { + const content = ` +

Réinitialisation de mot de passe

+

Bonjour ${params.apprenantPrenom} ${params.apprenantNom},

+ +

Vous avez demandé la réinitialisation de votre mot de passe pour votre compte Manager Itinova.

+ +

Cliquez sur le bouton ci-dessous pour créer un nouveau mot de passe :

+ +
+ +

Ou copiez ce lien dans votre navigateur :

+
+ ${params.resetLink} +
+ +
+

⚠️ Important :

+
    +
  • Ce lien est valide pendant 24 heures seulement
  • +
  • Il ne peut être utilisé qu'une seule fois
  • +
  • Si vous n'avez pas demandé cette réinitialisation, ignorez cet email
  • +
+
+ +

Pour toute question, contactez le service RH.

+ `; + + return sendEmail({ + to: params.apprenantEmail, + subject: 'Réinitialisation de votre mot de passe - Manager Itinova', + html: await getEmailTemplate(content, 'reset_password'), + }); +} + + +/** + * ======================================== + * SYSTÈME DE NOTIFICATIONS ENRICHI + * ======================================== + */ + +/** + * Envoie un email de remerciement post-formation à un apprenant + */ +export async function sendRemerciementPostFormation(params: { + apprenantEmail: string; + apprenantNom: string; + apprenantPrenom: string; + apprenantFonction: string; + formationNom: string; + sequenceNom: string; + formateurNom?: string; + lienQuestionnaire?: string; +}): Promise { + const fonctionLabel = params.apprenantFonction === 'directeur' ? 'Directeur' : + params.apprenantFonction === 'chef_service' ? 'Chef de service' : ''; + const salutation = fonctionLabel ? `${fonctionLabel} ${params.apprenantPrenom} ${params.apprenantNom}` : params.apprenantPrenom; + + const content = ` +

Merci pour votre participation !

+

Bonjour ${salutation},

+ +

Nous tenons à vous remercier pour votre participation à la formation ${params.formationNom} (${params.sequenceNom}).

+ + ${params.formateurNom ? `

Nous espérons que les sessions animées par ${params.formateurNom} ont répondu à vos attentes.

` : ''} + +
+

Votre avis compte !

+

Afin d'améliorer continuellement nos formations, nous vous invitons à partager votre retour d'expérience.

+ ${params.lienQuestionnaire ? ` + + ` : '

Un questionnaire de satisfaction vous sera envoyé prochainement.

'} +
+ +

Nous vous souhaitons une excellente continuation dans vos fonctions et espérons vous revoir lors de prochaines formations.

+ +

Cordialement,
L'équipe Formation

+ `; + + const variables = { + nomApprenant: params.apprenantNom, + prenomApprenant: params.apprenantPrenom, + nomFormation: params.formationNom, + nomSequence: params.sequenceNom, + formateur: params.formateurNom || '', + }; + + return sendEmail({ + to: params.apprenantEmail, + subject: `Merci pour votre participation - ${params.formationNom}`, + html: await getEmailTemplate(content, 'remerciement', variables), + }); +} + +/** + * Envoie une notification au formateur pour une nouvelle inscription + */ +export async function sendNotificationFormateurNouvelleInscription(params: { + formateurEmail: string; + formateurNom: string; + apprenantNom: string; + apprenantPrenom: string; + apprenantFonction: string; + apprenantEtablissement?: string; + formationNom: string; + sequenceNom: string; + nbInscrits: number; + capaciteMax: number; + dates: Array<{ dateDebut: Date; dateFin: Date; ordre: number }>; +}): Promise { + const fonctionLabel = params.apprenantFonction === 'directeur' ? 'Directeur' : + params.apprenantFonction === 'chef_service' ? 'Chef de service' : 'Autre'; + + const datesHTML = params.dates.map(date => ` +
  • Date ${date.ordre} : ${date.dateDebut.toLocaleDateString('fr-FR', { + weekday: 'long', + day: 'numeric', + month: 'long', + year: 'numeric' + })}
  • + `).join(''); + + const content = ` +

    🎓 Nouvelle inscription à votre formation

    +

    Bonjour ${params.formateurNom},

    + +

    Un nouvel apprenant vient de s'inscrire à votre formation.

    + +
    +

    Détails de l'inscription

    +

    Apprenant : ${params.apprenantPrenom} ${params.apprenantNom}

    +

    Fonction : ${fonctionLabel}

    + ${params.apprenantEtablissement ? `

    Établissement : ${params.apprenantEtablissement}

    ` : ''} +

    Formation : ${params.formationNom}

    +

    Séquence : ${params.sequenceNom}

    +
    + +
    +

    📊 État des inscriptions

    +

    ${params.nbInscrits} / ${params.capaciteMax} places occupées

    +
    +
    +
    +
    + +

    Dates de la formation :

    +
      ${datesHTML}
    + +

    Cordialement,
    L'équipe Formation

    + `; + + return sendEmail({ + to: params.formateurEmail, + subject: `Nouvelle inscription - ${params.formationNom} (${params.sequenceNom})`, + html: await getEmailTemplate(content, 'notification_formateur'), + }); +} + +/** + * Envoie une notification au formateur pour une annulation d'inscription + */ +export async function sendNotificationFormateurAnnulation(params: { + formateurEmail: string; + formateurNom: string; + apprenantNom: string; + apprenantPrenom: string; + apprenantFonction: string; + formationNom: string; + sequenceNom: string; + nbInscrits: number; + capaciteMax: number; + raisonAnnulation?: string; +}): Promise { + const fonctionLabel = params.apprenantFonction === 'directeur' ? 'Directeur' : + params.apprenantFonction === 'chef_service' ? 'Chef de service' : 'Autre'; + + const content = ` +

    ⚠️ Annulation d'inscription

    +

    Bonjour ${params.formateurNom},

    + +

    Un apprenant a annulé son inscription à votre formation.

    + +
    +

    Détails de l'annulation

    +

    Apprenant : ${params.apprenantPrenom} ${params.apprenantNom}

    +

    Fonction : ${fonctionLabel}

    +

    Formation : ${params.formationNom}

    +

    Séquence : ${params.sequenceNom}

    + ${params.raisonAnnulation ? `

    Raison : ${params.raisonAnnulation}

    ` : ''} +
    + +
    +

    📊 État des inscriptions après annulation

    +

    ${params.nbInscrits} / ${params.capaciteMax} places occupées

    +

    ${params.capaciteMax - params.nbInscrits} place(s) disponible(s)

    +
    + +

    Cordialement,
    L'équipe Formation

    + `; + + return sendEmail({ + to: params.formateurEmail, + subject: `Annulation d'inscription - ${params.formationNom} (${params.sequenceNom})`, + html: await getEmailTemplate(content, 'notification_formateur'), + }); +} + +/** + * Envoie une alerte aux admins quand la capacité maximale est atteinte + */ +export async function sendAlerteCapaciteAtteinte(params: { + adminEmails: string[]; + formationNom: string; + sequenceNom: string; + capaciteMax: number; + nbInscrits: number; + nbListeAttente: number; + formateurNom?: string; + dates: Array<{ dateDebut: Date; dateFin: Date; ordre: number }>; +}): Promise<{ sent: number; failed: number }> { + const datesHTML = params.dates.map(date => ` +
  • ${date.dateDebut.toLocaleDateString('fr-FR', { + weekday: 'long', + day: 'numeric', + month: 'long', + year: 'numeric' + })}
  • + `).join(''); + + const content = ` +

    🔔 Alerte : Capacité maximale atteinte

    + +
    +

    ⚠️ La séquence est complète

    +

    La capacité maximale de la séquence ${params.sequenceNom} a été atteinte.

    +
    + +
    +

    Détails de la séquence

    +

    Formation : ${params.formationNom}

    +

    Séquence : ${params.sequenceNom}

    + ${params.formateurNom ? `

    Formateur : ${params.formateurNom}

    ` : ''} +

    Capacité : ${params.nbInscrits} / ${params.capaciteMax} (100%)

    + ${params.nbListeAttente > 0 ? `

    Liste d'attente : ${params.nbListeAttente} personne(s)

    ` : ''} +
    + +

    Dates prévues :

    +
      ${datesHTML}
    + +
    +

    Actions possibles

    +
      +
    • Augmenter la capacité maximale de la séquence
    • +
    • Créer une nouvelle séquence pour cette formation
    • +
    • Contacter les personnes en liste d'attente pour les informer
    • +
    +
    + +

    Cordialement,
    Le système de gestion des formations

    + `; + + let sent = 0; + let failed = 0; + + for (const adminEmail of params.adminEmails) { + try { + await sendEmail({ + to: adminEmail, + subject: `🔔 Capacité atteinte - ${params.formationNom} (${params.sequenceNom})`, + html: await getEmailTemplate(content, 'alerte_admin'), + }); + sent++; + } catch (error) { + console.error(`Erreur envoi alerte à ${adminEmail}:`, error); + failed++; + } + } + + return { sent, failed }; +} + +/** + * Envoie une notification aux apprenants en liste d'attente quand une place se libère + */ +export async function sendNotificationPlaceDisponible(params: { + apprenantEmail: string; + apprenantNom: string; + apprenantPrenom: string; + apprenantFonction: string; + formationNom: string; + sequenceNom: string; + positionListeAttente: number; + lienConfirmation?: string; + delaiReponse?: number; // en heures +}): Promise { + const fonctionLabel = params.apprenantFonction === 'directeur' ? 'Directeur' : + params.apprenantFonction === 'chef_service' ? 'Chef de service' : ''; + const salutation = fonctionLabel ? `${fonctionLabel} ${params.apprenantPrenom} ${params.apprenantNom}` : params.apprenantPrenom; + const delai = params.delaiReponse || 48; + + const content = ` +

    🎉 Une place s'est libérée !

    +

    Bonjour ${salutation},

    + +

    Bonne nouvelle ! Une place vient de se libérer pour la formation à laquelle vous êtes inscrit(e) en liste d'attente.

    + +
    +

    ✅ Vous pouvez maintenant confirmer votre inscription

    +

    Formation : ${params.formationNom}

    +

    Séquence : ${params.sequenceNom}

    +

    Votre position : ${params.positionListeAttente}${params.positionListeAttente === 1 ? 'er' : 'ème'} sur la liste d'attente

    +
    + + ${params.lienConfirmation ? ` + + ` : '

    Veuillez contacter le service RH pour confirmer votre inscription.

    '} + +
    +

    ⏰ Important

    +

    Vous avez ${delai} heures pour confirmer votre inscription.

    +

    Passé ce délai, la place sera proposée à la personne suivante sur la liste d'attente.

    +
    + +

    Cordialement,
    L'équipe Formation

    + `; + + const variables = { + nomApprenant: params.apprenantNom, + prenomApprenant: params.apprenantPrenom, + nomFormation: params.formationNom, + nomSequence: params.sequenceNom, + }; + + return sendEmail({ + to: params.apprenantEmail, + subject: `🎉 Place disponible - ${params.formationNom}`, + html: await getEmailTemplate(content, 'notification_liste_attente', variables), + }); +} + +/** + * Envoie une notification à un apprenant en liste d'attente pour l'informer d'une annulation de séquence + */ +export async function sendNotificationAnnulationListeAttente(params: { + apprenantEmail: string; + apprenantNom: string; + apprenantPrenom: string; + apprenantFonction: string; + formationNom: string; + sequenceNom: string; + raisonAnnulation?: string; + alternativesDisponibles?: Array<{ sequenceNom: string; nbPlaces: number }>; +}): Promise { + const fonctionLabel = params.apprenantFonction === 'directeur' ? 'Directeur' : + params.apprenantFonction === 'chef_service' ? 'Chef de service' : ''; + const salutation = fonctionLabel ? `${fonctionLabel} ${params.apprenantPrenom} ${params.apprenantNom}` : params.apprenantPrenom; + + const alternativesHTML = params.alternativesDisponibles && params.alternativesDisponibles.length > 0 + ? ` +
    +

    📋 Séquences alternatives disponibles

    +
      + ${params.alternativesDisponibles.map(alt => ` +
    • ${alt.sequenceNom} - ${alt.nbPlaces} place(s) disponible(s)
    • + `).join('')} +
    +

    Contactez le service RH pour vous inscrire à une autre séquence.

    +
    + ` : ''; + + const content = ` +

    Information : Annulation de séquence

    +

    Bonjour ${salutation},

    + +

    Nous vous informons que la séquence de formation pour laquelle vous étiez en liste d'attente a été annulée.

    + +
    +

    Séquence annulée

    +

    Formation : ${params.formationNom}

    +

    Séquence : ${params.sequenceNom}

    + ${params.raisonAnnulation ? `

    Raison : ${params.raisonAnnulation}

    ` : ''} +
    + + ${alternativesHTML} + +

    Nous nous excusons pour ce désagrément et restons à votre disposition pour toute question.

    + +

    Cordialement,
    L'équipe Formation

    + `; + + return sendEmail({ + to: params.apprenantEmail, + subject: `Information : Annulation de séquence - ${params.formationNom}`, + html: await getEmailTemplate(content, 'notification_annulation'), + }); +} + +/** + * Envoie une notification au formateur quand la capacité maximale est atteinte + */ +export async function sendNotificationFormateurCapaciteAtteinte(params: { + formateurEmail: string; + formateurNom: string; + formationNom: string; + sequenceNom: string; + capaciteMax: number; + nbInscrits: number; + dates: Array<{ dateDebut: Date; dateFin: Date; ordre: number }>; +}): Promise { + const datesHTML = params.dates.map(date => ` +
  • Date ${date.ordre} : ${date.dateDebut.toLocaleDateString('fr-FR', { + weekday: 'long', + day: 'numeric', + month: 'long', + year: 'numeric' + })}
  • + `).join(''); + + const content = ` +

    ⚠️ Capacité maximale atteinte

    +

    Bonjour ${params.formateurNom},

    + +

    La capacité maximale de votre formation a été atteinte.

    + +
    +

    Détails de la séquence

    +

    Formation : ${params.formationNom}

    +

    Séquence : ${params.sequenceNom}

    +

    Capacité : ${params.nbInscrits} / ${params.capaciteMax}

    +
    + +

    Dates de la formation :

    +
      ${datesHTML}
    + +

    Les nouvelles inscriptions seront automatiquement placées en liste d'attente.

    + +

    Cordialement,
    L'équipe Formation

    + `; + + return sendEmail({ + to: params.formateurEmail, + subject: `⚠️ Capacité maximale atteinte - ${params.formationNom} (${params.sequenceNom})`, + html: await getEmailTemplate(content, 'notification_formateur'), + }); +} + +/** + * Envoie une notification au formateur quand une place se libère + */ +export async function sendNotificationFormateurPlaceDisponible(params: { + formateurEmail: string; + formateurNom: string; + formationNom: string; + sequenceNom: string; + capaciteMax: number; + nbInscrits: number; + placesDisponibles: number; +}): Promise { + const content = ` +

    ✅ Place disponible

    +

    Bonjour ${params.formateurNom},

    + +

    Une place s'est libérée dans votre formation suite à une annulation.

    + +
    +

    Détails de la séquence

    +

    Formation : ${params.formationNom}

    +

    Séquence : ${params.sequenceNom}

    +

    Places occupées : ${params.nbInscrits} / ${params.capaciteMax}

    +

    Places disponibles : ${params.placesDisponibles}

    +
    + +

    De nouvelles inscriptions peuvent maintenant être acceptées.

    + +

    Cordialement,
    L'équipe Formation

    + `; + + return sendEmail({ + to: params.formateurEmail, + subject: `✅ Place disponible - ${params.formationNom} (${params.sequenceNom})`, + html: await getEmailTemplate(content, 'notification_formateur'), + }); +} + +/** + * Envoie une attestation de formation par email + */ +export async function sendAttestationEmail(params: { + to: string; + apprenantNom: string; + apprenantPrenom: string; + formationNom: string; + pdfUrl: string; +}): Promise { + const content = ` +

    Votre attestation de formation

    + +

    Bonjour ${params.apprenantPrenom} ${params.apprenantNom},

    + +

    Nous avons le plaisir de vous transmettre votre attestation de formation pour :

    + +
    +

    ${params.formationNom}

    +
    + +

    Vous pouvez télécharger votre attestation en cliquant sur le lien ci-dessous :

    + + + +

    Cette attestation certifie votre participation à la formation et peut être utilisée pour votre dossier professionnel.

    + +

    Nous vous remercions pour votre participation et vous souhaitons une excellente continuation.

    + +

    Cordialement,
    L'équipe Formation

    + `; + + return sendEmail({ + to: params.to, + subject: `Votre attestation de formation - ${params.formationNom}`, + html: await getEmailTemplate(content, 'attestation'), + }); +} diff --git a/deployment-package/source_server/emailTemplateGenerator.ts b/deployment-package/source_server/emailTemplateGenerator.ts new file mode 100644 index 0000000..9143f92 --- /dev/null +++ b/deployment-package/source_server/emailTemplateGenerator.ts @@ -0,0 +1,180 @@ +/** + * Générateur de templates d'emails personnalisés + * Utilise les templates stockés en base de données + */ + +import * as db from "./db"; +import { EmailTemplate } from "../drizzle/schema"; +import { replaceEmailVariables, EmailVariables } from "./emailTemplateUtils"; + +/** + * Génère le HTML d'un email en utilisant le template personnalisé + * @param templateType - Type de template (à utiliser) + * @param content - Contenu de l'email (legacy, sera remplacé par bodyContent) + * @param variables - Variables à remplacer dans le template + */ +export async function generateEmailFromTemplate( + templateType: string, + content: string, + variables?: EmailVariables +): Promise { + // Récupérer le template depuis la base de données + const template = await db.getEmailTemplateByType(templateType); + + // Si pas de template trouvé, utiliser le template par défaut + if (!template) { + const defaultContent = variables ? replaceEmailVariables(content, variables) : content; + return getDefaultEmailTemplate(defaultContent); + } + + return buildEmailHTML(template, content, variables); +} + +/** + * Construit le HTML de l'email avec le template + */ +function buildEmailHTML(template: EmailTemplate, content: string, variables?: EmailVariables): string { + // Utiliser bodyContent si disponible, sinon utiliser content (legacy) + let emailBody = template.bodyContent || content; + + // Remplacer les variables si fournies + if (variables) { + emailBody = replaceEmailVariables(emailBody, variables); + // Remplacer aussi dans le titre et le pied de page + template = { + ...template, + headerTitle: replaceEmailVariables(template.headerTitle, variables), + footerText: template.footerText ? replaceEmailVariables(template.footerText, variables) : template.footerText, + }; + } + return ` + + + + + + + +
    +
    + ${template.logoUrl ? `Logo` : ''} +

    ${template.headerTitle}

    +
    +
    + ${emailBody} +
    + +
    + + + `.trim(); +} + +/** + * Template par défaut si aucun template personnalisé n'est trouvé + */ +function getDefaultEmailTemplate(content: string): string { + return ` + + + + + + + +
    +
    +

    Formation Manager Itinova

    +
    +
    + ${content} +
    + +
    + + + `.trim(); +} diff --git a/deployment-package/source_server/emailTemplateUtils.ts b/deployment-package/source_server/emailTemplateUtils.ts new file mode 100644 index 0000000..ba6d593 --- /dev/null +++ b/deployment-package/source_server/emailTemplateUtils.ts @@ -0,0 +1,66 @@ +/** + * Utilitaires pour le remplacement des variables dans les templates d'emails + */ + +export interface EmailVariables { + nomApprenant?: string; + prenomApprenant?: string; + nomFormation?: string; + nomSequence?: string; + dateDebut?: string; + dateFin?: string; + datesHTML?: string; // HTML formaté de toutes les dates de la séquence + lieu?: string; + formateur?: string; + lienInscription?: string; + [key: string]: string | undefined; +} + +/** + * Remplace les variables {{variable}} dans un texte par leurs valeurs + * @param template - Le texte contenant les variables à remplacer + * @param variables - Un objet contenant les valeurs des variables + * @returns Le texte avec les variables remplacées + */ +export function replaceEmailVariables( + template: string, + variables: EmailVariables +): string { + let result = template; + + // Remplacer chaque variable trouvée dans le template + Object.keys(variables).forEach((key) => { + const value = variables[key]; + if (value !== undefined && value !== null) { + // Remplacer toutes les occurrences de {{key}} par la valeur + const regex = new RegExp(`\\{\\{${key}\\}\\}`, 'g'); + result = result.replace(regex, value); + } + }); + + // Nettoyer les variables non remplacées (optionnel) + // result = result.replace(/\{\{[^}]+\}\}/g, ''); + + return result; +} + +/** + * Génère un aperçu d'email avec des données d'exemple + * @param template - Le template d'email + * @returns Le template avec des données d'exemple + */ +export function generateEmailPreview(template: string): string { + const exampleVariables: EmailVariables = { + nomApprenant: 'Dupont', + prenomApprenant: 'Marie', + nomFormation: 'Formation Management', + nomSequence: 'Séquence 1 - Introduction', + dateDebut: '15/01/2025', + dateFin: '17/01/2025', + lieu: 'Salle de formation A - Bâtiment principal', + formateur: 'Jean Martin', + lienInscription: 'https://exemple.com/inscription/abc123', + }; + + return replaceEmailVariables(template, exampleVariables); +} diff --git a/deployment-package/source_server/etablissementsDb.ts b/deployment-package/source_server/etablissementsDb.ts new file mode 100644 index 0000000..4ac3a44 --- /dev/null +++ b/deployment-package/source_server/etablissementsDb.ts @@ -0,0 +1,110 @@ +import { eq, sql } from "drizzle-orm"; +import { getDb } from "./db"; +import { apprenants, inscriptions } from "../drizzle/schema"; + +export async function getEtablissementsStats() { + const db = await getDb(); + if (!db) return []; + + // Récupérer tous les apprenants groupés par établissement + const apprenantsData = await db.select().from(apprenants); + + // Grouper par code établissement + const etablissementsMap = new Map(); + + for (const apprenant of apprenantsData) { + const code = apprenant.codeEtablissement; + + if (!etablissementsMap.has(code)) { + etablissementsMap.set(code, { + codeEtablissement: code, + nombreApprenants: 0, + apprenantsActifs: 0, + apprenantIds: [], + }); + } + + const etab = etablissementsMap.get(code)!; + etab.nombreApprenants++; + etab.apprenantIds.push(apprenant.id); + } + + // Pour chaque établissement, compter les apprenants actifs + const etablissementsStats = await Promise.all( + Array.from(etablissementsMap.values()).map(async (etab) => { + // Compter le nombre d'apprenants ayant au moins une inscription + const apprenantsActifsCount = await Promise.all( + etab.apprenantIds.map(async (apprenantId) => { + const inscriptionsData = await db + .select() + .from(inscriptions) + .where(eq(inscriptions.apprenantId, apprenantId)) + .limit(1); + return inscriptionsData.length > 0 ? 1 : 0; + }) + ); + + const nombreActifs = apprenantsActifsCount.reduce((sum: number, count) => sum + count, 0); + const tauxParticipation = etab.nombreApprenants > 0 + ? Math.round((nombreActifs / etab.nombreApprenants) * 100) + : 0; + + return { + codeEtablissement: etab.codeEtablissement, + nombreApprenants: etab.nombreApprenants, + apprenantsActifs: nombreActifs, + tauxParticipation, + }; + }) + ); + + // Trier par nombre d'apprenants décroissant + return etablissementsStats.sort((a, b) => b.nombreApprenants - a.nombreApprenants); +} + +export async function getEtablissementDetail(codeEtablissement: string) { + const db = await getDb(); + if (!db) return null; + + // Récupérer tous les apprenants de cet établissement + const apprenantsData = await db + .select() + .from(apprenants) + .where(eq(apprenants.codeEtablissement, codeEtablissement)); + + // Pour chaque apprenant, récupérer ses inscriptions + const apprenantsWithInscriptions = await Promise.all( + apprenantsData.map(async (apprenant) => { + const inscriptionsData = await db + .select() + .from(inscriptions) + .where(eq(inscriptions.apprenantId, apprenant.id)); + + return { + ...apprenant, + inscriptions: inscriptionsData, + }; + }) + ); + + const nombreApprenants = apprenantsData.length; + const apprenantsActifs = apprenantsWithInscriptions.filter( + (a) => a.inscriptions.length > 0 + ).length; + const tauxParticipation = nombreApprenants > 0 + ? Math.round((apprenantsActifs / nombreApprenants) * 100) + : 0; + + return { + codeEtablissement, + nombreApprenants, + apprenantsActifs, + tauxParticipation, + apprenants: apprenantsWithInscriptions, + }; +} diff --git a/deployment-package/source_server/exportService.ts b/deployment-package/source_server/exportService.ts new file mode 100644 index 0000000..c85f5e1 --- /dev/null +++ b/deployment-package/source_server/exportService.ts @@ -0,0 +1,277 @@ +/** + * Service d'export des données en Excel et PDF + */ + +import * as XLSX from 'xlsx'; +import { jsPDF } from 'jspdf'; +import autoTable from 'jspdf-autotable'; +import * as fs from 'fs'; +import * as path from 'path'; + +interface InscriptionExport { + nom: string; + prenom: string; + email: string; + codeEtablissement: string; + fonction: string; + statut: string; + dateInscription: Date; +} + +interface SequenceInfo { + formationNom: string; + sequenceNom: string; + dates: Array<{ dateDebut: Date; dateFin: Date; ordre: number }>; + lieu: string; + publicCible: string; + inscriptions: InscriptionExport[]; +} + +interface ApprenantPresence { + nom: string; + prenom: string; + codeEtablissement: string; + fonction: string; +} + +interface FeuillePresenceInfo { + formationNom: string; + sequenceNom: string; + dates: Array<{ dateDebut: Date; dateFin: Date; ordre: number }>; + lieu: string; + publicCible: string; + formateur?: string; + apprenants: ApprenantPresence[]; +} + +/** + * Génère un fichier Excel avec la liste des inscrits + */ +export function generateExcelExport(sequenceInfo: SequenceInfo): Buffer { + // Préparer les données + const data = sequenceInfo.inscriptions.map(i => ({ + 'Nom': i.nom, + 'Prénom': i.prenom, + 'Email': i.email, + 'Code établissement': i.codeEtablissement, + 'Fonction': i.fonction === 'directeur' ? 'Directeur' : i.fonction === 'chef_service' ? 'Chef de service' : 'Autre', + 'Statut': i.statut === 'confirmee' ? 'Confirmée' : i.statut === 'liste_attente' ? 'Liste d\'attente' : 'Annulée', + 'Date d\'inscription': i.dateInscription.toLocaleDateString('fr-FR'), + })); + + // Créer le workbook + const ws = XLSX.utils.json_to_sheet(data); + const wb = XLSX.utils.book_new(); + XLSX.utils.book_append_sheet(wb, ws, 'Inscrits'); + + // Ajouter une feuille d'informations + const infoData = [ + { 'Information': 'Formation', 'Valeur': sequenceInfo.formationNom }, + { 'Information': 'Séquence', 'Valeur': sequenceInfo.sequenceNom }, + { 'Information': 'Lieu', 'Valeur': sequenceInfo.lieu }, + { 'Information': 'Public cible', 'Valeur': sequenceInfo.publicCible === 'directeur' ? 'Directeurs' : sequenceInfo.publicCible === 'chef_service' ? 'Chefs de service' : sequenceInfo.publicCible === 'tous' ? 'Tous' : 'Autre' }, + { 'Information': 'Nombre d\'inscrits', 'Valeur': sequenceInfo.inscriptions.length.toString() }, + ]; + + // Ajouter les dates + sequenceInfo.dates.forEach(date => { + infoData.push({ + 'Information': `Date ${date.ordre}`, + 'Valeur': date.dateDebut.toLocaleDateString('fr-FR', { + weekday: 'long', + year: 'numeric', + month: 'long', + day: 'numeric', + hour: '2-digit', + minute: '2-digit' + }) + }); + }); + + const wsInfo = XLSX.utils.json_to_sheet(infoData); + XLSX.utils.book_append_sheet(wb, wsInfo, 'Informations'); + + // Générer le buffer + return Buffer.from(XLSX.write(wb, { type: 'buffer', bookType: 'xlsx' })); +} + +/** + * Génère un PDF avec la liste des inscrits + */ +export function generatePDFExport(sequenceInfo: SequenceInfo): Buffer { + const doc = new jsPDF(); + + // Titre + doc.setFontSize(18); + doc.text('Liste des inscrits', 14, 20); + + // Informations de séquence + doc.setFontSize(10); + let yPos = 35; + doc.text(`Formation : ${sequenceInfo.formationNom}`, 14, yPos); + yPos += 6; + doc.text(`Séquence : ${sequenceInfo.sequenceNom}`, 14, yPos); + yPos += 6; + doc.text(`Lieu : ${sequenceInfo.lieu}`, 14, yPos); + yPos += 6; + doc.text(`Public cible : ${sequenceInfo.publicCible === 'directeur' ? 'Directeurs' : sequenceInfo.publicCible === 'chef_service' ? 'Chefs de service' : sequenceInfo.publicCible === 'tous' ? 'Tous' : 'Autre'}`, 14, yPos); + yPos += 8; + + // Dates de formation + doc.setFontSize(9); + sequenceInfo.dates.forEach(date => { + doc.text(`Date ${date.ordre} : ${date.dateDebut.toLocaleDateString('fr-FR', { + weekday: 'long', + year: 'numeric', + month: 'long', + day: 'numeric', + hour: '2-digit', + minute: '2-digit' + })}`, 14, yPos); + yPos += 5; + }); + + // Tableau des inscrits + const tableData = sequenceInfo.inscriptions.map(i => [ + i.nom, + i.prenom, + i.email, + i.codeEtablissement, + i.fonction === 'directeur' ? 'Directeur' : i.fonction === 'chef_service' ? 'Chef de service' : 'Autre', + i.statut === 'confirmee' ? 'Confirmée' : i.statut === 'liste_attente' ? 'Liste d\'attente' : 'Annulée', + ]); + + autoTable(doc, { + startY: yPos + 10, + head: [['Nom', 'Prénom', 'Email', 'Code étab.', 'Fonction', 'Statut']], + body: tableData, + styles: { fontSize: 9 }, + headStyles: { fillColor: [37, 99, 235] }, + }); + + return Buffer.from(doc.output('arraybuffer')); +} + +/** + * Génère une feuille de présence PDF avec signatures matin/après-midi pour chaque journée + */ +export function generateFeuillePresence(feuilleInfo: FeuillePresenceInfo): Buffer { + const doc = new jsPDF(); + + // Charger le logo + let logoData: string | null = null; + + try { + // Utiliser un chemin absolu depuis la racine du projet + const logoPath = path.resolve(process.cwd(), 'client/public/itinova-logo.png'); + const logoBuffer = fs.readFileSync(logoPath); + logoData = `data:image/png;base64,${logoBuffer.toString('base64')}`; + } catch (error) { + console.warn('Logo Itinova non trouvé, génération sans logo:', error); + } + + // Fonction pour générer une page de feuille de présence pour une journée + const generatePageForDate = (dateInfo: { dateDebut: Date; dateFin: Date; ordre: number }, isFirstPage: boolean) => { + if (!isFirstPage) { + doc.addPage(); + } + + // Ajouter le logo en haut à droite si disponible + if (logoData) { + doc.addImage(logoData, 'PNG', 160, 10, 40, 15); + } + + // Titre + doc.setFontSize(18); + doc.text('Feuille de présence', 14, 20); + + // Informations de séquence + doc.setFontSize(10); + let yPos = 35; + doc.text(`Formation : ${feuilleInfo.formationNom}`, 14, yPos); + yPos += 6; + doc.text(`Séquence : ${feuilleInfo.sequenceNom}`, 14, yPos); + yPos += 6; + doc.text(`Lieu : ${feuilleInfo.lieu}`, 14, yPos); + yPos += 6; + + // Ajouter le formateur si disponible + if (feuilleInfo.formateur) { + doc.text(`Formateur : ${feuilleInfo.formateur}`, 14, yPos); + yPos += 6; + } + + doc.text(`Public cible : ${feuilleInfo.publicCible === 'directeur' ? 'Directeurs' : feuilleInfo.publicCible === 'chef_service' ? 'Chefs de service' : feuilleInfo.publicCible === 'tous' ? 'Tous' : 'Autre'}`, 14, yPos); + yPos += 8; + + // Date de la journée + doc.setFontSize(12); + doc.setFont('helvetica', 'bold'); + doc.text(`Date ${dateInfo.ordre} : ${dateInfo.dateDebut.toLocaleDateString('fr-FR', { + weekday: 'long', + year: 'numeric', + month: 'long', + day: 'numeric', + hour: '2-digit', + minute: '2-digit' + })}`, 14, yPos); + doc.setFont('helvetica', 'normal'); + yPos += 10; + + // Tableau de présence avec signatures matin et après-midi + const tableData = feuilleInfo.apprenants.map(i => [ + i.nom, + i.prenom, + i.codeEtablissement, + i.fonction === 'directeur' ? 'Directeur' : i.fonction === 'chef_service' ? 'Chef de service' : 'Autre', + '', // Signature matin + '', // Signature après-midi + ]); + + autoTable(doc, { + startY: yPos, + head: [['Nom', 'Prénom', 'Code étab.', 'Fonction', 'Signature\nMatin', 'Signature\nAprès-midi']], + body: tableData, + styles: { + fontSize: 9, + cellPadding: 3, + minCellHeight: 10, + }, + headStyles: { + fillColor: [37, 99, 235], + halign: 'center', + }, + columnStyles: { + 0: { cellWidth: 30 }, // Nom + 1: { cellWidth: 30 }, // Prénom + 2: { cellWidth: 25 }, // Code établissement + 3: { cellWidth: 30 }, // Fonction + 4: { cellWidth: 35 }, // Signature matin + 5: { cellWidth: 35 }, // Signature après-midi + }, + }); + + // Ajouter un champ de signature pour le formateur en bas de page + const finalY = (doc as any).lastAutoTable.finalY || yPos + 50; + const signatureY = finalY + 20; + + doc.setFontSize(10); + doc.setFont('helvetica', 'bold'); + doc.text('Signature du formateur :', 14, signatureY); + doc.setFont('helvetica', 'normal'); + + // Dessiner une ligne pour la signature + doc.line(60, signatureY, 120, signatureY); + + // Ajouter la date + doc.setFontSize(9); + doc.text('Date : _______________', 140, signatureY); + }; + + // Générer une page pour chaque date + feuilleInfo.dates.forEach((date, index) => { + generatePageForDate(date, index === 0); + }); + + return Buffer.from(doc.output('arraybuffer')); +} diff --git a/deployment-package/source_server/formateurDb.ts b/deployment-package/source_server/formateurDb.ts new file mode 100644 index 0000000..1e5ae2e --- /dev/null +++ b/deployment-package/source_server/formateurDb.ts @@ -0,0 +1,402 @@ +import { eq, sql, and, gte, lte, desc } from "drizzle-orm"; +import { getDb } from "./db"; +import { + sequences, + formations, + formateurs, + datesFormation, + inscriptions, + apprenants, + supportsFormation +} from "../drizzle/schema"; + +/** + * Récupère le calendrier des interventions d'un formateur + * @param formateurId - ID du formateur + * @param dateDebut - Date de début optionnelle + * @param dateFin - Date de fin optionnelle + */ +export async function getCalendrierFormateur(formateurId: number, dateDebut?: Date, dateFin?: Date) { + const db = await getDb(); + if (!db) return []; + + const conditions = [eq(sequences.formateurId, formateurId)]; + + if (dateDebut) { + conditions.push(gte(datesFormation.dateDebut, dateDebut)); + } + if (dateFin) { + conditions.push(lte(datesFormation.dateFin, dateFin)); + } + + const results = await db + .select({ + sequenceId: sequences.id, + sequenceNom: sequences.nom, + formationId: formations.id, + formationNom: formations.nom, + dateId: datesFormation.id, + dateDebut: datesFormation.dateDebut, + dateFin: datesFormation.dateFin, + ordre: datesFormation.ordre, + lieu: sequences.lieu, + nbInscrits: sql`( + SELECT COUNT(*) + FROM inscriptions + WHERE inscriptions.sequenceId = ${sequences.id} + AND inscriptions.statut IN ('confirmee', 'liste_attente') + )`, + }) + .from(sequences) + .innerJoin(formations, eq(sequences.formationId, formations.id)) + .innerJoin(datesFormation, eq(datesFormation.sequenceId, sequences.id)) + .where(conditions.length > 0 ? and(...conditions) : undefined) + .orderBy(datesFormation.dateDebut); + + return results; +} + +/** + * Récupère la liste des apprenants inscrits à une séquence + * @param sequenceId - ID de la séquence + */ +export async function getApprenantsSequence(sequenceId: number) { + const db = await getDb(); + if (!db) return []; + + const results = await db + .select({ + inscriptionId: inscriptions.id, + apprenantId: apprenants.id, + nom: apprenants.nom, + prenom: apprenants.prenom, + email: apprenants.email, + fonction: apprenants.fonction, + codeEtablissement: apprenants.codeEtablissement, + statut: inscriptions.statut, + dateInscription: inscriptions.dateInscription, + // presenceValidee n'existe pas dans le schéma actuel + }) + .from(inscriptions) + .innerJoin(apprenants, eq(inscriptions.apprenantId, apprenants.id)) + .where(eq(inscriptions.sequenceId, sequenceId)) + .orderBy(apprenants.nom, apprenants.prenom); + + return results; +} + +/** + * Récupère les supports de formation d'une séquence + * @param sequenceId - ID de la séquence + */ +export async function getSupportsSequence(sequenceId: number) { + const db = await getDb(); + if (!db) return []; + + const results = await db + .select({ + id: supportsFormation.id, + nomFichier: supportsFormation.nomFichier, + typeFichier: supportsFormation.typeFichier, + tailleFichier: supportsFormation.tailleFichier, + urlFichier: supportsFormation.urlFichier, + description: supportsFormation.description, + formateurNom: formateurs.nom, + createdAt: supportsFormation.createdAt, + }) + .from(supportsFormation) + .innerJoin(formateurs, eq(supportsFormation.formateurId, formateurs.id)) + .where(eq(supportsFormation.sequenceId, sequenceId)) + .orderBy(desc(supportsFormation.createdAt)); + + return results; +} + +/** + * Ajoute un support de formation + * @param support - Données du support à ajouter + */ +export async function ajouterSupport(support: { + sequenceId: number; + formateurId: number; + nomFichier: string; + typeFichier: string; + tailleFichier: number; + urlFichier: string; + s3Key: string; + description?: string; +}) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + const [result] = await db.insert(supportsFormation).values(support); + return result; +} + +/** + * Supprime un support de formation + * @param supportId - ID du support à supprimer + * @param formateurId - ID du formateur (pour vérification) + */ +export async function supprimerSupport(supportId: number, formateurId: number) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + // Vérifier que le support appartient bien au formateur + const [support] = await db + .select() + .from(supportsFormation) + .where( + and( + eq(supportsFormation.id, supportId), + eq(supportsFormation.formateurId, formateurId) + ) + ) + .limit(1); + + if (!support) { + throw new Error("Support non trouvé ou non autorisé"); + } + + await db.delete(supportsFormation).where(eq(supportsFormation.id, supportId)); + + return support; // Retourner le support pour récupérer la clé S3 +} + +/** + * Valide la présence d'un apprenant + * @param inscriptionId - ID de l'inscription + * @param present - true si présent, false sinon + */ +export async function validerPresence(inscriptionId: number, present: boolean) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + await db + .update(inscriptions) + .set({ statut: present ? 'confirmee' : 'annulee' }) + .where(eq(inscriptions.id, inscriptionId)); +} + +/** + * Récupère l'historique des formations d'un formateur + * @param formateurId - ID du formateur + * @param limit - Nombre de résultats à retourner (par défaut 50) + */ +export async function getHistoriqueFormateur(formateurId: number, limit: number = 50) { + const db = await getDb(); + if (!db) return []; + + const results = await db + .select({ + sequenceId: sequences.id, + sequenceNom: sequences.nom, + formationNom: formations.nom, + dateDebut: sql`MIN(${datesFormation.dateDebut})`, + dateFin: sql`MAX(${datesFormation.dateFin})`, + lieu: sequences.lieu, + nbInscrits: sql`( + SELECT COUNT(*) + FROM inscriptions + WHERE inscriptions.sequenceId = ${sequences.id} + AND inscriptions.statut IN ('confirmee', 'liste_attente') + )`, + nbPresents: sql`( + SELECT COUNT(*) + FROM inscriptions + WHERE inscriptions.sequenceId = ${sequences.id} + AND inscriptions.statut = 'confirmee' + )`, + }) + .from(sequences) + .innerJoin(formations, eq(sequences.formationId, formations.id)) + .innerJoin(datesFormation, eq(datesFormation.sequenceId, sequences.id)) + .where(eq(sequences.formateurId, formateurId)) + .groupBy(sequences.id, sequences.nom, formations.nom, sequences.lieu) + .orderBy(desc(sql`MIN(${datesFormation.dateDebut})`)) + .limit(limit); + + return results; +} + +/** + * Récupère les détails d'une séquence pour un formateur + * @param sequenceId - ID de la séquence + * @param formateurId - ID du formateur (pour vérification) + */ +export async function getDetailSequence(sequenceId: number, formateurId: number) { + const db = await getDb(); + if (!db) return null; + + const [result] = await db + .select({ + id: sequences.id, + nom: sequences.nom, + formationNom: formations.nom, + lieu: sequences.lieu, + capaciteMax: sequences.capaciteMax, + formateurNom: formateurs.nom, + }) + .from(sequences) + .innerJoin(formations, eq(sequences.formationId, formations.id)) + .innerJoin(formateurs, eq(sequences.formateurId, formateurs.id)) + .where( + and( + eq(sequences.id, sequenceId), + eq(sequences.formateurId, formateurId) + ) + ) + .limit(1); + + if (!result) return null; + + // Récupérer les dates de formation + const dates = await db + .select({ + id: datesFormation.id, + dateDebut: datesFormation.dateDebut, + dateFin: datesFormation.dateFin, + ordre: datesFormation.ordre, + }) + .from(datesFormation) + .where(eq(datesFormation.sequenceId, sequenceId)) + .orderBy(datesFormation.dateDebut); + + return { + ...result, + dates, + }; +} + +/** + * Récupérer les statistiques du tableau de bord pour un formateur + */ +export async function getFormateurDashboardStats(formateurId: number) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + // Nombre total de séquences du formateur + const totalSequences = await db + .select({ count: sql`COUNT(*)` }) + .from(sequences) + .where(eq(sequences.formateurId, formateurId)); + + // Nombre total d'inscrits confirmés à toutes les séquences du formateur + const totalInscrits = await db + .select({ count: sql`COUNT(*)` }) + .from(inscriptions) + .innerJoin(sequences, eq(inscriptions.sequenceId, sequences.id)) + .where( + and( + eq(sequences.formateurId, formateurId), + eq(inscriptions.statut, 'confirmee') + ) + ); + + // Nombre de séquences à venir (ayant au moins une date future) + const today = new Date(); + const sequencesAvenir = await db + .select({ sequenceId: datesFormation.sequenceId }) + .from(datesFormation) + .innerJoin(sequences, eq(datesFormation.sequenceId, sequences.id)) + .where( + and( + eq(sequences.formateurId, formateurId), + gte(datesFormation.dateDebut, today) + ) + ) + .groupBy(datesFormation.sequenceId); + + return { + totalSequences: totalSequences[0]?.count || 0, + totalInscrits: totalInscrits[0]?.count || 0, + sequencesAvenir: sequencesAvenir.length, + }; +} + +/** + * Récupérer les prochaines séquences du formateur avec leurs détails + */ +export async function getFormateurProchainesSequences(formateurId: number, limit: number = 10) { + const db = await getDb(); + if (!db) return []; + + const today = new Date(); + + // Récupérer les séquences du formateur ayant au moins une date future + const seqs = await db + .select() + .from(sequences) + .where(eq(sequences.formateurId, formateurId)); + + // Pour chaque séquence, récupérer les détails + const sequencesAvecDetails = await Promise.all( + seqs.map(async (seq) => { + // Récupérer toutes les dates de la séquence + const dates = await db + .select() + .from(datesFormation) + .where(eq(datesFormation.sequenceId, seq.id)) + .orderBy(datesFormation.dateDebut); + + // Vérifier si au moins une date est future + const hasFutureDate = dates.some(d => new Date(d.dateDebut) >= today); + + if (!hasFutureDate) return null; + + // Récupérer la formation + const formation = await db + .select() + .from(formations) + .where(eq(formations.id, seq.formationId)) + .limit(1); + + // Compter les inscrits confirmés + const inscritsCount = await db + .select({ count: sql`COUNT(*)` }) + .from(inscriptions) + .where( + and( + eq(inscriptions.sequenceId, seq.id), + eq(inscriptions.statut, 'confirmee') + ) + ); + + return { + ...seq, + formation: formation[0] || null, + dates, + nbInscrits: inscritsCount[0]?.count || 0, + prochaineDateDebut: dates.find(d => new Date(d.dateDebut) >= today)?.dateDebut || dates[0]?.dateDebut, + }; + }) + ); + + // Filtrer les séquences nulles et trier par prochaine date + const sequencesFiltrees = sequencesAvecDetails + .filter(s => s !== null) + .sort((a, b) => { + const dateA = new Date(a!.prochaineDateDebut); + const dateB = new Date(b!.prochaineDateDebut); + return dateA.getTime() - dateB.getTime(); + }) + .slice(0, limit); + + return sequencesFiltrees; +} + +/** + * Récupérer l'email du formateur à partir de son ID + */ +export async function getFormateurEmailById(formateurId: number): Promise { + const db = await getDb(); + if (!db) return null; + + const result = await db + .select({ email: formateurs.email }) + .from(formateurs) + .where(eq(formateurs.id, formateurId)) + .limit(1); + + return result[0]?.email || null; +} diff --git a/deployment-package/source_server/gestionAttestationsDb.ts b/deployment-package/source_server/gestionAttestationsDb.ts new file mode 100644 index 0000000..25e1374 --- /dev/null +++ b/deployment-package/source_server/gestionAttestationsDb.ts @@ -0,0 +1,202 @@ +import { eq, and, desc, sql } from "drizzle-orm"; +import { getDb } from "./db"; +import { formations, attestations, inscriptions, apprenants, sequences, datesFormation } from "../drizzle/schema"; + +/** + * Récupérer la configuration d'une formation + */ +export async function getFormationConfig(formationId: number) { + const db = await getDb(); + if (!db) return null; + + const results = await db + .select({ + id: formations.id, + nom: formations.nom, + modeAttestation: formations.modeAttestation, + modeEnvoi: formations.modeEnvoi, + }) + .from(formations) + .where(eq(formations.id, formationId)) + .limit(1); + + return results.length > 0 ? results[0] : null; +} + +/** + * Mettre à jour la configuration d'une formation + */ +export async function updateFormationConfig( + formationId: number, + modeAttestation: "auto" | "manuel", + modeEnvoi: "auto" | "manuel" +) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + await db + .update(formations) + .set({ + modeAttestation, + modeEnvoi, + updatedAt: new Date(), + }) + .where(eq(formations.id, formationId)); + + return true; +} + +/** + * Récupérer toutes les attestations d'une formation avec les informations des apprenants + */ +export async function getAttestationsByFormation(formationId: number) { + const db = await getDb(); + if (!db) return []; + + const results = await db + .select({ + attestation: attestations, + apprenant: apprenants, + sequence: sequences, + }) + .from(attestations) + .innerJoin(inscriptions, eq(attestations.inscriptionId, inscriptions.id)) + .innerJoin(apprenants, eq(inscriptions.apprenantId, apprenants.id)) + .innerJoin(sequences, eq(inscriptions.sequenceId, sequences.id)) + .where(eq(sequences.formationId, formationId)) + .orderBy(desc(attestations.createdAt)); + + return results; +} + +/** + * Uploader un document d'attestation pour un apprenant + */ +export async function uploadAttestationDocument( + inscriptionId: number, + documentUrl: string, + documentS3Key: string, + uploadedBy: number +) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + // Vérifier si une attestation existe déjà pour cette inscription + const existing = await db + .select() + .from(attestations) + .where(eq(attestations.inscriptionId, inscriptionId)) + .limit(1); + + if (existing.length > 0) { + // Mettre à jour l'attestation existante + await db + .update(attestations) + .set({ + documentUrl, + documentS3Key, + uploadedBy, + uploadedAt: new Date(), + }) + .where(eq(attestations.inscriptionId, inscriptionId)); + + return existing[0].id; + } else { + // Créer une nouvelle attestation + const result = await db + .insert(attestations) + .values({ + inscriptionId, + documentUrl, + documentS3Key, + uploadedBy, + uploadedAt: new Date(), + }) + .$returningId(); + + return result[0].id; + } +} + +/** + * Envoyer une attestation par email + */ +export async function markAttestationAsSent(attestationId: number) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + await db + .update(attestations) + .set({ + emailEnvoye: true, + dateEnvoiEmail: new Date(), + }) + .where(eq(attestations.id, attestationId)); + + return true; +} + +/** + * Récupérer les apprenants d'une formation avec leur statut d'attestation + */ +export async function getApprenantsWithAttestationStatus(formationId: number) { + const db = await getDb(); + if (!db) return []; + + const results = await db + .select({ + apprenant: { + id: apprenants.id, + nom: apprenants.nom, + prenom: apprenants.prenom, + email: apprenants.email, + }, + inscription: { + id: inscriptions.id, + sequenceId: inscriptions.sequenceId, + }, + sequence: { + id: sequences.id, + nom: sequences.nom, + }, + attestation: { + id: attestations.id, + documentUrl: attestations.documentUrl, + emailEnvoye: attestations.emailEnvoye, + dateEnvoiEmail: attestations.dateEnvoiEmail, + }, + }) + .from(inscriptions) + .innerJoin(apprenants, eq(inscriptions.apprenantId, apprenants.id)) + .innerJoin(sequences, eq(inscriptions.sequenceId, sequences.id)) + .leftJoin(attestations, eq(attestations.inscriptionId, inscriptions.id)) + .where( + and( + eq(sequences.formationId, formationId), + eq(inscriptions.statut, "confirmee") + ) + ) + .orderBy(apprenants.nom, apprenants.prenom); + + return results; +} + +/** + * Supprimer un document d'attestation + */ +export async function deleteAttestationDocument(attestationId: number) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + await db + .update(attestations) + .set({ + documentUrl: null, + documentS3Key: null, + uploadedBy: null, + uploadedAt: null, + }) + .where(eq(attestations.id, attestationId)); + + return true; +} diff --git a/deployment-package/source_server/icsGenerator.ts b/deployment-package/source_server/icsGenerator.ts new file mode 100644 index 0000000..b73fb2c --- /dev/null +++ b/deployment-package/source_server/icsGenerator.ts @@ -0,0 +1,109 @@ +/** + * Module de génération de fichiers ICS (iCalendar) pour les invitations Outlook + */ + +interface ICSEvent { + summary: string; + description?: string; + location: string; + startDate: Date; + endDate: Date; + attendeeEmail: string; + attendeeName: string; + organizerEmail?: string; + organizerName?: string; +} + +/** + * Formate une date au format iCalendar (YYYYMMDDTHHMMSSZ) + */ +function formatICSDate(date: Date): string { + const year = date.getUTCFullYear(); + const month = String(date.getUTCMonth() + 1).padStart(2, '0'); + const day = String(date.getUTCDate()).padStart(2, '0'); + const hours = String(date.getUTCHours()).padStart(2, '0'); + const minutes = String(date.getUTCMinutes()).padStart(2, '0'); + const seconds = String(date.getUTCSeconds()).padStart(2, '0'); + + return `${year}${month}${day}T${hours}${minutes}${seconds}Z`; +} + +/** + * Génère un UID unique pour l'événement + */ +function generateUID(): string { + return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}@itinova.com`; +} + +/** + * Échappe les caractères spéciaux pour le format ICS + */ +function escapeICS(text: string): string { + return text + .replace(/\\/g, '\\\\') + .replace(/;/g, '\\;') + .replace(/,/g, '\\,') + .replace(/\n/g, '\\n'); +} + +/** + * Génère un fichier ICS pour une invitation Outlook + */ +export function generateICS(event: ICSEvent): string { + const now = new Date(); + const uid = generateUID(); + + const icsContent = [ + 'BEGIN:VCALENDAR', + 'VERSION:2.0', + 'PRODID:-//Itinova//Formation Manager//FR', + 'CALSCALE:GREGORIAN', + 'METHOD:REQUEST', + 'BEGIN:VEVENT', + `UID:${uid}`, + `DTSTAMP:${formatICSDate(now)}`, + `DTSTART:${formatICSDate(event.startDate)}`, + `DTEND:${formatICSDate(event.endDate)}`, + `SUMMARY:${escapeICS(event.summary)}`, + event.description ? `DESCRIPTION:${escapeICS(event.description)}` : '', + `LOCATION:${escapeICS(event.location)}`, + 'STATUS:CONFIRMED', + 'TRANSP:OPAQUE', // Marque comme "occupé" dans le calendrier + 'SEQUENCE:0', + `ORGANIZER;CN=${escapeICS(event.organizerName || 'Formation Itinova')}:mailto:${event.organizerEmail || 'formation@itinova.com'}`, + `ATTENDEE;CN=${escapeICS(event.attendeeName)};RSVP=TRUE;PARTSTAT=NEEDS-ACTION;ROLE=REQ-PARTICIPANT:mailto:${event.attendeeEmail}`, + 'BEGIN:VALARM', + 'TRIGGER:-P1D', // Rappel 1 jour avant + 'ACTION:DISPLAY', + `DESCRIPTION:Rappel: ${escapeICS(event.summary)}`, + 'END:VALARM', + 'END:VEVENT', + 'END:VCALENDAR', + ].filter(line => line !== '').join('\r\n'); + + return icsContent; +} + +/** + * Génère un fichier ICS pour une session de formation + */ +export function generateFormationICS(params: { + formationNom: string; + sessionNom: string; + dateDebut: Date; + dateFin: Date; + lieu: string; + apprenantNom: string; + apprenantPrenom: string; + apprenantEmail: string; +}): string { + return generateICS({ + summary: `Formation: ${params.formationNom} - ${params.sessionNom}`, + description: `Vous êtes inscrit à la formation "${params.formationNom}".\n\nSession: ${params.sessionNom}\n\nMerci de vous présenter à l'heure indiquée.`, + location: params.lieu, + startDate: params.dateDebut, + endDate: params.dateFin, + attendeeEmail: params.apprenantEmail, + attendeeName: `${params.apprenantPrenom} ${params.apprenantNom}`, + }); +} diff --git a/deployment-package/source_server/importExcel.ts b/deployment-package/source_server/importExcel.ts new file mode 100644 index 0000000..270fa15 --- /dev/null +++ b/deployment-package/source_server/importExcel.ts @@ -0,0 +1,331 @@ +import * as XLSX from 'xlsx'; +import { getDb } from './db'; +import { formations as formationsTable, sequences as sequencesTable, datesFormation } from '../drizzle/schema'; + +export interface FormationImport { + nom: string; + description: string; + publicCible: 'directeur' | 'chef_service' | 'tous' | 'autre'; +} + +export interface SequenceImport { + formationNom: string; + nom: string; + lieu: string; + publicCible: 'directeur' | 'chef_service' | 'tous' | 'autre'; + capaciteMax: number; + dateBlocage: string; + statut: 'ouverte' | 'bloquee' | 'terminee'; + dates: Array<{ debut: string; fin: string }>; +} + +export interface ImportResult { + success: boolean; + formationsCreated: number; + sequencesCreated: number; + errors: string[]; + warnings: string[]; +} + +/** + * Parse un fichier Excel et retourne les données structurées + */ +export function parseExcelFile(buffer: Buffer): { formations: FormationImport[]; sequences: SequenceImport[] } { + const workbook = XLSX.read(buffer, { type: 'buffer' }); + + const formations: FormationImport[] = []; + const sequences: SequenceImport[] = []; + + // Parser la feuille "Formations" + if (workbook.SheetNames.includes('Formations')) { + const sheet = workbook.Sheets['Formations']; + const data = XLSX.utils.sheet_to_json(sheet, { header: 1 }); + + // Ignorer la première ligne (en-têtes) et les lignes vides + for (let i = 1; i < data.length; i++) { + const row = data[i]; + if (!row || row.length === 0 || !row[0]) continue; + + // Arrêter si on atteint les instructions + if (String(row[0]).toUpperCase().includes('INSTRUCTIONS')) break; + + formations.push({ + nom: String(row[0] || '').trim(), + description: String(row[1] || '').trim(), + publicCible: normalizePublicCible(String(row[2] || '').trim()), + }); + } + } + + // Parser la feuille "Séquences" + if (workbook.SheetNames.includes('Séquences')) { + const sheet = workbook.Sheets['Séquences']; + const data = XLSX.utils.sheet_to_json(sheet, { header: 1 }); + + for (let i = 1; i < data.length; i++) { + const row = data[i]; + if (!row || row.length === 0 || !row[0]) continue; + + // Arrêter si on atteint les instructions + if (String(row[0]).toUpperCase().includes('INSTRUCTIONS')) break; + + const dates: Array<{ debut: string; fin: string }> = []; + + // Parser les 4 dates possibles (colonnes 7-14) + for (let d = 0; d < 4; d++) { + const debutIdx = 7 + (d * 2); + const finIdx = 8 + (d * 2); + + if (row[debutIdx] && row[finIdx]) { + dates.push({ + debut: parseExcelDate(row[debutIdx]), + fin: parseExcelDate(row[finIdx]), + }); + } + } + + sequences.push({ + formationNom: String(row[0] || '').trim(), + nom: String(row[1] || '').trim(), + lieu: String(row[2] || '').trim(), + publicCible: normalizePublicCible(String(row[3] || '').trim()), + capaciteMax: parseInt(String(row[4] || '12')), + dateBlocage: parseExcelDate(row[5]), + statut: normalizeStatut(String(row[6] || '').trim()), + dates, + }); + } + } + + return { formations, sequences }; +} + +/** + * Valide les données importées + */ +export function validateImportData( + formations: FormationImport[], + sequences: SequenceImport[] +): { valid: boolean; errors: string[]; warnings: string[] } { + const errors: string[] = []; + const warnings: string[] = []; + + // Valider les formations + formations.forEach((formation, index) => { + if (!formation.nom) { + errors.push(`Formation ligne ${index + 2}: Le nom est obligatoire`); + } + if (!formation.description) { + errors.push(`Formation ligne ${index + 2}: La description est obligatoire`); + } + if (!['directeur', 'chef_service', 'tous', 'autre'].includes(formation.publicCible)) { + errors.push(`Formation ligne ${index + 2}: Public cible invalide (${formation.publicCible})`); + } + }); + + // Créer un set des noms de formations pour validation des séquences + const formationNames = new Set(formations.map(f => f.nom.toLowerCase())); + + // Valider les séquences + sequences.forEach((sequence, index) => { + if (!sequence.formationNom) { + errors.push(`Séquence ligne ${index + 2}: Le nom de la formation est obligatoire`); + } else if (!formationNames.has(sequence.formationNom.toLowerCase())) { + errors.push(`Séquence ligne ${index + 2}: Formation "${sequence.formationNom}" non trouvée dans la feuille Formations`); + } + + if (!sequence.nom) { + errors.push(`Séquence ligne ${index + 2}: Le nom est obligatoire`); + } + if (!sequence.lieu) { + errors.push(`Séquence ligne ${index + 2}: Le lieu est obligatoire`); + } + if (!['directeur', 'chef_service', 'tous', 'autre'].includes(sequence.publicCible)) { + errors.push(`Séquence ligne ${index + 2}: Public cible invalide`); + } + if (!sequence.dateBlocage) { + errors.push(`Séquence ligne ${index + 2}: La date de blocage est obligatoire`); + } + if (!['ouverte', 'bloquee', 'terminee'].includes(sequence.statut)) { + errors.push(`Séquence ligne ${index + 2}: Statut invalide`); + } + if (sequence.dates.length === 0) { + errors.push(`Séquence ligne ${index + 2}: Au moins une date est obligatoire`); + } + if (sequence.dates.length > 4) { + warnings.push(`Séquence ligne ${index + 2}: Maximum 4 dates autorisées, les dates supplémentaires seront ignorées`); + } + }); + + return { + valid: errors.length === 0, + errors, + warnings, + }; +} + +/** + * Importe les données dans la base de données + */ +export async function importToDatabase( + formations: FormationImport[], + sequences: SequenceImport[] +): Promise { + const db = await getDb(); + if (!db) { + return { + success: false, + formationsCreated: 0, + sequencesCreated: 0, + errors: ['Connexion à la base de données impossible'], + warnings: [], + }; + } + + const errors: string[] = []; + const warnings: string[] = []; + let formationsCreated = 0; + let sequencesCreated = 0; + + try { + // Map pour stocker les IDs des formations créées + const formationIdMap = new Map(); + + // Importer les formations + console.log(`[Import] Début import de ${formations.length} formations`); + for (const formation of formations) { + try { + console.log(`[Import] Création formation: ${formation.nom}`); + const [result] = await db.insert(formationsTable).values({ + nom: formation.nom, + description: formation.description, + lienUnique: generateUniqueLien(), + }).$returningId(); + + const formationId = result.id; + formationIdMap.set(formation.nom.toLowerCase(), formationId); + console.log(`[Import] Formation créée avec ID ${formationId}, ajoutée à la map avec clé: "${formation.nom.toLowerCase()}"`); + formationsCreated++; + } catch (error: any) { + console.error(`[Import] Erreur formation "${formation.nom}":`, error); + errors.push(`Erreur lors de la création de la formation "${formation.nom}": ${error.message}`); + } + } + console.log(`[Import] Formations créées: ${formationsCreated}, Map size: ${formationIdMap.size}`); + console.log(`[Import] Clés dans la map:`, Array.from(formationIdMap.keys())); + + // Si des erreurs sont survenues lors de la création des formations, arrêter l'import + if (errors.length > 0) { + console.error(`[Import] Arrêt de l'import car ${errors.length} erreur(s) lors de la création des formations`); + return { + success: false, + formationsCreated, + sequencesCreated: 0, + errors, + warnings, + }; + } + + // Importer les séquences + console.log(`[Import] Début import de ${sequences.length} séquences`); + for (const sequence of sequences) { + try { + const searchKey = sequence.formationNom.toLowerCase(); + console.log(`[Import] Recherche formation pour séquence "${sequence.nom}" avec clé: "${searchKey}"`); + const formationId = formationIdMap.get(searchKey); + if (!formationId) { + errors.push(`Formation "${sequence.formationNom}" non trouvée pour la séquence "${sequence.nom}"`); + continue; + } + + const [result] = await db.insert(sequencesTable).values({ + formationId, + nom: sequence.nom, + lieu: sequence.lieu, + publicCible: sequence.publicCible, + capaciteMax: sequence.capaciteMax, + dateBlocage: new Date(sequence.dateBlocage), + statut: sequence.statut, + }).$returningId(); + + const sequenceId = result.id; + + // Insérer les dates de formation + for (let i = 0; i < Math.min(sequence.dates.length, 4); i++) { + const date = sequence.dates[i]; + await db.insert(datesFormation).values({ + sequenceId, + dateDebut: new Date(date.debut), + dateFin: new Date(date.fin), + ordre: i + 1, + }); + } + + sequencesCreated++; + } catch (error: any) { + errors.push(`Erreur lors de la création de la séquence "${sequence.nom}": ${error.message}`); + } + } + + return { + success: errors.length === 0, + formationsCreated, + sequencesCreated, + errors, + warnings, + }; + } catch (error: any) { + return { + success: false, + formationsCreated, + sequencesCreated, + errors: [`Erreur générale: ${error.message}`], + warnings, + }; + } +} + +/** + * Normalise le public cible + */ +function normalizePublicCible(value: string): 'directeur' | 'chef_service' | 'tous' | 'autre' { + const normalized = value.toLowerCase().trim(); + if (normalized === 'directeur') return 'directeur'; + if (normalized === 'chef_service' || normalized === 'chef de service') return 'chef_service'; + if (normalized === 'tous') return 'tous'; + return 'autre'; +} + +/** + * Normalise le statut + */ +function normalizeStatut(value: string): 'ouverte' | 'bloquee' | 'terminee' { + const normalized = value.toLowerCase().trim(); + if (normalized === 'ouverte') return 'ouverte'; + if (normalized === 'bloquee' || normalized === 'bloquée') return 'bloquee'; + if (normalized === 'terminee' || normalized === 'terminée') return 'terminee'; + return 'ouverte'; +} + +/** + * Parse une date Excel (peut être un nombre de série Excel ou une chaîne) + */ +function parseExcelDate(value: any): string { + if (!value) return ''; + + // Si c'est un nombre (date Excel) + if (typeof value === 'number') { + const date = XLSX.SSF.parse_date_code(value); + return `${date.y}-${String(date.m).padStart(2, '0')}-${String(date.d).padStart(2, '0')} ${String(date.H || 0).padStart(2, '0')}:${String(date.M || 0).padStart(2, '0')}`; + } + + // Si c'est déjà une chaîne + return String(value).trim(); +} + +/** + * Génère un lien unique pour une formation + */ +function generateUniqueLien(): string { + return Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15); +} diff --git a/deployment-package/source_server/inscriptionWithDates.ts b/deployment-package/source_server/inscriptionWithDates.ts new file mode 100644 index 0000000..cfcd627 --- /dev/null +++ b/deployment-package/source_server/inscriptionWithDates.ts @@ -0,0 +1,85 @@ +import { eq, ne, and } from "drizzle-orm"; +import { inscriptions, apprenants, sequences, datesFormation } from "../drizzle/schema"; +import { getDb } from "./db"; + +/** + * Récupérer les inscriptions d'une séquence avec les dates de formation + */ +export async function getInscriptionsWithDates(sequenceId: number) { + const db = await getDb(); + if (!db) return []; + + // Récupérer les inscriptions + const results = await db + .select({ + inscription: inscriptions, + apprenant: apprenants, + }) + .from(inscriptions) + .leftJoin(apprenants, eq(inscriptions.apprenantId, apprenants.id)) + .where( + and( + eq(inscriptions.sequenceId, sequenceId), + ne(inscriptions.statut, "annulee") + ) + ); + + // Récupérer les dates de formation pour cette séquence + const dates = await db + .select() + .from(datesFormation) + .where(eq(datesFormation.sequenceId, sequenceId)) + .orderBy(datesFormation.ordre); + + // Combiner les données + return results.map((r) => ({ + ...r, + dates, + })); +} + +/** + * Récupérer les inscriptions d'un apprenant avec les détails des séquences et dates + */ +export async function getInscriptionsByApprenantWithDates(apprenantId: number) { + const db = await getDb(); + if (!db) return []; + + // Récupérer les inscriptions + const results = await db + .select({ + inscription: inscriptions, + sequence: sequences, + }) + .from(inscriptions) + .leftJoin(sequences, eq(inscriptions.sequenceId, sequences.id)) + .where( + and( + eq(inscriptions.apprenantId, apprenantId), + ne(inscriptions.statut, "annulee") + ) + ); + + // Pour chaque inscription, récupérer les dates de formation + const resultsWithDates = await Promise.all( + results.map(async (r) => { + if (!r.sequence) return { ...r, dates: [] }; + + const dates = await db + .select() + .from(datesFormation) + .where(eq(datesFormation.sequenceId, r.sequence.id)) + .orderBy(datesFormation.ordre); + + return { + ...r, + sequence: { + ...r.sequence, + dates, + }, + }; + }) + ); + + return resultsWithDates; +} diff --git a/deployment-package/source_server/notificationLogsDb.ts b/deployment-package/source_server/notificationLogsDb.ts new file mode 100644 index 0000000..e1f19a9 --- /dev/null +++ b/deployment-package/source_server/notificationLogsDb.ts @@ -0,0 +1,210 @@ +import { eq, desc, and, gte, lte, sql, like } from "drizzle-orm"; +import { getDb } from "./db"; +import { logsNotifications, sequences, apprenants, formateurs, formations } from "../drizzle/schema"; + +export type NotificationType = + | "remerciement" + | "notification_formateur_inscription" + | "notification_formateur_annulation" + | "alerte_capacite" + | "notification_liste_attente"; + +export interface LogNotificationInput { + type: NotificationType; + sequenceId?: number; + apprenantId?: number; + formateurId?: number; + emailDestinataire: string; + sujet: string; + statut: "success" | "failed"; + messageErreur?: string; + metadata?: Record; +} + +/** + * Enregistre un log de notification + */ +export async function logNotification(input: LogNotificationInput) { + const db = await getDb(); + if (!db) { + console.warn("[NotificationLogs] Database not available"); + return; + } + + try { + await db.insert(logsNotifications).values({ + type: input.type, + sequenceId: input.sequenceId || null, + apprenantId: input.apprenantId || null, + formateurId: input.formateurId || null, + emailDestinataire: input.emailDestinataire, + sujet: input.sujet, + statut: input.statut, + messageErreur: input.messageErreur || null, + metadata: input.metadata ? JSON.stringify(input.metadata) : null, + }); + console.log(`[NotificationLogs] Log créé: ${input.type} -> ${input.emailDestinataire} (${input.statut})`); + } catch (error) { + console.error("[NotificationLogs] Erreur lors de la création du log:", error); + } +} + +/** + * Récupère l'historique des notifications avec filtres + */ +export async function getNotificationLogs(filters?: { + type?: NotificationType; + dateDebut?: Date; + dateFin?: Date; + statut?: "success" | "failed"; + email?: string; + sequenceId?: number; + limit?: number; + offset?: number; +}) { + const db = await getDb(); + if (!db) return { logs: [], total: 0 }; + + const conditions = []; + + if (filters?.type) { + conditions.push(eq(logsNotifications.type, filters.type)); + } + if (filters?.dateDebut) { + conditions.push(gte(logsNotifications.dateEnvoi, filters.dateDebut)); + } + if (filters?.dateFin) { + conditions.push(lte(logsNotifications.dateEnvoi, filters.dateFin)); + } + if (filters?.statut) { + conditions.push(eq(logsNotifications.statut, filters.statut)); + } + if (filters?.email) { + conditions.push(like(logsNotifications.emailDestinataire, `%${filters.email}%`)); + } + if (filters?.sequenceId) { + conditions.push(eq(logsNotifications.sequenceId, filters.sequenceId)); + } + + const whereClause = conditions.length > 0 ? and(...conditions) : undefined; + + // Récupérer les logs avec les informations associées + const logs = await db + .select({ + id: logsNotifications.id, + type: logsNotifications.type, + sequenceId: logsNotifications.sequenceId, + apprenantId: logsNotifications.apprenantId, + formateurId: logsNotifications.formateurId, + emailDestinataire: logsNotifications.emailDestinataire, + sujet: logsNotifications.sujet, + dateEnvoi: logsNotifications.dateEnvoi, + statut: logsNotifications.statut, + messageErreur: logsNotifications.messageErreur, + metadata: logsNotifications.metadata, + sequenceNom: sequences.nom, + formationNom: formations.nom, + apprenantNom: apprenants.nom, + apprenantPrenom: apprenants.prenom, + formateurNom: formateurs.nom, + }) + .from(logsNotifications) + .leftJoin(sequences, eq(logsNotifications.sequenceId, sequences.id)) + .leftJoin(formations, eq(sequences.formationId, formations.id)) + .leftJoin(apprenants, eq(logsNotifications.apprenantId, apprenants.id)) + .leftJoin(formateurs, eq(logsNotifications.formateurId, formateurs.id)) + .where(whereClause) + .orderBy(desc(logsNotifications.dateEnvoi)) + .limit(filters?.limit || 50) + .offset(filters?.offset || 0); + + // Compter le total + const [countResult] = await db + .select({ count: sql`COUNT(*)` }) + .from(logsNotifications) + .where(whereClause); + + return { + logs, + total: countResult?.count || 0, + }; +} + +/** + * Récupère les statistiques des notifications + */ +export async function getNotificationStats(filters?: { + dateDebut?: Date; + dateFin?: Date; +}) { + const db = await getDb(); + if (!db) return null; + + const conditions = []; + if (filters?.dateDebut) { + conditions.push(gte(logsNotifications.dateEnvoi, filters.dateDebut)); + } + if (filters?.dateFin) { + conditions.push(lte(logsNotifications.dateEnvoi, filters.dateFin)); + } + + const whereClause = conditions.length > 0 ? and(...conditions) : undefined; + + // Statistiques globales + const [globalStats] = await db + .select({ + total: sql`COUNT(*)`, + success: sql`SUM(CASE WHEN statut = 'success' THEN 1 ELSE 0 END)`, + failed: sql`SUM(CASE WHEN statut = 'failed' THEN 1 ELSE 0 END)`, + }) + .from(logsNotifications) + .where(whereClause); + + // Statistiques par type + const statsByType = await db + .select({ + type: logsNotifications.type, + total: sql`COUNT(*)`, + success: sql`SUM(CASE WHEN statut = 'success' THEN 1 ELSE 0 END)`, + failed: sql`SUM(CASE WHEN statut = 'failed' THEN 1 ELSE 0 END)`, + }) + .from(logsNotifications) + .where(whereClause) + .groupBy(logsNotifications.type); + + // Évolution par jour (7 derniers jours) + const evolutionParJour = await db + .select({ + date: sql`DATE(dateEnvoi)`, + total: sql`COUNT(*)`, + success: sql`SUM(CASE WHEN statut = 'success' THEN 1 ELSE 0 END)`, + failed: sql`SUM(CASE WHEN statut = 'failed' THEN 1 ELSE 0 END)`, + }) + .from(logsNotifications) + .where(whereClause) + .groupBy(sql`DATE(dateEnvoi)`) + .orderBy(sql`DATE(dateEnvoi)`) + .limit(30); + + return { + global: { + total: globalStats?.total || 0, + success: globalStats?.success || 0, + failed: globalStats?.failed || 0, + tauxSucces: globalStats?.total ? Math.round((globalStats.success / globalStats.total) * 100) : 0, + }, + parType: statsByType, + evolutionParJour, + }; +} + +/** + * Labels pour les types de notifications + */ +export const notificationTypeLabels: Record = { + remerciement: "Remerciement post-formation", + notification_formateur_inscription: "Notification formateur (inscription)", + notification_formateur_annulation: "Notification formateur (annulation)", + alerte_capacite: "Alerte capacité atteinte", + notification_liste_attente: "Notification liste d'attente", +}; diff --git a/deployment-package/source_server/parametresDb.ts b/deployment-package/source_server/parametresDb.ts new file mode 100644 index 0000000..92df487 --- /dev/null +++ b/deployment-package/source_server/parametresDb.ts @@ -0,0 +1,134 @@ +import { eq, sql } from "drizzle-orm"; +import { getDb } from "./db"; +import { parametres, historiqueParametres } from "../drizzle/schema"; + +/** + * Récupérer les paramètres de l'application + * S'il n'y a pas de paramètres, en créer un avec les valeurs par défaut + */ +export async function getParametres() { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + const result = await db.select().from(parametres).limit(1); + + if (result.length === 0) { + // Créer les paramètres par défaut + await db.insert(parametres).values({ + urlPublique: "https://formations.itinova.org", + }); + + const newResult = await db.select().from(parametres).limit(1); + return newResult[0]; + } + + return result[0]; +} + +/** + * Mettre à jour les paramètres de l'application + * Enregistre automatiquement l'historique des modifications + */ +export async function updateParametres( + updates: Partial<{ + urlPublique: string; + delaiExpirationQR: number; + dureeValiditeToken: number; + notificationsActives: boolean; + envoiAutomatiqueAttestations: boolean; + }>, + userId: number, + userName: string +) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + const params = await getParametres(); + + // Enregistrer l'historique pour chaque champ modifié + for (const [key, value] of Object.entries(updates)) { + const oldValue = params[key as keyof typeof params]; + if (oldValue !== value) { + await db.insert(historiqueParametres).values({ + userId, + userName, + champModifie: key, + ancienneValeur: oldValue !== null && oldValue !== undefined ? String(oldValue) : null, + nouvelleValeur: value !== null && value !== undefined ? String(value) : null, + }); + } + } + + // Mettre à jour les paramètres + await db.update(parametres) + .set(updates) + .where(eq(parametres.id, params.id)); + + return getParametres(); +} + +/** + * Mettre à jour l'URL publique (fonction de compatibilité) + */ +export async function updateUrlPublique(urlPublique: string, userId?: number, userName?: string) { + return updateParametres( + { urlPublique }, + userId || 1, + userName || "Système" + ); +} + +/** + * Récupérer l'historique des modifications des paramètres + */ +export async function getHistoriqueParametres(limit: number = 50) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + return db.select() + .from(historiqueParametres) + .orderBy(sql`${historiqueParametres.dateModification} DESC`) + .limit(limit); +} + +/** + * Tester l'accessibilité d'une URL + */ +export async function testerUrl(url: string): Promise<{ accessible: boolean; message: string; statusCode?: number }> { + try { + // Vérifier le format de l'URL + const urlObj = new URL(url); + if (!['http:', 'https:'].includes(urlObj.protocol)) { + return { + accessible: false, + message: "L'URL doit commencer par http:// ou https://" + }; + } + + // Tenter une requête HEAD pour vérifier l'accessibilité + const response = await fetch(url, { + method: 'HEAD', + signal: AbortSignal.timeout(5000), // Timeout de 5 secondes + }); + + return { + accessible: response.ok, + message: response.ok + ? "L'URL est accessible" + : `L'URL a retourné une erreur HTTP ${response.status}`, + statusCode: response.status + }; + } catch (error) { + if (error instanceof TypeError && error.message.includes('Invalid URL')) { + return { + accessible: false, + message: "Format d'URL invalide" + }; + } + + return { + accessible: false, + message: `Erreur lors du test: ${error instanceof Error ? error.message : 'Erreur inconnue'}` + }; + } +} diff --git a/deployment-package/source_server/presenceDb.ts b/deployment-package/source_server/presenceDb.ts new file mode 100644 index 0000000..adb49f5 --- /dev/null +++ b/deployment-package/source_server/presenceDb.ts @@ -0,0 +1,149 @@ +import { eq, and } from "drizzle-orm"; +import { presences, inscriptions, datesFormation, sequences, apprenants } from "../drizzle/schema"; +import { getDb } from "./db"; + +/** + * Valider la présence d'un apprenant (par QR code ou manuellement) + */ +export async function validerPresence(params: { + inscriptionId: number; + dateFormationId: number; + modeValidation: "qrcode" | "manuel"; + validateurId?: number; + commentaire?: string; +}) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + // Vérifier si la présence existe déjà + const presenceExistante = await db + .select() + .from(presences) + .where( + and( + eq(presences.inscriptionId, params.inscriptionId), + eq(presences.dateFormationId, params.dateFormationId) + ) + ) + .limit(1); + + if (presenceExistante.length > 0) { + throw new Error("Présence déjà validée pour cette date"); + } + + // Créer la présence + await db.insert(presences).values({ + inscriptionId: params.inscriptionId, + dateFormationId: params.dateFormationId, + heurePresence: new Date(), + modeValidation: params.modeValidation, + validateurId: params.validateurId, + commentaire: params.commentaire, + }); + + return { success: true }; +} + +/** + * Récupérer toutes les présences pour une séquence + */ +export async function getPresencesBySequence(sequenceId: number) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + const result = await db + .select({ + presenceId: presences.id, + inscriptionId: presences.inscriptionId, + dateFormationId: presences.dateFormationId, + heurePresence: presences.heurePresence, + modeValidation: presences.modeValidation, + validateurId: presences.validateurId, + commentaire: presences.commentaire, + apprenantId: apprenants.id, + apprenantNom: apprenants.nom, + apprenantPrenom: apprenants.prenom, + apprenantEmail: apprenants.email, + dateDebut: datesFormation.dateDebut, + dateFin: datesFormation.dateFin, + }) + .from(presences) + .innerJoin(inscriptions, eq(presences.inscriptionId, inscriptions.id)) + .innerJoin(apprenants, eq(inscriptions.apprenantId, apprenants.id)) + .innerJoin(datesFormation, eq(presences.dateFormationId, datesFormation.id)) + .where(eq(datesFormation.sequenceId, sequenceId)); + + return result; +} + +/** + * Récupérer les présences pour une inscription spécifique + */ +export async function getPresencesByInscription(inscriptionId: number) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + const result = await db + .select({ + presenceId: presences.id, + dateFormationId: presences.dateFormationId, + heurePresence: presences.heurePresence, + modeValidation: presences.modeValidation, + validateurId: presences.validateurId, + commentaire: presences.commentaire, + dateDebut: datesFormation.dateDebut, + dateFin: datesFormation.dateFin, + }) + .from(presences) + .innerJoin(datesFormation, eq(presences.dateFormationId, datesFormation.id)) + .where(eq(presences.inscriptionId, inscriptionId)); + + return result; +} + +/** + * Vérifier si toutes les présences sont validées pour une inscription + */ +export async function checkAllPresencesValidated(inscriptionId: number): Promise { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + // Récupérer l'inscription avec la séquence + const inscription = await db + .select({ + sequenceId: inscriptions.sequenceId, + }) + .from(inscriptions) + .where(eq(inscriptions.id, inscriptionId)) + .limit(1); + + if (inscription.length === 0) { + throw new Error("Inscription not found"); + } + + // Compter le nombre de dates de formation pour cette séquence + const datesCount = await db + .select({ count: datesFormation.id }) + .from(datesFormation) + .where(eq(datesFormation.sequenceId, inscription[0].sequenceId)); + + // Compter le nombre de présences validées pour cette inscription + const presencesCount = await db + .select({ count: presences.id }) + .from(presences) + .where(eq(presences.inscriptionId, inscriptionId)); + + return presencesCount.length === datesCount.length; +} + +/** + * Supprimer une présence + */ +export async function supprimerPresence(presenceId: number) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + await db.delete(presences).where(eq(presences.id, presenceId)); + + return { success: true }; +} diff --git a/deployment-package/source_server/qrCodeGenerator.ts b/deployment-package/source_server/qrCodeGenerator.ts new file mode 100644 index 0000000..0d081a3 --- /dev/null +++ b/deployment-package/source_server/qrCodeGenerator.ts @@ -0,0 +1,63 @@ +import QRCode from "qrcode"; +import { randomBytes } from "crypto"; +import { getParametres } from "./parametresDb"; + +/** + * Générer un token unique pour le QR code + */ +export function generateQRToken(): string { + return randomBytes(32).toString("hex"); +} + +/** + * Générer un QR code en base64 à partir d'un token + * @param token Le token unique de la séquence + * @returns Une image QR code en base64 (data URL) + */ +export async function generateQRCodeDataURL(token: string): Promise { + // URL complète pour scanner le QR code + const parametres = await getParametres(); + const url = `${parametres.urlPublique}/emargement/${token}`; + + try { + const qrCodeDataURL = await QRCode.toDataURL(url, { + errorCorrectionLevel: "H", + type: "image/png", + width: 400, + margin: 2, + color: { + dark: "#000000", + light: "#FFFFFF", + }, + }); + + return qrCodeDataURL; + } catch (error) { + console.error("Erreur lors de la génération du QR code:", error); + throw new Error("Impossible de générer le QR code"); + } +} + +/** + * Générer un QR code en buffer PNG + * @param token Le token unique de la séquence + * @returns Un buffer PNG du QR code + */ +export async function generateQRCodeBuffer(token: string): Promise { + const parametres = await getParametres(); + const url = `${parametres.urlPublique}/emargement/${token}`; + + try { + const buffer = await QRCode.toBuffer(url, { + errorCorrectionLevel: "H", + type: "png", + width: 400, + margin: 2, + }); + + return buffer; + } catch (error) { + console.error("Erreur lors de la génération du QR code:", error); + throw new Error("Impossible de générer le QR code"); + } +} diff --git a/deployment-package/source_server/questionnaireDb.ts b/deployment-package/source_server/questionnaireDb.ts new file mode 100644 index 0000000..068a3d6 --- /dev/null +++ b/deployment-package/source_server/questionnaireDb.ts @@ -0,0 +1,250 @@ +import { eq, and, desc, sql } from "drizzle-orm"; +import { getDb } from "./db"; +import { + questionnaires, + questions, + reponsesQuestionnaires, + reponsesQuestions, + envoisQuestionnaires, + type Questionnaire, + type InsertQuestionnaire, + type Question, + type InsertQuestion, + type ReponseQuestionnaire, + type InsertReponseQuestionnaire, + type ReponseQuestion, + type InsertReponseQuestion, + type EnvoiQuestionnaire, + type InsertEnvoiQuestionnaire, +} from "../drizzle/schema"; + +// ========== QUESTIONNAIRES ========== + +export async function getAllQuestionnaires() { + const db = await getDb(); + if (!db) return []; + return await db.select().from(questionnaires).orderBy(desc(questionnaires.createdAt)); +} + +export async function getQuestionnaireById(id: number) { + const db = await getDb(); + if (!db) return null; + const result = await db.select().from(questionnaires).where(eq(questionnaires.id, id)).limit(1); + return result[0] || null; +} + +export async function createQuestionnaire(data: InsertQuestionnaire) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + const result = await db.insert(questionnaires).values(data); + return result[0].insertId; +} + +export async function updateQuestionnaire(id: number, data: Partial) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + await db.update(questionnaires).set(data).where(eq(questionnaires.id, id)); +} + +export async function deleteQuestionnaire(id: number) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + // Supprimer d'abord les questions associées + await db.delete(questions).where(eq(questions.questionnaireId, id)); + // Puis le questionnaire + await db.delete(questionnaires).where(eq(questionnaires.id, id)); +} + +// ========== QUESTIONS ========== + +export async function getQuestionsByQuestionnaireId(questionnaireId: number) { + const db = await getDb(); + if (!db) return []; + return await db + .select() + .from(questions) + .where(eq(questions.questionnaireId, questionnaireId)) + .orderBy(questions.ordre); +} + +export async function createQuestion(data: InsertQuestion) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + const result = await db.insert(questions).values(data); + return result[0].insertId; +} + +export async function updateQuestion(id: number, data: Partial) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + await db.update(questions).set(data).where(eq(questions.id, id)); +} + +export async function deleteQuestion(id: number) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + await db.delete(questions).where(eq(questions.id, id)); +} + +// ========== RÉPONSES QUESTIONNAIRES ========== + +export async function createReponseQuestionnaire(data: InsertReponseQuestionnaire) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + const result = await db.insert(reponsesQuestionnaires).values(data); + return result[0].insertId; +} + +export async function getReponseQuestionnaire(questionnaireId: number, apprenantId: number, sequenceId: number) { + const db = await getDb(); + if (!db) return null; + const result = await db + .select() + .from(reponsesQuestionnaires) + .where( + and( + eq(reponsesQuestionnaires.questionnaireId, questionnaireId), + eq(reponsesQuestionnaires.apprenantId, apprenantId), + eq(reponsesQuestionnaires.sequenceId, sequenceId) + ) + ) + .limit(1); + return result[0] || null; +} + +export async function updateReponseQuestionnaire(id: number, data: Partial) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + await db.update(reponsesQuestionnaires).set(data).where(eq(reponsesQuestionnaires.id, id)); +} + +// ========== RÉPONSES QUESTIONS ========== + +export async function createReponseQuestion(data: InsertReponseQuestion) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + const result = await db.insert(reponsesQuestions).values(data); + return result[0].insertId; +} + +export async function getReponsesByReponseQuestionnaireId(reponseQuestionnaireId: number) { + const db = await getDb(); + if (!db) return []; + return await db + .select() + .from(reponsesQuestions) + .where(eq(reponsesQuestions.reponseQuestionnaireId, reponseQuestionnaireId)); +} + +// ========== ENVOIS QUESTIONNAIRES ========== + +export async function createEnvoiQuestionnaire(data: InsertEnvoiQuestionnaire) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + const result = await db.insert(envoisQuestionnaires).values(data); + return result[0].insertId; +} + +export async function getEnvoiByToken(token: string) { + const db = await getDb(); + if (!db) return null; + const result = await db + .select() + .from(envoisQuestionnaires) + .where(eq(envoisQuestionnaires.token, token)) + .limit(1); + return result[0] || null; +} + +export async function updateEnvoiQuestionnaire(id: number, data: Partial) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + await db.update(envoisQuestionnaires).set(data).where(eq(envoisQuestionnaires.id, id)); +} + +export async function checkEnvoiExists(questionnaireId: number, apprenantId: number, sequenceId: number) { + const db = await getDb(); + if (!db) return false; + const result = await db + .select() + .from(envoisQuestionnaires) + .where( + and( + eq(envoisQuestionnaires.questionnaireId, questionnaireId), + eq(envoisQuestionnaires.apprenantId, apprenantId), + eq(envoisQuestionnaires.sequenceId, sequenceId) + ) + ) + .limit(1); + return result.length > 0; +} + +// ========== STATISTIQUES ========== + +/** + * Récupère les statistiques d'un questionnaire + */ +export async function getQuestionnaireStats(questionnaireId: number) { + const db = await getDb(); + if (!db) return null; + + // Nombre total d'envois + const envoisResult = await db + .select({ count: sql`count(*)` }) + .from(envoisQuestionnaires) + .where(eq(envoisQuestionnaires.questionnaireId, questionnaireId)); + const totalEnvois = envoisResult[0]?.count || 0; + + // Nombre de réponses + const reponsesResult = await db + .select({ count: sql`count(*)` }) + .from(reponsesQuestionnaires) + .where( + and( + eq(reponsesQuestionnaires.questionnaireId, questionnaireId), + eq(reponsesQuestionnaires.complete, true) + ) + ); + const totalReponses = reponsesResult[0]?.count || 0; + + // Taux de réponse + const tauxReponse = totalEnvois > 0 ? (totalReponses / totalEnvois) * 100 : 0; + + return { + totalEnvois, + totalReponses, + tauxReponse: Math.round(tauxReponse * 10) / 10, // 1 décimale + }; +} + +/** + * Récupère les réponses détaillées d'un questionnaire pour analyse + */ +export async function getReponsesDetailleesQuestionnaire(questionnaireId: number) { + const db = await getDb(); + if (!db) return []; + + const result = await db + .select({ + reponseQuestionnaireId: reponsesQuestionnaires.id, + apprenantId: reponsesQuestionnaires.apprenantId, + sequenceId: reponsesQuestionnaires.sequenceId, + dateReponse: reponsesQuestionnaires.dateReponse, + questionId: reponsesQuestions.questionId, + reponseNumerique: reponsesQuestions.reponseNumerique, + reponseTexte: reponsesQuestions.reponseTexte, + }) + .from(reponsesQuestionnaires) + .leftJoin( + reponsesQuestions, + eq(reponsesQuestions.reponseQuestionnaireId, reponsesQuestionnaires.id) + ) + .where( + and( + eq(reponsesQuestionnaires.questionnaireId, questionnaireId), + eq(reponsesQuestionnaires.complete, true) + ) + ); + + return result; +} diff --git a/deployment-package/source_server/questionnaireExport.ts b/deployment-package/source_server/questionnaireExport.ts new file mode 100644 index 0000000..5257898 --- /dev/null +++ b/deployment-package/source_server/questionnaireExport.ts @@ -0,0 +1,174 @@ +import ExcelJS from 'exceljs'; +import { jsPDF } from 'jspdf'; +import { getQuestionnaireById, getQuestionsByQuestionnaireId, getQuestionnaireStats, getReponsesDetailleesQuestionnaire } from './questionnaireDb'; +import { getDb } from './db'; +import { sql } from 'drizzle-orm'; + +/** + * Génère un fichier Excel avec les statistiques du questionnaire + */ +export async function exportQuestionnaireToExcel(questionnaireId: number): Promise { + const questionnaire = await getQuestionnaireById(questionnaireId); + const stats = await getQuestionnaireStats(questionnaireId); + const questionsData = await getQuestionsByQuestionnaireId(questionnaireId); + const reponsesData = await getReponsesDetailleesQuestionnaire(questionnaireId); + + if (!questionnaire || !stats) { + throw new Error('Questionnaire introuvable'); + } + + const workbook = new ExcelJS.Workbook(); + + // Feuille 1: Statistiques globales + const statsSheet = workbook.addWorksheet('Statistiques'); + + statsSheet.addRow(['Questionnaire', questionnaire.titre]); + statsSheet.addRow(['Type', questionnaire.type]); + statsSheet.addRow(['']); + statsSheet.addRow(['Nombre d\'envois', stats.totalEnvois]); + statsSheet.addRow(['Nombre de réponses', stats.totalReponses]); + statsSheet.addRow(['Taux de réponse', `${stats.tauxReponse.toFixed(1)}%`]); + statsSheet.addRow(['']); + + // Style pour l'en-tête + statsSheet.getColumn(1).width = 30; + statsSheet.getColumn(2).width = 40; + statsSheet.getRow(1).font = { bold: true, size: 14 }; + + // Feuille 2: Statistiques par question + const questionsSheet = workbook.addWorksheet('Par question'); + + questionsSheet.addRow(['Question', 'Type', 'Ordre']); + questionsSheet.getRow(1).font = { bold: true }; + questionsSheet.getRow(1).fill = { + type: 'pattern', + pattern: 'solid', + fgColor: { argb: 'FFE0E0E0' } + }; + + questionsData.forEach((q: any) => { + questionsSheet.addRow([ + q.texte, + q.typeQuestion, + q.ordre + ]); + }); + + questionsSheet.getColumn(1).width = 60; + questionsSheet.getColumn(2).width = 20; + questionsSheet.getColumn(3).width = 10; + + // Feuille 3: Réponses brutes + const reponsesSheet = workbook.addWorksheet('Réponses brutes'); + + reponsesSheet.addRow(['Date réponse', 'Apprenant ID', 'Séquence ID', 'Question ID', 'Réponse numérique', 'Réponse texte']); + reponsesSheet.getRow(1).font = { bold: true }; + reponsesSheet.getRow(1).fill = { + type: 'pattern', + pattern: 'solid', + fgColor: { argb: 'FFE0E0E0' } + }; + + reponsesData.forEach((r: any) => { + reponsesSheet.addRow([ + r.dateReponse ? new Date(r.dateReponse).toLocaleDateString('fr-FR') : '', + r.apprenantId, + r.sequenceId, + r.questionId, + r.reponseNumerique || '', + r.reponseTexte || '' + ]); + }); + + reponsesSheet.getColumn(1).width = 15; + reponsesSheet.getColumn(2).width = 15; + reponsesSheet.getColumn(3).width = 15; + reponsesSheet.getColumn(4).width = 15; + reponsesSheet.getColumn(5).width = 20; + reponsesSheet.getColumn(6).width = 50; + + // Générer le buffer + const buffer = await workbook.xlsx.writeBuffer(); + return Buffer.from(buffer); +} + +/** + * Génère un fichier PDF avec les statistiques du questionnaire + */ +export async function exportQuestionnaireToPDF(questionnaireId: number): Promise { + const questionnaire = await getQuestionnaireById(questionnaireId); + const stats = await getQuestionnaireStats(questionnaireId); + const questionsData = await getQuestionsByQuestionnaireId(questionnaireId); + + if (!questionnaire || !stats) { + throw new Error('Questionnaire introuvable'); + } + + const doc = new jsPDF(); + let yPos = 20; + + // Titre + doc.setFontSize(18); + doc.setFont('helvetica', 'bold'); + doc.text(questionnaire.titre, 20, yPos); + yPos += 10; + + // Type + doc.setFontSize(12); + doc.setFont('helvetica', 'normal'); + doc.text(`Type: ${questionnaire.type}`, 20, yPos); + yPos += 15; + + // Statistiques globales + doc.setFont('helvetica', 'bold'); + doc.text('Statistiques globales', 20, yPos); + yPos += 8; + + doc.setFont('helvetica', 'normal'); + doc.text(`Nombre d'envois: ${stats.totalEnvois}`, 20, yPos); + yPos += 6; + doc.text(`Nombre de réponses: ${stats.totalReponses}`, 20, yPos); + yPos += 6; + doc.text(`Taux de réponse: ${stats.tauxReponse.toFixed(1)}%`, 20, yPos); + yPos += 15; + + // Liste des questions + doc.setFont('helvetica', 'bold'); + doc.text('Questions du questionnaire', 20, yPos); + yPos += 10; + + questionsData.forEach((q: any, index: number) => { + // Vérifier si on doit ajouter une nouvelle page + if (yPos > 250) { + doc.addPage(); + yPos = 20; + } + + doc.setFont('helvetica', 'bold'); + doc.setFontSize(11); + const questionText = `${index + 1}. ${q.texte}`; + const lines = doc.splitTextToSize(questionText, 170); + doc.text(lines, 20, yPos); + yPos += lines.length * 6; + + doc.setFont('helvetica', 'normal'); + doc.setFontSize(10); + doc.text(`Type: ${q.typeQuestion}`, 25, yPos); + yPos += 8; + }); + + // Pied de page + const pageCount = doc.getNumberOfPages(); + for (let i = 1; i <= pageCount; i++) { + doc.setPage(i); + doc.setFontSize(8); + doc.setFont('helvetica', 'normal'); + doc.text( + `Page ${i} sur ${pageCount} - Généré le ${new Date().toLocaleDateString('fr-FR')}`, + 20, + 290 + ); + } + + return Buffer.from(doc.output('arraybuffer')); +} diff --git a/deployment-package/source_server/questionnaireScheduler.ts b/deployment-package/source_server/questionnaireScheduler.ts new file mode 100644 index 0000000..f476d6f --- /dev/null +++ b/deployment-package/source_server/questionnaireScheduler.ts @@ -0,0 +1,248 @@ +import { getDb } from "./db"; +import { eq, and, lte, sql } from "drizzle-orm"; +import { + questionnaires, + sequences, + inscriptions, + apprenants, + datesFormation, + envoisQuestionnaires, +} from "../drizzle/schema"; +import { + getAllQuestionnaires, + checkEnvoiExists, + createEnvoiQuestionnaire, +} from "./questionnaireDb"; +import { sendEmail } from "./_core/emailSender"; +import crypto from "crypto"; + +/** + * Génère un token unique pour accéder au questionnaire + */ +function generateToken(): string { + return crypto.randomBytes(32).toString("hex"); +} + +/** + * Envoie un questionnaire à un apprenant pour une séquence donnée + */ +async function envoyerQuestionnaire( + questionnaireId: number, + apprenantId: number, + sequenceId: number, + apprenantEmail: string, + apprenantNom: string, + apprenantPrenom: string, + questionnairenom: string, + sequenceNom: string +) { + // Vérifier si le questionnaire n'a pas déjà été envoyé + const dejaEnvoye = await checkEnvoiExists(questionnaireId, apprenantId, sequenceId); + if (dejaEnvoye) { + console.log( + `[Questionnaires] Questionnaire ${questionnaireId} déjà envoyé à l'apprenant ${apprenantId} pour la séquence ${sequenceId}` + ); + return false; + } + + // Générer un token unique + const token = generateToken(); + + // Créer l'envoi + await createEnvoiQuestionnaire({ + questionnaireId, + apprenantId, + sequenceId, + token, + dateEnvoi: new Date(), + dateReponse: null, + }); + + // Envoyer l'email + const lienQuestionnaire = `${process.env.VITE_FRONTEND_URL || "http://localhost:3000"}/questionnaire/${token}`; + + const emailSent = await sendEmail({ + to: apprenantEmail, + subject: `Questionnaire : ${questionnairenom}`, + html: ` +

    Bonjour ${apprenantPrenom} ${apprenantNom},

    + +

    Nous vous remercions d'avoir participé à la formation ${sequenceNom}.

    + +

    Afin d'améliorer continuellement la qualité de nos formations, nous vous invitons à répondre à ce questionnaire :

    + +

    + + Répondre au questionnaire + +

    + +

    Ce questionnaire ne vous prendra que quelques minutes.

    + +

    Merci pour votre participation !

    + +

    + Si le bouton ne fonctionne pas, copiez ce lien dans votre navigateur :
    + ${lienQuestionnaire} +

    + `, + }); + + if (emailSent) { + console.log( + `[Questionnaires] Questionnaire ${questionnaireId} envoyé à ${apprenantEmail} pour la séquence ${sequenceId}` + ); + return true; + } else { + console.error( + `[Questionnaires] Échec de l'envoi du questionnaire ${questionnaireId} à ${apprenantEmail}` + ); + return false; + } +} + +/** + * Traite les envois automatiques de questionnaires post-formation + */ +export async function processEnvoisAutomatiques() { + console.log("[Questionnaires] Démarrage du traitement des envois automatiques..."); + + const db = await getDb(); + if (!db) { + console.log("[Questionnaires] Base de données non disponible"); + return { success: false, message: "Base de données non disponible" }; + } + + try { + // Récupérer tous les questionnaires actifs avec envoi automatique + const questionnairesActifs = await getAllQuestionnaires(); + const questionnairesAEnvoyer = questionnairesActifs.filter( + (q) => q.actif && q.envoiAutomatique + ); + + if (questionnairesAEnvoyer.length === 0) { + console.log("[Questionnaires] Aucun questionnaire avec envoi automatique configuré"); + return { success: true, message: "Aucun questionnaire à envoyer", count: 0 }; + } + + let totalEnvoyes = 0; + + for (const questionnaire of questionnairesAEnvoyer) { + console.log( + `[Questionnaires] Traitement du questionnaire "${questionnaire.titre}" (délai: J+${questionnaire.delaiEnvoiJours})` + ); + + // Calculer la date cible (aujourd'hui - délai) + const dateCible = new Date(); + dateCible.setDate(dateCible.getDate() - questionnaire.delaiEnvoiJours); + dateCible.setHours(0, 0, 0, 0); + + // Récupérer les séquences terminées à la date cible + const sequencesTerminees = await db + .select({ + sequenceId: sequences.id, + sequenceNom: sequences.nom, + formationId: sequences.formationId, + }) + .from(sequences) + .innerJoin(datesFormation, eq(datesFormation.sequenceId, sequences.id)) + .where(lte(datesFormation.dateFin, dateCible)) + .groupBy(sequences.id); + + console.log( + `[Questionnaires] ${sequencesTerminees.length} séquence(s) terminée(s) trouvée(s) pour le ${dateCible.toLocaleDateString("fr-FR")}` + ); + + // Pour chaque séquence terminée + for (const seq of sequencesTerminees) { + // Vérifier si le questionnaire est lié à une formation spécifique + if (questionnaire.formationId && questionnaire.formationId !== seq.formationId) { + continue; + } + + // Récupérer les apprenants inscrits et validés + const apprenantsInscrits = await db + .select({ + apprenantId: apprenants.id, + apprenantEmail: apprenants.email, + apprenantNom: apprenants.nom, + apprenantPrenom: apprenants.prenom, + }) + .from(inscriptions) + .innerJoin(apprenants, eq(apprenants.id, inscriptions.apprenantId)) + .where( + and( + eq(inscriptions.sequenceId, seq.sequenceId), + eq(inscriptions.statut, "confirmee") + ) + ); + + console.log( + `[Questionnaires] ${apprenantsInscrits.length} apprenant(s) inscrit(s) à la séquence ${seq.sequenceId}` + ); + + // Envoyer le questionnaire à chaque apprenant + for (const apprenant of apprenantsInscrits) { + if (!apprenant.apprenantEmail) { + console.log( + `[Questionnaires] Apprenant ${apprenant.apprenantId} sans email, envoi ignoré` + ); + continue; + } + + const envoye = await envoyerQuestionnaire( + questionnaire.id, + apprenant.apprenantId, + seq.sequenceId, + apprenant.apprenantEmail, + apprenant.apprenantNom, + apprenant.apprenantPrenom, + questionnaire.titre, + seq.sequenceNom + ); + + if (envoye) { + totalEnvoyes++; + } + } + } + } + + console.log(`[Questionnaires] Traitement terminé - ${totalEnvoyes} questionnaire(s) envoyé(s)`); + return { + success: true, + message: `${totalEnvoyes} questionnaire(s) envoyé(s)`, + count: totalEnvoyes, + }; + } catch (error: any) { + console.error("[Questionnaires] Erreur lors du traitement :", error); + return { success: false, message: error.message, count: 0 }; + } +} + +/** + * Initialise le scheduler pour les envois automatiques de questionnaires + * Exécute le traitement tous les jours à 9h00 + */ +export function initQuestionnaireScheduler() { + console.log("[Questionnaires] Initialisation du scheduler d'envoi automatique"); + + // Exécuter immédiatement au démarrage + processEnvoisAutomatiques(); + + // Puis exécuter tous les jours à 9h00 + const interval = setInterval( + () => { + const now = new Date(); + if (now.getHours() === 9 && now.getMinutes() === 0) { + processEnvoisAutomatiques(); + } + }, + 60 * 1000 // Vérifier toutes les minutes + ); + + console.log("[Questionnaires] Scheduler initialisé - vérification quotidienne à 9h00"); + + return interval; +} diff --git a/deployment-package/source_server/questionnaireSuiviDb.ts b/deployment-package/source_server/questionnaireSuiviDb.ts new file mode 100644 index 0000000..8dcd1ba --- /dev/null +++ b/deployment-package/source_server/questionnaireSuiviDb.ts @@ -0,0 +1,164 @@ +import { eq, sql, and, gte, lte } from "drizzle-orm"; +import { getDb } from "./db"; +import { + questionnaires, + envoisQuestionnaires, + reponsesQuestionnaires, + reponsesQuestions, + questions, + sequences, + formations, + formateurs +} from "../drizzle/schema"; + +/** + * Statistiques de taux de réponse par formation + */ +export async function getStatsByFormation() { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + const results = await db + .select({ + formationId: formations.id, + formationNom: formations.nom, + totalEnvois: sql`COUNT(DISTINCT ${envoisQuestionnaires.id})`, + totalReponses: sql`SUM(CASE WHEN ${envoisQuestionnaires.dateReponse} IS NOT NULL THEN 1 ELSE 0 END)`, + }) + .from(envoisQuestionnaires) + .innerJoin(sequences, eq(envoisQuestionnaires.sequenceId, sequences.id)) + .innerJoin(formations, eq(sequences.formationId, formations.id)) + .groupBy(formations.id, formations.nom); + + return results.map(r => ({ + formationId: r.formationId, + formationNom: r.formationNom, + totalEnvois: Number(r.totalEnvois), + totalReponses: Number(r.totalReponses), + tauxReponse: Number(r.totalEnvois) > 0 + ? Math.round((Number(r.totalReponses) / Number(r.totalEnvois)) * 100) + : 0 + })); +} + +/** + * Évolution temporelle des réponses (par mois) + */ +export async function getEvolutionTemporelle(startDate?: Date, endDate?: Date) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + const conditions = []; + if (startDate) { + conditions.push(gte(envoisQuestionnaires.dateEnvoi, startDate)); + } + if (endDate) { + conditions.push(lte(envoisQuestionnaires.dateEnvoi, endDate)); + } + + const results = await db + .select({ + mois: sql`DATE_FORMAT(${envoisQuestionnaires.dateEnvoi}, '%Y-%m')`, + totalEnvois: sql`COUNT(DISTINCT ${envoisQuestionnaires.id})`, + totalReponses: sql`SUM(CASE WHEN ${envoisQuestionnaires.dateReponse} IS NOT NULL THEN 1 ELSE 0 END)`, + }) + .from(envoisQuestionnaires) + .where(conditions.length > 0 ? and(...conditions) : undefined) + .groupBy(sql`DATE_FORMAT(${envoisQuestionnaires.dateEnvoi}, '%Y-%m')`) + .orderBy(sql`DATE_FORMAT(${envoisQuestionnaires.dateEnvoi}, '%Y-%m')`); + + return results.map(r => ({ + mois: r.mois, + totalEnvois: Number(r.totalEnvois), + totalReponses: Number(r.totalReponses), + tauxReponse: Number(r.totalEnvois) > 0 + ? Math.round((Number(r.totalReponses) / Number(r.totalEnvois)) * 100) + : 0 + })); +} + +/** + * Comparaison par formateur + */ +export async function getStatsByFormateur() { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + // Première requête : statistiques d'envois et réponses par formateur + const statsEnvois = await db + .select({ + formateurId: formateurs.id, + formateurNom: formateurs.nom, + totalEnvois: sql`COUNT(DISTINCT ${envoisQuestionnaires.id})`, + totalReponses: sql`SUM(CASE WHEN ${envoisQuestionnaires.dateReponse} IS NOT NULL THEN 1 ELSE 0 END)`, + }) + .from(envoisQuestionnaires) + .innerJoin(sequences, eq(envoisQuestionnaires.sequenceId, sequences.id)) + .innerJoin(formateurs, eq(sequences.formateurId, formateurs.id)) + .groupBy(formateurs.id, formateurs.nom); + + // Pour chaque formateur, calculer la moyenne de satisfaction + const results = await Promise.all(statsEnvois.map(async (stat) => { + // Calculer la moyenne des réponses de type échelle pour ce formateur + const satisfactionResult = await db + .select({ + moyenne: sql`AVG(CAST(${reponsesQuestions.reponseNumerique} AS DECIMAL(10,2)))`, + }) + .from(reponsesQuestionnaires) + .innerJoin(sequences, eq(reponsesQuestionnaires.sequenceId, sequences.id)) + .innerJoin(reponsesQuestions, eq(reponsesQuestionnaires.id, reponsesQuestions.reponseQuestionnaireId)) + .innerJoin(questions, eq(reponsesQuestions.questionId, questions.id)) + .where( + and( + eq(sequences.formateurId, stat.formateurId), + eq(reponsesQuestionnaires.complete, true), + eq(questions.typeQuestion, 'echelle') + ) + ); + + const moyenneSatisfaction = satisfactionResult[0]?.moyenne + ? Number(satisfactionResult[0].moyenne).toFixed(1) + : null; + + return { + formateurId: stat.formateurId, + formateurNom: stat.formateurNom || "Non spécifié", + totalEnvois: Number(stat.totalEnvois), + totalReponses: Number(stat.totalReponses), + tauxReponse: Number(stat.totalEnvois) > 0 + ? Math.round((Number(stat.totalReponses) / Number(stat.totalEnvois)) * 100) + : 0, + moyenneSatisfaction + }; + })); + + return results; +} + +/** + * Statistiques globales pour le tableau de bord + */ +export async function getStatsGlobales() { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + const results = await db + .select({ + totalQuestionnaires: sql`COUNT(DISTINCT ${questionnaires.id})`, + totalEnvois: sql`COUNT(DISTINCT ${envoisQuestionnaires.id})`, + totalReponses: sql`SUM(CASE WHEN ${envoisQuestionnaires.dateReponse} IS NOT NULL THEN 1 ELSE 0 END)`, + }) + .from(questionnaires) + .leftJoin(envoisQuestionnaires, eq(questionnaires.id, envoisQuestionnaires.questionnaireId)); + + const stats = results[0]; + const totalEnvois = Number(stats.totalEnvois) || 0; + const totalReponses = Number(stats.totalReponses) || 0; + + return { + totalQuestionnaires: Number(stats.totalQuestionnaires) || 0, + totalEnvois, + totalReponses, + tauxReponseGlobal: totalEnvois > 0 ? Number(((totalReponses / totalEnvois) * 100).toFixed(1)) : 0 + }; +} diff --git a/deployment-package/source_server/rappelDb.ts b/deployment-package/source_server/rappelDb.ts new file mode 100644 index 0000000..1f7da15 --- /dev/null +++ b/deployment-package/source_server/rappelDb.ts @@ -0,0 +1,328 @@ +import { getDb } from "./db"; +import { logsRappels, InsertLogRappel, LogRappel } from "../drizzle/schema"; +import { eq, and } from "drizzle-orm"; + +/** + * Enregistre l'envoi d'un rappel dans les logs + */ +export async function logRappelEnvoye(data: { + rappelId: number; + sequenceId: number; + apprenantId: number; + emailDestinataire: string; + typeRappel: string; + statut: "success" | "failed"; + messageErreur?: string; + dateSequence: Date; +}): Promise { + const db = await getDb(); + if (!db) { + console.warn("[LogsRappels] Base de données non disponible"); + return; + } + + try { + await db.insert(logsRappels).values({ + rappelId: data.rappelId, + sequenceId: data.sequenceId, + apprenantId: data.apprenantId, + emailDestinataire: data.emailDestinataire, + typeRappel: data.typeRappel, + dateEnvoi: new Date(), + statut: data.statut, + messageErreur: data.messageErreur || null, + dateSequence: data.dateSequence, + } as InsertLogRappel); + } catch (error) { + console.error("[LogsRappels] Erreur lors de l'enregistrement du log:", error); + } +} + +/** + * Vérifie si un rappel a déjà été envoyé à un apprenant pour une séquence donnée + */ +export async function rappelDejaEnvoye( + rappelId: number, + sequenceId: number, + apprenantId: number +): Promise { + const db = await getDb(); + if (!db) { + console.warn("[LogsRappels] Base de données non disponible"); + return false; + } + + try { + const logs = await db + .select() + .from(logsRappels) + .where( + and( + eq(logsRappels.rappelId, rappelId), + eq(logsRappels.sequenceId, sequenceId), + eq(logsRappels.apprenantId, apprenantId), + eq(logsRappels.statut, "success") + ) + ) + .limit(1); + + return logs.length > 0; + } catch (error) { + console.error("[LogsRappels] Erreur lors de la vérification des doublons:", error); + return false; + } +} + +/** + * Récupère tous les logs de rappels pour une séquence donnée + */ +export async function getLogsRappelsBySequence(sequenceId: number): Promise { + const db = await getDb(); + if (!db) return []; + + try { + return await db + .select() + .from(logsRappels) + .where(eq(logsRappels.sequenceId, sequenceId)) + .orderBy(logsRappels.dateEnvoi); + } catch (error) { + console.error("[LogsRappels] Erreur lors de la récupération des logs:", error); + return []; + } +} + +/** + * Récupère tous les logs de rappels échoués récents (dernières 24h) + */ +export async function getLogsRappelsEchoues(): Promise { + const db = await getDb(); + if (!db) return []; + + try { + const hier = new Date(); + hier.setDate(hier.getDate() - 1); + + return await db + .select() + .from(logsRappels) + .where( + and( + eq(logsRappels.statut, "failed"), + // Note: Drizzle ne supporte pas directement les comparaisons de dates + // On récupère tous les échecs et on filtre en JS + ) + ) + .orderBy(logsRappels.dateEnvoi); + } catch (error) { + console.error("[LogsRappels] Erreur lors de la récupération des échecs:", error); + return []; + } +} + +/** + * Compte le nombre de rappels envoyés avec succès pour une séquence + */ +export async function countRappelsEnvoyesSequence(sequenceId: number): Promise { + const db = await getDb(); + if (!db) return 0; + + try { + const logs = await db + .select() + .from(logsRappels) + .where( + and( + eq(logsRappels.sequenceId, sequenceId), + eq(logsRappels.statut, "success") + ) + ); + + return logs.length; + } catch (error) { + console.error("[LogsRappels] Erreur lors du comptage:", error); + return 0; + } +} + +/** + * Récupère les logs de rappels avec filtres + */ +export async function getLogsRappelsWithFilters(filters: { + dateDebut?: Date; + dateFin?: Date; + sequenceId?: number; + statut?: "success" | "failed"; + email?: string; + limit?: number; + offset?: number; +}): Promise { + const db = await getDb(); + if (!db) return []; + + try { + let query = db.select().from(logsRappels); + + const conditions = []; + if (filters.sequenceId) { + conditions.push(eq(logsRappels.sequenceId, filters.sequenceId)); + } + if (filters.statut) { + conditions.push(eq(logsRappels.statut, filters.statut)); + } + if (filters.email) { + // Note: Drizzle ne supporte pas LIKE directement, on filtre en JS + } + + if (conditions.length > 0) { + query = query.where(and(...conditions)) as any; + } + + let logs = await query.orderBy(logsRappels.dateEnvoi).limit(filters.limit || 100).offset(filters.offset || 0); + + // Filtrer par email si nécessaire + if (filters.email) { + logs = logs.filter(log => log.emailDestinataire.toLowerCase().includes(filters.email!.toLowerCase())); + } + + // Filtrer par date si nécessaire + if (filters.dateDebut) { + logs = logs.filter(log => new Date(log.dateEnvoi) >= filters.dateDebut!); + } + if (filters.dateFin) { + logs = logs.filter(log => new Date(log.dateEnvoi) <= filters.dateFin!); + } + + return logs; + } catch (error) { + console.error("[LogsRappels] Erreur lors de la récupération avec filtres:", error); + return []; + } +} + +/** + * Calcule les statistiques des rappels + */ +export async function getStatsRappels(): Promise<{ + totalEnvoyes: number; + totalSucces: number; + totalEchecs: number; + tauxSucces: number; + emailsProblematiques: Array<{ email: string; nbEchecs: number }>; +}> { + const db = await getDb(); + if (!db) { + return { + totalEnvoyes: 0, + totalSucces: 0, + totalEchecs: 0, + tauxSucces: 0, + emailsProblematiques: [], + }; + } + + try { + const logs = await db.select().from(logsRappels); + + const totalEnvoyes = logs.length; + const totalSucces = logs.filter(l => l.statut === "success").length; + const totalEchecs = logs.filter(l => l.statut === "failed").length; + const tauxSucces = totalEnvoyes > 0 ? (totalSucces / totalEnvoyes) * 100 : 0; + + // Compter les échecs par email + const echecsParEmail = new Map(); + logs.filter(l => l.statut === "failed").forEach(log => { + const count = echecsParEmail.get(log.emailDestinataire) || 0; + echecsParEmail.set(log.emailDestinataire, count + 1); + }); + + const emailsProblematiques = Array.from(echecsParEmail.entries()) + .map(([email, nbEchecs]) => ({ email, nbEchecs })) + .sort((a, b) => b.nbEchecs - a.nbEchecs) + .slice(0, 10); // Top 10 + + return { + totalEnvoyes, + totalSucces, + totalEchecs, + tauxSucces, + emailsProblematiques, + }; + } catch (error) { + console.error("[LogsRappels] Erreur lors du calcul des statistiques:", error); + return { + totalEnvoyes: 0, + totalSucces: 0, + totalEchecs: 0, + tauxSucces: 0, + emailsProblematiques: [], + }; + } +} + +/** + * Récupère l'évolution des envois par jour + */ +export async function getEvolutionEnvois(): Promise> { + const db = await getDb(); + if (!db) return []; + + try { + const logs = await db.select().from(logsRappels).orderBy(logsRappels.dateEnvoi); + + // Grouper par jour + const parJour = new Map(); + + logs.forEach(log => { + const dateStr = new Date(log.dateEnvoi).toISOString().split('T')[0]; + const stats = parJour.get(dateStr) || { nbEnvoyes: 0, nbSucces: 0, nbEchecs: 0 }; + stats.nbEnvoyes++; + if (log.statut === "success") stats.nbSucces++; + else stats.nbEchecs++; + parJour.set(dateStr, stats); + }); + + return Array.from(parJour.entries()) + .map(([date, stats]) => ({ date, ...stats })) + .sort((a, b) => a.date.localeCompare(b.date)); + } catch (error) { + console.error("[LogsRappels] Erreur lors de la récupération de l'évolution:", error); + return []; + } +} + +/** + * Récupère les logs échoués à réessayer + */ +export async function getLogsAReessayer(): Promise { + const db = await getDb(); + if (!db) return []; + + try { + const maintenant = new Date(); + const logs = await db + .select() + .from(logsRappels) + .where( + and( + eq(logsRappels.statut, "failed"), + // Limiter à 3 tentatives maximum + ) + ); + + // Filtrer en JS pour les conditions complexes + return logs.filter(log => { + if (log.nbTentatives >= 3) return false; + if (!log.prochainEssai) return true; // Premier essai + return new Date(log.prochainEssai) <= maintenant; + }); + } catch (error) { + console.error("[LogsRappels] Erreur lors de la récupération des logs à réessayer:", error); + return []; + } +} diff --git a/deployment-package/source_server/rappelRetry.ts b/deployment-package/source_server/rappelRetry.ts new file mode 100644 index 0000000..63cd7da --- /dev/null +++ b/deployment-package/source_server/rappelRetry.ts @@ -0,0 +1,226 @@ +import { getDb } from "./db"; +import { logsRappels, sequences, inscriptions, apprenants, formations, datesFormation, rappels, formateurs } from "../drizzle/schema"; +import { eq, and } from "drizzle-orm"; +import { sendRappelJ7Email, sendRappelJ1Email } from "./emailService"; +import { getLogsAReessayer } from "./rappelDb"; +import { notifyOwner } from "./_core/notification"; + +/** + * Calcule le délai avant le prochain essai selon le nombre de tentatives + * Délai exponentiel : 1h, 4h, 24h + */ +function calculerProchainEssai(nbTentatives: number): Date { + const maintenant = new Date(); + let delaiHeures = 1; // 1 heure par défaut + + if (nbTentatives === 1) { + delaiHeures = 1; // 1ère tentative échouée → réessayer dans 1h + } else if (nbTentatives === 2) { + delaiHeures = 4; // 2ème tentative échouée → réessayer dans 4h + } else { + delaiHeures = 24; // 3ème tentative échouée → réessayer dans 24h (mais on arrête à 3) + } + + maintenant.setHours(maintenant.getHours() + delaiHeures); + return maintenant; +} + +/** + * Réessaye d'envoyer les rappels échoués + */ +export async function processRappelRetry() { + console.log("[Rappels Retry] Démarrage du processus de réessai"); + + const db = await getDb(); + if (!db) { + console.error("[Rappels Retry] Base de données non disponible"); + return; + } + + try { + // Récupérer les logs à réessayer + const logsAReessayer = await getLogsAReessayer(); + + if (logsAReessayer.length === 0) { + console.log("[Rappels Retry] Aucun rappel à réessayer"); + return; + } + + console.log(`[Rappels Retry] ${logsAReessayer.length} rappel(s) à réessayer`); + + let nbSucces = 0; + let nbEchecs = 0; + + for (const log of logsAReessayer) { + try { + // Récupérer les informations de la séquence + const sequence = await db + .select() + .from(sequences) + .where(eq(sequences.id, log.sequenceId)) + .limit(1); + + if (sequence.length === 0) { + console.warn(`[Rappels Retry] Séquence ${log.sequenceId} introuvable`); + continue; + } + + const seq = sequence[0]; + + // Récupérer la formation + const formation = await db + .select() + .from(formations) + .where(eq(formations.id, seq.formationId)) + .limit(1); + + if (formation.length === 0) { + console.warn(`[Rappels Retry] Formation ${seq.formationId} introuvable`); + continue; + } + + // Récupérer l'apprenant + const apprenant = await db + .select() + .from(apprenants) + .where(eq(apprenants.id, log.apprenantId)) + .limit(1); + + if (apprenant.length === 0 || !apprenant[0].email) { + console.warn(`[Rappels Retry] Apprenant ${log.apprenantId} introuvable ou sans email`); + continue; + } + + // Récupérer les dates de la séquence + const dates = await db + .select() + .from(datesFormation) + .where(eq(datesFormation.sequenceId, seq.id)) + .orderBy(datesFormation.ordre); + + // Récupérer le formateur si disponible + let formateurNom = ""; + if (seq.formateurId) { + const formateur = await db + .select() + .from(formateurs) + .where(eq(formateurs.id, seq.formateurId)) + .limit(1); + if (formateur.length > 0) { + formateurNom = formateur[0].nom; + } + } + + // Réessayer l'envoi + try { + if (log.typeRappel === "rappel") { + await sendRappelJ7Email({ + apprenantEmail: apprenant[0].email, + apprenantPrenom: apprenant[0].prenom, + apprenantNom: apprenant[0].nom, + apprenantFonction: apprenant[0].fonction, + formationNom: formation[0].nom, + sequenceNom: seq.nom, + dates: dates.map(d => ({ + dateDebut: d.dateDebut, + dateFin: d.dateFin, + ordre: d.ordre + })), + lieu: seq.lieu || "", + }); + } else if (log.typeRappel === "rappelJ1") { + await sendRappelJ1Email({ + apprenantEmail: apprenant[0].email, + apprenantPrenom: apprenant[0].prenom, + apprenantNom: apprenant[0].nom, + apprenantFonction: apprenant[0].fonction, + formationNom: formation[0].nom, + sequenceNom: seq.nom, + dates: dates.map(d => ({ + dateDebut: d.dateDebut, + dateFin: d.dateFin, + ordre: d.ordre + })), + lieu: seq.lieu || "", + }); + } + + // Succès : mettre à jour le log + await db + .update(logsRappels) + .set({ + statut: "success", + nbTentatives: log.nbTentatives + 1, + prochainEssai: null, + }) + .where(eq(logsRappels.id, log.id)); + + console.log(`[Rappels Retry] Succès pour ${apprenant[0].email} après ${log.nbTentatives + 1} tentative(s)`); + nbSucces++; + } catch (emailError: any) { + const messageErreur = emailError?.message || String(emailError); + const nouvelleTentative = log.nbTentatives + 1; + + if (nouvelleTentative >= 3) { + // Abandon après 3 tentatives + await db + .update(logsRappels) + .set({ + statut: "failed", + nbTentatives: nouvelleTentative, + messageErreur: `Abandon après 3 tentatives: ${messageErreur}`, + prochainEssai: null, + }) + .where(eq(logsRappels.id, log.id)); + + console.error(`[Rappels Retry] Abandon pour ${apprenant[0].email} après 3 tentatives`); + + // Notifier l'admin + await notifyOwner({ + title: `❌ Abandon d'envoi de rappel`, + content: `Le rappel pour ${apprenant[0].email} (${seq.nom}) a échoué 3 fois et a été abandonné.\\n\\nDernière erreur: ${messageErreur}`, + }); + } else { + // Planifier un nouvel essai + const prochainEssai = calculerProchainEssai(nouvelleTentative); + await db + .update(logsRappels) + .set({ + nbTentatives: nouvelleTentative, + messageErreur: messageErreur, + prochainEssai: prochainEssai, + }) + .where(eq(logsRappels.id, log.id)); + + console.log(`[Rappels Retry] Échec pour ${apprenant[0].email}, tentative ${nouvelleTentative}/3. Prochain essai: ${prochainEssai.toLocaleString()}`); + } + nbEchecs++; + } + } catch (error) { + console.error(`[Rappels Retry] Erreur lors du traitement du log ${log.id}:`, error); + } + } + + console.log(`[Rappels Retry] Traitement terminé: ${nbSucces} succès, ${nbEchecs} échecs`); + } catch (error) { + console.error("[Rappels Retry] Erreur lors du processus de retry:", error); + } +} + +/** + * Initialise le scheduler de retry + * Vérifie toutes les heures s'il y a des rappels à réessayer + */ +export function initRappelRetryScheduler() { + console.log("[Rappels Retry] Initialisation du scheduler de réessai automatique"); + + // Exécuter immédiatement au démarrage + processRappelRetry(); + + // Puis exécuter toutes les heures + setInterval(() => { + processRappelRetry(); + }, 60 * 60 * 1000); // 1 heure en millisecondes + + console.log("[Rappels Retry] Scheduler de réessai initialisé - vérification toutes les heures"); +} diff --git a/deployment-package/source_server/rappelScheduler.ts b/deployment-package/source_server/rappelScheduler.ts new file mode 100644 index 0000000..e1a1869 --- /dev/null +++ b/deployment-package/source_server/rappelScheduler.ts @@ -0,0 +1,294 @@ +import { getDb } from "./db"; +import { rappels, sequences, inscriptions, apprenants, formations, datesFormation, formateurs } from "../drizzle/schema"; +import { eq, and, gte, lte, sql, inArray } from "drizzle-orm"; +import { sendRappelJ7Email, sendRappelJ1Email } from "./emailService"; +import { logRappelEnvoye, rappelDejaEnvoye } from "./rappelDb"; +import { notifyOwner } from "./_core/notification"; +import { processRemerciementsAutomatiques } from "./remerciementScheduler"; + +/** + * Job automatique qui vérifie quotidiennement les séquences à venir + * et envoie les rappels J-7 et J-1 aux apprenants inscrits + */ +export async function processRappelsAutomatiques() { + console.log("[Rappels] Démarrage du traitement des rappels automatiques..."); + + const db = await getDb(); + if (!db) { + console.error("[Rappels] Base de données non disponible"); + return; + } + + try { + // Récupérer tous les rappels actifs + const rappelsActifs = await db + .select() + .from(rappels) + .where(eq(rappels.actif, true)); + + console.log(`[Rappels] ${rappelsActifs.length} rappel(s) actif(s) trouvé(s)`); + + for (const rappel of rappelsActifs) { + await processRappel(rappel); + } + + console.log("[Rappels] Traitement terminé"); + } catch (error) { + console.error("[Rappels] Erreur lors du traitement des rappels:", error); + } +} + +async function processRappel(rappel: any) { + console.log(`[Rappels] Traitement du rappel: ${rappel.nom} (${rappel.timing === 'pre_formation' ? 'J-' : 'J+'}${rappel.joursAvant})`); + + const db = await getDb(); + if (!db) return; + + try { + // Calculer la date cible selon le timing (pré ou post-formation) + const dateCible = new Date(); + if (rappel.timing === 'pre_formation') { + dateCible.setDate(dateCible.getDate() + rappel.joursAvant); + } else { + dateCible.setDate(dateCible.getDate() - rappel.joursAvant); + } + dateCible.setHours(0, 0, 0, 0); + + const dateCibleFin = new Date(dateCible); + dateCibleFin.setHours(23, 59, 59, 999); + + console.log(`[Rappels] Recherche des dates de formation le ${dateCible.toLocaleDateString()}`); + + // Vérifier si ce rappel est associé à des dates spécifiques + const datesAssociees = rappel.dateFormationIds || []; + const filtreDates = datesAssociees.length > 0; + + console.log(`[Rappels] ${filtreDates ? `Filtré sur ${datesAssociees.length} date(s) spécifique(s)` : 'Toutes les dates'}`); + + // Récupérer les dates de formation concernées + let datesConcernees; + if (filtreDates) { + // Seulement les dates associées à ce rappel + datesConcernees = await db + .select({ + dateFormation: datesFormation, + sequence: sequences, + formation: formations, + formateur: formateurs, + }) + .from(datesFormation) + .leftJoin(sequences, eq(datesFormation.sequenceId, sequences.id)) + .leftJoin(formations, eq(sequences.formationId, formations.id)) + .leftJoin(formateurs, eq(sequences.formateurId, formateurs.id)) + .where( + and( + inArray(datesFormation.id, datesAssociees), + gte(datesFormation.dateDebut, dateCible), + lte(datesFormation.dateDebut, dateCibleFin) + ) + ); + } else { + // Toutes les dates correspondant à la date cible + datesConcernees = await db + .select({ + dateFormation: datesFormation, + sequence: sequences, + formation: formations, + formateur: formateurs, + }) + .from(datesFormation) + .leftJoin(sequences, eq(datesFormation.sequenceId, sequences.id)) + .leftJoin(formations, eq(sequences.formationId, formations.id)) + .leftJoin(formateurs, eq(sequences.formateurId, formateurs.id)) + .where( + and( + gte(datesFormation.dateDebut, dateCible), + lte(datesFormation.dateDebut, dateCibleFin) + ) + ); + } + + console.log(`[Rappels] ${datesConcernees.length} date(s) de formation trouvée(s)`); + + // Grouper les dates par séquence pour envoyer un seul email par apprenant + const sequencesMap = new Map(); + + for (const { dateFormation, sequence, formation, formateur } of datesConcernees) { + if (!dateFormation || !sequence || !formation) continue; + + if (!sequencesMap.has(sequence.id)) { + sequencesMap.set(sequence.id, { + sequence, + formation, + formateur, + dates: [], + }); + } + sequencesMap.get(sequence.id)!.dates.push(dateFormation); + } + + console.log(`[Rappels] ${sequencesMap.size} séquence(s) concernée(s)`); + + for (const { sequence, formation, formateur, dates: datesRappel } of Array.from(sequencesMap.values())) { + if (!sequence || !formation) continue; + + // Récupérer toutes les dates de cette séquence pour l'email + const toutesLesDates = await db + .select() + .from(datesFormation) + .where(eq(datesFormation.sequenceId, sequence.id)) + .orderBy(datesFormation.ordre); + + const formateurNom = formateur?.nom || ""; + + // Récupérer tous les apprenants inscrits à cette séquence + const inscrits = await db + .select({ + inscription: inscriptions, + apprenant: apprenants, + }) + .from(inscriptions) + .leftJoin(apprenants, eq(inscriptions.apprenantId, apprenants.id)) + .where( + and( + eq(inscriptions.sequenceId, sequence.id), + eq(inscriptions.statut, "confirmee") + ) + ); + + console.log(`[Rappels] ${inscrits.length} apprenant(s) inscrit(s) à la séquence ${sequence.nom}`); + + // Envoyer le rappel à chaque apprenant + let nbEnvoyes = 0; + let nbEchecs = 0; + const echecs: Array<{ email: string; erreur: string }> = []; + + for (const { apprenant } of inscrits) { + if (!apprenant || !apprenant.email) continue; + + // Vérifier si le rappel a déjà été envoyé + const dejaEnvoye = await rappelDejaEnvoye(rappel.id, sequence.id, apprenant.id); + if (dejaEnvoye) { + console.log(`[Rappels] Rappel déjà envoyé à ${apprenant.email} pour la séquence ${sequence.nom} - ignoré`); + continue; + } + + try { + // Choisir la fonction d'envoi selon le type de rappel + if (rappel.templateType === "rappel") { + // Rappel J-7 + await sendRappelJ7Email({ + apprenantEmail: apprenant.email, + apprenantPrenom: apprenant.prenom, + apprenantNom: apprenant.nom, + apprenantFonction: apprenant.fonction, + formationNom: formation.nom, + sequenceNom: sequence.nom, + dates: toutesLesDates.map(d => ({ + dateDebut: d.dateDebut, + dateFin: d.dateFin, + ordre: d.ordre + })), + lieu: sequence.lieu || "", + formateur: formateurNom, + attachmentUrl: rappel.urlFichier || undefined, + attachmentFilename: rappel.nomFichier || undefined, + attachmentMimeType: rappel.typeFichier || undefined, + }); + console.log(`[Rappels] Email J-7 envoyé à ${apprenant.email} pour la séquence ${sequence.nom}`); + } else if (rappel.templateType === "rappelJ1") { + // Rappel J-1 + await sendRappelJ1Email({ + apprenantEmail: apprenant.email, + apprenantPrenom: apprenant.prenom, + apprenantNom: apprenant.nom, + apprenantFonction: apprenant.fonction, + formationNom: formation.nom, + sequenceNom: sequence.nom, + dates: toutesLesDates.map(d => ({ + dateDebut: d.dateDebut, + dateFin: d.dateFin, + ordre: d.ordre + })), + lieu: sequence.lieu || "", + formateur: formateurNom, + attachmentUrl: rappel.urlFichier || undefined, + attachmentFilename: rappel.nomFichier || undefined, + attachmentMimeType: rappel.typeFichier || undefined, + }); + console.log(`[Rappels] Email J-1 envoyé à ${apprenant.email} pour la séquence ${sequence.nom}`); + } + + // Logger le succès + await logRappelEnvoye({ + rappelId: rappel.id, + sequenceId: sequence.id, + apprenantId: apprenant.id, + emailDestinataire: apprenant.email, + typeRappel: rappel.templateType, + statut: "success", + dateSequence: toutesLesDates[0].dateDebut, + }); + nbEnvoyes++; + } catch (emailError: any) { + const messageErreur = emailError?.message || String(emailError); + console.error(`[Rappels] Erreur lors de l'envoi à ${apprenant.email}:`, emailError); + + // Logger l'échec + await logRappelEnvoye({ + rappelId: rappel.id, + sequenceId: sequence.id, + apprenantId: apprenant.id, + emailDestinataire: apprenant.email, + typeRappel: rappel.templateType, + statut: "failed", + messageErreur: messageErreur, + dateSequence: toutesLesDates[0].dateDebut, + }); + nbEchecs++; + echecs.push({ email: apprenant.email, erreur: messageErreur }); + } + } + + // Notifier l'administrateur en cas d'échecs + if (nbEchecs > 0) { + const listeEchecs = echecs.map(e => `- ${e.email}: ${e.erreur}`).join("\n"); + await notifyOwner({ + title: `⚠️ Échecs d'envoi de rappels`, + content: `${nbEchecs} rappel(s) n'ont pas pu être envoyés pour la séquence "${sequence.nom}" (${formation.nom}):\n\n${listeEchecs}\n\nRappel: ${rappel.nom} (J-${rappel.joursAvant})\nEnvois réussis: ${nbEnvoyes}`, + }); + } + + console.log(`[Rappels] Séquence ${sequence.nom}: ${nbEnvoyes} envoi(s) réussi(s), ${nbEchecs} échec(s)`); + } + + // Mettre à jour la date de dernière exécution + await db + .update(rappels) + .set({ derniereExecution: new Date() }) + .where(eq(rappels.id, rappel.id)); + + } catch (error) { + console.error(`[Rappels] Erreur lors du traitement du rappel ${rappel.nom}:`, error); + } +} + +/** + * Initialise le scheduler pour exécuter les rappels automatiques + * Vérifie toutes les heures s'il y a des rappels à envoyer + */ +export function initRappelScheduler() { + console.log("[Rappels] Initialisation du scheduler de rappels automatiques"); + + // Exécuter immédiatement au démarrage + processRappelsAutomatiques(); + processRemerciementsAutomatiques(); + + // Puis exécuter toutes les heures + setInterval(() => { + processRappelsAutomatiques(); + processRemerciementsAutomatiques(); + }, 60 * 60 * 1000); // 1 heure en millisecondes + + console.log("[Rappels] Scheduler initialisé - vérification toutes les heures (rappels + remerciements)"); +} diff --git a/deployment-package/source_server/remerciementScheduler.ts b/deployment-package/source_server/remerciementScheduler.ts new file mode 100644 index 0000000..3c12bb3 --- /dev/null +++ b/deployment-package/source_server/remerciementScheduler.ts @@ -0,0 +1,351 @@ +import { getDb } from "./db"; +import { sequences, inscriptions, apprenants, formations, datesFormation, formateurs, questionnaires, envoisQuestionnaires, logsNotifications } from "../drizzle/schema"; +import { eq, and, lte, sql } from "drizzle-orm"; +import { sendRemerciementPostFormation } from "./emailService"; +import { logNotification } from "./notificationLogsDb"; +import crypto from "crypto"; + +/** + * Génère un token unique pour accéder au questionnaire + */ +function generateToken(): string { + return crypto.randomBytes(32).toString("hex"); +} + +/** + * Récupère ou crée un lien questionnaire pour un apprenant + */ +async function getOrCreateQuestionnaireLink( + apprenantId: number, + sequenceId: number +): Promise { + const db = await getDb(); + if (!db) return null; + + try { + // Chercher un questionnaire de satisfaction actif + const [questionnaire] = await db + .select() + .from(questionnaires) + .where( + and( + eq(questionnaires.type, "satisfaction"), + eq(questionnaires.actif, true) + ) + ) + .limit(1); + + if (!questionnaire) { + console.log("[Remerciements] Aucun questionnaire de satisfaction actif trouvé"); + return null; + } + + // Vérifier si un envoi existe déjà + const [envoiExistant] = await db + .select() + .from(envoisQuestionnaires) + .where( + and( + eq(envoisQuestionnaires.questionnaireId, questionnaire.id), + eq(envoisQuestionnaires.apprenantId, apprenantId), + eq(envoisQuestionnaires.sequenceId, sequenceId) + ) + ) + .limit(1); + + if (envoiExistant) { + // Retourner le lien existant + const baseUrl = process.env.VITE_FRONTEND_URL || "http://localhost:3000"; + return `${baseUrl}/questionnaire/${envoiExistant.token}`; + } + + // Créer un nouvel envoi + const token = generateToken(); + await db.insert(envoisQuestionnaires).values({ + questionnaireId: questionnaire.id, + apprenantId, + sequenceId, + token, + dateEnvoi: new Date(), + dateReponse: null, + }); + + const baseUrl = process.env.VITE_FRONTEND_URL || "http://localhost:3000"; + return `${baseUrl}/questionnaire/${token}`; + } catch (error) { + console.error("[Remerciements] Erreur lors de la création du lien questionnaire:", error); + return null; + } +} + +/** + * Vérifie si un remerciement a déjà été envoyé pour une inscription en vérifiant dans la base de données + */ +async function remerciementDejaEnvoye(apprenantId: number, sequenceId: number): Promise { + const db = await getDb(); + if (!db) return false; + + try { + const [existing] = await db + .select({ id: logsNotifications.id }) + .from(logsNotifications) + .where( + and( + eq(logsNotifications.type, "remerciement"), + eq(logsNotifications.apprenantId, apprenantId), + eq(logsNotifications.sequenceId, sequenceId), + eq(logsNotifications.statut, "success") + ) + ) + .limit(1); + + return !!existing; + } catch (error) { + console.error("[Remerciements] Erreur lors de la vérification du log:", error); + return false; + } +} + +/** + * Job automatique qui vérifie quotidiennement les séquences terminées + * et envoie les emails de remerciement aux apprenants + */ +export async function processRemerciementsAutomatiques() { + console.log("[Remerciements] Démarrage du traitement des remerciements post-formation..."); + + const db = await getDb(); + if (!db) { + console.error("[Remerciements] Base de données non disponible"); + return; + } + + try { + const now = new Date(); + const hier = new Date(); + hier.setDate(hier.getDate() - 1); + hier.setHours(23, 59, 59, 999); + + // Récupérer les séquences dont la dernière date est passée (terminées hier ou avant) + const sequencesTerminees = await db + .select({ + sequence: sequences, + formation: formations, + formateur: formateurs, + derniereDate: sql`MAX(${datesFormation.dateFin})`.as('derniereDate'), + }) + .from(sequences) + .innerJoin(formations, eq(sequences.formationId, formations.id)) + .leftJoin(formateurs, eq(sequences.formateurId, formateurs.id)) + .innerJoin(datesFormation, eq(sequences.id, datesFormation.sequenceId)) + .where(eq(sequences.statut, 'ouverte')) // Séquences encore ouvertes (pas encore marquées terminées) + .groupBy(sequences.id, formations.id, formateurs.id) + .having(lte(sql`MAX(${datesFormation.dateFin})`, hier)); + + console.log(`[Remerciements] ${sequencesTerminees.length} séquence(s) terminée(s) trouvée(s)`); + + for (const { sequence, formation, formateur, derniereDate } of sequencesTerminees) { + await processRemerciementSequence(sequence, formation, formateur, derniereDate); + } + + console.log("[Remerciements] Traitement terminé"); + } catch (error) { + console.error("[Remerciements] Erreur lors du traitement des remerciements:", error); + } +} + +async function processRemerciementSequence( + sequence: any, + formation: any, + formateur: any | null, + derniereDate: Date +) { + console.log(`[Remerciements] Traitement de la séquence: ${sequence.nom} (terminée le ${derniereDate})`); + + const db = await getDb(); + if (!db) return; + + try { + // Récupérer les inscriptions confirmées pour cette séquence + const inscriptionsConfirmees = await db + .select({ + inscription: inscriptions, + apprenant: apprenants, + }) + .from(inscriptions) + .innerJoin(apprenants, eq(inscriptions.apprenantId, apprenants.id)) + .where( + and( + eq(inscriptions.sequenceId, sequence.id), + eq(inscriptions.statut, 'confirmee') + ) + ); + + console.log(`[Remerciements] ${inscriptionsConfirmees.length} inscription(s) confirmée(s) pour ${sequence.nom}`); + + let envoyesCount = 0; + let errorsCount = 0; + + for (const { inscription, apprenant } of inscriptionsConfirmees) { + // Vérifier si le remerciement a déjà été envoyé (vérification en base de données) + const dejaEnvoye = await remerciementDejaEnvoye(apprenant.id, sequence.id); + if (dejaEnvoye) { + console.log(`[Remerciements] Remerciement déjà envoyé pour ${apprenant.email}`); + continue; + } + + try { + // Générer le lien questionnaire + const lienQuestionnaire = await getOrCreateQuestionnaireLink(apprenant.id, sequence.id); + + await sendRemerciementPostFormation({ + apprenantEmail: apprenant.email, + apprenantNom: apprenant.nom, + apprenantPrenom: apprenant.prenom, + apprenantFonction: apprenant.fonction, + formationNom: formation.nom, + sequenceNom: sequence.nom, + formateurNom: formateur?.nom, + lienQuestionnaire: lienQuestionnaire || undefined, + }); + + // Logger la notification (sert aussi de marqueur pour éviter les doublons) + await logNotification({ + type: "remerciement", + sequenceId: sequence.id, + apprenantId: apprenant.id, + emailDestinataire: apprenant.email, + sujet: `Merci pour votre participation - ${formation.nom}`, + statut: "success", + metadata: { lienQuestionnaire }, + }); + + envoyesCount++; + console.log(`[Remerciements] Email envoyé à ${apprenant.email}`); + } catch (error: any) { + // Logger l'échec + await logNotification({ + type: "remerciement", + sequenceId: sequence.id, + apprenantId: apprenant.id, + emailDestinataire: apprenant.email, + sujet: `Merci pour votre participation - ${formation.nom}`, + statut: "failed", + messageErreur: error.message, + }); + + errorsCount++; + console.error(`[Remerciements] Erreur envoi à ${apprenant.email}:`, error); + } + } + + console.log(`[Remerciements] Séquence ${sequence.nom}: ${envoyesCount} envoyé(s), ${errorsCount} erreur(s)`); + + // Optionnel: Marquer la séquence comme terminée + // await db.update(sequences).set({ statut: 'terminee' }).where(eq(sequences.id, sequence.id)); + + } catch (error) { + console.error(`[Remerciements] Erreur pour la séquence ${sequence.nom}:`, error); + } +} + +/** + * Envoie manuellement un email de remerciement pour une séquence spécifique + * Utilisé par l'interface admin pour envoyer les remerciements à la demande + */ +export async function envoyerRemerciementsSequence(sequenceId: number): Promise<{ sent: number; failed: number }> { + const db = await getDb(); + if (!db) { + throw new Error("Base de données non disponible"); + } + + // Récupérer la séquence avec formation et formateur + const sequenceData = await db + .select({ + sequence: sequences, + formation: formations, + formateur: formateurs, + }) + .from(sequences) + .innerJoin(formations, eq(sequences.formationId, formations.id)) + .leftJoin(formateurs, eq(sequences.formateurId, formateurs.id)) + .where(eq(sequences.id, sequenceId)) + .limit(1); + + if (sequenceData.length === 0) { + throw new Error("Séquence introuvable"); + } + + const { sequence, formation, formateur } = sequenceData[0]; + + // Récupérer les inscriptions confirmées + const inscriptionsConfirmees = await db + .select({ + inscription: inscriptions, + apprenant: apprenants, + }) + .from(inscriptions) + .innerJoin(apprenants, eq(inscriptions.apprenantId, apprenants.id)) + .where( + and( + eq(inscriptions.sequenceId, sequenceId), + eq(inscriptions.statut, 'confirmee') + ) + ); + + let sent = 0; + let failed = 0; + + for (const { inscription, apprenant } of inscriptionsConfirmees) { + // Vérifier si le remerciement a déjà été envoyé + const dejaEnvoye = await remerciementDejaEnvoye(apprenant.id, sequenceId); + if (dejaEnvoye) { + console.log(`[Remerciements] Remerciement déjà envoyé pour ${apprenant.email}, ignoré`); + continue; + } + + try { + // Générer le lien questionnaire + const lienQuestionnaire = await getOrCreateQuestionnaireLink(apprenant.id, sequenceId); + + await sendRemerciementPostFormation({ + apprenantEmail: apprenant.email, + apprenantNom: apprenant.nom, + apprenantPrenom: apprenant.prenom, + apprenantFonction: apprenant.fonction, + formationNom: formation.nom, + sequenceNom: sequence.nom, + formateurNom: formateur?.nom, + lienQuestionnaire: lienQuestionnaire || undefined, + }); + + // Logger la notification + await logNotification({ + type: "remerciement", + sequenceId, + apprenantId: apprenant.id, + emailDestinataire: apprenant.email, + sujet: `Merci pour votre participation - ${formation.nom}`, + statut: "success", + metadata: { lienQuestionnaire }, + }); + + sent++; + } catch (error: any) { + // Logger l'échec + await logNotification({ + type: "remerciement", + sequenceId, + apprenantId: apprenant.id, + emailDestinataire: apprenant.email, + sujet: `Merci pour votre participation - ${formation.nom}`, + statut: "failed", + messageErreur: error.message, + }); + + console.error(`[Remerciements] Erreur envoi à ${apprenant.email}:`, error); + failed++; + } + } + + return { sent, failed }; +} diff --git a/deployment-package/source_server/routers.ts b/deployment-package/source_server/routers.ts new file mode 100644 index 0000000..5ee1383 --- /dev/null +++ b/deployment-package/source_server/routers.ts @@ -0,0 +1,2380 @@ +import { COOKIE_NAME } from "@shared/const"; +import { getSessionCookieOptions } from "./_core/cookies"; +import { systemRouter } from "./_core/systemRouter"; +import { publicProcedure, protectedProcedure, router } from "./_core/trpc"; +import { parseLocalDateTime } from "./dateUtils"; +import { z } from "zod"; +import * as db from "./db"; +import * as analyticsDb from "./analyticsDb"; +import { generateAnalyticsExcel, generateAnalyticsPDF } from "./analyticsExportService"; +import { TRPCError } from "@trpc/server"; +import { sendInscriptionConfirmation, sendGroupEmail, sendNotificationFormateurNouvelleInscription, sendNotificationFormateurAnnulation, sendAlerteCapaciteAtteinte, sendNotificationPlaceDisponible, sendRemerciementPostFormation } from "./emailService"; +import { logNotification } from "./notificationLogsDb"; +import { generateExcelExport, generatePDFExport, generateFeuillePresence } from "./exportService"; +import { parseExcelFile, validateImportData, importToDatabase } from "./importExcel"; + +// Procédure admin uniquement +const adminProcedure = protectedProcedure.use(({ ctx, next }) => { + if (ctx.user.role !== 'admin') { + throw new TRPCError({ code: 'FORBIDDEN', message: 'Accès réservé aux administrateurs' }); + } + return next({ ctx }); +}); + +export const appRouter = router({ + system: systemRouter, + auth: router({ + me: publicProcedure.query(opts => opts.ctx.user), + logout: publicProcedure.mutation(({ ctx }) => { + const cookieOptions = getSessionCookieOptions(ctx.req); + ctx.res.clearCookie(COOKIE_NAME, { ...cookieOptions, maxAge: -1 }); + return { + success: true, + } as const; + }), + }), + + // ===== FORMATIONS ===== + formations: router({ + list: protectedProcedure.query(async ({ ctx }) => { + // Si l'utilisateur est formateur, ne montrer que les formations pour lesquelles il a des séquences + if (ctx.user.role === 'formateur' && ctx.user.formateurId) { + return db.getFormationsByFormateur(ctx.user.formateurId); + } else if (ctx.user.role === 'admin') { + return db.getFormations(); + } else { + throw new TRPCError({ code: 'FORBIDDEN', message: 'Accès non autorisé' }); + } + }), + + getById: adminProcedure.input(z.object({ id: z.number() })).query(async ({ input }) => { + return db.getFormationById(input.id); + }), + + getByLien: publicProcedure.input(z.object({ lien: z.string() })).query(async ({ input }) => { + return db.getFormationByLien(input.lien); + }), + + create: adminProcedure.input(z.object({ + nom: z.string().min(1), + description: z.string().optional(), + lienUnique: z.string().min(1), + actif: z.boolean().optional(), + })).mutation(async ({ input }) => { + await db.createFormation(input); + return { success: true }; + }), + + update: adminProcedure.input(z.object({ + id: z.number(), + nom: z.string().min(1).optional(), + description: z.string().optional(), + lienUnique: z.string().min(1).optional(), + actif: z.boolean().optional(), + })).mutation(async ({ input }) => { + const { id, ...data } = input; + await db.updateFormation(id, data); + return { success: true }; + }), + + delete: adminProcedure.input(z.object({ id: z.number() })).mutation(async ({ input }) => { + await db.deleteFormation(input.id); + return { success: true }; + }), + + importExcel: adminProcedure.input(z.object({ + fileBase64: z.string(), + })).mutation(async ({ input }) => { + try { + // Décoder le fichier base64 + const buffer = Buffer.from(input.fileBase64, 'base64'); + + // Parser le fichier Excel + const { formations, sequences } = parseExcelFile(buffer); + + // Valider les données + const validation = validateImportData(formations, sequences); + + if (!validation.valid) { + return { + success: false, + formationsCreated: 0, + sequencesCreated: 0, + errors: validation.errors, + warnings: validation.warnings, + }; + } + + // Importer dans la base de données + const result = await importToDatabase(formations, sequences); + + return { + ...result, + warnings: [...validation.warnings, ...result.warnings], + }; + } catch (error: any) { + return { + success: false, + formationsCreated: 0, + sequencesCreated: 0, + errors: [`Erreur lors du traitement du fichier: ${error.message}`], + warnings: [], + }; + } + }), + + previewExcel: adminProcedure.input(z.object({ + fileBase64: z.string(), + })).mutation(async ({ input }) => { + try { + const buffer = Buffer.from(input.fileBase64, 'base64'); + const { formations, sequences } = parseExcelFile(buffer); + const validation = validateImportData(formations, sequences); + + return { + formations, + sequences, + validation, + }; + } catch (error: any) { + throw new TRPCError({ + code: 'BAD_REQUEST', + message: `Erreur lors de la lecture du fichier: ${error.message}`, + }); + } + }), + }), + + // ===== APPRENANTS ===== + apprenants: router({ + list: protectedProcedure.query(async ({ ctx }) => { + // Si l'utilisateur est formateur, ne montrer que les apprenants inscrits à ses séquences + if (ctx.user.role === 'formateur' && ctx.user.formateurId) { + return db.getApprenantsByFormateur(ctx.user.formateurId); + } else if (ctx.user.role === 'admin') { + return db.getApprenants(); + } else { + throw new TRPCError({ code: 'FORBIDDEN', message: 'Accès non autorisé' }); + } + }), + + getById: adminProcedure.input(z.object({ id: z.number() })).query(async ({ input }) => { + return db.getApprenantById(input.id); + }), + + getByEmail: publicProcedure.input(z.object({ email: z.string() })).query(async ({ input }) => { + return db.getApprenantByEmail(input.email); + }), + + create: adminProcedure.input(z.object({ + nom: z.string().min(1), + prenom: z.string().min(1), + email: z.string().email(), + codeEtablissement: z.string().min(1), + fonction: z.enum(["directeur", "chef_service", "autre"]), + })).mutation(async ({ input }) => { + await db.createApprenant(input); + return { success: true }; + }), + + // Procédure publique pour créer un apprenant lors de l'inscription + createPublic: publicProcedure.input(z.object({ + nom: z.string().min(1), + prenom: z.string().min(1), + email: z.string().email(), + codeEtablissement: z.string().min(1), + fonction: z.enum(["directeur", "chef_service", "autre"]), + })).mutation(async ({ input }) => { + await db.createApprenant(input); + return { success: true }; + }), + + update: adminProcedure.input(z.object({ + id: z.number(), + nom: z.string().min(1).optional(), + prenom: z.string().min(1).optional(), + email: z.string().email().optional(), + codeEtablissement: z.string().min(1).optional(), + fonction: z.enum(["directeur", "chef_service", "autre"]).optional(), + })).mutation(async ({ input }) => { + const { id, ...data } = input; + await db.updateApprenant(id, data); + return { success: true }; + }), + + delete: adminProcedure.input(z.object({ id: z.number() })).mutation(async ({ input }) => { + await db.deleteApprenant(input.id); + return { success: true }; + }), + + getInscriptions: adminProcedure.input(z.object({ id: z.number() })).query(async ({ input }) => { + const results = await db.getInscriptionsByApprenant(input.id); + // Récupérer les informations de formation et séquence pour chaque inscription + const inscriptionsAvecDetails = await Promise.all( + results.map(async (result: any) => { + const insc = result.inscription; + if (!insc) return null; + const sequence = await db.getSequenceById(insc.sequenceId); + if (!sequence) return null; + const formation = await db.getFormationById(sequence.formationId); + const dates = await db.getDatesBySequence(insc.sequenceId); + return { + ...insc, + sequence: { ...sequence, dates }, + formation, + }; + }) + ); + return inscriptionsAvecDetails.filter(i => i !== null); + }), + }), + + // ===== FORMATEURS ===== + formateurs: router({ + list: adminProcedure.query(async () => { + return db.getFormateurs(); + }), + + // Tableau de bord formateur + dashboardStats: protectedProcedure.query(async ({ ctx }) => { + if (ctx.user.role !== 'formateur' || !ctx.user.formateurId) { + throw new TRPCError({ code: 'FORBIDDEN', message: 'Accès réservé aux formateurs' }); + } + const formateurDb = await import('./formateurDb'); + return formateurDb.getFormateurDashboardStats(ctx.user.formateurId); + }), + + prochainesSequences: protectedProcedure + .input(z.object({ limit: z.number().optional().default(10) })) + .query(async ({ ctx, input }) => { + if (ctx.user.role !== 'formateur' || !ctx.user.formateurId) { + throw new TRPCError({ code: 'FORBIDDEN', message: 'Accès réservé aux formateurs' }); + } + const formateurDb = await import('./formateurDb'); + return formateurDb.getFormateurProchainesSequences(ctx.user.formateurId, input.limit); + }), + + getById: adminProcedure.input(z.object({ id: z.number() })).query(async ({ input }) => { + return db.getFormateurById(input.id); + }), + + create: adminProcedure.input(z.object({ + nom: z.string().min(1), + email: z.string().email().optional(), + })).mutation(async ({ input }) => { + await db.createFormateur(input); + return { success: true }; + }), + + update: adminProcedure.input(z.object({ + id: z.number(), + nom: z.string().min(1).optional(), + email: z.string().email().nullable().optional(), + })).mutation(async ({ input }) => { + const { id, ...data } = input; + await db.updateFormateur(id, data); + return { success: true }; + }), + + delete: adminProcedure.input(z.object({ id: z.number() })).mutation(async ({ input }) => { + await db.deleteFormateur(input.id); + return { success: true }; + }), + }), + + // ===== SÉQUENCES ===== + sequences: router({ + list: protectedProcedure.query(async ({ ctx }) => { + let seqs; + + // Si l'utilisateur est formateur, ne montrer que ses séquences + if (ctx.user.role === 'formateur' && ctx.user.formateurId) { + seqs = await db.getSequencesByFormateur(ctx.user.formateurId); + } else if (ctx.user.role === 'admin') { + seqs = await db.getSequencesWithFormation(); + } else { + throw new TRPCError({ code: 'FORBIDDEN', message: 'Accès non autorisé' }); + } + // Récupérer les dates et le nombre d'inscrits pour chaque séquence + const sequencesAvecDates = await Promise.all( + seqs.map(async (seq) => { + const dates = await db.getDatesBySequence(seq.id); + const nbInscrits = await db.countInscriptionsBySequence(seq.id, 'confirmee'); + + // Récupérer les rappels associés à chaque date + const datesAvecRappels = await Promise.all( + dates.map(async (date) => { + const rappels = await db.getRappelsByDateFormation(date.id); + return { ...date, rappels }; + }) + ); + + return { ...seq, dates: datesAvecRappels, nbInscrits }; + }) + ); + return sequencesAvecDates; + }), + + listByFormation: publicProcedure.input(z.object({ formationId: z.number() })).query(async ({ input }) => { + const seqs = await db.getSequencesByFormation(input.formationId); + // Récupérer les dates et le nombre d'inscrits pour chaque séquence + const sequencesAvecDates = await Promise.all( + seqs.map(async (seq) => { + const dates = await db.getDatesBySequence(seq.id); + const nbInscrits = await db.countInscriptionsBySequence(seq.id, 'confirmee'); + return { ...seq, dates, nbInscrits }; + }) + ); + return sequencesAvecDates; + }), + + getById: publicProcedure.input(z.object({ id: z.number() })).query(async ({ input }) => { + const seq = await db.getSequenceById(input.id); + if (!seq) return null; + const dates = await db.getDatesBySequence(input.id); + const nbInscrits = await db.countInscriptionsBySequence(input.id, 'confirmee'); + return { ...seq, dates, nbInscrits }; + }), + + create: adminProcedure.input(z.object({ + formationId: z.number(), + nom: z.string().min(1), + lieu: z.string().min(1), + publicCible: z.enum(["directeur", "chef_service", "tous", "autre"]), + formateurId: z.number().nullable().optional(), + capaciteMax: z.number().default(12), + dateBlocage: z.string(), + statut: z.enum(["ouverte", "bloquee", "terminee"]).optional(), + dates: z.array(z.object({ + dateDebut: z.string(), + dateFin: z.string(), + ordre: z.number(), + })).min(1).max(4), + })).mutation(async ({ input }) => { + const { dates, ...sequenceData } = input; + + // Créer la séquence + const result = await db.createSequence({ + ...sequenceData, + dateBlocage: parseLocalDateTime(sequenceData.dateBlocage), + }); + + // Récupérer l'ID de la séquence créée + const sequenceId = Number(result[0].insertId); + + // Créer les dates de formation + for (const date of dates) { + await db.createDateFormation({ + sequenceId, + dateDebut: parseLocalDateTime(date.dateDebut), + dateFin: parseLocalDateTime(date.dateFin), + ordre: date.ordre, + }); + } + + return { success: true, sequenceId }; + }), + + update: adminProcedure.input(z.object({ + id: z.number(), + formationId: z.number(), + nom: z.string().min(1), + lieu: z.string().min(1), + publicCible: z.enum(["directeur", "chef_service", "tous", "autre"]), + formateurId: z.number().nullable().optional(), + capaciteMax: z.number(), + dateBlocage: z.string(), + statut: z.enum(["ouverte", "bloquee", "terminee"]), + dates: z.array(z.object({ + dateDebut: z.string(), + dateFin: z.string(), + ordre: z.number(), + })).min(1).max(4), + })).mutation(async ({ input }) => { + const { id, dates, ...sequenceData } = input; + + console.log('[UPDATE SEQUENCE] Input reçu:', JSON.stringify(input, null, 2)); + + // Mettre à jour la séquence + const updateData: any = { + ...sequenceData, + dateBlocage: parseLocalDateTime(sequenceData.dateBlocage), + }; + + console.log('[UPDATE SEQUENCE] UpdateData:', JSON.stringify(updateData, null, 2)); + await db.updateSequence(id, updateData); + console.log('[UPDATE SEQUENCE] Séquence mise à jour avec succès'); + + // Supprimer les anciennes dates + await db.deleteDatesBySequence(id); + console.log('[UPDATE SEQUENCE] Anciennes dates supprimées'); + + // Créer les nouvelles dates + for (const date of dates) { + console.log('[UPDATE SEQUENCE] Création date:', date); + await db.createDateFormation({ + sequenceId: id, + dateDebut: parseLocalDateTime(date.dateDebut), + dateFin: parseLocalDateTime(date.dateFin), + ordre: date.ordre, + }); + } + console.log('[UPDATE SEQUENCE] Toutes les dates ont été créées'); + + return { success: true }; + }), + + delete: adminProcedure.input(z.object({ id: z.number() })).mutation(async ({ input }) => { + // Supprimer d'abord les dates associées + await db.deleteDatesBySequence(input.id); + // Puis supprimer la séquence + await db.deleteSequence(input.id); + return { success: true }; + }), + }), + + // ===== INSCRIPTIONS ===== + inscriptions: router({ + // Liste des inscriptions avec dates de formation (pour formateurs) + listWithDates: protectedProcedure + .input(z.object({ sequenceId: z.number() })) + .query(async ({ input }) => { + const { getInscriptionsWithDates } = await import("./inscriptionWithDates"); + return getInscriptionsWithDates(input.sequenceId); + }), + + listAll: adminProcedure.query(async () => { + return db.getAllInscriptions(); + }), + + listBySequence: adminProcedure.input(z.object({ sequenceId: z.number() })).query(async ({ input }) => { + return db.getInscriptionsBySequence(input.sequenceId); + }), + + listByApprenant: publicProcedure.input(z.object({ apprenantId: z.number() })).query(async ({ input }) => { + return db.getInscriptionsByApprenant(input.apprenantId); + }), + + listByApprenantWithDates: publicProcedure + .input(z.object({ apprenantId: z.number() })) + .query(async ({ input }) => { + const { getInscriptionsByApprenantWithDates } = await import("./inscriptionWithDates"); + return getInscriptionsByApprenantWithDates(input.apprenantId); + }), + + checkExisting: publicProcedure.input(z.object({ + apprenantId: z.number(), + sequenceId: z.number(), + })).query(async ({ input }) => { + return db.checkExistingInscription(input.apprenantId, input.sequenceId); + }), + + inscrire: publicProcedure.input(z.object({ + apprenantId: z.number(), + sequenceId: z.number(), + })).mutation(async ({ input }) => { + // Vérifier si la séquence existe + const sequence = await db.getSequenceById(input.sequenceId); + if (!sequence) { + throw new TRPCError({ code: 'NOT_FOUND', message: 'Séquence introuvable' }); + } + + // Vérifier si la séquence est bloquée + const now = new Date(); + if (sequence.statut === 'bloquee' || now >= new Date(sequence.dateBlocage)) { + throw new TRPCError({ + code: 'FORBIDDEN', + message: 'Les inscriptions sont fermées pour cette séquence (J-15 dépassé)' + }); + } + + // Vérifier si l'apprenant a déjà une inscription + const existing = await db.checkExistingInscription(input.apprenantId, input.sequenceId); + if (existing) { + throw new TRPCError({ + code: 'CONFLICT', + message: 'Vous êtes déjà inscrit à cette séquence' + }); + } + + // Vérifier la capacité + const nbInscrits = await db.countInscriptionsBySequence(input.sequenceId, 'confirmee'); + const statut = nbInscrits >= sequence.capaciteMax ? 'liste_attente' : 'confirmee'; + + await db.createInscription({ + apprenantId: input.apprenantId, + sequenceId: input.sequenceId, + statut, + }); + + // Envoyer l'email de confirmation avec invitations Outlook pour toutes les dates + const inscriptionSequence = await db.getSequenceById(input.sequenceId); + const inscriptionApprenant = await db.getApprenantById(input.apprenantId); + const inscriptionFormation = inscriptionSequence ? await db.getFormationById(inscriptionSequence.formationId) : null; + const dates = inscriptionSequence ? await db.getDatesBySequence(inscriptionSequence.id) : []; + + if (inscriptionSequence && inscriptionApprenant && inscriptionFormation && dates.length > 0) { + // Utiliser la première date pour l'email principal + const premiereDate = dates[0]; + + await sendInscriptionConfirmation({ + apprenantEmail: inscriptionApprenant.email, + apprenantNom: inscriptionApprenant.nom, + apprenantPrenom: inscriptionApprenant.prenom, + apprenantFonction: inscriptionApprenant.fonction, + formationNom: inscriptionFormation.nom, + sequenceNom: inscriptionSequence.nom, + dates: dates.map(d => ({ + dateDebut: new Date(d.dateDebut), + dateFin: new Date(d.dateFin), + ordre: d.ordre, + })), + lieu: inscriptionSequence.lieu, + statut, + }); + + // Notification au formateur si présent + if (inscriptionSequence.formateurId) { + const formateur = await db.getFormateurById(inscriptionSequence.formateurId); + if (formateur && formateur.email) { + const nbInscritsActuel = await db.countInscriptionsBySequence(input.sequenceId, 'confirmee'); + try { + await sendNotificationFormateurNouvelleInscription({ + formateurEmail: formateur.email, + formateurNom: formateur.nom, + apprenantNom: inscriptionApprenant.nom, + apprenantPrenom: inscriptionApprenant.prenom, + apprenantFonction: inscriptionApprenant.fonction, + apprenantEtablissement: inscriptionApprenant.codeEtablissement, + formationNom: inscriptionFormation.nom, + sequenceNom: inscriptionSequence.nom, + nbInscrits: nbInscritsActuel, + capaciteMax: inscriptionSequence.capaciteMax, + dates: dates.map(d => ({ + dateDebut: new Date(d.dateDebut), + dateFin: new Date(d.dateFin), + ordre: d.ordre, + })), + }); + // Logger la notification + await logNotification({ + type: "notification_formateur_inscription", + sequenceId: input.sequenceId, + apprenantId: inscriptionApprenant.id, + formateurId: formateur.id, + emailDestinataire: formateur.email, + sujet: `Nouvelle inscription - ${inscriptionFormation.nom}`, + statut: "success", + }); + console.log(`[Notification] Email envoyé au formateur ${formateur.email} pour nouvelle inscription`); + } catch (e: any) { + // Logger l'échec + await logNotification({ + type: "notification_formateur_inscription", + sequenceId: input.sequenceId, + apprenantId: inscriptionApprenant.id, + formateurId: formateur.id, + emailDestinataire: formateur.email, + sujet: `Nouvelle inscription - ${inscriptionFormation.nom}`, + statut: "failed", + messageErreur: e.message, + }); + console.error(`[Notification] Erreur envoi email formateur:`, e); + } + } + } + + // Alerte capacité atteinte pour les admins ET le formateur + const nbInscritsApres = await db.countInscriptionsBySequence(input.sequenceId, 'confirmee'); + if (nbInscritsApres >= inscriptionSequence.capaciteMax) { + try { + const admins = await db.getAdminUsers(); + const adminEmails = admins.filter(a => a.email).map(a => a.email!); + if (adminEmails.length > 0) { + const nbListeAttente = await db.countInscriptionsBySequence(input.sequenceId, 'liste_attente'); + let formateurNom: string | undefined; + if (inscriptionSequence.formateurId) { + const formateur = await db.getFormateurById(inscriptionSequence.formateurId); + formateurNom = formateur?.nom; + } + await sendAlerteCapaciteAtteinte({ + adminEmails, + formationNom: inscriptionFormation.nom, + sequenceNom: inscriptionSequence.nom, + capaciteMax: inscriptionSequence.capaciteMax, + nbInscrits: nbInscritsApres, + nbListeAttente, + formateurNom, + dates: dates.map(d => ({ + dateDebut: new Date(d.dateDebut), + dateFin: new Date(d.dateFin), + ordre: d.ordre, + })), + }); + console.log(`[Notification] Alerte capacité atteinte envoyée à ${adminEmails.length} admin(s)`); + } + + // Notification au formateur pour capacité atteinte + if (inscriptionSequence.formateurId) { + const formateur = await db.getFormateurById(inscriptionSequence.formateurId); + if (formateur && formateur.email) { + const { sendNotificationFormateurCapaciteAtteinte } = await import('./emailService'); + await sendNotificationFormateurCapaciteAtteinte({ + formateurEmail: formateur.email, + formateurNom: formateur.nom, + formationNom: inscriptionFormation.nom, + sequenceNom: inscriptionSequence.nom, + capaciteMax: inscriptionSequence.capaciteMax, + nbInscrits: nbInscritsApres, + dates: dates.map(d => ({ + dateDebut: new Date(d.dateDebut), + dateFin: new Date(d.dateFin), + ordre: d.ordre, + })), + }); + console.log(`[Notification] Alerte capacité atteinte envoyée au formateur ${formateur.email}`); + } + } + } catch (e) { + console.error(`[Notification] Erreur envoi alerte capacité:`, e); + } + } + } + + return { success: true, statut }; + }), + + desinscrire: publicProcedure.input(z.object({ + apprenantId: z.number(), + sequenceId: z.number(), + })).mutation(async ({ input }) => { + // Vérifier si la séquence existe + const sequence = await db.getSequenceById(input.sequenceId); + if (!sequence) { + throw new TRPCError({ code: 'NOT_FOUND', message: 'Séquence introuvable' }); + } + + // Vérifier si la séquence est bloquée + const now = new Date(); + if (sequence.statut === 'bloquee' || now >= new Date(sequence.dateBlocage)) { + throw new TRPCError({ + code: 'FORBIDDEN', + message: 'Les désinscriptions sont fermées pour cette séquence (J-15 dépassé)' + }); + } + + // Trouver l'inscription + const inscription = await db.checkExistingInscription(input.apprenantId, input.sequenceId); + if (!inscription) { + throw new TRPCError({ code: 'NOT_FOUND', message: 'Inscription introuvable' }); + } + + // Récupérer les infos avant la mise à jour pour les notifications + const apprenant = await db.getApprenantById(input.apprenantId); + const formation = await db.getFormationById(sequence.formationId); + + await db.updateInscription(inscription.id, { statut: 'annulee' }); + + // Notifications après désinscription + if (apprenant && formation) { + // Notification au formateur + if (sequence.formateurId) { + const formateur = await db.getFormateurById(sequence.formateurId); + if (formateur && formateur.email) { + const nbInscritsApres = await db.countInscriptionsBySequence(input.sequenceId, 'confirmee'); + try { + await sendNotificationFormateurAnnulation({ + formateurEmail: formateur.email, + formateurNom: formateur.nom, + apprenantNom: apprenant.nom, + apprenantPrenom: apprenant.prenom, + apprenantFonction: apprenant.fonction || '', + formationNom: formation.nom, + sequenceNom: sequence.nom, + nbInscrits: nbInscritsApres, + capaciteMax: sequence.capaciteMax, + }); + // Logger la notification + await logNotification({ + type: "notification_formateur_annulation", + sequenceId: input.sequenceId, + apprenantId: apprenant.id, + formateurId: formateur.id, + emailDestinataire: formateur.email, + sujet: `Annulation d'inscription - ${formation.nom}`, + statut: "success", + }); + console.log(`[Notification] Email d'annulation envoyé au formateur ${formateur.email}`); + } catch (e: any) { + // Logger l'échec + await logNotification({ + type: "notification_formateur_annulation", + sequenceId: input.sequenceId, + apprenantId: apprenant.id, + formateurId: formateur.id, + emailDestinataire: formateur.email, + sujet: `Annulation d'inscription - ${formation.nom}`, + statut: "failed", + messageErreur: e.message, + }); + console.error(`[Notification] Erreur envoi email formateur:`, e); + } + } + } + + // Notifier le premier en liste d'attente qu'une place s'est libérée + const inscriptionsListeAttente = await db.getInscriptionsBySequence(input.sequenceId); + const premierEnAttente = inscriptionsListeAttente + .filter(i => i.inscription.statut === 'liste_attente') + .sort((a, b) => new Date(a.inscription.dateInscription).getTime() - new Date(b.inscription.dateInscription).getTime())[0]; + + if (premierEnAttente && premierEnAttente.apprenant) { + try { + await sendNotificationPlaceDisponible({ + apprenantEmail: premierEnAttente.apprenant.email, + apprenantNom: premierEnAttente.apprenant.nom, + apprenantPrenom: premierEnAttente.apprenant.prenom, + apprenantFonction: premierEnAttente.apprenant.fonction, + formationNom: formation.nom, + sequenceNom: sequence.nom, + positionListeAttente: 1, + delaiReponse: 48, + }); + // Logger la notification + await logNotification({ + type: "notification_liste_attente", + sequenceId: input.sequenceId, + apprenantId: premierEnAttente.apprenant.id, + emailDestinataire: premierEnAttente.apprenant.email, + sujet: `Place disponible - ${formation.nom}`, + statut: "success", + }); + console.log(`[Notification] Email place disponible envoyé à ${premierEnAttente.apprenant.email}`); + } catch (e: any) { + // Logger l'échec + await logNotification({ + type: "notification_liste_attente", + sequenceId: input.sequenceId, + apprenantId: premierEnAttente.apprenant.id, + emailDestinataire: premierEnAttente.apprenant.email, + sujet: `Place disponible - ${formation.nom}`, + statut: "failed", + messageErreur: e.message, + }); + console.error(`[Notification] Erreur envoi email liste d'attente:`, e); + } + } + } + + return { success: true }; + }), + + updateStatut: adminProcedure.input(z.object({ + id: z.number(), + statut: z.enum(['confirmee', 'liste_attente', 'annulee']), + })).mutation(async ({ input }) => { + // Récupérer l'inscription avant modification + const inscriptionAvant = await db.getInscriptionById(input.id); + const ancienStatut = inscriptionAvant?.statut; + + await db.updateInscription(input.id, { statut: input.statut }); + + // Si passage à annulée, notifier le formateur + if (input.statut === 'annulee' && ancienStatut !== 'annulee' && inscriptionAvant) { + const sequence = await db.getSequenceById(inscriptionAvant.sequenceId); + const apprenant = await db.getApprenantById(inscriptionAvant.apprenantId); + + if (sequence && apprenant && sequence.formateurId) { + const formateur = await db.getFormateurById(sequence.formateurId); + const formation = await db.getFormationById(sequence.formationId); + + if (formateur && formateur.email && formation) { + const nbInscritsApres = await db.countInscriptionsBySequence(sequence.id, 'confirmee'); + + try { + await sendNotificationFormateurAnnulation({ + formateurEmail: formateur.email, + formateurNom: formateur.nom, + apprenantNom: apprenant.nom, + apprenantPrenom: apprenant.prenom, + apprenantFonction: apprenant.fonction || '', + formationNom: formation.nom, + sequenceNom: sequence.nom, + nbInscrits: nbInscritsApres, + capaciteMax: sequence.capaciteMax, + }); + console.log(`[Notification] Annulation envoyée au formateur ${formateur.email}`); + + // Si une place se libère (passage de capacité max à disponible) + if (nbInscritsApres < sequence.capaciteMax && (nbInscritsApres + 1) >= sequence.capaciteMax) { + const { sendNotificationFormateurPlaceDisponible } = await import('./emailService'); + await sendNotificationFormateurPlaceDisponible({ + formateurEmail: formateur.email, + formateurNom: formateur.nom, + formationNom: formation.nom, + sequenceNom: sequence.nom, + capaciteMax: sequence.capaciteMax, + nbInscrits: nbInscritsApres, + placesDisponibles: sequence.capaciteMax - nbInscritsApres, + }); + console.log(`[Notification] Place disponible envoyée au formateur ${formateur.email}`); + } + } catch (e) { + console.error(`[Notification] Erreur envoi notification formateur:`, e); + } + } + } + } + + return { success: true }; + }), + + sendGroupEmail: adminProcedure.input(z.object({ sequenceId: z.number(), type: z.enum(['teaser', 'rappel', 'rappel_j1']) })).mutation(async ({ input }) => { + const sequence = await db.getSequenceById(input.sequenceId); + if (!sequence) { + throw new TRPCError({ code: 'NOT_FOUND', message: 'Séquence introuvable' }); + } + + const formation = await db.getFormationById(sequence.formationId); + if (!formation) { + throw new TRPCError({ code: 'NOT_FOUND', message: 'Formation introuvable' }); + } + + const dates = await db.getDatesBySequence(sequence.id); + if (dates.length === 0) { + throw new TRPCError({ code: 'NOT_FOUND', message: 'Aucune date trouvée pour cette séquence' }); + } + + const inscriptions = await db.getInscriptionsBySequence(input.sequenceId); + const recipients = inscriptions + .filter(i => i.inscription.statut === 'confirmee' && i.apprenant) + .map(i => ({ + email: i.apprenant!.email, + prenom: i.apprenant!.prenom, + nom: i.apprenant!.nom, + fonction: i.apprenant!.fonction, + })); + + console.log(`[Email Group] Envoi de ${recipients.length} emails de type ${input.type}`); + console.log(`[Email Group] Destinataires:`, recipients.map(r => r.email)); + + let formateurNom: string | undefined; + if (sequence.formateurId) { + const formateur = await db.getFormateurById(sequence.formateurId); + formateurNom = formateur?.nom; + } + + const result = await sendGroupEmail({ + recipients, + formationNom: formation.nom, + sequenceNom: sequence.nom, + type: input.type, + dates: dates.map(d => ({ + dateDebut: new Date(d.dateDebut), + dateFin: new Date(d.dateFin), + ordre: d.ordre, + })), + lieu: sequence.lieu, + formateur: formateurNom, + }); + + console.log(`[Email Group] Résultat: ${result.sent} envoyés, ${result.failed} échoués`); + + return { + ...result, + message: `${result.sent} email(s) envoyé(s) avec succès, ${result.failed} échoué(s)` + }; + }), + + emailPreview: adminProcedure + .input(z.object({ + sequenceId: z.number(), + type: z.enum(['teaser', 'rappel', 'rappel_j1']), + apprenantId: z.number().optional(), + })) + .query(async ({ input }) => { + const { generateEmailPreview } = await import('./emailPreview'); + return await generateEmailPreview(input); + }), + + exportExcel: adminProcedure.input(z.object({ sequenceId: z.number() })).mutation(async ({ input }) => { + const sequence = await db.getSequenceById(input.sequenceId); + if (!sequence) throw new TRPCError({ code: 'NOT_FOUND', message: 'Séquence introuvable' }); + + const formation = await db.getFormationById(sequence.formationId); + if (!formation) throw new TRPCError({ code: 'NOT_FOUND', message: 'Formation introuvable' }); + + const inscriptions = await db.getInscriptionsBySequence(input.sequenceId); + const dates = await db.getDatesBySequence(input.sequenceId); + + const data = inscriptions + .filter(i => i.apprenant) + .map(i => ({ + nom: i.apprenant!.nom, + prenom: i.apprenant!.prenom, + email: i.apprenant!.email, + codeEtablissement: i.apprenant!.codeEtablissement, + fonction: i.apprenant!.fonction, + statut: i.inscription.statut, + dateInscription: i.inscription.dateInscription, + })); + + const buffer = await generateExcelExport({ + formationNom: formation.nom, + sequenceNom: sequence.nom, + dates: dates.map(d => ({ + dateDebut: new Date(d.dateDebut), + dateFin: new Date(d.dateFin), + ordre: d.ordre, + })), + lieu: sequence.lieu, + publicCible: sequence.publicCible, + inscriptions: data, + }); + + return { + buffer: buffer.toString('base64'), + filename: `inscriptions_${sequence.nom.replace(/\s+/g, '_')}.xlsx`, + }; + }), + + exportPDF: adminProcedure.input(z.object({ sequenceId: z.number() })).mutation(async ({ input }) => { + const sequence = await db.getSequenceById(input.sequenceId); + if (!sequence) throw new TRPCError({ code: 'NOT_FOUND', message: 'Séquence introuvable' }); + + const formation = await db.getFormationById(sequence.formationId); + if (!formation) throw new TRPCError({ code: 'NOT_FOUND', message: 'Formation introuvable' }); + + const inscriptions = await db.getInscriptionsBySequence(input.sequenceId); + const dates = await db.getDatesBySequence(input.sequenceId); + + const data = inscriptions + .filter(i => i.apprenant) + .map(i => ({ + nom: i.apprenant!.nom, + prenom: i.apprenant!.prenom, + email: i.apprenant!.email, + codeEtablissement: i.apprenant!.codeEtablissement, + fonction: i.apprenant!.fonction, + statut: i.inscription.statut, + dateInscription: i.inscription.dateInscription, + })); + + const buffer = await generatePDFExport({ + formationNom: formation.nom, + sequenceNom: sequence.nom, + dates: dates.map(d => ({ + dateDebut: new Date(d.dateDebut), + dateFin: new Date(d.dateFin), + ordre: d.ordre, + })), + lieu: sequence.lieu, + publicCible: sequence.publicCible, + inscriptions: data, + }); + + return { + buffer: buffer.toString('base64'), + filename: `inscriptions_${sequence.nom.replace(/\s+/g, '_')}.pdf`, + }; + }), + + exportFeuillePresence: adminProcedure.input(z.object({ sequenceId: z.number() })).mutation(async ({ input }) => { + const sequence = await db.getSequenceById(input.sequenceId); + if (!sequence) throw new TRPCError({ code: 'NOT_FOUND', message: 'Séquence introuvable' }); + + const formation = await db.getFormationById(sequence.formationId); + if (!formation) throw new TRPCError({ code: 'NOT_FOUND', message: 'Formation introuvable' }); + + const inscriptions = await db.getInscriptionsBySequence(input.sequenceId); + const dates = await db.getDatesBySequence(input.sequenceId); + + // Récupérer le formateur si défini + let formateurNom: string | undefined = undefined; + if (sequence.formateurId) { + const formateur = await db.getFormateurById(sequence.formateurId); + if (formateur) { + formateurNom = formateur.nom; + } + } + + const data = inscriptions + .filter(i => i.inscription.statut === 'confirmee' && i.apprenant) + .map(i => ({ + nom: i.apprenant!.nom, + prenom: i.apprenant!.prenom, + codeEtablissement: i.apprenant!.codeEtablissement, + fonction: i.apprenant!.fonction, + })); + + const buffer = await generateFeuillePresence({ + formationNom: formation.nom, + sequenceNom: sequence.nom, + dates: dates.map(d => ({ + dateDebut: new Date(d.dateDebut), + dateFin: new Date(d.dateFin), + ordre: d.ordre, + })), + lieu: sequence.lieu, + publicCible: sequence.publicCible, + formateur: formateurNom, + apprenants: data, + }); + + return { + buffer: buffer.toString('base64'), + filename: `feuille_presence_${sequence.nom.replace(/\s+/g, '_')}.pdf`, + }; + }), + }), + + // ===== GESTION DES UTILISATEURS ===== + users: router({ + list: adminProcedure.query(async () => { + return db.getAllUsers(); + }), + + listWithFormateurs: adminProcedure.query(async () => { + const dbInstance = await import("./db").then(m => m.getDb()); + if (!dbInstance) throw new Error("Base de données non disponible"); + + const { formateurs, users } = await import("../drizzle/schema"); + const { eq } = await import("drizzle-orm"); + + // Récupérer tous les formateurs + const allFormateurs = await dbInstance.select().from(formateurs); + + // Récupérer tous les utilisateurs + const allUsers = await dbInstance.select().from(users); + + // Créer une map des formateurs liés à des comptes + const formateurIdToUser = new Map(); + allUsers.forEach(user => { + if (user.formateurId) { + formateurIdToUser.set(user.formateurId, user); + } + }); + + // Combiner les données + return { + users: allUsers, + formateurs: allFormateurs.map(formateur => ({ + ...formateur, + hasAccount: formateurIdToUser.has(formateur.id), + user: formateurIdToUser.get(formateur.id) || null, + })), + }; + }), + + getById: adminProcedure.input(z.object({ id: z.number() })).query(async ({ input }) => { + return db.getUserById(input.id); + }), + + create: adminProcedure.input(z.object({ + openId: z.string().min(1), + name: z.string().optional(), + email: z.string().email().optional(), + username: z.string().min(3).optional(), + password: z.string().min(6).optional(), + role: z.enum(["user", "admin", "formateur"]).default("user"), + isActive: z.boolean().default(true), + formateurId: z.number().optional(), + })).mutation(async ({ input }) => { + await db.createUser(input); + return { success: true }; + }), + + update: adminProcedure.input(z.object({ + id: z.number(), + name: z.string().optional(), + email: z.string().email().optional(), + username: z.string().min(3).optional(), + password: z.string().min(6).optional(), + role: z.enum(["user", "admin", "formateur"]).optional(), + isActive: z.boolean().optional(), + formateurId: z.number().optional(), + })).mutation(async ({ input }) => { + const { id, ...data } = input; + await db.updateUser(id, data); + return { success: true }; + }), + + toggleStatus: adminProcedure.input(z.object({ + id: z.number(), + isActive: z.boolean(), + })).mutation(async ({ input }) => { + await db.toggleUserStatus(input.id, input.isActive); + return { success: true }; + }), + + delete: adminProcedure.input(z.object({ id: z.number() })).mutation(async ({ input }) => { + await db.deleteUser(input.id); + return { success: true }; + }), + + requestPasswordReset: adminProcedure.input(z.object({ id: z.number() })).mutation(async ({ input }) => { + const user = await db.getUserById(input.id); + if (!user) { + throw new Error("Utilisateur introuvable"); + } + + if (!user.email) { + throw new Error("Cet utilisateur n'a pas d'adresse email"); + } + + // Générer un token unique + const crypto = await import('crypto'); + const token = crypto.randomBytes(32).toString('hex'); + + // Définir l'expiration à 24h + const expiresAt = new Date(); + expiresAt.setHours(expiresAt.getHours() + 24); + + // Sauvegarder le token en base + await db.createPasswordResetToken(user.id, token, expiresAt); + + // Générer le lien de réinitialisation + // TODO: Remplacer par l'URL réelle de votre application en production + const resetLink = `https://votre-domaine.com/reset-password?token=${token}`; + + // Envoyer l'email + const emailService = await import('./emailService'); + const emailSent = await emailService.sendPasswordResetEmail({ + apprenantEmail: user.email, + apprenantNom: user.name || 'Utilisateur', + apprenantPrenom: '', + resetLink, + }); + + if (!emailSent) { + throw new Error("Échec de l'envoi de l'email"); + } + + return { success: true, message: "Email de réinitialisation envoyé" }; + }), + }), + + // ===== GESTION DES TEMPLATES D'EMAILS ===== + emailTemplates: router({ + list: adminProcedure.query(async () => { + return db.getAllEmailTemplates(); + }), + + getByType: adminProcedure + .input(z.object({ type: z.string() })) + .query(async ({ input }) => { + return db.getEmailTemplateByType(input.type); + }), + + upsert: adminProcedure + .input(z.object({ + type: z.string(), + name: z.string(), + logoUrl: z.string().nullable(), + primaryColor: z.string(), + headerBgColor: z.string(), + headerTextColor: z.string(), + headerTitle: z.string(), + bodyContent: z.string().nullable(), + footerText: z.string().nullable(), + active: z.boolean(), + })) + .mutation(async ({ input }) => { + return db.upsertEmailTemplate(input); + }), + + delete: adminProcedure + .input(z.object({ type: z.string() })) + .mutation(async ({ input }) => { + await db.deleteEmailTemplate(input.type); + return { success: true }; + }), + + initializeDefaults: adminProcedure.mutation(async () => { + await db.initializeDefaultEmailTemplates(); + return { success: true }; + }), + }), + + // ===== GESTION DES RAPPELS ===== + rappels: router({ + list: adminProcedure.query(async () => { + return db.getRappels(); + }), + + create: adminProcedure + .input(z.object({ + nom: z.string(), + templateType: z.enum(["rappel", "rappelJ1", "rappel3", "rappel4", "rappel5", "rappel6"]), + timing: z.enum(["pre_formation", "post_formation"]).default("pre_formation"), + joursAvant: z.number(), + heureEnvoi: z.string().default("09:00"), + actif: z.boolean(), + dateFormationIds: z.array(z.number()).optional(), + fichier: z.object({ + nomFichier: z.string(), + urlFichier: z.string(), + s3Key: z.string(), + typeFichier: z.string(), + tailleFichier: z.number(), + }).nullable().optional(), + })) + .mutation(async ({ input }) => { + const { dateFormationIds, ...rappelData } = input; + const result: any = await db.createRappel(rappelData); + + // Créer les associations rappel-date si des dates sont spécifiées + if (dateFormationIds && dateFormationIds.length > 0) { + const rappelId = result.insertId || result[0]?.insertId; + if (rappelId) { + await db.createRappelDates(Number(rappelId), dateFormationIds); + } + } + + return result; + }), + + update: adminProcedure + .input(z.object({ + id: z.number(), + nom: z.string().optional(), + templateType: z.enum(["rappel", "rappelJ1", "rappel3", "rappel4", "rappel5", "rappel6"]).optional(), + timing: z.enum(["pre_formation", "post_formation"]).optional(), + joursAvant: z.number().optional(), + heureEnvoi: z.string().optional(), + actif: z.boolean().optional(), + dateFormationIds: z.array(z.number()).optional(), + fichier: z.object({ + nomFichier: z.string(), + urlFichier: z.string(), + s3Key: z.string(), + typeFichier: z.string(), + tailleFichier: z.number(), + }).nullable().optional(), + })) + .mutation(async ({ input }) => { + const { id, dateFormationIds, ...data } = input; + await db.updateRappel(id, data); + + // Mettre à jour les associations rappel-date si spécifiées + if (dateFormationIds !== undefined) { + await db.deleteRappelDates(id); + if (dateFormationIds.length > 0) { + await db.createRappelDates(id, dateFormationIds); + } + } + + return { success: true }; + }), + + delete: adminProcedure + .input(z.object({ id: z.number() })) + .mutation(async ({ input }) => { + await db.deleteRappel(input.id); + return { success: true }; + }), + + toggleActif: adminProcedure + .input(z.object({ id: z.number(), actif: z.boolean() })) + .mutation(async ({ input }) => { + await db.updateRappel(input.id, { actif: input.actif }); + return { success: true }; + }), + + envoyerAutomatiques: publicProcedure + .mutation(async () => { + const { processRappelsAutomatiques } = await import('./rappelScheduler'); + const result = await processRappelsAutomatiques(); + return result; + }), + + testerRappel: adminProcedure + .input(z.object({ + sequenceId: z.number(), + typeRappel: z.enum(['rappel', 'rappelJ1']), + })) + .mutation(async ({ input }) => { + const sequence = await db.getSequenceById(input.sequenceId); + if (!sequence) { + throw new TRPCError({ code: 'NOT_FOUND', message: 'Séquence introuvable' }); + } + + const formation = await db.getFormationById(sequence.formationId); + if (!formation) { + throw new TRPCError({ code: 'NOT_FOUND', message: 'Formation introuvable' }); + } + + // Récupérer le formateur si présent + let formateurNom: string | undefined; + if (sequence.formateurId) { + const formateur = await db.getFormateurById(sequence.formateurId); + formateurNom = formateur?.nom; + } + + // Récupérer les dates de la séquence + const dates = await db.getDatesBySequence(input.sequenceId); + + // Récupérer les inscrits + const inscrits = await db.getInscriptionsBySequence(input.sequenceId); + const inscritsConfirmes = inscrits.filter(i => i.inscription.statut === 'confirmee'); + + if (inscritsConfirmes.length === 0) { + throw new TRPCError({ code: 'BAD_REQUEST', message: 'Aucun apprenant inscrit confirmé pour cette séquence' }); + } + + // Envoyer le rappel de test au premier inscrit uniquement + const premierInscrit = inscritsConfirmes[0]; + const apprenant = premierInscrit.apprenant; + + if (!apprenant || !apprenant.email) { + throw new TRPCError({ code: 'BAD_REQUEST', message: 'Apprenant introuvable ou sans email' }); + } + + const { sendRappelJ7Email, sendRappelJ1Email } = await import('./emailService'); + + try { + if (input.typeRappel === 'rappel') { + await sendRappelJ7Email({ + apprenantEmail: apprenant.email, + apprenantPrenom: apprenant.prenom, + apprenantNom: apprenant.nom, + apprenantFonction: apprenant.fonction || '', + formationNom: formation.nom, + sequenceNom: sequence.nom, + dates: dates.map((d: any) => ({ + dateDebut: d.dateDebut, + dateFin: d.dateFin, + ordre: d.ordre + })), + lieu: sequence.lieu || '', + formateur: formateurNom, + }); + } else { + await sendRappelJ1Email({ + apprenantEmail: apprenant.email, + apprenantPrenom: apprenant.prenom, + apprenantNom: apprenant.nom, + apprenantFonction: apprenant.fonction || '', + formationNom: formation.nom, + sequenceNom: sequence.nom, + dates: dates.map((d: any) => ({ + dateDebut: d.dateDebut, + dateFin: d.dateFin, + ordre: d.ordre + })), + lieu: sequence.lieu || '', + formateur: formateurNom, + }); + } + + return { + success: true, + message: `Rappel de test envoyé à ${apprenant.email}`, + destinataire: apprenant.email, + }; + } catch (error: any) { + throw new TRPCError({ + code: 'INTERNAL_SERVER_ERROR', + message: `Erreur lors de l'envoi: ${error.message}`, + }); + } + }), + + historique: adminProcedure + .input(z.object({ + dateDebut: z.string().optional(), + dateFin: z.string().optional(), + sequenceId: z.number().optional(), + statut: z.enum(['success', 'failed']).optional(), + email: z.string().optional(), + limit: z.number().default(100), + offset: z.number().default(0), + })) + .query(async ({ input }) => { + const { getLogsRappelsWithFilters } = await import('./rappelDb'); + return getLogsRappelsWithFilters({ + dateDebut: input.dateDebut ? new Date(input.dateDebut) : undefined, + dateFin: input.dateFin ? new Date(input.dateFin) : undefined, + sequenceId: input.sequenceId, + statut: input.statut, + email: input.email, + limit: input.limit, + offset: input.offset, + }); + }), + + statistiques: adminProcedure.query(async () => { + const { getStatsRappels } = await import('./rappelDb'); + return getStatsRappels(); + }), + + evolution: adminProcedure.query(async () => { + const { getEvolutionEnvois } = await import('./rappelDb'); + return getEvolutionEnvois(); + }), + }), + + emailConfig: router({ + get: adminProcedure.query(async () => { + return db.getActiveEmailConfig(); + }), + + upsert: adminProcedure + .input(z.object({ + provider: z.enum(["resend", "smtp", "simulation"]), + apiKey: z.string().nullable(), + fromEmail: z.string().email(), + fromName: z.string(), + mode: z.enum(["simulation", "production"]), + domainVerified: z.boolean(), + // Champs SMTP + smtpHost: z.string().nullable().optional(), + smtpPort: z.number().nullable().optional(), + smtpSecure: z.enum(["none", "tls", "ssl"]).nullable().optional(), + smtpUser: z.string().nullable().optional(), + smtpPassword: z.string().nullable().optional(), + })) + .mutation(async ({ input }) => { + await db.upsertEmailConfig(input); + return { success: true }; + }), + + testEmail: adminProcedure + .input(z.object({ + toEmail: z.string().email(), + })) + .mutation(async ({ input }) => { + // Importer le service d'envoi + const { sendEmail } = await import("./_core/emailSender"); + + try { + const success = await sendEmail({ + to: input.toEmail, + subject: "Test d'envoi d'email - Formation Manager Itinova", + html: ` +

    Test réussi !

    +

    Cet email de test a été envoyé avec succès depuis votre configuration SMTP.

    +

    Votre configuration d'envoi d'emails fonctionne correctement.

    + `, + }); + + return { success, message: success ? "Email envoyé avec succès" : "Échec de l'envoi" }; + } catch (error: any) { + return { success: false, message: error.message }; + } + }), + }), + + // ===== PARAMÈTRES DE L'APPLICATION ===== + parametres: router({ + get: adminProcedure.query(async () => { + const { getParametres } = await import("./parametresDb"); + return getParametres(); + }), + + update: adminProcedure + .input(z.object({ + urlPublique: z.string().url().optional(), + delaiExpirationQR: z.number().int().positive().optional(), + dureeValiditeToken: z.number().int().positive().optional(), + notificationsActives: z.boolean().optional(), + })) + .mutation(async ({ input, ctx }) => { + const { updateParametres } = await import("./parametresDb"); + await updateParametres(input, ctx.user.id, ctx.user.name || "Administrateur"); + return { success: true }; + }), + + updateUrlPublique: adminProcedure + .input(z.object({ + urlPublique: z.string().url(), + })) + .mutation(async ({ input, ctx }) => { + const { updateUrlPublique } = await import("./parametresDb"); + await updateUrlPublique(input.urlPublique, ctx.user.id, ctx.user.name || "Administrateur"); + return { success: true }; + }), + + testerUrl: adminProcedure + .input(z.object({ + url: z.string(), + })) + .mutation(async ({ input }) => { + const { testerUrl } = await import("./parametresDb"); + return testerUrl(input.url); + }), + + getHistorique: adminProcedure + .input(z.object({ + limit: z.number().int().positive().default(50), + })) + .query(async ({ input }) => { + const { getHistoriqueParametres } = await import("./parametresDb"); + return getHistoriqueParametres(input.limit); + }), + }), + + // ===== ANALYTICS ===== + analytics: router({ + globalStats: adminProcedure.query(async () => { + return analyticsDb.getGlobalStats(); + }), + + inscriptionsByMonth: adminProcedure + .input(z.object({ + startDate: z.string().optional(), + endDate: z.string().optional(), + })) + .query(async ({ input }) => { + const startDate = input.startDate ? new Date(input.startDate) : undefined; + const endDate = input.endDate ? new Date(input.endDate) : undefined; + return analyticsDb.getInscriptionsByMonth(startDate, endDate); + }), + + tauxRemplissageByMonth: adminProcedure.query(async () => { + return analyticsDb.getTauxRemplissageByMonth(); + }), + + participationByEtablissement: adminProcedure.query(async () => { + return analyticsDb.getParticipationByEtablissement(); + }), + + participationByFonction: adminProcedure.query(async () => { + return analyticsDb.getParticipationByFonction(); + }), + + exportExcel: adminProcedure + .input(z.object({ + startDate: z.string().optional(), + endDate: z.string().optional(), + })) + .mutation(async ({ input }) => { + const startDate = input.startDate ? new Date(input.startDate) : undefined; + const endDate = input.endDate ? new Date(input.endDate) : undefined; + const buffer = await generateAnalyticsExcel(startDate, endDate); + return { + data: buffer.toString('base64'), + filename: `rapport-analytique-${new Date().toISOString().split('T')[0]}.xlsx`, + }; + }), + + exportPDF: adminProcedure + .input(z.object({ + startDate: z.string().optional(), + endDate: z.string().optional(), + })) + .mutation(async ({ input }) => { + const startDate = input.startDate ? new Date(input.startDate) : undefined; + const endDate = input.endDate ? new Date(input.endDate) : undefined; + const buffer = await generateAnalyticsPDF(startDate, endDate); + return { + data: buffer.toString('base64'), + filename: `rapport-analytique-${new Date().toISOString().split('T')[0]}.pdf`, + }; + }), + }), + + // ===== QUESTIONNAIRES ===== + questionnaires: router({ + list: adminProcedure.query(async () => { + const questionnaireDb = await import("./questionnaireDb"); + return questionnaireDb.getAllQuestionnaires(); + }), + + getById: adminProcedure + .input(z.object({ id: z.number() })) + .query(async ({ input }) => { + const questionnaireDb = await import("./questionnaireDb"); + return questionnaireDb.getQuestionnaireById(input.id); + }), + + create: adminProcedure + .input(z.object({ + titre: z.string(), + type: z.enum(["satisfaction", "evaluation_pre", "evaluation_post"]), + description: z.string().optional(), + formationId: z.number().nullable().optional(), + actif: z.boolean().default(true), + envoiAutomatique: z.boolean().default(false), + delaiEnvoiJours: z.number().default(1), + })) + .mutation(async ({ input }) => { + const questionnaireDb = await import("./questionnaireDb"); + const id = await questionnaireDb.createQuestionnaire(input); + return { id, success: true }; + }), + + update: adminProcedure + .input(z.object({ + id: z.number(), + titre: z.string().optional(), + type: z.enum(["satisfaction", "evaluation_pre", "evaluation_post"]).optional(), + description: z.string().optional(), + formationId: z.number().nullable().optional(), + actif: z.boolean().optional(), + envoiAutomatique: z.boolean().optional(), + delaiEnvoiJours: z.number().optional(), + })) + .mutation(async ({ input }) => { + const { id, ...data } = input; + const questionnaireDb = await import("./questionnaireDb"); + await questionnaireDb.updateQuestionnaire(id, data); + return { success: true }; + }), + + delete: adminProcedure + .input(z.object({ id: z.number() })) + .mutation(async ({ input }) => { + const questionnaireDb = await import("./questionnaireDb"); + await questionnaireDb.deleteQuestionnaire(input.id); + return { success: true }; + }), + + getStats: adminProcedure + .input(z.object({ id: z.number() })) + .query(async ({ input }) => { + const questionnaireDb = await import("./questionnaireDb"); + return questionnaireDb.getQuestionnaireStats(input.id); + }), + + getReponsesDetaillees: adminProcedure + .input(z.object({ id: z.number() })) + .query(async ({ input }) => { + const questionnaireDb = await import("./questionnaireDb"); + return questionnaireDb.getReponsesDetailleesQuestionnaire(input.id); + }), + + exportExcel: adminProcedure + .input(z.object({ id: z.number() })) + .mutation(async ({ input }) => { + const { exportQuestionnaireToExcel } = await import("./questionnaireExport"); + const buffer = await exportQuestionnaireToExcel(input.id); + return { + data: buffer.toString('base64'), + filename: `questionnaire-${input.id}-${new Date().toISOString().split('T')[0]}.xlsx`, + }; + }), + + exportPDF: adminProcedure + .input(z.object({ id: z.number() })) + .mutation(async ({ input }) => { + const { exportQuestionnaireToPDF } = await import("./questionnaireExport"); + const buffer = await exportQuestionnaireToPDF(input.id); + return { + data: buffer.toString('base64'), + filename: `questionnaire-${input.id}-${new Date().toISOString().split('T')[0]}.pdf`, + }; + }), + }), + + // ===== QUESTIONS ===== + questions: router({ + list: adminProcedure + .input(z.object({ questionnaireId: z.number() })) + .query(async ({ input }) => { + const questionnaireDb = await import("./questionnaireDb"); + return questionnaireDb.getQuestionsByQuestionnaireId(input.questionnaireId); + }), + + create: adminProcedure + .input(z.object({ + questionnaireId: z.number(), + ordre: z.number(), + texte: z.string(), + typeQuestion: z.enum(["choix_multiple", "echelle", "texte_libre", "oui_non"]), + options: z.string().optional(), + echelleMin: z.number().optional(), + echelleMax: z.number().optional(), + echelleLabelMin: z.string().optional(), + echelleLabelMax: z.string().optional(), + obligatoire: z.boolean().default(false), + })) + .mutation(async ({ input }) => { + const questionnaireDb = await import("./questionnaireDb"); + const id = await questionnaireDb.createQuestion(input); + return { id, success: true }; + }), + + update: adminProcedure + .input(z.object({ + id: z.number(), + ordre: z.number().optional(), + texte: z.string().optional(), + typeQuestion: z.enum(["choix_multiple", "echelle", "texte_libre", "oui_non"]).optional(), + options: z.string().optional(), + echelleMin: z.number().optional(), + echelleMax: z.number().optional(), + echelleLabelMin: z.string().optional(), + echelleLabelMax: z.string().optional(), + obligatoire: z.boolean().optional(), + })) + .mutation(async ({ input }) => { + const { id, ...data } = input; + const questionnaireDb = await import("./questionnaireDb"); + await questionnaireDb.updateQuestion(id, data); + return { success: true }; + }), + + delete: adminProcedure + .input(z.object({ id: z.number() })) + .mutation(async ({ input }) => { + const questionnaireDb = await import("./questionnaireDb"); + await questionnaireDb.deleteQuestion(input.id); + return { success: true }; + }), + }), + + // ===== RÉPONSES QUESTIONNAIRES (PUBLIC) ===== + reponses: router({ + getByToken: publicProcedure + .input(z.object({ token: z.string() })) + .query(async ({ input }) => { + const questionnaireDb = await import("./questionnaireDb"); + const envoi = await questionnaireDb.getEnvoiByToken(input.token); + if (!envoi) return null; + + const questionnaire = await questionnaireDb.getQuestionnaireById(envoi.questionnaireId); + const questions = await questionnaireDb.getQuestionsByQuestionnaireId(envoi.questionnaireId); + + return { + envoi, + questionnaire, + questions, + }; + }), + + submit: publicProcedure + .input(z.object({ + token: z.string(), + reponses: z.array(z.object({ + questionId: z.number(), + reponseNumerique: z.number().optional(), + reponseTexte: z.string().optional(), + })), + })) + .mutation(async ({ input }) => { + const questionnaireDb = await import("./questionnaireDb"); + + // Récupérer l'envoi + const envoi = await questionnaireDb.getEnvoiByToken(input.token); + if (!envoi) throw new Error("Token invalide"); + if (envoi.dateReponse) throw new Error("Questionnaire déjà répondu"); + + // Créer la réponse au questionnaire + const reponseQuestionnaireId = await questionnaireDb.createReponseQuestionnaire({ + questionnaireId: envoi.questionnaireId, + apprenantId: envoi.apprenantId, + sequenceId: envoi.sequenceId, + }); + + // Enregistrer chaque réponse + for (const reponse of input.reponses) { + await questionnaireDb.createReponseQuestion({ + reponseQuestionnaireId, + questionId: reponse.questionId, + reponseNumerique: reponse.reponseNumerique, + reponseTexte: reponse.reponseTexte, + }); + } + + // Mettre à jour l'envoi + await questionnaireDb.updateEnvoiQuestionnaire(envoi.id, { + dateReponse: new Date(), + }); + + // Envoyer une notification à l'administrateur + try { + const { notifyOwner } = await import('./_core/notification'); + const questionnaire = await questionnaireDb.getQuestionnaireById(envoi.questionnaireId); + + await notifyOwner({ + title: 'Nouvelle réponse au questionnaire', + content: `Un apprenant a répondu au questionnaire "${questionnaire?.titre || 'Sans titre'}"`, + }); + } catch (error) { + console.error('[Notification] Erreur lors de l\'envoi de la notification:', error); + // Ne pas bloquer la réponse si la notification échoue + } + + return { success: true }; + }), + + envoyerAutomatiques: adminProcedure + .mutation(async () => { + const { processEnvoisAutomatiques } = await import('./questionnaireScheduler'); + const result = await processEnvoisAutomatiques(); + return result; + }), + }), + + // ===== SUIVI QUESTIONNAIRES ===== + questionnaireSuivi: router({ + statsGlobales: adminProcedure.query(async () => { + const suiviDb = await import("./questionnaireSuiviDb"); + return suiviDb.getStatsGlobales(); + }), + + statsByFormation: adminProcedure.query(async () => { + const suiviDb = await import("./questionnaireSuiviDb"); + return suiviDb.getStatsByFormation(); + }), + + evolutionTemporelle: adminProcedure + .input(z.object({ + startDate: z.date().optional(), + endDate: z.date().optional(), + })) + .query(async ({ input }) => { + const suiviDb = await import("./questionnaireSuiviDb"); + return suiviDb.getEvolutionTemporelle(input.startDate, input.endDate); + }), + + statsByFormateur: adminProcedure.query(async () => { + const suiviDb = await import("./questionnaireSuiviDb"); + return suiviDb.getStatsByFormateur(); + }), + }), + + // ===== ESPACE FORMATEUR ===== + formateur: router({ + calendrier: protectedProcedure + .input(z.object({ + formateurId: z.number(), + dateDebut: z.date().optional(), + dateFin: z.date().optional(), + })) + .query(async ({ input }) => { + const formateurDb = await import("./formateurDb"); + return formateurDb.getCalendrierFormateur(input.formateurId, input.dateDebut, input.dateFin); + }), + + apprenants: protectedProcedure + .input(z.object({ sequenceId: z.number() })) + .query(async ({ input }) => { + const formateurDb = await import("./formateurDb"); + return formateurDb.getApprenantsSequence(input.sequenceId); + }), + + supports: protectedProcedure + .input(z.object({ sequenceId: z.number() })) + .query(async ({ input }) => { + const formateurDb = await import("./formateurDb"); + return formateurDb.getSupportsSequence(input.sequenceId); + }), + + ajouterSupport: protectedProcedure + .input(z.object({ + sequenceId: z.number(), + formateurId: z.number(), + nomFichier: z.string(), + typeFichier: z.string(), + tailleFichier: z.number(), + urlFichier: z.string(), + s3Key: z.string(), + description: z.string().optional(), + })) + .mutation(async ({ input }) => { + const formateurDb = await import("./formateurDb"); + return formateurDb.ajouterSupport(input); + }), + + supprimerSupport: protectedProcedure + .input(z.object({ + supportId: z.number(), + formateurId: z.number(), + })) + .mutation(async ({ input }) => { + const formateurDb = await import("./formateurDb"); + const support = await formateurDb.supprimerSupport(input.supportId, input.formateurId); + + // Note: La suppression du fichier S3 devrait être gérée par un processus de nettoyage séparé + // car il n'y a pas de fonction storageDelete dans l'API actuelle + + return { success: true, support }; + }), + + validerPresence: protectedProcedure + .input(z.object({ + inscriptionId: z.number(), + present: z.boolean(), + })) + .mutation(async ({ input }) => { + const formateurDb = await import("./formateurDb"); + await formateurDb.validerPresence(input.inscriptionId, input.present); + return { success: true }; + }), + + historique: protectedProcedure + .input(z.object({ + formateurId: z.number(), + limit: z.number().optional(), + })) + .query(async ({ input }) => { + const formateurDb = await import("./formateurDb"); + return formateurDb.getHistoriqueFormateur(input.formateurId, input.limit); + }), + + detailSequence: protectedProcedure + .input(z.object({ + sequenceId: z.number(), + formateurId: z.number(), + })) + .query(async ({ input }) => { + const formateurDb = await import("./formateurDb"); + return formateurDb.getDetailSequence(input.sequenceId, input.formateurId); + }), + }), + + // ===== ÉTABLISSEMENTS ===== + etablissements: router({ + list: adminProcedure.query(async () => { + const { getEtablissementsStats } = await import("./etablissementsDb"); + return getEtablissementsStats(); + }), + + getDetail: adminProcedure + .input(z.object({ codeEtablissement: z.string() })) + .query(async ({ input }) => { + const { getEtablissementDetail } = await import("./etablissementsDb"); + return getEtablissementDetail(input.codeEtablissement); + }), + }), + + // ===== NOTIFICATIONS ===== + notifications: router({ + envoyerRemerciements: adminProcedure + .input(z.object({ sequenceId: z.number() })) + .mutation(async ({ input }) => { + const { envoyerRemerciementsSequence } = await import("./remerciementScheduler"); + return envoyerRemerciementsSequence(input.sequenceId); + }), + + envoyerRemerciementsAutomatiques: adminProcedure + .mutation(async () => { + const { processRemerciementsAutomatiques } = await import("./remerciementScheduler"); + await processRemerciementsAutomatiques(); + return { success: true }; + }), + + // Historique des notifications + historique: adminProcedure + .input(z.object({ + type: z.enum(["remerciement", "notification_formateur_inscription", "notification_formateur_annulation", "alerte_capacite", "notification_liste_attente"]).optional(), + dateDebut: z.string().optional(), + dateFin: z.string().optional(), + statut: z.enum(["success", "failed"]).optional(), + email: z.string().optional(), + sequenceId: z.number().optional(), + limit: z.number().default(50), + offset: z.number().default(0), + })) + .query(async ({ input }) => { + const { getNotificationLogs } = await import("./notificationLogsDb"); + return getNotificationLogs({ + type: input.type, + dateDebut: input.dateDebut ? new Date(input.dateDebut) : undefined, + dateFin: input.dateFin ? new Date(input.dateFin) : undefined, + statut: input.statut, + email: input.email, + sequenceId: input.sequenceId, + limit: input.limit, + offset: input.offset, + }); + }), + + // Statistiques des notifications + statistiques: adminProcedure + .input(z.object({ + dateDebut: z.string().optional(), + dateFin: z.string().optional(), + })) + .query(async ({ input }) => { + const { getNotificationStats } = await import("./notificationLogsDb"); + return getNotificationStats({ + dateDebut: input.dateDebut ? new Date(input.dateDebut) : undefined, + dateFin: input.dateFin ? new Date(input.dateFin) : undefined, + }); + }), + }), + + // Attestations de formation + attestations: router({ + // Générer une attestation pour une inscription + generer: adminProcedure + .input(z.object({ + inscriptionId: z.number(), + })) + .mutation(async ({ input }) => { + const { genererAttestationPDF, enregistrerAttestation, getAttestation } = await import("./attestationService"); + const db = await import("./db").then(m => m.getDb()); + if (!db) throw new Error("Base de données non disponible"); + + // Vérifier si l'attestation existe déjà + const { inscriptions } = await import("../drizzle/schema"); + const { eq } = await import("drizzle-orm"); + const [inscription] = await db.select().from(inscriptions).where(eq(inscriptions.id, input.inscriptionId)).limit(1); + if (!inscription) { + throw new Error("Inscription introuvable"); + } + + const attestationExistante = await getAttestation(inscription.apprenantId, inscription.sequenceId); + if (attestationExistante) { + return { + success: true, + attestation: attestationExistante, + message: "Attestation déjà générée", + }; + } + + // Générer le PDF + const { s3Key, pdfUrl } = await genererAttestationPDF(input.inscriptionId); + + // Enregistrer dans la base + const attestationId = await enregistrerAttestation( + input.inscriptionId, + inscription.apprenantId, + inscription.sequenceId, + s3Key, + pdfUrl + ); + + const attestation = await getAttestation(inscription.apprenantId, inscription.sequenceId); + + return { + success: true, + attestation, + message: "Attestation générée avec succès", + }; + }), + + // Récupérer l'attestation d'un apprenant pour une séquence + get: publicProcedure + .input(z.object({ + apprenantId: z.number(), + sequenceId: z.number(), + })) + .query(async ({ input }) => { + const { getAttestation } = await import("./attestationService"); + return getAttestation(input.apprenantId, input.sequenceId); + }), + + // Récupérer toutes les attestations d'un apprenant + listApprenant: publicProcedure + .input(z.object({ + apprenantId: z.number(), + })) + .query(async ({ input }) => { + const { getAttestationsApprenant } = await import("./attestationService"); + return getAttestationsApprenant(input.apprenantId); + }), + + // Récupérer la configuration des attestations + getConfig: adminProcedure + .query(async () => { + const { getOrCreateConfigAttestation } = await import("./attestationService"); + return getOrCreateConfigAttestation(); + }), + + // Mettre à jour la configuration des attestations + updateConfig: adminProcedure + .input(z.object({ + nomSignataire: z.string().optional(), + fonctionSignataire: z.string().optional(), + texteAttestation: z.string().optional(), + logoUrl: z.string().optional(), + logoS3Key: z.string().optional(), + signatureUrl: z.string().optional(), + signatureS3Key: z.string().optional(), + })) + .mutation(async ({ input }) => { + const { updateConfigAttestation } = await import("./attestationService"); + await updateConfigAttestation(input); + return { success: true }; + }), + + // Récupérer l'historique des envois d'attestations + historique: adminProcedure + .query(async () => { + const { getHistoriqueAttestations } = await import("./attestationsDb"); + return getHistoriqueAttestations(); + }), + + // Récupérer l'historique pour une séquence spécifique + historiqueBySequence: adminProcedure + .input(z.object({ + sequenceId: z.number(), + })) + .query(async ({ input }) => { + const { getHistoriqueAttestationsBySequence } = await import("./attestationsDb"); + return getHistoriqueAttestationsBySequence(input.sequenceId); + }), + + // Générer une prévisualisation du modèle d'attestation + previsualiser: adminProcedure + .mutation(async () => { + const { genererPreviewAttestation } = await import("./attestationService"); + return genererPreviewAttestation(); + }), + }), + + // ===== PRESENCES (ÉMARGEMENT NUMÉRIQUE) ===== + presences: router({ + // Générer un QR code pour une séquence + generateQRCode: protectedProcedure + .input(z.object({ + sequenceId: z.number(), + })) + .mutation(async ({ input, ctx }) => { + const { generateQRToken, generateQRCodeDataURL } = await import("./qrCodeGenerator"); + const { getDb } = await import("./db"); + const { sequences } = await import("../drizzle/schema"); + const { eq } = await import("drizzle-orm"); + + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + // Vérifier que la séquence existe + const sequence = await db.select().from(sequences).where(eq(sequences.id, input.sequenceId)).limit(1); + if (sequence.length === 0) { + throw new Error("Séquence introuvable"); + } + + // Générer un nouveau token si nécessaire + let token = sequence[0].qrCodeToken; + if (!token) { + token = generateQRToken(); + await db.update(sequences).set({ qrCodeToken: token }).where(eq(sequences.id, input.sequenceId)); + } + + // Générer le QR code + const qrCodeDataURL = await generateQRCodeDataURL(token); + + return { + token, + qrCodeDataURL, + }; + }), + + // Valider une présence (scan QR code ou manuel) + valider: publicProcedure + .input(z.object({ + token: z.string().optional(), + inscriptionId: z.number(), + dateFormationId: z.number(), + modeValidation: z.enum(["qrcode", "manuel"]), + validateurId: z.number().optional(), + commentaire: z.string().optional(), + })) + .mutation(async ({ input }) => { + const { validerPresence } = await import("./presenceDb"); + const { getDb } = await import("./db"); + const { sequences, inscriptions } = await import("../drizzle/schema"); + const { eq } = await import("drizzle-orm"); + + // Si mode QR code, vérifier le token + if (input.modeValidation === "qrcode" && input.token) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + // Récupérer l'inscription pour vérifier la séquence + const inscription = await db.select().from(inscriptions).where(eq(inscriptions.id, input.inscriptionId)).limit(1); + if (inscription.length === 0) { + throw new Error("Inscription introuvable"); + } + + // Vérifier que le token correspond à la séquence + const sequence = await db.select().from(sequences).where(eq(sequences.id, inscription[0].sequenceId)).limit(1); + if (sequence.length === 0 || sequence[0].qrCodeToken !== input.token) { + throw new Error("QR code invalide"); + } + } + + const result = await validerPresence({ + inscriptionId: input.inscriptionId, + dateFormationId: input.dateFormationId, + modeValidation: input.modeValidation, + validateurId: input.validateurId, + commentaire: input.commentaire, + }); + + // Vérifier si toutes les présences sont validées + const { checkAllPresencesValidated } = await import("./presenceDb"); + const allValidated = await checkAllPresencesValidated(input.inscriptionId); + + // Si toutes les présences sont validées, générer l'attestation automatiquement + if (allValidated) { + try { + const { genererAttestationPDF, enregistrerAttestation } = await import("./attestationService"); + + // Générer le PDF + const { s3Key, pdfUrl } = await genererAttestationPDF(input.inscriptionId); + + // Récupérer les données de l'inscription + const db = await getDb(); + if (db) { + const inscriptionData = await db.select().from(inscriptions).where(eq(inscriptions.id, input.inscriptionId)).limit(1); + if (inscriptionData.length > 0) { + // Enregistrer l'attestation en base + await enregistrerAttestation( + input.inscriptionId, + inscriptionData[0].apprenantId, + inscriptionData[0].sequenceId, + s3Key, + pdfUrl + ); + } + } + + return { + ...result, + attestationGenerated: true, + attestationUrl: pdfUrl, + }; + } catch (error) { + console.error("Erreur lors de la génération de l'attestation:", error); + // Ne pas bloquer la validation de présence si l'attestation échoue + } + } + + return result; + }), + + // Lister les présences pour une séquence + listBySequence: protectedProcedure + .input(z.object({ + sequenceId: z.number(), + })) + .query(async ({ input }) => { + const { getPresencesBySequence } = await import("./presenceDb"); + return getPresencesBySequence(input.sequenceId); + }), + + // Lister les présences pour une inscription + listByInscription: publicProcedure + .input(z.object({ + inscriptionId: z.number(), + })) + .query(async ({ input }) => { + const { getPresencesByInscription } = await import("./presenceDb"); + return getPresencesByInscription(input.inscriptionId); + }), + + // Supprimer une présence + delete: protectedProcedure + .input(z.object({ + presenceId: z.number(), + })) + .mutation(async ({ input }) => { + const { supprimerPresence } = await import("./presenceDb"); + return supprimerPresence(input.presenceId); + }), + + // Vérifier si toutes les présences sont validées pour une inscription + checkAllValidated: publicProcedure + .input(z.object({ + inscriptionId: z.number(), + })) + .query(async ({ input }) => { + const { checkAllPresencesValidated } = await import("./presenceDb"); + return checkAllPresencesValidated(input.inscriptionId); + }), + }), + + // ===== GESTION DES ATTESTATIONS ===== + gestionAttestations: router({ + // Récupérer la configuration d'une formation + getFormationConfig: adminProcedure + .input(z.object({ formationId: z.number() })) + .query(async ({ input }) => { + const { getFormationConfig } = await import("./gestionAttestationsDb"); + return getFormationConfig(input.formationId); + }), + + // Mettre à jour la configuration d'une formation + updateFormationConfig: adminProcedure + .input(z.object({ + formationId: z.number(), + modeAttestation: z.enum(["auto", "manuel"]), + modeEnvoi: z.enum(["auto", "manuel"]), + })) + .mutation(async ({ input }) => { + const { updateFormationConfig } = await import("./gestionAttestationsDb"); + return updateFormationConfig( + input.formationId, + input.modeAttestation, + input.modeEnvoi + ); + }), + + // Récupérer les apprenants avec leur statut d'attestation + getApprenantsWithStatus: adminProcedure + .input(z.object({ formationId: z.number() })) + .query(async ({ input }) => { + try { + const { getApprenantsWithAttestationStatus } = await import("./gestionAttestationsDb"); + const results = await getApprenantsWithAttestationStatus(input.formationId); + console.log("[gestionAttestations] Found", results.length, "apprenants for formation", input.formationId); + return results; + } catch (error) { + console.error("[gestionAttestations] Error fetching apprenants:", error); + throw error; + } + }), + + // Uploader un document d'attestation + uploadDocument: adminProcedure + .input(z.object({ + inscriptionId: z.number(), + documentUrl: z.string(), + documentS3Key: z.string(), + })) + .mutation(async ({ input, ctx }) => { + const { uploadAttestationDocument } = await import("./gestionAttestationsDb"); + return uploadAttestationDocument( + input.inscriptionId, + input.documentUrl, + input.documentS3Key, + ctx.user.id + ); + }), + + // Supprimer un document d'attestation + deleteDocument: adminProcedure + .input(z.object({ attestationId: z.number() })) + .mutation(async ({ input }) => { + const { deleteAttestationDocument } = await import("./gestionAttestationsDb"); + return deleteAttestationDocument(input.attestationId); + }), + + // Envoyer une attestation par email + sendAttestation: adminProcedure + .input(z.object({ + attestationId: z.number(), + apprenantEmail: z.string(), + apprenantNom: z.string(), + apprenantPrenom: z.string(), + formationNom: z.string(), + pdfUrl: z.string(), + })) + .mutation(async ({ input }) => { + const { sendAttestationEmail } = await import("./emailService"); + const { markAttestationAsSent } = await import("./gestionAttestationsDb"); + + // Envoyer l'email + await sendAttestationEmail({ + to: input.apprenantEmail, + apprenantNom: input.apprenantNom, + apprenantPrenom: input.apprenantPrenom, + formationNom: input.formationNom, + pdfUrl: input.pdfUrl, + }); + + // Marquer comme envoyé + await markAttestationAsSent(input.attestationId); + + return { success: true }; + }), + }), +}); + +export type AppRouter = typeof appRouter; diff --git a/deployment-package/source_server/storage.ts b/deployment-package/source_server/storage.ts new file mode 100644 index 0000000..6cdf862 --- /dev/null +++ b/deployment-package/source_server/storage.ts @@ -0,0 +1,102 @@ +// Preconfigured storage helpers for Manus WebDev templates +// Uses the Biz-provided storage proxy (Authorization: Bearer ) + +import { ENV } from './_core/env'; + +type StorageConfig = { baseUrl: string; apiKey: string }; + +function getStorageConfig(): StorageConfig { + const baseUrl = ENV.forgeApiUrl; + const apiKey = ENV.forgeApiKey; + + if (!baseUrl || !apiKey) { + throw new Error( + "Storage proxy credentials missing: set BUILT_IN_FORGE_API_URL and BUILT_IN_FORGE_API_KEY" + ); + } + + return { baseUrl: baseUrl.replace(/\/+$/, ""), apiKey }; +} + +function buildUploadUrl(baseUrl: string, relKey: string): URL { + const url = new URL("v1/storage/upload", ensureTrailingSlash(baseUrl)); + url.searchParams.set("path", normalizeKey(relKey)); + return url; +} + +async function buildDownloadUrl( + baseUrl: string, + relKey: string, + apiKey: string +): Promise { + const downloadApiUrl = new URL( + "v1/storage/downloadUrl", + ensureTrailingSlash(baseUrl) + ); + downloadApiUrl.searchParams.set("path", normalizeKey(relKey)); + const response = await fetch(downloadApiUrl, { + method: "GET", + headers: buildAuthHeaders(apiKey), + }); + return (await response.json()).url; +} + +function ensureTrailingSlash(value: string): string { + return value.endsWith("/") ? value : `${value}/`; +} + +function normalizeKey(relKey: string): string { + return relKey.replace(/^\/+/, ""); +} + +function toFormData( + data: Buffer | Uint8Array | string, + contentType: string, + fileName: string +): FormData { + const blob = + typeof data === "string" + ? new Blob([data], { type: contentType }) + : new Blob([data as any], { type: contentType }); + const form = new FormData(); + form.append("file", blob, fileName || "file"); + return form; +} + +function buildAuthHeaders(apiKey: string): HeadersInit { + return { Authorization: `Bearer ${apiKey}` }; +} + +export async function storagePut( + relKey: string, + data: Buffer | Uint8Array | string, + contentType = "application/octet-stream" +): Promise<{ key: string; url: string }> { + const { baseUrl, apiKey } = getStorageConfig(); + const key = normalizeKey(relKey); + const uploadUrl = buildUploadUrl(baseUrl, key); + const formData = toFormData(data, contentType, key.split("/").pop() ?? key); + const response = await fetch(uploadUrl, { + method: "POST", + headers: buildAuthHeaders(apiKey), + body: formData, + }); + + if (!response.ok) { + const message = await response.text().catch(() => response.statusText); + throw new Error( + `Storage upload failed (${response.status} ${response.statusText}): ${message}` + ); + } + const url = (await response.json()).url; + return { key, url }; +} + +export async function storageGet(relKey: string): Promise<{ key: string; url: string; }> { + const { baseUrl, apiKey } = getStorageConfig(); + const key = normalizeKey(relKey); + return { + key, + url: await buildDownloadUrl(baseUrl, key, apiKey), + }; +} diff --git a/deployment-package/update.sh b/deployment-package/update.sh deleted file mode 100755 index cdefd10..0000000 --- a/deployment-package/update.sh +++ /dev/null @@ -1,102 +0,0 @@ -#!/bin/bash - -############################################################################### -# Script de mise à jour rapide - Formation Manager Itinova -# Version: 7a737c05 -# Auteur: Manus AI -# Description: Script simplifié pour mettre à jour l'application en production -############################################################################### - -set -e - -# Couleurs -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -BLUE='\033[0;34m' -NC='\033[0m' - -# Configuration -APP_DIR="/var/www/formation-manager-itinova" -SERVICE_NAME="formation-manager" - -print_info() { - echo -e "${BLUE}[INFO]${NC} $1" -} - -print_success() { - echo -e "${GREEN}[OK]${NC} $1" -} - -print_error() { - echo -e "${RED}[ERREUR]${NC} $1" -} - -# Vérifier les privilèges sudo -if [[ $EUID -ne 0 ]]; then - print_error "Ce script doit être exécuté avec sudo" - exit 1 -fi - -echo "========================================" -echo " Mise à jour Formation Manager Itinova" -echo " Version: 7a737c05" -echo "========================================" -echo "" - -cd "$APP_DIR" - -# 1. Arrêter le service -print_info "Arrêt du service..." -systemctl stop "$SERVICE_NAME" -print_success "Service arrêté" - -# 2. Sauvegarder .env -print_info "Sauvegarde de la configuration..." -cp .env /tmp/.env.backup -print_success "Configuration sauvegardée" - -# 3. Mettre à jour le code -print_info "Mise à jour du code..." -git pull origin main -print_success "Code mis à jour" - -# 4. Installer les dépendances -print_info "Installation des dépendances..." -pnpm install -print_success "Dépendances installées" - -# 5. Appliquer les migrations -print_info "Application des migrations..." -pnpm db:push -print_success "Migrations appliquées" - -# 6. Build -print_info "Compilation de l'application..." -pnpm run build -print_success "Application compilée" - -# 7. Restaurer .env -print_info "Restauration de la configuration..." -cp /tmp/.env.backup .env -print_success "Configuration restaurée" - -# 8. Redémarrer le service -print_info "Redémarrage du service..." -systemctl start "$SERVICE_NAME" -sleep 3 - -if systemctl is-active --quiet "$SERVICE_NAME"; then - print_success "Service redémarré" -else - print_error "Échec du redémarrage" - systemctl status "$SERVICE_NAME" - exit 1 -fi - -echo "" -echo "========================================" -print_success "Mise à jour terminée avec succès !" -echo "========================================" -echo "" -print_info "Vérifiez les logs: sudo journalctl -u $SERVICE_NAME -f" diff --git a/fix-all-database-schema-FINAL.sh b/fix-all-database-schema-FINAL.sh new file mode 100755 index 0000000..b06ba72 --- /dev/null +++ b/fix-all-database-schema-FINAL.sh @@ -0,0 +1,281 @@ +#!/bin/bash + +# Script de correction COMPLÈTE et DÉFINITIVE du schéma de base de données +# Formation Manager Itinova - Janvier 2026 +# Ce script corrige TOUTES les colonnes manquantes identifiées + +DB_USER="app_user" +DB_PASS="Itinova69!" +DB_NAME="formation_manager" + +echo "==========================================" +echo "CORRECTION DÉFINITIVE DU SCHÉMA" +echo "Formation Manager Itinova" +echo "==========================================" +echo "" +echo "⚠️ Ce script va MODIFIER la base de données" +echo "Appuyez sur Entrée pour continuer ou Ctrl+C pour annuler..." +read + +echo "" +echo "=== DÉBUT DES CORRECTIONS ===" +echo "" + +# Fonction pour exécuter une requête SQL avec gestion d'erreur +execute_sql() { + local description="$1" + local query="$2" + echo "→ $description" + result=$(mysql -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" -e "$query" 2>&1 | grep -v "Warning: Using a password") + if [ -z "$result" ]; then + echo " ✓ OK" + return 0 + else + if echo "$result" | grep -q "Duplicate column name"; then + echo " ⚠ Colonne existe déjà" + return 0 + elif echo "$result" | grep -q "Can't DROP"; then + echo " ⚠ Colonne n'existe pas" + return 0 + else + echo " ✗ Erreur: $result" + return 1 + fi + fi +} + +echo "==========================================" +echo "1. CORRECTION DE LA TABLE formateurs" +echo "==========================================" + +# CRITIQUE: La colonne email manque dans formateurs +execute_sql "Ajout de la colonne email" \ +"ALTER TABLE formateurs ADD COLUMN email VARCHAR(320) AFTER nom;" + +echo "" +echo "==========================================" +echo "2. CORRECTION DE LA TABLE rappels" +echo "==========================================" + +# CRITIQUE: La colonne timing manque dans rappels +execute_sql "Ajout de la colonne timing" \ +"ALTER TABLE rappels ADD COLUMN timing ENUM('pre_formation', 'post_formation') NOT NULL DEFAULT 'pre_formation' AFTER heureEnvoi;" + +execute_sql "Ajout de la colonne nomFichier" \ +"ALTER TABLE rappels ADD COLUMN nomFichier VARCHAR(255) AFTER timing;" + +execute_sql "Ajout de la colonne urlFichier" \ +"ALTER TABLE rappels ADD COLUMN urlFichier VARCHAR(500) AFTER nomFichier;" + +execute_sql "Ajout de la colonne s3Key" \ +"ALTER TABLE rappels ADD COLUMN s3Key VARCHAR(500) AFTER urlFichier;" + +execute_sql "Ajout de la colonne typeFichier" \ +"ALTER TABLE rappels ADD COLUMN typeFichier VARCHAR(100) AFTER s3Key;" + +execute_sql "Ajout de la colonne tailleFichier" \ +"ALTER TABLE rappels ADD COLUMN tailleFichier INT AFTER typeFichier;" + +execute_sql "Ajout de la colonne derniereExecution" \ +"ALTER TABLE rappels ADD COLUMN derniereExecution DATETIME AFTER actif;" + +execute_sql "Modification de l'ENUM templateType" \ +"ALTER TABLE rappels MODIFY COLUMN templateType ENUM('rappel', 'rappelJ1', 'rappel3', 'rappel4', 'rappel5', 'rappel6') NOT NULL;" + +echo "" +echo "==========================================" +echo "3. CORRECTION DE LA TABLE sequences" +echo "==========================================" + +execute_sql "Modification de l'ENUM statut" \ +"ALTER TABLE sequences MODIFY COLUMN statut ENUM('ouverte','bloquee','terminee','fermee','annulee') NOT NULL DEFAULT 'ouverte';" + +execute_sql "Modification de l'ENUM publicCible" \ +"ALTER TABLE sequences MODIFY COLUMN publicCible ENUM('directeur','chef_service','autre','tous') NOT NULL DEFAULT 'tous';" + +execute_sql "Modification de la taille de lieu" \ +"ALTER TABLE sequences MODIFY COLUMN lieu VARCHAR(255) NOT NULL;" + +execute_sql "Modification de la taille de qrCodeToken" \ +"ALTER TABLE sequences MODIFY COLUMN qrCodeToken VARCHAR(100) UNIQUE;" + +echo "" +echo "==========================================" +echo "4. CORRECTION DE LA TABLE formations" +echo "==========================================" + +execute_sql "Ajout de la colonne modeAttestation" \ +"ALTER TABLE formations ADD COLUMN modeAttestation ENUM('auto', 'manuel') NOT NULL DEFAULT 'auto' AFTER actif;" + +execute_sql "Ajout de la colonne modeEnvoi" \ +"ALTER TABLE formations ADD COLUMN modeEnvoi ENUM('auto', 'manuel') NOT NULL DEFAULT 'manuel' AFTER modeAttestation;" + +echo "" +echo "==========================================" +echo "5. CORRECTION DE LA TABLE users" +echo "==========================================" + +execute_sql "Ajout de la colonne username" \ +"ALTER TABLE users ADD COLUMN username VARCHAR(100) UNIQUE AFTER email;" + +execute_sql "Ajout de la colonne password" \ +"ALTER TABLE users ADD COLUMN password VARCHAR(255) AFTER username;" + +execute_sql "Ajout de la colonne isActive" \ +"ALTER TABLE users ADD COLUMN isActive BOOLEAN NOT NULL DEFAULT TRUE AFTER role;" + +execute_sql "Ajout de la colonne formateurId" \ +"ALTER TABLE users ADD COLUMN formateurId INT AFTER isActive;" + +execute_sql "Modification de l'ENUM role" \ +"ALTER TABLE users MODIFY COLUMN role ENUM('user', 'admin', 'formateur') NOT NULL DEFAULT 'user';" + +echo "" +echo "==========================================" +echo "6. CORRECTION DE LA TABLE apprenants" +echo "==========================================" + +execute_sql "Modification de codeEtablissement" \ +"ALTER TABLE apprenants MODIFY COLUMN codeEtablissement VARCHAR(50) NULL;" + +execute_sql "Modification de fonction" \ +"ALTER TABLE apprenants MODIFY COLUMN fonction VARCHAR(100) NULL;" + +echo "" +echo "==========================================" +echo "7. CORRECTION DE LA TABLE emailConfig" +echo "==========================================" + +execute_sql "Modification de l'ENUM provider" \ +"ALTER TABLE emailConfig MODIFY COLUMN provider ENUM('resend', 'smtp', 'simulation') NOT NULL DEFAULT 'simulation';" + +echo "" +echo "==========================================" +echo "8. CORRECTION DE LA TABLE emailTemplates" +echo "==========================================" + +execute_sql "Modification de l'ENUM type" \ +"ALTER TABLE emailTemplates MODIFY COLUMN type ENUM('inscription', 'teaser', 'rappel', 'rappelJ1', 'rappel3', 'rappel4', 'rappel5', 'rappel6') NOT NULL UNIQUE;" + +echo "" +echo "==========================================" +echo "9. CORRECTION DE LA TABLE logsRappels" +echo "==========================================" + +execute_sql "Ajout de la colonne email" \ +"ALTER TABLE logsRappels ADD COLUMN email VARCHAR(320) NOT NULL AFTER apprenantId;" + +execute_sql "Modification de l'ENUM type" \ +"ALTER TABLE logsRappels MODIFY COLUMN type ENUM('rappel', 'rappelJ1', 'rappel3', 'rappel4', 'rappel5', 'rappel6') NOT NULL;" + +echo "" +echo "==========================================" +echo "10. CORRECTION DE LA TABLE questionnaires" +echo "==========================================" + +# Vérifier si la colonne nom existe et la renommer en titre +result=$(mysql -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" -se "SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='$DB_NAME' AND TABLE_NAME='questionnaires' AND COLUMN_NAME='nom';" 2>/dev/null) + +if [ "$result" = "1" ]; then + execute_sql "Renommage de nom en titre" \ + "ALTER TABLE questionnaires CHANGE COLUMN nom titre VARCHAR(255) NOT NULL;" +else + echo "→ La colonne titre existe déjà" +fi + +echo "" +echo "==========================================" +echo "11. CORRECTION DE LA TABLE reponsesQuestionnaires" +echo "==========================================" + +# Vérifier si la colonne complete existe et la supprimer +result=$(mysql -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" -se "SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='$DB_NAME' AND TABLE_NAME='reponsesQuestionnaires' AND COLUMN_NAME='complete';" 2>/dev/null) + +if [ "$result" = "1" ]; then + execute_sql "Suppression de la colonne complete" \ + "ALTER TABLE reponsesQuestionnaires DROP COLUMN complete;" +else + echo "→ La colonne complete n'existe pas (OK)" +fi + +echo "" +echo "==========================================" +echo "12. CORRECTION DE LA TABLE attestations" +echo "==========================================" + +execute_sql "Ajout de la colonne documentUrl" \ +"ALTER TABLE attestations ADD COLUMN documentUrl VARCHAR(500) AFTER s3Key;" + +execute_sql "Ajout de la colonne documentS3Key" \ +"ALTER TABLE attestations ADD COLUMN documentS3Key VARCHAR(500) AFTER documentUrl;" + +execute_sql "Ajout de la colonne uploadedBy" \ +"ALTER TABLE attestations ADD COLUMN uploadedBy INT AFTER documentS3Key;" + +execute_sql "Ajout de la colonne uploadedAt" \ +"ALTER TABLE attestations ADD COLUMN uploadedAt TIMESTAMP AFTER uploadedBy;" + +execute_sql "Ajout de la colonne emailEnvoye" \ +"ALTER TABLE attestations ADD COLUMN emailEnvoye BOOLEAN NOT NULL DEFAULT FALSE AFTER uploadedAt;" + +execute_sql "Ajout de la colonne dateEnvoiEmail" \ +"ALTER TABLE attestations ADD COLUMN dateEnvoiEmail TIMESTAMP AFTER emailEnvoye;" + +echo "" +echo "==========================================" +echo "13. CORRECTION DE LA TABLE parametres" +echo "==========================================" + +# Supprimer envoiAutomatiqueAttestations si elle existe +result=$(mysql -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" -se "SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='$DB_NAME' AND TABLE_NAME='parametres' AND COLUMN_NAME='envoiAutomatiqueAttestations';" 2>/dev/null) + +if [ "$result" = "1" ]; then + execute_sql "Suppression de la colonne envoiAutomatiqueAttestations" \ + "ALTER TABLE parametres DROP COLUMN envoiAutomatiqueAttestations;" +else + echo "→ La colonne envoiAutomatiqueAttestations n'existe pas (OK)" +fi + +execute_sql "Ajout de la colonne urlPublique" \ +"ALTER TABLE parametres ADD COLUMN urlPublique VARCHAR(500) NOT NULL DEFAULT 'https://formations.itinova.org' AFTER id;" + +execute_sql "Ajout de la colonne delaiExpirationQR" \ +"ALTER TABLE parametres ADD COLUMN delaiExpirationQR INT NOT NULL DEFAULT 30 AFTER urlPublique;" + +execute_sql "Ajout de la colonne dureeValiditeToken" \ +"ALTER TABLE parametres ADD COLUMN dureeValiditeToken INT NOT NULL DEFAULT 24 AFTER delaiExpirationQR;" + +execute_sql "Ajout de la colonne notificationsActives" \ +"ALTER TABLE parametres ADD COLUMN notificationsActives BOOLEAN NOT NULL DEFAULT TRUE AFTER dureeValiditeToken;" + +echo "" +echo "==========================================" +echo "14. CORRECTION DES AUTRES TABLES" +echo "==========================================" + +execute_sql "Ajout de userId dans passwordResetTokens" \ +"ALTER TABLE passwordResetTokens ADD COLUMN userId INT NOT NULL AFTER id;" + +execute_sql "Ajout de ordre dans datesFormation" \ +"ALTER TABLE datesFormation ADD COLUMN ordre INT NOT NULL AFTER sequenceId;" + +execute_sql "Ajout de validateurId dans presences" \ +"ALTER TABLE presences ADD COLUMN validateurId INT AFTER modeValidation;" + +echo "" +echo "==========================================" +echo "✅ TOUTES LES CORRECTIONS APPLIQUÉES" +echo "==========================================" +echo "" + +# Compter les tables +total_tables=$(mysql -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" -se "SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='$DB_NAME';" 2>/dev/null) + +echo "✓ Nombre total de tables: $total_tables" +echo "" +echo "=== PROCHAINES ÉTAPES ===" +echo "1. Redémarrer l'application: pm2 restart formation-manager" +echo "2. Vérifier les logs: pm2 logs formation-manager --lines 30" +echo "3. Tester l'application dans le navigateur" +echo "" +echo "==========================================" diff --git a/formation-manager-itinova-20260113_043521.tar.gz b/formation-manager-itinova-20260113_043521.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..2f236aa61eb20af997168e4cbc232dd72ba676d3 GIT binary patch literal 3979959 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

    iJ!o;q?E4$#p5Y{Azm6Hu-E#UJpUKguNEk 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 app -cd app -git checkout 7a737c05 -``` - -Remplacez `` par l'URL réelle de votre dépôt Git. - -### Configuration des variables d'environnement - -Créez un fichier `.env` à la racine du projet avec les variables suivantes : - -```bash -# Base de données -DATABASE_URL=mysql://formation_user:MOT_DE_PASSE_SECURISE@localhost:3306/formation_manager - -# Authentification -JWT_SECRET= -OAUTH_SERVER_URL=https://api.manus.im -VITE_OAUTH_PORTAL_URL=https://auth.manus.im - -# Identifiants propriétaire -OWNER_OPEN_ID= -OWNER_NAME= - -# Configuration application -VITE_APP_ID= -VITE_APP_TITLE="Gestion des Formations Manager Itinova" -VITE_APP_LOGO=/logo.png - -# APIs Manus (fournis automatiquement par la plateforme) -BUILT_IN_FORGE_API_URL= -BUILT_IN_FORGE_API_KEY= -VITE_FRONTEND_FORGE_API_KEY= -VITE_FRONTEND_FORGE_API_URL= - -# Analytics (optionnel) -VITE_ANALYTICS_ENDPOINT= -VITE_ANALYTICS_WEBSITE_ID= - -# Production -NODE_ENV=production -PORT=3000 -``` - -**Important** : Générez une clé JWT sécurisée avec la commande suivante : - -```bash -openssl rand -hex 32 -``` - -### Installation des dépendances - -Installez toutes les dépendances du projet : - -```bash -pnpm install -``` - -Cette commande télécharge et installe toutes les bibliothèques nécessaires définies dans `package.json`. Le processus peut prendre plusieurs minutes selon votre connexion internet. - ---- - -## Étape 3 : Migration de la base de données - -### Application du schéma - -Appliquez le schéma de base de données en exécutant : - -```bash -pnpm db:push -``` - -Cette commande utilise Drizzle Kit pour créer automatiquement toutes les tables nécessaires dans la base de données. Les tables suivantes seront créées : - -| Table | Description | -|-------|-------------| -| `users` | Utilisateurs et administrateurs | -| `formations` | Formations disponibles | -| `sequences` | Séquences de formation | -| `apprenants` | Apprenants inscrits | -| `inscriptions` | Inscriptions aux séquences | -| `emailTemplates` | Templates d'emails personnalisés | -| `alertes` | Alertes et notifications | - -### Vérification du schéma - -Connectez-vous à MySQL et vérifiez que toutes les tables ont été créées correctement : - -```bash -mysql -u formation_user -p formation_manager -``` - -```sql -SHOW TABLES; -DESCRIBE users; -DESCRIBE formations; -``` - ---- - -## Étape 4 : Build de production - -### Compilation de l'application - -Compilez l'application pour la production : - -```bash -pnpm run build -``` - -Cette commande effectue les opérations suivantes : - -1. **Compilation TypeScript** : Transpile le code TypeScript du serveur en JavaScript -2. **Build Vite** : Compile et optimise le frontend React (minification, tree-shaking, code splitting) -3. **Génération des assets** : Crée les fichiers statiques dans `dist/public/` - -Le build de production génère un répertoire `dist/` contenant : - -- `dist/index.js` : Le serveur Express compilé -- `dist/public/` : Les fichiers statiques du frontend (HTML, CSS, JS, images) - -### Vérification du build - -Vérifiez que le build s'est terminé sans erreur et que les fichiers ont été générés : - -```bash -ls -lh dist/ -ls -lh dist/public/ -``` - ---- - -## Étape 5 : Configuration du service systemd - -### Création du fichier service - -Créez un fichier de service systemd pour gérer l'application : - -```bash -sudo nano /etc/systemd/system/formation-manager.service -``` - -Ajoutez le contenu suivant : - -```ini -[Unit] -Description=Formation Manager Itinova -After=network.target mysql.service -Wants=mysql.service - -[Service] -Type=simple -User=formation-manager -Group=formation-manager -WorkingDirectory=/opt/formation-manager/app -Environment="NODE_ENV=production" -Environment="PORT=3000" -EnvironmentFile=/opt/formation-manager/app/.env -ExecStart=/home/formation-manager/.nvm/versions/node/v22.13.0/bin/node dist/index.js -Restart=always -RestartSec=10 -StandardOutput=journal -StandardError=journal -SyslogIdentifier=formation-manager - -# Limites de sécurité -LimitNOFILE=65536 -PrivateTmp=true -NoNewPrivileges=true - -[Install] -WantedBy=multi-user.target -``` - -### Activation du service - -Rechargez systemd, activez et démarrez le service : - -```bash -sudo systemctl daemon-reload -sudo systemctl enable formation-manager -sudo systemctl start formation-manager -``` - -### Vérification du statut - -Vérifiez que le service fonctionne correctement : - -```bash -sudo systemctl status formation-manager -``` - -Vous devriez voir `active (running)` en vert. Consultez les logs en cas d'erreur : - -```bash -sudo journalctl -u formation-manager -f -``` - ---- - -## Étape 6 : Configuration Nginx (reverse proxy) - -### Installation de Nginx - -Si Nginx n'est pas déjà installé : - -```bash -sudo apt update -sudo apt install nginx -``` - -### Configuration du site - -Créez un fichier de configuration pour votre site : - -```bash -sudo nano /etc/nginx/sites-available/formation-manager -``` - -Ajoutez la configuration suivante : - -```nginx -upstream formation_backend { - server 127.0.0.1:3000; - keepalive 64; -} - -server { - listen 80; - server_name votre-domaine.com www.votre-domaine.com; - - # Redirection HTTP vers HTTPS - return 301 https://$server_name$request_uri; -} - -server { - listen 443 ssl http2; - server_name votre-domaine.com www.votre-domaine.com; - - # Certificats SSL (à configurer avec Let's Encrypt) - ssl_certificate /etc/letsencrypt/live/votre-domaine.com/fullchain.pem; - ssl_certificate_key /etc/letsencrypt/live/votre-domaine.com/privkey.pem; - ssl_protocols TLSv1.2 TLSv1.3; - ssl_ciphers HIGH:!aNULL:!MD5; - ssl_prefer_server_ciphers on; - - # Logs - access_log /var/log/nginx/formation-manager-access.log; - error_log /var/log/nginx/formation-manager-error.log; - - # Taille maximale des uploads - client_max_body_size 10M; - - # Compression - gzip on; - gzip_vary on; - gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; - - # Proxy vers Node.js - location / { - proxy_pass http://formation_backend; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection 'upgrade'; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_cache_bypass $http_upgrade; - proxy_read_timeout 300s; - proxy_connect_timeout 75s; - } - - # Cache des assets statiques - location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot)$ { - proxy_pass http://formation_backend; - expires 1y; - add_header Cache-Control "public, immutable"; - } -} -``` - -Remplacez `votre-domaine.com` par votre nom de domaine réel. - -### Activation du site - -Activez la configuration et redémarrez Nginx : - -```bash -sudo ln -s /etc/nginx/sites-available/formation-manager /etc/nginx/sites-enabled/ -sudo nginx -t # Tester la configuration -sudo systemctl restart nginx -``` - -### Configuration SSL avec Let's Encrypt - -Installez Certbot et obtenez un certificat SSL gratuit : - -```bash -sudo apt install certbot python3-certbot-nginx -sudo certbot --nginx -d votre-domaine.com -d www.votre-domaine.com -``` - -Suivez les instructions à l'écran. Certbot configurera automatiquement Nginx pour utiliser HTTPS. - ---- - -## Étape 7 : Configuration du pare-feu - -### Configuration UFW - -Si vous utilisez UFW (Uncomplicated Firewall), autorisez les ports nécessaires : - -```bash -sudo ufw allow 22/tcp # SSH -sudo ufw allow 80/tcp # HTTP -sudo ufw allow 443/tcp # HTTPS -sudo ufw enable -sudo ufw status -``` - -### Sécurisation SSH (recommandé) - -Désactivez l'authentification par mot de passe SSH et utilisez uniquement les clés : - -```bash -sudo nano /etc/ssh/sshd_config -``` - -Modifiez les lignes suivantes : - -``` -PasswordAuthentication no -PermitRootLogin no -``` - -Redémarrez SSH : - -```bash -sudo systemctl restart sshd -``` - ---- - -## Étape 8 : Vérification du déploiement - -### Tests fonctionnels - -Accédez à votre application via le navigateur à l'adresse `https://votre-domaine.com` et vérifiez les éléments suivants : - -| Test | Description | Résultat attendu | -|------|-------------|------------------| -| Page d'accueil | Chargement de la page d'accueil | Affichage correct sans erreur | -| Connexion | Authentification via Manus OAuth | Redirection vers le tableau de bord | -| Tableau de bord | Affichage des statistiques | Graphiques et cartes visibles | -| Formations | Liste des formations | Tableau avec données | -| Séquences | Liste des séquences | Tableau avec code couleur | -| Apprenants | Liste des apprenants | Tableau avec badges de statut | -| Templates d'emails | Modification d'un template | Éditeur TipTap fonctionnel | - -### Vérification des logs - -Surveillez les logs pour détecter d'éventuelles erreurs : - -```bash -# Logs de l'application -sudo journalctl -u formation-manager -f - -# Logs Nginx -sudo tail -f /var/log/nginx/formation-manager-error.log - -# Logs système -sudo tail -f /var/log/syslog -``` - -### Tests de performance - -Utilisez des outils pour tester les performances de votre application : - -```bash -# Test de charge avec Apache Bench -ab -n 1000 -c 10 https://votre-domaine.com/ - -# Analyse des temps de réponse -curl -w "@curl-format.txt" -o /dev/null -s https://votre-domaine.com/ -``` - ---- - -## Maintenance et mises à jour - -### Sauvegarde de la base de données - -Créez un script de sauvegarde automatique : - -```bash -sudo nano /opt/formation-manager/backup-db.sh -``` - -Contenu du script : - -```bash -#!/bin/bash -DATE=$(date +%Y%m%d_%H%M%S) -BACKUP_DIR="/opt/formation-manager/backups" -mkdir -p $BACKUP_DIR - -mysqldump -u formation_user -p'MOT_DE_PASSE' formation_manager | gzip > $BACKUP_DIR/formation_manager_$DATE.sql.gz - -# Garder seulement les 30 dernières sauvegardes -find $BACKUP_DIR -name "formation_manager_*.sql.gz" -mtime +30 -delete -``` - -Rendez le script exécutable et ajoutez-le au cron : - -```bash -chmod +x /opt/formation-manager/backup-db.sh -sudo crontab -e -``` - -Ajoutez la ligne suivante pour une sauvegarde quotidienne à 2h du matin : - -``` -0 2 * * * /opt/formation-manager/backup-db.sh -``` - -### Mise à jour de l'application - -Pour mettre à jour l'application vers une nouvelle version : - -```bash -cd /opt/formation-manager/app -sudo systemctl stop formation-manager -git pull origin main -pnpm install -pnpm db:push # Appliquer les migrations -pnpm run build -sudo systemctl start formation-manager -``` - -### Surveillance et monitoring - -Installez des outils de monitoring pour surveiller les performances : - -**PM2** : Alternative à systemd avec monitoring intégré -**Prometheus + Grafana** : Monitoring avancé et dashboards -**Uptime Kuma** : Surveillance de disponibilité -**New Relic / DataDog** : Solutions SaaS complètes - ---- - -## Dépannage - -### L'application ne démarre pas - -Vérifiez les logs pour identifier l'erreur : - -```bash -sudo journalctl -u formation-manager -n 100 -``` - -Causes courantes : - -- **Erreur de connexion à la base de données** : Vérifiez `DATABASE_URL` dans `.env` -- **Port déjà utilisé** : Changez le port dans `.env` ou arrêtez le processus conflictuel -- **Permissions insuffisantes** : Vérifiez les droits sur `/opt/formation-manager/app` - -### Erreur 502 Bad Gateway - -Cette erreur indique que Nginx ne peut pas se connecter au backend Node.js. Vérifications : - -```bash -# Vérifier que le service tourne -sudo systemctl status formation-manager - -# Vérifier que le port 3000 écoute -sudo netstat -tulpn | grep 3000 - -# Tester la connexion locale -curl http://localhost:3000 -``` - -### Problèmes de performance - -Si l'application est lente : - -1. **Optimiser les requêtes SQL** : Ajoutez des index sur les colonnes fréquemment interrogées -2. **Activer le cache Redis** : Mettez en cache les résultats des requêtes coûteuses -3. **Augmenter les ressources** : Ajoutez plus de RAM ou de CPU -4. **Activer la compression Nginx** : Déjà configurée dans l'exemple ci-dessus - -### Base de données corrompue - -En cas de corruption de la base de données, restaurez depuis une sauvegarde : - -```bash -gunzip < /opt/formation-manager/backups/formation_manager_YYYYMMDD_HHMMSS.sql.gz | mysql -u formation_user -p formation_manager -``` - ---- - -## Sécurité - -### Bonnes pratiques - -Suivez ces recommandations pour sécuriser votre déploiement : - -**Mettez à jour régulièrement** : Appliquez les mises à jour de sécurité du système d'exploitation et des dépendances Node.js. - -**Utilisez HTTPS uniquement** : Forcez la redirection HTTP vers HTTPS et activez HSTS (HTTP Strict Transport Security). - -**Limitez les accès SSH** : Utilisez des clés SSH au lieu de mots de passe et limitez l'accès par IP si possible. - -**Configurez un WAF** : Utilisez un Web Application Firewall comme ModSecurity ou Cloudflare pour bloquer les attaques courantes. - -**Surveillez les logs** : Configurez des alertes pour détecter les tentatives d'intrusion ou les comportements anormaux. - -**Sauvegardez régulièrement** : Automatisez les sauvegardes de la base de données et testez régulièrement la restauration. - -### Checklist de sécurité - -Avant de mettre en production, vérifiez les points suivants : - -- [ ] Certificat SSL valide configuré -- [ ] Pare-feu activé et configuré -- [ ] Authentification SSH par clé uniquement -- [ ] Variables d'environnement sécurisées (pas de valeurs par défaut) -- [ ] Sauvegardes automatiques configurées -- [ ] Monitoring et alertes en place -- [ ] Logs rotatifs configurés -- [ ] Permissions fichiers correctes (pas de 777) -- [ ] Base de données accessible uniquement en local -- [ ] Rate limiting configuré sur Nginx - ---- - -## Support et contact - -Pour toute question ou problème concernant le déploiement : - -- **Documentation technique** : Consultez le README.md du projet -- **Support Manus** : https://help.manus.im -- **Contact développeur** : o.pareige@itinova.org - ---- - -**Fin du guide de déploiement** diff --git a/deployment-package/GUIDE_DEPLOIEMENT.pdf b/deployment-package/GUIDE_DEPLOIEMENT.pdf deleted file mode 100644 index 8fe3ff5d43d9fac0105961c4bb91bf5de2e0e847..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 434882 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 ?^jW6 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%0A?%lMVDxd(pyDzTd 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%0AOR}@rJw^}P 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