From 996c6e9241390bb4b557c315cc32e50263390087 Mon Sep 17 00:00:00 2001 From: mberlin Date: Thu, 19 Mar 2026 09:15:22 -0300 Subject: [PATCH] Restructure backend into modular API layers with admin/organizador/invitados routes, add role-based middleware, flatten module models, and update build scripts --- dist/admin/admin.controller.d.ts | 25 - dist/admin/admin.controller.d.ts.map | 1 - dist/admin/admin.controller.js | 175 - dist/admin/admin.module.d.ts | 3 - dist/admin/admin.module.d.ts.map | 1 - dist/admin/admin.module.js | 24 - dist/app.module.d.ts | 3 - dist/app.module.d.ts.map | 1 - dist/app.module.js | 39 - dist/core/api/auth.controller.d.ts | 10 - dist/core/api/auth.controller.d.ts.map | 1 - dist/core/api/auth.controller.js | 37 - dist/core/auth.guard.d.ts | 8 - dist/core/auth.guard.d.ts.map | 1 - dist/core/auth.guard.js | 43 - dist/core/auth.module.d.ts | 3 - dist/core/auth.module.d.ts.map | 1 - dist/core/auth.module.js | 22 - dist/core/core.module.d.ts | 3 - dist/core/core.module.d.ts.map | 1 - dist/core/core.module.js | 60 - dist/core/database.module.d.ts | 3 - dist/core/database.module.d.ts.map | 1 - dist/core/database.module.js | 38 - dist/core/entities/base.entity.d.ts | 8 - dist/core/entities/base.entity.d.ts.map | 1 - dist/core/entities/base.entity.js | 12 - .../entities/notification-rule.entity.d.ts | 10 - .../notification-rule.entity.d.ts.map | 1 - .../core/entities/notification-rule.entity.js | 23 - dist/core/entities/token.entity.d.ts | 13 - dist/core/entities/token.entity.d.ts.map | 1 - dist/core/entities/token.entity.js | 48 - dist/core/services/auth.service.d.ts | 6 - dist/core/services/auth.service.d.ts.map | 1 - dist/core/services/auth.service.js | 65 - dist/core/services/module-linker.service.d.ts | 11 - .../services/module-linker.service.d.ts.map | 1 - dist/core/services/module-linker.service.js | 25 - .../services/module-registry.service.d.ts | 13 - .../services/module-registry.service.d.ts.map | 1 - dist/core/services/module-registry.service.js | 27 - .../notification-provider.interface.d.ts | 10 - .../notification-provider.interface.d.ts.map | 1 - .../notification-provider.interface.js | 2 - .../services/notification-rule.service.d.ts | 10 - .../notification-rule.service.d.ts.map | 1 - .../services/notification-rule.service.js | 40 - dist/core/services/notification.service.d.ts | 8 - .../services/notification.service.d.ts.map | 1 - dist/core/services/notification.service.js | 38 - .../services/providers/email.provider.d.ts | 10 - .../providers/email.provider.d.ts.map | 1 - .../core/services/providers/email.provider.js | 11 - .../services/providers/whatsapp.provider.d.ts | 10 - .../providers/whatsapp.provider.d.ts.map | 1 - .../services/providers/whatsapp.provider.js | 11 - dist/core/services/token.service.d.ts | 7 - dist/core/services/token.service.d.ts.map | 1 - dist/core/services/token.service.js | 40 - dist/core/workflows/base-workflow.d.ts | 7 - dist/core/workflows/base-workflow.d.ts.map | 1 - dist/core/workflows/base-workflow.js | 16 - .../gift/api/dto/create-contribution.dto.d.ts | 9 - .../api/dto/create-contribution.dto.d.ts.map | 1 - dist/gift/api/dto/create-contribution.dto.js | 6 - dist/gift/api/dto/create-gift.dto.d.ts | 10 - dist/gift/api/dto/create-gift.dto.d.ts.map | 1 - dist/gift/api/dto/create-gift.dto.js | 6 - dist/gift/api/gift.controller.d.ts | 14 - dist/gift/api/gift.controller.d.ts.map | 1 - dist/gift/api/gift.controller.js | 89 - dist/gift/entities/gift.entity.d.ts | 22 - dist/gift/entities/gift.entity.d.ts.map | 1 - dist/gift/entities/gift.entity.js | 121 - dist/gift/gift.module.d.ts | 3 - dist/gift/gift.module.d.ts.map | 1 - dist/gift/gift.module.js | 31 - dist/gift/gift.registration.d.ts | 8 - dist/gift/gift.registration.d.ts.map | 1 - dist/gift/gift.registration.js | 32 - dist/gift/services/gift.service.d.ts | 17 - dist/gift/services/gift.service.d.ts.map | 1 - dist/gift/services/gift.service.js | 69 - dist/gift/subscribers/gift.subscriber.d.ts | 10 - .../gift/subscribers/gift.subscriber.d.ts.map | 1 - dist/gift/subscribers/gift.subscriber.js | 58 - dist/gift/workflows/gift.workflow.d.ts | 5 - dist/gift/workflows/gift.workflow.d.ts.map | 1 - dist/gift/workflows/gift.workflow.js | 13 - dist/guest/api/dto/create-guest.dto.d.ts | 7 - dist/guest/api/dto/create-guest.dto.d.ts.map | 1 - dist/guest/api/dto/create-guest.dto.js | 6 - dist/guest/api/dto/update-rsvp.dto.d.ts | 5 - dist/guest/api/dto/update-rsvp.dto.d.ts.map | 1 - dist/guest/api/dto/update-rsvp.dto.js | 6 - dist/guest/api/guest.controller.d.ts | 11 - dist/guest/api/guest.controller.d.ts.map | 1 - dist/guest/api/guest.controller.js | 62 - dist/guest/entities/guest.entity.d.ts | 18 - dist/guest/entities/guest.entity.d.ts.map | 1 - dist/guest/entities/guest.entity.js | 103 - dist/guest/guest.module.d.ts | 3 - dist/guest/guest.module.d.ts.map | 1 - dist/guest/guest.module.js | 33 - dist/guest/guest.registration.d.ts | 8 - dist/guest/guest.registration.d.ts.map | 1 - dist/guest/guest.registration.js | 32 - dist/guest/services/guest.service.d.ts | 15 - dist/guest/services/guest.service.d.ts.map | 1 - dist/guest/services/guest.service.js | 57 - dist/guest/subscribers/guest.subscriber.d.ts | 10 - .../subscribers/guest.subscriber.d.ts.map | 1 - dist/guest/subscribers/guest.subscriber.js | 58 - dist/guest/workflows/guest.workflow.d.ts | 5 - dist/guest/workflows/guest.workflow.d.ts.map | 1 - dist/guest/workflows/guest.workflow.js | 13 - dist/main.d.ts | 2 - dist/main.d.ts.map | 1 - dist/main.js | 14 - dist/todo/api/todo.controller.d.ts | 9 - dist/todo/api/todo.controller.d.ts.map | 1 - dist/todo/api/todo.controller.js | 59 - dist/todo/entities/todo.entity.d.ts | 10 - dist/todo/entities/todo.entity.d.ts.map | 1 - dist/todo/entities/todo.entity.js | 27 - dist/todo/services/todo.service.d.ts | 13 - dist/todo/services/todo.service.d.ts.map | 1 - dist/todo/services/todo.service.js | 54 - dist/todo/subscribers/todo.subscriber.d.ts | 10 - .../todo/subscribers/todo.subscriber.d.ts.map | 1 - dist/todo/subscribers/todo.subscriber.js | 58 - dist/todo/todo.module.d.ts | 3 - dist/todo/todo.module.d.ts.map | 1 - dist/todo/todo.module.js | 28 - dist/todo/todo.registration.d.ts | 8 - dist/todo/todo.registration.d.ts.map | 1 - dist/todo/todo.registration.js | 32 - dist/todo/workflows/todo.workflow.d.ts | 5 - dist/todo/workflows/todo.workflow.d.ts.map | 1 - dist/todo/workflows/todo.workflow.js | 13 - package-lock.json | 4312 +++++++++++++++-- package.json | 45 +- packages/admin/.gitignore | 24 + packages/admin/README.md | 73 + packages/admin/eslint.config.js | 23 + packages/admin/index.html | 13 + packages/admin/package.json | 35 + packages/admin/postcss.config.js | 6 + packages/admin/public/favicon.svg | 1 + packages/admin/public/icons.svg | 24 + packages/admin/src/App.css | 184 + packages/admin/src/App.tsx | 61 + packages/admin/src/assets/hero.png | Bin 0 -> 44919 bytes packages/admin/src/assets/react.svg | 1 + packages/admin/src/assets/vite.svg | 1 + .../admin/src/components/ProtectedRoute.tsx | 10 + packages/admin/src/components/Sidebar.tsx | 28 + packages/admin/src/index.css | 115 + packages/admin/src/lib/api.ts | 25 + packages/admin/src/lib/auth.ts | 17 + packages/admin/src/main.tsx | 10 + packages/admin/src/pages/Dashboard.tsx | 8 + packages/admin/src/pages/Gifts.tsx | 75 + packages/admin/src/pages/Guests.tsx | 83 + packages/admin/src/pages/Login.tsx | 65 + packages/admin/src/pages/Todos.tsx | 95 + packages/admin/tailwind.config.js | 20 + packages/admin/tsconfig.app.json | 28 + packages/admin/tsconfig.json | 7 + packages/admin/tsconfig.node.json | 26 + packages/admin/vite.config.ts | 15 + .../legacy/mikro-orm.config.js | 0 packages/legacy/package.json | 44 + {public => packages/legacy/public}/admin.html | 0 .../legacy/src}/admin/admin.controller.ts | 0 .../legacy/src}/admin/admin.module.ts | 0 {src => packages/legacy/src}/app.module.ts | 0 .../legacy/src}/core/api/auth.controller.ts | 0 .../legacy/src}/core/auth.guard.ts | 0 .../legacy/src}/core/auth.module.ts | 0 .../legacy/src}/core/core.module.ts | 0 .../legacy/src}/core/database.module.ts | 0 .../legacy/src}/core/entities/base.entity.ts | 0 .../core/entities/notification-rule.entity.ts | 0 .../legacy/src}/core/entities/token.entity.ts | 0 .../legacy/src}/core/entities/user.entity.ts | 0 .../legacy/src}/core/services/auth.service.ts | 0 .../core/services/module-linker.service.ts | 0 .../core/services/module-registry.service.ts | 0 .../notification-provider.interface.ts | 0 .../services/notification-rule.service.ts | 0 .../core/services/notification.service.ts | 0 .../core/services/providers/email.provider.ts | 0 .../services/providers/whatsapp.provider.ts | 0 .../src}/core/services/token.service.ts | 0 .../legacy/src}/core/services/user.service.ts | 0 .../src}/core/workflows/base-workflow.ts | 0 .../gift/api/dto/create-contribution.dto.ts | 0 .../src}/gift/api/dto/create-gift.dto.ts | 0 .../legacy/src}/gift/api/gift.controller.ts | 0 .../legacy/src}/gift/entities/gift.entity.ts | 0 .../legacy/src}/gift/gift.module.ts | 0 .../legacy/src}/gift/gift.registration.ts | 0 .../legacy/src}/gift/services/gift.service.ts | 0 .../src}/gift/subscribers/gift.subscriber.ts | 0 .../src}/gift/workflows/gift.workflow.ts | 0 .../src}/guest/api/dto/create-guest.dto.ts | 0 .../src}/guest/api/dto/update-rsvp.dto.ts | 0 .../legacy/src}/guest/api/guest.controller.ts | 0 .../src}/guest/entities/guest.entity.ts | 0 .../legacy/src}/guest/guest.module.ts | 0 .../legacy/src}/guest/guest.registration.ts | 0 .../src}/guest/services/guest.service.ts | 0 .../guest/subscribers/guest.subscriber.ts | 0 .../src}/guest/workflows/guest.workflow.ts | 0 {src => packages/legacy/src}/main.ts | 0 .../legacy/src}/todo/api/todo.controller.ts | 0 .../legacy/src}/todo/entities/todo.entity.ts | 0 .../legacy/src}/todo/services/todo.service.ts | 0 .../src}/todo/subscribers/todo.subscriber.ts | 0 .../legacy/src}/todo/todo.module.ts | 0 .../legacy/src}/todo/todo.registration.ts | 0 .../src}/todo/workflows/todo.workflow.ts | 0 .../legacy/tsconfig.build.json | 0 .../legacy/tsconfig.dev.json | 0 .../legacy/tsconfig.json | 0 packages/server/mikro-orm.config.js | 8 + packages/server/mikro-orm.config.ts | Bin 0 -> 104 bytes packages/server/package.json | 36 + .../server/scripts/cleanup-model-folders.js | 15 + packages/server/scripts/flatten-models.js | 33 + packages/server/src/api/admin/gifts/routes.ts | 51 + .../server/src/api/admin/guests/routes.ts | 36 + packages/server/src/api/admin/routes.ts | 19 + packages/server/src/api/admin/todos/routes.ts | 33 + packages/server/src/api/auth/dto/login.dto.ts | 8 + .../server/src/api/auth/dto/register.dto.ts | 9 + packages/server/src/api/auth/routes.ts | 47 + .../api/gifts/dto/create-contribution.dto.ts | 11 + .../src/api/gifts/dto/create-gift.dto.ts | 11 + packages/server/src/api/gifts/routes.ts | 51 + .../src/api/guests/dto/create-guest.dto.ts | 11 + .../src/api/guests/dto/update-rsvp.dto.ts | 8 + packages/server/src/api/guests/routes.ts | 34 + .../server/src/api/health/health.routes.ts | 7 + packages/server/src/api/index.ts | 25 + .../server/src/api/invitados/gifts/routes.ts | 52 + .../server/src/api/invitados/guests/routes.ts | 38 + packages/server/src/api/invitados/routes.ts | 16 + .../server/src/api/invitados/todos/routes.ts | 34 + packages/server/src/api/middleware.ts | 108 + .../src/api/organizador/gifts/routes.ts | 52 + .../src/api/organizador/guests/routes.ts | 38 + packages/server/src/api/organizador/routes.ts | 18 + .../src/api/organizador/todos/routes.ts | 34 + .../src/api/todos/dto/create-todo.dto.ts | 9 + packages/server/src/api/todos/routes.ts | 33 + packages/server/src/app.ts | 23 + packages/server/src/core/db.ts | 24 + packages/server/src/core/events.ts | 3 + packages/server/src/core/middleware/auth.ts | 23 + .../server/src/core/middleware/validate.ts | 13 + packages/server/src/core/model/base.entity.ts | 9 + packages/server/src/core/tenant.ts | 3 + packages/server/src/index.ts | 20 + packages/server/src/jobs/.gitkeep | 0 packages/server/src/links/.gitkeep | 0 packages/server/src/mikro-orm.config.ts | 19 + .../server/src/modules/auth/auth.service.ts | 17 + packages/server/src/modules/auth/model.ts | 66 + packages/server/src/modules/auth/types.ts | 17 + .../server/src/modules/auth/user.service.ts | 46 + packages/server/src/modules/gifts/model.ts | 134 + packages/server/src/modules/gifts/service.ts | 55 + packages/server/src/modules/gifts/types.ts | 21 + packages/server/src/modules/guests/model.ts | 112 + packages/server/src/modules/guests/service.ts | 43 + packages/server/src/modules/guests/types.ts | 18 + packages/server/src/modules/todos/model.ts | 30 + packages/server/src/modules/todos/service.ts | 39 + packages/server/src/modules/todos/types.ts | 9 + packages/server/src/subscribers/.gitkeep | 0 packages/server/src/workflows/.gitkeep | 0 packages/server/tsconfig.json | 18 + 285 files changed, 6551 insertions(+), 2914 deletions(-) delete mode 100644 dist/admin/admin.controller.d.ts delete mode 100644 dist/admin/admin.controller.d.ts.map delete mode 100644 dist/admin/admin.controller.js delete mode 100644 dist/admin/admin.module.d.ts delete mode 100644 dist/admin/admin.module.d.ts.map delete mode 100644 dist/admin/admin.module.js delete mode 100644 dist/app.module.d.ts delete mode 100644 dist/app.module.d.ts.map delete mode 100644 dist/app.module.js delete mode 100644 dist/core/api/auth.controller.d.ts delete mode 100644 dist/core/api/auth.controller.d.ts.map delete mode 100644 dist/core/api/auth.controller.js delete mode 100644 dist/core/auth.guard.d.ts delete mode 100644 dist/core/auth.guard.d.ts.map delete mode 100644 dist/core/auth.guard.js delete mode 100644 dist/core/auth.module.d.ts delete mode 100644 dist/core/auth.module.d.ts.map delete mode 100644 dist/core/auth.module.js delete mode 100644 dist/core/core.module.d.ts delete mode 100644 dist/core/core.module.d.ts.map delete mode 100644 dist/core/core.module.js delete mode 100644 dist/core/database.module.d.ts delete mode 100644 dist/core/database.module.d.ts.map delete mode 100644 dist/core/database.module.js delete mode 100644 dist/core/entities/base.entity.d.ts delete mode 100644 dist/core/entities/base.entity.d.ts.map delete mode 100644 dist/core/entities/base.entity.js delete mode 100644 dist/core/entities/notification-rule.entity.d.ts delete mode 100644 dist/core/entities/notification-rule.entity.d.ts.map delete mode 100644 dist/core/entities/notification-rule.entity.js delete mode 100644 dist/core/entities/token.entity.d.ts delete mode 100644 dist/core/entities/token.entity.d.ts.map delete mode 100644 dist/core/entities/token.entity.js delete mode 100644 dist/core/services/auth.service.d.ts delete mode 100644 dist/core/services/auth.service.d.ts.map delete mode 100644 dist/core/services/auth.service.js delete mode 100644 dist/core/services/module-linker.service.d.ts delete mode 100644 dist/core/services/module-linker.service.d.ts.map delete mode 100644 dist/core/services/module-linker.service.js delete mode 100644 dist/core/services/module-registry.service.d.ts delete mode 100644 dist/core/services/module-registry.service.d.ts.map delete mode 100644 dist/core/services/module-registry.service.js delete mode 100644 dist/core/services/notification-provider.interface.d.ts delete mode 100644 dist/core/services/notification-provider.interface.d.ts.map delete mode 100644 dist/core/services/notification-provider.interface.js delete mode 100644 dist/core/services/notification-rule.service.d.ts delete mode 100644 dist/core/services/notification-rule.service.d.ts.map delete mode 100644 dist/core/services/notification-rule.service.js delete mode 100644 dist/core/services/notification.service.d.ts delete mode 100644 dist/core/services/notification.service.d.ts.map delete mode 100644 dist/core/services/notification.service.js delete mode 100644 dist/core/services/providers/email.provider.d.ts delete mode 100644 dist/core/services/providers/email.provider.d.ts.map delete mode 100644 dist/core/services/providers/email.provider.js delete mode 100644 dist/core/services/providers/whatsapp.provider.d.ts delete mode 100644 dist/core/services/providers/whatsapp.provider.d.ts.map delete mode 100644 dist/core/services/providers/whatsapp.provider.js delete mode 100644 dist/core/services/token.service.d.ts delete mode 100644 dist/core/services/token.service.d.ts.map delete mode 100644 dist/core/services/token.service.js delete mode 100644 dist/core/workflows/base-workflow.d.ts delete mode 100644 dist/core/workflows/base-workflow.d.ts.map delete mode 100644 dist/core/workflows/base-workflow.js delete mode 100644 dist/gift/api/dto/create-contribution.dto.d.ts delete mode 100644 dist/gift/api/dto/create-contribution.dto.d.ts.map delete mode 100644 dist/gift/api/dto/create-contribution.dto.js delete mode 100644 dist/gift/api/dto/create-gift.dto.d.ts delete mode 100644 dist/gift/api/dto/create-gift.dto.d.ts.map delete mode 100644 dist/gift/api/dto/create-gift.dto.js delete mode 100644 dist/gift/api/gift.controller.d.ts delete mode 100644 dist/gift/api/gift.controller.d.ts.map delete mode 100644 dist/gift/api/gift.controller.js delete mode 100644 dist/gift/entities/gift.entity.d.ts delete mode 100644 dist/gift/entities/gift.entity.d.ts.map delete mode 100644 dist/gift/entities/gift.entity.js delete mode 100644 dist/gift/gift.module.d.ts delete mode 100644 dist/gift/gift.module.d.ts.map delete mode 100644 dist/gift/gift.module.js delete mode 100644 dist/gift/gift.registration.d.ts delete mode 100644 dist/gift/gift.registration.d.ts.map delete mode 100644 dist/gift/gift.registration.js delete mode 100644 dist/gift/services/gift.service.d.ts delete mode 100644 dist/gift/services/gift.service.d.ts.map delete mode 100644 dist/gift/services/gift.service.js delete mode 100644 dist/gift/subscribers/gift.subscriber.d.ts delete mode 100644 dist/gift/subscribers/gift.subscriber.d.ts.map delete mode 100644 dist/gift/subscribers/gift.subscriber.js delete mode 100644 dist/gift/workflows/gift.workflow.d.ts delete mode 100644 dist/gift/workflows/gift.workflow.d.ts.map delete mode 100644 dist/gift/workflows/gift.workflow.js delete mode 100644 dist/guest/api/dto/create-guest.dto.d.ts delete mode 100644 dist/guest/api/dto/create-guest.dto.d.ts.map delete mode 100644 dist/guest/api/dto/create-guest.dto.js delete mode 100644 dist/guest/api/dto/update-rsvp.dto.d.ts delete mode 100644 dist/guest/api/dto/update-rsvp.dto.d.ts.map delete mode 100644 dist/guest/api/dto/update-rsvp.dto.js delete mode 100644 dist/guest/api/guest.controller.d.ts delete mode 100644 dist/guest/api/guest.controller.d.ts.map delete mode 100644 dist/guest/api/guest.controller.js delete mode 100644 dist/guest/entities/guest.entity.d.ts delete mode 100644 dist/guest/entities/guest.entity.d.ts.map delete mode 100644 dist/guest/entities/guest.entity.js delete mode 100644 dist/guest/guest.module.d.ts delete mode 100644 dist/guest/guest.module.d.ts.map delete mode 100644 dist/guest/guest.module.js delete mode 100644 dist/guest/guest.registration.d.ts delete mode 100644 dist/guest/guest.registration.d.ts.map delete mode 100644 dist/guest/guest.registration.js delete mode 100644 dist/guest/services/guest.service.d.ts delete mode 100644 dist/guest/services/guest.service.d.ts.map delete mode 100644 dist/guest/services/guest.service.js delete mode 100644 dist/guest/subscribers/guest.subscriber.d.ts delete mode 100644 dist/guest/subscribers/guest.subscriber.d.ts.map delete mode 100644 dist/guest/subscribers/guest.subscriber.js delete mode 100644 dist/guest/workflows/guest.workflow.d.ts delete mode 100644 dist/guest/workflows/guest.workflow.d.ts.map delete mode 100644 dist/guest/workflows/guest.workflow.js delete mode 100644 dist/main.d.ts delete mode 100644 dist/main.d.ts.map delete mode 100644 dist/main.js delete mode 100644 dist/todo/api/todo.controller.d.ts delete mode 100644 dist/todo/api/todo.controller.d.ts.map delete mode 100644 dist/todo/api/todo.controller.js delete mode 100644 dist/todo/entities/todo.entity.d.ts delete mode 100644 dist/todo/entities/todo.entity.d.ts.map delete mode 100644 dist/todo/entities/todo.entity.js delete mode 100644 dist/todo/services/todo.service.d.ts delete mode 100644 dist/todo/services/todo.service.d.ts.map delete mode 100644 dist/todo/services/todo.service.js delete mode 100644 dist/todo/subscribers/todo.subscriber.d.ts delete mode 100644 dist/todo/subscribers/todo.subscriber.d.ts.map delete mode 100644 dist/todo/subscribers/todo.subscriber.js delete mode 100644 dist/todo/todo.module.d.ts delete mode 100644 dist/todo/todo.module.d.ts.map delete mode 100644 dist/todo/todo.module.js delete mode 100644 dist/todo/todo.registration.d.ts delete mode 100644 dist/todo/todo.registration.d.ts.map delete mode 100644 dist/todo/todo.registration.js delete mode 100644 dist/todo/workflows/todo.workflow.d.ts delete mode 100644 dist/todo/workflows/todo.workflow.d.ts.map delete mode 100644 dist/todo/workflows/todo.workflow.js create mode 100644 packages/admin/.gitignore create mode 100644 packages/admin/README.md create mode 100644 packages/admin/eslint.config.js create mode 100644 packages/admin/index.html create mode 100644 packages/admin/package.json create mode 100644 packages/admin/postcss.config.js create mode 100644 packages/admin/public/favicon.svg create mode 100644 packages/admin/public/icons.svg create mode 100644 packages/admin/src/App.css create mode 100644 packages/admin/src/App.tsx create mode 100644 packages/admin/src/assets/hero.png create mode 100644 packages/admin/src/assets/react.svg create mode 100644 packages/admin/src/assets/vite.svg create mode 100644 packages/admin/src/components/ProtectedRoute.tsx create mode 100644 packages/admin/src/components/Sidebar.tsx create mode 100644 packages/admin/src/index.css create mode 100644 packages/admin/src/lib/api.ts create mode 100644 packages/admin/src/lib/auth.ts create mode 100644 packages/admin/src/main.tsx create mode 100644 packages/admin/src/pages/Dashboard.tsx create mode 100644 packages/admin/src/pages/Gifts.tsx create mode 100644 packages/admin/src/pages/Guests.tsx create mode 100644 packages/admin/src/pages/Login.tsx create mode 100644 packages/admin/src/pages/Todos.tsx create mode 100644 packages/admin/tailwind.config.js create mode 100644 packages/admin/tsconfig.app.json create mode 100644 packages/admin/tsconfig.json create mode 100644 packages/admin/tsconfig.node.json create mode 100644 packages/admin/vite.config.ts rename mikro-orm.config.js => packages/legacy/mikro-orm.config.js (100%) create mode 100644 packages/legacy/package.json rename {public => packages/legacy/public}/admin.html (100%) rename {src => packages/legacy/src}/admin/admin.controller.ts (100%) rename {src => packages/legacy/src}/admin/admin.module.ts (100%) rename {src => packages/legacy/src}/app.module.ts (100%) rename {src => packages/legacy/src}/core/api/auth.controller.ts (100%) rename {src => packages/legacy/src}/core/auth.guard.ts (100%) rename {src => packages/legacy/src}/core/auth.module.ts (100%) rename {src => packages/legacy/src}/core/core.module.ts (100%) rename {src => packages/legacy/src}/core/database.module.ts (100%) rename {src => packages/legacy/src}/core/entities/base.entity.ts (100%) rename {src => packages/legacy/src}/core/entities/notification-rule.entity.ts (100%) rename {src => packages/legacy/src}/core/entities/token.entity.ts (100%) rename {src => packages/legacy/src}/core/entities/user.entity.ts (100%) rename {src => packages/legacy/src}/core/services/auth.service.ts (100%) rename {src => packages/legacy/src}/core/services/module-linker.service.ts (100%) rename {src => packages/legacy/src}/core/services/module-registry.service.ts (100%) rename {src => packages/legacy/src}/core/services/notification-provider.interface.ts (100%) rename {src => packages/legacy/src}/core/services/notification-rule.service.ts (100%) rename {src => packages/legacy/src}/core/services/notification.service.ts (100%) rename {src => packages/legacy/src}/core/services/providers/email.provider.ts (100%) rename {src => packages/legacy/src}/core/services/providers/whatsapp.provider.ts (100%) rename {src => packages/legacy/src}/core/services/token.service.ts (100%) rename {src => packages/legacy/src}/core/services/user.service.ts (100%) rename {src => packages/legacy/src}/core/workflows/base-workflow.ts (100%) rename {src => packages/legacy/src}/gift/api/dto/create-contribution.dto.ts (100%) rename {src => packages/legacy/src}/gift/api/dto/create-gift.dto.ts (100%) rename {src => packages/legacy/src}/gift/api/gift.controller.ts (100%) rename {src => packages/legacy/src}/gift/entities/gift.entity.ts (100%) rename {src => packages/legacy/src}/gift/gift.module.ts (100%) rename {src => packages/legacy/src}/gift/gift.registration.ts (100%) rename {src => packages/legacy/src}/gift/services/gift.service.ts (100%) rename {src => packages/legacy/src}/gift/subscribers/gift.subscriber.ts (100%) rename {src => packages/legacy/src}/gift/workflows/gift.workflow.ts (100%) rename {src => packages/legacy/src}/guest/api/dto/create-guest.dto.ts (100%) rename {src => packages/legacy/src}/guest/api/dto/update-rsvp.dto.ts (100%) rename {src => packages/legacy/src}/guest/api/guest.controller.ts (100%) rename {src => packages/legacy/src}/guest/entities/guest.entity.ts (100%) rename {src => packages/legacy/src}/guest/guest.module.ts (100%) rename {src => packages/legacy/src}/guest/guest.registration.ts (100%) rename {src => packages/legacy/src}/guest/services/guest.service.ts (100%) rename {src => packages/legacy/src}/guest/subscribers/guest.subscriber.ts (100%) rename {src => packages/legacy/src}/guest/workflows/guest.workflow.ts (100%) rename {src => packages/legacy/src}/main.ts (100%) rename {src => packages/legacy/src}/todo/api/todo.controller.ts (100%) rename {src => packages/legacy/src}/todo/entities/todo.entity.ts (100%) rename {src => packages/legacy/src}/todo/services/todo.service.ts (100%) rename {src => packages/legacy/src}/todo/subscribers/todo.subscriber.ts (100%) rename {src => packages/legacy/src}/todo/todo.module.ts (100%) rename {src => packages/legacy/src}/todo/todo.registration.ts (100%) rename {src => packages/legacy/src}/todo/workflows/todo.workflow.ts (100%) rename tsconfig.build.json => packages/legacy/tsconfig.build.json (100%) rename tsconfig.dev.json => packages/legacy/tsconfig.dev.json (100%) rename tsconfig.json => packages/legacy/tsconfig.json (100%) create mode 100644 packages/server/mikro-orm.config.js create mode 100644 packages/server/mikro-orm.config.ts create mode 100644 packages/server/package.json create mode 100644 packages/server/scripts/cleanup-model-folders.js create mode 100644 packages/server/scripts/flatten-models.js create mode 100644 packages/server/src/api/admin/gifts/routes.ts create mode 100644 packages/server/src/api/admin/guests/routes.ts create mode 100644 packages/server/src/api/admin/routes.ts create mode 100644 packages/server/src/api/admin/todos/routes.ts create mode 100644 packages/server/src/api/auth/dto/login.dto.ts create mode 100644 packages/server/src/api/auth/dto/register.dto.ts create mode 100644 packages/server/src/api/auth/routes.ts create mode 100644 packages/server/src/api/gifts/dto/create-contribution.dto.ts create mode 100644 packages/server/src/api/gifts/dto/create-gift.dto.ts create mode 100644 packages/server/src/api/gifts/routes.ts create mode 100644 packages/server/src/api/guests/dto/create-guest.dto.ts create mode 100644 packages/server/src/api/guests/dto/update-rsvp.dto.ts create mode 100644 packages/server/src/api/guests/routes.ts create mode 100644 packages/server/src/api/health/health.routes.ts create mode 100644 packages/server/src/api/index.ts create mode 100644 packages/server/src/api/invitados/gifts/routes.ts create mode 100644 packages/server/src/api/invitados/guests/routes.ts create mode 100644 packages/server/src/api/invitados/routes.ts create mode 100644 packages/server/src/api/invitados/todos/routes.ts create mode 100644 packages/server/src/api/middleware.ts create mode 100644 packages/server/src/api/organizador/gifts/routes.ts create mode 100644 packages/server/src/api/organizador/guests/routes.ts create mode 100644 packages/server/src/api/organizador/routes.ts create mode 100644 packages/server/src/api/organizador/todos/routes.ts create mode 100644 packages/server/src/api/todos/dto/create-todo.dto.ts create mode 100644 packages/server/src/api/todos/routes.ts create mode 100644 packages/server/src/app.ts create mode 100644 packages/server/src/core/db.ts create mode 100644 packages/server/src/core/events.ts create mode 100644 packages/server/src/core/middleware/auth.ts create mode 100644 packages/server/src/core/middleware/validate.ts create mode 100644 packages/server/src/core/model/base.entity.ts create mode 100644 packages/server/src/core/tenant.ts create mode 100644 packages/server/src/index.ts create mode 100644 packages/server/src/jobs/.gitkeep create mode 100644 packages/server/src/links/.gitkeep create mode 100644 packages/server/src/mikro-orm.config.ts create mode 100644 packages/server/src/modules/auth/auth.service.ts create mode 100644 packages/server/src/modules/auth/model.ts create mode 100644 packages/server/src/modules/auth/types.ts create mode 100644 packages/server/src/modules/auth/user.service.ts create mode 100644 packages/server/src/modules/gifts/model.ts create mode 100644 packages/server/src/modules/gifts/service.ts create mode 100644 packages/server/src/modules/gifts/types.ts create mode 100644 packages/server/src/modules/guests/model.ts create mode 100644 packages/server/src/modules/guests/service.ts create mode 100644 packages/server/src/modules/guests/types.ts create mode 100644 packages/server/src/modules/todos/model.ts create mode 100644 packages/server/src/modules/todos/service.ts create mode 100644 packages/server/src/modules/todos/types.ts create mode 100644 packages/server/src/subscribers/.gitkeep create mode 100644 packages/server/src/workflows/.gitkeep create mode 100644 packages/server/tsconfig.json diff --git a/dist/admin/admin.controller.d.ts b/dist/admin/admin.controller.d.ts deleted file mode 100644 index 57dbab2..0000000 --- a/dist/admin/admin.controller.d.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { GiftService } from '../gift/services/gift.service'; -import { GuestService } from '../guest/services/guest.service'; -import { TodoService } from '../todo/services/todo.service'; -import { ModuleRegistryService } from '../core/services/module-registry.service'; -export declare class AdminController { - private readonly moduleRegistry; - private readonly guestService; - private readonly giftService; - private readonly todoService; - constructor(moduleRegistry: ModuleRegistryService, guestService: GuestService, giftService: GiftService, todoService: TodoService); - getModules(): import("../core/services/module-registry.service").AdminModuleInfo[]; - private getTenantId; - listGuests(tenantId?: string): Promise; - createGuest(tenantId: string, body: any): Promise; - updateGuestRsvp(tenantId: string, id: string, body: any): Promise; - listTodos(tenantId?: string): Promise; - createTodo(tenantId: string, body: Record): Promise; - completeTodo(tenantId: string, id: string): Promise; - listGifts(tenantId?: string): Promise; - createGift(tenantId: string, body: any): Promise; - getGift(tenantId: string, id: string): Promise; - createContribution(tenantId: string, id: string, body: any): Promise; - listContributions(tenantId: string, id: string): Promise; -} -//# sourceMappingURL=admin.controller.d.ts.map \ No newline at end of file diff --git a/dist/admin/admin.controller.d.ts.map b/dist/admin/admin.controller.d.ts.map deleted file mode 100644 index f29d948..0000000 --- a/dist/admin/admin.controller.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"admin.controller.d.ts","sourceRoot":"","sources":["../../src/admin/admin.controller.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,0CAA0C,CAAC;AAIjF,qBACa,eAAe;IAExB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,WAAW;gBAHX,cAAc,EAAE,qBAAqB,EACrC,YAAY,EAAE,YAAY,EAC1B,WAAW,EAAE,WAAW,EACxB,WAAW,EAAE,WAAW;IAI3C,UAAU;IAIV,OAAO,CAAC,WAAW;IAMnB,UAAU,CAAoB,QAAQ,CAAC,EAAE,MAAM;IAK/C,WAAW,CACU,QAAQ,EAAE,MAAM,EAC3B,IAAI,EAAE,GAAG;IAMnB,eAAe,CACM,QAAQ,EAAE,MAAM,EACtB,EAAE,EAAE,MAAM,EACf,IAAI,EAAE,GAAG;IAOnB,SAAS,CAAoB,QAAQ,CAAC,EAAE,MAAM;IAK9C,UAAU,CACW,QAAQ,EAAE,MAAM,EAC3B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAMnC,YAAY,CACS,QAAQ,EAAE,MAAM,EACtB,EAAE,EAAE,MAAM;IAOzB,SAAS,CAAoB,QAAQ,CAAC,EAAE,MAAM;IAK9C,UAAU,CACW,QAAQ,EAAE,MAAM,EAC3B,IAAI,EAAE,GAAG;IAMnB,OAAO,CACc,QAAQ,EAAE,MAAM,EACtB,EAAE,EAAE,MAAM;IAMzB,kBAAkB,CACG,QAAQ,EAAE,MAAM,EACtB,EAAE,EAAE,MAAM,EACf,IAAI,EAAE,GAAG;IASnB,iBAAiB,CACI,QAAQ,EAAE,MAAM,EACtB,EAAE,EAAE,MAAM;CAI1B"} \ No newline at end of file diff --git a/dist/admin/admin.controller.js b/dist/admin/admin.controller.js deleted file mode 100644 index 4915eb5..0000000 --- a/dist/admin/admin.controller.js +++ /dev/null @@ -1,175 +0,0 @@ -"use strict"; -var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (this && this.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; -var __param = (this && this.__param) || function (paramIndex, decorator) { - return function (target, key) { decorator(target, key, paramIndex); } -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.AdminController = void 0; -const common_1 = require("@nestjs/common"); -const gift_service_1 = require("../gift/services/gift.service"); -const guest_service_1 = require("../guest/services/guest.service"); -const todo_service_1 = require("../todo/services/todo.service"); -const module_registry_service_1 = require("../core/services/module-registry.service"); -const DEFAULT_TENANT = process.env.DEFAULT_TENANT_ID ?? 'default'; -let AdminController = class AdminController { - constructor(moduleRegistry, guestService, giftService, todoService) { - this.moduleRegistry = moduleRegistry; - this.guestService = guestService; - this.giftService = giftService; - this.todoService = todoService; - } - getModules() { - return this.moduleRegistry.getModules(); - } - getTenantId(tenantId) { - return tenantId ?? DEFAULT_TENANT; - } - // Guests - listGuests(tenantId) { - return this.guestService.listGuests(this.getTenantId(tenantId)); - } - createGuest(tenantId, body) { - return this.guestService.createGuest(this.getTenantId(tenantId), body); - } - updateGuestRsvp(tenantId, id, body) { - return this.guestService.updateRsvp(this.getTenantId(tenantId), id, body); - } - // Todos - listTodos(tenantId) { - return this.todoService.listTodos(this.getTenantId(tenantId)); - } - createTodo(tenantId, body) { - return this.todoService.createTodo(this.getTenantId(tenantId), body); - } - completeTodo(tenantId, id) { - return this.todoService.markComplete(this.getTenantId(tenantId), id); - } - // Gifts - listGifts(tenantId) { - return this.giftService.listGifts(this.getTenantId(tenantId)); - } - createGift(tenantId, body) { - return this.giftService.createGift(this.getTenantId(tenantId), body); - } - getGift(tenantId, id) { - return this.giftService.getGiftById(this.getTenantId(tenantId), id); - } - createContribution(tenantId, id, body) { - return this.giftService.createContribution(this.getTenantId(tenantId), { - ...body, - giftId: id, - }); - } - listContributions(tenantId, id) { - return this.giftService.listContributions(this.getTenantId(tenantId), id); - } -}; -exports.AdminController = AdminController; -__decorate([ - (0, common_1.Get)('modules'), - __metadata("design:type", Function), - __metadata("design:paramtypes", []), - __metadata("design:returntype", void 0) -], AdminController.prototype, "getModules", null); -__decorate([ - (0, common_1.Get)('guest'), - __param(0, (0, common_1.Query)('tenantId')), - __metadata("design:type", Function), - __metadata("design:paramtypes", [String]), - __metadata("design:returntype", void 0) -], AdminController.prototype, "listGuests", null); -__decorate([ - (0, common_1.Post)('guest'), - __param(0, (0, common_1.Query)('tenantId')), - __param(1, (0, common_1.Body)()), - __metadata("design:type", Function), - __metadata("design:paramtypes", [String, Object]), - __metadata("design:returntype", void 0) -], AdminController.prototype, "createGuest", null); -__decorate([ - (0, common_1.Patch)('guest/:id/rsvp'), - __param(0, (0, common_1.Query)('tenantId')), - __param(1, (0, common_1.Param)('id')), - __param(2, (0, common_1.Body)()), - __metadata("design:type", Function), - __metadata("design:paramtypes", [String, String, Object]), - __metadata("design:returntype", void 0) -], AdminController.prototype, "updateGuestRsvp", null); -__decorate([ - (0, common_1.Get)('todo'), - __param(0, (0, common_1.Query)('tenantId')), - __metadata("design:type", Function), - __metadata("design:paramtypes", [String]), - __metadata("design:returntype", void 0) -], AdminController.prototype, "listTodos", null); -__decorate([ - (0, common_1.Post)('todo'), - __param(0, (0, common_1.Query)('tenantId')), - __param(1, (0, common_1.Body)()), - __metadata("design:type", Function), - __metadata("design:paramtypes", [String, Object]), - __metadata("design:returntype", void 0) -], AdminController.prototype, "createTodo", null); -__decorate([ - (0, common_1.Patch)('todo/:id/complete'), - __param(0, (0, common_1.Query)('tenantId')), - __param(1, (0, common_1.Param)('id')), - __metadata("design:type", Function), - __metadata("design:paramtypes", [String, String]), - __metadata("design:returntype", void 0) -], AdminController.prototype, "completeTodo", null); -__decorate([ - (0, common_1.Get)('gift'), - __param(0, (0, common_1.Query)('tenantId')), - __metadata("design:type", Function), - __metadata("design:paramtypes", [String]), - __metadata("design:returntype", void 0) -], AdminController.prototype, "listGifts", null); -__decorate([ - (0, common_1.Post)('gift'), - __param(0, (0, common_1.Query)('tenantId')), - __param(1, (0, common_1.Body)()), - __metadata("design:type", Function), - __metadata("design:paramtypes", [String, Object]), - __metadata("design:returntype", void 0) -], AdminController.prototype, "createGift", null); -__decorate([ - (0, common_1.Get)('gift/:id'), - __param(0, (0, common_1.Query)('tenantId')), - __param(1, (0, common_1.Param)('id')), - __metadata("design:type", Function), - __metadata("design:paramtypes", [String, String]), - __metadata("design:returntype", void 0) -], AdminController.prototype, "getGift", null); -__decorate([ - (0, common_1.Post)('gift/:id/contribution'), - __param(0, (0, common_1.Query)('tenantId')), - __param(1, (0, common_1.Param)('id')), - __param(2, (0, common_1.Body)()), - __metadata("design:type", Function), - __metadata("design:paramtypes", [String, String, Object]), - __metadata("design:returntype", void 0) -], AdminController.prototype, "createContribution", null); -__decorate([ - (0, common_1.Get)('gift/:id/contributions'), - __param(0, (0, common_1.Query)('tenantId')), - __param(1, (0, common_1.Param)('id')), - __metadata("design:type", Function), - __metadata("design:paramtypes", [String, String]), - __metadata("design:returntype", void 0) -], AdminController.prototype, "listContributions", null); -exports.AdminController = AdminController = __decorate([ - (0, common_1.Controller)('admin'), - __metadata("design:paramtypes", [module_registry_service_1.ModuleRegistryService, - guest_service_1.GuestService, - gift_service_1.GiftService, - todo_service_1.TodoService]) -], AdminController); diff --git a/dist/admin/admin.module.d.ts b/dist/admin/admin.module.d.ts deleted file mode 100644 index 0614002..0000000 --- a/dist/admin/admin.module.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export declare class AdminModule { -} -//# sourceMappingURL=admin.module.d.ts.map \ No newline at end of file diff --git a/dist/admin/admin.module.d.ts.map b/dist/admin/admin.module.d.ts.map deleted file mode 100644 index 52ee647..0000000 --- a/dist/admin/admin.module.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"admin.module.d.ts","sourceRoot":"","sources":["../../src/admin/admin.module.ts"],"names":[],"mappings":"AAOA,qBAIa,WAAW;CAAG"} \ No newline at end of file diff --git a/dist/admin/admin.module.js b/dist/admin/admin.module.js deleted file mode 100644 index e89a639..0000000 --- a/dist/admin/admin.module.js +++ /dev/null @@ -1,24 +0,0 @@ -"use strict"; -var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.AdminModule = void 0; -const common_1 = require("@nestjs/common"); -const core_module_1 = require("../core/core.module"); -const gift_module_1 = require("../gift/gift.module"); -const guest_module_1 = require("../guest/guest.module"); -const todo_module_1 = require("../todo/todo.module"); -const admin_controller_1 = require("./admin.controller"); -let AdminModule = class AdminModule { -}; -exports.AdminModule = AdminModule; -exports.AdminModule = AdminModule = __decorate([ - (0, common_1.Module)({ - imports: [core_module_1.CoreModule, gift_module_1.GiftModule, guest_module_1.GuestModule, todo_module_1.TodoModule], - controllers: [admin_controller_1.AdminController], - }) -], AdminModule); diff --git a/dist/app.module.d.ts b/dist/app.module.d.ts deleted file mode 100644 index 9e8a304..0000000 --- a/dist/app.module.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export declare class AppModule { -} -//# sourceMappingURL=app.module.d.ts.map \ No newline at end of file diff --git a/dist/app.module.d.ts.map b/dist/app.module.d.ts.map deleted file mode 100644 index 2e07e04..0000000 --- a/dist/app.module.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"app.module.d.ts","sourceRoot":"","sources":["../src/app.module.ts"],"names":[],"mappings":"AASA,qBAiBa,SAAS;CAAG"} \ No newline at end of file diff --git a/dist/app.module.js b/dist/app.module.js deleted file mode 100644 index 550553b..0000000 --- a/dist/app.module.js +++ /dev/null @@ -1,39 +0,0 @@ -"use strict"; -var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.AppModule = void 0; -const common_1 = require("@nestjs/common"); -const serve_static_1 = require("@nestjs/serve-static"); -const path_1 = require("path"); -const core_module_1 = require("./core/core.module"); -const gift_module_1 = require("./gift/gift.module"); -const guest_module_1 = require("./guest/guest.module"); -const todo_module_1 = require("./todo/todo.module"); -const admin_module_1 = require("./admin/admin.module"); -let AppModule = class AppModule { -}; -exports.AppModule = AppModule; -exports.AppModule = AppModule = __decorate([ - (0, common_1.Module)({ - imports: [ - serve_static_1.ServeStaticModule.forRoot({ - rootPath: (0, path_1.join)(__dirname, '..', 'public'), - serveRoot: '/admin', - exclude: ['/admin/modules'], - serveStaticOptions: { - index: 'admin.html', - }, - }), - core_module_1.CoreModule, - gift_module_1.GiftModule, - guest_module_1.GuestModule, - todo_module_1.TodoModule, - admin_module_1.AdminModule, - ], - }) -], AppModule); diff --git a/dist/core/api/auth.controller.d.ts b/dist/core/api/auth.controller.d.ts deleted file mode 100644 index d23410e..0000000 --- a/dist/core/api/auth.controller.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { TokenService } from '../services/token.service'; -export declare class AuthController { - private readonly tokenService; - constructor(tokenService: TokenService); - createToken(body: { - name?: string; - expiresInHours?: number; - }): import("../entities/token.entity").AuthToken; -} -//# sourceMappingURL=auth.controller.d.ts.map \ No newline at end of file diff --git a/dist/core/api/auth.controller.d.ts.map b/dist/core/api/auth.controller.d.ts.map deleted file mode 100644 index 8096609..0000000 --- a/dist/core/api/auth.controller.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"auth.controller.d.ts","sourceRoot":"","sources":["../../../src/core/api/auth.controller.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,qBACa,cAAc;IACb,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAAZ,YAAY,EAAE,YAAY;IAGvD,WAAW,CAAS,IAAI,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE;CAGrE"} \ No newline at end of file diff --git a/dist/core/api/auth.controller.js b/dist/core/api/auth.controller.js deleted file mode 100644 index 4f6ddd0..0000000 --- a/dist/core/api/auth.controller.js +++ /dev/null @@ -1,37 +0,0 @@ -"use strict"; -var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (this && this.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; -var __param = (this && this.__param) || function (paramIndex, decorator) { - return function (target, key) { decorator(target, key, paramIndex); } -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.AuthController = void 0; -const common_1 = require("@nestjs/common"); -const token_service_1 = require("../services/token.service"); -let AuthController = class AuthController { - constructor(tokenService) { - this.tokenService = tokenService; - } - createToken(body) { - return this.tokenService.createToken(body.name, body.expiresInHours); - } -}; -exports.AuthController = AuthController; -__decorate([ - (0, common_1.Post)('token'), - __param(0, (0, common_1.Body)()), - __metadata("design:type", Function), - __metadata("design:paramtypes", [Object]), - __metadata("design:returntype", void 0) -], AuthController.prototype, "createToken", null); -exports.AuthController = AuthController = __decorate([ - (0, common_1.Controller)('auth'), - __metadata("design:paramtypes", [token_service_1.TokenService]) -], AuthController); diff --git a/dist/core/auth.guard.d.ts b/dist/core/auth.guard.d.ts deleted file mode 100644 index 3c86788..0000000 --- a/dist/core/auth.guard.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { CanActivate, ExecutionContext } from '@nestjs/common'; -import { AuthService } from './services/auth.service'; -export declare class AuthGuard implements CanActivate { - private readonly authService; - constructor(authService: AuthService); - canActivate(context: ExecutionContext): boolean; -} -//# sourceMappingURL=auth.guard.d.ts.map \ No newline at end of file diff --git a/dist/core/auth.guard.d.ts.map b/dist/core/auth.guard.d.ts.map deleted file mode 100644 index 0c890a9..0000000 --- a/dist/core/auth.guard.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"auth.guard.d.ts","sourceRoot":"","sources":["../../src/core/auth.guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAqC,MAAM,gBAAgB,CAAC;AAClG,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,qBACa,SAAU,YAAW,WAAW;IAC/B,OAAO,CAAC,QAAQ,CAAC,WAAW;gBAAX,WAAW,EAAE,WAAW;IAErD,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO;CAuBhD"} \ No newline at end of file diff --git a/dist/core/auth.guard.js b/dist/core/auth.guard.js deleted file mode 100644 index 1d5ce45..0000000 --- a/dist/core/auth.guard.js +++ /dev/null @@ -1,43 +0,0 @@ -"use strict"; -var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (this && this.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.AuthGuard = void 0; -const common_1 = require("@nestjs/common"); -const auth_service_1 = require("./services/auth.service"); -let AuthGuard = class AuthGuard { - constructor(authService) { - this.authService = authService; - } - canActivate(context) { - const request = context.switchToHttp().getRequest(); - // Allow the admin UI endpoints to be accessed without authentication. - // The UI is served from /admin and calls /api/admin/modules. - if (request.method === 'GET' && request.url?.startsWith('/api/admin')) { - return true; - } - const authHeader = request.headers['authorization'] || ''; - const token = Array.isArray(authHeader) ? authHeader[0] : authHeader; - if (!token) { - throw new common_1.UnauthorizedException(); - } - const payload = this.authService.verify(token.replace(/^Bearer\s+/i, '')); - if (!payload) { - throw new common_1.UnauthorizedException(); - } - request.user = payload; - return true; - } -}; -exports.AuthGuard = AuthGuard; -exports.AuthGuard = AuthGuard = __decorate([ - (0, common_1.Injectable)(), - __metadata("design:paramtypes", [auth_service_1.AuthService]) -], AuthGuard); diff --git a/dist/core/auth.module.d.ts b/dist/core/auth.module.d.ts deleted file mode 100644 index ae9b0bb..0000000 --- a/dist/core/auth.module.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export declare class AuthModule { -} -//# sourceMappingURL=auth.module.d.ts.map \ No newline at end of file diff --git a/dist/core/auth.module.d.ts.map b/dist/core/auth.module.d.ts.map deleted file mode 100644 index a9b5e83..0000000 --- a/dist/core/auth.module.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"auth.module.d.ts","sourceRoot":"","sources":["../../src/core/auth.module.ts"],"names":[],"mappings":"AAKA,qBAIa,UAAU;CAAG"} \ No newline at end of file diff --git a/dist/core/auth.module.js b/dist/core/auth.module.js deleted file mode 100644 index 3ef4bf6..0000000 --- a/dist/core/auth.module.js +++ /dev/null @@ -1,22 +0,0 @@ -"use strict"; -var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.AuthModule = void 0; -const common_1 = require("@nestjs/common"); -const auth_service_1 = require("./services/auth.service"); -const token_service_1 = require("./services/token.service"); -const auth_guard_1 = require("./auth.guard"); -let AuthModule = class AuthModule { -}; -exports.AuthModule = AuthModule; -exports.AuthModule = AuthModule = __decorate([ - (0, common_1.Module)({ - providers: [auth_service_1.AuthService, token_service_1.TokenService, auth_guard_1.AuthGuard], - exports: [auth_service_1.AuthService, token_service_1.TokenService, auth_guard_1.AuthGuard], - }) -], AuthModule); diff --git a/dist/core/core.module.d.ts b/dist/core/core.module.d.ts deleted file mode 100644 index fb859ff..0000000 --- a/dist/core/core.module.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export declare class CoreModule { -} -//# sourceMappingURL=core.module.d.ts.map \ No newline at end of file diff --git a/dist/core/core.module.d.ts.map b/dist/core/core.module.d.ts.map deleted file mode 100644 index d42d2e9..0000000 --- a/dist/core/core.module.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"core.module.d.ts","sourceRoot":"","sources":["../../src/core/core.module.ts"],"names":[],"mappings":"AAWA,qBAoCa,UAAU;CAAG"} \ No newline at end of file diff --git a/dist/core/core.module.js b/dist/core/core.module.js deleted file mode 100644 index 2986f29..0000000 --- a/dist/core/core.module.js +++ /dev/null @@ -1,60 +0,0 @@ -"use strict"; -var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.CoreModule = void 0; -const common_1 = require("@nestjs/common"); -const event_emitter_1 = require("@nestjs/event-emitter"); -const nestjs_1 = require("@mikro-orm/nestjs"); -const auth_module_1 = require("./auth.module"); -const module_linker_service_1 = require("./services/module-linker.service"); -const notification_service_1 = require("./services/notification.service"); -const notification_rule_service_1 = require("./services/notification-rule.service"); -const module_registry_service_1 = require("./services/module-registry.service"); -const auth_controller_1 = require("./api/auth.controller"); -const notification_rule_entity_1 = require("./entities/notification-rule.entity"); -let CoreModule = class CoreModule { -}; -exports.CoreModule = CoreModule; -exports.CoreModule = CoreModule = __decorate([ - (0, common_1.Module)({ - imports: [ - event_emitter_1.EventEmitterModule.forRoot(), - nestjs_1.MikroOrmModule.forRoot({ - driver: (require('@mikro-orm/postgresql').PostgreSqlDriver), - host: process.env.DB_HOST || 'localhost', - port: Number(process.env.DB_PORT) || 5432, - user: process.env.DB_USER || 'postgres', - password: process.env.DB_PASSWORD || 'postgres', - dbName: process.env.DB_NAME || 'planner', - autoLoadEntities: true, - migrations: { - path: 'dist/migrations', - transactional: true, - emit: 'js', - }, - }), - auth_module_1.AuthModule, - nestjs_1.MikroOrmModule.forFeature([notification_rule_entity_1.NotificationRuleSchema]), - ], - providers: [ - module_linker_service_1.ModuleLinkerService, - notification_service_1.NotificationService, - notification_rule_service_1.NotificationRuleService, - module_registry_service_1.ModuleRegistryService, - ], - controllers: [auth_controller_1.AuthController], - exports: [ - event_emitter_1.EventEmitterModule, - auth_module_1.AuthModule, - module_linker_service_1.ModuleLinkerService, - notification_service_1.NotificationService, - notification_rule_service_1.NotificationRuleService, - module_registry_service_1.ModuleRegistryService, - ], - }) -], CoreModule); diff --git a/dist/core/database.module.d.ts b/dist/core/database.module.d.ts deleted file mode 100644 index 235eda5..0000000 --- a/dist/core/database.module.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export declare class DatabaseModule { -} -//# sourceMappingURL=database.module.d.ts.map \ No newline at end of file diff --git a/dist/core/database.module.d.ts.map b/dist/core/database.module.d.ts.map deleted file mode 100644 index 6b669a9..0000000 --- a/dist/core/database.module.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"database.module.d.ts","sourceRoot":"","sources":["../../src/core/database.module.ts"],"names":[],"mappings":"AAIA,qBAqBa,cAAc;CAAG"} \ No newline at end of file diff --git a/dist/core/database.module.js b/dist/core/database.module.js deleted file mode 100644 index bc9908b..0000000 --- a/dist/core/database.module.js +++ /dev/null @@ -1,38 +0,0 @@ -"use strict"; -var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.DatabaseModule = void 0; -const common_1 = require("@nestjs/common"); -const nestjs_1 = require("@mikro-orm/nestjs"); -const postgresql_1 = require("@mikro-orm/postgresql"); -let DatabaseModule = class DatabaseModule { -}; -exports.DatabaseModule = DatabaseModule; -exports.DatabaseModule = DatabaseModule = __decorate([ - (0, common_1.Module)({ - imports: [ - nestjs_1.MikroOrmModule.forRoot({ - driver: postgresql_1.PostgreSqlDriver, - host: process.env.DB_HOST || 'localhost', - port: Number(process.env.DB_PORT) || 5432, - user: process.env.DB_USER || 'postgres', - password: process.env.DB_PASSWORD || 'postgres', - dbName: process.env.DB_NAME || 'planner', - autoLoadEntities: true, - entities: ['./dist/**/*.entity.js'], - entitiesTs: ['./src/**/*.entity.ts'], - migrations: { - path: 'dist/migrations', - transactional: true, - emit: 'js', - }, - }), - ], - exports: [nestjs_1.MikroOrmModule], - }) -], DatabaseModule); diff --git a/dist/core/entities/base.entity.d.ts b/dist/core/entities/base.entity.d.ts deleted file mode 100644 index f596206..0000000 --- a/dist/core/entities/base.entity.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -export declare abstract class BaseEntity { - id: string; - tenantId: string; - metadata?: Record; - createdAt: Date; - updatedAt: Date; -} -//# sourceMappingURL=base.entity.d.ts.map \ No newline at end of file diff --git a/dist/core/entities/base.entity.d.ts.map b/dist/core/entities/base.entity.d.ts.map deleted file mode 100644 index 3a2de37..0000000 --- a/dist/core/entities/base.entity.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"base.entity.d.ts","sourceRoot":"","sources":["../../../src/core/entities/base.entity.ts"],"names":[],"mappings":"AAEA,8BAAsB,UAAU;IAC9B,EAAE,EAAE,MAAM,CAAY;IACtB,QAAQ,EAAG,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/B,SAAS,EAAE,IAAI,CAAc;IAC7B,SAAS,EAAE,IAAI,CAAc;CAC9B"} \ No newline at end of file diff --git a/dist/core/entities/base.entity.js b/dist/core/entities/base.entity.js deleted file mode 100644 index a114823..0000000 --- a/dist/core/entities/base.entity.js +++ /dev/null @@ -1,12 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.BaseEntity = void 0; -const uuid_1 = require("uuid"); -class BaseEntity { - constructor() { - this.id = (0, uuid_1.v4)(); - this.createdAt = new Date(); - this.updatedAt = new Date(); - } -} -exports.BaseEntity = BaseEntity; diff --git a/dist/core/entities/notification-rule.entity.d.ts b/dist/core/entities/notification-rule.entity.d.ts deleted file mode 100644 index 0f95fe3..0000000 --- a/dist/core/entities/notification-rule.entity.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { EntitySchema } from '@mikro-orm/core'; -import { BaseEntity } from './base.entity'; -export declare class NotificationRule extends BaseEntity { - module: string; - event: string; - channels: Array<'email' | 'whatsapp' | 'sms' | 'custom'>; - conditions?: Record; -} -export declare const NotificationRuleSchema: EntitySchema>; -//# sourceMappingURL=notification-rule.entity.d.ts.map \ No newline at end of file diff --git a/dist/core/entities/notification-rule.entity.d.ts.map b/dist/core/entities/notification-rule.entity.d.ts.map deleted file mode 100644 index 810a993..0000000 --- a/dist/core/entities/notification-rule.entity.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"notification-rule.entity.d.ts","sourceRoot":"","sources":["../../../src/core/entities/notification-rule.entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,qBAAa,gBAAiB,SAAQ,UAAU;IAC9C,MAAM,EAAG,MAAM,CAAC;IAEhB,KAAK,EAAG,MAAM,CAAC;IAEf,QAAQ,EAAG,KAAK,CAAC,OAAO,GAAG,UAAU,GAAG,KAAK,GAAG,QAAQ,CAAC,CAAC;IAE1D,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAClC;AAED,eAAO,MAAM,sBAAsB,+FAejC,CAAC"} \ No newline at end of file diff --git a/dist/core/entities/notification-rule.entity.js b/dist/core/entities/notification-rule.entity.js deleted file mode 100644 index a97cc0a..0000000 --- a/dist/core/entities/notification-rule.entity.js +++ /dev/null @@ -1,23 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.NotificationRuleSchema = exports.NotificationRule = void 0; -const core_1 = require("@mikro-orm/core"); -const base_entity_1 = require("./base.entity"); -class NotificationRule extends base_entity_1.BaseEntity { -} -exports.NotificationRule = NotificationRule; -exports.NotificationRuleSchema = new core_1.EntitySchema({ - class: NotificationRule, - tableName: 'notification_rules', - properties: { - id: { primary: true, type: 'uuid', defaultRaw: 'uuid_generate_v4()' }, - tenantId: { type: 'string' }, - metadata: { type: 'json', nullable: true }, - createdAt: { type: 'date', defaultRaw: 'now()' }, - updatedAt: { type: 'date', defaultRaw: 'now()' }, - module: { type: 'string' }, - event: { type: 'string' }, - channels: { type: 'json' }, - conditions: { type: 'json', nullable: true }, - }, -}); diff --git a/dist/core/entities/token.entity.d.ts b/dist/core/entities/token.entity.d.ts deleted file mode 100644 index dc52cd9..0000000 --- a/dist/core/entities/token.entity.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { EntitySchema } from '@mikro-orm/core'; -export declare class AuthToken { - id: string; - tenantId: string; - token: string; - name?: string; - expiresAt?: Date; - metadata?: Record; - createdAt: Date; - updatedAt: Date; -} -export declare const AuthTokenSchema: EntitySchema>; -//# sourceMappingURL=token.entity.d.ts.map \ No newline at end of file diff --git a/dist/core/entities/token.entity.d.ts.map b/dist/core/entities/token.entity.d.ts.map deleted file mode 100644 index 12257d1..0000000 --- a/dist/core/entities/token.entity.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"token.entity.d.ts","sourceRoot":"","sources":["../../../src/core/entities/token.entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,qBAAa,SAAS;IACpB,EAAE,EAAG,MAAM,CAAC;IACZ,QAAQ,EAAG,MAAM,CAAC;IAClB,KAAK,EAAG,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/B,SAAS,EAAG,IAAI,CAAC;IACjB,SAAS,EAAG,IAAI,CAAC;CAClB;AAED,eAAO,MAAM,eAAe,iFAwC1B,CAAC"} \ No newline at end of file diff --git a/dist/core/entities/token.entity.js b/dist/core/entities/token.entity.js deleted file mode 100644 index 26bd908..0000000 --- a/dist/core/entities/token.entity.js +++ /dev/null @@ -1,48 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.AuthTokenSchema = exports.AuthToken = void 0; -const core_1 = require("@mikro-orm/core"); -class AuthToken { -} -exports.AuthToken = AuthToken; -exports.AuthTokenSchema = new core_1.EntitySchema({ - class: AuthToken, - tableName: 'auth_tokens', - properties: { - id: { - primary: true, - type: 'uuid', - default: 'uuid_generate_v4()', - }, - tenantId: { - type: 'string', - nullable: false, - }, - token: { - type: 'string', - nullable: false, - }, - name: { - type: 'string', - nullable: true, - }, - expiresAt: { - type: 'date', - nullable: true, - }, - metadata: { - type: 'json', - nullable: true, - }, - createdAt: { - type: 'date', - nullable: false, - defaultRaw: 'now()', - }, - updatedAt: { - type: 'date', - nullable: false, - defaultRaw: 'now()', - }, - }, -}); diff --git a/dist/core/services/auth.service.d.ts b/dist/core/services/auth.service.d.ts deleted file mode 100644 index 3ca0db7..0000000 --- a/dist/core/services/auth.service.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -export declare class AuthService { - private readonly jwtSecret; - sign(payload: Record, expiresIn?: string): string; - verify(token: string): Record | null; -} -//# sourceMappingURL=auth.service.d.ts.map \ No newline at end of file diff --git a/dist/core/services/auth.service.d.ts.map b/dist/core/services/auth.service.d.ts.map deleted file mode 100644 index 881d366..0000000 --- a/dist/core/services/auth.service.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"auth.service.d.ts","sourceRoot":"","sources":["../../../src/core/services/auth.service.ts"],"names":[],"mappings":"AAGA,qBACa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA0D;IAEpF,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,SAAS,SAAO,GAAG,MAAM;IAI5D,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;CAQlD"} \ No newline at end of file diff --git a/dist/core/services/auth.service.js b/dist/core/services/auth.service.js deleted file mode 100644 index f45b1e8..0000000 --- a/dist/core/services/auth.service.js +++ /dev/null @@ -1,65 +0,0 @@ -"use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __importStar = (this && this.__importStar) || (function () { - var ownKeys = function(o) { - ownKeys = Object.getOwnPropertyNames || function (o) { - var ar = []; - for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; - return ar; - }; - return ownKeys(o); - }; - return function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); - __setModuleDefault(result, mod); - return result; - }; -})(); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.AuthService = void 0; -const common_1 = require("@nestjs/common"); -const jwt = __importStar(require("jsonwebtoken")); -let AuthService = class AuthService { - constructor() { - this.jwtSecret = process.env.JWT_SECRET || 'default_secret'; - } - sign(payload, expiresIn = '1d') { - return jwt.sign(payload, this.jwtSecret, { expiresIn }); - } - verify(token) { - try { - const decoded = jwt.verify(token, this.jwtSecret); - return typeof decoded === 'string' ? { sub: decoded } : decoded; - } - catch { - return null; - } - } -}; -exports.AuthService = AuthService; -exports.AuthService = AuthService = __decorate([ - (0, common_1.Injectable)() -], AuthService); diff --git a/dist/core/services/module-linker.service.d.ts b/dist/core/services/module-linker.service.d.ts deleted file mode 100644 index bcbf1cf..0000000 --- a/dist/core/services/module-linker.service.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -export declare class ModuleLinkerService { - /** - * Hydrates data from multiple modules by IDs for frontend consumption. - * @param links Array of objects with moduleName and id - */ - hydrate(links: Array<{ - moduleName: string; - id: string; - }>): Promise; -} -//# sourceMappingURL=module-linker.service.d.ts.map \ No newline at end of file diff --git a/dist/core/services/module-linker.service.d.ts.map b/dist/core/services/module-linker.service.d.ts.map deleted file mode 100644 index 59afd18..0000000 --- a/dist/core/services/module-linker.service.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"module-linker.service.d.ts","sourceRoot":"","sources":["../../../src/core/services/module-linker.service.ts"],"names":[],"mappings":"AAEA,qBACa,mBAAmB;IAC9B;;;OAGG;IACG,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;CAKhF"} \ No newline at end of file diff --git a/dist/core/services/module-linker.service.js b/dist/core/services/module-linker.service.js deleted file mode 100644 index f4ab248..0000000 --- a/dist/core/services/module-linker.service.js +++ /dev/null @@ -1,25 +0,0 @@ -"use strict"; -var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.ModuleLinkerService = void 0; -const common_1 = require("@nestjs/common"); -let ModuleLinkerService = class ModuleLinkerService { - /** - * Hydrates data from multiple modules by IDs for frontend consumption. - * @param links Array of objects with moduleName and id - */ - async hydrate(links) { - // Implement hydration logic here, e.g. fetch from APIs or repositories - // ...existing code... - return []; - } -}; -exports.ModuleLinkerService = ModuleLinkerService; -exports.ModuleLinkerService = ModuleLinkerService = __decorate([ - (0, common_1.Injectable)() -], ModuleLinkerService); diff --git a/dist/core/services/module-registry.service.d.ts b/dist/core/services/module-registry.service.d.ts deleted file mode 100644 index 4cb6cb0..0000000 --- a/dist/core/services/module-registry.service.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -export type AdminModuleInfo = { - key: string; - name: string; - description?: string; - routePrefix?: string; - version?: string; -}; -export declare class ModuleRegistryService { - private modules; - registerModule(info: AdminModuleInfo): void; - getModules(): AdminModuleInfo[]; -} -//# sourceMappingURL=module-registry.service.d.ts.map \ No newline at end of file diff --git a/dist/core/services/module-registry.service.d.ts.map b/dist/core/services/module-registry.service.d.ts.map deleted file mode 100644 index 8a777f9..0000000 --- a/dist/core/services/module-registry.service.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"module-registry.service.d.ts","sourceRoot":"","sources":["../../../src/core/services/module-registry.service.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,eAAe,GAAG;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,qBACa,qBAAqB;IAChC,OAAO,CAAC,OAAO,CAAyB;IAExC,cAAc,CAAC,IAAI,EAAE,eAAe;IAMpC,UAAU,IAAI,eAAe,EAAE;CAGhC"} \ No newline at end of file diff --git a/dist/core/services/module-registry.service.js b/dist/core/services/module-registry.service.js deleted file mode 100644 index aa71892..0000000 --- a/dist/core/services/module-registry.service.js +++ /dev/null @@ -1,27 +0,0 @@ -"use strict"; -var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.ModuleRegistryService = void 0; -const common_1 = require("@nestjs/common"); -let ModuleRegistryService = class ModuleRegistryService { - constructor() { - this.modules = []; - } - registerModule(info) { - if (!this.modules.find((m) => m.key === info.key)) { - this.modules.push(info); - } - } - getModules() { - return [...this.modules]; - } -}; -exports.ModuleRegistryService = ModuleRegistryService; -exports.ModuleRegistryService = ModuleRegistryService = __decorate([ - (0, common_1.Injectable)() -], ModuleRegistryService); diff --git a/dist/core/services/notification-provider.interface.d.ts b/dist/core/services/notification-provider.interface.d.ts deleted file mode 100644 index 2eb257c..0000000 --- a/dist/core/services/notification-provider.interface.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -export interface NotificationProvider { - send(options: { - to: string; - subject: string; - body: string; - metadata?: any; - }): Promise; -} -export type NotificationChannel = 'email' | 'whatsapp' | 'sms' | 'custom'; -//# sourceMappingURL=notification-provider.interface.d.ts.map \ No newline at end of file diff --git a/dist/core/services/notification-provider.interface.d.ts.map b/dist/core/services/notification-provider.interface.d.ts.map deleted file mode 100644 index b55e3c9..0000000 --- a/dist/core/services/notification-provider.interface.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"notification-provider.interface.d.ts","sourceRoot":"","sources":["../../../src/core/services/notification-provider.interface.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,GAAG,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7F;AAED,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,UAAU,GAAG,KAAK,GAAG,QAAQ,CAAC"} \ No newline at end of file diff --git a/dist/core/services/notification-provider.interface.js b/dist/core/services/notification-provider.interface.js deleted file mode 100644 index c8ad2e5..0000000 --- a/dist/core/services/notification-provider.interface.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/dist/core/services/notification-rule.service.d.ts b/dist/core/services/notification-rule.service.d.ts deleted file mode 100644 index b1100c3..0000000 --- a/dist/core/services/notification-rule.service.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { MikroORM } from '@mikro-orm/core'; -import { NotificationRule } from '../entities/notification-rule.entity'; -export declare class NotificationRuleService { - private readonly orm; - constructor(orm: MikroORM); - private get em(); - getRulesForEvent(tenantId: string, module: string, event: string): Promise; - createRule(tenantId: string, rule: Partial): Promise; -} -//# sourceMappingURL=notification-rule.service.d.ts.map \ No newline at end of file diff --git a/dist/core/services/notification-rule.service.d.ts.map b/dist/core/services/notification-rule.service.d.ts.map deleted file mode 100644 index 9483d63..0000000 --- a/dist/core/services/notification-rule.service.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"notification-rule.service.d.ts","sourceRoot":"","sources":["../../../src/core/services/notification-rule.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAExE,qBACa,uBAAuB;IACtB,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAAH,GAAG,EAAE,QAAQ;IAE1C,OAAO,KAAK,EAAE,GAEb;IAEK,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAI9F,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAS/F"} \ No newline at end of file diff --git a/dist/core/services/notification-rule.service.js b/dist/core/services/notification-rule.service.js deleted file mode 100644 index 1b55013..0000000 --- a/dist/core/services/notification-rule.service.js +++ /dev/null @@ -1,40 +0,0 @@ -"use strict"; -var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (this && this.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.NotificationRuleService = void 0; -const common_1 = require("@nestjs/common"); -const core_1 = require("@mikro-orm/core"); -const notification_rule_entity_1 = require("../entities/notification-rule.entity"); -let NotificationRuleService = class NotificationRuleService { - constructor(orm) { - this.orm = orm; - } - get em() { - return this.orm.em.fork(); - } - async getRulesForEvent(tenantId, module, event) { - return this.em.find(notification_rule_entity_1.NotificationRule, { tenantId, module, event }); - } - async createRule(tenantId, rule) { - const entity = this.em.create(notification_rule_entity_1.NotificationRule, { - tenantId, - ...rule, - }); - this.em.persist(entity); - await this.em.flush(); - return entity; - } -}; -exports.NotificationRuleService = NotificationRuleService; -exports.NotificationRuleService = NotificationRuleService = __decorate([ - (0, common_1.Injectable)(), - __metadata("design:paramtypes", [core_1.MikroORM]) -], NotificationRuleService); diff --git a/dist/core/services/notification.service.d.ts b/dist/core/services/notification.service.d.ts deleted file mode 100644 index 8b4254b..0000000 --- a/dist/core/services/notification.service.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { NotificationProvider, NotificationChannel } from './notification-provider.interface'; -export declare class NotificationService { - private providers; - constructor(); - registerProvider(channel: NotificationChannel, provider: NotificationProvider): void; - send(channel: NotificationChannel, to: string, subject: string, body: string, metadata?: any): Promise; -} -//# sourceMappingURL=notification.service.d.ts.map \ No newline at end of file diff --git a/dist/core/services/notification.service.d.ts.map b/dist/core/services/notification.service.d.ts.map deleted file mode 100644 index 4e0dacd..0000000 --- a/dist/core/services/notification.service.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"notification.service.d.ts","sourceRoot":"","sources":["../../../src/core/services/notification.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAI9F,qBACa,mBAAmB;IAC9B,OAAO,CAAC,SAAS,CAAgE;;IAQjF,gBAAgB,CAAC,OAAO,EAAE,mBAAmB,EAAE,QAAQ,EAAE,oBAAoB;IAIvE,IAAI,CACR,OAAO,EAAE,mBAAmB,EAC5B,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,GAAG;CAQjB"} \ No newline at end of file diff --git a/dist/core/services/notification.service.js b/dist/core/services/notification.service.js deleted file mode 100644 index 91ec466..0000000 --- a/dist/core/services/notification.service.js +++ /dev/null @@ -1,38 +0,0 @@ -"use strict"; -var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (this && this.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.NotificationService = void 0; -const common_1 = require("@nestjs/common"); -const email_provider_1 = require("./providers/email.provider"); -const whatsapp_provider_1 = require("./providers/whatsapp.provider"); -let NotificationService = class NotificationService { - constructor() { - this.providers = {}; - // Registramos proveedores por defecto (puede reemplazarse desde el código de inicialización) - this.registerProvider('email', new email_provider_1.EmailProvider()); - this.registerProvider('whatsapp', new whatsapp_provider_1.WhatsappProvider()); - } - registerProvider(channel, provider) { - this.providers[channel] = provider; - } - async send(channel, to, subject, body, metadata) { - const provider = this.providers[channel]; - if (!provider) { - throw new Error(`No provider registered for channel ${channel}`); - } - await provider.send({ to, subject, body, metadata }); - } -}; -exports.NotificationService = NotificationService; -exports.NotificationService = NotificationService = __decorate([ - (0, common_1.Injectable)(), - __metadata("design:paramtypes", []) -], NotificationService); diff --git a/dist/core/services/providers/email.provider.d.ts b/dist/core/services/providers/email.provider.d.ts deleted file mode 100644 index 1bd41f4..0000000 --- a/dist/core/services/providers/email.provider.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { NotificationProvider } from '../notification-provider.interface'; -export declare class EmailProvider implements NotificationProvider { - send(options: { - to: string; - subject: string; - body: string; - metadata?: any; - }): Promise; -} -//# sourceMappingURL=email.provider.d.ts.map \ No newline at end of file diff --git a/dist/core/services/providers/email.provider.d.ts.map b/dist/core/services/providers/email.provider.d.ts.map deleted file mode 100644 index b4b4433..0000000 --- a/dist/core/services/providers/email.provider.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"email.provider.d.ts","sourceRoot":"","sources":["../../../../src/core/services/providers/email.provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAE1E,qBAAa,aAAc,YAAW,oBAAoB;IAClD,IAAI,CAAC,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,GAAG,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAKlG"} \ No newline at end of file diff --git a/dist/core/services/providers/email.provider.js b/dist/core/services/providers/email.provider.js deleted file mode 100644 index 0fe1ea1..0000000 --- a/dist/core/services/providers/email.provider.js +++ /dev/null @@ -1,11 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.EmailProvider = void 0; -class EmailProvider { - async send(options) { - // Implementación concreta que use un servicio como Resend, Mailgun o similar. - // ...existing code... - console.log('[EmailProvider] Sending email to', options.to); - } -} -exports.EmailProvider = EmailProvider; diff --git a/dist/core/services/providers/whatsapp.provider.d.ts b/dist/core/services/providers/whatsapp.provider.d.ts deleted file mode 100644 index 380c2e3..0000000 --- a/dist/core/services/providers/whatsapp.provider.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { NotificationProvider } from '../notification-provider.interface'; -export declare class WhatsappProvider implements NotificationProvider { - send(options: { - to: string; - subject: string; - body: string; - metadata?: any; - }): Promise; -} -//# sourceMappingURL=whatsapp.provider.d.ts.map \ No newline at end of file diff --git a/dist/core/services/providers/whatsapp.provider.d.ts.map b/dist/core/services/providers/whatsapp.provider.d.ts.map deleted file mode 100644 index b27ef25..0000000 --- a/dist/core/services/providers/whatsapp.provider.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"whatsapp.provider.d.ts","sourceRoot":"","sources":["../../../../src/core/services/providers/whatsapp.provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAE1E,qBAAa,gBAAiB,YAAW,oBAAoB;IACrD,IAAI,CAAC,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,GAAG,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAKlG"} \ No newline at end of file diff --git a/dist/core/services/providers/whatsapp.provider.js b/dist/core/services/providers/whatsapp.provider.js deleted file mode 100644 index 1feaa63..0000000 --- a/dist/core/services/providers/whatsapp.provider.js +++ /dev/null @@ -1,11 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.WhatsappProvider = void 0; -class WhatsappProvider { - async send(options) { - // Implementación concreta que use un servicio de WhatsApp Business API o similar. - // ...existing code... - console.log('[WhatsappProvider] Sending message to', options.to); - } -} -exports.WhatsappProvider = WhatsappProvider; diff --git a/dist/core/services/token.service.d.ts b/dist/core/services/token.service.d.ts deleted file mode 100644 index 44423b3..0000000 --- a/dist/core/services/token.service.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { AuthToken } from '../entities/token.entity'; -export declare class TokenService { - private tokens; - createToken(name?: string, expiresInHours?: number): AuthToken; - validate(tokenString: string): AuthToken | null; -} -//# sourceMappingURL=token.service.d.ts.map \ No newline at end of file diff --git a/dist/core/services/token.service.d.ts.map b/dist/core/services/token.service.d.ts.map deleted file mode 100644 index 5292001..0000000 --- a/dist/core/services/token.service.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"token.service.d.ts","sourceRoot":"","sources":["../../../src/core/services/token.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAErD,qBACa,YAAY;IAEvB,OAAO,CAAC,MAAM,CAAmB;IAEjC,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS;IAW9D,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;CAMhD"} \ No newline at end of file diff --git a/dist/core/services/token.service.js b/dist/core/services/token.service.js deleted file mode 100644 index 024597b..0000000 --- a/dist/core/services/token.service.js +++ /dev/null @@ -1,40 +0,0 @@ -"use strict"; -var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TokenService = void 0; -const common_1 = require("@nestjs/common"); -const uuid_1 = require("uuid"); -const token_entity_1 = require("../entities/token.entity"); -let TokenService = class TokenService { - constructor() { - // En una implementación real esto debería usar el repositorio de MikroORM. - this.tokens = []; - } - createToken(name, expiresInHours) { - const token = new token_entity_1.AuthToken(); - token.token = (0, uuid_1.v4)(); - token.name = name; - if (expiresInHours) { - token.expiresAt = new Date(Date.now() + expiresInHours * 60 * 60 * 1000); - } - this.tokens.push(token); - return token; - } - validate(tokenString) { - const token = this.tokens.find((t) => t.token === tokenString); - if (!token) - return null; - if (token.expiresAt && token.expiresAt < new Date()) - return null; - return token; - } -}; -exports.TokenService = TokenService; -exports.TokenService = TokenService = __decorate([ - (0, common_1.Injectable)() -], TokenService); diff --git a/dist/core/workflows/base-workflow.d.ts b/dist/core/workflows/base-workflow.d.ts deleted file mode 100644 index b0dfa40..0000000 --- a/dist/core/workflows/base-workflow.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Logger } from '@nestjs/common'; -export declare abstract class BaseWorkflow { - protected readonly logger: Logger; - abstract execute(...args: any[]): Promise; - protected logExecution(message: string, context?: any): void; -} -//# sourceMappingURL=base-workflow.d.ts.map \ No newline at end of file diff --git a/dist/core/workflows/base-workflow.d.ts.map b/dist/core/workflows/base-workflow.d.ts.map deleted file mode 100644 index 1af3759..0000000 --- a/dist/core/workflows/base-workflow.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"base-workflow.d.ts","sourceRoot":"","sources":["../../../src/core/workflows/base-workflow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAExC,8BAAsB,YAAY;IAChC,SAAS,CAAC,QAAQ,CAAC,MAAM,SAAqC;IAE9D,QAAQ,CAAC,OAAO,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IAE9C,SAAS,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG;CAMtD"} \ No newline at end of file diff --git a/dist/core/workflows/base-workflow.js b/dist/core/workflows/base-workflow.js deleted file mode 100644 index f9429d8..0000000 --- a/dist/core/workflows/base-workflow.js +++ /dev/null @@ -1,16 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.BaseWorkflow = void 0; -const common_1 = require("@nestjs/common"); -class BaseWorkflow { - constructor() { - this.logger = new common_1.Logger(this.constructor.name); - } - logExecution(message, context) { - this.logger.log(`[WORKFLOW] ${message}`); - if (context) { - this.logger.debug(context); - } - } -} -exports.BaseWorkflow = BaseWorkflow; diff --git a/dist/gift/api/dto/create-contribution.dto.d.ts b/dist/gift/api/dto/create-contribution.dto.d.ts deleted file mode 100644 index 4e7d2af..0000000 --- a/dist/gift/api/dto/create-contribution.dto.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -export declare class CreateContributionDto { - giftId: string; - contributorName: string; - contributorEmail?: string; - amount: number; - type?: 'individual' | 'group'; - metadata?: Record; -} -//# sourceMappingURL=create-contribution.dto.d.ts.map \ No newline at end of file diff --git a/dist/gift/api/dto/create-contribution.dto.d.ts.map b/dist/gift/api/dto/create-contribution.dto.d.ts.map deleted file mode 100644 index a8616d8..0000000 --- a/dist/gift/api/dto/create-contribution.dto.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"create-contribution.dto.d.ts","sourceRoot":"","sources":["../../../../src/gift/api/dto/create-contribution.dto.ts"],"names":[],"mappings":"AAAA,qBAAa,qBAAqB;IAChC,MAAM,EAAG,MAAM,CAAC;IAChB,eAAe,EAAG,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAG,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChC"} \ No newline at end of file diff --git a/dist/gift/api/dto/create-contribution.dto.js b/dist/gift/api/dto/create-contribution.dto.js deleted file mode 100644 index 7cc2ee2..0000000 --- a/dist/gift/api/dto/create-contribution.dto.js +++ /dev/null @@ -1,6 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.CreateContributionDto = void 0; -class CreateContributionDto { -} -exports.CreateContributionDto = CreateContributionDto; diff --git a/dist/gift/api/dto/create-gift.dto.d.ts b/dist/gift/api/dto/create-gift.dto.d.ts deleted file mode 100644 index 4540820..0000000 --- a/dist/gift/api/dto/create-gift.dto.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -export declare class CreateGiftDto { - name: string; - description?: string; - imageUrl?: string; - price?: number; - experience?: boolean; - ownerId?: string; - metadata?: Record; -} -//# sourceMappingURL=create-gift.dto.d.ts.map \ No newline at end of file diff --git a/dist/gift/api/dto/create-gift.dto.d.ts.map b/dist/gift/api/dto/create-gift.dto.d.ts.map deleted file mode 100644 index fd65a5a..0000000 --- a/dist/gift/api/dto/create-gift.dto.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"create-gift.dto.d.ts","sourceRoot":"","sources":["../../../../src/gift/api/dto/create-gift.dto.ts"],"names":[],"mappings":"AAAA,qBAAa,aAAa;IACxB,IAAI,EAAG,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChC"} \ No newline at end of file diff --git a/dist/gift/api/dto/create-gift.dto.js b/dist/gift/api/dto/create-gift.dto.js deleted file mode 100644 index 8c57e95..0000000 --- a/dist/gift/api/dto/create-gift.dto.js +++ /dev/null @@ -1,6 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.CreateGiftDto = void 0; -class CreateGiftDto { -} -exports.CreateGiftDto = CreateGiftDto; diff --git a/dist/gift/api/gift.controller.d.ts b/dist/gift/api/gift.controller.d.ts deleted file mode 100644 index c7d7a44..0000000 --- a/dist/gift/api/gift.controller.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Request } from 'express'; -import { GiftService } from '../services/gift.service'; -import { CreateGiftDto } from './dto/create-gift.dto'; -import { CreateContributionDto } from './dto/create-contribution.dto'; -export declare class GiftController { - private readonly giftService; - constructor(giftService: GiftService); - createGift(req: Request, tenantId: string, dto: CreateGiftDto): Promise; - listGifts(tenantId: string): Promise; - contribute(tenantId: string, dto: CreateContributionDto): Promise; - getGift(req: Request, tenantId: string, id: string): Promise; - listContributions(req: Request, tenantId: string, id: string): Promise; -} -//# sourceMappingURL=gift.controller.d.ts.map \ No newline at end of file diff --git a/dist/gift/api/gift.controller.d.ts.map b/dist/gift/api/gift.controller.d.ts.map deleted file mode 100644 index 1a61790..0000000 --- a/dist/gift/api/gift.controller.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"gift.controller.d.ts","sourceRoot":"","sources":["../../../src/gift/api/gift.controller.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAEtE,qBACa,cAAc;IACb,OAAO,CAAC,QAAQ,CAAC,WAAW;gBAAX,WAAW,EAAE,WAAW;IAG/C,UAAU,CACP,GAAG,EAAE,OAAO,EACK,QAAQ,EAAE,MAAM,EAChC,GAAG,EAAE,aAAa;IAOtB,SAAS,CAAyB,QAAQ,EAAE,MAAM;IAKlD,UAAU,CACU,QAAQ,EAAE,MAAM,EAChC,GAAG,EAAE,qBAAqB;IAM9B,OAAO,CACJ,GAAG,EAAE,OAAO,EACK,QAAQ,EAAE,MAAM,EAC3B,EAAE,EAAE,MAAM;IAOnB,iBAAiB,CACd,GAAG,EAAE,OAAO,EACK,QAAQ,EAAE,MAAM,EAC3B,EAAE,EAAE,MAAM;CAK1B"} \ No newline at end of file diff --git a/dist/gift/api/gift.controller.js b/dist/gift/api/gift.controller.js deleted file mode 100644 index f6985b1..0000000 --- a/dist/gift/api/gift.controller.js +++ /dev/null @@ -1,89 +0,0 @@ -"use strict"; -var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (this && this.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; -var __param = (this && this.__param) || function (paramIndex, decorator) { - return function (target, key) { decorator(target, key, paramIndex); } -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.GiftController = void 0; -const common_1 = require("@nestjs/common"); -const gift_service_1 = require("../services/gift.service"); -const create_gift_dto_1 = require("./dto/create-gift.dto"); -const create_contribution_dto_1 = require("./dto/create-contribution.dto"); -let GiftController = class GiftController { - constructor(giftService) { - this.giftService = giftService; - } - async createGift(req, tenantId, dto) { - const ownerId = req.user?.id; - return this.giftService.createGift(tenantId, { ...dto, ownerId }); - } - async listGifts(tenantId) { - return this.giftService.listGifts(tenantId); - } - async contribute(tenantId, dto) { - return this.giftService.createContribution(tenantId, dto); - } - async getGift(req, tenantId, id) { - const requesterId = req.user?.id; - return this.giftService.getGiftById(tenantId, id, requesterId); - } - async listContributions(req, tenantId, id) { - const requesterId = req.user?.id; - return this.giftService.listContributions(tenantId, id, requesterId); - } -}; -exports.GiftController = GiftController; -__decorate([ - (0, common_1.Post)(), - __param(0, (0, common_1.Req)()), - __param(1, (0, common_1.Headers)('x-tenant-id')), - __param(2, (0, common_1.Body)()), - __metadata("design:type", Function), - __metadata("design:paramtypes", [Object, String, create_gift_dto_1.CreateGiftDto]), - __metadata("design:returntype", Promise) -], GiftController.prototype, "createGift", null); -__decorate([ - (0, common_1.Get)(), - __param(0, (0, common_1.Headers)('x-tenant-id')), - __metadata("design:type", Function), - __metadata("design:paramtypes", [String]), - __metadata("design:returntype", Promise) -], GiftController.prototype, "listGifts", null); -__decorate([ - (0, common_1.Post)('contribution'), - __param(0, (0, common_1.Headers)('x-tenant-id')), - __param(1, (0, common_1.Body)()), - __metadata("design:type", Function), - __metadata("design:paramtypes", [String, create_contribution_dto_1.CreateContributionDto]), - __metadata("design:returntype", Promise) -], GiftController.prototype, "contribute", null); -__decorate([ - (0, common_1.Get)(':id'), - __param(0, (0, common_1.Req)()), - __param(1, (0, common_1.Headers)('x-tenant-id')), - __param(2, (0, common_1.Param)('id')), - __metadata("design:type", Function), - __metadata("design:paramtypes", [Object, String, String]), - __metadata("design:returntype", Promise) -], GiftController.prototype, "getGift", null); -__decorate([ - (0, common_1.Get)(':id/contributions'), - __param(0, (0, common_1.Req)()), - __param(1, (0, common_1.Headers)('x-tenant-id')), - __param(2, (0, common_1.Param)('id')), - __metadata("design:type", Function), - __metadata("design:paramtypes", [Object, String, String]), - __metadata("design:returntype", Promise) -], GiftController.prototype, "listContributions", null); -exports.GiftController = GiftController = __decorate([ - (0, common_1.Controller)('gift'), - __metadata("design:paramtypes", [gift_service_1.GiftService]) -], GiftController); diff --git a/dist/gift/entities/gift.entity.d.ts b/dist/gift/entities/gift.entity.d.ts deleted file mode 100644 index 59f6344..0000000 --- a/dist/gift/entities/gift.entity.d.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { EntitySchema } from '@mikro-orm/core'; -import { BaseEntity } from '../../core/entities/base.entity'; -export declare class Gift extends BaseEntity { - name: string; - description?: string; - imageUrl?: string; - price?: number; - experience?: boolean; - status: string; - ownerId?: string; -} -export declare const GiftSchema: EntitySchema>; -export declare class GiftContribution extends BaseEntity { - giftId: string; - contributorName: string; - contributorEmail?: string; - amount: number; - type: string; - status: string; -} -export declare const GiftContributionSchema: EntitySchema>; -//# sourceMappingURL=gift.entity.d.ts.map \ No newline at end of file diff --git a/dist/gift/entities/gift.entity.d.ts.map b/dist/gift/entities/gift.entity.d.ts.map deleted file mode 100644 index 31a4e44..0000000 --- a/dist/gift/entities/gift.entity.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"gift.entity.d.ts","sourceRoot":"","sources":["../../../src/gift/entities/gift.entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAE7D,qBAAa,IAAK,SAAQ,UAAU;IAClC,IAAI,EAAG,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE,MAAM,CAAa;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,UAAU,uEAoDrB,CAAC;AAEH,qBAAa,gBAAiB,SAAQ,UAAU;IAC9C,MAAM,EAAG,MAAM,CAAC;IAChB,eAAe,EAAG,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAG,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAgB;IAC5B,MAAM,EAAE,MAAM,CAAa;CAC5B;AAED,eAAO,MAAM,sBAAsB,+FA8CjC,CAAC"} \ No newline at end of file diff --git a/dist/gift/entities/gift.entity.js b/dist/gift/entities/gift.entity.js deleted file mode 100644 index e205171..0000000 --- a/dist/gift/entities/gift.entity.js +++ /dev/null @@ -1,121 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.GiftContributionSchema = exports.GiftContribution = exports.GiftSchema = exports.Gift = void 0; -const core_1 = require("@mikro-orm/core"); -const uuid_1 = require("uuid"); -const base_entity_1 = require("../../core/entities/base.entity"); -class Gift extends base_entity_1.BaseEntity { - constructor() { - super(...arguments); - this.status = 'pending'; - } -} -exports.Gift = Gift; -exports.GiftSchema = new core_1.EntitySchema({ - class: Gift, - tableName: 'gifts', - properties: { - id: { - type: 'uuid', - primary: true, - default: (0, uuid_1.v4)(), - }, - tenantId: { - type: 'string', - }, - metadata: { - type: 'json', - nullable: true, - }, - createdAt: { - type: 'date', - default: new Date(), - }, - updatedAt: { - type: 'date', - default: new Date(), - }, - name: { - type: 'string', - }, - description: { - type: 'string', - nullable: true, - }, - imageUrl: { - type: 'string', - nullable: true, - }, - price: { - type: 'float', - nullable: true, - }, - experience: { - type: 'boolean', - nullable: true, - }, - status: { - type: 'string', - default: 'pending', - }, - ownerId: { - type: 'string', - nullable: true, - }, - }, -}); -class GiftContribution extends base_entity_1.BaseEntity { - constructor() { - super(...arguments); - this.type = 'individual'; - this.status = 'pending'; - } -} -exports.GiftContribution = GiftContribution; -exports.GiftContributionSchema = new core_1.EntitySchema({ - class: GiftContribution, - tableName: 'gift_contributions', - properties: { - id: { - type: 'uuid', - primary: true, - default: (0, uuid_1.v4)(), - }, - tenantId: { - type: 'string', - }, - metadata: { - type: 'json', - nullable: true, - }, - createdAt: { - type: 'date', - default: new Date(), - }, - updatedAt: { - type: 'date', - default: new Date(), - }, - giftId: { - type: 'uuid', - }, - contributorName: { - type: 'string', - }, - contributorEmail: { - type: 'string', - nullable: true, - }, - amount: { - type: 'float', - }, - type: { - type: 'string', - default: 'individual', - }, - status: { - type: 'string', - default: 'pending', - }, - }, -}); diff --git a/dist/gift/gift.module.d.ts b/dist/gift/gift.module.d.ts deleted file mode 100644 index cb05c22..0000000 --- a/dist/gift/gift.module.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export declare class GiftModule { -} -//# sourceMappingURL=gift.module.d.ts.map \ No newline at end of file diff --git a/dist/gift/gift.module.d.ts.map b/dist/gift/gift.module.d.ts.map deleted file mode 100644 index a538953..0000000 --- a/dist/gift/gift.module.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"gift.module.d.ts","sourceRoot":"","sources":["../../src/gift/gift.module.ts"],"names":[],"mappings":"AASA,qBASa,UAAU;CAAG"} \ No newline at end of file diff --git a/dist/gift/gift.module.js b/dist/gift/gift.module.js deleted file mode 100644 index e4bcc9e..0000000 --- a/dist/gift/gift.module.js +++ /dev/null @@ -1,31 +0,0 @@ -"use strict"; -var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.GiftModule = void 0; -const common_1 = require("@nestjs/common"); -const nestjs_1 = require("@mikro-orm/nestjs"); -const core_module_1 = require("../core/core.module"); -const gift_service_1 = require("./services/gift.service"); -const gift_controller_1 = require("./api/gift.controller"); -const gift_subscriber_1 = require("./subscribers/gift.subscriber"); -const gift_entity_1 = require("./entities/gift.entity"); -const gift_registration_1 = require("./gift.registration"); -let GiftModule = class GiftModule { -}; -exports.GiftModule = GiftModule; -exports.GiftModule = GiftModule = __decorate([ - (0, common_1.Module)({ - imports: [ - core_module_1.CoreModule, - nestjs_1.MikroOrmModule.forFeature({ entities: [gift_entity_1.GiftSchema, gift_entity_1.GiftContributionSchema] }), - ], - providers: [gift_service_1.GiftService, gift_subscriber_1.GiftSubscriber, gift_registration_1.GiftModuleRegistration], - controllers: [gift_controller_1.GiftController], - exports: [gift_service_1.GiftService], - }) -], GiftModule); diff --git a/dist/gift/gift.registration.d.ts b/dist/gift/gift.registration.d.ts deleted file mode 100644 index 5cb2955..0000000 --- a/dist/gift/gift.registration.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { OnModuleInit } from '@nestjs/common'; -import { ModuleRegistryService } from '../core/services/module-registry.service'; -export declare class GiftModuleRegistration implements OnModuleInit { - private readonly moduleRegistry; - constructor(moduleRegistry: ModuleRegistryService); - onModuleInit(): void; -} -//# sourceMappingURL=gift.registration.d.ts.map \ No newline at end of file diff --git a/dist/gift/gift.registration.d.ts.map b/dist/gift/gift.registration.d.ts.map deleted file mode 100644 index 560e3db..0000000 --- a/dist/gift/gift.registration.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"gift.registration.d.ts","sourceRoot":"","sources":["../../src/gift/gift.registration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,0CAA0C,CAAC;AAEjF,qBACa,sBAAuB,YAAW,YAAY;IAC7C,OAAO,CAAC,QAAQ,CAAC,cAAc;gBAAd,cAAc,EAAE,qBAAqB;IAElE,YAAY;CAQb"} \ No newline at end of file diff --git a/dist/gift/gift.registration.js b/dist/gift/gift.registration.js deleted file mode 100644 index 80da294..0000000 --- a/dist/gift/gift.registration.js +++ /dev/null @@ -1,32 +0,0 @@ -"use strict"; -var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (this && this.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.GiftModuleRegistration = void 0; -const common_1 = require("@nestjs/common"); -const module_registry_service_1 = require("../core/services/module-registry.service"); -let GiftModuleRegistration = class GiftModuleRegistration { - constructor(moduleRegistry) { - this.moduleRegistry = moduleRegistry; - } - onModuleInit() { - this.moduleRegistry.registerModule({ - key: 'gift', - name: 'Regalos', - description: 'Gestión de lista de regalos, aportes individuales y grupales.', - routePrefix: '/gift', - }); - } -}; -exports.GiftModuleRegistration = GiftModuleRegistration; -exports.GiftModuleRegistration = GiftModuleRegistration = __decorate([ - (0, common_1.Injectable)(), - __metadata("design:paramtypes", [module_registry_service_1.ModuleRegistryService]) -], GiftModuleRegistration); diff --git a/dist/gift/services/gift.service.d.ts b/dist/gift/services/gift.service.d.ts deleted file mode 100644 index a2383d5..0000000 --- a/dist/gift/services/gift.service.d.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { MikroORM } from '@mikro-orm/core'; -import { EventEmitter2 } from '@nestjs/event-emitter'; -import { Gift, GiftContribution } from '../entities/gift.entity'; -import { CreateGiftDto } from '../api/dto/create-gift.dto'; -import { CreateContributionDto } from '../api/dto/create-contribution.dto'; -export declare class GiftService { - private readonly orm; - private readonly eventEmitter; - constructor(orm: MikroORM, eventEmitter: EventEmitter2); - private get em(); - createGift(tenantId: string, dto: CreateGiftDto): Promise; - createContribution(tenantId: string, dto: CreateContributionDto): Promise; - listGifts(tenantId: string): Promise; - getGiftById(tenantId: string, id: string, requesterId?: string): Promise; - listContributions(tenantId: string, giftId: string, requesterId?: string): Promise; -} -//# sourceMappingURL=gift.service.d.ts.map \ No newline at end of file diff --git a/dist/gift/services/gift.service.d.ts.map b/dist/gift/services/gift.service.d.ts.map deleted file mode 100644 index d4bc31f..0000000 --- a/dist/gift/services/gift.service.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"gift.service.d.ts","sourceRoot":"","sources":["../../../src/gift/services/gift.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAE3E,qBACa,WAAW;IAEpB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,YAAY;gBADZ,GAAG,EAAE,QAAQ,EACb,YAAY,EAAE,aAAa;IAG9C,OAAO,KAAK,EAAE,GAEb;IAEK,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAW/D,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,qBAAqB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAW3F,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAI5C,WAAW,CACf,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,MAAM,EACV,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IASjB,iBAAiB,CACrB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,gBAAgB,EAAE,CAAC;CAK/B"} \ No newline at end of file diff --git a/dist/gift/services/gift.service.js b/dist/gift/services/gift.service.js deleted file mode 100644 index 5e05c1c..0000000 --- a/dist/gift/services/gift.service.js +++ /dev/null @@ -1,69 +0,0 @@ -"use strict"; -var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (this && this.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.GiftService = void 0; -const common_1 = require("@nestjs/common"); -const core_1 = require("@mikro-orm/core"); -const event_emitter_1 = require("@nestjs/event-emitter"); -const gift_entity_1 = require("../entities/gift.entity"); -let GiftService = class GiftService { - constructor(orm, eventEmitter) { - this.orm = orm; - this.eventEmitter = eventEmitter; - } - get em() { - return this.orm.em.fork(); - } - async createGift(tenantId, dto) { - const gift = this.em.create(gift_entity_1.Gift, { - tenantId, - ...dto, - }); - this.em.persist(gift); - await this.em.flush(); - this.eventEmitter.emit('gift.created', { gift }); - return gift; - } - async createContribution(tenantId, dto) { - const contribution = this.em.create(gift_entity_1.GiftContribution, { - tenantId, - ...dto, - }); - this.em.persist(contribution); - await this.em.flush(); - this.eventEmitter.emit('gift.contribution', { contribution }); - return contribution; - } - async listGifts(tenantId) { - return this.em.find(gift_entity_1.Gift, { tenantId }); - } - async getGiftById(tenantId, id, requesterId) { - const gift = await this.em.findOne(gift_entity_1.Gift, { tenantId, id }); - if (!gift) - return null; - if (requesterId && gift.ownerId && gift.ownerId !== requesterId) { - return null; - } - return gift; - } - async listContributions(tenantId, giftId, requesterId) { - const gift = await this.getGiftById(tenantId, giftId, requesterId); - if (!gift) - return []; - return this.em.find(gift_entity_1.GiftContribution, { tenantId, giftId }); - } -}; -exports.GiftService = GiftService; -exports.GiftService = GiftService = __decorate([ - (0, common_1.Injectable)(), - __metadata("design:paramtypes", [core_1.MikroORM, - event_emitter_1.EventEmitter2]) -], GiftService); diff --git a/dist/gift/subscribers/gift.subscriber.d.ts b/dist/gift/subscribers/gift.subscriber.d.ts deleted file mode 100644 index d01bc85..0000000 --- a/dist/gift/subscribers/gift.subscriber.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { NotificationService } from '../../core/services/notification.service'; -import { NotificationRuleService } from '../../core/services/notification-rule.service'; -export declare class GiftSubscriber { - private readonly notificationService; - private readonly notificationRuleService; - constructor(notificationService: NotificationService, notificationRuleService: NotificationRuleService); - handleGiftCreated(payload: any): Promise; - handleGiftContribution(payload: any): Promise; -} -//# sourceMappingURL=gift.subscriber.d.ts.map \ No newline at end of file diff --git a/dist/gift/subscribers/gift.subscriber.d.ts.map b/dist/gift/subscribers/gift.subscriber.d.ts.map deleted file mode 100644 index c8c8d79..0000000 --- a/dist/gift/subscribers/gift.subscriber.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"gift.subscriber.d.ts","sourceRoot":"","sources":["../../../src/gift/subscribers/gift.subscriber.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AAC/E,OAAO,EAAE,uBAAuB,EAAE,MAAM,+CAA+C,CAAC;AAExF,qBACa,cAAc;IAEvB,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IACpC,OAAO,CAAC,QAAQ,CAAC,uBAAuB;gBADvB,mBAAmB,EAAE,mBAAmB,EACxC,uBAAuB,EAAE,uBAAuB;IAI7D,iBAAiB,CAAC,OAAO,EAAE,GAAG;IAgB9B,sBAAsB,CAAC,OAAO,EAAE,GAAG;CAc1C"} \ No newline at end of file diff --git a/dist/gift/subscribers/gift.subscriber.js b/dist/gift/subscribers/gift.subscriber.js deleted file mode 100644 index eca0609..0000000 --- a/dist/gift/subscribers/gift.subscriber.js +++ /dev/null @@ -1,58 +0,0 @@ -"use strict"; -var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (this && this.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.GiftSubscriber = void 0; -const event_emitter_1 = require("@nestjs/event-emitter"); -const common_1 = require("@nestjs/common"); -const notification_service_1 = require("../../core/services/notification.service"); -const notification_rule_service_1 = require("../../core/services/notification-rule.service"); -let GiftSubscriber = class GiftSubscriber { - constructor(notificationService, notificationRuleService) { - this.notificationService = notificationService; - this.notificationRuleService = notificationRuleService; - } - async handleGiftCreated(payload) { - const { gift } = payload; - const rules = await this.notificationRuleService.getRulesForEvent(gift.tenantId, 'gift', 'gift.created'); - for (const rule of rules) { - for (const channel of rule.channels) { - await this.notificationService.send(channel, gift.metadata?.notifyTo || '', 'Nuevo regalo creado', `Se ha creado el regalo: ${gift.name}`); - } - } - } - async handleGiftContribution(payload) { - const { contribution } = payload; - const rules = await this.notificationRuleService.getRulesForEvent(contribution.tenantId, 'gift', 'gift.contribution'); - for (const rule of rules) { - for (const channel of rule.channels) { - await this.notificationService.send(channel, contribution.metadata?.notifyTo || '', 'Nuevo aporte a regalo', `Se ha registrado un aporte de ${contribution.amount} al regalo (${contribution.giftId}).`); - } - } - } -}; -exports.GiftSubscriber = GiftSubscriber; -__decorate([ - (0, event_emitter_1.OnEvent)('gift.created'), - __metadata("design:type", Function), - __metadata("design:paramtypes", [Object]), - __metadata("design:returntype", Promise) -], GiftSubscriber.prototype, "handleGiftCreated", null); -__decorate([ - (0, event_emitter_1.OnEvent)('gift.contribution'), - __metadata("design:type", Function), - __metadata("design:paramtypes", [Object]), - __metadata("design:returntype", Promise) -], GiftSubscriber.prototype, "handleGiftContribution", null); -exports.GiftSubscriber = GiftSubscriber = __decorate([ - (0, common_1.Injectable)(), - __metadata("design:paramtypes", [notification_service_1.NotificationService, - notification_rule_service_1.NotificationRuleService]) -], GiftSubscriber); diff --git a/dist/gift/workflows/gift.workflow.d.ts b/dist/gift/workflows/gift.workflow.d.ts deleted file mode 100644 index 90da522..0000000 --- a/dist/gift/workflows/gift.workflow.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { BaseWorkflow } from '../../core/workflows/base-workflow'; -export declare class GiftWorkflow extends BaseWorkflow { - execute(...args: any[]): Promise; -} -//# sourceMappingURL=gift.workflow.d.ts.map \ No newline at end of file diff --git a/dist/gift/workflows/gift.workflow.d.ts.map b/dist/gift/workflows/gift.workflow.d.ts.map deleted file mode 100644 index 3d4bcfb..0000000 --- a/dist/gift/workflows/gift.workflow.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"gift.workflow.d.ts","sourceRoot":"","sources":["../../../src/gift/workflows/gift.workflow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAElE,qBAAa,YAAa,SAAQ,YAAY;IACtC,OAAO,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;CAM5C"} \ No newline at end of file diff --git a/dist/gift/workflows/gift.workflow.js b/dist/gift/workflows/gift.workflow.js deleted file mode 100644 index 47f410d..0000000 --- a/dist/gift/workflows/gift.workflow.js +++ /dev/null @@ -1,13 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.GiftWorkflow = void 0; -const base_workflow_1 = require("../../core/workflows/base-workflow"); -class GiftWorkflow extends base_workflow_1.BaseWorkflow { - async execute(...args) { - this.logExecution('Ejecutando workflow de regalo', args); - // Lógica de workflow para regalos - // ...existing code... - return {}; - } -} -exports.GiftWorkflow = GiftWorkflow; diff --git a/dist/guest/api/dto/create-guest.dto.d.ts b/dist/guest/api/dto/create-guest.dto.d.ts deleted file mode 100644 index e7321d5..0000000 --- a/dist/guest/api/dto/create-guest.dto.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -export declare class CreateGuestDto { - name: string; - email?: string; - phone?: string; - metadata?: Record; -} -//# sourceMappingURL=create-guest.dto.d.ts.map \ No newline at end of file diff --git a/dist/guest/api/dto/create-guest.dto.d.ts.map b/dist/guest/api/dto/create-guest.dto.d.ts.map deleted file mode 100644 index 3412e28..0000000 --- a/dist/guest/api/dto/create-guest.dto.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"create-guest.dto.d.ts","sourceRoot":"","sources":["../../../../src/guest/api/dto/create-guest.dto.ts"],"names":[],"mappings":"AAAA,qBAAa,cAAc;IACzB,IAAI,EAAG,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChC"} \ No newline at end of file diff --git a/dist/guest/api/dto/create-guest.dto.js b/dist/guest/api/dto/create-guest.dto.js deleted file mode 100644 index 3c67910..0000000 --- a/dist/guest/api/dto/create-guest.dto.js +++ /dev/null @@ -1,6 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.CreateGuestDto = void 0; -class CreateGuestDto { -} -exports.CreateGuestDto = CreateGuestDto; diff --git a/dist/guest/api/dto/update-rsvp.dto.d.ts b/dist/guest/api/dto/update-rsvp.dto.d.ts deleted file mode 100644 index be0352e..0000000 --- a/dist/guest/api/dto/update-rsvp.dto.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -export declare class UpdateRsvpDto { - rsvp: boolean; - tableId?: string; -} -//# sourceMappingURL=update-rsvp.dto.d.ts.map \ No newline at end of file diff --git a/dist/guest/api/dto/update-rsvp.dto.d.ts.map b/dist/guest/api/dto/update-rsvp.dto.d.ts.map deleted file mode 100644 index 89c9149..0000000 --- a/dist/guest/api/dto/update-rsvp.dto.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"update-rsvp.dto.d.ts","sourceRoot":"","sources":["../../../../src/guest/api/dto/update-rsvp.dto.ts"],"names":[],"mappings":"AAAA,qBAAa,aAAa;IACxB,IAAI,EAAG,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB"} \ No newline at end of file diff --git a/dist/guest/api/dto/update-rsvp.dto.js b/dist/guest/api/dto/update-rsvp.dto.js deleted file mode 100644 index b5fe6e4..0000000 --- a/dist/guest/api/dto/update-rsvp.dto.js +++ /dev/null @@ -1,6 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.UpdateRsvpDto = void 0; -class UpdateRsvpDto { -} -exports.UpdateRsvpDto = UpdateRsvpDto; diff --git a/dist/guest/api/guest.controller.d.ts b/dist/guest/api/guest.controller.d.ts deleted file mode 100644 index b9b0180..0000000 --- a/dist/guest/api/guest.controller.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { GuestService } from '../services/guest.service'; -import { CreateGuestDto } from './dto/create-guest.dto'; -import { UpdateRsvpDto } from './dto/update-rsvp.dto'; -export declare class GuestController { - private readonly guestService; - constructor(guestService: GuestService); - createGuest(tenantId: string, dto: CreateGuestDto): Promise; - listGuests(tenantId: string): Promise; - updateRsvp(tenantId: string, id: string, dto: UpdateRsvpDto): Promise; -} -//# sourceMappingURL=guest.controller.d.ts.map \ No newline at end of file diff --git a/dist/guest/api/guest.controller.d.ts.map b/dist/guest/api/guest.controller.d.ts.map deleted file mode 100644 index 05ae6eb..0000000 --- a/dist/guest/api/guest.controller.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"guest.controller.d.ts","sourceRoot":"","sources":["../../../src/guest/api/guest.controller.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,qBACa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAAZ,YAAY,EAAE,YAAY;IAGjD,WAAW,CACS,QAAQ,EAAE,MAAM,EAChC,GAAG,EAAE,cAAc;IAMvB,UAAU,CAAyB,QAAQ,EAAE,MAAM;IAKnD,UAAU,CACU,QAAQ,EAAE,MAAM,EAC3B,EAAE,EAAE,MAAM,EACf,GAAG,EAAE,aAAa;CAI7B"} \ No newline at end of file diff --git a/dist/guest/api/guest.controller.js b/dist/guest/api/guest.controller.js deleted file mode 100644 index 1682de2..0000000 --- a/dist/guest/api/guest.controller.js +++ /dev/null @@ -1,62 +0,0 @@ -"use strict"; -var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (this && this.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; -var __param = (this && this.__param) || function (paramIndex, decorator) { - return function (target, key) { decorator(target, key, paramIndex); } -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.GuestController = void 0; -const common_1 = require("@nestjs/common"); -const guest_service_1 = require("../services/guest.service"); -const create_guest_dto_1 = require("./dto/create-guest.dto"); -const update_rsvp_dto_1 = require("./dto/update-rsvp.dto"); -let GuestController = class GuestController { - constructor(guestService) { - this.guestService = guestService; - } - async createGuest(tenantId, dto) { - return this.guestService.createGuest(tenantId, dto); - } - async listGuests(tenantId) { - return this.guestService.listGuests(tenantId); - } - async updateRsvp(tenantId, id, dto) { - return this.guestService.updateRsvp(tenantId, id, dto); - } -}; -exports.GuestController = GuestController; -__decorate([ - (0, common_1.Post)(), - __param(0, (0, common_1.Headers)('x-tenant-id')), - __param(1, (0, common_1.Body)()), - __metadata("design:type", Function), - __metadata("design:paramtypes", [String, create_guest_dto_1.CreateGuestDto]), - __metadata("design:returntype", Promise) -], GuestController.prototype, "createGuest", null); -__decorate([ - (0, common_1.Get)(), - __param(0, (0, common_1.Headers)('x-tenant-id')), - __metadata("design:type", Function), - __metadata("design:paramtypes", [String]), - __metadata("design:returntype", Promise) -], GuestController.prototype, "listGuests", null); -__decorate([ - (0, common_1.Patch)(':id/rsvp'), - __param(0, (0, common_1.Headers)('x-tenant-id')), - __param(1, (0, common_1.Param)('id')), - __param(2, (0, common_1.Body)()), - __metadata("design:type", Function), - __metadata("design:paramtypes", [String, String, update_rsvp_dto_1.UpdateRsvpDto]), - __metadata("design:returntype", Promise) -], GuestController.prototype, "updateRsvp", null); -exports.GuestController = GuestController = __decorate([ - (0, common_1.Controller)('guest'), - __metadata("design:paramtypes", [guest_service_1.GuestService]) -], GuestController); diff --git a/dist/guest/entities/guest.entity.d.ts b/dist/guest/entities/guest.entity.d.ts deleted file mode 100644 index 12580cc..0000000 --- a/dist/guest/entities/guest.entity.d.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { EntitySchema } from '@mikro-orm/core'; -import { BaseEntity } from '../../core/entities/base.entity'; -export declare class Guest extends BaseEntity { - name: string; - email?: string; - phone?: string; - rsvp: boolean; - tableId?: string; -} -export declare const GuestSchema: EntitySchema>; -export declare class GuestNotificationPreference extends BaseEntity { - guestId: string; - email: boolean; - whatsapp: boolean; - metadata?: Record; -} -export declare const GuestNotificationPreferenceSchema: EntitySchema>; -//# sourceMappingURL=guest.entity.d.ts.map \ No newline at end of file diff --git a/dist/guest/entities/guest.entity.d.ts.map b/dist/guest/entities/guest.entity.d.ts.map deleted file mode 100644 index f0a61c1..0000000 --- a/dist/guest/entities/guest.entity.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"guest.entity.d.ts","sourceRoot":"","sources":["../../../src/guest/entities/guest.entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAE7D,qBAAa,KAAM,SAAQ,UAAU;IACnC,IAAI,EAAG,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,CAAS;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,WAAW,yEA4CtB,CAAC;AAEH,qBAAa,2BAA4B,SAAQ,UAAU;IACzD,OAAO,EAAG,MAAM,CAAC;IACjB,KAAK,EAAE,OAAO,CAAQ;IACtB,QAAQ,EAAE,OAAO,CAAS;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChC;AAED,eAAO,MAAM,iCAAiC,qHAoC5C,CAAC"} \ No newline at end of file diff --git a/dist/guest/entities/guest.entity.js b/dist/guest/entities/guest.entity.js deleted file mode 100644 index dbb7571..0000000 --- a/dist/guest/entities/guest.entity.js +++ /dev/null @@ -1,103 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.GuestNotificationPreferenceSchema = exports.GuestNotificationPreference = exports.GuestSchema = exports.Guest = void 0; -const core_1 = require("@mikro-orm/core"); -const uuid_1 = require("uuid"); -const base_entity_1 = require("../../core/entities/base.entity"); -class Guest extends base_entity_1.BaseEntity { - constructor() { - super(...arguments); - this.rsvp = false; - } -} -exports.Guest = Guest; -exports.GuestSchema = new core_1.EntitySchema({ - class: Guest, - tableName: 'guests', - properties: { - id: { - type: 'uuid', - primary: true, - default: (0, uuid_1.v4)(), - }, - tenantId: { - type: 'string', - }, - metadata: { - type: 'json', - nullable: true, - }, - createdAt: { - type: 'date', - default: new Date(), - }, - updatedAt: { - type: 'date', - default: new Date(), - }, - name: { - type: 'string', - }, - email: { - type: 'string', - nullable: true, - }, - phone: { - type: 'string', - nullable: true, - }, - rsvp: { - type: 'boolean', - default: false, - }, - tableId: { - type: 'uuid', - nullable: true, - }, - }, -}); -class GuestNotificationPreference extends base_entity_1.BaseEntity { - constructor() { - super(...arguments); - this.email = true; - this.whatsapp = false; - } -} -exports.GuestNotificationPreference = GuestNotificationPreference; -exports.GuestNotificationPreferenceSchema = new core_1.EntitySchema({ - class: GuestNotificationPreference, - tableName: 'guest_notification_preferences', - properties: { - id: { - type: 'uuid', - primary: true, - default: (0, uuid_1.v4)(), - }, - tenantId: { - type: 'string', - }, - metadata: { - type: 'json', - nullable: true, - }, - createdAt: { - type: 'date', - default: new Date(), - }, - updatedAt: { - type: 'date', - default: new Date(), - }, - guestId: { - type: 'uuid', - }, - email: { - type: 'boolean', - default: true, - }, - whatsapp: { - type: 'boolean', - default: false, - }, - }, -}); diff --git a/dist/guest/guest.module.d.ts b/dist/guest/guest.module.d.ts deleted file mode 100644 index fab3802..0000000 --- a/dist/guest/guest.module.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export declare class GuestModule { -} -//# sourceMappingURL=guest.module.d.ts.map \ No newline at end of file diff --git a/dist/guest/guest.module.d.ts.map b/dist/guest/guest.module.d.ts.map deleted file mode 100644 index 1ee1138..0000000 --- a/dist/guest/guest.module.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"guest.module.d.ts","sourceRoot":"","sources":["../../src/guest/guest.module.ts"],"names":[],"mappings":"AASA,qBAWa,WAAW;CAAG"} \ No newline at end of file diff --git a/dist/guest/guest.module.js b/dist/guest/guest.module.js deleted file mode 100644 index 896c74a..0000000 --- a/dist/guest/guest.module.js +++ /dev/null @@ -1,33 +0,0 @@ -"use strict"; -var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.GuestModule = void 0; -const common_1 = require("@nestjs/common"); -const nestjs_1 = require("@mikro-orm/nestjs"); -const core_module_1 = require("../core/core.module"); -const guest_service_1 = require("./services/guest.service"); -const guest_controller_1 = require("./api/guest.controller"); -const guest_subscriber_1 = require("./subscribers/guest.subscriber"); -const guest_entity_1 = require("./entities/guest.entity"); -const guest_registration_1 = require("./guest.registration"); -let GuestModule = class GuestModule { -}; -exports.GuestModule = GuestModule; -exports.GuestModule = GuestModule = __decorate([ - (0, common_1.Module)({ - imports: [ - core_module_1.CoreModule, - nestjs_1.MikroOrmModule.forFeature({ - entities: [guest_entity_1.GuestSchema, guest_entity_1.GuestNotificationPreferenceSchema], - }), - ], - providers: [guest_service_1.GuestService, guest_subscriber_1.GuestSubscriber, guest_registration_1.GuestModuleRegistration], - controllers: [guest_controller_1.GuestController], - exports: [guest_service_1.GuestService], - }) -], GuestModule); diff --git a/dist/guest/guest.registration.d.ts b/dist/guest/guest.registration.d.ts deleted file mode 100644 index 2c76707..0000000 --- a/dist/guest/guest.registration.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { OnModuleInit } from '@nestjs/common'; -import { ModuleRegistryService } from '../core/services/module-registry.service'; -export declare class GuestModuleRegistration implements OnModuleInit { - private readonly moduleRegistry; - constructor(moduleRegistry: ModuleRegistryService); - onModuleInit(): void; -} -//# sourceMappingURL=guest.registration.d.ts.map \ No newline at end of file diff --git a/dist/guest/guest.registration.d.ts.map b/dist/guest/guest.registration.d.ts.map deleted file mode 100644 index 3c0ded4..0000000 --- a/dist/guest/guest.registration.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"guest.registration.d.ts","sourceRoot":"","sources":["../../src/guest/guest.registration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,0CAA0C,CAAC;AAEjF,qBACa,uBAAwB,YAAW,YAAY;IAC9C,OAAO,CAAC,QAAQ,CAAC,cAAc;gBAAd,cAAc,EAAE,qBAAqB;IAElE,YAAY;CAQb"} \ No newline at end of file diff --git a/dist/guest/guest.registration.js b/dist/guest/guest.registration.js deleted file mode 100644 index 502ef2c..0000000 --- a/dist/guest/guest.registration.js +++ /dev/null @@ -1,32 +0,0 @@ -"use strict"; -var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (this && this.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.GuestModuleRegistration = void 0; -const common_1 = require("@nestjs/common"); -const module_registry_service_1 = require("../core/services/module-registry.service"); -let GuestModuleRegistration = class GuestModuleRegistration { - constructor(moduleRegistry) { - this.moduleRegistry = moduleRegistry; - } - onModuleInit() { - this.moduleRegistry.registerModule({ - key: 'guest', - name: 'Invitados', - description: 'Gestión de invitados, RSVP y asignación de mesas.', - routePrefix: '/guest', - }); - } -}; -exports.GuestModuleRegistration = GuestModuleRegistration; -exports.GuestModuleRegistration = GuestModuleRegistration = __decorate([ - (0, common_1.Injectable)(), - __metadata("design:paramtypes", [module_registry_service_1.ModuleRegistryService]) -], GuestModuleRegistration); diff --git a/dist/guest/services/guest.service.d.ts b/dist/guest/services/guest.service.d.ts deleted file mode 100644 index 4e5c116..0000000 --- a/dist/guest/services/guest.service.d.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { MikroORM } from '@mikro-orm/core'; -import { EventEmitter2 } from '@nestjs/event-emitter'; -import { Guest } from '../entities/guest.entity'; -import { CreateGuestDto } from '../api/dto/create-guest.dto'; -import { UpdateRsvpDto } from '../api/dto/update-rsvp.dto'; -export declare class GuestService { - private readonly orm; - private readonly eventEmitter; - constructor(orm: MikroORM, eventEmitter: EventEmitter2); - private get em(); - createGuest(tenantId: string, dto: CreateGuestDto): Promise; - updateRsvp(tenantId: string, guestId: string, dto: UpdateRsvpDto): Promise; - listGuests(tenantId: string): Promise; -} -//# sourceMappingURL=guest.service.d.ts.map \ No newline at end of file diff --git a/dist/guest/services/guest.service.d.ts.map b/dist/guest/services/guest.service.d.ts.map deleted file mode 100644 index e4ed1a8..0000000 --- a/dist/guest/services/guest.service.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"guest.service.d.ts","sourceRoot":"","sources":["../../../src/guest/services/guest.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE3D,qBACa,YAAY;IAErB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,YAAY;gBADZ,GAAG,EAAE,QAAQ,EACb,YAAY,EAAE,aAAa;IAG9C,OAAO,KAAK,EAAE,GAEb;IAEK,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC;IAWlE,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAaxF,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;CAGrD"} \ No newline at end of file diff --git a/dist/guest/services/guest.service.js b/dist/guest/services/guest.service.js deleted file mode 100644 index 650cdd2..0000000 --- a/dist/guest/services/guest.service.js +++ /dev/null @@ -1,57 +0,0 @@ -"use strict"; -var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (this && this.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.GuestService = void 0; -const common_1 = require("@nestjs/common"); -const core_1 = require("@mikro-orm/core"); -const event_emitter_1 = require("@nestjs/event-emitter"); -const guest_entity_1 = require("../entities/guest.entity"); -let GuestService = class GuestService { - constructor(orm, eventEmitter) { - this.orm = orm; - this.eventEmitter = eventEmitter; - } - get em() { - return this.orm.em.fork(); - } - async createGuest(tenantId, dto) { - const guest = this.em.create(guest_entity_1.Guest, { - tenantId, - ...dto, - }); - this.em.persist(guest); - await this.em.flush(); - this.eventEmitter.emit('guest.invited', { guest }); - return guest; - } - async updateRsvp(tenantId, guestId, dto) { - const guest = await this.em.findOne(guest_entity_1.Guest, { tenantId, id: guestId }); - if (!guest) - return null; - guest.rsvp = dto.rsvp; - if (dto.tableId) { - guest.tableId = dto.tableId; - } - this.em.persist(guest); - await this.em.flush(); - this.eventEmitter.emit('guest.rsvp', { guest }); - return guest; - } - async listGuests(tenantId) { - return this.em.find(guest_entity_1.Guest, { tenantId }); - } -}; -exports.GuestService = GuestService; -exports.GuestService = GuestService = __decorate([ - (0, common_1.Injectable)(), - __metadata("design:paramtypes", [core_1.MikroORM, - event_emitter_1.EventEmitter2]) -], GuestService); diff --git a/dist/guest/subscribers/guest.subscriber.d.ts b/dist/guest/subscribers/guest.subscriber.d.ts deleted file mode 100644 index 53dd461..0000000 --- a/dist/guest/subscribers/guest.subscriber.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { NotificationService } from '../../core/services/notification.service'; -import { NotificationRuleService } from '../../core/services/notification-rule.service'; -export declare class GuestSubscriber { - private readonly notificationService; - private readonly notificationRuleService; - constructor(notificationService: NotificationService, notificationRuleService: NotificationRuleService); - handleGuestInvited(payload: any): Promise; - handleGuestRsvp(payload: any): Promise; -} -//# sourceMappingURL=guest.subscriber.d.ts.map \ No newline at end of file diff --git a/dist/guest/subscribers/guest.subscriber.d.ts.map b/dist/guest/subscribers/guest.subscriber.d.ts.map deleted file mode 100644 index 6d7eccd..0000000 --- a/dist/guest/subscribers/guest.subscriber.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"guest.subscriber.d.ts","sourceRoot":"","sources":["../../../src/guest/subscribers/guest.subscriber.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AAC/E,OAAO,EAAE,uBAAuB,EAAE,MAAM,+CAA+C,CAAC;AAExF,qBACa,eAAe;IAExB,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IACpC,OAAO,CAAC,QAAQ,CAAC,uBAAuB;gBADvB,mBAAmB,EAAE,mBAAmB,EACxC,uBAAuB,EAAE,uBAAuB;IAI7D,kBAAkB,CAAC,OAAO,EAAE,GAAG;IAgB/B,eAAe,CAAC,OAAO,EAAE,GAAG;CAcnC"} \ No newline at end of file diff --git a/dist/guest/subscribers/guest.subscriber.js b/dist/guest/subscribers/guest.subscriber.js deleted file mode 100644 index 70ea7f4..0000000 --- a/dist/guest/subscribers/guest.subscriber.js +++ /dev/null @@ -1,58 +0,0 @@ -"use strict"; -var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (this && this.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.GuestSubscriber = void 0; -const event_emitter_1 = require("@nestjs/event-emitter"); -const common_1 = require("@nestjs/common"); -const notification_service_1 = require("../../core/services/notification.service"); -const notification_rule_service_1 = require("../../core/services/notification-rule.service"); -let GuestSubscriber = class GuestSubscriber { - constructor(notificationService, notificationRuleService) { - this.notificationService = notificationService; - this.notificationRuleService = notificationRuleService; - } - async handleGuestInvited(payload) { - const { guest } = payload; - const rules = await this.notificationRuleService.getRulesForEvent(guest.tenantId, 'guest', 'guest.invited'); - for (const rule of rules) { - for (const channel of rule.channels) { - await this.notificationService.send(channel, guest.email || guest.phone || '', 'Has sido invitado', `Hola ${guest.name}, has sido invitado al evento.`); - } - } - } - async handleGuestRsvp(payload) { - const { guest } = payload; - const rules = await this.notificationRuleService.getRulesForEvent(guest.tenantId, 'guest', 'guest.rsvp'); - for (const rule of rules) { - for (const channel of rule.channels) { - await this.notificationService.send(channel, guest.email || guest.phone || '', 'RSVP actualizado', `Hola ${guest.name}, tu RSVP ha sido actualizado.`); - } - } - } -}; -exports.GuestSubscriber = GuestSubscriber; -__decorate([ - (0, event_emitter_1.OnEvent)('guest.invited'), - __metadata("design:type", Function), - __metadata("design:paramtypes", [Object]), - __metadata("design:returntype", Promise) -], GuestSubscriber.prototype, "handleGuestInvited", null); -__decorate([ - (0, event_emitter_1.OnEvent)('guest.rsvp'), - __metadata("design:type", Function), - __metadata("design:paramtypes", [Object]), - __metadata("design:returntype", Promise) -], GuestSubscriber.prototype, "handleGuestRsvp", null); -exports.GuestSubscriber = GuestSubscriber = __decorate([ - (0, common_1.Injectable)(), - __metadata("design:paramtypes", [notification_service_1.NotificationService, - notification_rule_service_1.NotificationRuleService]) -], GuestSubscriber); diff --git a/dist/guest/workflows/guest.workflow.d.ts b/dist/guest/workflows/guest.workflow.d.ts deleted file mode 100644 index e94b76d..0000000 --- a/dist/guest/workflows/guest.workflow.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { BaseWorkflow } from '../../core/workflows/base-workflow'; -export declare class GuestWorkflow extends BaseWorkflow { - execute(...args: any[]): Promise; -} -//# sourceMappingURL=guest.workflow.d.ts.map \ No newline at end of file diff --git a/dist/guest/workflows/guest.workflow.d.ts.map b/dist/guest/workflows/guest.workflow.d.ts.map deleted file mode 100644 index 1db1f6d..0000000 --- a/dist/guest/workflows/guest.workflow.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"guest.workflow.d.ts","sourceRoot":"","sources":["../../../src/guest/workflows/guest.workflow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAElE,qBAAa,aAAc,SAAQ,YAAY;IACvC,OAAO,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;CAM5C"} \ No newline at end of file diff --git a/dist/guest/workflows/guest.workflow.js b/dist/guest/workflows/guest.workflow.js deleted file mode 100644 index 6c364e7..0000000 --- a/dist/guest/workflows/guest.workflow.js +++ /dev/null @@ -1,13 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.GuestWorkflow = void 0; -const base_workflow_1 = require("../../core/workflows/base-workflow"); -class GuestWorkflow extends base_workflow_1.BaseWorkflow { - async execute(...args) { - this.logExecution('Ejecutando workflow de invitados', args); - // Implementar lógica de workflow para invitados - // ...existing code... - return {}; - } -} -exports.GuestWorkflow = GuestWorkflow; diff --git a/dist/main.d.ts b/dist/main.d.ts deleted file mode 100644 index 1d8bf0b..0000000 --- a/dist/main.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -import 'reflect-metadata'; -//# sourceMappingURL=main.d.ts.map \ No newline at end of file diff --git a/dist/main.d.ts.map b/dist/main.d.ts.map deleted file mode 100644 index 6c086af..0000000 --- a/dist/main.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC"} \ No newline at end of file diff --git a/dist/main.js b/dist/main.js deleted file mode 100644 index d82368d..0000000 --- a/dist/main.js +++ /dev/null @@ -1,14 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -require("reflect-metadata"); -const core_1 = require("@nestjs/core"); -const app_module_1 = require("./app.module"); -const auth_guard_1 = require("./core/auth.guard"); -async function bootstrap() { - const app = await core_1.NestFactory.create(app_module_1.AppModule); - app.setGlobalPrefix('api'); - app.useGlobalGuards(app.get(auth_guard_1.AuthGuard)); - await app.listen(process.env.PORT ? Number(process.env.PORT) : 3000); - console.log(`Application is running on: ${await app.getUrl()}`); -} -bootstrap(); diff --git a/dist/todo/api/todo.controller.d.ts b/dist/todo/api/todo.controller.d.ts deleted file mode 100644 index cdcf0af..0000000 --- a/dist/todo/api/todo.controller.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { TodoService } from '../services/todo.service'; -export declare class TodoController { - private readonly todoService; - constructor(todoService: TodoService); - createTodo(tenantId: string, dto: any): Promise; - listTodos(tenantId: string): Promise; - completeTodo(tenantId: string, id: string): Promise; -} -//# sourceMappingURL=todo.controller.d.ts.map \ No newline at end of file diff --git a/dist/todo/api/todo.controller.d.ts.map b/dist/todo/api/todo.controller.d.ts.map deleted file mode 100644 index 019de8d..0000000 --- a/dist/todo/api/todo.controller.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"todo.controller.d.ts","sourceRoot":"","sources":["../../../src/todo/api/todo.controller.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,qBACa,cAAc;IACb,OAAO,CAAC,QAAQ,CAAC,WAAW;gBAAX,WAAW,EAAE,WAAW;IAG/C,UAAU,CACU,QAAQ,EAAE,MAAM,EAChC,GAAG,EAAE,GAAG;IAMZ,SAAS,CAAyB,QAAQ,EAAE,MAAM;IAKlD,YAAY,CACQ,QAAQ,EAAE,MAAM,EAC3B,EAAE,EAAE,MAAM;CAI1B"} \ No newline at end of file diff --git a/dist/todo/api/todo.controller.js b/dist/todo/api/todo.controller.js deleted file mode 100644 index b6d0100..0000000 --- a/dist/todo/api/todo.controller.js +++ /dev/null @@ -1,59 +0,0 @@ -"use strict"; -var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (this && this.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; -var __param = (this && this.__param) || function (paramIndex, decorator) { - return function (target, key) { decorator(target, key, paramIndex); } -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TodoController = void 0; -const common_1 = require("@nestjs/common"); -const todo_service_1 = require("../services/todo.service"); -let TodoController = class TodoController { - constructor(todoService) { - this.todoService = todoService; - } - async createTodo(tenantId, dto) { - return this.todoService.createTodo(tenantId, dto); - } - async listTodos(tenantId) { - return this.todoService.listTodos(tenantId); - } - async completeTodo(tenantId, id) { - return this.todoService.markComplete(tenantId, id); - } -}; -exports.TodoController = TodoController; -__decorate([ - (0, common_1.Post)(), - __param(0, (0, common_1.Headers)('x-tenant-id')), - __param(1, (0, common_1.Body)()), - __metadata("design:type", Function), - __metadata("design:paramtypes", [String, Object]), - __metadata("design:returntype", Promise) -], TodoController.prototype, "createTodo", null); -__decorate([ - (0, common_1.Get)(), - __param(0, (0, common_1.Headers)('x-tenant-id')), - __metadata("design:type", Function), - __metadata("design:paramtypes", [String]), - __metadata("design:returntype", Promise) -], TodoController.prototype, "listTodos", null); -__decorate([ - (0, common_1.Patch)(':id/complete'), - __param(0, (0, common_1.Headers)('x-tenant-id')), - __param(1, (0, common_1.Param)('id')), - __metadata("design:type", Function), - __metadata("design:paramtypes", [String, String]), - __metadata("design:returntype", Promise) -], TodoController.prototype, "completeTodo", null); -exports.TodoController = TodoController = __decorate([ - (0, common_1.Controller)('todo'), - __metadata("design:paramtypes", [todo_service_1.TodoService]) -], TodoController); diff --git a/dist/todo/entities/todo.entity.d.ts b/dist/todo/entities/todo.entity.d.ts deleted file mode 100644 index 3ebe2fe..0000000 --- a/dist/todo/entities/todo.entity.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { EntitySchema } from '@mikro-orm/core'; -import { BaseEntity } from '../../core/entities/base.entity'; -export declare class TodoItem extends BaseEntity { - title: string; - description?: string; - completed: boolean; - dueDate?: Date; -} -export declare const TodoItemSchema: EntitySchema>; -//# sourceMappingURL=todo.entity.d.ts.map \ No newline at end of file diff --git a/dist/todo/entities/todo.entity.d.ts.map b/dist/todo/entities/todo.entity.d.ts.map deleted file mode 100644 index 96ca994..0000000 --- a/dist/todo/entities/todo.entity.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"todo.entity.d.ts","sourceRoot":"","sources":["../../../src/todo/entities/todo.entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAE7D,qBAAa,QAAS,SAAQ,UAAU;IACtC,KAAK,EAAG,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,OAAO,CAAS;IAC3B,OAAO,CAAC,EAAE,IAAI,CAAC;CAChB;AAED,eAAO,MAAM,cAAc,+EAezB,CAAC"} \ No newline at end of file diff --git a/dist/todo/entities/todo.entity.js b/dist/todo/entities/todo.entity.js deleted file mode 100644 index 4270526..0000000 --- a/dist/todo/entities/todo.entity.js +++ /dev/null @@ -1,27 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TodoItemSchema = exports.TodoItem = void 0; -const core_1 = require("@mikro-orm/core"); -const base_entity_1 = require("../../core/entities/base.entity"); -class TodoItem extends base_entity_1.BaseEntity { - constructor() { - super(...arguments); - this.completed = false; - } -} -exports.TodoItem = TodoItem; -exports.TodoItemSchema = new core_1.EntitySchema({ - class: TodoItem, - tableName: 'todo_items', - properties: { - id: { type: 'uuid', primary: true }, - tenantId: { type: 'string' }, - metadata: { type: 'json', nullable: true }, - createdAt: { type: 'date', defaultRaw: 'now()' }, - updatedAt: { type: 'date', defaultRaw: 'now()' }, - title: { type: 'string' }, - description: { type: 'text', nullable: true }, - completed: { type: 'boolean', default: false }, - dueDate: { type: 'date', nullable: true }, - }, -}); diff --git a/dist/todo/services/todo.service.d.ts b/dist/todo/services/todo.service.d.ts deleted file mode 100644 index eed357c..0000000 --- a/dist/todo/services/todo.service.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { MikroORM } from '@mikro-orm/core'; -import { EventEmitter2 } from '@nestjs/event-emitter'; -import { TodoItem } from '../entities/todo.entity'; -export declare class TodoService { - private readonly orm; - private readonly eventEmitter; - constructor(orm: MikroORM, eventEmitter: EventEmitter2); - private get em(); - createTodo(tenantId: string, dto: Partial): Promise; - listTodos(tenantId: string): Promise; - markComplete(tenantId: string, id: string): Promise; -} -//# sourceMappingURL=todo.service.d.ts.map \ No newline at end of file diff --git a/dist/todo/services/todo.service.d.ts.map b/dist/todo/services/todo.service.d.ts.map deleted file mode 100644 index 7253241..0000000 --- a/dist/todo/services/todo.service.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"todo.service.d.ts","sourceRoot":"","sources":["../../../src/todo/services/todo.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAEnD,qBACa,WAAW;IAEpB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,YAAY;gBADZ,GAAG,EAAE,QAAQ,EACb,YAAY,EAAE,aAAa;IAG9C,OAAO,KAAK,EAAE,GAEb;IAEK,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC;IAWvE,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAIhD,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;CAS3E"} \ No newline at end of file diff --git a/dist/todo/services/todo.service.js b/dist/todo/services/todo.service.js deleted file mode 100644 index 119dd6b..0000000 --- a/dist/todo/services/todo.service.js +++ /dev/null @@ -1,54 +0,0 @@ -"use strict"; -var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (this && this.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TodoService = void 0; -const common_1 = require("@nestjs/common"); -const core_1 = require("@mikro-orm/core"); -const event_emitter_1 = require("@nestjs/event-emitter"); -const todo_entity_1 = require("../entities/todo.entity"); -let TodoService = class TodoService { - constructor(orm, eventEmitter) { - this.orm = orm; - this.eventEmitter = eventEmitter; - } - get em() { - return this.orm.em.fork(); - } - async createTodo(tenantId, dto) { - const todo = this.em.create(todo_entity_1.TodoItem, { - tenantId, - ...dto, - }); - this.em.persist(todo); - await this.em.flush(); - this.eventEmitter.emit('todo.created', { todo }); - return todo; - } - async listTodos(tenantId) { - return this.em.find(todo_entity_1.TodoItem, { tenantId }); - } - async markComplete(tenantId, id) { - const todo = await this.em.findOne(todo_entity_1.TodoItem, { tenantId, id }); - if (!todo) - return null; - todo.completed = true; - this.em.persist(todo); - await this.em.flush(); - this.eventEmitter.emit('todo.completed', { todo }); - return todo; - } -}; -exports.TodoService = TodoService; -exports.TodoService = TodoService = __decorate([ - (0, common_1.Injectable)(), - __metadata("design:paramtypes", [core_1.MikroORM, - event_emitter_1.EventEmitter2]) -], TodoService); diff --git a/dist/todo/subscribers/todo.subscriber.d.ts b/dist/todo/subscribers/todo.subscriber.d.ts deleted file mode 100644 index d509937..0000000 --- a/dist/todo/subscribers/todo.subscriber.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { NotificationService } from '../../core/services/notification.service'; -import { NotificationRuleService } from '../../core/services/notification-rule.service'; -export declare class TodoSubscriber { - private readonly notificationService; - private readonly notificationRuleService; - constructor(notificationService: NotificationService, notificationRuleService: NotificationRuleService); - handleTodoCreated(payload: any): Promise; - handleTodoCompleted(payload: any): Promise; -} -//# sourceMappingURL=todo.subscriber.d.ts.map \ No newline at end of file diff --git a/dist/todo/subscribers/todo.subscriber.d.ts.map b/dist/todo/subscribers/todo.subscriber.d.ts.map deleted file mode 100644 index 2973cd3..0000000 --- a/dist/todo/subscribers/todo.subscriber.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"todo.subscriber.d.ts","sourceRoot":"","sources":["../../../src/todo/subscribers/todo.subscriber.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AAC/E,OAAO,EAAE,uBAAuB,EAAE,MAAM,+CAA+C,CAAC;AAExF,qBACa,cAAc;IAEvB,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IACpC,OAAO,CAAC,QAAQ,CAAC,uBAAuB;gBADvB,mBAAmB,EAAE,mBAAmB,EACxC,uBAAuB,EAAE,uBAAuB;IAI7D,iBAAiB,CAAC,OAAO,EAAE,GAAG;IAgB9B,mBAAmB,CAAC,OAAO,EAAE,GAAG;CAcvC"} \ No newline at end of file diff --git a/dist/todo/subscribers/todo.subscriber.js b/dist/todo/subscribers/todo.subscriber.js deleted file mode 100644 index 5834fda..0000000 --- a/dist/todo/subscribers/todo.subscriber.js +++ /dev/null @@ -1,58 +0,0 @@ -"use strict"; -var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (this && this.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TodoSubscriber = void 0; -const event_emitter_1 = require("@nestjs/event-emitter"); -const common_1 = require("@nestjs/common"); -const notification_service_1 = require("../../core/services/notification.service"); -const notification_rule_service_1 = require("../../core/services/notification-rule.service"); -let TodoSubscriber = class TodoSubscriber { - constructor(notificationService, notificationRuleService) { - this.notificationService = notificationService; - this.notificationRuleService = notificationRuleService; - } - async handleTodoCreated(payload) { - const { todo } = payload; - const rules = await this.notificationRuleService.getRulesForEvent(todo.tenantId, 'todo', 'todo.created'); - for (const rule of rules) { - for (const channel of rule.channels) { - await this.notificationService.send(channel, todo.metadata?.notifyTo || '', 'Nueva tarea creada', `Se creó la tarea: ${todo.title}`); - } - } - } - async handleTodoCompleted(payload) { - const { todo } = payload; - const rules = await this.notificationRuleService.getRulesForEvent(todo.tenantId, 'todo', 'todo.completed'); - for (const rule of rules) { - for (const channel of rule.channels) { - await this.notificationService.send(channel, todo.metadata?.notifyTo || '', 'Tarea completada', `La tarea "${todo.title}" se ha marcado como completada.`); - } - } - } -}; -exports.TodoSubscriber = TodoSubscriber; -__decorate([ - (0, event_emitter_1.OnEvent)('todo.created'), - __metadata("design:type", Function), - __metadata("design:paramtypes", [Object]), - __metadata("design:returntype", Promise) -], TodoSubscriber.prototype, "handleTodoCreated", null); -__decorate([ - (0, event_emitter_1.OnEvent)('todo.completed'), - __metadata("design:type", Function), - __metadata("design:paramtypes", [Object]), - __metadata("design:returntype", Promise) -], TodoSubscriber.prototype, "handleTodoCompleted", null); -exports.TodoSubscriber = TodoSubscriber = __decorate([ - (0, common_1.Injectable)(), - __metadata("design:paramtypes", [notification_service_1.NotificationService, - notification_rule_service_1.NotificationRuleService]) -], TodoSubscriber); diff --git a/dist/todo/todo.module.d.ts b/dist/todo/todo.module.d.ts deleted file mode 100644 index 587c91a..0000000 --- a/dist/todo/todo.module.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export declare class TodoModule { -} -//# sourceMappingURL=todo.module.d.ts.map \ No newline at end of file diff --git a/dist/todo/todo.module.d.ts.map b/dist/todo/todo.module.d.ts.map deleted file mode 100644 index bb5c454..0000000 --- a/dist/todo/todo.module.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"todo.module.d.ts","sourceRoot":"","sources":["../../src/todo/todo.module.ts"],"names":[],"mappings":"AASA,qBAMa,UAAU;CAAG"} \ No newline at end of file diff --git a/dist/todo/todo.module.js b/dist/todo/todo.module.js deleted file mode 100644 index 56a1163..0000000 --- a/dist/todo/todo.module.js +++ /dev/null @@ -1,28 +0,0 @@ -"use strict"; -var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TodoModule = void 0; -const common_1 = require("@nestjs/common"); -const nestjs_1 = require("@mikro-orm/nestjs"); -const core_module_1 = require("../core/core.module"); -const todo_service_1 = require("./services/todo.service"); -const todo_controller_1 = require("./api/todo.controller"); -const todo_subscriber_1 = require("./subscribers/todo.subscriber"); -const todo_entity_1 = require("./entities/todo.entity"); -const todo_registration_1 = require("./todo.registration"); -let TodoModule = class TodoModule { -}; -exports.TodoModule = TodoModule; -exports.TodoModule = TodoModule = __decorate([ - (0, common_1.Module)({ - imports: [core_module_1.CoreModule, nestjs_1.MikroOrmModule.forFeature({ entities: [todo_entity_1.TodoItemSchema] })], - providers: [todo_service_1.TodoService, todo_subscriber_1.TodoSubscriber, todo_registration_1.TodoModuleRegistration], - controllers: [todo_controller_1.TodoController], - exports: [todo_service_1.TodoService], - }) -], TodoModule); diff --git a/dist/todo/todo.registration.d.ts b/dist/todo/todo.registration.d.ts deleted file mode 100644 index 7f44874..0000000 --- a/dist/todo/todo.registration.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { OnModuleInit } from '@nestjs/common'; -import { ModuleRegistryService } from '../core/services/module-registry.service'; -export declare class TodoModuleRegistration implements OnModuleInit { - private readonly moduleRegistry; - constructor(moduleRegistry: ModuleRegistryService); - onModuleInit(): void; -} -//# sourceMappingURL=todo.registration.d.ts.map \ No newline at end of file diff --git a/dist/todo/todo.registration.d.ts.map b/dist/todo/todo.registration.d.ts.map deleted file mode 100644 index f8115f9..0000000 --- a/dist/todo/todo.registration.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"todo.registration.d.ts","sourceRoot":"","sources":["../../src/todo/todo.registration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,0CAA0C,CAAC;AAEjF,qBACa,sBAAuB,YAAW,YAAY;IAC7C,OAAO,CAAC,QAAQ,CAAC,cAAc;gBAAd,cAAc,EAAE,qBAAqB;IAElE,YAAY;CAQb"} \ No newline at end of file diff --git a/dist/todo/todo.registration.js b/dist/todo/todo.registration.js deleted file mode 100644 index 8e87c86..0000000 --- a/dist/todo/todo.registration.js +++ /dev/null @@ -1,32 +0,0 @@ -"use strict"; -var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (this && this.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TodoModuleRegistration = void 0; -const common_1 = require("@nestjs/common"); -const module_registry_service_1 = require("../core/services/module-registry.service"); -let TodoModuleRegistration = class TodoModuleRegistration { - constructor(moduleRegistry) { - this.moduleRegistry = moduleRegistry; - } - onModuleInit() { - this.moduleRegistry.registerModule({ - key: 'todo', - name: 'To-do', - description: 'Lista de pendientes para la organización del matrimonio.', - routePrefix: '/todo', - }); - } -}; -exports.TodoModuleRegistration = TodoModuleRegistration; -exports.TodoModuleRegistration = TodoModuleRegistration = __decorate([ - (0, common_1.Injectable)(), - __metadata("design:paramtypes", [module_registry_service_1.ModuleRegistryService]) -], TodoModuleRegistration); diff --git a/dist/todo/workflows/todo.workflow.d.ts b/dist/todo/workflows/todo.workflow.d.ts deleted file mode 100644 index 5f6df47..0000000 --- a/dist/todo/workflows/todo.workflow.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { BaseWorkflow } from '../../core/workflows/base-workflow'; -export declare class TodoWorkflow extends BaseWorkflow { - execute(...args: any[]): Promise; -} -//# sourceMappingURL=todo.workflow.d.ts.map \ No newline at end of file diff --git a/dist/todo/workflows/todo.workflow.d.ts.map b/dist/todo/workflows/todo.workflow.d.ts.map deleted file mode 100644 index 936832b..0000000 --- a/dist/todo/workflows/todo.workflow.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"todo.workflow.d.ts","sourceRoot":"","sources":["../../../src/todo/workflows/todo.workflow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAElE,qBAAa,YAAa,SAAQ,YAAY;IACtC,OAAO,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;CAM5C"} \ No newline at end of file diff --git a/dist/todo/workflows/todo.workflow.js b/dist/todo/workflows/todo.workflow.js deleted file mode 100644 index 1f536b9..0000000 --- a/dist/todo/workflows/todo.workflow.js +++ /dev/null @@ -1,13 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TodoWorkflow = void 0; -const base_workflow_1 = require("../../core/workflows/base-workflow"); -class TodoWorkflow extends base_workflow_1.BaseWorkflow { - async execute(...args) { - this.logExecution('Ejecutando workflow de tareas', args); - // Implementar lógica de workflow para tareas - // ...existing code... - return {}; - } -} -exports.TodoWorkflow = TodoWorkflow; diff --git a/package-lock.json b/package-lock.json index 156bb0c..30f600a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,41 +1,309 @@ { "name": "planner", - "version": "0.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "planner", - "version": "0.1.0", - "dependencies": { - "@mikro-orm/core": "^7.0.3", - "@mikro-orm/decorators": "^7.0.3", - "@mikro-orm/migrations": "^7.0.3", - "@mikro-orm/nestjs": "^7.0.1", - "@mikro-orm/postgresql": "^7.0.3", - "@nestjs/common": "^11.1.17", - "@nestjs/core": "^11.1.17", - "@nestjs/event-emitter": "^3.0.1", - "@nestjs/platform-express": "^11.1.17", - "@nestjs/serve-static": "^5.0.4", - "express": "^5.2.1", - "jsonwebtoken": "^9.0.3", - "pg": "^8.20.0", - "reflect-metadata": "^0.1.13", - "rxjs": "^7.8.0", - "uuid": "^13.0.0" - }, + "workspaces": [ + "packages/*" + ], "devDependencies": { - "@mikro-orm/cli": "^7.0.3", - "@swc-node/register": "^1.11.1", - "@swc/core": "^1.15.18", - "@types/express": "^4.17.0", - "@types/jsonwebtoken": "^9.0.0", - "@types/node": "^20.0.0", - "nodemon": "^2.0.0", - "ts-node": "^10.0.0", - "tsconfig-paths": "^4.0.0", - "typescript": "^5.0.0" + "concurrently": "^8.2.2" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", + "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@borewit/text-codec": { @@ -95,6 +363,259 @@ "tslib": "^2.4.0" } }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.5" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", + "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.14.0", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.5", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", + "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/gen-mapping/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", @@ -242,33 +763,6 @@ "@mikro-orm/core": "7.0.3" } }, - "node_modules/@mikro-orm/postgresql/node_modules/postgres-array": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-3.0.4.tgz", - "integrity": "sha512-nAUSGfSDGOaOAEGwqsRY27GPOea7CNipJPOA7lPbdEpx5Kg3qzdP0AaWC5MlhTWV9s4hFX39nomVZ+C4tnGOJQ==", - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/@mikro-orm/postgresql/node_modules/postgres-date": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-2.1.0.tgz", - "integrity": "sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA==", - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/@mikro-orm/postgresql/node_modules/postgres-interval": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-4.0.2.tgz", - "integrity": "sha512-EMsphSQ1YkQqKZL2cuG0zHkmjCCzQqQ71l2GXITqRwjhRleCdv00bDk/ktaSi0LnlaPzAc3535KTrjXsTdtx7A==", - "license": "MIT", - "engines": { - "node": ">=12" - } - }, "node_modules/@mikro-orm/sql": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/@mikro-orm/sql/-/sql-7.0.3.tgz", @@ -450,6 +944,26 @@ "npm": ">=5.10.0" } }, + "node_modules/@oxc-project/runtime": { + "version": "0.115.0", + "resolved": "https://registry.npmjs.org/@oxc-project/runtime/-/runtime-0.115.0.tgz", + "integrity": "sha512-Rg8Wlt5dCbXhQnsXPrkOjL1DTSvXLgb2R/KYfnf1/K+R0k6UMLEmbQXPM+kwrWqSmWA2t0B1EtHy2/3zikQpvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.115.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.115.0.tgz", + "integrity": "sha512-4n91DKnebUS4yjUHl2g3/b2T+IUdCfmoZGhmwsovZCDaJSs+QkVAM+0AqqTxHSsHfeiMuueT75cZaZcT/m0pSw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, "node_modules/@oxc-resolver/binding-android-arm-eabi": { "version": "11.19.1", "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-android-arm-eabi/-/binding-android-arm-eabi-11.19.1.tgz", @@ -733,6 +1247,280 @@ "win32" ] }, + "node_modules/@planner/admin": { + "resolved": "packages/admin", + "link": true + }, + "node_modules/@planner/legacy": { + "resolved": "packages/legacy", + "link": true + }, + "node_modules/@planner/server": { + "resolved": "packages/server", + "link": true + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.9.tgz", + "integrity": "sha512-lcJL0bN5hpgJfSIz/8PIf02irmyL43P+j1pTCfbD1DbLkmGRuFIA4DD3B3ZOvGqG0XiVvRznbKtN0COQVaKUTg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.9.tgz", + "integrity": "sha512-J7Zk3kLYFsLtuH6U+F4pS2sYVzac0qkjcO5QxHS7OS7yZu2LRs+IXo+uvJ/mvpyUljDJ3LROZPoQfgBIpCMhdQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.9.tgz", + "integrity": "sha512-iwtmmghy8nhfRGeNAIltcNXzD0QMNaaA5U/NyZc1Ia4bxrzFByNMDoppoC+hl7cDiUq5/1CnFthpT9n+UtfFyg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.9.tgz", + "integrity": "sha512-DLFYI78SCiZr5VvdEplsVC2Vx53lnA4/Ga5C65iyldMVaErr86aiqCoNBLl92PXPfDtUYjUh+xFFor40ueNs4Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.9.tgz", + "integrity": "sha512-CsjTmTwd0Hri6iTw/DRMK7kOZ7FwAkrO4h8YWKoX/kcj833e4coqo2wzIFywtch/8Eb5enQ/lwLM7w6JX1W5RQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.9.tgz", + "integrity": "sha512-2x9O2JbSPxpxMDhP9Z74mahAStibTlrBMW0520+epJH5sac7/LwZW5Bmg/E6CXuEF53JJFW509uP+lSedaUNxg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.9.tgz", + "integrity": "sha512-JA1QRW31ogheAIRhIg9tjMfsYbglXXYGNPLdPEYrwFxdbkQCAzvpSCSHCDWNl4hTtrol8WeboCSEpjdZK8qrCg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.9.tgz", + "integrity": "sha512-aOKU9dJheda8Kj8Y3w9gnt9QFOO+qKPAl8SWd7JPHP+Cu0EuDAE5wokQubLzIDQWg2myXq2XhTpOVS07qqvT+w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.9.tgz", + "integrity": "sha512-OalO94fqj7IWRn3VdXWty75jC5dk4C197AWEuMhIpvVv2lw9fiPhud0+bW2ctCxb3YoBZor71QHbY+9/WToadA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.9.tgz", + "integrity": "sha512-cVEl1vZtBsBZna3YMjGXNvnYYrOJ7RzuWvZU0ffvJUexWkukMaDuGhUXn0rjnV0ptzGVkvc+vW9Yqy6h8YX4pg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.9.tgz", + "integrity": "sha512-UzYnKCIIc4heAKgI4PZ3dfBGUZefGCJ1TPDuLHoCzgrMYPb5Rv6TLFuYtyM4rWyHM7hymNdsg5ik2C+UD9VDbA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.9.tgz", + "integrity": "sha512-+6zoiF+RRyf5cdlFQP7nm58mq7+/2PFaY2DNQeD4B87N36JzfF/l9mdBkkmTvSYcYPE8tMh/o3cRlsx1ldLfog==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.9.tgz", + "integrity": "sha512-rgFN6sA/dyebil3YTlL2evvi/M+ivhfnyxec7AccTpRPccno/rPoNlqybEZQBkcbZu8Hy+eqNJCqfBR8P7Pg8g==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^1.1.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.9.tgz", + "integrity": "sha512-lHVNUG/8nlF1IQk1C0Ci574qKYyty2goMiPlRqkC5R+3LkXDkL5Dhx8ytbxq35m+pkHVIvIxviD+TWLdfeuadA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.9.tgz", + "integrity": "sha512-G0oA4+w1iY5AGi5HcDTxWsoxF509hrFIPB2rduV5aDqS9FtDg1CAfa7V34qImbjfhIcA8C+RekocJZA96EarwQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.7", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.7.tgz", + "integrity": "sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA==", + "dev": true, + "license": "MIT" + }, "node_modules/@swc-node/core": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@swc-node/core/-/core-1.14.1.tgz", @@ -775,24 +1563,6 @@ "typescript": ">= 4.3" } }, - "node_modules/@swc-node/register/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/@swc-node/sourcemap-support": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/@swc-node/sourcemap-support/-/sourcemap-support-0.6.1.tgz", @@ -843,176 +1613,6 @@ } } }, - "node_modules/@swc/core-darwin-arm64": { - "version": "1.15.18", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.18.tgz", - "integrity": "sha512-+mIv7uBuSaywN3C9LNuWaX1jJJ3SKfiJuE6Lr3bd+/1Iv8oMU7oLBjYMluX1UrEPzwN2qCdY6Io0yVicABoCwQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-darwin-x64": { - "version": "1.15.18", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.15.18.tgz", - "integrity": "sha512-wZle0eaQhnzxWX5V/2kEOI6Z9vl/lTFEC6V4EWcn+5pDjhemCpQv9e/TDJ0GIoiClX8EDWRvuZwh+Z3dhL1NAg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.15.18", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.18.tgz", - "integrity": "sha512-ao61HGXVqrJFHAcPtF4/DegmwEkVCo4HApnotLU8ognfmU8x589z7+tcf3hU+qBiU1WOXV5fQX6W9Nzs6hjxDw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.15.18", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.18.tgz", - "integrity": "sha512-3xnctOBLIq3kj8PxOCgPrGjBLP/kNOddr6f5gukYt/1IZxsITQaU9TDyjeX6jG+FiCIHjCuWuffsyQDL5Ew1bg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.15.18", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.18.tgz", - "integrity": "sha512-0a+Lix+FSSHBSBOA0XznCcHo5/1nA6oLLjcnocvzXeqtdjnPb+SvchItHI+lfeiuj1sClYPDvPMLSLyXFaiIKw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.15.18", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.18.tgz", - "integrity": "sha512-wG9J8vReUlpaHz4KOD/5UE1AUgirimU4UFT9oZmupUDEofxJKYb1mTA/DrMj0s78bkBiNI+7Fo2EgPuvOJfuAA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-x64-musl": { - "version": "1.15.18", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.18.tgz", - "integrity": "sha512-4nwbVvCphKzicwNWRmvD5iBaZj8JYsRGa4xOxJmOyHlMDpsvvJ2OR2cODlvWyGFH6BYL1MfIAK3qph3hp0Az6g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.15.18", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.18.tgz", - "integrity": "sha512-zk0RYO+LjiBCat2RTMHzAWaMky0cra9loH4oRrLKLLNuL+jarxKLFDA8xTZWEkCPLjUTwlRN7d28eDLLMgtUcQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.15.18", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.18.tgz", - "integrity": "sha512-yVuTrZ0RccD5+PEkpcLOBAuPbYBXS6rslENvIXfvJGXSdX5QGi1ehC4BjAMl5FkKLiam4kJECUI0l7Hq7T1vwg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.15.18", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.18.tgz", - "integrity": "sha512-7NRmE4hmUQNCbYU3Hn9Tz57mK9Qq4c97ZS+YlamlK6qG9Fb5g/BB3gPDe0iLlJkns/sYv2VWSkm8c3NmbEGjbg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, "node_modules/@swc/counter": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", @@ -1030,6 +1630,277 @@ "@swc/counter": "^0.1.3" } }, + "node_modules/@tailwindcss/node": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.2.tgz", + "integrity": "sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.19.0", + "jiti": "^2.6.1", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.2.2" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.2.tgz", + "integrity": "sha512-qEUA07+E5kehxYp9BVMpq9E8vnJuBHfJEC0vPC5e7iL/hw7HR61aDKoVoKzrG+QKp56vhNZe4qwkRmMC0zDLvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.2.2", + "@tailwindcss/oxide-darwin-arm64": "4.2.2", + "@tailwindcss/oxide-darwin-x64": "4.2.2", + "@tailwindcss/oxide-freebsd-x64": "4.2.2", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.2", + "@tailwindcss/oxide-linux-arm64-gnu": "4.2.2", + "@tailwindcss/oxide-linux-arm64-musl": "4.2.2", + "@tailwindcss/oxide-linux-x64-gnu": "4.2.2", + "@tailwindcss/oxide-linux-x64-musl": "4.2.2", + "@tailwindcss/oxide-wasm32-wasi": "4.2.2", + "@tailwindcss/oxide-win32-arm64-msvc": "4.2.2", + "@tailwindcss/oxide-win32-x64-msvc": "4.2.2" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.2.tgz", + "integrity": "sha512-dXGR1n+P3B6748jZO/SvHZq7qBOqqzQ+yFrXpoOWWALWndF9MoSKAT3Q0fYgAzYzGhxNYOoysRvYlpixRBBoDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.2.tgz", + "integrity": "sha512-iq9Qjr6knfMpZHj55/37ouZeykwbDqF21gPFtfnhCCKGDcPI/21FKC9XdMO/XyBM7qKORx6UIhGgg6jLl7BZlg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.2.tgz", + "integrity": "sha512-BlR+2c3nzc8f2G639LpL89YY4bdcIdUmiOOkv2GQv4/4M0vJlpXEa0JXNHhCHU7VWOKWT/CjqHdTP8aUuDJkuw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.2.tgz", + "integrity": "sha512-YUqUgrGMSu2CDO82hzlQ5qSb5xmx3RUrke/QgnoEx7KvmRJHQuZHZmZTLSuuHwFf0DJPybFMXMYf+WJdxHy/nQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.2.tgz", + "integrity": "sha512-FPdhvsW6g06T9BWT0qTwiVZYE2WIFo2dY5aCSpjG/S/u1tby+wXoslXS0kl3/KXnULlLr1E3NPRRw0g7t2kgaQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.2.tgz", + "integrity": "sha512-4og1V+ftEPXGttOO7eCmW7VICmzzJWgMx+QXAJRAhjrSjumCwWqMfkDrNu1LXEQzNAwz28NCUpucgQPrR4S2yw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.2.tgz", + "integrity": "sha512-oCfG/mS+/+XRlwNjnsNLVwnMWYH7tn/kYPsNPh+JSOMlnt93mYNCKHYzylRhI51X+TbR+ufNhhKKzm6QkqX8ag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.2.tgz", + "integrity": "sha512-rTAGAkDgqbXHNp/xW0iugLVmX62wOp2PoE39BTCGKjv3Iocf6AFbRP/wZT/kuCxC9QBh9Pu8XPkv/zCZB2mcMg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.2.tgz", + "integrity": "sha512-XW3t3qwbIwiSyRCggeO2zxe3KWaEbM0/kW9e8+0XpBgyKU4ATYzcVSMKteZJ1iukJ3HgHBjbg9P5YPRCVUxlnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.2.tgz", + "integrity": "sha512-eKSztKsmEsn1O5lJ4ZAfyn41NfG7vzCg496YiGtMDV86jz1q/irhms5O0VrY6ZwTUkFy/EKG3RfWgxSI3VbZ8Q==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.8.1", + "@emnapi/runtime": "^1.8.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.1", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.2.tgz", + "integrity": "sha512-qPmaQM4iKu5mxpsrWZMOZRgZv1tOZpUm+zdhhQP0VhJfyGGO3aUKdbh3gDZc/dPLQwW4eSqWGrrcWNBZWUWaXQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.2.tgz", + "integrity": "sha512-1T/37VvI7WyH66b+vqHj/cLwnCxt7Qt3WFu5Q8hk65aOvlwAhs7rAp1VkulBJw/N4tMirXjVnylTR72uI0HGcA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.2.2.tgz", + "integrity": "sha512-n4goKQbW8RVXIbNKRB/45LzyUqN451deQK0nzIeauVEqjlI49slUlgKYJM2QyUzap/PcpnS7kzSUmPb1sCRvYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.2.2", + "@tailwindcss/oxide": "4.2.2", + "postcss": "^8.5.6", + "tailwindcss": "4.2.2" + } + }, "node_modules/@tokenizer/inflate": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.4.1.tgz", @@ -1047,23 +1918,6 @@ "url": "https://github.com/sponsors/Borewit" } }, - "node_modules/@tokenizer/inflate/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/@tokenizer/token": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", @@ -1130,6 +1984,13 @@ "@types/node": "*" } }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/express": { "version": "4.17.25", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", @@ -1163,6 +2024,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/jsonwebtoken": { "version": "9.0.10", "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.10.tgz", @@ -1189,13 +2057,13 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "20.19.37", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.37.tgz", - "integrity": "sha512-8kzdPJ3FsNsVIurqBs7oodNnCEVbni9yUEkaHbgptDACOPW04jimGagZ51E6+lXUwJjgnBw+hyko/lkFWCldqw==", + "version": "24.12.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.0.tgz", + "integrity": "sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~6.21.0" + "undici-types": "~7.16.0" } }, "node_modules/@types/qs": { @@ -1212,6 +2080,26 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/react": { + "version": "19.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, "node_modules/@types/send": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", @@ -1245,6 +2133,328 @@ "@types/node": "*" } }, + "node_modules/@types/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/strip-json-comments": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", + "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.57.1.tgz", + "integrity": "sha512-Gn3aqnvNl4NGc6x3/Bqk1AOn0thyTU9bqDRhiRnUWezgvr2OnhYCWCgC8zXXRVqBsIL1pSDt7T9nJUe0oM0kDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.57.1", + "@typescript-eslint/type-utils": "8.57.1", + "@typescript-eslint/utils": "8.57.1", + "@typescript-eslint/visitor-keys": "8.57.1", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.57.1", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.57.1.tgz", + "integrity": "sha512-k4eNDan0EIMTT/dUKc/g+rsJ6wcHYhNPdY19VoX/EOtaAG8DLtKCykhrUnuHPYvinn5jhAPgD2Qw9hXBwrahsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.57.1", + "@typescript-eslint/types": "8.57.1", + "@typescript-eslint/typescript-estree": "8.57.1", + "@typescript-eslint/visitor-keys": "8.57.1", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.57.1.tgz", + "integrity": "sha512-vx1F37BRO1OftsYlmG9xay1TqnjNVlqALymwWVuYTdo18XuKxtBpCj1QlzNIEHlvlB27osvXFWptYiEWsVdYsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.57.1", + "@typescript-eslint/types": "^8.57.1", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.57.1.tgz", + "integrity": "sha512-hs/QcpCwlwT2L5S+3fT6gp0PabyGk4Q0Rv2doJXA0435/OpnSR3VRgvrp8Xdoc3UAYSg9cyUjTeFXZEPg/3OKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.57.1", + "@typescript-eslint/visitor-keys": "8.57.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.57.1.tgz", + "integrity": "sha512-0lgOZB8cl19fHO4eI46YUx2EceQqhgkPSuCGLlGi79L2jwYY1cxeYc1Nae8Aw1xjgW3PKVDLlr3YJ6Bxx8HkWg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.57.1.tgz", + "integrity": "sha512-+Bwwm0ScukFdyoJsh2u6pp4S9ktegF98pYUU0hkphOOqdMB+1sNQhIz8y5E9+4pOioZijrkfNO/HUJVAFFfPKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.57.1", + "@typescript-eslint/typescript-estree": "8.57.1", + "@typescript-eslint/utils": "8.57.1", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.57.1.tgz", + "integrity": "sha512-S29BOBPJSFUiblEl6RzPPjJt6w25A6XsBqRVDt53tA/tlL8q7ceQNZHTjPeONt/3S7KRI4quk+yP9jK2WjBiPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.57.1.tgz", + "integrity": "sha512-ybe2hS9G6pXpqGtPli9Gx9quNV0TWLOmh58ADlmZe9DguLq0tiAKVjirSbtM1szG6+QH6rVXyU6GTLQbWnMY+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.57.1", + "@typescript-eslint/tsconfig-utils": "8.57.1", + "@typescript-eslint/types": "8.57.1", + "@typescript-eslint/visitor-keys": "8.57.1", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.57.1.tgz", + "integrity": "sha512-XUNSJ/lEVFttPMMoDVA2r2bwrl8/oPx8cURtczkSEswY5T3AeLmCy+EKWQNdL4u0MmAHOjcWrqJp2cdvgjn8dQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.57.1", + "@typescript-eslint/types": "8.57.1", + "@typescript-eslint/typescript-estree": "8.57.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.57.1.tgz", + "integrity": "sha512-YWnmJkXbofiz9KbnbbwuA2rpGkFPLbAIetcCNO6mJ8gdhdZ/v7WDXsoGFAJuM6ikUFKTlSQnjWnVO4ux+UzS6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.57.1", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.1.tgz", + "integrity": "sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "1.0.0-rc.7" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "babel-plugin-react-compiler": "^1.0.0", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + } + } + }, "node_modules/accepts": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", @@ -1258,31 +2468,6 @@ "node": ">= 0.6" } }, - "node_modules/accepts/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, "node_modules/acorn": { "version": "8.16.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", @@ -1296,16 +2481,46 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, "engines": { "node": ">=0.4.0" } }, + "node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -1359,6 +2574,50 @@ "dev": true, "license": "MIT" }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/autoprefixer": { + "version": "10.4.27", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.27.tgz", + "integrity": "sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.1", + "caniuse-lite": "^1.0.30001774", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -1366,6 +2625,28 @@ "dev": true, "license": "MIT" }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.8", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.8.tgz", + "integrity": "sha512-PCLz/LXGBsNTErbtB6i5u4eLpHeMfi93aUv5duMmj6caNu6IphS4q6UevDnL36sZQv9lrP11dbPKGMaXPwMKfQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/bcryptjs": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-3.0.3.tgz", + "integrity": "sha512-GlF5wPWnSa/X5LKM1o0wz0suXIINz1iHRLvTS+sLyi7XPbe5ycmYI3DlZqVGZZtDgl4DmasFg7gOB3JYbphV5g==", + "license": "BSD-3-Clause", + "bin": { + "bcrypt": "bin/bcrypt" + } + }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -1403,71 +2684,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/body-parser/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/body-parser/node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/body-parser/node_modules/mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/body-parser/node_modules/type-is": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", - "license": "MIT", - "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/brace-expansion": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", @@ -1492,6 +2708,40 @@ "node": ">=8" } }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, "node_modules/buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", @@ -1553,6 +2803,67 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001780", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001780.tgz", + "integrity": "sha512-llngX0E7nQci5BPJDqoZSbuZ5Bcs9F5db7EtgfwBerX9XGtkkiO4NwfDDIRzHTTwcYC8vC7bmeUEPGrKlR/TkQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -1642,6 +2953,34 @@ "typedarray": "^0.0.6" } }, + "node_modules/concurrently": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz", + "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "date-fns": "^2.30.0", + "lodash": "^4.17.21", + "rxjs": "^7.8.1", + "shell-quote": "^1.8.1", + "spawn-command": "0.0.2", + "supports-color": "^8.1.1", + "tree-kill": "^1.2.2", + "yargs": "^17.7.2" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": "^14.13.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, "node_modules/consola": { "version": "3.4.2", "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", @@ -1673,6 +3012,13 @@ "node": ">= 0.6" } }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, "node_modules/cookie": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", @@ -1715,16 +3061,69 @@ "dev": true, "license": "MIT" }, - "node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "license": "MIT", "dependencies": { - "ms": "^2.1.1" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" } }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -1734,6 +3133,16 @@ "node": ">= 0.8" } }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, "node_modules/diff": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", @@ -1744,6 +3153,19 @@ "node": ">=0.3.1" } }, + "node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -1758,6 +3180,16 @@ "node": ">= 0.4" } }, + "node_modules/dynamic-dedupe": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz", + "integrity": "sha512-ssuANeD+z97meYOqd50e04Ze5qp4bPqo8cCkI4TRjZkzAUgIDTrXV1R8QCdINpiI+hw14+rYazvTRdQrz0/rFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + } + }, "node_modules/ecdsa-sig-formatter": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", @@ -1773,6 +3205,13 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "license": "MIT" }, + "node_modules/electron-to-chromium": { + "version": "1.5.321", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.321.tgz", + "integrity": "sha512-L2C7Q279W2D/J4PLZLk7sebOILDSWos7bMsMNN06rK482umHUrh/3lM8G7IlHFOYip2oAg5nha1rCMxr/rs6ZQ==", + "dev": true, + "license": "ISC" + }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -1789,6 +3228,20 @@ "node": ">= 0.8" } }, + "node_modules/enhanced-resolve": { + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz", + "integrity": "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -1835,6 +3288,216 @@ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "license": "MIT" }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", + "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.2", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.5", + "@eslint/js": "9.39.4", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.5", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz", + "integrity": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.2.tgz", + "integrity": "sha512-hmgTH57GfzoTFjVN0yBwTggnsVUF2tcqi7RJZHqi9lIezSs4eFyAMktA68YD4r5kNw1mxyY4dmkyoFDb3FIqrA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": "^9 || ^10" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -1893,70 +3556,26 @@ "url": "https://opencollective.com/express" } }, - "node_modules/express/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" }, - "node_modules/express/node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" }, - "node_modules/express/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express/node_modules/type-is": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", - "license": "MIT", - "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "node": ">= 0.6" - } + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" }, "node_modules/fast-safe-stringify": { "version": "2.1.1", @@ -1964,6 +3583,19 @@ "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", "license": "MIT" }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/file-type": { "version": "21.3.2", "resolved": "https://registry.npmjs.org/file-type/-/file-type-21.3.2.tgz", @@ -2016,23 +3648,44 @@ "url": "https://opencollective.com/express" } }, - "node_modules/finalhandler/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, "license": "MIT", "dependencies": { - "ms": "^2.1.3" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=6.0" + "node": ">=10" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -2042,6 +3695,20 @@ "node": ">= 0.6" } }, + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, "node_modules/fresh": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", @@ -2051,6 +3718,13 @@ "node": ">= 0.8" } }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -2075,6 +3749,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -2122,6 +3806,28 @@ "node": ">= 0.4" } }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", @@ -2135,6 +3841,19 @@ "node": ">= 6" } }, + "node_modules/globals": { + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.4.0.tgz", + "integrity": "sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -2147,6 +3866,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/has-symbols": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", @@ -2171,6 +3907,23 @@ "node": ">= 0.4" } }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, "node_modules/http-errors": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", @@ -2227,6 +3980,16 @@ ], "license": "BSD-3-Clause" }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/ignore-by-default": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", @@ -2234,6 +3997,45 @@ "dev": true, "license": "ISC" }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "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.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -2262,6 +4064,22 @@ "node": ">=8" } }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -2311,6 +4129,13 @@ "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", "license": "MIT" }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, "node_modules/iterare": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/iterare/-/iterare-1.2.1.tgz", @@ -2320,6 +4145,70 @@ "node": ">=6" } }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -2376,6 +4265,16 @@ "safe-buffer": "^5.0.1" } }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/kysely": { "version": "0.28.12", "resolved": "https://registry.npmjs.org/kysely/-/kysely-0.28.12.tgz", @@ -2385,6 +4284,281 @@ "node": ">=20.0.0" } }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/load-esm": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/load-esm/-/load-esm-1.0.3.tgz", @@ -2404,6 +4578,29 @@ "node": ">=13.2.0" } }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.includes": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", @@ -2440,12 +4637,39 @@ "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", "license": "MIT" }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", "license": "MIT" }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -2463,12 +4687,12 @@ } }, "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/merge-descriptors": { @@ -2494,24 +4718,28 @@ } }, "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "license": "MIT", "dependencies": { - "mime-db": "1.52.0" + "mime-db": "^1.54.0" }, "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/minimatch": { @@ -2537,6 +4765,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -2562,6 +4803,75 @@ "url": "https://opencollective.com/express" } }, + "node_modules/multer/node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/multer/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/multer/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/multer/node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, "node_modules/negotiator": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", @@ -2571,6 +4881,13 @@ "node": ">= 0.6" } }, + "node_modules/node-releases": { + "version": "2.0.36", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz", + "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==", + "dev": true, + "license": "MIT" + }, "node_modules/nodemon": { "version": "2.0.22", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", @@ -2600,6 +4917,16 @@ "url": "https://opencollective.com/nodemon" } }, + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, "node_modules/nodemon/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -2685,6 +5012,24 @@ "wrappy": "1" } }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/oxc-resolver": { "version": "11.19.1", "resolved": "https://registry.npmjs.org/oxc-resolver/-/oxc-resolver-11.19.1.tgz", @@ -2717,6 +5062,51 @@ "@oxc-resolver/binding-win32-x64-msvc": "11.19.1" } }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -2726,6 +5116,43 @@ "node": ">= 0.8" } }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, "node_modules/path-to-regexp": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", @@ -2825,6 +5252,36 @@ "node": ">=4" } }, + "node_modules/pg-types/node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/pg-types/node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pg-types/node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/pgpass": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", @@ -2834,6 +5291,13 @@ "split2": "^4.1.0" } }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -2857,13 +5321,49 @@ "node": ">= 6" } }, + "node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, "node_modules/postgres-array": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", - "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-3.0.4.tgz", + "integrity": "sha512-nAUSGfSDGOaOAEGwqsRY27GPOea7CNipJPOA7lPbdEpx5Kg3qzdP0AaWC5MlhTWV9s4hFX39nomVZ+C4tnGOJQ==", "license": "MIT", "engines": { - "node": ">=4" + "node": ">=12" } }, "node_modules/postgres-bytea": { @@ -2876,24 +5376,31 @@ } }, "node_modules/postgres-date": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", - "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-2.1.0.tgz", + "integrity": "sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA==", "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, "node_modules/postgres-interval": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", - "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-4.0.2.tgz", + "integrity": "sha512-EMsphSQ1YkQqKZL2cuG0zHkmjCCzQqQ71l2GXITqRwjhRleCdv00bDk/ktaSi0LnlaPzAc3535KTrjXsTdtx7A==", "license": "MIT", - "dependencies": { - "xtend": "^4.0.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">=12" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" } }, "node_modules/proxy-addr": { @@ -2916,10 +5423,20 @@ "dev": true, "license": "MIT" }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/qs": { - "version": "6.14.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", - "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz", + "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==", "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.1.0" @@ -2955,6 +5472,78 @@ "node": ">= 0.10" } }, + "node_modules/react": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", + "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.4" + } + }, + "node_modules/react-router": { + "version": "7.13.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.13.1.tgz", + "integrity": "sha512-td+xP4X2/6BJvZoX6xw++A2DdEi++YypA69bJUV5oVvqf6/9/9nNlD70YO1e9d3MyamJEBQFEzk6mbfDYbqrSA==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.13.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.13.1.tgz", + "integrity": "sha512-UJnV3Rxc5TgUPJt2KJpo1Jpy0OKQr0AjgbZzBFjaPJcFOb2Y8jA5H3LT8HUJAiRLlWrEXWHbF1Z4SCZaQjWDHw==", + "license": "MIT", + "dependencies": { + "react-router": "7.13.1" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/react-router/node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -2998,6 +5587,92 @@ "node": ">=0.10.0" } }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/rolldown": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.9.tgz", + "integrity": "sha512-9EbgWge7ZH+yqb4d2EnELAntgPTWbfL8ajiTW+SyhJEC4qhBbkCKbqFV4Ge4zmu5ziQuVbWxb/XwLZ+RIO7E8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.115.0", + "@rolldown/pluginutils": "1.0.0-rc.9" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.0-rc.9", + "@rolldown/binding-darwin-arm64": "1.0.0-rc.9", + "@rolldown/binding-darwin-x64": "1.0.0-rc.9", + "@rolldown/binding-freebsd-x64": "1.0.0-rc.9", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.9", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.9", + "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.9", + "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.9", + "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.9", + "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.9", + "@rolldown/binding-linux-x64-musl": "1.0.0-rc.9", + "@rolldown/binding-openharmony-arm64": "1.0.0-rc.9", + "@rolldown/binding-wasm32-wasi": "1.0.0-rc.9", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.9", + "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.9" + } + }, + "node_modules/rolldown/node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.9.tgz", + "integrity": "sha512-w6oiRWgEBl04QkFZgmW+jnU1EC9b57Oihi2ot3HNWIQRqgHp5PnYDia5iZ5FF7rpa4EQdiqMDXjlqKGXBhsoXw==", + "dev": true, + "license": "MIT" + }, "node_modules/router": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", @@ -3014,23 +5689,6 @@ "node": ">= 18" } }, - "node_modules/router/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/rxjs": { "version": "7.8.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", @@ -3066,6 +5724,12 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "license": "MIT" }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, "node_modules/semver": { "version": "7.7.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", @@ -3104,48 +5768,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/send/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/send/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/send/node_modules/mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, "node_modules/serve-static": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", @@ -3165,12 +5787,54 @@ "url": "https://opencollective.com/express" } }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "license": "MIT" + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "license": "ISC" }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/side-channel": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", @@ -3276,6 +5940,16 @@ "node": ">=0.10.0" } }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", @@ -3287,6 +5961,12 @@ "source-map": "^0.6.0" } }, + "node_modules/spawn-command": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz", + "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==", + "dev": true + }, "node_modules/split2": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", @@ -3360,6 +6040,19 @@ "node": ">=4" } }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/strtok3": { "version": "10.3.4", "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-10.3.4.tgz", @@ -3376,6 +6069,104 @@ "url": "https://github.com/sponsors/Borewit" } }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.2.tgz", + "integrity": "sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -3426,6 +6217,29 @@ "nodetouch": "bin/nodetouch.js" } }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/ts-api-utils": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/ts-node": { "version": "10.9.2", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", @@ -3470,6 +6284,54 @@ } } }, + "node_modules/ts-node-dev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-2.0.0.tgz", + "integrity": "sha512-ywMrhCfH6M75yftYvrvNarLEY+SUXtUvU8/0Z6llrHQVBx12GiFk5sStF8UdfE/yfzk9IAq7O5EEbTQsxlBI8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.5.1", + "dynamic-dedupe": "^0.3.0", + "minimist": "^1.2.6", + "mkdirp": "^1.0.4", + "resolve": "^1.0.0", + "rimraf": "^2.6.1", + "source-map-support": "^0.5.12", + "tree-kill": "^1.2.2", + "ts-node": "^10.4.0", + "tsconfig": "^7.0.0" + }, + "bin": { + "ts-node-dev": "lib/bin.js", + "tsnd": "lib/bin.js" + }, + "engines": { + "node": ">=0.8.0" + }, + "peerDependencies": { + "node-notifier": "*", + "typescript": "*" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/tsconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", + "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/strip-bom": "^3.0.0", + "@types/strip-json-comments": "0.0.30", + "strip-bom": "^3.0.0", + "strip-json-comments": "^2.0.0" + } + }, "node_modules/tsconfig-paths": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", @@ -3485,20 +6347,44 @@ "node": ">=6" } }, + "node_modules/tsconfig/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, "license": "MIT", "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" }, "engines": { "node": ">= 0.6" @@ -3524,6 +6410,30 @@ "node": ">=14.17" } }, + "node_modules/typescript-eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.57.1.tgz", + "integrity": "sha512-fLvZWf+cAGw3tqMCYzGIU6yR8K+Y9NT2z23RwOjlNFF2HwSB3KhdEFI5lSBv8tNmFkkBShSjsCjzx1vahZfISA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.57.1", + "@typescript-eslint/parser": "8.57.1", + "@typescript-eslint/typescript-estree": "8.57.1", + "@typescript-eslint/utils": "8.57.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, "node_modules/uid": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/uid/-/uid-2.0.2.tgz", @@ -3556,9 +6466,9 @@ "license": "MIT" }, "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", "dev": true, "license": "MIT" }, @@ -3571,6 +6481,47 @@ "node": ">= 0.8" } }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -3606,6 +6557,124 @@ "node": ">= 0.8" } }, + "node_modules/vite": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.0.tgz", + "integrity": "sha512-fPGaRNj9Zytaf8LEiBhY7Z6ijnFKdzU/+mL8EFBaKr7Vw1/FWcTBAMW0wLPJAGMPX38ZPVCVgLceWiEqeoqL2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/runtime": "0.115.0", + "lightningcss": "^1.32.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.8", + "rolldown": "1.0.0-rc.9", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.0.0-alpha.31", + "esbuild": "^0.27.0", + "jiti": ">=1.21.0", + "less": "^4.0.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 + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -3649,6 +6718,13 @@ "node": ">=10" } }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", @@ -3687,6 +6763,172 @@ "engines": { "node": ">=6" } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + }, + "packages/admin": { + "name": "@planner/admin", + "version": "0.0.0", + "dependencies": { + "react": "^19.2.4", + "react-dom": "^19.2.4", + "react-router-dom": "^7.13.1" + }, + "devDependencies": { + "@eslint/js": "^9.39.4", + "@tailwindcss/postcss": "^4.2.2", + "@types/node": "^24.12.0", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.0", + "autoprefixer": "^10.4.27", + "eslint": "^9.39.4", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.5.2", + "globals": "^17.4.0", + "postcss": "^8.5.8", + "tailwindcss": "^4.2.2", + "typescript": "~5.9.3", + "typescript-eslint": "^8.56.1", + "vite": "^8.0.0" + } + }, + "packages/legacy": { + "name": "@planner/legacy", + "version": "0.1.0", + "dependencies": { + "@mikro-orm/core": "^7.0.3", + "@mikro-orm/decorators": "^7.0.3", + "@mikro-orm/migrations": "^7.0.3", + "@mikro-orm/nestjs": "^7.0.1", + "@mikro-orm/postgresql": "^7.0.3", + "@nestjs/common": "^11.1.17", + "@nestjs/core": "^11.1.17", + "@nestjs/event-emitter": "^3.0.1", + "@nestjs/platform-express": "^11.1.17", + "@nestjs/serve-static": "^5.0.4", + "bcryptjs": "^3.0.3", + "express": "^5.2.1", + "jsonwebtoken": "^9.0.3", + "pg": "^8.20.0", + "reflect-metadata": "^0.1.13", + "rxjs": "^7.8.0", + "uuid": "^13.0.0" + }, + "devDependencies": { + "@mikro-orm/cli": "^7.0.3", + "@swc-node/register": "^1.11.1", + "@swc/core": "^1.15.18", + "@types/express": "^4.17.0", + "@types/jsonwebtoken": "^9.0.0", + "@types/node": "^20.0.0", + "nodemon": "^2.0.0", + "ts-node": "^10.0.0", + "tsconfig-paths": "^4.0.0", + "typescript": "^5.0.0" + } + }, + "packages/legacy/node_modules/@types/node": { + "version": "20.19.37", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.37.tgz", + "integrity": "sha512-8kzdPJ3FsNsVIurqBs7oodNnCEVbni9yUEkaHbgptDACOPW04jimGagZ51E6+lXUwJjgnBw+hyko/lkFWCldqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "packages/legacy/node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "packages/server": { + "name": "@planner/server", + "version": "0.1.0", + "dependencies": { + "@mikro-orm/core": "^7.0.3", + "@mikro-orm/migrations": "^7.0.3", + "@mikro-orm/postgresql": "^7.0.3", + "bcryptjs": "^3.0.3", + "express": "^5.2.1", + "jsonwebtoken": "^9.0.3", + "pg": "^8.20.0", + "reflect-metadata": "^0.1.13", + "uuid": "^13.0.0", + "zod": "^3.24.2" + }, + "devDependencies": { + "@mikro-orm/cli": "^7.0.3", + "@types/express": "^4.17.0", + "@types/jsonwebtoken": "^9.0.0", + "@types/node": "^20.0.0", + "dotenv": "^16.3.1", + "ts-node-dev": "^2.0.0", + "typescript": "^5.0.0" + } + }, + "packages/server/node_modules/@types/node": { + "version": "20.19.37", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.37.tgz", + "integrity": "sha512-8kzdPJ3FsNsVIurqBs7oodNnCEVbni9yUEkaHbgptDACOPW04jimGagZ51E6+lXUwJjgnBw+hyko/lkFWCldqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "packages/server/node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "packages/server/node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } } } diff --git a/package.json b/package.json index 483f39a..cf22f47 100644 --- a/package.json +++ b/package.json @@ -1,43 +1,18 @@ { "name": "planner", - "version": "0.1.0", "private": true, + "workspaces": ["packages/*"], "scripts": { - "start": "ts-node -r tsconfig-paths/register src/main.ts", - "start:dev": "npx nodemon --watch src --ext ts --exec \"npm run build && node dist/main.js\"", - "build": "tsc -p tsconfig.build.json", - "migration:generate": "mikro-orm migration:create", - "migration:run": "mikro-orm migration:up", - "migration:down": "mikro-orm migration:down" - }, - "dependencies": { - "@mikro-orm/core": "^7.0.3", - "@mikro-orm/decorators": "^7.0.3", - "@mikro-orm/migrations": "^7.0.3", - "@mikro-orm/nestjs": "^7.0.1", - "@mikro-orm/postgresql": "^7.0.3", - "@nestjs/common": "^11.1.17", - "@nestjs/core": "^11.1.17", - "@nestjs/event-emitter": "^3.0.1", - "@nestjs/platform-express": "^11.1.17", - "@nestjs/serve-static": "^5.0.4", - "express": "^5.2.1", - "jsonwebtoken": "^9.0.3", - "pg": "^8.20.0", - "reflect-metadata": "^0.1.13", - "rxjs": "^7.8.0", - "uuid": "^13.0.0" + "dev": "concurrently \"npm:dev:server\" \"npm:dev:admin\"", + "dev:server": "npm --workspace @planner/server run dev", + "dev:admin": "npm --workspace @planner/admin run dev", + "build": "npm run build:server && npm run build:admin", + "build:server": "npm --workspace @planner/server run build", + "build:admin": "npm --workspace @planner/admin run build", + "start": "npm --workspace @planner/server run start", + "lint": "npm run lint:server && npm run lint:admin" }, "devDependencies": { - "@mikro-orm/cli": "^7.0.3", - "@swc-node/register": "^1.11.1", - "@swc/core": "^1.15.18", - "@types/express": "^4.17.0", - "@types/jsonwebtoken": "^9.0.0", - "@types/node": "^20.0.0", - "nodemon": "^2.0.0", - "ts-node": "^10.0.0", - "tsconfig-paths": "^4.0.0", - "typescript": "^5.0.0" + "concurrently": "^8.2.2" } } diff --git a/packages/admin/.gitignore b/packages/admin/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/packages/admin/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/packages/admin/README.md b/packages/admin/README.md new file mode 100644 index 0000000..7dbf7eb --- /dev/null +++ b/packages/admin/README.md @@ -0,0 +1,73 @@ +# React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Oxc](https://oxc.rs) +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) + +## React Compiler + +The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation). + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules: + +```js +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + // Other configs... + + // Remove tseslint.configs.recommended and replace with this + tseslint.configs.recommendedTypeChecked, + // Alternatively, use this for stricter rules + tseslint.configs.strictTypeChecked, + // Optionally, add this for stylistic rules + tseslint.configs.stylisticTypeChecked, + + // Other configs... + ], + languageOptions: { + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + // other options... + }, + }, +]) +``` + +You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules: + +```js +// eslint.config.js +import reactX from 'eslint-plugin-react-x' +import reactDom from 'eslint-plugin-react-dom' + +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + // Other configs... + // Enable lint rules for React + reactX.configs['recommended-typescript'], + // Enable lint rules for React DOM + reactDom.configs.recommended, + ], + languageOptions: { + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + // other options... + }, + }, +]) +``` diff --git a/packages/admin/eslint.config.js b/packages/admin/eslint.config.js new file mode 100644 index 0000000..5e6b472 --- /dev/null +++ b/packages/admin/eslint.config.js @@ -0,0 +1,23 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import tseslint from 'typescript-eslint' +import { defineConfig, globalIgnores } from 'eslint/config' + +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + js.configs.recommended, + tseslint.configs.recommended, + reactHooks.configs.flat.recommended, + reactRefresh.configs.vite, + ], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + }, +]) diff --git a/packages/admin/index.html b/packages/admin/index.html new file mode 100644 index 0000000..4fe18a5 --- /dev/null +++ b/packages/admin/index.html @@ -0,0 +1,13 @@ + + + + + + + admin + + +
+ + + diff --git a/packages/admin/package.json b/packages/admin/package.json new file mode 100644 index 0000000..443c7e0 --- /dev/null +++ b/packages/admin/package.json @@ -0,0 +1,35 @@ +{ + "name": "@planner/admin", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "react": "^19.2.4", + "react-dom": "^19.2.4", + "react-router-dom": "^7.13.1" + }, + "devDependencies": { + "@eslint/js": "^9.39.4", + "@tailwindcss/postcss": "^4.2.2", + "@types/node": "^24.12.0", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.0", + "autoprefixer": "^10.4.27", + "eslint": "^9.39.4", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.5.2", + "globals": "^17.4.0", + "postcss": "^8.5.8", + "tailwindcss": "^4.2.2", + "typescript": "~5.9.3", + "typescript-eslint": "^8.56.1", + "vite": "^8.0.0" + } +} diff --git a/packages/admin/postcss.config.js b/packages/admin/postcss.config.js new file mode 100644 index 0000000..b060dcb --- /dev/null +++ b/packages/admin/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + "@tailwindcss/postcss": {}, + autoprefixer: {} + } +}; diff --git a/packages/admin/public/favicon.svg b/packages/admin/public/favicon.svg new file mode 100644 index 0000000..6893eb13 --- /dev/null +++ b/packages/admin/public/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/admin/public/icons.svg b/packages/admin/public/icons.svg new file mode 100644 index 0000000..e952219 --- /dev/null +++ b/packages/admin/public/icons.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/admin/src/App.css b/packages/admin/src/App.css new file mode 100644 index 0000000..f90339d --- /dev/null +++ b/packages/admin/src/App.css @@ -0,0 +1,184 @@ +.counter { + font-size: 16px; + padding: 5px 10px; + border-radius: 5px; + color: var(--accent); + background: var(--accent-bg); + border: 2px solid transparent; + transition: border-color 0.3s; + margin-bottom: 24px; + + &:hover { + border-color: var(--accent-border); + } + &:focus-visible { + outline: 2px solid var(--accent); + outline-offset: 2px; + } +} + +.hero { + position: relative; + + .base, + .framework, + .vite { + inset-inline: 0; + margin: 0 auto; + } + + .base { + width: 170px; + position: relative; + z-index: 0; + } + + .framework, + .vite { + position: absolute; + } + + .framework { + z-index: 1; + top: 34px; + height: 28px; + transform: perspective(2000px) rotateZ(300deg) rotateX(44deg) rotateY(39deg) + scale(1.4); + } + + .vite { + z-index: 0; + top: 107px; + height: 26px; + width: auto; + transform: perspective(2000px) rotateZ(300deg) rotateX(40deg) rotateY(39deg) + scale(0.8); + } +} + +#center { + display: flex; + flex-direction: column; + gap: 25px; + place-content: center; + place-items: center; + flex-grow: 1; + + @media (max-width: 1024px) { + padding: 32px 20px 24px; + gap: 18px; + } +} + +#next-steps { + display: flex; + border-top: 1px solid var(--border); + text-align: left; + + & > div { + flex: 1 1 0; + padding: 32px; + @media (max-width: 1024px) { + padding: 24px 20px; + } + } + + .icon { + margin-bottom: 16px; + width: 22px; + height: 22px; + } + + @media (max-width: 1024px) { + flex-direction: column; + text-align: center; + } +} + +#docs { + border-right: 1px solid var(--border); + + @media (max-width: 1024px) { + border-right: none; + border-bottom: 1px solid var(--border); + } +} + +#next-steps ul { + list-style: none; + padding: 0; + display: flex; + gap: 8px; + margin: 32px 0 0; + + .logo { + height: 18px; + } + + a { + color: var(--text-h); + font-size: 16px; + border-radius: 6px; + background: var(--social-bg); + display: flex; + padding: 6px 12px; + align-items: center; + gap: 8px; + text-decoration: none; + transition: box-shadow 0.3s; + + &:hover { + box-shadow: var(--shadow); + } + .button-icon { + height: 18px; + width: 18px; + } + } + + @media (max-width: 1024px) { + margin-top: 20px; + flex-wrap: wrap; + justify-content: center; + + li { + flex: 1 1 calc(50% - 8px); + } + + a { + width: 100%; + justify-content: center; + box-sizing: border-box; + } + } +} + +#spacer { + height: 88px; + border-top: 1px solid var(--border); + @media (max-width: 1024px) { + height: 48px; + } +} + +.ticks { + position: relative; + width: 100%; + + &::before, + &::after { + content: ''; + position: absolute; + top: -4.5px; + border: 5px solid transparent; + } + + &::before { + left: 0; + border-left-color: var(--border); + } + &::after { + right: 0; + border-right-color: var(--border); + } +} diff --git a/packages/admin/src/App.tsx b/packages/admin/src/App.tsx new file mode 100644 index 0000000..40d2275 --- /dev/null +++ b/packages/admin/src/App.tsx @@ -0,0 +1,61 @@ +import { BrowserRouter, Navigate, Route, Routes } from "react-router-dom"; +import { Sidebar } from "./components/Sidebar"; +import { ProtectedRoute } from "./components/ProtectedRoute"; +import { LoginPage } from "./pages/Login"; +import { DashboardPage } from "./pages/Dashboard"; +import { GuestsPage } from "./pages/Guests"; +import { GiftsPage } from "./pages/Gifts"; +import { TodosPage } from "./pages/Todos"; +import "./index.css"; + +function App() { + return ( + +
+
+ +
+ + } /> + + + + } + /> + + + + } + /> + + + + } + /> + + + + } + /> + } /> + +
+
+
+
+ ); +} + +export default App; diff --git a/packages/admin/src/assets/hero.png b/packages/admin/src/assets/hero.png new file mode 100644 index 0000000000000000000000000000000000000000..cc51a3d20ad4bc961b596a6adfd686685cd84bb0 GIT binary patch literal 44919 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 JPDHLkV1myZcL)Fg literal 0 HcmV?d00001 diff --git a/packages/admin/src/assets/react.svg b/packages/admin/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/packages/admin/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/admin/src/assets/vite.svg b/packages/admin/src/assets/vite.svg new file mode 100644 index 0000000..5101b67 --- /dev/null +++ b/packages/admin/src/assets/vite.svg @@ -0,0 +1 @@ +Vite diff --git a/packages/admin/src/components/ProtectedRoute.tsx b/packages/admin/src/components/ProtectedRoute.tsx new file mode 100644 index 0000000..ccc569d --- /dev/null +++ b/packages/admin/src/components/ProtectedRoute.tsx @@ -0,0 +1,10 @@ +import type { ReactNode } from "react"; +import { Navigate } from "react-router-dom"; +import { isLoggedIn } from "../lib/auth"; + +export function ProtectedRoute({ children }: { children: ReactNode }) { + if (!isLoggedIn()) { + return ; + } + return <>{children}; +} diff --git a/packages/admin/src/components/Sidebar.tsx b/packages/admin/src/components/Sidebar.tsx new file mode 100644 index 0000000..a659fd0 --- /dev/null +++ b/packages/admin/src/components/Sidebar.tsx @@ -0,0 +1,28 @@ +import { NavLink } from "react-router-dom"; + +const linkClasses = ({ isActive }: { isActive: boolean }) => + `block px-4 py-2 rounded-lg transition hover:bg-slate-200 dark:hover:bg-slate-800 ${ + isActive ? "bg-slate-200 dark:bg-slate-800 font-semibold" : "" + }`; + +export function Sidebar() { + return ( + + ); +} diff --git a/packages/admin/src/index.css b/packages/admin/src/index.css new file mode 100644 index 0000000..51ca5af --- /dev/null +++ b/packages/admin/src/index.css @@ -0,0 +1,115 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +:root { + --text: #6b6375; + --text-h: #08060d; + --bg: #fff; + --border: #e5e4e7; + --code-bg: #f4f3ec; + --accent: #aa3bff; + --accent-bg: rgba(170, 59, 255, 0.1); + --accent-border: rgba(170, 59, 255, 0.5); + --social-bg: rgba(244, 243, 236, 0.5); + --shadow: + rgba(0, 0, 0, 0.1) 0 10px 15px -3px, rgba(0, 0, 0, 0.05) 0 4px 6px -2px; + + --sans: system-ui, 'Segoe UI', Roboto, sans-serif; + --heading: system-ui, 'Segoe UI', Roboto, sans-serif; + --mono: ui-monospace, Consolas, monospace; + + font: 18px/145% var(--sans); + letter-spacing: 0.18px; + color-scheme: light dark; + color: var(--text); + background: var(--bg); + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + + @media (max-width: 1024px) { + font-size: 16px; + } +} + +@media (prefers-color-scheme: dark) { + :root { + --text: #9ca3af; + --text-h: #f3f4f6; + --bg: #16171d; + --border: #2e303a; + --code-bg: #1f2028; + --accent: #c084fc; + --accent-bg: rgba(192, 132, 252, 0.15); + --accent-border: rgba(192, 132, 252, 0.5); + --social-bg: rgba(47, 48, 58, 0.5); + --shadow: + rgba(0, 0, 0, 0.4) 0 10px 15px -3px, rgba(0, 0, 0, 0.25) 0 4px 6px -2px; + } + + #social .button-icon { + filter: invert(1) brightness(2); + } +} + +#root { + width: 1126px; + max-width: 100%; + margin: 0 auto; + text-align: center; + border-inline: 1px solid var(--border); + min-height: 100svh; + display: flex; + flex-direction: column; + box-sizing: border-box; +} + +body { + margin: 0; +} + +h1, +h2 { + font-family: var(--heading); + font-weight: 500; + color: var(--text-h); +} + +h1 { + font-size: 56px; + letter-spacing: -1.68px; + margin: 32px 0; + @media (max-width: 1024px) { + font-size: 36px; + margin: 20px 0; + } +} +h2 { + font-size: 24px; + line-height: 118%; + letter-spacing: -0.24px; + margin: 0 0 8px; + @media (max-width: 1024px) { + font-size: 20px; + } +} +p { + margin: 0; +} + +code, +.counter { + font-family: var(--mono); + display: inline-flex; + border-radius: 4px; + color: var(--text-h); +} + +code { + font-size: 15px; + line-height: 135%; + padding: 4px 8px; + background: var(--code-bg); +} diff --git a/packages/admin/src/lib/api.ts b/packages/admin/src/lib/api.ts new file mode 100644 index 0000000..a00a72b --- /dev/null +++ b/packages/admin/src/lib/api.ts @@ -0,0 +1,25 @@ +import { getToken } from "./auth"; + +export async function fetchJson(input: RequestInfo, init?: RequestInit) { + const token = getToken(); + const headers: Record = { + "Content-Type": "application/json", + ...(init?.headers as Record), + }; + if (token) { + headers["Authorization"] = `Bearer ${token}`; + } + + const res = await fetch(input, { + credentials: "include", + ...init, + headers, + }); + const text = await res.text(); + const data = text ? JSON.parse(text) : null; + + if (!res.ok) { + throw new Error(data?.error || res.statusText || "Request failed"); + } + return data as T; +} diff --git a/packages/admin/src/lib/auth.ts b/packages/admin/src/lib/auth.ts new file mode 100644 index 0000000..81337fe --- /dev/null +++ b/packages/admin/src/lib/auth.ts @@ -0,0 +1,17 @@ +const TOKEN_KEY = "planner_admin_token"; + +export function getToken() { + return localStorage.getItem(TOKEN_KEY); +} + +export function setToken(token: string) { + localStorage.setItem(TOKEN_KEY, token); +} + +export function clearToken() { + localStorage.removeItem(TOKEN_KEY); +} + +export function isLoggedIn() { + return Boolean(getToken()); +} diff --git a/packages/admin/src/main.tsx b/packages/admin/src/main.tsx new file mode 100644 index 0000000..bef5202 --- /dev/null +++ b/packages/admin/src/main.tsx @@ -0,0 +1,10 @@ +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import './index.css' +import App from './App.tsx' + +createRoot(document.getElementById('root')!).render( + + + , +) diff --git a/packages/admin/src/pages/Dashboard.tsx b/packages/admin/src/pages/Dashboard.tsx new file mode 100644 index 0000000..74f03fb --- /dev/null +++ b/packages/admin/src/pages/Dashboard.tsx @@ -0,0 +1,8 @@ +export function DashboardPage() { + return ( +
+

Dashboard

+

Select a section from the sidebar to manage guests, gifts, or todos.

+
+ ); +} diff --git a/packages/admin/src/pages/Gifts.tsx b/packages/admin/src/pages/Gifts.tsx new file mode 100644 index 0000000..b79b5d6 --- /dev/null +++ b/packages/admin/src/pages/Gifts.tsx @@ -0,0 +1,75 @@ +import { useEffect, useState } from "react"; +import { fetchJson } from "../lib/api"; + +export function GiftsPage() { + const [gifts, setGifts] = useState([]); + const [name, setName] = useState(""); + const [error, setError] = useState(null); + + const load = async () => { + try { + const data = await fetchJson("/api/gift"); + setGifts(data); + } catch (err: any) { + setError(err.message); + } + }; + + useEffect(() => { + load(); + }, []); + + const handleCreate = async (e: React.FormEvent) => { + e.preventDefault(); + setError(null); + try { + await fetchJson("/api/gift", { + method: "POST", + body: JSON.stringify({ name }), + }); + setName(""); + load(); + } catch (err: any) { + setError(err.message); + } + }; + + return ( +
+

Gifts

+ {error ?
{error}
: null} +
+ setName(e.target.value)} + placeholder="Gift name" + className="rounded border border-slate-300 bg-white px-3 py-2 text-sm shadow-sm focus:border-indigo-500 focus:outline-none focus:ring-1 focus:ring-indigo-500 dark:border-slate-700 dark:bg-slate-900 dark:text-slate-100" + required + /> + +
+
+ + + + + + + + + + {gifts.map((gift) => ( + + + + + + ))} + +
NameStatusOwner
{gift.name}{gift.status}{gift.ownerId || "—"}
+
+
+ ); +} diff --git a/packages/admin/src/pages/Guests.tsx b/packages/admin/src/pages/Guests.tsx new file mode 100644 index 0000000..9ff1d9e --- /dev/null +++ b/packages/admin/src/pages/Guests.tsx @@ -0,0 +1,83 @@ +import { useEffect, useState } from "react"; +import { fetchJson } from "../lib/api"; + +export function GuestsPage() { + const [guests, setGuests] = useState([]); + const [name, setName] = useState(""); + const [email, setEmail] = useState(""); + const [error, setError] = useState(null); + + const load = async () => { + try { + const data = await fetchJson('/api/guest'); + setGuests(data); + } catch (err: any) { + setError(err.message); + } + }; + + useEffect(() => { + load(); + }, []); + + const handleCreate = async (e: React.FormEvent) => { + e.preventDefault(); + setError(null); + try { + await fetchJson('/api/guest', { + method: 'POST', + body: JSON.stringify({ name, email }), + }); + setName(''); + setEmail(''); + load(); + } catch (err: any) { + setError(err.message); + } + }; + + return ( +
+

Guests

+ {error ?
{error}
: null} +
+ setName(e.target.value)} + placeholder="Name" + className="rounded border border-slate-300 bg-white px-3 py-2 text-sm shadow-sm focus:border-indigo-500 focus:outline-none focus:ring-1 focus:ring-indigo-500 dark:border-slate-700 dark:bg-slate-900 dark:text-slate-100" + required + /> + setEmail(e.target.value)} + placeholder="Email (optional)" + className="rounded border border-slate-300 bg-white px-3 py-2 text-sm shadow-sm focus:border-indigo-500 focus:outline-none focus:ring-1 focus:ring-indigo-500 dark:border-slate-700 dark:bg-slate-900 dark:text-slate-100" + /> + +
+
+ + + + + + + + + + {guests.map((guest) => ( + + + + + + ))} + +
NameEmailRSVP
{guest.name}{guest.email ?? "—"}{guest.rsvp ? "Yes" : "No"}
+
+
+ ); +} diff --git a/packages/admin/src/pages/Login.tsx b/packages/admin/src/pages/Login.tsx new file mode 100644 index 0000000..cc01220 --- /dev/null +++ b/packages/admin/src/pages/Login.tsx @@ -0,0 +1,65 @@ +import { useState } from "react"; +import { useNavigate } from "react-router-dom"; +import { fetchJson } from "../lib/api"; +import { setToken } from "../lib/auth"; + +export function LoginPage() { + const navigate = useNavigate(); + const [email, setEmail] = useState(""); + const [password, setPassword] = useState(""); + const [error, setError] = useState(null); + + const handleSubmit = async (event: React.FormEvent) => { + event.preventDefault(); + setError(null); + try { + const result = await fetchJson<{ token: string }>("/api/auth/login", { + method: "POST", + body: JSON.stringify({ email, password }), + }); + setToken(result.token); + navigate("/"); + } catch (err: any) { + setError(err.message); + } + }; + + return ( +
+
+

Login

+ {error ?
{error}
: null} +
+ + + + + +
+
+
+ ); +} diff --git a/packages/admin/src/pages/Todos.tsx b/packages/admin/src/pages/Todos.tsx new file mode 100644 index 0000000..429a0d5 --- /dev/null +++ b/packages/admin/src/pages/Todos.tsx @@ -0,0 +1,95 @@ +import { useEffect, useState } from "react"; +import { fetchJson } from "../lib/api"; + +export function TodosPage() { + const [todos, setTodos] = useState([]); + const [title, setTitle] = useState(""); + const [error, setError] = useState(null); + + const load = async () => { + try { + const data = await fetchJson("/api/todo"); + setTodos(data); + } catch (err: any) { + setError(err.message); + } + }; + + useEffect(() => { + load(); + }, []); + + const handleCreate = async (e: React.FormEvent) => { + e.preventDefault(); + setError(null); + try { + await fetchJson("/api/todo", { + method: "POST", + body: JSON.stringify({ title }), + }); + setTitle(""); + load(); + } catch (err: any) { + setError(err.message); + } + }; + + const markComplete = async (id: string) => { + try { + await fetchJson(`/api/todo/${id}/complete`, { method: "PATCH" }); + load(); + } catch (err: any) { + setError(err.message); + } + }; + + return ( +
+

Todos

+ {error ?
{error}
: null} +
+ setTitle(e.target.value)} + placeholder="To-do title" + className="rounded border border-slate-300 bg-white px-3 py-2 text-sm shadow-sm focus:border-indigo-500 focus:outline-none focus:ring-1 focus:ring-indigo-500 dark:border-slate-700 dark:bg-slate-900 dark:text-slate-100" + required + /> + +
+
+ + + + + + + + + + {todos.map((todo) => ( + + + + + + ))} + +
TitleCompletedActions
{todo.title}{todo.completed ? "Yes" : "No"} + {!todo.completed ? ( + + ) : ( + "—" + )} +
+
+
+ ); +} diff --git a/packages/admin/tailwind.config.js b/packages/admin/tailwind.config.js new file mode 100644 index 0000000..503f9f6 --- /dev/null +++ b/packages/admin/tailwind.config.js @@ -0,0 +1,20 @@ +/** @type {import('tailwindcss').Config} */ +export default { + content: [ + "./index.html", + "./src/**/*.{ts,tsx}" + ], + theme: { + extend: { + colors: { + // keep some of the existing palette if desired + accent: { + DEFAULT: "#aa3bff", + 50: "rgba(170, 59, 255, 0.1)", + 500: "#aa3bff" + } + } + } + }, + plugins: [] +}; diff --git a/packages/admin/tsconfig.app.json b/packages/admin/tsconfig.app.json new file mode 100644 index 0000000..af516fc --- /dev/null +++ b/packages/admin/tsconfig.app.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2023", + "useDefineForClassFields": true, + "lib": ["ES2023", "DOM", "DOM.Iterable"], + "module": "ESNext", + "types": ["vite/client"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["src"] +} diff --git a/packages/admin/tsconfig.json b/packages/admin/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/packages/admin/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/packages/admin/tsconfig.node.json b/packages/admin/tsconfig.node.json new file mode 100644 index 0000000..8a67f62 --- /dev/null +++ b/packages/admin/tsconfig.node.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2023", + "lib": ["ES2023"], + "module": "ESNext", + "types": ["node"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/packages/admin/vite.config.ts b/packages/admin/vite.config.ts new file mode 100644 index 0000000..d83d167 --- /dev/null +++ b/packages/admin/vite.config.ts @@ -0,0 +1,15 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react()], + server: { + proxy: { + "/api": { + target: "http://localhost:3000", + changeOrigin: true, + }, + }, + }, +}) diff --git a/mikro-orm.config.js b/packages/legacy/mikro-orm.config.js similarity index 100% rename from mikro-orm.config.js rename to packages/legacy/mikro-orm.config.js diff --git a/packages/legacy/package.json b/packages/legacy/package.json new file mode 100644 index 0000000..467b4a1 --- /dev/null +++ b/packages/legacy/package.json @@ -0,0 +1,44 @@ +{ + "name": "@planner/legacy", + "version": "0.1.0", + "private": true, + "scripts": { + "start": "ts-node -r tsconfig-paths/register src/main.ts", + "start:dev": "npx nodemon --watch src --ext ts --exec \"npm run build && node dist/main.js\"", + "build": "tsc -p tsconfig.build.json", + "migration:generate": "mikro-orm migration:create", + "migration:run": "mikro-orm migration:up", + "migration:down": "mikro-orm migration:down" + }, + "dependencies": { + "@mikro-orm/core": "^7.0.3", + "@mikro-orm/decorators": "^7.0.3", + "@mikro-orm/migrations": "^7.0.3", + "@mikro-orm/nestjs": "^7.0.1", + "@mikro-orm/postgresql": "^7.0.3", + "@nestjs/common": "^11.1.17", + "@nestjs/core": "^11.1.17", + "@nestjs/event-emitter": "^3.0.1", + "@nestjs/platform-express": "^11.1.17", + "@nestjs/serve-static": "^5.0.4", + "bcryptjs": "^3.0.3", + "express": "^5.2.1", + "jsonwebtoken": "^9.0.3", + "pg": "^8.20.0", + "reflect-metadata": "^0.1.13", + "rxjs": "^7.8.0", + "uuid": "^13.0.0" + }, + "devDependencies": { + "@mikro-orm/cli": "^7.0.3", + "@swc-node/register": "^1.11.1", + "@swc/core": "^1.15.18", + "@types/express": "^4.17.0", + "@types/jsonwebtoken": "^9.0.0", + "@types/node": "^20.0.0", + "nodemon": "^2.0.0", + "ts-node": "^10.0.0", + "tsconfig-paths": "^4.0.0", + "typescript": "^5.0.0" + } +} diff --git a/public/admin.html b/packages/legacy/public/admin.html similarity index 100% rename from public/admin.html rename to packages/legacy/public/admin.html diff --git a/src/admin/admin.controller.ts b/packages/legacy/src/admin/admin.controller.ts similarity index 100% rename from src/admin/admin.controller.ts rename to packages/legacy/src/admin/admin.controller.ts diff --git a/src/admin/admin.module.ts b/packages/legacy/src/admin/admin.module.ts similarity index 100% rename from src/admin/admin.module.ts rename to packages/legacy/src/admin/admin.module.ts diff --git a/src/app.module.ts b/packages/legacy/src/app.module.ts similarity index 100% rename from src/app.module.ts rename to packages/legacy/src/app.module.ts diff --git a/src/core/api/auth.controller.ts b/packages/legacy/src/core/api/auth.controller.ts similarity index 100% rename from src/core/api/auth.controller.ts rename to packages/legacy/src/core/api/auth.controller.ts diff --git a/src/core/auth.guard.ts b/packages/legacy/src/core/auth.guard.ts similarity index 100% rename from src/core/auth.guard.ts rename to packages/legacy/src/core/auth.guard.ts diff --git a/src/core/auth.module.ts b/packages/legacy/src/core/auth.module.ts similarity index 100% rename from src/core/auth.module.ts rename to packages/legacy/src/core/auth.module.ts diff --git a/src/core/core.module.ts b/packages/legacy/src/core/core.module.ts similarity index 100% rename from src/core/core.module.ts rename to packages/legacy/src/core/core.module.ts diff --git a/src/core/database.module.ts b/packages/legacy/src/core/database.module.ts similarity index 100% rename from src/core/database.module.ts rename to packages/legacy/src/core/database.module.ts diff --git a/src/core/entities/base.entity.ts b/packages/legacy/src/core/entities/base.entity.ts similarity index 100% rename from src/core/entities/base.entity.ts rename to packages/legacy/src/core/entities/base.entity.ts diff --git a/src/core/entities/notification-rule.entity.ts b/packages/legacy/src/core/entities/notification-rule.entity.ts similarity index 100% rename from src/core/entities/notification-rule.entity.ts rename to packages/legacy/src/core/entities/notification-rule.entity.ts diff --git a/src/core/entities/token.entity.ts b/packages/legacy/src/core/entities/token.entity.ts similarity index 100% rename from src/core/entities/token.entity.ts rename to packages/legacy/src/core/entities/token.entity.ts diff --git a/src/core/entities/user.entity.ts b/packages/legacy/src/core/entities/user.entity.ts similarity index 100% rename from src/core/entities/user.entity.ts rename to packages/legacy/src/core/entities/user.entity.ts diff --git a/src/core/services/auth.service.ts b/packages/legacy/src/core/services/auth.service.ts similarity index 100% rename from src/core/services/auth.service.ts rename to packages/legacy/src/core/services/auth.service.ts diff --git a/src/core/services/module-linker.service.ts b/packages/legacy/src/core/services/module-linker.service.ts similarity index 100% rename from src/core/services/module-linker.service.ts rename to packages/legacy/src/core/services/module-linker.service.ts diff --git a/src/core/services/module-registry.service.ts b/packages/legacy/src/core/services/module-registry.service.ts similarity index 100% rename from src/core/services/module-registry.service.ts rename to packages/legacy/src/core/services/module-registry.service.ts diff --git a/src/core/services/notification-provider.interface.ts b/packages/legacy/src/core/services/notification-provider.interface.ts similarity index 100% rename from src/core/services/notification-provider.interface.ts rename to packages/legacy/src/core/services/notification-provider.interface.ts diff --git a/src/core/services/notification-rule.service.ts b/packages/legacy/src/core/services/notification-rule.service.ts similarity index 100% rename from src/core/services/notification-rule.service.ts rename to packages/legacy/src/core/services/notification-rule.service.ts diff --git a/src/core/services/notification.service.ts b/packages/legacy/src/core/services/notification.service.ts similarity index 100% rename from src/core/services/notification.service.ts rename to packages/legacy/src/core/services/notification.service.ts diff --git a/src/core/services/providers/email.provider.ts b/packages/legacy/src/core/services/providers/email.provider.ts similarity index 100% rename from src/core/services/providers/email.provider.ts rename to packages/legacy/src/core/services/providers/email.provider.ts diff --git a/src/core/services/providers/whatsapp.provider.ts b/packages/legacy/src/core/services/providers/whatsapp.provider.ts similarity index 100% rename from src/core/services/providers/whatsapp.provider.ts rename to packages/legacy/src/core/services/providers/whatsapp.provider.ts diff --git a/src/core/services/token.service.ts b/packages/legacy/src/core/services/token.service.ts similarity index 100% rename from src/core/services/token.service.ts rename to packages/legacy/src/core/services/token.service.ts diff --git a/src/core/services/user.service.ts b/packages/legacy/src/core/services/user.service.ts similarity index 100% rename from src/core/services/user.service.ts rename to packages/legacy/src/core/services/user.service.ts diff --git a/src/core/workflows/base-workflow.ts b/packages/legacy/src/core/workflows/base-workflow.ts similarity index 100% rename from src/core/workflows/base-workflow.ts rename to packages/legacy/src/core/workflows/base-workflow.ts diff --git a/src/gift/api/dto/create-contribution.dto.ts b/packages/legacy/src/gift/api/dto/create-contribution.dto.ts similarity index 100% rename from src/gift/api/dto/create-contribution.dto.ts rename to packages/legacy/src/gift/api/dto/create-contribution.dto.ts diff --git a/src/gift/api/dto/create-gift.dto.ts b/packages/legacy/src/gift/api/dto/create-gift.dto.ts similarity index 100% rename from src/gift/api/dto/create-gift.dto.ts rename to packages/legacy/src/gift/api/dto/create-gift.dto.ts diff --git a/src/gift/api/gift.controller.ts b/packages/legacy/src/gift/api/gift.controller.ts similarity index 100% rename from src/gift/api/gift.controller.ts rename to packages/legacy/src/gift/api/gift.controller.ts diff --git a/src/gift/entities/gift.entity.ts b/packages/legacy/src/gift/entities/gift.entity.ts similarity index 100% rename from src/gift/entities/gift.entity.ts rename to packages/legacy/src/gift/entities/gift.entity.ts diff --git a/src/gift/gift.module.ts b/packages/legacy/src/gift/gift.module.ts similarity index 100% rename from src/gift/gift.module.ts rename to packages/legacy/src/gift/gift.module.ts diff --git a/src/gift/gift.registration.ts b/packages/legacy/src/gift/gift.registration.ts similarity index 100% rename from src/gift/gift.registration.ts rename to packages/legacy/src/gift/gift.registration.ts diff --git a/src/gift/services/gift.service.ts b/packages/legacy/src/gift/services/gift.service.ts similarity index 100% rename from src/gift/services/gift.service.ts rename to packages/legacy/src/gift/services/gift.service.ts diff --git a/src/gift/subscribers/gift.subscriber.ts b/packages/legacy/src/gift/subscribers/gift.subscriber.ts similarity index 100% rename from src/gift/subscribers/gift.subscriber.ts rename to packages/legacy/src/gift/subscribers/gift.subscriber.ts diff --git a/src/gift/workflows/gift.workflow.ts b/packages/legacy/src/gift/workflows/gift.workflow.ts similarity index 100% rename from src/gift/workflows/gift.workflow.ts rename to packages/legacy/src/gift/workflows/gift.workflow.ts diff --git a/src/guest/api/dto/create-guest.dto.ts b/packages/legacy/src/guest/api/dto/create-guest.dto.ts similarity index 100% rename from src/guest/api/dto/create-guest.dto.ts rename to packages/legacy/src/guest/api/dto/create-guest.dto.ts diff --git a/src/guest/api/dto/update-rsvp.dto.ts b/packages/legacy/src/guest/api/dto/update-rsvp.dto.ts similarity index 100% rename from src/guest/api/dto/update-rsvp.dto.ts rename to packages/legacy/src/guest/api/dto/update-rsvp.dto.ts diff --git a/src/guest/api/guest.controller.ts b/packages/legacy/src/guest/api/guest.controller.ts similarity index 100% rename from src/guest/api/guest.controller.ts rename to packages/legacy/src/guest/api/guest.controller.ts diff --git a/src/guest/entities/guest.entity.ts b/packages/legacy/src/guest/entities/guest.entity.ts similarity index 100% rename from src/guest/entities/guest.entity.ts rename to packages/legacy/src/guest/entities/guest.entity.ts diff --git a/src/guest/guest.module.ts b/packages/legacy/src/guest/guest.module.ts similarity index 100% rename from src/guest/guest.module.ts rename to packages/legacy/src/guest/guest.module.ts diff --git a/src/guest/guest.registration.ts b/packages/legacy/src/guest/guest.registration.ts similarity index 100% rename from src/guest/guest.registration.ts rename to packages/legacy/src/guest/guest.registration.ts diff --git a/src/guest/services/guest.service.ts b/packages/legacy/src/guest/services/guest.service.ts similarity index 100% rename from src/guest/services/guest.service.ts rename to packages/legacy/src/guest/services/guest.service.ts diff --git a/src/guest/subscribers/guest.subscriber.ts b/packages/legacy/src/guest/subscribers/guest.subscriber.ts similarity index 100% rename from src/guest/subscribers/guest.subscriber.ts rename to packages/legacy/src/guest/subscribers/guest.subscriber.ts diff --git a/src/guest/workflows/guest.workflow.ts b/packages/legacy/src/guest/workflows/guest.workflow.ts similarity index 100% rename from src/guest/workflows/guest.workflow.ts rename to packages/legacy/src/guest/workflows/guest.workflow.ts diff --git a/src/main.ts b/packages/legacy/src/main.ts similarity index 100% rename from src/main.ts rename to packages/legacy/src/main.ts diff --git a/src/todo/api/todo.controller.ts b/packages/legacy/src/todo/api/todo.controller.ts similarity index 100% rename from src/todo/api/todo.controller.ts rename to packages/legacy/src/todo/api/todo.controller.ts diff --git a/src/todo/entities/todo.entity.ts b/packages/legacy/src/todo/entities/todo.entity.ts similarity index 100% rename from src/todo/entities/todo.entity.ts rename to packages/legacy/src/todo/entities/todo.entity.ts diff --git a/src/todo/services/todo.service.ts b/packages/legacy/src/todo/services/todo.service.ts similarity index 100% rename from src/todo/services/todo.service.ts rename to packages/legacy/src/todo/services/todo.service.ts diff --git a/src/todo/subscribers/todo.subscriber.ts b/packages/legacy/src/todo/subscribers/todo.subscriber.ts similarity index 100% rename from src/todo/subscribers/todo.subscriber.ts rename to packages/legacy/src/todo/subscribers/todo.subscriber.ts diff --git a/src/todo/todo.module.ts b/packages/legacy/src/todo/todo.module.ts similarity index 100% rename from src/todo/todo.module.ts rename to packages/legacy/src/todo/todo.module.ts diff --git a/src/todo/todo.registration.ts b/packages/legacy/src/todo/todo.registration.ts similarity index 100% rename from src/todo/todo.registration.ts rename to packages/legacy/src/todo/todo.registration.ts diff --git a/src/todo/workflows/todo.workflow.ts b/packages/legacy/src/todo/workflows/todo.workflow.ts similarity index 100% rename from src/todo/workflows/todo.workflow.ts rename to packages/legacy/src/todo/workflows/todo.workflow.ts diff --git a/tsconfig.build.json b/packages/legacy/tsconfig.build.json similarity index 100% rename from tsconfig.build.json rename to packages/legacy/tsconfig.build.json diff --git a/tsconfig.dev.json b/packages/legacy/tsconfig.dev.json similarity index 100% rename from tsconfig.dev.json rename to packages/legacy/tsconfig.dev.json diff --git a/tsconfig.json b/packages/legacy/tsconfig.json similarity index 100% rename from tsconfig.json rename to packages/legacy/tsconfig.json diff --git a/packages/server/mikro-orm.config.js b/packages/server/mikro-orm.config.js new file mode 100644 index 0000000..c3861e7 --- /dev/null +++ b/packages/server/mikro-orm.config.js @@ -0,0 +1,8 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.default = void 0; +var mikro_orm_config_1 = require("./src/mikro-orm.config"); +Object.defineProperty(exports, "default", { enumerable: true, get: function () { return __importDefault(mikro_orm_config_1).default; } }); diff --git a/packages/server/mikro-orm.config.ts b/packages/server/mikro-orm.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..da1a8f889d4540622b734726ac2b4fd1f2402914 GIT binary patch literal 104 zcmW-ZOA3H65JTTu@DA==sR!^hQd=onD}F!_udWSU43o)A=Km}=8 ${dst}`); + fs.renameSync(src, dst); + } + + if (fs.existsSync(modelDir)) { + try { + const files = fs.readdirSync(modelDir); + if (files.length === 0) { + console.log(`Removing empty directory ${modelDir}`); + fs.rmdirSync(modelDir); + } + } catch (e) { + console.warn(`Failed to clean model directory ${modelDir}:`, e.message); + } + } +} diff --git a/packages/server/src/api/admin/gifts/routes.ts b/packages/server/src/api/admin/gifts/routes.ts new file mode 100644 index 0000000..ef1ec78 --- /dev/null +++ b/packages/server/src/api/admin/gifts/routes.ts @@ -0,0 +1,51 @@ +import { Router } from "express"; +import { GiftService } from "../../../modules/gifts/service"; +import { validateBody } from "../../../core/middleware/validate"; +import { createGiftSchema, createContributionSchema } from "../../../modules/gifts/types"; +import { requireAuth } from "../../../core/middleware/auth"; + +const service = new GiftService(); + +export function registerGiftRoutes(router: Router) { + const r = Router(); + + // Admin routes are protected and can include additional checks + r.use(requireAuth); + + r.post("/gift", validateBody(createGiftSchema), async (req, res) => { + const ownerId = (req as any).user?.id; + const gift = await service.createGift({ ...req.body, ownerId }); + res.json(gift); + }); + + r.get("/gift", async (_req, res) => { + const gifts = await service.listGifts(); + res.json(gifts); + }); + + r.get("/gift/:id", async (req, res) => { + const requesterId = (req as any).user?.id; + const gift = await service.getGiftById(req.params.id, requesterId); + if (!gift) { + return res.status(404).json({ error: "Gift not found" }); + } + res.json(gift); + }); + + r.post( + "/gift/contribution", + validateBody(createContributionSchema), + async (req, res) => { + const contribution = await service.createContribution(req.body); + res.json(contribution); + }, + ); + + r.get("/gift/:id/contributions", async (req, res) => { + const requesterId = (req as any).user?.id; + const contributions = await service.listContributions(req.params.id, requesterId); + res.json(contributions); + }); + + router.use(r); +} diff --git a/packages/server/src/api/admin/guests/routes.ts b/packages/server/src/api/admin/guests/routes.ts new file mode 100644 index 0000000..16086ff --- /dev/null +++ b/packages/server/src/api/admin/guests/routes.ts @@ -0,0 +1,36 @@ +import { Router } from "express"; +import { GuestService } from "../../../modules/guests/service"; +import { validateBody } from "../../../core/middleware/validate"; +import { createGuestSchema, updateRsvpSchema } from "../../../modules/guests/types"; + +const service = new GuestService(); + +export function registerGuestRoutes(router: Router) { + const r = Router(); + + // Admin can manage guests (same endpoints, can be extended with extra checks) + + r.post("/guest", validateBody(createGuestSchema), async (req, res) => { + const guest = await service.createGuest(req.body); + res.json(guest); + }); + + r.get("/guest", async (_req, res) => { + const guests = await service.listGuests(); + res.json(guests); + }); + + r.patch( + "/guest/:id/rsvp", + validateBody(updateRsvpSchema), + async (req, res) => { + const updated = await service.updateRsvp(req.params.id, req.body); + if (!updated) { + return res.status(404).json({ error: "Guest not found" }); + } + res.json(updated); + }, + ); + + router.use(r); +} diff --git a/packages/server/src/api/admin/routes.ts b/packages/server/src/api/admin/routes.ts new file mode 100644 index 0000000..793a316 --- /dev/null +++ b/packages/server/src/api/admin/routes.ts @@ -0,0 +1,19 @@ +import { Router } from "express"; +import { requireRole } from "../middleware"; +import { registerGuestRoutes } from "./guests/routes"; +import { registerGiftRoutes } from "./gifts/routes"; +import { registerTodoRoutes } from "./todos/routes"; + +export function registerAdminRoutes() { + const router = Router(); + + // Admin routes are intended for administrators. + // Access control is enforced in api/index.ts, but individual route groups + // also apply role checks so they remain safe if reused elsewhere. + + registerGuestRoutes(router); + registerGiftRoutes(router); + registerTodoRoutes(router); + + return router; +} diff --git a/packages/server/src/api/admin/todos/routes.ts b/packages/server/src/api/admin/todos/routes.ts new file mode 100644 index 0000000..88fa943 --- /dev/null +++ b/packages/server/src/api/admin/todos/routes.ts @@ -0,0 +1,33 @@ +import { Router } from "express"; +import { TodoService } from "../../../modules/todos/service"; +import { validateBody } from "../../../core/middleware/validate"; +import { createTodoSchema } from "../../../modules/todos/types"; +import { requireAuth } from "../../../core/middleware/auth"; + +const service = new TodoService(); + +export function registerTodoRoutes(router: Router) { + const r = Router(); + + r.use(requireAuth); + + r.post("/todo", validateBody(createTodoSchema), async (req, res) => { + const todo = await service.createTodo(req.body); + res.json(todo); + }); + + r.get("/todo", async (_req, res) => { + const todos = await service.listTodos(); + res.json(todos); + }); + + r.patch("/todo/:id/complete", async (req, res) => { + const updated = await service.markComplete(req.params.id); + if (!updated) { + return res.status(404).json({ error: "Todo not found" }); + } + res.json(updated); + }); + + router.use(r); +} diff --git a/packages/server/src/api/auth/dto/login.dto.ts b/packages/server/src/api/auth/dto/login.dto.ts new file mode 100644 index 0000000..e9c2460 --- /dev/null +++ b/packages/server/src/api/auth/dto/login.dto.ts @@ -0,0 +1,8 @@ +import { z } from "zod"; + +export const loginSchema = z.object({ + email: z.string().email(), + password: z.string().min(6), +}); + +export type LoginDto = z.infer; diff --git a/packages/server/src/api/auth/dto/register.dto.ts b/packages/server/src/api/auth/dto/register.dto.ts new file mode 100644 index 0000000..ef653b0 --- /dev/null +++ b/packages/server/src/api/auth/dto/register.dto.ts @@ -0,0 +1,9 @@ +import { z } from "zod"; + +export const registerSchema = z.object({ + email: z.string().email(), + password: z.string().min(6), + name: z.string().optional(), +}); + +export type RegisterDto = z.infer; diff --git a/packages/server/src/api/auth/routes.ts b/packages/server/src/api/auth/routes.ts new file mode 100644 index 0000000..b2864bf --- /dev/null +++ b/packages/server/src/api/auth/routes.ts @@ -0,0 +1,47 @@ +import { Router } from "express"; +import { AuthService } from "../../modules/auth/auth.service"; +import { UserService } from "../../modules/auth/user.service"; +import { validateBody } from "../../core/middleware/validate"; +import { loginSchema, registerSchema } from "../../modules/auth/types"; + +const authService = new AuthService(); +const userService = new UserService(); + +export function registerAuthRoutes() { + const router = Router(); + + router.post("/register", validateBody(registerSchema), async (req, res) => { + try { + const { name, email, password, role } = req.body; + const requestedRole = (role as "admin" | "organizer" | undefined) ?? "organizer"; + + if (requestedRole === "admin" && process.env.ALLOW_ADMIN_REGISTRATION !== "true") { + return res.status(403).json({ error: "Admin registration is disabled" }); + } + + const user = await userService.createUser( + process.env.DEFAULT_TENANT_ID || "default", + email, + password, + name, + requestedRole, + ); + + res.json({ id: user.id, email: user.email, name: user.name, role: user.role, publishKey: user.publishKey }); + } catch (err: any) { + res.status(400).json({ error: err.message }); + } + }); + + router.post("/login", validateBody(loginSchema), async (req, res) => { + const { email, password } = req.body; + const user = await userService.validateUser(process.env.DEFAULT_TENANT_ID || "default", email, password); + if (!user) { + return res.status(401).json({ error: "Invalid credentials" }); + } + const token = authService.sign({ sub: user.id, email: user.email, role: user.role }); + res.json({ token }); + }); + + return router; +} diff --git a/packages/server/src/api/gifts/dto/create-contribution.dto.ts b/packages/server/src/api/gifts/dto/create-contribution.dto.ts new file mode 100644 index 0000000..d02cbe2 --- /dev/null +++ b/packages/server/src/api/gifts/dto/create-contribution.dto.ts @@ -0,0 +1,11 @@ +import { z } from "zod"; + +export const createContributionSchema = z.object({ + giftId: z.string().uuid(), + contributorName: z.string().min(1), + contributorEmail: z.string().email().optional(), + amount: z.number().min(0), + type: z.enum(["individual", "group"]).optional(), +}); + +export type CreateContributionDto = z.infer; diff --git a/packages/server/src/api/gifts/dto/create-gift.dto.ts b/packages/server/src/api/gifts/dto/create-gift.dto.ts new file mode 100644 index 0000000..1f827ea --- /dev/null +++ b/packages/server/src/api/gifts/dto/create-gift.dto.ts @@ -0,0 +1,11 @@ +import { z } from "zod"; + +export const createGiftSchema = z.object({ + name: z.string().min(1), + description: z.string().optional(), + imageUrl: z.string().optional(), + price: z.number().optional(), + experience: z.boolean().optional(), +}); + +export type CreateGiftDto = z.infer; diff --git a/packages/server/src/api/gifts/routes.ts b/packages/server/src/api/gifts/routes.ts new file mode 100644 index 0000000..bb16208 --- /dev/null +++ b/packages/server/src/api/gifts/routes.ts @@ -0,0 +1,51 @@ +import { Router } from "express"; +import { GiftService } from "../../modules/gifts/service"; +import { validateBody } from "../../core/middleware/validate"; +import { createGiftSchema, createContributionSchema } from "../../modules/gifts/types"; +import { requireAuth } from "../../core/middleware/auth"; + +const service = new GiftService(); + +export function registerGiftRoutes(router: Router) { + const r = Router(); + + // Protected routes + r.use(requireAuth); + + r.post("/gift", validateBody(createGiftSchema), async (req, res) => { + const ownerId = (req as any).user?.id; + const gift = await service.createGift({ ...req.body, ownerId }); + res.json(gift); + }); + + r.get("/gift", async (_req, res) => { + const gifts = await service.listGifts(); + res.json(gifts); + }); + + r.get("/gift/:id", async (req, res) => { + const requesterId = (req as any).user?.id; + const gift = await service.getGiftById(req.params.id, requesterId); + if (!gift) { + return res.status(404).json({ error: "Gift not found" }); + } + res.json(gift); + }); + + r.post( + "/gift/contribution", + validateBody(createContributionSchema), + async (req, res) => { + const contribution = await service.createContribution(req.body); + res.json(contribution); + }, + ); + + r.get("/gift/:id/contributions", async (req, res) => { + const requesterId = (req as any).user?.id; + const contributions = await service.listContributions(req.params.id, requesterId); + res.json(contributions); + }); + + router.use(r); +} diff --git a/packages/server/src/api/guests/dto/create-guest.dto.ts b/packages/server/src/api/guests/dto/create-guest.dto.ts new file mode 100644 index 0000000..00a79fa --- /dev/null +++ b/packages/server/src/api/guests/dto/create-guest.dto.ts @@ -0,0 +1,11 @@ +import { z } from "zod"; + +export const createGuestSchema = z.object({ + name: z.string().min(1), + email: z.string().email().optional(), + phone: z.string().optional(), + rsvp: z.boolean().optional(), + tableId: z.string().uuid().optional(), +}); + +export type CreateGuestDto = z.infer; diff --git a/packages/server/src/api/guests/dto/update-rsvp.dto.ts b/packages/server/src/api/guests/dto/update-rsvp.dto.ts new file mode 100644 index 0000000..a5a3b04 --- /dev/null +++ b/packages/server/src/api/guests/dto/update-rsvp.dto.ts @@ -0,0 +1,8 @@ +import { z } from "zod"; + +export const updateRsvpSchema = z.object({ + rsvp: z.boolean(), + tableId: z.string().uuid().optional(), +}); + +export type UpdateRsvpDto = z.infer; diff --git a/packages/server/src/api/guests/routes.ts b/packages/server/src/api/guests/routes.ts new file mode 100644 index 0000000..d06c88f --- /dev/null +++ b/packages/server/src/api/guests/routes.ts @@ -0,0 +1,34 @@ +import { Router } from "express"; +import { GuestService } from "../../modules/guests/service"; +import { validateBody } from "../../core/middleware/validate"; +import { createGuestSchema, updateRsvpSchema } from "../../modules/guests/types"; + +const service = new GuestService(); + +export function registerGuestRoutes(router: Router) { + const r = Router(); + + r.post("/guest", validateBody(createGuestSchema), async (req, res) => { + const guest = await service.createGuest(req.body); + res.json(guest); + }); + + r.get("/guest", async (_req, res) => { + const guests = await service.listGuests(); + res.json(guests); + }); + + r.patch( + "/guest/:id/rsvp", + validateBody(updateRsvpSchema), + async (req, res) => { + const updated = await service.updateRsvp(req.params.id, req.body); + if (!updated) { + return res.status(404).json({ error: "Guest not found" }); + } + res.json(updated); + }, + ); + + router.use(r); +} diff --git a/packages/server/src/api/health/health.routes.ts b/packages/server/src/api/health/health.routes.ts new file mode 100644 index 0000000..87b3f25 --- /dev/null +++ b/packages/server/src/api/health/health.routes.ts @@ -0,0 +1,7 @@ +import { Express } from "express"; + +export function registerHealthRoutes(app: Express) { + app.get("/api/health", (_req, res) => { + res.json({ ok: true, timestamp: new Date().toISOString() }); + }); +} diff --git a/packages/server/src/api/index.ts b/packages/server/src/api/index.ts new file mode 100644 index 0000000..ce634ed --- /dev/null +++ b/packages/server/src/api/index.ts @@ -0,0 +1,25 @@ +import type { Express } from "express"; +import { registerHealthRoutes } from "./health/health.routes"; +import { registerAdminRoutes } from "./admin/routes"; +import { registerAuthRoutes } from "./auth/routes"; +import { registerOrganizadorRoutes } from "./organizador/routes"; +import { registerInvitadosRoutes } from "./invitados/routes"; +import { requireRole, requireInvitadoAccess } from "./middleware"; + +export function registerApiRoutes(app: Express) { + // shared middleware could be added here (logging, tenant resolution, etc.) + + registerHealthRoutes(app); + + // Auth routes (register / login) are global and shared by all clients. + app.use("/api/auth", registerAuthRoutes()); + + // Admin-only routes + app.use("/api/admin", requireRole("admin"), registerAdminRoutes()); + + // Organizers + admins + app.use("/api/organizador", requireRole("admin", "organizer"), registerOrganizadorRoutes()); + + // Guests can access via publish key or token (guest/organizer/admin) + app.use("/api/invitados", requireInvitadoAccess, registerInvitadosRoutes()); +} diff --git a/packages/server/src/api/invitados/gifts/routes.ts b/packages/server/src/api/invitados/gifts/routes.ts new file mode 100644 index 0000000..47f69e5 --- /dev/null +++ b/packages/server/src/api/invitados/gifts/routes.ts @@ -0,0 +1,52 @@ +import { Router, RequestHandler } from "express"; +import { GiftService } from "../../../modules/gifts/service"; +import { validateBody } from "../../../core/middleware/validate"; +import { createGiftSchema, createContributionSchema } from "../../../modules/gifts/types"; + +const service = new GiftService(); + +export function registerGiftRoutes(router: Router, authMiddleware?: RequestHandler) { + const r = Router(); + + // Frontend routes are protected to allow user access + if (authMiddleware) { + r.use(authMiddleware); + } + + r.post("/gift", validateBody(createGiftSchema), async (req, res) => { + const ownerId = (req as any).user?.id; + const gift = await service.createGift({ ...req.body, ownerId }); + res.json(gift); + }); + + r.get("/gift", async (_req, res) => { + const gifts = await service.listGifts(); + res.json(gifts); + }); + + r.get("/gift/:id", async (req, res) => { + const requesterId = (req as any).user?.id; + const gift = await service.getGiftById(req.params.id, requesterId); + if (!gift) { + return res.status(404).json({ error: "Gift not found" }); + } + res.json(gift); + }); + + r.post( + "/gift/contribution", + validateBody(createContributionSchema), + async (req, res) => { + const contribution = await service.createContribution(req.body); + res.json(contribution); + }, + ); + + r.get("/gift/:id/contributions", async (req, res) => { + const requesterId = (req as any).user?.id; + const contributions = await service.listContributions(req.params.id, requesterId); + res.json(contributions); + }); + + router.use(r); +} diff --git a/packages/server/src/api/invitados/guests/routes.ts b/packages/server/src/api/invitados/guests/routes.ts new file mode 100644 index 0000000..2a4090a --- /dev/null +++ b/packages/server/src/api/invitados/guests/routes.ts @@ -0,0 +1,38 @@ +import { Router, RequestHandler } from "express"; +import { GuestService } from "../../../modules/guests/service"; +import { validateBody } from "../../../core/middleware/validate"; +import { createGuestSchema, updateRsvpSchema } from "../../../modules/guests/types"; + +const service = new GuestService(); + +export function registerGuestRoutes(router: Router, authMiddleware?: RequestHandler) { + const r = Router(); + + if (authMiddleware) { + r.use(authMiddleware); + } + + r.post("/guest", validateBody(createGuestSchema), async (req, res) => { + const guest = await service.createGuest(req.body); + res.json(guest); + }); + + r.get("/guest", async (_req, res) => { + const guests = await service.listGuests(); + res.json(guests); + }); + + r.patch( + "/guest/:id/rsvp", + validateBody(updateRsvpSchema), + async (req, res) => { + const updated = await service.updateRsvp(req.params.id, req.body); + if (!updated) { + return res.status(404).json({ error: "Guest not found" }); + } + res.json(updated); + }, + ); + + router.use(r); +} diff --git a/packages/server/src/api/invitados/routes.ts b/packages/server/src/api/invitados/routes.ts new file mode 100644 index 0000000..b448d81 --- /dev/null +++ b/packages/server/src/api/invitados/routes.ts @@ -0,0 +1,16 @@ +import { Router } from "express"; +import { requireInvitadoAccess } from "../middleware"; +import { registerGuestRoutes } from "./guests/routes"; +import { registerGiftRoutes } from "./gifts/routes"; +import { registerTodoRoutes } from "./todos/routes"; + +export function registerInvitadosRoutes() { + const router = Router(); + + // Invitados routes can be accessed via publish key (or an authenticated token). + registerGuestRoutes(router, requireInvitadoAccess); + registerGiftRoutes(router, requireInvitadoAccess); + registerTodoRoutes(router, requireInvitadoAccess); + + return router; +} diff --git a/packages/server/src/api/invitados/todos/routes.ts b/packages/server/src/api/invitados/todos/routes.ts new file mode 100644 index 0000000..f4b8598 --- /dev/null +++ b/packages/server/src/api/invitados/todos/routes.ts @@ -0,0 +1,34 @@ +import { Router, RequestHandler } from "express"; +import { TodoService } from "../../../modules/todos/service"; +import { validateBody } from "../../../core/middleware/validate"; +import { createTodoSchema } from "../../../modules/todos/types"; + +const service = new TodoService(); + +export function registerTodoRoutes(router: Router, authMiddleware?: RequestHandler) { + const r = Router(); + + if (authMiddleware) { + r.use(authMiddleware); + } + + r.post("/todo", validateBody(createTodoSchema), async (req, res) => { + const todo = await service.createTodo(req.body); + res.json(todo); + }); + + r.get("/todo", async (_req, res) => { + const todos = await service.listTodos(); + res.json(todos); + }); + + r.patch("/todo/:id/complete", async (req, res) => { + const updated = await service.markComplete(req.params.id); + if (!updated) { + return res.status(404).json({ error: "Todo not found" }); + } + res.json(updated); + }); + + router.use(r); +} diff --git a/packages/server/src/api/middleware.ts b/packages/server/src/api/middleware.ts new file mode 100644 index 0000000..5d0914c --- /dev/null +++ b/packages/server/src/api/middleware.ts @@ -0,0 +1,108 @@ +import type { NextFunction, Request, Response } from "express"; +import { AuthService } from "../modules/auth/auth.service"; +import { UserService } from "../modules/auth/user.service"; +import type { UserRole } from "../modules/auth/model"; + +export interface ApiRequest extends Request { + user?: { + id: string; + email: string; + role: UserRole; + publishKeyOwnerId?: string; + }; +} + +const authService = new AuthService(); +const userService = new UserService(); + +function getToken(req: Request) { + const auth = req.headers.authorization?.split(" "); + return auth?.[1] ?? null; +} + +function verifyToken(token: string) { + const payload = authService.verify(token) as any; + if (!payload || !payload.sub || !payload.email) return null; + return payload; +} + +export function requireAuth(req: ApiRequest, res: Response, next: NextFunction) { + const token = getToken(req); + if (!token) { + return res.status(401).json({ error: "Missing Authorization header" }); + } + + const payload = verifyToken(token); + if (!payload) { + return res.status(401).json({ error: "Invalid token" }); + } + + req.user = { + id: payload.sub, + email: payload.email, + role: (payload.role ?? "guest") as UserRole, + }; + + next(); +} + +export function requireRole(...allowedRoles: UserRole[]) { + return (req: ApiRequest, res: Response, next: NextFunction) => { + const token = getToken(req); + if (!token) { + return res.status(401).json({ error: "Missing Authorization header" }); + } + + const payload = verifyToken(token); + if (!payload) { + return res.status(401).json({ error: "Invalid token" }); + } + + const role = (payload.role ?? "guest") as UserRole; + if (!allowedRoles.includes(role)) { + return res.status(403).json({ error: "Forbidden" }); + } + + req.user = { + id: payload.sub, + email: payload.email, + role, + }; + + next(); + }; +} + +export async function requireInvitadoAccess(req: ApiRequest, res: Response, next: NextFunction) { + const token = getToken(req); + if (token) { + const payload = verifyToken(token); + if (payload) { + req.user = { + id: payload.sub, + email: payload.email, + role: (payload.role ?? "guest") as UserRole, + }; + return next(); + } + } + + const publishKey = (req.headers["x-publish-key"] as string) || (req.query.publishKey as string); + if (!publishKey) { + return res.status(401).json({ error: "Missing publish key" }); + } + + const organizer = await userService.findByPublishKey(publishKey); + if (!organizer) { + return res.status(401).json({ error: "Invalid publish key" }); + } + + req.user = { + id: "", + email: "", + role: "guest", + publishKeyOwnerId: organizer.id, + }; + + next(); +} diff --git a/packages/server/src/api/organizador/gifts/routes.ts b/packages/server/src/api/organizador/gifts/routes.ts new file mode 100644 index 0000000..47f69e5 --- /dev/null +++ b/packages/server/src/api/organizador/gifts/routes.ts @@ -0,0 +1,52 @@ +import { Router, RequestHandler } from "express"; +import { GiftService } from "../../../modules/gifts/service"; +import { validateBody } from "../../../core/middleware/validate"; +import { createGiftSchema, createContributionSchema } from "../../../modules/gifts/types"; + +const service = new GiftService(); + +export function registerGiftRoutes(router: Router, authMiddleware?: RequestHandler) { + const r = Router(); + + // Frontend routes are protected to allow user access + if (authMiddleware) { + r.use(authMiddleware); + } + + r.post("/gift", validateBody(createGiftSchema), async (req, res) => { + const ownerId = (req as any).user?.id; + const gift = await service.createGift({ ...req.body, ownerId }); + res.json(gift); + }); + + r.get("/gift", async (_req, res) => { + const gifts = await service.listGifts(); + res.json(gifts); + }); + + r.get("/gift/:id", async (req, res) => { + const requesterId = (req as any).user?.id; + const gift = await service.getGiftById(req.params.id, requesterId); + if (!gift) { + return res.status(404).json({ error: "Gift not found" }); + } + res.json(gift); + }); + + r.post( + "/gift/contribution", + validateBody(createContributionSchema), + async (req, res) => { + const contribution = await service.createContribution(req.body); + res.json(contribution); + }, + ); + + r.get("/gift/:id/contributions", async (req, res) => { + const requesterId = (req as any).user?.id; + const contributions = await service.listContributions(req.params.id, requesterId); + res.json(contributions); + }); + + router.use(r); +} diff --git a/packages/server/src/api/organizador/guests/routes.ts b/packages/server/src/api/organizador/guests/routes.ts new file mode 100644 index 0000000..2a4090a --- /dev/null +++ b/packages/server/src/api/organizador/guests/routes.ts @@ -0,0 +1,38 @@ +import { Router, RequestHandler } from "express"; +import { GuestService } from "../../../modules/guests/service"; +import { validateBody } from "../../../core/middleware/validate"; +import { createGuestSchema, updateRsvpSchema } from "../../../modules/guests/types"; + +const service = new GuestService(); + +export function registerGuestRoutes(router: Router, authMiddleware?: RequestHandler) { + const r = Router(); + + if (authMiddleware) { + r.use(authMiddleware); + } + + r.post("/guest", validateBody(createGuestSchema), async (req, res) => { + const guest = await service.createGuest(req.body); + res.json(guest); + }); + + r.get("/guest", async (_req, res) => { + const guests = await service.listGuests(); + res.json(guests); + }); + + r.patch( + "/guest/:id/rsvp", + validateBody(updateRsvpSchema), + async (req, res) => { + const updated = await service.updateRsvp(req.params.id, req.body); + if (!updated) { + return res.status(404).json({ error: "Guest not found" }); + } + res.json(updated); + }, + ); + + router.use(r); +} diff --git a/packages/server/src/api/organizador/routes.ts b/packages/server/src/api/organizador/routes.ts new file mode 100644 index 0000000..5490037 --- /dev/null +++ b/packages/server/src/api/organizador/routes.ts @@ -0,0 +1,18 @@ +import { Router } from "express"; +import { requireRole } from "../middleware"; +import { registerGuestRoutes } from "./guests/routes"; +import { registerGiftRoutes } from "./gifts/routes"; +import { registerTodoRoutes } from "./todos/routes"; + +export function registerOrganizadorRoutes() { + const router = Router(); + + // Organizador routes are for organizers (and admins). + // Authentication and role enforcement is handled in api/index.ts. + + registerGuestRoutes(router, requireRole("admin", "organizer")); + registerGiftRoutes(router, requireRole("admin", "organizer")); + registerTodoRoutes(router, requireRole("admin", "organizer")); + + return router; +} diff --git a/packages/server/src/api/organizador/todos/routes.ts b/packages/server/src/api/organizador/todos/routes.ts new file mode 100644 index 0000000..f4b8598 --- /dev/null +++ b/packages/server/src/api/organizador/todos/routes.ts @@ -0,0 +1,34 @@ +import { Router, RequestHandler } from "express"; +import { TodoService } from "../../../modules/todos/service"; +import { validateBody } from "../../../core/middleware/validate"; +import { createTodoSchema } from "../../../modules/todos/types"; + +const service = new TodoService(); + +export function registerTodoRoutes(router: Router, authMiddleware?: RequestHandler) { + const r = Router(); + + if (authMiddleware) { + r.use(authMiddleware); + } + + r.post("/todo", validateBody(createTodoSchema), async (req, res) => { + const todo = await service.createTodo(req.body); + res.json(todo); + }); + + r.get("/todo", async (_req, res) => { + const todos = await service.listTodos(); + res.json(todos); + }); + + r.patch("/todo/:id/complete", async (req, res) => { + const updated = await service.markComplete(req.params.id); + if (!updated) { + return res.status(404).json({ error: "Todo not found" }); + } + res.json(updated); + }); + + router.use(r); +} diff --git a/packages/server/src/api/todos/dto/create-todo.dto.ts b/packages/server/src/api/todos/dto/create-todo.dto.ts new file mode 100644 index 0000000..6facd0a --- /dev/null +++ b/packages/server/src/api/todos/dto/create-todo.dto.ts @@ -0,0 +1,9 @@ +import { z } from "zod"; + +export const createTodoSchema = z.object({ + title: z.string().min(1), + description: z.string().optional(), + dueDate: z.string().optional(), +}); + +export type CreateTodoDto = z.infer; diff --git a/packages/server/src/api/todos/routes.ts b/packages/server/src/api/todos/routes.ts new file mode 100644 index 0000000..ff1aa68 --- /dev/null +++ b/packages/server/src/api/todos/routes.ts @@ -0,0 +1,33 @@ +import { Router } from "express"; +import { TodoService } from "../../modules/todos/service"; +import { validateBody } from "../../core/middleware/validate"; +import { createTodoSchema } from "../../modules/todos/types"; +import { requireAuth } from "../../core/middleware/auth"; + +const service = new TodoService(); + +export function registerTodoRoutes(router: Router) { + const r = Router(); + + r.use(requireAuth); + + r.post("/todo", validateBody(createTodoSchema), async (req, res) => { + const todo = await service.createTodo(req.body); + res.json(todo); + }); + + r.get("/todo", async (_req, res) => { + const todos = await service.listTodos(); + res.json(todos); + }); + + r.patch("/todo/:id/complete", async (req, res) => { + const updated = await service.markComplete(req.params.id); + if (!updated) { + return res.status(404).json({ error: "Todo not found" }); + } + res.json(updated); + }); + + router.use(r); +} diff --git a/packages/server/src/app.ts b/packages/server/src/app.ts new file mode 100644 index 0000000..c0e5d95 --- /dev/null +++ b/packages/server/src/app.ts @@ -0,0 +1,23 @@ +import express from "express"; +import { json } from "body-parser"; +import path from "path"; +import { registerApiRoutes } from "./api"; + +export async function createApp() { + const app = express(); + + app.use(json()); + + registerApiRoutes(app); + + // In production, serve the built admin UI + if (process.env.NODE_ENV === "production") { + const adminDist = path.join(__dirname, "../../admin/dist"); + app.use(express.static(adminDist)); + app.get("/*", (_req, res) => { + res.sendFile(path.join(adminDist, "index.html")); + }); + } + + return app; +} diff --git a/packages/server/src/core/db.ts b/packages/server/src/core/db.ts new file mode 100644 index 0000000..38d78e3 --- /dev/null +++ b/packages/server/src/core/db.ts @@ -0,0 +1,24 @@ +import { MikroORM } from "@mikro-orm/core"; +import config from "../mikro-orm.config"; + +let orm: MikroORM | null = null; + +export async function initOrm() { + if (orm) { + return orm; + } + // MikroORM types can be a bit strict in TS; cast to any to avoid mismatch + orm = await MikroORM.init(config as any); + return orm; +} + +export function getOrm() { + if (!orm) { + throw new Error("ORM not initialized. Call initOrm() first."); + } + return orm; +} + +export function getEm() { + return getOrm().em.fork(); +} diff --git a/packages/server/src/core/events.ts b/packages/server/src/core/events.ts new file mode 100644 index 0000000..3efae7c --- /dev/null +++ b/packages/server/src/core/events.ts @@ -0,0 +1,3 @@ +import { EventEmitter } from "events"; + +export const eventBus = new EventEmitter(); diff --git a/packages/server/src/core/middleware/auth.ts b/packages/server/src/core/middleware/auth.ts new file mode 100644 index 0000000..b40c869 --- /dev/null +++ b/packages/server/src/core/middleware/auth.ts @@ -0,0 +1,23 @@ +import type { NextFunction, Request, Response } from "express"; +import jwt from "jsonwebtoken"; + +export interface AuthenticatedRequest extends Request { + user?: { id: string; email: string; role?: string }; +} + +export function requireAuth(req: AuthenticatedRequest, res: Response, next: NextFunction) { + const auth = req.headers.authorization?.split(" "); + const token = auth?.[1]; + + if (!token) { + return res.status(401).json({ error: "Missing Authorization header" }); + } + + try { + const payload = jwt.verify(token, process.env.JWT_SECRET ?? "change-me") as { sub: string; email: string }; + req.user = { id: payload.sub, email: payload.email }; + next(); + } catch (err) { + return res.status(401).json({ error: "Invalid token" }); + } +} diff --git a/packages/server/src/core/middleware/validate.ts b/packages/server/src/core/middleware/validate.ts new file mode 100644 index 0000000..51a9df8 --- /dev/null +++ b/packages/server/src/core/middleware/validate.ts @@ -0,0 +1,13 @@ +import type { NextFunction, Request, Response } from "express"; +import type { ZodSchema } from "zod"; + +export function validateBody(schema: ZodSchema) { + return (req: Request, res: Response, next: NextFunction) => { + const result = schema.safeParse(req.body); + if (!result.success) { + return res.status(400).json({ error: "Validation failed", issues: result.error.issues }); + } + req.body = result.data; + next(); + }; +} diff --git a/packages/server/src/core/model/base.entity.ts b/packages/server/src/core/model/base.entity.ts new file mode 100644 index 0000000..a4b8670 --- /dev/null +++ b/packages/server/src/core/model/base.entity.ts @@ -0,0 +1,9 @@ +import { v4 as uuidv4 } from "uuid"; + +export abstract class BaseEntity { + id: string = uuidv4(); + tenantId!: string; + metadata?: Record; + createdAt: Date = new Date(); + updatedAt: Date = new Date(); +} diff --git a/packages/server/src/core/tenant.ts b/packages/server/src/core/tenant.ts new file mode 100644 index 0000000..e27f426 --- /dev/null +++ b/packages/server/src/core/tenant.ts @@ -0,0 +1,3 @@ +export function getTenantId() { + return process.env.DEFAULT_TENANT_ID || 'default'; +} diff --git a/packages/server/src/index.ts b/packages/server/src/index.ts new file mode 100644 index 0000000..ec3c7a2 --- /dev/null +++ b/packages/server/src/index.ts @@ -0,0 +1,20 @@ +import { createApp } from "./app"; +import { initOrm } from "./core/db"; + +async function main() { + await initOrm(); + + const app = await createApp(); + const port = process.env.PORT ? Number(process.env.PORT) : 3000; + + app.listen(port, () => { + // eslint-disable-next-line no-console + console.log(`Server listening on http://localhost:${port}`); + }); +} + +main().catch((err) => { + // eslint-disable-next-line no-console + console.error("Failed to start server", err); + process.exit(1); +}); diff --git a/packages/server/src/jobs/.gitkeep b/packages/server/src/jobs/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/packages/server/src/links/.gitkeep b/packages/server/src/links/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/packages/server/src/mikro-orm.config.ts b/packages/server/src/mikro-orm.config.ts new file mode 100644 index 0000000..330f750 --- /dev/null +++ b/packages/server/src/mikro-orm.config.ts @@ -0,0 +1,19 @@ +import path from "path"; +import { defineConfig } from "@mikro-orm/postgresql"; + +const src = __dirname; +const dist = path.join(src, "../dist"); + +export default defineConfig({ + clientUrl: process.env.DATABASE_URL ?? "postgresql://postgres:postgres@localhost:5432/planner", + entities: [path.join(dist, "modules", "**", "model.js")], + entitiesTs: [path.join(src, "modules", "**", "model.ts")], + migrations: { + path: path.join(dist, "migrations"), + pathTs: path.join(src, "migrations"), + }, + seeder: { + path: path.join(dist, "seeders"), + pathTs: path.join(src, "seeders"), + }, +}); diff --git a/packages/server/src/modules/auth/auth.service.ts b/packages/server/src/modules/auth/auth.service.ts new file mode 100644 index 0000000..27408bf --- /dev/null +++ b/packages/server/src/modules/auth/auth.service.ts @@ -0,0 +1,17 @@ +import jwt from "jsonwebtoken"; + +export class AuthService { + sign(payload: Record) { + const secret = process.env.JWT_SECRET || "change-me"; + return jwt.sign(payload, secret, { expiresIn: "7d" }); + } + + verify(token: string) { + const secret = process.env.JWT_SECRET || "change-me"; + try { + return jwt.verify(token, secret) as any; + } catch { + return null; + } + } +} diff --git a/packages/server/src/modules/auth/model.ts b/packages/server/src/modules/auth/model.ts new file mode 100644 index 0000000..ad58f38 --- /dev/null +++ b/packages/server/src/modules/auth/model.ts @@ -0,0 +1,66 @@ +import { EntitySchema } from "@mikro-orm/core"; +import { v4 as uuidv4 } from "uuid"; +import { BaseEntity } from "../../core/model/base.entity"; + +export type UserRole = "admin" | "organizer" | "guest"; + +export class User extends BaseEntity { + id!: string; + tenantId!: string; + createdAt!: Date; + updatedAt!: Date; + + email!: string; + name?: string; + passwordHash!: string; + role!: UserRole; + publishKey?: string; +} + +export const UserSchema = new EntitySchema({ + class: User, + tableName: "users", + properties: { + id: { + type: "uuid", + primary: true, + default: uuidv4(), + }, + tenantId: { + type: "string", + }, + metadata: { + type: "json", + nullable: true, + }, + createdAt: { + type: "date", + default: new Date(), + }, + updatedAt: { + type: "date", + default: new Date(), + }, + email: { + type: "string", + nullable: false, + }, + name: { + type: "string", + nullable: true, + }, + passwordHash: { + type: "string", + nullable: false, + }, + role: { + type: "string", + nullable: false, + default: "organizer", + }, + publishKey: { + type: "string", + nullable: true, + }, + }, +}); diff --git a/packages/server/src/modules/auth/types.ts b/packages/server/src/modules/auth/types.ts new file mode 100644 index 0000000..11fd077 --- /dev/null +++ b/packages/server/src/modules/auth/types.ts @@ -0,0 +1,17 @@ +import { z } from "zod"; + +export const registerSchema = z.object({ + email: z.string().email(), + password: z.string().min(6), + name: z.string().optional(), + role: z.enum(["admin", "organizer"]).optional(), +}); + +export type RegisterDto = z.infer; + +export const loginSchema = z.object({ + email: z.string().email(), + password: z.string().min(6), +}); + +export type LoginDto = z.infer; diff --git a/packages/server/src/modules/auth/user.service.ts b/packages/server/src/modules/auth/user.service.ts new file mode 100644 index 0000000..86ff6c3 --- /dev/null +++ b/packages/server/src/modules/auth/user.service.ts @@ -0,0 +1,46 @@ +import { getEm } from "../../core/db"; +import * as bcrypt from "bcryptjs"; +import { v4 as uuidv4 } from "uuid"; +import { User, UserRole } from "./model"; + +export class UserService { + async createUser( + tenantId: string, + email: string, + password: string, + name?: string, + role: UserRole = "organizer", + ) { + const em = getEm(); + const existing = await em.findOne(User, { tenantId, email }); + if (existing) { + throw new Error("User already exists"); + } + + const user = em.create(User, { + tenantId, + email, + name, + role, + publishKey: role === "organizer" ? uuidv4() : undefined, + passwordHash: await bcrypt.hash(password, 10), + } as any); + + await em.persist(user); + await em.flush(); + return user; + } + + async validateUser(tenantId: string, email: string, password: string) { + const em = getEm(); + const user = await em.findOne(User, { tenantId, email }); + if (!user) return null; + const isValid = await bcrypt.compare(password, user.passwordHash); + return isValid ? user : null; + } + + async findByPublishKey(publishKey: string) { + const em = getEm(); + return await em.findOne(User, { publishKey, role: "organizer" }); + } +} diff --git a/packages/server/src/modules/gifts/model.ts b/packages/server/src/modules/gifts/model.ts new file mode 100644 index 0000000..c972ccc --- /dev/null +++ b/packages/server/src/modules/gifts/model.ts @@ -0,0 +1,134 @@ +import { EntitySchema } from "@mikro-orm/core"; +import { v4 as uuidv4 } from "uuid"; +import { BaseEntity } from "../../core/model/base.entity"; + +export class Gift extends BaseEntity { + id!: string; + tenantId!: string; + createdAt!: Date; + updatedAt!: Date; + + name!: string; + description?: string; + imageUrl?: string; + price?: number; + experience?: boolean; + status: string = "pending"; + ownerId?: string; +} + +export class GiftContribution extends BaseEntity { + id!: string; + tenantId!: string; + createdAt!: Date; + updatedAt!: Date; + + giftId!: string; + contributorName!: string; + contributorEmail?: string; + amount!: number; + type: string = "individual"; + status: string = "pending"; +} + +export const GiftSchema = new EntitySchema({ + class: Gift, + tableName: "gifts", + properties: { + id: { + type: "uuid", + primary: true, + default: uuidv4(), + }, + tenantId: { + type: "string", + }, + metadata: { + type: "json", + nullable: true, + }, + createdAt: { + type: "date", + default: new Date(), + }, + updatedAt: { + type: "date", + default: new Date(), + }, + name: { + type: "string", + }, + description: { + type: "string", + nullable: true, + }, + imageUrl: { + type: "string", + nullable: true, + }, + price: { + type: "float", + nullable: true, + }, + experience: { + type: "boolean", + nullable: true, + }, + status: { + type: "string", + default: "pending", + }, + ownerId: { + type: "string", + nullable: true, + }, + }, +}); + +export const GiftContributionSchema = new EntitySchema({ + class: GiftContribution, + tableName: "gift_contributions", + properties: { + id: { + type: "uuid", + primary: true, + default: uuidv4(), + }, + tenantId: { + type: "string", + }, + metadata: { + type: "json", + nullable: true, + }, + createdAt: { + type: "date", + default: new Date(), + }, + updatedAt: { + type: "date", + default: new Date(), + }, + giftId: { + type: "uuid", + }, + contributorName: { + type: "string", + }, + contributorEmail: { + type: "string", + nullable: true, + }, + amount: { + type: "float", + }, + type: { + type: "string", + default: "individual", + }, + status: { + type: "string", + default: "pending", + }, + }, +}); diff --git a/packages/server/src/modules/gifts/service.ts b/packages/server/src/modules/gifts/service.ts new file mode 100644 index 0000000..d736f28 --- /dev/null +++ b/packages/server/src/modules/gifts/service.ts @@ -0,0 +1,55 @@ +import { eventBus } from "../../core/events"; +import { getEm } from "../../core/db"; +import { getTenantId } from "../../core/tenant"; +import { Gift, GiftContribution } from "./model"; + +export class GiftService { + private get em() { + return getEm(); + } + + private get tenantId() { + return getTenantId(); + } + + async createGift(dto: Partial) { + const gift = this.em.create(Gift, { + tenantId: this.tenantId, + ...dto, + } as any); + await this.em.persist(gift); + await this.em.flush(); + eventBus.emit("gift.created", { gift }); + return gift; + } + + async createContribution(dto: Partial) { + const contribution = this.em.create(GiftContribution, { + tenantId: this.tenantId, + ...dto, + } as any); + await this.em.persist(contribution); + await this.em.flush(); + eventBus.emit("gift.contribution", { contribution }); + return contribution; + } + + async listGifts() { + return this.em.find(Gift, { tenantId: this.tenantId }); + } + + async getGiftById(id: string, requesterId?: string) { + const gift = await this.em.findOne(Gift, { tenantId: this.tenantId, id }); + if (!gift) return null; + if (requesterId && gift.ownerId && gift.ownerId !== requesterId) { + return null; + } + return gift; + } + + async listContributions(giftId: string, requesterId?: string) { + const gift = await this.getGiftById(giftId, requesterId); + if (!gift) return []; + return this.em.find(GiftContribution, { tenantId: this.tenantId, giftId }); + } +} diff --git a/packages/server/src/modules/gifts/types.ts b/packages/server/src/modules/gifts/types.ts new file mode 100644 index 0000000..ce68488 --- /dev/null +++ b/packages/server/src/modules/gifts/types.ts @@ -0,0 +1,21 @@ +import { z } from "zod"; + +export const createGiftSchema = z.object({ + name: z.string().min(1), + description: z.string().optional(), + imageUrl: z.string().optional(), + price: z.number().optional(), + experience: z.boolean().optional(), +}); + +export type CreateGiftDto = z.infer; + +export const createContributionSchema = z.object({ + giftId: z.string().uuid(), + contributorName: z.string().min(1), + contributorEmail: z.string().email().optional(), + amount: z.number().min(0), + type: z.enum(["individual", "group"]).optional(), +}); + +export type CreateContributionDto = z.infer; diff --git a/packages/server/src/modules/guests/model.ts b/packages/server/src/modules/guests/model.ts new file mode 100644 index 0000000..1c9d121 --- /dev/null +++ b/packages/server/src/modules/guests/model.ts @@ -0,0 +1,112 @@ +import { EntitySchema } from "@mikro-orm/core"; +import { v4 as uuidv4 } from "uuid"; +import { BaseEntity } from "../../core/model/base.entity"; + +export class Guest extends BaseEntity { + id!: string; + tenantId!: string; + createdAt!: Date; + updatedAt!: Date; + + name!: string; + email?: string; + phone?: string; + rsvp: boolean = false; + tableId?: string; +} + +export class GuestNotificationPreference extends BaseEntity { + id!: string; + tenantId!: string; + createdAt!: Date; + updatedAt!: Date; + + guestId!: string; + email: boolean = true; + whatsapp: boolean = false; + metadata?: Record; +} + +export const GuestSchema = new EntitySchema({ + class: Guest, + tableName: "guests", + properties: { + id: { + type: "uuid", + primary: true, + default: uuidv4(), + }, + tenantId: { + type: "string", + }, + metadata: { + type: "json", + nullable: true, + }, + createdAt: { + type: "date", + default: new Date(), + }, + updatedAt: { + type: "date", + default: new Date(), + }, + name: { + type: "string", + }, + email: { + type: "string", + nullable: true, + }, + phone: { + type: "string", + nullable: true, + }, + rsvp: { + type: "boolean", + default: false, + }, + tableId: { + type: "uuid", + nullable: true, + }, + }, +}); + +export const GuestNotificationPreferenceSchema = new EntitySchema({ + class: GuestNotificationPreference, + tableName: "guest_notification_preferences", + properties: { + id: { + type: "uuid", + primary: true, + default: uuidv4(), + }, + tenantId: { + type: "string", + }, + metadata: { + type: "json", + nullable: true, + }, + createdAt: { + type: "date", + default: new Date(), + }, + updatedAt: { + type: "date", + default: new Date(), + }, + guestId: { + type: "uuid", + }, + email: { + type: "boolean", + default: true, + }, + whatsapp: { + type: "boolean", + default: false, + }, + }, +}); diff --git a/packages/server/src/modules/guests/service.ts b/packages/server/src/modules/guests/service.ts new file mode 100644 index 0000000..f99e01b --- /dev/null +++ b/packages/server/src/modules/guests/service.ts @@ -0,0 +1,43 @@ +import { eventBus } from "../../core/events"; +import { getEm } from "../../core/db"; +import { getTenantId } from "../../core/tenant"; +import { Guest } from "./model"; +import type { UpdateRsvpDto } from "./types"; + +export class GuestService { + private get em() { + return getEm(); + } + + private get tenantId() { + return getTenantId(); + } + + async createGuest(dto: Partial) { + const guest = this.em.create(Guest, { + tenantId: this.tenantId, + ...dto, + } as any); + await this.em.persist(guest); + await this.em.flush(); + eventBus.emit("guest.invited", { guest }); + return guest; + } + + async updateRsvp(id: string, dto: UpdateRsvpDto) { + const guest = await this.em.findOne(Guest, { tenantId: this.tenantId, id }); + if (!guest) return null; + guest.rsvp = dto.rsvp; + if (dto.tableId !== undefined) { + guest.tableId = dto.tableId; + } + await this.em.persist(guest); + await this.em.flush(); + eventBus.emit("guest.rsvp", { guest }); + return guest; + } + + async listGuests() { + return this.em.find(Guest, { tenantId: this.tenantId }); + } +} diff --git a/packages/server/src/modules/guests/types.ts b/packages/server/src/modules/guests/types.ts new file mode 100644 index 0000000..e17adb8 --- /dev/null +++ b/packages/server/src/modules/guests/types.ts @@ -0,0 +1,18 @@ +import { z } from "zod"; + +export const createGuestSchema = z.object({ + name: z.string().min(1), + email: z.string().email().optional(), + phone: z.string().optional(), + rsvp: z.boolean().optional(), + tableId: z.string().uuid().optional(), +}); + +export type CreateGuestDto = z.infer; + +export const updateRsvpSchema = z.object({ + rsvp: z.boolean(), + tableId: z.string().uuid().optional(), +}); + +export type UpdateRsvpDto = z.infer; diff --git a/packages/server/src/modules/todos/model.ts b/packages/server/src/modules/todos/model.ts new file mode 100644 index 0000000..082deb1 --- /dev/null +++ b/packages/server/src/modules/todos/model.ts @@ -0,0 +1,30 @@ +import { EntitySchema } from "@mikro-orm/core"; +import { BaseEntity } from "../../core/model/base.entity"; + +export class TodoItem extends BaseEntity { + id!: string; + tenantId!: string; + createdAt!: Date; + updatedAt!: Date; + title!: string; + description?: string; + completed: boolean = false; + dueDate?: Date; +} + +export const TodoItemSchema = new EntitySchema({ + class: TodoItem, + tableName: "todo_items", + properties: { + id: { type: "uuid", primary: true }, + tenantId: { type: "string" }, + metadata: { type: "json", nullable: true }, + createdAt: { type: "date", defaultRaw: "now()" }, + updatedAt: { type: "date", defaultRaw: "now()" }, + + title: { type: "string" }, + description: { type: "text", nullable: true }, + completed: { type: "boolean", default: false }, + dueDate: { type: "date", nullable: true }, + }, +}); diff --git a/packages/server/src/modules/todos/service.ts b/packages/server/src/modules/todos/service.ts new file mode 100644 index 0000000..a70a190 --- /dev/null +++ b/packages/server/src/modules/todos/service.ts @@ -0,0 +1,39 @@ +import { eventBus } from "../../core/events"; +import { getEm } from "../../core/db"; +import { getTenantId } from "../../core/tenant"; +import { TodoItem } from "./model"; + +export class TodoService { + private get em() { + return getEm(); + } + + private get tenantId() { + return getTenantId(); + } + + async createTodo(dto: Partial) { + const todo = this.em.create(TodoItem, { + tenantId: this.tenantId, + ...dto, + } as any); + await this.em.persist(todo); + await this.em.flush(); + eventBus.emit("todo.created", { todo }); + return todo; + } + + async listTodos() { + return this.em.find(TodoItem, { tenantId: this.tenantId }); + } + + async markComplete(id: string) { + const todo = await this.em.findOne(TodoItem, { tenantId: this.tenantId, id }); + if (!todo) return null; + todo.completed = true; + await this.em.persist(todo); + await this.em.flush(); + eventBus.emit("todo.completed", { todo }); + return todo; + } +} diff --git a/packages/server/src/modules/todos/types.ts b/packages/server/src/modules/todos/types.ts new file mode 100644 index 0000000..6facd0a --- /dev/null +++ b/packages/server/src/modules/todos/types.ts @@ -0,0 +1,9 @@ +import { z } from "zod"; + +export const createTodoSchema = z.object({ + title: z.string().min(1), + description: z.string().optional(), + dueDate: z.string().optional(), +}); + +export type CreateTodoDto = z.infer; diff --git a/packages/server/src/subscribers/.gitkeep b/packages/server/src/subscribers/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/packages/server/src/workflows/.gitkeep b/packages/server/src/workflows/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/packages/server/tsconfig.json b/packages/server/tsconfig.json new file mode 100644 index 0000000..91e274e --- /dev/null +++ b/packages/server/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "target": "ES2020", + "module": "CommonJS", + "rootDir": "src", + "outDir": "dist", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "moduleResolution": "node", + "resolveJsonModule": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist"] +}